style.scss 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. // ─────────────────────────────────────────────────────────────
  2. // 모의투자(Paper Trading) 공용 스타일 — /paper, /paper/trade, /paper/portfolio, /paper/leaderboard + 프로필 성적 탭
  3. // D6 디자인 토큰만 사용 (색 하드코딩 금지). BEM 네이밍.
  4. // ─────────────────────────────────────────────────────────────
  5. .paper {
  6. max-width: 960px;
  7. margin: 0 auto;
  8. padding: 16px 16px 40px;
  9. &__head {
  10. display: flex;
  11. align-items: baseline;
  12. justify-content: space-between;
  13. flex-wrap: wrap;
  14. gap: 8px;
  15. margin-bottom: 4px;
  16. }
  17. &__title {
  18. font-size: 1.5rem;
  19. font-weight: 800;
  20. color: var(--fg-default);
  21. }
  22. &__subtitle {
  23. font-size: 0.8125rem;
  24. color: var(--text-muted);
  25. }
  26. // ── 페이지 내 서브 네비 (홈·주문·포트폴리오·리더보드) ──
  27. &__nav {
  28. display: flex;
  29. gap: 4px;
  30. flex-wrap: wrap;
  31. margin: 12px 0 20px;
  32. border-bottom: 1px solid var(--border-default);
  33. }
  34. &__nav-link {
  35. padding: 10px 16px;
  36. font-size: 0.9375rem;
  37. font-weight: 600;
  38. color: var(--text-muted);
  39. text-decoration: none;
  40. border-bottom: 3px solid transparent;
  41. margin-bottom: -1px;
  42. &:hover {
  43. color: var(--fg-default);
  44. }
  45. &--active {
  46. color: var(--fg-default);
  47. border-bottom-color: var(--az-accent);
  48. }
  49. }
  50. // ── 계좌 카드 ──
  51. &__account-card {
  52. border: 1px solid var(--border-default);
  53. border-radius: 12px;
  54. background: var(--bg-card);
  55. padding: 20px;
  56. margin-bottom: 20px;
  57. }
  58. &__metrics {
  59. display: grid;
  60. grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  61. gap: 16px;
  62. }
  63. &__metric {
  64. display: flex;
  65. flex-direction: column;
  66. gap: 4px;
  67. }
  68. &__metric-label {
  69. font-size: 0.75rem;
  70. color: var(--text-muted);
  71. }
  72. &__metric-value {
  73. font-size: 1.125rem;
  74. font-weight: 700;
  75. color: var(--fg-default);
  76. font-variant-numeric: tabular-nums;
  77. }
  78. // ── 계좌 액션 버튼 ──
  79. &__actions {
  80. display: flex;
  81. gap: 8px;
  82. flex-wrap: wrap;
  83. margin-top: 20px;
  84. }
  85. &__btn {
  86. display: inline-flex;
  87. align-items: center;
  88. justify-content: center;
  89. gap: 6px;
  90. padding: 8px 18px;
  91. border-radius: 8px;
  92. font-size: 0.875rem;
  93. font-weight: 600;
  94. cursor: pointer;
  95. border: 1px solid var(--border-strong);
  96. background: transparent;
  97. color: var(--fg-default);
  98. transition: background-color 0.15s ease, border-color 0.15s ease;
  99. &:hover:not(:disabled) {
  100. background: var(--bg-subtle);
  101. }
  102. &:disabled {
  103. opacity: 0.5;
  104. cursor: not-allowed;
  105. }
  106. &--primary {
  107. background: var(--btn-primary);
  108. border-color: var(--btn-primary);
  109. color: var(--btn-primary-text);
  110. &:hover:not(:disabled) {
  111. background: var(--btn-primary-hover);
  112. border-color: var(--btn-primary-hover);
  113. }
  114. }
  115. &--danger {
  116. border-color: var(--color-danger);
  117. color: var(--color-danger);
  118. &:hover:not(:disabled) {
  119. background: var(--color-danger-bg);
  120. }
  121. }
  122. &--sm {
  123. padding: 4px 10px;
  124. font-size: 0.75rem;
  125. border-radius: 6px;
  126. }
  127. }
  128. // ── 계좌 미개설 안내 ──
  129. &__empty-account {
  130. border: 1px dashed var(--border-strong);
  131. border-radius: 12px;
  132. background: var(--bg-card);
  133. padding: 32px 20px;
  134. text-align: center;
  135. margin-bottom: 20px;
  136. }
  137. &__empty-account-title {
  138. font-size: 1.125rem;
  139. font-weight: 700;
  140. color: var(--fg-default);
  141. margin-bottom: 8px;
  142. }
  143. &__empty-account-desc {
  144. font-size: 0.875rem;
  145. color: var(--text-secondary);
  146. line-height: 1.6;
  147. margin-bottom: 16px;
  148. }
  149. // ── 체결 규칙 고지 박스 ──
  150. &__notice {
  151. border: 1px solid var(--color-warning-text);
  152. background: var(--color-warning-bg);
  153. border-radius: 10px;
  154. padding: 14px 16px;
  155. margin: 20px 0;
  156. }
  157. &__notice-title {
  158. font-size: 0.875rem;
  159. font-weight: 700;
  160. color: var(--color-warning-text);
  161. margin-bottom: 6px;
  162. }
  163. &__notice-list {
  164. margin: 0;
  165. padding-left: 18px;
  166. font-size: 0.8125rem;
  167. color: var(--text-secondary);
  168. line-height: 1.7;
  169. }
  170. // ── 섹션 ──
  171. &__section {
  172. margin: 24px 0;
  173. }
  174. &__section-head {
  175. display: flex;
  176. align-items: baseline;
  177. justify-content: space-between;
  178. margin-bottom: 12px;
  179. }
  180. &__section-title {
  181. font-size: 1.125rem;
  182. font-weight: 700;
  183. color: var(--fg-default);
  184. }
  185. &__section-link {
  186. font-size: 0.8125rem;
  187. color: var(--text-link);
  188. text-decoration: none;
  189. &:hover {
  190. text-decoration: underline;
  191. }
  192. }
  193. &__empty {
  194. text-align: center;
  195. color: var(--text-muted);
  196. padding: 32px 16px;
  197. font-size: 0.9375rem;
  198. }
  199. &__error {
  200. border: 1px solid var(--color-danger-border);
  201. background: var(--color-danger-bg);
  202. border-radius: 10px;
  203. padding: 14px 16px;
  204. color: var(--color-danger);
  205. font-size: 0.875rem;
  206. }
  207. // ── 고밀도 테이블 (포트폴리오·리더보드·주문) ──
  208. &__table-wrap {
  209. overflow-x: auto;
  210. border: 1px solid var(--border-default);
  211. border-radius: 10px;
  212. }
  213. &__table {
  214. width: 100%;
  215. border-collapse: collapse;
  216. font-size: 0.8125rem;
  217. white-space: nowrap;
  218. th,
  219. td {
  220. padding: 8px 12px;
  221. text-align: right;
  222. font-variant-numeric: tabular-nums;
  223. }
  224. thead th {
  225. background: var(--bg-subtle);
  226. color: var(--text-muted);
  227. font-weight: 600;
  228. border-bottom: 1px solid var(--border-default);
  229. position: sticky;
  230. top: 0;
  231. }
  232. tbody tr {
  233. border-bottom: 1px solid var(--border-light);
  234. &:last-child {
  235. border-bottom: none;
  236. }
  237. &:hover {
  238. background: var(--bg-subtle-hover);
  239. }
  240. }
  241. td.paper__td--left,
  242. th.paper__th--left {
  243. text-align: left;
  244. }
  245. td.paper__td--center,
  246. th.paper__th--center {
  247. text-align: center;
  248. }
  249. }
  250. &__stock-name {
  251. font-weight: 600;
  252. color: var(--fg-default);
  253. }
  254. &__stock-code {
  255. font-size: 0.6875rem;
  256. color: var(--text-muted);
  257. margin-left: 6px;
  258. }
  259. // ── 상태 뱃지 ──
  260. &__badge {
  261. display: inline-block;
  262. padding: 1px 8px;
  263. border-radius: 999px;
  264. font-size: 0.6875rem;
  265. font-weight: 600;
  266. border: 1px solid var(--border-strong);
  267. color: var(--text-secondary);
  268. &--buy {
  269. color: var(--price-up);
  270. border-color: var(--price-up);
  271. }
  272. &--sell {
  273. color: var(--price-down);
  274. border-color: var(--price-down);
  275. }
  276. &--pending {
  277. color: var(--color-warning-text);
  278. border-color: var(--color-warning-text);
  279. }
  280. &--filled {
  281. color: var(--color-success);
  282. border-color: var(--color-success);
  283. }
  284. &--cancelled {
  285. color: var(--text-muted);
  286. border-color: var(--border-strong);
  287. }
  288. &--rejected {
  289. color: var(--color-danger);
  290. border-color: var(--color-danger);
  291. }
  292. }
  293. // ── 값 색 (수익/손실) ──
  294. &__value--up {
  295. color: var(--price-up);
  296. }
  297. &__value--down {
  298. color: var(--price-down);
  299. }
  300. &__value--flat {
  301. color: var(--price-flat);
  302. }
  303. // ── 탭 (리더보드 정렬·기간) ──
  304. &__tabs {
  305. display: flex;
  306. gap: 6px;
  307. flex-wrap: wrap;
  308. margin-bottom: 12px;
  309. }
  310. &__tab {
  311. padding: 6px 14px;
  312. border-radius: 999px;
  313. font-size: 0.8125rem;
  314. font-weight: 600;
  315. text-decoration: none;
  316. border: 1px solid var(--border-default);
  317. color: var(--text-secondary);
  318. background: transparent;
  319. &:hover {
  320. background: var(--bg-subtle);
  321. color: var(--fg-default);
  322. }
  323. &--active {
  324. background: var(--az-accent);
  325. border-color: var(--az-accent);
  326. color: var(--btn-primary-text);
  327. &:hover {
  328. background: var(--az-accent-hover);
  329. color: var(--btn-primary-text);
  330. }
  331. }
  332. }
  333. &__tab-group {
  334. display: flex;
  335. align-items: center;
  336. gap: 10px;
  337. flex-wrap: wrap;
  338. margin-bottom: 8px;
  339. }
  340. &__tab-group-label {
  341. font-size: 0.75rem;
  342. color: var(--text-muted);
  343. min-width: 44px;
  344. }
  345. // ── 리더보드 순위·닉네임 셀 ──
  346. &__rank {
  347. font-weight: 700;
  348. color: var(--fg-default);
  349. }
  350. &__nick {
  351. display: inline-flex;
  352. align-items: center;
  353. gap: 8px;
  354. }
  355. &__nick-thumb {
  356. width: 24px;
  357. height: 24px;
  358. border-radius: 50%;
  359. object-fit: cover;
  360. background: var(--bg-subtle);
  361. flex-shrink: 0;
  362. }
  363. &__nick-name {
  364. color: var(--fg-default);
  365. text-decoration: none;
  366. font-weight: 600;
  367. &:hover {
  368. text-decoration: underline;
  369. }
  370. }
  371. &__me-row {
  372. background: var(--sidebar-active-bg);
  373. }
  374. }
  375. // ── 입금/출금 모달 (base-ui Dialog Popup content 확장) ──
  376. .paper-modal {
  377. &__body {
  378. display: flex;
  379. flex-direction: column;
  380. gap: 14px;
  381. }
  382. &__balance {
  383. font-size: 0.8125rem;
  384. color: var(--text-secondary);
  385. strong {
  386. color: var(--fg-default);
  387. font-variant-numeric: tabular-nums;
  388. }
  389. }
  390. &__field {
  391. display: flex;
  392. flex-direction: column;
  393. gap: 6px;
  394. }
  395. &__label {
  396. font-size: 0.8125rem;
  397. font-weight: 600;
  398. color: var(--fg-default);
  399. }
  400. &__input {
  401. padding: 10px 12px;
  402. border-radius: 8px;
  403. border: 1px solid var(--border-default);
  404. background: var(--bg-input);
  405. color: var(--fg-default);
  406. font-size: 0.9375rem;
  407. font-variant-numeric: tabular-nums;
  408. outline: none;
  409. &:focus {
  410. border-color: var(--az-accent);
  411. }
  412. }
  413. &__hint {
  414. font-size: 0.75rem;
  415. color: var(--text-muted);
  416. }
  417. &__error {
  418. font-size: 0.8125rem;
  419. color: var(--color-danger);
  420. margin: 0;
  421. }
  422. // suggest 드롭다운 anchor
  423. &__field--suggest {
  424. position: relative;
  425. }
  426. // 주문 폼 본문 (가용 토큰 metric 아래 간격)
  427. &__trade-body {
  428. margin-top: 16px;
  429. }
  430. &__all {
  431. display: inline-flex;
  432. align-items: center;
  433. gap: 6px;
  434. font-size: 0.8125rem;
  435. color: var(--text-secondary);
  436. cursor: pointer;
  437. }
  438. &__footer {
  439. display: flex;
  440. justify-content: flex-end;
  441. gap: 8px;
  442. margin-top: 4px;
  443. }
  444. }