123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- import {css} from '@emotion/react';
- import styled from '@emotion/styled';
- import {growIn} from 'sentry/styles/animations';
- import {Theme} from 'sentry/utils/theme';
- interface CheckedProps extends React.InputHTMLAttributes<HTMLInputElement> {
- disabled?: boolean;
- radioSize?: 'small';
- }
- const checkedCss = (p: CheckedProps, theme: Theme) => css`
- display: block;
- width: ${p.radioSize === 'small' ? '0.5rem' : '0.875rem'};
- height: ${p.radioSize === 'small' ? '0.5rem' : '0.875rem'};
- border-radius: 50%;
- background-color: ${theme.active};
- animation: 0.2s ${growIn} ease;
- opacity: ${p.disabled ? 0.4 : null};
- `;
- const Radio = styled('input')<CheckedProps>`
- display: flex;
- padding: 0;
- width: ${p => (p.radioSize === 'small' ? '1rem' : '1.5rem')};
- height: ${p => (p.radioSize === 'small' ? '1rem' : '1.5rem')};
- position: relative;
- border-radius: 50%;
- align-items: center;
- justify-content: center;
- border: 1px solid ${p => p.theme.border};
- box-shadow: inset ${p => p.theme.dropShadowLight};
- background: none;
- appearance: none;
- transition: border 0.1s, box-shadow 0.1s;
- /* TODO(bootstrap): Our bootstrap CSS adds this, we can remove when we remove that */
- margin: 0 !important;
- &:focus,
- &.focus-visible {
- outline: none;
- border-color: ${p => p.theme.focusBorder};
- box-shadow: ${p => p.theme.focusBorder} 0 0 0 1px;
- }
- &:checked:after {
- content: '';
- ${p => checkedCss(p, p.theme)}
- }
- `;
- Radio.defaultProps = {
- type: 'radio',
- };
- export default Radio;
|