# experimental-canvas — HTML-in-Canvas 실전 지침
Chrome의 HTML-in-Canvas API로 **실제 HTML 요소를 캔버스 픽셀/GPU 텍스처로 그린다.** 요소는 DOM에 남아 클릭·포커스·접근성이 유지된다. 구현 직전에 읽는 문서다.
## 이 문서를 읽는 법
| 상황 | 읽을 곳 |
|---|---|
| **쓸지 아직 안 정했다** | **§1만.** 세 관문 중 하나라도 걸리면 "쓰지 않는다"로 끝난다 |
| 지금 브라우저에서 되는지 | §2 — 읽는 시점에 다시 확인 |
| 어떤 경로로 구현하나 | §3 → §7 (b) 권장 기본 경로 |
| API 이름·시그니처 | §4 (낡은 이름 목록 포함) |
| 깨지지 않게 지킬 것 | §5 필수 계약 3가지, §6 그리지 않는 것 |
| 복사해 시작할 코드 | §7 (a)~(c). CDN을 쓰면 (b)의 공급망 규칙을 먼저 |
| 구현을 마무리할 때 | §8 접근성 자기 점검, §9 흔한 실패. 납품 판정은 [preflight.md](preflight.md) X5 |
## 1. 발동 조건 게이트
**기본값은 "쓰지 않는다".** 세 관문을 전부 통과할 때만 진행한다.
### 관문 1 — 셰이더가 HTML의 렌더된 픽셀을 읽어야 하는가
| 하려는 것 | 판정 |
|---|---|
| 글로우, 파티클, 커서 트레일, 배경 그라디언트 | **배경 캔버스 오버레이로 충분.** 쓰지 마라 |
| 유리 굴절, 프로스티드 패널 | **SVG `feDisplacementMap` + `backdrop-filter`** |
| 카드/패널을 3D로 기울이기 | **`CSS3DRenderer`.** DOM 그대로라 완벽하다 |
| 상태 A → B 페이지 전환 | **View Transitions + `mask-image`** |
| 텍스트를 픽셀 단위로 왜곡, 요소의 일부만 압축 | 후보 |
| 라이트/다크 두 렌더를 노이즈로 픽셀 합성 | 후보 |
| 렌더된 픽셀의 휘도·엣지에 반응하는 효과 | 후보 |
| 3D 메시 위의 상호작용 UI (천, 책, 화면) | 후보 |
배경 캔버스는 **그릴 수는 있어도 읽을 수는 없다.** 읽어야만 하는 경우가 아니면 탈락이다.
### 관문 2 — 폴백이 이미 완성되어 있는가
**폴백 없는 구현은 금지다.** 순서를 뒤집지 마라.
1. HTML/CSS만으로 페이지를 **완성**한다. 레이아웃·포커스 순서·읽기 순서는 여기서 끝난다.
2. 폴백 이펙트(SVG 필터 / CSS 트랜지션 / 배경 캔버스)를 붙여 **그 상태로 출시 가능하게** 만든다.
3. 그 위에 HTML-in-Canvas를 **얹는다**.
캔버스는 장식이다. 구조가 아니다.
### 관문 3 — 맥락이 허용하는가
사용자가 **명시적으로 실험을 원했거나**, **데모·포트폴리오·사내 도구**처럼 브라우저를 통제할 수 있을 때만. 일반 사용자 대상 프로덕션이면 여기서 멈춘다.
## 2. 가용성 — 읽는 시점에 반드시 확인
| 항목 | 값 (chromestatus 확인 2026-10-06) |
|---|---|
| 플래그 | `chrome://flags/#canvas-draw-element` → Enabled |
| 권장 브라우저 | Chrome Canary 149+ |
| Origin Trial | Chrome 148 ~ **160**(두 차례 연장) |
| Stable 기본 활성화 | **아직 없음.** 상태 표시는 `In development`다. Chrome **157** 출하 절차(Intent to Ship)가 올라가 있고 M157 안정판 예정일은 2026-11-03이다. 출하 전에는 일정이 밀리거나 취소될 수 있다 |
| Safari | 입장 Positive, 초기 구현 착수. 출하 버전 없음 |
| Firefox | 구현 없음, 입장 미표명 |
**출하 전까지는 OT 토큰이나 플래그 없이는 아무것도 보이지 않는다. 출하된 뒤에도 Safari·Firefox 사용자에게는 폴백이 곧 실제 결과물이다.** 관문 3은 출하와 무관하게 유지한다 — 엔진 하나만 지원하는 기능을 일반 사용자 대상 프로덕션의 구조로 쓰지 않는다. 읽는 시점에 `chromestatus.com/feature/5172548013916160`과 `chrome://version`으로 출하 여부를 다시 확인한다.
## 3. 권장 경로 — 폴리필 우선
3D를 쓴다면 **`three-html-render` 폴리필로 시작한다.** three.js 공식 예제가 쓰는 방식이다. 네이티브가 있으면 `texElementImage2D` fast path, 없으면 `foreignObject` 래스터화 + `matrix3d` DOM 오버레이로 **자동 전환**된다. 같은 코드가 전 브라우저에서 돌고 상호작용도 유지된다.
폴리필 한계: `textarea` 내부 스크롤 미반영, `contenteditable` 캐럿/선택 미렌더, 동적 스타일시트 수동 무효화 필요, `:visited` 불가. **매 프레임 재캡처는 비싸다 — 무효화 시점에만 갱신하도록 짜라.** 2D 전용 이펙트라면 폴리필 없이 능력 감지 분기(§7c)로 간다.
## 4. 현재 API 표면
`