사용자 화면 · 회원가입/로그인
LOG-006 · 2026. 03. 19
| 2 | 비밀번호 재설정 메일발송 완료 바텀시트 |
|
Design Output
위 스토리보드 기획을 CHAART OS 디자인 토큰으로 변환한 결과물. 실제 구현 시 참조할 최종 디자인.
비밀번호 찾기
비밀번호 재설정
올바른 이메일 형식을 입력해주세요.
인증 메일이 발송되었습니다
메일함을 확인해주세요
Update History
1. 화면 구조 개요
LOG-006은 풀폰(852px) 목업이다. 비밀번호 재설정 플로우의 2개 시퀀셜 바텀시트(❶ 이메일 입력 → ❷ 발송 완료)로 구성된다. LOG-005 "비밀번호 찾기/재설정" CTA에서 진입한다. ❶은 핸들 탭·X·딤 탭으로 닫기 허용이고, ❷는 강제 확인형(핸들 바·닫기 버튼 없음, 딤 탭 차단)이다. ❶·❷ 닫기 시 모두 페이지 이동 없이 로그인 바텀시트(id=loginSheet)가 인라인으로 복귀한다.
2. 레이어 구조 + 치수
| # | 영역 | 높이/위치 | 비고 |
|---|---|---|---|
| 1 | 배경 (LOG-003 홈+로그인 화면) | 전체 화면, id="homePreview" | pointer-events:none. 홈 카드 섹션 + 탭바 포함. |
| 2 | 딤 오버레이 | inset:0, z-index:25, rgba(26,26,26,0.45) | id="log006Dim". ❶ 열림 상태: 딤 탭 → 시트 닫힘. ❷ 열림 상태: 딤 탭 무시 (pointer-events:none). ❶·❷ 모두 닫힌 후 로그인 시트 열릴 때 딤 유지. |
| 3 | 로그인 바텀시트 (복귀용) | bottom:0, z-index:28, 초기 translateY(100%) 숨김 | id="loginSheet". ❶ 또는 ❷ 닫기 후 350ms 딜레이 → 슬라이드업 등장. 이메일/비밀번호 입력 인터랙티브, X 닫기(id=loginCloseBtn) 제공. 이메일 에러(id=loginEmailError) display:none/block 방식. X 닫기 → 딤 opacity:0, pointer-events:none. |
| 4 | ❶ 비밀번호 재설정 바텀시트 | bottom:0, z-index:28, 초기 translateY(0) 표시 | id="sheet1". 핸들 바(id=sheet1Handle) + X 닫기(id=sheet1Close). 타이틀 + 이메일 입력(id=resetEmail) + 에러(id=resetEmailError, visibility:hidden/visible 방식) + 전송 버튼(id=resetCta). |
| 5 | ❷ 발송 완료 바텀시트 | bottom:0, z-index:28, 초기 translateY(100%) 숨김 | id="sheet2". 강제 확인형 — 핸들 바 없음, X 없음. Lucide mail SVG 아이콘 + 타이틀 + 안내문구 + 확인 버튼(id=sheet2Confirm). |
3. 핵심 인터랙션
/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/ 실시간 검사. 오류 시 에러 메시지(id=resetEmailError) visibility:visible + borderColor:var(--red-brand). 통과 시 전송 버튼(id=resetCta) opacity:1/pointer-events:auto, dataset.enabled='true'.var(--charcoal) (단, 빈 입력 또는 유효한 경우에만 — 에러 상태면 유지)translateY(-20px) + opacity:0 (200ms ease-in) → 210ms 후 ❶ display:none + ❷ translateY(100%) → translateY(0) (400ms, var(--ease-ios-spring)) + dim.pointerEvents:none (❷ 강제 확인형)translateY(100%)+opacity:0 (300ms ease-in) → 딤 유지(로그인 시트 위해) → 350ms 후 로그인 시트(openLoginSheet) 슬라이드업translateY(100%) (300ms ease-in) + dim.pointerEvents:auto → 350ms 후 ❶ 상태 리셋(display:'', opacity:1, transform:translateY(100%), resetEmail.value='', resetEmailError visibility:hidden, borderColor:var(--border-strong)) + 로그인 시트(openLoginSheet) 슬라이드업. 페이지 이동 없음.4. 상태 변화
5. 네비게이션 플로우
6. 에러/예외 처리
fail@test.com → 1.2초 후 에러 토스트 "이메일 발송에 실패했습니다. 다시 시도해주세요." + 버튼 텍스트 "전송" 복원 + updateResetCtaState() 재호출var(--color-error-toast), text:var(--bg), 폰 내부 bottom:24px, border-radius:0, 2.6초 fade-out, 바텀시트 유지var(--color-error-toast) / 정보 bg:var(--charcoal), text:var(--bg), position:absolute bottom:24px left:50% transform:translateX(-50%), z-index:50, border-radius:0, 2.6초 후 opacity:0, 3초 후 DOM 제거7. 모션 스펙
translateY(100%) + opacity:0, 300ms, ease-in (transform·opacity 동시)translateY(-20px) + opacity:0, 200ms ease-in → 210ms 후 ❶ display:none + ❷ translateY(0), 400ms, var(--ease-ios-spring)translateY(100%), 300ms, ease-in → 350ms 후 ❶ 리셋 + 로그인 시트 등장translateY(0), 400ms, var(--ease-ios-spring)translateY(100%) (transition 미지정, 즉시) + dim opacity:0, pointer-events:none8. 여백·간격 요약
| 구간 | 값 |
|---|---|
| ❶ 핸들 바 상단 여백 | padding-top:12px |
| ❶ X 닫기 위치 | position:absolute top:16px right:20px, padding:4px |
| ❶ 콘텐츠 패딩 | 20px 24px 0 |
| ❶ 타이틀 → 입력 필드 | margin-bottom:16px |
| ❶ 입력 필드 높이 | 48px |
| ❶ 에러 메시지 영역 | margin:6px 0 0, height:18px (레이아웃 고정, visibility 방식) |
| ❶ 전송 버튼 패딩 | padding:24px 24px 0 |
| ❶ 하단 여백 | padding-bottom:32px |
| ❷ 콘텐츠 패딩 | 48px 24px 0 |
| ❷ 아이콘 → 타이틀 | margin-bottom:16px (아이콘 wrapper) |
| ❷ 타이틀 → 안내문구 | margin-bottom:8px |
| ❷ 안내문구 → 확인 버튼 | margin-bottom:40px |
| 버튼 높이 (공통) | 50px (.sb-dp-cta) |
| 좌우 패딩 (공통) | 24px |
9. 적용 디자인 토큰
--bg → #FAFAF8, border-radius:0 (R=0)--sans var(--size-xl-font) 700, --charcoal, left-align (실제 코드: .sb-dp-modal__title style 인라인 text-align:left)var(--alpha-8), border:1px solid var(--border-strong), focus → borderColor:var(--charcoal), R=0var(--text-xs) font-size, color:var(--red-brand), visibility:hidden/visible 방식 (레이아웃 shift 방지).sb-dp-cta, --cta-gradient bg, height:50px, R=0var(--alpha-12) → rgba(26,26,26,0.12)var(--text-muted), 1.5px, stroke-linecap:square, stroke-linejoin:mitervar(--red-brand), stroke-linecap:square--sans var(--size-xl-font) 700, --charcoal, center, --ls-tight--sans var(--size-md-font) 500, --text-secondary, center, --ls-normal.sb-dp-cta, --cta-gradient bg, height:50px, R=0var(--size-xs-font) 12px, color:var(--red-brand), display:none/block 방식 (레이아웃 shift 허용)