@12-apps/ui 6.39.14 → 6.39.15

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.
@@ -67,11 +67,11 @@ import "../../chunk-PVM7XTLZ.js";
67
67
  import "../../chunk-I53WONUS.js";
68
68
  import {
69
69
  NavigationMenu
70
- } from "../../chunk-Y5UTYBZW.js";
71
- import "../../chunk-YHGOPZXW.js";
72
- import "../../chunk-VPRNKJHP.js";
70
+ } from "../../chunk-ZUME25DS.js";
71
+ import "../../chunk-FY6PONLA.js";
72
+ import "../../chunk-FBUCXTA4.js";
73
73
  import "../../chunk-L5RQIQIP.js";
74
- import "../../chunk-5OUEKIWQ.js";
74
+ import "../../chunk-ZGWEFOW6.js";
75
75
  import "../../chunk-3L5OZCGA.js";
76
76
  import "../../chunk-3AIRFAI3.js";
77
77
  import "../../chunk-R445KMGG.js";
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  NavigationMegaSection
3
- } from "../../../../chunk-YHGOPZXW.js";
3
+ } from "../../../../chunk-FY6PONLA.js";
4
4
  import "../../../../chunk-L5RQIQIP.js";
5
- import "../../../../chunk-5OUEKIWQ.js";
5
+ import "../../../../chunk-ZGWEFOW6.js";
6
6
  import "../../../../chunk-3L5OZCGA.js";
7
7
  import "../../../../chunk-3AIRFAI3.js";
8
8
  import "../../../../chunk-FQ6UW7IY.js";
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  NavigationMenu
3
- } from "../../../../chunk-Y5UTYBZW.js";
4
- import "../../../../chunk-YHGOPZXW.js";
5
- import "../../../../chunk-VPRNKJHP.js";
3
+ } from "../../../../chunk-ZUME25DS.js";
4
+ import "../../../../chunk-FY6PONLA.js";
5
+ import "../../../../chunk-FBUCXTA4.js";
6
6
  import "../../../../chunk-L5RQIQIP.js";
7
- import "../../../../chunk-5OUEKIWQ.js";
7
+ import "../../../../chunk-ZGWEFOW6.js";
8
8
  import "../../../../chunk-3L5OZCGA.js";
9
9
  import "../../../../chunk-3AIRFAI3.js";
10
10
  import "../../../../chunk-FQ6UW7IY.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  renderMenuItem
3
- } from "../../../../chunk-5OUEKIWQ.js";
3
+ } from "../../../../chunk-ZGWEFOW6.js";
4
4
  import "../../../../chunk-3L5OZCGA.js";
5
5
  import "../../../../chunk-3AIRFAI3.js";
6
6
  import "../../../../chunk-FQ6UW7IY.js";
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  NavigationStandardBody
3
- } from "../../../../chunk-VPRNKJHP.js";
3
+ } from "../../../../chunk-FBUCXTA4.js";
4
4
  import "../../../../chunk-L5RQIQIP.js";
5
- import "../../../../chunk-5OUEKIWQ.js";
5
+ import "../../../../chunk-ZGWEFOW6.js";
6
6
  import "../../../../chunk-3L5OZCGA.js";
7
7
  import "../../../../chunk-3AIRFAI3.js";
8
8
  import "../../../../chunk-FQ6UW7IY.js";
@@ -2,11 +2,11 @@ import "../../../chunk-OJSVHBQO.js";
2
2
  import "../../../chunk-I53WONUS.js";
3
3
  import {
4
4
  NavigationMenu
5
- } from "../../../chunk-Y5UTYBZW.js";
6
- import "../../../chunk-YHGOPZXW.js";
7
- import "../../../chunk-VPRNKJHP.js";
5
+ } from "../../../chunk-ZUME25DS.js";
6
+ import "../../../chunk-FY6PONLA.js";
7
+ import "../../../chunk-FBUCXTA4.js";
8
8
  import "../../../chunk-L5RQIQIP.js";
9
- import "../../../chunk-5OUEKIWQ.js";
9
+ import "../../../chunk-ZGWEFOW6.js";
10
10
  import "../../../chunk-3L5OZCGA.js";
11
11
  import "../../../chunk-3AIRFAI3.js";
12
12
  import "../../../chunk-R445KMGG.js";
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-L5RQIQIP.js";
6
6
  import {
7
7
  renderMenuItem
8
- } from "./chunk-5OUEKIWQ.js";
8
+ } from "./chunk-ZGWEFOW6.js";
9
9
  import {
10
10
  slideIn
11
11
  } from "./chunk-3AIRFAI3.js";
