@moderneinc/neo-styled-components 3.0.0 → 4.0.0-next.3cddda

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,11 +6,11 @@ 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 IconButton, { iconButtonClasses } from '@mui/material/IconButton';
9
+ import ButtonBase, { buttonBaseClasses } from '@mui/material/ButtonBase';
10
10
  import React, { forwardRef, createElement, useState, useRef, useCallback, useMemo, useEffect } from 'react';
11
+ import IconButton, { iconButtonClasses } from '@mui/material/IconButton';
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';
@@ -40,14 +40,14 @@ import Badge, { badgeClasses } from '@mui/material/Badge';
40
40
  import LinearProgress, { linearProgressClasses } from '@mui/material/LinearProgress';
41
41
  import Paper, { paperClasses } from '@mui/material/Paper';
42
42
  import Stack from '@mui/material/Stack';
43
- import { listClasses } from '@mui/material/List';
44
- import Menu from '@mui/material/Menu';
45
43
  import FormControl from '@mui/material/FormControl';
46
44
  import FormHelperText, { formHelperTextClasses } from '@mui/material/FormHelperText';
47
45
  import ListItemButton, { listItemButtonClasses } from '@mui/material/ListItemButton';
48
46
  import ListItemIcon, { listItemIconClasses } from '@mui/material/ListItemIcon';
49
47
  import ListItemText, { listItemTextClasses } from '@mui/material/ListItemText';
50
48
  import Typography from '@mui/material/Typography';
49
+ import { listClasses } from '@mui/material/List';
50
+ import Menu from '@mui/material/Menu';
51
51
  import Dialog, { dialogClasses } from '@mui/material/Dialog';
52
52
  import DialogActions, { dialogActionsClasses } from '@mui/material/DialogActions';
53
53
  import DialogContent, { dialogContentClasses } from '@mui/material/DialogContent';
@@ -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$j = [
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$j);
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$j);
702
702
  */
703
703
 
704
704
 
705
- const __iconNode$i = [
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$i);
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
@@ -812,10 +833,10 @@ const CircleAlert = createLucideIcon("circle-alert", __iconNode$b);
812
833
 
813
834
 
814
835
  const __iconNode$a = [
815
- ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
816
- ["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
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$a);
839
+ const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$a);
819
840
 
820
841
  /**
821
842
  * @license lucide-react v0.577.0 - ISC
@@ -856,26 +877,11 @@ const Columns3 = createLucideIcon("columns-3", __iconNode$8);
856
877
 
857
878
 
858
879
  const __iconNode$7 = [
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" }]
862
- ];
863
- const Info = createLucideIcon("info", __iconNode$7);
864
-
865
- /**
866
- * @license lucide-react v0.577.0 - ISC
867
- *
868
- * This source code is licensed under the ISC license.
869
- * See the LICENSE file in the root directory of this source tree.
870
- */
871
-
872
-
873
- const __iconNode$6 = [
874
880
  ["path", { d: "M2 5h20", key: "1fs1ex" }],
875
881
  ["path", { d: "M6 12h12", key: "8npq4p" }],
876
882
  ["path", { d: "M9 19h6", key: "456am0" }]
877
883
  ];
878
- const ListFilter = createLucideIcon("list-filter", __iconNode$6);
884
+ const ListFilter = createLucideIcon("list-filter", __iconNode$7);
879
885
 
880
886
  /**
881
887
  * @license lucide-react v0.577.0 - ISC
@@ -885,8 +891,8 @@ const ListFilter = createLucideIcon("list-filter", __iconNode$6);
885
891
  */
886
892
 
887
893
 
888
- const __iconNode$5 = [["path", { d: "M5 12h14", key: "1ays0h" }]];
889
- const Minus = createLucideIcon("minus", __iconNode$5);
894
+ const __iconNode$6 = [["path", { d: "M5 12h14", key: "1ays0h" }]];
895
+ const Minus = createLucideIcon("minus", __iconNode$6);
890
896
 
891
897
  /**
892
898
  * @license lucide-react v0.577.0 - ISC
@@ -896,11 +902,11 @@ const Minus = createLucideIcon("minus", __iconNode$5);
896
902
  */
897
903
 
898
904
 
