+ It specifies the left filter and responsive behavior most precisely.
- It invents extra features and omits the required final sections.
a senior product designer and frontend architect.
| Category | Design › Product design |
|---|---|
| Tags | DraftingReformattingDeveloperCode |
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**
Useful for creating implementation-ready design handoff docs for AI coding agents and frontend developers. It structures state logic, props, variants, and React/Tailwind mapping.
Claude best matches the screen requirements but is truncated. ChatGPT is detailed yet misreads the filter placement, while Gemini fails by only pointing to an external artifact.
+ It specifies the left filter and responsive behavior most precisely.
- It invents extra features and omits the required final sections.
+ Broad, concrete coverage of states, accessibility, and components.
- It turns the left filter into a top bar and ends mid-code.
+ It concisely identifies key decisions needing review.
- It replaces the required handoff with an inaccessible external file.
| Criterion | ChatGPT | Claude | Gemini | Leader |
|---|---|---|---|---|
| Instruction following | 8 | 7 | 2 | ChatGPT +14% |
| Accuracy | 7 | 8 | 3 | Claude +14% |
| Specificity | 8 | 9 | 4 | Claude +13% |
| Structure | 8 | 9 | 6 | Claude +13% |
| Right length | 5 | 5 | 7 | Gemini +40% |
Scored 1–10 by gpt-5.6-sol with model names hidden (2026-09-24). This is an AI review, not a measurement.
We gave three models the same input and copied their answers unedited. Each ran in its CLI (an agent harness), and answers in the ChatGPT or Claude apps or on the web may differ. Outputs are in Korean.
[Pasted material] 저희 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);
| 7v7 Football Team Generator App | |
| Accessibility Auditor | |
| Accessibility Auditor Agent Role | |
| Accessibility Expert | |
| Accessibility Testing Superpower |