Get startedFoundationsComponentsPatternsRules

Popup

팝업은 트리거 옆 오버레이에 짧은 내용이나 작은 상호작용을 띄워요.

설치

pnpm dlx shadcn@latest add https://rebar.conmarket-landing.workers.dev/r/steel/popup.json

Examples

Popup 은 열림 상태를 직접 관리해요. trigger 함수가 받은 props(ref, aria-expanded 등)를 트리거 요소에 그대로 펼쳐 넣고, 트리거의 onClick 에서 isOpen 을 토글해요. 바깥을 클릭하거나 Esc 를 누르면 onClose 가 호출돼요.

팝업은 열릴 때 트리거 쪽에서 8px 미끄러지며 나타나고(150ms), 닫힐 때 4px 되돌아가며 사라져요(100ms). 방향은 실제로 놓인 위치를 따르고, popupComponent 로 바꾼 컨테이너에도 같은 모션이 붙어요. 동작 줄이기 설정이 켜져 있으면 모션을 생략해요.

Placement

placement 로 선호하는 위치를 정해요. 기본값 auto 는 공간이 넉넉한 쪽에 띄우고, 화면 끝에 닿으면 자동으로 자리를 옮겨요.

팝업 안에 Menu 를 넣어 작은 메뉴를 만들 수 있어요. 이때 role="menu" 를 지정해요. 일반적인 액션 메뉴라면 Dropdown Menu 를 먼저 고려해요.

Dialog and focus

확인 같은 짧은 상호작용은 role="dialog" 와 titleId(또는 label)로 이름을 붙여요. 열릴 때 포커스를 줄 요소는 content 가 받은 setInitialFocusRef 로 지정하고, 자동 포커스를 끄려면 autoFocus={false} 를 써요.

Usage guidelines

팝업은 짧은 메시지나 메뉴처럼 가벼운 상호작용을 오버레이로 보여줄 때 써요. 작은 작업이라도 사용자가 무언가를 완료해야 한다면 Modal Dialog 가 더 알맞고, 꼭 필요하지 않은 짧은 설명은 Tooltip 이 나아요.

Do· 역할과 이름을 지정해요
팝업 성격에 맞게 role 을 menu 나 dialog 로 정하고, dialog 에는 label 이나 titleId 를 붙여요.
Don't· 필수 입력을 넣지 않아요
바깥을 클릭하면 언제든 닫히므로, 꼭 채워야 하는 입력란을 팝업에 두지 않아요.
  • 내용이 스크롤되지 않게 짧게 유지해요. 숨은 내용이 있다는 단서가 거의 없어서 놓치기 쉬워요.
  • 팝업 안에서 또 팝업을 여는 중첩은 되도록 피해요.
  • placement 와 shouldFlip 으로 위치와 대체 위치를 정해 트리거를 가리지 않게 해요.

Accessibility

  • 트리거는 aria-expanded, aria-haspopup, aria-controls 를 받아 열림 상태를 알려줘요. 이 props 를 꼭 트리거에 펼쳐 넣어요.
  • Enter 로 열고 Esc 로 닫아요. 닫히면 포커스가 트리거로 돌아가요(shouldReturnFocus).
  • 열리면 기본으로 팝업 안 첫 포커스 가능 요소로 포커스가 옮겨가요.
  • 모달 안이나 스크롤 영역 안에서는 shouldRenderToParent 로 포털 없이 트리거 옆에 그려 읽기 순서를 지켜요.

Props

Prop

Type

On this page