Flow: Onboarding (첫 실행 인트로)
앱 첫 실행 시 1회 노출되는 가치 소개 인트로. App 전용 (Web 없음). lazy-auth 정체성에 맞춰 로그인 불필요 · 스킵 가능, 끝나면 홈(/disclosures)으로 진입한다. 로그인/종목 등록 강요 없음 — 그건 이후 보호 액션 시점의 auth-gate 가 담당.
- Flutter (App):
onboarding_page.dart - 상태/플래그:
onboarding_controller.dart+onboarding_storage.dart(FlutterSecureStorage, keydartbrief_onboarding_completed) - 게이트:
router.dartredirect (/onboarding) - primary CTA:
AppButton.primary
💡 시각 미리보기: design site / onboarding
트리거 / 노출 정책
- 첫 실행 1회만 — 플래그는
bootstrap()에서 await 로 읽어 seed provider(onboardingCompletedSeedProvider)에 주입. 라우터redirect가 이 값을 읽어 미완료면/onboarding으로, 완료면/onboarding진입을/disclosures로 되돌림. 첫 프레임부터 확정값이라 신규/복귀 화면 깜빡임(race) 없음 - 비로그인 진입 가능 — 로그인 요구 안 함 (lazy auth). 온보딩 중 인증 흐름 없음
- 완료/스킵 시
OnboardingController.complete()→markCompleted()저장 + state=true → refreshListenable 이 redirect 재평가 → 홈. 다시 안 뜸 (재설치/스토리지 초기화 전까지) - 라우팅: 완료 →
context.go('/disclosures')(redirect 도 동일 보장) - fail-safe: seed override 누락 시 기본
true(=온보딩 skip) — 신규 사용자에게 못 보여줄 뿐, 앱에 갇히지 않음
슬라이드 구성
가치 2개를 슬라이드 2장으로. 각 장 = 실제 예시 프리뷰(hero) + 타이틀 + 설명 + 페이지 닷 + CTA. 추상 아이콘 대신 실제 결과물을 보여줘 가치를 즉시 증명(show, don't tell).
| # | hero 프리뷰 | 타이틀 | 설명 | CTA |
|---|---|---|---|---|
| S1 | AnalysisCard 미니 프리뷰 — 실제 분석 예시(정적 샘플): "AI 분석" + 긍정 badge + 요약 본문 + 핵심 포인트 2개 | 복잡한 공시, AI가 한입에 | 길고 어려운 DART 공시를 AI가 핵심만 한입 크기로 요약해드려요. | "다음" |
| S2 | 푸시 알림 배너 mock — 앱 아이콘 + "공시한입" + "삼성전자 새 공시" + 요약 한 줄 | 관심 종목 새 공시, 즉시 알림 | 관심 종목에 새 공시가 올라오면 푸시로 바로 알려드려요. | "시작하기" |
hero 프리뷰는 정적 샘플 — 라이브 데이터 X. S1 카드는 AnalysisCard SSOT 컴포넌트의 축소판(disclaimer/feedback 생략한 컴팩트 버전), S2 는 OS 푸시 배너를 흉내낸 mock. 실제 구현 시 정적 위젯으로 박아넣음(공시 데이터 fetch 안 함). 샘플 카피는 실제 분석 톤을 대표하는 깔끔한 고정값.
- 상단 우측 "건너뛰기" — S1 에 노출, 마지막 슬라이드(S2)에선 숨김(시작하기로 종료되므로 중복)
- 페이지 닷 2개 — 현재 슬라이드 active (넓은 pill)
- 슬라이드 전환: 가로 swipe + CTA 탭 둘 다 (
PageView)
동작
- S1 "다음" → S2 로 전환 (
PageView애니메이션) - S2 "시작하기" →
onboarding_completed = true저장 → 홈 진입 - "건너뛰기" (S1) → 즉시
onboarding_completed = true저장 → 홈 진입 - 가로 swipe 로도 슬라이드 이동 (마지막에서 더 swipe 해도 종료 X — CTA 로만 종료)
상태 분기
- O1. 슬라이드 1 — AI 한입 요약, "건너뛰기" 노출, CTA "다음", 닷 1 active
- O2. 슬라이드 2 — 관심 종목 알림, "건너뛰기" 숨김, CTA "시작하기", 닷 2 active
설계 결정 (왜)
- 가치 인트로형 (액티베이션형 아님) — 비로그인 우선 앱이라 첫 실행에 로그인/종목등록 강요하면 마찰. 가치만 전달하고 홈으로 보냄. 등록·로그인은 사용자가 가치를 느낀 뒤 보호 액션에서 auth-gate 로 유도
- 스킵 가능 — 마찰 최소화. 한 번 보면 다시 안 뜸
- 슬라이드 2장 — AI 요약(핵심 가치) + 관심 종목 알림(리텐션 훅) 2개만. quota("주 10회")·실시간 피드는 슬라이드에서 제외(과다 정보 회피, 본 화면에서 자연 노출)
구현 결정 (확정)
- 첫 실행 감지 → go_router
redirect+ 부트 await 주입 seed provider. (부트 스플래시 게이트 방식 기각 — redirect 가/onboarding라우트를 일급으로 두고 라우팅 일관) - hero 프리뷰 → 온보딩 전용 경량 위젯(
_AnalysisPreview/_PushPreview). 풀AnalysisCard(required bool 10+개)는 과함 → 정적 샘플엔 경량이 적합. 비주얼은 AnalysisCard 토큰(surface/border/radius/successBg) 그대로 따름 - 푸시 권한 요청 → notifications 화면 최초 진입에 위임. 온보딩 S2 는 알림 가치 소개만, 권한 팝업 X
관련 docs
- flow-auth-gate.md — 로그인은 온보딩이 아니라 보호 액션 시점 게이트가 담당
- screen-dashboard.md — 온보딩 종료 후 진입하는 홈
- screen-notifications.md — 푸시 권한 실제 요청 지점