@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.
- package/dist/Alert/Alert.d.ts +15 -1
- package/dist/Badge/Badge.d.ts +16 -2
- package/dist/Breadcrumbs/Breadcrumbs.d.ts +0 -10
- package/dist/CanceledIcon/CanceledIcon.d.ts +11 -0
- package/dist/Checkbox/Checkbox.d.ts +5 -4
- package/dist/DatePickerListItem/DatePickerListItem.d.ts +2 -22
- package/dist/DatePickerMenu/DatePickerMenu.d.ts +2 -22
- package/dist/Dot/Dot.d.ts +11 -4
- package/dist/FilledStatusIcons/FilledStatusIcons.d.ts +41 -0
- package/dist/GeneralAvatar/GeneralAvatar.d.ts +1 -7
- package/dist/InputField/InputField.d.ts +12 -1
- package/dist/ListItemButton/ListItemButton.d.ts +12 -1
- package/dist/MenuItem/MenuItem.d.ts +31 -9
- package/dist/NavigationAvatar/NavigationAvatar.d.ts +1 -1
- package/dist/NavigationItem/NavigationItem.d.ts +21 -2
- package/dist/NeoAvatarCell/NeoAvatarCell.d.ts +1 -3
- package/dist/PageContent/PageContent.d.ts +12 -1
- package/dist/RadioButtonWithText/RadioButtonWithText.d.ts +2 -22
- package/dist/RipplingDot/RipplingDot.d.ts +12 -0
- package/dist/SelectField/SelectField.d.ts +64 -0
- package/dist/SideNav/NeoSideNavContext.d.ts +5 -0
- package/dist/SideNav/SideNav.d.ts +18 -25
- package/dist/TabPanel/TabPanel.d.ts +47 -0
- package/dist/Table/Table.d.ts +64 -0
- package/dist/Tabs/Tabs.d.ts +1 -1
- package/dist/Tag/Tag.d.ts +1 -2
- package/dist/ToggleButton/ToggleButton.d.ts +13 -18
- package/dist/ToggleButtonGroup/ToggleButtonGroup.d.ts +26 -0
- package/dist/ToggleButtonWithText/ToggleButtonWithText.d.ts +2 -22
- package/dist/Tooltip/Tooltip.d.ts +8 -5
- package/dist/TopNav/TopNav.d.ts +2 -22
- package/dist/TourModal/TourModal.d.ts +2 -22
- package/dist/TypologyControl/TypologyControl.d.ts +1 -1
- package/dist/VibratingDot/VibratingDot.d.ts +12 -0
- package/dist/index.d.ts +533 -106
- package/dist/index.esm.js +1042 -453
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1060 -449
- package/dist/index.js.map +1 -1
- package/dist/utils/colorHelpers.d.ts +6 -0
- package/package.json +5 -5
- 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
|
|
68
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
160
|
-
*
|
|
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
|
|
163
|
-
|
|
164
|
-
|
|
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.
|
|
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 !== '
|
|
189
|
-
})(({ theme, avatarSize,
|
|
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
|
|
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',
|
|
215
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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$
|
|
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$
|
|
609
|
+
const ArrowDown = createLucideIcon("arrow-down", __iconNode$p);
|
|
616
610
|
|
|
617
611
|
/**
|
|
618
|
-
* @license lucide-react v1.
|
|
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$
|
|
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$
|
|
623
|
+
const ArrowUp = createLucideIcon("arrow-up", __iconNode$o);
|
|
630
624
|
|
|
631
625
|
/**
|
|
632
|
-
* @license lucide-react v1.
|
|
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$
|
|
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$
|
|
644
|
+
const BadgeInfo = createLucideIcon("badge-info", __iconNode$n);
|
|
651
645
|
|
|
652
646
|
/**
|
|
653
|
-
* @license lucide-react v1.
|
|
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$
|
|
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$
|
|
666
|
+
const CalendarDays = createLucideIcon("calendar-days", __iconNode$m);
|
|
673
667
|
|
|
674
668
|
/**
|
|
675
|
-
* @license lucide-react v1.
|
|
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$
|
|
683
|
-
const ChevronDown = createLucideIcon("chevron-down", __iconNode$
|
|
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.
|
|
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$
|
|
694
|
-
const ChevronLeft = createLucideIcon("chevron-left", __iconNode$
|
|
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.
|
|
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$
|
|
705
|
-
const ChevronRight = createLucideIcon("chevron-right", __iconNode$
|
|
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.
|
|
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$
|
|
716
|
-
const ChevronUp = createLucideIcon("chevron-up", __iconNode$
|
|
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.
|
|
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$
|
|
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$
|
|
724
|
+
const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$h);
|
|
731
725
|
|
|
732
726
|
/**
|
|
733
|
-
* @license lucide-react v1.
|
|
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$
|
|
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$
|
|
739
|
+
const CircleAlert = createLucideIcon("circle-alert", __iconNode$g);
|
|
746
740
|
|
|
747
741
|
/**
|
|
748
|
-
* @license lucide-react v1.
|
|
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$
|
|
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$
|
|
753
|
+
const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$f);
|
|
760
754
|
|
|
761
755
|
/**
|
|
762
|
-
* @license lucide-react v1.
|
|
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$
|
|
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$
|
|
768
|
+
const CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode$e);
|
|
775
769
|
|
|
776
770
|
/**
|
|
777
|
-
* @license lucide-react v1.
|
|
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$
|
|
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$
|
|
783
|
+
const Columns3 = createLucideIcon("columns-3", __iconNode$d);
|
|
790
784
|
|
|
791
785
|
/**
|
|
792
|
-
* @license lucide-react v1.
|
|
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$
|
|
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$
|
|
798
|
+
const ListFilter = createLucideIcon("list-filter", __iconNode$c);
|
|
805
799
|
|
|
806
800
|
/**
|
|
807
|
-
* @license lucide-react v1.
|
|
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$
|
|
815
|
-
const Minus = createLucideIcon("minus", __iconNode$
|
|
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.
|
|
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$
|
|
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$
|
|
853
|
+
const Plus = createLucideIcon("plus", __iconNode$8);
|
|
830
854
|
|
|
831
855
|
/**
|
|
832
|
-
* @license lucide-react v1.
|
|
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$
|
|
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$
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
997
|
+
const messageColor = isFilled
|
|
998
|
+
? neoDesign.semanticColors.typography.tooltip
|
|
999
|
+
: neoDesign.semanticColors.typography.body;
|
|
932
1000
|
return {
|
|
933
|
-
|
|
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
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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:
|
|
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.
|
|
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.
|
|
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
|
-
//
|
|
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, //
|
|
1822
|
+
borderRadius: neoDesign.borderRadius.xXS, // focus-ring radius (small)
|
|
1749
1823
|
},
|
|
1750
1824
|
medium: {
|
|
1751
1825
|
size: 20,
|
|
1752
|
-
borderRadius: neoDesign.borderRadius.xS, //
|
|
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
|
-
//
|
|
1765
|
-
|
|
1766
|
-
'
|
|
1767
|
-
backgroundColor: 'transparent',
|
|
1768
|
-
},
|
|
1838
|
+
// Suppress MUI's grey hover background
|
|
1839
|
+
'&:hover': {
|
|
1840
|
+
backgroundColor: 'transparent',
|
|
1769
1841
|
},
|
|
1770
|
-
//
|
|
1771
|
-
[
|
|
1772
|
-
|
|
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
|
|
1846
|
+
// Checked / Indeterminate — primary blue outline + mark
|
|
1776
1847
|
[`&.${Checkbox.checkboxClasses.checked}`]: {
|
|
1777
|
-
color: neoDesign.
|
|
1848
|
+
color: neoDesign.colors.digitalBlue[600],
|
|
1778
1849
|
},
|
|
1779
|
-
// Indeterminate state
|
|
1780
1850
|
[`&.${Checkbox.checkboxClasses.indeterminate}`]: {
|
|
1781
|
-
color: neoDesign.
|
|
1851
|
+
color: neoDesign.colors.digitalBlue[600],
|
|
1782
1852
|
},
|
|
1783
|
-
// Disabled
|
|
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
|
-
|
|
1857
|
+
opacity: 0.4,
|
|
1786
1858
|
cursor: 'not-allowed',
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
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
|
-
//
|
|
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
|
-
//
|
|
1858
|
-
const defaultIcon = icon || jsxRuntime.jsx(
|
|
1859
|
-
const defaultCheckedIcon = checkedIcon || jsxRuntime.jsx(
|
|
1860
|
-
const defaultIndeterminateIcon = indeterminateIcon || jsxRuntime.jsx(
|
|
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
|
-
|
|
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-
|
|
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
|
-
|
|
2256
|
-
return (jsxRuntime.jsx(StyledMenuItem, { ...
|
|
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
|
-
|
|
2542
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
3877
|
+
const StyledDot = styles.styled('span', {
|
|
3878
|
+
shouldForwardProp: prop => prop !== 'ownerState',
|
|
3879
|
+
})(({ ownerState }) => {
|
|
3773
3880
|
const size = sizeMap[ownerState.size];
|
|
3774
|
-
const
|
|
3881
|
+
const palette = neoDesign.semanticColors.status[ownerState.color];
|
|
3775
3882
|
return {
|
|
3776
|
-
|
|
3777
|
-
|
|
3778
|
-
|
|
3779
|
-
|
|
3780
|
-
|
|
3781
|
-
|
|
3782
|
-
|
|
3783
|
-
|
|
3784
|
-
|
|
3785
|
-
|
|
3786
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
4792
|
-
|
|
4793
|
-
|
|
4794
|
-
|
|
4795
|
-
|
|
4796
|
-
|
|
4797
|
-
|
|
4798
|
-
|
|
4799
|
-
|
|
4800
|
-
|
|
4801
|
-
|
|
4802
|
-
|
|
4803
|
-
|
|
4804
|
-
|
|
4805
|
-
|
|
4806
|
-
|
|
4807
|
-
|
|
4808
|
-
|
|
4809
|
-
|
|
4810
|
-
|
|
4811
|
-
|
|
4812
|
-
|
|
4813
|
-
|
|
4814
|
-
|
|
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
|
-
[
|
|
4831
|
-
|
|
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
|
-
[
|
|
4834
|
-
|
|
4961
|
+
[`&.${ListItemButton.listItemButtonClasses.focusVisible}`]: {
|
|
4962
|
+
outline: `2px solid ${neoDesign.semanticColors.border.focus}`,
|
|
4963
|
+
outlineOffset: -2,
|
|
4835
4964
|
},
|
|
4836
|
-
[
|
|
4965
|
+
[`&.${ListItemButton.listItemButtonClasses.disabled}`]: {
|
|
4837
4966
|
color: neoDesign.semanticColors.typography.button.disabled,
|
|
4967
|
+
opacity: 1,
|
|
4838
4968
|
},
|
|
4839
|
-
}
|
|
4840
|
-
|
|
4841
|
-
|
|
4842
|
-
|
|
4843
|
-
|
|
4844
|
-
|
|
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
|
-
|
|
4847
|
-
|
|
4848
|
-
}
|
|
4849
|
-
|
|
4850
|
-
|
|
4851
|
-
|
|
4852
|
-
|
|
4853
|
-
|
|
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
|
-
|
|
4857
|
-
|
|
4858
|
-
|
|
4859
|
-
|
|
4860
|
-
|
|
4861
|
-
|
|
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
|
-
|
|
4864
|
-
|
|
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
|
-
|
|
4867
|
-
|
|
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 = ({
|
|
5173
|
-
return (jsxRuntime.jsx(NavigationAvatarContainer, { children: jsxRuntime.jsx(NeoGeneralAvatar, { size: "small",
|
|
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.
|
|
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
|
-
|
|
5468
|
+
outline: 'none',
|
|
5202
5469
|
},
|
|
5203
5470
|
'&:focus-visible .neo-nav-icon-padding': {
|
|
5204
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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
|
|
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
|
|
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
|
-
|
|
5580
|
-
fontWeight: neoDesign.typography.fontWeight.medium,
|
|
5829
|
+
...neoDesign.semanticTypography.titles.pageHeader,
|
|
5581
5830
|
lineHeight: 1.4,
|
|
5582
|
-
color: neoDesign.colors.grey['900'],
|
|
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
|
-
*
|
|
6580
|
-
|
|
6581
|
-
|
|
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
|
|
6599
|
-
|
|
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
|
-
*
|
|
7210
|
+
* NeoTourModal
|
|
6632
7211
|
*
|
|
6633
|
-
*
|
|
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
|
|
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;
|