@moderneinc/neo-styled-components 5.0.0-next.4ea0b0 → 5.0.0-next.6d9b3b

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.
@@ -39,6 +39,12 @@ export interface NeoAlertProps extends Omit<AlertProps, 'severity' | 'variant' |
39
39
  * Optional action element (typically a button) displayed on the right
40
40
  */
41
41
  action?: ReactNode;
42
+ /**
43
+ * Optional content rendered below the title inside the alert container.
44
+ * Use for rich content like stack traces or code blocks. When present,
45
+ * the alert expands to auto height and top-aligns its icon and action.
46
+ */
47
+ children?: ReactNode;
42
48
  }
43
49
  /**
44
50
  * NeoAlert - Alert component for displaying contextual status messages
@@ -52,7 +58,7 @@ export interface NeoAlertProps extends Omit<AlertProps, 'severity' | 'variant' |
52
58
  * - Show Button → action prop presence
53
59
  */
54
60
  export declare const NeoAlert: {
55
- ({ intent, type, size, title, description, icon, action, ...props }: NeoAlertProps): import("react/jsx-runtime").JSX.Element;
61
+ ({ intent, type, size, title, description, icon, action, children, ...props }: NeoAlertProps): import("react/jsx-runtime").JSX.Element;
56
62
  displayName: string;
57
63
  };
58
64
  export {};
@@ -3,16 +3,6 @@ import type { ElementType, ReactNode } from 'react';
3
3
  /**
4
4
  * NeoBreadcrumbs - Navigation breadcrumb component
5
5
  *
6
- * Figma Mapping:
7
- * - Base component uses MuiBreadcrumbs with custom styled Links
8
- * - Uses chevron separator (ChevronRight from lucide-react)
9
- * - Typography: 14px Medium (500 weight)
10
- * - Colors:
11
- * - Non-current: semanticColors.typography.bodySecondary (#6b7280)
12
- * - Current: semanticColors.buttons.primary.default (#2f42ff)
13
- * - Hover: semanticColors.icons.hover (#1f2937) or buttons.tertiary.hover (#1e2ec2)
14
- * - Focus: 2px outline with buttons.primary.focus
15
- *
16
6
  * @see https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4563-122872
17
7
  */
