1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- import {css} from '@emotion/react';
- import styled from '@emotion/styled';
- import space from 'sentry/styles/space';
- import TextBlock from 'sentry/views/settings/components/text/textBlock';
- interface Props extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
- action?: React.ReactElement;
- description?: React.ReactNode;
- icon?: React.ReactNode;
- leftAligned?: boolean;
- size?: 'large' | 'medium';
- title?: React.ReactNode;
- }
- type WrapperProps = Pick<Props, 'size'>;
- const EmptyMessage = styled(
- ({
- title,
- description,
- icon,
- children,
- action,
- leftAligned: _leftAligned,
- ...props
- }: Props) => (
- <div data-test-id="empty-message" {...props}>
- {icon && <IconWrapper>{icon}</IconWrapper>}
- {title && <Title noMargin={!description && !children && !action}>{title}</Title>}
- {description && <Description>{description}</Description>}
- {children && <Description noMargin>{children}</Description>}
- {action && <Action>{action}</Action>}
- </div>
- )
- )<WrapperProps>`
- display: flex;
- ${p =>
- p.leftAligned
- ? css`
- max-width: 70%;
- align-items: flex-start;
- padding: ${space(4)};
- `
- : css`
- text-align: center;
- align-items: center;
- padding: ${space(4)} 15%;
- `};
- flex-direction: column;
- color: ${p => p.theme.textColor};
- font-size: ${p =>
- p.size && p.size === 'large' ? p.theme.fontSizeExtraLarge : p.theme.fontSizeMedium};
- `;
- const IconWrapper = styled('div')`
- color: ${p => p.theme.gray200};
- margin-bottom: ${space(1)};
- `;
- const Title = styled('strong')<{noMargin: boolean}>`
- font-size: ${p => p.theme.fontSizeExtraLarge};
- ${p => !p.noMargin && `margin-bottom: ${space(1)};`}
- `;
- const Description = styled(TextBlock)`
- margin: 0;
- `;
- const Action = styled('div')`
- margin-top: ${space(2)};
- `;
- export default EmptyMessage;
|