보이는 것을 정할 때 읽는 문서

디자인 가이드

고령 농가가 큰 글씨로 받을 금액을 먼저 보게 한다는 기준이 여기서 나왔습니다.

14,763자 · 시스템이 만든 그대로입니다

사람이 손댄 곳 3군데
  • · 3단계 ‘화면 목록 다듬기’에서 화면 이름 몇 개를 손봤습니다. 하는 일이 겹쳐 보이는 이름을 갈라 적었을 뿐 문서 본문은 손대지 않았습니다.
  • · 사업계획서 검토에서 받은 지적 여덟 건 중 둘은 반영하지 않기로 하고 그 이유를 적어 남겼습니다. 반영하지 않은 것도 기록에 남아 심사에서 물으면 그대로 답이 됩니다.
  • · 아래 화면은 저장소에 연결되기 전 단계의 것입니다. 기능을 붙이는 작업은 이 사례를 정리하는 시점에 아직 진행 중이라, 동작하는 서비스 화면 대신 이 단계까지만 싣습니다. 없는 것을 있다고 하지 않기 위해 그대로 적어 둡니다.

DESIGN CONTRACT V1

로컬푸드 직매장 위탁판매·정산 관리 디자인 가이드

운영자 화면은 ‘오류 없이 목요일 정산 마감을 완료하는 업무 도구’, 농가 화면은 ‘이번에 받을 지급액을 가장 먼저 확인하는 큰 글씨 정산서’로 설계한다. 운영자 화면은 중립적인 장부형 화면에 단계, 오류, 매출 대조 차이와 마감 가능 여부를 명확히 표시한다. 농가 화면은 가로 표를 사용하지 않고 지급액, 입금 예정일, 판매금액과 차감 내역을 세로 카드로 제공한다. 로컬푸드의 인상은 짙은 녹색으로 제한적으로 표현하고, 금액과 오류 상태는 색상뿐 아니라 아이콘과 문구를 함께 사용한다. 첫 버전에는 매장 선택, 실제 은행 이체, 지급 파일, 문자·카카오톡 발송 기능을 노출하지 않는다.

신뢰 가능한 정산 · 단계형 마감 업무 · 매출 대조 · 오류 우선 처리 · 변경 이력 · 큰 글씨 · 지급액 우선 · 고령 농가 친화 · 단일 로컬푸드 직매장 · 데이터 중심

레이아웃
Desktop first
기본 글꼴
Pretendard Variable
조사 출처
4곳

COLOR SYSTEM

컬러 시스템

각 토큰의 실제 색상과 사용 맥락의 본문 대비를 보여 줍니다. AA 기준은 4.5:1입니다.

#176B45

Primary Green

6.05:1 · AA

주요 버튼, 현재 단계, 선택 상태와 링크에 사용한다. 흰색 글자와 조합한다.

#0F5132

Primary Strong

1.74:1 · 큰 글자용

주요 버튼의 호버·눌림 상태와 강한 강조에 사용한다.

#E8F3EC

Primary Soft

14.28:1 · AA

완료 상태 배경, 선택된 행과 지급액 요약 카드의 보조 배경에 사용한다.

#17231B

Text Primary

15.09:1 · AA

제목, 본문, 금액과 핵심 데이터의 기본 글자색이다.

#526158

Text Secondary

6.08:1 · AA

날짜, 도움말, 부가 설명과 메타데이터에 사용한다.

#F5F7F5

Page Background

15.09:1 · AA

운영자 화면의 전체 배경에 사용한다.

#FFFFFF

Surface

16.25:1 · AA

카드, 표, 입력 영역, 모달과 농가 정산서 배경에 사용한다.

#CCD6CF

Border

10.90:1 · AA

카드 구분선과 표 행 구분선에 사용한다.

#7B8A80

Border Strong

4.48:1 · 큰 글자용

입력 필드 경계와 비활성 상태를 구분해야 하는 컨트롤에 사용한다.

#1D4ED8

Focus

2.42:1 · 큰 글자용

키보드 초점 외곽선과 접근성용 포커스 표시에만 사용한다.

#B42318

Danger

2.47:1 · 큰 글자용

마감을 막는 오류, 삭제·중지와 실패 상태에 사용하며 오류 아이콘과 문구를 함께 표시한다.

#FDECEC

Danger Soft

14.22:1 · AA

오류 알림, 차단 사유와 위험 확인 영역의 배경에 사용한다.

#8A4B08

Warning

2.39:1 · 큰 글자용

확인 필요, 미연결, 마감 임박과 주의 문구에 사용한다.

#FFF4E5

Warning Soft

14.95:1 · AA

확인 필요 상태의 배경에 사용한다.

#175CD3

Information

2.71:1 · 큰 글자용

도움말, 자동 연결 상태와 일반 정보 안내에 사용한다.

TYPOGRAPHY

한글 타이포그래피

제목 · -0.025em

흙에서 완성까지, 한눈에

본문 · -0.01em

작품의 현재 단계와 선반 위치를 기록하고, 다음 가마에 넣을 작품을 빠르게 확인합니다.

가마 02 · 1,250°C · 8–11시간

SPACING & RADIUS

간격과 형태

4px
8px
12px
16px
20px
24px
32px
40px
48px
64px
80px
sm
6px
md
10px
lg
16px
full
9999px

RESPONSIVE LAYOUT

그리드와 화면 전략

정산 담당자가 계산대 판매 파일의 많은 행, 상품 연결, 오류 목록, 매출 대조와 정산서 목록을 상시 비교하므로 운영자 영역은 데스크톱 고밀도 표와 다중 패널이 핵심이다. lg 이상에서는 240px 좌측 메뉴와 최대 1440px 작업 영역을 사용한다. 농가 영역은 별도의 모바일 중심 레이아웃을 적용한다. lg 미만 운영자 화면에서도 핵심 조회와 오류 처리가 가능하도록 표의 핵심 열을 카드 목록으로 바꾸고 상세 정보는 전체 화면 패널로 연다.

모바일 · 4

데스크톱 · 12

sm
480px
md
768px
lg
1024px
xl
1440px
최대 폭
1440px

COMPONENTS

컴포넌트와 상태

계약 토큰을 적용한 버튼·입력·카드 견본과 구현 규칙입니다.

버튼

입력 상태

물레컵 3점

초벌 대기

2번 선반 · 1칸
예상 완료 9월 18일

AppShell

operator · farmer · default · navigation-collapsed · narrow

운영자형은 64px 상단 바, 240px 좌측 메뉴와 본문으로 구성한다. 메뉴 순서는 주간 정산 현황, 계산대 판매 파일, 판매 원장, 오류·대조, 정산서·마감, 농가 이의 제기, 농가·품목·정산 규칙, 계정·권한 순으로 둔다. 농가형은 좌측 메뉴 없이 단일 열과 큰 뒤로가기 버튼을 사용한다. 매장 선택기는 제공하지 않는다.

Button

primary · secondary · tertiary · danger · text · default · hover · focus · pressed · loading · disabled

운영자 버튼은 최소 높이 44px, 농가용 주요 버튼은 56px 이상으로 한다. 비활성 버튼에는 ‘오류 3건을 해결해야 마감할 수 있습니다’처럼 이유를 인접 문구로 제공한다. 아이콘만 있는 핵심 버튼은 사용하지 않는다.

FormField

text · number · date · password · textarea · search · default · focus · filled · error · disabled · read-only

라벨을 입력칸 위에 계속 표시하고 필수 여부, 입력 예시와 오류 문구를 연결한다. 금액은 원 단위 정수와 천 단위 쉼표로 표시하되 저장값과 표시값을 분리한다. 마감된 데이터는 비활성이 아니라 읽기 전용 잠금 상태와 마감 정보를 보여 준다.

SelectCombobox

single · multi · searchable · default · open · selected · empty · error · disabled

농가와 품목 선택에는 검색형을 사용하고 농가명, 품목명, 규격과 상품코드를 함께 표시한다. 상품 연결에서는 선택 전에 원본 판매 행을 계속 볼 수 있어야 한다.

StatusBadge

preparing · processing · error · closable · generated · closed · correction-pending · manual-mapping · automatic-mapping · default

색상 외에 상태 아이콘과 ‘오류 있음’, ‘마감 가능’, ‘마감 완료’ 같은 전체 문구를 표시한다. 자동 연결과 직접 연결도 서로 다른 문구로 기록한다.

SettlementWeekBar

editable · read-only · closed · default · closing-soon · invalid-period

정산 주차의 시작일·종료일, 목요일 마감일, 입금 예정일과 현재 상태를 한 줄에 표시한다. 날짜는 한국 시간 기준으로 처리하며 좁은 화면에서는 두 줄 카드로 바꾼다.

WorkflowStepper

horizontal · vertical · compact · not-started · current · complete · blocked

파일 업로드, 상품 연결, 거래 확인, 오류·대조, 정산서 생성, 정산 마감 순서를 표시한다. 차단된 단계에는 원인 건수와 해당 화면으로 이동하는 버튼을 제공한다.

MetricCard

status · amount · count · blocking · normal · warning · error · complete

제목, 값, 단위, 기준 시점과 다음 행동으로 구성한다. 오류 수와 대조 차이를 같은 숫자 스타일로 표시하되 상태 문구를 함께 사용한다.

DataTable

transactions · mapping · rules · settlements · history · accounts · loading · empty · filtered · row-selected · row-error · read-only

표 머리글을 고정하고 금액은 오른쪽 정렬과 tabular numbers를 사용한다. 첫 열에는 체크박스보다 행의 주 식별 정보를 우선한다. md 이하에서는 핵심 열을 세로 카드로 바꾸고 나머지는 상세 패널에서 제공한다. 상태와 오류를 색상만으로 구분하지 않는다.

FilterBar

inline · drawer-mobile · default · applied · no-result

정산 주차, 농가, 품목, 거래 유형, 오류 상태와 날짜 필터를 제공한다. 적용된 필터는 삭제 가능한 칩과 결과 건수로 표시하며 전체 초기화 버튼을 둔다.

FileUploader

dropzone · button · upload-history · idle · drag-over · validating · uploaded · partial-error · failed · duplicate

지원 파일 형식과 최대 용량은 서버 설정값을 표시한다. 파일명, 대상 기간, 업로드 담당자와 시점을 보여 주고 형식 오류, 필수 열 누락, 기간 밖 거래, 중복 파일을 행 수와 금액으로 구분한다. 실제 지원 형식 확정 전 CSV와 엑셀을 모두 지원한다고 표시하지 않는다.

MappingWorkspace

automatic · manual · unmapped · conflict · unresolved · selected · saved · history-open

데스크톱에서는 왼쪽에 원본 판매 항목, 오른쪽에 농가·품목 검색과 연결 결과를 둔다. 이번 항목만 연결과 이후 같은 상품코드에 재사용하는 연결을 명확히 구분한다. 직접 연결 변경 시 사유와 담당자 이력을 표시한다.

RuleEditor

commission · discount-commission · return-burden · disposal-burden · draft · confirmed · scheduled · active · expired · locked · conflict

적용 대상, 규칙 이름, 수수료율, 할인 전·후 기준, 부담 주체, 적용 시작일·종료일과 확정된 약정 확인을 한 양식에서 편집한다. 저장 전에 실제 적용 우선순위와 기간 충돌을 보여 준다. 마감 정산에 사용된 규칙은 편집 대신 새 규칙 생성으로 연결한다.

InlineAlert

information · success · warning · error · locked · default · dismissible · persistent

마감을 막는 오류와 잠금 안내는 닫을 수 없는 형태로 사용한다. 제목, 원인, 영향 건수 또는 금액, 해결 행동을 포함한다.

ReconciliationPanel

summary · equation · difference-detail · matched · mismatched · calculating

조정된 순 판매액, 농가 지급액 합계, 수수료 합계, 농가 부담 차감, 매장 부담 보전과 대조 차이를 식의 순서대로 표시한다. 정정 항목은 현재 주차 계산대 판매 파일 매출과 분리한다. 차이가 0원이 아니면 금액과 원인 거래 보기 버튼을 함께 노출한다.

