// TypographyContent.tsx — WING-OPS Typography 콘텐츠 (다크/라이트 테마 지원) import type { DesignTheme } from './designTheme'; // ---------- 데이터 타입 ---------- interface FontFamily { name: string; className: string; stack: string; usage: string; sampleText: string; } interface TypographyToken { className: string; size: string; font: string; weight: string; usage: string; sampleText: string; sampleStyle: React.CSSProperties; } // ---------- Font Family 데이터 ---------- const FONT_FAMILIES: FontFamily[] = [ { name: 'Noto Sans KR', className: 'font-korean', stack: "'Noto Sans KR', sans-serif", usage: '기본 UI 텍스트, 레이블, 설명 등 한국어 콘텐츠 전반에 사용됩니다. 프로젝트에서 가장 많이 사용되는 폰트입니다.', sampleText: '해양 방제 운영 지원 시스템 WING-OPS', }, { name: 'JetBrains Mono', className: 'font-mono', stack: "'JetBrains Mono', monospace", usage: '좌표, 수치 데이터, 코드, 토큰 이름 등 고정폭이 필요한 콘텐츠에 사용됩니다.', sampleText: '126.978° E, 37.566° N — #0a0e1a', }, { name: 'Outfit', className: 'font-sans', stack: "'Outfit', 'Noto Sans KR', sans-serif", usage: '영문 헤딩과 브랜드 타이틀에 사용됩니다. body 기본 폰트 스택에 포함되어 있습니다.', sampleText: 'WING-OPS Design System v1.0', }, ]; // ---------- Typography Token 데이터 ---------- const TYPOGRAPHY_TOKENS: TypographyToken[] = [ { className: '.wing-title', size: '15px', font: 'font-korean', weight: 'Bold (700)', usage: '패널 제목', sampleText: '확산 예측 시뮬레이션', sampleStyle: { fontSize: '15px', fontWeight: 700, fontFamily: "'Noto Sans KR', sans-serif" }, }, { className: '.wing-section-header', size: '13px', font: 'font-korean', weight: 'Bold (700)', usage: '섹션 헤더', sampleText: '기본 정보 입력', sampleStyle: { fontSize: '13px', fontWeight: 700, fontFamily: "'Noto Sans KR', sans-serif" }, }, { className: '.wing-label', size: '11px', font: 'font-korean', weight: 'Semibold (600)', usage: '필드 레이블', sampleText: '유출량 (kL)', sampleStyle: { fontSize: '11px', fontWeight: 600, fontFamily: "'Noto Sans KR', sans-serif" }, }, { className: '.wing-btn', size: '11px', font: 'font-korean', weight: 'Semibold (600)', usage: '버튼 텍스트', sampleText: '시뮬레이션 실행', sampleStyle: { fontSize: '11px', fontWeight: 600, fontFamily: "'Noto Sans KR', sans-serif" }, }, { className: '.wing-value', size: '11px', font: 'font-mono', weight: 'Semibold (600)', usage: '수치 / 데이터 값', sampleText: '35.1284° N, 129.0598° E', sampleStyle: { fontSize: '11px', fontWeight: 600, fontFamily: "'JetBrains Mono', monospace" }, }, { className: '.wing-input', size: '11px', font: 'font-korean', weight: 'Normal (400)', usage: '입력 필드', sampleText: '서해 대산항 인근 해역', sampleStyle: { fontSize: '11px', fontWeight: 400, fontFamily: "'Noto Sans KR', sans-serif" }, }, { className: '.wing-section-desc', size: '10px', font: 'font-korean', weight: 'Normal (400)', usage: '섹션 설명', sampleText: '예측 결과는 기상 조건에 따라 달라질 수 있습니다.', sampleStyle: { fontSize: '10px', fontWeight: 400, fontFamily: "'Noto Sans KR', sans-serif" }, }, { className: '.wing-subtitle', size: '10px', font: 'font-korean', weight: 'Normal (400)', usage: '보조 설명', sampleText: '최근 업데이트: 2026-03-24 09:00 KST', sampleStyle: { fontSize: '10px', fontWeight: 400, fontFamily: "'Noto Sans KR', sans-serif" }, }, { className: '.wing-meta', size: '9px', font: 'font-korean', weight: 'Normal (400)', usage: '메타 정보', sampleText: 'v2.1 | 해양환경공단', sampleStyle: { fontSize: '9px', fontWeight: 400, fontFamily: "'Noto Sans KR', sans-serif" }, }, { className: '.wing-badge', size: '9px', font: 'font-korean', weight: 'Bold (700)', usage: '뱃지 / 태그', sampleText: '진행중', sampleStyle: { fontSize: '9px', fontWeight: 700, fontFamily: "'Noto Sans KR', sans-serif" }, }, ]; // ---------- Props ---------- interface TypographyContentProps { theme: DesignTheme; } // ---------- 컴포넌트 ---------- export const TypographyContent = ({ theme }: TypographyContentProps) => { const t = theme; const isDark = t.mode === 'dark'; return (
WING-OPS 인터페이스에서 사용되는 타이포그래피 체계입니다. 폰트 패밀리, 크기, 두께를 토큰과 컴포넌트 클래스로 정의하여 시각적 계층 구조와 일관성을 유지합니다.
.wing-*)로 조합하여 일관된 텍스트 스타일을 적용합니다.사용자의 디바이스 환경을 고려하여, 시스템 폰트와 웹 폰트를 조합하여 사용합니다. 한국어 UI에 최적화된 폰트 스택으로 다양한 기기에서 일관된 가독성을 보장합니다.
font-family
{`: 'Outfit', 'Noto Sans KR', sans-serif;`}
{font.usage}
{/* 샘플 렌더 */}wing.css).