import { css, cx } from '@emotion/css';
import React from 'react';
import { GrafanaTheme2, NavModelItem } from '@grafana/data';
import { selectors } from '@grafana/e2e-selectors';
import { useStyles2, Icon } from '@grafana/ui';
import { getNavTitle } from '../NavBar/navBarItem-translations';
export interface Props {
item: NavModelItem;
isSectionRoot?: boolean;
}
export function SectionNavItem({ item, isSectionRoot = false }: Props) {
const styles = useStyles2(getStyles);
const children = item.children?.filter((x) => !x.hideFromTabs);
// If first root child is a section skip the bottom margin (as sections have top margin already)
const noRootMargin = isSectionRoot && Boolean(item.children![0].children?.length);
const linkClass = cx({
[styles.link]: true,
[styles.activeStyle]: item.active,
[styles.isSection]: Boolean(children?.length) || item.isSection,
[styles.isSectionRoot]: isSectionRoot,
[styles.noRootMargin]: noRootMargin,
});
let icon: React.ReactNode | null = null;
if (item.img) {
icon =
;
} else if (item.icon) {
icon = ;
}
return (
<>
{isSectionRoot && icon}
{getNavTitle(item.id) ?? item.text}
{item.tabSuffix && }
{children?.map((child, index) => (
))}
>
);
}
const getStyles = (theme: GrafanaTheme2) => {
return {
link: css`
padding: ${theme.spacing(1, 0, 1, 1.5)};
display: flex;
align-items: center;
border-radius: ${theme.shape.borderRadius(2)};
gap: ${theme.spacing(1)};
height: 100%;
position: relative;
color: ${theme.colors.text.secondary};
&:hover,
&:focus {
text-decoration: underline;
z-index: 1;
}
`,
activeStyle: css`
label: activeTabStyle;
color: ${theme.colors.text.primary};
background: ${theme.colors.emphasize(theme.colors.background.canvas, 0.03)};
&::before {
display: block;
content: ' ';
position: absolute;
left: 0;
width: 4px;
bottom: 2px;
top: 2px;
border-radius: 2px;
background-image: ${theme.colors.gradients.brandVertical};
}
`,
suffix: css`
margin-left: ${theme.spacing(1)};
`,
sectionImg: css({
height: 18,
}),
isSectionRoot: css({
fontSize: theme.typography.h4.fontSize,
marginTop: 0,
marginBottom: theme.spacing(2),
fontWeight: theme.typography.fontWeightMedium,
}),
isSection: css({
color: theme.colors.text.primary,
fontSize: theme.typography.h5.fontSize,
marginTop: theme.spacing(2),
fontWeight: theme.typography.fontWeightMedium,
}),
noRootMargin: css({
marginBottom: 0,
}),
};
};