Get startedFoundationsComponentsPatternsRules

Spotlight

스포트라이트는 화면의 특정 요소를 강조하고 짧은 메시지나 여러 단계 투어로 새 기능을 소개해요.

설치

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

구성

컴포넌트역할
SpotlightManager앱이나 앱의 한 영역을 감싸고, 하위 대상을 이름으로 기억해요. 블랭킷 색(blanketIsTinted)도 여기서 정해요.
SpotlightTarget강조할 요소에 name 을 붙여요. 감싸는 요소 없이 자식에 바로 ref 를 걸어요.
Spotlighttarget 이름의 요소를 강조하고 옆에 discovery 색 대화상자를 띄워요.
SpotlightTransition단계가 바뀌는 Spotlight 를 감싸요.
SpotlightCard대화상자 없이 화면 안에 바로 놓는 온보딩 카드예요.
SpotlightPulse블랭킷 없이 요소 주위에 펄스만 보여줘요.
useSpotlight대상이 렌더됐는지(isTargetRendered), 화면에 보이는지(checkVisibility) 알려줘요.

Examples

Spotlight

SpotlightManager 안에서 SpotlightTarget 으로 대상을 표시하고, Spotlight 의 target 에 같은 이름을 넘겨요. 블랭킷에 대상 모양대로 구멍을 뚫어 실제 요소를 그대로 보여주고, 그 둘레에 2px discovery 테두리와 펄스를 그려요. 스포트라이트가 열려 있는 동안 블랭킷이 나머지 화면의 클릭을 막아요. 닫는 동작은 actions 로 직접 만들어요.

Spotlight tour

여러 단계를 이어 보여줄 때는 단계 상태를 직접 관리하고 Spotlight 의 target 을 바꿔요. headingAfterElement 에 1/3 같은 단계 번호를 넣고, 첫 단계에는 "건너뛰기", 중간에는 "이전"·"다음", 마지막 단계에는 "확인" 을 둬요. actions 는 오른쪽부터 차례로 놓여요.

Dialog placement

dialogPlacement 로 대화상자를 대상의 어느 쪽에 띄울지 정해요. 지정하지 않으면 아래 가운데에 띄우고, 공간이 모자라면 반대쪽으로 뒤집은 뒤 화면 가장자리에서 5px 안쪽으로 밀어 넣어요. dialogWidth 는 160~600px 사이에서 정해요(기본 400px).

Target options

targetRadius 로 강조 영역의 모서리를 대상에 맞추고, targetOnClick 으로 강조된 대상을 클릭했을 때의 동작을 정해요. SpotlightManager 의 blanketIsTinted={false} 는 블랭킷을 투명하게 만들어요.

Spotlight card

SpotlightCard 는 블랭킷이나 대상 없이 화면 안에 바로 놓는 카드예요. isFlat 은 그림자를 없애고, image 로 제목 위에 이미지나 요소를 넣어요.

Pulse

작은 변경은 대화상자 없이 SpotlightPulse 로 요소 둘레에 펄스만 보여줘도 충분해요.

Usage guidelines

언제 쓰나요

  • 버튼, 아이콘, 입력 필드처럼 화면의 특정 요소로 시선을 모을 때
  • 여러 단계로 이뤄진 작업이나 짧은 투어를 안내할 때
  • 새 기능을 맥락 안에서 소개할 때. 작은 변화는 가볍게, 큰 변화는 새 경험 소개로 나눠요.
  • 같은 작업을 여러 번 반복하는 사용자에게 더 빠른 방법을 제안할 때

언제 쓰지 않나요

  • 처음 가입한 사용자에게. 스포트라이트는 이미 제품을 쓰는 사용자를 위한 패턴이에요.
  • 펄스 같은 가벼운 신호로도 충분한 작은 변경
  • 사용자의 작업을 가로막을 때. 언제든 닫을 수 있어야 해요.
  • 다른 팀의 온보딩 메시지와 겹칠 때. 꼭 필요한 메시지인지 먼저 따져 봐요.

모범 사례

  • 한 번에 스포트라이트 하나만 보여줘요.
  • 단계는 되도록 하나로, 많아도 3~4단계를 넘기지 않아요. 합치거나 뺄 수 있는 단계는 줄여요.
  • 모든 단계에서 닫기(건너뛰기)를 제공해요. 참여를 강요하지 않아요.
  • 흐름 전체를 먼저 설계하고 논리적인 순서로 배치해요.
  • 관리자에게는 설정과 제어, 숙련 사용자에게는 단축키와 효율, 일반 사용자에게는 팀이 얻는 이점처럼 대상에 맞게 메시지를 다듬어요.
Do· 한 번에 하나
스포트라이트는 한 번에 하나만, 1단계를 목표로 해요.
Don't· 여러 개 동시에
스포트라이트를 여러 개 띄우거나 정보를 한꺼번에 쏟아내지 않아요.

문구

  • 제목은 기능 이름보다 사용자가 얻는 이점을 앞세워요. 몇 단어로 짧게 쓰고, 가능하면 사용자에게 맞춰요.
  • 본문은 이 기능이 왜 중요한지 설명해요. 두 줄 안에 끝내고, 핵심 단어를 앞에 두고, 제목을 반복하지 않아요.
  • 지금 화면에 함께 보이는 요소만 가리켜요. 더 설명이 필요하면 도움말 문서로 연결해요.
  • 버튼은 투어 중간에는 "다음", 마지막 단계나 닫는 동작에는 "확인" 을 쓰고, 그만둘 수 있는 선택지를 항상 함께 둬요.
Do· 이점을 먼저
"원하는 이슈만 골라 보세요" 처럼 사용자가 얻는 것을 제목으로 써요.
Don't· 기능 이름만
"빠른 필터 기능 출시" 처럼 기능 이름만 내세우지 않아요.

Accessibility

  • 대화상자는 role="dialog", aria-modal 로 표시되고, heading 이 있으면 그 제목이 접근성 이름이 돼요. 다른 이름이 필요하면 label(aria-label) 이나 titleId(aria-labelledby) 중 하나만 써요.
  • 열리고 200ms 뒤 대화상자 안 첫 버튼으로 포커스가 옮겨가고, Tab·Shift+Tab 은 대화상자 안에서만 돌아요.
  • 대상이 화면 밖에 있으면 스크롤해서 보여줘요. 세로 정렬은 scrollPositionBlock 으로 정해요.
  • 펄스 애니메이션은 한 번에 대상 하나에만 쓰고, 페이지에 들어오자마자 열리는 스포트라이트에는 쓰지 않아요(pulse={false}). 사용자가 동작 줄이기를 설정하면 펄스와 페이드가 꺼져요.

Props

SpotlightManager

Prop

Type

SpotlightTarget

Prop

Type

Spotlight

Prop

Type

SpotlightCard

Prop

Type

SpotlightPulse

Prop

Type

On this page