Design System
FlowBoard UI Inventory
assets/const.less
토큰과 현재 프로젝트에서 반복 사용하는 UI 패턴을 한 화면에서 확인합니다.
01
Color Palette
assets/const.less
에 정의된 컬러, 상태 컬러, 레거시 컬러, 그라데이션 토큰입니다.
Text Colors
본문 위계, 보조 설명, 비활성 텍스트, placeholder에 사용합니다.Background Colors
페이지 배경, 카드 내부, hover, disabled 상태에 사용합니다.Border Colors
입력 필드, 카드, 포커스 상태, 섹션 구분선에 사용합니다.Semantic Colors
성공, 오류, 경고, 정보 피드백에 사용합니다.Insurance Type Colors
기존 보험 도메인 레거시 색상 토큰입니다.Legacy Colors
기존 화면 호환을 위해 유지되는 레거시 토큰입니다.Gradients
플랜, 랜딩, 강조 카드에 사용할 수 있는 그라데이션입니다.Pilot Gradients
프리미엄/마케팅 계열 화면에서 쓰기 위해 남아 있는 토큰입니다.02
Palette Examples
토큰 조합이 실제 화면에서 쓰이는 방식입니다.주요 액션은 primary + white 조합으로 즉시 인지되게 합니다.
@primary-color + @background-primary비동기 진행 상태와 설명 패널에는 밝은 정보 배경을 씁니다.
@info-bg + @info-color + @text-primary에러 메시지는 낮은 채도의 배경 위에 선명한 에러 컬러를 올립니다.
@error-bg + @error-color + @error-lighter컬럼 매칭, 저장 완료, 확정 상태에는 success 계열을 씁니다.
@success-bg + @success-color자동 추론 결과가 애매할 때 경고 계열로 재확인을 유도합니다.
@warning-bg + @warning-color + @warning-border작업 화면의 카드와 테이블 배경은 white + border-primary를 기본으로 둡니다.
@background-primary + @border-primary + @text-secondary03
Foundation Tokens
컬러 외 레이아웃, 간격, 타이포그래피, 입력, 버튼, 카드 기준값입니다.Shadow
표면의 높이와 포커스 정도를 표현합니다.@shadow-xs 0 1px 2px rgba(0, 0, 0, 0.04) 작은 표면 @shadow-sm 0 2px 8px rgba(0, 0, 0, 0.08) 기본 카드 @shadow-md 0 4px 16px rgba(49, 130, 246, 0.12) Primary 강조 @shadow-lg 0 8px 24px rgba(0, 0, 0, 0.12) 오버레이 @shadow-xl 0 12px 32px rgba(0, 0, 0, 0.16) 모달 @shadow-2xl 0 16px 40px rgba(0, 0, 0, 0.20) 최상위 레이어 Radius
버튼, 입력, 카드, pill UI의 모서리 기준입니다.@radius-xs 4px 작은 요소 @radius-sm 6px 배지 @radius-md 8px 기본 카드/버튼 @radius-lg 12px 입력 필드 @radius-xl 16px 큰 카드 @radius-2xl 20px 대형 패널 @radius-3xl 24px 히어로 카드 @radius-round 9999px pill Spacing
컴포넌트 내부 여백과 섹션 간격입니다.@spacing-xs 4px 아이콘과 텍스트 @spacing-sm 8px 작은 gap @spacing-md 12px 폼 내부 @spacing-lg 16px 컴포넌트 gap @spacing-xl 20px 카드 내부 @spacing-2xl 24px 섹션 내부 @spacing-3xl 28px 큰 gap @spacing-4xl 32px 섹션 간격 @spacing-5xl 40px 페이지 블록 @spacing-6xl 48px 대형 블록 @spacing-7xl 56px 상하 여백 @spacing-8xl 64px 최대 여백 Typography
Noto Sans KR 기반 크기, 굵기, 행간 기준입니다.@font-family-base Noto Sans KR stack 전역 한글 UI 서체 @font-family-mono ui-monospace stack 코드, 토큰, 개발자용 값 @font-xs 12px 보조 메타 @font-sm 13px 라벨 @font-md 14px 테이블 @font-base 15px 본문 @font-lg 16px 버튼 @font-xl 17px 강조 본문 @font-2xl 20px 작은 제목 @font-3xl 22px 패널 제목 @font-4xl 24px 섹션 제목 @font-5xl 26px 페이지 제목 @font-6xl 28px 큰 제목 @font-7xl 32px 히어로 제목 @font-regular 400 일반 @font-medium 500 중간 @font-semibold 600 강조 @font-bold 700 제목/버튼 @line-tight 1.2 짧은 제목 @line-normal 1.5 본문 @line-relaxed 1.6 긴 설명 Layout & Layers
컨테이너, 헤더, z-index 기준입니다.@header-height 70px 헤더 높이 @container-sm 600px 폼 컨테이너 @container-md 900px 중간 컨테이너 @container-lg 1200px 리스트 @container-xl 1440px 최대 컨테이너 @z-dropdown 1000 드롭다운 @z-sticky 1020 sticky @z-fixed 1030 고정 @z-modal-backdrop 1040 모달 배경 @z-modal 1050 모달 @z-popover 1060 팝오버 @z-tooltip 1070 툴팁 Input, Button, Card
상호작용 컴포넌트의 기본 치수입니다.@input-height 52px 입력 높이 @input-padding-x 16px 입력 좌우 @input-padding-y 14px 입력 상하 @input-border-radius @radius-lg 입력 반경 @input-border-color @border-primary 입력 테두리 @input-focus-border @primary-color 입력 포커스 @btn-height-sm 36px 작은 버튼 @btn-height-md 44px 중간 버튼 @btn-height-lg 52px 큰 버튼 @btn-padding-x 20px 버튼 좌우 @btn-padding-y 16px 버튼 상하 @btn-border-radius @radius-lg 버튼 반경 @btn-disabled-bg #AEB8C2 비활성 배경 @btn-disabled-color #FFFFFF 비활성 텍스트 @btn-disabled-border #AEB8C2 비활성 테두리 @card-padding 24px 카드 내부 여백 @card-border-radius @radius-xl 카드 반경 @card-border-color @border-primary 카드 테두리 @card-bg @background-primary 카드 배경 Empty State
데이터 없음, 초기 설정, 권한 없음처럼 다음 행동이 필요한 상태 화면 기준입니다.@empty-state-min-height 320px 데스크톱 기본 높이 @empty-state-padding-y @spacing-6xl 상하 여백 @empty-state-padding-x @spacing-6xl 좌우 여백 @empty-state-border-radius @radius-xl 패널 반경 @empty-state-border-color @border-primary 테두리 @empty-state-bg @background-primary 배경 @empty-state-context-bg @background-secondary 보조 단계 영역 @empty-state-icon-bg @primary-lighter 상태 아이콘 배경 @empty-state-icon-color @primary-dark 상태 아이콘 Transitions
호버, 입력, 오버레이 전환 속도입니다.@transition-fast 0.1s ease 짧은 피드백 @transition-base 0.2s ease 기본 전환 @transition-slow 0.3s ease 오버레이 04
Font & Typography
Noto Sans KR를 기본 서체로 사용하고, 사용처별 크기와 굵기는 제한된 단계로 운영합니다.Primary Typeface
Noto Sans KR
"Noto Sans KR", "Apple SD Gothic Neo", "Malgun Gothic", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif 가나다라마바사 ABC 123Typography Principles
- 크기보다 정보 위계가 먼저 보이도록 제목, 본문, 보조문을 명확히 나눕니다.
- 업무 화면은 과장된 장식보다 읽기 속도와 숫자 판독성을 우선합니다.
- 새 스타일을 만들기보다 정의된 단계 중 가장 가까운 역할을 재사용합니다.
Usage Guide
화면에서 쓰이는 역할별 스타일입니다. 새 UI는 아래 단계 중 가장 가까운 역할을 선택합니다.
회사의 엑셀이 데이터베이스가 됩니다
@font-7xl / 800 / 1.2
월별 매출 분석
@font-4xl / 800 / 1.25
데이터셋 양식
@font-2xl / 800 / 1.35
거래처 원장을 기준으로 매출 파일을 연결합니다.
@font-base / 500 / 1.5
세진상사 · 48,200,000원 · 승인됨
@font-md / 500 / 1.5
데이터셋 저장
@font-sm / 700 / 1.4
마지막 업데이트 2026.07.01
@font-xs / 600 / 1.405
Project Component Inventory
components/ds/DsClayBarChart.vue
와 현재 프로젝트에서 반복되는 페이지 패턴, 등록 플러그인을 함께 정리했습니다.
Component Usage Source
v-app Nuxt 레이아웃 루트
layouts/default.vue, layouts/form.vue, layouts/admin.vuev-icon 액션, 상태, 네비게이션 아이콘
pages/main/*.vuev-progress-circular 로딩/상태 확인
layouts/default.vue, pages/main.vuev-dialog + v-card 전역 로딩, 확인 모달
layouts/default.vue, layouts/error.vuenuxt-link 랜딩, 로그인/회원가입 이동
pages/index.vue, pages/login.vue, pages/signup.vuenuxt-child 워크스페이스 하위 라우트 렌더링
pages/main.vue, pages/admin.vueclient-only 브라우저 전용 차트 렌더링
pages/dashboard.vue, pages/main/dashboard/manage.vuehighcharts 대시보드 차트 위젯
plugins/main.js, pages/main/dashboard/manage.vueDsClayBarChart 월별/카테고리별 단순 막대 지표
components/ds/DsClayBarChart.vuedraggable 데이터셋 순서 변경
pages/main/datasets.vueswiper / swiper-slide 슬라이더 플러그인
plugins/swiper.jsquill-editor 리치 텍스트 에디터 플러그인
plugins/main.jsvue-toastification 전역 토스트 피드백
plugins/toast.jsForm controls 로그인, 설정, 데이터셋 편집, 빌더 입력
pages/login.vue, pages/main/*.vueDashboard widget KPI, 데이터 테이블, 차트 슬롯
pages/main/dashboard/manage.vue, pages/main/dashboard/main.vueSkeleton system 초기 로딩, 리스트/카드/커스텀 로딩 자리표시자
pages/designsystem.vueUpload dropzone 엑셀 파일 입력과 분석 진행률
pages/main/ingest.vue, pages/main/onboarding.vueEmpty state 데이터 없음/초기 화면/권한 없음
components/ds/DsEmptyState.vue, pages/main/datasets.vue06
Component Examples
아래 예시는 실제 프로젝트 화면에서 반복되는 컴포넌트 패턴을 기준으로 구성했습니다.Actions
Buttons
.toss-btn, .ghost-action, .commit-button<DsButton class="toss-btn primary-btn" type="button">저장</DsButton>
<DsButton class="toss-btn secondary-btn" type="button">취소</DsButton>
<DsButton class="toss-btn text-btn" type="button">자세히 보기</DsButton>
<DsButton type="button" aria-label="수정"><v-icon small>mdi-pencil-outline</v-icon></DsButton>Inputs
Form Controls
input, select, textarea, checkbox, radio<label>
데이터셋
<select v-model="datasetId">
<option value="sales">월별 매출</option>
</select>
</label>
<label>
자연어 설정
<textarea v-model.trim="prompt" rows="1" />
</label>Status
Messages, Badges, Chips
.error-message, .notice-message, .file-chip업로드된 파일 3개를 분석 중입니다.
이메일 또는 비밀번호를 확인해주세요.
Exact match Semantic 확인 필요 2026년 매출집계.xlsx<p class="notice-message">업로드된 파일 3개를 분석 중입니다.</p>
<p class="error-message" role="alert">이메일 또는 비밀번호를 확인해주세요.</p>
<span class="file-chip"><v-icon small>mdi-file-excel-outline</v-icon> file.xlsx</span>Navigation
Sidebar, Tabs, Segmented Controls
.workspace-nav, .detail-tabs<nav class="workspace-nav" aria-label="FlowBoard workspace menu">
<DsButton class="nav-item active" type="button">
<v-icon small>mdi-view-dashboard-outline</v-icon>
<span><strong>대시보드</strong><small>완성된 보고서 보기</small></span>
</DsButton>
</nav>Data Display
Cards, Tables, KPI
.dashboard-slot, .data-grid, .manager-kpi거래처 매출 상태
세진상사 48,200,000 승인됨
동아테크 31,450,000 확인 필요
하나물류 22,800,000 승인됨
<article class="dashboard-slot dashboard-slot--filled">
<header class="widget-header">...</header>
<div class="manager-kpi">128,450,000<span>원</span></div>
</article>
<div class="data-grid" role="table">...</div>Charts
Highcharts Bar Chart
<DsClayBarChart :data="monthlyBarChartData" /><DsClayBarChart
:data="[
{ label: '1월', value: 6 },
{ label: '2월', value: 5 },
{ label: '3월', value: 4 },
{ label: '4월', value: 3 },
{ label: '5월', value: 2 },
{ label: '6월', value: 1 },
]"
:height="160"
/>Loading
Skeleton System
.skeleton, .skeleton-row, .skeleton-cardtopListWithIconlistOnlycardOnly['title', 'subtitle', 'spacer(20)', 'card']- 실제 콘텐츠의 위치와 크기를 먼저 보여주고, 로딩 텍스트는 별도로 쓰지 않습니다.
- 리스트는 마지막 row를 반복하는 방식으로 길이를 맞춥니다.
- 흰 배경, 회색 배경, 진한 회색 배경에서 모두 대비가 유지되게 합니다.
<section class="skeleton-pattern skeleton-pattern--white">
<div class="skeleton-top">
<span class="skeleton-icon"></span>
<div>
<i class="skeleton skeleton-title"></i>
<i class="skeleton skeleton-subtitle"></i>
</div>
</div>
<div class="skeleton-list">
<div v-for="index in 4" :key="index" class="skeleton-row">
<span class="skeleton-icon skeleton-icon--sm"></span>
<div>
<i class="skeleton skeleton-line"></i>
<i class="skeleton skeleton-line skeleton-line--short"></i>
</div>
</div>
</div>
</section>Files
Upload, Dropzone, Progress
.upload-panel, .upload-dropzone, .upload-file-card<section class="upload-panel" @dragover.prevent @drop.prevent="dropFiles">
<input id="dataInputFiles" class="upload-file-input" type="file" multiple @change="selectFiles" />
<label v-if="!uploadedFileCards.length" class="upload-dropzone" for="dataInputFiles">
<v-icon>mdi-cloud-upload-outline</v-icon>
<strong>클릭하거나 파일을 여기로 드래그하세요</strong>
<span>XLSX, XLS, CSV 파일 지원</span>
</label>
<div v-else class="upload-file-grid">
<article v-for="file in uploadedFileCards" :key="file.id" class="upload-file-card">
<DsButton type="button" class="upload-file-remove" @click="removeFile(file.id)">
<v-icon x-small>mdi-close</v-icon>
</DsButton>
<v-icon>mdi-file-document-outline</v-icon>
<strong>{{ file.name }}</strong>
</article>
<label class="upload-add-card" for="dataInputFiles"><v-icon>mdi-plus</v-icon><span>문서 추가</span></label>
</div>
</section>Overlays
Modal, Dialog, Toast
v-dialog, vue-toastification, builder-modal<v-dialog v-model="isDialogOpen" width="420">
<v-card class="pa-5">...</v-card>
</v-dialog>
this.$toast.success("저장되었습니다.")Library Components
Vuetify, Draggable, Highcharts, Swiper, Quill
v-icon, draggable, highcharts, swiper, quill-editor Vuetify primitives
<swiper><swiper-slide /></swiper> <quill-editor v-model="content" /><client-only>
<highcharts :options="chartOptions" />
</client-only>
<draggable v-model="items" handle=".drag-handle" :animation="140">...</draggable>
<swiper><swiper-slide>...</swiper-slide></swiper>
<quill-editor v-model="content" />States
Empty, Loading, Error
DsEmptyState, v-progress-circularEmpty State
아직 확정된 데이터셋이 없습니다
데이터 입력에서 파일을 올리고 입력 확정을 누르면 실제 데이터와 양식이 여기에 정리됩니다.
온보딩 상태 확인 중
<DsEmptyState
title="아직 확정된 데이터셋이 없습니다"
description="데이터 입력에서 파일을 올리고 입력 확정을 누르면 실제 데이터와 양식이 여기에 정리됩니다."
icon="mdi-database-off-outline"
primary-label="데이터 입력으로 이동"
primary-icon="mdi-tray-arrow-up"
:steps="['파일 업로드', '컬럼 확인', '데이터 입력 확정']" />
<v-progress-circular indeterminate size="32" color="primary" />