BlockingIssueList

grouped · flat · compact · unresolved · in-progress · resolved

미연결 상품, 규칙 누락, 미확인 할인·반품·폐기, 중복 가능 거래와 대조 차이를 유형별로 묶는다. 각 항목에는 영향 거래, 농가, 품목, 금액, 담당자와 해결 화면 링크를 제공한다.

SettlementSummary

operator · farmer-large · download · draft · generated · closed · no-sales

운영자형은 판매금액, 순 판매액, 수수료, 반품·폐기, 정정 항목과 지급액을 비교한다. 농가형은 지급액을 34px 이상으로 먼저 표시하고 입금 예정일, 판매금액과 빠진 금액 순으로 보여 준다. 내려받기 형식은 구현 확정값을 사용한다.

CloseChecklist

review · blocked · ready · closed · unchecked · passed · failed

판매 파일, 중복, 상품 연결, 정산 규칙, 할인·반품·폐기 확인, 오류 0건, 대조 차이 0원, 정산서 생성과 마감 권한을 검사한다. 사용자가 체크박스를 임의로 통과시키는 방식이 아니라 서버 검사 결과를 표시한다.

AccordionDetail

sales · commission · discount · return-disposal · correction · collapsed · expanded · empty

농가 화면의 상세 내역에 사용한다. 접힌 상태에서도 항목명, 건수와 합계가 보이게 한다. 반품·폐기 상세에는 품목, 수량, 사유, 부담 주체, 처리일과 증빙 유무를 표시한다.

HistoryTimeline

correction · rule · mapping · dispute · default · linked · missing-link

원 기록, 변경 또는 정정, 승인·처리 시점, 다음 반영 주차를 시간순으로 표시한다. 각 단계에서 담당자와 관련 정산서·원 거래 링크를 제공한다.

DisputeForm

farmer · operator-response · draft · uploading · submitted · reviewing · more-info-needed · resolved · correction-scheduled

농가형은 선택된 정산 항목 확인, 이유 선택, 추가 설명과 증빙 사진, 제출 전 확인 순서로 구성한다. 운영자형은 관련 정산서·세부 내역, 처리 결과, 담당자, 처리일, 농가에 알린 날짜와 방법을 필수 항목으로 제공한다.

PhotoUploaderViewer

camera-or-library · thumbnail-list · full-screen-viewer · empty · selected · uploading · uploaded · failed · restricted

농가 화면에는 카메라 촬영과 앨범 선택을 글자 버튼으로 제공한다. 업로드 제한은 서버 설정값을 표시하고 실패 시 원인과 다시 보내기 버튼을 제공한다. 사진은 권한 확인 후 열며 공개 파일 주소를 화면에 노출하지 않는다.

ModalDrawer

confirmation-modal · desktop-drawer · mobile-full-screen · open · closing · blocked · submitting

삭제, 계정 중지와 정산 마감처럼 되돌리기 어려운 작업에만 확인 모달을 사용한다. 복잡한 상품 연결과 오류 상세는 데스크톱 우측 패널, 모바일 전체 화면으로 제공한다. 초점은 열린 패널 안에 유지하고 닫은 뒤 원래 버튼으로 복귀시킨다.

Toast

success · error · information · visible · dismissed

저장 완료처럼 보조적인 결과에만 사용한다. 마감 차단, 파일 전체 실패와 권한 오류는 사라지는 토스트에만 의존하지 않고 화면 안의 지속 알림으로도 표시한다.

APPLICATION

업계 조사와 화면별 적용

· 정산 담당자의 핵심 흐름은 계산대 판매 파일 업로드, 상품 연결, 판매·할인·반품·폐기 확인, 오류 처리, 매장 매출 대조, 정산서 생성, 권한자 마감 순서다. 주간 정산 현황에서 현재 단계와 다음 작업을 바로 안내해야 한다.

· 상품명만으로는 같은 품목을 출하한 여러 농가를 구분하기 어렵다. 상품코드, 농가, 품목, 규격과 원본 판매 행을 함께 보여 주고 처음 보는 상품코드는 운영자가 직접 연결해야 한다.

· 수수료율과 할인 수수료, 반품·폐기 부담 규칙은 분쟁 가능성이 높은 정보다. 적용 대상, 적용 시작일, 종료일, 확정된 약정 여부와 변경 이력을 한 화면에서 확인할 수 있어야 한다.

· 미연결 상품, 규칙 누락, 미확인 할인·반품·폐기, 중복 가능 거래 또는 매출 대조 차이가 남으면 마감을 허용하면 안 된다. 보류 승인으로 우회하지 않고 제품 정본에 따라 오류 0건과 대조 차이 0원을 요구한다.

· 정산 마감은 일반 저장과 구분되는 확정 행위다. 마감 전 체크리스트, 마감 권한, 한국 시간 기준 목요일 여부와 수정 불가 안내를 확인한 뒤 실행하도록 설계한다.

· 마감 후 오류는 원 정산서를 수정하지 않고 다음 정산의 정정 항목으로 연결한다. 원 정산서, 원 거래, 정정 전후 금액, 처리 담당자와 다음 반영 주차를 한 이력에서 추적할 수 있어야 한다.

· 농가 화면의 첫 질문은 ‘언제 얼마를 받는가’다. 지급액과 입금 예정일을 첫 화면 상단에 크게 배치하고 판매금액, 수수료, 할인, 반품·폐기와 정정 항목은 필요할 때 펼쳐 보게 한다.

· 농가용 화면에서는 가로 스크롤 표와 아이콘만 있는 버튼을 피한다. 본문 18px 이상, 지급액 34px 이상, 주요 버튼 높이 56px을 권장한다.

· 이의 제기는 빈 글쓰기부터 시작하지 않는다. 정산서의 판매·수수료·할인·반품·폐기 항목에서 시작해 대상 내역이 자동 연결되도록 한다.

· 계산대 판매 파일의 실제 열 구성, CSV 또는 엑셀 지원 범위, 거래 고유값이 없는 파일의 중복 판별 방식은 확인 필요다. 화면은 지원 형식과 필수 열을 서버 설정에서 받아 표시해야 한다.

· 농가 계정의 첫 로그인과 비밀번호 복구 방식은 확인 필요다. 확정 전까지 동작하지 않는 복구 기능이나 임시 비밀번호 절차를 화면에 임의로 추가하지 않는다.

· 첫 버전은 로컬푸드 직매장 한 곳만 처리한다. 전역 메뉴, 필터와 헤더에 매장 선택 기능을 두지 않는다.

farmer-settlement

모바일 단일 열로 구성한다. 상단에 정산 상태와 기간, 34~36px 지급액, 20~22px 입금 예정일을 배치한다. 다음 카드에서 판매금액, 수수료, 할인, 반품·폐기, 정정 항목과 지급액의 계산 흐름을 보여 준다. 지난 정산서, 정산서 저장하기, 이의 제기 진행 상황을 큰 글자 버튼으로 제공한다. 마감된 정산서에서만 확정 금액을 보여 주며 다른 농가 정보나 매장 선택은 노출하지 않는다.

correction-history

데스크톱에서는 정정 항목 목록과 상세 패널을 나눈다. 목록 열은 원 정산 주차, 농가, 원 거래, 정정 사유, 정정 전후 금액, 가산·차감액, 다음 반영 주차와 상태로 구성한다. 상세에는 원 정산서부터 다음 정산 반영까지의 타임라인, 담당자와 처리 시점을 표시한다. 원 기록 수정 버튼은 제공하지 않는다.

farmer-settlement-view

큰 글씨 상세 화면으로 지급액과 입금 예정일을 상단에 유지한다. 판매, 수수료, 할인 판매, 반품·폐기, 정정 내역을 세로 아코디언으로 제공하고 가로 표는 사용하지 않는다. 할인 상세에는 할인 전·후 금액과 수수료 계산 기준을 문장으로 표시한다. 반품·폐기에는 수량, 사유, 부담 주체, 처리일과 증빙 사진 유무를 표시하고 각 내역에서 바로 이의를 제기할 수 있게 한다.

operator-login

로그아웃 상태에서는 최대 440px 로그인 카드에 아이디, 비밀번호, 비밀번호 보기와 로그인 버튼만 제공한다. 실패 문구는 계정 존재 여부를 구분하지 않는다. 비밀번호 복구 방식은 확인 필요이므로 확정 전에는 동작하지 않는 링크를 추가하지 않는다. 로그인 후 계정·권한 관리 상태에서는 담당자 이름, 역할, 마감 권한, 사용 상태와 최근 로그인을 표로 제공하며 삭제 대신 사용 중지를 사용한다.

farm-product-rules

농가, 품목군, 품목·상품코드, 정산 규칙을 상위 탭으로 분리한다. 목록은 왼쪽 또는 본문 표에 표시하고 등록·변경은 우측 패널에서 처리한다. 규칙 편집에는 적용 대상, 수수료율, 할인 수수료 기준, 반품·폐기 부담, 적용 시작일·종료일과 확정된 약정 확인이 필수다. 적용 우선순위를 미리 보여 주고 기간 충돌, 마감 정산에 사용된 규칙과 소급 변경을 차단한다.

sales-upload-mapping

정산 주차 확인, 파일 업로드·검사, 상품 연결의 세 단계로 구성한다. 업로드 후 정상 행, 오류 행, 기간 밖 행, 중복 가능 행의 건수와 금액을 요약한다. 상품 연결 표에는 원본 상품코드, 상품명, 수량, 금액, 연결 농가·품목과 자동·직접 연결 상태를 표시한다. 미연결 행을 선택하면 농가와 품목을 검색해 직접 연결하고 이후 같은 상품코드에 재사용할지 선택한다.

transaction-history

기본 정산 주차를 현재 처리 중 주차로 설정하고 농가, 품목, 판매·할인·반품·폐기 유형과 오류 상태 필터를 제공한다. 표에는 거래일시, 원본 거래번호, 농가, 품목, 수량, 할인 전·후 금액, 반품 금액, 적용 규칙과 상태를 표시한다. 반품·폐기 등록 버튼을 상단에 두고 농가, 품목, 수량, 사유와 부담 주체가 없으면 확정하지 못하게 한다. 마감된 주차는 전체 읽기 전용으로 전환한다.

reconciliation-errors

lg 이상에서는 오류 목록 7열, 매출 대조 요약 5열로 나눈다. 오류를 미연결, 규칙 없음, 미확인 거래, 중복 가능 거래와 합계 불일치로 묶고 영향 건수와 금액을 표시한다. 매출 대조는 계산식을 세로로 보여 주며 대조 차이 0원을 명확한 완료 조건으로 사용한다. 해결되지 않은 오류가 있으면 정산서 생성과 마감 이동 버튼을 비활성화하고 각 해결 화면 링크를 제공한다.

settlement-close

상단에 정산 주차와 상태, 다음에 서버 검사 기반 마감 체크리스트, 매출 대조 합계, 농가별 지급액 목록을 배치한다. 정산 담당자는 정산서 생성까지만 할 수 있고 마감 권한이 있는 사용자에게만 목요일 마감 버튼을 제공한다. 오류 0건, 대조 차이 0원과 정산서 생성이 모두 충족되어야 활성화한다. 확인 모달에는 마감 후 수정 불가, 마감 대상 기간, 정산서 수와 총 지급액을 표시하며 서버 결과가 성공한 뒤에만 마감 완료 화면으로 바꾼다.

screen1

farmer-settlement의 큰 글씨 원칙을 유지하면서 이의 제기 진입을 더 강조한다. 지급액과 입금 예정일 다음에 판매, 수수료, 할인, 반품·폐기 요약을 제공하고 ‘문제 있는 내역이 있나요?’ 버튼을 56px 이상으로 배치한다. 이의 제기는 대상 내역 확인, 이유 선택, 설명·증빙 사진, 제출 전 확인의 단계로 진행한다.

farmer-login

360~480px 폭을 기준으로 한 단일 카드 화면이다. 입력 라벨은 18px 이상, 입력칸과 로그인 버튼은 높이 56px 이상으로 한다. 로그인 오류는 ‘아이디 또는 비밀번호를 확인해 주세요’처럼 통합해 표시한다. 로그인 후 요청마다 연결 농가 권한을 확인하며 첫 로그인과 비밀번호 복구 UI는 방식 확정 후 추가한다.

