diff --git a/FIGMA-DESIGN-LANGUAGE.md b/FIGMA-DESIGN-LANGUAGE.md
deleted file mode 100644
index b714ea9..0000000
--- a/FIGMA-DESIGN-LANGUAGE.md
+++ /dev/null
@@ -1,112 +0,0 @@
-# Figma Design Language Analysis
-
-> Phase 1 결과 문서 (2026-04-07)
-> Figma Source: `9S6LsQyO6zlRxtiqZccOUM` / Page 1
-
-## 1. 스코프
-
-| 프레임 | 역할 | 판정 |
-|--------|------|------|
-| Frame 1 (1:3) | 3D 수렴 화살표 | 서브 컴포넌트 (장식 이미지) |
-| Frame 2 (1:5) | Solution 제작 목표 | **블록화** → hero-icon-cards |
-| Frame 3 (1:35) | 정책 달성 (Engn.Solution vs DfMA) | **블록화** → compare-2col-badge |
-| Frame 4 (1:49) | 과정 vs 결과의 혁신 | **블록화** → compare-detail-gradient |
-| Frame 5 (1:74) | 상세보기 버튼 | 서브 컴포넌트 (CTA) |
-| Frame 6 (1:80) | 정책방향 (세로 문서) | **제외** (1280×720 부적합) |
-
-## 2. 스케일 변환
-
-Figma 캔버스 → 슬라이드(1280px) 변환 비율:
-- Frame 2, 3: ×0.71 (1808px → 1280px)
-- Frame 4: ×0.33 (3848px, 양쪽 합쳐서 2패널)
-
-| Figma | 슬라이드 환산 | 역할 |
-|-------|-------------|------|
-| 70px | 28-35px | 대섹션 헤더 |
-| 60px | 24-28px | Hero 메시지 |
-| 50px | 22-26px | 섹션 제목, 배지 |
-| 45px | 20-22px | 카드 타이틀 (EN) |
-| 40px | 16-20px | 본문 |
-| 35px | 14-18px | 부제, 한국어 서브 |
-| 32px | 12-14px | 버튼 |
-
-## 3. 색상 팔레트 (Warm Theme)
-
-기존 블루/슬레이트 테마와 **병존**하는 새 팔레트:
-
-| 토큰 | Hex | Figma 원본 | 용도 |
-|------|-----|-----------|------|
-| `--color-warm-brown` | `#5C3714` | rgba(92,55,20) | 과정/프로세스 섹션 제목 |
-| `--color-dark-teal` | `#084C56` | rgba(8,76,86) | 결과/디지털 섹션 제목 |
-| `--color-teal` | `#227582` | rgba(34,117,130) | 설명 텍스트 |
-| `--color-forest` | `#548235` | rgba(84,130,53) | 배경 그라디언트 |
-| `--color-beige` | `#E4D9C0` | rgba(228,217,192) | 서브틀 배경/버튼 |
-| `--color-warm-yellow` | `#FAEDCB` | rgba(250,237,203) | 하이라이트 바 |
-
-### 그라디언트 패턴
-- 왼쪽(과정): `rgba(165,161,150,0.10) → rgba(57,50,30,1.00)` (베이지→브라운)
-- 오른쪽(결과): `rgba(41,107,85,0.10) → rgba(3,33,24,1.00)` (틸→다크)
-- 버튼: `rgba(255,255,255,0.00) → rgba(228,217,192,1.00)` (투명→베이지)
-- 배경: `rgba(84,130,53,1.00) → rgba(37,62,31,0.00)` (그린→투명)
-
-## 4. 타이포그래피
-
-- **폰트**: Pretendard Variable 유지 (Noto Sans KR은 이미 fallback)
-- **핵심은 크기/굵기 위계**
-
-| 레벨 | 크기 (슬라이드) | Weight | 스트로크 | 정렬 |
-|------|---------------|--------|---------|------|
-| Hero Statement | 24-28px | 700 | white 1.5px | center |
-| Section Header | 28-35px | 900 | white 5px | center/left |
-| Badge Title | 22-26px | 700 | 없음 | center |
-| Card Title (EN) | 20-22px | 900 | white 5px | center |
-| Card Subtitle (KR) | 14-18px | 500 | white 1.5px | center |
-| Body Text | 16-20px | 700 | white 1px | left |
-| Section Sub-title | 22-26px | 900 | 없음 | left |
-
-### 텍스트 스트로크 기법
-Figma 디자인의 특징: 다양한 배경 위에서 가독성 확보를 위해 **흰색 스트로크** 사용
-```css
--webkit-text-stroke: 1.5px white; /* 일반 텍스트 */
--webkit-text-stroke: 5px white; /* 강조 텍스트 */
-paint-order: stroke fill; /* 스트로크가 텍스트 뒤로 */
-```
-
-## 5. 레이아웃 패턴
-
-### A. Badge Header
-- 이미지/그라디언트 배경 위 `border-radius: 20px` 바
-- 중앙 흰색 텍스트 (50px/700 → 22-26px/700)
-- 높이: ~88px (Figma) → ~44-50px (슬라이드)
-
-### B. Hero Statement
-- 전체 폭 중앙 정렬
-- 큰 텍스트 (60px/700) + 흰색 스트로크
-- 키워드 **굵은 강조** 가능
-
-### C. Icon Card Row
-- N개 카드 수평 배치, 세로 구분선
-- 각 카드: 아이콘 이미지 + 영문 제목(900) + 한국어 부제(500)
-- 흰색 둥근 컨테이너 (borderRadius: 20)
-
-### D. Two-Col Comparison
-- 좌/우 그라디언트 배경
-- 각 열: 헤더 바 + (섹션 제목 + 본문) × N개
-- 색상으로 좌/우 구분 (브라운 vs 틸)
-
-### E. CTA Button
-- 그라디언트 바 (투명→베이지) + 둥근 버튼 (r:7)
-- 흰색 텍스트
-
-## 6. 디자인 시스템 vs 콘텐츠 전용 경계
-
-### 디자인 시스템 (블록에 포함)
-- 색상 팔레트, 그라디언트 패턴
-- 타이포그래피 위계, 텍스트 스트로크
-- 둥근 모서리 컨테이너 (r:20)
-- Badge Header, 2열 비교, N열 카드 레이아웃 구조
-
-### 콘텐츠 전용 (블록에 포함하지 않음)
-- 3D 화살표 이미지 (Frame 1) → 콘텐츠가 제공
-- 특정 아이콘 이미지들 (brain, thunder 등) → 콘텐츠가 제공
-- 도메인 텍스트 → 슬롯으로 처리
diff --git a/FIGMA-EXTRACTION.md b/FIGMA-EXTRACTION.md
deleted file mode 100644
index 6592f1c..0000000
--- a/FIGMA-EXTRACTION.md
+++ /dev/null
@@ -1,441 +0,0 @@
-# Figma → HTML 블록 변환 프로세스
-
-> 2026-04-07 확립. Figma 디자인을 design_agent 블록으로 변환하는 정확한 방법론.
-
----
-
-## 1. 전체 워크플로우
-
-```
-[Step 1] Figma API로 파일 구조 추출
- ↓
-[Step 2] 프레임별 렌더링 이미지(PNG) 다운로드
- ↓
-[Step 3] 노드별 상세 데이터 추출 (좌표, 색상, 폰트, 크기)
- ↓
-[Step 4] 디자인 언어 분석 (공통 패턴 vs 콘텐츠 전용 구분)
- ↓
-[Step 5] 블록 설계 (슬롯, 동적 규칙, schema)
- ↓
-[Step 6] 수학적 계산 (Figma 좌표 → 스케일 → CSS값)
- ↓
-[Step 7] HTML/CSS 구현
- ↓
-[Step 8] 비교 리뷰 (Figma PNG vs HTML, 같은 폭으로 위/아래 배치)
- ↓
-[Step 9] 피드백 반영 → Step 6~8 반복
- ↓
-[Step 10] Jinja2 템플릿화 + catalog.yaml 등록
-```
-
----
-
-## 2. Figma API 사용법
-
-### 2.1 파일 구조 가져오기
-```bash
-curl -s -H "X-Figma-Token: {TOKEN}" \
- "https://api.figma.com/v1/files/{FILE_KEY}" \
- | python -m json.tool
-```
-
-### 2.2 특정 노드 상세 데이터
-```bash
-curl -s -H "X-Figma-Token: {TOKEN}" \
- "https://api.figma.com/v1/files/{FILE_KEY}/nodes?ids={NODE_IDS}&geometry=paths"
-```
-
-### 2.3 노드 이미지 렌더링 (PNG)
-```bash
-curl -s -H "X-Figma-Token: {TOKEN}" \
- "https://api.figma.com/v1/images/{FILE_KEY}?ids={NODE_IDS}&format=png&scale=2"
-```
-- `scale=2`: 2배 해상도로 다운로드 (선명도 확보)
-- 응답의 `images` 객체에 각 노드 ID별 S3 URL 제공
-
-### 2.4 추출해야 하는 핵심 데이터
-
-| 데이터 | API 필드 | 용도 |
-|-------|---------|------|
-| 위치 | `absoluteBoundingBox.x, .y` | 요소 간 관계 계산 |
-| 크기 | `absoluteBoundingBox.width, .height` | 스케일 계산 |
-| 텍스트 | `characters` | 콘텐츠 확인 |
-| 폰트 | `style.fontFamily, .fontSize, .fontWeight` | 타이포그래피 |
-| 색상 | `fills[].color` | 색상 팔레트 |
-| 테두리 | `strokes[], strokeWeight` | 박스 스타일 |
-| 라운드 | `cornerRadius` | border-radius |
-| 이미지 | `fills[].imageRef` | 이미지 자산 식별 |
-
----
-
-## 3. 수학적 계산 (핵심)
-
-### 3.1 스케일 팩터
-
-```
-슬라이드 콘텐츠 폭 = 1280px - padding(40px × 2) = 1200px
-
-scale = 1200 / figma_frame_width
-```
-
-| Figma 프레임 | 폭 | 스케일 |
-|-------------|-----|--------|
-| Frame 2 | 1808px | 0.6637 |
-| Frame 3 | 1807px | 0.6641 |
-| Frame 4 | 3848px | 0.3118 |
-
-### 3.2 요소 간 정렬 계산
-
-**절대 원칙: Figma 좌표 차이값 → 스케일 적용 → CSS값**
-
-```python
-# 예: 리본 접힘선과 박스 테두리 정렬
-badge_y = 1431 # Figma에서 badge 이미지 top Y
-box_y = 1449 # Figma에서 box top Y
-fold_offset = box_y - badge_y # = 18px (Figma 기준)
-
-# 스케일 적용
-fold_offset_css = round(fold_offset * scale) # = 12px (CSS)
-```
-
-**금지: "좀 더 올려볼게요" 식의 시행착오 px 조정**
-
-### 3.3 이미지 자산 크기 계산
-
-```python
-# Figma 원본 크기에 스케일 적용
-ribbon_width_css = round(badge_img_width * scale)
-ribbon_height_css = round(badge_img_height * scale)
-
-# 비율 계산 (CSS에서 width만 지정하면 height는 자동)
-aspect_ratio = badge_img_width / badge_img_height
-```
-
-### 3.4 패딩/여백 계산
-
-```python
-# 리본이 박스 안에 들어오는 높이 = 리본 전체 높이 - 접힘선 오프셋
-ribbon_inside_box = ribbon_height_css - fold_offset_css
-
-# 박스 상단 패딩 = 리본 침입 높이 + 여유
-box_padding_top = ribbon_inside_box + 6 # 6px 여유
-```
-
-### 3.5 실제 계산 예시 (Frame 2)
-
-```
-입력 (Figma 원본):
- badge 이미지: 508×94px, y=1431
- box: y=1449
- frame width: 1808px
-
-계산:
- scale = 1200/1808 = 0.6637
- ribbon_w = 508 × 0.6637 = 337px
- ribbon_h = 94 × 0.6637 = 62px
- fold_offset = (1449-1431) × 0.6637 = 12px
- ribbon_below_fold = 62 - 12 = 50px
- box_padding_top = 50 + 6 = 56px
-
-CSS 출력:
- .ribbon { width: 337px; top: -12px; }
- .box { padding-top: 56px; }
-```
-
----
-
-## 4. 이미지 자산 처리
-
-### 4.1 CSS로 만들면 안 되는 것
-
-| 요소 | 이유 | 처리 |
-|------|------|------|
-| 3D 리본/두루마리 | 입체감, 그림자, 곡면 → CSS 불가 | Figma에서 PNG 추출 |
-| 복잡한 그라디언트 배경 | 다중 정지점, 비선형 → CSS 근사 불가 | 이미지 사용 |
-| 아이콘 이미지 | 디자이너가 만든 고유 자산 | 원본 이미지 사용 |
-
-### 4.2 CSS로 만들 수 있는 것
-
-| 요소 | CSS 구현 |
-|------|---------|
-| 단색/2색 그라디언트 배경 | `linear-gradient()` |
-| 둥근 모서리 테두리 박스 | `border + border-radius` |
-| 텍스트 스타일 | `font-size, font-weight, color` |
-| 그리드/플렉스 레이아웃 | `display: grid / flex` |
-| 구분선 | `border` or `background` |
-
-### 4.3 이미지 추출 및 저장
-
-```bash
-# Figma API로 특정 노드 이미지 추출
-curl -s -H "X-Figma-Token: {TOKEN}" \
- "https://api.figma.com/v1/images/{FILE_KEY}?ids={NODE_ID}&format=png&scale=2"
-
-# 다운로드 → static/figma-assets/ 에 저장
-curl -s -o static/figma-assets/{name}.png "{S3_URL}"
-```
-
-저장 위치: `static/figma-assets/`
-
----
-
-## 5. 비교 리뷰 페이지 작성법
-
-### 5.1 레이아웃
-
-```
-같은 폭으로 위/아래 배치 (좌/우 아님 — 크기 차이 문제)
-
-┌─ 빨간 테두리 ──────────────┐
-│ Figma Original (PNG) │
-└─────────────────────────────┘
- ─ 구분선 ─
-┌─ 초록 테두리 ──────────────┐
-│ HTML Block │
-└─────────────────────────────┘
-```
-
-### 5.2 HTML 스케일링
-
-```css
-.html-inner {
- width: 1280px; /* 슬라이드 원본 크기 */
- transform-origin: top left;
- transform: scale(0.74); /* 960px 컨테이너에 맞춤: 960/1280 */
-}
-```
-
-### 5.3 비교 리뷰 파일 위치
-
-`data/figma_ref/comparison.html`
-
----
-
-## 6. Jinja2 템플릿 변환 규칙
-
-### 6.1 고정값 → 변수
-
-```html
-
-정책 달성 → {{ badge_title }}
-Engn. Solution → {{ left_title }}
-```
-
-### 6.2 반복 요소 → 루프
-
-```html
-
-{% for card in cards %}
-
-```
-
----
-
-## 7. 디자인 언어 vs 콘텐츠 전용 구분
-
-### 디자인 언어 (블록에 포함, 재사용 가능)
-- 색상 팔레트 (warm 테마: 브라운, 틸, 베이지)
-- 타이포그래피 위계 (크기, 굵기 단계)
-- 레이아웃 구조 (2열 비교, N열 카드 등)
-- 장식 요소 (3D 리본, 둥근 컨테이너)
-
-### 콘텐츠 전용 (블록에 포함하지 않음)
-- 특정 텍스트 ("디지털전환은 사용자...")
-- 특정 아이콘 이미지 (brain, thunder 등)
-- 도메인 전문 용어 (DfMA, Engn. Solution)
-
----
-
-## 8. 파일 구조
-
-```
-design_agent/
-├── static/figma-assets/ ← Figma에서 추출한 이미지 자산
-│ ├── badge_policy.png (틸 3D 리본)
-│ ├── badge_solution.png (빨간 3D 리본)
-│ ├── box_policy_container.png
-│ └── box_solution_cards.png
-├── data/figma_ref/ ← 비교 리뷰용
-│ ├── comparison.html (Figma vs HTML 비교 페이지)
-│ ├── frame2_1-5.png (Figma 원본 PNG)
-│ ├── frame3_1-35.png
-│ └── frame4_1-49.png
-├── templates/blocks/cards/ ← 블록 템플릿
-│ ├── hero-icon-cards.html
-│ ├── compare-2col-badge.html
-│ └── compare-detail-gradient.html
-├── FIGMA-DESIGN-LANGUAGE.md ← 디자인 언어 분석 결과
-├── FIGMA-EXTRACTION.md ← 이 문서
-└── PHASE-FIGMA-BLOCKS.md ← 블록 설계 명세
-```
-
----
-
-## 9. 고급 레이아웃 패턴
-
-### 9.1 좌/우 열 섹션 Y선 정렬 (CSS Grid 행 공유)
-
-2열 비교에서 좌/우 섹션 제목이 같은 Y선에 있어야 할 때:
-
-**문제**: 각 열을 독립 flex-column으로 만들면, 좌측 섹션 본문이 길면 우측 다음 섹션이 밀림.
-```
-flex-column (잘못):
- 좌: [제목1] [긴본문] [제목2]
- 우: [제목1] [짧은본문] [제목2] ← 제목2가 좌측과 Y가 다름
-```
-
-**해결**: CSS Grid 2열 × N행으로 행을 공유하면 자동 정렬.
-```css
-.block {
- display: grid;
- grid-template-columns: 1fr 1fr; /* 2열 */
- grid-template-rows: auto auto auto auto; /* 헤더 + N행 */
-}
-```
-```
-Grid (올바름):
- [좌 헤더] [우 헤더] ← Row 0
- [좌 섹션1] [우 섹션1] ← Row 1 (행 높이 = max(좌,우))
- [좌 섹션2] [우 섹션2] ← Row 2 (Y선 자동 정렬!)
-```
-
-**실제 계산 (Frame 4)**:
-```
-Figma Y좌표:
- Row 1: 좌 1166, 우 1166 → 0px 차이 (이미 정렬)
- Row 2: 좌 1529, 우 1467 → 62px 차이 (Grid가 해결)
- Row 3: 좌 1845, 우 1845 → 0px 차이 (이미 정렬)
-원인: Row 1 좌측에 As-Is→To-Be 구조가 있어서 본문이 62px 더 높음
-```
-
-### 9.2 As-Is → To-Be 수평 서브 레이아웃
-
-한 섹션 안에서 변환 전/후를 수평 배치할 때:
-
-```html
-
-
-

-
-
-```
-```css
-.asis-tobe { display: flex; align-items: center; gap: 8px; }
-.asis, .tobe { flex: 1; }
-.arrow { width: 60px; height: auto; flex-shrink: 0; }
-```
-
-**Figma 좌표로 검증**:
-```
-As-Is: x=2737, w=539
-Arrow: x=3375, w=252
-To-Be: x=3687, w=672
-→ 세 요소가 같은 Y(1269)에 수평 배치됨을 좌표로 확인
-```
-
-### 9.3 3D 리본/두루마리 배지 정렬 공식
-
-리본 이미지의 접힘선(fold-back)이 박스 테두리와 정확히 일치해야 할 때:
-
-```
-┌── 리본 이미지 ──────────────┐
-│ 접힘 삼각형 (fold) │ ← fold_offset (이미지 top에서)
-│ 리본 본체 │
-│ │
-└──────────────────────────────┘
-════════════════════════════════ ← 박스 top border (여기에 fold가 일치해야 함)
-┌── 박스 ──────────────────────┐
-│ padding-top = ribbon_below │
-│ 콘텐츠 시작 │
-
-계산:
- fold_offset = (box_y - badge_y) × scale → CSS: top 값
- ribbon_below = ribbon_height - fold_offset → 박스 안 침입 높이
- box_padding_top = ribbon_below + 여유(6px) → 콘텐츠 겹침 방지
-```
-
-**핵심**: 리본을 올리거나 내리는 게 아니라, **박스의 위치를 계산**하는 것.
-- `top: -fold_offset` → 리본 접힘선 = 박스 top border
-- 리본은 그대로, 박스와의 관계만 수학적으로 결정
-
----
-
-## 10. 실수 방지 (Anti-patterns)
-
-### 10.1 절대 하면 안 되는 것
-
-| Anti-pattern | 왜 안 되는지 | 올바른 방법 |
-|-------------|------------|-----------|
-| px 시행착오 조정 ("좀 더 올려볼게") | 3번 이상 실패, 시간 낭비 | Figma 좌표에서 수학적 계산 |
-| 3D 효과를 CSS로 재현 | 평면적이라 품질 차이 심각 | Figma에서 PNG 추출 |
-| 비교 리뷰를 좌/우 배치 | 크기 차이로 비교 불가 | 위/아래 같은 폭으로 배치 |
-| Jinja2 템플릿을 브라우저에서 직접 열기 | 변수 미렌더, 이미지 경로 깨짐 | comparison.html 또는 FastAPI로 확인 |
-| 독립 flex-column으로 2열 비교 | 행 정렬 안 됨 | CSS Grid 행 공유 |
-| 느낌으로 폰트/색상 설정 | Figma와 다른 결과물 | Figma API에서 정확한 값 추출 |
-
-### 10.2 반드시 해야 하는 것
-
-| 원칙 | 이유 |
-|------|------|
-| CSS 주석에 계산 근거 기록 | 나중에 왜 이 값인지 추적 가능 |
-| 비교 리뷰 후 진행 | 디자인 차이를 사전에 발견 |
-| 이미지 자산은 `static/figma-assets/`에 저장 | FastAPI가 서빙, 경로 일관성 |
-| `comparison.html`에 모든 프레임 포함 | 한 페이지에서 전체 리뷰 가능 |
-| Figma 노드 ID 기록 | 나중에 업데이트된 디자인 재추출 가능 |
-
----
-
-## 11. Figma 소스 정보
-
-### 현재 등록된 Figma 파일
-
-| 항목 | 값 |
-|------|---|
-| File Key | `9S6LsQyO6zlRxtiqZccOUM` |
-| Page | Page 1 (0:1) |
-| Frame 2 (hero-icon-cards) | Node `1:5` |
-| Frame 3 (compare-2col-badge) | Node `1:35` |
-| Frame 4 (compare-detail-gradient) | Node `1:49` |
-| Badge (빨간 리본) | Node `1:33` (image 4019) |
-| Badge (틸 리본) | Node `1:43` (image 2197) |
-| Arrow (As-Is→To-Be) | Node `1:67` (image 2645) |
-| Box (빨간 테두리) | Node `1:12` (Rectangle 42894) |
-| Box (틸 테두리) | Node `1:37` (Rectangle 42598) |
-
----
-
-## 12. 체크리스트
-
-새 Figma 프레임을 블록으로 변환할 때:
-
-- [ ] Figma API로 노드 데이터 추출 (좌표, 크기, 색상, 폰트)
-- [ ] PNG 렌더링 다운로드 (scale=2)
-- [ ] 복잡한 비주얼 요소 식별 → 이미지로 추출 (CSS로 만들지 않음)
-- [ ] 스케일 팩터 계산 (1200 / frame_width)
-- [ ] 핵심 정렬 포인트 수학적 계산 (좌표 차이 × 스케일)
-- [ ] CSS 값 도출 (계산 근거를 주석으로 기록)
-- [ ] 비교 리뷰 페이지에 추가 (위/아래 같은 폭)
-- [ ] 사용자 피드백 확인
-- [ ] Jinja2 템플릿 변환 (고정값→변수, 반복→루프)
-- [ ] catalog.yaml 등록
diff --git a/PHASE-FIGMA-BLOCKS.md b/PHASE-FIGMA-BLOCKS.md
deleted file mode 100644
index 01503a3..0000000
--- a/PHASE-FIGMA-BLOCKS.md
+++ /dev/null
@@ -1,463 +0,0 @@
-# Phase 2: Figma Block Design Specification
-
-> 3개 블록 + 2개 서브 컴포넌트 상세 설계
-> 기준: FIGMA-DESIGN-LANGUAGE.md 분석 결과
-
----
-
-## Block 1: `hero-icon-cards`
-
-### 1.1 시각적 구조
-
-```
-┌──────────────────────────────────────────────┐
-│ [Hero Statement - 큰 텍스트, 중앙] │ ← zone: header or full-width
-│ │
-│ ┌─[Badge Title]─┐ │
-│──────────┤ ├───────────────────│
-│ ┌─────┐ │ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
-│ │icon │ │ │icon │ │icon │ │icon │ │icon │ │ ← N개 카드 (2~6)
-│ │ │ │ │ │ │ │ │ │ │ │ │
-│ │Title│ ╎ │Title│ │Title│ │Title│ │Title│ │ ← 세로 구분선
-│ │(sub)│ │ │(sub)│ │(sub)│ │(sub)│ │(sub)│ │
-│ └─────┘ │ └─────┘ └─────┘ └─────┘ └─────┘ │
-│ └───────────────────────────────────│
-└──────────────────────────────────────────────┘
-```
-
-### 1.2 슬롯 정의
-
-| 슬롯 | 필수 | 타입 | 설명 |
-|------|------|------|------|
-| `statement` | O | string | Hero 메시지 (1-2줄) |
-| `badge_title` | X | string | 배지 바 텍스트 |
-| `cards[]` | O | array | 카드 배열 |
-| `cards[].icon` | X | string | 아이콘 이미지 URL 또는 이모지 |
-| `cards[].title` | O | string | 영문 또는 주제목 |
-| `cards[].subtitle` | X | string | 한국어 부제 |
-| `cards[].color` | X | string | 개별 카드 강조색 |
-
-### 1.3 동적 재구성 규칙
-
-#### 그리드 계산
-```
-입력: N = cards.length, W = container_width_px
-
-N ≤ 5: 1행 N열
- col_count = N
- card_width = (W - padding*2 - gap*(N-1)) / N
-
-N = 6: 1행 6열 (gap 축소)
- col_count = 6
- gap = 8px (기본 16px에서 축소)
-
-N > 6: 2행
- col_count = ceil(N / 2)
- row_count = 2
-```
-
-#### 폰트 스케일링
-```
-card_width ≥ 200px → title: 20px, subtitle: 14px
-card_width ≥ 150px → title: 16px, subtitle: 12px
-card_width < 150px → title: 14px, subtitle: 11px
-```
-
-#### 높이 계산
-```
-hero_height = statement_lines * line_height + padding
-badge_height = 44px (고정)
-card_area_height = icon_height + title_lines * title_lh + subtitle_lh + padding
- - 1행: card_area_height
- - 2행: card_area_height * 2 + gap
-
-total_min_height = hero_height + badge_height + card_area_height + gaps
-```
-
-### 1.4 catalog.yaml schema
-
-```yaml
-- id: hero-icon-cards
- name: 히어로 문구 + 아이콘 카드
- category: cards
- template: blocks/cards/hero-icon-cards.html
- height_cost: xlarge
- min_height_px: 280
- relation_types: [definition, flow]
- min_items: 2
- max_items: 6
- visual: >
- 상단에 큰 Hero 메시지(24px bold, 중앙) + 배지 바 +
- 하단에 N열 아이콘 카드(둥근 흰색 컨테이너, 세로 구분선).
- 각 카드는 아이콘 이미지 + 영문 제목(20px/900) + 한국어 부제(14px/500).
- when: >
- 핵심 목표나 가치를 N개 키워드로 선언할 때.
- 각 키워드에 아이콘이나 이미지가 있을 때.
- "우리가 추구하는 5가지 가치" 같은 구조.
- not_for: >
- 비교/대조 구조 → compare-2col-badge.
- 상세 설명이 길 때 → card-icon-desc.
- 순서/단계 → card-step-vertical 또는 process-horizontal.
- purpose_fit: [핵심전달, 가치선언]
- zone: full-width-only
- slots:
- required: [statement, cards[]]
- optional: [badge_title, cards[].icon, cards[].subtitle, cards[].color]
- schema:
- statement:
- max_lines: 2
- font_size: 24
- ref_chars:
- body: 60
- note: "24px bold, 중앙정렬, 흰색 스트로크"
- badge_title:
- max_lines: 1
- font_size: 18
- ref_chars:
- body: 20
- note: "18px bold white, 배지 바 위"
- card_title:
- max_lines: 2
- font_size: 20
- ref_chars:
- body: 15
- note: "20px black/900, 중앙정렬"
- card_subtitle:
- max_lines: 1
- font_size: 14
- ref_chars:
- body: 10
- note: "14px medium, 한국어 부제"
- padding_overhead_px: 60
- padding_h_px: 32
-```
-
----
-
-## Block 2: `compare-2col-badge`
-
-### 2.1 시각적 구조
-
-```
-┌──────────────────────────────────────────────┐
-│ ┌─[Badge Title]─┐ │
-│────────────┤ ├─────────────────│
-│ │
-│ ┌── Left Column ──┐ ╎ ┌── Right Column ──┐ │
-│ │ │ ╎ │ │ │
-│ │ [Big Title] │ ╎ │ [Big Title] │ │
-│ │ │ ╎ │ │ │
-│ │ body text... │ ╎ │ body text... │ │
-│ │ body text... │ ╎ │ body text... │ │
-│ │ │ ╎ │ │ │
-│ └──────────────────┘ ╎ └──────────────────┘ │
-│ │
-│ [Optional: Hero Statement] │
-└──────────────────────────────────────────────┘
-```
-
-### 2.2 슬롯 정의
-
-| 슬롯 | 필수 | 타입 | 설명 |
-|------|------|------|------|
-| `badge_title` | O | string | 배지 바 텍스트 |
-| `left_title` | O | string | 좌측 열 대제목 |
-| `left_body` | O | string | 좌측 열 본문 |
-| `right_title` | O | string | 우측 열 대제목 |
-| `right_body` | O | string | 우측 열 본문 |
-| `statement` | X | string | 하단 Hero 메시지 |
-| `left_color` | X | string | 좌측 강조색 (기본: --color-teal) |
-| `right_color` | X | string | 우측 강조색 (기본: --color-teal) |
-
-### 2.3 동적 재구성 규칙
-
-#### 레이아웃 계산
-```
-container_width = 컨테이너 전체 폭
-padding_h = 32px * 2
-
-2열 모드 (기본):
- col_width = (container_width - padding_h - divider_gap) / 2
- divider_gap = 32px
-
-1열 모드 (sidebar zone, 폭 < 500px):
- 좌/우가 세로 스택
- col_width = container_width - padding_h
-```
-
-#### 높이 계산
-```
-badge_height = 44px
-left_height = title_height + body_lines * line_height + padding
-right_height = title_height + body_lines * line_height + padding
-content_height = max(left_height, right_height)
-statement_height = statement ? (statement_lines * 28 + 16) : 0
-
-total = badge_height + content_height + statement_height + gaps
-```
-
-#### 텍스트 피팅
-```
-col_width에 따른 body 글자수 제한:
- col_width ≥ 500px → ~40자/줄, font: 16px
- col_width ≥ 350px → ~28자/줄, font: 14px
- col_width < 350px → ~20자/줄, font: 13px
-```
-
-### 2.4 catalog.yaml schema
-
-```yaml
-- id: compare-2col-badge
- name: 배지 헤더 2열 비교
- category: cards
- template: blocks/cards/compare-2col-badge.html
- height_cost: large
- min_height_px: 200
- relation_types: [comparison, contrast]
- visual: >
- 상단 배지 바(이미지/그라디언트 배경 + 흰색 텍스트) 아래
- 2열 비교 레이아웃. 좌/우 각각 대제목(24px/900) + 본문(16px/700).
- 중앙 세로 구분선. 둥근 흰색 컨테이너(r:20).
- 선택적 하단 Hero 메시지.
- when: >
- 두 개념/방법/전략을 나란히 비교할 때.
- 배지 헤더로 상위 주제를 명시.
- 예: "Engn. Solution vs DfMA", "현재 vs 미래"
- not_for: >
- 3개 이상 항목 비교 → compare-3col-badge.
- 장/단점 목록 → comparison-2col.
- 상세 내용이 길고 섹션이 많을 때 → compare-detail-gradient.
- purpose_fit: [비교대조, 개념정의]
- zone: full-width-only
- slots:
- required: [badge_title, left_title, left_body, right_title, right_body]
- optional: [statement, left_color, right_color]
- schema:
- badge_title:
- max_lines: 1
- font_size: 18
- ref_chars:
- body: 15
- note: "18px bold white, 배지 바"
- left_title:
- max_lines: 1
- font_size: 24
- ref_chars:
- body: 15
- note: "24px black/900, 흰색 스트로크"
- left_body:
- max_lines: 6
- font_size: 16
- ref_chars:
- body: 200
- note: "16px/700, 틸 색상"
- right_title:
- max_lines: 1
- font_size: 24
- ref_chars:
- body: 15
- note: "24px black/900, 흰색 스트로크"
- right_body:
- max_lines: 6
- font_size: 16
- ref_chars:
- body: 200
- note: "16px/700, 틸 색상"
- statement:
- max_lines: 2
- font_size: 20
- ref_chars:
- body: 50
- note: "20px bold, 중앙정렬"
- padding_overhead_px: 56
- padding_h_px: 32
-```
-
----
-
-## Block 3: `compare-detail-gradient`
-
-### 3.1 시각적 구조
-
-```
-┌──────────────────────────────────────────────────────────┐
-│ ┌───── Left Header Bar (gradient) ─────┐┌── Right ─────┐│
-│ │ [Left Column Title] ││ [Right Title] ││
-│ └──────────────────────────────────────┘└───────────────┘│
-│ ┌─────── Left BG (warm) ──────┐┌──── Right BG (teal) ──┐│
-│ │ ││ ││
-│ │ [Section 1 Title] ││ [Section 1 Title] ││
-│ │ • body text ││ • body text ││
-│ │ • body text ││ • body text ││
-│ │ ││ ││
-│ │ [Section 2 Title] ││ [Section 2 Title] ││
-│ │ • body text ││ • body text ││
-│ │ • body text ││ • body text ││
-│ │ ││ ││
-│ │ [Section N Title] ││ [Section M Title] ││
-│ │ • body text ││ • body text ││
-│ └──────────────────────────────┘└───────────────────────┘│
-└──────────────────────────────────────────────────────────┘
-```
-
-### 3.2 슬롯 정의
-
-| 슬롯 | 필수 | 타입 | 설명 |
-|------|------|------|------|
-| `left_header` | O | string | 좌측 열 헤더 타이틀 |
-| `right_header` | O | string | 우측 열 헤더 타이틀 |
-| `left_sections[]` | O | array | 좌측 섹션 배열 |
-| `left_sections[].title` | O | string | 섹션 소제목 |
-| `left_sections[].body` | O | string | 섹션 본문 (줄바꿈 허용) |
-| `right_sections[]` | O | array | 우측 섹션 배열 |
-| `right_sections[].title` | O | string | 섹션 소제목 |
-| `right_sections[].body` | O | string | 섹션 본문 |
-| `left_color_theme` | X | string | 좌측 테마 (기본: warm) |
-| `right_color_theme` | X | string | 우측 테마 (기본: teal) |
-
-### 3.3 동적 재구성 규칙 (★ 가장 수학적으로 복잡)
-
-#### 그리드 계산
-```
-container_width에서 2열 분할:
- col_width = (container_width - gap) / 2
- gap = 0px (그라디언트가 맞닿음)
-```
-
-#### 섹션 높이 계산 (핵심)
-```
-header_bar_height = 48px (고정)
-
-각 섹션의 높이:
- section_height(s) =
- title_height(s.title, title_font_size, col_width) +
- body_height(s.body, body_font_size, col_width) +
- section_padding
-
- title_height = ceil(char_count / chars_per_line) * title_line_height
- body_height = line_count * body_line_height
-
- chars_per_line = floor(col_width / (font_size * 0.55)) // 한글 평균 0.55em
-
-좌측 전체:
- left_total = header_bar + sum(section_height for s in left_sections) + gaps
-
-우측 전체:
- right_total = header_bar + sum(section_height for s in right_sections) + gaps
-
-content_height = max(left_total, right_total)
-```
-
-#### 오버플로 방지 — Fit 검증
-```
-if content_height > container_available_height:
-
- 전략 1: 폰트 축소
- body_font_size -= 1px (최소 12px)
- 재계산
-
- 전략 2: 섹션 본문 줄 수 제한
- max_body_lines = floor(
- (available_per_section - title_height) / body_line_height
- )
- available_per_section = (container_height - header*2 - gaps) / max(N_left, N_right)
-
- 전략 3: Kei 에스컬레이션 (기존 파이프라인)
- content 요약 요청
-```
-
-#### 색상 테마 매핑
-```
-warm (좌측 기본):
- header_gradient: rgba(165,161,150,0.10) → rgba(57,50,30,1.00)
- section_title_color: var(--color-warm-brown)
- bg: rgba(255,255,255,0.30) → rgba(57,50,30,0.30)
-
-teal (우측 기본):
- header_gradient: rgba(41,107,85,0.10) → rgba(3,33,24,1.00)
- section_title_color: var(--color-dark-teal)
- bg: rgba(41,107,85,0.30) → rgba(255,255,255,0.30)
-```
-
-### 3.4 catalog.yaml schema
-
-```yaml
-- id: compare-detail-gradient
- name: 그라디언트 상세 2열 비교
- category: cards
- template: blocks/cards/compare-detail-gradient.html
- height_cost: xlarge
- min_height_px: 300
- relation_types: [comparison, contrast, process]
- min_items: 2 # 좌/우 최소 1섹션씩
- max_items: 10 # 좌+우 합계
- visual: >
- 좌우 그라디언트 배경(워 브라운 vs 다크틸)으로 나뉜 2열 비교.
- 각 열 상단에 그라디언트 헤더 바 + 큰 제목(28px/900).
- 하단에 N개 섹션(소제목 22px/900 + 본문 16px/700) 반복.
- 좌측은 따뜻한 톤(과정/As-Is), 우측은 차가운 톤(결과/To-Be).
- when: >
- 두 카테고리를 상세하게 비교할 때.
- 각 카테고리에 여러 하위 항목이 있을 때.
- 과정 vs 결과, As-Is vs To-Be, 문제 vs 해결 구조.
- not_for: >
- 간단한 2항목 비교(본문 짧을 때) → compare-2col-badge.
- 3열 비교 → compare-3col-badge.
- 비교가 아닌 단독 리스트 → dark-bullet-list.
- purpose_fit: [비교대조, 구조시각화, 근거사례]
- zone: full-width-only
- slots:
- required: [left_header, right_header, left_sections[], right_sections[]]
- optional: [left_color_theme, right_color_theme]
- schema:
- left_header:
- max_lines: 1
- font_size: 28
- ref_chars:
- body: 20
- note: "28px black/900, 그라디언트 바 위"
- right_header:
- max_lines: 1
- font_size: 28
- ref_chars:
- body: 20
- note: "28px black/900, 그라디언트 바 위"
- section_title:
- max_lines: 2
- font_size: 22
- ref_chars:
- body: 30
- note: "22px/900, 색상 테마별 (브라운 or 틸)"
- section_body:
- max_lines: 4
- font_size: 16
- ref_chars:
- body: 120
- note: "16px/700, black"
- padding_overhead_px: 48
- padding_h_px: 0
-```
-
----
-
-## 서브 컴포넌트
-
-### S1. 장식 이미지 (3D 화살표 등)
-- 블록이 아닌 **콘텐츠 이미지**로 처리
-- `cards[].icon` 또는 별도 `decoration_image` 슬롯으로 전달
-- 블록은 `
![]()
` 태그로 렌더링, 크기는 CSS로 컨테이너에 맞춤
-
-### S2. CTA 버튼
-- 독립 블록이 아닌 **다른 블록 내 선택적 요소**
-- `cta_text` 슬롯으로 전달 (없으면 미표시)
-- CSS: 그라디언트 바 + 둥근 버튼 (r:7)
-
----
-
-## 구현 우선순위
-
-| 순서 | 블록 | 이유 |
-|------|------|------|
-| 1 (파일럿) | `compare-2col-badge` | 중간 복잡도, 기존 compare-2col-split과 비교 검증 가능 |
-| 2 | `hero-icon-cards` | N개 카드 그리드 계산 필요, 파일럿 경험 활용 |
-| 3 | `compare-detail-gradient` | 가장 복잡 (N개 섹션 × 2열, 높이 균형, 오버플로 방지) |
diff --git a/docs/BLOCK_SLOTS_45.py b/docs/BLOCK_SLOTS_45.py
deleted file mode 100644
index f37870e..0000000
--- a/docs/BLOCK_SLOTS_45.py
+++ /dev/null
@@ -1,105 +0,0 @@
-# 45개 블록 BLOCK_SLOTS — design_director.py에 반영 필요
-# 다른 쪽 작업 완료 후 교체
-
-BLOCK_SLOTS = {
- # headers/
- "section-title-with-bg": {"required": ["title_ko"], "optional": ["title_en", "breadcrumb", "bg_image"]},
- "section-header-bar": {"required": ["title"], "optional": ["subtitle"]},
- "topic-left-right": {"required": ["title", "description"], "optional": []},
- "topic-center": {"required": ["title"], "optional": ["subtitle", "description"]},
- "topic-numbered": {"required": ["number", "title"], "optional": ["description", "color"]},
- # cards/
- "card-image-3col": {"required": ["cards"], "optional": []},
- "card-text-grid": {"required": ["cards"], "optional": []},
- "card-dark-overlay": {"required": ["cards"], "optional": []},
- "card-tag-image": {"required": ["cards"], "optional": []},
- "card-icon-desc": {"required": ["cards"], "optional": []},
- "card-compare-3col": {"required": ["cards"], "optional": []},
- "card-step-vertical": {"required": ["steps"], "optional": []},
- "card-image-round": {"required": ["cards"], "optional": []},
- "card-stat-number": {"required": ["stats"], "optional": []},
- "card-numbered": {"required": ["items"], "optional": []},
- # tables/
- "compare-3col-badge": {"required": ["headers", "rows"], "optional": []},
- "compare-2col-split": {"required": ["left_title", "right_title", "rows"], "optional": []},
- "table-simple-striped": {"required": ["headers", "rows"], "optional": []},
- # visuals/
- "venn-diagram": {"required": ["center_label", "items"], "optional": ["center_sub", "description"]},
- "circle-gradient": {"required": ["label"], "optional": ["sub_label"]},
- "compare-pill-pair": {"required": ["left_label", "right_label"], "optional": ["left_sub", "right_sub"]},
- "process-horizontal": {"required": ["steps"], "optional": []},
- "flow-arrow-horizontal": {"required": ["steps"], "optional": []},
- "keyword-circle-row": {"required": ["keywords"], "optional": []},
- "layer-diagram": {"required": ["layers"], "optional": ["title"]},
- "timeline-vertical": {"required": ["events"], "optional": []},
- "timeline-horizontal": {"required": ["events"], "optional": []},
- "pyramid-hierarchy": {"required": ["levels"], "optional": []},
- # emphasis/
- "quote-left-border": {"required": ["quote_text"], "optional": ["source"]},
- "quote-big-mark": {"required": ["quote_text"], "optional": ["source"]},
- "quote-question": {"required": ["question"], "optional": ["description"]},
- "conclusion-accent-bar": {"required": ["conclusion_text"], "optional": ["label"]},
- "comparison-2col": {"required": ["left_title", "left_content", "right_title", "right_content"], "optional": ["left_subtitle", "right_subtitle"]},
- "banner-gradient": {"required": ["text"], "optional": ["sub_text"]},
- "dark-bullet-list": {"required": ["bullets"], "optional": ["title"]},
- "highlight-strip": {"required": ["segments"], "optional": []},
- "callout-solution": {"required": ["title", "description"], "optional": ["icon", "source"]},
- "callout-warning": {"required": ["title", "description"], "optional": ["icon"]},
- "tab-label-row": {"required": ["tabs"], "optional": []},
- "divider-text": {"required": ["text"], "optional": []},
- # media/
- "image-row-2col": {"required": ["images"], "optional": []},
- "image-grid-2x2": {"required": ["images"], "optional": []},
- "image-side-text": {"required": ["image_src"], "optional": ["image_alt", "title", "description", "bullets"]},
- "image-full-caption": {"required": ["src"], "optional": ["alt", "caption"]},
- "image-before-after": {"required": ["before_src", "after_src"], "optional": ["before_label", "after_label", "caption"]},
-}
-
-# _apply_defaults 용
-BLOCK_DEFAULTS = {
- "section-title-with-bg": {"title_ko": "(제목)"},
- "section-header-bar": {"title": "(섹션)"},
- "topic-left-right": {"title": "(소제목)", "description": ""},
- "topic-center": {"title": "(제목)"},
- "topic-numbered": {"number": "1", "title": "(단계)"},
- "card-image-3col": {"cards": []},
- "card-text-grid": {"cards": []},
- "card-dark-overlay": {"cards": []},
- "card-tag-image": {"cards": []},
- "card-icon-desc": {"cards": []},
- "card-compare-3col": {"cards": []},
- "card-step-vertical": {"steps": []},
- "card-image-round": {"cards": []},
- "card-stat-number": {"stats": []},
- "card-numbered": {"items": []},
- "compare-3col-badge": {"headers": [], "rows": []},
- "compare-2col-split": {"left_title": "A", "right_title": "B", "rows": []},
- "table-simple-striped": {"headers": [], "rows": []},
- "venn-diagram": {"center_label": "관계도", "items": [], "center_sub": "", "description": ""},
- "circle-gradient": {"label": "(라벨)"},
- "compare-pill-pair": {"left_label": "A", "right_label": "B"},
- "process-horizontal": {"steps": []},
- "flow-arrow-horizontal": {"steps": []},
- "keyword-circle-row": {"keywords": []},
- "layer-diagram": {"layers": []},
- "timeline-vertical": {"events": []},
- "timeline-horizontal": {"events": []},
- "pyramid-hierarchy": {"levels": []},
- "quote-left-border": {"quote_text": "(인용)"},
- "quote-big-mark": {"quote_text": "(인용)"},
- "quote-question": {"question": "(질문)"},
- "conclusion-accent-bar": {"conclusion_text": "(결론)"},
- "comparison-2col": {"left_title": "A", "left_content": "-", "right_title": "B", "right_content": "-"},
- "banner-gradient": {"text": "(배너)"},
- "dark-bullet-list": {"bullets": []},
- "highlight-strip": {"segments": []},
- "callout-solution": {"title": "(솔루션)", "description": ""},
- "callout-warning": {"title": "(경고)", "description": ""},
- "tab-label-row": {"tabs": []},
- "divider-text": {"text": "구분"},
- "image-row-2col": {"images": []},
- "image-grid-2x2": {"images": []},
- "image-side-text": {"image_src": ""},
- "image-full-caption": {"src": ""},
- "image-before-after": {"before_src": "", "after_src": ""},
-}
diff --git a/docs/FIGMA-COMPONENT-EXTRACTION-PLAN.md b/docs/FIGMA-COMPONENT-EXTRACTION-PLAN.md
deleted file mode 100644
index d5d1050..0000000
--- a/docs/FIGMA-COMPONENT-EXTRACTION-PLAN.md
+++ /dev/null
@@ -1,582 +0,0 @@
-# Figma → 컴포넌트 추출 + 카탈로그 구축 계획
-
-## 목적
-
-Figma 디자인(바론컨설턴트 홈페이지 기획팀 공유)에서 재사용 가능한 **콘텐츠 블록**을 추출하고, 디자인 팀장(Sonnet)이 선택할 수 있는 카탈로그로 체계화한다.
-
-**핵심 원칙: 블록은 모드 독립적이다.**
-- 블록 자체는 "슬라이드 전용"이 아니라 **HTML/CSS 콘텐츠 블록**
-- 슬라이드 모드(100vh, overflow:hidden)와 웹/스크롤 모드(auto, overflow:visible)는 **컨테이너(base 템플릿)**가 결정
-- 블록은 높이를 고정하지 않음 → 어떤 컨테이너에도 들어갈 수 있음
-- 현재는 `slide-base.html`(슬라이드)에 집중하되, 향후 `page-base.html`(웹) 추가 가능
-
-```
-블록 (카드, 표, 인용 등) — 모드와 무관, 재사용 가능
- ↓
-slide-base.html → height:100vh, overflow:hidden (슬라이드 모드)
-page-base.html → height:auto, overflow:visible (웹/스크롤 모드, 향후)
-```
-
----
-
-## 현재 상태
-
-### 보유 자산
-
-| 항목 | 상태 | 위치 |
-|------|------|------|
-| Figma API 접근 | ✅ 가능 | Token: `.env` |
-| 기존 블록 템플릿 7종 | ✅ 완성 | `templates/blocks/` |
-| 디자인 토큰 | ✅ 완성 | `static/tokens.css` |
-| 슬라이드 렌더러 | ✅ 완성 | `src/renderer.py` |
-| 디자인 팀장 (DA-13) | ❌ todo | `src/design_director.py` |
-| 블록 카탈로그 | ❌ 없음 | - |
-
-### Figma 파일 구조
-
-```
-바론 공유 2025.05.13 (node: 1574-6254)
-├── 1장 바론컨설턴트
-├── 2장 디지털전환
-│ ├── 2-1 건설산업에서의 디지털전환 (1920x8538, 스크롤형)
-│ ├── 2-2 디지털전환과 소프트웨어 (1920x9123, 스크롤형)
-│ └── 건설산업에서의 디지털전환 (1920x8536, 스크롤형)
-│ [자세히보기]
-│ ├── 2-1장 자세히보기 (4프레임: 건설산업/BIM/GIS/디지털트윈)
-│ ├── 2-2장 자세히보기
-│ └── 2-3장 자세히보기
-├── 3장 제공서비스
-│ ├── 3-1장 솔루션프로그램 자세히보기
-│ └── 3-3장 빅룸 자세히보기
-└── 모션작업
-```
-
-### 기존 블록 vs Figma에서 발견된 패턴
-
-| 패턴 | 기존 블록 | Figma에서 발견 | 갭 |
-|------|----------|--------------|-----|
-| 2단 비교 | ✅ comparison | ✅ | - |
-| 카드 그리드 | ✅ card-grid | ✅ (변형 다수) | 변형 추가 필요 |
-| 벤 다이어그램 | ✅ relationship | ✅ | - |
-| 단계 흐름 | ✅ process | ✅ | - |
-| 강조 인용 | ✅ quote-block | ✅ (큰따옴표 장식) | 변형 추가 필요 |
-| 결론 바 | ✅ conclusion-bar | ✅ | - |
-| 비교 테이블 | ✅ comparison-table | ✅ | - |
-| **이미지 갤러리** | ❌ | ✅ (2열, 3열, 2x2) | **신규** |
-| **타임라인** | ❌ | ✅ (세로 원형 4단계) | **신규** |
-| **섹션 타이틀** | ❌ | ✅ (영문+한글 공통 헤더) | **신규** |
-| **사례 카드** | ❌ | ✅ (출처+불릿 카드) | **신규** |
-| **핵심 지표** | ❌ (정의만) | ✅ (큰 숫자+보조) | **신규** |
-| **아이콘 리스트** | ❌ | ✅ (아이콘+제목+설명) | **신규** |
-| **Hero 섹션** | ❌ | ✅ (배경+원형이미지+텍스트) | **신규** |
-| **CTA 버튼 바** | ❌ | ✅ (자세히보기 버튼) | **필요 시** |
-| **이미지 블록** | ❌ | ✅ (도표, 참고자료) | **신규** (3변형: full/side/thumb) |
-| **자세히보기 블록** | ❌ | ✅ (상세 콘텐츠 접기/펼치기) | **신규** (`
/`) |
-
----
-
-## 작업 계획
-
-### Phase A: Figma 분석 + 패턴 추출
-
-#### A-1: Figma 전체 섹션 이미지 렌더링
-- **작업:** 각 섹션/프레임을 이미지로 렌더링하여 시각적으로 패턴 식별
-- **방법:**
- - **1차:** Framelink MCP `get_figma_data` — CSS-ready 데이터로 노드 구조 + 스타일 동시 추출
- - **2차:** Figma 공식 MCP `get_screenshot` — 시각 참고용 스크린샷
- - **fallback:** Figma REST API `/v1/images/{file_key}?ids={node_ids}` (MCP 미설치 시)
-- **산출물:** `docs/figma-screenshots/` 폴더에 PNG 저장
-- **완료 기준:** 모든 자세히보기 프레임(8개)의 스크린샷 확보
-
-#### A-2: Figma 노드 구조 심층 분석
-- **작업:** 각 프레임의 상세 스타일 + 레이아웃 정보 추출
-- **방법:**
- - **1차:** Framelink MCP `get_figma_data` (nodeId 지정, depth 조절)
- - 자동 CSS 변환: 색상→hex/rgba, 레이아웃→flex 용어, 그림자→box-shadow, 그라데이션→linear-gradient()
- - 스타일 중복 제거 (글로벌 변수로 추출)
- - 토큰 효율적 (raw API 대비 1/5 크기)
- - **2차:** Figma 공식 MCP `get_variable_defs` — 디자인 토큰/변수 추출
- - **fallback:** Figma REST API `/v1/files/{key}/nodes?ids={ids}&depth=5` (MCP 미설치 시)
-- **추출 정보:**
- - TEXT 노드: fontFamily, fontSize, fontWeight, lineHeight, letterSpacing, color, 텍스트 내용
- - FRAME/GROUP: auto-layout (direction, gap, padding, alignItems, justifyContent), constraints
- - RECTANGLE: fills (solid/gradient/image), strokes, cornerRadius, effects
- - INSTANCE: componentId (재사용 컴포넌트 식별)
-- **Figma → CSS 매핑 (Framelink MCP가 자동 처리, REST API 시 수동):**
- - `layoutMode: "VERTICAL"` → `flex-direction: column`
- - `primaryAxisAlignItems: "CENTER"` → `justify-content: center`
- - `itemSpacing: 20` → `gap: 20px`
- - `paddingLeft/Right/Top/Bottom` → `padding`
- - `fills[].color {r,g,b,a}` → `rgba()` 또는 `#hex`
- - `fills[].type: "GRADIENT_LINEAR"` → `linear-gradient(...)`
- - `cornerRadius` → `border-radius`
- - `strokes + strokeWeight` → `border`
- - `effects[].type: "DROP_SHADOW"` → `box-shadow`
- - `fontSize` → `font-size` (px 단위)
- - `lineHeightPercentFontSize: 170` → `line-height: 1.7`
-- **산출물:** `docs/figma-analysis/` 폴더에 구조 문서
-- **주의:** Figma API rate limit 심함 — depth 깊은 요청은 30분 차단 가능. 얕게 요청 후 필요한 노드만 상세 조회
-
-#### A-3: 디자인 패턴 분류 + 명명
-- **작업:** 추출된 시각 요소를 재사용 가능한 블록 단위로 분류
-- **기준:**
- - 2회 이상 반복되는 패턴 → 블록 후보
- - 슬롯(교체 가능한 위치)이 명확한 것 → 우선 순위 높음
- - 콘텐츠 유형과 매칭되는 것 → 우선 순위 높음
-- **산출물:** 패턴 목록 + 각 패턴의 Figma 원본 노드 ID
-
-### Phase B: HTML/CSS 컴포넌트 제작
-
-#### B-1: 신규 블록 템플릿 제작 (8~10종)
-- **파일:** `templates/blocks/{name}/` 폴더별 정리 (변형별 파일 + preview.png)
-- **제작 순서 (우선순위):**
- 1. `section-title/default.html` — 공통 헤더 (모든 슬라이드에서 사용)
- 2. `example-card/2col.html` — 사례 카드 (출처+불릿, 정책 문서 인용)
- 3. `image-block/full.html`, `side.html`, `thumb.html` — 이미지 블록 3변형
- - full: 전체 너비 (핵심 도표, 가로형)
- - side: 텍스트 옆 (보조 이미지, 세로형)
- - thumb: 썸네일 (참고 문서 표지)
- - CSS: `object-fit: contain` (비율 유지, 잘리지 않음)
- - 원본 이미지 그대로 사용, 크기만 조절 (crop 안 함)
- 4. `image-gallery/2col.html`, `3col.html`, `2x2.html` — 이미지 갤러리
- 5. `timeline/vertical.html`, `horizontal.html` — 타임라인 (연혁/로드맵)
- 6. `big-number/3col.html`, `4col.html` — 핵심 지표 (큰 숫자 + 보조 텍스트)
- 7. `icon-list/vertical.html`, `grid.html` — 아이콘 리스트 (기능 나열)
- 8. `details-block/default.html` — 자세히보기 (`/`)
- - 슬라이드 표면: 요약만 표시
- - 펼치면: 전체 상세 내용
- - 인쇄 시: `beforeprint` 이벤트로 자동 펼침
-- **규칙:**
- - 디자인 토큰(`var(--color-*)`) 사용 (하드코딩 색상 금지)
- - Jinja2 슬롯 (`{{ variable }}`) 형식
- - `
-
-
-
- {% block content %}{% endblock %}
-
-
-