899
- const __iconNode$4 = [
905
+ const __iconNode$5 = [
900
906
  ["path", { d: "M5 12h14", key: "1ays0h" }],
901
907
  ["path", { d: "M12 5v14", key: "s699le" }]
902
908
  ];
903
- const Plus = createLucideIcon("plus", __iconNode$4);
909
+ const Plus = createLucideIcon("plus", __iconNode$5);
904
910
 
905
911
  /**
906
912
  * @license lucide-react v0.577.0 - ISC
@@ -910,11 +916,11 @@ const Plus = createLucideIcon("plus", __iconNode$4);
910
916
  */
911
917
 
912
918
 
913
- const __iconNode$3 = [
919
+ const __iconNode$4 = [
914
920
  ["path", { d: "m21 21-4.34-4.34", key: "14j7rj" }],
915
921
  ["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }]
916
922
  ];
917
- const Search = createLucideIcon("search", __iconNode$3);
923
+ const Search = createLucideIcon("search", __iconNode$4);
918
924
 
919
925
  /**
920
926
  * @license lucide-react v0.577.0 - ISC
@@ -924,14 +930,35 @@ const Search = createLucideIcon("search", __iconNode$3);
924
930
  */
925
931
 
926
932
 
927
- const __iconNode$2 = [
933
+ const __iconNode$3 = [
928
934
  ["path", { d: "M10 11v6", key: "nco0om" }],
929
935
  ["path", { d: "M14 11v6", key: "outv1u" }],
930
936
  ["path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6", key: "miytrc" }],
931
937
  ["path", { d: "M3 6h18", key: "d0wm0j" }],
932
938
  ["path", { d: "M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2", key: "e791ji" }]
933
939
  ];
934
- 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);
935
962
 
936
963
  /**
937
964
  * @license lucide-react v0.577.0 - ISC
@@ -966,7 +993,93 @@ const __iconNode = [
966
993
  ];
967
994
  const X = createLucideIcon("x", __iconNode);
968
995
 
969
- const intentColors = {
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$2 = {
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
+ };
1004
+ // biome-ignore lint/suspicious/noExplicitAny: Type cast required to override MUI Alert variant type without global augmentation
1005
+ const StyledAlert$2 = styled(Alert, {
1006
+ shouldForwardProp: prop => prop !== 'intent' && prop !== 'alertType',
1007
+ })(({ theme, intent = 'success', alertType = 'outlined' }) => {
1008
+ const palette = intentColors$2[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,
1031
+ },
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
+ },
1047
+ },
1048
+ [`& .${alertClasses.action}`]: {
1049
+ padding: 0,
1050
+ marginRight: 0,
1051
+ ...(isFilled && {
1052
+ color: semanticColors.typography.tooltip,
1053
+ [`& .${buttonBaseClasses.root}`]: { color: 'inherit' },
1054
+ }),
1055
+ },
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$1 = {
970
1083
  info: semanticColors.status.info,
971
1084
  success: semanticColors.status.success,
972
1085
  error: semanticColors.status.error,
@@ -974,10 +1087,10 @@ const intentColors = {
974
1087
  neutral: semanticColors.status.neutral,
975
1088
  };
976
1089
  // biome-ignore lint/suspicious/noExplicitAny: Type cast required to override MUI Alert variant type without global augmentation
977
- const StyledAlert$2 = styled(Alert, {
1090
+ const StyledAlert$1 = styled(Alert, {
978
1091
  shouldForwardProp: prop => prop !== 'messagePosition' && prop !== 'intent' && prop !== 'bannerType',
979
1092
  })(({ intent = 'info', bannerType = 'outlined', messagePosition = 'left' }) => {
980
- const palette = intentColors[intent];
1093
+ const palette = intentColors$1[intent];
981
1094
  const typeStyles = bannerType === 'filled'
982
1095
  ? {
983
1096
  backgroundColor: palette.dark,
@@ -998,7 +1111,7 @@ const StyledAlert$2 = styled(Alert, {
998
1111
  alignItems: 'center',
999
1112
  justifyContent: messagePosition === 'center' ? 'center' : 'flex-start',
1000
1113
  ...(messagePosition === 'center' && { position: 'relative' }),
1001
- 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}`,
1002
1115
  fontSize: typography.fontSize.default,
1003
1116
  fontWeight: typography.fontWeight.medium,
1004
1117
  lineHeight: 1.5,
@@ -1053,8 +1166,8 @@ const NeoBanner = ({ intent = 'info', type = 'outlined', message, messagePositio
1053
1166
  if (dismissed) {
1054
1167
  return null;
1055
1168
  }
1056
- const closeIconColor = type === 'filled' ? semanticColors.surfaces.white : intentColors[intent].default;
1057
- return (jsx(StyledAlert$2, { ...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 }))] })) }));
1169
+ const closeIconColor = type === 'filled' ? semanticColors.surfaces.white : intentColors$1[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 }))] })) }));
1058
1171
  };
1059
1172
  NeoBanner.displayName = 'NeoBanner';
1060
1173
 
@@ -2218,32 +2331,32 @@ const Shortcut = styled('span')(({ theme }) => ({
2218
2331
  backgroundColor: semanticColors.surfaces.white,
2219
2332
  }));
2220
2333
  /**
2221
- * NeoDropdownMenuItem - Dropdown menu item component based on MUI MenuItem
2334
+ * NeoMenuItem - Menu item component based on MUI MenuItem
2222
2335
  *
2223
2336
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4159-8584
2224
2337
  *
2225
2338
  * @example
2226
2339
  * ```tsx
2227
2340
  * // With icon and shortcut
2228
- * <NeoDropdownMenuItem icon={<UserIcon />} shortcut="⌘+P">
2341
+ * <NeoMenuItem icon={<UserIcon />} shortcut="⌘+P">
2229
2342
  * View profile
2230
- * </NeoDropdownMenuItem>
2343
+ * </NeoMenuItem>
2231
2344
  *
2232
2345
  * // With secondary text (user list pattern from Figma node 4305:41844)
2233
- * <NeoDropdownMenuItem secondaryText="@phoenix">Phoenix Baker</NeoDropdownMenuItem>
2234
- * <NeoDropdownMenuItem secondaryText="@olivia">Olivia Rhye</NeoDropdownMenuItem>
2346
+ * <NeoMenuItem secondaryText="@phoenix">Phoenix Baker</NeoMenuItem>
2347
+ * <NeoMenuItem secondaryText="@olivia">Olivia Rhye</NeoMenuItem>
2235
2348
  *
2236
2349
  * // Disabled state
2237
- * <NeoDropdownMenuItem disabled>Disabled item</NeoDropdownMenuItem>
2350
+ * <NeoMenuItem disabled>Disabled item</NeoMenuItem>
2238
2351
  * ```
2239
2352
  */
2240
- const NeoDropdownMenuItem = ({ icon, shortcut, secondaryText, children, ...props }) => {
2353
+ const NeoMenuItem = ({ icon, shortcut, secondaryText, children, ...props }) => {
2241
2354
  return (jsx(StyledMenuItem, { ...props, children: jsxs(MenuItemContent, { children: [icon && jsx(IconWrapper$1, { children: icon }), jsxs(LabelContainer$3, { children: [jsx(Label$3, { children: children }), secondaryText && jsx(SecondaryLabel, { children: secondaryText })] }), shortcut && jsx(Shortcut, { children: shortcut })] }) }));
2242
2355
  };
2243
- NeoDropdownMenuItem.displayName = 'NeoDropdownMenuItem';
2356
+ NeoMenuItem.displayName = 'NeoMenuItem';
2244
2357
 
2245
2358
  /**
2246
- * Custom chevron icon for dropdown
2359
+ * Custom chevron icon for select
2247
2360
  * Must accept props from MUI Select to work correctly
2248
2361
  */
2249
2362
  const ChevronDownIcon = (props) => (jsx(ChevronDown, { ...props, size: spacing.spacing_2_1_2, color: semanticColors.typography.input.default, style: { ...props.style } }));
@@ -2283,22 +2396,22 @@ const StyledSelect = styled(MuiSelect)({
2283
2396
  },
2284
2397
  });
2285
2398
  /**
2286
- * NeoDropdown - Dropdown select component with Neo design system styling
2399
+ * NeoSelect - Select component with Neo design system styling
2287
2400
  *
2288
2401
  * A styled version of MUI's Select that uses Neo design tokens, Lucide ChevronDown icon,
2289
- * and NeoDropdownMenu/NeoDropdownMenuItem for the dropdown list.
2402
+ * and NeoMenu/NeoMenuItem for the dropdown list.
2290
2403
  *
2291
2404
  * @example
2292
2405
  * ```tsx
2293
- * import { NeoDropdown, NeoDropdownOption } from '@moderneinc/neo-styled-components'
2406
+ * import { NeoSelect, NeoSelectOption } from '@moderneinc/neo-styled-components'
2294
2407
  *
2295
- * <NeoDropdown value={value} onChange={handleChange}>
2296
- * <NeoDropdownOption value="option1">Option 1</NeoDropdownOption>
2297
- * <NeoDropdownOption value="option2">Option 2</NeoDropdownOption>
2298
- * </NeoDropdown>
2408
+ * <NeoSelect value={value} onChange={handleChange}>
2409
+ * <NeoSelectOption value="option1">Option 1</NeoSelectOption>
2410
+ * <NeoSelectOption value="option2">Option 2</NeoSelectOption>
2411
+ * </NeoSelect>
2299
2412
  * ```
2300
2413
  */
2301
- const NeoDropdown = (props) => {
2414
+ const NeoSelect = (props) => {
2302
2415
  return (jsx(StyledSelect, { ...props, IconComponent: ChevronDownIcon, variant: "standard", MenuProps: {
2303
2416
  ...props.MenuProps,
2304
2417
  PaperProps: {
@@ -2313,7 +2426,7 @@ const NeoDropdown = (props) => {
2313
2426
  },
2314
2427
  } }));
2315
2428
  };
2316
- NeoDropdown.displayName = 'NeoDropdown';
2429
+ NeoSelect.displayName = 'NeoSelect';
2317
2430
 
2318
2431
  /**
2319
2432
  * Icon components for DataGrid filter panel slots
@@ -2774,37 +2887,37 @@ const outlinedColorStyles = {
2774
2887
  default: {
2775
2888
  backgroundColor: semanticColors.status.neutral.light,
2776
2889
  color: semanticColors.status.neutral.dark,
2777
- borderColor: colors.grey[200],
2890
+ borderColor: semanticColors.status.neutral.transparent,
2778
2891
  },
2779
2892
  error: {
2780
2893
  backgroundColor: semanticColors.status.error.light,
2781
2894
  color: semanticColors.status.error.dark,
2782
- borderColor: colors.red[100],
2895
+ borderColor: semanticColors.status.error.transparent,
2783
2896
  },
2784
2897
  warning: {
2785
2898
  backgroundColor: semanticColors.status.warning.light,
2786
2899
  color: semanticColors.status.warning.dark,
2787
- borderColor: colors.orange[100],
2900
+ borderColor: semanticColors.status.warning.transparent,
2788
2901
  },
2789
2902
  success: {
2790
2903
  backgroundColor: semanticColors.status.success.light,
2791
2904
  color: semanticColors.status.success.dark,
2792
- borderColor: 'rgba(94, 196, 111, 0.24)',
2905
+ borderColor: semanticColors.status.success.transparent,
2793
2906
  },
2794
2907
  info: {
2795
2908
  backgroundColor: semanticColors.status.info.light,
2796
2909
  color: semanticColors.status.info.dark,
2797
- borderColor: colors.digitalBlue[100],
2910
+ borderColor: semanticColors.status.info.transparent,
2798
2911
  },
2799
2912
  violet: {
2800
- backgroundColor: `${colors.violet[100]}66`, // rgba(235,213,241,0.4)
2913
+ backgroundColor: 'rgba(235, 213, 241, 0.4)',
2801
2914
  color: colors.violet[600],
2802
- borderColor: colors.violet[100],
2915
+ borderColor: colors.violet[200],
2803
2916
  },
2804
2917
  beta: {
2805
- backgroundColor: colors.digitalBlue[100],
2918
+ backgroundColor: colors.digitalBlue[50],
2806
2919
  color: colors.digitalBlue[400],
2807
- borderColor: colors.digitalBlue[100],
2920
+ borderColor: colors.digitalBlue[200],
2808
2921
  },
2809
2922
  };
2810
2923
  const filledColorStyles = {
@@ -2842,13 +2955,13 @@ const StyledChip$1 = styled(Chip)(({ theme, size, variant, color }) => ({
2842
2955
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4120-34533
2843
2956
  *
2844
2957
  * Figma Props Mapping:
2845
- * - m (sm|md|lg) → size (small|medium|large)
2846
- * - type (light|dark) → variant (outlined|filled)
2847
- * - state (Neutral|Error|Warning|Success|Info|Violet|Beta) → color (default|error|warning|success|info|violet|beta)
2848
- * - Label text → label prop
2958
+ * - Size (Small|Medium|Large) → size (small|medium|large)
2959
+ * - Variant (Subtle|Filled) → variant (outlined|filled)
2960
+ * - Intent (Neutral|Error|Warning|Success|Info|Violet|Beta) → intent (default|error|warning|success|info|violet|beta)
2961
+ * - TEXT Label → label prop
2849
2962
  */
2850
- function NeoTag({ size = 'small', variant = 'outlined', ...props }) {
2851
- return jsx(StyledChip$1, { size: size, variant: variant, ...props });
2963
+ function NeoTag({ size = 'small', variant = 'outlined', intent = 'default', ...props }) {
2964
+ return jsx(StyledChip$1, { size: size, variant: variant, color: intent, ...props });
2852
2965
  }
2853
2966
  NeoTag.displayName = 'NeoTag';
2854
2967
 
@@ -3630,11 +3743,10 @@ const shortcutChipStyles = {
3630
3743
  * customization. Supports both single date selection and date range selection with
3631
3744
  * built-in shortcuts.
3632
3745
  *
3633
- * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4176-3700
3746
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4176-8593
3634
3747
  *
3635
3748
  * Figma Props Mapping:
3636
- * - openedopen (boolean)
3637
- * - type ('Single date'|'Dual dates') → type ('single'|'range')
3749
+ * - Mode ('Single'|'Range') type ('single'|'range')
3638
3750
  *
3639
3751
  * Design Tokens Used:
3640
3752
  * - colors: semanticColors.grey[800], semanticColors.grey[700], semanticColors.surfaces.white, semanticColors.icons.hoverBackground
@@ -3734,11 +3846,11 @@ const StyledDivider = styled(Divider)(({ theme }) => ({
3734
3846
  * @example
3735
3847
  * ```tsx
3736
3848
  * // In a menu
3737
- * <NeoDropdownMenu>
3738
- * <NeoDropdownMenuItem>Settings</NeoDropdownMenuItem>
3849
+ * <NeoMenu>
3850
+ * <NeoMenuItem>Settings</NeoMenuItem>
3739
3851
  * <NeoDivider />
3740
- * <NeoDropdownMenuItem>Sign out</NeoDropdownMenuItem>
3741
- * </NeoDropdownMenu>
3852
+ * <NeoMenuItem>Sign out</NeoMenuItem>
3853
+ * </NeoMenu>
3742
3854
  *
3743
3855
  * // In a card
3744
3856
  * <Card>
@@ -3887,47 +3999,6 @@ const NeoDownloadToast = ({ title, fileName, progress, showClose = true, showPau
3887
3999
  };
3888
4000
  NeoDownloadToast.displayName = 'NeoDownloadToast';
3889
4001
 
3890
- const StyledMenu = styled(Menu)(({ theme }) => ({
3891
- [`& .${paperClasses.root}`]: {
3892
- backgroundColor: semanticColors.surfaces.white,
3893
- borderRadius: borderRadius.s,
3894
- border: `1px solid ${semanticColors.border.primary}`,
3895
- boxShadow: `${shadows.dropdown.x}px ${shadows.dropdown.y}px ${shadows.dropdown.blur}px ${shadows.dropdown.spread}px ${shadows.dropdown.shadow}`,
3896
- minWidth: 200,
3897
- marginTop: theme.spacing(1),
3898
- paddingTop: theme.spacing(1),
3899
- paddingBottom: theme.spacing(1),
3900
- },
3901
- [`& .${listClasses.root}`]: {
3902
- padding: 0,
3903
- },
3904
- }));
3905
- /**
3906
- * NeoDropdownMenu - Dropdown menu component based on MUI Menu
3907
- *
3908
- * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=11141-4980
3909
- *
3910
- * @example
3911
- * ```tsx
3912
- * const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
3913
- * const open = Boolean(anchorEl);
3914
- *
3915
- * <Button onClick={(e) => setAnchorEl(e.currentTarget)}>Open Menu</Button>
3916
- * <NeoDropdownMenu
3917
- * open={open}
3918
- * anchorEl={anchorEl}
3919
- * onClose={() => setAnchorEl(null)}
3920
- * >
3921
- * <NeoDropdownMenuItem icon={<Icon />} shortcut="⌘+P">View profile</NeoDropdownMenuItem>
3922
- * <NeoDropdownMenuItem>Settings</NeoDropdownMenuItem>
3923
- * </NeoDropdownMenu>
3924
- * ```
3925
- */
3926
- const NeoDropdownMenu = ({ children, ...props }) => {
3927
- return jsx(StyledMenu, { ...props, children: children });
3928
- };
3929
- NeoDropdownMenu.displayName = 'NeoDropdownMenu';
3930
-
3931
4002
  const filterChipOnlyProps = ['selected', 'expanded', 'selectedLabel', 'count', 'onClear'];
3932
4003
  const StyledChip = styled(Chip, {
3933
4004
  shouldForwardProp: prop => !filterChipOnlyProps.includes(prop),
@@ -4071,11 +4142,11 @@ const StyledFooter = styled(Box, {
4071
4142
  '&::before': {
4072
4143
  content: showShadow ? '""' : 'none',
4073
4144
  position: 'absolute',
4074
- top: `-${shadows.neutralRegular.blur}px`, // -4px
4145
+ top: `-${shadows.neutral.regular.blur}px`, // -4px
4075
4146
  left: 0,
4076
4147
  right: 0,
4077
- height: `${shadows.neutralRegular.blur}px`, // 4px
4078
- background: `linear-gradient(to top, ${shadows.neutralRegular.shadow}, transparent)`, // rgba(31, 41, 55, 0.1)
4148
+ height: `${shadows.neutral.regular.blur}px`, // 4px
4149
+ background: `linear-gradient(to top, ${shadows.neutral.regular.shadow}, transparent)`, // rgba(31, 41, 55, 0.1)
4079
4150
  pointerEvents: 'none',
4080
4151
  },
4081
4152
  [theme.breakpoints.down('sm')]: {
@@ -4665,6 +4736,19 @@ const sizeConfig = {
4665
4736
  badgeFontSize: typography.fontSize.xs,
4666
4737
  lineHeight: 1.5,
4667
4738
  },
4739
+ xxxlarge: {
4740
+ height: spacing.spacing_10,
4741
+ paddingTop: 1,
4742
+ paddingRight: spacing.spacing_3_4,
4743
+ paddingBottom: 1,
4744
+ paddingLeft: spacing.spacing_3_4,
4745
+ gap: spacing.spacing_2,
4746
+ iconSize: spacing.spacing_6,
4747
+ fontSize: typography.fontSize.h5,
4748
+ secondaryFontSize: typography.fontSize.sm,
4749
+ badgeFontSize: typography.fontSize.xs,
4750
+ lineHeight: 1.5,
4751
+ },
4668
4752
  };
4669
4753
  const StyledListItemButton$1 = styled(ListItemButton, {
4670
4754
  shouldForwardProp: prop => prop !== 'size' &&
@@ -4709,7 +4793,7 @@ const StyledListItemButton$1 = styled(ListItemButton, {
4709
4793
  '& .list-item-primary': {
4710
4794
  fontSize: theme.typography.pxToRem(config.fontSize),
4711
4795
  lineHeight: config.lineHeight,
4712
- fontWeight: isLink && size === 'xxlarge'
4796
+ fontWeight: isLink && (size === 'xxlarge' || size === 'xxxlarge')
4713
4797
  ? typography.fontWeight.semiBold
4714
4798
  : size === 'small' || size === 'medium'
4715
4799
  ? typography.fontWeight.regular
@@ -4720,18 +4804,20 @@ const StyledListItemButton$1 = styled(ListItemButton, {
4720
4804
  overflow: 'hidden',
4721
4805
  textOverflow: 'ellipsis',
4722
4806
  whiteSpace: 'nowrap',
4723
- ...(isLink && size === 'xxlarge' && { textDecoration: 'none' }),
4807
+ ...(isLink && (size === 'xxlarge' || size === 'xxxlarge') && { textDecoration: 'none' }),
4724
4808
  },
4725
- // Link hover styling (underline on hover for xxlarge)
4809
+ // Link hover styling (underline on hover for xxlarge/xxxlarge)
4726
4810
  ...(isLink &&
4727
- size === 'xxlarge' && {
4811
+ (size === 'xxlarge' || size === 'xxxlarge') && {
4728
4812
  '&:hover .list-item-primary': {
4729
4813
  textDecoration: 'underline',
4730
4814
  },
4731
4815
  }),
4732
- // Badge styling (for xxlarge link variant)
4816
+ // Badge styling (for xxlarge/xxxlarge link variant)
4733
4817
  '& .list-item-badge': {
4734
- fontSize: theme.typography.pxToRem(size === 'xxlarge' ? config.badgeFontSize || 12 : 12),
4818
+ fontSize: theme.typography.pxToRem(size === 'xxlarge' || size === 'xxxlarge'
4819
+ ? config.badgeFontSize || 12
4820
+ : 12),
4735
4821
  lineHeight: 1.5,
4736
4822
  fontWeight: typography.fontWeight.regular,
4737
4823
  color: semanticColors.typography.bodySecondary,
@@ -4809,14 +4895,14 @@ const StyledListItemButton$1 = styled(ListItemButton, {
4809
4895
  /**
4810
4896
  * NeoListItem - Flexible list item component with multiple size variants and states
4811
4897
  *
4812
- * A versatile list item component built on MUI's ListItemButton that supports five size variants
4813
- * (small to xxlarge), interactive states (default, selected, disabled, link), and optional
4898
+ * A versatile list item component built on MUI's ListItemButton that supports six size variants
4899
+ * (small to xxxlarge), interactive states (default, selected, disabled, link), and optional
4814
4900
  * icons/logos, secondary text, and badges.
4815
4901
  *
4816
4902
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4205-36442
4817
4903
  *
4818
4904
  * Figma Props Mapping:
4819
- * - size (small|medium|large|xlarge|XXL) → size (small|medium|large|xlarge|xxlarge)
4905
+ * - size (Small|Medium|Large|Extra Large|XX Large|TripleExtraLarge) → size (small|medium|large|xlarge|xxlarge|xxxlarge)
4820
4906
  * - state (default|active|disabled|link) → selected, disabled, isLink props
4821
4907
  * - showIcon → icon prop (pass ReactNode)
4822
4908
  * - showSupportingText → secondaryText prop (pass ReactNode)
@@ -4839,9 +4925,10 @@ const StyledListItemButton$1 = styled(ListItemButton, {
4839
4925
  */
4840
4926
  const NeoListItem = ({ size = 'medium', primaryText, secondaryText, badge, icon, isLink = false, trailingElement, component, ...props }) => {
4841
4927
  // Determine if secondary text should be shown based on size
4842
- const showSecondaryText = secondaryText && (size === 'large' || size === 'xlarge' || size === 'xxlarge');
4843
- // Determine if badge should be shown (only for xxlarge)
4844
- const showBadge = badge && size === 'xxlarge';
4928
+ const showSecondaryText = secondaryText &&
4929
+ (size === 'large' || size === 'xlarge' || size === 'xxlarge' || size === 'xxxlarge');
4930
+ // Determine if badge should be shown (for xxlarge/xxxlarge)
4931
+ const showBadge = badge && (size === 'xxlarge' || size === 'xxxlarge');
4845
4932
  // Prepare primary text with badge if needed
4846
4933
  const primaryContent = showBadge ? (jsxs(Fragment, { children: [primaryText, ' ', jsx(Typography, { component: "span", className: "list-item-badge", children: badge })] })) : (primaryText);
4847
4934
  return (jsxs(StyledListItemButton$1, { size: size, isLink: isLink, hasSecondaryText: !!showSecondaryText, ...(component && { component }), ...props, children: [icon && jsx(ListItemIcon, { children: icon }), jsx(ListItemText, { primary: primaryContent, secondary: showSecondaryText ? secondaryText : undefined, sx: { minWidth: 0, flex: 1 }, slotProps: {
@@ -4980,39 +5067,46 @@ const NeoListItemButton = ({ children, selected = false, disabled = false, ...pr
4980
5067
  };
4981
5068
  NeoListItemButton.displayName = 'NeoListItemButton';
4982
5069
 
5070
+ const StyledMenu = styled(Menu)(({ theme }) => ({
5071
+ [`& .${paperClasses.root}`]: {
5072
+ backgroundColor: semanticColors.surfaces.white,
5073
+ borderRadius: borderRadius.s,
5074
+ border: `1px solid ${semanticColors.border.primary}`,
5075
+ boxShadow: `${shadows.dropdown.x}px ${shadows.dropdown.y}px ${shadows.dropdown.blur}px ${shadows.dropdown.spread}px ${shadows.dropdown.shadow}`,
5076
+ minWidth: 200,
5077
+ marginTop: theme.spacing(1),
5078
+ paddingTop: theme.spacing(1),
5079
+ paddingBottom: theme.spacing(1),
5080
+ },
5081
+ [`& .${listClasses.root}`]: {
5082
+ padding: 0,
5083
+ },
5084
+ }));
4983
5085
  /**
4984
- * @deprecated Use `NeoCard` with `size="small"` instead.
5086
+ * NeoMenu - Menu component based on MUI Menu
4985
5087
  *
4986
- * @example
4987
- * ```tsx
4988
- * // Before
4989
- * <NeoMarketplaceCard logo={...} title="Java" ... />
4990
- *
4991
- * // After
4992
- * <NeoCard size="small" logo={...} title="Java" ... />
4993
- * ```
4994
- */
4995
- const NeoMarketplaceCard = (props) => {
4996
- return jsx(NeoCard, { size: "small", ...props });
4997
- };
4998
- NeoMarketplaceCard.displayName = 'NeoMarketplaceCard';
4999
-
5000
- /**
5001
- * @deprecated Use `NeoCard` with `size="large"` instead.
5088
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=11141-4980
5002
5089
  *
5003
5090
  * @example
5004
5091
  * ```tsx
5005
- * // Before
5006
- * <NeoMarketplaceLargeCard cardTheme="light" ... />
5092
+ * const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
5093
+ * const open = Boolean(anchorEl);
5007
5094
  *
5008
- * // After
5009
- * <NeoCard size="large" cardTheme="light" ... />
5095
+ * <Button onClick={(e) => setAnchorEl(e.currentTarget)}>Open Menu</Button>
5096
+ * <NeoMenu
5097
+ * open={open}
5098
+ * anchorEl={anchorEl}
5099
+ * onClose={() => setAnchorEl(null)}
5100
+ * >
5101
+ * <NeoMenuItem icon={<Icon />} shortcut="⌘+P">View profile</NeoMenuItem>
5102
+ * <NeoMenuItem>Settings</NeoMenuItem>
5103
+ * </NeoMenu>
5010
5104
  * ```
5011
5105
  */
5012
- const NeoMarketplaceLargeCard = (props) => {
5013
- return jsx(NeoCard, { size: "large", ...props });
5106
+ const NeoMenu = ({ children, ...props }) => {
5107
+ return jsx(StyledMenu, { ...props, children: children });
5014
5108
  };
5015
- NeoMarketplaceLargeCard.displayName = 'NeoMarketplaceLargeCard';
5109
+ NeoMenu.displayName = 'NeoMenu';
5016
5110
 
5017
5111
  // ============================================================================
5018
5112
  // NeoModal - Main Dialog Container
@@ -5324,9 +5418,9 @@ const TagPill = styled('span')(({ theme }) => ({
5324
5418
  *
5325
5419
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=8455-6120
5326
5420
  */
5327
- const NeoNavigationItem = ({ icon, label, selected = false, tag, children, ...props }) => {
5421
+ function NeoNavigationItem({ icon, label, selected = false, tag, children, ...props }) {
5328
5422
  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] }));
5329
- };
5423
+ }
5330
5424
  NeoNavigationItem.displayName = 'NeoNavigationItem';
5331
5425
 
5332
5426
  /**
@@ -5982,127 +6076,6 @@ const NeoSkeleton = ({ colorTheme = 'light', position = 'start', ...props }) =>
5982
6076
  };
5983
6077
  NeoSkeleton.displayName = 'NeoSkeleton';
5984
6078
 
5985
- /**
5986
- * Styled Alert component with custom severity and variant styling
5987
- * Uses Custom Variants Pattern to add 'neutral' and 'info' severities
5988
- */
5989
- const StyledAlert$1 = styled(Alert, {
5990
- shouldForwardProp: prop => prop !== 'severity' && prop !== 'variant',
5991
- })(({ theme, severity = 'success', variant = 'outlined' }) => {
5992
- // Color mapping for different severities
5993
- const colorMap = {
5994
- success: {
5995
- light: semanticColors.status.success.light,
5996
- medium: semanticColors.status.success.default,
5997
- },
5998
- error: {
5999
- light: semanticColors.status.error.light,
6000
- medium: semanticColors.status.error.default,
6001
- },
6002
- neutral: {
6003
- light: semanticColors.status.neutral.light,
6004
- medium: semanticColors.status.neutral.default,
6005
- },
6006
- info: {
6007
- light: semanticColors.status.info.light,
6008
- medium: semanticColors.status.info.default,
6009
- },
6010
- };
6011
- const severityColors = colorMap[severity];
6012
- // Variant-specific styles based on Phase 1.1 analysis
6013
- const variantStyles = (() => {
6014
- if (variant === 'filled') {
6015
- // Dark mode: solid background with white text
6016
- return {
6017
- backgroundColor: severityColors.medium,
6018
- border: 'none',
6019
- color: semanticColors.typography.tooltip,
6020
- padding: theme.spacing(0.75, 3),
6021
- boxShadow: `0px 1px 3px ${semanticColors.surfaces.shadowNeutral}1a`, // 1a = 10% opacity
6022
- [`& .${alertClasses.icon}`]: {
6023
- color: semanticColors.typography.tooltip,
6024
- },
6025
- [`& .${alertClasses.message}`]: {
6026
- color: semanticColors.typography.tooltip,
6027
- },
6028
- };
6029
- }
6030
- // Light mode: light background with border
6031
- return {
6032
- backgroundColor: severityColors.light,
6033
- border: `1px solid ${severityColors.medium}`,
6034
- color: colors.grey[800],
6035
- padding: theme.spacing(0.125, 2),
6036
- [`& .${alertClasses.icon}`]: {
6037
- color: severityColors.medium,
6038
- },
6039
- [`& .${alertClasses.message}`]: {
6040
- color: colors.grey[800],
6041
- },
6042
- };
6043
- })();
6044
- return {
6045
- height: spacing.spacing_8,
6046
- width: '100%',
6047
- borderRadius: borderRadius.xS,
6048
- alignItems: 'center',
6049
- fontFamily: typography.fontFamily.body,
6050
- fontSize: theme.typography.pxToRem(typography.fontSize.default),
6051
- fontWeight: typography.fontWeight.medium,
6052
- lineHeight: 1.5,
6053
- ...variantStyles,
6054
- // Supporting text styling
6055
- [`& .${alertClasses.message} > *:not(:first-child)`]: {
6056
- fontSize: theme.typography.pxToRem(typography.fontSize.sm),
6057
- fontWeight: typography.fontWeight.regular,
6058
- color: variant === 'filled'
6059
- ? semanticColors.typography.tooltip
6060
- : semanticColors.typography.bodySecondary,
6061
- lineHeight: 1.4,
6062
- marginTop: theme.spacing(0.25),
6063
- },
6064
- };
6065
- });
6066
- /**
6067
- * NeoStatusBanner - Status banner component for displaying system status messages
6068
- *
6069
- * Displays status information with different severity levels (success, error, info, neutral) and
6070
- * visual modes (outlined for light backgrounds, filled for emphasis).
6071
- *
6072
- * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4921-3427
6073
- *
6074
- * Figma Props Mapping:
6075
- * - Status (Success|Error|Info|Offline) → severity ('success'|'error'|'info'|'neutral')
6076
- * - Mode (Light|Dark) → variant ('outlined'|'filled')
6077
- *
6078
- * Design Tokens Used:
6079
- * - status.success.light, status.success.default
6080
- * - status.error.light, status.error.default
6081
- * - status.neutral.light, status.neutral.default
6082
- * - status.info.light, status.info.default
6083
- * - typography.tooltip, typography.bodySecondary
6084
- * - grey[800]
6085
- * - fontSize.default, fontSize.sm
6086
- * - fontWeight.medium, fontWeight.regular
6087
- * - fontFamily.body
6088
- * - surfaces.shadowNeutral
6089
- */
6090
- const NeoStatusBanner = ({ severity = 'success', variant = 'outlined', icon, children, ...props }) => {
6091
- // Icon mapping for different severities
6092
- const iconMap = {
6093
- success: jsx(CircleCheck, { size: 24 }),
6094
- error: jsx(CircleAlert, { size: 24 }),
6095
- neutral: jsx(WifiOff, { size: 24 }),
6096
- info: jsx(Info, { size: 24 }),
6097
- };
6098
- const defaultIcon = iconMap[severity];
6099
- // Type assertion needed: severity and variant are custom props filtered by shouldForwardProp
6100
- // biome-ignore lint/suspicious/noExplicitAny: Custom props pattern requires any cast
6101
- const StyledAlertAny = StyledAlert$1;
6102
- return (jsx(StyledAlertAny, { ...props, severity: severity, variant: variant, icon: icon ?? defaultIcon, children: children }));
6103
- };
6104
- NeoStatusBanner.displayName = 'NeoStatusBanner';
6105
-
6106
6079
  /**
6107
6080
  * NeoTabs - Tabs container component based on MUI Tabs
6108
6081
  *
@@ -6137,7 +6110,20 @@ const StyledTab = styled(MuiTab)(({ theme }) => ({
6137
6110
  color: semanticColors.typography.tab.active,
6138
6111
  fontWeight: typography.fontWeight.semiBold,
6139
6112
  },
6113
+ '&:hover': {
6114
+ backgroundColor: semanticColors.buttons.secondary.hoverBackground,
6115
+ [`&.${tabClasses.selected}::after`]: {
6116
+ content: '""',
6117
+ position: 'absolute',
6118
+ bottom: 0,
6119
+ left: 0,
6120
+ right: 0,
6121
+ height: 2,
6122
+ backgroundColor: semanticColors.buttons.primary.hover,
6123
+ },
6124
+ },
6140
6125
  [`&.${buttonBaseClasses.focusVisible}`]: {
6126
+ color: semanticColors.typography.tab.active,
6141
6127
  outline: `2px solid ${semanticColors.border.focus}`,
6142
6128
  outlineOffset: -2,
6143
6129
  },
@@ -6145,6 +6131,21 @@ const StyledTab = styled(MuiTab)(({ theme }) => ({
6145
6131
  color: semanticColors.typography.button.disabled,
6146
6132
  cursor: 'not-allowed',
6147
6133
  pointerEvents: 'auto',
6134
+ '&:hover': {
6135
+ backgroundColor: 'transparent',
6136
+ },
6137
+ [`&.${tabClasses.selected}`]: {
6138
+ color: semanticColors.typography.button.disabled,
6139
+ '&::after': {
6140
+ content: '""',
6141
+ position: 'absolute',
6142
+ bottom: 0,
6143
+ left: 0,
6144
+ right: 0,
6145
+ height: 2,
6146
+ backgroundColor: semanticColors.buttons.tertiary.disabled,
6147
+ },
6148
+ },
6148
6149
  },
6149
6150
  }));
6150
6151
  const TabLabelContainer = styled('span')(({ theme }) => ({
@@ -6159,10 +6160,7 @@ const TabLabelContainer = styled('span')(({ theme }) => ({
6159
6160
  *
6160
6161
  * Figma Props Mapping:
6161
6162
  * - Current=True/False → Controlled by parent NeoTabs value
6162
- * - State=Defaultdefault styling
6163
- * - State=Hover → CSS :hover
6164
- * - State=Focus → CSS :focus-visible
6165
- * - Tag count → count prop (renders NeoTag)
6163
+ * - Show tag count prop (renders NeoTag)
6166
6164
  * - Text label → label prop
6167
6165
  */
6168
6166
  const NeoTab = ({ label, count, ...props }) => {
@@ -6171,18 +6169,37 @@ const NeoTab = ({ label, count, ...props }) => {
6171
6169
  };
6172
6170
  NeoTab.displayName = 'NeoTab';
6173
6171
 
6172
+ const intentColors = {
6173
+ info: semanticColors.status.info,
6174
+ success: semanticColors.status.success,
6175
+ error: semanticColors.status.error,
6176
+ warning: semanticColors.status.warning,
6177
+ neutral: semanticColors.status.neutral,
6178
+ };
6174
6179
  // biome-ignore lint/suspicious/noExplicitAny: Type cast required to override MUI Alert variant type without global augmentation
6175
6180
  const StyledAlert = styled(Alert, {
6176
- shouldForwardProp: prop => prop !== 'variant',
6177
- })(({ theme, variant = 'default' }) => {
6178
- // Base styles
6179
- const baseStyles = {
6181
+ shouldForwardProp: prop => prop !== 'intent' && prop !== 'toastType',
6182
+ })(({ theme, intent = 'neutral', toastType = 'outlined' }) => {
6183
+ const palette = intentColors[intent];
6184
+ const typeStyles = toastType === 'filled'
6185
+ ? {
6186
+ backgroundColor: palette.dark,
6187
+ color: semanticColors.surfaces.white,
6188
+ border: `1px solid ${palette.dark}`,
6189
+ }
6190
+ : {
6191
+ backgroundColor: palette.light,
6192
+ color: colors.grey['800'],
6193
+ border: `1px solid ${palette.default}`,
6194
+ };
6195
+ return {
6180
6196
  padding: spacing.spacing_2,
6181
6197
  borderRadius: borderRadius.s,
6182
6198
  gap: spacing.spacing_4,
6183
6199
  alignItems: 'flex-start',
6184
6200
  fontSize: theme.typography.pxToRem(typography.fontSize.sm),
6185
6201
  lineHeight: 1.4,
6202
+ ...typeStyles,
6186
6203
  [`& .${alertClasses.icon}`]: {
6187
6204
  display: 'none',
6188
6205
  },
@@ -6198,76 +6215,31 @@ const StyledAlert = styled(Alert, {
6198
6215
  marginRight: 0,
6199
6216
  },
6200
6217
  };
6201
- // Variant-specific styles
6202
- const variantStyles = {
6203
- default: {
6204
- backgroundColor: semanticColors.surfaces.snackbarDarkMode,
6205
- color: colors.grey['800'],
6206
- border: `1px solid ${semanticColors.border.primary}`,
6207
- },
6208
- dark: {
6209
- backgroundColor: semanticColors.surfaces.snackbarLightMode,
6210
- color: semanticColors.surfaces.white,
6211
- border: `1px solid ${semanticColors.surfaces.snackbarLightMode}`,
6212
- },
6213
- brand: {
6214
- backgroundColor: semanticColors.surfaces.snackbarBrand,
6215
- color: semanticColors.surfaces.white,
6216
- border: `1px solid ${semanticColors.surfaces.snackbarBrand}`,
6217
- },
6218
- error: {
6219
- backgroundColor: semanticColors.status.error.light,
6220
- color: semanticColors.status.error.dark,
6221
- border: `1px solid ${semanticColors.status.error.default}`,
6222
- },
6223
- success: {
6224
- backgroundColor: semanticColors.status.success.light,
6225
- color: semanticColors.status.success.dark,
6226
- border: `1px solid ${semanticColors.status.success.default}`,
6227
- },
6228
- info: {
6229
- backgroundColor: semanticColors.status.info.light,
6230
- color: semanticColors.status.info.dark,
6231
- border: `1px solid ${semanticColors.status.info.default}`,
6232
- },
6233
- };
6234
- return {
6235
- ...baseStyles,
6236
- ...variantStyles[variant],
6237
- };
6238
6218
  });
6239
- const ToastTitle = styled('p')(({ theme, variant = 'default' }) => {
6240
- const colorMap = {
6241
- default: colors.grey['700'],
6242
- dark: semanticColors.surfaces.white,
6243
- brand: semanticColors.surfaces.white,
6244
- error: semanticColors.status.error.dark,
6245
- success: semanticColors.status.success.dark,
6246
- info: semanticColors.status.info.dark,
6247
- };
6219
+ const ToastTitle = styled('p')(({ theme, intent = 'neutral', toastType = 'outlined' }) => {
6220
+ const palette = intentColors[intent];
6221
+ const color = toastType === 'filled' ? semanticColors.surfaces.white : palette.dark;
6248
6222
  return {
6249
6223
  margin: 0,
6250
6224
  fontSize: theme.typography.pxToRem(typography.fontSize.sm),
6251
6225
  fontWeight: typography.fontWeight.semiBold,
6252
6226
  lineHeight: 1.4,
6253
- color: colorMap[variant],
6227
+ color,
6254
6228
  };
6255
6229
  });
6256
- const ToastMessage = styled('p')(({ theme, variant = 'default' }) => {
6257
- const colorMap = {
6258
- default: semanticColors.typography.bodySecondary,
6259
- dark: colors.grey['200'],
6260
- brand: colors.grey['200'],
6261
- error: semanticColors.status.error.dark,
6262
- success: semanticColors.status.success.dark,
6263
- info: semanticColors.status.info.dark,
6264
- };
6230
+ const ToastMessage = styled('p')(({ theme, intent = 'neutral', toastType = 'outlined' }) => {
6231
+ const palette = intentColors[intent];
6232
+ const color = toastType === 'filled'
6233
+ ? colors.grey['200']
6234
+ : intent === 'neutral'
6235
+ ? semanticColors.typography.bodySecondary
6236
+ : palette.dark;
6265
6237
  return {
6266
6238
  margin: 0,
6267
6239
  fontSize: theme.typography.pxToRem(typography.fontSize.sm),
6268
6240
  fontWeight: typography.fontWeight.regular,
6269
6241
  lineHeight: 1.4,
6270
- color: colorMap[variant],
6242
+ color,
6271
6243
  };
6272
6244
  });
6273
6245
  const ToastActions = styled(Stack)({
@@ -6276,30 +6248,20 @@ const ToastActions = styled(Stack)({
6276
6248
  justifyContent: 'flex-start',
6277
6249
  });
6278
6250
  const ToastButton = styled(Button, {
6279
- shouldForwardProp: prop => prop !== 'toastVariant' && prop !== 'primary',
6280
- })(({ toastVariant = 'default', primary }) => {
6251
+ shouldForwardProp: prop => prop !== 'toastIntent' && prop !== 'toastType' && prop !== 'primary',
6252
+ })(({ toastIntent = 'neutral', toastType = 'outlined', primary }) => {
6253
+ const palette = intentColors[toastIntent];
6281
6254
  const getColor = () => {
6255
+ if (toastType === 'filled') {
6256
+ return primary ? colors.digitalBlue['200'] : semanticColors.surfaces.white;
6257
+ }
6282
6258
  if (primary) {
6283
- if (toastVariant === 'dark' || toastVariant === 'brand') {
6284
- return colors.digitalBlue['200'];
6285
- }
6286
6259
  return semanticColors.typography.link.primary;
6287
6260
  }
6288
- // Non-primary button colors
6289
- if (toastVariant === 'dark' || toastVariant === 'brand') {
6290
- return semanticColors.surfaces.white;
6291
- }
6292
- if (toastVariant === 'error') {
6293
- return semanticColors.status.error.dark;
6294
- }
6295
- if (toastVariant === 'success') {
6296
- return semanticColors.status.success.dark;
6261
+ if (toastIntent === 'neutral') {
6262
+ return semanticColors.icons.placeholder;
6297
6263
  }
6298
- if (toastVariant === 'info') {
6299
- return semanticColors.status.info.dark;
6300
- }
6301
- // default variant uses icon placeholder color
6302
- return semanticColors.icons.placeholder;
6264
+ return palette.dark;
6303
6265
  };
6304
6266
  return {
6305
6267
  padding: 0,
@@ -6319,22 +6281,17 @@ const ToastButton = styled(Button, {
6319
6281
  * NeoToast - Notification/Toast component based on MUI Alert
6320
6282
  *
6321
6283
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4122-37223
6322
- *
6323
- * Figma Props Mapping:
6324
- * - type (Light mode|Dark mode|Brand color|Error|Success|Info) → variant (default|dark|brand|error|success|info)
6325
- * - header title (string)
6326
- * - supportingText message (string)
6327
- * - xCloseButton → showClose (boolean)
6328
- * - actions → actions (ReactNode)
6329
- */
6330
- const NeoToast = ({ variant = 'default', title, message, showClose = true, actions, onClose, ...props }) => {
6331
- 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 })] }));
6284
+ */
6285
+ const NeoToast = ({ intent = 'neutral', type = 'outlined', title, message, showClose = false, actions, onClose, ...props }) => {
6286
+ const palette = intentColors[intent];
6287
+ const closeIconColor = type === 'filled' ? semanticColors.surfaces.white : palette.default;
6288
+ return (jsxs(StyledAlert, { ...props, intent: intent, toastType: type, action: showClose ? (jsx(IconButton, { size: "small", onClick: onClose, sx: { color: closeIconColor }, children: jsx(X, { size: 16 }) })) : undefined, children: [jsxs(Stack, { sx: { gap: `${spacing.spacing_1}px`, width: '100%' }, children: [title && jsx(ToastTitle, { intent: intent, toastType: type, children: title }), message && jsx(ToastMessage, { intent: intent, toastType: type, children: message })] }), actions && jsx(ToastActions, { direction: "row", children: actions })] }));
6332
6289
  };
6333
6290
  /**
6334
6291
  * Helper component for creating toast action buttons with proper styling
6335
6292
  */
6336
- const NeoToastButton = ({ primary, variant = 'default', children, ...props }) => {
6337
- return (jsx(ToastButton, { variant: "text", toastVariant: variant, primary: primary, ...props, children: children }));
6293
+ const NeoToastButton = ({ primary, intent = 'neutral', type = 'outlined', children, ...props }) => {
6294
+ return (jsx(ToastButton, { variant: "text", toastIntent: intent, toastType: type, primary: primary, ...props, children: children }));
6338
6295
  };
6339
6296
  NeoToast.displayName = 'NeoToast';
6340
6297
  NeoToastButton.displayName = 'NeoToastButton';
@@ -6435,7 +6392,7 @@ const StyledSwitch = styled(Switch, {
6435
6392
  [`& .${switchClasses.thumb}`]: {
6436
6393
  width: config.thumbSize,
6437
6394
  height: config.thumbSize,
6438
- boxShadow: `${shadows.neutralSmall.x}px ${shadows.neutralSmall.y}px ${shadows.neutralSmall.blur}px ${shadows.neutralSmall.spread}px ${shadows.neutralSmall.shadow}`,
6395
+ 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}`,
6439
6396
  transition: theme.transitions.create(['width'], {
6440
6397
  duration: theme.transitions.duration.shortest,
6441
6398
  }),
@@ -6579,7 +6536,7 @@ const variantConfig = {
6579
6536
  */
6580
6537
  const StyledTooltip = styled(Tooltip, {
6581
6538
  shouldForwardProp: prop => prop !== 'variant' && prop !== 'description',
6582
- })(({ theme, variant = 'light', description }) => {
6539
+ })(({ variant = 'light', description }) => {
6583
6540
  const hasDescription = Boolean(description);
6584
6541
  const variantStyles = variantConfig[variant];
6585
6542
  return {
@@ -6587,24 +6544,21 @@ const StyledTooltip = styled(Tooltip, {
6587
6544
  [`& .${tooltipClasses.tooltip}`]: {
6588
6545
  backgroundColor: variantStyles.backgroundColor,
6589
6546
  color: variantStyles.color,
6590
- fontSize: theme.typography.pxToRem(typography.fontSize.xs), // 12px
6591
- fontWeight: hasDescription ? typography.fontWeight.medium : typography.fontWeight.medium,
6592
- lineHeight: hasDescription ? 1.5 : 1, // 18px for description, tight for simple
6593
- borderRadius: hasDescription ? theme.spacing(1) : theme.spacing(0.5), // 8px : 4px
6594
- padding: hasDescription
6595
- ? theme.spacing(1.5) // 12px all sides
6596
- : theme.spacing(0, 1), // 0 vertical, 8px horizontal
6547
+ fontSize: typography.fontSize.xs,
6548
+ fontWeight: typography.fontWeight.medium,
6549
+ lineHeight: hasDescription ? 1.5 : 1,
6550
+ borderRadius: hasDescription ? borderRadius.s : borderRadius.xS,
6551
+ padding: hasDescription ? spacing.spacing_1_1_2 : `0 ${spacing.spacing_1}px`,
6597
6552
  ...(hasDescription && {
6598
6553
  maxWidth: 296,
6599
6554
  }),
6600
6555
  ...(!hasDescription && {
6601
- height: 26,
6556
+ height: spacing.spacing_3_1_4,
6602
6557
  display: 'flex',
6603
6558
  alignItems: 'center',
6604
6559
  justifyContent: 'center',
6605
6560
  }),
6606
- // Apply shadow
6607
- boxShadow: `${shadows.neutralMedium.x}px ${shadows.neutralMedium.y}px ${shadows.neutralMedium.blur}px ${shadows.neutralMedium.spread}px ${shadows.neutralMedium.shadow}`,
6561
+ 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}`,
6608
6562
  },
6609
6563
  // Style the arrow
6610
6564
  [`& .${tooltipClasses.arrow}`]: {
@@ -6621,8 +6575,8 @@ const StyledTooltip = styled(Tooltip, {
6621
6575
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4091-26557&t=Bo58EpFmg6ILJtmv-11
6622
6576
  *
6623
6577
  * Figma Props Mapping:
6624
- * - Type (Light mode|Dark mode|Brand color) → variant ('light'|'dark'|'brand')
6625
- * - Arrow → arrow (boolean) + placement (top/bottom/left/right/etc)
6578
+ * - Theme (Light mode|Dark mode|Brand color) → variant ('light'|'dark'|'brand')
6579
+ * - Placement → arrow (boolean) + placement (top/bottom/left/right/etc)
6626
6580
  * - Supporting text (True|False) → description (string|undefined)
6627
6581
  * - text → title (string, literal content)
6628
6582
  *
@@ -6845,5 +6799,5 @@ NeoTypologyControl.displayName = 'NeoTypologyControl';
6845
6799
 
6846
6800
  const version = '0.0.0-development';
6847
6801
 
6848
- export { ActivityScene, CIRCLE_RADIUS, NeoActivityHeader, NeoActivityIndicatorCell, 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, NeoStatusBanner, NeoTab, NeoTabs, NeoTag, NeoToast, NeoToastButton, NeoToggle, NeoToolbar, NeoTooltip, NeoTreeItem, NeoTreeView, StyledToggleButton as NeoTypologyButton, NeoTypologyControl, NeoUserAvatarCell, SortedAscendingIcon, SortedDescendingIcon, UnsortedIcon, getDataGridHeaderStyles, neoRowHeights, version };
6802
+ 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, NeoSelect as NeoDataGridSelect, NeoDatePicker, NeoDivider, NeoDot, NeoDownloadToast, NeoSelect as NeoDropdown, NeoMenu as NeoDropdownMenu, NeoMenuItem as NeoDropdownMenuItem, NeoMenuItem as NeoDropdownOption, NeoFilterChip, NeoFooter, NeoGeneralAvatar, NeoIconButton, NeoIconWrapper, NeoInfiniteScrollGrid, NeoInputField, NeoListItem, NeoListItemButton, NeoLoadingSpinner, NeoMenu, NeoMenuItem, NeoModal, NeoModalContent, NeoModalFooter, NeoModalHeader, NeoMultiBadgesCell, NeoNavigationAvatar, NeoNavigationItem, NeoPageContent, NeoPaginatedGrid, NeoProgressbar, NeoQuickFilter, NeoRadio, NeoSearchChip, NeoSelect, NeoMenuItem as NeoSelectOption, NeoSkeleton, NeoStatusBadgeCell, NeoTab, NeoTabs, NeoTag, NeoToast, NeoToastButton, NeoToggle, NeoToolbar, NeoTooltip, NeoTreeItem, NeoTreeView, StyledToggleButton as NeoTypologyButton, NeoTypologyControl, NeoUserAvatarCell, SortedAscendingIcon, SortedDescendingIcon, UnsortedIcon, focusRingStyles, getDataGridHeaderStyles, neoRowHeights, version };
6849
6803
  //# sourceMappingURL=index.esm.js.map