settlement-dashboard

상단에 정산 주차, 마감일, 입금 예정일과 상태를 표시하고 그 아래에 업무 단계 표시기를 둔다. 판매 파일 상태, 미연결 상품 수, 오류 수, 매출 대조 차이, 정산서 생성 상태와 마감 가능 여부를 카드로 배치한다. 가장 먼저 처리해야 할 차단 항목을 상단 지속 알림으로 보여 주고 각 카드에서 해당 화면으로 이동한다. 단일 매장이므로 매장 선택기는 두지 않는다.

dispute-management

데스크톱에서는 이의 제기 목록, 관련 정산 내역과 증빙, 처리 양식의 세 영역으로 구성한다. 목록에는 농가, 접수일, 문제 항목, 금액, 상태와 담당자를 표시한다. 상세에서 원 정산서와 판매·수수료·할인·반품·폐기 항목을 연결하고 사진을 크게 열어 본다. 처리 결과, 담당자, 처리일, 농가에 알린 날짜·방법을 기록하며 금액 변경이 필요하면 원본 수정 대신 정정 항목 생성으로 연결한다.

screen2

farmer-settlement와 같은 농가용 모바일 패턴을 사용하되 이 화면 ID의 경로와 접근 권한을 유지한다. 이번 주 판매금액, 수수료, 지급액과 입금 예정일을 우선 표시하고 판매·할인·반품·폐기 상세와 이의 제기 버튼을 제공한다.

screen3

correction-history와 같은 이력 구조를 사용한다. 원 정산서, 원 거래, 정정 전후 금액, 담당자, 처리 시점과 다음 반영 주차를 검색 가능한 목록과 타임라인으로 표시하며 마감된 원 기록은 읽기 전용이다.

screen4

farmer-settlement-view와 같은 큰 글씨 상세 패턴을 사용한다. 지급액을 먼저 보여 주고 판매·수수료·할인·반품·폐기와 정정 항목을 세로 카드로 제공하며 각 항목의 계산 근거와 이의 제기 진입점을 유지한다.

screen5

farmer-login과 같은 모바일 로그인 패턴을 사용한다. 본인 계정 로그인 후 연결된 농가의 정산서만 조회할 수 있어야 하며 계정 상태와 권한 오류를 구분해 안전한 문구로 안내한다.

screen6

settlement-dashboard와 같은 주간 현황 패턴을 사용한다. 정산 주차, 입금 예정일, 판매 파일 상태, 미연결 상품, 오류, 대조 차이와 마감 가능 여부를 표시하고 다음 필수 작업으로 바로 이동시킨다.

screen7

dispute-management와 같은 운영자 처리 패턴을 사용한다. 이의 제기와 증빙, 관련 정산서·세부 내역, 처리 결과, 담당자, 처리일과 농가 안내 기록을 한 작업 흐름으로 제공한다.

에셋 원칙
Pretendard Variable 웹폰트 파일과 preload 설정 · 24px 선형 SVG 아이콘 세트: 업로드, 연결, 오류, 대조, 잠금, 이력, 사진, 내려받기, 펼치기 · 상태 아이콘은 체크, 경고 삼각형, 오류 원형, 잠금 모양을 사용하고 색상만으로 구분하지 않음 · 증빙 사진용 접근 제한 썸네일과 전체 화면 뷰어 · 계산대 판매 파일 업로드용 파일 형식 아이콘 · 정식 브랜드명이 없으므로 첫 버전은 ‘로컬푸드 직매장 정산’ 텍스트 워드마크를 가정하며 정식 로고는 확인 필요 · 업무 화면의 집중을 방해하는 농산물 사진과 장식 일러스트는 사용하지 않음

ACCESSIBILITY

접근성과 모션

  • · KWCAG 2.2와 WCAG 2.1 AA를 기준으로 텍스트 명도 대비 4.5:1 이상, 큰 글자 3:1 이상, 입력 경계·초점 등 비텍스트 요소 3:1 이상을 확보한다.
  • · 모든 기능을 키보드만으로 사용할 수 있게 하고 논리적인 초점 순서, 건너뛰기 링크와 항상 보이는 포커스 링을 제공한다.
  • · 운영자 터치·클릭 대상은 최소 44×44px, 농가용 주요 대상은 56×56px을 권장한다.
  • · 농가 화면은 본문 18px 이상, 항목명 20px 이상, 지급액 34px 이상을 기본으로 하고 브라우저 글자 확대와 200% 확대에서 내용이 겹치지 않게 한다.
  • · 오류, 완료, 자동 연결과 직접 연결 상태를 색상만으로 표현하지 않고 아이콘, 문구와 필요 시 패턴을 함께 사용한다.
  • · 입력 오류 발생 시 화면 상단 오류 요약과 각 입력칸 오류 문구를 제공하고 오류 입력으로 초점을 이동할 수 있게 한다.
  • · 표에는 caption, 열 머리글과 행 머리글 관계를 지정하고 정렬 상태를 보조 기술에 전달한다. 모바일 카드 전환 후에도 같은 정보 관계를 제목과 설명 목록으로 유지한다.
  • · 금액은 천 단위 쉼표와 원 단위를 함께 표시하고 가산·차감은 부호와 ‘더해진 금액’, ‘빠진 금액’ 문구를 함께 사용한다.
  • · 사진에는 품목, 처리 유형과 촬영 또는 등록 맥락을 설명하는 대체 텍스트를 제공한다. 장식 이미지는 대체 텍스트에서 제외한다.
  • · 마감 확인, 이의 제기 제출과 계정 중지는 실행 전 대상과 결과를 읽을 수 있게 하고 실행 후 성공 또는 실패 상태를 보조 기술에 알린다.
  • · 자동으로 사라지는 안내는 핵심 오류에 사용하지 않는다. 시간 제한이 필요한 로그인 세션은 종료 전에 연장 방법을 안내한다.
  • · 농가용 핵심 기능에는 좌우 스와이프, 길게 누르기, 드래그만으로 가능한 동작을 사용하지 않는다.
  • · 화면 너비가 좁아져도 지급액 확인, 이의 제기, 오류 확인과 처리, 매출 대조 및 마감 상태 조회가 가능해야 한다.

기본 전환 180ms cubic-bezier(0.2, 0, 0, 1) · 모션 감소 설정 지원 · 다크모드 not_planned

EVIDENCE

조사 출처

