사용자 화면 · 회원가입/로그인

약관동의 바텀시트

LOG-002 · 2026. 03. 19

화면 이름 약관동의 바텀시트
화면 위치 기능 클릭 > 로그인 진입 화면 > 소셜 로그인 > 바텀시트
화면 ID LOG-002
작성일 2026. 03. 19
LOG-002 약관동의 바텀시트
Description
1 약관동의 바텀시트
  • 노출 방식
    • 화면 하단에서 슬라이드 업 형태로 노출되는 바텀시트
    • 로그인(소셜 로그인) 최초 시도 시 자동 노출
    • 기존 가입 사용자는 미노출
    • 우측 상단 닫기(X) 버튼 클릭 시 바텀시트 닫힘
    • 바텀시트 닫힘 시 로그인/회원가입 프로세스 중단
  • 약관 동의 리스트
    • 약관 동의 항목 구성
      • 약관 전체 동의 (체크박스)
        • 클릭 시 하위 약관 항목 전체 선택/해제
      • 서비스 이용약관 동의 (필수)
        • '내용보기' 클릭 시 약관 상세 화면/웹뷰 노출
        • '내용보기' 클릭 시 약관 상세 화면/웹뷰 노출
      • 마케팅 정보 수신 동의 (선택)
        • '내용보기' 클릭 시 약관 상세 화면/웹뷰 노출
        • 필수 약관 3개 모두 선택 시에만 가입하기 버튼 활성화
        • 선택 약관은 가입 필수 조건에 포함되지 않음
    • 기본 상태: 비활성화
    • 활성화 조건
      • 만 14세 이상
      • 서비스 이용약관 동의
      • 개인정보 수집 및 이용 동의
      • 위 3개 필수 항목 모두 체크 시 활성화
      • 약관 동의 정보 저장
      • 회원가입 처리 진행
      • 로그인 성공 후 서비스 진입
    • 필수 약관 미동의 상태에서 가입하기 클릭 시
      • 가입 불가, 필수 약관 동의 토스트 메시지 노출
        • 필수 약관에 동의해주세요
    • 이전 화면(LOG-001)으로 복귀

Design Output

UI 디자인 산출물

위 스토리보드 기획을 CHAART OS 디자인 토큰으로 변환한 결과물. 실제 구현 시 참조할 최종 디자인.

9:41

차트로 시작하기.

나를 위한 단 하나의 차트.
지금 바로 로그인하고 시작해 보세요.

약관 전체 동의
만 14세 이상입니다 (필수)
서비스 이용약관 동의 (필수)
내용보기
개인정보 수집 및 이용 동의 (필수)
내용보기
마케팅 수신 동의 (선택)
내용보기
가입하기
서비스 이용약관

서비스 이용약관 내용이 표시됩니다.

개인정보 처리방침

개인정보 처리방침 내용이 표시됩니다.

마케팅 수신 동의

마케팅 수신 동의 내용이 표시됩니다.

개발 구현 가이드 — LOG-002 약관동의 바텀시트
디자인 상태
완료
최종 승인
류우상 ✅
승인일
2026-03-27

Update History

2026-03-26 01:30구현 가이드 최신화 검증 — Description 전수 대조 누락 0건, 토큰 섹션 통합 확인, 디자인 산출물 동기화 완료
2026.03.25구현 가이드 코드 동기화 확인 — 실제 코드와 가이드 내용 일치 검증 완료. 추가 변경 사항 없음.
2026.03.16구현 가이드 최신화 — Applied Design Tokens 통합, Description/디자인 산출물 기준 전면 재작성
2026.03.13개발 구현 가이드 신규 작성, Design Description 섹션 통합
Implementation Specification

1. 화면 구조 개요

  • LOG-002는 최초 소셜 로그인 시 약관 동의를 받기 위해 LOG-001 위에 노출되는 바텀시트이다.
  • LOG-001 배경(히어로 카피 + 버튼) 위에 딤 오버레이를 깔고, 하단에서 슬라이드 업으로 등장한다.
  • 구성: 핸들 바 + "약관 전체 동의" 헤더 + 개별 약관 4개 + "가입하기" CTA 버튼
  • 기존 로그인 사용자(캐싱 O)는 이 화면을 건너뛴다 → 바로 로그인 처리 후 서비스 진입

2. 레이어 구조 + 치수

