IMPROVEMENT Phase A~D + Phase 2 전체 반영

## IMPROVEMENT (Phase A~D)
- A-1: 4단계 Sonnet 디자인 조정 (_adjust_design) — CSS 변수 cascade
- A-2: 5단계 HTML 전문 프롬프트 전달
- A-3: shrink/expand 하드코딩 제거 → Sonnet target_ratio 기반
- A-4: rewrite action 구현
- A-5: overflow: visible (area 레벨 텍스트 잘림 방지)
- A-6: object-fit cover → contain (이미지 crop 방지)
- A-7: table-layout: fixed
- A-8: container query 폰트 스케일링
- B-1: details-block 템플릿 신규 (CSS 변수만 사용)
- B-2: 인쇄 시 details 자동 펼침 JS
- B-3: catalog에 details-block 등록
- B-4/B-5: images[]/tables[] 상세 판단 + fallback 3곳 동기화
- B-8: fallback card-grid → topic-header + char_guide 제거
- C-1: CLAUDE.md gradient 원칙 완화
- C-3: border-radius 9개 파일 var(--radius) 통일
- C-4: box-shadow 2레벨 → 1레벨
- D-0: 이미지 경로 입력 UI + API base_path
- D-1: Pillow 의존성 + image_utils.py
- D-2~D-4: 이미지 비율/축소방지 프롬프트 전달
- D-5: HTML에 이미지 base64 삽입

## Phase 2 (다른 Claude 작업)
- P2-A: FAISS 블록 검색 (bge-m3, 46개 블록)
- P2-B: SVG N개 자동 배치 (svg_calculator.py)
- P2-C: Opus 블록 추천 (Kei API 경유)
- P2-D: 5단계 재검토 루프 강화 (MAX_REVIEW_ROUNDS=2)
- P2-E: details-block fallback 연동

## 버그 수정 (BF-8~10)
- BF-8: 컨테이너 예산 기반 블록 배치
- BF-9: grid와 Sonnet 역할 분리
- BF-10: catalog mtime 캐시 자동 갱신

## 블록 라이브러리
- 46개 블록 (6 카테고리), catalog/BLOCK_SLOTS/INDEX 동기화
- 구 블록 제거 (quote-block, card-grid, comparison)
- 13개 _legacy 블록 보존

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-25 18:40:20 +09:00
parent 91d5779a16
commit 9bd9dad9ac
220 changed files with 19115 additions and 667 deletions

168
CLAUDE.md
View File

