vignette/apps/web/src/styles/tokens.css
2026-06-28 12:18:20 +09:00

229 lines
8.3 KiB
CSS

/* =====================================================================
Vignette — 디자인 토큰 (단일 진실원본)
출처: docs/dev_dashboard.html :root + docs/DESIGN_CONCEPT.md §3
primitive(원시값) → semantic(의미 별칭) 2계층. 컴포넌트는 semantic만 참조.
다크모드/역할별 accent는 이 파일 하단 1곳에서만 스왑.
철칙: 순흑/순백 금지(paper/ink 토큰만), border-left 강조선 금지,
강조는 weight+accent텍스트+tint배경+kicker로만.
===================================================================== */
:root {
/* ── Primitive: Neutral (따뜻한 종이 + 쿨 슬레이트) §3.1 ── */
--paper: #fbfaf8; /* 본문 배경: 따뜻한 종이색 (순백 아님) */
--paper-1: #fbfaf8; /* 구형 페이지 alias */
--paper-2: #f4f2ee; /* 카드/패널 미세 단차 (테두리 대신 톤차) */
--surface: #ffffff; /* 카드 표면 */
--neutral-100: #eceff1; /* 표면 hover / subtle fill */
--neutral-150: #e5e1da; /* 카드 보더 baseline = hairline */
--neutral-200: #d5dbde; /* divider 진함 */
--neutral-400: #98a4a9; /* placeholder / disabled */
--ink: #1c2a2a; /* 본문 텍스트: 잉크 네이비-그린 (순흑 아님) */
--ink-2: #5a6663; /* 보조 텍스트: 슬레이트 */
--ink-3: #93a09c; /* 캡션/메타 */
--hair: #e5e1da; /* 1px 헤어라인 (구역 분리는 이걸로) */
/* ── Sage-Teal (주 악센트 = 상담/신뢰), 화면당 1곳 배급 §3.2 ── */
--accent: #3e7a6e; /* ★ 메인 악센트. 흰 배경 대비 5.0:1 AA */
--accent-deep: #316257; /* hover / 진한 강조 텍스트 */
--accent-tint: #eef4f2; /* 악센트 배경 틴트 (콜아웃·선택·active) */
--accent-bright: #5f968b; /* dot·진행바 fill */
/* ── Terracotta (보조 악센트 = 학습/온기), 저채도, 화면당 1곳 ── */
--clay: #b0735c; /* ★ 보조 악센트 (학습자 온기, 내담자 측 신호) */
--clay-deep: #94604c;
--clay-tint: #f6f0ec;
/* ── 의미색 (Semantic feedback) — solid + tint 페어 §3.3 ── */
/* 긍정 = 녹색 (상담 진전·라포·가드레일 통과·잘함) */
--pos-text: #2c6e49;
--pos-solid: #3b8c5e;
--pos-tint: #e8f3ec;
/* 주의 = 앰버 (라포 약화·과도한 침묵·페이싱) */
--warn-text: #8a5a00;
--warn-solid: #c28a2c;
--warn-tint: #faf1e0;
/* 위험 = 적색 (가드레일 위반·세션 강제중단·임상적 위급) — 오직 진짜 위급만 */
--crit-text: #a8352c;
--crit-solid: #c4453a;
--crit-tint: #faeae8;
/* 정보 = 슬레이트블루 (평가 AI 피드백·시스템 안내, 중립) */
--info-text: #2e5a7a;
--info-solid: #3c7299;
--info-tint: #eaf1f6;
--neutral-sig: #8895a2; /* 데이터 없음·미평가 */
/* ── 시맨틱 별칭 (라이트 모드) §3.4 ── */
--bg-app: var(--paper); /* 앱 캔버스 */
--bg-surface: var(--surface); /* 카드/패널 */
--bg-surface-2: var(--paper-2); /* 중첩 표면/입력 */
--bg-tint: var(--accent-tint); /* 선택·강조 배경 */
--bg-stage: #1e2724; /* 내담자 아바타 영역 (깊은 차콜그린) */
--text-strong: var(--ink); /* 제목 */
--text-body: var(--ink-2); /* 본문 보조 */
--text-muted: var(--ink-3); /* 캡션 */
--text-on-accent: #fbfaf8; /* accent 버튼 위 텍스트 */
--border-subtle: var(--neutral-150);
--border-strong: var(--neutral-200);
--border-focus: var(--accent);
--focus-ring: rgba(62, 122, 110, 0.45);
/* ── 타이포그래피 §3.6 ── */
--font-sans: "Pretendard Variable", Pretendard, -apple-system,
"Apple SD Gothic Neo", "Noto Sans KR", system-ui, sans-serif;
--font-serif: "Noto Serif KR", "Source Serif 4", serif; /* 랜딩 헤드만 */
--font-num: "Pretendard Variable", "JetBrains Mono", ui-monospace, monospace;
/* 타입 스케일 (기준 16px / 1.6, 위계는 크기보다 weight) */
--fs-display: 2.5rem; /* 40 / 표지·랜딩 대제목 */
--fs-h1: 1.875rem; /* 30 / 페이지 제목 */
--fs-h2: 1.5rem; /* 24 / 섹션 제목 */
--fs-h3: 1.25rem; /* 20 / 카드·패널 제목 */
--fs-lead: 1.125rem; /* 18 / 리드 문장 */
--fs-body: 1rem; /* 16 / 본문 기본 */
--fs-sm: 0.875rem; /* 14 / 보조·폼 라벨 */
--fs-xs: 0.8125rem; /* 13 / 캡션·메타·배지 */
--fs-kicker: 0.75rem; /* 12 / 상단 kicker 소제목 */
/* ── 스페이싱 (8pt 기반) §3.7 ── */
--sp-1: 4px;
--sp-2: 8px;
--sp-3: 12px;
--sp-4: 16px;
--sp-5: 24px;
--sp-6: 32px;
--sp-7: 48px;
--sp-8: 64px;
--sp-9: 96px;
/* ── 그리드·형태 §3.8 ── */
--maxw: 1200px; /* 대시보드 콘텐츠 최대폭 */
--maxw-read: 680px; /* 읽기 영역 */
--border: var(--border-subtle);
--font-mono: var(--font-num);
--nav-w: 240px; /* 좌측 네비 펼침 */
--nav-w-collapsed: 72px; /* 좌측 네비 아이콘 only */
--topbar-h: 56px;
--radius: 8px; /* 카드/버튼 (거의 직각) */
--radius-sm: 6px; /* 입력·칩 */
--radius-lg: 12px; /* 패널 */
--gutter: 24px;
--shadow-sm: 0 1px 2px rgba(28, 42, 42, 0.05);
--shadow-md: 0 4px 14px rgba(28, 42, 42, 0.07); /* 모달·팝오버만 */
/* ── 래스터 디자인 요소 ── */
--asset-warm-elements: url("/design-elements/clinical-paper-ambient.png");
--asset-login-room: url("/design-elements/login-counseling-room.png");
/* ── 모션 §3.9 ── */
--ease-out: cubic-bezier(0.22, 0.61, 0.36, 1);
--ease-in-out: cubic-bezier(0.45, 0.05, 0.55, 0.95);
--dur-fast: 120ms; /* hover·포커스 */
--dur-base: 200ms; /* 버튼·토글·드롭다운 */
--dur-slow: 320ms; /* 패널 전환·모달 */
--dur-breathe: 3200ms; /* 음성 호흡 펄스 */
}
/* ── 다크 모드 (gloom 회피 — 충분한 밝은 면 + 절제된 악센트) §3.5 ── */
[data-theme="dark"] {
--paper: #0f1715;
--paper-1: #111b18;
--paper-2: #17211f;
--surface: #1b2724;
--neutral-100: #24322e;
--neutral-150: #2c3b36;
--neutral-200: #3a4b45;
--neutral-400: #7c8d88;
--ink: #eef6f3;
--ink-2: #c6d3cf;
--ink-3: #8a9b96;
--hair: #2c3b36;
--bg-app: #0e1714;
--bg-surface: #17231f;
--bg-surface-2: #22302c;
--bg-tint: #1d302b;
--bg-stage: #0e1614;
--text-strong: #eaf0f1;
--text-body: #c4cfd3;
--text-muted: #88969c;
--text-on-accent: #0f1a17;
--border-subtle: #2a363c;
--border-strong: #38454c;
--border-focus: #6fb3a4;
--accent: #6fb3a4;
--accent-deep: #84c2b4;
--accent-tint: #1e2e2a;
--accent-bright: #6fb3a4;
--clay: #cc8f77;
--clay-deep: #e0aa92;
--clay-tint: #2b211e;
--focus-ring: rgba(111, 179, 164, 0.45);
--pos-text: #7fd0a0;
--pos-solid: #5fb682;
--pos-tint: #16271d;
--warn-text: #e2b566;
--warn-solid: #d4a24a;
--warn-tint: #2a2415;
--crit-text: #e89086;
--crit-solid: #d86459;
--crit-tint: #2a1715;
--info-text: #79b0d4;
--info-solid: #5c97be;
--info-tint: #15222c;
}
/* ── 역할별 accent 오버라이드 §6.2 ──
역할별 페이지를 다른 제품처럼 보이게 하지 않는다.
API role(learner/teacher/admin) → data-role 매핑은 유지하되, 기본 accent는 공통 세이지로 통일한다. */
[data-role="learner"] {
--accent: #3e7a6e;
--accent-deep: #316257;
--accent-bright: #5f968b;
--accent-tint: #eef4f2;
--focus-ring: rgba(62, 122, 110, 0.45);
}
[data-role="instructor"] {
--accent: #3e7a6e;
--accent-deep: #316257;
--accent-bright: #5f968b;
--accent-tint: #eef4f2;
--focus-ring: rgba(62, 122, 110, 0.45);
}
[data-role="admin"] {
--accent: #3e7a6e;
--accent-deep: #316257;
--accent-bright: #5f968b;
--accent-tint: #eef4f2;
--focus-ring: rgba(62, 122, 110, 0.45);
}
/* 다크 + 역할 동시 적용 시 accent 명도 보정 (가독) */
[data-theme="dark"] body[data-role="learner"] {
--accent: #6fb3a4;
--accent-deep: #84c2b4;
--accent-bright: #6fb3a4;
--accent-tint: #1e2e2a;
--focus-ring: rgba(111, 179, 164, 0.45);
}
[data-theme="dark"] body[data-role="instructor"],
[data-theme="dark"][data-role="instructor"] {
--accent: #6fb3a4;
--accent-deep: #84c2b4;
--accent-bright: #6fb3a4;
--accent-tint: #1e2e2a;
--focus-ring: rgba(111, 179, 164, 0.45);
}
[data-theme="dark"] body[data-role="admin"],
[data-theme="dark"][data-role="admin"] {
--accent: #6fb3a4;
--accent-deep: #84c2b4;
--accent-bright: #6fb3a4;
--accent-tint: #1e2e2a;
--focus-ring: rgba(111, 179, 164, 0.45);
}