기계 판독 디자인 계약 보기
{
  "version": 1,
  "direction": "운영자 화면은 ‘오류 없이 목요일 정산 마감을 완료하는 업무 도구’, 농가 화면은 ‘이번에 받을 지급액을 가장 먼저 확인하는 큰 글씨 정산서’로 설계한다. 운영자 화면은 중립적인 장부형 화면에 단계, 오류, 매출 대조 차이와 마감 가능 여부를 명확히 표시한다. 농가 화면은 가로 표를 사용하지 않고 지급액, 입금 예정일, 판매금액과 차감 내역을 세로 카드로 제공한다. 로컬푸드의 인상은 짙은 녹색으로 제한적으로 표현하고, 금액과 오류 상태는 색상뿐 아니라 아이콘과 문구를 함께 사용한다. 첫 버전에는 매장 선택, 실제 은행 이체, 지급 파일, 문자·카카오톡 발송 기능을 노출하지 않는다.",
  "keywords": [
    "신뢰 가능한 정산",
    "단계형 마감 업무",
    "매출 대조",
    "오류 우선 처리",
    "변경 이력",
    "큰 글씨",
    "지급액 우선",
    "고령 농가 친화",
    "단일 로컬푸드 직매장",
    "데이터 중심"
  ],
  "industryFindings": [
    "정산 담당자의 핵심 흐름은 계산대 판매 파일 업로드, 상품 연결, 판매·할인·반품·폐기 확인, 오류 처리, 매장 매출 대조, 정산서 생성, 권한자 마감 순서다. 주간 정산 현황에서 현재 단계와 다음 작업을 바로 안내해야 한다.",
    "상품명만으로는 같은 품목을 출하한 여러 농가를 구분하기 어렵다. 상품코드, 농가, 품목, 규격과 원본 판매 행을 함께 보여 주고 처음 보는 상품코드는 운영자가 직접 연결해야 한다.",
    "수수료율과 할인 수수료, 반품·폐기 부담 규칙은 분쟁 가능성이 높은 정보다. 적용 대상, 적용 시작일, 종료일, 확정된 약정 여부와 변경 이력을 한 화면에서 확인할 수 있어야 한다.",
    "미연결 상품, 규칙 누락, 미확인 할인·반품·폐기, 중복 가능 거래 또는 매출 대조 차이가 남으면 마감을 허용하면 안 된다. 보류 승인으로 우회하지 않고 제품 정본에 따라 오류 0건과 대조 차이 0원을 요구한다.",
    "정산 마감은 일반 저장과 구분되는 확정 행위다. 마감 전 체크리스트, 마감 권한, 한국 시간 기준 목요일 여부와 수정 불가 안내를 확인한 뒤 실행하도록 설계한다.",
    "마감 후 오류는 원 정산서를 수정하지 않고 다음 정산의 정정 항목으로 연결한다. 원 정산서, 원 거래, 정정 전후 금액, 처리 담당자와 다음 반영 주차를 한 이력에서 추적할 수 있어야 한다.",
    "농가 화면의 첫 질문은 ‘언제 얼마를 받는가’다. 지급액과 입금 예정일을 첫 화면 상단에 크게 배치하고 판매금액, 수수료, 할인, 반품·폐기와 정정 항목은 필요할 때 펼쳐 보게 한다.",
    "농가용 화면에서는 가로 스크롤 표와 아이콘만 있는 버튼을 피한다. 본문 18px 이상, 지급액 34px 이상, 주요 버튼 높이 56px을 권장한다.",
    "이의 제기는 빈 글쓰기부터 시작하지 않는다. 정산서의 판매·수수료·할인·반품·폐기 항목에서 시작해 대상 내역이 자동 연결되도록 한다.",
    "계산대 판매 파일의 실제 열 구성, CSV 또는 엑셀 지원 범위, 거래 고유값이 없는 파일의 중복 판별 방식은 확인 필요다. 화면은 지원 형식과 필수 열을 서버 설정에서 받아 표시해야 한다.",
    "농가 계정의 첫 로그인과 비밀번호 복구 방식은 확인 필요다. 확정 전까지 동작하지 않는 복구 기능이나 임시 비밀번호 절차를 화면에 임의로 추가하지 않는다.",
    "첫 버전은 로컬푸드 직매장 한 곳만 처리한다. 전역 메뉴, 필터와 헤더에 매장 선택 기능을 두지 않는다."
  ],
  "layoutMode": "desktop_first",
  "layoutRationale": "정산 담당자가 계산대 판매 파일의 많은 행, 상품 연결, 오류 목록, 매출 대조와 정산서 목록을 상시 비교하므로 운영자 영역은 데스크톱 고밀도 표와 다중 패널이 핵심이다. lg 이상에서는 240px 좌측 메뉴와 최대 1440px 작업 영역을 사용한다. 농가 영역은 별도의 모바일 중심 레이아웃을 적용한다. lg 미만 운영자 화면에서도 핵심 조회와 오류 처리가 가능하도록 표의 핵심 열을 카드 목록으로 바꾸고 상세 정보는 전체 화면 패널로 연다.",
  "typography": {
    "koreanFont": "Pretendard Variable",
    "fallback": [
      "Pretendard",
      "Noto Sans KR",
      "Apple SD Gothic Neo",
      "Malgun Gothic",
      "sans-serif"
    ],
    "bodyLetterSpacing": "-0.01em",
    "headingLetterSpacing": "-0.025em",
    "bodyLineHeight": 1.6
  },
  "colors": [
    {
      "name": "Primary Green",
      "value": "#176B45",
      "usage": "주요 버튼, 현재 단계, 선택 상태와 링크에 사용한다. 흰색 글자와 조합한다."
    },
    {
      "name": "Primary Strong",
      "value": "#0F5132",
      "usage": "주요 버튼의 호버·눌림 상태와 강한 강조에 사용한다."
    },
    {
      "name": "Primary Soft",
      "value": "#E8F3EC",
      "usage": "완료 상태 배경, 선택된 행과 지급액 요약 카드의 보조 배경에 사용한다."
    },
    {
      "name": "Text Primary",
      "value": "#17231B",
      "usage": "제목, 본문, 금액과 핵심 데이터의 기본 글자색이다."
    },
    {
      "name": "Text Secondary",
      "value": "#526158",
      "usage": "날짜, 도움말, 부가 설명과 메타데이터에 사용한다."
    },
    {
      "name": "Page Background",
      "value": "#F5F7F5",
      "usage": "운영자 화면의 전체 배경에 사용한다."
    },
    {
      "name": "Surface",
      "value": "#FFFFFF",
      "usage": "카드, 표, 입력 영역, 모달과 농가 정산서 배경에 사용한다."
    },
    {
      "name": "Border",
      "value": "#CCD6CF",
      "usage": "카드 구분선과 표 행 구분선에 사용한다."
    },
    {
      "name": "Border Strong",
      "value": "#7B8A80",
      "usage": "입력 필드 경계와 비활성 상태를 구분해야 하는 컨트롤에 사용한다."
    },
    {
      "name": "Focus",
      "value": "#1D4ED8",
      "usage": "키보드 초점 외곽선과 접근성용 포커스 표시에만 사용한다."
    },
    {
      "name": "Danger",
      "value": "#B42318",
      "usage": "마감을 막는 오류, 삭제·중지와 실패 상태에 사용하며 오류 아이콘과 문구를 함께 표시한다."
    },
    {
      "name": "Danger Soft",
      "value": "#FDECEC",
      "usage": "오류 알림, 차단 사유와 위험 확인 영역의 배경에 사용한다."
    },
    {
      "name": "Warning",
      "value": "#8A4B08",
      "usage": "확인 필요, 미연결, 마감 임박과 주의 문구에 사용한다."
    },
    {
      "name": "Warning Soft",
      "value": "#FFF4E5",
      "usage": "확인 필요 상태의 배경에 사용한다."
    },
    {
      "name": "Information",
      "value": "#175CD3",
      "usage": "도움말, 자동 연결 상태와 일반 정보 안내에 사용한다."
    }
  ],
  "breakpoints": {
    "sm": 480,
    "md": 768,
    "lg": 1024,
    "xl": 1440
  },
  "grid": {
    "baseUnit": 4,
    "mobileColumns": 4,
    "desktopColumns": 12,
    "maxContentWidth": 1440
  },
  "spacing": [
    4,
    8,
    12,
    16,
    20,
    24,
    32,
    40,
    48,
    64,
    80
  ],
  "radius": {
    "sm": 6,
    "md": 10,
    "lg": 16,
    "full": 9999
  },
  "components": [
    {
      "name": "AppShell",
      "variants": [
        "operator",
        "farmer"
      ],
      "states": [
        "default",
        "navigation-collapsed",
        "narrow"
      ],
      "guidance": "운영자형은 64px 상단 바, 240px 좌측 메뉴와 본문으로 구성한다. 메뉴 순서는 주간 정산 현황, 계산대 판매 파일, 판매 원장, 오류·대조, 정산서·마감, 농가 이의 제기, 농가·품목·정산 규칙, 계정·권한 순으로 둔다. 농가형은 좌측 메뉴 없이 단일 열과 큰 뒤로가기 버튼을 사용한다. 매장 선택기는 제공하지 않는다."
    },
    {
      "name": "Button",
      "variants": [
        "primary",
        "secondary",
        "tertiary",
        "danger",
        "text"
      ],
      "states": [
        "default",
        "hover",
        "focus",
        "pressed",
        "loading",
        "disabled"
      ],
      "guidance": "운영자 버튼은 최소 높이 44px, 농가용 주요 버튼은 56px 이상으로 한다. 비활성 버튼에는 ‘오류 3건을 해결해야 마감할 수 있습니다’처럼 이유를 인접 문구로 제공한다. 아이콘만 있는 핵심 버튼은 사용하지 않는다."
    },
    {
      "name": "FormField",
      "variants": [
        "text",
        "number",
        "date",
        "password",
        "textarea",
        "search"
      ],
      "states": [
        "default",
        "focus",
        "filled",
        "error",
        "disabled",
        "read-only"
      ],
      "guidance": "라벨을 입력칸 위에 계속 표시하고 필수 여부, 입력 예시와 오류 문구를 연결한다. 금액은 원 단위 정수와 천 단위 쉼표로 표시하되 저장값과 표시값을 분리한다. 마감된 데이터는 비활성이 아니라 읽기 전용 잠금 상태와 마감 정보를 보여 준다."
    },
    {
      "name": "SelectCombobox",
      "variants": [
        "single",
        "multi",
        "searchable"
      ],
      "states": [
        "default",
        "open",
        "selected",
        "empty",
        "error",
        "disabled"
      ],
      "guidance": "농가와 품목 선택에는 검색형을 사용하고 농가명, 품목명, 규격과 상품코드를 함께 표시한다. 상품 연결에서는 선택 전에 원본 판매 행을 계속 볼 수 있어야 한다."
    },
    {
      "name": "StatusBadge",
      "variants": [
        "preparing",
        "processing",
        "error",
        "closable",
        "generated",
        "closed",
        "correction-pending",
        "manual-mapping",
        "automatic-mapping"
      ],
      "states": [
        "default"
      ],
      "guidance": "색상 외에 상태 아이콘과 ‘오류 있음’, ‘마감 가능’, ‘마감 완료’ 같은 전체 문구를 표시한다. 자동 연결과 직접 연결도 서로 다른 문구로 기록한다."
    },
    {
      "name": "SettlementWeekBar",
      "variants": [
        "editable",
        "read-only",
        "closed"
      ],
      "states": [
        "default",
        "closing-soon",
        "invalid-period"
      ],
      "guidance": "정산 주차의 시작일·종료일, 목요일 마감일, 입금 예정일과 현재 상태를 한 줄에 표시한다. 날짜는 한국 시간 기준으로 처리하며 좁은 화면에서는 두 줄 카드로 바꾼다."
    },
    {
      "name": "WorkflowStepper",
      "variants": [
        "horizontal",
        "vertical",
        "compact"
      ],
      "states": [
        "not-started",
        "current",
        "complete",
        "blocked"
      ],
      "guidance": "파일 업로드, 상품 연결, 거래 확인, 오류·대조, 정산서 생성, 정산 마감 순서를 표시한다. 차단된 단계에는 원인 건수와 해당 화면으로 이동하는 버튼을 제공한다."
    },
    {
      "name": "MetricCard",
      "variants": [
        "status",
        "amount",
        "count",
        "blocking"
      ],
      "states": [
        "normal",
        "warning",
        "error",
        "complete"
      ],
      "guidance": "제목, 값, 단위, 기준 시점과 다음 행동으로 구성한다. 오류 수와 대조 차이를 같은 숫자 스타일로 표시하되 상태 문구를 함께 사용한다."
    },
    {
      "name": "DataTable",
      "variants": [
        "transactions",
        "mapping",
        "rules",
        "settlements",
        "history",
        "accounts"
      ],
      "states": [
        "loading",
        "empty",
        "filtered",
        "row-selected",
        "row-error",
        "read-only"
      ],
      "guidance": "표 머리글을 고정하고 금액은 오른쪽 정렬과 tabular numbers를 사용한다. 첫 열에는 체크박스보다 행의 주 식별 정보를 우선한다. md 이하에서는 핵심 열을 세로 카드로 바꾸고 나머지는 상세 패널에서 제공한다. 상태와 오류를 색상만으로 구분하지 않는다."
    },
    {
      "name": "FilterBar",
      "variants": [
        "inline",
        "drawer-mobile"
      ],
      "states": [
        "default",
        "applied",
        "no-result"
      ],
      "guidance": "정산 주차, 농가, 품목, 거래 유형, 오류 상태와 날짜 필터를 제공한다. 적용된 필터는 삭제 가능한 칩과 결과 건수로 표시하며 전체 초기화 버튼을 둔다."
    },
    {
      "name": "FileUploader",
      "variants": [
        "dropzone",
        "button",
        "upload-history"
      ],
      "states": [
        "idle",
        "drag-over",
        "validating",
        "uploaded",
        "partial-error",
        "failed",
        "duplicate"
      ],
      "guidance": "지원 파일 형식과 최대 용량은 서버 설정값을 표시한다. 파일명, 대상 기간, 업로드 담당자와 시점을 보여 주고 형식 오류, 필수 열 누락, 기간 밖 거래, 중복 파일을 행 수와 금액으로 구분한다. 실제 지원 형식 확정 전 CSV와 엑셀을 모두 지원한다고 표시하지 않는다."
    },
    {
      "name": "MappingWorkspace",
      "variants": [
        "automatic",
        "manual",
        "unmapped",
        "conflict"
      ],
      "states": [
        "unresolved",
        "selected",
        "saved",
        "history-open"
      ],
      "guidance": "데스크톱에서는 왼쪽에 원본 판매 항목, 오른쪽에 농가·품목 검색과 연결 결과를 둔다. 이번 항목만 연결과 이후 같은 상품코드에 재사용하는 연결을 명확히 구분한다. 직접 연결 변경 시 사유와 담당자 이력을 표시한다."
    },
    {
      "name": "RuleEditor",
      "variants": [
        "commission",
        "discount-commission",
        "return-burden",
        "disposal-burden"
      ],
      "states": [
        "draft",
        "confirmed",
        "scheduled",
        "active",
        "expired",
        "locked",
        "conflict"
      ],
      "guidance": "적용 대상, 규칙 이름, 수수료율, 할인 전·후 기준, 부담 주체, 적용 시작일·종료일과 확정된 약정 확인을 한 양식에서 편집한다. 저장 전에 실제 적용 우선순위와 기간 충돌을 보여 준다. 마감 정산에 사용된 규칙은 편집 대신 새 규칙 생성으로 연결한다."
    },
    {
      "name": "InlineAlert",
      "variants": [
        "information",
        "success",
        "warning",
        "error",
        "locked"
      ],
      "states": [
        "default",
        "dismissible",
        "persistent"
      ],
      "guidance": "마감을 막는 오류와 잠금 안내는 닫을 수 없는 형태로 사용한다. 제목, 원인, 영향 건수 또는 금액, 해결 행동을 포함한다."
    },
    {
      "name": "ReconciliationPanel",
      "variants": [
        "summary",
        "equation",
        "difference-detail"
      ],
      "states": [
        "matched",
        "mismatched",
        "calculating"
      ],
      "guidance": "조정된 순 판매액, 농가 지급액 합계, 수수료 합계, 농가 부담 차감, 매장 부담 보전과 대조 차이를 식의 순서대로 표시한다. 정정 항목은 현재 주차 계산대 판매 파일 매출과 분리한다. 차이가 0원이 아니면 금액과 원인 거래 보기 버튼을 함께 노출한다."
    },
    {
      "name": "BlockingIssueList",
      "variants": [
        "grouped",
        "flat",
        "compact"
      ],
      "states": [
        "unresolved",
        "in-progress",
        "resolved"
      ],
      "guidance": "미연결 상품, 규칙 누락, 미확인 할인·반품·폐기, 중복 가능 거래와 대조 차이를 유형별로 묶는다. 각 항목에는 영향 거래, 농가, 품목, 금액, 담당자와 해결 화면 링크를 제공한다."
    },
    {
      "name": "SettlementSummary",
      "variants": [
        "operator",
        "farmer-large",
        "download"
      ],
      "states": [
        "draft",
        "generated",
        "closed",
        "no-sales"
      ],
      "guidance": "운영자형은 판매금액, 순 판매액, 수수료, 반품·폐기, 정정 항목과 지급액을 비교한다. 농가형은 지급액을 34px 이상으로 먼저 표시하고 입금 예정일, 판매금액과 빠진 금액 순으로 보여 준다. 내려받기 형식은 구현 확정값을 사용한다."
    },
    {
      "name": "CloseChecklist",
      "variants": [
        "review",
        "blocked",
        "ready",
        "closed"
      ],
      "states": [
        "unchecked",
        "passed",
        "failed"
      ],
      "guidance": "판매 파일, 중복, 상품 연결, 정산 규칙, 할인·반품·폐기 확인, 오류 0건, 대조 차이 0원, 정산서 생성과 마감 권한을 검사한다. 사용자가 체크박스를 임의로 통과시키는 방식이 아니라 서버 검사 결과를 표시한다."
    },
    {
      "name": "AccordionDetail",
      "variants": [
        "sales",
        "commission",
        "discount",
        "return-disposal",
        "correction"
      ],
      "states": [
        "collapsed",
        "expanded",
        "empty"
      ],
      "guidance": "농가 화면의 상세 내역에 사용한다. 접힌 상태에서도 항목명, 건수와 합계가 보이게 한다. 반품·폐기 상세에는 품목, 수량, 사유, 부담 주체, 처리일과 증빙 유무를 표시한다."
    },
    {
      "name": "HistoryTimeline",
      "variants": [
        "correction",
        "rule",
        "mapping",
        "dispute"
      ],
      "states": [
        "default",
        "linked",
        "missing-link"
      ],
      "guidance": "원 기록, 변경 또는 정정, 승인·처리 시점, 다음 반영 주차를 시간순으로 표시한다. 각 단계에서 담당자와 관련 정산서·원 거래 링크를 제공한다."
    },
    {
      "name": "DisputeForm",
      "variants": [
        "farmer",
        "operator-response"
      ],
      "states": [
        "draft",
        "uploading",
        "submitted",
        "reviewing",
        "more-info-needed",
        "resolved",
        "correction-scheduled"
      ],
      "guidance": "농가형은 선택된 정산 항목 확인, 이유 선택, 추가 설명과 증빙 사진, 제출 전 확인 순서로 구성한다. 운영자형은 관련 정산서·세부 내역, 처리 결과, 담당자, 처리일, 농가에 알린 날짜와 방법을 필수 항목으로 제공한다."
    },
    {
      "name": "PhotoUploaderViewer",
      "variants": [
        "camera-or-library",
        "thumbnail-list",
        "full-screen-viewer"
      ],
      "states": [
        "empty",
        "selected",
        "uploading",
        "uploaded",
        "failed",
        "restricted"
      ],
      "guidance": "농가 화면에는 카메라 촬영과 앨범 선택을 글자 버튼으로 제공한다. 업로드 제한은 서버 설정값을 표시하고 실패 시 원인과 다시 보내기 버튼을 제공한다. 사진은 권한 확인 후 열며 공개 파일 주소를 화면에 노출하지 않는다."
    },
    {
      "name": "ModalDrawer",
      "variants": [
        "confirmation-modal",
        "desktop-drawer",
        "mobile-full-screen"
      ],
      "states": [
        "open",
        "closing",
        "blocked",
        "submitting"
      ],
      "guidance": "삭제, 계정 중지와 정산 마감처럼 되돌리기 어려운 작업에만 확인 모달을 사용한다. 복잡한 상품 연결과 오류 상세는 데스크톱 우측 패널, 모바일 전체 화면으로 제공한다. 초점은 열린 패널 안에 유지하고 닫은 뒤 원래 버튼으로 복귀시킨다."
    },
    {
      "name": "Toast",
      "variants": [
        "success",
        "error",
        "information"
      ],
      "states": [
        "visible",
        "dismissed"
      ],
      "guidance": "저장 완료처럼 보조적인 결과에만 사용한다. 마감 차단, 파일 전체 실패와 권한 오류는 사라지는 토스트에만 의존하지 않고 화면 안의 지속 알림으로도 표시한다."
    }
  ],
  "accessibility": [
    "KWCAG 2.2와 WCAG 2.1 AA를 기준으로 텍스트 명도 대비 4.5:1 이상, 큰 글자 3:1 이상, 입력 경계·초점 등 비텍스트 요소 3:1 이상을 확보한다.",
    "모든 기능을 키보드만으로 사용할 수 있게 하고 논리적인 초점 순서, 건너뛰기 링크와 항상 보이는 포커스 링을 제공한다.",
    "운영자 터치·클릭 대상은 최소 44×44px, 농가용 주요 대상은 56×56px을 권장한다.",
    "농가 화면은 본문 18px 이상, 항목명 20px 이상, 지급액 34px 이상을 기본으로 하고 브라우저 글자 확대와 200% 확대에서 내용이 겹치지 않게 한다.",
    "오류, 완료, 자동 연결과 직접 연결 상태를 색상만으로 표현하지 않고 아이콘, 문구와 필요 시 패턴을 함께 사용한다.",
    "입력 오류 발생 시 화면 상단 오류 요약과 각 입력칸 오류 문구를 제공하고 오류 입력으로 초점을 이동할 수 있게 한다.",
    "표에는 caption, 열 머리글과 행 머리글 관계를 지정하고 정렬 상태를 보조 기술에 전달한다. 모바일 카드 전환 후에도 같은 정보 관계를 제목과 설명 목록으로 유지한다.",
    "금액은 천 단위 쉼표와 원 단위를 함께 표시하고 가산·차감은 부호와 ‘더해진 금액’, ‘빠진 금액’ 문구를 함께 사용한다.",
    "사진에는 품목, 처리 유형과 촬영 또는 등록 맥락을 설명하는 대체 텍스트를 제공한다. 장식 이미지는 대체 텍스트에서 제외한다.",
    "마감 확인, 이의 제기 제출과 계정 중지는 실행 전 대상과 결과를 읽을 수 있게 하고 실행 후 성공 또는 실패 상태를 보조 기술에 알린다.",
    "자동으로 사라지는 안내는 핵심 오류에 사용하지 않는다. 시간 제한이 필요한 로그인 세션은 종료 전에 연장 방법을 안내한다.",
    "농가용 핵심 기능에는 좌우 스와이프, 길게 누르기, 드래그만으로 가능한 동작을 사용하지 않는다.",
    "화면 너비가 좁아져도 지급액 확인, 이의 제기, 오류 확인과 처리, 매출 대조 및 마감 상태 조회가 가능해야 한다."
  ],
  "motion": {
    "durationMs": 180,
    "easing": "cubic-bezier(0.2, 0, 0, 1)",
    "reducedMotion": true
  },
  "darkMode": "not_planned",
  "screenGuidance": [
    {
      "screenId": "farmer-settlement",
      "guidance": "모바일 단일 열로 구성한다. 상단에 정산 상태와 기간, 34~36px 지급액, 20~22px 입금 예정일을 배치한다. 다음 카드에서 판매금액, 수수료, 할인, 반품·폐기, 정정 항목과 지급액의 계산 흐름을 보여 준다. 지난 정산서, 정산서 저장하기, 이의 제기 진행 상황을 큰 글자 버튼으로 제공한다. 마감된 정산서에서만 확정 금액을 보여 주며 다른 농가 정보나 매장 선택은 노출하지 않는다."
    },
    {
      "screenId": "correction-history",
      "guidance": "데스크톱에서는 정정 항목 목록과 상세 패널을 나눈다. 목록 열은 원 정산 주차, 농가, 원 거래, 정정 사유, 정정 전후 금액, 가산·차감액, 다음 반영 주차와 상태로 구성한다. 상세에는 원 정산서부터 다음 정산 반영까지의 타임라인, 담당자와 처리 시점을 표시한다. 원 기록 수정 버튼은 제공하지 않는다."
    },
    {
      "screenId": "farmer-settlement-view",
      "guidance": "큰 글씨 상세 화면으로 지급액과 입금 예정일을 상단에 유지한다. 판매, 수수료, 할인 판매, 반품·폐기, 정정 내역을 세로 아코디언으로 제공하고 가로 표는 사용하지 않는다. 할인 상세에는 할인 전·후 금액과 수수료 계산 기준을 문장으로 표시한다. 반품·폐기에는 수량, 사유, 부담 주체, 처리일과 증빙 사진 유무를 표시하고 각 내역에서 바로 이의를 제기할 수 있게 한다."
    },
    {
      "screenId": "operator-login",
      "guidance": "로그아웃 상태에서는 최대 440px 로그인 카드에 아이디, 비밀번호, 비밀번호 보기와 로그인 버튼만 제공한다. 실패 문구는 계정 존재 여부를 구분하지 않는다. 비밀번호 복구 방식은 확인 필요이므로 확정 전에는 동작하지 않는 링크를 추가하지 않는다. 로그인 후 계정·권한 관리 상태에서는 담당자 이름, 역할, 마감 권한, 사용 상태와 최근 로그인을 표로 제공하며 삭제 대신 사용 중지를 사용한다."
    },
    {
      "screenId": "farm-product-rules",
      "guidance": "농가, 품목군, 품목·상품코드, 정산 규칙을 상위 탭으로 분리한다. 목록은 왼쪽 또는 본문 표에 표시하고 등록·변경은 우측 패널에서 처리한다. 규칙 편집에는 적용 대상, 수수료율, 할인 수수료 기준, 반품·폐기 부담, 적용 시작일·종료일과 확정된 약정 확인이 필수다. 적용 우선순위를 미리 보여 주고 기간 충돌, 마감 정산에 사용된 규칙과 소급 변경을 차단한다."
    },
    {
      "screenId": "sales-upload-mapping",
      "guidance": "정산 주차 확인, 파일 업로드·검사, 상품 연결의 세 단계로 구성한다. 업로드 후 정상 행, 오류 행, 기간 밖 행, 중복 가능 행의 건수와 금액을 요약한다. 상품 연결 표에는 원본 상품코드, 상품명, 수량, 금액, 연결 농가·품목과 자동·직접 연결 상태를 표시한다. 미연결 행을 선택하면 농가와 품목을 검색해 직접 연결하고 이후 같은 상품코드에 재사용할지 선택한다."
    },
    {
      "screenId": "transaction-history",
      "guidance": "기본 정산 주차를 현재 처리 중 주차로 설정하고 농가, 품목, 판매·할인·반품·폐기 유형과 오류 상태 필터를 제공한다. 표에는 거래일시, 원본 거래번호, 농가, 품목, 수량, 할인 전·후 금액, 반품 금액, 적용 규칙과 상태를 표시한다. 반품·폐기 등록 버튼을 상단에 두고 농가, 품목, 수량, 사유와 부담 주체가 없으면 확정하지 못하게 한다. 마감된 주차는 전체 읽기 전용으로 전환한다."
    },
    {
      "screenId": "reconciliation-errors",
      "guidance": "lg 이상에서는 오류 목록 7열, 매출 대조 요약 5열로 나눈다. 오류를 미연결, 규칙 없음, 미확인 거래, 중복 가능 거래와 합계 불일치로 묶고 영향 건수와 금액을 표시한다. 매출 대조는 계산식을 세로로 보여 주며 대조 차이 0원을 명확한 완료 조건으로 사용한다. 해결되지 않은 오류가 있으면 정산서 생성과 마감 이동 버튼을 비활성화하고 각 해결 화면 링크를 제공한다."
    },
    {
      "screenId": "settlement-close",
      "guidance": "상단에 정산 주차와 상태, 다음에 서버 검사 기반 마감 체크리스트, 매출 대조 합계, 농가별 지급액 목록을 배치한다. 정산 담당자는 정산서 생성까지만 할 수 있고 마감 권한이 있는 사용자에게만 목요일 마감 버튼을 제공한다. 오류 0건, 대조 차이 0원과 정산서 생성이 모두 충족되어야 활성화한다. 확인 모달에는 마감 후 수정 불가, 마감 대상 기간, 정산서 수와 총 지급액을 표시하며 서버 결과가 성공한 뒤에만 마감 완료 화면으로 바꾼다."
    },
    {
      "screenId": "screen1",
      "guidance": "farmer-settlement의 큰 글씨 원칙을 유지하면서 이의 제기 진입을 더 강조한다. 지급액과 입금 예정일 다음에 판매, 수수료, 할인, 반품·폐기 요약을 제공하고 ‘문제 있는 내역이 있나요?’ 버튼을 56px 이상으로 배치한다. 이의 제기는 대상 내역 확인, 이유 선택, 설명·증빙 사진, 제출 전 확인의 단계로 진행한다."
    },
    {
      "screenId": "farmer-login",
      "guidance": "360~480px 폭을 기준으로 한 단일 카드 화면이다. 입력 라벨은 18px 이상, 입력칸과 로그인 버튼은 높이 56px 이상으로 한다. 로그인 오류는 ‘아이디 또는 비밀번호를 확인해 주세요’처럼 통합해 표시한다. 로그인 후 요청마다 연결 농가 권한을 확인하며 첫 로그인과 비밀번호 복구 UI는 방식 확정 후 추가한다."
    },
    {
      "screenId": "settlement-dashboard",
      "guidance": "상단에 정산 주차, 마감일, 입금 예정일과 상태를 표시하고 그 아래에 업무 단계 표시기를 둔다. 판매 파일 상태, 미연결 상품 수, 오류 수, 매출 대조 차이, 정산서 생성 상태와 마감 가능 여부를 카드로 배치한다. 가장 먼저 처리해야 할 차단 항목을 상단 지속 알림으로 보여 주고 각 카드에서 해당 화면으로 이동한다. 단일 매장이므로 매장 선택기는 두지 않는다."
    },
    {
      "screenId": "dispute-management",
      "guidance": "데스크톱에서는 이의 제기 목록, 관련 정산 내역과 증빙, 처리 양식의 세 영역으로 구성한다. 목록에는 농가, 접수일, 문제 항목, 금액, 상태와 담당자를 표시한다. 상세에서 원 정산서와 판매·수수료·할인·반품·폐기 항목을 연결하고 사진을 크게 열어 본다. 처리 결과, 담당자, 처리일, 농가에 알린 날짜·방법을 기록하며 금액 변경이 필요하면 원본 수정 대신 정정 항목 생성으로 연결한다."
    },
    {
      "screenId": "screen2",
      "guidance": "farmer-settlement와 같은 농가용 모바일 패턴을 사용하되 이 화면 ID의 경로와 접근 권한을 유지한다. 이번 주 판매금액, 수수료, 지급액과 입금 예정일을 우선 표시하고 판매·할인·반품·폐기 상세와 이의 제기 버튼을 제공한다."
    },
    {
      "screenId": "screen3",
      "guidance": "correction-history와 같은 이력 구조를 사용한다. 원 정산서, 원 거래, 정정 전후 금액, 담당자, 처리 시점과 다음 반영 주차를 검색 가능한 목록과 타임라인으로 표시하며 마감된 원 기록은 읽기 전용이다."
    },
    {
      "screenId": "screen4",
      "guidance": "farmer-settlement-view와 같은 큰 글씨 상세 패턴을 사용한다. 지급액을 먼저 보여 주고 판매·수수료·할인·반품·폐기와 정정 항목을 세로 카드로 제공하며 각 항목의 계산 근거와 이의 제기 진입점을 유지한다."
    },
    {
      "screenId": "screen5",
      "guidance": "farmer-login과 같은 모바일 로그인 패턴을 사용한다. 본인 계정 로그인 후 연결된 농가의 정산서만 조회할 수 있어야 하며 계정 상태와 권한 오류를 구분해 안전한 문구로 안내한다."
    },
    {
      "screenId": "screen6",
      "guidance": "settlement-dashboard와 같은 주간 현황 패턴을 사용한다. 정산 주차, 입금 예정일, 판매 파일 상태, 미연결 상품, 오류, 대조 차이와 마감 가능 여부를 표시하고 다음 필수 작업으로 바로 이동시킨다."
    },
    {
      "screenId": "screen7",
      "guidance": "dispute-management와 같은 운영자 처리 패턴을 사용한다. 이의 제기와 증빙, 관련 정산서·세부 내역, 처리 결과, 담당자, 처리일과 농가 안내 기록을 한 작업 흐름으로 제공한다."
    }
  ],
  "assets": [
    "Pretendard Variable 웹폰트 파일과 preload 설정",
    "24px 선형 SVG 아이콘 세트: 업로드, 연결, 오류, 대조, 잠금, 이력, 사진, 내려받기, 펼치기",
    "상태 아이콘은 체크, 경고 삼각형, 오류 원형, 잠금 모양을 사용하고 색상만으로 구분하지 않음",
    "증빙 사진용 접근 제한 썸네일과 전체 화면 뷰어",
    "계산대 판매 파일 업로드용 파일 형식 아이콘",
    "정식 브랜드명이 없으므로 첫 버전은 ‘로컬푸드 직매장 정산’ 텍스트 워드마크를 가정하며 정식 로고는 확인 필요",
    "업무 화면의 집중을 방해하는 농산물 사진과 장식 일러스트는 사용하지 않음"
  ],
  "sources": [
    {
      "title": "충남 로컬푸드 직매장의 실태 및 성공전략",
      "url": "https://www.cni.re.kr/main/contents/report/down?addType=&docId=1514JU012&gcd=AC0000026664&projectName=%EC%B6%A9%EB%82%A8+%EB%A1%9C%EC%BB%AC%ED%91%B8%EB%93%9C+%EC%A7%81%EB%A7%A4%EC%9E%A5%EC%9D%98+%EC%8B%A4%ED%83%9C+%EB%B0%8F+%EC%84%B1%EA%B3%B5%EC%A0%84%EB%9E%B5&projectType=1&seq=1&utm_source=openai",
      "note": "로컬푸드 직매장 운영 환경과 지역 직매장 맥락을 이해하는 참고 자료다. 화면의 구체 기능은 사용자 제품 정본을 우선했다."
    },
    {
      "title": "스마트 로컬푸드",
      "url": "https://slf.happyict.co.kr/",
      "note": "로컬푸드 디지털 운영 서비스의 인접 사례 확인에 사용했다. 확인되지 않은 경쟁 기능은 디자인 계약에 사실로 반영하지 않았다."
    },
    {
      "title": "Web Content Accessibility Guidelines 2.2",
      "url": "https://www.w3.org/TR/WCAG22/",
      "note": "명도 대비, 키보드 접근, 초점 표시, 오류 안내와 화면 확대 기준의 근거로 사용했다."
    },
    {
      "title": "디지털기기·디지털채널 이용 어려움 관련 조사 참고 자료",
      "url": "https://www.kiri.or.kr/report/downloadFile.do?docId=6267&utm_source=openai",
      "note": "고령 사용자의 디지털 채널 이용 어려움을 고려하는 참고 자료로 사용했으며 확인되지 않은 수치는 인용하지 않았다."
    }
  ]
}
디자인 가이드 원문 전체 보기

