VideoPreviewBase.styles.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import styled from '@emotion/styled'
  2. import { css, keyframes } from '@emotion/core'
  3. import { breakpoints, colors, spacing } from '@/shared/theme'
  4. import { CoverHoverOverlay, CoverIcon, ProgressOverlay } from './VideoPreview.styles'
  5. export const HOVER_BORDER_SIZE = '2px'
  6. type MainProps = {
  7. main: boolean
  8. }
  9. type ContainerProps = {
  10. clickable: boolean
  11. } & MainProps
  12. type ScalesWithCoverProps = {
  13. scalingFactor: number
  14. }
  15. export const MAX_VIDEO_PREVIEW_WIDTH = '320px'
  16. const fadeIn = keyframes`
  17. 0% {
  18. opacity: 0
  19. }
  20. 100% {
  21. opacity: 1
  22. }
  23. `
  24. export const CoverWrapper = styled.div`
  25. max-width: 650px;
  26. width: 100%;
  27. `
  28. export const CoverContainer = styled.div`
  29. position: relative;
  30. width: 100%;
  31. height: 0;
  32. padding-top: 56.25%;
  33. transition-property: box-shadow, transform;
  34. transition-duration: 0.4s;
  35. transition-timing-function: cubic-bezier(0.165, 0.84, 0.44, 1);
  36. animation: ${fadeIn} 0.5s ease-in;
  37. `
  38. const mainContainerCss = css`
  39. @media screen and (min-width: ${breakpoints.medium}) {
  40. flex-direction: row;
  41. }
  42. `
  43. export const Container = styled.article<ContainerProps>`
  44. width: 100%;
  45. color: ${colors.gray[300]};
  46. cursor: ${({ clickable }) => (clickable ? 'pointer' : 'auto')};
  47. display: inline-flex;
  48. flex-direction: column;
  49. ${({ main }) => main && mainContainerCss}
  50. ${({ clickable }) =>
  51. clickable &&
  52. `
  53. &:hover {
  54. ${CoverContainer} {
  55. transform: translate(-${spacing.xs}, -${spacing.xs});
  56. box-shadow: ${spacing.xs} ${spacing.xs} 0 ${colors.blue['500']};
  57. }
  58. ${CoverHoverOverlay} {
  59. opacity: 1;
  60. }
  61. ${CoverIcon} {
  62. transform: translateY(0);
  63. }
  64. ${ProgressOverlay} {
  65. bottom: ${HOVER_BORDER_SIZE};
  66. }
  67. }
  68. `};
  69. `
  70. const mainInfoContainerCss = css`
  71. @media screen and (min-width: ${breakpoints.medium}) {
  72. margin: ${spacing.xxl} 0 0 ${spacing.xl};
  73. }
  74. `
  75. export const InfoContainer = styled.div<MainProps>`
  76. width: 100%;
  77. display: flex;
  78. margin-top: ${({ main }) => (main ? spacing.m : spacing.s)};
  79. ${({ main }) => main && mainInfoContainerCss};
  80. `
  81. export const AvatarContainer = styled.div<ScalesWithCoverProps>`
  82. width: calc(40px * ${(props) => props.scalingFactor});
  83. min-width: calc(40px * ${(props) => props.scalingFactor});
  84. height: calc(40px * ${(props) => props.scalingFactor});
  85. margin-right: ${spacing.xs};
  86. `
  87. export const TextContainer = styled.div`
  88. display: flex;
  89. flex-direction: column;
  90. align-items: start;
  91. width: 100%;
  92. `
  93. export const MetaContainer = styled.div<MainProps>`
  94. margin-top: ${({ main }) => (main ? spacing.s : spacing.xs)};
  95. width: 100%;
  96. `