+ 좌측 필터와 반응형 동작을 가장 정밀하게 구체화했다.
- 과도한 기능을 임의 추가했고 필수 후반 섹션이 누락됐다.
UI 목적과 흐름을 넣으면 컴포넌트 트리, 레이아웃, 토큰, 상태, 접근성, React/Tailwind 매핑이 포함된 개발 명세를 받습니다.
| 분류 | 디자인 › 화면·제품 설계 |
|---|---|
| 태그 | 초안작성형식변환개발자코드 |
You are a senior product designer and frontend architect. Generate a complete, implementation-ready design handoff optimized for AI coding agents and frontend developers. Be structured, precise, and system-oriented. --- ### 1. System Overview - Purpose of UI - Core user flow ### 2. Component Architecture - Full component tree - Parent-child relationships - Reusable components ### 3. Layout System - Grid (columns, spacing scale) - Responsive behavior (mobile → desktop) ### 4. Design Tokens - Color system (semantic roles) - Typography scale - Spacing system - Radius / elevation ### 5. Interaction Design - Hover / active states - Transitions (timing, easing) - Micro-interactions ### 6. State Logic - Loading - Empty - Error - Edge states ### 7. Accessibility - Contrast - Keyboard navigation - ARIA (if applicable) ### 8. Frontend Mapping - Suggested React/Tailwind structure - Component naming - Props and variants --- ### Output Format: **Overview** **Component Tree** **Design Tokens** **Interaction Rules** **State Handling** **Accessibility Notes** **Frontend Mapping** **Implementation Notes**
AI 코딩 에이전트와 프론트엔드 개발자에게 넘길 구현 준비형 디자인 문서를 만들 때 적합하다. 상태 로직과 props, variant까지 구조화한다.
Claude가 화면 요구에 가장 정확하지만 잘려 있어 미완성이다. ChatGPT는 상세하나 배치 해석이 어긋나며, Gemini는 링크 안내뿐이라 요구를 충족하지 못한다.
+ 좌측 필터와 반응형 동작을 가장 정밀하게 구체화했다.
- 과도한 기능을 임의 추가했고 필수 후반 섹션이 누락됐다.
+ 상태·접근성·컴포넌트 명세가 폭넓고 구체적이다.
- 좌측 기간 필터를 상단 바로 해석했고 끝부분도 잘렸다.
+ 검토할 핵심 의사결정 사항을 간결하게 짚었다.
- 외부 파일로 답을 대신해 필수 명세를 직접 제공하지 않았다.
| 기준 | ChatGPT | Claude | Gemini | 앞선 모델 |
|---|---|---|---|---|
| 지시 준수 | 8 | 7 | 2 | ChatGPT +14% |
| 정확성 | 7 | 8 | 3 | Claude +14% |
| 구체성 | 8 | 9 | 4 | Claude +13% |
| 구성·가독성 | 8 | 9 | 6 | Claude +13% |
| 분량 적정성 | 5 | 5 | 7 | Gemini +40% |
gpt-5.6-sol가 모델 이름을 가린 채 1~10점으로 채점했습니다 (2026-09-24). 측정값이 아니라 AI 심사 결과입니다.
같은 입력을 세 모델에 넣어 받은 답을 그대로 옮겼습니다. 각 CLI(에이전트 하네스)에서 실행했습니다. ChatGPT·Claude 앱이나 웹에서는 답이 다를 수 있습니다.
[붙여 넣은 자료] 저희 B2B SaaS '테이블오더' 관리자 콘솔에 들어갈 '정산 대시보드' 화면 기획입니다. 좌측에 기간 필터(오늘/7일/30일/커스텀), 상단에 총 매출·수수료·정산예정액 3개 카드, 하단에 일별 매출 꺾은선 그래프와 최근 정산 내역 테이블(가맹점명, 정산금액, 상태-대기/완료/보류)이 들어갑니다. 상태값에 따라 뱃지 색이 달라지고, 테이블 행 클릭 시 상세 정산 내역 사이드 패널이 열립니다. 다크모드도 지원해야 합니다.
테이블오더 가맹점의 정산 현황을 한 화면에서 빠르게 파악하고, 기간별 매출·수수료·정산 예정액 및 개별 정산 내역을 확인하는 관리자용 운영 콘솔입니다.
브랜드 톤은 별도 지정이 없으므로, 신뢰감 있는 금융 운영 도구 + 빠르게 읽히는 데이터 중심 UI를 기준으로 설계합니다.
SettlementDashboardPage
├─ AppShell
│ ├─ SidebarNavigation
│ │ ├─ BrandLogo
│ │ ├─ MainNavigation
│ │ ├─ SettingsLink
│ │ └─ ThemeToggle
│ └─ TopBar
│ ├─ Breadcrumb
│ ├─ PageTitle
│ └─ UserMenu
│
├─ DashboardContent
│ ├─ PageHeader
│ │ ├─ PageHeading
│ │ ├─ LastUpdatedText
│ │ └─ RefreshButton
│ │
│ ├─ SettlementFilterBar
│ │ ├─ PresetPeriodTabs
│ │ │ ├─ PeriodTab: 오늘
│ │ │ ├─ PeriodTab: 7일
│ │ │ ├─ PeriodTab: 30일
│ │ │ └─ PeriodTab: 직접 선택
│ │ ├─ DateRangePicker
│ │ └─ ApplyButton
│ │
│ ├─ SettlementMetricGrid
│ │ ├─ MetricCard: 총 매출
│ │ ├─ MetricCard: 수수료
│ │ └─ MetricCard: 정산 예정액
│ │
│ ├─ DailyRevenueSection
│ │ ├─ SectionHeader
│ │ ├─ ChartLegend
│ │ ├─ RevenueLineChart
│ │ │ ├─ ChartGrid
│ │ │ ├─ ChartTooltip
│ │ │ └─ ChartEmptyState
│ │ └─ ChartSummary
│ │
│ └─ RecentSettlementSection
│ ├─ SectionHeader
│ ├─ SettlementTable
│ │ ├─ SettlementTableHeader
│ │ ├─ SettlementTableBody
│ │ │ └─ SettlementTableRow
│ │ │ ├─ MerchantCell
│ │ │ ├─ AmountCell
│ │ │ ├─ SettlementDateCell
│ │ │ └─ StatusBadge
│ │ └─ SettlementTableFooter
│ └─ TableEmptyState
│
└─ SettlementDetailDrawer
├─ DrawerOverlay
├─ DrawerHeader
│ ├─ DrawerTitle
│ └─ CloseButton
├─ SettlementSummary
│ ├─ MerchantName
│ ├─ SettlementStatusBadge
│ └─ SettlementAmount
├─ SettlementMetaList
│ ├─ SettlementId
│ ├─ SettlementPeriod
│ ├─ ExpectedPaymentDate
│ └─ CompletedDate
├─ SettlementBreakdown
│ ├─ GrossSalesRow
│ ├─ CommissionRow
│ ├─ AdjustmentsRow
│ └─ NetSettlementRow
├─ HoldReasonAlert
└─ DrawerFooter
ButtonIconButtonBadgeCardDateRangePickerDataTableDrawerTooltipSkeletonEmptyStateErrorStateVisuallyHiddenCurrencyTextStatusBadge브랜드 포인트 컬러는 신뢰감을 해치지 않는 딥 인디고 + 앰버 포인트를 권장합니다.
| 토큰 | 값 | 용도 |
|---|---|---|
background |
#F6F7F9 |
전체 배경 |
surface |
#FFFFFF |
카드, 테이블, 패널 |
surface-subtle |
#F0F2F5 |
입력 영역, 보조 배경 |
text-primary |
#18202B |
주요 텍스트 |
text-secondary |
#667085 |
보조 텍스트 |
text-tertiary |
#98A2B3 |
비활성 텍스트 |
border |
#E4E7EC |
기본 경계선 |
brand |
#303B70 |
주요 액션, 활성 상태 |
brand-hover |
#252F5D |
브랜드 hover |
revenue |
#3B6FB6 |
매출 그래프 |
success |
#16794C |
완료 |
success-bg |
#E7F6EE |
완료 배지 배경 |
warning |
#A15C00 |
대기 |
warning-bg |
#FFF3D6 |
대기 배지 배경 |
danger |
#B42318 |
오류, 보류 |
danger-bg |
#FEECEB |
보류 배지 배경 |
| 토큰 | 값 | 용도 |
|---|---|---|
background |
#10141C |
전체 배경 |
surface |
#171D27 |
카드, 테이블, 패널 |
surface-subtle |
#202936 |
입력 영역, hover |
text-primary |
#F3F5F7 |
주요 텍스트 |
text-secondary |
#AAB4C2 |
보조 텍스트 |
text-tertiary |
#768397 |
비활성 텍스트 |
border |
#2B3544 |
기본 경계선 |
brand |
#98A7F2 |
주요 액션 |
brand-hover |
#B0BCFF |
브랜드 hover |
revenue |
#78A9EB |
매출 그래프 |
success |
#73D6A1 |
완료 |
success-bg |
#153A2A |
완료 배지 배경 |
warning |
#F2BD62 |
대기 |
warning-bg |
#453314 |
대기 배지 배경 |
danger |
#F08B83 |
보류 |
danger-bg |
#461F21 |
보류 배지 배경 |
상태는 색상만으로 구분하지 않고 반드시 텍스트를 함께 표시합니다.
대기완료보류권장 폰트:
font-family:
"Pretendard Variable",
"Noto Sans KR",
system-ui,
sans-serif;
| 토큰 | 크기 | 굵기 | 용도 |
|---|---|---|---|
display-sm |
28px / 36px | 700 | 페이지 핵심 숫자 |
heading-lg |
22px / 30px | 700 | 페이지 제목 |
heading-md |
18px / 26px | 700 | 섹션 제목 |
body-lg |
16px / 24px | 500 | 강조 본문 |
body-md |
14px / 22px | 400 | 기본 본문 |
body-sm |
13px / 20px | 400 | 보조 정보 |
label |
12px / 18px | 600 | 필드명, 배지 |
caption |
11px / 16px | 500 | 타임스탬프 |
금액은 숫자 정렬을 위해 font-variant-numeric: tabular-nums를 적용합니다.
4px 기반 스케일을 사용합니다.
space-1: 4px
space-2: 8px
space-3: 12px
space-4: 16px
space-5: 20px
space-6: 24px
space-8: 32px
space-10: 40px
space-12: 48px
space-16: 64px
주요 레이아웃 간격:
radius-sm: 6px
radius-md: 10px
radius-lg: 14px
radius-pill: 999px
radius-lgradius-mdradius-pillradius-lg, 내부 행은 radius 사용하지 않음그림자는 최소화합니다.
shadow-panel:
0 8px 24px rgba(16, 24, 40, 0.12)
shadow-focus:
0 0 0 3px rgba(48, 59, 112, 0.22)
최근 30일직접 선택 선택 시 날짜 범위 선택기 노출각 카드에는 다음 정보를 표시합니다.
예시:
총 매출
₩24,580,000
↑ 12.4% 지난 30일 대비
증감률은 색상만으로 전달하지 않습니다.
상승 12.4%하락 8.2%변동 없음Escapefast: 120ms ease-out
normal: 180ms cubic-bezier(0.22, 1, 0.36, 1)
drawer: 240ms cubic-bezier(0.22, 1, 0.36, 1)
적용 대상:
prefers-reduced-motion: reduce 환경에서는 transform 및 opacity 애니메이션을 제거합니다.
초기 로딩 시 레이아웃을 유지하는 skeleton을 사용합니다.
Loading state:
- aria-busy="true"
- 화면 전환 없이 skeleton 표시
- 8초 이상 지연 시 "데이터를 불러오는 중입니다" 메시지 표시
선택한 기간의 매출 데이터가 없습니다.
다른 기간을 선택하면 매출 추이를 확인할 수 있습니다.
액션: 기간 다시 선택
최근 정산 내역이 없습니다.
정산이 생성되면 이곳에서 지급 상태를 확인할 수 있습니다.
필터가 적용된 상태라면 선택한 기간도 함께 안내합니다.
정산 데이터를 불러오지 못했습니다.
잠시 후 다시 시도해 주세요.
액션: 다시 시도
그래프 오류가 테이블까지 차단하지 않도록 독립적으로 처리합니다.
매출 추이를 불러오지 못했습니다.
액션: 다시 시도
행 기본 정보는 유지하고 상세 정보 영역에 오류 표시:
상세 정산 정보를 불러오지 못했습니다.
₩0 표시₩0확인 필요로 fallback권장 탭 순서:
지원 키:
Tab / Shift + Tab: 포커스 이동Enter / Space: 버튼, 탭, 테이블 행 실행Arrow keys: 그래프 포인트 탐색Escape: drawer 및 날짜 선택기 닫기<section aria-labelledby="settlement-title">
<h1 id="settlement-title">정산 대시보드</h1>
</section>
role="tablist", role="tab", aria-selectedrole="img" 또는 접근 가능한 차트 라이브러리 사용<table> 요소 사용tabindex="0" 및 aria-labelrole="dialog", aria-modal="truearia-busy="truerole="alertaria-live="polite"색맹 사용자를 위해 상태 아이콘과 텍스트를 항상 함께 제공합니다.
src/
├─ app/
│ └─ settlements/
│ └─ page.tsx
├─ components/
│ ├─ layout/
│ │ ├─ AppShell.tsx
│ │ ├─ SidebarNavigation.tsx
│ │ └─ TopBar.tsx
│ ├─ settlement/
│ │ ├─ SettlementFilterBar.tsx
│ │ ├─ SettlementMetricGrid.tsx
│ │ ├─ SettlementMetricCard.tsx
│ │ ├─ DailyRevenueChart.tsx
│ │ ├─ RecentSettlementTable.tsx
│ │ ├─ SettlementTableRow.tsx
│ │ └─ SettlementDetailDrawer.tsx
│ └─ ui/
│ ├─ Badge.tsx
│ ├─ Button.tsx
│ ├─ Card.tsx
│ ├─ Drawer.tsx
│ ├─ Skeleton.tsx
│ └─ EmptyState.tsx
├─ hooks/
│ ├─ useSettlementFilters.ts
│ └─ useSettlementDetail.ts
├─ lib/
│ ├─ formatCurrency.ts
│ └─ settlementApi.ts
└─ types/
└─ settlement.ts
type SettlementStatus = "pending" | "completed" | "on_hold";
type SettlementPeriod = "today" | "7d" | "30d" | "custom";
interface SettlementSummary {
totalRevenue: number;
commission: number;
expectedSettlement: number;
revenueChangeRate: number;
commissionChangeRate: number;
settlementChangeRate: number;
}
interface SettlementRecord {
id: string;
merchantName: string;
amount: number;
status: SettlementStatus;
settlementDate: string;
expectedPaymentDate?: string;
holdReason?: string;
}
interface DailyRevenue {
date: string;
revenue: number;
}
interface SettlementFilterBarProps {
period: SettlementPeriod;
startDate?: Date;
endDate?: Date;
onPeriodChange: (period: SettlementPeriod) => void;
onDateChange: (range: { start: Date; end: Date }) => void;
onApply: () => void;
}
interface SettlementMetricCardProps {
label: string;
amount: number;
changeRate?: number;
comparisonLabel?: string;
tone?: "neutral" | "positive" | "negative";
loading?: boolean;
}
interface StatusBadgeProps {
status: SettlementStatus;
size?: "sm" | "md";
}
interface SettlementDetailDrawerProps {
settlementId?: string;
open: boolean;
onClose: () => void;
}
<div className="grid grid-cols-1 gap-4 md:grid-cols-3">
<SettlementMetricCard />
<SettlementMetricCard />
<SettlementMetricCard />
</div>
<aside
className="
fixed inset-y-0 right-0 z-50 w-full max-w-[440px]
border-l border-border bg-surface
shadow-panel transition-transform duration-200
data-[open=false]:translate-x-full
md:block
"
role="dialog"
aria-modal="true"
>
<SettlementDetailDrawer />
</aside>
상태 배지는 cva 또는 유사한 variant 시스템으로 관리합니다.
const statusBadgeVariants = cva(
"inline-flex items-center gap-1 rounded-full px-2 py-1 text-xs font-semibold",
{
variants: {
status: {
pending: "bg-warning-bg text-warning",
completed: "bg-success-bg text-success",
on_hold: "bg-danger-bg text-danger",
},
},
}
);
display: gridminmax(0, 1fr)Desktop ≥ 1280px
Sidebar 240px | Main content fluid
Main max-width: 1440px
const formatCurrency = (value: number) =>
new Intl.NumberFormat("ko-KR", {
style: "currency",
currency: "KRW",
maximumFractionDigits: 0,
}).format(value);
| 7대7 축구 팀 앱 설계 프롬프트 | |
| 접근성 감사자 역할을 맡기는 프롬프트 | |
| 접근성 감사자 역할 프롬프트 | |
| 접근성 전문가 역할 프롬프트 | |
| 접근성 테스트 워크플로 프롬프트 |