화면 구성 · 여백
이 문서는 CoUI 로 만드는 서비스 화면의 뼈대를 정합니다. 셸, 페이지 순서, 본문의 데이터 표현, 상세 · 설정 · 만들기 흐름, 여백 리듬, 모서리 · 그림자 위계, 글자 크기 4단계를 다룹니다. 값은 CoUI 토큰 이름과 부품 이름으로만 적습니다. 색을 어느 자리에 쓰는지는 `token-usage.md`, 알림 · 빈 상태 · 진행 · 실패 ...
이 문서는 CoUI 로 만드는 서비스 화면의 뼈대를 정합니다. 셸, 페이지 순서, 본문의 데이터 표현, 상세 · 설정 · 만들기 흐름, 여백 리듬, 모서리 · 그림자 위계, 글자 크기 4단계를 다룹니다. 값은 CoUI 토큰 이름과 부품 이름으로만 적습니다. 색을 어느 자리에 쓰는지는
token-usage.md, 알림 · 빈 상태 · 진행 · 실패 · 확인 대화상자는 patterns.md, 피그마 페이지 · 섹션 · 프레임 이름은
figma-file.md 가 정합니다. CoUI 에 없는 것은 「CoUI 에 없음」 과 가장 가까운 CoUI 방법을 함께 적고 「CoUI 후보」 로 표시합니다. 이 문서는 숫자를 고르지 않습니다. 어느 CoUI 토큰을 어느 자리에 쓰는지만 정하므로, CoUI 가 바뀌면 화면도 함께 따라갑니다.
표기: 피그마 변수 이름을 먼저, 괄호 안에 Dart 이름을 적습니다. 예: space/24 (CoreSpace.space24). 피그마에서 간격은
cc-blueprint/rules/coui-library-consumption.md §2 대로 Primitives 의 space/*
를 묶습니다. 이 스킬은 밀도를 standard 하나로 두므로 Semantic/ Dimension 의 standard
값과 같습니다. /cc-blueprint:design 은 밀도 · 재질 모드를 저절로 고정하지 않고 Step 0.4 레버(cc-blueprint/rules/figma-direction.md
§D2)에서 고른 값만 고정합니다. 그래서 레버 DDR 에 테마 밀도 standard · 형태 · 재질 defaultStyle · 깊이
평면 · 강조 면적 기본 을 적고, 이유를 「coui-product-style 하우스 스타일」로 둡니다.
적용 범위#
이 문서의 1~9절 셸과 페이지 순서는 운영 도구 기본 패턴이다. 손님이 폰으로 쓰는 앱은 10절의
손님용 앱 기본 예시에서 출발한다(mood.md 1-1). 그 밖의 소비자 앱·제품 사이트는
SKILL.md 「구성 선택의 범위」를 우선해 실제 작업/데이터에 맞는 위계·구성 단위를 정한다.
CoUI 토큰과 API를 유지하면서 KPI 생략, 카드 없는 시간축, 개체 프로필과 기록 조합,
데이터 시각화, 설명용 이미지 등을 선택할 수 있다. 출처 없는 지표를 채우지 않는다.
1. 셸 — Scaffold + AppBar + NavigationBar#
셸은 CoUI Scaffold 로 짓습니다. 배치는 cc-blueprint/rules/figma-composition-patterns.md
§C4 콘솔 셸을 따릅니다. 사이드바가 왼쪽에 있고, 상단 바는 사이드바 옆 메인 칸 위에 놓입니다. CoUI Scaffold 는 headers
를 사이드바까지 덮는 전체 폭 띠로 그리므로, 사이드바가 있는 데스크톱 · 태블릿은 두 겹으로 짓습니다. 셸 Scaffold(sidebar: NavigationBar)
의 child 에 페이지 Scaffold(headers: [AppBar], child: 본문) 을 넣습니다. 셸 안에 페이지 Scaffold 를 넣는 것은 CoUI 가 정상 조립으로 두는 방법입니다. 사이드바가 없는 모바일은 한 겹으로
headers(상단 바) · child(본문) · footers(하단 탭)입니다. 피그마에서 사이드바는 §C4 대로 자연 높이 · 위 정렬로 둡니다.
| 폭 | 사이드바 | 상단 바 | 본문 바깥 여백 |
|---|---|---|---|
데스크톱 — breakpoint/xl(1280) 이상 |
NavigationBar(mode: sidebar)
, 폭
layout/240
(
CoreLayout.layout240
)
|
AppBar(variant: standard) |
space/32 |
태블릿 — breakpoint/md(768) 이상 |
NavigationBar(mode: rail), 아이콘만 보이는 접힌 상태 |
AppBar(variant: standard) |
space/24 |
| 모바일 — 그 아래 | 없음. Scaffold.footers 에 NavigationBar(mode: bar) 탭 4~5개 |
AppBar(variant: compact) |
space/16 |
-
모드는 저절로 바뀌지 않습니다.
NavigationBar.mode는 화면이 폭을 읽고 고릅니다(Breakpoint·ResponsiveContainer). 세 모드가 같은items를 받으므로 메뉴 데이터는 하나입니다. -
메뉴 묶음(주요 / 운영 / 관리)은
CoreNavigationBarItem.label('운영')(머리글) ·.divider()·.gap(크기)로 나눕니다. 첫 묶음은 머리글 없이, 그 아래 묶음에만 머리글을 둡니다. 묶음 접기는 CoUI 에 없음 → 묶음을 셋 넘기지 않습니다(CoUI 후보: NavigationBar 묶음 접기). -
사이드바 항목의 개수 배지는 항목의
badge슬롯입니다 —CoreNavigationBarItem.destination(icon:, label:, badge: Badge(form: CoreBadgeForm.count, child: Text('12'))). 사이드바에서는 행 끝에, 레일 · 하단 탭에서는 아이콘 위 모서리에 그려지므로 세 모드가 같은items를 씁니다. 피그마는NavigationBarItem의Show count. - 모바일 하단 탭에는 「주요」 묶음만 올립니다. 나머지는 「더보기」 탭 하나로 모아 탭 수를 4~5개로 맞춥니다.
-
상단 바 안:
leading에 맥락(워크스페이스 전환 · 현재 경로),child또는trailing에 전체 검색(Command를 여는TextField),trailing끝에 지금 역할 칩(Badgeoutlined · sm)과 아바타. 역할 칩 규칙은patterns.md. - 사이드바 맨 아래 한 자리는 계정 · 플랜 상태 같은 조용한 정보입니다. 주 행동 버튼을 두지 않습니다.
-
상단 바 아래 선은 부품 기본값 그대로 둡니다. 상단 바와 페이지가 같은 면(
color/surface)이라AppBar의 아래 선(showDivider기본 켜짐,color/outline-variant)이 경계입니다.elevated는 꺼진 채로 둡니다. 셸은 떠 있지 않습니다. -
페이지 바탕은
Scaffold기본값(color/surface) 그대로입니다. 면의 층(페이지 → 카드 · 패널Card기본 → 떠 있는 판)은token-usage.md2절이 정본입니다. 제품이 다른 바탕을 고르면 앱 테마(CoreScaffoldTheme) 한 곳에서 바꿉니다. -
사이드바는
NavigationBar기본값 그대로 둡니다. 면(color/surface-container-low)과 본문 쪽 가장자리 1pxcolor/outline-variant경계선을 부품이 함께 그리므로 선을 따로 긋지 않습니다. 「선과 면 대비를 겹치지 않는다」의 유일한 예외입니다(token-usage.md2-2). -
피그마에서는 태블릿을 그리지 않습니다. 프레임은
Web-Default·Mobile-Default두 벌입니다(cc-blueprint/rules/figma-workflow.md).
2. 페이지 기본 순서#
위에서 아래로 페이지 머리 → 요약(KPI 최대 4개) → 본문(표 · 목록 · 카드) → 필요하면 오른쪽 보조 패널. 블록 사이는 6절 값(데스크톱 · 태블릿 space/24, 모바일
space/20)입니다.
2-1. 페이지 머리 — PageHeader#
맥락 한 줄 · 제목 · 오른쪽 행동 최대 2개. CoUI 기준 릴리스(coui_flutter 0.163)에는 PageHeader 부품이 없어 도메인 컴포넌트
PageHeader 로 CoUI 재료를 조립합니다(patterns.md 8절). 다음 릴리스(coui_flutter 0.164)부터 CoUI
PageHeader(eyebrow · title · description · actions)가 들어옵니다 — 그 릴리스로 올린 앱과, 그 릴리스로 다시 그려 게시한 라이브러리에서는 도메인 컴포넌트를 만들지 않고 CoUI 것을 씁니다.
-
슬롯 이름은 AppBar 의 것을 그대로 씁니다 —
header(맥락 한 줄) ·title(제목) ·subtitle·trailing(행동). 상세 머리에서는leading(뒤로 가기)도 씁니다(3절). -
안쪽: 맥락 한 줄은 메타 글자(
Body/Small,color/on-surface-variant) 또는Breadcrumb, 제목은Headline/Medium글자, 행동은Button인스턴스입니다. 바탕은 채우지 않고 페이지 바탕 위에 둡니다. -
AppBar(variant: medium)를 페이지 머리로 쓰지 않습니다. 아래 선까지 셸의 상단 바와 같은 띠라 바가 두 겹으로 읽히고, 제목 기본 스타일이Title/Large라 9절의 페이지 제목과 다릅니다. 피그마에서는 인스턴스 안 글자 스타일 바꾸기가 허용 범위 밖이고(cc-blueprint/rules/coui-library-consumption.md§7), 높이도 112 로 고정됩니다. 코드에서는Basic(title: Text(…).headlineMedium, subtitle: …, trailing: …)조합으로 같은 슬롯을 만들 수 있습니다. -
오른쪽 행동: 주 행동
Buttonprimary 하나를 맨 오른쪽에, 그 왼쪽에outline하나. 셋 이상은DropdownMenu로 접습니다. -
맥락 한 줄은 문장 하나이거나, 값이 둘이면 글자 노드 둘로 자리를 나눕니다. 한 글자 노드 안에서 「 · 」 · 「→」 로 값을 잇지 않습니다(
copy.md8절). 예: 교육 「2026년 봄학기」 + 「수강생 128명」(자리 둘), 병원 「오늘 접수가 42건이에요」, 커머스 「이번 주 주문 1,284건」, 사내 도구 경로Breadcrumb(「결재」 › 「3분기 예산」). -
그 전까지 피그마에서는
900 components의promote/PageHeader로 둡니다(patterns.md8절 6번). 슬롯 이름은 위와 같고, CoUIPageHeader로 옮길 때header→eyebrow,subtitle→description,trailing→actions로 바뀌고, 상세 머리의 뒤로 가기(leading, 3절)에 해당하는 칸은 없습니다.
2-2. 요약 — KPI 는 Stat#
-
Stat(label, value, change, changeType)한 장이 KPI 하나입니다. 데스크톱 한 줄 4장 같은 폭, 태블릿 · 모바일 2 × 2. 사이는 6절 「같은 줄 패널 사이」 값(데스크톱space/24, 태블릿 · 모바일space/16)입니다. -
단위는
unit(v2부터 — coui_flutter 0.163) 칸에 둡니다(「1,284」 + 「명」,copy.md7절). 그 전 판이면value글자에 붙여 넣습니다. 숫자가 아닌 상태도 KPI 가 됩니다(「정상」 「점검 중」). -
비교 · 기준 시각 같은 설명 한 줄은
description칸에 둡니다. 증감은change+changeType(positive·negative, 증감이 없는 비교는neutral). -
Stat 기본 변형은
filled(color/surface-container, 선 없음)라 페이지 바탕 위에서 면으로 드러납니다 — 테마로 바꾸지 않습니다(token-usage.md2절).outlined는 카드 면의 톤이 바탕과 같아지는 자리에만 씁니다. -
추이가 필요하면
TrendChart를 Stat 아래 패널에 둡니다. 막대 · 점마다 색을 줄 수 있으면 강조색(color/primary)은 「지금」 값 하나(오늘 · 이번 달)에만 두고 지난 값은color/primary-container로 내립니다. 모든 막대가 진하면 지금이 어디인지 읽히지 않습니다. -
처리할 일 KPI — 「사람이 지금 처리해야 할 일」(처리 대기 신고 · 승인 대기 · 미확인 접수)이 0 이 아니면 그 한 장만 눈에 띄게 합니다. Stat 에 톤 축은
CoUI 에 없음 → 지금은 Stat 면은 그대로 두고
description에 「가장 오래된 건 8시간 전」 같은 긴급도를 적고, 라벨 옆에Badge(tone: CoreBadgeTone.destructive)하나를 둡니다. CoUI 후보: Stattone(옅은 상태색 면 + 짝 글자색). 여러 장을 색으로 칠하는 것은 「색색의 KPI 카드」(mood.md4절)입니다. - Stat 값 글자는 부품 기본값
Headline/Large입니다. 글자 4단계 밖의 유일한 예외이고, 페이지 제목보다 큽니다(9절).
2-3. 본문 — 표 · 목록 · 카드#
데이터 표현 규칙:
| 무엇 | 부품 | 예 |
|---|---|---|
| 비교할 레코드 — 열이 둘 이상, 정렬 · 선택 | Table | 병원 접수 대기, 사내 멤버 목록, 커머스 주문 목록 |
| 미리보기가 있는 대상 | Card 격자 | 커머스 상품, 교육 강의 영상, 사내 문서 서식 |
| 핵심 수치 하나 | Stat | 2-2 |
| 「제목 · 메타 · 오른쪽 상태 칩」 한 줄 | Listing + Basic |
최근 활동, 알림 기록, 결제 내역 |
패널 머리는 패널 제목(Title/Medium) + 오른쪽 Link(variant: CoreLinkVariant.muted) 하나(「전체 보기」)입니다. 카드가 목록의 일부만 보여 주면 링크에 전체 건수를 붙입니다(「전체 보기(3건)」). 머리와 내용 사이는 6절 「패널 안 요소 사이」 값(데스크톱
space/16, 태블릿 · 모바일 space/12)입니다.
표(Table)
-
카드(
Card기본 면) 안에 둡니다. 행 구분선(color/outline-variant) · 바깥선(0) · 머리 행(투명 — 카드 면)은Table기본값 그대로이고 다시 묶지 않습니다(token-usage.md2절). -
첫 열은 이름(+ 고정폭 ID), 상태 열은 칩, 맨 끝 열은
DropdownMenu행 메뉴. 셀 글자는 부품 기본값입니다 — 머리 행Label/Medium· 메타 글자색, 본문 행Label/Large. -
정렬 표시 · 페이지 나누기 · 빈 표는 CoUI Table 에 없음 →
Pagination을 표 아래에, 빈 표는 같은 자리에EmptyState. CoUI 후보: Table 정렬 표시 · 빈 표 슬롯.
목록(Listing + Basic)
-
한 줄 =
Basic(title: 제목, subtitle: 메타, trailing: 상태 칩). 상태 칩은 오른쪽입니다(patterns.md).itemBorder는 끈 채로 두고 행은 여백으로 나눕니다. -
평상시 행은 카드 면 그대로입니다. 표의 머리 · 호버 · 선택 행은
Table기본값 그대로입니다. 선택 · 호버 면을 그리지 않는 부품(Listing의 행)만, 그 행에 표의 선택 행과 같은color/surface-container-high(카드 면에서 한 단계)를 깝니다 — 코드는OutlinedContainer(containerStyle:)의 배경 토큰으로. 패널 안에 또 경계 있는 면을 두지 않습니다(cc-blueprint/rules/figma-slop-tells.md§S1).
카드(Card)
- 카드 격자는 패널 안에 넣지 않고 페이지 바탕 위에 바로 놓습니다. 카드 하나가 패널 하나입니다.
-
기본 변형
filled는color/surface-container, 선 없음 — 흰 페이지 위에서 면으로 드러납니다. 테마로 바꾸지 않습니다.outlined(color/surface+color/outline-variant1px)는 카드 면의 톤이 바탕과 같아지는 자리에만 씁니다(token-usage.md2절). 이미지가 카드 폭을 채우는 카드도filled입니다. 카드를 다른 카드 · 패널 안에 두지 않습니다(카드 안 카드, §S1). -
누를 수 있는 카드(
onTap)는 호버에 그림자 medium 이 기본입니다. 페이지 안 패널은 그림자를 쓰지 않으므로 카드 테마(CoreCardTheme(style: CoreCardStyle(hoverElevation: CoreCardElevation.none)))로 끕니다. -
슬롯 순서:
media(미리보기) →header(이름 + 상태 칩) →body(메타) →footer(행동 2개 이하, outline · ghost). 마지막 자리에 「새로 만들기」 카드를 둘 수 있습니다.
2-4. 오른쪽 보조 패널#
-
폭은
layout/400(CoreLayout.layout400) 하나로 고정합니다. 360~400 중 360 은 CoUI 에 없음 →layout/400으로 충분해 CoUI 후보는 두지 않습니다. 화면마다 폭을 바꾸지 않습니다. 본문 패널과 사이는space/24. - 태블릿에서는 본문 아래로 내립니다. 모바일에서는 별도 화면이나 탭으로 뺍니다.
-
안에는 고른 행의 상세, 이름과 값을 나란히 둔 요약(
Basic행), 다음 할 일을 둡니다. 주 행동 버튼은 두지 않습니다. 한 화면의 주 행동 하나는 페이지 머리에 있습니다.
3. 상세 — 머리 + Tabs(underline)#
-
머리: 2-1 의
PageHeader에leading뒤로 가기(Buttonghost 아이콘)를 더해 씁니다.title에 대상 이름 + 상태 칩,subtitle에 고정폭 메타(ID · 버전, 9절),trailing에 버튼 2개 이하. -
탭:
Tabs의variant: underline,size: md. 기본값이 pill 이므로 꼭 적습니다. 개수는CoreTabItem.badge에Badge(form: count). - 탭 아래 본문은 2절과 같은 규칙입니다(블록 사이는 6절 값, 오른쪽 보조 패널
layout/400). - 예: 커머스 「주문 상세」 탭 = 「품목」 「결제」 「배송」 「기록」, 병원 「환자 상세」 = 「접수」 「진료」 「처방」, 교육 「강의 상세」 = 「수강생」 「과제」 「출결」.
4. 설정 — 하위 메뉴 + 본문 칼럼#
-
셸 사이드바 옆에 둘째
NavigationBar(mode: sidebar)를 하위 메뉴로 둡니다. 폭layout/240, 맨 위 머리글 「설정」(CoreNavigationBarItem.label). 항목이 다섯 미만이면 하위 메뉴 대신Tabsunderline. -
본문 칼럼 최대 폭 720 은 CoUI 에 없음 →
layout/640(CoreLayout.layout640) 으로 고정합니다. 두 칼럼 입력 폼이 좁으면 CoUI 후보layout/720. -
칼럼 안: 제목 → 한 줄 설명 → 패널 세로 쌓기(6절 「블록 사이」 값). 패널 하나가 설정 묶음 하나입니다. 되돌리기 어려운 동작(계정 삭제 · 해지)은 맨 아래 패널에 따로 두고, 버튼은
Buttondestructive. 확인 대화상자는patterns.md. -
입력 칸은
TextField입니다. 패널 안 입력 칸의 채움은color/surface-container, 경계는 부품 기본값(color/outline)입니다(token-usage.md2 · 3절).
5. 만드는 흐름 — 입력 → 확인 → 진행 → 결과#
| 단계 | 화면 | 부품 |
|---|---|---|
| 입력 | 무엇을 만들지 설명을 받습니다 | Form + TextArea · TextField, 예시는 Chip 3개까지 |
| 확인 | 만들 것을 요약해 보여 줍니다 | 이름과 값을 나란히 둔 Basic 행 패널 + 주 버튼 「만들기」 + outline 「고치기」 |
| 진행 | 단계 목록 + 경과 시간 |
Steps(variant: CoreStepsVariant.list)
— 단계마다 상태(
CoreStepStatus
)와 오른쪽 짧은 메모(경과 시간) — +
Progress
+ 「멈추기」(
outline
).
patterns.md
3절
|
| 결과 | 만든 것으로 이동합니다 |
결과 화면으로 바로 갑니다. 기록이 필요하면 흐름 안
Alert(variant: success)
+
action
1개(
patterns.md
1 · 3절)
|
- 확인 전에는 아무것도 만들지 않습니다. 확인 화면에 그 사실을 한 줄로 적습니다(「확인하기 전에는 만들지 않아요」).
- 네 단계는 화면 넷입니다. 피그마에서는 섹션 넷(섹션 = 화면)이고, 현재 위치는 페이지 머리 아래
Steps(vertical: false)로 보입니다. - 예: 교육 「반 만들기」, 사내 도구 「배포」, 커머스 「쿠폰 발행」, 병원 「예약 열기」. 모두 같은 네 단계입니다.
6. 여백 리듬#
모든 값은 space/* 사다리 위에 있고 4의 배수입니다. 피그마 Primitives 의 space/N, 코드
CoreSpace.spaceN.
| 자리 | 데스크톱 | 태블릿 | 모바일 |
|---|---|---|---|
| 본문 바깥 | space/32 (breakpoint/2xl 1536 이상은 space/36) |
space/24 |
space/16 |
| 블록 사이(머리 → KPI → 본문) | space/24 |
space/24 |
space/20 |
| 같은 줄 패널 사이 | space/24 |
space/16 |
세로 쌓기, space/16 |
| 패널 안 여백 | space/24 |
space/20 |
space/20 |
| 패널 안 요소 사이 | space/16 |
space/12 |
space/12 |
| 행 안(제목 ↔ 메타) | space/4 |
space/4 |
space/4 |
- 사다리에 없는 값(18 · 22 · 30)은 쓰지 않습니다. 다른 시안의 수치를 옮길 때는 가장 가까운 사다리 값으로, 같은 거리면 작은 쪽으로 옮깁니다(18 → 16, 22 → 20, 30 → 28).
- 부품 안 여백(버튼 · 입력 · 표 셀 · 알림)은 부품 기본값입니다. 손대지 않습니다.
- 기본은
standard이며, 제품의 브랜드 테마가 밀도를 정했으면 라이브러리의 지원 밀도 모드를 선택하고 DDR에 적습니다.
7. 모서리 위계#
CoUI 역할 CoreRadiusRole 은 part 4 · control 8 · panel
12 · surface 16 · modal 20 입니다. 피그마에는 역할 이름 변수가 없으므로 숫자 변수(radius/16
등)를 묶습니다.
| 층 | 역할 · 피그마 변수 | 부품 |
|---|---|---|
| 대화상자 — 열려 있는 동안 가장 바깥 상자 | modal 20 = radius/20 |
Dialog · 명령 팔레트 — 부품 기본값 |
| 패널 — 화면 쪽 면 컨테이너 · Card · Stat · Drawer | surface 16 = radius/16 |
부품 기본값과 같음 |
| 떠서 목록을 담는 판 · 토스트 · 페이지 안 알림 | panel 12 = radius/12 |
Popup · Toast · Alert 12. 판이 담는 행(메뉴 행 · 선택 옵션)은 판에서 파생된 6 |
| 컨트롤 — 버튼 · 입력 · 툴팁 · 표 | control 8 = radius/8 |
Tooltip · Table 8. 크기를 고르는 Button · TextField 는 크기 행이 정합니다(
sm
8 ·
md
10 ·
lg
12)
|
| 부분 — 체크 · 키캡 · 인라인 코드 · 작은 칩 | part 4 = radius/4 |
부품 기본값 |
-
이름 주의: 이 문서의 「패널」 은 CoUI
surface역할(16)입니다. CoUI 의panel역할(12)은 떠 있는 판입니다. - 「대화상자가 가장 크다」 는 부품 기본값으로 성립합니다(Dialog 20 > Card 16). 화면 쪽에서 대화상자 모서리를 따로 키우지 않습니다.
- 화면 쪽에서 직접 모서리를 묶는 곳은 패널 컨테이너(
radius/16)뿐입니다. 나머지는 인스턴스가 가져옵니다. -
위계는 이 표에서 「대화상자(20) > 패널 · 카드(16) > 떠 있는 판(12) > 컨트롤(8 · 크기 행) > 부분(4)」로 읽습니다. 페이지 바탕 위의
Card는 패널 하나이고(2-3), 모서리는 부품 기본값 그대로입니다. 위계는 어느 부품을 어느 층에 두느냐로 지키고, 화면 쪽에서 모서리 값을 바꾸지 않습니다.
8. 그림자#
떠 있는 것만 그림자입니다. 부품이 이미 들고 있으므로 화면 쪽에서 효과 스타일을 더하지 않습니다.
| 부품 | 코드 | 피그마 효과 스타일 |
|---|---|---|
| Toast | CoreShadow.md | shadow/md |
| Popup(DropdownMenu · Select 판이 물려받음) · Drawer | CoreShadow.lg |
shadow/lg |
| Dialog | CoreShadow.xl | shadow/xl |
| Card · Stat · 패널 · Alert · Banner · AppBar · NavigationBar | 없음 | 묶지 않음 |
-
Card 의 호버 그림자는 2-3 대로 끕니다.
AppBar.elevated·Scaffold.floatingHeader는 쓰지 않습니다. -
Dark 에서 코드는 그림자 세기를 키워 그리고(
CoreShadow.darkStrength, 색은 두 모드 모두 검정) 피그마는 라이트 세기로 그립니다 — CoUI 몫이므로 화면 쪽에서 손대지 않습니다(CoUI 이슈 — 다크 프레임의 그림자가 라이트 세기로 그려진다).
9. 글자 크기 4단계#
한 화면에 직접 놓는 글자는 네 역할만 씁니다. 부품 안 글자(버튼 · 입력 · 표 셀 · 알림 · 배지)는 부품 기본값이며 세지 않습니다. 색은 token-usage.md.
| 단계 | 피그마 텍스트 스타일 | Dart | 크기(현재값 참고) | 쓰는 곳 |
|---|---|---|---|---|
| 페이지 제목 | Headline/Medium |
CoreTextStyles.headlineMedium |
28 | 페이지 머리 제목 하나 |
| 패널 제목 | Title/Medium |
CoreTextStyles.titleMedium |
18 | 패널 머리(EmptyState 제목 기본값과 같음) |
| 본문 | Body/Medium |
CoreTextStyles.bodyMedium |
14 | 본문 글 · 행 제목 |
| 메타 | Body/Small |
CoreTextStyles.bodySmall |
13 | 맥락 한 줄 · 행 메타 · 시각 · 캡션 |
| (예외) KPI 숫자 | Headline/Large |
CoreTextStyles.headlineLarge |
32 | Stat.value 기본값 — 페이지 제목보다 큽니다 |
| (예외) 손님용 앱의 핵심 수치 | 카드 값 Title/Large, 입력하는 금액 · 수량 Display/Small |
CoreTextStyles.titleLarge · displaySmall |
— | 10-3 의 숫자 카드. 한 화면에 이 예외는 한 역할만 |
-
크기는 지금 CoUI 의 값을 옮겨 적은 참고입니다. 정본은
cc-designer:design-system4절의 역할 표(coui 소스에서 생성)이고, 이 표는 역할만 정하므로 CoUI 가 크기를 바꾸면 화면도 따라갑니다. -
피그마
Semantic/ Typography모드:Web-*프레임은Desktop,Mobile-*프레임은Mobile. 코드에는 Desktop 한 벌만 있어 휴대폰 프레임의 display · headline 이 앱보다 작게 그려집니다(Headline/Medium은 Mobile 20 · 앱 28,Headline/Large는 Mobile 24 · 앱 32). 앱에서 크기를 맞추지 않습니다 — 알려진 차이입니다(CoUI 이슈 — 휴대폰 · 태블릿 글자 단계,cc-flutter:figma-to-couiF7). Label/*는 부품(버튼 · 배지 · Stat 라벨 · 표 셀)이 씁니다. 화면에 직접 놓지 않습니다.
고정폭#
-
코드 · ID · URL · 버전 · 주문번호 · 경로는 고정폭입니다. 고정폭은 코드 역할로 씁니다 — 피그마
Code/XS·Code/SM·Code/MD텍스트 스타일(서체font/family/Geist Mono, 줄 상자 21px 고정), 코드Text('ORD-2041').codeMd. 메타 크기(13)의 고정폭은Code/MD입니다. -
본문 · 메타 역할 위에 고정폭 서체만 덧씌우지 않습니다(코드의
.bodySmall.mono, 피그마의 글꼴 가족만 바꾸기) — 크기 · 줄 상자 · 자간이 코드 격자에 앉지 않습니다. - 고정폭 서체에는 한글이 없습니다. 앱은 한글 구간을 본문 서체로 그리고, 피그마는 편집기가 고른 서체로 그립니다. 소비 파일에서는 CoUI 플러그인의 「한글 구간 칠하기」(브랜드 탭)로 그 구간을 본문 서체로 맞추고, 글을 고친 뒤에는 다시 돌립니다.
- 문장 안 낱말에는 쓰지 않습니다. 값에만 씁니다. 코드 블록은
CodeSnippet, 키는Kbd.
10. 손님용 앱 기본 예시#
손님이 폰으로 쓰는 앱(예약 · 주문 · 거래 · 수강 신청)의 출발점입니다. 면 · 선 · 주 행동 하나 · 상태색 · 그림자 · 장식 없음은 1~9절과 같고, 셸 · 화면 순서 · 행동 자리 · 숫자 표현이 다릅니다. 프레임은
Mobile-*, 여백은 6절의 모바일 칸입니다. 언제 고르는지는 mood.md 1-1.
10-1. 셸 — 탭 첫 화면과 하위 화면#
Scaffold 한 겹 — headers(상단) · child(본문) · footers(하단 탭 또는 하단 행동). 면은
token-usage.md 2절의 부품 기본값(흰 페이지 · 회색 Card) 그대로입니다. 제품이 회색 바탕 + 흰 카드를 골랐으면 그 결정은 앱 테마 한 곳에서 바꿉니다(token-usage.md
2절).
| 화면 | 상단 | 하단 |
|---|---|---|
| 홈(첫 탭) |
서비스 워드마크(제품 로고 컴포넌트 인스턴스) + 오른쪽 알림 아이콘(새 알림 점은
Indicator
). 본문 맨 위에
맥락 한 줄 + 제목 한 줄
(10-2)
|
NavigationBar(mode: bar) 탭 4개 |
| 다른 탭의 첫 화면 |
AppBar(variant: prominent)
— 한 줄 큰 제목 +
trailing
글자 행동 하나(「설정」). coui_flutter 0.163 이면
compact
|
같은 탭 바 |
| 하위 화면(상세 · 입력 · 설정 항목) |
AppBar(variant: compact, centerTitle: true)
(피그마
Align=center
) + 뒤로 가기, 오른쪽 글자 행동은 하나까지(「신고」 「편집」)
|
탭 바 없음. 흐름을 끝내는 화면이면 BottomActionBar(10-4) |
- 탭은 넷이 기본입니다 — 홈 · 이 서비스의 핵심 대상(지도 · 일정 · 강좌) · 대화 또는 내역 · 내 정보. 「더보기」 탭 대신 「내 정보」가 설정 · 고객센터 · 약관을 묶습니다(10-6).
-
홈에는
AppBar를 두지 않습니다. 홈의 제목 자리는 「지금 이 사람에게 무엇이 있는지」를 말하는 데 씁니다. 워드마크 · 알림 행은 제품 쪽 컴포넌트입니다(로고는 CoUI 자산이 아니므로). - 하위 화면의 오른쪽 글자 행동은 AppBar 기본 글자색 그대로 둡니다. 주 행동이 아니라는 뜻입니다.
10-2. 홈의 순서 — 내 것 → 둘러보기#
위에서 아래로 맥락 한 줄 + 제목 → 내 것(내 예약 · 내 주문 · 내 거래, 카드) → 둘러보기(주변 · 추천 · 새 소식, 목록). 업무 도구의 「머리 → 요약 → 본문」이 손님용 앱에서는 「인사 → 내 것 → 남의 것」입니다.
-
맥락 한 줄은 이 사람의 지금 상황입니다 — 이름 + 진행 중인 일(「민지님, 내일 오후 2시 진료가 있어요」). 메타 글자. 제목은 서비스가 이 화면에서 약속하는 일 한 줄(
Title/Large). 날씨 인사 · 감탄 · 느낌표는 쓰지 않습니다(copy.md4절). -
내 것이 여럿이면 가로로 넘기는 카드(
Carousel+DotIndicator)로 한 장씩 보이고 다음 카드의 가장자리를 남깁니다. 없으면 그 자리에EmptyState(variant: compact)와 첫 행동 하나.
10-3. 숫자 카드 — 값이 주인공#
거래 · 예약 · 주문 한 건을 담는 Card 한 장입니다.
- 맨 위 줄: 왼쪽 상태 칩(
Badge상태 톤 — 「진행 중」 「예약 확정」), 오른쪽 등록 · 예약 시각(메타). -
값 줄: 왼쪽 라벨(본문,
color/on-surface-variant) · 오른쪽 값(Title/Large). 짝인 값(줄 돈 · 받을 돈, 정가 · 결제액)은 같은 크기로 위아래에 둡니다. 단위 · 통화는 값에 붙입니다(copy.md7절). - 기준 줄: 카드 안
Divider아래 기준 값 한 줄(희망 조건 · 환불 기한). -
행동: 맨 아래 보조 행동 하나, 폭 채움(「수정하기」). 회색 카드 위라
outline이고, 흰 카드면secondary입니다(token-usage.md6절). 카드 안에 주 행동을 두지 않습니다. - 목록 행에 숫자가 있으면 오른쪽 끝에 값(
Title/Medium) + 그 아래 기준 · 단위(메타). 「무엇을 · 얼마에」가 행 오른쪽에서 먼저 읽힙니다. -
입력 화면에서 금액 · 수량이 핵심이면 입력값을
Display/Small로 크게 보여 주고, 단위 선택은 값 오른쪽 sm 버튼(「KRW 변경」)으로 둡니다. 실시간 기준값(시세 · 재고 · 남은 자리)은 그 아래 한 줄에Status점 + 기준 시각과 함께 둡니다. 카드 안에 면을 또 깔지 않습니다.
10-4. 흐름을 끝내는 행동 — BottomActionBar#
입력 · 확인 · 결제처럼 흐름을 끝내는 화면의 주 행동은 화면 맨 아래 BottomActionBar(coui_flutter 0.164 부터)에 둡니다. 엄지가 닿는 자리이고 스크롤해도 사라지지 않습니다. 0.163 이면
Scaffold.footers 에 폭 채운 Button(variant: primary, size: xl) 과 위 Divider
로 같은 배치를 만듭니다.
-
primaryAction은Button(variant: primary, size: xl)하나. 보조가 필요하면secondaryAction에ghost. 동의 · 수수료 같은 한 줄 안내는description. - 위 구분선 · 면 · 기기 아래 안전 영역은 부품이 그립니다. 화면 쪽에서 선을 더 긋지 않습니다.
-
조건이 아직 안 됐으면(필수 입력 · 체크 전) 숨기지 않고 비활성으로 둡니다. 무엇을 하면 켜지는지 바로 위 화면 안에 보여야 합니다(이용 전 확인 목록,
patterns.md1절). - 탭 바가 있는 화면에는 두지 않습니다. 탭 첫 화면의 행동은 본문 안 카드 · 섹션의 행동입니다.
10-5. 섹션 머리 — 제목 · 개수 · 조건#
- 왼쪽에 섹션 제목(
Title/Medium)과 개수를 붙여 씁니다(「내 예약 2」). -
오른쪽에 하나만 — 그 묶음을 다루는
Link(variant: CoreLinkVariant.muted)(「관리」) 또는 정렬 바꾸기(ghost글자 버튼 + 아래 화살표 아이콘 → 아래에서 올라오는 시트, 「거리순」). -
결과가 조건으로 좁혀졌으면 머리 아래 메타 한 줄로 조건을 말하고, 걸린 조건 값만 강조 글자(
color/primary-text)로 둡니다(「내 조건과 맞는 곳만 보여요」 + 「서울」 「오늘」, 값마다 자리 하나). 빈 결과가 나왔을 때 무엇을 바꾸면 되는지 이미 보고 있습니다.
10-6. 내 정보 — 신뢰를 숫자로#
-
맨 위 프로필 카드:
Avatar(머리글자) · 이름 + 인증Badge(primary톤) · 메타 한 줄. 그 아래 같은 카드 안에 숫자 세 칸 — 이 서비스에서 이 사람이 쌓은 기록(거래 수 · 약속 지킴 · 받은 후기, 수강 수 · 출석률 · 수료). 칸 사이는 여백으로 나누고 면을 또 깔지 않습니다. - 그 아래 묶음 카드를 세로로: 묶음 라벨(메타) + 행(본문). 행 오른쪽 값은 보조 글자, 진행 중인 것만 강조 글자(「진행 중 2건」).
-
마지막 묶음 맨 끝에 로그아웃 · 탈퇴. 탈퇴는
destructive가 아니라 보조 글자 행입니다. 위험은 다음 화면의 확인 단계가 말합니다(patterns.md5절).
10-7. 짧은 진행 단계#
가입 · 첫 등록처럼 세 단계 이하 흐름은 화면 맨 위에 「단계 1 / 3」(메타 크기 강조 글자, color/primary-text) + 단계 막대, 그 아래 큰 제목(Title/Large)은 두 줄까지.
-
단계 수만큼 나뉜 막대는 CoUI 에 없음 →
Progress(value: 지금 단계 / 전체)한 줄로 대체합니다. CoUI 후보:Progress단계 나눔. 네 단계 이상이거나 단계 이름이 필요하면 5절의Steps입니다.
11. CoUI 후보 모음#
| 후보 | 지금 CoUI 로 하는 법 | 절 |
|---|---|---|
Stat tone(처리할 일 KPI) |
description 에 긴급도 + 라벨 옆 Badge(tone: destructive) |
2-2 |
Progress 단계 나눔 | Progress(value) 한 줄 | 10-7 |
PageHeader |
coui_flutter 0.163 에서는 도메인 컴포넌트
promote/PageHeader
(코드는
Basic
조합). 0.164 부터 CoUI
PageHeader
|
2-1 |
| NavigationBar 묶음 접기 | 묶음 셋 이하 | 1 |
| Table 정렬 표시 · 빈 표 슬롯 | 표 아래 Pagination, 같은 자리 EmptyState |
2-3 |
layout/720 설정 칼럼 | layout/640 | 4 |