# Task: 카드뉴스 멀티슬라이드 렌더러 + Carousel API + 디자인 업그레이드

## Task ID: task-272.1
## 프로젝트 경로: /home/jay/projects/ThreadAuto/

## 목표
1장짜리 단순 이미지를 **7장 멀티슬라이드 카드뉴스**로 업그레이드하고, **Threads Carousel API**로 발행하며, 디자인을 **모던/트렌디/전문적**으로 개선한다. 포스팅마다 **다양한 스타일**이 적용되어야 한다.

## 디자인 방향 (제이회장님 지시)
- **모던**: 깔끔한 레이아웃, 충분한 여백, 그리드 정렬
- **트렌드**: 그라데이션, 글래스모피즘, 소프트 쉐도우, 라운드 카드
- **전문성**: 타이포그래피 위계 (제목/부제/본문), 브랜드 일관성
- **다양성**: 포스팅마다 다른 컬러 테마/레이아웃 변형. 매번 같은 디자인 반복 금지

## 작업 범위

### 1. 멀티슬라이드 렌더러 (renderer/ 하위)
- 기존 `templates.py` TypeA~E는 유지 (하위호환)
- 새 모듈: `renderer/cardnews.py` — 멀티슬라이드 카드뉴스 전용
- **슬라이드 구성 (7장 기본)**:
  - 1장: 표지 (훅 문구 + 타이틀, 시선 집중)
  - 2~6장: 본문 (각 항목별 1장, 넘버링 + 제목 + 상세설명)
  - 7장: 마무리 CTA (브랜딩 + 행동유도)
- 슬라이드 수는 가변 (항목 수에 따라 3~10장)
- 이미지 사이즈: 1080x1080 (Threads 정사각형 최적)

### 2. 디자인 시스템
- `renderer/themes.py` — 테마 모듈 신규 생성
  - 최소 5가지 컬러 테마: (예: 네이비골드, 블랙레드, 그린화이트, 퍼플핑크, 오렌지크림)
  - 각 테마: primary, secondary, accent, bg_gradient, text_primary, text_secondary
  - 랜덤 or 순차 선택 가능
- **레이아웃 변형**: 본문 슬라이드마다 2~3가지 레이아웃 패턴
  - 패턴A: 좌측 넘버링 강조 + 우측 텍스트
  - 패턴B: 상단 아이콘/넘버 + 하단 텍스트
  - 패턴C: 전면 배경색 + 중앙 텍스트
- **그라데이션 배경** 지원 (Pillow로 구현)
- **소프트 쉐도우** 카드 효과
- 하단 브랜딩 바: "인카다이렉트 TOP사업단" + "서울대보험쌤" 로고 텍스트

### 3. Threads Carousel API 연동
- `api/client.py`에 `post_carousel()` 메서드 추가
- Carousel 컨테이너 생성 플로우:
  1. 각 이미지별 개별 컨테이너 생성 (media_type=IMAGE)
  2. 캐러셀 컨테이너 생성 (media_type=CAROUSEL, children=[id1, id2, ...])
  3. 발행 (threads_publish)
- 참고: https://developers.facebook.com/docs/threads/posts#carousel-posts
- **기존 버그 수정**: `api/client.py`의 `_create_container`가 `json=payload` 대신 `data=payload`로 보내야 함 (form data). timeout도 60초로 늘려야 함.

### 4. Publisher 업데이트
- `publisher/threads_publisher.py`에 `publish_cardnews()` 메서드 추가
- 입력: 제목, 항목 리스트 [{title, description}], 테마(선택), CTA 텍스트
- 플로우: 테마 선택 → 슬라이드 렌더링 → 이미지 저장 → Carousel 발행
- `image_base_url`을 HTTPS Funnel URL로 설정: `https://aidevserver.tail2cdab6.ts.net/images`

### 5. 테스트
- `tests/test_cardnews_renderer.py` — 렌더러 단위 테스트
- `tests/test_carousel_api.py` — Carousel API mock 테스트
- 기존 테스트 깨지면 안 됨

## 기술 참고
- 한글 폰트: `~/.local/share/fonts/NotoSansCJKkr-Regular.otf` (이미 설치됨)
- Bold 폰트: `NotoSansCJKkr-Bold.otf` 있는지 확인, 없으면 Regular로 fallback
- Pillow (PIL) 사용 중
- 기존 렌더러: `renderer/engine.py` (BaseRenderer), `renderer/fonts.py`, `renderer/colors.py`
- 이미지 서빙: FastAPI `/images/{filename}` 엔드포인트 (output/ 디렉토리)
- 토큰: `.tokens/token.json`에 저장됨

## 산출물
- `renderer/cardnews.py` — 멀티슬라이드 카드뉴스 렌더러
- `renderer/themes.py` — 테마/컬러 시스템
- `api/client.py` — post_carousel() 추가 + 버그 수정
- `publisher/threads_publisher.py` — publish_cardnews() 추가
- 테스트 파일들
- 완료 시 `memory/events/task-272.1.done` 생성
- 보고서 `memory/reports/task-272.1.md` 작성