# preflight — 출시 전 감사 5단계에서 읽는다. **자기 결과물을 남의 것처럼 본다.** 통과 못 한 항목은 4단계로 돌아가 고친다. 슬롭 지문 검출과 자가 채점표는 `references/antipatterns.md` 에 있다. 이 문서는 **그 외 전부**를 다룬다. --- ## 0. 먼저 기계로 검사한다 **무엇에 돌리는가부터 정해라.** - 정적 HTML/CSS 프로젝트 → 소스 그대로 - **React·Vue·Astro 등 프레임워크 프로젝트 → 프로덕션 빌드 결과에 돌린다.** 소스만 보면 렌더된 DOM 이 없어 대비·가로 스크롤·LCP 를 잴 수 없다. `pnpm build && pnpm preview` 로 띄우고 그 URL 을 검사해라 - **소스만 보고 "측정 불가"로 남기지 마라.** 미측정은 통과가 아니다 grep 검사는 **주석과 문자열을 제외**해라. "100vh 금지"라고 쓴 주석이 게이트 #9 에 걸리는 오탐이 실제로 나왔다. 사람 눈보다 정확하고 빠르다. 셋 다 돌려라. ### A. 이펙트 전부 끄기 ```css /* 임시로 주입해서 확인한다 */ *, *::before, *::after { filter: none !important; backdrop-filter: none !important; animation: none !important; transition: none !important; transform: none !important; } canvas { display: none !important; } ``` 이 상태에서 **페이지가 여전히 읽히고 구조가 살아 있어야 한다.** 무너지면 이펙트가 구조를 대신하고 있는 것이다. 4-1로 돌아가라. ### B. 슬롭 지문 grep `references/antipatterns.md` 의 grep 목록을 소스에 돌린다. 검출률 상위 항목(보라 CTA, 전체 대문자 헤드라인, 번호 매긴 1·2·3 단계)부터. ### C. 카피 경쟁사 치환 제품명을 경쟁사 이름으로 바꿔 읽는다. **문장이 그대로 성립하면 그 카피는 아무것도 말하지 않았다.** 히어로 문구부터 검사한다. ### D. 죽은 코드·토큰 위생 (design-gate 내장 검사) - CSS 클래스가 HTML·JS 어디에도 등장하지 않으면 죽은 것이다. 컴포넌트를 없앨 때 HTML·CSS·JS 를 **삼위일체로** 지웠는지 대조한다(동적 클래스 `is-${type}`·`seg-${n}` 처럼 조립되는 접두사는 게이트 설정의 `deadCssIgnore` 로 제외한다) - 토큰 파일이 있는데 다른 CSS 파일에 색 리터럴(hex·rgb)이 남아 있으면 실패다. 반지름 리터럴도 마찬가지 — 눈 검사로는 절대 전부 못 잡는다(실측: 8건의 상수색이 눈 검사를 통과했다) - `theme-color` 메타가 실제 배경색과 다르면 **낡은 토큰**이다. 프리셋 전환에서 브랜드 표면(theme-color·파비콘·og:image)이 누락됐다는 뜻이다 ### E. 왼쪽 인셋 리듬 (모바일) 오버플로 검사는 오른쪽만 본다 — **왼쪽이 붙어 깨지는 결함은 통과한다**(실측: 제목 16px·앱바·카드 24px 혼재가 게이트를 통과해 사용자 보고로 나왔다). 모바일 폭(320·390)에서: - 화면의 모든 보이는 텍스트 시작점 ≥ 12px - 헤더 텍스트·화면 제목·카드 텍스트가 **같은 축**(±10px) - 측정은 전폭 컨테이너의 보더박스가 아니라 **텍스트 시작점**, `display:none` 요소(rect=0)는 제외하고 --- ## 1. 접근성 — 타협 없음 | 항목 | 확인 방법 | 기준 | |---|---|---| | 키보드 도달 | Tab 만으로 순회 | 모든 인터랙티브 요소에 도달, 순서가 시각 순서와 일치 | | 포커스 표시 | Tab 하며 눈으로 | 항상 보인다. `outline: none` 만 있고 대체가 없으면 실패 | | 대비 | 측정 도구 (아래 주의) | 본문 4.5:1, 큰 글자·UI 3:1 | | 이미지 대체텍스트 | 소스 확인 | 의미 있는 이미지에 alt, 장식은 `alt=""` | | 폼 레이블 | 소스 확인 | 모든 입력에 연결된 `