# 영역 높이/위치 세부 치수
1 배경 (LOG-001 화면) 전체 화면 852px LOG-001 히어로 카피 + 소셜 버튼이 그대로 보임. pointer-events: none
2 딤 오버레이 inset:0 전체 화면, z-index:5 rgba(26,26,26,0.45) — 상태바 포함 전체 딤. opacity transition 400ms cubic-bezier(0.4,0,0.2,1)
3 바텀시트 컨테이너 bottom:0, 콘텐츠 기준 가변, z-index:6 배경: --bg #FAFAF8. 직각 R=0. transform: translateY(100%→0)
4 핸들 바 padding-top: 12px, 중앙 정렬 36x4px, rgba(26,26,26,0.12)
5 헤더 ("약관 전체 동의" + X) padding: 16px 24px flex, space-between. 하단 border: 1px solid rgba(26,26,26,0.07)
6 전체 동의 체크박스 헤더 좌측 22x22px, border: 1.5px solid --charcoal #1A1A1A. 직각 R=0. 체크 아이콘: stroke-linecap="square", stroke-linejoin="miter"
7 "약관 전체 동의" 텍스트 체크박스 우측 gap: 12px --sans Pretendard / 16px / 700 / --charcoal / letter-spacing:var(--ls-tight)
8 닫기(X) 아이콘 헤더 우측 22x22px SVG, stroke: --text-muted #888888, stroke-width:1.5, linecap="square", linejoin="miter". hover 시 stroke→--charcoal
9 약관 항목 영역 padding: 8px 24px 0 4개 항목 세로 스택
10 개별 약관 체크박스 각 항목 좌측 18x18px, border: 1.5px solid rgba(26,26,26,0.25). 직각 R=0. 체크 시 border→--charcoal
11 약관 항목 텍스트 체크박스 우측 gap: 12px --sans Pretendard / 14px / 400 / --charcoal / letter-spacing:var(--ls-normal). (필수)/(선택) 라벨: --text-muted #888888 / 12px
12 "내용보기" 링크 항목 우측 끝 --mono TASA Orbiter / 12px / --text-muted #888888 / letter-spacing:var(--ls-wide) / uppercase. hover 시 color→--charcoal
13 약관 항목 패딩 각 항목 padding: 10px 0 10px 10px 항목 간 세로 간격은 padding 기반 (10px top + 10px bottom)
14 "가입하기" CTA 버튼 padding: 20px 24px 24px 높이 50px, full-width, 직각 R=0. 폰트: --sans Pretendard / 15px / 600 / letter-spacing:var(--ls-normal) / center

3. 핵심 인터랙션 — 체크박스 연동 로직

  • "약관 전체 동의" 체크: 하위 4개 약관 항목 전부 체크
  • "약관 전체 동의" 해제: 하위 4개 약관 항목 전부 해제
  • 개별 약관 전부 체크 시: "약관 전체 동의" 자동 체크
  • 개별 약관 하나라도 해제 시: "약관 전체 동의" 자동 해제
  • 체크박스 토글 transition: check icon opacity + border-color 200ms ease
  • 약관 항목 구성:
    • 만 14세 이상입니다 (필수)
    • 서비스 이용약관 동의 (필수) → "내용보기" 링크 있음
    • 개인정보 수집 및 이용 동의 (필수) → "내용보기" 링크 있음
    • 마케팅 수신 동의 (선택) → "내용보기" 링크 있음

