import {HTMLProps, ReactNode} from 'react'; import styled from '@emotion/styled'; import {HeaderTitle} from 'sentry/styles/organization'; import space from 'sentry/styles/space'; type Props = { // The title title: ReactNode; // CTA button action?: ReactNode; body?: ReactNode; className?: string; // Icon left of title icon?: ReactNode; // Disables font styles in the title. Allows for more custom titles. noTitleStyles?: boolean; subtitle?: ReactNode; tabs?: ReactNode; }; function UnstyledSettingsPageHeader({ icon, title, subtitle, action, body, tabs, noTitleStyles = false, ...props }: Props) { // If Header is narrow, use align-items to center . // Otherwise, use a fixed margin to prevent an odd alignment. // This is needed as Actions could be a button or a dropdown. const isNarrow = !subtitle; return (
{icon && {icon}} {title && ( <HeaderTitle>{title}</HeaderTitle> {subtitle && <Subtitle>{subtitle}</Subtitle>} )} {action && {action}} {body && {body}} {tabs && {tabs}}
); } interface TitleProps extends React.HTMLAttributes { styled?: boolean; tabs?: ReactNode; } const TitleAndActions = styled('div')<{isNarrow?: boolean}>` display: flex; align-items: ${p => (p.isNarrow ? 'center' : 'flex-start')}; `; const TitleWrapper = styled('div')` flex: 1; `; const Title = styled('div')` ${p => !p.styled && `font-size: 20px; font-weight: 600;`}; margin: ${space(4)} ${space(2)} ${space(3)} 0; `; const Subtitle = styled('div')` color: ${p => p.theme.gray400}; font-weight: 400; font-size: ${p => p.theme.fontSizeLarge}; padding: ${space(1.5)} 0 0; `; const Icon = styled('div')` margin-right: ${space(1)}; `; const Action = styled('div')<{isNarrow?: boolean}>` margin-top: ${p => (p.isNarrow ? '0' : space(4))}; `; const SettingsPageHeader = styled(UnstyledSettingsPageHeader)< Omit, keyof Props> & Props >` font-size: 14px; margin-top: -${space(4)}; `; const BodyWrapper = styled('div')` flex: 1; margin: 0 0 ${space(3)}; `; const TabsWrapper = styled('div')` flex: 1; margin: 0; /* sentry/components/navTabs has added margin */ `; export default SettingsPageHeader;