@moderneinc/neo-styled-components 2.5.0-next.80ef49 → 2.5.0-next.97faf1

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.
@@ -1,5 +1,5 @@
1
1
  import ButtonBase from '@mui/material/ButtonBase';
2
- import type { ElementType, ReactNode } from 'react';
2
+ import React, { type ElementType, type ReactNode } from 'react';
3
3
  declare module '@mui/material/ButtonBase' {
4
4
  interface ButtonBasePropsVariantOverrides {
5
5
  primary: true;
@@ -7,9 +7,10 @@ declare module '@mui/material/ButtonBase' {
7
7
  destructive: true;
8
8
  link: true;
9
9
  linkColor: true;
10
+ tertiary: true;
10
11
  }
11
12
  }
12
- type ButtonVariant = 'primary' | 'secondary' | 'destructive' | 'link' | 'linkColor';
13
+ type ButtonVariant = 'primary' | 'secondary' | 'destructive' | 'link' | 'linkColor' | 'tertiary';
13
14
  type ButtonSize = 'small' | 'medium';
14
15
  type NeoButtonOwnProps = {
15
16
  /**
@@ -41,6 +42,14 @@ type NeoButtonOwnProps = {
41
42
  * URL to link to. When provided, the button renders as a link element.
42
43
  */
43
44
  href?: string;
45
+ /**
46
+ * Icon placed before the button label
47
+ */
48
+ startIcon?: ReactNode;
49
+ /**
50
+ * Icon placed after the button label
51
+ */
52
+ endIcon?: ReactNode;
44
53
  };
45
54
  export type NeoButtonProps<C extends ElementType = typeof ButtonBase> = NeoButtonOwnProps & Omit<React.ComponentPropsWithoutRef<C>, keyof NeoButtonOwnProps> & {
46
55
  component?: C;
@@ -51,7 +60,7 @@ export type NeoButtonProps<C extends ElementType = typeof ButtonBase> = NeoButto
51
60
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4086-7590
52
61
  *
53
62
  * Figma Props Mapping:
54
- * - Hierarchy (Primary|Secondary|Destructive|Link|Link Color) → variant prop
63
+ * - Hierarchy (Primary|Secondary|Destructive|Link|Link Color|Tertiary) → variant prop
55
64
  * - Size (Small|Medium) → size prop
56
65
  * - State=Disabled → disabled prop
57
66
  * - State=Loading → loading prop
@@ -59,7 +68,7 @@ export type NeoButtonProps<C extends ElementType = typeof ButtonBase> = NeoButto
59
68
  * - State=Pressed → CSS :active
60
69
  * - State=Focused → CSS :focus-visible
61
70
  */
62
- export declare function NeoButton<C extends ElementType = typeof ButtonBase>({ variant, size, loading, children, disabled, ...rest }: NeoButtonProps<C>): import("react/jsx-runtime").JSX.Element;
71
+ export declare function NeoButton<C extends ElementType = typeof ButtonBase>({ variant, size, loading, children, disabled, startIcon, endIcon, ...rest }: NeoButtonProps<C>): import("react/jsx-runtime").JSX.Element;
63
72
  export declare namespace NeoButton {
64
73
  var displayName: string;
65
74
  }
@@ -23,13 +23,13 @@ export interface NeoMarketplaceCardProps extends Omit<CardProps, 'children' | 't
23
23
  /**
24
24
  * Whether the card is in selected/active state
25
25
  * @default false
26
- * @figma Property 1 (Active)
26
+ * @figma State (Active)
27
27
  */
28
28
  selected?: boolean;
29
29
  /**
30
30
  * Whether the card is disabled
31
31
  * @default false
32
- * @figma Property 1 (Disabled)
32
+ * @figma State (Disabled)
33
33
  */
34
34
  disabled?: boolean;
35
35
  /**
@@ -59,10 +59,11 @@ export interface NeoMarketplaceCardProps extends Omit<CardProps, 'children' | 't
59
59
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4286-1635&t=Bo58EpFmg6ILJtmv-11
60
60
  *
61
61
  * Figma Props Mapping:
62
- * - Property 1="Active" → selected={true}
63
- * - Property 1="Disabled" → disabled={true}
64
- * - Property 1="Focused" → CSS :focus-visible state (not a prop)
65
- * - Property 1="Default" → Base state (no props)
62
+ * - State="Active" → selected={true}
63
+ * - State="Disabled" → disabled={true}
64
+ * - State="Focused" → CSS :focus-visible state (not a prop)
65
+ * - State="Hover" → CSS :hover state (not a prop)
66
+ * - State="Default" → Base state (no props)
66
67
  *
67
68
  * Design Tokens Used:
68
69
  * - semanticColors.surfaces.card (#FFFFFF) - Default card background
@@ -1,26 +1,42 @@
1
- import type { ReactNode } from 'react';
1
+ import { type TreeItemProps } from '@mui/x-tree-view/TreeItem';
2
+ import { type RichTreeViewProProps } from '@mui/x-tree-view-pro/RichTreeViewPro';
3
+ import { type ReactNode } from 'react';
2
4
  /**
3
- * Props for the NeoTree component
5
+ * Extended item data that NeoTreeItem can read from the items array.
6
+ * Consumers pass these via the `items` prop on NeoTreeView.
4
7
  */
5
- export interface NeoTreeProps {
6
- /**
7
- * The content to display inside the component
8
- */
9
- children?: ReactNode;
8
+ export interface NeoTreeItemData {
9
+ id: string;
10
+ label: string;
11
+ icon?: ReactNode;
12
+ checkbox?: ReactNode;
13
+ secondaryLabel?: ReactNode;
14
+ endAction?: ReactNode;
15
+ statusIcon?: ReactNode;
16
+ children?: NeoTreeItemData[];
10
17
  }
18
+ export type NeoTreeItemProps = TreeItemProps;
11
19
  /**
12
- * NeoTree - TODO: Add component description
20
+ * NeoTreeItem - Styled tree item row with optional icon, checkbox,
21
+ * secondaryLabel, endAction, and statusIcon slots.
22
+ *
23
+ * Slot data is read from the item model (passed via `items` on NeoTreeView).
13
24
  *
14
25
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=4190-30493
26
+ */
27
+ export declare const NeoTreeItem: import("react").ForwardRefExoticComponent<TreeItemProps & import("react").RefAttributes<HTMLLIElement>>;
28
+ export interface NeoTreeViewProps extends Omit<RichTreeViewProProps<NeoTreeItemData, false>, 'slots'> {
29
+ slots?: RichTreeViewProProps<NeoTreeItemData, false>['slots'];
30
+ }
31
+ /**
32
+ * NeoTreeView - Styled tree container wrapping MUI RichTreeViewPro.
15
33
  *
16
- * Figma Props Mapping:
17
- * - TODO: Document Figma property mappings
18
- * - FigmaProp → reactProp
34
+ * Provides neo-design token styling, default expand/collapse icons,
35
+ * and NeoTreeItem as the default item slot.
19
36
  *
20
- * Design Tokens Used:
21
- * - TODO: List design tokens used (e.g., semanticColors.text.primary, typography.body.medium)
37
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=4190-30493
22
38
  */
23
- export declare const NeoTree: {
24
- ({ children, ...props }: NeoTreeProps): import("react/jsx-runtime").JSX.Element;
39
+ export declare const NeoTreeView: {
40
+ ({ slots, ...props }: NeoTreeViewProps): import("react/jsx-runtime").JSX.Element;
25
41
  displayName: string;
26
42
  };
package/dist/index.d.ts CHANGED
@@ -40,6 +40,8 @@ import { DatePickerProps } from '@mui/x-date-pickers/DatePicker';
40
40
  import { PickersShortcutsItem } from '@mui/x-date-pickers/PickersShortcuts';
41
41
  import { DateRangePickerProps } from '@mui/x-date-pickers-pro/DateRangePicker';
42
42
  import { DateRange } from '@mui/x-date-pickers-pro/models';
43
+ import { TreeItemProps } from '@mui/x-tree-view/TreeItem';
44
+ import { RichTreeViewProProps } from '@mui/x-tree-view-pro/RichTreeViewPro';
43
45
 
44
46
  interface NeoFooterProps {
45
47
  /**
@@ -489,9 +491,10 @@ declare module '@mui/material/ButtonBase' {
489
491
  destructive: true;
490
492
  link: true;
491
493
  linkColor: true;
494
+ tertiary: true;
492
495
  }
493
496
  }
494
- type ButtonVariant = 'primary' | 'secondary' | 'destructive' | 'link' | 'linkColor';
497
+ type ButtonVariant = 'primary' | 'secondary' | 'destructive' | 'link' | 'linkColor' | 'tertiary';
495
498
  type ButtonSize = 'small' | 'medium';
496
499
  type NeoButtonOwnProps = {
497
500
  /**
@@ -523,8 +526,16 @@ type NeoButtonOwnProps = {
523
526
  * URL to link to. When provided, the button renders as a link element.
524
527
  */
525
528
  href?: string;
529
+ /**
530
+ * Icon placed before the button label
531
+ */
532
+ startIcon?: ReactNode;
533
+ /**
534
+ * Icon placed after the button label
535
+ */
536
+ endIcon?: ReactNode;
526
537
  };
527
- type NeoButtonProps<C extends ElementType = typeof ButtonBase__default> = NeoButtonOwnProps & Omit<React.ComponentPropsWithoutRef<C>, keyof NeoButtonOwnProps> & {
538
+ type NeoButtonProps<C extends ElementType = typeof ButtonBase__default> = NeoButtonOwnProps & Omit<React__default.ComponentPropsWithoutRef<C>, keyof NeoButtonOwnProps> & {
528
539
  component?: C;
529
540
  };
530
541
  /**
@@ -533,7 +544,7 @@ type NeoButtonProps<C extends ElementType = typeof ButtonBase__default> = NeoBut
533
544
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4086-7590
534
545
  *
535
546
  * Figma Props Mapping:
536
- * - Hierarchy (Primary|Secondary|Destructive|Link|Link Color) → variant prop
547
+ * - Hierarchy (Primary|Secondary|Destructive|Link|Link Color|Tertiary) → variant prop
537
548
  * - Size (Small|Medium) → size prop
538
549
  * - State=Disabled → disabled prop
539
550
  * - State=Loading → loading prop
@@ -541,7 +552,7 @@ type NeoButtonProps<C extends ElementType = typeof ButtonBase__default> = NeoBut
541
552
  * - State=Pressed → CSS :active
542
553
  * - State=Focused → CSS :focus-visible
543
554
  */
544
- declare function NeoButton<C extends ElementType = typeof ButtonBase__default>({ variant, size, loading, children, disabled, ...rest }: NeoButtonProps<C>): react_jsx_runtime.JSX.Element;
555
+ declare function NeoButton<C extends ElementType = typeof ButtonBase__default>({ variant, size, loading, children, disabled, startIcon, endIcon, ...rest }: NeoButtonProps<C>): react_jsx_runtime.JSX.Element;
545
556
  declare namespace NeoButton {
546
557
  var displayName: string;
547
558
  }
@@ -1650,6 +1661,41 @@ declare const NeoModalFooter: {
1650
1661
  displayName: string;
1651
1662
  };
1652
1663
 
1664
+ interface NeoNavigationItemProps extends Omit<ButtonBaseProps, 'children'> {
1665
+ /**
1666
+ * Icon element to display
1667
+ */
1668
+ icon?: ReactNode;
1669
+ /**
1670
+ * Text label below the icon
1671
+ */
1672
+ label?: string;
1673
+ /**
1674
+ * Whether the item is selected/active
1675
+ * @figma State (Selected)
1676
+ * @default false
1677
+ */
1678
+ selected?: boolean;
1679
+ /**
1680
+ * Optional tag badge content (e.g., count)
1681
+ * @figma Tag
1682
+ */
1683
+ tag?: string;
1684
+ /**
1685
+ * Additional content
1686
+ */
1687
+ children?: ReactNode;
1688
+ }
1689
+ /**
1690
+ * NeoNavigationItem - Vertical navigation item with icon, label, and optional tag
1691
+ *
1692
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=8455-6120
1693
+ */
1694
+ declare const NeoNavigationItem: {
1695
+ ({ icon, label, selected, tag, children, ...props }: NeoNavigationItemProps): react_jsx_runtime.JSX.Element;
1696
+ displayName: string;
1697
+ };
1698
+
1653
1699
  /**
1654
1700
  * Breadcrumb item configuration
1655
1701
  */
@@ -2614,13 +2660,13 @@ interface NeoMarketplaceCardProps extends Omit<CardProps, 'children' | 'title'>
2614
2660
  /**
2615
2661
  * Whether the card is in selected/active state
2616
2662
  * @default false
2617
- * @figma Property 1 (Active)
2663
+ * @figma State (Active)
2618
2664
  */
2619
2665
  selected?: boolean;
2620
2666
  /**
2621
2667
  * Whether the card is disabled
2622
2668
  * @default false
2623
- * @figma Property 1 (Disabled)
2669
+ * @figma State (Disabled)
2624
2670
  */
2625
2671
  disabled?: boolean;
2626
2672
  /**
@@ -2650,10 +2696,11 @@ interface NeoMarketplaceCardProps extends Omit<CardProps, 'children' | 'title'>
2650
2696
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4286-1635&t=Bo58EpFmg6ILJtmv-11
2651
2697
  *
2652
2698
  * Figma Props Mapping:
2653
- * - Property 1="Active" → selected={true}
2654
- * - Property 1="Disabled" → disabled={true}
2655
- * - Property 1="Focused" → CSS :focus-visible state (not a prop)
2656
- * - Property 1="Default" → Base state (no props)
2699
+ * - State="Active" → selected={true}
2700
+ * - State="Disabled" → disabled={true}
2701
+ * - State="Focused" → CSS :focus-visible state (not a prop)
2702
+ * - State="Hover" → CSS :hover state (not a prop)
2703
+ * - State="Default" → Base state (no props)
2657
2704
  *
2658
2705
  * Design Tokens Used:
2659
2706
  * - semanticColors.surfaces.card (#FFFFFF) - Default card background
@@ -2808,6 +2855,46 @@ declare const NeoDatePicker: {
2808
2855
  displayName: string;
2809
2856
  };
2810
2857
 
2858
+ /**
2859
+ * Extended item data that NeoTreeItem can read from the items array.
2860
+ * Consumers pass these via the `items` prop on NeoTreeView.
2861
+ */
2862
+ interface NeoTreeItemData {
2863
+ id: string;
2864
+ label: string;
2865
+ icon?: ReactNode;
2866
+ checkbox?: ReactNode;
2867
+ secondaryLabel?: ReactNode;
2868
+ endAction?: ReactNode;
2869
+ statusIcon?: ReactNode;
2870
+ children?: NeoTreeItemData[];
2871
+ }
2872
+ type NeoTreeItemProps = TreeItemProps;
2873
+ /**
2874
+ * NeoTreeItem - Styled tree item row with optional icon, checkbox,
2875
+ * secondaryLabel, endAction, and statusIcon slots.
2876
+ *
2877
+ * Slot data is read from the item model (passed via `items` on NeoTreeView).
2878
+ *
2879
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=4190-30493
2880
+ */
2881
+ declare const NeoTreeItem: React$1.ForwardRefExoticComponent<TreeItemProps & React$1.RefAttributes<HTMLLIElement>>;
2882
+ interface NeoTreeViewProps extends Omit<RichTreeViewProProps<NeoTreeItemData, false>, 'slots'> {
2883
+ slots?: RichTreeViewProProps<NeoTreeItemData, false>['slots'];
2884
+ }
2885
+ /**
2886
+ * NeoTreeView - Styled tree container wrapping MUI RichTreeViewPro.
2887
+ *
2888
+ * Provides neo-design token styling, default expand/collapse icons,
2889
+ * and NeoTreeItem as the default item slot.
2890
+ *
2891
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=4190-30493
2892
+ */
2893
+ declare const NeoTreeView: {
2894
+ ({ slots, ...props }: NeoTreeViewProps): react_jsx_runtime.JSX.Element;
2895
+ displayName: string;
2896
+ };
2897
+
2811
2898
  /**
2812
2899
  * @moderneinc/neo-styled-components
2813
2900
  *
@@ -2827,5 +2914,5 @@ declare module '@mui/x-data-grid-pro' {
2827
2914
 
2828
2915
  declare const version: string
2829
2916
 
2830
- export { ActivityScene, CIRCLE_RADIUS, NeoActivityHeader, NeoActivityIndicatorCell, NeoAvatar, NeoBadge, NeoBanner, NeoBreadcrumbLink, NeoBreadcrumbs, NeoButton, NeoButtonGroup, NeoCheckbox, NeoCodeSnippet, NeoDataGrid, NeoDataGridCellContent, NeoDataGridColumnsButton, NeoDataGridColumnsPanel, NeoDataGridFilterPanel, NeoDataGridFilterPanelAddIcon, NeoDataGridFilterPanelDeleteIcon, NeoDataGridFilterPanelRemoveAllIcon, NeoDataGridFiltersButton, NeoDataGridHeaderLabel, NeoSelect as NeoDataGridSelect, NeoDatePicker, NeoDivider, NeoDot, NeoFilterChip, NeoFooter, NeoIconButton, NeoInfiniteScrollGrid, NeoInputField, NeoListItem, NeoListItemButton, NeoLoadingSpinner, NeoMarketplaceCard, NeoMenu, NeoMenuItem, NeoModal, NeoModalContent, NeoModalFooter, NeoModalHeader, NeoMultiBadgesCell, NeoPageContent, NeoPaginatedGrid, NeoProgressbar, NeoQuickFilter, NeoRadio, NeoSearchChip, NeoSelect, NeoMenuItem as NeoSelectOption, NeoSkeleton, NeoStatusBadgeCell, NeoStatusBanner, NeoTab, NeoTabs, NeoTag, NeoToast, NeoToastButton, NeoToggle, NeoToolbar, NeoTooltip, StyledToggleButton as NeoTypologyButton, NeoTypologyControl, NeoUserAvatarCell, SortedAscendingIcon, SortedDescendingIcon, UnsortedIcon, getDataGridHeaderStyles, version };
2831
- export type { ActivityColor, ActivityEvent, ActivityHeaderSize, BreadcrumbItem, DataGridSize, NeoActivityHeaderProps, NeoActivityIndicatorCellProps, NeoAvatarProps, NeoBadgeProps, NeoBannerProps, NeoBreadcrumbLinkProps, NeoBreadcrumbsProps, NeoButtonGroupProps, NeoButtonProps, NeoCheckboxProps, NeoCodeSnippetProps, NeoDataGridCellContentProps, NeoDataGridHeaderLabelProps, NeoDataGridProps, NeoDatePickerProps, NeoDividerProps, NeoDotProps, NeoFilterChipProps, NeoFooterProps, NeoIconButtonProps, NeoInfiniteScrollGridProps, NeoInputFieldProps, NeoListItemButtonProps, NeoListItemProps, NeoLoadingSpinnerProps, NeoMarketplaceCardProps, NeoMenuItemProps, NeoMenuProps, NeoModalContentProps, NeoModalFooterProps, NeoModalHeaderProps, NeoModalProps, NeoMultiBadgesCellProps, NeoPageContentProps, NeoPaginatedGridProps, NeoProgressbarProps, NeoQuickFilterProps, NeoRadioProps, NeoSearchChipProps, NeoSelectProps, NeoSkeletonProps, NeoStatusBadgeCellProps, NeoStatusBannerProps, NeoTabProps, NeoTagProps, NeoToastProps, NeoToggleProps, NeoToolbarProps, NeoTooltipProps, NeoTypologyControlProps, NeoUserAvatarCellProps };
2917
+ export { ActivityScene, CIRCLE_RADIUS, NeoActivityHeader, NeoActivityIndicatorCell, NeoAvatar, NeoBadge, NeoBanner, NeoBreadcrumbLink, NeoBreadcrumbs, NeoButton, NeoButtonGroup, NeoCheckbox, NeoCodeSnippet, NeoDataGrid, NeoDataGridCellContent, NeoDataGridColumnsButton, NeoDataGridColumnsPanel, NeoDataGridFilterPanel, NeoDataGridFilterPanelAddIcon, NeoDataGridFilterPanelDeleteIcon, NeoDataGridFilterPanelRemoveAllIcon, NeoDataGridFiltersButton, NeoDataGridHeaderLabel, NeoSelect as NeoDataGridSelect, NeoDatePicker, NeoDivider, NeoDot, NeoFilterChip, NeoFooter, NeoIconButton, NeoInfiniteScrollGrid, NeoInputField, NeoListItem, NeoListItemButton, NeoLoadingSpinner, NeoMarketplaceCard, NeoMenu, NeoMenuItem, NeoModal, NeoModalContent, NeoModalFooter, NeoModalHeader, NeoMultiBadgesCell, NeoNavigationItem, NeoPageContent, NeoPaginatedGrid, NeoProgressbar, NeoQuickFilter, NeoRadio, NeoSearchChip, NeoSelect, NeoMenuItem as NeoSelectOption, NeoSkeleton, NeoStatusBadgeCell, NeoStatusBanner, NeoTab, NeoTabs, NeoTag, NeoToast, NeoToastButton, NeoToggle, NeoToolbar, NeoTooltip, NeoTreeItem, NeoTreeView, StyledToggleButton as NeoTypologyButton, NeoTypologyControl, NeoUserAvatarCell, SortedAscendingIcon, SortedDescendingIcon, UnsortedIcon, getDataGridHeaderStyles, version };
2918
+ export type { ActivityColor, ActivityEvent, ActivityHeaderSize, BreadcrumbItem, DataGridSize, NeoActivityHeaderProps, NeoActivityIndicatorCellProps, NeoAvatarProps, NeoBadgeProps, NeoBannerProps, NeoBreadcrumbLinkProps, NeoBreadcrumbsProps, NeoButtonGroupProps, NeoButtonProps, NeoCheckboxProps, NeoCodeSnippetProps, NeoDataGridCellContentProps, NeoDataGridHeaderLabelProps, NeoDataGridProps, NeoDatePickerProps, NeoDividerProps, NeoDotProps, NeoFilterChipProps, NeoFooterProps, NeoIconButtonProps, NeoInfiniteScrollGridProps, NeoInputFieldProps, NeoListItemButtonProps, NeoListItemProps, NeoLoadingSpinnerProps, NeoMarketplaceCardProps, NeoMenuItemProps, NeoMenuProps, NeoModalContentProps, NeoModalFooterProps, NeoModalHeaderProps, NeoModalProps, NeoMultiBadgesCellProps, NeoNavigationItemProps, NeoPageContentProps, NeoPaginatedGridProps, NeoProgressbarProps, NeoQuickFilterProps, NeoRadioProps, NeoSearchChipProps, NeoSelectProps, NeoSkeletonProps, NeoStatusBadgeCellProps, NeoStatusBannerProps, NeoTabProps, NeoTagProps, NeoToastProps, NeoToggleProps, NeoToolbarProps, NeoTooltipProps, NeoTreeItemData, NeoTreeItemProps, NeoTreeViewProps, NeoTypologyControlProps, NeoUserAvatarCellProps };
package/dist/index.esm.js CHANGED
@@ -7,7 +7,7 @@ import Chip, { chipClasses } from '@mui/material/Chip';
7
7
  import SvgIcon, { svgIconClasses } from '@mui/material/SvgIcon';
8
8
  import Alert, { alertClasses } from '@mui/material/Alert';
9
9
  import IconButton, { iconButtonClasses } from '@mui/material/IconButton';
10
- import { forwardRef, createElement, useState, useMemo, useRef, useEffect } from 'react';
10
+ import React, { forwardRef, createElement, useState, useMemo, useRef, useEffect } from 'react';
11
11
  import Breadcrumbs, { breadcrumbsClasses } from '@mui/material/Breadcrumbs';
12
12
  import Link from '@mui/material/Link';
13
13
  import ButtonBase, { buttonBaseClasses } from '@mui/material/ButtonBase';
@@ -57,6 +57,9 @@ import Skeleton from '@mui/material/Skeleton';
57
57
  import MuiTab, { tabClasses } from '@mui/material/Tab';
58
58
  import MuiTabs, { tabsClasses } from '@mui/material/Tabs';
59
59
  import Switch, { switchClasses } from '@mui/material/Switch';
60
+ import { useTreeItemModel } from '@mui/x-tree-view/hooks';
61
+ import { TreeItem, treeItemClasses } from '@mui/x-tree-view/TreeItem';
62
+ import { RichTreeViewPro } from '@mui/x-tree-view-pro/RichTreeViewPro';
60
63
  import ToggleButton, { toggleButtonClasses } from '@mui/material/ToggleButton';
61
64
  import ToggleButtonGroup, { toggleButtonGroupClasses } from '@mui/material/ToggleButtonGroup';
62
65
 
@@ -1290,6 +1293,28 @@ const StyledButtonBase$1 = styled(ButtonBase, {
1290
1293
  },
1291
1294
  }),
1292
1295
  },
1296
+ tertiary: {
1297
+ backgroundColor: 'transparent',
1298
+ color: semanticColors.typography.input.default,
1299
+ border: 'none',
1300
+ padding: 0,
1301
+ lineHeight: 1,
1302
+ '&:hover': {
1303
+ backgroundColor: 'transparent',
1304
+ color: semanticColors.buttons.tertiary.hover,
1305
+ },
1306
+ '&:active': {
1307
+ color: semanticColors.buttons.tertiary.pressed,
1308
+ },
1309
+ ...(loading
1310
+ ? {}
1311
+ : {
1312
+ [`&.${buttonBaseClasses.disabled}`]: {
1313
+ backgroundColor: 'transparent',
1314
+ color: semanticColors.buttons.tertiary.disabled,
1315
+ },
1316
+ }),
1317
+ },
1293
1318
  };
1294
1319
  return {
1295
1320
  ...baseStyles,
@@ -1304,6 +1329,7 @@ const LoadingSpinner = styled(CircularProgress)(({ theme, $variant }) => {
1304
1329
  destructive: theme.palette.common.white,
1305
1330
  link: semanticColors.buttons.primary.default,
1306
1331
  linkColor: semanticColors.buttons.primary.default,
1332
+ tertiary: semanticColors.buttons.tertiary.default,
1307
1333
  };
1308
1334
  return {
1309
1335
  color: spinnerColors[$variant],
@@ -1315,7 +1341,7 @@ const LoadingSpinner = styled(CircularProgress)(({ theme, $variant }) => {
1315
1341
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4086-7590
1316
1342
  *
1317
1343
  * Figma Props Mapping:
1318
- * - Hierarchy (Primary|Secondary|Destructive|Link|Link Color) → variant prop
1344
+ * - Hierarchy (Primary|Secondary|Destructive|Link|Link Color|Tertiary) → variant prop
1319
1345
  * - Size (Small|Medium) → size prop
1320
1346
  * - State=Disabled → disabled prop
1321
1347
  * - State=Loading → loading prop
@@ -1323,8 +1349,8 @@ const LoadingSpinner = styled(CircularProgress)(({ theme, $variant }) => {
1323
1349
  * - State=Pressed → CSS :active
1324
1350
  * - State=Focused → CSS :focus-visible
1325
1351
  */
1326
- function NeoButton({ variant = 'primary', size = 'medium', loading = false, children, disabled, ...rest }) {
1327
- return (jsx(StyledButtonBase$1, { variant: variant, size: size, loading: loading, disabled: disabled || loading, ...rest, children: loading ? jsx(LoadingSpinner, { "$variant": variant, size: size === 'small' ? 16 : 20 }) : children }));
1352
+ function NeoButton({ variant = 'primary', size = 'medium', loading = false, children, disabled, startIcon, endIcon, ...rest }) {
1353
+ return (jsx(StyledButtonBase$1, { variant: variant, size: size, loading: loading, disabled: disabled || loading, ...rest, children: loading ? (jsx(LoadingSpinner, { "$variant": variant, size: size === 'small' ? 16 : 20 })) : (jsxs(React.Fragment, { children: [startIcon, children, endIcon] })) }));
1328
1354
  }
1329
1355
  NeoButton.displayName = 'NeoButton';
1330
1356
 
@@ -3562,7 +3588,7 @@ const NeoDot = ({ size = 'medium', variant = 'solid', color = 'neutral', ...prop
3562
3588
  };
3563
3589
  NeoDot.displayName = 'NeoDot';
3564
3590
 
3565
- const focusRing$1 = `${shadows.focusWhite1.x}px ${shadows.focusWhite1.y}px ${shadows.focusWhite1.blur}px ${shadows.focusWhite1.spread}px ${shadows.focusWhite1.shadow}, ${shadows.focusBlue2.x}px ${shadows.focusBlue2.y}px ${shadows.focusBlue2.blur}px ${shadows.focusBlue2.spread}px ${shadows.focusBlue2.shadow}`;
3591
+ const focusRing$2 = `${shadows.focusWhite1.x}px ${shadows.focusWhite1.y}px ${shadows.focusWhite1.blur}px ${shadows.focusWhite1.spread}px ${shadows.focusWhite1.shadow}, ${shadows.focusBlue2.x}px ${shadows.focusBlue2.y}px ${shadows.focusBlue2.blur}px ${shadows.focusBlue2.spread}px ${shadows.focusBlue2.shadow}`;
3566
3592
  const filterChipOnlyProps = ['selected', 'expanded', 'selectedLabel', 'count', 'onClear'];
3567
3593
  const StyledChip = styled(Chip, {
3568
3594
  shouldForwardProp: prop => !filterChipOnlyProps.includes(prop),
@@ -3599,7 +3625,7 @@ const StyledChip = styled(Chip, {
3599
3625
  backgroundColor: semanticColors.buttons.secondary.hoverBackground,
3600
3626
  },
3601
3627
  [`&.${chipClasses.focusVisible}`]: {
3602
- boxShadow: focusRing$1,
3628
+ boxShadow: focusRing$2,
3603
3629
  backgroundColor: selected
3604
3630
  ? semanticColors.buttons.secondary.pressedBackground
3605
3631
  : semanticColors.surfaces.white,
@@ -4681,10 +4707,11 @@ const Description$1 = styled('p')(({ theme }) => ({
4681
4707
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4286-1635&t=Bo58EpFmg6ILJtmv-11
4682
4708
  *
4683
4709
  * Figma Props Mapping:
4684
- * - Property 1="Active" → selected={true}
4685
- * - Property 1="Disabled" → disabled={true}
4686
- * - Property 1="Focused" → CSS :focus-visible state (not a prop)
4687
- * - Property 1="Default" → Base state (no props)
4710
+ * - State="Active" → selected={true}
4711
+ * - State="Disabled" → disabled={true}
4712
+ * - State="Focused" → CSS :focus-visible state (not a prop)
4713
+ * - State="Hover" → CSS :hover state (not a prop)
4714
+ * - State="Default" → Base state (no props)
4688
4715
  *
4689
4716
  * Design Tokens Used:
4690
4717
  * - semanticColors.surfaces.card (#FFFFFF) - Default card background
@@ -5070,6 +5097,7 @@ const NeoModalFooter = ({ leadingContent, children }) => {
5070
5097
  NeoModalFooter.displayName = 'NeoModalFooter';
5071
5098
 
5072
5099
  const customProps = ['selected'];
5100
+ const focusRing$1 = `0 0 0 ${shadows.focusWhite1.spread}px ${shadows.focusWhite1.shadow}, 0 0 0 ${shadows.focusBlue2.spread}px ${shadows.focusBlue2.shadow}`;
5073
5101
  const StyledRoot = styled(ButtonBase, {
5074
5102
  shouldForwardProp: prop => !customProps.includes(prop),
5075
5103
  })(({ selected }) => ({
@@ -5087,25 +5115,43 @@ const StyledRoot = styled(ButtonBase, {
5087
5115
  cursor: 'pointer',
5088
5116
  textDecoration: 'none',
5089
5117
  '&:hover .neo-nav-icon-padding': {
5090
- backgroundColor: semanticColors.buttons.secondary.hoverBackground, // #F2F3FF
5118
+ backgroundColor: semanticColors.buttons.secondary.hoverBackground,
5119
+ borderColor: colors.digitalBlue[100],
5091
5120
  },
5092
5121
  '&:hover .neo-nav-label': {
5093
- color: semanticColors.buttons.primary.hover, // #1E2EC2
5122
+ color: semanticColors.buttons.primary.hover,
5123
+ },
5124
+ '&:focus-visible': {
5125
+ outline: 'none',
5126
+ boxShadow: focusRing$1,
5127
+ },
5128
+ '&:focus-visible .neo-nav-icon-padding': {
5129
+ backgroundColor: semanticColors.buttons.secondary.hoverBackground,
5130
+ borderColor: colors.digitalBlue[100],
5131
+ },
5132
+ '&:focus-visible .neo-nav-label': {
5133
+ color: semanticColors.buttons.primary.hover,
5094
5134
  },
5095
5135
  ...(selected && {
5096
5136
  '& .neo-nav-icon-padding': {
5097
- backgroundColor: `${colors.digitalBlue[100]}BF`, // rgba(220,224,255,0.75)
5137
+ backgroundColor: colors.digitalBlue[100],
5098
5138
  },
5099
5139
  '& .neo-nav-label': {
5100
- color: semanticColors.buttons.primary.pressed, // #131E7A
5140
+ color: semanticColors.buttons.primary.pressed,
5101
5141
  fontWeight: typography.fontWeight.semiBold,
5102
5142
  },
5103
5143
  '&:hover .neo-nav-icon-padding': {
5104
- backgroundColor: `${colors.digitalBlue[100]}BF`,
5144
+ backgroundColor: colors.digitalBlue[100],
5105
5145
  },
5106
5146
  '&:hover .neo-nav-label': {
5107
5147
  color: semanticColors.buttons.primary.pressed,
5108
5148
  },
5149
+ '&:focus-visible .neo-nav-icon-padding': {
5150
+ backgroundColor: colors.digitalBlue[100],
5151
+ },
5152
+ '&:focus-visible .neo-nav-label': {
5153
+ color: semanticColors.buttons.primary.pressed,
5154
+ },
5109
5155
  }),
5110
5156
  }));
5111
5157
  const IconPadding = styled('span')({
@@ -5113,13 +5159,14 @@ const IconPadding = styled('span')({
5113
5159
  alignItems: 'center',
5114
5160
  padding: spacing.spacing_1, // 8px
5115
5161
  borderRadius: spacing.spacing_1, // 8px
5116
- transition: 'background-color 150ms',
5162
+ border: '1px solid transparent',
5163
+ transition: 'background-color 150ms, border-color 150ms',
5117
5164
  });
5118
5165
  const Label$2 = styled('span')(({ theme }) => ({
5119
5166
  fontFamily: typography.fontFamily.body,
5120
5167
  fontWeight: typography.fontWeight.regular,
5121
- fontSize: theme.typography.pxToRem(10),
5122
- lineHeight: 1.2,
5168
+ fontSize: theme.typography.pxToRem(11),
5169
+ lineHeight: 1,
5123
5170
  textAlign: 'center',
5124
5171
  color: semanticColors.typography.navigation.default, // #1F2937
5125
5172
  width: '100%',
@@ -6511,6 +6558,140 @@ const NeoTooltip = ({ variant = 'light', title, description, children, arrow = f
6511
6558
  };
6512
6559
  NeoTooltip.displayName = 'NeoTooltip';
6513
6560
 
6561
+ /**
6562
+ * Custom label component that reads extra slot data from the item model.
6563
+ * Used as `slots.label` on the TreeItem.
6564
+ */
6565
+ const NeoTreeItemLabel = (props) => {
6566
+ const { children, itemId, ...rest } = props;
6567
+ const item = useTreeItemModel(itemId);
6568
+ return (jsxs(ItemContentRow, { ...rest, children: [item?.checkbox, (item?.statusIcon ?? item?.icon) && jsx(ItemIcon, { children: item?.statusIcon ?? item?.icon }), jsx(ItemLabel, { children: children }), item?.secondaryLabel && jsx(ItemSecondaryLabel, { children: item.secondaryLabel }), item?.endAction && jsx(ItemEndAction, { children: item.endAction })] }));
6569
+ };
6570
+ /**
6571
+ * NeoTreeItem - Styled tree item row with optional icon, checkbox,
6572
+ * secondaryLabel, endAction, and statusIcon slots.
6573
+ *
6574
+ * Slot data is read from the item model (passed via `items` on NeoTreeView).
6575
+ *
6576
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=4190-30493
6577
+ */
6578
+ const NeoTreeItem = forwardRef(function NeoTreeItem({ slots, slotProps, ...props }, ref) {
6579
+ return (jsx(TreeItem, { ref: ref, slots: { label: NeoTreeItemLabel, ...slots },
6580
+ // itemId is not in MUI's label slot type but NeoTreeItemLabel needs it for useTreeItemModel
6581
+ slotProps: {
6582
+ ...slotProps,
6583
+ label: { ...slotProps?.label, itemId: props.itemId },
6584
+ }, ...props }));
6585
+ });
6586
+ const ItemContentRow = styled('div')({
6587
+ display: 'flex',
6588
+ alignItems: 'center',
6589
+ gap: spacing.spacing_1_2,
6590
+ flex: 1,
6591
+ minWidth: 0,
6592
+ });
6593
+ const ItemIcon = styled('span')({
6594
+ display: 'inline-flex',
6595
+ alignItems: 'center',
6596
+ justifyContent: 'center',
6597
+ width: 16,
6598
+ height: 16,
6599
+ flexShrink: 0,
6600
+ color: semanticColors.icons.default,
6601
+ '& svg': {
6602
+ width: 16,
6603
+ height: 16,
6604
+ },
6605
+ });
6606
+ const ItemLabel = styled('span')({
6607
+ flex: 1,
6608
+ minWidth: 0,
6609
+ overflow: 'hidden',
6610
+ textOverflow: 'ellipsis',
6611
+ whiteSpace: 'nowrap',
6612
+ });
6613
+ const ItemSecondaryLabel = styled('span')({
6614
+ flexShrink: 0,
6615
+ fontSize: typography.fontSize.xs,
6616
+ fontWeight: typography.fontWeight.regular,
6617
+ fontFamily: typography.fontFamily.body,
6618
+ color: semanticColors.typography.link.primary,
6619
+ });
6620
+ const ItemEndAction = styled('span')({
6621
+ display: 'inline-flex',
6622
+ alignItems: 'center',
6623
+ flexShrink: 0,
6624
+ color: semanticColors.icons.utility,
6625
+ '& svg': {
6626
+ width: 16,
6627
+ height: 16,
6628
+ },
6629
+ });
6630
+ /**
6631
+ * NeoTreeView - Styled tree container wrapping MUI RichTreeViewPro.
6632
+ *
6633
+ * Provides neo-design token styling, default expand/collapse icons,
6634
+ * and NeoTreeItem as the default item slot.
6635
+ *
6636
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=4190-30493
6637
+ */
6638
+ const NeoTreeView = ({ slots, ...props }) => {
6639
+ return (jsx(StyledTreeView, { slots: {
6640
+ item: NeoTreeItem,
6641
+ collapseIcon: CollapseIcon,
6642
+ expandIcon: ExpandIcon,
6643
+ ...slots,
6644
+ }, itemChildrenIndentation: spacing.spacing_2_1_2, ...props }));
6645
+ };
6646
+ NeoTreeView.displayName = 'NeoTreeView';
6647
+ const CollapseIcon = () => jsx(ChevronDown, { size: 16 });
6648
+ const ExpandIcon = () => jsx(ChevronRight, { size: 16 });
6649
+ const StyledTreeView = styled(RichTreeViewPro)({
6650
+ [`& .${treeItemClasses.content}`]: {
6651
+ height: 28,
6652
+ gap: spacing.spacing_1_2,
6653
+ paddingLeft: spacing.spacing_1,
6654
+ paddingRight: spacing.spacing_1,
6655
+ borderRadius: 0,
6656
+ },
6657
+ [`& .${treeItemClasses.content}:hover`]: {
6658
+ backgroundColor: semanticColors.surfaces.listHover,
6659
+ },
6660
+ [`& .${treeItemClasses.content}.Mui-focused`]: {
6661
+ boxShadow: `inset 0 0 0 2px ${semanticColors.buttons.primary.focus}`,
6662
+ backgroundColor: 'transparent',
6663
+ },
6664
+ [`& .${treeItemClasses.content}.Mui-selected`]: {
6665
+ backgroundColor: semanticColors.surfaces.listHover,
6666
+ },
6667
+ [`& .${treeItemClasses.content}.Mui-selected:hover`]: {
6668
+ backgroundColor: semanticColors.surfaces.listHover,
6669
+ },
6670
+ [`& .${treeItemClasses.content}.Mui-selected.Mui-focused`]: {
6671
+ backgroundColor: semanticColors.surfaces.listHover,
6672
+ boxShadow: `inset 0 0 0 2px ${semanticColors.buttons.primary.focus}`,
6673
+ },
6674
+ [`& .${treeItemClasses.label}`]: {
6675
+ fontSize: typography.fontSize.xs,
6676
+ fontWeight: typography.fontWeight.regular,
6677
+ fontFamily: typography.fontFamily.body,
6678
+ color: semanticColors.typography.body,
6679
+ padding: 0,
6680
+ },
6681
+ [`& .${treeItemClasses.iconContainer}`]: {
6682
+ width: 16,
6683
+ color: semanticColors.icons.default,
6684
+ '& svg': {
6685
+ width: 16,
6686
+ height: 16,
6687
+ },
6688
+ },
6689
+ [`& .${treeItemClasses.groupTransition}`]: {
6690
+ borderLeft: `1px solid ${semanticColors.border.primary}`,
6691
+ marginLeft: spacing.spacing_1_1_4,
6692
+ },
6693
+ });
6694
+
6514
6695
  // Figma-exact border radius for toggle buttons — no matching design token
6515
6696
  const TOGGLE_BUTTON_BORDER_RADIUS = 14;
6516
6697
  const StyledToggleButtonGroup = styled(ToggleButtonGroup)(({ theme }) => ({
@@ -6580,5 +6761,5 @@ NeoTypologyControl.displayName = 'NeoTypologyControl';
6580
6761
 
6581
6762
  const version = '0.0.0-development';
6582
6763
 
6583
- export { ActivityScene, CIRCLE_RADIUS, NeoActivityHeader, NeoActivityIndicatorCell, NeoAvatar, NeoBadge, NeoBanner, NeoBreadcrumbLink, NeoBreadcrumbs, NeoButton, NeoButtonGroup, NeoCheckbox, NeoCodeSnippet, NeoDataGrid, NeoDataGridCellContent, NeoDataGridColumnsButton, NeoDataGridColumnsPanel, NeoDataGridFilterPanel, NeoDataGridFilterPanelAddIcon, NeoDataGridFilterPanelDeleteIcon, NeoDataGridFilterPanelRemoveAllIcon, NeoDataGridFiltersButton, NeoDataGridHeaderLabel, NeoSelect as NeoDataGridSelect, NeoDatePicker, NeoDivider, NeoDot, NeoFilterChip, NeoFooter, NeoIconButton, NeoIconWrapper, NeoInfiniteScrollGrid, NeoInputField, NeoListItem, NeoListItemButton, NeoLoadingSpinner, NeoMarketplaceCard, NeoMarketplaceLargeCard, NeoMenu, NeoMenuItem, NeoModal, NeoModalContent, NeoModalFooter, NeoModalHeader, NeoMultiBadgesCell, NeoNavigationItem, NeoPageContent, NeoPaginatedGrid, NeoProgressbar, NeoQuickFilter, NeoRadio, NeoSearchChip, NeoSelect, NeoMenuItem as NeoSelectOption, NeoSkeleton, NeoStatusBadgeCell, NeoStatusBanner, NeoTab, NeoTabs, NeoTag, NeoToast, NeoToastButton, NeoToggle, NeoToolbar, NeoTooltip, StyledToggleButton as NeoTypologyButton, NeoTypologyControl, NeoUserAvatarCell, SortedAscendingIcon, SortedDescendingIcon, UnsortedIcon, getDataGridHeaderStyles, neoRowHeights, version };
6764
+ export { ActivityScene, CIRCLE_RADIUS, NeoActivityHeader, NeoActivityIndicatorCell, NeoAvatar, NeoBadge, NeoBanner, NeoBreadcrumbLink, NeoBreadcrumbs, NeoButton, NeoButtonGroup, NeoCheckbox, NeoCodeSnippet, NeoDataGrid, NeoDataGridCellContent, NeoDataGridColumnsButton, NeoDataGridColumnsPanel, NeoDataGridFilterPanel, NeoDataGridFilterPanelAddIcon, NeoDataGridFilterPanelDeleteIcon, NeoDataGridFilterPanelRemoveAllIcon, NeoDataGridFiltersButton, NeoDataGridHeaderLabel, NeoSelect as NeoDataGridSelect, NeoDatePicker, NeoDivider, NeoDot, NeoFilterChip, NeoFooter, NeoIconButton, NeoIconWrapper, NeoInfiniteScrollGrid, NeoInputField, NeoListItem, NeoListItemButton, NeoLoadingSpinner, NeoMarketplaceCard, NeoMarketplaceLargeCard, NeoMenu, NeoMenuItem, NeoModal, NeoModalContent, NeoModalFooter, NeoModalHeader, NeoMultiBadgesCell, NeoNavigationItem, NeoPageContent, NeoPaginatedGrid, NeoProgressbar, NeoQuickFilter, NeoRadio, NeoSearchChip, NeoSelect, NeoMenuItem as NeoSelectOption, NeoSkeleton, NeoStatusBadgeCell, NeoStatusBanner, NeoTab, NeoTabs, NeoTag, NeoToast, NeoToastButton, NeoToggle, NeoToolbar, NeoTooltip, NeoTreeItem, NeoTreeView, StyledToggleButton as NeoTypologyButton, NeoTypologyControl, NeoUserAvatarCell, SortedAscendingIcon, SortedDescendingIcon, UnsortedIcon, getDataGridHeaderStyles, neoRowHeights, version };
6584
6765
  //# sourceMappingURL=index.esm.js.map