UI/UX 디자인 가이드

1. 디자인 방향

운영자 화면은 ‘오류 없이 목요일 정산 마감을 완료하는 업무 도구’, 농가 화면은 ‘이번에 받을 지급액을 가장 먼저 확인하는 큰 글씨 정산서’로 설계한다. 운영자 화면은 중립적인 장부형 화면에 단계, 오류, 매출 대조 차이와 마감 가능 여부를 명확히 표시한다. 농가 화면은 가로 표를 사용하지 않고 지급액, 입금 예정일, 판매금액과 차감 내역을 세로 카드로 제공한다. 로컬푸드의 인상은 짙은 녹색으로 제한적으로 표현하고, 금액과 오류 상태는 색상뿐 아니라 아이콘과 문구를 함께 사용한다. 첫 버전에는 매장 선택, 실제 은행 이체, 지급 파일, 문자·카카오톡 발송 기능을 노출하지 않는다.

무드 키워드: 신뢰 가능한 정산 · 단계형 마감 업무 · 매출 대조 · 오류 우선 처리 · 변경 이력 · 큰 글씨 · 지급액 우선 · 고령 농가 친화 · 단일 로컬푸드 직매장 · 데이터 중심

업계 조사에서 반영한 점

  • 정산 담당자의 핵심 흐름은 계산대 판매 파일 업로드, 상품 연결, 판매·할인·반품·폐기 확인, 오류 처리, 매장 매출 대조, 정산서 생성, 권한자 마감 순서다. 주간 정산 현황에서 현재 단계와 다음 작업을 바로 안내해야 한다.
  • 상품명만으로는 같은 품목을 출하한 여러 농가를 구분하기 어렵다. 상품코드, 농가, 품목, 규격과 원본 판매 행을 함께 보여 주고 처음 보는 상품코드는 운영자가 직접 연결해야 한다.
  • 수수료율과 할인 수수료, 반품·폐기 부담 규칙은 분쟁 가능성이 높은 정보다. 적용 대상, 적용 시작일, 종료일, 확정된 약정 여부와 변경 이력을 한 화면에서 확인할 수 있어야 한다.
  • 미연결 상품, 규칙 누락, 미확인 할인·반품·폐기, 중복 가능 거래 또는 매출 대조 차이가 남으면 마감을 허용하면 안 된다. 보류 승인으로 우회하지 않고 제품 정본에 따라 오류 0건과 대조 차이 0원을 요구한다.
  • 정산 마감은 일반 저장과 구분되는 확정 행위다. 마감 전 체크리스트, 마감 권한, 한국 시간 기준 목요일 여부와 수정 불가 안내를 확인한 뒤 실행하도록 설계한다.
  • 마감 후 오류는 원 정산서를 수정하지 않고 다음 정산의 정정 항목으로 연결한다. 원 정산서, 원 거래, 정정 전후 금액, 처리 담당자와 다음 반영 주차를 한 이력에서 추적할 수 있어야 한다.
  • 농가 화면의 첫 질문은 ‘언제 얼마를 받는가’다. 지급액과 입금 예정일을 첫 화면 상단에 크게 배치하고 판매금액, 수수료, 할인, 반품·폐기와 정정 항목은 필요할 때 펼쳐 보게 한다.
  • 농가용 화면에서는 가로 스크롤 표와 아이콘만 있는 버튼을 피한다. 본문 18px 이상, 지급액 34px 이상, 주요 버튼 높이 56px을 권장한다.
  • 이의 제기는 빈 글쓰기부터 시작하지 않는다. 정산서의 판매·수수료·할인·반품·폐기 항목에서 시작해 대상 내역이 자동 연결되도록 한다.
  • 계산대 판매 파일의 실제 열 구성, CSV 또는 엑셀 지원 범위, 거래 고유값이 없는 파일의 중복 판별 방식은 확인 필요다. 화면은 지원 형식과 필수 열을 서버 설정에서 받아 표시해야 한다.
  • 농가 계정의 첫 로그인과 비밀번호 복구 방식은 확인 필요다. 확정 전까지 동작하지 않는 복구 기능이나 임시 비밀번호 절차를 화면에 임의로 추가하지 않는다.
  • 첫 버전은 로컬푸드 직매장 한 곳만 처리한다. 전역 메뉴, 필터와 헤더에 매장 선택 기능을 두지 않는다.

