community.scss 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550
  1. // ─────────────────────────────────────────────────────────────
  2. // D2 커뮤니티 — 예측 배지 / 트랙레코드 배지 / $종목 태그 / 종목 토론 / 리더보드 / 트렌딩
  3. // 토큰 변수만 사용 (색·간격·타이포). 등락엔 포인트 컬러(--az-accent) 미사용.
  4. // ─────────────────────────────────────────────────────────────
  5. // ── 예측 배지 (방향 + 기간 + 상태) ──
  6. .prediction-badge {
  7. display: inline-flex;
  8. align-items: center;
  9. gap: var(--sp-2);
  10. padding: 2px 8px;
  11. border: 1px solid var(--border-strong);
  12. border-radius: 999px;
  13. font-size: var(--fs-2xs);
  14. line-height: 1.6;
  15. white-space: nowrap;
  16. vertical-align: middle;
  17. &__dir {
  18. display: inline-flex;
  19. align-items: center;
  20. gap: 2px;
  21. font-weight: 700;
  22. font-variant-numeric: tabular-nums;
  23. &--up {
  24. color: var(--price-up);
  25. }
  26. &--down {
  27. color: var(--price-down);
  28. }
  29. }
  30. &__horizon {
  31. color: var(--text-muted);
  32. }
  33. &__target {
  34. color: var(--text-secondary);
  35. font-variant-numeric: tabular-nums;
  36. }
  37. // 상태 점 + 라벨
  38. &__status {
  39. display: inline-flex;
  40. align-items: center;
  41. gap: 4px;
  42. font-weight: 600;
  43. }
  44. &__dot {
  45. width: 6px;
  46. height: 6px;
  47. border-radius: 50%;
  48. background: var(--text-muted);
  49. }
  50. &--pending &__status { color: var(--text-muted); }
  51. &--pending &__dot { background: var(--text-muted); }
  52. &--hit &__status { color: var(--price-up); }
  53. &--hit &__dot { background: var(--price-up); }
  54. &--miss &__status { color: var(--price-down); }
  55. &--miss &__dot { background: var(--price-down); }
  56. &--void &__status { color: var(--text-muted); }
  57. &--void &__dot { background: var(--text-muted); }
  58. // 상세 뷰용 확장 배지
  59. &--detail {
  60. padding: var(--sp-3) var(--sp-4);
  61. border-radius: 8px;
  62. font-size: var(--fs-sm);
  63. gap: var(--sp-4);
  64. }
  65. }
  66. // 상세 뷰 예측 배지 래퍼
  67. .post-prediction {
  68. margin-bottom: var(--sp-4);
  69. }
  70. // 작은 예측 표식 (목록 행에서 아이콘만)
  71. .prediction-tag {
  72. display: inline-flex;
  73. align-items: center;
  74. gap: 3px;
  75. font-size: var(--fs-2xs);
  76. font-weight: 700;
  77. vertical-align: middle;
  78. &--up { color: var(--price-up); }
  79. &--down { color: var(--price-down); }
  80. &--flat { color: var(--text-muted); }
  81. }
  82. // ── 트랙레코드 등급 배지 ──
  83. .tier-badge {
  84. display: inline-flex;
  85. align-items: center;
  86. gap: 4px;
  87. padding: 1px 8px;
  88. border-radius: 999px;
  89. border: 1px solid var(--border-strong);
  90. font-size: var(--fs-2xs);
  91. font-weight: 700;
  92. line-height: 1.6;
  93. white-space: nowrap;
  94. vertical-align: middle;
  95. &__icon {
  96. font-size: 0.9em;
  97. }
  98. &--none {
  99. color: var(--text-muted);
  100. border-color: var(--border-default);
  101. }
  102. &--bronze {
  103. color: #a15c2f;
  104. border-color: #a15c2f;
  105. }
  106. &--silver {
  107. color: #7a7f87;
  108. border-color: #9aa0a8;
  109. }
  110. &--gold {
  111. color: #b8860b;
  112. border-color: #d4a017;
  113. }
  114. &--goldant {
  115. color: #fff;
  116. background: linear-gradient(135deg, #d4a017, #b8860b);
  117. border-color: #b8860b;
  118. }
  119. }
  120. // ── $종목 태그 (본문 인라인 배지) ──
  121. .stock-tag {
  122. display: inline-flex;
  123. align-items: baseline;
  124. gap: 3px;
  125. padding: 0 5px;
  126. border-radius: 4px;
  127. background: var(--bg-subtle-hover);
  128. border: 1px solid var(--border-light);
  129. color: var(--text-primary);
  130. font-size: 0.95em;
  131. text-decoration: none;
  132. white-space: nowrap;
  133. &:hover {
  134. border-color: var(--az-accent);
  135. color: var(--az-accent);
  136. }
  137. &__code {
  138. color: var(--text-muted);
  139. font-variant-numeric: tabular-nums;
  140. font-size: 0.85em;
  141. }
  142. &--missing {
  143. color: var(--text-secondary);
  144. }
  145. }
  146. // ── 종목 토론 탭 (/stock/[code]?tab=discussion) ──
  147. .stock-discussion {
  148. // 통계 헤더
  149. &__stats {
  150. display: flex;
  151. flex-wrap: wrap;
  152. align-items: center;
  153. gap: var(--sp-3) var(--sp-6);
  154. padding-bottom: var(--sp-4);
  155. margin-bottom: var(--sp-4);
  156. border-bottom: 1px solid var(--border-default);
  157. span {
  158. font-size: var(--fs-xs);
  159. color: var(--text-muted);
  160. strong {
  161. color: var(--text-primary);
  162. font-variant-numeric: tabular-nums;
  163. margin-left: var(--sp-2);
  164. }
  165. }
  166. }
  167. &__head {
  168. display: flex;
  169. align-items: center;
  170. justify-content: space-between;
  171. gap: var(--sp-4);
  172. margin-bottom: var(--sp-3);
  173. }
  174. &__table {
  175. width: 100%;
  176. border-collapse: collapse;
  177. thead th {
  178. height: var(--row-h);
  179. padding: 0 var(--cell-px);
  180. font-size: var(--cell-fs);
  181. font-weight: 600;
  182. color: var(--text-muted);
  183. text-align: left;
  184. border-bottom: 1px solid var(--border-strong);
  185. &.stock-discussion__col--num,
  186. &.stock-discussion__col--num-h { text-align: center; width: 48px; }
  187. }
  188. tbody td {
  189. height: var(--row-h);
  190. padding: 0 var(--cell-px);
  191. font-size: var(--cell-fs);
  192. color: var(--text-primary);
  193. border-bottom: 1px solid var(--border-light);
  194. vertical-align: middle;
  195. }
  196. tbody tr:hover {
  197. background: var(--bg-subtle-hover);
  198. }
  199. &-num { text-align: center; color: var(--text-muted); font-variant-numeric: tabular-nums; }
  200. &-meta { color: var(--text-muted); font-variant-numeric: tabular-nums; white-space: nowrap; text-align: right; }
  201. }
  202. &__subject {
  203. display: inline-flex;
  204. align-items: center;
  205. gap: var(--sp-2);
  206. color: var(--text-primary);
  207. &:hover { color: var(--az-accent); }
  208. em { font-style: normal; }
  209. .stock-discussion__comments { color: var(--az-accent); font-size: 0.9em; }
  210. }
  211. &__empty,
  212. &__error {
  213. padding: var(--sp-7) var(--sp-5);
  214. font-size: var(--fs-base);
  215. color: var(--text-muted);
  216. text-align: center;
  217. }
  218. // mobile drop
  219. @media (max-width: 767.98px) {
  220. &__col--author,
  221. &__col--views { display: none; }
  222. }
  223. }
  224. // ── 종목 글쓰기 폼 (토론 탭 내) ──
  225. .stock-write {
  226. margin-top: var(--sp-5);
  227. padding: var(--sp-5);
  228. border: 1px solid var(--border-default);
  229. border-radius: 8px;
  230. background: var(--bg-elevated);
  231. &__title {
  232. font-size: var(--fs-base);
  233. font-weight: 600;
  234. color: var(--text-primary);
  235. margin-bottom: var(--sp-4);
  236. }
  237. &__field {
  238. margin-bottom: var(--sp-4);
  239. label {
  240. display: block;
  241. font-size: var(--fs-xs);
  242. color: var(--text-secondary);
  243. margin-bottom: var(--sp-2);
  244. }
  245. input[type='text'],
  246. input[type='number'],
  247. textarea,
  248. select {
  249. width: 100%;
  250. padding: var(--sp-3);
  251. border: 1px solid var(--border-strong);
  252. border-radius: 6px;
  253. background: var(--bg-base, var(--bg-elevated));
  254. color: var(--text-primary);
  255. font-size: var(--fs-sm);
  256. &:focus {
  257. outline: none;
  258. border-color: var(--az-accent);
  259. }
  260. }
  261. textarea { min-height: 120px; resize: vertical; }
  262. }
  263. &__prediction {
  264. margin-top: var(--sp-4);
  265. padding: var(--sp-4);
  266. border: 1px dashed var(--border-strong);
  267. border-radius: 6px;
  268. }
  269. &__prediction-head {
  270. display: flex;
  271. align-items: center;
  272. gap: var(--sp-3);
  273. margin-bottom: var(--sp-4);
  274. font-size: var(--fs-sm);
  275. color: var(--text-secondary);
  276. }
  277. &__prediction-grid {
  278. display: grid;
  279. grid-template-columns: repeat(3, 1fr);
  280. gap: var(--sp-3);
  281. @media (max-width: 640px) {
  282. grid-template-columns: 1fr;
  283. }
  284. }
  285. &__actions {
  286. display: flex;
  287. justify-content: flex-end;
  288. gap: var(--sp-3);
  289. margin-top: var(--sp-4);
  290. }
  291. &__btn {
  292. padding: var(--sp-3) var(--sp-5);
  293. border-radius: 6px;
  294. font-size: var(--fs-sm);
  295. font-weight: 600;
  296. border: 1px solid var(--border-strong);
  297. background: transparent;
  298. color: var(--text-primary);
  299. cursor: pointer;
  300. &--primary {
  301. background: var(--az-accent);
  302. border-color: var(--az-accent);
  303. color: #fff;
  304. }
  305. &:disabled { opacity: 0.5; cursor: not-allowed; }
  306. }
  307. &__hint {
  308. margin-top: var(--sp-3);
  309. font-size: var(--fs-2xs);
  310. color: var(--text-muted);
  311. }
  312. &__error {
  313. margin-top: var(--sp-3);
  314. font-size: var(--fs-xs);
  315. color: var(--color-danger);
  316. }
  317. }
  318. .stock-write-toggle {
  319. display: inline-flex;
  320. align-items: center;
  321. gap: var(--sp-2);
  322. padding: var(--sp-2) var(--sp-4);
  323. border-radius: 6px;
  324. font-size: var(--fs-sm);
  325. font-weight: 600;
  326. background: var(--az-accent);
  327. color: #fff;
  328. border: none;
  329. cursor: pointer;
  330. }
  331. .stock-write-login {
  332. margin-top: var(--sp-4);
  333. padding: var(--sp-4);
  334. font-size: var(--fs-sm);
  335. color: var(--text-muted);
  336. text-align: center;
  337. border: 1px dashed var(--border-default);
  338. border-radius: 8px;
  339. a { color: var(--az-accent); font-weight: 600; }
  340. }
  341. // ── 적중률 리더보드 (/ranking/track-record) ──
  342. .track-leaderboard {
  343. padding: var(--sp-6) var(--sp-7);
  344. @media (max-width: 767.98px) {
  345. padding: var(--sp-5) var(--sp-4);
  346. }
  347. &__head {
  348. margin-bottom: var(--sp-5);
  349. }
  350. &__title {
  351. font-size: var(--fs-2xl);
  352. font-weight: 700;
  353. color: var(--text-primary);
  354. }
  355. &__subtitle {
  356. display: block;
  357. margin-top: var(--sp-2);
  358. font-size: var(--fs-xs);
  359. color: var(--text-muted);
  360. }
  361. &__rank {
  362. font-variant-numeric: tabular-nums;
  363. font-weight: 700;
  364. color: var(--text-secondary);
  365. }
  366. &__name {
  367. color: var(--text-primary);
  368. &:hover { color: var(--az-accent); }
  369. }
  370. &__hitrate {
  371. font-variant-numeric: tabular-nums;
  372. font-weight: 700;
  373. color: var(--text-primary);
  374. }
  375. &__error,
  376. &__empty {
  377. padding: var(--sp-7) var(--sp-5);
  378. text-align: center;
  379. color: var(--text-muted);
  380. }
  381. &__table-wrap {
  382. overflow-x: auto;
  383. }
  384. &__actions {
  385. display: flex;
  386. align-items: center;
  387. justify-content: center;
  388. gap: var(--sp-3);
  389. margin-top: var(--sp-5);
  390. }
  391. &__btn {
  392. padding: var(--sp-2) var(--sp-5);
  393. border: 1px solid var(--border-strong);
  394. border-radius: 6px;
  395. font-size: var(--fs-sm);
  396. color: var(--text-primary);
  397. &:hover { border-color: var(--az-accent); }
  398. }
  399. }
  400. // ── 트렌딩 위젯 (지금 뜨는 종목) ──
  401. .trending-widget {
  402. &__title {
  403. display: flex;
  404. align-items: center;
  405. gap: var(--sp-2);
  406. font-size: var(--fs-sm);
  407. font-weight: 700;
  408. color: var(--text-primary);
  409. margin-bottom: var(--sp-3);
  410. }
  411. &__list {
  412. display: flex;
  413. flex-direction: column;
  414. }
  415. &__item {
  416. display: flex;
  417. align-items: center;
  418. gap: var(--sp-3);
  419. padding: var(--sp-2) 0;
  420. border-bottom: 1px solid var(--border-light);
  421. font-size: var(--fs-xs);
  422. color: var(--text-primary);
  423. &:last-child { border-bottom: none; }
  424. &:hover { color: var(--az-accent); }
  425. }
  426. &__rank {
  427. width: 18px;
  428. text-align: center;
  429. font-weight: 700;
  430. color: var(--text-muted);
  431. font-variant-numeric: tabular-nums;
  432. }
  433. &__name {
  434. flex: 1;
  435. overflow: hidden;
  436. text-overflow: ellipsis;
  437. white-space: nowrap;
  438. }
  439. &__price {
  440. font-variant-numeric: tabular-nums;
  441. color: var(--text-secondary);
  442. }
  443. &__posts {
  444. color: var(--text-muted);
  445. font-variant-numeric: tabular-nums;
  446. }
  447. &__empty {
  448. font-size: var(--fs-xs);
  449. color: var(--text-muted);
  450. padding: var(--sp-3) 0;
  451. }
  452. }
  453. // 프로필 트랙레코드 탭에서 상단 배지 줄
  454. .track-summary {
  455. display: flex;
  456. align-items: center;
  457. gap: var(--sp-3);
  458. margin-bottom: var(--sp-4);
  459. &__label {
  460. font-size: var(--fs-xs);
  461. color: var(--text-muted);
  462. }
  463. }