@@ -597,7 +606,7 @@ export const ButtonContent = ({ theme }: ButtonContentProps) => {
{VARIANTS.map((variant) => (
{/* 상태 라벨 */}
-
+
{label}
@@ -453,7 +453,7 @@ export const ColorPaletteContent = ({ theme }: ColorPaletteContentProps) => {
{/* ── 섹션 1: 헤더 ── */}
Foundations
@@ -476,7 +476,7 @@ export const ColorPaletteContent = ({ theme }: ColorPaletteContentProps) => {
-
+
모든 컬러 토큰은{' '}
Property-Role-Variant 3계층 구조를
따릅니다. Property는 색상이 적용되는 CSS 속성, Role은 의미 기반 역할, Variant는 상태
@@ -551,17 +551,17 @@ export const ColorPaletteContent = ({ theme }: ColorPaletteContentProps) => {
}}
>
{row.prop}
@@ -581,7 +581,7 @@ export const ColorPaletteContent = ({ theme }: ColorPaletteContentProps) => {
style={{ border: `1px solid ${dividerColor}` }}
>
{
}}
>
{row.name}
-
+
{row.desc}
@@ -626,7 +626,7 @@ export const ColorPaletteContent = ({ theme }: ColorPaletteContentProps) => {
style={{ border: `1px solid ${dividerColor}` }}
>
{
}}
>
{row.name}
-
+
{row.desc}
@@ -672,7 +672,7 @@ export const ColorPaletteContent = ({ theme }: ColorPaletteContentProps) => {
Semantic Tokens
-
+
용도에 따라 의미를 부여한 토큰. 테마 전환 시 값이 변경됩니다.
@@ -745,7 +745,7 @@ export const ColorPaletteContent = ({ theme }: ColorPaletteContentProps) => {
},
].map((group) => (
-
+
{group.title}
{
>
{/* 헤더 */}
{
}}
>
{tk.legacy}
{tk.name}
-
+
{tk.desc}
-
+
{tk.value}
@@ -804,7 +804,7 @@ export const ColorPaletteContent = ({ theme }: ColorPaletteContentProps) => {
flexShrink: 0,
}}
/>
-
+
{hexToRgb(tk.value)}
@@ -823,7 +823,7 @@ export const ColorPaletteContent = ({ theme }: ColorPaletteContentProps) => {
Palette Tokens
-
+
fg · bg · stroke 모든 맥락에서 사용되는 색상 원본. Property 접두사 없이{' '}
--color-*
@@ -836,7 +836,7 @@ export const ColorPaletteContent = ({ theme }: ColorPaletteContentProps) => {
style={{ border: `1px solid ${dividerColor}` }}
>
{
backgroundColor: isDark ? 'rgba(255,255,255,0.02)' : '#fafafa',
}}
>
-
+
{tk.legacy}
{tk.name}
-
+
{tk.value}
@@ -905,11 +908,11 @@ export const ColorPaletteContent = ({ theme }: ColorPaletteContentProps) => {
flexShrink: 0,
}}
/>
-
+
{hexToRgb(tk.value)}
-
+
{tk.desc}
@@ -925,7 +928,7 @@ export const ColorPaletteContent = ({ theme }: ColorPaletteContentProps) => {
Non-color Tokens
-
+
타이포그래피, 라운딩 등 색상 외 토큰.
@@ -934,7 +937,7 @@ export const ColorPaletteContent = ({ theme }: ColorPaletteContentProps) => {
style={{ border: `1px solid ${dividerColor}` }}
>
{
backgroundColor: isDark ? 'rgba(255,255,255,0.02)' : '#fafafa',
}}
>
-
+
{tk.legacy}
{tk.name}
{
>
{tk.category}
-
+
{tk.desc}
@@ -1015,7 +1021,7 @@ export const ColorPaletteContent = ({ theme }: ColorPaletteContentProps) => {
프라이머리 색상(primary color)
-
+
Primary 색상은 해양 방제 시스템의 핵심 인터랙션 요소에 사용됩니다. Cyan~Blue
그라디언트가 주요 액션 버튼과 강조 요소에 적용됩니다.
@@ -1023,7 +1029,7 @@ export const ColorPaletteContent = ({ theme }: ColorPaletteContentProps) => {
{/* Light Mode */}
-
+
Light Mode
{
{/* Dark Mode */}
-
+
Dark Mode
{
세컨더리 색상(secondary color)
-
+
Secondary 색상은 UI의 배경과 구조적 요소에 사용됩니다. Navy 계열로 다크 모드의
깊이감과 계층 구조를 표현합니다.
@@ -1075,7 +1081,7 @@ export const ColorPaletteContent = ({ theme }: ColorPaletteContentProps) => {
{/* Light Mode */}
-
+
Light Mode
{
{/* Dark Mode */}
-
+
Dark Mode
{
그레이 색상(gray color) / 네추럴, 중립 색상
-
+
Gray 색상은 주로 배경, 텍스트, 구분 선에 사용되며, 시각적 집중을 방해하지 않고
콘텐츠에 초점을 맞추도록 도와주는 중립적인 색상이다.
-
+
표준형 스타일의 그레이 색상은 주요 색상과 선명한 모드에서의 조화를 고려해 블루
그레이 계열을 사용한다.
@@ -1141,7 +1147,7 @@ export const ColorPaletteContent = ({ theme }: ColorPaletteContentProps) => {
Transparent
-
+
투명도와 음영을 활용하여 정보의 집중도를 조절합니다. 배경의 음영 처리는 투명도 65%를
사용합니다.
@@ -1174,12 +1180,12 @@ export const ColorPaletteContent = ({ theme }: ColorPaletteContentProps) => {
Primitive
-
+
UI 전반에서 사용하는 기본 색조 팔레트. 테마와 무관하게 고정된 값입니다.
@@ -1214,17 +1220,17 @@ export const ColorPaletteContent = ({ theme }: ColorPaletteContentProps) => {
/>
{/* 토큰명 */}
{token.name}
{/* HEX + RGB */}
-
+
{token.hex}
-
diff --git a/frontend/src/pages/design/ComponentsContent.tsx b/frontend/src/pages/design/ComponentsContent.tsx
index 663231e..efa2d6c 100644
--- a/frontend/src/pages/design/ComponentsContent.tsx
+++ b/frontend/src/pages/design/ComponentsContent.tsx
@@ -13,7 +13,7 @@ export const ComponentsContent = () => {
>
시스템 컴포넌트 카탈로그
-
+
WING-OPS 해상 물류를 위한 시각적 아이덴티티 시스템입니다. 정밀도와 미션 크리티컬한 운영을
위해 설계된 고밀도 산업용 인터페이스입니다.
diff --git a/frontend/src/pages/design/ComponentsOverview.tsx b/frontend/src/pages/design/ComponentsOverview.tsx
index 731664a..ce1a119 100644
--- a/frontend/src/pages/design/ComponentsOverview.tsx
+++ b/frontend/src/pages/design/ComponentsOverview.tsx
@@ -256,7 +256,7 @@ const ComponentsOverview = ({ theme, onNavigate }: ComponentsOverviewProps) => {
{/* ── 헤더 영역 ── */}
Components
@@ -264,7 +264,7 @@ const ComponentsOverview = ({ theme, onNavigate }: ComponentsOverviewProps) => {
Overview
-
+
재사용 가능한 UI 컴포넌트 카탈로그입니다.
@@ -307,7 +307,10 @@ const ComponentsOverview = ({ theme, onNavigate }: ComponentsOverviewProps) => {
{/* 카드 라벨 */}
-
+
{card.label}
diff --git a/frontend/src/pages/design/DesignContent.tsx b/frontend/src/pages/design/DesignContent.tsx
index 69c9b36..007c8a8 100644
--- a/frontend/src/pages/design/DesignContent.tsx
+++ b/frontend/src/pages/design/DesignContent.tsx
@@ -154,7 +154,7 @@ export const DesignContent = ({ theme }: DesignContentProps) => {
style={{ backgroundColor: t.textAccent, boxShadow: t.systemActiveShadow }}
/>
System Active
@@ -192,11 +192,14 @@ export const DesignContent = ({ theme }: DesignContentProps) => {
/>
{/* 정보 */}
-
+
{item.token}
{item.hex}
@@ -233,7 +236,7 @@ export const DesignContent = ({ theme }: DesignContentProps) => {
{item.token}
{item.hex}
@@ -263,7 +266,7 @@ export const DesignContent = ({ theme }: DesignContentProps) => {
{item.token}
{item.sampleText}
-
+
{item.desc}
@@ -297,7 +300,7 @@ export const DesignContent = ({ theme }: DesignContentProps) => {
/>
{item.name}
@@ -435,7 +438,7 @@ export const DesignContent = ({ theme }: DesignContentProps) => {
{/* radius-sm */}
-
+
{t.radiusSmLabel}
{
Small Elements
Applied to tactical buttons, search inputs, and micro-cards for a precise, sharp
@@ -463,7 +466,7 @@ export const DesignContent = ({ theme }: DesignContentProps) => {
{/* radius-md */}
-
+
{t.radiusMdLabel}
{
Structural Panels
Applied to telemetry cards, floating modals, and primary operational panels to
diff --git a/frontend/src/pages/design/FloatContent.tsx b/frontend/src/pages/design/FloatContent.tsx
index 020fac6..bfca117 100644
--- a/frontend/src/pages/design/FloatContent.tsx
+++ b/frontend/src/pages/design/FloatContent.tsx
@@ -50,7 +50,10 @@ export const FloatContent = ({ theme }: FloatContentProps) => {
Float
-
+
화면 위에 떠서 표시되는 UI 패턴 카탈로그 — Modal, Dropdown, Overlay, Toast
@@ -70,7 +73,7 @@ export const FloatContent = ({ theme }: FloatContentProps) => {
}}
>
{label}
diff --git a/frontend/src/pages/design/FoundationsOverview.tsx b/frontend/src/pages/design/FoundationsOverview.tsx
index 1837f0b..ef03049 100644
--- a/frontend/src/pages/design/FoundationsOverview.tsx
+++ b/frontend/src/pages/design/FoundationsOverview.tsx
@@ -174,7 +174,7 @@ const FoundationsOverview = ({ theme, onNavigate }: FoundationsOverviewProps) =>
{/* ── 헤더 영역 ── */}
Foundations
@@ -182,7 +182,7 @@ const FoundationsOverview = ({ theme, onNavigate }: FoundationsOverviewProps) =>
Overview
-
+
디자인의 기반이 되는 핵심 요소 사용 기준입니다.
@@ -225,7 +225,10 @@ const FoundationsOverview = ({ theme, onNavigate }: FoundationsOverviewProps) =>
{/* 카드 라벨 */}
-
+
{card.label}
diff --git a/frontend/src/pages/design/LayoutContent.tsx b/frontend/src/pages/design/LayoutContent.tsx
index 82035d8..0a180f1 100644
--- a/frontend/src/pages/design/LayoutContent.tsx
+++ b/frontend/src/pages/design/LayoutContent.tsx
@@ -324,7 +324,7 @@ export const LayoutContent = ({ theme }: LayoutContentProps) => {
Layout
-
+
WING-OPS는 데스크톱 전용 고정 뷰포트 애플리케이션입니다. 화면 전체를 채우는 고정
레이아웃(100vh)으로, flex 기반의 패널 구조를 사용합니다. KRDS 가이드라인을 기반으로
xlarge / xxlarge 구간에 최적화되어 있습니다.
@@ -364,7 +364,7 @@ export const LayoutContent = ({ theme }: LayoutContentProps) => {
Breakpoint
-
+
화면 크기에 따라 반응형 레이아웃을 사용하여 환경에 최적화된 구조로 표시됩니다. WING-OPS
사용 구간(xl, 2xl)은 cyan으로 강조되어 있습니다.
@@ -499,7 +499,7 @@ export const LayoutContent = ({ theme }: LayoutContentProps) => {
borderColor: isDark ? 'rgba(76,215,246,0.45)' : 'rgba(6,182,212,0.40)',
}}
/>
-
+
WING-OPS 사용 중
@@ -511,7 +511,7 @@ export const LayoutContent = ({ theme }: LayoutContentProps) => {
borderColor: isDark ? 'rgba(140,144,159,0.25)' : 'rgba(148,163,184,0.30)',
}}
/>
-
+
미지원 (1280px 미만)
@@ -525,7 +525,7 @@ export const LayoutContent = ({ theme }: LayoutContentProps) => {
Grid
-
+
컬럼, 마진, 거터로 구성된 그리드 시스템입니다. 데스크톱 전용으로 xl / 2xl 두 구간만
지원합니다.
@@ -548,7 +548,7 @@ export const LayoutContent = ({ theme }: LayoutContentProps) => {
style={{ borderColor: isDark ? 'rgba(66,71,84,0.20)' : '#e2e8f0' }}
>
-
+
Breakpoint
{
-
+
Width
-
+
{spec.width}
@@ -683,7 +683,7 @@ export const LayoutContent = ({ theme }: LayoutContentProps) => {
⚠
-
+
1280px 미만 미지원 — Mobile / Tablet
구간(xs / s / md / lg)은 데스크톱 전용 운영 정책에 따라 지원하지 않습니다.
@@ -696,7 +696,7 @@ export const LayoutContent = ({ theme }: LayoutContentProps) => {
App Shell
-
+
WING-OPS 애플리케이션의 기본 레이아웃 구조와 KRDS Sub-page 영역 매핑입니다.
@@ -720,7 +720,7 @@ export const LayoutContent = ({ theme }: LayoutContentProps) => {
}}
>
-
+
TopBar
{
Spacing
-
+
UI 요소 간의 간격과 여백을 정의하여 콘텐츠의 위계와 가독성을 조율합니다. Tailwind
spacing 토큰과 직결되며, 막대 길이는 실제 px 비율입니다.
@@ -1000,7 +1000,7 @@ export const LayoutContent = ({ theme }: LayoutContentProps) => {
4pt Grid
-
+
모든 여백과 간격을 4point 단위로 설정해 규칙성을 확보합니다. 컴팩트한 컴포넌트의 경우,
2의 배수 단위를 제한적으로 사용합니다.
@@ -1048,7 +1048,7 @@ export const LayoutContent = ({ theme }: LayoutContentProps) => {
>
{item.label}
-
+
{item.text}
@@ -1145,7 +1145,10 @@ export const LayoutContent = ({ theme }: LayoutContentProps) => {
minWidth: '180px',
}}
>
-
+
카드 타이틀
@@ -1185,7 +1188,7 @@ export const LayoutContent = ({ theme }: LayoutContentProps) => {
디자인 시스템 진실 소스
-
+
UI 요소의 레이어 스택 순서입니다. 높은 z-index가 위에 표시되며, 이 값은 디자인 시스템의
이상적 설계 값으로 실제 코드는 이 값에 맞춰 정정되어야 합니다.
@@ -1216,7 +1219,7 @@ export const LayoutContent = ({ theme }: LayoutContentProps) => {
className="w-2 h-2 rounded-full shrink-0"
style={{ backgroundColor: layer.color }}
/>
-
+
{layer.name}
@@ -1234,7 +1237,7 @@ export const LayoutContent = ({ theme }: LayoutContentProps) => {
Reference
-
+
App Shell CSS 클래스와 KRDS Grid 규칙 비교 — 코드 작성 시 참조용입니다.
diff --git a/frontend/src/pages/design/RadiusContent.tsx b/frontend/src/pages/design/RadiusContent.tsx
index 0f34e49..04d3e89 100644
--- a/frontend/src/pages/design/RadiusContent.tsx
+++ b/frontend/src/pages/design/RadiusContent.tsx
@@ -70,17 +70,17 @@ export const RadiusContent = ({ theme }: RadiusContentProps) => {
Radius
-
+
Radius는 컴포넌트 혹은 콘텐츠 모서리의 둥글기를 표현합니다.
-
+
Radius는 UI 구성 요소의 모서리를 둥글게 처리하여 부드럽고 현대적인 느낌을 제공합니다.
일관된 Radius 값은 브랜드 아이덴티티를 강화하고, 사용자 경험을 향상시키며, 다양한 화면과
컨텍스트에서 시각적 일관성을 유지하는 데 중요한 역할을 합니다.
@@ -233,7 +233,7 @@ export const RadiusContent = ({ theme }: RadiusContentProps) => {
{/* 정보 */}
-
+
{item.className}
diff --git a/frontend/src/pages/design/TextFieldContent.tsx b/frontend/src/pages/design/TextFieldContent.tsx
index 9ec4386..2891f0a 100644
--- a/frontend/src/pages/design/TextFieldContent.tsx
+++ b/frontend/src/pages/design/TextFieldContent.tsx
@@ -207,7 +207,7 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
{/* ── 섹션 1: 헤더 ── */}
Components
@@ -225,7 +225,7 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
Input Field
-
+
단일 행 텍스트를 입력받는 필드입니다.
@@ -246,7 +246,7 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
{/* Prefix label */}
Prefix
@@ -272,7 +272,7 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
{/* Input label */}
Input
@@ -295,7 +295,7 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
{/* Suffix label */}
Suffix
@@ -377,7 +377,7 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
{/* Suffix 텍스트 */}
원
@@ -402,7 +402,7 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
}}
>
Container
@@ -437,7 +437,7 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
style={{ width: '1px', height: '10px', backgroundColor: annotationColor }}
/>
Clear Button
@@ -468,7 +468,7 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
Container
-
+
입력 필드의 외곽 영역입니다. 테두리, 곡률, 내부 여백을 정의합니다.
@@ -519,13 +519,13 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
-
+
height: 44px (Medium)
-
+
padding: 12px (좌우)
-
+
border-radius: 6px
@@ -543,14 +543,14 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
Placeholder
-
+
값이 입력되지 않았을 때 표시되는 안내 텍스트입니다. 입력 시 사라집니다.
{/* 플레이스홀더 있는 필드 */}
-
+
플레이스홀더 있음
{
{/* 빈 필드 (플레이스홀더 없음) */}
-
+
플레이스홀더 없음
{
Label
-
+
입력 필드의 용도를 설명하는 텍스트입니다. 필수 항목은 * 표시로 구분합니다.
{/* 일반 라벨 */}
-
+
이름
{
{/* 필수 라벨 */}
-
+
이메일 *
{
Input Text
-
+
사용자가 실제로 입력한 텍스트입니다. 플레이스홀더보다 진한 색상으로 표시됩니다.
@@ -673,7 +679,10 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
>
홍길동
-
+
font-size: 14px
color: textPrimary
font-weight: 400
@@ -692,14 +701,14 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
Clear Icon
-
+
입력값이 있을 때 표시되는 초기화 버튼입니다. 클릭 시 입력값을 삭제합니다.
{/* 텍스트 입력 + Clear 아이콘 표시 */}
-
+
입력값 있음 (Clear 표시)
{
{/* 빈 상태 (Clear 미표시) */}
-
+
입력값 없음 (Clear 미표시)
{
Helper Text
-
+
입력 필드 하단에 표시되는 보조 텍스트입니다. 안내 또는 에러 메시지로 사용됩니다.
@@ -787,7 +796,7 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
>
비밀번호
-
+
영문, 숫자 포함 8자 이상
@@ -807,7 +816,7 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
>
비밀번호
-
+
필수 입력 항목입니다.
@@ -828,7 +837,7 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
{/* 왼쪽: State 라벨 + 뱃지 */}
-
+
State
{
Text Area
-
+
여러 줄의 텍스트를 입력받는 필드입니다.
@@ -911,7 +920,7 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
{/* Input Area label */}
Input Area
@@ -933,7 +942,7 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
{/* Placeholder label */}
Placeholder
@@ -955,7 +964,7 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
{/* Character Counter label */}
Character Counter
@@ -1042,7 +1051,7 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
}}
>
Container
@@ -1075,7 +1084,7 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
style={{ width: '1px', height: '10px', backgroundColor: annotationColor }}
/>
Resize Handle
@@ -1103,7 +1112,7 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
Container
-
+
텍스트 영역의 외곽 컨테이너입니다. 기본 높이 112px이며 사용자가 리사이즈할 수
있습니다.
@@ -1154,16 +1163,16 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
-
+
height: 112px (default)
-
+
padding: 12px
-
+
border-radius: 6px
-
+
resize: vertical
@@ -1181,14 +1190,14 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
Placeholder
-
+
값이 입력되지 않았을 때 표시되는 안내 텍스트입니다.
{/* 플레이스홀더 있는 TextArea */}
-
+
플레이스홀더 있음
{
{/* 빈 TextArea */}
-
+
플레이스홀더 없음
{
Label
-
+
텍스트 영역의 용도를 설명하는 라벨입니다.
{/* 기본 라벨 */}
-
+
내용
{
{/* 필수(*) 라벨 */}
-
+
비고 *
{
Input Text
-
+
사용자가 입력한 여러 줄의 텍스트입니다.
@@ -1316,7 +1331,10 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
>
{'오늘 점검 내용을 기록합니다.\n상세 내용은 아래와 같습니다.'}
-
+
font-size: 14px
color: textPrimary
line-height: 1.6
@@ -1335,14 +1353,14 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
Clear Icon
-
+
입력값 초기화 버튼입니다. 텍스트 영역 우상단에 표시됩니다.
{/* 텍스트 있는 상태 (Clear 표시) */}
-
+
입력값 있음 (Clear 표시)
{
{/* 빈 상태 (Clear 미표시) */}
-
+
입력값 없음 (Clear 미표시)
{
Helper Text
-
+
텍스트 영역 하단의 도움말 또는 에러 메시지입니다.
@@ -1434,10 +1452,10 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
내용을 입력하세요
-
+
상세 내용을 입력해 주세요
-
+
0/500
@@ -1459,7 +1477,7 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
>
내용을 입력하세요
-
+
필수 입력 항목입니다.
@@ -1480,7 +1498,7 @@ export const TextFieldContent = ({ theme }: TextFieldContentProps) => {
{/* 왼쪽: State 라벨 + 뱃지 */}
-
+
State
{
Typography
-
+
WING-OPS 인터페이스에서 사용되는 타이포그래피 체계입니다. 폰트 패밀리, 크기, 두께를
토큰과 컴포넌트 클래스로 정의하여 시각적 계층 구조와 일관성을 유지합니다.
-
+
개요
-
@@ -337,7 +337,7 @@ export const TypographyContent = ({ theme }: TypographyContentProps) => {
글꼴
-
+
사용자의 디바이스 환경을 고려하여, 시스템 폰트와 웹 폰트를 조합하여 사용합니다. 한국어
UI에 최적화된 폰트 스택으로 다양한 기기에서 일관된 가독성을 보장합니다.
@@ -352,7 +352,7 @@ export const TypographyContent = ({ theme }: TypographyContentProps) => {
}}
>
font-family
@@ -390,7 +390,7 @@ export const TypographyContent = ({ theme }: TypographyContentProps) => {
{
>
{font.stack}
- {font.usage}
+ {font.usage}
Regular
@@ -421,7 +421,7 @@ export const TypographyContent = ({ theme }: TypographyContentProps) => {
타입 스케일
-
+
Display, Heading, Body, Navigation, Label의 5가지 용도 카테고리에 맞게 조합하여
사용합니다.
@@ -434,7 +434,7 @@ export const TypographyContent = ({ theme }: TypographyContentProps) => {
{category.name}
-
+
{category.description}
@@ -445,7 +445,7 @@ export const TypographyContent = ({ theme }: TypographyContentProps) => {
style={{ border: `1px solid ${isDark ? 'rgba(66,71,84,0.20)' : '#e2e8f0'}` }}
>
{
backgroundColor: isDark ? 'rgba(255,255,255,0.02)' : '#fafafa',
}}
>
-
+
{row.token}
-
+
{row.px}
-
+
{row.weight}
{`${(row.lineHeight * 100).toFixed(0)}%`}
-
+
{row.letterSpacing}
{
>
{row.token}
@@ -533,7 +536,7 @@ export const TypographyContent = ({ theme }: TypographyContentProps) => {
{row.sample}
-
@@ -551,7 +554,7 @@ export const TypographyContent = ({ theme }: TypographyContentProps) => {
폰트 두께 토큰
-
+
기본 두께 Regular(400), 강조 Bold(700). Medium(500)은 레이블과 소제목, Thin(300)은
장식적 대형 텍스트에 사용합니다.
@@ -561,7 +564,7 @@ export const TypographyContent = ({ theme }: TypographyContentProps) => {
style={{ border: `1px solid ${isDark ? 'rgba(66,71,84,0.20)' : '#e2e8f0'}` }}
>
{
backgroundColor: isDark ? 'rgba(255,255,255,0.02)' : '#fafafa',
}}
>
-
+
{row.token}
-
+
{row.value}
-
+
{row.name}
{row.preview}
@@ -632,7 +638,7 @@ export const TypographyContent = ({ theme }: TypographyContentProps) => {
줄 높이 토큰
-
+
대형 텍스트는 타이트하게(1.3), 본문은 여유롭게(1.6). 가독성과 공간 효율의 균형을
맞춥니다.
@@ -642,7 +648,7 @@ export const TypographyContent = ({ theme }: TypographyContentProps) => {
style={{ border: `1px solid ${isDark ? 'rgba(66,71,84,0.20)' : '#e2e8f0'}` }}
>
{
backgroundColor: isDark ? 'rgba(255,255,255,0.02)' : '#fafafa',
}}
>
-
+
{row.token}
-
+
{row.value}
-
+
{row.pct}
-
+
{row.desc}
@@ -700,7 +709,7 @@ export const TypographyContent = ({ theme }: TypographyContentProps) => {
자간 토큰
-
+
카테고리별로 자간을 정의합니다. Display는 넓게, Body는 기본값을 사용합니다.
@@ -709,7 +718,7 @@ export const TypographyContent = ({ theme }: TypographyContentProps) => {
style={{ border: `1px solid ${isDark ? 'rgba(66,71,84,0.20)' : '#e2e8f0'}` }}
>
{
backgroundColor: isDark ? 'rgba(255,255,255,0.02)' : '#fafafa',
}}
>
-
+
{row.token}
-
+
{row.value}
{
>
{row.tw}
-
+
{row.category}
diff --git a/frontend/src/pages/design/components/ButtonCatalogSection.tsx b/frontend/src/pages/design/components/ButtonCatalogSection.tsx
index bd8fe8d..f4ef9e4 100644
--- a/frontend/src/pages/design/components/ButtonCatalogSection.tsx
+++ b/frontend/src/pages/design/components/ButtonCatalogSection.tsx
@@ -167,7 +167,7 @@ export const ButtonCatalogSection = () => {
제어 인터페이스: 버튼
@@ -185,7 +185,7 @@ export const ButtonCatalogSection = () => {
className="pt-px pr-2 pb-[17.5px] pl-2 flex flex-col gap-0 items-start justify-start flex-1 min-w-0 relative"
>
{header}
@@ -207,7 +207,7 @@ export const ButtonCatalogSection = () => {
>
{/* 버튼 유형 레이블 */}
-
diff --git a/frontend/src/pages/design/components/CardSection.tsx b/frontend/src/pages/design/components/CardSection.tsx
index 4d6118c..17d1627 100644
--- a/frontend/src/pages/design/components/CardSection.tsx
+++ b/frontend/src/pages/design/components/CardSection.tsx
@@ -129,7 +129,7 @@ export const CardSection = () => {
24.8
-
diff --git a/frontend/src/pages/design/components/IconBadgeSection.tsx b/frontend/src/pages/design/components/IconBadgeSection.tsx
index 87c1953..bb947a9 100644
--- a/frontend/src/pages/design/components/IconBadgeSection.tsx
+++ b/frontend/src/pages/design/components/IconBadgeSection.tsx
@@ -61,7 +61,7 @@ export const IconBadgeSection = () => {
마이크로 컨트롤: 아이콘 버튼
@@ -113,7 +113,7 @@ export const IconBadgeSection = () => {
마이크로 컨트롤: 아이콘 버튼
diff --git a/frontend/src/pages/design/float/FloatDropdownContent.tsx b/frontend/src/pages/design/float/FloatDropdownContent.tsx
index 9a3792e..2391c4d 100644
--- a/frontend/src/pages/design/float/FloatDropdownContent.tsx
+++ b/frontend/src/pages/design/float/FloatDropdownContent.tsx
@@ -36,10 +36,10 @@ export const FloatDropdownContent = ({ theme }: FloatDropdownContentProps) => {
Dropdown
-
+
트리거 요소에{' '}
{
로 부착되는 선택 목록. 5개 이상의 선택지가 있는 단일 선택에 사용한다. 프로젝트 공통
컴포넌트는{' '}
{
>
-
+
유출 유형
{
-
+
예측 알고리즘
{
-
+
위 컴포넌트는{' '}
@common/components/ui/ComboBox
@@ -373,7 +373,7 @@ export const FloatDropdownContent = ({ theme }: FloatDropdownContentProps) => {
-
+
{row.desc}
@@ -423,10 +423,16 @@ export const FloatDropdownContent = ({ theme }: FloatDropdownContentProps) => {
: t.cardBorder,
}}
>
-
+
{item.title}
-
+
{item.desc}
diff --git a/frontend/src/pages/design/float/FloatModalContent.tsx b/frontend/src/pages/design/float/FloatModalContent.tsx
index 5eed471..0557b78 100644
--- a/frontend/src/pages/design/float/FloatModalContent.tsx
+++ b/frontend/src/pages/design/float/FloatModalContent.tsx
@@ -88,9 +88,9 @@ export const FloatModalContent = ({ theme }: FloatModalContentProps) => {
Modal
-
+
{
))}
-
+
{SIZE_CONFIG[activeSize].desc}
@@ -166,7 +166,7 @@ export const FloatModalContent = ({ theme }: FloatModalContentProps) => {
@@ -480,7 +483,7 @@ export const FloatModalContent = ({ theme }: FloatModalContentProps) => {
}}
>
-
+
{item.component}
@@ -496,7 +499,7 @@ export const FloatModalContent = ({ theme }: FloatModalContentProps) => {
-
+
{item.trigger}
@@ -533,7 +536,10 @@ export const FloatModalContent = ({ theme }: FloatModalContentProps) => {
className="flex items-center justify-between px-5 py-4 border-b border-solid shrink-0"
style={{ borderColor: modalBorder }}
>
-
+
Modal Preview — {SIZE_CONFIG[activeSize].label} ({SIZE_CONFIG[activeSize].width})
{
className="w-7 h-7 rounded flex items-center justify-center hover:opacity-70 transition-opacity"
style={{ backgroundColor: isDark ? 'rgba(66,71,84,0.25)' : '#f1f5f9' }}
>
-
+
✕
-
+
이 모달은{' '}
{
className="rounded border border-solid px-3 py-2.5"
style={{ borderColor: t.cardBorder }}
>
-
+
{label}
@@ -582,7 +588,7 @@ export const FloatModalContent = ({ theme }: FloatModalContentProps) => {
setIsModalOpen(false)}
- className="px-4 py-2 rounded border border-solid font-korean text-sm transition-opacity hover:opacity-70"
+ className="px-4 py-2 rounded border border-solid font-korean text-body-2 transition-opacity hover:opacity-70"
style={{ borderColor: t.cardBorder, color: t.textMuted }}
>
취소
@@ -590,7 +596,7 @@ export const FloatModalContent = ({ theme }: FloatModalContentProps) => {
setIsModalOpen(false)}
- className="px-4 py-2 rounded font-korean text-sm font-medium transition-opacity hover:opacity-80"
+ className="px-4 py-2 rounded font-korean text-body-2 font-medium transition-opacity hover:opacity-80"
style={{
backgroundColor: isDark ? 'rgba(76,215,246,0.18)' : 'rgba(6,182,212,0.14)',
color: t.textAccent,
@@ -624,13 +630,16 @@ export const FloatModalContent = ({ theme }: FloatModalContentProps) => {
>
⚠
-
+
항목을 삭제하시겠습니까?
-
+
삭제된 데이터는 복구할 수 없습니다. 계속 진행하시겠습니까?
@@ -641,7 +650,7 @@ export const FloatModalContent = ({ theme }: FloatModalContentProps) => {
setIsConfirmOpen(false)}
- className="px-4 py-2 rounded border border-solid font-korean text-sm transition-opacity hover:opacity-70"
+ className="px-4 py-2 rounded border border-solid font-korean text-body-2 transition-opacity hover:opacity-70"
style={{ borderColor: t.cardBorder, color: t.textMuted }}
>
취소
@@ -649,7 +658,7 @@ export const FloatModalContent = ({ theme }: FloatModalContentProps) => {
setIsConfirmOpen(false)}
- className="px-4 py-2 rounded font-korean text-sm font-medium transition-opacity hover:opacity-80"
+ className="px-4 py-2 rounded font-korean text-body-2 font-medium transition-opacity hover:opacity-80"
style={{
backgroundColor: isDark ? 'rgba(239,68,68,0.18)' : 'rgba(239,68,68,0.12)',
color: '#ef4444',
diff --git a/frontend/src/pages/design/float/FloatOverlayContent.tsx b/frontend/src/pages/design/float/FloatOverlayContent.tsx
index 5bc40ea..8d58cc8 100644
--- a/frontend/src/pages/design/float/FloatOverlayContent.tsx
+++ b/frontend/src/pages/design/float/FloatOverlayContent.tsx
@@ -63,10 +63,10 @@ export const FloatOverlayContent = ({ theme }: FloatOverlayContentProps) => {
Overlay
-
+
지도 컨테이너 위에
{
-
+
{row.overlay}
-
+
{row.modal}
@@ -284,7 +284,7 @@ export const FloatOverlayContent = ({ theme }: FloatOverlayContentProps) => {
className="rounded-lg border border-solid p-5 flex flex-col gap-4"
style={{ backgroundColor: t.cardBg, borderColor: t.cardBorder }}
>
-
+
ScatPopup은 지도 마커에 앵커된 컨텍스트 팝업이다. Modal(fixed 뷰포트
중앙)과 달리 마커 위치에서 동적으로 좌표를 계산하며, 지도 패닝·줌 시 위치가 함께
업데이트된다.
@@ -307,7 +307,7 @@ export const FloatOverlayContent = ({ theme }: FloatOverlayContentProps) => {
{item.label}
-
+
{item.value}
@@ -323,7 +323,7 @@ export const FloatOverlayContent = ({ theme }: FloatOverlayContentProps) => {
borderColor: 'rgba(234,179,8,0.25)',
}}
>
-
+
주의: ScatPopup은 MapLibre GL JS의 Popup/Marker 컴포넌트가 아닌 React DOM으로 구현됨.
지도 컨테이너 내부에 position: absolute로 렌더링된다.
@@ -377,7 +377,7 @@ export const FloatOverlayContent = ({ theme }: FloatOverlayContentProps) => {
}}
>
-
+
{item.component}
@@ -413,7 +413,10 @@ export const FloatOverlayContent = ({ theme }: FloatOverlayContentProps) => {
-
+
{item.desc}
diff --git a/frontend/src/pages/design/float/FloatToastContent.tsx b/frontend/src/pages/design/float/FloatToastContent.tsx
index 05aea63..1f14fb1 100644
--- a/frontend/src/pages/design/float/FloatToastContent.tsx
+++ b/frontend/src/pages/design/float/FloatToastContent.tsx
@@ -84,10 +84,10 @@ export const FloatToastContent = ({ theme }: FloatToastContentProps) => {
미구현 — 설계 사양
-
+
화면을 차단하지 않는 비파괴적 알림.
{
에 위치하며 일정 시간 후 자동으로 사라진다. 현재 프로젝트에서는{' '}
{
className="rounded-lg border border-solid p-5 flex flex-col gap-4"
style={{ backgroundColor: t.cardBg, borderColor: t.cardBorder }}
>
-
+
버튼 클릭 시 화면 우하단에 Toast가 표시됩니다. 3초 후 자동으로 사라집니다.
@@ -280,7 +280,7 @@ export const FloatToastContent = ({ theme }: FloatToastContentProps) => {
{cfg.icon}
-
+
{cfg.label}
@@ -311,7 +311,7 @@ export const FloatToastContent = ({ theme }: FloatToastContentProps) => {
className="rounded-lg border border-solid p-5 flex flex-col gap-4"
style={{ backgroundColor: t.cardBg, borderColor: t.cardBorder }}
>
-
+
Toast는 앱 어디서든 호출해야 하므로 Zustand store + useToast hook{' '}
패턴을 권장한다. ToastContainer는 App.tsx 최상위에 한 번만 렌더링한다.
@@ -387,7 +387,7 @@ export const FloatToastContent = ({ theme }: FloatToastContentProps) => {
{cfg.icon}
-
+
{toast.message}
(
🚧
- {label}
+ {label}
해당 기능은 준비 중입니다.
);
diff --git a/frontend/src/tabs/admin/components/AdminSidebar.tsx b/frontend/src/tabs/admin/components/AdminSidebar.tsx
index 8c69a62..bb9877f 100644
--- a/frontend/src/tabs/admin/components/AdminSidebar.tsx
+++ b/frontend/src/tabs/admin/components/AdminSidebar.tsx
@@ -107,7 +107,7 @@ const AdminSidebar = ({ activeMenu, onSelect }: AdminSidebarProps) => {
>
{/* 헤더 */}
-
@@ -129,7 +129,7 @@ const AdminSidebar = ({ activeMenu, onSelect }: AdminSidebarProps) => {
color: hasActiveChild ? 'var(--color-accent)' : 'var(--fg-default)',
}}
>
- {section.icon}
+ {section.icon}
{section.label}
JSX.Element> = {
+const PANEL_MAP: Record React.JSX.Element> = {
users: () => ,
permissions: () => ,
menus: () => ,
@@ -42,6 +48,12 @@ const PANEL_MAP: Record JSX.Element> = {
'monitor-vessel': () => ,
'collect-hr': () => ,
'monitor-forecast': () => ,
+ deidentify: () => ,
+ 'rnd-poseidon': () => ,
+ 'rnd-kosps': () => ,
+ 'rnd-hns-atmos': () => ,
+ 'rnd-rescue': () => ,
+ 'system-arch': () => ,
};
export function AdminView() {
diff --git a/frontend/src/tabs/admin/components/AssetUploadPanel.tsx b/frontend/src/tabs/admin/components/AssetUploadPanel.tsx
index 6de8a45..0112a4c 100644
--- a/frontend/src/tabs/admin/components/AssetUploadPanel.tsx
+++ b/frontend/src/tabs/admin/components/AssetUploadPanel.tsx
@@ -103,7 +103,7 @@ function AssetUploadPanel() {
{/* 헤더 */}
자산 현행화
-
+
자산 데이터를 업로드하여 현행화합니다
@@ -115,7 +115,7 @@ function AssetUploadPanel() {
- 파일 업로드
+ 파일 업로드
{/* 드롭존 */}
@@ -135,12 +135,12 @@ function AssetUploadPanel() {
>
📁
{selectedFile ? (
-
+
{selectedFile.name}
) : (
<>
-
+
파일을 드래그하거나 클릭하여 업로드
@@ -148,7 +148,7 @@ function AssetUploadPanel() {
{
e.stopPropagation();
@@ -176,7 +176,7 @@ function AssetUploadPanel() {
|