Nemo
컴포넌트FOX · Popup

팝업

화면 가운데에 뜨는 확인 창이에요. 줄무늬 제목 줄이 있는 작은 창 모양이고, 뒤 화면은 먹색으로 40% 가려요. 꼭 답해야 하는 일에만 써요.

확인과 취소

버튼 두 개를 놓을 때 주 행동은 오른쪽이에요. 아래 버튼을 눌러 직접 열어 보세요.

CONFIRM
const [open, setOpen] = useState(false);

<Button onClick={() => setOpen(true)}>송금하기</Button>
<Popup
  open={open}
  onClose={() => setOpen(false)}
  onConfirm={send}
  title="송금 확인"
  cancelLabel="취소"
  confirmLabel="보내기"
>
  김하나 님에게 50,000원을 보낼까요?
</Popup>

되돌리기 어려운 확인

destructive를 켜면 확인 버튼이 빨간 글자가 되고, 키보드 초점은 취소 버튼에서 시작해요. 실수로 Enter를 눌러도 삭제되지 않아요.

DESTRUCTIVE
<Popup
  open={open}
  onClose={() => setOpen(false)}
  title="계좌 삭제"
  cancelLabel="취소"
  confirmLabel="삭제하기"
  destructive
>
  삭제하면 거래 내역도 함께 사라져요.
</Popup>

안내만 하는 팝업

cancelLabel을 빼면 버튼이 하나만 나와요. 알려 주기만 하면 되는 내용에 써요.

ALERT
<Popup open={open} onClose={close} title="안내" confirmLabel="알겠어요">
  점검 중이라 잠시 후에 다시 시도해 주세요.
</Popup>

키보드와 접근성

role은 dialog이고 aria-modal이 켜져 있어요. 열면 초점이 팝업 안으로 들어가고 Tab이 밖으로 나가지 않아요. Escape나 바깥 어두운 영역을 누르면 닫히고, 닫히면 초점이 팝업을 연 버튼으로 돌아가요. 실제 화면에서는 document.body 위에 띄워요.

이렇게 써요

「50,000원을 보낼까요?」 보내기 / 취소

이렇게무엇을 하는지 묻는 문장 하나와 버튼 이름으로 동작을 그대로 써요.

「정말 진행하시겠습니까?」 예 / 아니오

이렇게 말고예와 아니오만 있으면 무엇에 답하는지 다시 읽어야 해요.

속성

속성값기본값설명
openboolean없음열림 여부
onClose() => void없음Escape, 바깥 영역, 취소 버튼에서 불린다
titlestring없음제목 줄 글자이자 화면 읽기 도구가 읽는 이름
confirmLabelstring확인확인 버튼 글자
cancelLabelstring없음값을 주면 취소 버튼이 함께 나온다
onConfirm() => void없음확인을 누르면 먼저 불리고 이어서 onClose가 불린다
destructivebooleanfalse확인 버튼이 빨간 글자가 되고 초점이 취소 버튼에 간다
closeOnScrimbooleantrue바깥 영역을 눌러 닫을지
containerHTMLElement | nulldocument.body요소를 주면 그 안에서만 뜬다. 문서 예시용