@@ -116,4 +116,4 @@ var NavigationStandardBody = ({
116
116
  export {
117
117
  NavigationStandardBody
118
118
  };
119
- //# sourceMappingURL=chunk-VPRNKJHP.js.map
119
+ //# sourceMappingURL=chunk-FBUCXTA4.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-L5RQIQIP.js";
4
4
  import {
5
5
  renderMenuItem
6
- } from "./chunk-5OUEKIWQ.js";
6
+ } from "./chunk-ZGWEFOW6.js";
7
7
  import {
8
8
  slideIn
9
9
  } from "./chunk-3AIRFAI3.js";
@@ -59,4 +59,4 @@ var NavigationMegaSection = ({
59
59
  export {
60
60
  NavigationMegaSection
61
61
  };
62
- //# sourceMappingURL=chunk-YHGOPZXW.js.map
62
+ //# sourceMappingURL=chunk-FY6PONLA.js.map
@@ -32,6 +32,7 @@ import Popover from "@mui/material/Popover/index.js";
32
32
  import { alpha, styled } from "@mui/material/styles/index.js";
33
33
  import React from "react";
34
34
  import { jsx, jsxs } from "react/jsx-runtime";
35
+ var hasBadge = (badge) => badge !== void 0 && badge !== null && badge !== "" && badge !== 0;
35
36
  var StyledListItem = styled(ListItem, {
36
37
  shouldForwardProp: (prop) => !["variant", "active", "size", "level"].includes(prop)
37
38
  })(
@@ -130,10 +131,11 @@ var MenuItemLabel = ({ item, collapsed, open, hasChildren, size, variant }) => /
130
131
  }
131
132
  }
132
133
  ),
133
- item.badge && /* @__PURE__ */ jsx(
134
+ hasBadge(item.badge) && /* @__PURE__ */ jsx(
134
135
  Box,
135
136
  {
136
137
  component: "span",
138
+ "data-testid": `navigation-menu-badge-${item.id}`,
137
139
  sx: {
138
140
  flexShrink: 0,
139
141
  display: "inline-flex",
@@ -311,4 +313,4 @@ var renderMenuItem = (item, variant = "vertical", size = "md", collapsed = false
311
313
  export {
312
314
  renderMenuItem
313
315
  };
314
- //# sourceMappingURL=chunk-5OUEKIWQ.js.map
316
+ //# sourceMappingURL=chunk-ZGWEFOW6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/navigation/NavigationMenu/NavigationMenuItem.tsx"],"sourcesContent":["import ChevronRight from '@mui/icons-material/ChevronRight';\nimport ExpandMore from '@mui/icons-material/ExpandMore';\nimport Box from '@mui/material/Box/index.js';\nimport Collapse from '@mui/material/Collapse/index.js';\nimport Fade from '@mui/material/Fade/index.js';\nimport Grow from '@mui/material/Grow/index.js';\nimport List from '@mui/material/List/index.js';\nimport ListItem from '@mui/material/ListItem/index.js';\nimport ListItemButton from '@mui/material/ListItemButton/index.js';\nimport ListItemIcon from '@mui/material/ListItemIcon/index.js';\nimport ListItemText from '@mui/material/ListItemText/index.js';\nimport Popover from '@mui/material/Popover/index.js';\nimport { alpha, styled } from '@mui/material/styles/index.js';\nimport React, { } from 'react';\n\nimport { useMenuItemState } from './NavigationMenuItem.hooks';\nimport { navItemButtonStyles, pulseGlow } from './NavigationMenu.styles';\nimport type { NavigationMenuItem } from './NavigationMenu.types';\nimport { onMedia, shadowInk, uiInk } from '../../../tokens/ink';\nimport { rem, rems, sxRem } from '../../../tokens/relative';\n\n// A numeric or empty-string zero is treated the way the package's own Badge\n// treats a zero count by default (`Badge.helpers.ts`'s `showZero: false`):\n// hidden. `badge && …` prints a bare \"0\" text node for `badge: 0`, because\n// `0 && …` evaluates to the falsy `0` itself rather than `false`. A caller\n// who wants a visible zero passes the string `'0'`, which is truthy here.\nconst hasBadge = (badge: NavigationMenuItem['badge']): boolean =>\n badge !== undefined && badge !== null && badge !== '' && badge !== 0;\n\nconst StyledListItem = styled(ListItem, {\n shouldForwardProp: (prop) => !['variant', 'active', 'size', 'level'].includes(prop as string) })<{ variant?: string; active?: boolean; size?: string; level?: number }>(\n ({ theme, variant, level = 0 }) => ({\n padding: 0,\n ...(variant === 'horizontal' && {\n width: 'auto' }),\n ...(level > 0 && {\n paddingLeft: theme.spacing(2 * level) }) }),\n);\n\nconst StyledListItemButton = styled(ListItemButton, {\n shouldForwardProp: (prop) => !['variant', 'active', 'size', 'collapsed', 'minimal'].includes(prop as string) })<{ variant?: string; active?: boolean; size?: string; collapsed?: boolean; minimal?: boolean }>(\n ({ theme, variant, active, size, collapsed, minimal }) => ({\n ...navItemButtonStyles({ theme, variant, active, size, collapsed, minimal }) }),\n);\n\ninterface MenuItemRendererProps {\n item: NavigationMenuItem;\n variant: string;\n size: string;\n collapsed: boolean;\n minimal: boolean;\n level: number;\n onItemClick?: (item: NavigationMenuItem) => void;\n}\n\n// Hover intent and open/anchor state live in NavigationMenuItem.hooks.\n\n// The flyout a horizontal menu opens on hover.\nconst MenuItemPopover: React.FC<{\n anchorEl: HTMLElement | null;\n item: NavigationMenuItem;\n size?: string;\n minimal?: boolean;\n onClose: () => void;\n onMouseEnter: () => void;\n onMouseLeave: () => void;\n onItemClick?: (item: NavigationMenuItem) => void;\n}> = ({ anchorEl, item, size, minimal, onClose, onMouseEnter, onMouseLeave, onItemClick }) => (\n <Popover\n open={Boolean(anchorEl)}\n anchorEl={anchorEl}\n onClose={onClose}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left' }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'left' }}\n disableRestoreFocus\n sx={{\n pointerEvents: 'none' }}\n slotProps={{\n paper: {\n onMouseEnter,\n onMouseLeave,\n sx: {\n pointerEvents: 'auto',\n mt: 0.5,\n borderRadius: 2,\n boxShadow: (theme) => `0 ${rems(theme, 12, 40)} ${shadowInk(theme, 0.15)}`,\n border: (theme) => `1px solid ${alpha(theme.palette.divider, 0.1)}`,\n background: (theme) =>\n `linear-gradient(145deg, ${theme.palette.background.paper} 0%, ${alpha(theme.palette.background.default, 0.95)} 100%)`,\n backdropFilter: (theme) => `blur(${rem(theme, 10)})`,\n minWidth: sxRem(200) } } }}\n >\n <List sx={{ p: 1 }}>\n {item.children?.map((child) => {\n const childHasChildren = child.children && child.children.length > 0;\n\n // Only close popover when clicking leaf nodes (items without children)\n if (childHasChildren) {\n return renderMenuItem(child, 'vertical', size, false, minimal, 0, onItemClick);\n }\n\n // For leaf nodes, wrap with onClick to close the popover\n return (\n <Box\n key={child.id}\n onClick={onClose}\n >\n {renderMenuItem(child, 'vertical', size, false, minimal, 0, onItemClick)}\n </Box>\n );\n })}\n </List>\n </Popover>\n);\n\n// Label, badge/chip and the expand chevron, faded out when the rail collapses.\nconst MenuItemLabel: React.FC<{\n item: NavigationMenuItem;\n collapsed?: boolean;\n minimal?: boolean;\n open: boolean;\n hasChildren?: boolean;\n size?: string;\n variant?: string;\n}> = ({ item, collapsed, open, hasChildren, size, variant }) => (\n <Fade in={!collapsed} timeout={400}>\n <Box sx={{ display: 'flex', alignItems: 'center', width: '100%', gap: 1 }}>\n <ListItemText\n primary={item.label}\n secondary={item.description}\n sx={{\n flex: 1,\n minWidth: 0, // Allows text truncation if needed\n }}\n slotProps={{\n primary: {\n variant: size === 'sm' ? 'body2' : size === 'lg' ? 'h6' : 'body1',\n sx: {\n fontWeight: item.active ? 600 : 400,\n transition: 'all 0.3s ease' } },\n secondary: {\n sx: {\n opacity: 0.7,\n transition: 'all 0.3s ease' } } }}\n />\n {hasBadge(item.badge) && (\n <Box\n component=\"span\"\n data-testid={`navigation-menu-badge-${item.id}`}\n sx={{\n flexShrink: 0,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: sxRem(20),\n height: sxRem(20),\n px: 0.75,\n borderRadius: sxRem(10),\n fontSize: sxRem(12),\n fontWeight: 600,\n color: (theme) => onMedia(theme),\n background: (theme) =>\n `linear-gradient(135deg, ${uiInk(theme).attention.from} 0%, ${uiInk(theme).attention.to} 100%)`,\n boxShadow: (theme) => `0 ${rems(theme, 2, 8)} ${alpha(uiInk(theme).attention.glow, 0.4)}`,\n animation: (theme) =>\n typeof item.badge === 'number' && item.badge > 0\n ? `${pulseGlow(theme)} 2s infinite`\n : 'none' }}\n >\n {item.badge}\n </Box>\n )}\n {hasChildren && (\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n flexShrink: 0, // Prevents expand icon from shrinking\n transition: 'transform 0.3s ease',\n transform: open ? 'rotate(180deg)' : 'rotate(0deg)' }}\n >\n {variant === 'horizontal' ? <ChevronRight fontSize=\"small\" /> : <ExpandMore />}\n </Box>\n )}\n </Box>\n </Fade>\n);\n\n// The row itself: icon, label, badge and the expand chevron.\nconst MenuItemContent: React.FC<{\n item: NavigationMenuItem;\n variant?: string;\n size?: string;\n active?: boolean;\n collapsed?: boolean;\n minimal?: boolean;\n level: number;\n open: boolean;\n hasChildren?: boolean;\n onClick: (event: React.MouseEvent<HTMLElement>) => void;\n onMouseEnter: (event: React.MouseEvent<HTMLElement>) => void;\n onMouseLeave: () => void;\n}> = ({\n item,\n variant,\n size,\n active: _active,\n collapsed,\n minimal,\n level,\n open,\n hasChildren,\n onClick,\n onMouseEnter,\n onMouseLeave }) => (\n<StyledListItem key={item.id} variant={variant} active={item.active} size={size} level={level}>\n <StyledListItemButton\n variant={variant}\n active={item.active}\n size={size}\n collapsed={collapsed}\n minimal={minimal}\n disabled={item.disabled}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n {...(item.href && !hasChildren\n ? {\n component: 'a' as React.ElementType,\n href: item.href,\n target: item.target }\n : {})}\n >\n {item.icon && (\n <ListItemIcon\n sx={{\n minWidth: collapsed ? 0 : sxRem(40),\n justifyContent: 'center',\n transition: 'all 0.3s ease',\n '& svg': {\n filter: (theme) => (item.active ? `drop-shadow(0 ${rems(theme, 2, 8)} ${shadowInk(theme, 0.15)})` : 'none'),\n transition: 'all 0.3s ease' } }}\n >\n <Grow in={true} timeout={600}>\n <Box>{item.icon}</Box>\n </Grow>\n </ListItemIcon>\n )}\n {!collapsed && (\n <MenuItemLabel\n item={item}\n collapsed={collapsed}\n minimal={minimal}\n open={open}\n hasChildren={hasChildren}\n size={size}\n variant={variant}\n />\n )}\n </StyledListItemButton>\n </StyledListItem>\n);\n\nconst MenuItemRenderer: React.FC<MenuItemRendererProps> = ({\n item,\n variant,\n size,\n collapsed,\n minimal,\n level,\n onItemClick }) => {\n const {\n open,\n anchorEl,\n hasChildren,\n handleClick,\n handleMouseEnter,\n handleMouseLeave,\n handlePopoverMouseEnter,\n handlePopoverMouseLeave,\n closePopover } = useMenuItemState({ item, variant, onItemClick });\n\n const itemContent = (\n <MenuItemContent\n item={item}\n variant={variant}\n size={size}\n active={item.active}\n collapsed={collapsed}\n minimal={minimal}\n level={level}\n open={open}\n hasChildren={hasChildren}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n />\n );\n\n // Horizontal variant with children - use Popover\n if (hasChildren && variant === 'horizontal') {\n return (\n <React.Fragment key={item.id}>\n {itemContent}\n <MenuItemPopover\n anchorEl={anchorEl}\n item={item}\n size={size}\n minimal={minimal}\n onClose={closePopover}\n onMouseEnter={handlePopoverMouseEnter}\n onMouseLeave={handlePopoverMouseLeave}\n onItemClick={onItemClick}\n />\n </React.Fragment>\n );\n }\n\n // Vertical variant with children - use Collapse\n if (hasChildren && variant !== 'horizontal') {\n return (\n <React.Fragment key={item.id}>\n {itemContent}\n {!collapsed && (\n <Collapse in={open} timeout=\"auto\" unmountOnExit>\n <List component=\"div\" disablePadding>\n {item.children?.map((child) =>\n renderMenuItem(child, variant, size, collapsed, minimal, level + 1, onItemClick),\n )}\n </List>\n </Collapse>\n )}\n </React.Fragment>\n );\n }\n\n return itemContent;\n};\n\nexport const renderMenuItem = (\n item: NavigationMenuItem,\n variant: string = 'vertical',\n size: string = 'md',\n collapsed: boolean = false,\n minimal: boolean = false,\n level: number = 0,\n onItemClick?: (item: NavigationMenuItem) => void,\n): React.ReactNode => (\n <MenuItemRenderer\n key={item.id}\n item={item}\n variant={variant}\n size={size}\n collapsed={collapsed}\n minimal={minimal}\n level={level}\n onItemClick={onItemClick}\n />\n );\n"],"mappings":"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","names":[]}
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  NavigationMegaSection
3
- } from "./chunk-YHGOPZXW.js";
3
+ } from "./chunk-FY6PONLA.js";
4
4
  import {
5
5
  NavigationStandardBody
6
- } from "./chunk-VPRNKJHP.js";
6
+ } from "./chunk-FBUCXTA4.js";
7
7
  import {
8
8
  LogoBar,
9
9
  NavigationShell
@@ -173,4 +173,4 @@ NavigationMenu.displayName = "NavigationMenu";
173
173
  export {
174
174
  NavigationMenu
175
175
  };
176
- //# sourceMappingURL=chunk-Y5UTYBZW.js.map
176
+ //# sourceMappingURL=chunk-ZUME25DS.js.map
@@ -1,11 +1,11 @@
1
1
  import "../chunk-I53WONUS.js";
2
2
  import {
3
3
  NavigationMenu
4
- } from "../chunk-Y5UTYBZW.js";
5
- import "../chunk-YHGOPZXW.js";
6
- import "../chunk-VPRNKJHP.js";
4
+ } from "../chunk-ZUME25DS.js";
5
+ import "../chunk-FY6PONLA.js";
6
+ import "../chunk-FBUCXTA4.js";
7
7
  import "../chunk-L5RQIQIP.js";
8
- import "../chunk-5OUEKIWQ.js";
8
+ import "../chunk-ZGWEFOW6.js";
9
9
  import "../chunk-3L5OZCGA.js";
10
10
  import "../chunk-3AIRFAI3.js";
11
11
  import "../chunk-FQ6UW7IY.js";
@@ -1 +1 @@
1
- {"version":3,"file":"NavigationMenuItem.d.ts","sourceRoot":"","sources":["../../../../../src/components/navigation/NavigationMenu/NavigationMenuItem.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAW,MAAM,OAAO,CAAC;AAIhC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AA6TjE,eAAO,MAAM,cAAc,GACzB,MAAM,kBAAkB,EACxB,UAAS,MAAmB,EAC5B,OAAM,MAAa,EACnB,YAAW,OAAe,EAC1B,UAAS,OAAe,EACxB,QAAO,MAAU,EACjB,cAAc,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,KAC/C,KAAK,CAAC,SAWN,CAAC"}
1
+ {"version":3,"file":"NavigationMenuItem.d.ts","sourceRoot":"","sources":["../../../../../src/components/navigation/NavigationMenu/NavigationMenuItem.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAW,MAAM,OAAO,CAAC;AAIhC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAsUjE,eAAO,MAAM,cAAc,GACzB,MAAM,kBAAkB,EACxB,UAAS,MAAmB,EAC5B,OAAM,MAAa,EACnB,YAAW,OAAe,EAC1B,UAAS,OAAe,EACxB,QAAO,MAAU,EACjB,cAAc,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,KAC/C,KAAK,CAAC,SAWN,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@12-apps/ui",
3
- "version": "6.39.14",
3
+ "version": "6.39.15",
4
4
  "license": "MIT",
5
5
  "packageManager": "pnpm@10.34.5",
6
6
  "type": "module",
@@ -44,7 +44,7 @@ A flexible and feature-rich navigation menu component that supports horizontal,
44
44
  | active | `boolean` | false | Whether the item is currently active |
45
45
  | disabled | `boolean` | false | Whether the item is disabled |
46
46
  | onClick | `(event: React.MouseEvent) => void` | undefined | Click handler for the menu item |
47
- | badge | `number \| string` | undefined | Badge/notification count |
47
+ | badge | `number \| string` | undefined | Badge/notification count. A numeric or empty-string `0` renders nothing — pass the string `'0'` for a visible zero. |
48
48
  | children | `NavigationMenuItem[]` | undefined | Nested items for submenu |
49
49
  | description | `string` | undefined | Description text for the item |
50
50
  | showChevron | `boolean` | false | Whether to show a chevron for submenu |
@@ -392,6 +392,8 @@ const itemsWithBadges = [
392
392
  - Supports both numeric and string badges
393
393
  - Animated pulse effect for numeric badges
394
394
  - Gradient background with shadow for visual prominence
395
+ - A zero count is hidden, the same way `Badge`'s `showZero: false` default hides
396
+ it: `badge: 0` renders no pill. Pass the string `'0'` to show a literal zero.
395
397
 
396
398
  ### Icon Hover Animations
397
399
 
@@ -19,6 +19,14 @@ import type { NavigationMenuItem } from './NavigationMenu.types';
19
19
  import { onMedia, shadowInk, uiInk } from '../../../tokens/ink';
20
20
  import { rem, rems, sxRem } from '../../../tokens/relative';
21
21
 
22
+ // A numeric or empty-string zero is treated the way the package's own Badge
23
+ // treats a zero count by default (`Badge.helpers.ts`'s `showZero: false`):
24
+ // hidden. `badge && …` prints a bare "0" text node for `badge: 0`, because
25
+ // `0 && …` evaluates to the falsy `0` itself rather than `false`. A caller
26
+ // who wants a visible zero passes the string `'0'`, which is truthy here.
27
+ const hasBadge = (badge: NavigationMenuItem['badge']): boolean =>
28
+ badge !== undefined && badge !== null && badge !== '' && badge !== 0;
29
+
22
30
  const StyledListItem = styled(ListItem, {
23
31
  shouldForwardProp: (prop) => !['variant', 'active', 'size', 'level'].includes(prop as string) })<{ variant?: string; active?: boolean; size?: string; level?: number }>(
24
32
  ({ theme, variant, level = 0 }) => ({
@@ -139,9 +147,10 @@ const MenuItemLabel: React.FC<{
139
147
  opacity: 0.7,
140
148
  transition: 'all 0.3s ease' } } }}
141
149
  />
142
- {item.badge && (
150
+ {hasBadge(item.badge) && (
143
151
  <Box
144
152
  component="span"
153
+ data-testid={`navigation-menu-badge-${item.id}`}
145
154
  sx={{
146
155
  flexShrink: 0,
147
156
  display: 'inline-flex',
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/navigation/NavigationMenu/NavigationMenuItem.tsx"],"sourcesContent":["import ChevronRight from '@mui/icons-material/ChevronRight';\nimport ExpandMore from '@mui/icons-material/ExpandMore';\nimport Box from '@mui/material/Box/index.js';\nimport Collapse from '@mui/material/Collapse/index.js';\nimport Fade from '@mui/material/Fade/index.js';\nimport Grow from '@mui/material/Grow/index.js';\nimport List from '@mui/material/List/index.js';\nimport ListItem from '@mui/material/ListItem/index.js';\nimport ListItemButton from '@mui/material/ListItemButton/index.js';\nimport ListItemIcon from '@mui/material/ListItemIcon/index.js';\nimport ListItemText from '@mui/material/ListItemText/index.js';\nimport Popover from '@mui/material/Popover/index.js';\nimport { alpha, styled } from '@mui/material/styles/index.js';\nimport React, { } from 'react';\n\nimport { useMenuItemState } from './NavigationMenuItem.hooks';\nimport { navItemButtonStyles, pulseGlow } from './NavigationMenu.styles';\nimport type { NavigationMenuItem } from './NavigationMenu.types';\nimport { onMedia, shadowInk, uiInk } from '../../../tokens/ink';\nimport { rem, rems, sxRem } from '../../../tokens/relative';\n\nconst StyledListItem = styled(ListItem, {\n shouldForwardProp: (prop) => !['variant', 'active', 'size', 'level'].includes(prop as string) })<{ variant?: string; active?: boolean; size?: string; level?: number }>(\n ({ theme, variant, level = 0 }) => ({\n padding: 0,\n ...(variant === 'horizontal' && {\n width: 'auto' }),\n ...(level > 0 && {\n paddingLeft: theme.spacing(2 * level) }) }),\n);\n\nconst StyledListItemButton = styled(ListItemButton, {\n shouldForwardProp: (prop) => !['variant', 'active', 'size', 'collapsed', 'minimal'].includes(prop as string) })<{ variant?: string; active?: boolean; size?: string; collapsed?: boolean; minimal?: boolean }>(\n ({ theme, variant, active, size, collapsed, minimal }) => ({\n ...navItemButtonStyles({ theme, variant, active, size, collapsed, minimal }) }),\n);\n\ninterface MenuItemRendererProps {\n item: NavigationMenuItem;\n variant: string;\n size: string;\n collapsed: boolean;\n minimal: boolean;\n level: number;\n onItemClick?: (item: NavigationMenuItem) => void;\n}\n\n// Hover intent and open/anchor state live in NavigationMenuItem.hooks.\n\n// The flyout a horizontal menu opens on hover.\nconst MenuItemPopover: React.FC<{\n anchorEl: HTMLElement | null;\n item: NavigationMenuItem;\n size?: string;\n minimal?: boolean;\n onClose: () => void;\n onMouseEnter: () => void;\n onMouseLeave: () => void;\n onItemClick?: (item: NavigationMenuItem) => void;\n}> = ({ anchorEl, item, size, minimal, onClose, onMouseEnter, onMouseLeave, onItemClick }) => (\n <Popover\n open={Boolean(anchorEl)}\n anchorEl={anchorEl}\n onClose={onClose}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left' }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'left' }}\n disableRestoreFocus\n sx={{\n pointerEvents: 'none' }}\n slotProps={{\n paper: {\n onMouseEnter,\n onMouseLeave,\n sx: {\n pointerEvents: 'auto',\n mt: 0.5,\n borderRadius: 2,\n boxShadow: (theme) => `0 ${rems(theme, 12, 40)} ${shadowInk(theme, 0.15)}`,\n border: (theme) => `1px solid ${alpha(theme.palette.divider, 0.1)}`,\n background: (theme) =>\n `linear-gradient(145deg, ${theme.palette.background.paper} 0%, ${alpha(theme.palette.background.default, 0.95)} 100%)`,\n backdropFilter: (theme) => `blur(${rem(theme, 10)})`,\n minWidth: sxRem(200) } } }}\n >\n <List sx={{ p: 1 }}>\n {item.children?.map((child) => {\n const childHasChildren = child.children && child.children.length > 0;\n\n // Only close popover when clicking leaf nodes (items without children)\n if (childHasChildren) {\n return renderMenuItem(child, 'vertical', size, false, minimal, 0, onItemClick);\n }\n\n // For leaf nodes, wrap with onClick to close the popover\n return (\n <Box\n key={child.id}\n onClick={onClose}\n >\n {renderMenuItem(child, 'vertical', size, false, minimal, 0, onItemClick)}\n </Box>\n );\n })}\n </List>\n </Popover>\n);\n\n// Label, badge/chip and the expand chevron, faded out when the rail collapses.\nconst MenuItemLabel: React.FC<{\n item: NavigationMenuItem;\n collapsed?: boolean;\n minimal?: boolean;\n open: boolean;\n hasChildren?: boolean;\n size?: string;\n variant?: string;\n}> = ({ item, collapsed, open, hasChildren, size, variant }) => (\n <Fade in={!collapsed} timeout={400}>\n <Box sx={{ display: 'flex', alignItems: 'center', width: '100%', gap: 1 }}>\n <ListItemText\n primary={item.label}\n secondary={item.description}\n sx={{\n flex: 1,\n minWidth: 0, // Allows text truncation if needed\n }}\n slotProps={{\n primary: {\n variant: size === 'sm' ? 'body2' : size === 'lg' ? 'h6' : 'body1',\n sx: {\n fontWeight: item.active ? 600 : 400,\n transition: 'all 0.3s ease' } },\n secondary: {\n sx: {\n opacity: 0.7,\n transition: 'all 0.3s ease' } } }}\n />\n {item.badge && (\n <Box\n component=\"span\"\n sx={{\n flexShrink: 0,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: sxRem(20),\n height: sxRem(20),\n px: 0.75,\n borderRadius: sxRem(10),\n fontSize: sxRem(12),\n fontWeight: 600,\n color: (theme) => onMedia(theme),\n background: (theme) =>\n `linear-gradient(135deg, ${uiInk(theme).attention.from} 0%, ${uiInk(theme).attention.to} 100%)`,\n boxShadow: (theme) => `0 ${rems(theme, 2, 8)} ${alpha(uiInk(theme).attention.glow, 0.4)}`,\n animation: (theme) =>\n typeof item.badge === 'number' && item.badge > 0\n ? `${pulseGlow(theme)} 2s infinite`\n : 'none' }}\n >\n {item.badge}\n </Box>\n )}\n {hasChildren && (\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n flexShrink: 0, // Prevents expand icon from shrinking\n transition: 'transform 0.3s ease',\n transform: open ? 'rotate(180deg)' : 'rotate(0deg)' }}\n >\n {variant === 'horizontal' ? <ChevronRight fontSize=\"small\" /> : <ExpandMore />}\n </Box>\n )}\n </Box>\n </Fade>\n);\n\n// The row itself: icon, label, badge and the expand chevron.\nconst MenuItemContent: React.FC<{\n item: NavigationMenuItem;\n variant?: string;\n size?: string;\n active?: boolean;\n collapsed?: boolean;\n minimal?: boolean;\n level: number;\n open: boolean;\n hasChildren?: boolean;\n onClick: (event: React.MouseEvent<HTMLElement>) => void;\n onMouseEnter: (event: React.MouseEvent<HTMLElement>) => void;\n onMouseLeave: () => void;\n}> = ({\n item,\n variant,\n size,\n active: _active,\n collapsed,\n minimal,\n level,\n open,\n hasChildren,\n onClick,\n onMouseEnter,\n onMouseLeave }) => (\n<StyledListItem key={item.id} variant={variant} active={item.active} size={size} level={level}>\n <StyledListItemButton\n variant={variant}\n active={item.active}\n size={size}\n collapsed={collapsed}\n minimal={minimal}\n disabled={item.disabled}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n {...(item.href && !hasChildren\n ? {\n component: 'a' as React.ElementType,\n href: item.href,\n target: item.target }\n : {})}\n >\n {item.icon && (\n <ListItemIcon\n sx={{\n minWidth: collapsed ? 0 : sxRem(40),\n justifyContent: 'center',\n transition: 'all 0.3s ease',\n '& svg': {\n filter: (theme) => (item.active ? `drop-shadow(0 ${rems(theme, 2, 8)} ${shadowInk(theme, 0.15)})` : 'none'),\n transition: 'all 0.3s ease' } }}\n >\n <Grow in={true} timeout={600}>\n <Box>{item.icon}</Box>\n </Grow>\n </ListItemIcon>\n )}\n {!collapsed && (\n <MenuItemLabel\n item={item}\n collapsed={collapsed}\n minimal={minimal}\n open={open}\n hasChildren={hasChildren}\n size={size}\n variant={variant}\n />\n )}\n </StyledListItemButton>\n </StyledListItem>\n);\n\nconst MenuItemRenderer: React.FC<MenuItemRendererProps> = ({\n item,\n variant,\n size,\n collapsed,\n minimal,\n level,\n onItemClick }) => {\n const {\n open,\n anchorEl,\n hasChildren,\n handleClick,\n handleMouseEnter,\n handleMouseLeave,\n handlePopoverMouseEnter,\n handlePopoverMouseLeave,\n closePopover } = useMenuItemState({ item, variant, onItemClick });\n\n const itemContent = (\n <MenuItemContent\n item={item}\n variant={variant}\n size={size}\n active={item.active}\n collapsed={collapsed}\n minimal={minimal}\n level={level}\n open={open}\n hasChildren={hasChildren}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n />\n );\n\n // Horizontal variant with children - use Popover\n if (hasChildren && variant === 'horizontal') {\n return (\n <React.Fragment key={item.id}>\n {itemContent}\n <MenuItemPopover\n anchorEl={anchorEl}\n item={item}\n size={size}\n minimal={minimal}\n onClose={closePopover}\n onMouseEnter={handlePopoverMouseEnter}\n onMouseLeave={handlePopoverMouseLeave}\n onItemClick={onItemClick}\n />\n </React.Fragment>\n );\n }\n\n // Vertical variant with children - use Collapse\n if (hasChildren && variant !== 'horizontal') {\n return (\n <React.Fragment key={item.id}>\n {itemContent}\n {!collapsed && (\n <Collapse in={open} timeout=\"auto\" unmountOnExit>\n <List component=\"div\" disablePadding>\n {item.children?.map((child) =>\n renderMenuItem(child, variant, size, collapsed, minimal, level + 1, onItemClick),\n )}\n </List>\n </Collapse>\n )}\n </React.Fragment>\n );\n }\n\n return itemContent;\n};\n\nexport const renderMenuItem = (\n item: NavigationMenuItem,\n variant: string = 'vertical',\n size: string = 'md',\n collapsed: boolean = false,\n minimal: boolean = false,\n level: number = 0,\n onItemClick?: (item: NavigationMenuItem) => void,\n): React.ReactNode => (\n <MenuItemRenderer\n key={item.id}\n item={item}\n variant={variant}\n size={size}\n collapsed={collapsed}\n minimal={minimal}\n level={level}\n onItemClick={onItemClick}\n />\n );\n"],"mappings":"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","names":[]}