2. 레이아웃 전략

  • 방식: Desktop first
  • 근거: 정산 담당자가 계산대 판매 파일의 많은 행, 상품 연결, 오류 목록, 매출 대조와 정산서 목록을 상시 비교하므로 운영자 영역은 데스크톱 고밀도 표와 다중 패널이 핵심이다. lg 이상에서는 240px 좌측 메뉴와 최대 1440px 작업 영역을 사용한다. 농가 영역은 별도의 모바일 중심 레이아웃을 적용한다. lg 미만 운영자 화면에서도 핵심 조회와 오류 처리가 가능하도록 표의 핵심 열을 카드 목록으로 바꾸고 상세 정보는 전체 화면 패널로 연다.
  • 좁은 화면에서도 핵심 조회·입력·처리를 제거하지 않습니다.
  • 최대 콘텐츠 폭: 1440px
  • 그리드: 모바일 4열 / 데스크톱 12열 / 기본 단위 4px
  • Breakpoint: sm 480px, md 768px, lg 1024px, xl 1440px

3. 컬러 시스템

토큰용도
Primary Green#176B45주요 버튼, 현재 단계, 선택 상태와 링크에 사용한다. 흰색 글자와 조합한다.
Primary Strong#0F5132주요 버튼의 호버·눌림 상태와 강한 강조에 사용한다.
Primary Soft#E8F3EC완료 상태 배경, 선택된 행과 지급액 요약 카드의 보조 배경에 사용한다.
Text Primary#17231B제목, 본문, 금액과 핵심 데이터의 기본 글자색이다.
Text Secondary#526158날짜, 도움말, 부가 설명과 메타데이터에 사용한다.
Page Background#F5F7F5운영자 화면의 전체 배경에 사용한다.
Surface#FFFFFF카드, 표, 입력 영역, 모달과 농가 정산서 배경에 사용한다.
Border#CCD6CF카드 구분선과 표 행 구분선에 사용한다.
Border Strong#7B8A80입력 필드 경계와 비활성 상태를 구분해야 하는 컨트롤에 사용한다.
Focus#1D4ED8키보드 초점 외곽선과 접근성용 포커스 표시에만 사용한다.
Danger#B42318마감을 막는 오류, 삭제·중지와 실패 상태에 사용하며 오류 아이콘과 문구를 함께 표시한다.
Danger Soft#FDECEC오류 알림, 차단 사유와 위험 확인 영역의 배경에 사용한다.
Warning#8A4B08확인 필요, 미연결, 마감 임박과 주의 문구에 사용한다.
Warning Soft#FFF4E5확인 필요 상태의 배경에 사용한다.
Information#175CD3도움말, 자동 연결 상태와 일반 정보 안내에 사용한다.