4. 상태 변화 — CTA 버튼

  • 비활성 (기본): background: rgba(26,26,26,0.12), color: rgba(26,26,26,0.3), cursor: default
  • 활성화 조건: 필수 약관 3개 (만 14세, 서비스 이용약관, 개인정보) 전부 체크 시. 마케팅 수신 동의는 가입 필수 조건에 포함되지 않음
  • 활성: background: linear-gradient(135deg, #961E23 0%, #B22A30 50%, #961E23 100%), color: #fff, cursor: pointer
  • 전환 모션: background + color 동시 transition 400ms cubic-bezier(0.4,0,0.2,1)
  • 클릭 시 동작 (활성 상태): 약관 동의 정보 저장 → 회원가입 처리 → 로그인 성공 후 서비스 진입 → "로그인되었습니다" 토스트

5. 네비게이션 플로우

  • 진입: LOG-001 소셜 로그인 버튼 클릭 → OAuth 인증 → 최초 사용자 → LOG-002 바텀시트 자동 노출
  • 닫기(X) / 딤 터치: 바텀시트 닫힘 → LOG-001로 복귀 (회원가입/로그인 프로세스 중단)
  • "내용보기" 클릭: 바텀시트 내부에서 약관 상세 패널 push navigation (MYP-015 연동)
  • 약관 상세 패널 뒤로가기: 패널 slide-out → 바텀시트 복귀 (체크박스 상태 보존)
  • 가입 완료: CTA 클릭 → 가입 처리 → "가입 완료!" 표시 → 시트 닫힘 → 서비스 진입

6. 에러/예외 처리

  • Case A — 필수 미동의 가입 클릭: CTA 비활성 상태이므로 터치 이벤트 무시. 활성 상태 우회 시 에러 토스트 "필수 약관에 동의해주세요"
  • Case B — 닫기(X) 후 재시도: LOG-001로 복귀. 다시 소셜 로그인 → 바텀시트 재노출. 이전 체크 상태 초기화 (모두 미체크)
  • Case C — 네트워크 오류: 가입하기 클릭 후 서버 통신 실패 → 에러 토스트 "네트워크 연결을 확인해주세요" → 바텀시트 유지, 재시도 가능
  • Case D — 중복 가입 (이미 가입된 계정): 소셜 인증 후 기존 계정 확인 → 정보 토스트 "이미 가입된 계정입니다" → 기존 계정으로 로그인 처리 후 서비스 진입
  • Case E — 내용보기 진입/복귀: "내용보기" 클릭 → iOS push nav 상세 패널 → 뒤로가기 시 체크박스 상태 완전 보존 (바텀시트 DOM 유지)
  • Case F — 백그라운드 전환: 바텀시트 상태 및 체크 상태 유지. 세션 타임아웃 시 LOG-001로 복귀

7. 모션 스펙

요소 Duration Easing Property
바텀시트 등장 500ms cubic-bezier(0.32, 0.72, 0, 1) transform: translateY(100%) → translateY(0)
바텀시트 닫힘 500ms cubic-bezier(0.32, 0.72, 0, 1) transform: translateY(0) → translateY(100%)
딤 오버레이 등장 400ms cubic-bezier(0.4, 0, 0.2, 1) opacity: 0 → 1
딤 오버레이 퇴장 400ms cubic-bezier(0.4, 0, 0.2, 1) opacity: 1 → 0
체크박스 토글 200ms ease check icon opacity + border-color
CTA 상태 전환 400ms cubic-bezier(0.4, 0, 0.2, 1) background + color 동시 전환
약관 상세 push-in 400ms cubic-bezier(0.32, 0.72, 0, 1) transform: translateX(100%) → translateX(0)
약관 상세 push-out 400ms cubic-bezier(0.32, 0.72, 0, 1) transform: translateX(0) → translateX(100%)

8. 여백·간격 요약

위치 비고
바텀시트 좌우 패딩 24px 내부 콘텐츠 마진
핸들 바 상단 padding 12px 핸들 바 위 여백
헤더 padding 16px 24px "약관 전체 동의" + X 버튼 영역
체크박스 ↔ 텍스트 gap 12px 전체 동의/개별 항목 모두 동일
약관 항목 padding 10px 0 10px 10px 각 항목별 세로 간격
약관 리스트 wrapper padding 8px 24px 0 헤더 구분선 아래 약관 항목 시작
CTA 버튼 영역 padding 20px 24px 24px 약관 리스트 아래 → CTA → 하단
CTA 버튼 높이 50px 터치 타겟 44px 이상 충족
약관 상세 패널 navbar padding 54px 24px 12px 뒤로가기 chevron + 타이틀
약관 상세 패널 본문 padding 16px 24px 34px 스크롤 가능 영역, -webkit-overflow-scrolling: touch

9. 적용 디자인 토큰

  • 바텀시트 배경: --bg → #FAFAF8, 직각 border-radius: 0
  • 딤 오버레이: --charcoal 45% → rgba(26,26,26,0.45)
  • 핸들 바: --charcoal 12% → 36x4px, rgba(26,26,26,0.12)
  • "약관 전체 동의" 타이틀: --sans / 16px / 700 → Pretendard Variable, Bold, ls: -0.02em
  • 전체 동의 체크박스: 22x22px / --charcoal 1.5px border → 직각 (R=0), check: stroke-linecap="square"
  • 개별 항목 체크박스: 18x18px / --charcoal 25% → 직각 (R=0), 미체크 상태
  • 항목 텍스트: --sans / 14px / 400 → Pretendard, ls: -0.005em
  • (필수)/(선택) 라벨: --text-muted / 12px → #888888, 항목 텍스트 뒤 인라인
  • "내용보기" 링크: --mono / 12px / --text-muted → TASA Orbiter, ls: 0.04em, uppercase
  • 닫기(X) 아이콘: 22x22 / --text-muted → stroke-linecap="square", stroke-linejoin="miter"
  • 구분선: --charcoal 7% → rgba(26,26,26,0.07), 1px solid
  • 가입하기 버튼: --red-brand gradient / 50px height → 직각, 15px font, 600 weight, 135deg gradient
  • 좌우 패딩: 24px → 바텀시트 내부 콘텐츠 마진
  • 항목 간격: 10px vertical padding → 각 약관 항목 사이 간격
  • 약관 상세 패널: position:absolute inset:0, --bg #FAFAF8, z-index:20. Navbar: chevron-left 20x20px + 타이틀 --sans 17px/700/--charcoal/ls:-0.02em. 본문: --sans 13px/--text-secondary/line-height:1.8. Home Indicator: 120x5px --charcoal R=5px
  • 토스트 (에러): bg #D32F2F / text #fff / 2.5초 auto-dismiss / bottom 24px / --sans 12px/500 / padding 10px 20px / R=0
  • 토스트 (정보): bg --charcoal #1A1A1A / text #fff / 동일 위치/사이즈/타이밍
Exception Case Test

Interactive Case Demo — 각 케이스 버튼 클릭 시 위 폰 목업에서 시뮬레이션됩니다

← 이전 화면: LOG-001 다음 화면: LOG-003 →