From c7b0b7a3c2f4a4005c0e8d7ce204f309dc43d18a Mon Sep 17 00:00:00 2001 From: leedano Date: Thu, 2 Apr 2026 16:21:58 +0900 Subject: [PATCH] =?UTF-8?q?feat(design):=20HNS/=EC=98=88=EC=B8=A1/?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=ED=83=AD=20=EB=94=94=EC=9E=90=EC=9D=B8=20?= =?UTF-8?q?=EC=8B=9C=EC=8A=A4=ED=85=9C=20=ED=8F=B0=ED=8A=B8=20=EB=B0=8F=20?= =?UTF-8?q?=EC=83=89=EC=83=81=20=ED=86=A0=ED=81=B0=20=EC=A0=84=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 + docs/DESIGN-SYSTEM.md | 155 + frontend/index.html | 4 +- .../src/common/components/map/MapView.tsx | 81 +- frontend/src/common/styles/base.css | 6 + frontend/src/common/styles/components.css | 37 +- .../hns/components/HNSAnalysisListTable.tsx | 116 +- .../src/tabs/hns/components/HNSLeftPanel.tsx | 952 ++- .../tabs/hns/components/HNSRecalcModal.tsx | 16 +- .../src/tabs/hns/components/HNSRightPanel.tsx | 85 +- .../tabs/hns/components/HNSScenarioView.tsx | 229 +- .../tabs/hns/components/HNSSubstanceView.tsx | 884 +- .../src/tabs/hns/components/HNSTheoryView.tsx | 7601 ++++++++++++++--- frontend/src/tabs/hns/components/HNSView.tsx | 36 +- .../components/AnalysisListTable.tsx | 86 +- .../components/BoomDeploymentTheoryView.tsx | 520 +- .../components/OilSpillTheoryView.tsx | 1620 ++-- .../prediction/components/OilSpillView.tsx | 2 +- .../src/tabs/rescue/components/RescueView.tsx | 482 +- frontend/tailwind.config.js | 5 + 20 files changed, 8780 insertions(+), 4141 deletions(-) diff --git a/.gitignore b/.gitignore index 9a71415..a7b64e4 100755 --- a/.gitignore +++ b/.gitignore @@ -99,3 +99,7 @@ frontend/public/hns-manual/images/ # Lock files (keep for reproducible builds) !frontend/package-lock.json !backend/package-lock.json + + +# mcp +.mcp.json \ No newline at end of file diff --git a/docs/DESIGN-SYSTEM.md b/docs/DESIGN-SYSTEM.md index d26224d..c03f287 100644 --- a/docs/DESIGN-SYSTEM.md +++ b/docs/DESIGN-SYSTEM.md @@ -7,6 +7,158 @@ WING-OPS UI 디자인 시스템의 비주얼 레퍼런스 카탈로그. --- +## 버전 히스토리 + +### v1.1 — 시맨틱 토큰 & 테마 시스템 (2026-03-28~) + +> 브랜치: `feature/predict-develop`, `feature/design-system-font` + +v1.0의 축약형 토큰 시스템을 시맨틱 네이밍으로 전면 전환하고, 다크/라이트 테마 전환 기능을 도입한 구조적 리팩토링. + +#### 변경된 점 + +| 항목 | v1.0 | v1.1 | +|------|------|------| +| 토큰 네이밍 | 축약형 (`--bg0`, `--t1`, `--cyan`) | 시맨틱 (`--bg-base`, `--fg-default`, `--color-accent`) | +| 폰트 | Outfit + Noto Sans KR + JetBrains Mono (3종) | PretendardGOV 단일 폰트 (4웨이트) | +| 테마 | 다크 모드 전용 (하드코딩) | 다크/라이트 전환 지원 (`data-theme` 속성) | +| 프리미티브 팔레트 | 7그룹 11단계 (Navy/Cyan/Blue/Red/Green/Orange/Yellow, 00~100) | 6그룹 10단계 (Gray/Blue/Green/Yellow/Red/Purple, 100~1000) | +| 텍스트 대비 | `--t2: #b0b8cc`, `--t3: #8690a6` | `--fg-sub: #c0c8dc`, `--fg-disabled: #9ba3b8` (대비 향상) | +| 버튼 스타일 | `.prd-btn.pri` 그라데이션 (cyan→blue) | 아웃라인/고스트 스타일 | +| Tailwind 컬러 키 | 하드코딩 hex (`bg.0`, `text.1`, `primary.cyan`) | CSS 변수 참조 (`bg.base`, `fg.DEFAULT`, `color.accent`) | +| 폰트 유틸리티 | 하드코딩 (`font-family: 'JetBrains Mono'`) | CSS 변수 경유 (`font-family: var(--font-mono)`) | + +#### 토큰 마이그레이션 매핑 + +| v1.0 | v1.1 | 설명 | +|------|------|------| +| `--bg0` | `--bg-base` | 페이지 배경 | +| `--bg1` | `--bg-surface` | 사이드바, 패널 | +| `--bg2` | `--bg-elevated` | 테이블 헤더, 상위 요소 | +| `--bg3` | `--bg-card` | 카드 배경 | +| `--bgH` | `--bg-surface-hover` | 호버 상태 | +| `--bd` | `--stroke-default` | 기본 구분선 | +| `--bdL` | `--stroke-light` | 연한 구분선 | +| `--t1` | `--fg-default` | 기본 텍스트 | +| `--t2` | `--fg-sub` | 보조 텍스트 | +| `--t3` | `--fg-disabled` | 비활성 텍스트 | +| `--cyan` | `--color-accent` | 주요 강조 | +| `--blue` | `--color-info` | 정보, 링크 | +| `--red` | `--color-danger` | 위험, 삭제 | +| `--orange` | `--color-warning` | 주의 | +| `--yellow` | `--color-caution` | 경고 | +| `--green` | `--color-success` | 성공, 정상 | +| `--purple` | `--color-tertiary` | 3차 강조 | +| `--boom` | `--color-boom` | 오일붐 전용 | +| `--fK` | `--font-korean` | 한국어 폰트 스택 | +| `--fM` | `--font-mono` | 모노 폰트 스택 | +| `--rS` | `--radius-sm` | 소형 border radius | +| `--rM` | `--radius-md` | 중형 border radius | + +#### 추가된 기능 + +- **다크/라이트 테마 전환**: `themeStore.ts` (Zustand) + `data-theme` DOM 속성 + FOUC 방지 인라인 스크립트 +- **시맨틱 오버레이 토큰**: `--hover-overlay`, `--dropdown-bg` (테마별 불투명도 차별화) +- **Navy 액센트 토큰**: `--color-navy`, `--color-navy-hover`, `--color-accent-muted` +- **정적 컬러 토큰**: `--static-black`, `--static-white` (테마 무관 고정값) +- **타이포그래피 스케일 (17개 토큰)**: Display 3종, Heading 3종, Title 6종, Body 2종, Label 2종, Caption 1종 +- **Letter-spacing 토큰 5종**: `--letter-spacing-display` (0.06em) ~ `--letter-spacing-label` (0.04em) +- **Font weight 토큰 4종**: thin(300) / regular(400) / medium(500) / bold(700) +- **Line height 토큰 4종**: tight(1.3) / snug(1.4) / normal(1.5) / relaxed(1.6) +- **Tailwind tracking 유틸리티**: `tracking-display`, `tracking-heading`, `tracking-body`, `tracking-navigation`, `tracking-label` +- **라이트 테마 컴포넌트 오버라이드**: CCTV 팝업, 날짜피커, 타임라인, 콤보박스, 좌표 표시 등 +- **폰트 렌더링 최적화**: `-webkit-font-smoothing: antialiased`, `text-rendering: optimizeLegibility` + +#### 업데이트된 부분 + +- 92개+ 컴포넌트 파일의 토큰 마이그레이션 (축약형 → 시맨틱) +- Stitch MCP 프로젝트 참조 제거 (독립 토큰 시스템으로 전환) +- DESIGN-SYSTEM.md 문서 전면 재작성 + +--- + +### v1.0 — 초기 디자인 시스템 (2026-03-24~25) + +> 브랜치: `feature/stitch-mcp` | 도구: Google Stitch MCP + +WING-OPS 전용 디자인 시스템의 첫 구축. CSS 변수 기반 토큰 시스템, `.wing-*` 컴포넌트 클래스, 라이브 카탈로그 뷰어를 도입. + +#### 컬러 시스템 + +- **프리미티브 팔레트**: 7개 그룹 (Navy/Cyan/Blue/Red/Green/Orange/Yellow), 각 11단계 스케일 (00~100) +- **시맨틱 컬러**: 축약형 CSS 변수 — Background(`--bg0`~`--bgH`), Text(`--t1`~`--t3`), Border(`--bd`, `--bdL`) +- **액센트 컬러**: `--cyan`(#06b6d4), `--blue`(#3b82f6), `--red`, `--green`, `--orange`, `--yellow`, `--purple` +- **특수 컬러**: `--boom`(#f59e0b) — 오일붐 전용 Amber + +#### 타이포그래피 + +- **3종 폰트 패밀리**: Outfit (영문 본문), Noto Sans KR (한국어), JetBrains Mono (좌표/수치) +- **10개 `.wing-*` 타이포 클래스**: `.wing-title`(15px) ~ `.wing-badge`(9px) + +#### 컴포넌트 클래스 + +| 카테고리 | 클래스 | +|----------|--------| +| 레이아웃 셸 | `.wing-panel`, `.wing-panel-scroll`, `.wing-header-bar`, `.wing-sidebar` | +| 컨테이너 | `.wing-card`, `.wing-card-sm`, `.wing-section` | +| 버튼 | `.wing-btn`, `.wing-btn-primary` (cyan→blue 그라데이션), `-secondary`, `-outline`, `-pdf`, `-danger` | +| 입력 | `.wing-input` (cyan 포커스 링) | +| 테이블 | `.wing-table`, `.wing-th`, `.wing-td`, `.wing-tr-hover` | +| 탭 | `.wing-tab-bar`, `.wing-tab` (cyan 틴트 + 보더 활성) | +| 모달 | `.wing-overlay` (블러 백드롭), `.wing-modal`, `.wing-modal-header` | +| 유틸리티 | `.wing-divider`, `.wing-kv-row`, `.wing-kv-label`, `.wing-kv-value` | +| 뱃지/아이콘 | `.wing-badge`, `.wing-icon-badge`, `.wing-icon-badge-sm` | + +#### 특수 컴포넌트 + +| 영역 | 클래스 접두사 | 설명 | +|------|--------------|------| +| 예측 패널 | `.prd-*` | 폼 입력, 버튼, 맵 버튼 | +| 콤보박스 | `.combo-*` | 커스텀 드롭다운 (검색 + 리스트) | +| 타임라인 | `.tlb`, `.tlt`, `.tlr`, `.tlth` | 지도 하단 재생 컨트롤 | +| 레이어 트리 | `.lyr-*` | 3단계 접이식 레이어 (색상 스와치 + 투명도) | +| 오일붐 | `.boom-*` | 오일붐 드로잉 인디케이터 | +| 역추적 | `.bt-*` | 역추적 리플레이 마커 + 속도 버튼 | +| HNS | `.hns-scn-card` | HNS 시나리오 선택 카드 | +| 모델 칩 | `.prd-mc` | 모델 선택 칩 (활성 `✓` 인디케이터) | + +#### 레이아웃 + +- **데스크톱 전용** (≥ 1280px), Tablet/Mobile 미지원 +- **7단계 z-index 레이어**: Base(0) ~ Tooltip(60) +- **Spacing**: Tailwind 기본 스케일 사용 (`gap-1`~`gap-8`) + +#### Border Radius + +- `rounded-sm`: **6px** (커스텀 오버라이드) +- `rounded-md`: **10px** (커스텀 오버라이드) +- 나머지 Tailwind 기본값 유지 + +#### 애니메이션 + +`fadeIn`, `fadeSlideDown`, `pulse-dot`, `pulse-border`, `comboIn`, `lyrPopIn`, `bt-collision-pulse` + +#### 디자인 카탈로그 + +`/design` 라우트에 라이브 카탈로그 뷰어 배포: +- **Foundations 탭**: Color Palette, Typography, Radius, Layout, Overview +- **Components 탭**: Button, TextField, Overview (Button Catalog, Card, Icon Badge 섹션) +- **다크/라이트 모드 토글** 내장 +- **테마 엔진**: `designTheme.ts` — 타입 안전한 `DesignTheme` 인터페이스 + +#### SVG 아이콘 에셋 + +23개 커스텀 아이콘 (`wing-` 접두사): `wing-anchor`, `wing-cargo`, `wing-chart-bar`, `wing-color-palette`, `wing-documentation`, `wing-elevation`, `wing-foundations`, `wing-layout-grid`, `wing-notification`, `wing-pdf-file`, `wing-settings`, `wing-typography`, `wing-wave-graph` 등 + +#### Stitch MCP 연동 + +Google Stitch 프로젝트 7개 스크린 참조: +- Design Tokens, Component Catalog (Buttons/Badges), Form Components +- Table & List Patterns, Modal Catalog, Operational Shell (Layout) +- Container & Navigation + +--- + ## 테마 (Theme) ### 테마 전환 메커니즘 @@ -121,6 +273,7 @@ Primitive Tokens (정적) Semantic Tokens (테마 반응형) | CSS 변수 | Tailwind 클래스 | Hex | 용도 | |----------|----------------|-----|------| | `--color-accent` | `text-color-accent` | `#06b6d4` | 주요 강조 (Cyan) | +| `--color-accent-muted` | `bg-color-accent-muted` | `#0e7490` / `#0891b2`(light) | 차분한 강조 (버튼 배경 등) | | `--color-info` | `text-color-info` | `#3b82f6` | 정보, 링크 (Blue) | | `--color-tertiary` | `text-color-tertiary` | `#a855f7` | 3차 강조 (Purple) | | `--color-danger` | `text-color-danger` | `#ef4444` | 위험, 삭제 (Red) | @@ -129,6 +282,8 @@ Primitive Tokens (정적) Semantic Tokens (테마 반응형) | `--color-success` | `text-color-success` | `#22c55e` | 성공, 정상 (Green) | | `--color-boom` | `text-color-boom` | `#f59e0b` | 오일붐 전용 (Amber) | | `--color-boom-hover` | — | `#fbbf24` | 오일붐 호버 | +| `--color-navy` | `bg-color-navy` | `#1e40af` / `#1d4ed8`(light) | Navy 버튼 배경 | +| `--color-navy-hover` | `bg-color-navy-hover` | `#1d4ed8` / `#2563eb`(light) | Navy 호버 | #### Static Colors diff --git a/frontend/index.html b/frontend/index.html index d97625a..c8e4e5e 100755 --- a/frontend/index.html +++ b/frontend/index.html @@ -1,5 +1,5 @@ - + @@ -10,7 +10,7 @@ href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@300;400;500;600;700;900&family=JetBrains+Mono:wght@400;500;600&family=Outfit:wght@300;400;500;600;700;800&display=swap" rel="stylesheet" /> - frontend + 해양환경 위기대응 통합지원 시스템