상태는 색상만으로 구분하지 않고 아이콘·문구·테두리를 함께 사용합니다.

4. 타이포그래피

  • 한글 기본: Pretendard Variable
  • 대체 글꼴: Pretendard, Noto Sans KR, Apple SD Gothic Neo, Malgun Gothic, sans-serif
  • 본문 자간: -0.01em
  • 제목 자간: -0.025em
  • 본문 행간: 1.6

5. 간격·형태

  • 간격: 4px, 8px, 12px, 16px, 20px, 24px, 32px, 40px, 48px, 64px, 80px
  • 모서리: sm 6px, md 10px, lg 16px, full 9999px

6. 컴포넌트와 상태

AppShell

  • 변형: operator, farmer
  • 상태: default, navigation-collapsed, narrow
  • 적용: 운영자형은 64px 상단 바, 240px 좌측 메뉴와 본문으로 구성한다. 메뉴 순서는 주간 정산 현황, 계산대 판매 파일, 판매 원장, 오류·대조, 정산서·마감, 농가 이의 제기, 농가·품목·정산 규칙, 계정·권한 순으로 둔다. 농가형은 좌측 메뉴 없이 단일 열과 큰 뒤로가기 버튼을 사용한다. 매장 선택기는 제공하지 않는다.

Button

  • 변형: primary, secondary, tertiary, danger, text
  • 상태: default, hover, focus, pressed, loading, disabled
  • 적용: 운영자 버튼은 최소 높이 44px, 농가용 주요 버튼은 56px 이상으로 한다. 비활성 버튼에는 ‘오류 3건을 해결해야 마감할 수 있습니다’처럼 이유를 인접 문구로 제공한다. 아이콘만 있는 핵심 버튼은 사용하지 않는다.

FormField

  • 변형: text, number, date, password, textarea, search
  • 상태: default, focus, filled, error, disabled, read-only
  • 적용: 라벨을 입력칸 위에 계속 표시하고 필수 여부, 입력 예시와 오류 문구를 연결한다. 금액은 원 단위 정수와 천 단위 쉼표로 표시하되 저장값과 표시값을 분리한다. 마감된 데이터는 비활성이 아니라 읽기 전용 잠금 상태와 마감 정보를 보여 준다.

SelectCombobox

  • 변형: single, multi, searchable
  • 상태: default, open, selected, empty, error, disabled
  • 적용: 농가와 품목 선택에는 검색형을 사용하고 농가명, 품목명, 규격과 상품코드를 함께 표시한다. 상품 연결에서는 선택 전에 원본 판매 행을 계속 볼 수 있어야 한다.

StatusBadge

  • 변형: preparing, processing, error, closable, generated, closed, correction-pending, manual-mapping, automatic-mapping
  • 상태: default
  • 적용: 색상 외에 상태 아이콘과 ‘오류 있음’, ‘마감 가능’, ‘마감 완료’ 같은 전체 문구를 표시한다. 자동 연결과 직접 연결도 서로 다른 문구로 기록한다.

SettlementWeekBar

  • 변형: editable, read-only, closed
  • 상태: default, closing-soon, invalid-period
  • 적용: 정산 주차의 시작일·종료일, 목요일 마감일, 입금 예정일과 현재 상태를 한 줄에 표시한다. 날짜는 한국 시간 기준으로 처리하며 좁은 화면에서는 두 줄 카드로 바꾼다.

WorkflowStepper

  • 변형: horizontal, vertical, compact
  • 상태: not-started, current, complete, blocked
  • 적용: 파일 업로드, 상품 연결, 거래 확인, 오류·대조, 정산서 생성, 정산 마감 순서를 표시한다. 차단된 단계에는 원인 건수와 해당 화면으로 이동하는 버튼을 제공한다.

MetricCard

  • 변형: status, amount, count, blocking
  • 상태: normal, warning, error, complete
  • 적용: 제목, 값, 단위, 기준 시점과 다음 행동으로 구성한다. 오류 수와 대조 차이를 같은 숫자 스타일로 표시하되 상태 문구를 함께 사용한다.

DataTable

  • 변형: transactions, mapping, rules, settlements, history, accounts
  • 상태: loading, empty, filtered, row-selected, row-error, read-only
  • 적용: 표 머리글을 고정하고 금액은 오른쪽 정렬과 tabular numbers를 사용한다. 첫 열에는 체크박스보다 행의 주 식별 정보를 우선한다. md 이하에서는 핵심 열을 세로 카드로 바꾸고 나머지는 상세 패널에서 제공한다. 상태와 오류를 색상만으로 구분하지 않는다.

FilterBar

  • 변형: inline, drawer-mobile
  • 상태: default, applied, no-result
  • 적용: 정산 주차, 농가, 품목, 거래 유형, 오류 상태와 날짜 필터를 제공한다. 적용된 필터는 삭제 가능한 칩과 결과 건수로 표시하며 전체 초기화 버튼을 둔다.

FileUploader

  • 변형: dropzone, button, upload-history
  • 상태: idle, drag-over, validating, uploaded, partial-error, failed, duplicate
  • 적용: 지원 파일 형식과 최대 용량은 서버 설정값을 표시한다. 파일명, 대상 기간, 업로드 담당자와 시점을 보여 주고 형식 오류, 필수 열 누락, 기간 밖 거래, 중복 파일을 행 수와 금액으로 구분한다. 실제 지원 형식 확정 전 CSV와 엑셀을 모두 지원한다고 표시하지 않는다.

MappingWorkspace

  • 변형: automatic, manual, unmapped, conflict
  • 상태: unresolved, selected, saved, history-open
  • 적용: 데스크톱에서는 왼쪽에 원본 판매 항목, 오른쪽에 농가·품목 검색과 연결 결과를 둔다. 이번 항목만 연결과 이후 같은 상품코드에 재사용하는 연결을 명확히 구분한다. 직접 연결 변경 시 사유와 담당자 이력을 표시한다.

RuleEditor

  • 변형: commission, discount-commission, return-burden, disposal-burden
  • 상태: draft, confirmed, scheduled, active, expired, locked, conflict
  • 적용: 적용 대상, 규칙 이름, 수수료율, 할인 전·후 기준, 부담 주체, 적용 시작일·종료일과 확정된 약정 확인을 한 양식에서 편집한다. 저장 전에 실제 적용 우선순위와 기간 충돌을 보여 준다. 마감 정산에 사용된 규칙은 편집 대신 새 규칙 생성으로 연결한다.

InlineAlert

  • 변형: information, success, warning, error, locked
  • 상태: default, dismissible, persistent
  • 적용: 마감을 막는 오류와 잠금 안내는 닫을 수 없는 형태로 사용한다. 제목, 원인, 영향 건수 또는 금액, 해결 행동을 포함한다.

ReconciliationPanel

  • 변형: summary, equation, difference-detail
  • 상태: matched, mismatched, calculating
  • 적용: 조정된 순 판매액, 농가 지급액 합계, 수수료 합계, 농가 부담 차감, 매장 부담 보전과 대조 차이를 식의 순서대로 표시한다. 정정 항목은 현재 주차 계산대 판매 파일 매출과 분리한다. 차이가 0원이 아니면 금액과 원인 거래 보기 버튼을 함께 노출한다.

BlockingIssueList

  • 변형: grouped, flat, compact
  • 상태: unresolved, in-progress, resolved
  • 적용: 미연결 상품, 규칙 누락, 미확인 할인·반품·폐기, 중복 가능 거래와 대조 차이를 유형별로 묶는다. 각 항목에는 영향 거래, 농가, 품목, 금액, 담당자와 해결 화면 링크를 제공한다.

SettlementSummary

  • 변형: operator, farmer-large, download
  • 상태: draft, generated, closed, no-sales
  • 적용: 운영자형은 판매금액, 순 판매액, 수수료, 반품·폐기, 정정 항목과 지급액을 비교한다. 농가형은 지급액을 34px 이상으로 먼저 표시하고 입금 예정일, 판매금액과 빠진 금액 순으로 보여 준다. 내려받기 형식은 구현 확정값을 사용한다.

CloseChecklist

  • 변형: review, blocked, ready, closed
  • 상태: unchecked, passed, failed
  • 적용: 판매 파일, 중복, 상품 연결, 정산 규칙, 할인·반품·폐기 확인, 오류 0건, 대조 차이 0원, 정산서 생성과 마감 권한을 검사한다. 사용자가 체크박스를 임의로 통과시키는 방식이 아니라 서버 검사 결과를 표시한다.

AccordionDetail

  • 변형: sales, commission, discount, return-disposal, correction
  • 상태: collapsed, expanded, empty
  • 적용: 농가 화면의 상세 내역에 사용한다. 접힌 상태에서도 항목명, 건수와 합계가 보이게 한다. 반품·폐기 상세에는 품목, 수량, 사유, 부담 주체, 처리일과 증빙 유무를 표시한다.

HistoryTimeline

  • 변형: correction, rule, mapping, dispute
  • 상태: default, linked, missing-link
  • 적용: 원 기록, 변경 또는 정정, 승인·처리 시점, 다음 반영 주차를 시간순으로 표시한다. 각 단계에서 담당자와 관련 정산서·원 거래 링크를 제공한다.

DisputeForm

  • 변형: farmer, operator-response
  • 상태: draft, uploading, submitted, reviewing, more-info-needed, resolved, correction-scheduled
  • 적용: 농가형은 선택된 정산 항목 확인, 이유 선택, 추가 설명과 증빙 사진, 제출 전 확인 순서로 구성한다. 운영자형은 관련 정산서·세부 내역, 처리 결과, 담당자, 처리일, 농가에 알린 날짜와 방법을 필수 항목으로 제공한다.

PhotoUploaderViewer

  • 변형: camera-or-library, thumbnail-list, full-screen-viewer
  • 상태: empty, selected, uploading, uploaded, failed, restricted
  • 적용: 농가 화면에는 카메라 촬영과 앨범 선택을 글자 버튼으로 제공한다. 업로드 제한은 서버 설정값을 표시하고 실패 시 원인과 다시 보내기 버튼을 제공한다. 사진은 권한 확인 후 열며 공개 파일 주소를 화면에 노출하지 않는다.

ModalDrawer

  • 변형: confirmation-modal, desktop-drawer, mobile-full-screen
  • 상태: open, closing, blocked, submitting
  • 적용: 삭제, 계정 중지와 정산 마감처럼 되돌리기 어려운 작업에만 확인 모달을 사용한다. 복잡한 상품 연결과 오류 상세는 데스크톱 우측 패널, 모바일 전체 화면으로 제공한다. 초점은 열린 패널 안에 유지하고 닫은 뒤 원래 버튼으로 복귀시킨다.

