BroadcastCard.module.scss 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. // 캐러셀 카드
  2. .carousel-card {
  3. flex: 0 0 300px;
  4. background: white;
  5. border-radius: 12px;
  6. overflow: hidden;
  7. box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
  8. transition: transform 0.3s ease, box-shadow 0.3s ease;
  9. cursor: pointer;
  10. display: block;
  11. text-decoration: none;
  12. color: inherit;
  13. &:hover {
  14. transform: translateY(-4px);
  15. box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
  16. }
  17. // 태블릿에서 캐러셀 카드 크기 조정
  18. @media (min-width: 481px) and (max-width: 768px) {
  19. flex: 0 0 280px;
  20. }
  21. // 데스크톱에서 캐러셀 카드 크기 조정
  22. @media (min-width: 769px) {
  23. flex: 0 0 320px;
  24. }
  25. @media (max-width: 480px) {
  26. flex: 0 0 250px;
  27. }
  28. }
  29. .carousel-thumbnail {
  30. position: relative;
  31. width: 100%;
  32. height: 0;
  33. padding-bottom: 56.25%;
  34. overflow: hidden;
  35. background: #f8fafc;
  36. .viewer-count {
  37. position: absolute;
  38. top: 0.5rem;
  39. right: 0.5rem;
  40. background: rgba(0, 0, 0, 0.7);
  41. color: white;
  42. padding: 0.25rem 0.5rem;
  43. border-radius: 4px;
  44. font-size: 0.7rem;
  45. font-weight: bold;
  46. }
  47. .hot-indicator {
  48. position: absolute;
  49. bottom: 0.5rem;
  50. right: 0.5rem;
  51. @media (max-width: 480px) {
  52. bottom: 0.4rem;
  53. right: 0.4rem;
  54. transform: scale(0.8);
  55. }
  56. }
  57. }
  58. .carousel-info {
  59. padding: 1rem;
  60. }
  61. .carousel-title {
  62. font-size: 0.9rem;
  63. font-weight: 600;
  64. color: #1f2937;
  65. margin: 0 0 0.5rem 0;
  66. line-height: 1.3;
  67. display: -webkit-box;
  68. -webkit-line-clamp: 2;
  69. -webkit-box-orient: vertical;
  70. overflow: hidden;
  71. }
  72. .carousel-channel {
  73. font-size: 0.8rem;
  74. color: #6b7280;
  75. margin: 0;
  76. font-weight: 500;
  77. }
  78. // 비디오 카드
  79. .video-card {
  80. border: 1px solid #e5e7eb;
  81. border-radius: 12px;
  82. overflow: hidden;
  83. transition: all 0.3s ease;
  84. background: white;
  85. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
  86. cursor: pointer;
  87. display: block;
  88. text-decoration: none;
  89. color: inherit;
  90. &:hover {
  91. transform: translateY(-6px);
  92. box-shadow: 0 12px 32px rgba(0, 0, 0, 0.15);
  93. border-color: #d1d5db;
  94. }
  95. // 모바일에서 전체 너비 사용
  96. @media (max-width: 479px) {
  97. width: 100%;
  98. max-width: 100%;
  99. box-sizing: border-box;
  100. }
  101. }
  102. .video-thumbnail {
  103. position: relative;
  104. width: 100%;
  105. height: 0;
  106. padding-bottom: 56.25%; // 16:9 비율
  107. overflow: hidden;
  108. background: #f8fafc;
  109. }
  110. // 공통 placeholder 스타일
  111. .placeholder-thumbnail {
  112. position: absolute;
  113. top: 0;
  114. left: 0;
  115. width: 100%;
  116. height: 100%;
  117. display: flex;
  118. flex-direction: column;
  119. align-items: center;
  120. justify-content: center;
  121. background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  122. color: white;
  123. font-weight: 600;
  124. font-size: 0.9rem;
  125. text-align: center;
  126. padding: 1rem;
  127. &::before {
  128. content: "▶";
  129. font-size: 1.5rem;
  130. margin-bottom: 0.5rem;
  131. opacity: 0.8;
  132. }
  133. }
  134. // 공통 LIVE 인디케이터
  135. .live-indicator {
  136. position: absolute;
  137. top: 0.5rem;
  138. left: 0.5rem;
  139. background: rgba(255, 0, 0, 0.9);
  140. color: white;
  141. padding: 0.25rem 0.5rem;
  142. border-radius: 4px;
  143. font-size: 0.7rem;
  144. font-weight: bold;
  145. animation: livePulse 2s infinite;
  146. @media (min-width: 481px) {
  147. top: 0.75rem;
  148. left: 0.75rem;
  149. font-size: 0.75rem;
  150. }
  151. }
  152. .video-info {
  153. padding: 1.2rem;
  154. // 모바일에서 패딩 조정
  155. @media (max-width: 480px) {
  156. padding: 1rem;
  157. }
  158. }
  159. .video-title {
  160. margin: 0 0 0.5rem 0;
  161. font-size: 1.1rem;
  162. font-weight: 600;
  163. color: #1f2937;
  164. line-height: 1.4;
  165. display: -webkit-box;
  166. -webkit-line-clamp: 2;
  167. -webkit-box-orient: vertical;
  168. overflow: hidden;
  169. // 모바일에서 폰트 크기 조정
  170. @media (max-width: 480px) {
  171. font-size: 1rem;
  172. line-height: 1.3;
  173. }
  174. }
  175. .video-meta {
  176. display: flex;
  177. flex-direction: column;
  178. gap: 0.25rem;
  179. color: #6b7280;
  180. font-size: 0.875rem;
  181. // 모바일에서 폰트 크기 조정
  182. @media (max-width: 480px) {
  183. font-size: 0.8rem;
  184. gap: 0.2rem;
  185. }
  186. }
  187. .video-channel {
  188. font-weight: 500;
  189. color: #4b5563;
  190. }
  191. .video-stats {
  192. display: flex;
  193. flex-direction: column;
  194. gap: 0.25rem;
  195. .viewers {
  196. display: flex;
  197. align-items: center;
  198. gap: 0.25rem;
  199. color: #dc2626;
  200. font-weight: 600;
  201. }
  202. .category {
  203. color: #7c3aed;
  204. font-weight: 500;
  205. font-size: 0.8rem;
  206. }
  207. .live-status {
  208. color: #16a34a;
  209. font-weight: 500;
  210. font-size: 0.8rem;
  211. }
  212. }
  213. @keyframes livePulse {
  214. 0%, 100% {
  215. opacity: 1;
  216. }
  217. 50% {
  218. opacity: 0.7;
  219. }
  220. }