@moderneinc/neo-styled-components 5.0.0-next.e88b47 → 5.0.0

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.
Files changed (42) hide show
  1. package/dist/Alert/Alert.d.ts +15 -1
  2. package/dist/Badge/Badge.d.ts +16 -2
  3. package/dist/Breadcrumbs/Breadcrumbs.d.ts +0 -10
  4. package/dist/CanceledIcon/CanceledIcon.d.ts +11 -0
  5. package/dist/Checkbox/Checkbox.d.ts +5 -4
  6. package/dist/DatePickerListItem/DatePickerListItem.d.ts +2 -22
  7. package/dist/DatePickerMenu/DatePickerMenu.d.ts +2 -22
  8. package/dist/Dot/Dot.d.ts +11 -4
  9. package/dist/FilledStatusIcons/FilledStatusIcons.d.ts +41 -0
  10. package/dist/GeneralAvatar/GeneralAvatar.d.ts +1 -7
  11. package/dist/InputField/InputField.d.ts +12 -1
  12. package/dist/ListItemButton/ListItemButton.d.ts +12 -1
  13. package/dist/MenuItem/MenuItem.d.ts +31 -9
  14. package/dist/NavigationAvatar/NavigationAvatar.d.ts +1 -1
  15. package/dist/NavigationItem/NavigationItem.d.ts +21 -2
  16. package/dist/NeoAvatarCell/NeoAvatarCell.d.ts +1 -3
  17. package/dist/PageContent/PageContent.d.ts +12 -1
  18. package/dist/RadioButtonWithText/RadioButtonWithText.d.ts +2 -22
  19. package/dist/RipplingDot/RipplingDot.d.ts +12 -0
  20. package/dist/SelectField/SelectField.d.ts +64 -0
  21. package/dist/SideNav/NeoSideNavContext.d.ts +5 -0
  22. package/dist/SideNav/SideNav.d.ts +18 -25
  23. package/dist/TabPanel/TabPanel.d.ts +47 -0
  24. package/dist/Table/Table.d.ts +64 -0
  25. package/dist/Tabs/Tabs.d.ts +1 -1
  26. package/dist/Tag/Tag.d.ts +1 -2
  27. package/dist/ToggleButton/ToggleButton.d.ts +13 -18
  28. package/dist/ToggleButtonGroup/ToggleButtonGroup.d.ts +26 -0
  29. package/dist/ToggleButtonWithText/ToggleButtonWithText.d.ts +2 -22
  30. package/dist/Tooltip/Tooltip.d.ts +8 -5
  31. package/dist/TopNav/TopNav.d.ts +2 -22
  32. package/dist/TourModal/TourModal.d.ts +2 -22
  33. package/dist/TypologyControl/TypologyControl.d.ts +1 -1
  34. package/dist/VibratingDot/VibratingDot.d.ts +12 -0
  35. package/dist/index.d.ts +533 -106
  36. package/dist/index.esm.js +1042 -453
  37. package/dist/index.esm.js.map +1 -1
  38. package/dist/index.js +1060 -449
  39. package/dist/index.js.map +1 -1
  40. package/dist/utils/colorHelpers.d.ts +6 -0
  41. package/package.json +5 -5
  42. package/dist/utils/avatarColors.d.ts +0 -7
package/dist/index.js CHANGED
@@ -38,7 +38,6 @@ var PickersCalendarHeader = require('@mui/x-date-pickers/PickersCalendarHeader')
38
38
  var PickersShortcuts = require('@mui/x-date-pickers/PickersShortcuts');
39
39
  var DateRangePicker = require('@mui/x-date-pickers-pro/DateRangePicker');
40
40
  var DateRangePickerDay = require('@mui/x-date-pickers-pro/DateRangePickerDay');
41
- var Badge = require('@mui/material/Badge');
42
41
  var LinearProgress = require('@mui/material/LinearProgress');
43
42
  var Paper = require('@mui/material/Paper');
44
43
  var Stack = require('@mui/material/Stack');
@@ -54,9 +53,16 @@ var Dialog = require('@mui/material/Dialog');
54
53
  var DialogActions = require('@mui/material/DialogActions');
55
54
  var DialogContent = require('@mui/material/DialogContent');
56
55
  var Fab = require('@mui/material/Fab');
57
- var Fade = require('@mui/material/Fade');
56
+ var Fade$1 = require('@mui/material/Fade');
58
57
  var Radio = require('@mui/material/Radio');
58
+ var material = require('@mui/material');
59
59
  var Skeleton = require('@mui/material/Skeleton');
60
+ var MuiTable = require('@mui/material/Table');
61
+ var TableBody = require('@mui/material/TableBody');
62
+ var TableCell = require('@mui/material/TableCell');
63
+ var TableContainer = require('@mui/material/TableContainer');
64
+ var TableHead = require('@mui/material/TableHead');
65
+ var TableRow = require('@mui/material/TableRow');
60
66
  var MuiTab = require('@mui/material/Tab');
61
67
  var MuiTabs = require('@mui/material/Tabs');
62
68
  var Switch = require('@mui/material/Switch');
@@ -64,8 +70,37 @@ var hooks = require('@mui/x-tree-view/hooks');
64
70
  var TreeItem = require('@mui/x-tree-view/TreeItem');
65
71
  var RichTreeViewPro = require('@mui/x-tree-view-pro/RichTreeViewPro');
66
72
 