Toast

  • 변형: success, error, information
  • 상태: visible, dismissed
  • 적용: 저장 완료처럼 보조적인 결과에만 사용한다. 마감 차단, 파일 전체 실패와 권한 오류는 사라지는 토스트에만 의존하지 않고 화면 안의 지속 알림으로도 표시한다.

7. 화면별 적용

farmer-settlement · 농가용 스마트폰 정산 조회

모바일 단일 열로 구성한다. 상단에 정산 상태와 기간, 34~36px 지급액, 20~22px 입금 예정일을 배치한다. 다음 카드에서 판매금액, 수수료, 할인, 반품·폐기, 정정 항목과 지급액의 계산 흐름을 보여 준다. 지난 정산서, 정산서 저장하기, 이의 제기 진행 상황을 큰 글자 버튼으로 제공한다. 마감된 정산서에서만 확정 금액을 보여 주며 다른 농가 정보나 매장 선택은 노출하지 않는다.

correction-history · 마감과 정정 이력

데스크톱에서는 정정 항목 목록과 상세 패널을 나눈다. 목록 열은 원 정산 주차, 농가, 원 거래, 정정 사유, 정정 전후 금액, 가산·차감액, 다음 반영 주차와 상태로 구성한다. 상세에는 원 정산서부터 다음 정산 반영까지의 타임라인, 담당자와 처리 시점을 표시한다. 원 기록 수정 버튼은 제공하지 않는다.

farmer-settlement-view · 농가용 큰 글씨 정산서 상세

큰 글씨 상세 화면으로 지급액과 입금 예정일을 상단에 유지한다. 판매, 수수료, 할인 판매, 반품·폐기, 정정 내역을 세로 아코디언으로 제공하고 가로 표는 사용하지 않는다. 할인 상세에는 할인 전·후 금액과 수수료 계산 기준을 문장으로 표시한다. 반품·폐기에는 수량, 사유, 부담 주체, 처리일과 증빙 사진 유무를 표시하고 각 내역에서 바로 이의를 제기할 수 있게 한다.

operator-login · 운영자 로그인과 권한 관리

로그아웃 상태에서는 최대 440px 로그인 카드에 아이디, 비밀번호, 비밀번호 보기와 로그인 버튼만 제공한다. 실패 문구는 계정 존재 여부를 구분하지 않는다. 비밀번호 복구 방식은 확인 필요이므로 확정 전에는 동작하지 않는 링크를 추가하지 않는다. 로그인 후 계정·권한 관리 상태에서는 담당자 이름, 역할, 마감 권한, 사용 상태와 최근 로그인을 표로 제공하며 삭제 대신 사용 중지를 사용한다.

farm-product-rules · 농가·품목·정산 규칙 관리

농가, 품목군, 품목·상품코드, 정산 규칙을 상위 탭으로 분리한다. 목록은 왼쪽 또는 본문 표에 표시하고 등록·변경은 우측 패널에서 처리한다. 규칙 편집에는 적용 대상, 수수료율, 할인 수수료 기준, 반품·폐기 부담, 적용 시작일·종료일과 확정된 약정 확인이 필수다. 적용 우선순위를 미리 보여 주고 기간 충돌, 마감 정산에 사용된 규칙과 소급 변경을 차단한다.

sales-upload-mapping · 계산대 판매 파일 업로드와 상품 연결

정산 주차 확인, 파일 업로드·검사, 상품 연결의 세 단계로 구성한다. 업로드 후 정상 행, 오류 행, 기간 밖 행, 중복 가능 행의 건수와 금액을 요약한다. 상품 연결 표에는 원본 상품코드, 상품명, 수량, 금액, 연결 농가·품목과 자동·직접 연결 상태를 표시한다. 미연결 행을 선택하면 농가와 품목을 검색해 직접 연결하고 이후 같은 상품코드에 재사용할지 선택한다.

transaction-history · 판매·할인·반품·폐기 내역 확인

기본 정산 주차를 현재 처리 중 주차로 설정하고 농가, 품목, 판매·할인·반품·폐기 유형과 오류 상태 필터를 제공한다. 표에는 거래일시, 원본 거래번호, 농가, 품목, 수량, 할인 전·후 금액, 반품 금액, 적용 규칙과 상태를 표시한다. 반품·폐기 등록 버튼을 상단에 두고 농가, 품목, 수량, 사유와 부담 주체가 없으면 확정하지 못하게 한다. 마감된 주차는 전체 읽기 전용으로 전환한다.

reconciliation-errors · 오류 목록과 매장 매출 합계 대조

lg 이상에서는 오류 목록 7열, 매출 대조 요약 5열로 나눈다. 오류를 미연결, 규칙 없음, 미확인 거래, 중복 가능 거래와 합계 불일치로 묶고 영향 건수와 금액을 표시한다. 매출 대조는 계산식을 세로로 보여 주며 대조 차이 0원을 명확한 완료 조건으로 사용한다. 해결되지 않은 오류가 있으면 정산서 생성과 마감 이동 버튼을 비활성화하고 각 해결 화면 링크를 제공한다.

settlement-close · 농가별 정산서 생성·마감·정정 이력

상단에 정산 주차와 상태, 다음에 서버 검사 기반 마감 체크리스트, 매출 대조 합계, 농가별 지급액 목록을 배치한다. 정산 담당자는 정산서 생성까지만 할 수 있고 마감 권한이 있는 사용자에게만 목요일 마감 버튼을 제공한다. 오류 0건, 대조 차이 0원과 정산서 생성이 모두 충족되어야 활성화한다. 확인 모달에는 마감 후 수정 불가, 마감 대상 기간, 정산서 수와 총 지급액을 표시하며 서버 결과가 성공한 뒤에만 마감 완료 화면으로 바꾼다.

screen1 · 농가용 큰 글씨 정산 조회와 이의 제기

farmer-settlement의 큰 글씨 원칙을 유지하면서 이의 제기 진입을 더 강조한다. 지급액과 입금 예정일 다음에 판매, 수수료, 할인, 반품·폐기 요약을 제공하고 ‘문제 있는 내역이 있나요?’ 버튼을 56px 이상으로 배치한다. 이의 제기는 대상 내역 확인, 이유 선택, 설명·증빙 사진, 제출 전 확인의 단계로 진행한다.

farmer-login · 농가 로그인

360~480px 폭을 기준으로 한 단일 카드 화면이다. 입력 라벨은 18px 이상, 입력칸과 로그인 버튼은 높이 56px 이상으로 한다. 로그인 오류는 ‘아이디 또는 비밀번호를 확인해 주세요’처럼 통합해 표시한다. 로그인 후 요청마다 연결 농가 권한을 확인하며 첫 로그인과 비밀번호 복구 UI는 방식 확정 후 추가한다.

settlement-dashboard · 주간 정산 현황

상단에 정산 주차, 마감일, 입금 예정일과 상태를 표시하고 그 아래에 업무 단계 표시기를 둔다. 판매 파일 상태, 미연결 상품 수, 오류 수, 매출 대조 차이, 정산서 생성 상태와 마감 가능 여부를 카드로 배치한다. 가장 먼저 처리해야 할 차단 항목을 상단 지속 알림으로 보여 주고 각 카드에서 해당 화면으로 이동한다. 단일 매장이므로 매장 선택기는 두지 않는다.

dispute-management · 농가 이의 제기 처리

데스크톱에서는 이의 제기 목록, 관련 정산 내역과 증빙, 처리 양식의 세 영역으로 구성한다. 목록에는 농가, 접수일, 문제 항목, 금액, 상태와 담당자를 표시한다. 상세에서 원 정산서와 판매·수수료·할인·반품·폐기 항목을 연결하고 사진을 크게 열어 본다. 처리 결과, 담당자, 처리일, 농가에 알린 날짜·방법을 기록하며 금액 변경이 필요하면 원본 수정 대신 정정 항목 생성으로 연결한다.

8. 에셋과 모션

  • Pretendard Variable 웹폰트 파일과 preload 설정
  • 24px 선형 SVG 아이콘 세트: 업로드, 연결, 오류, 대조, 잠금, 이력, 사진, 내려받기, 펼치기
  • 상태 아이콘은 체크, 경고 삼각형, 오류 원형, 잠금 모양을 사용하고 색상만으로 구분하지 않음
  • 증빙 사진용 접근 제한 썸네일과 전체 화면 뷰어
  • 계산대 판매 파일 업로드용 파일 형식 아이콘
  • 정식 브랜드명이 없으므로 첫 버전은 ‘로컬푸드 직매장 정산’ 텍스트 워드마크를 가정하며 정식 로고는 확인 필요
  • 업무 화면의 집중을 방해하는 농산물 사진과 장식 일러스트는 사용하지 않음
  • 기본 전환: 180ms cubic-bezier(0.2, 0, 0, 1)
  • prefers-reduced-motion 사용자는 불필요한 움직임을 제거합니다.
  • 다크모드: 초기 범위에서 제외

9. 접근성

  • KWCAG 2.2와 WCAG 2.1 AA를 기준으로 텍스트 명도 대비 4.5:1 이상, 큰 글자 3:1 이상, 입력 경계·초점 등 비텍스트 요소 3:1 이상을 확보한다.
  • 모든 기능을 키보드만으로 사용할 수 있게 하고 논리적인 초점 순서, 건너뛰기 링크와 항상 보이는 포커스 링을 제공한다.
  • 운영자 터치·클릭 대상은 최소 44×44px, 농가용 주요 대상은 56×56px을 권장한다.
  • 농가 화면은 본문 18px 이상, 항목명 20px 이상, 지급액 34px 이상을 기본으로 하고 브라우저 글자 확대와 200% 확대에서 내용이 겹치지 않게 한다.
  • 오류, 완료, 자동 연결과 직접 연결 상태를 색상만으로 표현하지 않고 아이콘, 문구와 필요 시 패턴을 함께 사용한다.
  • 입력 오류 발생 시 화면 상단 오류 요약과 각 입력칸 오류 문구를 제공하고 오류 입력으로 초점을 이동할 수 있게 한다.
  • 표에는 caption, 열 머리글과 행 머리글 관계를 지정하고 정렬 상태를 보조 기술에 전달한다. 모바일 카드 전환 후에도 같은 정보 관계를 제목과 설명 목록으로 유지한다.
  • 금액은 천 단위 쉼표와 원 단위를 함께 표시하고 가산·차감은 부호와 ‘더해진 금액’, ‘빠진 금액’ 문구를 함께 사용한다.
  • 사진에는 품목, 처리 유형과 촬영 또는 등록 맥락을 설명하는 대체 텍스트를 제공한다. 장식 이미지는 대체 텍스트에서 제외한다.
  • 마감 확인, 이의 제기 제출과 계정 중지는 실행 전 대상과 결과를 읽을 수 있게 하고 실행 후 성공 또는 실패 상태를 보조 기술에 알린다.
  • 자동으로 사라지는 안내는 핵심 오류에 사용하지 않는다. 시간 제한이 필요한 로그인 세션은 종료 전에 연장 방법을 안내한다.
  • 농가용 핵심 기능에는 좌우 스와이프, 길게 누르기, 드래그만으로 가능한 동작을 사용하지 않는다.
  • 화면 너비가 좁아져도 지급액 확인, 이의 제기, 오류 확인과 처리, 매출 대조 및 마감 상태 조회가 가능해야 한다.

10. 구현 체크리스트

  • 디자인 토큰을 CSS 변수 또는 Tailwind theme에 한 번만 정의합니다.
  • Pretendard와 지정 자간이 모든 한글 화면에 적용되는지 확인합니다.
  • 선택한 레이아웃 전략과 breakpoint가 화면마다 달라지지 않게 합니다.
  • 버튼·입력·표·대화상자의 focus, disabled, error 상태를 확인합니다.
  • 모바일과 데스크톱에서 핵심 사용자 흐름을 각각 끝까지 확인합니다.

조사 출처

디자인 가이드 — 로컬푸드 직매장 위탁판매·정산 관리 | Prometheon