버튼
한 화면에 주 버튼은 하나. 라벨은 결과가 예측되는 동사이며, 위험한 행동은 두 번 묻고, 시니어 모드에서는 64px 전체폭 하나로 커집니다.
정의
버튼은 누르면 무언가가 일어나는 요소입니다. 이동만 하는 것은 링크, 상태를 고르는 것은 선택(세그먼트·체크)이며 버튼이 아닙니다. 주(primary) · 보조(secondary) · 아웃라인 · 텍스트 · 위험 · 성공 · 검토, 7가지 강조 단계가 있고 크기는 sm/md/lg 세 가지입니다.
언제 쓰고 언제 쓰지 않나
| 강조 | 쓴다 | 쓰지 않는다 |
|---|---|---|
| 주 (primary) | 화면의 목적을 완성하는 행동 1개: 저장·제출·기록 | 한 화면에 둘 이상 · 취소·닫기 |
| 보조 (secondary) | 주 행동 옆의 대안: 임시 저장·미리보기 | 주 버튼 없이 단독 |
| 아웃라인 | 표·카드 안의 조용한 행동: 상세·변경 | 폼 제출 |
| 텍스트 | 취소·닫기·더보기 | 주요 행동 |
| 위험 (danger / danger-solid) | 되돌릴 수 없는 것: 반려·서명 삭제·연결 해제. solid 는 확인 모달 안에서만 | 강조 목적 · 기본 상태의 목록 |
| 성공 · 검토 | 결재 흐름의 승인·검토 완료 (결재 상태 색과 일치) | 결재 밖 |
해부도
- 컨테이너min-height 40(md) · 라운드 8 · 패딩 .55em 1.15em (em 이라 큰글씨에서 같이 커짐)
- 아이콘(선택) 20라벨 왼쪽, 간격 .4em. 아이콘만 있는 버튼은
--icon+ aria-label - 라벨13px 700 (lg 17px 800). 한 줄, 줄바꿈 없음, 2~6자
- 모서리sm 4 · md 8 · lg 12 — 높이 × 0.28 (심볼 비율)
변형
코드
<div class="fna-btn-group">
<button class="fna-btn">기록 저장</button>
<button class="fna-btn fna-btn--secondary">임시 저장</button>
<button class="fna-btn fna-btn--outline">상세</button>
<button class="fna-btn fna-btn--text">취소</button>
<button class="fna-btn fna-btn--danger">반려</button>
<button class="fna-btn fna-btn--danger-solid">서명 삭제</button>
<button class="fna-btn fna-btn--success">승인</button>
<button class="fna-btn fna-btn--review">검토 완료</button>
</div>코드
<div class="fna-btn-group">
<button class="fna-btn fna-btn--sm">표 안 버튼</button>
<button class="fna-btn">기본</button>
<button class="fna-btn fna-btn--lg">큰 버튼</button>
<button class="fna-btn fna-btn--icon" aria-label="새로고침"><svg class="icon-row" viewBox="0 0 24 24"><path d="M20 12a8 8 0 1 1-2.3-5.7"/><path d="M20 4v5h-5"/></svg></button>
</div>코드
<div style="max-width:360px;display:flex;flex-direction:column;gap:12px">
<button class="fna-btn fna-btn--block">기록 저장</button>
<button class="fna-btn fna-btn--block" style="min-height:64px;font-size:24px;font-weight:900;border-radius:16px">기록 저장</button>
</div>상태
기본
호버
포커스
눌림
비활성
처리 중
비활성은 불투명도 .45 + pointer-events:none. 처리 중은 라벨을 "저장 중"으로 바꾸고 로더를 붙이며, 폭이 변하지 않도록 min-width 를 유지합니다. 비활성 버튼에는 왜 비활성인지 근처에 문장을 둡니다(예: "서명을 먼저 등록하세요").
치수
| 항목 | sm | md (기본) | lg | 시니어 |
|---|---|---|---|---|
| 최소 높이 | 32 | 40 (큰글씨 48) | 48 | 64 |
| 글자 | 12 / 700 | 13 / 700 | 17 / 800 | 24 / 900 |
| 패딩 | .35em .8em | .55em 1.15em | .7em 1.4em | 전체폭 |
| 라운드 | 4 | 8 | 12 | 16 |
| 아이콘 | 16 | 20 | 24 | 28 |
| 버튼 사이 | 8 | 8 | 12 | 12~16 (세로) |
| 최소 폭(단독) | — | 72 | 96 | 100% |
Do · Don't
Do 주 버튼 하나, 나머지는 단계를 낮춘다
Don't 주 버튼 셋
Do 라벨은 결과가 보이는 동사
Don't 예/아니오 · 확인/취소만무엇을 확인하는지 버튼만 봐서는 모른다
→ 모달에서
Do 위험 solid 는 확인 단계에서만
Don't 목록 행마다 빨간 단색 버튼
Do 주 버튼은 오른쪽 끝(웹) · 아래 전체폭(폰)
Don't 주 버튼이 왼쪽 · 위치가 화면마다 다름
접근성
<button type="button">. 링크처럼 이동하면<a class="fna-btn">. div 에 onclick 금지.- 포커스 링 2px
--fna-focus, offset 2px (:focus-visible). 포커스 링을 제거하지 않는다. - 아이콘 버튼은
aria-label. 처리 중은aria-busy="true"+disabled. - 대비: primary 위 흰 글자 10.4:1 · 아웃라인 글자 text-secondary 9.5:1 · 위험 error-on-container / error-container 6.5:1.
- 터치 44 이상(sm 32 는 데스크톱 표 안에서만, 터치 화면에서는 md 이상).
- 큰글씨 모드에서 최소 높이 48 로 자동 상향(
[data-scale=large] .fna-btn).
문구
| 상황 | 라벨 | 피할 것 |
|---|---|---|
| 기록 저장 | 기록 저장 · 저장 | 완료, OK, 등록하기 |
| 결재 | 제출 (검토요청) · 검토 완료 · 최종 승인 · 반려 | 승인하기, 컨펌 |
| 경보 처리 | 확인 및 조치 기록 | 처리, 닫기 |
| 파괴적 | 서명 삭제 · 연결 해제 | 삭제, 예 |
| 취소 | 취소 (모달) · 닫기 (정보만 있을 때) | 아니오, 뒤로 |
| 처리 중 | 저장 중 · 제출 중 | Loading…, 잠시만요 |
코드
<button type="button" class="fna-btn">기록 저장</button>
<button type="button" class="fna-btn fna-btn--secondary">임시 저장</button>
<button type="button" class="fna-btn fna-btn--outline fna-btn--sm">상세</button>
<button type="button" class="fna-btn fna-btn--text">취소</button>
<button type="button" class="fna-btn fna-btn--danger">반려</button>
<button type="button" class="fna-btn fna-btn--lg fna-btn--block">제출 (검토요청)</button>
<button type="button" class="fna-btn fna-btn--icon" aria-label="새로고침"><svg …/></button>
<button type="button" class="fna-btn" disabled aria-busy="true">저장 중</button>
<div class="fna-btn-group">…</div> <!-- 형제 간격 8 -->
/* RN */ <Button variant="primary" size="lg">기록 저장</Button> (src/ui/Button)
안정마지막 갱신 담당 디자인시스템 TF · jjo831@farmzone.kr소스 components.css .fna-btnComponents · FNA 디자인 시스템 v1.0