모달 · 시니어 시트
일반 모달은 가운데 520px 카드, 시니어 모드에서는 은행 앱 큰글씨 모드처럼 전체화면 시트가 됩니다. 한 화면 한 질문, 하단 전체폭 주 버튼 하나, 자동 닫힘 없음.
리포트 반려
2026-09-29 (화) 일일 리포트를 작성자에게 돌려보냅니다.
정의
모달은 지금 하던 일을 멈추고 답을 요구하는 창입니다. 확인(반려하시겠습니까), 짧은 입력(반려 사유), 선택(판정)에만 쓰고, 정보를 보여주기만 하려면 시트 대신 화면으로 이동합니다. .fna-modal(오버레이 + 카드)과 네이티브 <dialog class="fna-dialog"> 두 구현이 있으며 <html data-scale="large"> 아래에서는 모든 모달이 자동으로 전체화면 시트가 됩니다.
언제 쓰고 언제 쓰지 않나
| 쓴다 | 쓰지 않는다 |
|---|---|
| 되돌릴 수 없는 행동 확인(반려·서명 삭제·연결 해제) | 저장 성공 알림(→ 토스트) |
| 결재 직전 서명 요청 | 긴 폼(→ 화면 이동) |
| 반려 사유 선택 + 한 줄 입력 | 세션 만료 안내를 모달 위에 모달로(→ 하나로 교체) |
| 시니어: 한 질문씩 단계 진행 | 마케팅·공지 팝업 |
해부도 — 일반 모달
리포트 반려
2026-09-29 (화) 일일 리포트를 작성자에게 돌려보냅니다. 사유는 작성자에게 그대로 표시됩니다.
- 제목 17/800동사 명사형: "리포트 반려", "서명 삭제". 물음표 문장은 본문에
- 닫기 (선택)정보성 모달에만. 확인 모달은 취소 버튼이 닫기 역할
- 본문 13px무엇이 일어나는지 + 되돌릴 수 있는지. 항목 간격 12
- 보조 버튼텍스트 "취소". 왼쪽
- 주 버튼결과가 보이는 동사. 위험하면 danger-solid. 오른쪽 끝
변형
리포트 반려
작성자에게 돌려보냅니다. 사유는 작성자에게 표시됩니다.
결재를 제출할까요?
9월 29일 금속검출 일지를 품질관리자에게 보냅니다.
제출하면 내용을 고칠 수 없습니다. 고칠 것이 있으면 닫기를 누르세요.
금속검출 판정
시편 3종(Fe · SUS · 비철)을 통과시킨 결과를 고르세요.
가열 중심온도
코드
<dialog class="fna-dialog" open style="position:relative;margin:0"><h3 style="margin:0 0 8px;font-size:var(--fna-font-size-xl)">서명 삭제</h3><p style="margin:0 0 16px;font-size:13px">등록된 서명을 삭제하면 다시 등록할 때까지 결재를 처리할 수 없습니다.</p><div style="display:flex;justify-content:flex-end;gap:8px"><button class="fna-btn fna-btn--text">취소</button><button class="fna-btn fna-btn--danger-solid">서명 삭제</button></div></dialog>상태
| 상태 | 일반 | 시니어 시트 |
|---|---|---|
| 열림 | 오버레이 .55 + blur 2px, 카드 중앙, 첫 포커스 = 주 버튼(위험이면 취소) | 22ms 아래서 24px 올라옴, 첫 포커스 = 본문 첫 요소 |
| 처리 중 | 주 버튼 disabled + "제출 중", 닫기 불가 | 같음, 상단 닫기도 비활성 |
| 오류 | 본문 위 error 배너, 모달 유지 | 본문 위 배너 20px 글자 |
| 닫힘 | ESC · 오버레이 클릭(확인 모달은 오버레이 클릭 무시) · 취소 | 상단 "닫기" · 하단 텍스트 링크. 오버레이 없음, ESC 없음(전체화면) |
치수
| 항목 | 일반 | sm / lg | 시니어 시트 |
|---|---|---|---|
| 폭 | 520 | 380 / 720 | 100% |
| 최대 높이 | 88vh | 88vh | 100% (본문 스크롤) |
| 라운드 | 16 | 16 | 0 |
| 제목 | 17 / 800 | 17 | 24 / 800 |
| 본문 | 13 | 13 | 20, 행간 1.5 |
| 패딩(머리 · 본문 · 꼬리) | 16/20/12 · 0/20/16 · 12/20/16 | 같음 | 12/24 · 20/24 · 16/24 (+safe-area) |
| 버튼 | 40, 우측 정렬, 간격 8 | 같음 | 64 전체폭 · 24/900 · 라운드 16 · 세로 12 |
| 선택 카드 | — | — | 72 · 테두리 2 · 라운드 16 |
| 오버레이 | rgba(10,16,40,.55) | 같음 | 없음 (surface) |
Do · Don't
삭제하면 다시 등록할 때까지 결재를 처리할 수 없습니다.
정말 삭제하시겠습니까?
접근성
role="dialog" aria-modal="true" aria-labelledby=제목. 네이티브<dialog>+showModal()이면 포커스 트랩·ESC·inert 가 자동.- 열릴 때 포커스는 모달 안으로, 닫히면 연 버튼으로 복귀. 뒤 콘텐츠는
inert. - 위험 확인 모달의 기본 포커스는 취소 버튼(Enter 로 실수 확정 방지).
- 시니어 시트: 본문 20px 이상, 버튼 64, 색 대비 text 14.9:1. 오버레이 blur 없음(어지러움).
- 모달 위 모달 금지. 세션 만료는 열린 모달을 교체한다.
문구
| 부분 | 일반 | 시니어 |
|---|---|---|
| 제목 | 리포트 반려 · 서명 삭제 · 결재 제출 | 결재를 제출할까요? · 온도를 입력하세요 |
| 본문 | 무엇이 + 되돌릴 수 있는지, 2문장 이내 | 한 문장씩, 20px, "~하세요" |
| 주 버튼 | 반려 확정 · 서명 삭제 · 제출 | 제출하기 · 다음 · 저장하기 |
| 보조 | 취소 | 아직 아닙니다 · 닫기 (상단) |
코드
<div class="fna-modal" role="dialog" aria-modal="true" aria-labelledby="t" hidden>
<div class="fna-modal__card">
<div class="fna-modal__head"><h2 class="fna-modal__title" id="t">리포트 반려</h2></div>
<div class="fna-modal__body">…</div>
<div class="fna-modal__foot"><button class="fna-btn fna-btn--text">취소</button><button class="fna-btn fna-btn--danger-solid">반려 확정</button></div>
</div>
</div>
<!-- 시니어: .fna-modal.fna-modal--large 또는 <html data-scale="large"> 아래의 모든 .fna-modal
머리에 <button class="fna-modal__close">닫기</button>, 꼬리는 세로 스택 -->
<dialog class="fna-dialog">…</dialog> dlg.showModal()
/* RN */ ConfirmDialog (src/ui) · 시니어: SeniorScreen + BigButton (senior/ui.tsx)
안정마지막 갱신 담당 디자인시스템 TF · jjo831@farmzone.kr소스 components.css .fna-modal · .fna-modal--large · dialog.fna-dialog · .fna-choice · .fna-step-fieldComponents · FNA 디자인 시스템 v1.0