| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- // ─────────────────────────────────────────────────────────────
- // D6 디자인 토큰 — 컬러 (다크 기본 + 라이트)
- // 테마 스위칭: html 클래스 `.dark`/`.light` + `data-theme` 속성 — app/layout.tsx 의 FOUC 방지 인라인 스크립트가 첫 페인트 전 세팅
- // 원칙 (d6-design-system.md §3):
- // - 기존 시맨틱 변수명(--bg-page, --text-primary 등)은 전부 보존 — 값만 그레이 램프 기반으로 재정의 (기존 ~50개 style.scss 무수정 호환)
- // - 포인트 컬러는 --az-accent 1개 (개미 오렌지). 기존 --color-accent / --btn-primary 는 alias 로 수렴
- // ※ 설계 문서의 `--accent` 이름은 shadcn HSL triplet(--accent)과 충돌하여 --az-accent 로 명명
- // - 상승 빨강(--price-up) / 하락 파랑(--price-down) — 국내 관례, WCAG AA 대비 검증값
- // - 헤더 토큰(--bg-head/--text-head/--bg-icon/--head-*)은 라이트 테마에서도 다크 고정 (amazon 방식)
- // ─────────────────────────────────────────────────────────────
- // ── 다크 (기본) ──
- :root {
- color-scheme: dark;
- // 그레이 램프 15단 (배경 → 전경)
- --gray-0: #0b0c0f;
- --gray-1: #111318;
- --gray-2: #16181d;
- --gray-3: #1c1f26;
- --gray-4: #22262e;
- --gray-5: #2a2f38;
- --gray-6: #353b46;
- --gray-7: #454c59;
- --gray-8: #5a6270;
- --gray-9: #717a88;
- --gray-10: #8b93a1;
- --gray-11: #a6adb9;
- --gray-12: #c2c8d1;
- --gray-13: #dde1e7;
- --gray-14: #f2f4f7;
- // 기능 컬러 — 등락 (색+부호 병행 원칙, 등락 표시에 --az-accent 사용 금지)
- --price-up: #f2555f;
- --price-down: #4a8df2;
- --price-flat: var(--gray-10);
- // 포인트 컬러 (유일) — 액션 버튼·활성 탭·포커스 링 전용
- --az-accent: #f7931a;
- --az-accent-hover: #f59e0b;
- // 시맨틱 — 램프 참조 (테마 전환 시 램프 재정의로 자동 반영, 기존 변수명 보존)
- --bg-page: var(--gray-0);
- --bg-elevated: var(--gray-2);
- --bg-subtle: var(--gray-3);
- --bg-input: var(--gray-2);
- --bg-card: var(--gray-2); // 기존 미정의 참조 보정
- --bg-default: var(--gray-0); // 기존 미정의 참조 보정
- --border-light: var(--gray-3);
- --border-subtle: var(--gray-3); // 기존 미정의 참조 보정
- --border-default: var(--gray-4);
- --border-strong: var(--gray-6);
- --text-muted: var(--gray-9);
- --text-secondary: var(--gray-11);
- --text-primary: var(--gray-13);
- --text-normal: var(--gray-14);
- --fg-default: var(--gray-14);
- --btn-default-border: var(--gray-6);
- --btn-default-hover: var(--gray-4);
- // 헤더 — 양 테마 다크 고정 (라이트 블록에서 재정의하지 않음)
- --bg-head: #111318;
- --text-head: #c2c8d1;
- --bg-icon: #22262e;
- --outline-default: #454c59;
- --head-input-bg: #1c1f26;
- --head-input-text: #dde1e7;
- --head-input-placeholder: #717a88;
- --head-input-border: #353b46;
- // 포인트 alias (기존 변수명 보존)
- --color-accent: var(--az-accent);
- --color-accent-hover: var(--az-accent-hover);
- --btn-primary: var(--az-accent);
- --btn-primary-hover: var(--az-accent-hover);
- --btn-primary-shadow: #b96504;
- --btn-primary-text: #201503; // 오렌지 위 잉크 텍스트 — 흰색은 AA 미달
- // 테마별 리터럴
- --text-link: #60a5fa;
- --text-link-hover: #3b82f6;
- --shadow-color: rgba(0, 0, 0, 0.45);
- --color-danger: #ef4444;
- --color-success: #22c55e;
- --color-warning-bg: #422006;
- --color-warning-text: #fef08a;
- --overlay-color: rgba(0, 0, 0, 0.7);
- --sidebar-active-bg: #3d2800;
- --list-row-active: #2a2a00;
- --color-blue: #60a5fa;
- --color-blue-hover: #3b82f6;
- --color-blue-bg: rgba(96, 165, 250, 0.1);
- --color-purple: #a78bfa;
- --color-purple-hover: #8b5cf6;
- --color-purple-bg: rgba(167, 139, 250, 0.15);
- --color-danger-bg: #3f1212;
- --color-danger-border: #7f1d1d;
- --color-success-bg: #0f2d1a;
- --color-success-text: #4ade80;
- --bg-subtle-hover: rgba(255, 255, 255, 0.05);
- // FAQ Q/A 라벨 — dark 배경 시인성용 밝기 ↑
- --faq-q-color: #3fbd54;
- --faq-a-color: #ff6b4a;
- // shadcn HSL triplet — 그레이 램프 파생값 (시각적 단일화, 통합은 장기 과제)
- --background: 225 15% 5%;
- --foreground: 218 17% 89%;
- --card: 220 12% 10%;
- --card-foreground: 218 17% 89%;
- --popover: 220 12% 10%;
- --popover-foreground: 218 17% 89%;
- --primary: 218 17% 89%;
- --primary-foreground: 222 13% 13%;
- --secondary: 221 14% 16%;
- --secondary-foreground: 218 17% 89%;
- --muted: 221 14% 16%;
- --muted-foreground: 216 10% 59%;
- --accent: 221 14% 16%;
- --accent-foreground: 218 17% 89%;
- --destructive: 0 63% 31%;
- --destructive-foreground: 0 0% 98%;
- --border: 221 14% 16%;
- --input: 221 14% 16%;
- --ring: 33 93% 54%; // 포인트 컬러 1개 원칙 — 포커스 링도 개미 오렌지
- --chart-1: 220 70% 50%;
- --chart-2: 160 60% 45%;
- --chart-3: 30 80% 55%;
- --chart-4: 280 65% 60%;
- --chart-5: 340 75% 55%;
- --crypto-up: 356 86% 64%; // = --price-up (레거시 alias, 신규 코드는 --price-* 사용)
- --crypto-down: 216 87% 62%; // = --price-down
- --crypto-neutral: 216 10% 59%;
- --sidebar-background: 240 5.9% 10%;
- --sidebar-foreground: 240 4.8% 95.9%;
- --sidebar-primary: 224.3 76.3% 48%;
- --sidebar-primary-foreground: 0 0% 100%;
- --sidebar-accent: 240 3.7% 15.9%;
- --sidebar-accent-foreground: 240 4.8% 95.9%;
- --sidebar-border: 240 3.7% 15.9%;
- --sidebar-ring: 217.2 91.2% 59.8%;
- }
- // ── 라이트 ──
- // 램프를 역할 등가로 뒤집어 재정의 → 시맨틱 매핑(--bg-page: var(--gray-0) 등)은 공통 유지
- // 헤더 토큰(--bg-head 등)은 여기서 재정의하지 않음 = 다크 고정
- html.light,
- [data-theme='light'] {
- color-scheme: light;
- --gray-0: #ffffff;
- --gray-1: #f8f9fb;
- --gray-2: #f2f4f7;
- --gray-3: #e9ecf1;
- --gray-4: #dde1e7;
- --gray-5: #cfd4dc;
- --gray-6: #b6bcc7;
- --gray-7: #99a1ae;
- --gray-8: #7e8695;
- --gray-9: #667080;
- --gray-10: #545d6b;
- --gray-11: #424a57;
- --gray-12: #313843;
- --gray-13: #21262e;
- --gray-14: #14171c;
- --price-up: #d02330;
- --price-down: #1861d8;
- --price-flat: var(--gray-9);
- --az-accent: #d97800;
- --az-accent-hover: #b96504;
- --btn-primary-shadow: #a35a00;
- // 라이트 테마 accent(#d97800)는 더 어두워 잉크(#201503) 텍스트가 저대비 → 흰색으로 오버라이드(가독성)
- --btn-primary-text: #ffffff;
- --text-link: #0060a9;
- --text-link-hover: #c7511f;
- --shadow-color: rgba(0, 0, 0, 0.12);
- --color-danger: #d51b28;
- --color-success: #4caf50;
- --color-warning-bg: #fefce8;
- --color-warning-text: #92400e;
- --overlay-color: rgba(0, 0, 0, 0.5);
- --sidebar-active-bg: #fff3e0;
- --list-row-active: #faffd1;
- --color-blue: #3b82f6;
- --color-blue-hover: #2563eb;
- --color-blue-bg: rgba(59, 130, 246, 0.06);
- --color-purple: #8b5cf6;
- --color-purple-hover: #7c3aed;
- --color-purple-bg: rgba(139, 92, 246, 0.06);
- --color-danger-bg: #fee2e2;
- --color-danger-border: #fca5a5;
- --color-success-bg: #dcfce7;
- --color-success-text: #16a34a;
- --bg-subtle-hover: rgba(0, 0, 0, 0.05);
- --faq-q-color: #0b671b;
- --faq-a-color: #ff4727;
- --background: 0 0% 100%;
- --foreground: 222 13% 15%;
- --card: 0 0% 100%;
- --card-foreground: 222 13% 15%;
- --popover: 0 0% 100%;
- --popover-foreground: 222 13% 15%;
- --primary: 222 13% 15%;
- --primary-foreground: 216 24% 96%;
- --secondary: 216 22% 93%;
- --secondary-foreground: 222 13% 15%;
- --muted: 216 22% 93%;
- --muted-foreground: 216 11% 45%;
- --accent: 216 22% 93%;
- --accent-foreground: 222 13% 15%;
- --destructive: 0 84.2% 60.2%;
- --destructive-foreground: 0 0% 98%;
- --border: 213 17% 89%;
- --input: 213 17% 89%;
- --ring: 33 100% 43%;
- --chart-1: 12 76% 61%;
- --chart-2: 173 58% 39%;
- --chart-3: 197 37% 24%;
- --chart-4: 43 74% 66%;
- --chart-5: 27 87% 67%;
- --crypto-up: 356 71% 48%;
- --crypto-down: 217 80% 47%;
- --crypto-neutral: 216 11% 45%;
- --sidebar-background: 0 0% 98%;
- --sidebar-foreground: 240 5.3% 26.1%;
- --sidebar-primary: 240 5.9% 10%;
- --sidebar-primary-foreground: 0 0% 98%;
- --sidebar-accent: 240 4.8% 95.9%;
- --sidebar-accent-foreground: 240 5.9% 10%;
- --sidebar-border: 220 13% 91%;
- --sidebar-ring: 217.2 91.2% 59.8%;
- }
|