pageHeader.tsx 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import styled from '@emotion/styled';
  2. import {space} from 'sentry/styles/space';
  3. type Props = Omit<React.HTMLProps<HTMLHeadingElement>, 'title'> & {
  4. title: React.ReactNode;
  5. breadcrumbs?: React.ReactNode[];
  6. };
  7. const Breadcrumbs = styled('div')`
  8. display: flex;
  9. align-items: center;
  10. gap: ${space(1)};
  11. font-size: ${p => p.theme.fontSizeLarge};
  12. & > *:not(:first-child) {
  13. display: flex;
  14. align-items: center;
  15. gap: ${space(1)};
  16. &:before {
  17. content: '\u203A';
  18. }
  19. }
  20. `;
  21. const Heading = styled('h1')`
  22. font-size: ${p => p.theme.fontSizeExtraLarge};
  23. text-transform: uppercase;
  24. margin: 0;
  25. `;
  26. const PageHeader = styled(({children, title, breadcrumbs, ...props}: Props) => (
  27. <header {...props}>
  28. <Breadcrumbs>
  29. <Heading>{title}</Heading>
  30. {breadcrumbs?.map((item, i) => <div key={i}>{item}</div>)}
  31. </Breadcrumbs>
  32. {children}
  33. </header>
  34. ))`
  35. padding: 0;
  36. margin: ${space(2)} 0;
  37. display: flex;
  38. align-items: center;
  39. justify-content: space-between;
  40. min-height: 40px;
  41. `;
  42. export default PageHeader;