F1 · P0

랜딩

URL
/
테마
다크 (Press Black #111111, 그라데이션 + 노이즈 스냅샷)
인증
불필요 (퍼블릭)
역할
진입 + 업로드 CTA · 미인증 사용자의 첫 접점
페르소나 진입
김민경 · 구글 검색 "AI 교정 정확도", "한국어 교정 GPT" 후 유입. 첫 5초에 "한국어인가, HWP 되는가, 안 틀리나"를 판단하고 카드 닫음·열음을 결정
핵심 결정
업로드 시작 (인증 게이트 → 로그인 모달) · 가격 확인 (/pricing) · 소개 확인 (/about)

헤더 상태 변형

guest · authenticated

랜딩은 로그인 이전과 로그인 이후의 우측 헤더가 달라진다. 디자인 리뷰용 해시 #state-guest, #state-authenticated로 상태를 고정하고, 헤더 확인용으로 1920×360 프리뷰만 별도 제공한다.

로그인 전 헤더

guest · 로그인 링크

로그인 후 헤더

authenticated · desktop 알림/사용자/라이브러리 · mobile 라이브러리

레이아웃 · 3 뷰포트

desktop · tablet · mobile

데스크톱은 1920×1080 기준. 태블릿은 iPad Pro 11" 가로 기준 1024. 모바일은 375. 핀을 클릭하면 하단 명세표의 해당 행이 강조됩니다.

요소 명세

spec · 10 elements
영역 컴포넌트 동작 · 카피 · 데이터 비고
0 상단 인라인 배너 .coupon-inline-banner · [data-coupon-banner-close] 랜딩 전용 · 헤더 위 문서 흐름 안에 배치해 topnav를 아래로 밀어냄
배경: 검은색 계열 (#050505) · 운영 링크: https://editorial.kr/coupon/sibf2026gift
로컬 프로토타입 테스트 링크: editorial-settings.html?coupon=SIBF2026GIFT&from=landing-banner#coupon
카피: 2026 서울국제도서전 한정 혜택 · 쿠폰 등록하기
우측 X 버튼으로 닫기 가능
다른 페이지에는 노출하지 않음. QR 코드는 배너와 동일한 운영 링크(https://editorial.kr/coupon/sibf2026gift)로 연결. 비로그인 닫기: 현재 페이지에서만 숨김(새로고침 시 재노출) · 로그인 닫기: 24시간 숨김 · SIBF2026GIFT 적용 완료 시 영구 숨김
1 탑 내비 — 워드마크 .logo-wm · 26px 카피: editorial (소문자, Magnolia Script)
동작: 클릭 시 / (자기 자신, no-op)
접근성: aria-label="editorial 홈"
다크 배경 → 색 #FFFFFF. 폰트 미로드 시 Sacramento 폴백
2 탑 내비 — 메뉴 a.links · 14px/500 링크: 소개/about · 가격/pricing
hover: 색 #FFFFFF (rgba 70% → 100%) · 120ms
현재 페이지: 활성 표시 없음 (랜딩은 워드마크가 활성 시그널)
"플랜"이 아닌 "가격" — 통신사 어휘 회피. 핸드오프 §4.1
3 탑 내비 — 인증 상태 액션 guest: a · authenticated: .landing-user-actions + a 로그인 전: 로그인 텍스트 링크 → /login (독립 페이지)
로그인 후: 데스크톱/태블릿은 알림 아이콘 + 사용자 칩 민 김민경 + 라이브러리 링크 → /library
모바일 768 미만: 알림 아이콘과 사용자 칩 숨김, 라이브러리 링크만 유지
디자인 리뷰 해시: #state-guest · #state-authenticated
업로드 카드가 더 강한 진입점이므로 로그인 전 우측은 절제. 로그인 후에는 작업 복귀 경로를 명확히 노출
4 히어로 — 헤드라인 h1.headline · 48/800 고정부: 교정·교열·윤문, (#FFFFFF)
회전부 3종 (Tiger Orange, 마침표 없음):
· 미묘한 표현 하나까지
· 사소한 문장 하나까지
· 원고 전체를 한번에
사이클: hold 3000ms + transition 300ms · 위→아래 슬라이드 + 페이드
접근성: aria-live="polite"
핸드오프 §4.4. "편집자의 첫번째 시선" 삭제 확정. reduced-motion 시 첫 문장 정적 노출
5 히어로 — 서브 카피 p.sub-copy · 16/500 카피: 일관성 분석부터 교정 제안, 원고 주석까지 보고서로 한번에
색 rgba(255,255,255,.7), 한 줄
임시 카피 (핸드오프 §7.3 · §13). UX 라이팅 라운드에서 확정 필요
6 업로드 카드 — 드롭존 .dropzone--dark 메인 카피: 원고를 드래그하거나 클릭하여 업로드
포맷 배지: PDF · DOCX · HWP · HWPX (HWP·HWPX는 Tiger Orange 액센트)
헬퍼 (드롭존 내부): 최소 1,000자. 비밀번호 PDF는 해제 후 업로드해주세요.
hover/focus-visible: border Tiger Orange · bg rgba(249,104,21,.08)
클릭 또는 Enter/Space → 업로드 플로우 진입
현재 구현: 랜딩 드롭존 클릭은 데모 원고 미공개 단행본 — 김작가 원고.hwp가 선택된 상태로 처리
시스템 인포 메시지(최소 글자수, PDF 잠금)는 드롭존 박스 안에 동반. HWP·HWPX 강조로 한국어 출판 시그널
7 업로드 카드 — CTA .btn.btn--lg.btn--d-primary 카피: 분석 시작 + ri-arrow-right-line
배경 Tiger Orange · 텍스트 Press Black · 너비 100%
클릭 → 미인증이면 로그인 모달 호출, 인증 후 업로드 ① 원고 선택 모달로 진행
드롭존과 달리 CTA 클릭은 파일 미선택 상태로 시작하므로 업로드 ①의 다음 버튼은 disabled
다크 테마 d-primary 규칙 — "랜딩의 액센트 광원이 곧 CTA"
8 업로드 카드 — 디스크립션 슬롯 .description · 12.5px · check-item × 3 체크포인트 3종 (각 항목 = ri-check-line 14px Tiger Orange + 라벨):
· 교정·교열·윤문 보고서
· 주석 교정본 원본 포맷
· 교정마다 근거 표시
성격: 서비스 결과물 명시 (시스템 인포 아님)
레이아웃: flex-wrap, 가로 정렬 + 모바일에서 줄바꿈
핸드오프 §4.5 신설 슬롯. 카피 임시 (§13) — 결과물 형태 중심. 시스템 인포는 드롭존 안으로 이관
9 최소 푸터 footer.foot · 12px 카피: 주식회사 북엔드 · 이용약관 · 개인정보처리방침 · 사업자정보
탑 보더 rgba 12%, 색 rgba 40%, 1줄 (데스크톱·태블릿) / 4줄 (모바일)
핸드오프 §7.3 — 데스크톱·태블릿에서 뷰포트 밖(820 아래). 모바일은 콘텐츠 종료 후 자연스럽게 노출

공통 알림 패널 상세

global · queue status

알림은 원고 교정 공정이 몇 분 동안 백그라운드로 진행되는 문제를 보완하는 전역 상태 피드백이다. 로그인 후 데스크톱·태블릿 화면에서는 공통 상단바에 붙고, 모바일 앱 셸에서는 상단바 밀도를 낮추기 위해 햄버거 패널 상단의 알림 아이콘으로 이동한다. 사용자가 라이브러리·보고서·설정·결제 어느 화면에 있든 업로드/완료/실패/취소/시스템 공지를 확인할 수 있어야 한다.

구분컴포넌트·데이터동작·카피비고
N1 진입점 데스크톱 상단바 .icon-btn · 모바일 .mobile-drawer-head 알림 아이콘 로그인 상태에서만 노출. 모바일 기본 상단바에서는 숨기고 햄버거 패널 상단으로 이동한다. 읽지 않은 알림이 1개 이상이면 Tiger Orange dot 배지를 표시하고 숫자 카운트는 쓰지 않는다. 로그아웃·랜딩 guest 상태에서는 알림 아이콘 미노출
N2 패널 레이아웃 .ed-notification-panel · .mobile-drawer-notifications 데스크톱은 아이콘 클릭 시 약 320px anchored panel을 열고 다시 클릭 시 닫힘. 모바일은 햄버거 패널 안에서 본문이 알림 리스트로 전환되며, 헤더 알림, 아이콘형 뒤로가기, 읽지 않은 항목이 있을 때만 모두 읽음 버튼을 노출한다. 하단 설명 문구는 두지 않는다. 모바일은 패널 위 패널을 만들지 않고 같은 드로어 안에서 전환
N3 항목 구조 .ed-notification-item 좌측 unread dot + 본문 + 삭제 버튼 2컬럼. 본문 첫 줄은 박스 없는 인라인 유형 아이콘(옵션 A) · 유형명 · 경과 시간. 다음 줄은 문서명 ellipsis, 마지막 줄은 기본 안내 메시지 1줄 말줄임. 긴 문서명은 말줄임. 알림이 수십 건 누적되면 패널 내부 세로 스크롤
N4 유형 uploaded · completed · failed · cancelled · system uploaded: 문서가 업로드되어 새로운 작업이 시작되었습니다.
completed: 교정 작업이 완료되었습니다. 보고서를 확인해 주세요.
failed: 문서 분석 중 오류가 발생했습니다. 다시 시도해 주세요.
cancelled: 작업이 취소되었습니다.
system: 운영 관리자가 입력한 공지 메시지
시스템 공지는 message, 선택값 link_url, link_target 사용
N5 시간 표기 created_at 기반 relative time 0~59초 방금 전 · 1~59분 N분 전 · 1~23시간 N시간 전 · 1~6일 N일 전 · 7일 이상 YYYY-MM-DD 사용자 로컬 타임존 기준
N6 읽음·삭제 hover/read all/delete 데스크톱은 알림 항목 hover 시 개별 읽음 처리. 모바일은 hover가 없으므로 햄버거 패널 안의 알림 리스트 노출 시점에 보이는 unread 항목을 읽음 처리. 모두 읽음은 전체 unread를 읽음으로 변경, 삭제 X는 목록에서 즉시 제거. 낙관적 적용. 서버 실패 시 롤백하고 일시적 오류가 발생했습니다 토스트
N7 클릭 이동 notification route mapping completed → 해당 결과 보고서. uploaded/failed/cancelled → 라이브러리. system → link_url이 있으면 이동하고 없으면 이동 없음. 실패·업로드·취소의 문서 강조/필터링은 후속 고도화
N8 큐 연동 queue_id + 상태 변화 이벤트 최초 업로드 시 uploaded 생성. 대기→진행 중 전환은 피로도를 줄이기 위해 알림 생략. 완료/오류/사용자 취소 시 각각 completed/failed/cancelled 생성. 재실행은 동일 문서라도 별도 queue_id로 알림 누적. HTML 검증 샘플은 ?notifications=seed로 재주입
N9 빈 상태 .ed-notification-empty 알림이 0건이면 알림이 없습니다만 노출하고 모두 읽음은 숨긴다. 모든 알림이 읽음이면 진입점 dot과 패널의 모두 읽음을 숨긴다. 읽음 상태 항목은 opacity와 weight로만 약하게 구분

페이지 전체 규칙

background · motion · responsive
그리드
데스크톱 12col · gutter 24 · margin 48 / 태블릿 8col · gutter 24 · margin 32 / 모바일 4col · gutter 16 · margin 16
배경 · 그라데이션
Press Black 베이스 → Warm Black → Ink Black 사선 그라데이션 위에 광원 3개. Tiger Orange 2개(좌상 미토콘드리아, 우상 젤리빈) + Tiger Red 1개(하단 콩). 색은 섞이지 않고 분리. SVG path + feGaussianBlur로 비대칭 유기체 형태
배경 · 모션
블롭 드리프트 — 광원 3개 각각 19s~28s alternate, translate ±3%, scale 0.94~1.10, rotate ±8°. 의식적으로 인지되지 않는 미세한 유기체 운동. reduced-motion 시 정지
배경 · 노이즈
SVG feTurbulence (baseFrequency 0.9, octaves 2) · Ivory Paper #F7F0DF 15% 알파 · mix-blend-mode screen. 정적
모션 원칙
다이내믹 부하 원칙: 한 화면에 동시 활발한 모션은 1개. 블롭 드리프트는 거의 정적 수준이므로 헤드라인 회전부와 공존 허용
인증 게이트
업로드 시도 → 미인증이면 랜딩 내장 로그인 모달 → 인증 완료 → 업로드 5단계 모달 진입 (컨텍스트 유지). 드롭존 진입은 데모 원고 선택 상태를 보존하고, CTA 진입은 원고 미선택 상태로 시작한다. 헤더 상태 해시 #state-guest · #state-authenticated, 플로우 해시 #flow-login · #flow-upload-1~#flow-upload-5 지원
스크롤
데스크톱·태블릿: 뷰포트 내 모든 콘텐츠 노출 (스크롤 없음 → 푸터 보려면 스크롤). 모바일: 자연 스크롤
키보드 · 접근성
Tab 순서: 워드마크 → 메뉴(소개·가격) → 로그인 → 드롭존(role=button) → 분석 시작. 드롭존 Enter/Space로 파일 선택 다이얼로그
드롭다운 — 모바일
현재 모바일에서 메뉴는 inline 노출 유지 (소개·가격 2개뿐). 메뉴 항목 증가 시 햄버거 도입 검토
SEO · OG
<title> editorial · 교정·교열·윤문 / OG 이미지: 워드마크 + 다크 그라데이션 스냅샷 / description: 서브 카피 그대로

미결 사항

open
  • 서브 카피 최종 확정 (임시) — UX 라이팅 라운드
  • 업로드 카드 하단 디스크립션 카피 확정
  • 랜딩 내장 업로드 플로우와 공용 모달(editorial-modals.html)의 소스 일원화 방식 — 현재 구현은 window.edOpenUploadFlow가 있으면 공용 플로우를 우선 호출하고, 없으면 랜딩 내장 플로우로 폴백
  • 모바일 햄버거 도입 시점 — 메뉴 3개 이상 늘어날 때
  • OG 이미지 디자인 — 다크 그라데이션 스냅샷 + 워드마크
  • 그라데이션 블롭 시드 — 정적 1종 vs 새로고침 랜덤 (핸드오프 §7.2)

F2 · P0

로그인

URL
/login
테마
다크 (랜딩과 동일 배경)
인증
불필요 (인증 게이트)
역할
SSO 3종 또는 이메일/비밀번호로 인증. 독립 페이지(직접 진입) + 로그인 모달(인앱 액션 시) 두 형태
페르소나 진입
김민경 · 첫 시도: 랜딩에서 "분석 시작" 클릭 → 로그인 모달. 재방문: 북마크 또는 알림 메일 클릭 → /login 직접 진입. SSO 우선 (카카오 로그인 익숙)
핵심 결정
SSO 진입(3종 중 1) · 이메일 로그인 · 회원가입 · 비밀번호 찾기

레이아웃 · 3 뷰포트

desktop · tablet · mobile

독립 페이지 형태. 랜딩과 같은 배경(다크 + 블롭 + 노이즈) 위에 중앙 정렬 카드. 별도 카드 컨테이너 없이 콘텐츠가 배경 위에 직접 올라감 — 워드마크가 화면의 무게 중심.

요소 명세

spec · 10 elements
영역컴포넌트동작 · 카피 · 데이터비고
1 탑 내비 — 워드마크 a.mark · 26px 카피: editorial (Magnolia Script, 소문자)
클릭 → / (랜딩) — 인증 전 컨텍스트
랜딩과 동일 컴포넌트
2 탑 내비 — 메뉴 a.links 링크: 소개/about · 가격/pricing
hover: 색 rgba 70% → 100%
랜딩과 동일
3 탑 내비 — 로그인 (현재) a.is-active 카피: 로그인 (현재 페이지) · 색 #FFFFFF (활성 표시)
클릭 → /login (현재 자기 자신, no-op)
활성 표시는 색만 — 언더라인이나 배경 없음
4 콘텐츠 워드마크 h1.login-mark · 52px 카피: editorial (Magnolia Script, 화면의 무게 중심)
중앙 정렬, 폼의 aria-labelledby 타깃
부가 카피 없음 — 워드마크가 유일한 브랜드 터치포인트
핸드오프 §8.2 "워드마크가 유일한 브랜드 터치포인트". 탑 내비 워드마크(26px)보다 2배 크게
5 SSO 버튼 3종 .btn-social × 3 순서: 카카오 → 네이버 → Google
· 카카오로 시작 — #FEE500 · #191919
· 네이버로 시작 — #03C75A · #FFFFFF · 커스텀 N
· Google로 시작 — #FFFFFF · #1F1F1F · ri-google-fill (#4285F4)
높이 44, 풀 너비, weight 650
현재 구현: 클릭 시 버튼 라벨 연결 중 + 스피너 후 데모 인증 상태 저장, ?next= 또는 기본 editorial-library.html로 이동
제품 의도: 각 SSO OAuth 리디렉트
핸드오프 §8.2 · 디자인 시스템 §21 social. "~로 시작" 통일 (SSO 가입·로그인 통합 동사)
6 디바이더 .divider-text 카피: 또는
양쪽 라인 (rgba 12%) + 중앙 텍스트 (rgba 40%)
aria-hidden="true" — 스크린리더 건너뜀
핸드오프 §8.2 · 디자인 시스템 §19 divider. 시각적 분리만 — 의미 없음
7 이메일 / 비밀번호 인풋 .input-d × 2 플레이스홀더: 이메일 · 비밀번호
높이 44, 라벨은 visually-hidden (sr-only)
autocomplete: email · current-password
focus: border Tiger Orange + ring rgba(249,104,21,.22)
에러: border #DC2626 + 메시지 (인풋 아래)
핸드오프 §8.2. 가시 라벨 없음 — 플레이스홀더와 폼 컨텍스트로 충분 (워드마크 + 로그인 페이지 = 의미 명확)
8 로그인 CTA .btn-login 카피: 로그인
Tiger Orange fill + Press Black text · 높이 44 · 풀 너비
hover: White fill + Press Black text
type="submit" — Enter 키로 제출 가능
현재 구현: 이메일 형식 + 비밀번호 입력 여부만 클라이언트 검증 후 데모 인증 상태 저장, ?next= 또는 기본 editorial-library.html로 이동
실패/불일치 응답은 서버 연동 후 인라인 alert로 확장
다크 테마 d-primary 규칙
9 하단 링크 .bottom-links · 회원가입/signup
· 비밀번호 찾기/reset-password
가운데 dot 구분, rgba 70%, 클릭 시 White
핸드오프 §8.2. 두 링크 모두 동등한 가중치 — 별도 강조 없음
10 법적 푸터 footer.foot 카피: 주식회사 북엔드 · 이용약관 · 개인정보처리방침 · 사업자정보
중앙 정렬, 한 줄, rgba 40%
탑 보더 rgba 12%
인증 전 화면 공통 푸터와 맞춤. 회사명은 bookend.tech 외부 링크

모달 변형

in-app variant

독립 페이지와 동일 구조를 모달로 래핑. 미인증 상태에서 인앱 액션(랜딩 분석 시작, 보고서 공유 등) 클릭 시 호출. 탑 내비 없음, 현재 페이지 컨텍스트는 백드롭 뒤에 유지.

호출 트리거
랜딩 분석 시작 클릭 · 미인증 상태 보고서 진입 시도 · 공유 링크 외부에서 접속 시
구조 차이
탑 내비 제거 · 워드마크는 모달 헤더 자리에 32px로 축소 · 푸터 제거 · 모달 사이즈 md(560) · 닫기 X 우상단
인증 후
모달 닫고 호출 시점의 액션 자동 재개 (컨텍스트 유지). 예: 랜딩 분석 시작 → 모달 로그인 → 업로드 모달로 즉시 진입
모달 vs 독립 페이지 선택
인앱 액션 진입 → 모달 / 직접 URL 진입(/login) · 알림 메일 링크 · 북마크 → 독립 페이지
현재 반영 상태
M 섹션의 editorial-modals.html#login에 최신 모달 시안이 반영됨. 랜딩 내장 로그인 플로우도 동일한 소셜 로그인·이메일 폼·회원가입/비밀번호 찾기 구조를 사용한다.

페이지 전체 규칙

layout · interaction · validation
그리드
중앙 정렬 단일 컬럼 · 카드 너비 360 (max-width) · 모바일 320
배경
랜딩과 동일 — 다크 그라데이션 + 블롭 드리프트 + 노이즈. 새로고침마다 시드 변경 없이 동일
키보드
Tab 순서: SSO 3 → 이메일 → 비밀번호 → 로그인 CTA → 회원가입 → 비밀번호 찾기. Enter 키로 폼 제출
검증
현재 구현: 이메일 형식 미준수 → 인풋 에러 + 올바른 이메일 형식이 아닙니다 · 비밀번호 빈 값 → 비밀번호를 입력해주세요. 서버 인증 실패/비밀번호 길이 정책은 API 연동 시 추가
로딩 상태
로그인 CTA 클릭 → 버튼 라벨 로그인 중 + 스피너 14px · 인풋 disabled · 응답 대기 평균 ~600ms
SSO 진입
현재 구현: SSO 버튼 클릭 → 연결 중 로딩 700ms → 데모 인증 저장 → 의도 URL 이동. 제품 구현 시 외부 OAuth 리디렉트 · 콜백 URL /auth/callback/:provider · 신규 사용자는 약관 동의 화면 1회 거침
의도된 다음 페이지
URL 파라미터 ?next= 처리 · 기본값 /library · 보호 페이지에서 리디렉트된 경우 원래 의도 URL로 복귀
모션
배경 블롭 드리프트만. 페이지 진입 시 콘텐츠 fade-in 200ms (reduced-motion 시 즉시 노출)

미결 사항

open
  • SSO 신규 사용자 약관 동의 화면 (1회) — 별도 화면 vs 모달 vs 인라인
  • 로그인 후 의도 URL 복귀 규칙은 현재 ?next=로 구현됨 — 허용 도메인/오픈 리다이렉트 방지 검증 필요
  • 이메일 미인증 사용자 처리 — 인증 메일 발송 안내 화면
  • "이메일 기억하기" 체크박스 도입 여부 — 페르소나 회사 PC + 개인 맥북 분리 사용
  • 비밀번호 표시 토글 — 디자인 시스템 §7 input--password 패턴 적용 검토
  • SSO 실패 시 폴백 UX — 토스트 vs 인라인 alert vs 리트라이

F2.2 · P1

회원가입

URL
/signup
테마
다크 (로그인과 동일 셸)
인증
불필요 (인증 게이트)
역할
신규 사용자 계정 생성. SSO 3종 또는 이메일/비밀번호. 가입 직후 이메일 인증 화면(F2.4)으로 자동 이동
페르소나 진입
김민경 · 첫 시도에서 랜딩 → 로그인 → "회원가입" 링크. 페르소나는 회사 메일이 아닌 개인 Gmail을 선호 (퇴사 시 자료 유실 우려)
핵심 결정
SSO 진입(3종 중 1) · 이름 입력 · 이메일 가입 · 약관 동의 · 마케팅 수신 동의 여부

상태 변형

2 states

로그인과 동일한 셸(다크 배경 + 워드마크 + 360 너비 무카드 스택). 차이는 콘텐츠 — 이름 인풋, 비밀번호 확인 인풋 1개 추가, 약관 동의 3행, "가입하기" CTA. 검증 에러 상태는 인풋 보더 빨강 + 인라인 메시지 + CTA disabled. 상태별 시안은 전환 탭이 아니라 독립 프리뷰로 모두 노출한다.

State 1 · 기본

empty · #state-1

State 2 · 검증 에러

error · #state-2

요소 명세 — 로그인 대비 신규/변경

spec · diff

탑 내비, 워드마크, SSO 3종, 디바이더, 푸터는 로그인(F2)과 동일. 아래는 회원가입에서 새로 등장하거나 달라진 요소만.

영역컴포넌트동작 · 카피 · 데이터비고
1 탑 내비 — 우측 링크 a (default) 카피: 로그인/login
is-active 아님 (rgba 70%) — 현재가 회원가입이라 로그인이 다음 액션
F2와 반대 활성 규칙
2 페이지 헤드 .auth-head H1: 회원가입 · 17px / 650
보조: 무료 5,000 크레딧으로 시작하세요 · 13.5px / 500 · d-text-2
로그인에는 없는 페이지 헤드 (워드마크 단독으로 충분치 않음 — 가입은 추가 컨텍스트 필요)
3 이름 인풋 .input-d + .field-help 플레이스홀더: 이름
name: display_name · autocomplete: name
하위 헬프: 프로필과 안내 화면에 표시될 이름입니다
검증: 빈값이면 이름을 입력해주세요
가입 완료 인사와 프로필 표시 이름의 출처. 이메일 인증 완료 화면에서 {이름}님으로 사용
4 비밀번호 인풋 + 헬프 .input-d + .field-help 플레이스홀더: 비밀번호 (8자 이상)
하위 헬프: 영문·숫자·특수문자 중 2가지 조합, 8자 이상 · 11.5px / d-text-3
autocomplete: new-password
로그인은 헬프 없음 (현재 비밀번호 입력이라 규칙 불필요)
5 비밀번호 확인 인풋 .input-d 플레이스홀더: 비밀번호 확인
autocomplete: new-password
검증: 위 비밀번호와 일치해야 통과
신규
6 약관 동의 — 전체 .check-row.is-all 카피: 전체 동의 · 13.5px / 650
체크박스 18px · 체크 시 Tiger Orange
하단 1px 보더로 시각 구분 · 클릭 시 하위 2개 토글
한국 가입 패턴 — "전체 동의" 헤더 행
7 약관 동의 — 필수/선택 .check-row × 2 · [필수] 만 14세 이상이며 이용약관·개인정보처리방침에 동의합니다
· [선택] 마케팅 정보 수신·할인 쿠폰 알림에 동의합니다
[필수] 라벨: Tiger Orange · 650
[선택] 라벨: d-text-3 · 500
약관·개인정보처리방침 텍스트는 인라인 a 링크 (밑줄 d-border-strong)
현 라운드 v1.0: 필수 약관 1행 통합 (이용약관+개인정보+14세). 외부 제공·국외 이전 등 분리 동의는 v1.2에서 결정 (미결)
8 가입 CTA .btn-primary-d 카피: 가입하기
Tiger Orange fill · 높이 44 · 풀 너비
disabled 조건: 이름 미입력 / 필수 약관 미체크 / 비밀번호 미일치 / 비밀번호 규칙 미충족 / 이메일 형식 불일치
현재 구현: 성공 시 이름·이메일을 데모 인증에 저장 후 editorial-verify-email.html#state-2로 이동
제품 의도: 가입 성공 후 /verify-email state 1(메일 발송됨)로 이동
F2.4로 자동 이동
9 하단 CTA .bottom-cta 카피: 이미 계정이 있나요? 로그인
"로그인" 인라인 a · 밑줄 · 클릭 → /login
F2의 "회원가입 · 비밀번호 찾기" 위치와 대응 (역방향)
10 검증 에러 — 인풋 .input-d.is-error + .field-help.is-error 보더: #DC2626 · ring rgba(220,38,38,.22)
헬프: #FCA5A5 · 앞에 ri-error-warning-fill
카피 예: 올바른 이메일 형식이 아닙니다 · 비밀번호가 일치하지 않습니다
state 2에서만
11 검증 OK — 인풋 헬프 .field-help.is-ok 색: #86EFAC · 앞에 ri-checkbox-circle-fill
카피: 안전한 비밀번호입니다
비밀번호 입력 중 실시간 평가 — 규칙 충족 시점에 노출
긍정 피드백 — 페르소나가 가입 폭주을 느끼지 않게

페이지 전체 규칙

layout · interaction · validation
그리드
로그인과 동일 — 중앙 단일 컬럼 · 360 (모바일 320)
키보드
Tab 순서: SSO 3 → 이름 → 이메일 → 비밀번호 → 비밀번호 확인 → 전체 동의 → 필수 → 선택 → 가입 CTA → 로그인 링크
실시간 검증
이름: 빈값 검증 · 이메일: blur 시 형식 검증 · 비밀번호: keyup 시 규칙 평가 (8자 + 2가지 조합) · 비밀번호 확인: keyup 시 일치 검증 — 모두 충족 시 CTA 활성화
이메일 중복
현재 구현 없음. 후속 구현: blur 시점 서버 조회 · 중복 시 인풋 빨강 + 이미 가입된 이메일입니다. 로그인하시겠어요? + 인라인 "로그인" 링크
비밀번호 강도
규칙 미충족: 인풋 빨강 + 영문·숫자·특수문자 중 2가지 이상 조합, 8자 이상 · 규칙 충족: 헬프 텍스트 green + 안전한 비밀번호입니다
약관
"전체 동의" 클릭: 하위 2개 모두 토글 · 하위 모두 체크: "전체 동의" 자동 체크 · 필수만 체크해도 가입 가능 (선택은 마케팅 수신만)
SSO 가입
현재 구현: SSO 버튼 클릭 → 연결 중 로딩 → 데모 인증 저장 → 이메일 인증 완료 상태로 이동. 제품 구현에서는 SSO 신규 사용자 약관 동의 화면 1회 필요
가입 성공
현재 구현: 데모 가입 성공 → 입력한 이름과 이메일 저장 → editorial-verify-email.html#state-2. 제품 구현: 가입 API 200 → display_name 저장 → /verify-email state 1 리디렉트(메일 자동 발송 + 안내) · 5,000 크레딧 지급은 인증 완료 시점

미결 사항

open
  • 약관 분리 — 외부 제공·국외 이전·만 14세 분리 동의 항목 필요 여부 (법무 검토)
  • 약관 본문 모달 — [필수] 항목 클릭 시 본문 모달 vs 별도 페이지
  • SSO 신규 사용자 약관 동의 화면 — 별도 화면 vs 모달 vs 인라인
  • 회사 이메일 도메인 차단 여부 — 페르소나는 개인 Gmail 선호하나 회사 가입 케이스 처리
  • 5,000 크레딧 지급 시점 — 가입 즉시 vs 이메일 인증 후 (현재 안: 인증 후)
  • 비밀번호 표시 토글 — 디자인 시스템 §7 input--password 적용 검토
  • 가입 직후 온보딩 — 첫 업로드 가이드 vs 빈 라이브러리

F2.3 · P1

비밀번호 찾기

URL
/reset-password (state 1·2) · /reset-password/confirm?token=... (state 3)
테마
다크 (로그인과 동일 셸)
인증
불필요
역할
비밀번호 잊은 사용자가 가입 이메일로 재설정 링크를 받아 새 비밀번호 설정
페르소나 진입
김민경 · 회사 PC와 개인 맥북 분리 사용 → 환경 바뀔 때 비밀번호 미저장. SSO 우선이라 이메일 로그인 비빈도 → 비밀번호 잊을 가능성 ↑
핵심 결정
state 1 이메일 입력 → state 2 메일 발송 안내 → (메일함) → state 3 새 비밀번호 설정 → 로그인

상태 변형

3 states

단일 URL에 3개 상태. state 1·2는 같은 페이지에서 폼 제출로 전환, state 3은 메일 링크의 토큰으로 별도 진입. SSO 가입자는 비밀번호가 없으므로 state 2에서 안내 추가. 상태별 시안은 각각 독립 프리뷰로 노출한다.

State 1 · 이메일 입력

enter · #state-1

State 2 · 메일 전송됨

sent · #state-2

State 3 · 새 비밀번호

confirm · #state-3

요소 명세 — 상태별

spec · by state
영역컴포넌트동작 · 카피 · 데이터비고
STATE 1 · 이메일 입력
1 페이지 헤드 .auth-head H1: 비밀번호 재설정
보조: 가입하신 이메일로 재설정 링크를 보내드립니다
2 이메일 인풋 .input-d 플레이스홀더: 이메일
autocomplete: email
F2의 이메일 인풋과 동일
3 CTA .btn-primary-d 카피: 재설정 링크 받기
제출 → state 2로 전환 (in-page) · 미가입 이메일이어도 동일 화면 노출 (계정 존재 누설 방지)
보안 — 가입 여부 정보를 응답으로 흘리지 않음
4 하단 링크 .muted-row a 카피: ← 로그인으로 돌아가기
d-text-2 · hover White
STATE 2 · 메일 전송됨
5 상태 아이콘 .status-icon--mail 64px 원형 · 배경 rgba(F96815, .12) · 보더 rgba(F96815, .28) · 색 #FBBF85
아이콘: ri-mail-send-line 28px
대기 상태 — 오렌지 톤
6 페이지 헤드 .auth-head H1: 메일을 확인해주세요
보조: 아래 이메일로 재설정 링크를 보냈습니다. 링크는 30분간 유효합니다.
7 이메일 칩 .email-chip pill · 배경 rgba 6% · 보더 d-border
내용: ri-mail-line + hyejin.park@gmail.com (JetBrains Mono 12px)
발송 대상 명시 — 페르소나의 "어디로 갔지" 불안 해소
8 로그인 복귀 CTA .btn-primary-d (a) 카피: 로그인으로 돌아가기 · href /login
Tiger Orange fill — 명확한 다음 액션
"닫기" 같은 모호한 카피 회피
9 재전송 링크 .muted-row a 카피: 메일이 오지 않았나요? + 인라인 다시 보내기
현재 구현: 클릭 시 색 green + 전송했습니다 ✓ 2.5초 → 복귀 + 공통 토스트
60초 쿨다운/서버 제한은 후속 구현
STATE 3 · 새 비밀번호 (메일 링크 진입)
10 페이지 헤드 .auth-head H1: 새 비밀번호 설정
보조: 새로 사용할 비밀번호를 입력해주세요
11 이메일 표시 (readonly) .field + .input-d[readonly] 라벨: 이메일 (가시 라벨)
값: 토큰에서 추출한 이메일 · readonly · 배경 rgba 2% · 텍스트 d-text-2 · cursor not-allowed
토큰 무결성 시각 확인 — 잘못된 링크 클릭 시 즉시 인지
12 새 비밀번호 + 확인 .input-d × 2 플레이스홀더: 새 비밀번호 (8자 이상) · 새 비밀번호 확인
헬프: 영문·숫자·특수문자 중 2가지 조합, 8자 이상
검증 규칙은 F2.2 회원가입과 동일
이전과 동일한 비밀번호 금지 (서버 검증)
13 CTA .btn-primary-d 카피: 비밀번호 변경
성공 → /login 리디렉트 + 토스트 비밀번호가 변경되었습니다. 새 비밀번호로 로그인하세요
자동 로그인 안 함 (보안)

페이지 전체 규칙

layout · validation · security
토큰 수명
재설정 링크 30분 유효 · 1회용 (사용 즉시 만료)
계정 존재 누설 방지
state 1 제출 시 미가입 이메일이어도 state 2 노출 — 계정 enum 공격 차단
SSO 가입자 처리
이메일로 비밀번호 재설정 요청 시: 메일 본문에 SSO로 가입하셨습니다. {provider}로 로그인해주세요 안내만 발송 (재설정 링크 미포함). state 2 화면 자체는 동일하게 노출
재전송 제한
현재 구현은 즉시 재전송 피드백만 제공. 제품 구현은 60초 쿨다운 · 동일 IP 시간당 10회 · 초과 시 reCAPTCHA
state 3 토큰 만료
만료된 링크 진입 시: 별도 안내 화면 + 링크가 만료되었습니다. 다시 요청해주세요 + state 1로 돌아가는 CTA (디자인 v1.2)
변경 후
비밀번호 변경 성공 시 모든 기존 세션 무효화 (보안) · 사용자에게 알림 메일 발송 (해킹 인지)
키보드
각 state Enter 키로 폼 제출 가능

미결 사항

open
  • state 3 토큰 만료 화면 — 별도 디자인 화면 추가 (현재 안: F2.4 verify-email state 3과 동일 패턴)
  • SSO 가입자가 비밀번호 재설정 요청 시 — 메일 본문 안내 카피 확정
  • 변경 후 자동 로그인 여부 — 현재 안: 미로그인 (보안 우선)
  • 변경 후 알림 메일 본문 — IP / 시간 / 디바이스 표시 수준
  • 2FA 도입 시점 — v2 (현재는 단일 인자)

F2.4 · P1

이메일 인증

URL
현재 시안: editorial-verify-email.html#state-1/2/3 · 제품 URL: /verify-email (state 1) · /verify-email?token=... (state 2·3 서버 분기)
테마
다크 (로그인과 동일 셸)
인증
가입 직후 부분 인증 상태 (이메일 미인증). state 2 도달 시 완전 인증
역할
회원가입 직후 메일 인증 대기 상태를 안내하고, 인증 성공/만료 결과를 상태별로 보여준다. 현재 구현은 데모 가입 후 성공 state로 이동하며, 실제 토큰 검증은 후속 서버 구현 범위
페르소나 진입
현재 구현: F2.2 가입 제출 또는 SSO 가입 데모 → #state-2. 제품 구현: 가입 직후 state 1 → 메일 링크 클릭 → 토큰 결과에 따라 state 2/3
핵심 결정
state 1 대기 → 메일 클릭 → state 2 완료 → 라이브러리 · 만료 시 state 3 재발송

상태 변형

3 states

state 1은 가입 직후 메일 발송 안내, state 2는 인증 완료, state 3은 링크 만료 화면이다. 현재 시안은 해시와 상단 스위처로 상태를 강제 표시하며, 실제 제품에서는 같은 URL에서 서버 토큰 검증 결과에 따라 다른 뷰가 렌더링된다. 상태별 시안은 각각 독립 프리뷰로 노출한다.

State 1 · 메일 발송됨

pending · #state-1

State 2 · 인증 완료

success · #state-2

State 3 · 링크 만료

expired · #state-3

요소 명세 — 상태별

spec · by state
영역컴포넌트동작 · 카피 · 데이터비고
STATE 1 · 메일 발송됨 (가입 직후 자동 진입)
1 상태 아이콘 .status-icon--mail 대기 상태 — 오렌지 톤 (F2.3 state 2와 동일 컴포넌트)
ri-mail-send-line
2 페이지 헤드 .auth-head H1: 거의 다 됐어요
보조: 이메일 인증을 완료하면 5,000 크레딧을 드립니다. 메일함에서 링크를 눌러 인증을 마쳐주세요.
크레딧 지급 시점 명시 — 페르소나의 가입 완료감 ↑
3 이메일 칩 .email-chip 발송 대상 이메일 명시 · F2.3 state 2와 동일
4 버튼 행 (2-up) .btn-row 좌: 이메일 변경 (secondary · ri-edit-line) — 현재 구현은 시각 버튼만 배치, 수정 모달은 후속
우: 다시 보내기 (primary · ri-refresh-line) → 클릭 시 라벨 전송했습니다 2.5초 + 성공 토스트
flex: 1 1 · gap 0.8
이메일 오타 케이스 대응 (가장 흔한 페르소나 이슈)
5 대기 인디케이터 .countdown Tiger Orange dot 6px · pulse 1.4s + 카피 인증 대기 중 · 자동 확인
JetBrains Mono 12px · d-text-3
현재 구현은 시각 상태만 표시. 제품 구현은 5초 간격 인증 상태 확인 후 state 2 자동 전환
자동 확인 카피가 있으므로 서버 폴링 도입 전까지는 데모/시안 상태임을 명세에 분리
6 취소 링크 .bottom-cta a 카피: 잘못 가입하셨나요? 로그인으로 돌아가기
미인증 계정은 24시간 후 자동 삭제 (회원가입 잘못 케이스 회복로)
STATE 2 · 인증 완료 (토큰 검증 성공)
7 상태 아이콘 .status-icon--ok 성공 — green 톤 · 배경 rgba(22,163,74,.16) · 보더 rgba(22,163,74,.32) · 색 #86EFAC
ri-check-line
success 토큰 #16A34A
8 페이지 헤드 .auth-head H1: 이메일 인증 완료
보조: 환영합니다, {이름}님. 5,000 크레딧이 지급되었습니다.
이름: 회원가입에서 입력한 display_name. SSO 가입은 provider profile name을 우선 사용하고 없으면 이메일 로컬파트로 fallback
9 시작 CTA .btn-primary-d (a) 카피: editorial 시작하기 →
href editorial-library.html. 하단에 5초 자동 이동 문구는 있으나 현재 구현에는 타이머/자동 이동 스크립트 없음
제품 구현에서는 의도된 다음 URL이 있으면 ?next= 우선 적용
10 자동 이동 안내 .bottom-cta 카피: 5초 후 자동으로 이동합니다 · 0.7 alpha 현재 구현은 안내 텍스트만 표시. 실제 자동 이동 및 카운트다운은 후속
STATE 3 · 링크 만료 (토큰 검증 실패)
11 상태 아이콘 .status-icon--err 오류 — red 톤 · 배경 rgba(220,38,38,.16) · 보더 rgba(220,38,38,.32) · 색 #FCA5A5
ri-time-line (시간 만료 의미)
destructive 토큰 #DC2626
12 페이지 헤드 .auth-head H1: 인증 링크가 만료되었습니다
보조: 링크는 발송 후 24시간 동안 유효합니다. 아래에서 새 링크를 받아주세요.
토큰 수명 명시 (재학습 기회)
13 재발송 CTA .btn-primary-d 카피: 새 인증 링크 받기 · ri-refresh-line
현재 구현: 클릭 시 라벨 전송했습니다 2.5초 + 성공 토스트
제품 구현: state 1 전환 + 새 메일 발송 + 60초 쿨다운
14 처음부터 다시 .bottom-cta a 카피: 다른 이메일로 가입하시겠어요? 처음부터 다시
/signup
이메일 자체가 잘못된 케이스 회복로

페이지 전체 규칙

flow · token · polling
토큰 수명
인증 링크 24시간 유효 · 1회용
state 1 확인
현재 구현은 폴링 없음. 해시/스위처로 상태를 전환하고, 재전송 버튼은 라벨 변경과 토스트만 제공. 제품 구현은 5초 간격 GET /me/verification-status · verified=true 시 자동 state 2 전환
state 2 자동 이동
현재 구현은 5초 후 자동으로 이동합니다 문구와 라이브러리 CTA만 제공하며 자동 이동 없음. 제품 구현은 카운트다운 종료 또는 CTA 클릭 시 라이브러리 이동 · URL ?next= 우선
토큰 만료 분기
링크 클릭 시 GET /verify-email?token=... · 응답: valid(state 2) · expired(state 3) · invalid(state 3 — 같은 화면 다른 카피 v1.2)
이메일 변경
현재 구현은 버튼 배치만 있고 모달 없음. 제품 구현은 state 1 "이메일 변경" 클릭 → 인풋 모달 · 변경 시 기존 미인증 토큰 모두 폐기 + 새 메일 발송 + state 1 카운터 리셋
크레딧 지급
state 2 도달 시점 (= 토큰 검증 성공) — DB 트랜잭션으로 verified=true와 동시에 5,000 크레딧 지급
미인증 계정 보존
24시간 내 미인증: 계정 보존 + 재발송 무한 · 24시간 경과: 계정 자동 삭제 + 동일 이메일 재가입 가능
스팸함
state 1 보조 카피 v1.2: 메일이 오지 않으면 스팸함을 확인해주세요 추가 검토

미결 사항

open
  • SSO 가입자의 이름 fallback — provider profile name이 없거나 한글 이름이 아닐 때 이메일 로컬파트를 그대로 쓸지, 추가 이름 입력을 요구할지 결정 필요
  • state 2 자동 이동 — 현재는 텍스트만 있고 타이머 없음. 실제 자동 이동을 도입할지, CTA만 유지할지 결정 필요
  • state 1 "이메일 변경" 모달 디자인 및 실제 버튼 연결
  • state 3 invalid 토큰(만료가 아닌 위변조) 화면 카피 분기 — v1.2
  • SSO 가입자는 이메일 인증 자체 생략 — 현 안: SSO 이메일은 검증된 것으로 간주 (네이버·카카오는 검증 안 됨, 이슈)
  • 인증 완료 알림 — 환영 메일 발송 여부 (영업 메일 vs 첫 사용 가이드)
  • 미인증 24시간 경과 안내 — 삭제 직전 알림 메일 vs 즉시 삭제

F3 · P0

라이브러리

URL
/library
테마
라이트 (앱 셸)
인증
필수 — 미인증 진입 시 로그인 모달 호출
역할
로그인 후 홈. 업로드한 원고 목록·상태 확인·다운로드·공유의 출발점
페르소나 시나리오
김민경 · 다음 주 입고 원고 4건 + 진행 중 1건. 회사 24인치에서 HWP 파일과 본 화면 분할 노출 · 아이패드로 외근 중 상태 확인 · 모바일에서는 알림 받고 들어와 결과 확인
핵심 결정
업로드 시작 · 보고서 진입(행 클릭) · 다운로드 · 공유 · 검색 · 필터

레이아웃 · 3 뷰포트

desktop · tablet · mobile

데스크톱은 사이드바 240 + 본문. 태블릿(iPad Pro 11" 가로)에서 사이드바 200으로 축소 + 본문 패딩 축소 + 행 액션 상시 노출. 모바일은 사이드바 드로어 + 테이블 가로 스크롤(향후 카드 변환은 미결).

요소 명세

spec · 15 elements
영역컴포넌트동작 · 카피 · 데이터비고
1 사이드바 — 워드마크 a.mark · 26px 카피: editorial (Magnolia Script, 소문자)
클릭 → / (랜딩) — 새 원고 업로드 진입점으로 자연 이동
접근성: aria-label="editorial 홈"
다크 → 라이트로 컨텍스트 전환됨. 핸드오프 §4.6 "탑바 SENTENCIFY 표시 제거" 반영
2 사이드바 — 상단 그룹 .nav-item × 2 항목: 업로드 · 라이브러리 (현재 active)
업로드 클릭 → 공용 업로드 모달 호출 (정상 플로우: 원고 선택 → 크레딧 확인 → 교정 서브스테이지 5개 → 완료, 검증은 참고 분기)
활성: 배경 Gray 100 + 폰트 weight 650 + 아이콘 Tiger Orange
업로드는 액션 트리거 (모달), 라이브러리는 현재 라우트. 공통 JS가 ri-upload-line 아이콘을 가진 nav-item을 업로드 플로우로 바인딩
3 사이드바 — 하단 그룹 (계정) .nav-item × 4 항목: 플랜editorial-plan.html · 설정editorial-settings.html · 문의mailto:hello@bookend.tech · 로그아웃 → 세션 종료 후 editorial-landing.html
레이아웃: margin-top: auto로 사이드바 하단에 고정
핸드오프 §4.1 "사이드바 플랜 유지". 핸드오프 §9.1 그룹 구조. 문의 채널 미정
4 탑바 — 검색 트리거 .search-trigger 카피: 원고 검색 + ⌘K 표시
클릭 또는 ⌘K → 검색 오버레이 열림 (인스턴트 서치, 자동완성 없음)
매칭: 파일 이름 부분 일치 (한글 자모 단위 검색은 v2)
핸드오프 §9.1. 자동완성 없음 명시. 모바일에서는 텍스트 라벨 숨김 + 아이콘만 노출
5 탑바 — 데스크톱 알림 + 프로필 .icon-btn · .user-chip · mobile hidden notification 데스크톱/태블릿: 알림 아이콘 (ri-notification-3-line) + Tiger Orange 미확인 dot (숫자 카운트 미노출)
모바일 768 미만: 상단바 알림 아이콘 숨김, 햄버거 패널 상단 알림 아이콘으로 이동
데스크톱 클릭 시 컴팩트 알림 패널 토글: 헤더 알림 + 읽지 않음이 있을 때만 모두 읽음 노출
패널 항목: 박스 없는 인라인 유형 아이콘, 유형명, 경과 시간, 문서명 말줄임, 기본 안내 메시지, 삭제 버튼
프로필 ( 아바타 + 김민경) → 드롭다운 (설정 · 마이 플랜 · 로그아웃)
알림 dot은 unread 1개 이상일 때만 노출. 데스크톱 패널은 프로필 드롭다운과 균형을 맞춘 320px 내외 anchored panel. 모바일 알림 상세는 LB14 드로어 내부에서 처리
6 페이지 타이틀 h1.page-title 카피: 라이브러리 + 우측 카운트 14 (Mono 15px)
카운트는 필터 적용 결과가 아닌 전체 보유 원고 수
스크롤 시 sticky 안 함 (모바일 헤더 공간 절약)
필터 결과 카운트는 필터 칩 안에 별도 표시
7 원고 업로드 CTA .btn--md.btn--primary 카피: 원고 업로드 + ri-upload-line
클릭 → 사이드바 업로드와 동일 — 업로드 모달 호출
Press Black fill, hover 시 Tiger Orange 전환
사이드바 진입과 페이지 헤더 CTA 둘 다 존재 — 다중 진입점 허용
8 필터 — 상태 칩 + 우측 기간 .chip 최대 5 + .date-btn (right-aligned) 상태 칩: 전체 14 · 분석 중 1 · 완료 11 · 실패 1 · 대기 1
노출 정책: 전체는 항시 노출. 분석 중/완료/실패/대기는 해당 상태 원고가 0건이면 칩을 노출하지 않음
활성 칩 Press Black fill / White text · 비활성 White / 보더
카운트는 모노스페이스, 작게 (opacity 0.7)
기간 버튼은 필터 행 우측 끝에 배치 → 팝오버: 오늘 · 최근 1주 · 최근 30일 · 전체 기간
핸드오프 §9.1 "상태 + 기간". 데스크톱에서는 상태 칩 좌측, 기간 버튼 우측 분리
9 테이블 헤더 .tbl thead 컬럼: 파일 이름 · 포맷 · 요청 날짜 · 글자수 · 상태 · 액션(빈 헤더)
정렬 가능: 파일 이름 (현재 활성, desc) · 요청 날짜 · 글자수
현재 구현: 정렬 가능 컬럼 시각 표시만 제공, 헤더 클릭 정렬은 미연결
Gray 50 배경, Gray 300 하단 보더
핸드오프 §9.1 "파일 이름, 요청 날짜, 문서 길이, 상태" 컬럼 + 포맷 추가. 실제 정렬 동작은 후속 구현
10 테이블 행 — 데이터 .tbl tbody tr 파일 이름: 굵게(650), 380px max, ellipsis
포맷: Format pill (HWP·HWPX는 Tiger Orange 액센트)
요청 날짜: 2026.05.22 14:32 형식
글자수: 128,420자 형식, 천 단위 콤마
상태:
· 완료 → 녹색 dot + "완료"
· 분석 중 → 원형 파이(14px, Tiger Orange) + "분석 중" + 퍼센티지 62%
· 실패 → 레드 dot + "실패"
· 대기 → 그레이 dot + "대기"
행 클릭 → 보고서 진입 (/documents/:id) — 단, 실패·대기 상태는 진입 불가
현재 구현은 정적 샘플 퍼센티지 62%. 프로그레스 바가 아닌 원형 파이 선택 — 테이블 행 내 좁은 세로 폭에 적합. SSE/폴링 실시간 갱신은 후속 구현
11 행 액션 .row-actions 상태별 노출:
· 완료: 다운로드 · 공유 · 더보기 (kebab)
· 분석 중: 더보기만
· 실패: 다시 시도 · 더보기
더보기 메뉴: 완료=이름 변경·원본 다운로드·주석 원본 다운로드·보고서 PDF·삭제 / 분석 중=분석 취소 / 실패=삭제
데스크톱: hover 시 opacity 0→1 (120ms)
태블릿·모바일: 항상 노출 (터치 환경)
행 본문 클릭이 보고서 진입을 담당하므로 더보기 메뉴에는 보고서 진입을 중복 배치하지 않음
12 페이지네이션 메타 .paging .total 카피: 총 14건 · 1~10
Mono, Gray 500, 좌측 정렬
필터 적용 시: 전체 14건 중 완료 11건 · 1~10
핸드오프 §11.3 "10건/페이지"
13 페이지네이션 .pagination 현재 페이지: Press Black fill + White text
prev 비활성(첫 페이지), next 활성
Mono 12px
페이지 수 ≤ 7: ellipsis 미사용
디자인 시스템 §11 pagination 그대로
14 모바일 — 햄버거 .hamburger · .mobile-drawer-head · .mobile-drawer-notifications 모바일에서만 노출 (768 미만)
클릭 → 사이드바 드로어 슬라이드 인 (좌측, 240px, 0.24s)
패널 상단: editorial 로고 + 알림 아이콘 + 햄버거/닫기 아이콘
기본 본문: 데스크톱 라이브러리 사이드바와 동일한 업로드 · 라이브러리 · 플랜 · 설정 · 문의 · 로그아웃
알림 아이콘 클릭 → 같은 드로어 안에서 알림 리스트로 전환. 알림 화면은 아이콘형 뒤로가기 + 알림 + 조건부 모두 읽음
바깥 dim 영역 클릭, 햄버거/닫기 아이콘, Esc 입력 시 닫힘
태블릿·데스크톱에서는 사이드바 상시 노출. 모바일 알림은 상단바가 아니라 이 패널 안에서 접근
15 모바일 — 테이블 카드 .tbl tr (card layout) 768 미만에서 테이블이 카드 레이아웃으로 변환:
· 파일 이름: 상단 굵게, 2줄까지 허용
· 상태: 우상단 절대 도킹 (파이 포함)
· 포맷 pill: 제목 아래 독립 행
· 날짜 · 글자수: dot 구분자로 인라인
· 액션: 하단 구분선 아래 앞 정렬
행 자체가 탭 타겟. 터치 환경이므로 행 액션 상시 노출. 수평 스크롤 제거

페이지 전체 규칙

layout · interaction · empty
그리드
데스크톱 사이드바 240 + 본문 max-width 1280 · 본문 패딩 40 / 태블릿 사이드바 200 · 본문 패딩 24 / 모바일 사이드바 드로어 · 본문 패딩 16
상태 흐름
업로드 모달 완료 전에는 별도 행 자동 삽입 없음. 현재 목록에는 샘플 "분석 중 62%" 행이 있으며, 실패 행의 다시 시도는 "업로드 모달에서 다시 처리할 수 있습니다" 토스트를 노출
행 클릭 vs 액션
행 본문 클릭 → 보고서 진입 (완료 상태만) · 행 액션 버튼은 stopPropagation 처리. 행 hover 시 cursor pointer + Gray 50 배경
정렬
현재 구현: 파일 이름 컬럼에 desc 시각 상태만 표시. 헤더 클릭 정렬, 사용자 선택, localStorage 보존은 후속 구현
검색 동작
검색 버튼 또는 ⌘K/Ctrl+K → 오버레이. 입력 즉시 파일 이름 부분 일치 결과 최대 8개 표시, 결과 클릭 시 해당 문서 진입. 자동완성 없음. 현재 결과 보조 상태값은 내부 키(done/processing/failed/waiting)로 표시되어 로컬라이즈 필요
Empty state
원고 0건일 때: 일러스트 + "아직 원고가 없습니다" + 본문 + "원고 업로드" CTA. 검색 결과 0건일 때: 검색 키워드 인용 + 다시 시도 안내
키보드 · 접근성
데스크톱 Tab 순서: 사이드바 → 검색 → 알림 → 프로필 → 필터 → 테이블 행 → 페이지네이션. 모바일: 햄버거 → 패널 상단 알림/닫기 → 메뉴 항목 또는 알림 뒤로가기/모두 읽음/목록. 행 위에서 Enter → 보고서 진입
실시간 갱신
현재 구현은 정적 샘플 상태 + 클라이언트 필터링. 분석 중 행의 폴링/SSE 상태 업데이트는 인프라 결정 후 확정
모달 호출
현재 구현: 업로드 모달 · 공유 모달 · 다운로드 모달 · 분석 중 모달. 더보기 메뉴의 이름 변경/삭제 confirm은 메뉴 항목만 있고 별도 모달은 후속 구현

미결 사항

open
  • 실패 행 클릭 동작 — 에러 상세 모달 vs 토스트 안내
  • 필터 적용 후 카운트 표기 — 페이지 타이틀 옆 vs 페이지네이션 메타 옆 (현재 두 곳 분리)
  • 실서비스 연동 시 알림 SSE 재연결/refetch 정책과 실패·업로드·취소 클릭 후 해당 문서 강조 여부 검증. HTML 시안 검증용 샘플은 ?notifications=seed로 재주입
  • 업로드 모달 5단계는 M 섹션과 랜딩 내장 플로우에 반영됨. 라이브러리 진입 시 동일 공용 플로우를 호출하도록 연동 방식 확정 필요
  • 테이블 정렬 실제 동작 — 현재는 정렬 가능 시각 표시만 존재
  • 검색 오버레이 결과 보조 상태값 로컬라이즈 — 현재 내부 키(done/processing/failed/waiting)가 표시됨

F4 · P0

보고서

URL
/documents/:id
테마
라이트 (앱 셸)
인증
필수 — 미인증 진입 시 로그인 모달 호출
역할
편집자의 실제 작업 화면. 교정 항목을 하나씩 검토하고 승인·무시. 다운로드·공유의 종착점
페르소나 시나리오
김민경 · 24인치 모니터 한쪽에 한글 원본 + 다른 쪽에 본 화면 · 빨간 펜 옆에 두고 항목별로 판단 · "근거" 칼럼이 외주 교정자의 메모를 대신함. 항목당 평균 ~10초, 100건 ≈ 17분
핵심 결정
항목 승인·무시 · 북마크 · 필터(타입·상태·페이지) · 다운로드 · 공유

레이아웃 · 3 뷰포트

desktop · tablet · mobile

데스크톱은 사이드바 240 + 본문(max 980). 태블릿은 사이드바 200 + 본문 패딩 축소. 모바일은 드로어 + 카드 패딩 축소. 항목 카드는 모든 뷰포트에서 동일 구조 (가로 분할 없음 — 원문/제안 수직 스택).

요소 명세

spec · 18 elements
영역컴포넌트동작 · 카피 · 데이터비고
1 사이드바 aside.sidebar 라이브러리와 동일 구조 · 워드마크 + 작업 그룹(업로드/라이브러리) + 계정 그룹(플랜/설정/문의/로그아웃)
라이브러리 항목이 활성 (보고서는 라이브러리의 하위 컨텍스트)
라이브러리 LB1~LB3와 동일
2 탑바 — 브레드크럼 .crumbs 카피: 라이브러리 / 미공개 단행본 — 김작가 원고
라이브러리 링크 → /library · 현재 문서명은 굵게(650), 360px max ellipsis
구분자 슬래시(/)
라이브러리 LB4 자리에 검색 대신 컨텍스트 표시. 검색은 ⌘K 단축키로만 (탑바에 노출 안 함)
3 탑바 — 액션 .topbar-global + .topbar-actions · 전역 알림 (ri-notification-3-line) → 데스크톱 공통 알림 패널. 모바일에서는 햄버거 패널 상단 알림 아이콘으로 이동
· 공유 (ri-share-line) → 공유 모달
· 다운로드 (ri-download-line) → 다운로드 모달 (포함할 제안 상태 + 받을 파일 선택)
· 더보기 (ri-more-2-fill) → 현재 시각 버튼만 배치, 드롭다운 미연결
알림은 글로벌 영역으로 문서 도구와 분리. 모바일 상단바에서는 숨기고 드로어 안에 둠. 공유/다운로드는 공통 JS에서 모달로 연결. 더보기 메뉴는 후속 구현
5 문서 제목 h1.doc-title 카피: 미공개 단행본 — 김작가 원고 + 포맷 pill (HWP 액센트)
32px display 800, line-height 1.2
현재 구현: 정적 제목. 인라인 편집 미연결
제목 수정은 라이브러리 행 더보기의 "이름 변경"과 함께 후속 구현
6 문서 통계 .doc-stats · .stat × 4 · 생성: 2026.05.22 14:32
· 페이지: 384p
· 글자수: 128,420자
· 총 제안: 253건 (필터 기준 변경 안 됨 — 항상 전체 수)
라벨 Mono 10.5px uppercase / 값 16px/650
핸드오프 §9.2 "문서 제목, 생성일, 총 수정 제안, 총 페이지, 총 글자수". 4개 모두 노출
7 스타일 분석 트리거 .doc-actions 보조: 스타일 분석 보기 옅은 테두리 보조 텍스트 버튼
주 액션: 다운로드 흰색 텍스트 버튼. 스타일 분석보다 살짝 높은 위계
스타일 분석 보기 클릭 → 스타일 분석 모달 (lg 720). 다운로드 클릭 → 헤더 다운로드 아이콘과 동일한 다운로드 모달
현재 구현은 탭 전환과 PDF 다운로드 토스트까지 포함. 상세 데이터 소스는 후속 확정
8 필터 — 타입 .filter-main-row + .filter-expandable · 전체 253 (reset) · 교정 187 · 교열 42 · 윤문 24
기본은 전체 보기. 교정/교열 칩 클릭 시 해당 칩이 옆으로 확장되어 하위 태그를 inline 노출. 다시 누르면 접힘
하위 태그를 모두 제외하면 확장 영역이 닫히고 상위 칩이 제외 상태로 전환. 제외된 상위 칩을 다시 누르면 하위 제외를 모두 해제하고 재확장
윤문은 하위 태그가 없으므로 칩 클릭으로 제외 토글
전체는 유형/하위 제외와 상태 선택을 모두 해제하고 확장된 하위 태그를 접음
기본 칩은 neutral outline. 제외 상태는 hover 중에도 Gray fill + muted text를 유지. 상태 선택 칩은 활성화 시 active fill로 표시
특정 유형만 제외하고 보는 워크플로를 위해 exclusion toggle로 변경. 카운트는 해당 유형 전체 건수
8-1 필터 — 하위 태그 .filter-subtype-inline 교정 확장 시: 철자 오류 52 · 띄어쓰기 61 · 문법 오류 49 · 문장부호 25
교열 확장 시: 검색확인 18 · 교정제안 24
하위 태그는 펼쳐진 상위 칩 옆에 1행으로 붙어서 노출. 각 칩을 누르면 해당 하위 태그만 제외, 다시 누르면 복귀. 그룹 내 모든 하위 칩이 제외되면 상위 칩 제외로 승격
윤문에는 하위 태그 없음. 유형/하위 태그/상태/페이지 필터와 AND 조건으로 결합
시각 위계: 확장된 상위 칩 묶음은 Gray 50 tray + orange chevron. 하위 칩은 상위 칩보다 작게 표시. 제외 상태는 gray muted. 접힌 상태에서 하위 제외가 남아 있으면 상위 칩에 small orange dot 표시
결과 카드의 하위 태그 배지와 동일 라벨을 사용. 교정제안은 항상 교열 컨텍스트 안에서만 노출. 필터 클릭 시 scrollTop을 보존해 화면 흔들림을 줄임
9 필터 — 상태 .chip × 3 · 대기 238 · 승인 12 · 무시 3
상태는 포함형 다중 선택 — 아무 상태도 선택하지 않으면 전체 표시. 각 상태 칩을 누르면 활성화되고 다시 누르면 해제
여러 상태를 동시에 활성화할 수 있으며 선택된 상태끼리는 OR, 타입/하위/페이지 필터와는 AND 조건으로 결합 (예: 교정 + 대기/승인)
핸드오프 §9.2 미명시. 작업 효율을 위해 추가 — 대기만 보면서 빠르게 처리
10 필터 — 페이지 범위 .page-range-btn 카피: 전체 페이지 + ri-book-open-line
클릭 → 페이지 범위 입력 팝업: From/To 숫자 입력 + 빠른 범위 전체 · 1—50 · 51—100 · 101—200
적용 시 타입/상태 필터와 AND 조건으로 결합
핸드오프 §9.2 "페이지 범위". 캘린더 위젯 아닌 숫자 범위 입력
11 항목 카드 — 메타 .item-meta 카드 정렬: 번호 기준 오름차순 (#007 → #012)
좌측: 번호 #012 (Mono) + 유형 배지 (교정 orange / 교열 blue / 윤문 green) + 하위 태그 배지 (교정: 철자 오류·띄어쓰기·문법 오류·문장부호 / 교열: 검색확인·교정제안 / 윤문은 미표시) + 위치 p.42 (Mono, 문단 순번은 추후 구조 인식 후 추가)
우측: 상태 pill 배지 (대기 dot / 체크 아이콘+승인됨 / 제외 아이콘+무시됨)
선택 상태: 카드 클릭 또는 J/K// 이동 시 해당 카드에 primary stroke (var(--tiger-orange)) 표시
유형별 색은 디자인 시스템 §3 시맨틱 컬러와 별개 — 교정 도메인 전용 분류 컬러. 하위 태그는 유형보다 약한 neutral pill로 표시하고 단독 노출하지 않음
12 항목 카드 — 원문 .passage--source.source-disclosure Gray 50 배경 + Gray 100 border, 14.5px line-height 1.7, 클릭 가능한 disclosure
기본: 원문 라벨 + 해당 문장만 노출. hover/focus 상태로 펼침 가능성 표시
클릭/Enter/Space → 앞 문장 + 현재 원문 + 뒤 문장을 같은 박스 안에 노출
diff: 변경 대상 단어에 strikethrough + Tiger Red (#B91C1C, opacity 0.6)
핸드오프 §9.2 "원문 → 수정 제안 → 교정 근거" 3단 중 1단. 실제 앞뒤 문장 추출은 원고 구조 인식 후 데이터 연동
13 항목 카드 — 제안 .passage--target Tiger Orange tinted 배경 (rgba 5%) + 보더 (rgba 18%)
카피: 제안 라벨 + 본문
diff: 변경된 단어 highlighted (Tiger Orange tint + 650 bold)
승인 시 이 텍스트가 최종 적용됨. 시각적으로 Tiger Orange 광원 = 능동적 변화의 시그널
14 항목 카드 — 근거 .item-reason 카피: ri-information-line 아이콘 + 1~2줄 설명
아이콘: Gray 500, 별도 배경/보더 없음. 접근성 라벨은 근거
본문: 13px Gray 700, line-height 1.7
상단 Gray 100 보더로 본문과 분리
핸드오프 §9.2 "교정 근거(왜 고쳐야 하는지)". 외주 교정자의 코멘트를 대체하는 핵심 영역. 페르소나의 서비스 평가 기준 2위
15 항목 카드 — 액션 .item-actions 좌측: 북마크 토글 (ri-bookmark-lineri-bookmark-fill)
우측: 무시 (secondary) + 승인 (primary + 체크 아이콘)
처리 후 상태에 따라 카드 변형:
· 승인 → 연한 green tint 배지 + 제안문 박스 subtle green, 근거 0.82 opacity, 액션 "승인 취소" 단일
· 무시 → 연한 gray pill + dashed 보더, 제안/근거 숨김, 원문과 액션 "무시 취소"만 노출, 취소선 없음
핸드오프 §9.2 "승인/무시 (dismiss/done)". destructive 컬러 사용 안 함 — 무시는 파괴적 행위 아님
16 북마크 라인 .bookmark-line 카피: 여기까지 확인했습니다 + ri-bookmark-fill
Tiger Orange 색, 양쪽 라인 (opacity 30%)
사용자가 "여기까지 확인" 표시한 항목 다음에 자동 삽입
재진입 시 이 라인 위치로 스크롤 이동 또는 단축키 G B 이동은 후속 구현
핸드오프 §9.2 "북마크 ('여기까지 확인')". 단일 북마크만 허용 — 새 위치 설정 시 이전 위치 자동 해제
17 하단 진행 바 footer.report-foot 좌측: 15 / 253건 확인
중앙: 진행률 프로그레스 (Tiger Orange, 18%)
우측: 단축키 안내 J/ 이전 / K/ 다음
sticky bottom, 스크롤 시 노출 유지
편집자에게 작업 진행 상황을 항상 보여줌. "다음 단축키" 안내는 신규 사용자 학습
18 모바일 — 햄버거 .hamburger 모바일에서만 노출 (768 미만)
클릭 → 라이브러리와 동일한 사이드바 드로어. 상단 editorial 로고 + 알림 아이콘 + 햄버거/닫기 아이콘, 기본 본문은 데스크톱 사이드바와 동일, 알림은 같은 드로어 안에서 리스트로 전환
라이브러리 LB14와 동일. 바깥 dim 영역 클릭, 햄버거/닫기, Esc로 닫힘

페이지 전체 규칙

interaction · keyboard · sync
키보드 단축키
현재 구현: K/ 다음 항목 · J/ 이전 항목. A 승인 · X 무시 · B 북마크 · G B 북마크 위치 · ? 도움말 · ⌘K 검색은 후속 구현
현재 항목 표시
키보드 J/K 또는 좌우 화살표로 이동 시 현재 필터에서 보이는 항목 목록을 기준으로 다음/이전 항목을 뷰포트 중앙으로 부드럽게 스크롤하고, 이동된 항목에는 선택 상태 primary stroke를 유지한다. 브라우저 기본 focus ring과는 별개로 카드 선택 상태를 표시
변경 저장
현재 구현: 승인·무시·승인 취소·무시 취소는 클라이언트 상태만 즉시 변경하고 토스트 표시. 서버 저장, 실패 롤백, 인라인 제목 수정 저장은 API 연동 후 구현
다운로드 동작
다운로드 클릭 → 모달에서 포함할 제안 상태(모든 제안 / 승인 / 무시 / 미선택)와 받을 파일(보고서 PDF / 주석 원본 파일)을 체크박스로 선택. 상태 또는 파일 선택이 0개이면 경고 토스트, 정상 선택 시 다운로드 시작 토스트
공유 모달
공유 클릭 → 공유 모달. 경고 배너 + 만료 기간 7일/30일/무기한 + 원본 다운로드 허용 토글 + 링크 생성. 생성 후 같은 모달 안에 공유 링크, 복사 버튼, 공유된 보고서 보기 링크를 노출
실시간 동기화
본 페이지는 단일 사용자 가정 (v1). v2에서 협업 시 실시간 동기화 고려 (편집자 + 작가 공동 검토 시나리오)
접근성
항목 카드는 <article> 시맨틱 · 액션 버튼은 명시적 라벨 · diff는 색에 의존하지 않고 strikethrough/bold로 구분 · 단축키는 화면 외 도움말 메뉴로 안내
모바일 처리 효율
모바일에서는 키보드 단축키 없음 → 버튼만 사용. 항목 카드 액션 영역 더 크게 (flex 1로 풀너비 분배). 페르소나는 모바일을 검토 용도로만 가정 — 처리는 데스크톱·태블릿

미결 사항

open
  • 스타일 분석 모달은 보고서 런타임에서 3탭(용어집/문장 길이/반복어)으로 구현, M 갤러리는 정적 용어집 중심 시안 — 어느 쪽을 기준 컴포넌트로 삼을지 정리 필요
  • 공유 모달은 M 섹션에 before/after 상태로 반영됨 — 워터마크·접근 로그 알림 범위는 추가 결정 필요
  • 업로드 모달 5단계는 M 섹션과 랜딩 내장 플로우에 반영됨 — 라이브러리 호출 시 상태 동기화 방식 확인 필요
  • 스타일 분석 결과의 항목 카드 연결 — 예: 용어집의 의도 표기/예외어를 해당 교정 항목 묶음으로 보기
  • 이전 다운로드 이력 — 보고서가 여러 번 다운로드된 경우 버전 관리
  • 다국어 출판 시나리오 — 번역 원고(영→한)의 교정 vs 창작 원고의 교정 구분 표시
  • 편집자 vs 작가 권한 분리 — 공유받은 작가가 직접 무시·승인 가능한지
  • 이동 외 단축키(A 승인, X 무시, B 북마크, ? 도움말) 구현 범위와 키보드 도움말 오버레이 디자인
  • 좌측 항목 리스트 사이드 패널 도입 검토 — 데스크톱에서 항목 점프 인덱스

F5 · P0

소개

URL
/about
테마
다크 5 + 라이트 3 (다크 지배, 다크 bookend) — 다크 → 라이트 → 다크 → 라이트 → 라이트 → 다크 → 다크 → 다크
인증
불필요 (퍼블릭)
역할
제품 정체성·신뢰 신호. 탑 내비에서 "editorial이 뭐 하는 도구냐"에 답하는 자리. /pricing이 수치라면 /about은 입장
페르소나 진입
김민경 · 랜딩 카드 닫기 직전, 또는 첫 5초 판단 후 "회사 출신·기술 백그라운드 확인" 목적으로 진입. 회사 자랑보다 출판 언어를 쓰는지가 신뢰 판단의 첫 신호
핵심 결정
원고 업로드 시작 (로그인 모달) · 가격 확인 · 회사 신뢰 확보 후 후속 진입
출판인의 동료 · 자신감 있는 1인칭(우리) · 합쇼체 · "편집자를 대체하지 않는다, 본질에 집중하게 한다"

레이아웃 · 풀 페이지 스크롤

8 sections · single column

고정 탑 내비 + 8개 세로 섹션. 섹션 경계는 하드 컬러 블록으로 전환하고, 실제 구현은 Hero·한국어 최적화·Final 안에서만 제한적으로 그라데이션/블롭을 사용한다. 다크/라이트 교차로 시각적 호흡과 위계를 만들고, 다크 bookend가 진입·이탈 시점에 안정감을 준다. 페이지 전체는 약 4,800px (데스크톱 1920 기준).

섹션 흐름

8 sections
01 · 다크
Hero
02 · 라이트
작동방식
03 · 다크
한국어 최적화
04 · 라이트
이런 분에게
05 · 라이트
약속
06 · 다크
신뢰의 근거
07 · 다크
브랜드 브리지
08 · 다크
마무리

다크 5 · 라이트 3 — 다크가 시작과 끝을 잡는다.

요소 명세 — 섹션별

spec · 8 sections
섹션테마 / 컴포넌트카피 · 데이터비고
01 Hero · Manifesto 다크
#hero · 92vh · blob×3
Eyebrow: ● MANIFESTO · 2026
H1 (clamp 44~92px / 800): 편집자가 / 작품의 본질에 / 더 가까이. — "작품의 본질에"만 Tiger Orange
Lede: editorial은 한국어 출판을 위한 교정·교열·윤문 보조자입니다. 우리는 편집자를 대체하지 않습니다. 반복적인 검수 노동을 떠맡아…
CTA: 원고 업로드 시작 (primary 52px) + editorial이 하는 일 ↓ (ghost, 앵커)
Stat band 2열: 교정 · 교열 · 윤문 · HWP · HWPX · DOCX · PDF
랜딩과 동일한 블롭 3개 + 노이즈. CTA href는 로그인 페이지지만 현재 구현은 공통 스크립트가 가로채 showAuthGate 모달 → 업로드 플로우로 이어짐
02 어떻게 작동하는가 라이트 (ivory)
#process · 3-card grid
Eyebrow: 02 · 어떻게 작동하는가
H2: editorial은 원고를 세 번 읽습니다. — "세 번"만 Tiger Orange
3 카드 (교정 / 교열 / 윤문):
· 단계 번호 + 한국어명 + 영문명 (mono)
· 1줄 설명
· 발췌 박스: 라벨 + 취소선/하이라이트로 교정 마크업 + mono 설명 줄
발췌 예시 3종: 한글 맞춤법 / 사실 관계 / 강조부사 중첩
발췌는 placeholder — 실제 출시 시 사내 코퍼스에서 익명화 교정 예시 교체
03 한국어 최적화 다크 (#111→#1A1816)
#korean · 타이포 중심
Eyebrow: 03 · 한국어 최적화
H2 (clamp 44~84px / 800): 한국어 출판을 위해, / 처음부터 끝까지. — 2행, 두 번째 행 d-text-2 (양감 변화)
Body 2열: 본문 단락 + mono 리스트 5항목
리스트: 사이시옷·외래어 표기법·문장부호 / HWP·HWPX 입출력 / 로마자·한자 병기 / 문어·구어 분리 / 출판 코퍼스
섹션 내부 그라데이션 (#111111 → #1A1816)으로 다크 섹션 단조로움 회피
04 이런 분에게 라이트
#whom · 3-card row
Eyebrow: 04 · 이런 분에게
H2: editorial이 자리잡는 책상.
3 카드 (출판 편집자 / 작가 / 번역가) — 좌측 컬러 라인 없이 그리드 셀로만 구분
각 카드: 원형 아이콘 (rgba 오렌지 12%) + 타이틀 + 본문 + 점선 디바이더 + "자주 쓰는 자리" 시나리오 캡션 (mono)
IA v1.3의 "비교표" 자리를 페르소나 카드로 흡수 — 자기를 비교 대상과 나란히 놓지 않는다는 UX 라이팅 원칙 유지
05 약속 라이트
#promises · 2×2 grid
Eyebrow: 05 · 약속
H2: 원고는 작가의 것입니다. 예외 없이. — "예외 없이"만 Tiger Orange
4 약속 (2×2):
01 외부 모델 학습에 사용되지 않음
02 처리 후 30일 자동 삭제 (즉시 삭제도 선택 가능)
03 저작권 100% 작가 귀속
04 공유 링크 만료·취소·다운로드 차단 가능
04→05 사이 light-sep 디바이더 (라이트→라이트 호흡 분리)
06 신뢰의 근거 다크
#numbers · 4-col stats
Eyebrow: 06 · 신뢰의 근거
H2: 수치보다는 결과로 말합니다. 그래도 묻는다면.
4 큰 숫자 (clamp 48~72px / 800, 단위는 0.42em):
· 99.2 % 교정 정확도 — 국립국어원 맞춤법 검증 기준
· 7 분 평균 처리 시간 — 단행본 10만 자
· 17,800 편 누적 처리 원고 — 2026.05 누적
· 2.3 억 자 누적 분석 분량
Footnote: — 모든 수치는 내부 벤치마크 기준이며, 분기별로 갱신합니다.
수치는 모두 placeholder. 출시 전 실제 벤치마크로 교체 필요 (미결)
07 브랜드 브리지 다크
#brand-bridge · 2-col
Script mark: editorial 대형 워드마크
Eyebrow: 07 · 우리는 어디에서
H2: 수백 년의 검수 위에서.
Body: 활판 인쇄 이전부터 존재한 교정·교열·윤문의 맥락 위에 서 있다는 브랜드 내러티브
CTA: 브랜드 이야기 더 보기editorial-brand.html
/brand 진입로가 실제 구현에 반영됨. 브랜드북 본문은 F11 placeholder로 유지
08 마무리 · 최종 CTA 다크 (blob 1개)
#final · center · 추상
Script wordmark: editorial (Magnolia Script, Tiger Orange, ~64px)
H2: 본질에 집중하세요. / 나머지는 우리가 맡습니다.
Sub: 회원가입 후 무료 5,000 크레딧으로 첫 원고를 보내보세요. 결과를 보고 결정해도 늦지 않습니다.
CTA: 원고 업로드 시작 (56px, primary)
추상 블롭 1개만 배치 (Hero보다 절제). 푸터로 자연스럽게 이어짐
FT 표준 푸터 다크 (#111)
footer.foot.foot--standard
1행 구조: 워드마크 / 핵심 링크 2그룹 — 서비스(소개·가격) / 법적 고지(이용약관·개인정보처리방침·사업자정보) / 사업자 정보가 한 행으로 정렬
하단: 법인명·대표자·사업자등록번호·통신판매업 신고번호·사업자정보확인·주소·고객지원·저작권 표기
랜딩의 가벼운 최소 푸터와 분리. /about·/pricing·법적 문서에서 신뢰/법적/문의 정보를 직접 노출

톤·카피 규칙

voice · forbidden words
인칭
1인칭 복수 "우리는". 자신감 있되 자랑 없이. 회사를 "북엔드"로 호명하지 않고 도구 이름 "editorial"로 호명 → 회사 자랑 회피
문체
합쇼체 (~합니다, ~입니다) · 단정조. 해요체 금지 (~해요는 톤이 가벼움) · 학술 만연체 금지
금지어
"AI로 편집자를 대체" · "효율" · "생산성 제고" · "기계가 낫다" · "혁신적" · "차세대" — 편집자를 부정하는 어휘 일체 금지
핵심 메시지
"당신이 더욱 도서 편집의 본질에 집중할 수 있도록" — 모든 섹션이 이 한 줄로 환원되어야 함. 카피 작성 시 이 문장과 어긋나는지 자가 점검
비교 어휘
경쟁사·외주 교정과 자기를 나란히 놓지 않음. "외주 교정 대신" 같은 직접 비교 회피. 카드 안에서 페르소나가 자기를 어디에 두는지 자연히 위치하게 함
크레딧
인증·온보딩 안내처럼 "5,000 크레딧" 단독 표기. "자" 환산 노출은 /pricing·/plan·업로드 단계에만
회사 호명
회사명 "주식회사 북엔드"는 푸터에만. 본문에서 회사 배경(투자/이력) 노출 안 함. 회사 메시지는 제품 메시지로 갈음
강조 컬러
Tiger Orange는 핵심 어구 1개만 (H1 한 줄당 1군데). "예외 없이" "세 번" "작품의 본질에" — 의미 핵을 짚는 용도. 액센트 남발 금지

페이지 전체 규칙

layout · motion · scroll
탑 내비
고정 (fixed) · backdrop blur 12px · 배경 rgba(17,17,17,0.72) — 라이트 섹션 진입 시에도 다크 유지 (전체 페이지 일관성)
섹션 패딩
각 섹션 상하 12~14rem · 좌우 4.8rem (모바일 1.6rem). 다크↔라이트의 섹션 경계는 하드 컬러 블록으로 처리하고, 내부 그라데이션은 Hero·한국어 최적화·Final처럼 구현상 필요한 다크 섹션에만 제한
최대 너비
본문 그리드 1180px · 작동방식 카드 그리드 1240px (3 카드 호흡)
스크롤 모션
v1.0: 정적 (스크롤 리빌·패럴럭스 없음) · v1.2에서 reveal 검토 — 다만 reduced-motion 우선 정책 유지
블롭
Hero·Final에만. 중간 다크 섹션은 정적 그라데이션 또는 단색 (블롭 남발 금지)
이미지
실제 이미지 없음 — 헤더는 타이포, 발췌는 마크업 텍스트, 푸터는 추상 블롭. 실제 사진/일러스트 도입은 v2 검토
반응형
1199 이하: 작동방식 3→2+1 카드 · 수치 4→2×2 · 이런 분에게 3→세로 적층 / 767 이하: 모든 grid 단열 · stat band 세로
접근성
각 섹션 aria-labelledby로 H2 연결 · 블롭/노이즈 aria-hidden · CTA 텍스트 명시 (icon-only 금지) · 컬러 대비 AA 충족

미결 사항

open
  • 섹션 06 수치 — 모두 placeholder. 출시 전 실제 내부 벤치마크로 교체. 정확도 측정 기준 문서화 필요
  • 섹션 02 발췌 예시 — placeholder. 사내 코퍼스에서 익명화된 실 사례로 교체 (저작권 영향 검토)
  • 스크롤 리빌 모션 — v1.0 정적. v1.2에서 fade-up 정도 도입 검토 (reduced-motion 분기 필수)
  • IA v1.3에 있던 "결과물 쇼케이스"(보고서/라이브러리/스타일 분석 스크린샷) 자리 — 본 라운드 누락. 실 스크린샷 확보 후 §3 한국어 최적화 ↔ §4 사이에 삽입 검토
  • 비교 섹션 — IA v1.3 "맞춤법 검사기 vs 외주 교정 vs editorial" 비교표는 자기 비교를 회피하는 UX 라이팅 원칙과 충돌. 페르소나 카드로 흡수했으나, 페르소나가 도구를 어디에 두는지를 더 명시할지 결정 필요
  • 크리덴셜 노출 — KAIST·NVIDIA Inception·TIPS 등 IA v1.3 자리. "회사 자랑 회피" 결정에 따라 본 라운드 삭제. 미인증 사용자가 신뢰 신호를 어디서 얻는지 별도 검토 (FAQ? 푸터?)
  • /brand 진입은 §7 브랜드 브리지에 반영됨. 남은 과제는 F11 브랜드북 placeholder 본문을 실제 브랜드 내러티브·시스템 링크로 확장하는 것
  • SEO meta — title/description/og:image 별도 명세 필요

F6 · P0

가격

URL
/pricing
테마
다크 단일 (전 섹션 다크 — 가격은 신뢰의 톤이고, /about처럼 교차 호흡이 필요하지 않음)
인증
불필요 (퍼블릭) · CTA 클릭 시 미인증이면 로그인 모달
역할
구독·종량제 가격 노출. 페르소나의 "얼마 든다, 얼마 안 든다" 5초 판단을 도와주는 자리. 회사 자랑이 아니라 숫자가 카피
페르소나 진입
김민경 · 랜딩/소개에서 "분량 환산?" 질문이 떠올랐을 때 진입. 편집장 결재 한도(5만 원 이하)가 결정의 첫 필터
핵심 결정
Basic 시작 (24,900) · Pro 시작 (54,900) · Enterprise 문의 · 종량제 충전 · 회원가입 후 무료 5,000 크레딧 체험
가격 단위
1 크레딧 = 한국어 10자. 개별 구매 기본가는 1 크레딧 = 1원이며, 1만 크레딧 이상부터 7–20% 차등 할인

레이아웃 · 풀 페이지 스크롤

5 sections + footer · single dark

고정 탑 내비 + 5개 세로 섹션 모두 다크. 섹션 간 그라데이션 미세 변화로 호흡을 만들되 라이트 전환은 없음. /about과 달리 가격은 신뢰의 톤이라 톤 일관성을 우선.

요소 명세 — 섹션별

spec · 5 sections
섹션컴포넌트카피 · 데이터비고
01 Hero · 결제 주기 토글 다크
#hero · 중앙 정렬 · blob×2
H1: 원고에 들이던 며칠을, / 단 한 시간 안에. — "단 한 시간 안에"만 Tiger Orange
Sub (2행): 단행본 한 권을 검수하는 데 걸리던 시간을 돌려드립니다. / 매월 정해진 분량의 구독이나 필요한 만큼의 종량제, 나에게 맞는 방식으로 사용하세요.
아이브로우 없음 (가치 중심 카피가 페이지의 첫 도입)
토글: 월간 결제 · 연간 결제 [2개월 무료]
연간 토글 시: 각 카드 가격 17% 절감된 월 환산가 표시 + "연 ~원 · 17% 절감" 보조 라인 노출
토글은 페이지 전체 상태 · 카드 가격 + 보조 라인이 동시에 갱신
02 구독 플랜 카드 다크
#plans · 3-card grid
3 카드 (Basic / Pro / Enterprise):
· Basic 24,900원/월 (연 249,000) · 50,000 크레딧 / 단행본 4~5권 분량
· Pro 54,900원/월 (연 549,000) · 150,000 크레딧 / 단행본 12~15권 — [가장 많이 선택] 플래그
· Enterprise 문의 · 분량 한도 협의
Pro 카드: 0 0 0 1px rgba(F96815, .18) ring + 24/60 shadow + 0.35 보더 alpha → 시각 위계
각 카드 features: 체크 아이콘 + 텍스트 5~6항 (상위 플랜은 "Basic 전체 포함" 또는 "Pro 전체 포함" 첫 줄)
CTA: Basic/Enterprise는 ghost (보더만), Pro는 Tiger Orange primary
Pro만 primary CTA — 의도된 anchor 플랜. 시각 위계가 가격 결정을 유도하지만 정보 강요는 아님
03 종량제 + 비교 다크
#payg · 2-col
Eyebrow: 03 · 종량제
H2: 필요한 만큼만 충전하는 크레딧. — "크레딧"만 Tiger Orange
좌: 공식 박스 — 1 크레딧 = 10 자 큰 타이포 · 단위 사이 mono "=" Tiger Orange · 그 아래 환산 노트 · 6 충전 프리셋 (1만 7% / 2만 10% / 3만 12% / 5만 14% / 10만 17% / 20만 20%)
우: 처리 가능 분량 비교 — 30,000 크레딧 충전 300,000자 · 26,400원 vs Basic 구독 500,000자 · 24,900원/월
하단 안내: — 매월 작업이 일정하다면 구독, 비정기 작업이라면 종량제. (선택 가이드)
크레딧 단위와 글자 환산이 동시에 노출되는 유일한 페이지 (인증·온보딩 화면은 크레딧 단독). 충전 크레딧은 만료 없음
04 FAQ — 아코디언 다크
#faq · 8 항목
Eyebrow: 04 · 자주 묻는 질문
H2: 혹시 궁금하실 만한 것들.
8 항목 (서비스 2 + 결제 3 + 보안 1 + 파일 1 + 법인 1):
1. 교정·교열·윤문 한 번에? · 2. 1 크레딧 = ? · 3. 크레딧 이월? (구독 이월 없음, 종량제 만료 없음) · 4. 환불 정책? (7일·미사용 전액) · 5. 플랜 변경? (상위 즉시, 하위 다음 결제일) · 6. 지원 포맷·한도? (PDF/DOCX/HWP/HWPX, 최대 500,000자/100MB) · 7. 학습에 쓰이나? (학습 거부 + 격리 + 흔적 폐기) · 8. 법인 결제·세금계산서?
Q 클릭 → 아코디언 펼침 + 아이콘 + 45° 회전 + Tiger Orange
Q hover: Tiger Orange 색만
독립 항목 펼침 (다중 동시 OK). 보안 질문은 /about — 약속 섹션으로 inbound 링크
05 마무리 · 최종 CTA 다크
#final · center · blob×1
Script wordmark: editorial (Magnolia Script · Tiger Orange · ~56px)
H2: 한 편의 원고로 / 직접 확인하세요.
Sub: 회원가입 후 무료 5,000 크레딧으로 첫 원고를 교정해보세요. 한 편의 결과만 읽어봐도 다음 선택이 가벼워집니다.
CTA: 원고 업로드 시작 (56px · primary)
/about의 final과 같은 패턴. 가격 페이지에서 "결과부터"라는 문구로 가격에 발이 묶이지 않게 함
FT 표준 푸터 다크
footer.foot.foot--standard
/about과 동일 — 워드마크, 서비스 링크(소개·가격), 법적 링크(이용약관·개인정보처리방침·사업자정보), 사업자·고객지원 정보를 한 행에 정렬 /about과 동일 푸터

가격 규칙

credit · billing
단위
1 크레딧 = 한국어 10자. 개별 구매 기본가는 1 크레딧 = 1원이며, 1만 크레딧 이상부터 7–20% 차등 할인. 처리 분량은 원본 파일의 본문 텍스트(공백 포함) 길이로 측정. 그림·표·각주는 본문 분량에서 제외
구독 vs 종량제
구독은 같은 가격으로 종량제 대비 약 2배 분량 제공 — 매월 정기 사용자에게 유리한 구조. 종량제는 비정기 사용자용 · 만료 없음
크레딧 우선순위
처리 시 구독 크레딧이 먼저 소진된 뒤 충전 크레딧이 사용됨. 구독 크레딧은 해당 결제기간 종료 시 미사용분이 소멸하므로 사용자 선택 없이 우선 차감
이월
구독 크레딧 — 다음 결제기간으로 이월되지 않음. 해당 결제기간 종료 시 미사용분 소멸. 종량제 충전 크레딧 — 별도 고지 없는 한 만료 기간 없이 유지
환불
결제 7일 이내, 해당 결제건의 크레딧 미사용 시 전액 환불 · 일부 사용 시 실제 결제 단가 기준으로 사용분 차감 · 원고 처리 개시 후 맞춤형 결과물 생성 시 결제 화면 별도 동의 범위와 관계 법령상 허용 범위에서 환불 제한 가능 · 승인 환불은 3영업일 이내 원 결제 수단 취소/환급
플랜 변경
상위 플랜: 즉시 변경 + 남은 기간 차액 결제 + 추가 크레딧 일할 지급 · 하위 플랜: 다음 결제일부터 적용
연간 결제
월 가격의 10/12 (2개월 무료) · 표시는 "월 환산가" 기준으로 보여줘 비교 용이 · 보조 라인에 "연 ~원 · 17% 절감" · 중도 환불 요청 시 제공 완료분/사용분/할인 정산분을 제외한 잔여 미제공 기간 기준으로 산정
크레딧 표기
가격/플랜/업로드 단계에서만 "10자" 환산 노출. 인증·온보딩·라이브러리·보고서·푸터 등 모든 다른 화면에서는 "5,000 크레딧"처럼 크레딧 단독 표기
CTA 동작
현재 구현: Basic/Pro CTA 클릭 → showAuthGate 모달 → 인증 완료 후 editorial-checkout.html?plan=basic|pro&cycle=monthly|annual. 최종 CTA는 인증 후 업로드 모달로 진입. Enterprise는 mailto:hello@bookend.tech
표시 통화
대한민국 원 (KRW). 부가세 별도/포함 표기는 결제 화면에서 명시. 가격 페이지는 표시가 기준

미결 사항

open
  • 플랜별 분량 — Basic 50,000 / Pro 150,000 크레딧은 임시. 실제 사용자 패턴 데이터 확보 후 조정 (페르소나 김민경 월 1~2권 = 30~60만자)
  • 연간 절감율 17% — 정확한 비율 확정 (현 안: 10/12 = 16.67%, 표기 17%)
  • Enterprise 가격 비공개 정책 — 표시 vs 시작가 노출(예: "월 200만원~")의 트레이드오프 검토
  • 충전 크레딧 만료 없음 — 정책 확정. 회계상 미사용 충전 크레딧 처리 (선수금 vs 매출 인식 시점)는 법무·세무 검토
  • 구독 해지·전환 시 잔여 구독 크레딧 처리 — 다음 결제일까지 사용 가능, 이후 미사용분 소멸. 충전 크레딧은 유지
  • 학생·교육기관 할인 — 별도 플랜 vs 프로모코드 (현 안: 미배치)
  • FAQ 8항목 — 출시 후 실제 문의 누적으로 갱신. 검색·필터링 추가 검토
  • 가격 표시 단위 — 단행본 권수 환산 ("4~5권 분량")의 정확성 — 권당 평균 분량 기준 명시 필요
  • SEO meta — title/description/og:image · 검색 인텐트 "AI 교정 가격", "한국어 교정 비용" 대응

F7 · P1

이용약관

URL
/terms
테마
라이트 본문 + 다크 topnav/footer (정적 문서 공용 셸)
인증
불필요 (퍼블릭)
역할
전자상거래법·약관규제법에 따른 약관 노출. v1.0 적용본
진입로
① 모든 페이지 푸터 "이용약관" · ② 회원가입(F2.2) 약관 동의 [필수] 인라인 텍스트 · ③ 결제 화면 약관 동의 텍스트 · ④ 약관 변경 시 메일 안내 링크
핵심 결정
약관 이해 후 가입·결제 진행 / 약관 변경 동의 / 약관 거부 시 탈퇴

레이아웃 · 단일 컬럼

760px max · single column

중앙 정렬 단일 컬럼. 상단 메타(버전·적용일·최종 갱신) → TOC → 본문 17조. 본문은 word-break: keep-all로 한국어 줄바뀜 최적화.

요소 명세 — 주요 블록

spec · 5 blocks
영역컴포넌트동작 · 카피 · 데이터비고
1탑 내비 (다크).topnav · fixed소개·가격·로그인 링크 · 라이트 본문 위에 다크 띠로 유지 (전 정적 페이지 공통)legal/static 셸
2페이지 헤드.legal-headEyebrow 법적 고지 · TERMS OF SERVICE · H1 이용약관 · 메타 (v1.0 · 적용일 2026.06.15 · 최종 갱신 2026.06.15)버전 관리 · mono 폰트
3목차 (TOC).legal-toc17개 조항 2열 · ol counter · 클릭 시 해당 조 anchor 스크롤모바일 1열 전환
4본문 17조.legal-body제1조~제17조 + 부칙 · 공정위 전자상거래 표준약관 구조를 기준으로 가입·계정·결제·환불·크레딧·원고 보존·공유 링크·책임 제한을 editorial 정책에 맞춰 본문 작성. 제7조는 원고 내 개인정보·민감정보·비밀정보 권한 확보와 업로드 전 마스킹을 회원 책임으로 두고, 회사의 사전 전수 검수 의무는 두지 않으며 인지 시 처리 중단·삭제·접근 제한·재업로드 요청 가능결제 및 환불정책 v2 반영 · 3영업일 환급 · 별도 동의 · 연간 중도환불 기준 포함

미결 사항

open
  • 결제 및 환불정책 v2 — 상세 환불 산식·프로모션 크레딧·부분 사용분 처리 기준 문서화 완료. 운영 전 PG/회계 정합성 최종 확인 필요
  • 법인·팀 계정 약관 — 개인 가입을 기본으로 하되 팀·법인 플랜은 별도 절차/계약/세금계산서 정보 수집을 허용
  • 약관 동의 이력 보존 — 사용자가 동의한 시점의 약관 버전 추적 (DB 설계)
  • 약관 변경 시 사전 고지 채널 — 메일 + 인앱 배너 + 강제 재동의 화면 결정
  • 원고 보존 설정 — 기본값 보관, 사용자가 보관/즉시 삭제/자동 삭제를 선택할 수 있도록 DB·설정 UI 설계
  • 모바일 reading 경험 — 17조 긴 본문의 TOC 고정 vs 스크롤 spy 검토
  • 인쇄용 레이아웃 — print stylesheet 필요

F8 · P1

개인정보 처리방침

URL
/privacy
테마
라이트 본문 + 다크 topnav/footer (F7과 동일 셸)
인증
불필요 (퍼블릭)
역할
개인정보보호법 제30조와 개인정보보호위원회 2026.4 작성지침 기준의 개인정보 처리방침 게재. v1.0
진입로
① 모든 페이지 푸터 "개인정보처리방침" · ② 회원가입(F2.2) 약관 동의 [필수] 인라인 텍스트 · ③ 설정 → 보안·계정 · ④ 처리방침 변경 시 메일 안내
핵심 결정
처리 항목·기간 확인 / 원고 데이터·AI 처리 원칙 확인 / 공유 링크 접근 로그 / 정보주체 권리 행사 / 보호책임자 문의

레이아웃

F7과 동일 셸

요소 명세 — F7 대비 차이

spec · diff

셸·TOC 구조는 F7 이용약관과 동일. 차이는 본문 구성과 핵심 노출 항목.

영역컴포넌트동작 · 카피 · 데이터비고
1목차 (TOC).legal-toc15개 조항 — 처리 목적 · 처리 항목 · 보유 기간 · 원고/AI 처리 · 제3자 제공 · 위탁 · 국외 이전 · 공유 링크/접근 로그 · 파기 · 정보주체 권리 · 안전성 · 쿠키 · 자동화된 결정 · 권익침해 구제/보호책임자 · 변경개인정보위 2026.4 작성지침의 필수/해당시 항목 반영
2원고 데이터·AI 처리 원칙.legal-body원고 본문·생성 결과물은 서비스 제공을 위한 원고 데이터로 별도 관리. 단, 원고 안에 개인 식별 정보·민감정보·고유식별정보가 포함된 경우 해당 부분은 개인정보로 보호. 회원은 원고 내 개인정보·민감정보·비밀정보에 관한 권한 또는 동의를 확보하고 불필요한 고위험 정보를 업로드 전 삭제/마스킹해야 하며, 회사는 원고의 모든 내용을 사전에 검수하지 않음. 원고 데이터·처리 지시는 결과 생성을 위한 처리에만 사용하고 모델 학습/품질 개선에 사용하지 않음. 기본 보관은 사용자 삭제 전까지, 문서별 7일/30일 보관 설정 가능원고 처리 공급자·반출 위치는 사용자-facing 처리방침에 노출하지 않음
3공유 링크.legal-body만료 기간은 생성 시 7일/30일/무제한 중 선택. 원본 다운로드 불가. 접근 일시·IP·브라우저 정보는 보안 이력과 부정 접근 대응을 위해 수집공유 링크는 정식 출시 기능
4위탁·국외 이전.legal-tableAWS · MongoDB · Google · Loops.so · 토스페이먼츠 · 카카오 · 네이버를 개인정보 처리 수탁자로 명시. 개인정보 국외 이전 표는 이메일 알림 수탁자인 Loops.so(미국)만 표시하고, 원고 본문·생성 결과물과 원고 처리 공급자·반출 위치는 노출하지 않음확정된 수탁자·국외 이전 정보 기준으로 관리
5보호책임자.legal-body최현수 · CEO · info@bookend.tech · 070-8065-3454 명시정보주체 권리 행사 채널

미결 사항

open
  • 원고 데이터 처리 공급자와 반출 위치는 내부 운영 문서에서만 관리
  • 이전 버전 보관 URL 확정
  • 맞춤형 광고·제3자 행태정보 수집 도구 도입 시 쿠키/CMP 고지 추가
  • 가명정보 처리 또는 통계 목적 데이터 활용을 도입하는 경우 별도 조항 추가

F9 · P1

사업자정보

URL
/business
테마
라이트 본문 + 다크 topnav/footer (F7·F8과 동일 셸)
인증
불필요 (퍼블릭)
역할
전자상거래법 제10조 사업자 표시 의무 이행. 법인명·대표자·사업자등록번호·통신판매업 신고번호·주소·고객 지원·개인정보 문의·웹사이트 노출
진입로
표준 푸터의 법적 고지 그룹 "사업자정보" 링크와 랜딩/인증 최소 푸터의 사업자정보 링크
핵심 결정
사업자 진위 확인 — "사업자정보확인" 링크 → 공정거래위 팝업 새창으로 등록 정보 대조

레이아웃

단순 dl 카드

요소 명세

spec · biz card
영역컴포넌트동작 · 카피 · 데이터비고
1사업자 카드dl.biz-card2열 dt/dd grid · 법인명 주식회사 북엔드 (BOOKEND Inc.) · 대표자 최현수 · 사업자등록번호 602-86-03073 · 통신판매 2023-대전유성-1575 + [사업자정보확인] · 주소 대전 유성구 대학로155번길 4, S1동 308호 · 고객 지원 support@bookend.tech · 개인정보 문의 info@bookend.tech · 웹사이트 bookend.tech실제 화면 기준. TBD placeholder·호스팅·결제대행 항목 미노출
2사업자정보확인 링크a + JS popuphref https://www.ftc.go.kr/bizCommPop.do?wrkr_no=6028603073 · onclick window.open(href,'bizinfo','width=720,height=820,scrollbars=1') · target=_blank 폴백 · 공정거래위 등록 정보 팝업 새창전자상거래법 표준 진위 확인 채널

미결 사항

open
  • 사업자 카드와 공정거래위 등록 정보의 정합성 정기 검수
  • 고객 지원 채널 다양화 검토 — 이메일 외 채팅(인앱) 도입 시 안내 추가
  • 다국어(영문) 표시 — 해외 사용자 대응 시 별도 영문 페이지

F10 · P1

오류 화면

URL
없음 (라우터 미해석 시 자동 / 서버 5xx 응답 / editorial-error.html#state-empty 디자인 리뷰)
테마
404·500 다크 · 빈 상태 라이트 (body data-state 토글)
인증
무관 (인증·미인증 모두 발생 가능)
역할
예기치 못한 상황에서 사용자에게 다음 행동을 안내. 막다른 길을 피함
진입로
① 404: 라우터 미해석 URL · ② 500: 서버 5xx 응답 · ③ 빈 상태: 라이브러리(F3) inline empty 컴포넌트로 표시 (본 페이지의 empty는 디자인 리뷰 변형)
핵심 결정
홈/라이브러리 복귀 · 다시 시도 · 문의 · 첫 원고 업로드 (빈 상태)

상태 변형

3 states · separate previews

단일 파일 3상태. 우상단 STATE 스위처(디자이너 chrome) 또는 URL hash #state-404 / #state-500 / #state-empty로 전환 가능하지만, 기획서에서는 각 상태 시안을 독립 프리뷰로 모두 노출한다.

State 404 · Not Found

not found · #state-404

State 500 · Server Error

server · #state-500

State Empty · 라이브러리 빈 상태

empty · #state-empty

요소 명세 — 상태별

spec · by state
상태구성카피 · CTA비고
1404다크 · 큰 코드워드마크 · 큰 404 (Tiger Orange, ~140px) · H2 찾으시는 페이지가 없습니다. · body 안내 · CTA 2개 (홈으로 / 라이브러리) · 요청 경로 mono code요청 경로 노출로 사용자에게 문제 진단 단서 제공
2500다크 · 큰 코드500 · H2 잠시 문제가 생겼습니다. · CTA 다시 시도 (window.reload) · ghost 문의하기 (mailto) · 오류 코드 mono오류 코드는 문의 시 식별자로 사용
3빈 상태라이트 · 일러스트88×88 일러스트 박스 (folder 아이콘) · H2 아직 원고가 없습니다. · CTA 원고 업로드 시작 · ghost editorial이 하는 일본 페이지의 빈 상태는 디자인 리뷰용. 실제 사용자는 라이브러리(F3) inline empty를 봄

미결 사항

open
  • 503 점검 / 401 인증 만료 / 403 권한 없음 등 세분화 상태 추가 여부
  • 500 오류 코드 자동 생성 규칙 — 서버 trace 연결
  • 오프라인 / 네트워크 단절 상태 — Service Worker 캐시 폴백 검토
  • 404 시 추천 페이지 (가장 가까운 매치) 노출 여부
  • 라이브러리 inline empty 컴포넌트 → 본 페이지 빈 상태 디자인 일관 동기화

F11 · P1 · WIP

브랜드북 placeholder

URL
/brand
테마
다크 단일 · 다이내믹 그라데이션 풀 활용 (랜딩의 정적 스냅샷과 구분 — /brand는 라이브 모션 허용되는 유일한 공개 페이지)
인증
불필요 (퍼블릭)
역할
editorial 브랜드 내러티브 풀 페이지. 활판 이전부터의 교정 행위 계승 + 출판인 옆자리. 본격 작업은 별도 라운드
진입로
① /about §6.5 브랜드 통로 "브랜드 이야기 더 보기" CTA · ② (예정) 푸터 추가 · ③ /brand/system 하위 뎁스로 디자인 시스템 진입로 제공 예정
현 상태
placeholder — 큰 워드마크 + WIP 배지 + 6셀 아웃라인 (예정 섹션 미리보기) + 뒤로/디자인 시스템 보기 CTA

현 placeholder 레이아웃

WIP · v0

예정 섹션 아웃라인

v1 target · 6 sections
섹션주제핵심 카피 (예정)비고
01맥락 · 계승narrative활판 인쇄 이전부터의 교정·교열·윤문 · "수백 년 맥락 위에"플레이북 §9.2 톤
02자리 · 옆자리narrative"편집자 옆에 앉아 있다" · 판단의 주체는 사람 · 첫 번째 시선 회피 (자기 격하 금지)UX 라이팅 §5.2 회피형 보조 표현 금지
03언어 · 합쇼체narrative출판인의 동료 톤 · 합쇼체 · 회피해야 할 어휘 ("효율" "생산성" "혁신")/about과 일관
04로고 · 워드마크specMagnolia Script · 항상 소문자 · 문장 시작에서도 소문자 · 평문 내 적용 (.wm)플레이북 §9.1 · 토큰 적용됨
05컬러 · 잉크specPress Black · Tiger Orange · Tiger Red · Ivory Paper — 인쇄잉크 비유 · 다크 elevation은 별도 hex (알파 X)디자인 시스템 §컬러
06시스템 진입link/brand/system 디자인 시스템 페이지로 하위 뎁스 진입 · "디자인 시스템 보기" CTAeditorial-design-system.html 연결

미결 사항

open
  • 본격 작업 라운드 — 3~4턴 헤비. 다이내믹 그라데이션 + 스크롤 리빌 + 6 섹션 narrative
  • 푸터에 /brand 링크 추가 여부 — 현재 미배치, /about §6.5 단일 진입로만
  • /brand/system 라우트 — 디자인 시스템 페이지를 /brand 하위로 둘지, 독립 유지할지 결정
  • 브랜드 모션 — 풀 앰비언트 모션 시드 / reduced-motion 정책
  • 실제 발췌 콘텐츠 — 사내 코퍼스 익명화 또는 외부 인용 (저작권 검토)

F12 · P1

마이 플랜

URL
/plan
테마
라이트 앱 셸 (라이브러리 F3와 동일 사이드바·topbar)
인증
필수 (인증 게이트)
역할
구독 현황·사용량·충전·이력·해지 일체. 결제 변경의 모든 진입로
페르소나 진입
김민경 · 사이드바 "플랜" 클릭, 또는 라이브러리에서 크레딧 부족 알림 클릭. 매월 결제일 1~2일 전 확인 빈도 높음
진입로
① 사이드바 "플랜" 항목 · ② 가격 페이지(F6) Basic/Pro 선택 후 체크아웃 · ③ 업로드 모달의 크레딧 부족 알림 → 결제 진입 · ④ 결제 완료 화면 → "마이 플랜 보기" CTA
핵심 결정
플랜 변경 (→ F13 checkout) · 결제 수단 변경 (→ F13 ?action=payment-method) · 크레딧 충전 준비 중 안내 · 플랜 해지(F16)

레이아웃 · 5 섹션

앱 셸 + scroll

사이드바 + topbar는 라이브러리(F3)와 동일. 본문은 1180px max, 5개 섹션이 세로 적층 — 현재 플랜 카드(다크 강조) → 사용량(라이트 2-col) → 충전 프리셋(6-card) → 사용 내역(8-row table) → 해지(저시인성). 헤더 우측 시안 확인용 토글로 구독 화면/미구독 화면을 전환한다.

요소 명세 — 섹션별

spec · 5 sections
섹션컴포넌트카피 · 데이터비고
01 현재 플랜 카드 .cur-plan · 다크 강조 Press Black 배경 + 우상단 미세 오렌지 radial glow · "현재 플랜" 배지
플랜명 (3.6rem 800) + 결제 주기 · 가입일
메타 3개: 다음 결제일 · 결제 금액 · 결제 수단(카드 마스킹)
CTA 2개: 플랜 변경 (primary, 아이콘 없음 — 업그레이드 인상 회피) · 결제 수단 변경 (ghost, ri-bank-card-line)
미구독 토글: Free · 구독 전 · 무료 크레딧 5,000 · 구독 상태 없음 · 결제 수단 미등록 · CTA는 구독 시작하기 / 요금 비교
아이콘 위치/방향이 업그레이드 압박을 만들지 않도록 주의
02 사용량 · 2-card .usage-grid 2:1 좌(2fr) 구독 크레딧: 82,420 / 150,000 · 사용 가능 67,580 · 다음 결제일에 갱신, 미사용분 소멸 · progress bar (Tiger Orange gradient) · 우선순위 안내 처리 시 구독 크레딧이 먼저 소진된 뒤 충전 크레딧이 사용됩니다
우(1fr) 충전 크레딧: 30,000 · 하단 풀너비 + 크레딧 충전 버튼은 비활성화 · hover/focus tooltip 크레딧 충전은 곧 출시됩니다.
미구독 토글: 좌 무료 크레딧 0 / 5,000 · 2026.06.18까지 사용 가능 · 우 충전 크레딧 0 · 충전 버튼 동일하게 비활성화
차감 우선순위는 사용자가 잊기 쉬워 명시. 충전 카드는 ivory 톤으로 시각 분리
03 충전 프리셋 .topup-section[hidden] + 준비 중 CTA 현재 화면에서는 + 크레딧 충전 버튼을 비활성화하고, 툴팁으로 곧 출시 안내만 제공
향후 출시 시 6 프리셋 (10,000 / 20,000 / 30,000 / 50,000 / 100,000 / 200,000 크레딧) · 할인율 7/10/12/14/17/20% · 각 카드에 최종 결제금액 + 환산 자 수
200,000 크레딧은 1회 구매 최대. 추천 배지 없음, 할인율만 강조
초기 노출 밀도 축소. 데스크톱 3×2, 태블릿 2열, 모바일 1열. 호버 시 보더 Press Black + 배경 gray-50
04 사용 내역 .tbl-wrap · 10 rows + pager 컬럼: 날짜 · 문서 · 분량 · 차감 크레딧 (출처: 구독 / 충전)
라이브러리 더미와 일관 (총균쇠 21,468 · 애린왕자 3,215 · 에세이집 8,731 [충전])
헤더 우측: 기간 필터 버튼 📅 최근 3개월 ⌄ → 드롭다운 5개 프리셋: 오늘 · 1주 · 1개월 · 3개월 · 직접 설정 (직접 설정 시 캘린더 range picker)
하단: 1 — 10 / 총 47건 · 합계 105,103 크레딧 + 페이지네이션 (prev · 1·2·3·4·5 · next)
현재 구현: 기간 필터는 라벨/선택 상태만 갱신, 페이지 숫자 클릭은 활성 상태 + 토스트만 제공
미구독 토글: 테이블 헤더는 유지하고 빈 상태 아직 사용 내역이 없습니다. + 원고 업로드 CTA만 노출
전체 내역 보기 미연결 (v1.0). 인라인 확장 vs 별도 페이지 결정 미결
05 플랜 해지 .cancel-row 하단 1px 보더 위 · 좌측 본문 (다음 결제일까지 사용 가능 · 충전 크레딧 유지 안내) · 우측 텍스트 링크 플랜 해지 (저시인성 gray)
미구독 토글에서는 해지 row 숨김
hover 시 #DC2626 (destructive)
해지는 자주 쓰이지 않을 액션이므로 저시인성 텍스트만

미결 사항

open
  • 전체 사용 내역 페이지 또는 무한 스크롤 — 현재는 10행 정적 테이블 + 페이지 토스트
  • 플랜 해지 상세 흐름은 F16 별도 페이지로 구현. 마이 플랜 하단은 링크 진입만 유지
  • 크레딧 충전은 준비 중 상태. + 크레딧 충전 CTA는 구독/미구독 화면 모두 비활성화하고, hover/focus 시 크레딧 충전은 곧 출시됩니다. 툴팁만 노출
  • 플랜 변경 시 다운그레이드 케이스 — 즉시 변경 / 다음 결제일 변경 / 잔여 일수 환불 정책
  • 법인 결제 회원의 플랜 카드 표시 — 사업자 정보 노출 / 세금계산서 발행 이력 진입로
  • 구독 크레딧 소진·소멸 임박 알림 — 80% 도달 또는 결제기간 종료 전 미사용 잔량이 있을 때 인앱 알림 / 메일 발송 검토

F13 · P1

결제

URL
/plan/checkout?plan=…&cycle=… (플랜 변경) · ?action=payment-method (결제 수단 변경) · 현재 구현의 크레딧 충전 진입: ?action=topup&credits=…
테마
라이트 (gray-50 배경) · 최소 topnav (사이드바 없음, 컨버전 집중)
인증
필수
역할
플랜 결제·결제 수단 변경·크레딧 충전 일체. 단일 페이지 4상태 (default · processing · failed · success)
진입로
① 가격(F6) → 인증 게이트 → 선택 플랜/주기 유지 진입 · ② 마이 플랜(F12) → 플랜 변경 / 결제 수단 변경 (크레딧 충전은 준비 중으로 비활성) · ③ 업로드 모달의 크레딧 부족 → 추가 결제 · ④ 알림 메일 (결제 실패 재시도, 후속)
핵심 결정
결제 유형 (개인/법인) · 결제 수단 (카드/계좌이체/카카오페이) · 약관 동의 · 결제 진행

상태 변형

4 states · separate previews

단일 페이지에 4상태 — default(폼 입력) · processing(오버레이 + 스피너) · failed(상단 배너 + 폼 유지) · success(폼 영역 전환 + 영수증 카드). 우상단 STATE 스위처 또는 URL hash #state-{name}로 디자인 리뷰 전환 가능하지만, 기획서에서는 각 상태 시안을 독립 프리뷰로 모두 노출한다.

State Default · 입력

default · #state-default

State Processing · 결제 중

processing · #state-processing

State Failed · 결제 실패

failed · #state-failed

State Success · 결제 완료

success · #state-success

요소 명세 — 영역별

spec · summary + form + states
영역컴포넌트카피 · 데이터비고
01 미니 topnav .topbar-mini 워드마크 (Magnolia Script) · 우측 알림 아이콘 + 보안 결제 · TLS · 토스페이먼츠 (mono + ri-lock-2-fill green) 사이드바 없음 — 결제 컨버전 집중. 알림은 로그인 후 공통 패널 유지
02 주문 확인 (좌측) .summary · sticky 뒤로가기 링크 → /plan · H1 주문 확인
플랜 카드: 플랜명 Pro + 변경 배지 · 연간 결제 · 12개월 안내
Price rows: Pro 월 가격 54,900 · 12개월 합계 658,800 · 연간 할인 −109,800 (Tiger Orange)
최종 결제: 549,000원 (부가세 포함 sublabel)
포함 사항 3행 (150,000 크레딧 · 무기한 공유 · 협업 2인)
자동 갱신 안내 박스 (gray-50, 다음 결제일 명시)
1199px 이하에서 form 위로 stack
03 결제 유형 .seg · segmented 개인 / 법인·사업자 · 클릭 시 body[data-customer] 토글 → 법인 시 사업자 정보 폼 노출 기본 personal · business 선택 시 4 필드 (법인명 / 사업자번호 / 대표자 / 세금계산서 이메일) 노출
04 결제 수단 .pay-methods 3-card 신용·체크 카드 (ri-bank-card-line) · 실시간 계좌이체 (ri-bank-line) · 카카오페이 (커스텀 K 옐로우 배지)
선택 시 보더 Press Black + 0 0 0 1px ring · 카드 선택 시 카드 필드 4개 노출
현재 데모는 결제 수단 선택 UI만 전환. 실제 결제창 호출은 토스 SDK 통합 시 구현
05 카드 정보 필드 .card-fields 카드 번호 · 유효 기간(MM/YY) · CVC · 카드 소유자명 (autocomplete cc-* 속성 부여) 실제 카드 번호는 토스 SDK에서 토큰화 처리 — 회사 미보관
06 사업자 정보 (법인) .biz-fields 법인명 / 사업자등록번호 / 대표자 / 세금계산서 발행 이메일 · 결제일 다음 날 자동 발행 안내 data-customer="business"일 때만 display: flex
07 약관 동의 .checks · 3 row [필수] 구매 약관 + 자동 갱신 정책 · [필수] 환불 정책 + 결제 처리 방침 확인 · [필수] 원고 처리/맞춤 결과물 생성 후 청약철회·환불 제한 가능성 별도 동의. 제한 동의는 기본 unchecked 약관 본문은 editorial-terms.html, 환불정책은 Editorial_PricingRefundCreditPolicy_v2.md 새 탭
08 결제 CTA .pay-cta · 56px Press Black fill · ri-lock-2-fill 아이콘 + 금액 + "결제하기" · hover Tiger Orange · 풀너비
하단 fine print: 결제 시 토스페이먼츠 결제창으로 이동합니다. 결제 정보는 토스페이먼츠에서 처리되며, editorial은 카드 번호 등 민감 정보를 저장하지 않습니다.
청약철회 제한 동의 체크 전 CTA disabled. 체크 후 클릭 시 processing 상태로 전환 후 약 1.8초 뒤 success 상태
상태별 변형
S1 processing .processing-overlay 폼 위에 rgba(255,255,255,0.84) + blur(4px) 오버레이 + 스피너 + 결제를 처리하고 있습니다 / 토스페이먼츠 결제창과 통신 중 · 화면을 닫지 마세요 폼 pointer-events: none · 사용자 닫기 방지 카피
S2 failed .fail-banner 폼 상단 빨강 배너 · ri-error-warning-fill · 결제가 완료되지 않았습니다 / 카드사 거절 응답… 카드 정보 재확인 또는 다른 결제 수단 / 오류 코드 mono · 폼 그대로 유지 (재입력 가능) 실패는 폼 유지 — 재시도 마찰 최소화
S3 success .success-card 폼 + 좌측 summary 모두 hide, 단일 컬럼(720px) 카드로 교체
Green 체크 아이콘 (72px) + H2 결제가 완료되었습니다 + 본문 (플랜 활성화 + 매월 크레딧 자동 지급 + 다음 결제일)
영수증 박스: 거래번호 mono · CTA 2개: 라이브러리로 (primary) · 마이 플랜 보기 (ghost)
영수증은 메일로도 발송. 거래번호로 차후 문의 가능

규칙 · 보안

payment · security
결제 처리 주체
제품 구현 기준: 토스페이먼츠 — 카드 번호·CVC 등 민감 정보는 토스에서 토큰화 처리. 현재 HTML은 데모 폼/상태 전환만 구현되어 실제 결제 요청 없음
자동 갱신
월간/연간 모두 자동 갱신 기본. 자동 갱신 약관 동의 [필수]. 갱신 7일 전 메일 안내. 갱신 후 영수증 자동 발송
세금계산서
현재 구현은 법인 선택 시 사업자 정보 필드 노출까지만 제공. 제품 구현은 결제일 다음 날 자동 발행 · 입력 이메일 발송 · 설정 → 결제 → 청구 내역 다운로드
환불
F7 이용약관 제10조 — 결제 7일 이내 해당 결제건의 크레딧 미사용 시 전액 환불. 일부 사용 시 실제 결제 단가 기준으로 사용분 차감 후 환불 가능. 승인 환불은 3영업일 이내 원 결제 수단 취소/환급. 연간 결제 중도 환불은 제공 완료분과 사용분을 제외한 잔여 미제공 기간 기준
실패 처리
현재 구현은 #state-failed 또는 상태 스위처로 실패 배너를 확인하고, 스위처 클릭 시 토스트를 노출한다. 제품 구현은 카드사 거절 메시지/오류 코드 표시 · 5회 연속 실패 시 10분 잠금
중복 결제 방지
현재 구현: CTA 클릭 → processing 상태 즉시 전환 + 폼 pointer-events 차단. 제품 구현: 토스 webhook idempotency key 적용
이탈 방지
processing 중 페이지 닫기 시도 → beforeunload 경고 · success/failed 도달 전 미결제 상태 유지
약관 본문 노출
구매 약관·환불 정책 모두 새 탭 (target=_blank) — 결제 폼 컨텍스트 유지
금액 표기
tabular-nums · 부가세 포함 명시 · 12개월 합계와 할인 분리 표기로 사용자가 절감액 인지

미결 사항

open
  • 체크아웃 URL 파라미터 반영 — 현재 페이지는 ?action=topup&credits=…를 읽어 크레딧 충전 주문 요약으로 전환. ?plan, ?cycle, ?action=payment-method의 요약 전환은 후속
  • 업로드 모달의 크레딧 부족 시 결제 진입 — 크레딧 구매?action=topup&credits=… 진입으로 구현. 플랜 업그레이드는 체크아웃의 플랜/주기 요약 반영 정책 확정 필요
  • 크레딧 충전 단건결제 — ?action=topup&credits=… 진입 시 checkout 본문이 구매 크레딧·할인율·최종 결제금액으로 전환
  • 토스 SDK 통합 — 카드 토큰화 + 결제창 호출 + webhook 처리
  • 해외 카드/결제 지원 — Stripe 등 추가 PG 검토 (v2)
  • 법인 카드 + 세금계산서 발행 — 사업자번호 검증(국세청 API) · 자동 발행 트리거 명세
  • 3D Secure / ARS 인증 등 추가 인증 단계 — processing 상태 내부 단계 표시
  • 구독 변경 시 일할 정산 표시 — summary 카드에 "기존 플랜 잔여 환불" 라인 추가 검토

F14 · P1

공유된 보고서

URL
/shared/:token (추측 불가 토큰 예: x9k2-p4mb-7n3q)
테마
라이트 · 경량 헤더 + 읽기 전용 배너
인증
불필요 — 토큰으로 접근 제어. 외부 열람자(편집적 권한 없는 작가 등)이 계정 없이 보고서를 열람
역할
편집자가 아닌 외부인(작가·교열자·고객)에게 교정 보고서를 읽기 전용으로 제공. 명확한 경계로 원고 노출 사고 방지
진입로
보고서(F4)에서 생성한 공유 링크 (링크 복사 단일 채널 · 메일·메신저 등으로 전달)
핵심 결정
교정 제안 열람 · 필터링 · (편집자의) 세부 설명 이해 — 승인/무시/다운로드/편집 액션 없음
제약
현재 구현은 읽기 전용 UI와 필터링만 제공. 다운로드 차단·접속 로그·링크 비활성화·만료 처리는 서버/공유 설정 연동 후 보장

레이아웃

light · sidebar + items

경량 탑바 (워드마크 + "공유된 보고서" 라벨 + 만료일 표시) + 읽기 전용 배너 (주황 톤) + 좌측 필터 사이드바 + 우측 교정 제안 아이템 리스트. 보고서 F4와 구조 유사하되 수정/승인 인터랙션 없음.

요소 명세

spec · 6 blocks
영역컴포넌트이벤트 · 카피비고
1경량 탑바.topbar (light)좌: editorial 워드마크 + 세로선 + 공유된 보고서 (mono uppercase)
우: 만료일 안내 2026.06.22까지 유효 · 28일 남음 + green dot (활성)
사이드바 없음 — 앱 셸 컨텍스트 X
2읽기 전용 배너.ro-banner주황 톤 배경 + ri-eye-line 아이콘 + 읽기 전용 보기 · 작성자가 공유한 보고서입니다. 다운로드와 편집은 제공되지 않습니다.제약 사실을 철저히 투명하게 명시
3사이드바 필터aside.sidebar 280px3 그룹: 단계 (전체/교정/교열/윤문) · 상태 (승인/무시/미확인) · 페이지 범위 (권 단위) · 각 항목 카운트 우측
필터 적용 자체는 허용하되 승인/무시 상태 변경은 불가
외부인도 작가·편집자 관점의 제안을 이해할 수 있도록 원문 제공
4보고서 메타.report-head + .stats-row도서명 H1 · 요청일·분량·처리 시간·공유 발행자 메타 · 통계 4-grid (전체/교정/교열/윤문 건수)F4 구조 계승
5교정 항목 카드article.item × N각 항목: 카테고리 핀 (교정/교열/윤문, 색별) + 위치 (p.N) + 상태 배지 (승인/무시/미확인 색별)
diff 박스 (취소선 + 하이라이트) + 근거 설명
상태 배지는 표시만 — 클릭 인터랙션 없음
F4 교정 카드와 동일 패턴, 액션 버튼 제거
6이어 보기·푸터.infinite-row + .foot-shared현재 구현: 교정 항목은 4개 단위로 표시되고 IntersectionObserver가 하단 감지 시 추가 노출. 필터 변경 시 첫 4개부터 다시 표시
푸터: editorial에서 작성된 교정 보고서 · 공유 링크는 작성자가 언제든 비활성화할 수 있습니다. + editorial 알아보기 → 링크 (외부인 유입 경로)
페이지네이션 대신 무한 이어 보기 패턴

보안 규칙

token · expiry · controls
토큰
제품 구현 기준: 예측 불가 토큰 (예: x9k2-p4mb-7n3q) · 12자 이상 랜덤 · 보고서마다 공유 셋당 여러 개 발급 가능. 현재 HTML은 정적 공유 페이지
만료
제품 구현 기준: 7일 / 30일 / 무기한 (Pro 이상) 설정. 현재 페이지는 만료일 문구만 노출하며, 만료/비활성화 상태 화면은 미구현
비활성화
작성자가 보고서(F4) 공유 설정에서 즉시 토글로 비활성화 가능. 비활성화 후 접근 · "공유가 종료되었습니다" 화면
다운로드 차단
현재 UI에는 다운로드 액션이 없다. 제품 구현에서는 원고·보고서 PDF 다운로드 차단, 출력 시 원고 본문 숨김 처리 등 서버/스타일 정책을 추가
접근 로그
현재 미구현. 제품 구현에서는 링크 접근 시 IP · 접속 시각 · (로그인 사용자는 계정) 기록 · 작성자에게 로그 제공 (v1.2 검토)
SEO/인덱싱
noindex, nofollow, noarchive 메타 적용 · 검색엔진 수집 차단
링크 공유 채널
링크 복사 단일 채널 (도메인+토큰) · 메신저/메일 전달은 사용자 재량 · 메일 수신자 입력 기능은 미배치 (v2)

미결 사항

open
  • 만료/비활성화 상태 화면 설계 — 별도 페이지 vs 인라인 메시지
  • 활성화 링크 접근 로그 · 작성자에게 접근 통계 제공 (v1.2)
  • 외부인의 코멘트 기능 — 읽기 전용이나 특정 항목에 코멘트 달기 가능성 (v2)
  • 다국어 자동 프레임 — 공유 받는 외국인 컨텍스트 (영문 톤)
  • 워터마크 · 타임 스탬프 — 스크린샷 유출 방지 검토 (v2)

F15 · P1

설정

URL
/settings · 탭별 hash #profile · #security · #notifications · #billing · #coupon
테마
라이트 앱 셸 (라이브러리·플랜과 동일 사이드바·topbar. 모바일에서는 알림 아이콘을 topbar에서 숨기고 햄버거 패널 상단으로 이동)
인증
필수 (인증 게이트)
역할
계정·보안·알림·결제·청구·쿠폰 일체. 5개 탭으로 영역 분리 — 각 탭의 독립 변경 가능
진입로
① 사이드바 "설정" 항목 · ② 사용자 칩(topbar 우측 아바타) 드롭다운 · ③ 이메일 알림 본문의 "알림 설정" 링크 (→ #notifications) · ④ 결제 영수증 메일의 "청구 내역" 링크 (→ #billing)
핵심 결정
표시 이름·언어 변경 / 비밀번호·2FA·세션 관리 / 알림 이메일·알림 토글 / 결제 수단·청구 내역 / 쿠폰 코드 적용

레이아웃 · 좌측 탭 + 우측 패널

5 tabs · hash sync

데스크톱 200px secondary nav + 1fr panel. 탭 선택 시 URL hash 동기화 — 외부 링크로 특정 탭 직접 진입 가능. 데스크톱 상단바 우측은 공통 알림 패널 진입점과 사용자 칩을 유지하고, 모바일은 알림 진입점을 햄버거 패널 상단으로 이동한다. 1199px 이하에서는 탭이 가로 wrap 행으로 전환. 기획서 프리뷰도 탭으로 전환해 한 번에 하나의 설정 화면만 확인하고, 쿠폰 성공은 입력 영역 아래 카드로 노출한다.

탭별 명세

spec · 5 tabs
섹션구성비고
#profile · 프로필
1프로필 사진.avatar-block72×72 원형 (이니셜 fallback) · 사진 변경 / 제거이미지 미배치 시 이니셜 1자
2기본 정보.field-row-stack표시 이름 · (역할은 v1.0에서 제거됨)이메일 변경 항목은 알림 탭으로 이동
3언어·시간대select-input × 2언어: 한국어 (활성) / English (준비 중) / 日本語 (준비 중)
시간대: 서울 / 도쿄 / 뉴욕
커스텀 chevron SVG · appearance: none
#security · 계정·보안
4비밀번호 변경.field-row-stack현재 / 새 / 새 확인 + CTA "비밀번호 변경"현재 구현은 3개 필드 비어 있음만 검사하고 성공 토스트. F2.3 수준 강도/일치 검증은 후속
52단계 인증.toggle-row × 2이메일 OTP · 앱 OTP (Google Authenticator·Authy) — 토글 전환 시 성공 토스트추가 설정 흐름(QR/백업 코드)은 v2
6연결된 계정.sso-row × 3카카오·네이버·Google — 가입 시 사용한 1개는 해제 불가, 나머지는 "연결" 버튼네이버 N 아이콘 italic 제거됨 (오늘 결정)
7활성 세션.device-row × N현재 세션 + 다른 디바이스 (모바일·다른 PC) · "현재 세션" 녹색 배지 · 개별 종료 + 전체 종료 destructive세션 정보: 디바이스 / 브라우저 / 지역 / 마지막 활동
8계정 삭제.danger-zone빨강 톤 박스 · 되돌릴 수 없음 안내 · destructive CTA · 클릭 시 확인 모달(취소/삭제 확인) 노출현재는 데모 토스트까지. 실제 삭제/재인증은 후속
#notifications · 알림
9알림 이메일.field-row-stack + 저장 버튼이메일 알림을 받을 주소 입력 · 알림 이메일 저장 CTA · 이메일 변경 시 새 주소 인증 필요 안내이메일 설정 영역과 알림 토글 영역 사이에 panel divider
9-1이메일 알림.section-head + .toggle-row × 5섹션 헤더 "이메일 알림" · 교정 완료 · 결제 영수증 · 크레딧 잔량 (80%) · 약관 변경 · 제품 소식 — 기본 5종 켜짐, 제품 소식만 꺼짐법령상 필수 안내는 토글 꺼도 발송됨 (카피 명시)
10인앱 알림.toggle-row × 2교정 작업 상태(업로드 시작·완료·실패·취소) · 시스템 공지브라우저 알림 권한과 별개. 우상단 공통 알림 패널의 노출 범위를 설정
#billing · 결제·청구
11결제 수단.sso-row 패턴 차용 + 상태 토글카드 마스킹 (●●●● 4821 · 만료 09 / 28) + 변경 CTA → editorial-checkout.html?action=payment-method
미구독 토글: 등록된 결제 수단이 없습니다. + 등록 CTA, 카드 보관 안내 숨김
토스페이먼츠 토큰화 — 카드 번호 미보관 카피. 상태 토글은 결제·청구 패널 안에서만 제공
12사업자 정보.field-row-stack법인명·사업자등록번호·대표자·세금계산서 발행 이메일 — 법인 회원 등록용 (개인은 빈 상태)등록 후 결제일 다음 날 자동 발행
13청구 내역.tbl 5행 / empty state일자 · 항목 · 금액 · PDF 다운로드 · Pro 월간 결제·크레딧 충전 혼재
미구독 토글: 테이블 헤더 유지 + 빈 상태 아직 청구 내역이 없습니다.
오래된 영수증도 다운로드 가능 (5년 보존)
14플랜 관리CTA"마이 플랜으로 이동" → editorial-plan.html (변경·충전·사용량은 그쪽에서)중복 노출 회피 — 진입로만 유지
#coupon · 쿠폰 입력
15쿠폰 입력.coupon-form타이틀 하단 안내: 대소문자 구분 없이 입력할 수 있으며, 적용된 혜택은 즉시 반영됩니다. · 입력 placeholder: 보유한 쿠폰 코드를 입력해주세요. · 빈 값이면 적용 disabled · 입력값 자동 대문자 변환 및 공백 제거 · 입력창 자체 폭은 프로필 입력과 같은 480px · 적용 버튼은 입력창 우측 인라인 배치 · 실패 메시지 영역은 입력창 아래 고정 높이로 확보 · 데모 유효 쿠폰: SIBF2026GIFT (20,000 크레딧, 2026.07.31까지) · 운영 공통 진입 URL: https://editorial.kr/coupon/sibf2026gift · 배너와 QR은 동일 링크를 사용하고, 해당 링크는 쿠폰 코드가 자동 입력된 쿠폰 탭으로 연결입력 전 화면은 제목, 안내 문구, 입력창, 적용 버튼만 유지. 일반 쿠폰 탭 진입(#coupon)은 빈 입력창. 별도 라벨 없음. 모바일에서는 입력창과 적용 버튼을 세로로 쌓아 폭을 채움. 로컬 프로토타입은 from=landing-banner + coupon=SIBF2026GIFT 조합에서만 코드 자동 입력
16성공 상태.coupon-success유효 쿠폰 적용 성공 시 쿠폰 입력 폼 영역이 성공 상태 블록으로 전환 · 체크 아이콘 · 쿠폰 교환 완료 · 20,000 크레딧이 지급되었습니다. · 원고 업로드 primary CTA · 다른 쿠폰 입력 secondary CTA성공은 모달이나 별도 페이지로 띄우지 않고 입력 영역 안에서 안내. 폼 영역 높이를 안정적으로 잡아 쿠폰 사용 이력 표의 위치 변화가 크지 않게 함. SIBF2026GIFT 성공 시 랜딩 서울도서전 쿠폰 배너를 영구 숨김 처리
17실패 피드백.coupon-message이미 사용함: 이미 사용된 쿠폰입니다. · 만료 / 코드 없음은 회원가입 검증 에러와 같은 붉은 inline 텍스트로 입력창 아래 노출실패 상태에서는 카드·공유·업로드 CTA를 노출하지 않음. 메시지 영역은 기본 높이를 확보해 표가 크게 밀리지 않게 함. 현재 세션에서 방금 적용해 이력에 추가된 쿠폰을 다시 입력해도 이미 사용된 쿠폰으로 처리
18쿠폰 사용 이력.coupon-history .tbl섹션 안내: 사용 완료된 쿠폰과 지급 혜택을 확인할 수 있습니다. · 쿠폰 입력 영역 아래 디바이더 후 배치 · 콘텐츠 영역 fill 폭, 24rem 높이 고정 표 · 가로 스크롤 없음 · 행 누적 시 내부 세로 스크롤 · 컬럼: 사용일 / 쿠폰 코드 / 혜택 · 기본 행: WELCOME-5000 · 2026.02.18 · 5,000 크레딧(가입 혜택)결제·청구 탭의 청구 내역 표처럼 콘텐츠 영역 폭을 채움. 사용 완료된 쿠폰 리스트만 보여주므로 상태 컬럼은 노출하지 않음. 읽기 전용 이력 표라 hover 강조도 노출하지 않음. 헤더는 세로 스크롤 중에도 상단에 고정. 회원가입 시 자동 지급되는 5,000 크레딧은 가입일에 쿠폰을 사용한 이력처럼 표시. 유효 쿠폰 적용 성공 시 현재 세션에서 오늘 날짜 행이 상단에 추가됨. 제품 구현은 서버 쿠폰 이력을 기준으로 렌더링

공통 규칙

save · validation · interaction
저장 모델
현재 구현: 프로필 탭의 표시 이름·언어·시간대가 저장된 값과 달라졌을 때만 되돌리기변경사항 저장 버튼 활성화. 저장 클릭 → 600ms 로딩 → 현재 값을 새 저장 기준값으로 갱신 + 성공 토스트. 토글은 클릭 즉시 성공 토스트
쿠폰 입력 탭
쿠폰 입력은 설정의 5번째 탭 #coupon으로 제공한다. 프로필 탭 save-bar에는 쿠폰 입력 버튼을 노출하지 않고, 좌측 설정 탭에서 항상 접근 가능하게 한다. 실패는 입력창 아래 붉은 inline 텍스트로, 성공은 입력 폼 영역을 성공 상태 블록으로 전환해 안내한다. 회원가입 기본 지급 쿠폰 WELCOME-5000은 가입일 사용 완료 이력으로 표시한다
되돌리기
활성화 상태에서 클릭 시 표시 이름·언어·시간대를 마지막 저장 기준값으로 복원하고 버튼을 다시 비활성화. 변경사항 없음 상태에서는 disabled
토글 즉시 적용
현재 구현은 토글 변경 시 성공 토스트만 노출. 제품 구현은 서버 호출(낙관적 UI) + 실패 시 롤백 + 오류 토스트
탭 간 미저장 변경
탭 전환 시 미저장 변경 있으면 확인 모달 (v1.1) — 현재는 hash 전환만
접근성
각 탭 button에 role=tab + aria-selected · 패널에 aria-labelledby. URL hash로 직접 진입 시 해당 탭 자동 활성

미결 사항

open
  • 2FA 실 구현 — 토글 UI만 있고 활성화 흐름(QR / 백업 코드 / 복구) 미설계
  • 계정 삭제 확인 모달은 구현됨. 비밀번호 재인증 + 30일 유예 vs 즉시 삭제 정책은 미정
  • 알림 — 카카오 알림톡 채널 도입 시 이메일/인앱과 별도 채널 토글 추가
  • SSO 연결 해제 흐름 — 비밀번호 미설정 회원이 해제할 때 비밀번호 강제 설정
  • 다국어 — 영어/일본어 출시 시 시간대 옵션 확장 + 카피 번역
  • 모바일 — 5개 탭 기준으로 가로 wrap 유지. 더 좁은 화면에서 가로 스크롤 전환 필요 여부 확인

F16 · P1

플랜 해지

URL
/plan/cancel
테마
라이트 — 미니 topbar (사이드바 없음, 결정 집중)
인증
필수 · 활성 구독자만 진입 (Free 회원은 진입 시 마이 플랜으로 리다이렉트)
역할
구독 해지 의도 사용자에게 결과 명시 + 이탈 사유 수집 + 마지막 마음 변경 기회 제공
진입로
마이 플랜(F12) 하단 텍스트 링크 "플랜 해지"
핵심 결정
해지 진행 (destructive) / 계속 사용하기 (primary, 머무름 유도) — primary가 머무름 액션

레이아웃 · 단일 컬럼

680px max · single column

사이드바 없는 미니 topbar + 중앙 정렬 단일 컬럼. 결제(F13)와 같은 컨버전 집중 패턴 — 다만 여기는 머무름이 primary, 해지가 destructive.

요소 명세

spec · 5 blocks
영역컴포넌트카피 · 데이터비고
1미니 topbar.topbar-mini워드마크 + 알림 아이콘 + 사용자 칩 · 사이드바 미노출 — 결제(F13)와 동일 셸이탈 동선은 최소화하되 로그인 후 공통 알림 접근은 유지
2뒤로가기 + 헤더.back-link + .head뒤로가기: "마이 플랜으로 돌아가기"
H1: 정말 해지하시겠어요?
Sub: 해지는 다음 자동 갱신을 중단하는 절차입니다. 환불을 원하시면 별도 환불 요청이 필요하며, 결제 7일 이내라도 크레딧 사용·원고 처리 여부에 따라 환불 금액이 달라질 수 있습니다.
해지와 환불을 분리 안내 — 결정 정보 차단 회피
3현재 플랜 컨텍스트.contextPro 배지 + 플랜명 · 가입일 · 다음 결제일 mono · 사용자에게 "내 상태"를 다시 보여줌해지 후 일어날 일과 대조 시각화
4해지 후 일어나는 일.timeline 4-step · 지금 — 해지 신청 접수 + 자동 갱신 중단
· 다음 결제일까지 — Pro 기능 그대로 사용 (구독 크레딧 · 무기한 공유 · 우선 처리 · 스타일 가이드 · 협업). 연간 결제 환불 요청 시 제공 완료분과 사용분을 제외한 잔여 미제공 기간 기준으로 산정
· 다음 결제일 이후 — 미구독 상태 전환, 미사용 구독 크레딧 소멸, 충전 크레딧은 그대로 유지, 공유 만료 30일 제한
· 언제든 — 계정·보고서 보존, 재가입 시 이어서 사용
"잃는 것"을 명시하되 협박조 회피 — 실제 약관 그대로 안내
5이탈 사유.reasons-grid 2-col + textarea 6 체크리스트 (선택): 가격 · 사용 빈도 · 대체 도구 · 결과 불만 · 기능 부족 · 비공개
자유 의견 textarea — 이메일 회신 안내
모두 선택. 제출하지 않아도 해지 가능
6최종 액션.actions 좌: 계속 사용하기 (primary, Press Black fill) — 머무름이 시각적 우선
우: 해지 진행 (destructive · 보더만, 채움 없음)
· 상단 1px 보더로 구분
primary는 머무름 액션 — 다크 패턴 회피, 다만 destructive도 동등하게 접근 가능 (회피적 disabled 아님)

UX 규칙

retention · honesty
다크 패턴 회피
해지 버튼은 보더만 있는 destructive 스타일로 시인성 충분히 유지. disabled·축소·숨김 처리 금지
머무름 우선 시각
"계속 사용하기"가 primary fill(머무름 유도). 다만 "해지 진행"도 동등하게 클릭 가능 — 사용자 의사 존중
해지 즉시 효과
자동 갱신 중단은 즉시 적용. 기능 제한은 다음 결제일에 적용한다. 환불은 별도 요청이 있을 때 환불정책 v2 기준으로 산정한다
충전 크레딧 보존
해지해도 충전 크레딧은 만료 없이 유지. 미구독 상태에서도 사용 가능
이탈 사유 수집
익명 통계로만 사용. 자유 의견에 이메일 명시한 경우만 회신. 마케팅 재유치 거부 옵션 제공 (v1.1)
해지 완료 안내
현재 구현: "해지 진행" 클릭 → 확인 모달(선택한 사유 요약, 경고, 돌아가기/해지 확인) → 확인 시 성공 토스트 후 editorial-plan.html로 이동. 완료 화면/메일 발송은 후속
접근 제한
Free 회원이 직접 URL 진입 시 마이 플랜으로 리다이렉트 (해지할 구독 없음)

미결 사항

open
  • 해지 확인 모달은 구현됨. destructive 액션 후 비밀번호 재확인 vs 현재처럼 즉시 처리할지 정책 결정 필요
  • 해지 완료 안내는 현재 마이 플랜 이동 + 토스트. 별도 완료 페이지/메일 발송 도입 여부 결정
  • 해지 후 재가입 시 동일 플랜·할인 유지 정책
  • 연간 구독 중도 환불 — v2 기준 반영. 제공 완료분/사용분/할인 정산/PG 수수료 공제 가능 범위는 운영 전 최종 확정
  • 이탈 사유 → 제품팀 dashboard 연결 (v1.2)
  • 가격 부담 사유 선택 시 할인 쿠폰 제안 (v2 retention) — 다크 패턴 우려, 신중 검토 필요

M · 모달 레지스트리 / 탭 프리뷰

모달

포함
로그인 · 업로드 · 분석 중 · 공유 · 다운로드 · 스타일 분석 · 계정 삭제 확인 · 플랜 해지 확인 · 검색 오버레이
파일
editorial-modals.html 정적 프리뷰 + js/editorial-interactions.js 런타임 모달
공통
디자인 시스템 §12 modal 패턴 준수 · backdrop rgba(17,17,17,.55) · radius 6 · shadow 0 20 60 · max-height 100vh - 4rem

모달 시안

tabs · one preview at a time

프리뷰는 탭으로 전환한다. 상태가 있는 모달은 해시를 분리하되 한 화면에는 하나의 시안만 노출해 검토 길이를 줄인다.

로그인 모달 — 라이트 변형

md 560

인앱 컨텍스트에서 인증 필요 시 호출. 독립 페이지(다크)와 구조 동일, 탑 내비/푸터 제거 + 닫기 X 우상단 + 라이트 테마.

호출 트리거
랜딩 분석 시작 · 미인증 보고서 진입 · 공유 링크 외부 접속 · 세션 만료
독립 페이지와의 차이
탑 내비 제거 · 푸터 제거 · 워드마크 48px · 다크→라이트 테마
닫기
X · backdrop 클릭 · Esc 모두 허용 (로그인 폼 입력은 짧고 복구 가능하므로)
성공 후
호출 시점의 액션 자동 재개 — 랜딩 업로드 CTA → 로그인 완료 → 업로드 모달 즉시 진입

업로드 5단계 모달

lg 720 · 5 steps

라이브러리·랜딩에서 업로드 진입 시 호출. 실제 런타임은 ① 원고 선택 → ② 크레딧 확인 → ③ 교정 서브스테이지 5개 → ⑤ 완료로 진행한다. ④ 검증은 정적 시안과 코드 분기는 남아 있으나 현재 정상 플로우에서는 직접 도달하지 않는 참고 상태다.

단계타이틀명세
원고 선택원고 업로드 + PDF·DOCX·HWP·HWPX. 파일 선택 전은 원고를 드래그하거나 클릭하여 업로드 + 다음 버튼 disabled, 선택 후는 파일명 미공개 단행본 — 김작가 원고.hwp + 다음 버튼 enabled
크레딧 확인교정을 시작합니다
행 3개: 원고 분량 42,318자 · 사용할 크레딧 42,318 · 보유한 크레딧 67,580
정상 상태 CTA: 교정 시작
이전 버튼으로 ① 원고 선택 복귀
② 부족크레딧 부족상단 경고 박스는 사용하지 않는다. 크레딧 표 박스 바깥, 우측 정렬 보조문구로 60,840 크레딧이 더 필요합니다.를 표시한다. 보조문구는 표와 2px 간격을 두고, 텍스트 색상은 #DC2626으로 고정한다. Free/Basic 사용자는 크레딧 구매를 왼쪽, 강조 버튼 플랜 업그레이드를 오른쪽에 수평 1줄로 노출한다. Pro/Enterprise 사용자는 개인 플랜 상향 여지가 없으므로 플랜 업그레이드를 숨기고 크레딧 구매만 노출한다. 내용이 뷰포트보다 길면 모달 본문에서 세로 스크롤한다.
교정 진행교정 중 · 실제 런타임은 5개 서브스테이지를 순차 노출: 18% 원고 구조 파악 → 36% 맞춤법·띄어쓰기 → 54% 어법·표현 → 74% 문체·리듬 → 92% 일관성 분석·보고서 정리
CTA: 백그라운드로 진행
닫기 X 제거 — 의도치 않은 이탈 방지
검증 참고검증 중 82% 화면은 정적 갤러리와 코드 분기에는 존재하지만, 현재 교정 시작 이후 자동 플로우에서는 호출되지 않는다. 제품 기준 시나리오에서는 ③의 5번째 서브스테이지 뒤 바로 ⑤ 완료로 이동한다.
완료보고서가 준비되었습니다 + 253건의 수정 제안이 정리되었습니다 + 체크 아이콘 + 통계 (교정 187 · 교열 42 · 윤문 24)
CTA: 라이브러리로 (ghost) · 보고서 열기 (primary)

공유 모달

md 560

보고서 공유 링크 생성. 실제 런타임은 디자이너용 before/after 스위처를 노출하지 않고, 같은 모달 안에서 링크 생성 후 링크 박스와 비활성화된 생성 버튼 상태를 보여준다.

상태
생성 전: 공유 링크를 생성합니다 + 링크 생성 CTA. 생성 후: 제목은 유지하고 공유 링크 박스 노출, CTA는 생성됨 disabled로 전환
구조
경고 배너 · 만료 기간 (7일 / 30일 / 무기한) · 원본 다운로드 허용 체크박스 · 생성 후 공유 링크 + 복사 + 공유된 보고서 보기 링크 노출
경고
미공개 원고가 노출됩니다. + 링크를 가진 누구나 보고서를 열람할 수 있습니다. — 실제 런타임 카피 기준
기본값
만료 30일 · 다운로드 허용 off
링크
editorial.kr/shared/x9k2-p4mb-7n3q — 추측 불가 토큰. /shared/:token 라우트
닫기
closeOnBackdrop=false. 취소 버튼 또는 X/Esc로 닫는다. 링크 비활성화, 완료 액션은 현재 런타임에서 제공하지 않는다.

다운로드 모달

md 560

보고서/라이브러리의 다운로드 액션에서 호출. 포함할 제안 상태와 받을 파일을 모달 안에서 직접 선택한다.

제목
보고서를 어떻게 받을까요? · 포함할 제안 상태와 받을 파일을 직접 선택할 수 있습니다.
포함할 제안
모든 제안 포함 체크박스 + 하위 상태 승인, 무시, 미선택. 하위 상태 일부 해제 시 상위 체크박스는 indeterminate
받을 파일
보고서 PDF · 주석 원본 파일. 주석 원본은 DOCX/HWPX/PDF 파일을 받는 설명으로 표기
검증
포함할 제안 상태 또는 받을 파일이 0개이면 경고 토스트. 정상 선택 시 모달 닫힘 + 선택한 조건으로 다운로드를 시작했습니다. 성공 토스트
CTA
취소 ghost · 선택한 파일 받기 primary + 다운로드 아이콘

분석 중 모달

md 560

라이브러리나 외부 진입에서 이미 분석이 진행 중인 작업을 보여주는 독립 진행 상태. 업로드 ③·④의 단계형 진행과 달리, 전체 분석 진행 상황을 한 장으로 요약한다.

상태 표시
워드마크 · 40% 원형 파이 · 회전 카피 4종(문장을 읽고 있습니다 / 맥락을 잡고 있습니다 / 제안을 다듬고 있습니다 / 일관성을 점검하고 있습니다)
단계
구조 · 맞춤법 완료, 어법 active, 문체 · 일관성 pending. role="status" + aria-live="polite"
안내
평균 7분 안에 완료 · 화면을 닫아도 진행 지속 · 완료 시 메일과 알림 안내
CTA
분석 취소 ghost · 라이브러리로 돌아가기 primary

스타일 분석 모달

lg 720

보고서에서 호출. 수치가 과도한 평가가 아닌 관찰 — 편집자의 조감 판단을 도와주는 자료.

구성
실제 런타임 기준: 상단 3개 지표 카드(일관성 지수 86/100 · 평균 문장 길이 24.8자 · 검토 후보 26개) + 탭 3개(용어집 / 문장 길이 / 반복어)
용어집
기본 탭. 작가가 일관되게 사용한 표기 3개: 밀리미터 · 로테르담 · 에디터
문장 길이
5,840개 문장 기준 히스토그램. 25자 전후 구간을 peak로 표시하되 평가는 하지 않는다.
반복어
윤문 검토 후보: 문득 42회 · 어쩐지 31회 · 가만히 24회. 반복 표현 리스트는 현재 구현에 포함된다.
"단행본 평균 대비 짧음" 식 서술 — 평가가 아닌 관찰
CTA
PDF로 받기 (ghost) · 보고서로 돌아가기 (primary)

모달 공통 규칙

cross-modal
어휘
"토큰" 금지. 결제·업로드 비용 확인에서는 크레딧으로 통일하고, 원고 길이는 단위로 병기한다. "사용량"은 플랜/설정 화면에서만 제한적으로 사용
취소 vs 다음
좌상 ghost "취소"/"이전" · 우하 primary 구체 동사 ("교정 시작" "보고서 열기")
닫기 X
step ③·④ 교정/검증 중에는 X 제거 — 백그라운드로 유도
backdrop
런타임 공통 모달은 기본적으로 backdrop 클릭 닫힘을 허용하되, 공유 생성처럼 위험 확인이 필요한 모달은 closeOnBackdrop=false로 차단. M 갤러리의 닫기/백드롭은 시안 요소
focus
런타임 공통 모달은 첫 인터랙티브에 초기 포커스 + Esc 닫기를 제공. Tab 순환 focus trap과 닫힌 후 트리거 복귀는 후속 구현
백그라운드 이행
교정/검증 모달 이탈 → 현재 구현은 토스트로 업로드 처리는 백그라운드에서 계속됩니다 안내. 상태 변화는 우상단 알림 패널에 누적되며, 진행 인디케이터와 완료 알림 자동 열림은 후속 구현
모바일
768 미만: backdrop 하단 정렬 (sheet) · 최대 높이 92vh · 내부 스크롤

미결 사항

open
  • 업로드 ② 부족 시 플랜 업그레이드크레딧 구매가 각각 체크아웃의 어떤 요약 상태로 진입할지 URL 파라미터 정책 확정
  • 편집장 선 결재 한도 · 대표 결재 필요 시 UX (결제 승인 대기 모드)
  • 플랜/프레이밍 명칭 (Basic / Pro)
  • 스타일 분석 지표의 과학적 근거 — 어떤 코퍼스와 비교하는지
  • 공유 링크 접근자 행동 추적 · 공유자에게 알림 제공
  • 모바일 업로드 — 파일 선택 UI