18
8
  export interface NeoBreadcrumbsProps {
package/dist/Dot/Dot.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- import { type BadgeProps } from '@mui/material/Badge';
1
+ import type { HTMLAttributes, ReactNode } from 'react';
2
2
  type DotSize = 'small' | 'medium' | 'large';
3
3
  type DotVariant = 'solid' | 'outline';
4
4
  type DotColor = 'success' | 'error' | 'warning' | 'info' | 'neutral';
5
- export interface NeoDotProps extends Omit<BadgeProps, 'variant' | 'color' | 'badgeContent' | 'children'> {
5
+ export interface NeoDotProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {
6
6
  /**
7
7
  * The size of the dot
8
8
  * @default "medium"
@@ -18,9 +18,16 @@ export interface NeoDotProps extends Omit<BadgeProps, 'variant' | 'color' | 'bad
18
18
  * @default "neutral"
19
19
  */
20
20
  color?: DotColor;
21
+ /**
22
+ * Optional icon rendered centered inside the dot. Use to indicate intent within
23
+ * the dot itself (e.g., a minus icon on a disconnected error dot). SVG children
24
+ * using `currentColor` inherit a white stroke/fill for contrast against the
25
+ * colored background, and are scaled to 70% of the dot size.
26
+ */
27
+ children?: ReactNode;
21
28
  }
22
29
  /**
23
- * NeoDot - Status indicator dot component based on MUI Badge
30
+ * NeoDot - Status indicator dot.
24
31
  *
25
32
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4163-3577
26
33
  *
@@ -30,7 +37,7 @@ export interface NeoDotProps extends Omit<BadgeProps, 'variant' | 'color' | 'bad
30
37
  * - Color is configurable via color prop (success|error|warning|info|neutral)
31
38
  */
32
39
  export declare const NeoDot: {
33
- ({ size, variant, color, ...props }: NeoDotProps): import("react/jsx-runtime").JSX.Element;
40
+ ({ size, variant, color, children, ...props }: NeoDotProps): import("react/jsx-runtime").JSX.Element;
34
41
  displayName: string;
35
42
  };
36
43
  export {};
@@ -7,12 +7,6 @@ export interface NeoGeneralAvatarProps extends Omit<AvatarProps, 'variant'> {
7
7
  * @figma Size
8
8
  */
9
9
  size?: AvatarSize;
10
- /**
11
- * Color index for initials background (1-7). Use 0 or omit for image mode.
12
- * @default 0
13
- * @figma Color Index
14
- */
15
- colorIndex?: number;
16
10
  }
17
11
  /**
18
12
  * NeoGeneralAvatar - Avatar with image or colored initials display
@@ -20,7 +14,7 @@ export interface NeoGeneralAvatarProps extends Omit<AvatarProps, 'variant'> {
20
14
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=9600-185
21
15
  */
22
16
  export declare const NeoGeneralAvatar: {
23
- ({ size, colorIndex, children, ...props }: NeoGeneralAvatarProps): import("react/jsx-runtime").JSX.Element;
17
+ ({ size, alt, children, ...props }: NeoGeneralAvatarProps): import("react/jsx-runtime").JSX.Element;
24
18
  displayName: string;
25
19
  };
26
20
  export {};
@@ -10,6 +10,6 @@ export interface NeoNavigationAvatarProps extends Omit<NeoGeneralAvatarProps, 's
10
10
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=11325-102
11
11
  */
12
12
  export declare const NeoNavigationAvatar: {
13
- ({ colorIndex, children, ...props }: NeoNavigationAvatarProps): import("react/jsx-runtime").JSX.Element;
13
+ ({ children, ...props }: NeoNavigationAvatarProps): import("react/jsx-runtime").JSX.Element;
14
14
  displayName: string;
15
15
  };
@@ -5,14 +5,12 @@ type NeoAvatarCellEmpty = NeoAvatarCellBase & {
5
5
  empty: true;
6
6
  name?: never;
7
7
  src?: never;
8
- colorIndex?: never;
9
8
  label?: never;
10
9
  };
11
10
  type NeoAvatarCellContent = NeoAvatarCellBase & {
12
11
  empty?: false;
13
12
  name?: string;
14
13
  src?: string;
15
- colorIndex?: number;
16
14
  label?: string;
17
15
  };
18
16
  export type NeoAvatarCellProps = NeoAvatarCellEmpty | NeoAvatarCellContent;
@@ -21,7 +19,7 @@ export type NeoAvatarCellProps = NeoAvatarCellEmpty | NeoAvatarCellContent;
21
19
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=13425-1725
22
20
  */
23
21
  export declare const NeoAvatarCell: {
24
- ({ name, src, colorIndex, label, disabled, empty, }: NeoAvatarCellProps): import("react/jsx-runtime").JSX.Element;
22
+ ({ name, src, label, disabled, empty, }: NeoAvatarCellProps): import("react/jsx-runtime").JSX.Element;
25
23
  displayName: string;
26
24
  };
27
25
  export {};
package/dist/index.d.ts CHANGED
@@ -16,7 +16,6 @@ import * as _mui_material_styles from '@mui/material/styles';
16
16
  import { SxProps, Theme, Breakpoint } from '@mui/material/styles';
17
17
  import { DividerProps } from '@mui/material/Divider';
18
18
  import { PaperProps } from '@mui/material/Paper';
19
- import { BadgeProps } from '@mui/material/Badge';
20
19
  import { AvatarProps } from '@mui/material/Avatar';
21
20
  import { InputBaseProps } from '@mui/material/InputBase';
22
21
  import { MenuProps } from '@mui/material/Menu';
@@ -26,7 +25,7 @@ import { BoxProps } from '@mui/material/Box';
26
25
  import { LinearProgressProps } from '@mui/material/LinearProgress';
27
26
  import { RadioProps } from '@mui/material/Radio';
28
27
  import * as _mui_system from '@mui/system';
29
- import { SelectProps } from '@mui/material/Select';
28
+ import { SelectProps, SelectChangeEvent } from '@mui/material/Select';
30
29
  import { SkeletonProps } from '@mui/material/Skeleton';
31
30
  import { TableProps } from '@mui/material/Table';
32
31
  import * as _mui_material_OverridableComponent from '@mui/material/OverridableComponent';
@@ -390,16 +389,6 @@ declare const NeoBanner: {
390
389
  /**
391
390
  * NeoBreadcrumbs - Navigation breadcrumb component
392
391
  *
393
- * Figma Mapping:
394
- * - Base component uses MuiBreadcrumbs with custom styled Links
395
- * - Uses chevron separator (ChevronRight from lucide-react)
396
- * - Typography: 14px Medium (500 weight)
397
- * - Colors:
398
- * - Non-current: semanticColors.typography.bodySecondary (#6b7280)
399
- * - Current: semanticColors.buttons.primary.default (#2f42ff)
400
- * - Hover: semanticColors.icons.hover (#1f2937) or buttons.tertiary.hover (#1e2ec2)
401
- * - Focus: 2px outline with buttons.primary.focus
402
- *
403
392
  * @see https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4563-122872
404
393
  */
405
394
  interface NeoBreadcrumbsProps {
@@ -1083,14 +1072,12 @@ type NeoAvatarCellEmpty = NeoAvatarCellBase & {
1083
1072
  empty: true;
1084
1073
  name?: never;
1085
1074
  src?: never;
1086
- colorIndex?: never;
1087
1075
  label?: never;
1088
1076
  };
1089
1077
  type NeoAvatarCellContent = NeoAvatarCellBase & {
1090
1078
  empty?: false;
1091
1079
  name?: string;
1092
1080
  src?: string;
1093
- colorIndex?: number;
1094
1081
  label?: string;
1095
1082
  };
1096
1083
  type NeoAvatarCellProps = NeoAvatarCellEmpty | NeoAvatarCellContent;
@@ -1099,7 +1086,7 @@ type NeoAvatarCellProps = NeoAvatarCellEmpty | NeoAvatarCellContent;
1099
1086
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=13425-1725
1100
1087
  */
1101
1088
  declare const NeoAvatarCell: {
1102
- ({ name, src, colorIndex, label, disabled, empty, }: NeoAvatarCellProps): react_jsx_runtime.JSX.Element;
1089
+ ({ name, src, label, disabled, empty, }: NeoAvatarCellProps): react_jsx_runtime.JSX.Element;
1103
1090
  displayName: string;
1104
1091
  };
1105
1092
 
@@ -1424,7 +1411,7 @@ declare const NeoDownloadToast: {
1424
1411
  type DotSize = 'small' | 'medium' | 'large';
1425
1412
  type DotVariant = 'solid' | 'outline';
1426
1413
  type DotColor = 'success' | 'error' | 'warning' | 'info' | 'neutral';
1427
- interface NeoDotProps extends Omit<BadgeProps, 'variant' | 'color' | 'badgeContent' | 'children'> {
1414
+ interface NeoDotProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {
1428
1415
  /**
1429
1416
  * The size of the dot
1430
1417
  * @default "medium"
@@ -1440,9 +1427,16 @@ interface NeoDotProps extends Omit<BadgeProps, 'variant' | 'color' | 'badgeConte
1440
1427
  * @default "neutral"
1441
1428
  */
1442
1429
  color?: DotColor;
1430
+ /**
1431
+ * Optional icon rendered centered inside the dot. Use to indicate intent within
1432
+ * the dot itself (e.g., a minus icon on a disconnected error dot). SVG children
1433
+ * using `currentColor` inherit a white stroke/fill for contrast against the
1434
+ * colored background, and are scaled to 70% of the dot size.
1435
+ */
1436
+ children?: ReactNode;
1443
1437
  }
1444
1438
  /**
1445
- * NeoDot - Status indicator dot component based on MUI Badge
1439
+ * NeoDot - Status indicator dot.
1446
1440
  *
1447
1441
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4163-3577
1448
1442
  *
@@ -1452,7 +1446,7 @@ interface NeoDotProps extends Omit<BadgeProps, 'variant' | 'color' | 'badgeConte
1452
1446
  * - Color is configurable via color prop (success|error|warning|info|neutral)
1453
1447
  */
1454
1448
  declare const NeoDot: {
1455
- ({ size, variant, color, ...props }: NeoDotProps): react_jsx_runtime.JSX.Element;
1449
+ ({ size, variant, color, children, ...props }: NeoDotProps): react_jsx_runtime.JSX.Element;
1456
1450
  displayName: string;
1457
1451
  };
1458
1452
 
@@ -1506,12 +1500,6 @@ interface NeoGeneralAvatarProps extends Omit<AvatarProps, 'variant'> {
1506
1500
  * @figma Size
1507
1501
  */
1508
1502
  size?: AvatarSize;
1509
- /**
1510
- * Color index for initials background (1-7). Use 0 or omit for image mode.
1511
- * @default 0
1512
- * @figma Color Index
1513
- */
1514
- colorIndex?: number;
1515
1503
  }
1516
1504
  /**
1517
1505
  * NeoGeneralAvatar - Avatar with image or colored initials display
@@ -1519,7 +1507,7 @@ interface NeoGeneralAvatarProps extends Omit<AvatarProps, 'variant'> {
1519
1507
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=9600-185
1520
1508
  */
1521
1509
  declare const NeoGeneralAvatar: {
1522
- ({ size, colorIndex, children, ...props }: NeoGeneralAvatarProps): react_jsx_runtime.JSX.Element;
1510
+ ({ size, alt, children, ...props }: NeoGeneralAvatarProps): react_jsx_runtime.JSX.Element;
1523
1511
  displayName: string;
1524
1512
  };
1525
1513
 
@@ -1852,7 +1840,7 @@ interface NeoNavigationAvatarProps extends Omit<NeoGeneralAvatarProps, 'size'> {
1852
1840
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=11325-102
1853
1841
  */
1854
1842
  declare const NeoNavigationAvatar: {
1855
- ({ colorIndex, children, ...props }: NeoNavigationAvatarProps): react_jsx_runtime.JSX.Element;
1843
+ ({ children, ...props }: NeoNavigationAvatarProps): react_jsx_runtime.JSX.Element;
1856
1844
  displayName: string;
1857
1845
  };
1858
1846
 
@@ -2370,6 +2358,8 @@ declare const NeoSelectField: {
2370
2358
  displayName: string;
2371
2359
  };
2372
2360
 
2361
+ type NeoSelectFieldChangeEvent<T = unknown> = SelectChangeEvent<T>;
2362
+
2373
2363
  /**
2374
2364
  * NeoSideNav
2375
2365
  *
@@ -2452,6 +2442,12 @@ interface NeoAlertProps extends Omit<AlertProps, 'severity' | 'variant' | 'color
2452
2442
  * Optional action element (typically a button) displayed on the right
2453
2443
  */
2454
2444
  action?: ReactNode;
2445
+ /**
2446
+ * Optional content rendered below the title inside the alert container.
2447
+ * Use for rich content like stack traces or code blocks. When present,
2448
+ * the alert expands to auto height and top-aligns its icon and action.
2449
+ */
2450
+ children?: ReactNode;
2455
2451
  }
2456
2452
  /**
2457
2453
  * NeoAlert - Alert component for displaying contextual status messages
@@ -2465,7 +2461,7 @@ interface NeoAlertProps extends Omit<AlertProps, 'severity' | 'variant' | 'color
2465
2461
  * - Show Button → action prop presence
2466
2462
  */
2467
2463
  declare const NeoAlert: {
2468
- ({ intent, type, size, title, description, icon, action, ...props }: NeoAlertProps): react_jsx_runtime.JSX.Element;
2464
+ ({ intent, type, size, title, description, icon, action, children, ...props }: NeoAlertProps): react_jsx_runtime.JSX.Element;
2469
2465
  displayName: string;
2470
2466
  };
2471
2467
 
@@ -3360,4 +3356,4 @@ declare module '@mui/x-data-grid-pro' {
3360
3356
  declare const version: string
3361
3357
 
3362
3358
  export { ActivityScene, CIRCLE_RADIUS, NeoActionsCell, NeoActivityHeader, NeoActivityIndicatorCell, NeoAlert, NeoAvatarCell, NeoBadge, NeoBanner, NeoBreadcrumbLink, NeoBreadcrumbs, NeoButton, NeoButtonTab, NeoButtonTabGroup, NeoCard, NeoCheckbox, NeoCheckboxWithText, NeoCodeSnippet, NeoDataGrid, NeoDataGridCellContent, NeoDataGridColumnsButton, NeoDataGridColumnsPanel, NeoDataGridFilterPanel, NeoDataGridFilterPanelAddIcon, NeoDataGridFilterPanelDeleteIcon, NeoDataGridFilterPanelRemoveAllIcon, NeoDataGridFiltersButton, NeoDataGridHeaderLabel, NeoSelect as NeoDataGridSelect, NeoDatePicker, NeoDatePickerListItem, NeoDatePickerMenu, NeoDivider, NeoDot, NeoDownloadToast, NeoSelect as NeoDropdown, NeoMenu as NeoDropdownMenu, NeoMenuItem as NeoDropdownMenuItem, NeoMenuItem as NeoDropdownOption, NeoFilterChip, NeoFooter, NeoGeneralAvatar, NeoIconButton, NeoIconCell, NeoInfiniteScrollGrid, NeoInputField, NeoListItem, NeoListItemButton, NeoLoadingSpinner, NeoLogoCell, NeoMenu, NeoMenuItem, NeoModal, NeoModalContent, NeoModalFooter, NeoModalHeader, NeoMultiBadgesCell, NeoNavigationAvatar, NeoNavigationItem, NeoPageContent, NeoPaginatedGrid, NeoProgressCell, NeoProgressbar, NeoQuickFilter, NeoRadio, NeoRadioButtonWithText, NeoSearchChip, NeoSelect, NeoSelectField, NeoMenuItem as NeoSelectOption, NeoSideNav, NeoSkeleton, NeoStatusBadgeCell, NeoStatusCell, NeoTab, NeoTabPanel, NeoTable, NeoTabs, NeoTag, NeoToast, NeoToastButton, NeoToggle, NeoToggleButton, NeoToggleButtonGroup, NeoToggleButtonWithText, NeoToolbar, NeoTooltip, NeoTopNav, NeoTourModal, NeoTreeItem, NeoTreeView, StyledToggleButton as NeoTypologyButton, NeoTypologyControl, NeoUserAvatarCell, SortedAscendingIcon, SortedDescendingIcon, UnsortedIcon, focusRingStyles, getDataGridHeaderStyles, getDataGridRowStyles, version };
3363
- export type { ActivityColor, ActivityEvent, ActivityHeaderSize, BreadcrumbItem, DataGridSize, NeoActionsCellProps, NeoActivityHeaderProps, NeoActivityIndicatorCellProps, NeoAlertProps, NeoAvatarCellProps, NeoBadgeProps, NeoBannerProps, NeoBreadcrumbLinkProps, NeoBreadcrumbsProps, NeoButtonProps, NeoButtonTabGroupProps, NeoButtonTabProps, NeoCardLargeProps, NeoCardProps, NeoCardSize, NeoCardSmallProps, NeoCheckboxProps, NeoCheckboxWithTextProps, NeoCodeSnippetProps, NeoDataGridCellContentProps, NeoDataGridHeaderLabelProps, NeoDataGridProps, NeoDatePickerProps, NeoDividerProps, NeoDotProps, NeoDownloadToastProps, NeoMenuItemProps as NeoDropdownMenuItemProps, NeoMenuProps as NeoDropdownMenuProps, NeoSelectProps as NeoDropdownProps, NeoFilterChipProps, NeoFooterProps, NeoGeneralAvatarProps, NeoIconButtonProps, NeoIconCellProps, NeoInfiniteScrollGridProps, NeoInputFieldProps, NeoListItemButtonProps, NeoListItemProps, NeoLoadingSpinnerProps, NeoLogoCellProps, NeoMenuItemProps, NeoMenuProps, NeoModalContentProps, NeoModalFooterProps, NeoModalHeaderProps, NeoModalProps, NeoMultiBadgesCellProps, NeoNavigationAvatarProps, NeoNavigationItemProps, NeoPageContentProps, NeoPaginatedGridProps, NeoProgressCellProps, NeoProgressbarProps, NeoQuickFilterProps, NeoRadioProps, NeoSearchChipProps, NeoSelectFieldOption, NeoSelectFieldProps, NeoSelectProps, NeoSkeletonProps, NeoStatusBadgeCellProps, NeoStatusCellProps, NeoStatusCellVariant, NeoTabPanelProps, NeoTabProps, NeoTableColumn, NeoTableProps, NeoTagProps, NeoToastProps, NeoToggleButtonGroupProps, NeoToggleButtonProps, NeoToggleProps, NeoToolbarProps, NeoTooltipProps, NeoTreeItemData, NeoTreeItemProps, NeoTreeViewProps, NeoTypologyControlProps, NeoUserAvatarCellProps };
3359
+ export type { ActivityColor, ActivityEvent, ActivityHeaderSize, BreadcrumbItem, DataGridSize, NeoActionsCellProps, NeoActivityHeaderProps, NeoActivityIndicatorCellProps, NeoAlertProps, NeoAvatarCellProps, NeoBadgeProps, NeoBannerProps, NeoBreadcrumbLinkProps, NeoBreadcrumbsProps, NeoButtonProps, NeoButtonTabGroupProps, NeoButtonTabProps, NeoCardLargeProps, NeoCardProps, NeoCardSize, NeoCardSmallProps, NeoCheckboxProps, NeoCheckboxWithTextProps, NeoCodeSnippetProps, NeoDataGridCellContentProps, NeoDataGridHeaderLabelProps, NeoDataGridProps, NeoDatePickerProps, NeoDividerProps, NeoDotProps, NeoDownloadToastProps, NeoMenuItemProps as NeoDropdownMenuItemProps, NeoMenuProps as NeoDropdownMenuProps, NeoSelectProps as NeoDropdownProps, NeoFilterChipProps, NeoFooterProps, NeoGeneralAvatarProps, NeoIconButtonProps, NeoIconCellProps, NeoInfiniteScrollGridProps, NeoInputFieldProps, NeoListItemButtonProps, NeoListItemProps, NeoLoadingSpinnerProps, NeoLogoCellProps, NeoMenuItemProps, NeoMenuProps, NeoModalContentProps, NeoModalFooterProps, NeoModalHeaderProps, NeoModalProps, NeoMultiBadgesCellProps, NeoNavigationAvatarProps, NeoNavigationItemProps, NeoPageContentProps, NeoPaginatedGridProps, NeoProgressCellProps, NeoProgressbarProps, NeoQuickFilterProps, NeoRadioProps, NeoSearchChipProps, NeoSelectFieldChangeEvent, NeoSelectFieldOption, NeoSelectFieldProps, NeoSelectProps, NeoSkeletonProps, NeoStatusBadgeCellProps, NeoStatusCellProps, NeoStatusCellVariant, NeoTabPanelProps, NeoTabProps, NeoTableColumn, NeoTableProps, NeoTagProps, NeoToastProps, NeoToggleButtonGroupProps, NeoToggleButtonProps, NeoToggleProps, NeoToolbarProps, NeoTooltipProps, NeoTreeItemData, NeoTreeItemProps, NeoTreeViewProps, NeoTypologyControlProps, NeoUserAvatarCellProps };
package/dist/index.esm.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import { semanticColors, spacing, typography, borderRadius, colors, shadows } from '@moderneinc/neo-design';
2
+ import { semanticColors, spacing, typography, borderRadius, shadows, colors } from '@moderneinc/neo-design';
3
3
  import Box from '@mui/material/Box';
4
4
  import { styled, alpha } from '@mui/material/styles';
5
5
  import Chip, { chipClasses } from '@mui/material/Chip';
@@ -36,7 +36,6 @@ import { pickersCalendarHeaderClasses } from '@mui/x-date-pickers/PickersCalenda
36
36
  import { PickersShortcuts } from '@mui/x-date-pickers/PickersShortcuts';
37
37
  import { DateRangePicker } from '@mui/x-date-pickers-pro/DateRangePicker';
38
38
  import { dateRangePickerDayClasses } from '@mui/x-date-pickers-pro/DateRangePickerDay';
39
- import Badge, { badgeClasses } from '@mui/material/Badge';
40
39
  import LinearProgress, { linearProgressClasses } from '@mui/material/LinearProgress';
41
40
  import Paper, { paperClasses } from '@mui/material/Paper';
42
41
  import Stack from '@mui/material/Stack';
@@ -144,18 +143,21 @@ const NeoBadge = ({ size = 'medium', variant = 'filled', ...props }) => {
144
143
  };
145
144
  NeoBadge.displayName = 'NeoBadge';
146
145
 
146
+ const djb2Hash = (str) => {
147
+ let hash = 5381;
148
+ for (let i = 0; i < str.length; i++) {
149
+ hash = (hash * 33) ^ str.charCodeAt(i);
150
+ }
151
+ return hash >>> 0;
152
+ };
147
153
  /**
148
- * Shared color palette for avatar components (GeneralAvatar, NavigationAvatar).
149
- * Maps color index (1-7) to background color token pairs.
154
+ * Deterministically derives an HSL background color from a string seed.
155
+ * Produces pastel colors matching the aesthetic of the status.avatar.initials
156
+ * semantic tokens (fixed 80% saturation, 90% lightness; only hue varies).
150
157
  */
151
- const avatarColorPalette = {
152
- 1: { bg: colors.digitalBlue[100] },
153
- 2: { bg: colors.digitalGreen[100] },
154
- 3: { bg: colors.gold[100] },
155
- 4: { bg: colors.red[100] },
156
- 5: { bg: colors.violet[100] },
157
- 6: { bg: colors.tealGreen[100] },
158
- 7: { bg: colors.orange[100] },
158
+ const avatarColorFromSeed = (seed) => {
159
+ const hue = seed ? djb2Hash(seed) % 360 : 235;
160
+ return `hsl(${hue}, 80%, 90%)`;
159
161
  };
160
162
 
161
163
  /**
@@ -170,14 +172,13 @@ const focusRingStyles = {
170
172
  };
171
173
 
172
174
  const sizeConfig$1 = {
173
- small: { width: spacing.spacing_4, height: spacing.spacing_4, fontSize: typography.fontSize.xs },
175
+ small: { width: spacing.spacing_4, height: spacing.spacing_4, fontSize: typography.fontSize.sm },
174
176
  medium: { width: spacing.spacing_5, height: spacing.spacing_5, fontSize: typography.fontSize.sm },
175
177
  };
176
178
  const StyledAvatar = styled(MuiAvatar, {
177
- shouldForwardProp: prop => prop !== 'avatarSize' && prop !== 'colorIndex',
178
- })(({ theme, avatarSize, colorIndex }) => {
179
+ shouldForwardProp: prop => prop !== 'avatarSize' && prop !== 'backgroundColor',
180
+ })(({ theme, avatarSize, backgroundColor }) => {
179
181
  const size = sizeConfig$1[avatarSize];
180
- const palette = avatarColorPalette[colorIndex];
181
182
  return {
182
183
  boxSizing: 'border-box',
183
184
  width: size.width,
@@ -187,7 +188,7 @@ const StyledAvatar = styled(MuiAvatar, {
187
188
  fontWeight: typography.fontWeight.regular,
188
189
  lineHeight: 1,
189
190
  color: semanticColors.typography.body,
190
- backgroundColor: palette ? palette.bg : undefined,
191
+ backgroundColor,
191
192
  border: `1px solid ${semanticColors.border.primary}`,
192
193
  '&:focus-visible': {
193
194
  ...focusRingStyles,
@@ -200,8 +201,9 @@ const StyledAvatar = styled(MuiAvatar, {
200
201
  *
201
202
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=9600-185
202
203
  */
203
- const NeoGeneralAvatar = ({ size = 'medium', colorIndex = 0, children, ...props }) => {
204
- return (jsx(StyledAvatar, { avatarSize: size, colorIndex: colorIndex, ...props, children: children }));
204
+ const NeoGeneralAvatar = ({ size = 'medium', alt, children, ...props }) => {
205
+ const backgroundColor = avatarColorFromSeed(alt);
206
+ return (jsx(StyledAvatar, { avatarSize: size, backgroundColor: backgroundColor, alt: alt, ...props, children: children }));
205
207
  };
206
208
  NeoGeneralAvatar.displayName = 'NeoGeneralAvatar';
207
209
 
@@ -912,8 +914,8 @@ const intentColors$2 = {
912
914
  };
913
915
  // biome-ignore lint/suspicious/noExplicitAny: Type cast required to override MUI Alert variant type without global augmentation
914
916
  const StyledAlert$2 = styled(Alert, {
915
- shouldForwardProp: prop => prop !== 'intent' && prop !== 'alertType' && prop !== 'alertSize',
916
- })(({ theme, intent = 'success', alertType = 'outlined', alertSize = 'default' }) => {
917
+ shouldForwardProp: prop => prop !== 'intent' && prop !== 'alertType' && prop !== 'alertSize' && prop !== 'hasChildren',
918
+ })(({ theme, intent = 'success', alertType = 'outlined', alertSize = 'default', hasChildren = false, }) => {
917
919
  const palette = intentColors$2[intent];
918
920
  const isFilled = alertType === 'filled';
919
921
  const isCompact = alertSize === 'compact';
@@ -922,15 +924,19 @@ const StyledAlert$2 = styled(Alert, {
922
924
  ? semanticColors.typography.tooltip
923
925
  : semanticColors.typography.body;
924
926
  return {
925
- ...(isCompact ? { minHeight: spacing.spacing_5 } : { height: spacing.spacing_8 }),
927
+ ...(isCompact
928
+ ? { minHeight: spacing.spacing_5 }
929
+ : hasChildren
930
+ ? { minHeight: spacing.spacing_8, height: 'auto' }
931
+ : { height: spacing.spacing_8 }),
926
932
  width: '100%',
927
933
  borderRadius: borderRadius.xS,
928
- alignItems: 'center',
934
+ alignItems: hasChildren ? 'flex-start' : 'center',
929
935
  fontFamily: typography.fontFamily.body,
930
936
  fontSize: theme.typography.pxToRem(typography.fontSize.default),
931
937
  fontWeight: typography.fontWeight.semiBold,
932
938
  lineHeight: 1.5,
933
- padding: theme.spacing(0, 2),
939
+ padding: hasChildren ? theme.spacing(1.5, 2) : theme.spacing(0, 2),
934
940
  backgroundColor: isFilled ? palette.dark : palette.light,
935
941
  border: isFilled ? 'none' : `1px solid ${palette.transparent}`,
936
942
  color: isFilled ? semanticColors.typography.tooltip : semanticColors.typography.body,
@@ -947,7 +953,7 @@ const StyledAlert$2 = styled(Alert, {
947
953
  flex: 1,
948
954
  display: 'flex',
949
955
  flexDirection: 'column',
950
- justifyContent: 'center',
956
+ justifyContent: hasChildren ? 'flex-start' : 'center',
951
957
  '& span:last-child': {
952
958
  fontSize: theme.typography.pxToRem(typography.fontSize.sm),
953
959
  fontWeight: typography.fontWeight.medium,
@@ -985,9 +991,9 @@ const iconMap = {
985
991
  * - Show supporting text → description prop presence
986
992
  * - Show Button → action prop presence
987
993
  */
988
- const NeoAlert = ({ intent = 'success', type = 'outlined', size = 'default', title, description, icon, action, ...props }) => {
994
+ const NeoAlert = ({ intent = 'success', type = 'outlined', size = 'default', title, description, icon, action, children, ...props }) => {
989
995
  const defaultIcon = iconMap[intent];
990
- return (jsxs(StyledAlert$2, { ...props, intent: intent, alertType: type, alertSize: size, icon: icon ?? defaultIcon, action: action, children: [jsx("span", { children: title }), description && jsx("span", { children: description })] }));
996
+ return (jsxs(StyledAlert$2, { ...props, intent: intent, alertType: type, alertSize: size, hasChildren: Boolean(children), icon: icon ?? defaultIcon, action: action, children: [jsx("span", { children: title }), description && jsx("span", { children: description }), children] }));
991
997
  };
992
998
  NeoAlert.displayName = 'NeoAlert';
993
999
 
@@ -1099,12 +1105,12 @@ const StyledBreadcrumbLink = styled(Link, {
1099
1105
  fontWeight: typography.fontWeight.medium,
1100
1106
  lineHeight: 1,
1101
1107
  textDecoration: 'none',
1102
- color: current ? semanticColors.buttons.primary.default : semanticColors.typography.bodySecondary,
1108
+ color: current ? semanticColors.typography.bodySecondary : semanticColors.typography.link.primary,
1103
1109
  cursor: current ? 'default' : 'pointer',
1104
1110
  borderRadius: borderRadius.xS,
1105
1111
  transition: 'color 0.2s ease-in-out',
1106
1112
  '&:hover': {
1107
- color: current ? semanticColors.buttons.tertiary.hover : semanticColors.icons.hover,
1113
+ color: current ? semanticColors.icons.hover : semanticColors.buttons.tertiary.hover,
1108
1114
  },
1109
1115
  '&:focus-visible': {
1110
1116
  outline: `2px solid ${semanticColors.border.focus}`,
@@ -2823,9 +2829,11 @@ const StyledChip$2 = styled(Chip)(({ theme, size, variant, color }) => ({
2823
2829
  fontSize: theme.typography.pxToRem(typography.fontSize.xs),
2824
2830
  lineHeight: 1,
2825
2831
  fontWeight: typography.fontWeight.medium,
2832
+ overflow: 'visible',
2826
2833
  ...(size && sizeStyles$1[size]),
2827
2834
  [`& .${chipClasses.label}`]: {
2828
2835
  padding: 0,
2836
+ overflow: 'visible',
2829
2837
  },
2830
2838
  ...(variant === 'outlined' &&
2831
2839
  color &&
@@ -3784,26 +3792,34 @@ const sizeMap = {
3784
3792
  medium: 10,
3785
3793
  large: 12,
3786
3794
  };
3787
- const StyledBadge = styled(Badge)(({ ownerState }) => {
3795
+ const StyledDot = styled('span', {
3796
+ shouldForwardProp: prop => prop !== 'ownerState',
3797
+ })(({ ownerState }) => {
3788
3798
  const size = sizeMap[ownerState.size];
3789
- const color = semanticColors.status[ownerState.color].default;
3799
+ const palette = semanticColors.status[ownerState.color];
3790
3800
  return {
3791
- [`& .${badgeClasses.badge}`]: {
3792
- width: size,
3793
- height: size,
3794
- minWidth: size,
3795
- borderRadius: ownerState.variant === 'solid' ? '50%' : 0,
3796
- padding: 0,
3797
- backgroundColor: ownerState.variant === 'solid' ? color : 'transparent',
3798
- // Remove default badge positioning - make it standalone
3799
- position: 'static',
3800
- transform: 'none',
3801
- overflow: 'visible',
3801
+ display: 'inline-flex',
3802
+ alignItems: 'center',
3803
+ justifyContent: 'center',
3804
+ width: size,
3805
+ height: size,
3806
+ minWidth: size,
3807
+ borderRadius: '50%',
3808
+ flexShrink: 0,
3809
+ boxSizing: 'border-box',
3810
+ backgroundColor: palette.default,
3811
+ color: semanticColors.typography.tooltip,
3812
+ ...(ownerState.variant === 'outline' && {
3813
+ border: `3px solid ${palette.light}`,
3814
+ }),
3815
+ '& > svg': {
3816
+ width: '70%',
3817
+ height: '70%',
3802
3818
  },
3803
3819
  };
3804
3820
  });
3805
3821
  /**
3806
- * NeoDot - Status indicator dot component based on MUI Badge
3822
+ * NeoDot - Status indicator dot.
3807
3823
  *
3808
3824
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4163-3577
3809
3825
  *
@@ -3812,26 +3828,8 @@ const StyledBadge = styled(Badge)(({ ownerState }) => {
3812
3828
  * - outline (False|True) → variant prop (solid|outline)
3813
3829
  * - Color is configurable via color prop (success|error|warning|info|neutral)
3814
3830
  */
3815
- const NeoDot = ({ size = 'medium', variant = 'solid', color = 'neutral', ...props }) => {
3816
- const dotSize = sizeMap[size];
3817
- const mediumColor = semanticColors.status[color].default;
3818
- const lightColor = semanticColors.status[color].light;
3819
- // For outline variant, use SVG for precise control
3820
- const renderDot = () => {
3821
- if (variant === 'outline') {
3822
- // SVG approach: outer circle with light fill, inner circle with medium fill
3823
- // Stroke width of ~3px creates the ring effect
3824
- const strokeWidth = 3;
3825
- const radius = dotSize / 2;
3826
- const innerRadius = radius - strokeWidth;
3827
- return (jsxs("svg", { width: dotSize, height: dotSize, viewBox: `0 0 ${dotSize} ${dotSize}`, style: {
3828
- display: 'block',
3829
- borderRadius: '50%',
3830
- }, role: "img", "aria-label": `${color} status indicator`, children: [jsx("title", { children: `${color} status indicator` }), jsx("circle", { cx: radius, cy: radius, r: radius, fill: lightColor }), jsx("circle", { cx: radius, cy: radius, r: innerRadius, fill: mediumColor })] }));
3831
- }
3832
- return jsx("span", { style: { display: 'inline-block', width: 0, height: 0 } });
3833
- };
3834
- return (jsx(StyledBadge, { ...props, ownerState: { size, variant, color }, variant: "dot", children: renderDot() }));
3831
+ const NeoDot = ({ size = 'medium', variant = 'solid', color = 'neutral', children, ...props }) => {
3832
+ return (jsx(StyledDot, { ...props, ownerState: { size, variant, color }, role: "img", "aria-label": props['aria-label'] ?? `${color} status indicator`, children: children }));
3835
3833
  };
3836
3834
  NeoDot.displayName = 'NeoDot';
3837
3835
 
@@ -4977,7 +4975,6 @@ const StyledMenu = styled(Menu)(({ theme }) => ({
4977
4975
  borderRadius: borderRadius.s,
4978
4976
  border: `1px solid ${semanticColors.border.primary}`,
4979
4977
  boxShadow: `${shadows.dropdown.x}px ${shadows.dropdown.y}px ${shadows.dropdown.blur}px ${shadows.dropdown.spread}px ${shadows.dropdown.shadow}`,
4980
- minWidth: 200,
4981
4978
  marginTop: theme.spacing(1),
4982
4979
  paddingTop: theme.spacing(1),
4983
4980
  paddingBottom: theme.spacing(1),
@@ -5204,9 +5201,8 @@ NeoModalFooter.displayName = 'NeoModalFooter';
5204
5201
  const NavigationAvatarContainer = styled('div')({
5205
5202
  display: 'flex',
5206
5203
  boxSizing: 'border-box',
5207
- width: spacing.spacing_5,
5208
- height: spacing.spacing_5,
5209
5204
  padding: spacing.spacing_1_2,
5205
+ aspectRatio: '1 / 1',
5210
5206
  justifyContent: 'center',
5211
5207
  alignItems: 'center',
5212
5208
  borderRadius: '50%',
@@ -5224,8 +5220,8 @@ const NavigationAvatarContainer = styled('div')({
5224
5220
  *
5225
5221
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=11325-102
5226
5222
  */
5227
- const NeoNavigationAvatar = ({ colorIndex = 0, children, ...props }) => {
5228
- return (jsx(NavigationAvatarContainer, { children: jsx(NeoGeneralAvatar, { size: "small", colorIndex: colorIndex, ...props, children: children }) }));
5223
+ const NeoNavigationAvatar = ({ children, ...props }) => {
5224
+ return (jsx(NavigationAvatarContainer, { children: jsx(NeoGeneralAvatar, { size: "small", ...props, children: children }) }));
5229
5225
  };
5230
5226
  NeoNavigationAvatar.displayName = 'NeoNavigationAvatar';
5231
5227
 
@@ -5347,11 +5343,11 @@ const LabelText = styled('span', {
5347
5343
  * NeoAvatarCell — DataGrid cell displaying a user avatar with optional label.
5348
5344
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=13425-1725
5349
5345
  */
5350
- const NeoAvatarCell = ({ name, src, colorIndex = 0, label, disabled = false, empty = false, }) => {
5346
+ const NeoAvatarCell = ({ name, src, label, disabled = false, empty = false, }) => {
5351
5347
  if (empty) {
5352
5348
  return jsx(StyledCell$1, { disabled: disabled });
5353
5349
  }
5354
- return (jsxs(StyledCell$1, { disabled: disabled, children: [jsx(NeoGeneralAvatar, { size: "small", src: src, alt: name, colorIndex: colorIndex, children: !src && name ? name.charAt(0).toUpperCase() : undefined }), label && jsx(LabelText, { disabled: disabled, children: label })] }));
5350
+ return (jsxs(StyledCell$1, { disabled: disabled, children: [jsx(NeoGeneralAvatar, { size: "small", src: src, alt: name, children: !src && name ? name.charAt(0).toUpperCase() : undefined }), label && jsx(LabelText, { disabled: disabled, children: label })] }));
5355
5351
  };
5356
5352
  NeoAvatarCell.displayName = 'NeoAvatarCell';
5357
5353
 
@@ -5711,7 +5707,7 @@ function NeoPageContent({ pageTitle, subtitle, breadcrumbs, action, sticky = fal
5711
5707
  // Also try to scroll window in case component is in a different context
5712
5708
  window.scrollTo({ top: 0, behavior: 'smooth' });
5713
5709
  };
5714
- const headerContent = (jsxs(Stack, { ref: headerRef, sx: { flexShrink: 0, gap: '0.5rem' }, children: [breadcrumbs && breadcrumbs.items.length > 0 && (jsx(NeoBreadcrumbs, { children: breadcrumbs.items.map((item, index) => (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))) })), jsxs(Stack, { direction: "row", justifyContent: "space-between", alignItems: "flex-start", sx: { gap: '1rem' }, children: [jsxs(Stack, { sx: { gap: '0.5rem', flexGrow: 1 }, children: [jsx(PageTitle, { children: pageTitle }), subtitle &&
5710
+ const headerContent = (jsxs(Stack, { ref: headerRef, sx: { flexShrink: 0, gap: '0.5rem' }, children: [breadcrumbs && breadcrumbs.items.length > 0 && (jsx(NeoBreadcrumbs, { children: breadcrumbs.items.map((item, index) => (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))) })), jsxs(Stack, { direction: "row", justifyContent: "space-between", alignItems: "flex-start", sx: { gap: '1rem' }, children: [jsxs(Stack, { sx: { gap: '0.5rem', flexGrow: 1 }, children: [typeof pageTitle === 'string' ? jsx(PageTitle, { children: pageTitle }) : pageTitle, subtitle &&
5715
5711
  (typeof subtitle === 'string' ? (jsx(Subtitle, { variant: "caption", children: subtitle })) : (subtitle))] }), action] })] }));
5716
5712
  const content = isLoading ? (jsx(Box, { sx: {
5717
5713
  display: 'flex',