@@ -217,59 +217,18 @@ reference 꼭지 있음 → sidebar-right
## 블록 타입 정의
각 블록은 독립적인 CSS 컴포넌트로, 슬롯(교체 가능한 위치)을 가진다.
6개 카테고리, 18개 블록 변형. **상세는 `templates/blocks/INDEX.md` 참조.**
### 1. 비교 블록 (comparison)
- 2단 병렬 레이아웃
- 슬롯: 좌측 제목/내용, 우측 제목/내용
- 용도: A vs B, 장단점, Before/After
| 카테고리 | 블록 수 | 구현 방식 | 주요 블록 |
|---------|--------|---------|---------|
| headers/ | 2 | HTML/CSS | section-title-with-bg, topic-left-right |
| cards/ | 3 | HTML/CSS | card-image-3col, card-text-grid, card-dark-overlay |
| tables/ | 1 | HTML/CSS | compare-3col-badge |
| visuals/ | 4 | **SVG** (수학적 좌표 계산) | venn-diagram, circle-gradient, compare-pill-pair, process-horizontal |
| emphasis/ | 5 | HTML/CSS | quote-left-border, conclusion-accent-bar, comparison-2col, banner-gradient, quote-question |
| media/ | 3 | HTML/CSS + 이미지 | image-row-2col, image-grid-2x2, image-side-text |
### 2. 카드 그리드 (card-grid)
- 2~4열 카드 배열
- 슬롯: 카드별 아이콘/제목/설명/출처
- 용도: 용어 정의, 개념 설명, 기능 나열
### 3. 관계도 (relationship)
- 벤 다이어그램 또는 트리 구조
- 슬롯: 중심 요소, 하위 요소들, 관계 설명
- 용도: 상위-하위 관계, 포함 관계, 기술 융합
### 4. 프로세스 (process)
- 가로 또는 세로 단계 흐름
- 슬롯: 단계별 번호/제목/설명
- 용도: 절차, 워크플로우, 파이프라인
### 5. 타임라인 (timeline)
- 시간 축 기반 배치
- 슬롯: 날짜/제목/설명
- 용도: 연혁, 로드맵, 일정
### 6. 핵심 지표 (big-number)
- 큰 숫자 + 보조 텍스트
- 슬롯: 숫자, 단위, 설명
- 용도: KPI, 통계, 성과 수치
### 7. 강조 인용 (quote-block)
- 배경색 + 좌측 라인 + 인용 텍스트
- 슬롯: 인용 텍스트, 출처
- 용도: 문제 제기, 핵심 메시지, 정의
### 8. 결론 바 (conclusion-bar)
- 하단 전체 폭 강조 영역
- 슬롯: 핵심 한 줄
- 용도: 슬라이드 결론, 요약 메시지
### 9. 비교 테이블 (comparison-table)
- 테이블 형식의 다항목 비교
- 슬롯: 행/열 헤더, 셀 내용
- 용도: 다차원 비교, 기능 매트릭스
### 10. 이미지 블록 (image-block)
- 이미지 + 캡션
- 3가지 변형: 전체너비(image-full), 텍스트옆(image-side), 썸네일(image-thumb)
- 슬롯: 이미지 경로, 캡션 텍스트, 이미지 크기 정보
- 용도: 도표, 다이어그램, 근거 자료, 문서 참조
- CSS: object-fit: contain (비율 유지, 잘리지 않음)
각 블록은 독립적인 컴포넌트로 슬롯(교체 가능한 위치)을 가지며, `catalog.yaml`에 when/not_for/slots가 정의되어 있다.
---
@@ -365,10 +324,10 @@ Pretendard 폰트 크기별 참고값 (1회 측정, 상수 저장):
- 정보 계층을 시각적으로 명확히 표현
### DON'T (하지 않는 것)
- 그라데이션 배경 금지
- HTML/CSS 블록의 배경 그라데이션 금지 (**SVG 시각화 블록, 디자인 의도가 명확한 블록(배너, 오버레이, 콜아웃 등)은 허용**)
- CSS 애니메이션/트랜지션 금지
- 호버 효과 금지
- 그림자(box-shadow) 최소화 (1개 레벨만)
- 그림자(box-shadow) 최소화 (1개 레벨만. SVG filter는 예외)
- 다크 테마 금지 (요청하지 않는 한)
- 둥근 모서리 과다 사용 금지 (border-radius 최대 8px)
- 텍스트를 자르지 않는다 (디자인이 텍스트에 맞춘다)
@@ -425,24 +384,93 @@ Pretendard 폰트 크기별 참고값 (1회 측정, 상수 저장):
---
## 교본 (레퍼런스) 관
## 블록 라이브러
### 핵심 원칙: 변형 기반 선택
하나의 블록 유형에 **여러 변형(variation)**이 존재하고, 디자인 팀장이 콘텐츠 성격에 맞는 변형을 **검색하여 선택**한다.
```
콘텐츠 분석 → "이 꼭지는 좌:질문 우:설명 구조다"
블록 라이브러리 검색 → headers/ 카테고리에서 후보 3~4개 반환
팀장이 선택 → topic-left-right.html
```
### 카테고리 구조 (6개, 18개 블록)
```
templates/blocks/
├── INDEX.md ← 전체 인덱스 + 추가 예정 목록
├── headers/ (2개) ← 타이틀, 꼭지 헤더
│ ├── section-title-with-bg.html 배경 이미지 + 영문/한글 타이틀
│ └── topic-left-right.html 좌:파란 제목 + 우:설명
├── cards/ (3개) ← 카드 계열 (정보 나열)
│ ├── card-image-3col.html 상단 이미지 + 하단 텍스트 3열
│ ├── card-text-grid.html 텍스트만 카드 2~4열
│ └── card-dark-overlay.html 다크 이미지 배경 + 흰 텍스트 오버레이
├── tables/ (1개) ← 표/비교 계열
│ └── compare-3col-badge.html A|VS배지|B 3단 비교
├── visuals/ (4개) ← 시각 요소 — **SVG로 제작**
│ ├── circle-gradient.html 파란 그라데이션 원 + 텍스트
│ ├── compare-pill-pair.html 둥근 테두리 박스 2개 + VS
│ ├── venn-diagram.html 벤 다이어그램 (**SVG premium, 수학적 계산**)
│ └── process-horizontal.html 가로 단계 흐름
├── emphasis/ (5개) ← 강조 (인용, 결론)
│ ├── quote-left-border.html 좌측 라인 + 인용
│ ├── conclusion-accent-bar.html 좌측 파란 라인 + 밝은 배경 결론
│ ├── comparison-2col.html 2단 병렬 비교
│ ├── banner-gradient.html 파란 그라데이션 전체 너비 배너
│ └── quote-question.html 질문형 강조 박스
└── media/ (3개) ← 이미지/미디어
├── image-row-2col.html 이미지 2장 나란히
├── image-grid-2x2.html 이미지 4장 2x2 격자
└── image-side-text.html 좌:이미지 우:텍스트+불릿
```
### 시각화 방식 (Phase 1 확정)
**블록 유형별 구현 방식:**
| 블록 유형 | 구현 방식 | 이유 |
|----------|---------|------|
| 텍스트 블록 (카드, 비교, 표, 인용, 결론) | **HTML/CSS** | Jinja2 템플릿으로 조립 |
| 시각화 다이어그램 (관계도, 프로세스, 순환도) | **SVG** | 좌표 정확 + 그라데이션/글로우 가능 + 개수 자동 대응 |
| 실사 이미지 (시공 사진, 3D 렌더링) | **Figma export 또는 원본 이미지** | CSS/SVG로 재현 불가 |
| 배경 텍스처 (보케, 분위기) | **Gemini API 이미지 생성** | 실사 배경 전용 |
**SVG 시각화 원칙 (검증 완료):**
- SVG 안에 `<text>` 포함 → 원 좌표와 텍스트 좌표가 같은 공간 → **위치 100% 정확**
- `radialGradient`, `linearGradient` → 고급 그라데이션
- `filter: feGaussianBlur`, `feDropShadow` → 글로우/그림자
- 하이라이트 오버레이 → 구체(3D) 느낌
- 수학적 계산 (`cos/sin`) → N개 원소 자동 배치 (`360/N` 간격) — **Phase 2 구현 예정. 현재는 3개 고정 SVG**
**AI 이미지 생성은 시각화에 사용하지 않는다:**
- AI 생성 이미지는 원 위치가 매번 달라 텍스트 위치를 맞출 수 없음 (검증 완료)
- AI 이미지는 **실사 배경 텍스처** (보케, 헥사곤, 분위기)에만 사용
### 변형 검색 (향후)
변형이 수십~수백 개로 늘어나면:
1. 각 블록 HTML의 구조/슬롯/용도를 임베딩
2. FAISS 인덱스로 구축
3. 콘텐츠 분석 결과를 쿼리 → 적절한 변형 3~4개 반환
4. 팀장이 최종 선택
현재 규모(13개)에서는 catalog.yaml만으로 충분. 40개 이상부터 FAISS 도입 검토.
### catalog.yaml
- 디자인 팀장의 "메뉴판"
- 각 블록의 id, 시각 설명, 언제 쓰는지(when), 슬롯 목록
- Figma에서 디자인 추출 → 템플릿 변환 → catalog에 등록
- **Figma 작업 완료 후 연동 예정**
- 블록 추가 시 반드시 catalog에도 등록 (미등록 = 팀장이 모름)
### 저장 위치
```
design_agent/
├── templates/
│ ├── catalog.yaml ← AI용 블록 메뉴판 (Figma 작업 후)
│ ├── slide-base.html ← 슬라이드 베이스
│ └── blocks/ ← 블록 템플릿
├── samples/ ← 완성 슬라이드 샘플
└── docs/ ← 조사 자료
```
### Figma 에셋
Figma에서 추출한 이미지 에셋은 `docs/figma-assets/`에 저장:
- 배경 이미지 (bg_header.png 등)
- 3D 렌더링 이미지 (card_img_design.png 등)
- 시각화 에셋 (mountain_viz.png 등)
- 블록에서 `src="{{ image_path }}"`로 참조
---
@@ -451,13 +479,17 @@ design_agent/
| 역할 | 도구 | 비고 |
|------|------|------|
| 서버 | FastAPI + uvicorn | 포트 8001 |
| 템플릿 | Jinja2 | 블록 조합 |
| 렌더링 | CSS Grid + 디자인 토큰 | 16:9 고정 |
| 템플릿 | Jinja2 | 카테고리별 블록 조합 |
| 렌더링 | CSS Grid + 디자인 토큰 | 슬라이드(16:9) + 웹(세로 스크롤) |
| 폰트 | Pretendard Variable | word-break: keep-all |
| AI | Anthropic API (Sonnet) | 5단계 모두 |
| 이미지 크기 | Pillow Image.open().size | 헤더만 읽음 |
| 시각화 | SVG (radialGradient, filter, 수학적 좌표 계산) | 다이어그램/관계도 |
| 실사 배경 | Gemini API | 배경 텍스처 전용 (시각화에는 사용 금지) |
| 자세히보기 | `<details>/<summary>` | HTML 내장 |
| 출력 | HTML 다운로드 | |
| Figma 연동 | Figma REST API + Framelink MCP | 에셋 추출, 디자인 토큰 |
| 변형 검색 | FAISS (향후) | 블록 40개+ 시 도입 |
| 출력 | HTML 다운로드 / .astro (Starlight) | |
---