import React, { HTMLProps } from 'react'; import { css, cx } from 'emotion'; import { GrafanaTheme } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; import { Icon } from '../Icon/Icon'; import { IconName } from '../../types'; import { stylesFactory, useTheme } from '../../themes'; import { Counter } from './Counter'; export interface TabProps extends HTMLProps { label: string; active?: boolean; /** When provided, it is possible to use the tab as a hyperlink. Use in cases where the tabs update location. */ href?: string; icon?: IconName; onChangeTab?: (event?: React.MouseEvent) => void; /** A number rendered next to the text. Usually used to display the number of items in a tab's view. */ counter?: number | null; } export const Tab = React.forwardRef( ({ label, active, icon, onChangeTab, counter, className, href, ...otherProps }, ref) => { const theme = useTheme(); const tabsStyles = getTabStyles(theme); const content = () => ( <> {icon && } {label} {typeof counter === 'number' && } ); return (
  • {href ? ( {content()} ) : ( <>{content()} )}
  • ); } ); Tab.displayName = 'Tab'; const getTabStyles = stylesFactory((theme: GrafanaTheme) => { const colors = theme.colors; return { tabItem: css` list-style: none; margin-right: ${theme.spacing.md}; position: relative; display: block; border: solid transparent; border-width: 0 1px 1px; border-radius: ${theme.border.radius.md} ${theme.border.radius.md} 0 0; color: ${colors.text}; cursor: pointer; svg { margin-right: ${theme.spacing.sm}; } a { display: block; height: 100%; } &:hover, &:focus { color: ${colors.linkHover}; } `, padding: css` padding: 11px 15px 9px; `, activeStyle: css` label: activeTabStyle; border-color: ${theme.palette.orange} ${colors.pageHeaderBorder} transparent; background: ${colors.bodyBg}; color: ${colors.link}; overflow: hidden; &::before { display: block; content: ' '; position: absolute; left: 0; right: 0; height: 2px; top: 0; background-image: linear-gradient(to right, #f05a28 30%, #fbca0a 99%); } `, }; });