fieldWrapper.tsx 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import {css} from '@emotion/react';
  2. import styled from '@emotion/styled';
  3. import space from 'sentry/styles/space';
  4. import {FieldGroupProps} from './types';
  5. type FieldWrapperProps = Pick<
  6. FieldGroupProps,
  7. 'hasControlState' | 'highlighted' | 'inline' | 'stacked'
  8. >;
  9. const inlineStyle = (p: FieldWrapperProps) =>
  10. p.inline
  11. ? css`
  12. align-items: center;
  13. `
  14. : css`
  15. flex-direction: column;
  16. align-items: stretch;
  17. `;
  18. const getPadding = (p: FieldWrapperProps) =>
  19. p.stacked && !p.inline
  20. ? css`
  21. padding: 0 ${p.hasControlState ? 0 : space(2)} ${space(2)} 0;
  22. `
  23. : css`
  24. padding: ${space(2)} ${p.hasControlState ? 0 : space(2)} ${space(2)} ${space(2)};
  25. `;
  26. const FieldWrapper = styled('div')<FieldWrapperProps>`
  27. ${getPadding}
  28. ${inlineStyle}
  29. display: flex;
  30. transition: background 0.15s;
  31. ${p =>
  32. !p.stacked &&
  33. css`
  34. border-bottom: 1px solid ${p.theme.innerBorder};
  35. `}
  36. ${p =>
  37. p.highlighted &&
  38. css`
  39. position: relative;
  40. &:after {
  41. content: '';
  42. display: block;
  43. position: absolute;
  44. top: -1px;
  45. left: -1px;
  46. right: -1px;
  47. bottom: -1px;
  48. border: 1px solid ${p.theme.purple300};
  49. pointer-events: none;
  50. }
  51. `}
  52. /* Better padding with form inside of a modal */
  53. ${p =>
  54. !p.hasControlState &&
  55. css`
  56. [role='document'] & {
  57. padding-right: 0;
  58. }
  59. `}
  60. &:last-child {
  61. border-bottom: none;
  62. ${p => (p.stacked ? 'padding-bottom: 0' : '')};
  63. }
  64. `;
  65. export default FieldWrapper;