본문으로 건너뛰기

첫 사용 안내

새 워크스페이스 · 새 멤버가 처음 해야 할 일을 체크리스트로 보이고, 필요할 때만 화면의 한 곳을 코치마크로 짚습니다.

안내는 일을 막지 않습니다. 언제든 건너뛰고, 숨긴 뒤에도 사이드바 바닥(런처)과 도움말 메뉴에서 다시 엽니다. 기능을 차례로 설명하는 투어보다 빈 화면에서 첫 동작을 바로 하게 하는 것을 먼저 씁니다. 진행 상태(마친 것 · 숨긴 것 · 본 코치마크)는 앱이 저장합니다.

import
import { OnboardingChecklist, OnboardingLauncher, FirstSteps } from "@uyoolabs/ui/ui"; import { Coachmark } from "@uyoolabs/ui/overlay";
쓰는 경우
체크리스트는 새 워크스페이스 · 새 멤버의 처음 할 일 3~6개에, 항목마다 바로 하는 버튼과 함께 씁니다. 코치마크는 화면 밖에서 시작한 일(초대 메일 → 첫 진입)이 가리키는 한 곳, 새로 생긴 기능 한 곳에 씁니다. 빈 화면은 Empty first-use 와 FirstSteps 로 엽니다.
쓰지 않는 경우
첫 진입에 가림막 투어를 저절로 띄우지 않습니다(가림막은 사람이 [둘러보기]를 누른 투어에만). 코치마크를 네 단계 넘게 잇지 않습니다. 화살표로 대상을 가리키지 않습니다. 마친 항목에 취소선 · 축하 효과를 두지 않습니다. 오류 · 경고 색으로 '아직 안 함'을 재촉하지 않습니다. 닫으면 진행이 사라지게 하지 않습니다.
저장 · 첫 방문
저절로 뜨는 코치마크는 그 화면의 첫 방문에 한 번만, 비모달로만 띄웁니다. 마침 · 건너뛰기 · Esc 모두 '봤음'으로 저장하고, 다시 보기는 도움말 메뉴에 둡니다.
접근성
체크리스트는 제목이 이름인 section 안의 APG Disclosure 이고, 완료 · 건너뜀은 이름 뒤 숨은 글자로 읽힙니다. 진행 글이 바뀌면 role=status 로 한 번 알립니다. 코치마크는 비모달 dialog 로 대상에 aria-describedby 로 본문을 잇고, 대상이 없는(권한 · 화면 크기) 단계는 건너뜁니다.

체크리스트 · 런처

다음 할 일 하나만 펼칩니다. 숨기면 진행은 남고 런처로 다시 엽니다.

워크스페이스 시작하기

팀과 일을 시작하는 데 필요한 다섯 가지입니다.

5개 중 2개 완료
  • 이메일이나 초대 링크로 팀을 부릅니다.

숨겨도 사이드바 바닥 · 도움말 메뉴에서 다시 엽니다.

코치마크

대상 둘레 링(primary 2 · 4 띄움 · 틴트 후광) + 뜬 팝오버. 지붕 · 화살표 없음, 가림막은 기본 끔.

홈

빈 화면 — 첫 동작 세 걸음

투어 대신 빈 자리에서 첫 동작을 바로 하게 합니다.

아직 프로젝트가 없습니다

프로젝트는 작업 · 문서 · 회의를 한곳에 모읍니다.

  1. 프로젝트를 만듭니다이름과 공개 범위만 정합니다
  2. 멤버를 더합니다워크스페이스 멤버에서 고릅니다
  3. 첫 작업을 적습니다보드에서 바로 적습니다

키보드

키동작
TabShift+Tab체크리스트: 항목 머리 → 펼친 항목의 버튼. 코치마크: 팝오버 안 버튼(비모달이라 밖으로도 나갑니다).
EnterSpace항목 머리를 펼치고 접습니다. 한 번에 하나만 펼칩니다. 조합 중 Enter 는 무시합니다.
←→코치마크의 이전 · 다음 단계로 옮깁니다. 새 제목으로 포커스가 갑니다.
Esc코치마크를 건너뜁니다(onSkip). 닫히면 투어를 시작한 요소로 포커스가 돌아갑니다. 체크리스트는 Esc 에 반응하지 않습니다.

props

소스의 타입과 JSDoc 에서 생성한 표입니다. 컴포넌트를 고치면 pnpm gen 으로 다시 만듭니다.

OnboardingChecklist

prop타입기본값설명
title필수ReactNode—카드 제목(h2). 카드의 이름(aria-labelledby)이 된다
descriptionReactNode—
items필수ChecklistItem[]—항목 상태는 늘 앱이 준다. 진행 저장(사용자 설정 · 서버)도 앱이 한다
openIdstring | null—제어: 펼친 항목. null 이면 모두 접힘
defaultOpenIdstring | null—비제어 첫 값. 없으면 첫 할 일
onOpenChange(id: string | null) => void—
onSkip(id: string) => void—항목 하나 건너뛰기. 없으면 [건너뛰기] 를 그리지 않는다
onSkipAll() => void—
onDismiss() => void—× — 숨기기. 진행은 남는다. 숨긴 뒤 포커스는 화면의 런처(OnboardingLauncher)로 간다
completeContentReactNode—모두 끝났을 때의 카드 내용을 바꿀 때
lang"ko" | "en" | "ja"—
labelsPartial<OnboardingLabels>—
classNamestring—

OnboardingLauncher

prop타입기본값설명
done필수number—
total필수number—
onOpen필수() => void—
lang"ko" | "en" | "ja"—
labelsPartial<OnboardingLabels>—
classNamestring—

FirstSteps

prop타입기본값설명
steps필수ReadonlyArray<{ title: ReactNode; description?: ReactNode }>—세 걸음이 알맞다. 걸음마다 굵은 제목 한 줄 + 짧은 설명
labelstring—목록의 접근성 이름. 보통 위 빈 상태 제목이 맥락을 주므로 없어도 된다
classNamestring—

Coachmark

prop타입기본값설명
steps필수CoachmarkStep[]—넷까지. 다섯 이상이면 개발 중 경고
open필수boolean—
onOpenChange필수(open: boolean) => void—
stepnumber—제어: 지금 단계(0부터)
defaultStepnumber0
onStepChange(step: number) => void—
onFinish() => void—마지막 단계의 [마침]
onSkip() => void—[건너뛰기] · Esc. 다시 보기는 도움말 메뉴에 둔다
modalbooleanfalse가림막 + 오려 낸 자리 + 포커스 가두기. 기본 false — 사람이 [둘러보기]를 눌러 시작한 투어에만 켠다(W3 결정 #19)
lang"ko" | "en" | "ja"—
labelsPartial<CoachmarkLabels>—