style.scss 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. // ─────────────────────────────────────────────────────────────
  2. // /chat — 메인 실시간 채팅 (d2-community §⑤, roomKey=main)
  3. // 색/치수는 app/styles/tokens 변수만 사용 (하드코딩 금지)
  4. // .main(그리드 스크롤 컨테이너)을 height:100% 로 채워 mobile/desktop 모두 전체 높이 사용
  5. // 데스크톱 중앙 컬럼 최대폭 제한 없음 (WIDE fluid — d6 §4)
  6. // ─────────────────────────────────────────────────────────────
  7. #chat-room {
  8. display: flex;
  9. flex-direction: column;
  10. height: 100%;
  11. min-height: 0;
  12. padding: var(--sp-4) var(--sp-5);
  13. gap: var(--sp-3);
  14. @media (max-width: 767.98px) {
  15. padding: var(--sp-3);
  16. }
  17. .chat-room__head {
  18. display: flex;
  19. align-items: center;
  20. justify-content: space-between;
  21. flex-wrap: wrap;
  22. gap: var(--sp-3);
  23. h1 {
  24. font-size: var(--fs-xl);
  25. font-weight: 700;
  26. color: var(--text-primary);
  27. }
  28. }
  29. .chat-room__meta {
  30. display: flex;
  31. align-items: center;
  32. gap: var(--sp-4);
  33. font-size: var(--fs-sm);
  34. color: var(--text-secondary);
  35. }
  36. .chat-room__count {
  37. display: inline-flex;
  38. align-items: center;
  39. gap: var(--sp-2);
  40. font-variant-numeric: tabular-nums;
  41. }
  42. .chat-room__state {
  43. color: var(--text-muted);
  44. &--warn {
  45. color: var(--az-accent);
  46. }
  47. &--error {
  48. color: var(--color-danger);
  49. }
  50. }
  51. .chat-room__notice {
  52. display: flex;
  53. align-items: center;
  54. gap: var(--sp-3);
  55. padding: var(--sp-3) var(--sp-4);
  56. background: var(--bg-subtle);
  57. border: 1px solid var(--border-default);
  58. border-radius: var(--radius);
  59. font-size: var(--fs-sm);
  60. color: var(--text-secondary);
  61. svg {
  62. flex-shrink: 0;
  63. color: var(--az-accent);
  64. }
  65. }
  66. .chat-room__body {
  67. position: relative;
  68. display: flex;
  69. flex: 1;
  70. min-height: 0;
  71. }
  72. .chat-room__messages {
  73. flex: 1;
  74. min-height: 0;
  75. overflow-y: auto;
  76. padding: var(--sp-3);
  77. background: var(--bg-elevated);
  78. border: 1px solid var(--border-default);
  79. border-radius: var(--radius);
  80. }
  81. .chat-room__empty {
  82. padding: var(--sp-6) var(--sp-4);
  83. text-align: center;
  84. font-size: var(--fs-sm);
  85. color: var(--text-muted);
  86. }
  87. .chat-room__message {
  88. display: flex;
  89. align-items: baseline;
  90. gap: var(--sp-3);
  91. padding: var(--sp-2) var(--sp-3);
  92. font-size: var(--fs-base);
  93. line-height: 1.5;
  94. border-radius: var(--radius);
  95. &:hover {
  96. background: var(--bg-subtle-hover);
  97. }
  98. }
  99. .chat-room__time {
  100. flex-shrink: 0;
  101. font-size: var(--fs-2xs);
  102. color: var(--text-muted);
  103. font-variant-numeric: tabular-nums;
  104. }
  105. .chat-room__badge {
  106. flex-shrink: 0;
  107. align-self: center;
  108. width: var(--sp-5);
  109. height: var(--sp-5);
  110. object-fit: contain;
  111. }
  112. .chat-room__name {
  113. flex-shrink: 0;
  114. font-weight: 600;
  115. color: var(--title-color, var(--text-secondary));
  116. }
  117. .chat-room__content {
  118. color: var(--text-primary);
  119. word-break: break-word;
  120. overflow-wrap: anywhere;
  121. }
  122. // 시스템 메시지 — 일반 메시지와 스타일 구분
  123. .chat-room__system {
  124. padding: var(--sp-2) var(--sp-3);
  125. text-align: center;
  126. font-size: var(--fs-xs);
  127. font-style: italic;
  128. color: var(--text-muted);
  129. }
  130. // "새 메시지 ↓" 점프 버튼 — 위로 스크롤 중 새 메시지 도착 시 노출
  131. .chat-room__jump {
  132. position: absolute;
  133. bottom: var(--sp-4);
  134. left: 50%;
  135. transform: translateX(-50%);
  136. display: inline-flex;
  137. align-items: center;
  138. gap: var(--sp-2);
  139. padding: var(--sp-2) var(--sp-4);
  140. background: var(--az-accent);
  141. color: var(--btn-primary-text);
  142. font-size: var(--fs-sm);
  143. font-weight: 600;
  144. border: none;
  145. border-radius: var(--fs-2xl);
  146. cursor: pointer;
  147. box-shadow: 0 var(--sp-1) var(--sp-3) var(--shadow-color);
  148. &:hover {
  149. background: var(--az-accent-hover);
  150. }
  151. }
  152. .chat-room__footer {
  153. display: flex;
  154. flex-direction: column;
  155. gap: var(--sp-2);
  156. }
  157. .chat-room__input-row {
  158. display: flex;
  159. gap: var(--sp-3);
  160. input {
  161. flex: 1;
  162. min-width: 0;
  163. padding: var(--sp-3) var(--sp-4);
  164. background: var(--bg-input);
  165. color: var(--text-primary);
  166. font-size: var(--fs-base);
  167. border: 1px solid var(--border-strong);
  168. border-radius: var(--radius);
  169. &::placeholder {
  170. color: var(--text-muted);
  171. }
  172. &:disabled {
  173. opacity: 0.6;
  174. cursor: not-allowed;
  175. }
  176. }
  177. button {
  178. flex-shrink: 0;
  179. min-width: var(--sp-7);
  180. padding: var(--sp-3) var(--sp-5);
  181. background: var(--az-accent);
  182. color: var(--btn-primary-text);
  183. font-size: var(--fs-base);
  184. font-weight: 600;
  185. border: none;
  186. border-radius: var(--radius);
  187. cursor: pointer;
  188. &:hover:not(:disabled) {
  189. background: var(--az-accent-hover);
  190. }
  191. &:disabled {
  192. background: var(--bg-subtle);
  193. color: var(--text-muted);
  194. cursor: not-allowed;
  195. }
  196. }
  197. }
  198. .chat-room__cooldown {
  199. font-variant-numeric: tabular-nums;
  200. }
  201. .chat-room__input-meta {
  202. display: flex;
  203. align-items: center;
  204. gap: var(--sp-4);
  205. font-size: var(--fs-xs);
  206. color: var(--text-muted);
  207. }
  208. .chat-room__cooldown-left {
  209. color: var(--az-accent);
  210. font-variant-numeric: tabular-nums;
  211. }
  212. .chat-room__counter {
  213. margin-left: auto;
  214. font-variant-numeric: tabular-nums;
  215. }
  216. // 게스트 CTA — 읽기는 가능, 입력 대신 로그인 유도
  217. .chat-room__guest {
  218. display: flex;
  219. align-items: center;
  220. justify-content: space-between;
  221. flex-wrap: wrap;
  222. gap: var(--sp-3);
  223. padding: var(--sp-4);
  224. background: var(--bg-subtle);
  225. border: 1px solid var(--border-default);
  226. border-radius: var(--radius);
  227. font-size: var(--fs-sm);
  228. color: var(--text-secondary);
  229. }
  230. .chat-room__login-cta {
  231. padding: var(--sp-2) var(--sp-5);
  232. background: var(--az-accent);
  233. color: var(--btn-primary-text);
  234. font-weight: 600;
  235. border-radius: var(--radius);
  236. &:hover {
  237. background: var(--az-accent-hover);
  238. }
  239. }
  240. .chat-room__blocked {
  241. padding: var(--sp-4);
  242. text-align: center;
  243. background: var(--color-danger-bg);
  244. border: 1px solid var(--color-danger-border);
  245. border-radius: var(--radius);
  246. font-size: var(--fs-sm);
  247. color: var(--color-danger);
  248. }
  249. }