67
- const StyledChip$3 = styles.styled(Chip)(({ theme }) => ({
68
- height: 24,
73
+ const STATUS_COLOR_CLASSES = [
74
+ [Chip.chipClasses.colorDefault, neoDesign.semanticColors.status.neutral],
75
+ [Chip.chipClasses.colorError, neoDesign.semanticColors.status.error],
76
+ [Chip.chipClasses.colorWarning, neoDesign.semanticColors.status.warning],
77
+ [Chip.chipClasses.colorSuccess, neoDesign.semanticColors.status.success],
78
+ [Chip.chipClasses.colorInfo, neoDesign.semanticColors.status.info],
79
+ ];
80
+ const outlinedColorOverrides = {
81
+ backgroundColor: 'transparent',
82
+ color: neoDesign.semanticColors.typography.bodySecondary,
83
+ border: `1px solid ${neoDesign.semanticColors.border.secondary}`,
84
+ [`& .${Chip.chipClasses.icon}, & .${Chip.chipClasses.deleteIcon}`]: {
85
+ color: neoDesign.semanticColors.typography.bodySecondary,
86
+ },
87
+ };
88
+ const filledColorRules = Object.fromEntries(STATUS_COLOR_CLASSES.map(([className, palette]) => [
89
+ `&.${className}`,
90
+ {
91
+ backgroundColor: palette.light,
92
+ color: palette.dark,
93
+ border: `1px solid ${palette.transparent}`,
94
+ [`& .${Chip.chipClasses.icon}, & .${Chip.chipClasses.deleteIcon}`]: {
95
+ color: palette.dark,
96
+ },
97
+ },
98
+ ]));
99
+ const outlinedColorRules = Object.fromEntries(STATUS_COLOR_CLASSES.map(([className]) => [`&.${className}`, outlinedColorOverrides]));
100
+ const StyledChip$3 = styles.styled(Chip, {
101
+ shouldForwardProp: prop => prop !== 'badgeSize' && prop !== 'badgeVariant',
102
+ })(({ theme, badgeSize, badgeVariant }) => ({
103
+ height: badgeSize === 'small' ? 20 : 24,
69
104
  paddingTop: neoDesign.spacing.spacing_1_4,
70
105
  paddingBottom: neoDesign.spacing.spacing_1_4,
71
106
  paddingLeft: neoDesign.spacing.spacing_1,
@@ -93,51 +128,7 @@ const StyledChip$3 = styles.styled(Chip)(({ theme }) => ({
93
128
  width: 12,
94
129
  height: 12,
95
130
  },
96
- // Default (Neutral) state
97
- [`&.${Chip.chipClasses.colorDefault}`]: {
98
- backgroundColor: neoDesign.semanticColors.status.neutral.light,
99
- color: neoDesign.semanticColors.status.neutral.dark,
100
- border: `1px solid ${neoDesign.semanticColors.status.neutral.default}80`,
101
- [`& .${Chip.chipClasses.icon}, & .${Chip.chipClasses.deleteIcon}`]: {
102
- color: neoDesign.semanticColors.status.neutral.dark,
103
- },
104
- },
105
- // Error state
106
- [`&.${Chip.chipClasses.colorError}`]: {
107
- backgroundColor: neoDesign.semanticColors.status.error.light,
108
- color: neoDesign.semanticColors.status.error.dark,
109
- border: `1px solid ${neoDesign.semanticColors.status.error.default}80`,
110
- [`& .${Chip.chipClasses.icon}, & .${Chip.chipClasses.deleteIcon}`]: {
111
- color: neoDesign.semanticColors.status.error.dark,
112
- },
113
- },
114
- // Warning state
115
- [`&.${Chip.chipClasses.colorWarning}`]: {
116
- backgroundColor: neoDesign.semanticColors.status.warning.light,
117
- color: neoDesign.semanticColors.status.warning.dark,
118
- border: `1px solid ${neoDesign.semanticColors.status.warning.default}80`,
119
- [`& .${Chip.chipClasses.icon}, & .${Chip.chipClasses.deleteIcon}`]: {
120
- color: neoDesign.semanticColors.status.warning.dark,
121
- },
122
- },
123
- // Success state
124
- [`&.${Chip.chipClasses.colorSuccess}`]: {
125
- backgroundColor: neoDesign.semanticColors.status.success.light,
126
- color: neoDesign.semanticColors.status.success.dark,
127
- border: `1px solid ${neoDesign.semanticColors.status.success.default}80`,
128
- [`& .${Chip.chipClasses.icon}, & .${Chip.chipClasses.deleteIcon}`]: {
129
- color: neoDesign.semanticColors.status.success.dark,
130
- },
131
- },
132
- // Info state
133
- [`&.${Chip.chipClasses.colorInfo}`]: {
134
- backgroundColor: neoDesign.semanticColors.status.info.light,
135
- color: neoDesign.semanticColors.status.info.dark,
136
- border: `1px solid ${neoDesign.semanticColors.status.info.default}80`,
137
- [`& .${Chip.chipClasses.icon}, & .${Chip.chipClasses.deleteIcon}`]: {
138
- color: neoDesign.semanticColors.status.info.dark,
139
- },
140
- },
131
+ ...(badgeVariant === 'outlined' ? outlinedColorRules : filledColorRules),
141
132
  }));
142
133
  /**
143
134
  * NeoBadge - Status badge component based on MUI Chip
@@ -150,23 +141,26 @@ const StyledChip$3 = styles.styled(Chip)(({ theme }) => ({
150
141
  * - TrailingIcon → deleteIcon prop (pass React element)
151
142
  * - Label → label prop
152
143
  */
153
- const NeoBadge = (props) => {
154
- return jsxRuntime.jsx(StyledChip$3, { ...props });
144
+ const NeoBadge = ({ size = 'medium', variant = 'filled', ...props }) => {
145
+ return jsxRuntime.jsx(StyledChip$3, { ...props, badgeSize: size, badgeVariant: variant });
155
146
  };
156
147
  NeoBadge.displayName = 'NeoBadge';
157
148
 
149
+ const djb2Hash = (str) => {
150
+ let hash = 5381;
151
+ for (let i = 0; i < str.length; i++) {
152
+ hash = (hash * 33) ^ str.charCodeAt(i);
153
+ }
154
+ return hash >>> 0;
155
+ };
158
156
  /**
159
- * Shared color palette for avatar components (GeneralAvatar, NavigationAvatar).
160
- * Maps color index (1-7) to background color token pairs.
157
+ * Deterministically derives an HSL background color from a string seed.
158
+ * Produces pastel colors matching the aesthetic of the status.avatar.initials
159
+ * semantic tokens (fixed 80% saturation, 90% lightness; only hue varies).
161
160
  */
162
- const avatarColorPalette = {
163
- 1: { bg: neoDesign.colors.digitalBlue[100] },
164
- 2: { bg: neoDesign.colors.digitalGreen[100] },
165
- 3: { bg: neoDesign.colors.gold[100] },
166
- 4: { bg: neoDesign.colors.red[100] },
167
- 5: { bg: neoDesign.colors.violet[100] },
168
- 6: { bg: neoDesign.colors.tealGreen[100] },
169
- 7: { bg: neoDesign.colors.orange[100] },
161
+ const avatarColorFromSeed = (seed) => {
162
+ const hue = seed ? djb2Hash(seed) % 360 : 235;
163
+ return `hsl(${hue}, 80%, 90%)`;
170
164
  };
171
165
 
172
166
  /**
@@ -181,14 +175,13 @@ const focusRingStyles = {
181
175
  };
182
176
 
183
177
  const sizeConfig$1 = {
184
- small: { width: neoDesign.spacing.spacing_4, height: neoDesign.spacing.spacing_4, fontSize: neoDesign.typography.fontSize.xs },
178
+ small: { width: neoDesign.spacing.spacing_4, height: neoDesign.spacing.spacing_4, fontSize: neoDesign.typography.fontSize.sm },
185
179
  medium: { width: neoDesign.spacing.spacing_5, height: neoDesign.spacing.spacing_5, fontSize: neoDesign.typography.fontSize.sm },
186
180
  };
187
181
  const StyledAvatar = styles.styled(MuiAvatar, {
188
- shouldForwardProp: prop => prop !== 'avatarSize' && prop !== 'colorIndex',
189
- })(({ theme, avatarSize, colorIndex }) => {
182
+ shouldForwardProp: prop => prop !== 'avatarSize' && prop !== 'backgroundColor',
183
+ })(({ theme, avatarSize, backgroundColor }) => {
190
184
  const size = sizeConfig$1[avatarSize];
191
- const palette = avatarColorPalette[colorIndex];
192
185
  return {
193
186
  boxSizing: 'border-box',
194
187
  width: size.width,
@@ -198,7 +191,7 @@ const StyledAvatar = styles.styled(MuiAvatar, {
198
191
  fontWeight: neoDesign.typography.fontWeight.regular,
199
192
  lineHeight: 1,
200
193
  color: neoDesign.semanticColors.typography.body,
201
- backgroundColor: palette ? palette.bg : undefined,
194
+ backgroundColor,
202
195
  border: `1px solid ${neoDesign.semanticColors.border.primary}`,
203
196
  '&:focus-visible': {
204
197
  ...focusRingStyles,
@@ -211,8 +204,9 @@ const StyledAvatar = styles.styled(MuiAvatar, {
211
204
  *
212
205
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=9600-185
213
206
  */
214
- const NeoGeneralAvatar = ({ size = 'medium', colorIndex = 0, children, ...props }) => {
215
- return (jsxRuntime.jsx(StyledAvatar, { avatarSize: size, colorIndex: colorIndex, ...props, children: children }));
207
+ const NeoGeneralAvatar = ({ size = 'medium', alt, children, ...props }) => {
208
+ const backgroundColor = avatarColorFromSeed(alt);
209
+ return (jsxRuntime.jsx(StyledAvatar, { avatarSize: size, backgroundColor: backgroundColor, alt: alt, ...props, children: children }));
216
210
  };
217
211
  NeoGeneralAvatar.displayName = 'NeoGeneralAvatar';
218
212
 
@@ -462,7 +456,7 @@ const NeoActivityIndicatorCell = ({ event = 'commit-job', secondaryEvent, scene
462
456
  NeoActivityIndicatorCell.displayName = 'NeoActivityIndicatorCell';
463
457
 
464
458
  /**
465
- * @license lucide-react v1.7.0 - ISC
459
+ * @license lucide-react v1.16.0 - ISC
466
460
  *
467
461
  * This source code is licensed under the ISC license.
468
462
  * See the LICENSE file in the root directory of this source tree.
@@ -473,7 +467,7 @@ const mergeClasses = (...classes) => classes.filter((className, index, array) =>
473
467
  }).join(" ").trim();
474
468
 
475
469
  /**
476
- * @license lucide-react v1.7.0 - ISC
470
+ * @license lucide-react v1.16.0 - ISC
477
471
  *
478
472
  * This source code is licensed under the ISC license.
479
473
  * See the LICENSE file in the root directory of this source tree.
@@ -482,7 +476,7 @@ const mergeClasses = (...classes) => classes.filter((className, index, array) =>
482
476
  const toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
483
477
 
484
478
  /**
485
- * @license lucide-react v1.7.0 - ISC
479
+ * @license lucide-react v1.16.0 - ISC
486
480
  *
487
481
  * This source code is licensed under the ISC license.
488
482
  * See the LICENSE file in the root directory of this source tree.
@@ -494,7 +488,7 @@ const toCamelCase = (string) => string.replace(
494
488
  );
495
489
 
496
490
  /**
497
- * @license lucide-react v1.7.0 - ISC
491
+ * @license lucide-react v1.16.0 - ISC
498
492
  *
499
493
  * This source code is licensed under the ISC license.
500
494
  * See the LICENSE file in the root directory of this source tree.
@@ -507,7 +501,7 @@ const toPascalCase = (string) => {
507
501
  };
508
502
 
509
503
  /**
510
- * @license lucide-react v1.7.0 - ISC
504
+ * @license lucide-react v1.16.0 - ISC
511
505
  *
512
506
  * This source code is licensed under the ISC license.
513
507
  * See the LICENSE file in the root directory of this source tree.
@@ -526,7 +520,7 @@ var defaultAttributes = {
526
520
  };
527
521
 
528
522
  /**
529
- * @license lucide-react v1.7.0 - ISC
523
+ * @license lucide-react v1.16.0 - ISC
530
524
  *
531
525
  * This source code is licensed under the ISC license.
532
526
  * See the LICENSE file in the root directory of this source tree.
@@ -576,7 +570,7 @@ const Icon = React.forwardRef(
576
570
  );
577
571
 
578
572
  /**
579
- * @license lucide-react v1.7.0 - ISC
573
+ * @license lucide-react v1.16.0 - ISC
580
574
  *
581
575
  * This source code is licensed under the ISC license.
582
576
  * See the LICENSE file in the root directory of this source tree.
@@ -601,42 +595,42 @@ const createLucideIcon = (iconName, iconNode) => {
601
595
  };
602
596
 
603
597
  /**
604
- * @license lucide-react v1.7.0 - ISC
598
+ * @license lucide-react v1.16.0 - ISC
605
599
  *
606
600
  * This source code is licensed under the ISC license.
607
601
  * See the LICENSE file in the root directory of this source tree.
608
602
  */
609
603
 
610
604
 
611
- const __iconNode$k = [
605
+ const __iconNode$p = [
612
606
  ["path", { d: "M12 5v14", key: "s699le" }],
613
607
  ["path", { d: "m19 12-7 7-7-7", key: "1idqje" }]
614
608
  ];
615
- const ArrowDown = createLucideIcon("arrow-down", __iconNode$k);
609
+ const ArrowDown = createLucideIcon("arrow-down", __iconNode$p);
616
610
 
617
611
  /**
618
- * @license lucide-react v1.7.0 - ISC
612
+ * @license lucide-react v1.16.0 - ISC
619
613
  *
620
614
  * This source code is licensed under the ISC license.
621
615
  * See the LICENSE file in the root directory of this source tree.
622
616
  */
623
617
 
624
618
 
625
- const __iconNode$j = [
619
+ const __iconNode$o = [
626
620
  ["path", { d: "m5 12 7-7 7 7", key: "hav0vg" }],
627
621
  ["path", { d: "M12 19V5", key: "x0mq9r" }]
628
622
  ];
629
- const ArrowUp = createLucideIcon("arrow-up", __iconNode$j);
623
+ const ArrowUp = createLucideIcon("arrow-up", __iconNode$o);
630
624
 
631
625
  /**
632
- * @license lucide-react v1.7.0 - ISC
626
+ * @license lucide-react v1.16.0 - ISC
633
627
  *
634
628
  * This source code is licensed under the ISC license.
635
629
  * See the LICENSE file in the root directory of this source tree.
636
630
  */
637
631
 
638
632
 
639
- const __iconNode$i = [
633
+ const __iconNode$n = [
640
634
  [
641
635
  "path",
642
636
  {
@@ -647,17 +641,17 @@ const __iconNode$i = [
647
641
  ["line", { x1: "12", x2: "12", y1: "16", y2: "12", key: "1y1yb1" }],
648
642
  ["line", { x1: "12", x2: "12.01", y1: "8", y2: "8", key: "110wyk" }]
649
643
  ];
650
- const BadgeInfo = createLucideIcon("badge-info", __iconNode$i);
644
+ const BadgeInfo = createLucideIcon("badge-info", __iconNode$n);
651
645
 
652
646
  /**
653
- * @license lucide-react v1.7.0 - ISC
647
+ * @license lucide-react v1.16.0 - ISC
654
648
  *
655
649
  * This source code is licensed under the ISC license.
656
650
  * See the LICENSE file in the root directory of this source tree.
657
651
  */
658
652
 
659
653
 
660
- const __iconNode$h = [
654
+ const __iconNode$m = [
661
655
  ["path", { d: "M8 2v4", key: "1cmpym" }],
662
656
  ["path", { d: "M16 2v4", key: "4m81vk" }],
663
657
  ["rect", { width: "18", height: "18", x: "3", y: "4", rx: "2", key: "1hopcy" }],
@@ -669,181 +663,252 @@ const __iconNode$h = [
669
663
  ["path", { d: "M12 18h.01", key: "mhygvu" }],
670
664
  ["path", { d: "M16 18h.01", key: "kzsmim" }]
671
665
  ];
672
- const CalendarDays = createLucideIcon("calendar-days", __iconNode$h);
666
+ const CalendarDays = createLucideIcon("calendar-days", __iconNode$m);
673
667
 
674
668
  /**
675
- * @license lucide-react v1.7.0 - ISC
669
+ * @license lucide-react v1.16.0 - ISC
676
670
  *
677
671
  * This source code is licensed under the ISC license.
678
672
  * See the LICENSE file in the root directory of this source tree.
679
673
  */
680
674
 
681
675
 
682
- const __iconNode$g = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
683
- const ChevronDown = createLucideIcon("chevron-down", __iconNode$g);
676
+ const __iconNode$l = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
677
+ const ChevronDown = createLucideIcon("chevron-down", __iconNode$l);
684
678
 
685
679
  /**
686
- * @license lucide-react v1.7.0 - ISC
680
+ * @license lucide-react v1.16.0 - ISC
687
681
  *
688
682
  * This source code is licensed under the ISC license.
689
683
  * See the LICENSE file in the root directory of this source tree.
690
684
  */
691
685
 
692
686
 
693
- const __iconNode$f = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
694
- const ChevronLeft = createLucideIcon("chevron-left", __iconNode$f);
687
+ const __iconNode$k = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
688
+ const ChevronLeft = createLucideIcon("chevron-left", __iconNode$k);
695
689
 
696
690
  /**
697
- * @license lucide-react v1.7.0 - ISC
691
+ * @license lucide-react v1.16.0 - ISC
698
692
  *
699
693
  * This source code is licensed under the ISC license.
700
694
  * See the LICENSE file in the root directory of this source tree.
701
695
  */
702
696
 
703
697
 
704
- const __iconNode$e = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
705
- const ChevronRight = createLucideIcon("chevron-right", __iconNode$e);
698
+ const __iconNode$j = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
699
+ const ChevronRight = createLucideIcon("chevron-right", __iconNode$j);
706
700
 
707
701
  /**
708
- * @license lucide-react v1.7.0 - ISC
702
+ * @license lucide-react v1.16.0 - ISC
709
703
  *
710
704
  * This source code is licensed under the ISC license.
711
705
  * See the LICENSE file in the root directory of this source tree.
712
706
  */
713
707
 
714
708
 
715
- const __iconNode$d = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
716
- const ChevronUp = createLucideIcon("chevron-up", __iconNode$d);
709
+ const __iconNode$i = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
710
+ const ChevronUp = createLucideIcon("chevron-up", __iconNode$i);
717
711
 
718
712
  /**
719
- * @license lucide-react v1.7.0 - ISC
713
+ * @license lucide-react v1.16.0 - ISC
720
714
  *
721
715
  * This source code is licensed under the ISC license.
722
716
  * See the LICENSE file in the root directory of this source tree.
723
717
  */
724
718
 
725
719
 
726
- const __iconNode$c = [
720
+ const __iconNode$h = [
727
721
  ["path", { d: "m7 15 5 5 5-5", key: "1hf1tw" }],
728
722
  ["path", { d: "m7 9 5-5 5 5", key: "sgt6xg" }]
729
723
  ];
730
- const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$c);
724
+ const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$h);
731
725
 
732
726
  /**
733
- * @license lucide-react v1.7.0 - ISC
727
+ * @license lucide-react v1.16.0 - ISC
734
728
  *
735
729
  * This source code is licensed under the ISC license.
736
730
  * See the LICENSE file in the root directory of this source tree.
737
731
  */
738
732
 
739
733
 
740
- const __iconNode$b = [
734
+ const __iconNode$g = [
741
735
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
742
736
  ["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }],
743
737
  ["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }]
744
738
  ];
745
- const CircleAlert = createLucideIcon("circle-alert", __iconNode$b);
739
+ const CircleAlert = createLucideIcon("circle-alert", __iconNode$g);
746
740
 
747
741
  /**
748
- * @license lucide-react v1.7.0 - ISC
742
+ * @license lucide-react v1.16.0 - ISC
749
743
  *
750
744
  * This source code is licensed under the ISC license.
751
745
  * See the LICENSE file in the root directory of this source tree.
752
746
  */
753
747
 
754
748
 
755
- const __iconNode$a = [
749
+ const __iconNode$f = [
756
750
  ["path", { d: "M21.801 10A10 10 0 1 1 17 3.335", key: "yps3ct" }],
757
751
  ["path", { d: "m9 11 3 3L22 4", key: "1pflzl" }]
758
752
  ];
759
- const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$a);
753
+ const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$f);
760
754
 
761
755
  /**
762
- * @license lucide-react v1.7.0 - ISC
756
+ * @license lucide-react v1.16.0 - ISC
763
757
  *
764
758
  * This source code is licensed under the ISC license.
765
759
  * See the LICENSE file in the root directory of this source tree.
766
760
  */
767
761
 
768
762
 
769
- const __iconNode$9 = [
763
+ const __iconNode$e = [
770
764
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
771
765
  ["path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3", key: "1u773s" }],
772
766
  ["path", { d: "M12 17h.01", key: "p32p05" }]
773
767
  ];
774
- const CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode$9);
768
+ const CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode$e);
775
769
 
776
770
  /**
777
- * @license lucide-react v1.7.0 - ISC
771
+ * @license lucide-react v1.16.0 - ISC
778
772
  *
779
773
  * This source code is licensed under the ISC license.
780
774
  * See the LICENSE file in the root directory of this source tree.
781
775
  */
782
776
 
783
777
 
784
- const __iconNode$8 = [
778
+ const __iconNode$d = [
785
779
  ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }],
786
780
  ["path", { d: "M9 3v18", key: "fh3hqa" }],
787
781
  ["path", { d: "M15 3v18", key: "14nvp0" }]
788
782
  ];
789
- const Columns3 = createLucideIcon("columns-3", __iconNode$8);
783
+ const Columns3 = createLucideIcon("columns-3", __iconNode$d);
790
784
 
791
785
  /**
792
- * @license lucide-react v1.7.0 - ISC
786
+ * @license lucide-react v1.16.0 - ISC
793
787
  *
794
788
  * This source code is licensed under the ISC license.
795
789
  * See the LICENSE file in the root directory of this source tree.
796
790
  */
797
791
 
798
792
 
799
- const __iconNode$7 = [
793
+ const __iconNode$c = [
800
794
  ["path", { d: "M2 5h20", key: "1fs1ex" }],
801
795
  ["path", { d: "M6 12h12", key: "8npq4p" }],
802
796
  ["path", { d: "M9 19h6", key: "456am0" }]
803
797
  ];
804
- const ListFilter = createLucideIcon("list-filter", __iconNode$7);
798
+ const ListFilter = createLucideIcon("list-filter", __iconNode$c);
805
799
 
806
800
  /**
807
- * @license lucide-react v1.7.0 - ISC
801
+ * @license lucide-react v1.16.0 - ISC
808
802
  *
809
803
  * This source code is licensed under the ISC license.
810
804
  * See the LICENSE file in the root directory of this source tree.
811
805
  */
812
806
 
813
807
 
814
- const __iconNode$6 = [["path", { d: "M5 12h14", key: "1ays0h" }]];
815
- const Minus = createLucideIcon("minus", __iconNode$6);
808
+ const __iconNode$b = [["path", { d: "M5 12h14", key: "1ays0h" }]];
809
+ const Minus = createLucideIcon("minus", __iconNode$b);
816
810
 
817
811
  /**
818
- * @license lucide-react v1.7.0 - ISC
812
+ * @license lucide-react v1.16.0 - ISC
819
813
  *
820
814
  * This source code is licensed under the ISC license.
821
815
  * See the LICENSE file in the root directory of this source tree.
822
816
  */
823
817
 
824
818
 
825
- const __iconNode$5 = [
819
+ const __iconNode$a = [
820
+ ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }],
821
+ ["path", { d: "M9 3v18", key: "fh3hqa" }],
822
+ ["path", { d: "m16 15-3-3 3-3", key: "14y99z" }]
823
+ ];
824
+ const PanelLeftClose = createLucideIcon("panel-left-close", __iconNode$a);
825
+
826
+ /**
827
+ * @license lucide-react v1.16.0 - ISC
828
+ *
829
+ * This source code is licensed under the ISC license.
830
+ * See the LICENSE file in the root directory of this source tree.
831
+ */
832
+
833
+
834
+ const __iconNode$9 = [
835
+ ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }],
836
+ ["path", { d: "M9 3v18", key: "fh3hqa" }],
837
+ ["path", { d: "m14 9 3 3-3 3", key: "8010ee" }]
838
+ ];
839
+ const PanelLeftOpen = createLucideIcon("panel-left-open", __iconNode$9);
840
+
841
+ /**
842
+ * @license lucide-react v1.16.0 - ISC
843
+ *
844
+ * This source code is licensed under the ISC license.
845
+ * See the LICENSE file in the root directory of this source tree.
846
+ */
847
+
848
+
849
+ const __iconNode$8 = [
826
850
  ["path", { d: "M5 12h14", key: "1ays0h" }],
827
851
  ["path", { d: "M12 5v14", key: "s699le" }]
828
852
  ];
829
- const Plus = createLucideIcon("plus", __iconNode$5);
853
+ const Plus = createLucideIcon("plus", __iconNode$8);
830
854
 
831
855
  /**
832
- * @license lucide-react v1.7.0 - ISC
856
+ * @license lucide-react v1.16.0 - ISC
833
857
  *
834
858
  * This source code is licensed under the ISC license.
835
859
  * See the LICENSE file in the root directory of this source tree.
836
860
  */
837
861
 
838
862
 
839
- const __iconNode$4 = [
863
+ const __iconNode$7 = [
840
864
  ["path", { d: "m21 21-4.34-4.34", key: "14j7rj" }],
841
865
  ["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }]
842
866
  ];
843
- const Search = createLucideIcon("search", __iconNode$4);
867
+ const Search = createLucideIcon("search", __iconNode$7);
868
+
869
+ /**
870
+ * @license lucide-react v1.16.0 - ISC
871
+ *
872
+ * This source code is licensed under the ISC license.
873
+ * See the LICENSE file in the root directory of this source tree.
874
+ */
875
+
876
+
877
+ const __iconNode$6 = [
878
+ ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }],
879
+ ["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
880
+ ];
881
+ const SquareCheck = createLucideIcon("square-check", __iconNode$6);
882
+
883
+ /**
884
+ * @license lucide-react v1.16.0 - ISC
885
+ *
886
+ * This source code is licensed under the ISC license.
887
+ * See the LICENSE file in the root directory of this source tree.
888
+ */
889
+
890
+
891
+ const __iconNode$5 = [
892
+ ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }],
893
+ ["path", { d: "M8 12h8", key: "1wcyev" }]
894
+ ];
895
+ const SquareMinus = createLucideIcon("square-minus", __iconNode$5);
844
896
 
845
897
  /**
846
- * @license lucide-react v1.7.0 - ISC
898
+ * @license lucide-react v1.16.0 - ISC
899
+ *
900
+ * This source code is licensed under the ISC license.
901
+ * See the LICENSE file in the root directory of this source tree.
902
+ */
903
+
904
+
905
+ const __iconNode$4 = [
906
+ ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }]
907
+ ];
908
+ const Square = createLucideIcon("square", __iconNode$4);
909
+
910
+ /**
911
+ * @license lucide-react v1.16.0 - ISC
847
912
  *
848
913
  * This source code is licensed under the ISC license.
849
914
  * See the LICENSE file in the root directory of this source tree.
@@ -860,7 +925,7 @@ const __iconNode$3 = [
860
925
  const Trash2 = createLucideIcon("trash-2", __iconNode$3);
861
926
 
862
927
  /**
863
- * @license lucide-react v1.7.0 - ISC
928
+ * @license lucide-react v1.16.0 - ISC
864
929
  *
865
930
  * This source code is licensed under the ISC license.
866
931
  * See the LICENSE file in the root directory of this source tree.
@@ -881,7 +946,7 @@ const __iconNode$2 = [
881
946
  const TriangleAlert = createLucideIcon("triangle-alert", __iconNode$2);
882
947
 
883
948
  /**
884
- * @license lucide-react v1.7.0 - ISC
949
+ * @license lucide-react v1.16.0 - ISC
885
950
  *
886
951
  * This source code is licensed under the ISC license.
887
952
  * See the LICENSE file in the root directory of this source tree.
@@ -900,7 +965,7 @@ const __iconNode$1 = [
900
965
  const WifiOff = createLucideIcon("wifi-off", __iconNode$1);
901
966
 
902
967
  /**
903
- * @license lucide-react v1.7.0 - ISC
968
+ * @license lucide-react v1.16.0 - ISC
904
969
  *
905
970
  * This source code is licensed under the ISC license.
906
971
  * See the LICENSE file in the root directory of this source tree.
@@ -923,22 +988,29 @@ const intentColors$2 = {
923
988
  };
924
989
  // biome-ignore lint/suspicious/noExplicitAny: Type cast required to override MUI Alert variant type without global augmentation
925
990
  const StyledAlert$2 = styles.styled(Alert, {
926
- shouldForwardProp: prop => prop !== 'intent' && prop !== 'alertType',
927
- })(({ theme, intent = 'success', alertType = 'outlined' }) => {
991
+ shouldForwardProp: prop => prop !== 'intent' && prop !== 'alertType' && prop !== 'alertSize' && prop !== 'hasChildren',
992
+ })(({ theme, intent = 'success', alertType = 'outlined', alertSize = 'default', hasChildren = false, }) => {
928
993
  const palette = intentColors$2[intent];
929
994
  const isFilled = alertType === 'filled';
995
+ const isCompact = alertSize === 'compact';
930
996
  const iconColor = isFilled ? neoDesign.semanticColors.typography.tooltip : palette.default;
931
- const messageColor = isFilled ? neoDesign.semanticColors.typography.tooltip : neoDesign.semanticColors.typography.body;
997
+ const messageColor = isFilled
998
+ ? neoDesign.semanticColors.typography.tooltip
999
+ : neoDesign.semanticColors.typography.body;
932
1000
  return {
933
- height: neoDesign.spacing.spacing_8,
1001
+ ...(isCompact
1002
+ ? { minHeight: neoDesign.spacing.spacing_5 }
1003
+ : hasChildren
1004
+ ? { minHeight: neoDesign.spacing.spacing_8, height: 'auto' }
1005
+ : { height: neoDesign.spacing.spacing_8 }),
934
1006
  width: '100%',
935
1007
  borderRadius: neoDesign.borderRadius.xS,
936
- alignItems: 'center',
1008
+ alignItems: hasChildren ? 'flex-start' : 'center',
937
1009
  fontFamily: neoDesign.typography.fontFamily.body,
938
1010
  fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.default),
939
1011
  fontWeight: neoDesign.typography.fontWeight.semiBold,
940
1012
  lineHeight: 1.5,
941
- padding: theme.spacing(0, 2),
1013
+ padding: hasChildren ? theme.spacing(1.5, 2) : theme.spacing(0, 2),
942
1014
  backgroundColor: isFilled ? palette.dark : palette.light,
943
1015
  border: isFilled ? 'none' : `1px solid ${palette.transparent}`,
944
1016
  color: isFilled ? neoDesign.semanticColors.typography.tooltip : neoDesign.semanticColors.typography.body,
@@ -955,7 +1027,7 @@ const StyledAlert$2 = styles.styled(Alert, {
955
1027
  flex: 1,
956
1028
  display: 'flex',
957
1029
  flexDirection: 'column',
958
- justifyContent: 'center',
1030
+ justifyContent: hasChildren ? 'flex-start' : 'center',
959
1031
  '& span:last-child': {
960
1032
  fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.sm),
961
1033
  fontWeight: neoDesign.typography.fontWeight.medium,
@@ -993,9 +1065,9 @@ const iconMap = {
993
1065
  * - Show supporting text → description prop presence
994
1066
  * - Show Button → action prop presence
995
1067
  */
996
- const NeoAlert = ({ intent = 'success', type = 'outlined', title, description, icon, action, ...props }) => {
1068
+ const NeoAlert = ({ intent = 'success', type = 'outlined', size = 'default', title, description, icon, action, children, ...props }) => {
997
1069
  const defaultIcon = iconMap[intent];
998
- return (jsxRuntime.jsxs(StyledAlert$2, { ...props, intent: intent, alertType: type, icon: icon ?? defaultIcon, action: action, children: [jsxRuntime.jsx("span", { children: title }), description && jsxRuntime.jsx("span", { children: description })] }));
1070
+ return (jsxRuntime.jsxs(StyledAlert$2, { ...props, intent: intent, alertType: type, alertSize: size, hasChildren: Boolean(children), icon: icon ?? defaultIcon, action: action, children: [jsxRuntime.jsx("span", { children: title }), description && jsxRuntime.jsx("span", { children: description }), children] }));
999
1071
  };
1000
1072
  NeoAlert.displayName = 'NeoAlert';
1001
1073
 
@@ -1022,38 +1094,43 @@ const StyledAlert$1 = styles.styled(Alert, {
1022
1094
  };
1023
1095
  return {
1024
1096
  width: '100%',
1025
- minHeight: 52,
1026
- paddingTop: neoDesign.spacing.spacing_3_4,
1027
- paddingBottom: neoDesign.spacing.spacing_3_4,
1028
- paddingLeft: neoDesign.spacing.spacing_3,
1029
- paddingRight: neoDesign.spacing.spacing_3,
1030
- gap: neoDesign.spacing.spacing_2,
1097
+ // Include padding in the width so the full-width banner never overflows its
1098
+ // container (don't rely on a global border-box reset being present).
1099
+ boxSizing: 'border-box',
1100
+ // Square corners by default: banners are full-width and typically sit flush
1101
+ // against the top of the viewport, so rounded corners would break the seam.
1102
+ borderRadius: 0,
1103
+ minHeight: 32,
1104
+ paddingTop: neoDesign.spacing.spacing_1_2,
1105
+ paddingBottom: neoDesign.spacing.spacing_1_2,
1106
+ paddingLeft: neoDesign.spacing.spacing_2,
1107
+ paddingRight: neoDesign.spacing.spacing_2,
1108
+ gap: neoDesign.spacing.spacing_1,
1031
1109
  alignItems: 'center',
1032
1110
  justifyContent: messagePosition === 'center' ? 'center' : 'flex-start',
1033
1111
  ...(messagePosition === 'center' && { position: 'relative' }),
1034
- boxShadow: `${neoDesign.shadows.neutral.small.x}px ${neoDesign.shadows.neutral.small.y}px ${neoDesign.shadows.neutral.small.blur}px ${neoDesign.shadows.neutral.small.spread}px ${neoDesign.shadows.neutral.small.shadow}`,
1035
- fontSize: neoDesign.typography.fontSize.default,
1112
+ fontSize: neoDesign.typography.fontSize.sm,
1036
1113
  fontWeight: neoDesign.typography.fontWeight.medium,
1037
1114
  lineHeight: 1.5,
1038
1115
  ...typeStyles,
1039
1116
  [`& .${Alert.alertClasses.icon}`]: {
1040
1117
  padding: 0,
1041
1118
  opacity: 1,
1042
- fontSize: neoDesign.typography.fontSize.h2,
1119
+ fontSize: neoDesign.typography.fontSize.default,
1043
1120
  color: 'inherit',
1044
1121
  },
1045
1122
  [`& .${Alert.alertClasses.message}`]: {
1046
1123
  padding: 0,
1047
1124
  display: 'flex',
1048
1125
  alignItems: 'center',
1049
- gap: neoDesign.spacing.spacing_2,
1126
+ gap: neoDesign.spacing.spacing_1,
1050
1127
  ...(messagePosition === 'left' && { flex: 1 }),
1051
1128
  },
1052
1129
  [`& .${Alert.alertClasses.action}`]: {
1053
1130
  padding: 0,
1054
1131
  ...(messagePosition === 'center' && {
1055
1132
  position: 'absolute',
1056
- right: neoDesign.spacing.spacing_3,
1133
+ right: neoDesign.spacing.spacing_2,
1057
1134
  }),
1058
1135
  },
1059
1136
  };
@@ -1071,6 +1148,8 @@ const LinkText = styles.styled('span')(({ bannerType = 'outlined' }) => ({
1071
1148
  },
1072
1149
  }));
1073
1150
  const StyledIconButton = styles.styled(IconButton)(({ closeIconColor }) => ({
1151
+ minWidth: 24,
1152
+ minHeight: 24,
1074
1153
  padding: 0,
1075
1154
  color: closeIconColor,
1076
1155
  '&:hover': {
@@ -1087,7 +1166,7 @@ const NeoBanner = ({ intent = 'info', type = 'outlined', message, messagePositio
1087
1166
  return null;
1088
1167
  }
1089
1168
  const closeIconColor = type === 'filled' ? neoDesign.semanticColors.surfaces.white : intentColors$1[intent].default;
1090
- return (jsxRuntime.jsx(StyledAlert$1, { ...props, intent: intent, bannerType: type, messagePosition: messagePosition, icon: messagePosition === 'left' ? icon || false : false, action: showClose ? (jsxRuntime.jsx(StyledIconButton, { size: "small", onClick: handleClose, closeIconColor: closeIconColor, children: jsxRuntime.jsx(X, { size: 24 }) })) : undefined, children: messagePosition === 'center' ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [icon, jsxRuntime.jsx("span", { children: message }), linkText && (jsxRuntime.jsx(LinkText, { bannerType: type, onClick: onLinkClick, children: linkText }))] })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { children: message }), linkText && (jsxRuntime.jsx(LinkText, { bannerType: type, onClick: onLinkClick, children: linkText }))] })) }));
1169
+ return (jsxRuntime.jsx(StyledAlert$1, { ...props, intent: intent, bannerType: type, messagePosition: messagePosition, icon: messagePosition === 'left' ? icon || false : false, action: showClose ? (jsxRuntime.jsx(StyledIconButton, { size: "small", onClick: handleClose, closeIconColor: closeIconColor, children: jsxRuntime.jsx(X, { size: 16 }) })) : undefined, children: messagePosition === 'center' ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [icon, jsxRuntime.jsx("span", { children: message }), linkText && (jsxRuntime.jsx(LinkText, { bannerType: type, onClick: onLinkClick, children: linkText }))] })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { children: message }), linkText && (jsxRuntime.jsx(LinkText, { bannerType: type, onClick: onLinkClick, children: linkText }))] })) }));
1091
1170
  };
1092
1171
  NeoBanner.displayName = 'NeoBanner';
1093
1172
 
@@ -1107,12 +1186,12 @@ const StyledBreadcrumbLink = styles.styled(Link, {
1107
1186
  fontWeight: neoDesign.typography.fontWeight.medium,
1108
1187
  lineHeight: 1,
1109
1188
  textDecoration: 'none',
1110
- color: current ? neoDesign.semanticColors.buttons.primary.default : neoDesign.semanticColors.typography.bodySecondary,
1189
+ color: current ? neoDesign.semanticColors.typography.bodySecondary : neoDesign.semanticColors.typography.link.primary,
1111
1190
  cursor: current ? 'default' : 'pointer',
1112
1191
  borderRadius: neoDesign.borderRadius.xS,
1113
1192
  transition: 'color 0.2s ease-in-out',
1114
1193
  '&:hover': {
1115
- color: current ? neoDesign.semanticColors.buttons.tertiary.hover : neoDesign.semanticColors.icons.hover,
1194
+ color: current ? neoDesign.semanticColors.icons.hover : neoDesign.semanticColors.buttons.tertiary.hover,
1116
1195
  },
1117
1196
  '&:focus-visible': {
1118
1197
  outline: `2px solid ${neoDesign.semanticColors.border.focus}`,
@@ -1495,6 +1574,15 @@ const NeoButtonTabGroup = ({ size = 'medium', exclusive = true, ...props }) => {
1495
1574
  };
1496
1575
  NeoButtonTabGroup.displayName = 'NeoButtonTabGroup';
1497
1576
 
1577
+ /**
1578
+ * NeoCanceledIcon - Outlined circle struck through by a horizontal line.
1579
+ *
1580
+ * Marks a CANCELED state. Color comes entirely from `currentColor` (stroke plus
1581
+ * a 10% fill tint); set it via the `color`/`sx` prop or a parent.
1582
+ */
1583
+ const NeoCanceledIcon = (props) => (jsxRuntime.jsx(SvgIcon, { viewBox: "0 0 24 24", fill: "none", ...props, children: jsxRuntime.jsxs("g", { stroke: "currentColor", strokeWidth: "1.35", children: [jsxRuntime.jsx("path", { fill: "currentColor", fillOpacity: "0.1", d: "M2.55 11.95c0 2.405.918 4.812 2.753 6.647a9.4 9.4 0 0 0 6.647 2.753c2.489 0 4.877-.99 6.646-2.753a9.3 9.3 0 0 0 2.039-3.044 9.4 9.4 0 0 0 .715-3.602m-18.8-.001a9.37 9.37 0 0 1 2.753-6.647A9.4 9.4 0 0 1 11.95 2.55c2.489 0 4.877.99 6.646 2.753a9.3 9.3 0 0 1 2.039 3.045 9.4 9.4 0 0 1 .715 3.603" }), jsxRuntime.jsx("path", { fill: "none", d: "M3 11.825h18" })] }) }));
1584
+ NeoCanceledIcon.displayName = 'NeoCanceledIcon';
1585
+
1498
1586
  // ─── Shared ──────────────────────────────────────────────────────────────────
1499
1587
  const activeShadow = `${neoDesign.shadows.card.x}px ${neoDesign.shadows.card.y}px ${neoDesign.shadows.card.blur}px ${neoDesign.shadows.card.spread}px ${neoDesign.shadows.card.shadow}`;
1500
1588
  // ─── Small card styled components ────────────────────────────────────────────
@@ -1686,20 +1774,6 @@ const NeoCard = (props) => {
1686
1774
  };
1687
1775
  NeoCard.displayName = 'NeoCard';
1688
1776
 
1689
- // Border radius per size (from Figma)
1690
- const borderRadiusConfig = {
1691
- xs: 2,
1692
- small: 3,
1693
- medium: 4,
1694
- };
1695
- // Unchecked: Rounded square outline (20x20 viewBox)
1696
- const UncheckedIcon$1 = ({ size = 'medium' }) => (jsxRuntime.jsx(SvgIcon, { viewBox: "0 0 20 20", children: jsxRuntime.jsx("rect", { x: "1", y: "1", width: "18", height: "18", rx: borderRadiusConfig[size], fill: "none", stroke: "currentColor", strokeWidth: "1.5" }) }));
1697
- // Checked: Filled rounded square with white checkmark
1698
- // Path scaled from Untitled UI 24x24 (M20 6L9 17L4 12) to 20x20
1699
- const CheckedIcon$1 = ({ size = 'medium' }) => (jsxRuntime.jsxs(SvgIcon, { viewBox: "0 0 20 20", children: [jsxRuntime.jsx("rect", { width: "20", height: "20", rx: borderRadiusConfig[size], fill: "currentColor" }), jsxRuntime.jsx("path", { d: "M15 6L8.5 13L5 9.5", stroke: "white", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", fill: "none" })] }));
1700
- // Indeterminate: Filled rounded square with white minus
1701
- // Path scaled from Untitled UI 24x24 (M5 12H19) to 20x20
1702
- const IndeterminateIcon = ({ size = 'medium' }) => (jsxRuntime.jsxs(SvgIcon, { viewBox: "0 0 20 20", children: [jsxRuntime.jsx("rect", { width: "20", height: "20", rx: borderRadiusConfig[size], fill: "currentColor" }), jsxRuntime.jsx("path", { d: "M5 10H15", stroke: "white", strokeWidth: "1.5", strokeLinecap: "round", fill: "none" })] }));
1703
1777
  const CheckboxContainer = styles.styled('label')(({ disabled }) => ({
1704
1778
  display: 'inline-flex',
1705
1779
  alignItems: 'flex-start',
@@ -1732,7 +1806,7 @@ const HelperText$2 = styles.styled('span')(({ theme, size = 'medium' }) => ({
1732
1806
  lineHeight: size === 'xs' ? 1.5 : size === 'small' ? 1.4 : 1.5,
1733
1807
  color: neoDesign.semanticColors.typography.bodySecondary,
1734
1808
  }));
1735
- // Figma-exact border radius for xs checkbox — no matching design token
1809
+ // xs focus-ring radius — no matching design token (box corner comes from the icon)
1736
1810
  const FIGMA_XS_BORDER_RADIUS = 1;
1737
1811
  const StyledCheckbox = styles.styled(Checkbox, {
1738
1812
  shouldForwardProp: prop => prop !== 'size',
@@ -1745,11 +1819,11 @@ const StyledCheckbox = styles.styled(Checkbox, {
1745
1819
  },
1746
1820
  small: {
1747
1821
  size: 16,
1748
- borderRadius: neoDesign.borderRadius.xXS, // From Figma: 2px for small
1822
+ borderRadius: neoDesign.borderRadius.xXS, // focus-ring radius (small)
1749
1823
  },
1750
1824
  medium: {
1751
1825
  size: 20,
1752
- borderRadius: neoDesign.borderRadius.xS, // From Figma: 4px for medium
1826
+ borderRadius: neoDesign.borderRadius.xS, // focus-ring radius (medium)
1753
1827
  },
1754
1828
  };
1755
1829
  const config = sizeConfig[size];
@@ -1761,37 +1835,30 @@ const StyledCheckbox = styles.styled(Checkbox, {
1761
1835
  color: neoDesign.semanticColors.border.primary,
1762
1836
  borderRadius: config.borderRadius,
1763
1837
  flexShrink: 0,
1764
- // Root element
1765
- [`&.${Checkbox.checkboxClasses.root}`]: {
1766
- '&:hover': {
1767
- backgroundColor: 'transparent',
1768
- },
1838
+ // Suppress MUI's grey hover background
1839
+ '&:hover': {
1840
+ backgroundColor: 'transparent',
1769
1841
  },
1770
- // Checkbox icon (unchecked)
1771
- [`& .${Checkbox.checkboxClasses.root}`]: {
1772
- width: config.size,
1773
- height: config.size,
1842
+ // Hover on the unchecked box — subtle blue outline affordance (enabled only)
1843
+ [`&:hover:not(.${Checkbox.checkboxClasses.checked}):not(.${Checkbox.checkboxClasses.indeterminate}):not(.${Checkbox.checkboxClasses.disabled})`]: {
1844
+ color: neoDesign.colors.digitalBlue[300],
1774
1845
  },
1775
- // Checked state
1846
+ // Checked / Indeterminate — primary blue outline + mark
1776
1847
  [`&.${Checkbox.checkboxClasses.checked}`]: {
1777
- color: neoDesign.semanticColors.buttons.primary.default,
1848
+ color: neoDesign.colors.digitalBlue[600],
1778
1849
  },
1779
- // Indeterminate state
1780
1850
  [`&.${Checkbox.checkboxClasses.indeterminate}`]: {
1781
- color: neoDesign.semanticColors.buttons.primary.default,
1851
+ color: neoDesign.colors.digitalBlue[600],
1782
1852
  },
1783
- // Disabled state
1853
+ // Disabled — enabled colors dimmed to 40%. Checked/indeterminate keep
1854
+ // digitalBlue[600] via the rules above; re-assert the unchecked outline
1855
+ // token so it beats MUI's default `.Mui-disabled` color.
1784
1856
  [`&.${Checkbox.checkboxClasses.disabled}`]: {
1785
- color: neoDesign.semanticColors.border.primary,
1857
+ opacity: 0.4,
1786
1858
  cursor: 'not-allowed',
1787
- // When checked and disabled
1788
- [`&.${Checkbox.checkboxClasses.checked}`]: {
1789
- color: neoDesign.semanticColors.border.primary,
1790
- },
1791
- // When indeterminate and disabled
1792
- [`&.${Checkbox.checkboxClasses.indeterminate}`]: {
1793
- color: neoDesign.semanticColors.border.primary,
1794
- },
1859
+ },
1860
+ [`&.${Checkbox.checkboxClasses.disabled}:not(.${Checkbox.checkboxClasses.checked}):not(.${Checkbox.checkboxClasses.indeterminate})`]: {
1861
+ color: neoDesign.semanticColors.border.primary,
1795
1862
  },
1796
1863
  // Focus visible for keyboard navigation
1797
1864
  '&.Mui-focusVisible': {
@@ -1799,11 +1866,10 @@ const StyledCheckbox = styles.styled(Checkbox, {
1799
1866
  outlineOffset: 2,
1800
1867
  borderRadius: config.borderRadius,
1801
1868
  },
1802
- // Custom SVG icons
1869
+ // Size the Lucide icon (color comes from `color` → currentColor → stroke)
1803
1870
  '& svg': {
1804
1871
  width: config.size,
1805
1872
  height: config.size,
1806
- fill: 'currentColor',
1807
1873
  },
1808
1874
  };
1809
1875
  });
@@ -1854,10 +1920,10 @@ const StyledCheckbox = styles.styled(Checkbox, {
1854
1920
  const NeoCheckbox = ({ size = 'medium', label, helperText, disabled, icon, checkedIcon, indeterminateIcon, className, ...props }) => {
1855
1921
  // Add custom class to identify NeoCheckbox instances
1856
1922
  const combinedClassName = className ? `neo-checkbox ${className}` : 'neo-checkbox';
1857
- // Create size-specific icons
1858
- const defaultIcon = icon || jsxRuntime.jsx(UncheckedIcon$1, { size: size });
1859
- const defaultCheckedIcon = checkedIcon || jsxRuntime.jsx(CheckedIcon$1, { size: size });
1860
- const defaultIndeterminateIcon = indeterminateIcon || jsxRuntime.jsx(IndeterminateIcon, { size: size });
1923
+ // Default icons (sized via CSS on the SVG); overridable per instance
1924
+ const defaultIcon = icon || jsxRuntime.jsx(Square, {});
1925
+ const defaultCheckedIcon = checkedIcon || jsxRuntime.jsx(SquareCheck, {});
1926
+ const defaultIndeterminateIcon = indeterminateIcon || jsxRuntime.jsx(SquareMinus, {});
1861
1927
  // If no label, return just the checkbox
1862
1928
  if (!label && !helperText) {
1863
1929
  return (jsxRuntime.jsx(StyledCheckbox, { size: size, disabled: disabled, icon: defaultIcon, checkedIcon: defaultCheckedIcon, indeterminateIcon: defaultIndeterminateIcon, className: combinedClassName, ...props }));
@@ -2169,7 +2235,8 @@ const StyledMenuItem = styles.styled(MenuItem)(({ theme }) => ({
2169
2235
  gap: theme.spacing(2),
2170
2236
  borderRadius: 0,
2171
2237
  color: neoDesign.semanticColors.icons.default,
2172
- fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.sm),
2238
+ textDecoration: 'none',
2239
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.default),
2173
2240
  fontWeight: neoDesign.typography.fontWeight.regular,
2174
2241
  lineHeight: `${neoDesign.typography.lineHeight.s}px`,
2175
2242
  transition: theme.transitions.create(['background-color'], {
@@ -2235,7 +2302,7 @@ const Shortcut = styles.styled('span')(({ theme }) => ({
2235
2302
  /**
2236
2303
  * NeoMenuItem - Menu item component based on MUI MenuItem
2237
2304
  *
2238
- * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4159-8584
2305
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025-26?node-id=4159-8714
2239
2306
  *
2240
2307
  * @example
2241
2308
  * ```tsx
@@ -2250,11 +2317,22 @@ const Shortcut = styles.styled('span')(({ theme }) => ({
2250
2317
  *
2251
2318
  * // Disabled state
2252
2319
  * <NeoMenuItem disabled>Disabled item</NeoMenuItem>
2320
+ *
2321
+ * // As an anchor — middle-click/right-click open in a new tab
2322
+ * <NeoMenuItem href="/api-explorer">API explorer</NeoMenuItem>
2323
+ *
2324
+ * // External link
2325
+ * <NeoMenuItem href="https://docs.example.com" target="_blank" rel="noopener noreferrer">
2326
+ * Documentation
2327
+ * </NeoMenuItem>
2328
+ *
2329
+ * // Client-side routing (Next.js)
2330
+ * <NeoMenuItem component={NextLink} href="/api-explorer">API explorer</NeoMenuItem>
2253
2331
  * ```
2254
2332
  */
2255
- const NeoMenuItem = ({ icon, shortcut, secondaryText, children, ...props }) => {
2256
- return (jsxRuntime.jsx(StyledMenuItem, { ...props, children: jsxRuntime.jsxs(MenuItemContent, { children: [icon && jsxRuntime.jsx(IconWrapper$1, { children: icon }), jsxRuntime.jsxs(LabelContainer$3, { children: [jsxRuntime.jsx(Label$3, { children: children }), secondaryText && jsxRuntime.jsx(SecondaryLabel, { children: secondaryText })] }), shortcut && jsxRuntime.jsx(Shortcut, { children: shortcut })] }) }));
2257
- };
2333
+ function NeoMenuItem({ icon, shortcut, secondaryText, children, ...rest }) {
2334
+ return (jsxRuntime.jsx(StyledMenuItem, { ...rest, children: jsxRuntime.jsxs(MenuItemContent, { children: [icon && jsxRuntime.jsx(IconWrapper$1, { children: icon }), jsxRuntime.jsxs(LabelContainer$3, { children: [jsxRuntime.jsx(Label$3, { children: children }), secondaryText && jsxRuntime.jsx(SecondaryLabel, { children: secondaryText })] }), shortcut && jsxRuntime.jsx(Shortcut, { children: shortcut })] }) }));
2335
+ }
2258
2336
  NeoMenuItem.displayName = 'NeoMenuItem';
2259
2337
 
2260
2338
  /**
@@ -2538,8 +2616,10 @@ const getDataGridHeaderStyles = () => {
2538
2616
  [`& .${xDataGrid.gridClasses.columnHeader}`]: {
2539
2617
  backgroundColor: neoDesign.semanticColors.surfaces.dataGrid.header,
2540
2618
  borderBottom: `1px solid ${neoDesign.semanticColors.border.primary}`,
2541
- paddingLeft: `${neoDesign.spacing.spacing_3}px`,
2542
- paddingRight: `${neoDesign.spacing.spacing_3}px`,
2619
+ paddingTop: `${neoDesign.spacing.spacing_1_1_2}px`,
2620
+ paddingBottom: `${neoDesign.spacing.spacing_1_1_2}px`,
2621
+ paddingLeft: `${neoDesign.spacing.spacing_2}px`,
2622
+ paddingRight: `${neoDesign.spacing.spacing_2}px`,
2543
2623
  boxSizing: 'border-box',
2544
2624
  },
2545
2625
  // Style the filler element to match header
@@ -2577,12 +2657,19 @@ const getDataGridHeaderStyles = () => {
2577
2657
  },
2578
2658
  },
2579
2659
  },
2660
+ // MUI clips this container when header vertical padding leaves < 16px of content
2661
+ // area (e.g. compact: 38px − 24px padding = 14px). overflow:visible lets the
2662
+ // sort icon render at full 16px without being cropped.
2663
+ [`& .${xDataGrid.gridClasses.columnHeaderTitleContainer}`]: {
2664
+ overflow: 'visible',
2665
+ lineHeight: 1,
2666
+ },
2580
2667
  // Style MUI's sort icon to match Neo design (16x16)
2581
2668
  [`& .${xDataGrid.gridClasses.iconButtonContainer}`]: {
2582
2669
  width: 16,
2583
2670
  height: 16,
2584
2671
  marginLeft: `${neoDesign.spacing.spacing_1_2}px`,
2585
- [`& .${Checkbox.checkboxClasses.root}`]: {
2672
+ '& button': {
2586
2673
  padding: 0,
2587
2674
  width: 16,
2588
2675
  height: 16,
@@ -2696,11 +2783,13 @@ function NeoDataGrid({ autoHeight = false, toolbar, slots, sx, density = 'standa
2696
2783
  ...getDataGridHeaderStyles(),
2697
2784
  ...getDataGridRowStyles(),
2698
2785
  border: `1px solid ${neoDesign.semanticColors.border.secondary}`,
2699
- // Style row selection checkboxes to match header (16px, proper spacing)
2786
+ // Style row selection checkboxes to match header (16px, proper spacing).
2787
+ // Target `& svg` (not `.MuiSvgIcon-root`) so the rule also matches the
2788
+ // lucide `<svg>` icons NeoCheckbox renders, mirroring the header rule.
2700
2789
  [`& .${xDataGrid.gridClasses.cellCheckbox}`]: {
2701
2790
  [`& .${Checkbox.checkboxClasses.root}`]: {
2702
2791
  padding: `${neoDesign.spacing.spacing_1}px`,
2703
- [`& .${SvgIcon.svgIconClasses.root}`]: {
2792
+ '& svg': {
2704
2793
  width: 16,
2705
2794
  height: 16,
2706
2795
  },
@@ -2749,7 +2838,7 @@ function NeoDataGridColumnsButton() {
2749
2838
  }
2750
2839
  NeoDataGridColumnsButton.displayName = 'NeoDataGridColumnsButton';
2751
2840
 
2752
- const sizeStyles = {
2841
+ const sizeStyles$1 = {
2753
2842
  small: {
2754
2843
  height: 16,
2755
2844
  minWidth: 16,
@@ -2822,9 +2911,11 @@ const StyledChip$2 = styles.styled(Chip)(({ theme, size, variant, color }) => ({
2822
2911
  fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs),
2823
2912
  lineHeight: 1,
2824
2913
  fontWeight: neoDesign.typography.fontWeight.medium,
2825
- ...(size && sizeStyles[size]),
2914
+ overflow: 'visible',
2915
+ ...(size && sizeStyles$1[size]),
2826
2916
  [`& .${Chip.chipClasses.label}`]: {
2827
2917
  padding: 0,
2918
+ overflow: 'visible',
2828
2919
  },
2829
2920
  ...(variant === 'outlined' &&
2830
2921
  color &&
@@ -3729,6 +3820,20 @@ const NeoDatePicker = ({ type = 'single', open, label, value, rangeValue, onChan
3729
3820
  };
3730
3821
  NeoDatePicker.displayName = 'NeoDatePicker';
3731
3822
 
3823
+ /**
3824
+ * NeoDatePickerListItem
3825
+ *
3826
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=4176-8521
3827
+ */
3828
+ const NeoDatePickerListItem = styles.styled('div')({});
3829
+
3830
+ /**
3831
+ * NeoDatePickerMenu
3832
+ *
3833
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=4176-8593
3834
+ */
3835
+ const NeoDatePickerMenu = styles.styled('div')({});
3836
+
3732
3837
  const StyledDivider = styles.styled(Divider)(({ theme }) => ({
3733
3838
  borderColor: neoDesign.semanticColors.border.secondary,
3734
3839
  marginTop: theme.spacing(1),
@@ -3769,26 +3874,34 @@ const sizeMap = {
3769
3874
  medium: 10,
3770
3875
  large: 12,
3771
3876
  };
3772
- const StyledBadge = styles.styled(Badge)(({ ownerState }) => {
3877
+ const StyledDot = styles.styled('span', {
3878
+ shouldForwardProp: prop => prop !== 'ownerState',
3879
+ })(({ ownerState }) => {
3773
3880
  const size = sizeMap[ownerState.size];
3774
- const color = neoDesign.semanticColors.status[ownerState.color].default;
3881
+ const palette = neoDesign.semanticColors.status[ownerState.color];
3775
3882
  return {
3776
- [`& .${Badge.badgeClasses.badge}`]: {
3777
- width: size,
3778
- height: size,
3779
- minWidth: size,
3780
- borderRadius: ownerState.variant === 'solid' ? '50%' : 0,
3781
- padding: 0,
3782
- backgroundColor: ownerState.variant === 'solid' ? color : 'transparent',
3783
- // Remove default badge positioning - make it standalone
3784
- position: 'static',
3785
- transform: 'none',
3786
- overflow: 'visible',
3883
+ display: 'inline-flex',
3884
+ alignItems: 'center',
3885
+ justifyContent: 'center',
3886
+ width: size,
3887
+ height: size,
3888
+ minWidth: size,
3889
+ borderRadius: '50%',
3890
+ flexShrink: 0,
3891
+ boxSizing: 'border-box',
3892
+ backgroundColor: palette.default,
3893
+ color: neoDesign.semanticColors.typography.tooltip,
3894
+ ...(ownerState.variant === 'outline' && {
3895
+ border: `3px solid ${palette.light}`,
3896
+ }),
3897
+ '& > svg': {
3898
+ width: '70%',
3899
+ height: '70%',
3787
3900
  },
3788
3901
  };
3789
3902
  });
3790
3903
  /**
3791
- * NeoDot - Status indicator dot component based on MUI Badge
3904
+ * NeoDot - Status indicator dot.
3792
3905
  *
3793
3906
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4163-3577
3794
3907
  *
@@ -3797,26 +3910,8 @@ const StyledBadge = styles.styled(Badge)(({ ownerState }) => {
3797
3910
  * - outline (False|True) → variant prop (solid|outline)
3798
3911
  * - Color is configurable via color prop (success|error|warning|info|neutral)
3799
3912
  */
3800
- const NeoDot = ({ size = 'medium', variant = 'solid', color = 'neutral', ...props }) => {
3801
- const dotSize = sizeMap[size];
3802
- const mediumColor = neoDesign.semanticColors.status[color].default;
3803
- const lightColor = neoDesign.semanticColors.status[color].light;
3804
- // For outline variant, use SVG for precise control
3805
- const renderDot = () => {
3806
- if (variant === 'outline') {
3807
- // SVG approach: outer circle with light fill, inner circle with medium fill
3808
- // Stroke width of ~3px creates the ring effect
3809
- const strokeWidth = 3;
3810
- const radius = dotSize / 2;
3811
- const innerRadius = radius - strokeWidth;
3812
- return (jsxRuntime.jsxs("svg", { width: dotSize, height: dotSize, viewBox: `0 0 ${dotSize} ${dotSize}`, style: {
3813
- display: 'block',
3814
- borderRadius: '50%',
3815
- }, role: "img", "aria-label": `${color} status indicator`, children: [jsxRuntime.jsx("title", { children: `${color} status indicator` }), jsxRuntime.jsx("circle", { cx: radius, cy: radius, r: radius, fill: lightColor }), jsxRuntime.jsx("circle", { cx: radius, cy: radius, r: innerRadius, fill: mediumColor })] }));
3816
- }
3817
- return jsxRuntime.jsx("span", { style: { display: 'inline-block', width: 0, height: 0 } });
3818
- };
3819
- return (jsxRuntime.jsx(StyledBadge, { ...props, ownerState: { size, variant, color }, variant: "dot", children: renderDot() }));
3913
+ const NeoDot = ({ size = 'medium', variant = 'solid', color = 'neutral', children, ...props }) => {
3914
+ return (jsxRuntime.jsx(StyledDot, { ...props, ownerState: { size, variant, color }, role: "img", "aria-label": props['aria-label'] ?? `${color} status indicator`, children: children }));
3820
3915
  };
3821
3916
  NeoDot.displayName = 'NeoDot';
3822
3917
 
@@ -3898,6 +3993,55 @@ const NeoDownloadToast = ({ title, fileName, progress, showClose = true, showPau
3898
3993
  };
3899
3994
  NeoDownloadToast.displayName = 'NeoDownloadToast';
3900
3995
 
3996
+ const buildFilledIcon = ({ displayName, fillColor, body, knockout }) => {
3997
+ const Component = (props) => (jsxRuntime.jsxs(SvgIcon, { viewBox: "0 0 16 16", ...props, children: [jsxRuntime.jsx("g", { fill: fillColor, children: body }), jsxRuntime.jsx("g", { stroke: "#FFFFFF", strokeWidth: 1.5, strokeLinecap: "round", strokeLinejoin: "round", fill: "none", children: knockout })] }));
3998
+ Component.displayName = displayName;
3999
+ return Component;
4000
+ };
4001
+ const CIRCLE_BODY = (jsxRuntime.jsx("path", { d: "M8.00001 14.6666C11.6819 14.6666 14.6667 11.6818 14.6667 7.99992C14.6667 4.31802 11.6819 1.33325 8.00001 1.33325C4.31811 1.33325 1.33334 4.31802 1.33334 7.99992C1.33334 11.6818 4.31811 14.6666 8.00001 14.6666Z" }));
4002
+ const NeoFilledSuccess = buildFilledIcon({
4003
+ displayName: 'NeoFilledSuccess',
4004
+ fillColor: '#3B8948',
4005
+ body: CIRCLE_BODY,
4006
+ knockout: jsxRuntime.jsx("path", { d: "M6 8.00008L7.33333 9.33341L10 6.66675" }),
4007
+ });
4008
+ const NeoFilledQueued = buildFilledIcon({
4009
+ displayName: 'NeoFilledQueued',
4010
+ fillColor: '#992FB9',
4011
+ body: CIRCLE_BODY,
4012
+ knockout: jsxRuntime.jsx("path", { d: "M8 4V8L10.6667 9.33333" }),
4013
+ });
4014
+ const NeoFilledInfo = buildFilledIcon({
4015
+ displayName: 'NeoFilledInfo',
4016
+ fillColor: '#2F42FF',
4017
+ body: CIRCLE_BODY,
4018
+ knockout: (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: "M8 10.6667V8" }), jsxRuntime.jsx("path", { d: "M8 5.33325H8.00667" })] })),
4019
+ });
4020
+ const NeoFilledWarning = buildFilledIcon({
4021
+ displayName: 'NeoFilledWarning',
4022
+ fillColor: '#BD9319',
4023
+ body: (jsxRuntime.jsx("path", { d: "M14.4867 12L9.15335 2.66665C9.03706 2.46146 8.86842 2.29078 8.66463 2.17203C8.46084 2.05329 8.22921 1.99072 7.99335 1.99072C7.75749 1.99072 7.52585 2.05329 7.32206 2.17203C7.11828 2.29078 6.94964 2.46146 6.83335 2.66665L1.50001 12C1.38247 12.2036 1.32083 12.4346 1.32135 12.6697C1.32187 12.9047 1.38453 13.1355 1.50298 13.3385C1.62142 13.5416 1.79145 13.7097 1.99581 13.8259C2.20018 13.942 2.43162 14.0021 2.66668 14H13.3333C13.5673 13.9997 13.797 13.938 13.9995 13.8208C14.202 13.7037 14.3702 13.5354 14.487 13.3327C14.6039 13.1301 14.6654 12.9002 14.6653 12.6663C14.6653 12.4324 14.6036 12.2026 14.4867 12Z" })),
4024
+ knockout: (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: "M8 6V8.66667" }), jsxRuntime.jsx("path", { d: "M8 11.3333H8.00667" })] })),
4025
+ });
4026
+ const NeoFilledError = buildFilledIcon({
4027
+ displayName: 'NeoFilledError',
4028
+ fillColor: '#CB3446',
4029
+ body: (jsxRuntime.jsx("path", { d: "M10.208 1.33325C10.5616 1.33333 10.9007 1.47385 11.1507 1.72392L14.276 4.84925C14.5261 5.09924 14.6666 5.43832 14.6667 5.79192V10.2079C14.6666 10.5615 14.5261 10.9006 14.276 11.1506L11.1507 14.2759C10.9007 14.526 10.5616 14.6665 10.208 14.6666H5.79201C5.43842 14.6665 5.09933 14.526 4.84934 14.2759L1.72401 11.1506C1.47394 10.9006 1.33342 10.5615 1.33334 10.2079V5.79192C1.33342 5.43832 1.47394 5.09924 1.72401 4.84925L4.84934 1.72392C5.09933 1.47385 5.43842 1.33333 5.79201 1.33325H10.208Z" })),
4030
+ knockout: (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: "M8 5.33325V7.99992" }), jsxRuntime.jsx("path", { d: "M8 10.6667H8.00667" })] })),
4031
+ });
4032
+ const NeoFilledNeutral = buildFilledIcon({
4033
+ displayName: 'NeoFilledNeutral',
4034
+ fillColor: '#6B7280',
4035
+ body: CIRCLE_BODY,
4036
+ knockout: jsxRuntime.jsx("path", { d: "M5.33334 8H10.6667" }),
4037
+ });
4038
+ const NeoFilledCanceled = buildFilledIcon({
4039
+ displayName: 'NeoFilledCanceled',
4040
+ fillColor: '#7B7263',
4041
+ body: CIRCLE_BODY,
4042
+ knockout: (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: "M10 6L6 10" }), jsxRuntime.jsx("path", { d: "M6 6L10 10" })] })),
4043
+ });
4044
+
3901
4045
  const filterChipOnlyProps = ['selected', 'expanded', 'selectedLabel', 'count', 'onClear'];
3902
4046
  const StyledChip$1 = styles.styled(Chip, {
3903
4047
  shouldForwardProp: prop => !filterChipOnlyProps.includes(prop),
@@ -4030,6 +4174,7 @@ const StyledFooter = styles.styled(Box, {
4030
4174
  shouldForwardProp: prop => prop !== 'showShadow',
4031
4175
  })(({ theme, showShadow = false }) => ({
4032
4176
  backgroundColor: neoDesign.semanticColors.surfaces.white,
4177
+ borderTop: `1px solid ${neoDesign.semanticColors.border.primary}`,
4033
4178
  display: 'flex',
4034
4179
  alignItems: 'center',
4035
4180
  justifyContent: 'center',
@@ -4355,13 +4500,7 @@ function NeoInfiniteScrollGrid({ onLoadMore, hasNextPage = true, loadMoreAtScrol
4355
4500
  showShadow: isScrolling,
4356
4501
  ...userSlotProps?.footer,
4357
4502
  },
4358
- }, sx: {
4359
- // Add border at bottom of rows section (above footer)
4360
- [`& .${xDataGrid.gridClasses.virtualScrollerContent}`]: {
4361
- borderBottom: `1px solid ${neoDesign.semanticColors.border.primary}`,
4362
- },
4363
- ...userSx,
4364
- }, pagination: false, ...props,
4503
+ }, sx: userSx, pagination: false, ...props,
4365
4504
  // Only show loading overlay when loading AND no rows exist yet
4366
4505
  // This keeps existing rows visible while loading more data (footer shows loading spinner)
4367
4506
  loading: props.loading && !hasRows }));
@@ -4787,87 +4926,127 @@ const NeoListItem = ({ size = 'medium', primaryText, secondaryText, badge, icon,
4787
4926
  };
4788
4927
  NeoListItem.displayName = 'NeoListItem';
4789
4928
 
4790
- /**
4791
- * Styled ListItemButton with Neo design tokens
4792
- * Uses MUI's ListItemButton as base for proper accessibility and interaction
4793
- */
4794
- const StyledListItemButton = styles.styled(ListItemButton)(({ theme }) => ({
4795
- display: 'flex',
4796
- alignItems: 'center',
4797
- gap: neoDesign.spacing.spacing_2,
4798
- borderRadius: neoDesign.borderRadius.m,
4799
- paddingTop: neoDesign.spacing.spacing_1,
4800
- paddingBottom: neoDesign.spacing.spacing_1,
4801
- paddingLeft: neoDesign.spacing.spacing_3_4,
4802
- paddingRight: neoDesign.spacing.spacing_3_4,
4803
- border: `1px solid ${neoDesign.semanticColors.border.primary}`,
4804
- backgroundColor: theme.palette.common.white,
4805
- transition: theme.transitions.create(['border', 'background-color']),
4806
- // Active (selected) state
4807
- [`&.${ListItemButton.listItemButtonClasses.selected}`]: {
4808
- border: `2px solid ${neoDesign.semanticColors.buttons.primary.default}`,
4809
- backgroundColor: theme.palette.common.white,
4810
- '&:hover': {
4811
- backgroundColor: theme.palette.common.white,
4812
- },
4813
- // Icon color in selected state
4814
- [`& .${ListItemIcon.listItemIconClasses.root}`]: {
4815
- color: neoDesign.semanticColors.icons.default,
4816
- },
4817
- // Text colors in selected state
4818
- [`& .${ListItemText.listItemTextClasses.primary}`]: {
4819
- color: neoDesign.colors.grey[800],
4820
- },
4821
- [`& .${ListItemText.listItemTextClasses.secondary}`]: {
4822
- color: neoDesign.semanticColors.typography.bodySecondary,
4823
- },
4824
- },
4825
- // Deselected (default) state
4826
- [`&:not(.${ListItemButton.listItemButtonClasses.selected}):not(.${ListItemButton.listItemButtonClasses.disabled})`]: {
4827
- '&:hover': {
4828
- backgroundColor: neoDesign.colors.grey[50],
4929
+ const StyledListItemButton = styles.styled(ListItemButton, {
4930
+ shouldForwardProp: prop => prop !== 'listVariant',
4931
+ })(({ theme, listVariant = 'card' }) => listVariant === 'nav' ? navVariantStyles(theme) : cardVariantStyles(theme));
4932
+ // Nav variant — sidebar list item: no border, compact, subtle highlights.
4933
+ // Renders children inline; no ListItemIcon/ListItemText wrappers required.
4934
+ function navVariantStyles(theme) {
4935
+ return {
4936
+ display: 'flex',
4937
+ alignItems: 'center',
4938
+ gap: neoDesign.spacing.spacing_2,
4939
+ borderRadius: neoDesign.borderRadius.s,
4940
+ paddingTop: neoDesign.spacing.spacing_1,
4941
+ paddingBottom: neoDesign.spacing.spacing_1,
4942
+ paddingLeft: neoDesign.spacing.spacing_2,
4943
+ paddingRight: neoDesign.spacing.spacing_2,
4944
+ border: 'none',
4945
+ color: neoDesign.semanticColors.typography.bodySecondary,
4946
+ backgroundColor: 'transparent',
4947
+ transition: theme.transitions.create(['background-color', 'color']),
4948
+ [`&.${ListItemButton.listItemButtonClasses.selected}`]: {
4949
+ backgroundColor: neoDesign.semanticColors.surfaces.activeHighlight,
4950
+ color: neoDesign.semanticColors.typography.body,
4951
+ '&:hover': {
4952
+ backgroundColor: neoDesign.semanticColors.surfaces.activeHighlight,
4953
+ },
4829
4954
  },
4830
- [`& .${ListItemIcon.listItemIconClasses.root}`]: {
4831
- color: neoDesign.semanticColors.icons.disabled,
4955
+ [`&:not(.${ListItemButton.listItemButtonClasses.selected}):not(.${ListItemButton.listItemButtonClasses.disabled})`]: {
4956
+ '&:hover': {
4957
+ backgroundColor: neoDesign.semanticColors.surfaces.listHover,
4958
+ color: neoDesign.semanticColors.typography.body,
4959
+ },
4832
4960
  },
4833
- [`& .${ListItemText.listItemTextClasses.primary}`]: {
4834
- color: neoDesign.semanticColors.buttons.tertiary.disabled,
4961
+ [`&.${ListItemButton.listItemButtonClasses.focusVisible}`]: {
4962
+ outline: `2px solid ${neoDesign.semanticColors.border.focus}`,
4963
+ outlineOffset: -2,
4835
4964
  },
4836
- [`& .${ListItemText.listItemTextClasses.secondary}`]: {
4965
+ [`&.${ListItemButton.listItemButtonClasses.disabled}`]: {
4837
4966
  color: neoDesign.semanticColors.typography.button.disabled,
4967
+ opacity: 1,
4838
4968
  },
4839
- },
4840
- // Focus state
4841
- [`&.${ListItemButton.listItemButtonClasses.focusVisible}`]: {
4842
- outline: `2px solid ${neoDesign.semanticColors.buttons.primary.default}`,
4843
- outlineOffset: 2,
4844
- border: `2px solid ${neoDesign.semanticColors.buttons.primary.default}`,
4969
+ };
4970
+ }
4971
+ function cardVariantStyles(theme) {
4972
+ return {
4973
+ display: 'flex',
4974
+ alignItems: 'center',
4975
+ gap: neoDesign.spacing.spacing_2,
4976
+ borderRadius: neoDesign.borderRadius.m,
4977
+ paddingTop: neoDesign.spacing.spacing_1,
4978
+ paddingBottom: neoDesign.spacing.spacing_1,
4979
+ paddingLeft: neoDesign.spacing.spacing_3_4,
4980
+ paddingRight: neoDesign.spacing.spacing_3_4,
4981
+ border: `1px solid ${neoDesign.semanticColors.border.primary}`,
4845
4982
  backgroundColor: theme.palette.common.white,
4846
- [`& .${ListItemIcon.listItemIconClasses.root}`]: {
4847
- color: neoDesign.semanticColors.icons.default,
4848
- },
4849
- [`& .${ListItemText.listItemTextClasses.primary}`]: {
4850
- color: neoDesign.colors.grey[800],
4851
- },
4852
- [`& .${ListItemText.listItemTextClasses.secondary}`]: {
4853
- color: neoDesign.semanticColors.typography.bodySecondary,
4983
+ transition: theme.transitions.create(['border', 'background-color']),
4984
+ // Active (selected) state
4985
+ [`&.${ListItemButton.listItemButtonClasses.selected}`]: {
4986
+ border: `2px solid ${neoDesign.semanticColors.buttons.primary.default}`,
4987
+ backgroundColor: theme.palette.common.white,
4988
+ '&:hover': {
4989
+ backgroundColor: theme.palette.common.white,
4990
+ },
4991
+ // Icon color in selected state
4992
+ [`& .${ListItemIcon.listItemIconClasses.root}`]: {
4993
+ color: neoDesign.semanticColors.icons.default,
4994
+ },
4995
+ // Text colors in selected state
4996
+ [`& .${ListItemText.listItemTextClasses.primary}`]: {
4997
+ color: neoDesign.colors.grey[800],
4998
+ },
4999
+ [`& .${ListItemText.listItemTextClasses.secondary}`]: {
5000
+ color: neoDesign.semanticColors.typography.bodySecondary,
5001
+ },
4854
5002
  },
4855
- },
4856
- // Disabled state
4857
- [`&.${ListItemButton.listItemButtonClasses.disabled}`]: {
4858
- backgroundColor: neoDesign.colors.grey[50],
4859
- opacity: 1, // Override MUI default opacity
4860
- [`& .${ListItemIcon.listItemIconClasses.root}`]: {
4861
- color: neoDesign.semanticColors.icons.disabled,
5003
+ // Deselected (default) state
5004
+ [`&:not(.${ListItemButton.listItemButtonClasses.selected}):not(.${ListItemButton.listItemButtonClasses.disabled})`]: {
5005
+ '&:hover': {
5006
+ backgroundColor: neoDesign.colors.grey[50],
5007
+ },
5008
+ [`& .${ListItemIcon.listItemIconClasses.root}`]: {
5009
+ color: neoDesign.semanticColors.icons.disabled,
5010
+ },
5011
+ [`& .${ListItemText.listItemTextClasses.primary}`]: {
5012
+ color: neoDesign.semanticColors.buttons.tertiary.disabled,
5013
+ },
5014
+ [`& .${ListItemText.listItemTextClasses.secondary}`]: {
5015
+ color: neoDesign.semanticColors.typography.button.disabled,
5016
+ },
4862
5017
  },
4863
- [`& .${ListItemText.listItemTextClasses.primary}`]: {
4864
- color: neoDesign.colors.grey[300],
5018
+ // Focus state
5019
+ [`&.${ListItemButton.listItemButtonClasses.focusVisible}`]: {
5020
+ outline: `2px solid ${neoDesign.semanticColors.buttons.primary.default}`,
5021
+ outlineOffset: 2,
5022
+ border: `2px solid ${neoDesign.semanticColors.buttons.primary.default}`,
5023
+ backgroundColor: theme.palette.common.white,
5024
+ [`& .${ListItemIcon.listItemIconClasses.root}`]: {
5025
+ color: neoDesign.semanticColors.icons.default,
5026
+ },
5027
+ [`& .${ListItemText.listItemTextClasses.primary}`]: {
5028
+ color: neoDesign.colors.grey[800],
5029
+ },
5030
+ [`& .${ListItemText.listItemTextClasses.secondary}`]: {
5031
+ color: neoDesign.semanticColors.typography.bodySecondary,
5032
+ },
4865
5033
  },
4866
- [`& .${ListItemText.listItemTextClasses.secondary}`]: {
4867
- color: neoDesign.colors.grey[300],
5034
+ // Disabled state
5035
+ [`&.${ListItemButton.listItemButtonClasses.disabled}`]: {
5036
+ backgroundColor: neoDesign.colors.grey[50],
5037
+ opacity: 1, // Override MUI default opacity
5038
+ [`& .${ListItemIcon.listItemIconClasses.root}`]: {
5039
+ color: neoDesign.semanticColors.icons.disabled,
5040
+ },
5041
+ [`& .${ListItemText.listItemTextClasses.primary}`]: {
5042
+ color: neoDesign.colors.grey[300],
5043
+ },
5044
+ [`& .${ListItemText.listItemTextClasses.secondary}`]: {
5045
+ color: neoDesign.colors.grey[300],
5046
+ },
4868
5047
  },
4869
- },
4870
- }));
5048
+ };
5049
+ }
4871
5050
  /**
4872
5051
  * NeoListItemButton - Selectable list item with icon and text
4873
5052
  *
@@ -4911,8 +5090,8 @@ const StyledListItemButton = styles.styled(ListItemButton)(({ theme }) => ({
4911
5090
  * - colors.grey[300] (#d1d5db) - Disabled text
4912
5091
  * - colors.grey[50] (#f9fafb) - Disabled background
4913
5092
  */
4914
- const NeoListItemButton = ({ children, selected = false, disabled = false, ...props }) => {
4915
- return (jsxRuntime.jsx(StyledListItemButton, { selected: selected, disabled: disabled, ...props, children: children }));
5093
+ const NeoListItemButton = ({ children, selected = false, disabled = false, variant = 'card', ...props }) => {
5094
+ return (jsxRuntime.jsx(StyledListItemButton, { selected: selected, disabled: disabled, listVariant: variant, ...props, children: children }));
4916
5095
  };
4917
5096
  NeoListItemButton.displayName = 'NeoListItemButton';
4918
5097
 
@@ -4922,7 +5101,6 @@ const StyledMenu = styles.styled(Menu)(({ theme }) => ({
4922
5101
  borderRadius: neoDesign.borderRadius.s,
4923
5102
  border: `1px solid ${neoDesign.semanticColors.border.primary}`,
4924
5103
  boxShadow: `${neoDesign.shadows.dropdown.x}px ${neoDesign.shadows.dropdown.y}px ${neoDesign.shadows.dropdown.blur}px ${neoDesign.shadows.dropdown.spread}px ${neoDesign.shadows.dropdown.shadow}`,
4925
- minWidth: 200,
4926
5104
  marginTop: theme.spacing(1),
4927
5105
  paddingTop: theme.spacing(1),
4928
5106
  paddingBottom: theme.spacing(1),
@@ -5149,9 +5327,8 @@ NeoModalFooter.displayName = 'NeoModalFooter';
5149
5327
  const NavigationAvatarContainer = styles.styled('div')({
5150
5328
  display: 'flex',
5151
5329
  boxSizing: 'border-box',
5152
- width: neoDesign.spacing.spacing_5,
5153
- height: neoDesign.spacing.spacing_5,
5154
5330
  padding: neoDesign.spacing.spacing_1_2,
5331
+ aspectRatio: '1 / 1',
5155
5332
  justifyContent: 'center',
5156
5333
  alignItems: 'center',
5157
5334
  borderRadius: '50%',
@@ -5169,11 +5346,98 @@ const NavigationAvatarContainer = styles.styled('div')({
5169
5346
  *
5170
5347
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=11325-102
5171
5348
  */
5172
- const NeoNavigationAvatar = ({ colorIndex = 0, children, ...props }) => {
5173
- return (jsxRuntime.jsx(NavigationAvatarContainer, { children: jsxRuntime.jsx(NeoGeneralAvatar, { size: "small", colorIndex: colorIndex, ...props, children: children }) }));
5349
+ const NeoNavigationAvatar = ({ children, ...props }) => {
5350
+ return (jsxRuntime.jsx(NavigationAvatarContainer, { children: jsxRuntime.jsx(NeoGeneralAvatar, { size: "small", ...props, children: children }) }));
5174
5351
  };
5175
5352
  NeoNavigationAvatar.displayName = 'NeoNavigationAvatar';
5176
5353
 
5354
+ const NeoSideNavContext = React.createContext({
5355
+ collapsed: false,
5356
+ });
5357
+ const useNeoSideNav = () => React.useContext(NeoSideNavContext);
5358
+
5359
+ /**
5360
+ * Variant color configuration
5361
+ */
5362
+ const variantConfig = {
5363
+ light: {
5364
+ backgroundColor: neoDesign.semanticColors.surfaces.tooltip, // #4b5563 - medium gray
5365
+ color: neoDesign.semanticColors.typography.tooltip, // #ffffff - white
5366
+ },
5367
+ dark: {
5368
+ backgroundColor: neoDesign.colors.grey[50], // #f9fafb - very light gray
5369
+ color: neoDesign.colors.grey[800], // #1f2937 - dark gray
5370
+ },
5371
+ brand: {
5372
+ backgroundColor: neoDesign.colors.digitalBlue[800], // #131e7a - dark blue
5373
+ color: neoDesign.semanticColors.typography.tooltip, // #ffffff - white
5374
+ },
5375
+ };
5376
+ /**
5377
+ * Styled MUI Tooltip with Neo design system tokens
5378
+ */
5379
+ const StyledTooltip$1 = styles.styled(Tooltip, {
5380
+ shouldForwardProp: prop => prop !== 'variant' && prop !== 'description',
5381
+ })(({ variant = 'light', description }) => {
5382
+ const hasDescription = Boolean(description);
5383
+ const variantStyles = variantConfig[variant];
5384
+ return {
5385
+ // Style the tooltip content
5386
+ [`& .${Tooltip.tooltipClasses.tooltip}`]: {
5387
+ backgroundColor: variantStyles.backgroundColor,
5388
+ color: variantStyles.color,
5389
+ fontSize: neoDesign.typography.fontSize.xs,
5390
+ fontWeight: neoDesign.typography.fontWeight.medium,
5391
+ lineHeight: hasDescription ? 1.5 : 1,
5392
+ borderRadius: hasDescription ? neoDesign.borderRadius.s : neoDesign.borderRadius.xS,
5393
+ padding: hasDescription ? neoDesign.spacing.spacing_1_1_2 : `0 ${neoDesign.spacing.spacing_1}px`,
5394
+ ...(hasDescription && {
5395
+ maxWidth: 296,
5396
+ }),
5397
+ ...(!hasDescription && {
5398
+ height: neoDesign.spacing.spacing_3_1_4,
5399
+ display: 'flex',
5400
+ alignItems: 'center',
5401
+ justifyContent: 'center',
5402
+ }),
5403
+ boxShadow: `${neoDesign.shadows.neutral.medium.x}px ${neoDesign.shadows.neutral.medium.y}px ${neoDesign.shadows.neutral.medium.blur}px ${neoDesign.shadows.neutral.medium.spread}px ${neoDesign.shadows.neutral.medium.shadow}`,
5404
+ },
5405
+ // Style the arrow
5406
+ [`& .${Tooltip.tooltipClasses.arrow}`]: {
5407
+ color: variantStyles.backgroundColor,
5408
+ },
5409
+ };
5410
+ });
5411
+ /**
5412
+ * NeoTooltip - Tooltip component following Neo design system
5413
+ *
5414
+ * Provides contextual information when users hover over or focus on an element.
5415
+ * Supports three visual variants (light, dark, brand) and optional supporting text.
5416
+ *
5417
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4091-26557&t=Bo58EpFmg6ILJtmv-11
5418
+ *
5419
+ * Figma Props Mapping:
5420
+ * - Theme (Light mode|Dark mode|Brand color) → variant ('light'|'dark'|'brand')
5421
+ * - Placement → arrow (boolean) + placement (top/bottom/left/right/etc)
5422
+ * - Supporting text (True|False) → description (string|undefined)
5423
+ * - text → title (string, literal content)
5424
+ *
5425
+ * Design Tokens Used:
5426
+ * - Light: surfaces.tooltip (#4b5563), typography.tooltip (#ffffff)
5427
+ * - Dark: grey[50] (#f9fafb), grey[800] (#1f2937)
5428
+ * - Brand: digitalBlue[800] (#131e7a), typography.tooltip (#ffffff)
5429
+ * - Shadow: neutralMedium (0px 8px 15px 0px rgba(31,41,55,0.1))
5430
+ * - Typography: fontSize.xs (12), fontSize.caption (13), fontWeight.medium (500), fontWeight.semiBold (600)
5431
+ */
5432
+ const NeoTooltip = ({ variant = 'light', title, description, children, arrow = false, placement, ...props }) => {
5433
+ // Build the title content
5434
+ // If description is provided, create a structured layout with title + description
5435
+ // Otherwise, just show the title text
5436
+ const titleContent = description ? (jsxRuntime.jsxs(Stack, { gap: 0.5, children: [jsxRuntime.jsx(Typography, { fontSize: neoDesign.typography.fontSize.caption, fontWeight: neoDesign.typography.fontWeight.semiBold, children: title }), jsxRuntime.jsx(Typography, { fontSize: neoDesign.typography.fontSize.xs, fontWeight: neoDesign.typography.fontWeight.medium, sx: { opacity: 0.75 }, children: description })] })) : (title);
5437
+ return (jsxRuntime.jsx(StyledTooltip$1, { variant: variant, description: description, title: titleContent, arrow: arrow, placement: placement, ...props, children: children }));
5438
+ };
5439
+ NeoTooltip.displayName = 'NeoTooltip';
5440
+
5177
5441
  const customProps = ['selected'];
5178
5442
  const StyledRoot = styles.styled(ButtonBase, {
5179
5443
  shouldForwardProp: prop => !customProps.includes(prop),
@@ -5192,41 +5456,34 @@ const StyledRoot = styles.styled(ButtonBase, {
5192
5456
  textDecoration: 'none',
5193
5457
  '&:hover .neo-nav-icon-padding': {
5194
5458
  backgroundColor: neoDesign.semanticColors.buttons.secondary.hoverBackground,
5195
- borderColor: neoDesign.colors.digitalBlue[100],
5459
+ borderColor: neoDesign.semanticColors.buttons.secondary.pressedBackground,
5196
5460
  },
5197
5461
  '&:hover .neo-nav-label': {
5198
5462
  color: neoDesign.semanticColors.buttons.primary.hover,
5199
5463
  },
5464
+ [`& .${Chip.chipClasses.root}`]: {
5465
+ flexShrink: 0,
5466
+ },
5200
5467
  '&:focus-visible': {
5201
- ...focusRingStyles,
5468
+ outline: 'none',
5202
5469
  },
5203
5470
  '&:focus-visible .neo-nav-icon-padding': {
5204
- backgroundColor: neoDesign.semanticColors.buttons.secondary.hoverBackground,
5205
- borderColor: neoDesign.colors.digitalBlue[100],
5206
- },
5207
- '&:focus-visible .neo-nav-label': {
5208
- color: neoDesign.semanticColors.buttons.primary.hover,
5471
+ ...focusRingStyles,
5209
5472
  },
5210
5473
  ...(selected && {
5211
5474
  '& .neo-nav-icon-padding': {
5212
- backgroundColor: neoDesign.colors.digitalBlue[100],
5475
+ backgroundColor: neoDesign.semanticColors.buttons.secondary.pressedBackground,
5213
5476
  },
5214
5477
  '& .neo-nav-label': {
5215
5478
  color: neoDesign.semanticColors.buttons.primary.pressed,
5216
5479
  fontWeight: neoDesign.typography.fontWeight.semiBold,
5217
5480
  },
5218
5481
  '&:hover .neo-nav-icon-padding': {
5219
- backgroundColor: neoDesign.colors.digitalBlue[100],
5482
+ backgroundColor: neoDesign.semanticColors.buttons.secondary.pressedBackground,
5220
5483
  },
5221
5484
  '&:hover .neo-nav-label': {
5222
5485
  color: neoDesign.semanticColors.buttons.primary.pressed,
5223
5486
  },
5224
- '&:focus-visible .neo-nav-icon-padding': {
5225
- backgroundColor: neoDesign.colors.digitalBlue[100],
5226
- },
5227
- '&:focus-visible .neo-nav-label': {
5228
- color: neoDesign.semanticColors.buttons.primary.pressed,
5229
- },
5230
5487
  }),
5231
5488
  }));
5232
5489
  const IconPadding = styles.styled('span')({
@@ -5247,28 +5504,21 @@ const Label$2 = styles.styled('span')(({ theme }) => ({
5247
5504
  width: '100%',
5248
5505
  transition: 'color 150ms',
5249
5506
  }));
5250
- const TagPill = styles.styled('span')(({ theme }) => ({
5251
- display: 'inline-flex',
5252
- alignItems: 'center',
5253
- justifyContent: 'center',
5254
- height: 18,
5255
- paddingLeft: neoDesign.spacing.spacing_3_4, // 6px
5256
- paddingRight: neoDesign.spacing.spacing_3_4, // 6px
5257
- borderRadius: neoDesign.borderRadius.full,
5258
- backgroundColor: neoDesign.colors.digitalBlue[300], // #8D99FF
5259
- color: neoDesign.semanticColors.typography.tooltip, // white
5260
- fontFamily: neoDesign.typography.fontFamily.body,
5261
- fontWeight: neoDesign.typography.fontWeight.medium,
5262
- fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs), // 12px
5263
- lineHeight: 1,
5264
- }));
5265
5507
  /**
5266
5508
  * NeoNavigationItem - Vertical navigation item with icon, label, and optional tag
5267
5509
  *
5268
5510
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=8455-6120
5269
5511
  */
5270
- function NeoNavigationItem({ icon, label, selected = false, tag, children, ...props }) {
5271
- return (jsxRuntime.jsxs(StyledRoot, { selected: selected, disableRipple: true, ...props, children: [jsxRuntime.jsx(IconPadding, { className: "neo-nav-icon-padding", children: icon }), label && jsxRuntime.jsx(Label$2, { className: "neo-nav-label", children: label }), tag && jsxRuntime.jsx(TagPill, { children: tag }), children] }));
5512
+ function NeoNavigationItem({ icon, label, selected = false, tag, tooltip, slotProps, children, ...props }) {
5513
+ const { collapsed } = useNeoSideNav();
5514
+ // When collapsed the label is hidden, so fall back to it for the tooltip and
5515
+ // accessible name — otherwise an icon-only button has no name (WCAG 4.1.2).
5516
+ const collapsedTooltip = tooltip ?? label;
5517
+ const item = (jsxRuntime.jsxs(StyledRoot, { selected: selected, "aria-label": collapsed && typeof label === 'string' ? label : undefined, disableRipple: true, ...props, children: [jsxRuntime.jsx(IconPadding, { className: "neo-nav-icon-padding", children: icon }), !collapsed && label && jsxRuntime.jsx(Label$2, { className: "neo-nav-label", children: label }), !collapsed && tag && (jsxRuntime.jsx(NeoTag, { size: "medium", variant: "filled", intent: "beta", label: tag, ...slotProps?.badge })), children] }));
5518
+ if (collapsed && collapsedTooltip) {
5519
+ return (jsxRuntime.jsx(NeoTooltip, { title: collapsedTooltip, placement: "right", arrow: true, children: item }));
5520
+ }
5521
+ return item;
5272
5522
  }
5273
5523
  NeoNavigationItem.displayName = 'NeoNavigationItem';
5274
5524
 
@@ -5314,11 +5564,11 @@ const LabelText = styles.styled('span', {
5314
5564
  * NeoAvatarCell — DataGrid cell displaying a user avatar with optional label.
5315
5565
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=13425-1725
5316
5566
  */
5317
- const NeoAvatarCell = ({ name, src, colorIndex = 0, label, disabled = false, empty = false, }) => {
5567
+ const NeoAvatarCell = ({ name, src, label, disabled = false, empty = false, }) => {
5318
5568
  if (empty) {
5319
5569
  return jsxRuntime.jsx(StyledCell$1, { disabled: disabled });
5320
5570
  }
5321
- return (jsxRuntime.jsxs(StyledCell$1, { disabled: disabled, children: [jsxRuntime.jsx(NeoGeneralAvatar, { size: "small", src: src, alt: name, colorIndex: colorIndex, children: !src && name ? name.charAt(0).toUpperCase() : undefined }), label && jsxRuntime.jsx(LabelText, { disabled: disabled, children: label })] }));
5571
+ return (jsxRuntime.jsxs(StyledCell$1, { disabled: disabled, children: [jsxRuntime.jsx(NeoGeneralAvatar, { size: "small", src: src, alt: name, children: !src && name ? name.charAt(0).toUpperCase() : undefined }), label && jsxRuntime.jsx(LabelText, { disabled: disabled, children: label })] }));
5322
5572
  };
5323
5573
  NeoAvatarCell.displayName = 'NeoAvatarCell';
5324
5574
 
@@ -5532,7 +5782,7 @@ const TooltipErrorPre = styles.styled('pre')({
5532
5782
  maxHeight: 200,
5533
5783
  overflowY: 'auto',
5534
5784
  });
5535
- const StyledTooltip$1 = styles.styled(Tooltip)({
5785
+ const StyledTooltip = styles.styled(Tooltip)({
5536
5786
  [`& .${Tooltip.tooltipClasses.tooltip}`]: {
5537
5787
  backgroundColor: neoDesign.semanticColors.surfaces.tooltip,
5538
5788
  maxWidth: 400,
@@ -5556,7 +5806,7 @@ const NeoStatusCell = ({ icon, label, details, disabled = false, variant = 'succ
5556
5806
  }
5557
5807
  const chip = (jsxRuntime.jsxs(StyledChip, { disabled: disabled, variant: variant, children: [icon, label] }));
5558
5808
  if (details) {
5559
- return (jsxRuntime.jsx(StyledTooltip$1, { title: jsxRuntime.jsx(TooltipErrorPre, { children: details }), arrow: true, placement: "bottom-start", children: jsxRuntime.jsx(Box, { component: "span", sx: { display: 'inline-flex' }, children: chip }) }));
5809
+ return (jsxRuntime.jsx(StyledTooltip, { title: jsxRuntime.jsx(TooltipErrorPre, { children: details }), arrow: true, placement: "bottom-start", children: jsxRuntime.jsx(Box, { component: "span", sx: { display: 'inline-flex' }, children: chip }) }));
5560
5810
  }
5561
5811
  return chip;
5562
5812
  };
@@ -5576,10 +5826,9 @@ const StickyHeader = styles.styled(Box)(({ theme }) => ({
5576
5826
  * Page title typography
5577
5827
  */
5578
5828
  const PageTitle = styles.styled(Typography)(() => ({
5579
- fontSize: neoDesign.typography.fontSize.h3,
5580
- fontWeight: neoDesign.typography.fontWeight.medium,
5829
+ ...neoDesign.semanticTypography.titles.pageHeader,
5581
5830
  lineHeight: 1.4,
5582
- color: neoDesign.colors.grey['900'], // #111827 - matches Figma typography/page-header
5831
+ color: neoDesign.colors.grey['900'],
5583
5832
  }));
5584
5833
  /**
5585
5834
  * Subtitle typography
@@ -5643,7 +5892,12 @@ const Subtitle = styles.styled(Typography)(() => ({
5643
5892
  * </NeoPageContent>
5644
5893
  * ```
5645
5894
  */
5646
- function NeoPageContent({ pageTitle, subtitle, breadcrumbs, action, sticky = false, contentMaxWidth = false, centerContent = true, disableGutters = false, isLoading = false, showBackToTop = true, children, sx, ...boxProps }) {
5895
+ function NeoPageContent({ pageTitle, subtitle, breadcrumbs, action, sticky = false, contentMaxWidth: contentMaxWidthProp = false, centerContent = true, disableGutters: disableGuttersProp = false, isLoading = false, showBackToTop = true, layout = 'default', children, sx, ...boxProps }) {
5896
+ // fullBleed forces no max-width, no gutters, and zero bottom padding
5897
+ // so children can fill the viewport edge-to-edge.
5898
+ const isFullBleed = layout === 'fullBleed';
5899
+ const contentMaxWidth = isFullBleed ? false : contentMaxWidthProp;
5900
+ const disableGutters = isFullBleed || disableGuttersProp;
5647
5901
  const [showBackToTopButton, setShowBackToTopButton] = React.useState(false);
5648
5902
  const headerRef = React.useRef(null);
5649
5903
  const containerRef = React.useRef(null);
@@ -5673,7 +5927,7 @@ function NeoPageContent({ pageTitle, subtitle, breadcrumbs, action, sticky = fal
5673
5927
  // Also try to scroll window in case component is in a different context
5674
5928
  window.scrollTo({ top: 0, behavior: 'smooth' });
5675
5929
  };
5676
- const headerContent = (jsxRuntime.jsxs(Stack, { ref: headerRef, sx: { flexShrink: 0, gap: '0.5rem' }, children: [breadcrumbs && breadcrumbs.items.length > 0 && (jsxRuntime.jsx(NeoBreadcrumbs, { children: breadcrumbs.items.map((item, index) => (jsxRuntime.jsx(NeoBreadcrumbLink, { href: item.href, component: item.href && breadcrumbs.linkComponent ? breadcrumbs.linkComponent : undefined, current: index === breadcrumbs.items.length - 1, children: item.label }, item.href ?? index))) })), jsxRuntime.jsxs(Stack, { direction: "row", justifyContent: "space-between", alignItems: "flex-start", sx: { gap: '1rem' }, children: [jsxRuntime.jsxs(Stack, { sx: { gap: '0.5rem', flexGrow: 1 }, children: [jsxRuntime.jsx(PageTitle, { children: pageTitle }), subtitle &&
5930
+ const headerContent = (jsxRuntime.jsxs(Stack, { ref: headerRef, sx: { flexShrink: 0, gap: '0.5rem' }, children: [breadcrumbs && breadcrumbs.items.length > 0 && (jsxRuntime.jsx(NeoBreadcrumbs, { children: breadcrumbs.items.map((item, index) => (jsxRuntime.jsx(NeoBreadcrumbLink, { href: item.href, component: item.href && breadcrumbs.linkComponent ? breadcrumbs.linkComponent : undefined, current: index === breadcrumbs.items.length - 1, children: item.label }, item.href ?? index))) })), jsxRuntime.jsxs(Stack, { direction: "row", justifyContent: "space-between", alignItems: "flex-start", sx: { gap: '1rem' }, children: [jsxRuntime.jsxs(Stack, { sx: { gap: '0.5rem', flexGrow: 1 }, children: [typeof pageTitle === 'string' ? (jsxRuntime.jsx(PageTitle, { component: "h1", children: pageTitle })) : (pageTitle), subtitle &&
5677
5931
  (typeof subtitle === 'string' ? (jsxRuntime.jsx(Subtitle, { variant: "caption", children: subtitle })) : (subtitle))] }), action] })] }));
5678
5932
  const content = isLoading ? (jsxRuntime.jsx(Box, { sx: {
5679
5933
  display: 'flex',
@@ -5695,7 +5949,7 @@ function NeoPageContent({ pageTitle, subtitle, breadcrumbs, action, sticky = fal
5695
5949
  flexDirection: 'column',
5696
5950
  px: disableGutters ? 0 : `${neoDesign.spacing.spacing_2_1_2}px`,
5697
5951
  pt: sticky ? 0 : `${neoDesign.spacing.spacing_2}px`,
5698
- pb: `${neoDesign.spacing.spacing_2_1_2}px`,
5952
+ pb: isFullBleed ? 0 : `${neoDesign.spacing.spacing_2_1_2}px`,
5699
5953
  height: '100%',
5700
5954
  overflow: 'auto',
5701
5955
  }, children: [sticky ? (jsxRuntime.jsx(StickyHeader, { ref: headerRef, sx: {
@@ -5720,7 +5974,7 @@ function NeoPageContent({ pageTitle, subtitle, breadcrumbs, action, sticky = fal
5720
5974
  width: '100%',
5721
5975
  ...(centerContent ? { mx: 'auto' } : { alignSelf: 'flex-start' }),
5722
5976
  }),
5723
- }, children: content })] }) }), showBackToTop && (jsxRuntime.jsx(Fade, { in: showBackToTopButton, children: jsxRuntime.jsx(Box, { sx: {
5977
+ }, children: content })] }) }), showBackToTop && (jsxRuntime.jsx(Fade$1, { in: showBackToTopButton, children: jsxRuntime.jsx(Box, { sx: {
5724
5978
  position: 'fixed',
5725
5979
  bottom: neoDesign.spacing.spacing_2,
5726
5980
  right: neoDesign.spacing.spacing_4,
@@ -6025,6 +6279,55 @@ const NeoRadio = ({ size = 'medium', label, helperText, disabled, ...props }) =>
6025
6279
  };
6026
6280
  NeoRadio.displayName = 'NeoRadio';
6027
6281
 
6282
+ /**
6283
+ * NeoRadioButtonWithText
6284
+ *
6285
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=11565-7682
6286
+ */
6287
+ const NeoRadioButtonWithText = styles.styled('div')({});
6288
+
6289
+ // Box-breathing rhythm: appear (inhale) → hold → expand+fade (exhale) → rest.
6290
+ // Max scale is capped so the ring fits within a parent row's line-height.
6291
+ const ripple = material.keyframes `
6292
+ 0% { opacity: 0; transform: scale(0.7); }
6293
+ 20% { opacity: 0.9; transform: scale(0.7); }
6294
+ 35% { opacity: 0.9; transform: scale(0.7); }
6295
+ 80% { opacity: 0; transform: scale(1.7); }
6296
+ 100% { opacity: 0; transform: scale(0.7); }
6297
+ `;
6298
+ /**
6299
+ * NeoRipplingDot - Animated status dot with an expanding ripple ring.
6300
+ *
6301
+ * Indicates an in-progress, indeterminate state (RUNNING / SYNCING / PROCESSING).
6302
+ * Color is inherited from `currentColor`; set it via the `color`/`sx` prop or a
6303
+ * parent. Sized to the lowercase-letter height regardless of parent fontSize.
6304
+ */
6305
+ const NeoRipplingDot = props => (jsxRuntime.jsx(material.Box, { "aria-hidden": "true", ...props, style: {
6306
+ width: neoDesign.spacing.spacing_1,
6307
+ height: neoDesign.spacing.spacing_1,
6308
+ ...props.style,
6309
+ }, sx: {
6310
+ position: 'relative',
6311
+ display: 'inline-block',
6312
+ borderRadius: '50%',
6313
+ backgroundColor: 'currentColor',
6314
+ verticalAlign: 'middle',
6315
+ flexShrink: 0,
6316
+ '&::before': {
6317
+ content: '""',
6318
+ position: 'absolute',
6319
+ inset: '-25%',
6320
+ borderRadius: '50%',
6321
+ border: '1px solid currentColor',
6322
+ animation: `${ripple} 5.6s ease-in-out infinite`,
6323
+ '@media (prefers-reduced-motion: reduce)': {
6324
+ display: 'none',
6325
+ },
6326
+ },
6327
+ ...props.sx,
6328
+ } }));
6329
+ NeoRipplingDot.displayName = 'NeoRipplingDot';
6330
+
6028
6331
  const StyledSearchChip = styles.styled(InputBase)(({ theme }) => ({
6029
6332
  borderRadius: neoDesign.borderRadius.full,
6030
6333
  border: `1px solid ${neoDesign.semanticColors.buttons.secondary.defaultBorder}`,
@@ -6090,6 +6393,126 @@ const NeoSearchChip = ({ onClear, value, ...props }) => {
6090
6393
  };
6091
6394
  NeoSearchChip.displayName = 'NeoSearchChip';
6092
6395
 
6396
+ /**
6397
+ * NeoSelectField — composite of NeoInputField's form chrome (label,
6398
+ * helper text, error state) wrapped around NeoSelect. Mirrors the
6399
+ * MUI `<TextField select>` ergonomics with Neo design tokens, so
6400
+ * consumers don't have to compose the two manually.
6401
+ *
6402
+ * @example
6403
+ * <NeoSelectField
6404
+ * label="Response format"
6405
+ * value={format}
6406
+ * onChange={e => setFormat(e.target.value)}
6407
+ * options={[
6408
+ * { value: 'json', label: 'JSON' },
6409
+ * { value: 'plain', label: 'Plain text' },
6410
+ * ]}
6411
+ * />
6412
+ */
6413
+ const NeoSelectField = ({ size = 'medium', destructive = false, label, required = false, infoIcon, helperText, errorMessage, options, children, disabled, id, ...selectProps }) => {
6414
+ const inputId = id || `neo-select-${Math.random().toString(36).substring(7)}`;
6415
+ const helperTextId = helperText || errorMessage ? `${inputId}-helper-text` : undefined;
6416
+ return (jsxRuntime.jsxs(StyledFormControl, { size: size, error: destructive, disabled: disabled, children: [label && (jsxRuntime.jsxs(StyledInputLabel, { htmlFor: inputId, size: size, infoIcon: !!infoIcon, disabled: disabled, error: destructive, shrink: true, children: [label, required && jsxRuntime.jsx("span", { "aria-hidden": "true", children: "*" }), infoIcon && jsxRuntime.jsx(InfoIconWrapper, { children: infoIcon })] })), jsxRuntime.jsx(NeoSelect, { id: inputId, disabled: disabled, error: destructive, "aria-describedby": helperTextId, ...selectProps, children: children ??
6417
+ options?.map(opt => (jsxRuntime.jsx(NeoMenuItem, { value: opt.value, disabled: opt.disabled, children: opt.label }, String(opt.value)))) }), (helperText || errorMessage) && (jsxRuntime.jsx(StyledFormHelperText, { id: helperTextId, error: destructive, disabled: disabled, sx: { marginTop: `${neoDesign.spacing.spacing_3_4}px` }, children: destructive ? errorMessage : helperText }))] }));
6418
+ };
6419
+ NeoSelectField.displayName = 'NeoSelectField';
6420
+
6421
+ const EXPANDED_WIDTH = 98;
6422
+ const COLLAPSED_WIDTH = 56;
6423
+ // The fade overlay must end on the same color as the rail to blend cleanly.
6424
+ const RAIL_BACKGROUND = neoDesign.colors.grey[100];
6425
+ /**
6426
+ * NeoSideNav
6427
+ *
6428
+ * Collapsible vertical navigation rail with fixed `header`/`footer` slots and a
6429
+ * scrolling content area. Controlled via `collapsed` + `onCollapsedChange`;
6430
+ * broadcasts collapsed state to descendant `NeoNavigationItem`s through context.
6431
+ *
6432
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=4065-3425
6433
+ */
6434
+ const Root = styles.styled('nav', {
6435
+ shouldForwardProp: prop => prop !== 'collapsed',
6436
+ })(({ collapsed, theme }) => ({
6437
+ display: 'flex',
6438
+ flexDirection: 'column',
6439
+ height: '100%',
6440
+ width: collapsed ? COLLAPSED_WIDTH : EXPANDED_WIDTH,
6441
+ minWidth: collapsed ? COLLAPSED_WIDTH : EXPANDED_WIDTH,
6442
+ backgroundColor: RAIL_BACKGROUND,
6443
+ transition: theme.transitions.create(['width', 'min-width'], {
6444
+ duration: theme.transitions.duration.shorter,
6445
+ }),
6446
+ overflow: 'hidden',
6447
+ }));
6448
+ const Header = styles.styled('div')({
6449
+ flexShrink: 0,
6450
+ display: 'flex',
6451
+ flexDirection: 'column',
6452
+ alignItems: 'center',
6453
+ });
6454
+ const Scroll = styles.styled('div')({
6455
+ flex: 1,
6456
+ minHeight: 0,
6457
+ overflowY: 'auto',
6458
+ overflowX: 'hidden',
6459
+ display: 'flex',
6460
+ flexDirection: 'column',
6461
+ alignItems: 'center',
6462
+ gap: neoDesign.spacing.spacing_1_2,
6463
+ paddingInline: neoDesign.spacing.spacing_1,
6464
+ '&::-webkit-scrollbar': { width: neoDesign.spacing.spacing_1_2 },
6465
+ '&::-webkit-scrollbar-thumb': {
6466
+ backgroundColor: neoDesign.semanticColors.border.primary,
6467
+ borderRadius: neoDesign.borderRadius.xXS,
6468
+ },
6469
+ });
6470
+ const FooterRegion = styles.styled('div')({
6471
+ position: 'relative',
6472
+ flexShrink: 0,
6473
+ display: 'flex',
6474
+ flexDirection: 'column',
6475
+ alignItems: 'center',
6476
+ gap: neoDesign.spacing.spacing_1_2,
6477
+ paddingInline: neoDesign.spacing.spacing_1,
6478
+ paddingBottom: neoDesign.spacing.spacing_1,
6479
+ });
6480
+ // Gradient fade so scrolling items dissolve into the footer instead of butting against it.
6481
+ const Fade = styles.styled('div')({
6482
+ position: 'absolute',
6483
+ top: -neoDesign.spacing.spacing_3,
6484
+ left: 0,
6485
+ right: 0,
6486
+ height: neoDesign.spacing.spacing_3,
6487
+ pointerEvents: 'none',
6488
+ background: `linear-gradient(to bottom, transparent, ${RAIL_BACKGROUND})`,
6489
+ });
6490
+ const Toggle = styles.styled(ButtonBase)(({ theme }) => ({
6491
+ display: 'flex',
6492
+ alignItems: 'center',
6493
+ justifyContent: 'center',
6494
+ flexDirection: 'column',
6495
+ gap: neoDesign.spacing.spacing_1_2,
6496
+ width: '100%',
6497
+ paddingBlock: neoDesign.spacing.spacing_1,
6498
+ borderRadius: neoDesign.borderRadius.s,
6499
+ border: `1px solid ${neoDesign.semanticColors.border.secondary}`,
6500
+ color: neoDesign.semanticColors.typography.bodySecondary,
6501
+ fontFamily: neoDesign.typography.fontFamily.body,
6502
+ fontSize: theme.typography.pxToRem(11),
6503
+ lineHeight: 1,
6504
+ '&:hover': {
6505
+ color: neoDesign.semanticColors.typography.body,
6506
+ borderColor: neoDesign.semanticColors.border.primary,
6507
+ },
6508
+ }));
6509
+ function NeoSideNav({ collapsed, onCollapsedChange, header, footer, children, collapseLabel = 'Less', ...rest }) {
6510
+ const ToggleIcon = collapsed ? PanelLeftOpen : PanelLeftClose;
6511
+ const contextValue = React.useMemo(() => ({ collapsed }), [collapsed]);
6512
+ return (jsxRuntime.jsx(NeoSideNavContext.Provider, { value: contextValue, children: jsxRuntime.jsxs(Root, { collapsed: collapsed, ...rest, children: [header && jsxRuntime.jsx(Header, { children: header }), jsxRuntime.jsx(Scroll, { children: children }), jsxRuntime.jsxs(FooterRegion, { children: [jsxRuntime.jsx(Fade, {}), footer, jsxRuntime.jsxs(Toggle, { "data-testid": "neo-side-nav-toggle", "aria-label": collapsed ? 'Expand navigation' : 'Collapse navigation', disableRipple: true, onClick: () => onCollapsedChange(!collapsed), children: [jsxRuntime.jsx(ToggleIcon, { size: 18 }), !collapsed && jsxRuntime.jsx("span", { children: collapseLabel })] })] })] }) }));
6513
+ }
6514
+ NeoSideNav.displayName = 'NeoSideNav';
6515
+
6093
6516
  const StyledSkeleton = styles.styled(Skeleton, {
6094
6517
  shouldForwardProp: prop => prop !== 'colorTheme' && prop !== 'position',
6095
6518
  })(({ theme, colorTheme = 'light', position = 'start' }) => ({
@@ -6137,6 +6560,111 @@ const NeoSkeleton = ({ colorTheme = 'light', position = 'start', ...props }) =>
6137
6560
  };
6138
6561
  NeoSkeleton.displayName = 'NeoSkeleton';
6139
6562
 
6563
+ const sizePadding = {
6564
+ small: `${neoDesign.spacing.spacing_3_4}px ${neoDesign.spacing.spacing_1_1_2}px`,
6565
+ medium: `${neoDesign.spacing.spacing_1_1_2}px ${neoDesign.spacing.spacing_2}px`,
6566
+ };
6567
+ const sizeFontSize = {
6568
+ small: neoDesign.typography.fontSize.xs,
6569
+ medium: neoDesign.typography.fontSize.sm,
6570
+ };
6571
+ const StyledTable = styles.styled(MuiTable, {
6572
+ shouldForwardProp: prop => prop !== 'tableSize',
6573
+ })(({ theme, tableSize = 'small' }) => ({
6574
+ borderCollapse: 'separate',
6575
+ borderSpacing: 0,
6576
+ [`& .${TableCell.tableCellClasses.head}`]: {
6577
+ backgroundColor: neoDesign.colors.grey[50],
6578
+ color: neoDesign.semanticColors.typography.body,
6579
+ fontFamily: neoDesign.typography.fontFamily.body,
6580
+ fontSize: theme.typography.pxToRem(sizeFontSize[tableSize]),
6581
+ fontWeight: neoDesign.typography.fontWeight.semiBold,
6582
+ lineHeight: 1.4,
6583
+ padding: sizePadding[tableSize],
6584
+ borderBottom: `1px solid ${neoDesign.semanticColors.border.secondary}`,
6585
+ },
6586
+ [`& .${TableCell.tableCellClasses.body}`]: {
6587
+ color: neoDesign.semanticColors.typography.body,
6588
+ fontFamily: neoDesign.typography.fontFamily.body,
6589
+ fontSize: theme.typography.pxToRem(sizeFontSize[tableSize]),
6590
+ fontWeight: neoDesign.typography.fontWeight.regular,
6591
+ lineHeight: 1.4,
6592
+ padding: sizePadding[tableSize],
6593
+ borderBottom: `1px solid ${neoDesign.semanticColors.border.secondary}`,
6594
+ },
6595
+ // Drop the trailing row's bottom border so the container border (if
6596
+ // any) is the visual edge.
6597
+ [`& tbody tr:last-of-type .${TableCell.tableCellClasses.body}`]: {
6598
+ borderBottom: 'none',
6599
+ },
6600
+ }));
6601
+ const StyledContainer = styles.styled('div', {
6602
+ shouldForwardProp: prop => prop !== 'tableVariant',
6603
+ })(({ tableVariant = 'bordered' }) => tableVariant === 'bordered'
6604
+ ? {
6605
+ border: `1px solid ${neoDesign.semanticColors.border.secondary}`,
6606
+ borderRadius: neoDesign.borderRadius.card,
6607
+ overflow: 'hidden',
6608
+ backgroundColor: neoDesign.semanticColors.surfaces.white,
6609
+ }
6610
+ : { backgroundColor: 'transparent' });
6611
+ /**
6612
+ * NeoTable — lightweight read-only table for static data (schema rows,
6613
+ * key/value summaries, response metadata). For interactive grids with
6614
+ * sorting / filtering / pagination, use NeoDataGrid instead.
6615
+ *
6616
+ * @example
6617
+ * <NeoTable
6618
+ * columns={[
6619
+ * { key: 'name', header: 'Property' },
6620
+ * { key: 'type', header: 'Type', align: 'center', width: '120px' },
6621
+ * { key: 'description', header: 'Description' },
6622
+ * ]}
6623
+ * rows={[
6624
+ * { name: 'id', type: 'string', description: 'Resource identifier' },
6625
+ * { name: 'count', type: 'number', description: 'Item count' },
6626
+ * ]}
6627
+ * size="small"
6628
+ * />
6629
+ */
6630
+ const NeoTable = ({ columns, rows, size = 'small', variant = 'bordered', ariaLabel, ...tableProps }) => (jsxRuntime.jsx(StyledContainer, { tableVariant: variant, children: jsxRuntime.jsx(TableContainer, { children: jsxRuntime.jsxs(StyledTable, { tableSize: size, "aria-label": ariaLabel, ...tableProps, children: [jsxRuntime.jsx(TableHead, { children: jsxRuntime.jsx(TableRow, { children: columns.map(col => (jsxRuntime.jsx(TableCell, { align: col.align ?? 'left', style: col.width ? { width: col.width } : undefined, children: col.header }, col.key))) }) }), jsxRuntime.jsx(TableBody, { children: rows.map((row, i) => (jsxRuntime.jsx(TableRow, { children: columns.map(col => (jsxRuntime.jsx(TableCell, { align: col.align ?? 'left', children: row[col.key] ?? '' }, col.key))) }, i))) })] }) }) }));
6631
+ NeoTable.displayName = 'NeoTable';
6632
+
6633
+ const StyledTabPanel = styles.styled(Box, {
6634
+ shouldForwardProp: prop => prop !== 'tabPanelVariant',
6635
+ })(({ tabPanelVariant = 'default' }) => ({
6636
+ backgroundColor: neoDesign.semanticColors.surfaces.white,
6637
+ // default: 16px top padding for content-driven pages.
6638
+ // flush: zero padding so content sits directly against the tab bar's
6639
+ // bottom border (sidebars, panels, builders, canvases).
6640
+ padding: 0,
6641
+ ...(tabPanelVariant === 'flush' ? {} : { paddingTop: neoDesign.spacing.spacing_2 }),
6642
+ }));
6643
+ /**
6644
+ * NeoTabPanel — completes the NeoTabs + NeoTab + NeoTabPanel set.
6645
+ *
6646
+ * Lightweight ARIA-compliant tab panel that renders children when its
6647
+ * `value` matches `currentValue`. No MUI Lab / TabContext dependency.
6648
+ *
6649
+ * @example
6650
+ * const [tab, setTab] = useState('overview')
6651
+ * return (
6652
+ * <>
6653
+ * <NeoTabs value={tab} onChange={(_, v) => setTab(v)}>
6654
+ * <NeoTab value="overview" label="Overview" />
6655
+ * <NeoTab value="details" label="Details" />
6656
+ * </NeoTabs>
6657
+ * <NeoTabPanel value="overview" currentValue={tab}>...</NeoTabPanel>
6658
+ * <NeoTabPanel value="details" currentValue={tab} variant="flush">...</NeoTabPanel>
6659
+ * </>
6660
+ * )
6661
+ */
6662
+ const NeoTabPanel = ({ value, currentValue, variant = 'default', children, ...boxProps }) => {
6663
+ const selected = value === currentValue;
6664
+ return (jsxRuntime.jsx(StyledTabPanel, { role: "tabpanel", hidden: !selected, tabPanelVariant: variant, id: `tabpanel-${value}`, "aria-labelledby": `tab-${value}`, ...boxProps, children: selected ? children : null }));
6665
+ };
6666
+ NeoTabPanel.displayName = 'NeoTabPanel';
6667
+
6140
6668
  /**
6141
6669
  * NeoTabs - Tabs container component based on MUI Tabs
6142
6670
  *
@@ -6516,6 +7044,102 @@ const NeoToggle = ({ size = 'medium', label, helperText, disabled, ...props }) =
6516
7044
  };
6517
7045
  NeoToggle.displayName = 'NeoToggle';
6518
7046
 
7047
+ const sizeStyles = {
7048
+ small: {
7049
+ height: 24,
7050
+ fontSize: neoDesign.typography.fontSize.xs,
7051
+ },
7052
+ medium: {
7053
+ height: 32,
7054
+ fontSize: neoDesign.typography.fontSize.sm,
7055
+ },
7056
+ };
7057
+ const StyledToggleButton$1 = styles.styled(MuiToggleButton, {
7058
+ shouldForwardProp: prop => prop !== 'toggleSize',
7059
+ })(({ theme, toggleSize = 'medium' }) => ({
7060
+ height: sizeStyles[toggleSize].height,
7061
+ padding: `0 ${neoDesign.spacing.spacing_1_1_2}px`,
7062
+ fontFamily: neoDesign.typography.fontFamily.body,
7063
+ fontSize: theme.typography.pxToRem(sizeStyles[toggleSize].fontSize),
7064
+ fontWeight: neoDesign.typography.fontWeight.regular,
7065
+ lineHeight: 1,
7066
+ color: neoDesign.semanticColors.typography.bodySecondary,
7067
+ backgroundColor: 'transparent',
7068
+ border: 'none',
7069
+ textTransform: 'none',
7070
+ transition: theme.transitions.create(['background-color', 'color'], {
7071
+ duration: theme.transitions.duration.short,
7072
+ }),
7073
+ '&:hover': {
7074
+ backgroundColor: neoDesign.colors.grey[100],
7075
+ color: neoDesign.semanticColors.typography.body,
7076
+ },
7077
+ '&.Mui-selected, &.Mui-selected:hover': {
7078
+ backgroundColor: neoDesign.colors.grey[100],
7079
+ color: neoDesign.semanticColors.typography.body,
7080
+ fontWeight: neoDesign.typography.fontWeight.semiBold,
7081
+ },
7082
+ '&.Mui-focusVisible': {
7083
+ outline: `2px solid ${neoDesign.semanticColors.border.focus}`,
7084
+ outlineOffset: -2,
7085
+ },
7086
+ '&.Mui-disabled': {
7087
+ color: neoDesign.semanticColors.typography.button.disabled,
7088
+ cursor: 'default',
7089
+ pointerEvents: 'none',
7090
+ },
7091
+ }));
7092
+ /**
7093
+ * NeoToggleButton — a single button in a segmented control. Use inside
7094
+ * NeoToggleButtonGroup; the group manages selection state and forwards
7095
+ * size to its children. Suitable for inline toolbar mode switches
7096
+ * ("Table" / "Raw"). For page-level tabs, prefer NeoButtonTab.
7097
+ */
7098
+ const NeoToggleButton = ({ children, size = 'medium', ...props }) => (jsxRuntime.jsx(StyledToggleButton$1, { toggleSize: size, ...props, children: children }));
7099
+ NeoToggleButton.displayName = 'NeoToggleButton';
7100
+
7101
+ const StyledToggleButtonGroup$1 = styles.styled(MuiToggleButtonGroup)({
7102
+ borderRadius: neoDesign.borderRadius.button,
7103
+ border: `1px solid ${neoDesign.semanticColors.border.secondary}`,
7104
+ overflow: 'hidden',
7105
+ display: 'inline-flex',
7106
+ // Children fill the pill — first/last get the rounded corners, middles
7107
+ // are square. MUI applies positional classes via ToggleButtonGroup
7108
+ // context; we rely on borderRadius inheritance from the container.
7109
+ [`& .${MuiToggleButton.toggleButtonClasses.root}`]: {
7110
+ borderRadius: 0,
7111
+ },
7112
+ });
7113
+ /**
7114
+ * NeoToggleButtonGroup — pill-shaped segmented control wrapping
7115
+ * MUI ToggleButtonGroup with Neo tokens. Use for inline toolbar mode
7116
+ * switches (e.g. "Table" / "Raw" in a panel header). For page-level
7117
+ * tab navigation, prefer NeoButtonTabGroup.
7118
+ *
7119
+ * @example
7120
+ * <NeoToggleButtonGroup value={mode} exclusive onChange={(_, v) => v && setMode(v)} size="small">
7121
+ * <NeoToggleButton value="table">Table</NeoToggleButton>
7122
+ * <NeoToggleButton value="raw">Raw</NeoToggleButton>
7123
+ * </NeoToggleButtonGroup>
7124
+ */
7125
+ const NeoToggleButtonGroup = ({ size = 'medium', children, ...props }) => {
7126
+ // Forward size to each NeoToggleButton child so consumers don't have to
7127
+ // set it on every button. MUI's group already does this via context for
7128
+ // its own size prop, but our `size` shape doesn't pass through unchanged.
7129
+ const sized = React.Children.map(children, child => React.isValidElement(child) && child.type === NeoToggleButton
7130
+ ? React.cloneElement(child, { size })
7131
+ : child);
7132
+ return jsxRuntime.jsx(StyledToggleButtonGroup$1, { ...props, children: sized });
7133
+ };
7134
+ NeoToggleButtonGroup.displayName = 'NeoToggleButtonGroup';
7135
+
7136
+ /**
7137
+ * NeoToggleButtonWithText
7138
+ *
7139
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=11565-10485
7140
+ */
7141
+ const NeoToggleButtonWithText = styles.styled('div')({});
7142
+
6519
7143
  const StyledToolbar = styles.styled(xDataGrid.Toolbar)(({ theme }) => ({
6520
7144
  backgroundColor: neoDesign.semanticColors.surfaces.white,
6521
7145
  minHeight: 'auto',
@@ -6576,86 +7200,18 @@ const NeoToolbar = ({ children, ...props }) => {
6576
7200
  NeoToolbar.displayName = 'NeoToolbar';
6577
7201
 
6578
7202
  /**
6579
- * Variant color configuration
6580
- */
6581
- const variantConfig = {
6582
- light: {
6583
- backgroundColor: neoDesign.semanticColors.surfaces.tooltip, // #4b5563 - medium gray
6584
- color: neoDesign.semanticColors.typography.tooltip, // #ffffff - white
6585
- },
6586
- dark: {
6587
- backgroundColor: neoDesign.colors.grey[50], // #f9fafb - very light gray
6588
- color: neoDesign.colors.grey[800], // #1f2937 - dark gray
6589
- },
6590
- brand: {
6591
- backgroundColor: neoDesign.colors.digitalBlue[800], // #131e7a - dark blue
6592
- color: neoDesign.semanticColors.typography.tooltip, // #ffffff - white
6593
- },
6594
- };
6595
- /**
6596
- * Styled MUI Tooltip with Neo design system tokens
7203
+ * NeoTopNav
7204
+ *
7205
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=4618-185228
6597
7206
  */
6598
- const StyledTooltip = styles.styled(Tooltip, {
6599
- shouldForwardProp: prop => prop !== 'variant' && prop !== 'description',
6600
- })(({ variant = 'light', description }) => {
6601
- const hasDescription = Boolean(description);
6602
- const variantStyles = variantConfig[variant];
6603
- return {
6604
- // Style the tooltip content
6605
- [`& .${Tooltip.tooltipClasses.tooltip}`]: {
6606
- backgroundColor: variantStyles.backgroundColor,
6607
- color: variantStyles.color,
6608
- fontSize: neoDesign.typography.fontSize.xs,
6609
- fontWeight: neoDesign.typography.fontWeight.medium,
6610
- lineHeight: hasDescription ? 1.5 : 1,
6611
- borderRadius: hasDescription ? neoDesign.borderRadius.s : neoDesign.borderRadius.xS,
6612
- padding: hasDescription ? neoDesign.spacing.spacing_1_1_2 : `0 ${neoDesign.spacing.spacing_1}px`,
6613
- ...(hasDescription && {
6614
- maxWidth: 296,
6615
- }),
6616
- ...(!hasDescription && {
6617
- height: neoDesign.spacing.spacing_3_1_4,
6618
- display: 'flex',
6619
- alignItems: 'center',
6620
- justifyContent: 'center',
6621
- }),
6622
- boxShadow: `${neoDesign.shadows.neutral.medium.x}px ${neoDesign.shadows.neutral.medium.y}px ${neoDesign.shadows.neutral.medium.blur}px ${neoDesign.shadows.neutral.medium.spread}px ${neoDesign.shadows.neutral.medium.shadow}`,
6623
- },
6624
- // Style the arrow
6625
- [`& .${Tooltip.tooltipClasses.arrow}`]: {
6626
- color: variantStyles.backgroundColor,
6627
- },
6628
- };
6629
- });
7207
+ const NeoTopNav = styles.styled('div')({});
7208
+
6630
7209
  /**
6631
- * NeoTooltip - Tooltip component following Neo design system
7210
+ * NeoTourModal
6632
7211
  *
6633
- * Provides contextual information when users hover over or focus on an element.
6634
- * Supports three visual variants (light, dark, brand) and optional supporting text.
6635
- *
6636
- * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4091-26557&t=Bo58EpFmg6ILJtmv-11
6637
- *
6638
- * Figma Props Mapping:
6639
- * - Theme (Light mode|Dark mode|Brand color) → variant ('light'|'dark'|'brand')
6640
- * - Placement → arrow (boolean) + placement (top/bottom/left/right/etc)
6641
- * - Supporting text (True|False) → description (string|undefined)
6642
- * - text → title (string, literal content)
6643
- *
6644
- * Design Tokens Used:
6645
- * - Light: surfaces.tooltip (#4b5563), typography.tooltip (#ffffff)
6646
- * - Dark: grey[50] (#f9fafb), grey[800] (#1f2937)
6647
- * - Brand: digitalBlue[800] (#131e7a), typography.tooltip (#ffffff)
6648
- * - Shadow: neutralMedium (0px 8px 15px 0px rgba(31,41,55,0.1))
6649
- * - Typography: fontSize.xs (12), fontWeight.medium (500), fontWeight.semiBold (600)
7212
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=12408-1800
6650
7213
  */
6651
- const NeoTooltip = ({ variant = 'light', title, description, children, arrow = false, placement, ...props }) => {
6652
- // Build the title content
6653
- // If description is provided, create a structured layout with title + description
6654
- // Otherwise, just show the title text
6655
- const titleContent = description ? (jsxRuntime.jsxs(Stack, { gap: 0.25, children: [jsxRuntime.jsx(Typography, { fontWeight: neoDesign.typography.fontWeight.semiBold, children: title }), jsxRuntime.jsx(Typography, { fontWeight: neoDesign.typography.fontWeight.medium, children: description })] })) : (title);
6656
- return (jsxRuntime.jsx(StyledTooltip, { variant: variant, description: description, title: titleContent, arrow: arrow, placement: placement, ...props, children: children }));
6657
- };
6658
- NeoTooltip.displayName = 'NeoTooltip';
7214
+ const NeoTourModal = styles.styled('div')({});
6659
7215
 
6660
7216
  /**
6661
7217
  * Custom label component that reads extra slot data from the item model.
@@ -6853,6 +7409,39 @@ const NeoTypologyControl = ({ children, ...props }) => {
6853
7409
  };
6854
7410
  NeoTypologyControl.displayName = 'NeoTypologyControl';
6855
7411
 
7412
+ // Box-breathing rhythm: inhale (grow) → hold → exhale (shadow expand+fade) → rest.
7413
+ const vibrate = material.keyframes `
7414
+ 0% { transform: scale(0.9); box-shadow: 0 0 0 0 transparent; }
7415
+ 25% { transform: scale(1); box-shadow: 0 0 0 0 currentColor; }
7416
+ 50% { transform: scale(1); box-shadow: 0 0 0 0 currentColor; }
7417
+ 75% { transform: scale(0.9); box-shadow: 0 0 0 ${neoDesign.spacing.spacing_3_4}px transparent; }
7418
+ 100% { transform: scale(0.9); box-shadow: 0 0 0 0 transparent; }
7419
+ `;
7420
+ /**
7421
+ * NeoVibratingDot - Animated status dot with a breathing pulse halo.
7422
+ *
7423
+ * Indicates a waiting/pending state (QUEUED / CREATED). Color is inherited from
7424
+ * `currentColor`; set it via the `color`/`sx` prop or a parent. Sized to the
7425
+ * lowercase-letter height regardless of parent fontSize.
7426
+ */
7427
+ const NeoVibratingDot = props => (jsxRuntime.jsx(material.Box, { "aria-hidden": "true", ...props, style: {
7428
+ width: neoDesign.spacing.spacing_1,
7429
+ height: neoDesign.spacing.spacing_1,
7430
+ ...props.style,
7431
+ }, sx: {
7432
+ display: 'inline-block',
7433
+ borderRadius: '50%',
7434
+ backgroundColor: 'currentColor',
7435
+ verticalAlign: 'middle',
7436
+ flexShrink: 0,
7437
+ animation: `${vibrate} 5.6s ease-in-out infinite`,
7438
+ '@media (prefers-reduced-motion: reduce)': {
7439
+ animation: 'none',
7440
+ },
7441
+ ...props.sx,
7442
+ } }));
7443
+ NeoVibratingDot.displayName = 'NeoVibratingDot';
7444
+
6856
7445
  /**
6857
7446
  * @moderneinc/neo-styled-components
6858
7447
  *
@@ -6874,6 +7463,7 @@ exports.NeoBreadcrumbs = NeoBreadcrumbs;
6874
7463
  exports.NeoButton = NeoButton;
6875
7464
  exports.NeoButtonTab = NeoButtonTab;
6876
7465
  exports.NeoButtonTabGroup = NeoButtonTabGroup;
7466
+ exports.NeoCanceledIcon = NeoCanceledIcon;
6877
7467
  exports.NeoCard = NeoCard;
6878
7468
  exports.NeoCheckbox = NeoCheckbox;
6879
7469
  exports.NeoCheckboxWithText = NeoCheckboxWithText;
@@ -6890,6 +7480,8 @@ exports.NeoDataGridFiltersButton = NeoDataGridFiltersButton;
6890
7480
  exports.NeoDataGridHeaderLabel = NeoDataGridHeaderLabel;
6891
7481
  exports.NeoDataGridSelect = NeoSelect;
6892
7482
  exports.NeoDatePicker = NeoDatePicker;
7483
+ exports.NeoDatePickerListItem = NeoDatePickerListItem;
7484
+ exports.NeoDatePickerMenu = NeoDatePickerMenu;
6893
7485
  exports.NeoDivider = NeoDivider;
6894
7486
  exports.NeoDot = NeoDot;
6895
7487
  exports.NeoDownloadToast = NeoDownloadToast;
@@ -6897,6 +7489,13 @@ exports.NeoDropdown = NeoSelect;
6897
7489
  exports.NeoDropdownMenu = NeoMenu;
6898
7490
  exports.NeoDropdownMenuItem = NeoMenuItem;
6899
7491
  exports.NeoDropdownOption = NeoMenuItem;
7492
+ exports.NeoFilledCanceled = NeoFilledCanceled;
7493
+ exports.NeoFilledError = NeoFilledError;
7494
+ exports.NeoFilledInfo = NeoFilledInfo;
7495
+ exports.NeoFilledNeutral = NeoFilledNeutral;
7496
+ exports.NeoFilledQueued = NeoFilledQueued;
7497
+ exports.NeoFilledSuccess = NeoFilledSuccess;
7498
+ exports.NeoFilledWarning = NeoFilledWarning;
6900
7499
  exports.NeoFilterChip = NeoFilterChip;
6901
7500
  exports.NeoFooter = NeoFooter;
6902
7501
  exports.NeoGeneralAvatar = NeoGeneralAvatar;
@@ -6924,25 +7523,37 @@ exports.NeoProgressCell = NeoProgressCell;
6924
7523
  exports.NeoProgressbar = NeoProgressbar;
6925
7524
  exports.NeoQuickFilter = NeoQuickFilter;
6926
7525
  exports.NeoRadio = NeoRadio;
7526
+ exports.NeoRadioButtonWithText = NeoRadioButtonWithText;
7527
+ exports.NeoRipplingDot = NeoRipplingDot;
6927
7528
  exports.NeoSearchChip = NeoSearchChip;
6928
7529
  exports.NeoSelect = NeoSelect;
7530
+ exports.NeoSelectField = NeoSelectField;
6929
7531
  exports.NeoSelectOption = NeoMenuItem;
7532
+ exports.NeoSideNav = NeoSideNav;
6930
7533
  exports.NeoSkeleton = NeoSkeleton;
6931
7534
  exports.NeoStatusBadgeCell = NeoStatusBadgeCell;
6932
7535
  exports.NeoStatusCell = NeoStatusCell;
6933
7536
  exports.NeoTab = NeoTab;
7537
+ exports.NeoTabPanel = NeoTabPanel;
7538
+ exports.NeoTable = NeoTable;
6934
7539
  exports.NeoTabs = NeoTabs;
6935
7540
  exports.NeoTag = NeoTag;
6936
7541
  exports.NeoToast = NeoToast;
6937
7542
  exports.NeoToastButton = NeoToastButton;
6938
7543
  exports.NeoToggle = NeoToggle;
7544
+ exports.NeoToggleButton = NeoToggleButton;
7545
+ exports.NeoToggleButtonGroup = NeoToggleButtonGroup;
7546
+ exports.NeoToggleButtonWithText = NeoToggleButtonWithText;
6939
7547
  exports.NeoToolbar = NeoToolbar;
6940
7548
  exports.NeoTooltip = NeoTooltip;
7549
+ exports.NeoTopNav = NeoTopNav;
7550
+ exports.NeoTourModal = NeoTourModal;
6941
7551
  exports.NeoTreeItem = NeoTreeItem;
6942
7552
  exports.NeoTreeView = NeoTreeView;
6943
7553
  exports.NeoTypologyButton = StyledToggleButton;
6944
7554
  exports.NeoTypologyControl = NeoTypologyControl;
6945
7555
  exports.NeoUserAvatarCell = NeoUserAvatarCell;
7556
+ exports.NeoVibratingDot = NeoVibratingDot;
6946
7557
  exports.SortedAscendingIcon = SortedAscendingIcon;
6947
7558
  exports.SortedDescendingIcon = SortedDescendingIcon;
6948
7559
  exports.UnsortedIcon = UnsortedIcon;