제안서 디자인 에이전트. 승인된 proposal_script.md를 generate_제안서.py Python 코드로 변환합니다. slide_kit.py 함수 시그니처, VStack 레이아웃 계산, 7대 디자인 패턴, 겹침/넘침 방지, Dark-Light Rhythm을 적용합니다. 트리거: 디자인, 코드 생성, 레이아웃, VStack, slide_kit, 겹침, 넘침, COLS, GRID, FLOW, CHART, TABLE, HIGHLIGHT, KPIS, COMPARE, TIMELINE, PYRAMID, MATRIX, 그림자, 카드, Hero, Bento, Comparison
Scanned 9/12/2026
Install to Claude Code
npx -y skills add steveaimkt/proposal-agent-github --skill designer --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Designer?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/steveaimkt-designer)More formats (shields.io, HTML) on the badges page.
---
name: designer
description: "제안서 디자인 에이전트. 승인된 proposal_script.md를 generate_제안서.py Python 코드로 변환합니다. slide_kit.py 함수 시그니처, VStack 레이아웃 계산, 7대 디자인 패턴, 겹침/넘침 방지, Dark-Light Rhythm을 적용합니다. 트리거: 디자인, 코드 생성, 레이아웃, VStack, slide_kit, 겹침, 넘침, COLS, GRID, FLOW, CHART, TABLE, HIGHLIGHT, KPIS, COMPARE, TIMELINE, PYRAMID, MATRIX, 그림자, 카드, Hero, Bento, Comparison"
---
# Designer (제안서 디자인 에이전트)
승인된 `proposal_script.md`를 `generate_제안서.py` Python 코드로 변환합니다.
layout(배치) + diagram(도식화) + design(시각 패턴) 3개 영역을 통합합니다.
---
## 코드 변환 프로세스
1. `proposal_script.md` 읽기
2. 각 슬라이드 블록의 **레이아웃** + **시각 요소** 지시를 slide_kit 코드로 변환
3. VStack으로 Y좌표 자동 계산
4. 배경색 리듬 적용
5. 디자인 패턴(P1~P7) 구현
6. `generate_제안서.py` 저장
---
## Part 1: 슬라이드 경계 상수
```
SW = 13.333" (슬라이드 전체 너비)
SH = 7.5" (슬라이드 전체 높이)
ML = 0.8" (좌측 마진, ML_IN)
CW = 11.73" (콘텐츠 너비, CW_IN)
Z["ct_y"] = 1.1" (콘텐츠 상단 — TB 아래)
Z["ct_b"] = 6.5" (콘텐츠 하단 — 여기 넘으면 경미한 넘침)
GAP = 0.2" (VStack 기본 간격)
CGAP = 0.15" (컬럼 간 간격)
```
**절대 경계:**
- `bottom > 6.5"` → 경미한 넘침 (하단 여백 침범)
- `bottom > 7.5"` → 치명적 (슬라이드 외부, 보이지 않음)
---
## Part 2: VStack 동작
```python
v = VStack() # _y = Z["ct_y"] = 1.1"
y = v.next(h) # returns Inches(_y), then _y += h + 0.2(gap)
y = v.peek() # returns Inches(_y), _y 변경 없음
v.skip(amount) # _y += amount (gap 없이)
```
**v.next(h)에서 h = 해당 요소의 실제 렌더링 높이** (할당 높이가 아님)
---
## Part 3: 스크립트→코드 변환 매핑
### 특수 슬라이드
| 스크립트 유형 | Python 코드 |
|-------------|-------------|
| cover | `slide_cover(prs, "프로젝트명", "발주처명")` |
| toc | `slide_toc(prs, "목차", [("01", "HOOK", "설명"), ...], pg=N)` |
| section_divider | `slide_section_divider(prs, "01", "HOOK", "부제", "스토리", "key1", WIN)` |
| exec_summary | `slide_exec_summary(prs, ...)` |
| next_step | `slide_next_step(prs, headline=, steps=[...])` |
| closing | `slide_closing(prs, "프로젝트명", tagline="...")` |
### 일반 콘텐츠
| 스크립트 필드 | Python 코드 |
|-------------|-------------|
| Action Title | `TB(s, "인사이트 제목", pg=N)` |
| 배경: dark | `bg(s, C["dark"])` + `TB(s, ..., dark=True)` |
| 배경: white | `bg(s, C["white"])` |
| 배경: light | `bg(s, C["light"])` |
| Win Theme: keyN | `WB(s, "keyN", WIN)` |
| Bridge 문장 | `HIGHLIGHT(s, "Bridge 문장", y=v.next(0.8))` |
---
## Part 4: 도식화 함수 시그니처 (★★★ 치명적 규칙)
### ★ COLS body = list[str] 필수
```python
# ❌ 치명적: 각 글자가 한 줄씩 세로로 렌더링됨
{"title": "제목", "body": "항목1\n항목2\n항목3"}
# ✅ 정상
{"title": "제목", "body": ["항목1", "항목2", "항목3"]}
```
### ★ COLS title에 \n 금지
```python
# ❌ 좁은 컬럼에서 글자가 세로로 깨짐
{"title": "핵심 메시지 1\n소상공인 상생", "body": [...]}
# ✅ 콜론 또는 대시로 구분
{"title": "메시지 1: 소상공인 상생", "body": [...]}
```
### ★ 가로 배치 for 루프 — v.next() 루프 밖 1회
```python
# ❌ 매 iteration마다 VStack 소비
for i, item in enumerate(items):
METRIC_CARD(s, x, v.next(1.3), ...) # 4회 = 6.0" 소비!
# ✅ v.next() 1회만 호출
y_cards = v.next(1.3)
for i, item in enumerate(items):
METRIC_CARD(s, x, y_cards, ...) # 같은 y값
```
### 전체 시그니처 레퍼런스
#### 컬럼/그리드 계열
```python
COLS(s, items, y=None, h=None, colors=None, shadow=True)
# items: [{"title": str, "body": list[str]}] ← body 반드시 list!
GRID(s, items, cols=3, y=None, h=None, gap=CGAP, shadow=True)
# h = 개별 카드 높이 (총 높이 아님!)
ICON_CARDS(s, items, y=None, h=None)
# items: [{"icon": "emoji", "title": str, "desc": str}]
```
#### 통계/KPI 계열
```python
STAT_ROW(s, items, y=None, h=None, shadow=True)
# items: [{"value": str, "label": str}] ← dict 필수!
KPIS(s, items, y=None, h=None, shadow=True)
# items: [{"value": str, "label": str, "sub": str}]
METRIC_CARD(s, x, y, w, h, value, label, sub, color, shadow=True)
```
#### 비교/플로우 계열
```python
COMPARE(s, left_title, left_items, right_title, right_items, y=None)
FLOW(s, items, y=None, h=None)
# items: [{"step": "01", "title": str, "desc": str}]
TIMELINE(s, items, y=None, h=None)
# items: [{"period": str, "title": str, "desc": str}]
```
#### 구조화 계열
```python
PYRAMID(s, levels, y=None, w_max=None, h_total=None)
# levels: [("텍스트", C["color"])] ← tuple! h_total= 사용 (h= 아님)
MATRIX(s, items, y=None, h=None)
# items: [{"q": str, "title": str, "desc": str}]
ORG(s, pm=None, directors=None, teams=None, y=None)
# pm: {"name": str, "title": str} — h 파라미터 없음!
```
#### 차트 계열
```python
BAR_CHART(s, x, y, w, h, categories, series_data, title="", chart_type="column", colors=None)
# chart_type: "column"(세로), "bar"(가로), "stacked"(누적)
PIE_CHART(s, x, y, w, h, categories, values, title="", donut=False, colors=None)
LINE_CHART(s, x, y, w, h, categories, series_data, title="", smooth=False, colors=None)
```
#### 테이블/텍스트 계열
```python
TABLE(s, headers, rows, y=None, x=None, w=None, col_widths=None)
HIGHLIGHT(s, text, sub=None, y=None, color=None, grad=False)
QUOTE(s, text, author=None, y=None, color=None, style_type="modern")
NUMBERED_LIST(s, x, y, w, items, sz=None, gap=None)
```
#### 시각 헬퍼
```python
CARD(s, x, y, w, h, title, body, color=None, shadow=True, rounded=True)
IMG_PH(s, x, y, w, h, label)
PROGRESS_BAR(s, x, y, w, label, value, max_val, color=None, show_pct=True)
DONUT_LABEL(s, x, y, w, value, label, color=None)
GANTT_CHART(s, tasks, months, data, y=None)
```
---
## Part 5: 요소 간 간격 규칙
```
HIGHLIGHT → 다음 요소: 0.75" (높이 ~0.65-0.7")
HIGHLIGHT(sub=) → 다음 요소: 1.2" (sub 있으면 높이 ~1.0")
COLS → 다음 요소: 0.30"
METRIC_CARD → 다음 요소: 0.15"
MT(불릿) → 다음 요소: 0.20"
TABLE → 다음 요소: 0.15"
```
### MT(불릿 텍스트) 높이
```
3줄 = 1.1" 4줄 = 1.4" 5줄 = 1.7"
6줄 = 2.0" 8줄 = 2.8"
```
### 대형 폰트 높이
| 폰트 크기 | 줄 수 | 권장 h |
|-----------|--------|--------|
| 60pt | 2줄 | 2.0" |
| 44pt | 2줄 | 1.8" |
| 44pt | 3줄 | 2.5" |
| 36pt | 2줄 | 1.5" |
### 한글 너비
```
44pt: 0.61"/자 → CW 내 최대 ~18자
36pt: 0.50"/자 → CW 내 최대 ~23자
→ 44pt 제목 18자 초과 시 반드시 2줄 분리
```
### GRID 높이 계산
```
h = 개별 카드 높이 (총 높이 아님!)
N행 GRID 총 높이 = h × N + gap × (N-1), gap=0.15"
```
---
## Part 6: Shadow 규칙
```
COLS, GRID, STAT_ROW → shadow=False (기본)
KPIS → shadow=True 유지
ROI STAT_ROW → shadow=True 유지
CARD, METRIC_CARD → shadow=True (강조할 때만)
다크 배경 위 카드: add_shadow(shape, preset="elevated") — 필수
라이트 배경 위 카드: add_shadow(shape, preset="soft") — 선택
```
---
## Part 7: 7대 디자인 패턴
### P1. Hero Split
좌측 60% 대형 타이틀 + 우측 40% 이미지 + 하단 수치.
```python
s = new_slide(prs); bg(s, C["white"]); TB(s, "Action Title", pg=N)
v = VStack()
T(s, "핵심\n메시지", ML, v.next(2.0), Inches(CW_IN*0.55), Inches(2.0),
bold=True, sz=48)
IMG_PH(s, Inches(ML_IN + CW_IN*0.6), Inches(1.1),
Inches(CW_IN*0.4), Inches(3.5), label="[키비주얼]")
y_mc = v.next(1.3)
for i, (val, lbl) in enumerate([("70%", "인지도"), ("3배", "전환율")]):
x = Inches(ML_IN + i * (CW_IN/2))
METRIC_CARD(s, x, y_mc, Inches(CW_IN/2 - 0.1), Inches(1.3), val, lbl)
```
### P2. Dark Social Proof
다크 배경 + 대형 헤드라인 + 밝은 카드/인용.
```python
s = new_slide(prs); bg(s, C["dark"]); TB(s, "Action Title", pg=N, dark=True)
v = VStack()
T(s, "핵심 인사이트", ML, v.next(2.0), Inches(CW_IN), Inches(2.0),
bold=True, sz=44, c=C["white"], align="center")
QUOTE(s, "인용문", author="출처", y=v.next(1.2), style="modern")
```
### P3. Achievement Metrics
다크 배경 + 대형 수치 + shadow.
```python
s = new_slide(prs); bg(s, C["dark"]); TB(s, "Action Title", pg=N, dark=True)
v = VStack()
STAT_ROW(s, [
{"value": "28조", "label": "시장 규모"},
{"value": "1%", "label": "점유율"},
], y=v.next(1.5), shadow=True)
```
### P4. Bento Grid
비대칭 이미지/카드 — 좌 58% 대형 + 우 40% 소형 2개.
```python
s = new_slide(prs); bg(s, C["white"]); TB(s, "Action Title", pg=N)
v = VStack()
# 좌측 대형 카드 (58%)
w_left = Inches(CW_IN * 0.58)
w_right = Inches(CW_IN * 0.40)
x_right = Inches(ML_IN + CW_IN * 0.60)
y_top = v.next(4.8) # 전체 높이
CARD(s, ML, y_top, w_left, Inches(4.8), "핵심 전략",
["상세 설명 1", "상세 설명 2", "상세 설명 3"],
color=C["primary"], shadow=True)
# 우측 소형 카드 2개 (40%, 각 2.3" 높이)
CARD(s, x_right, y_top, w_right, Inches(2.3), "전략 A",
["설명 라인 1", "설명 라인 2"],
color=C["secondary"], shadow=True)
CARD(s, x_right, Inches(1.1 + 2.5), w_right, Inches(2.3), "전략 B",
["설명 라인 1", "설명 라인 2"],
color=C["teal"], shadow=True)
```
### P5. Comparison Cards
좌 라이트 카드 + 우 다크 카드 대비 — Before/After, AS-IS/TO-BE에 활용.
```python
s = new_slide(prs); bg(s, C["light"]); TB(s, "Action Title", pg=N)
v = VStack()
w_half = Inches(CW_IN / 2 - 0.1)
y_cards = v.next(4.0)
# 좌측: 밝은 카드 (현재/문제)
sh_l = RBOX(s, ML, y_cards, w_half, Inches(4.0), C["white"], radius=0.08)
add_shadow(sh_l, preset="subtle")
T(s, "AS-IS", Inches(ML_IN + 0.3), Inches(1.3), Inches(2), Inches(0.5),
bold=True, sz=16, c=C["accent"])
MT(s, Inches(ML_IN + 0.3), Inches(1.9), Inches(CW_IN/2 - 0.7), Inches(2.5),
["기존 방식 문제 1", "기존 방식 문제 2", "기존 방식 문제 3"], bul=True)
# 우측: 다크 카드 (제안/해결)
x_r = Inches(ML_IN + CW_IN/2 + 0.1)
sh_r = RBOX(s, x_r, y_cards, w_half, Inches(4.0), C["primary"], radius=0.08)
add_shadow(sh_r, preset="elevated")
T(s, "TO-BE", Inches(ML_IN + CW_IN/2 + 0.4), Inches(1.3), Inches(2), Inches(0.5),
bold=True, sz=16, c=C["secondary"])
MT(s, Inches(ML_IN + CW_IN/2 + 0.4), Inches(1.9), Inches(CW_IN/2 - 0.7), Inches(2.5),
["제안 솔루션 1", "제안 솔루션 2", "제안 솔루션 3"], bul=True, tc=C["white"])
```
### P6. Module Cards
3열 이미지+카드 + shadow — 포트폴리오/사례/프로그램 소개.
```python
s = new_slide(prs); bg(s, C["white"]); TB(s, "Action Title", pg=N)
v = VStack()
cw3 = _cols(3) # 3등분 너비
y_modules = v.next(4.5)
for i, (title, desc) in enumerate([
("프로그램 A", "설명 텍스트"),
("프로그램 B", "설명 텍스트"),
("프로그램 C", "설명 텍스트"),
]):
x = Inches(ML_IN + i * (cw3 + CGAP))
# 상단 이미지 영역
IMG_PH(s, x, y_modules, Inches(cw3), Inches(2.2), label=f"[{title} 이미지]")
# 하단 카드
CARD(s, x, Inches(y_modules.inches + 2.3), Inches(cw3), Inches(2.2),
title, [desc], color=C["primary"], shadow=True)
```
### P7. Dark-Light Rhythm
```
❌ 5장 이상 연속 white 금지
✅ 2~3장마다 dark/light 교차
✅ 다크 배경: 전체의 10~20%
✅ light 배경: 전체의 15~25% (white 단조로움 방지)
```
---
## Part 8: 콘텐츠 유형 → 레이아웃 매핑
| 콘텐츠 유형 | 권장 함수 | 대안 |
|------------|----------|------|
| 시장 환경/배경 분석 | `COLS()` | `COMPARE()` |
| 핵심 인사이트/메시지 | `HIGHLIGHT()` | `QUOTE()` |
| 전략 프레임워크 | `PYRAMID()` | `MATRIX()` |
| 채널/항목 비교 | `COMPARE()` | `COLS()` |
| 실행 프로세스 | `FLOW()` | `TIMELINE()` |
| KPI/성과 목표 | `KPIS()` | `STAT_ROW()` |
| 월별 일정 | `GANTT_CHART()` | `TABLE()` |
| 조직도 | `ORG()` | — |
| 수행 실적 | `GRID()` | `COLS()` |
| 데이터 비교 | `TABLE()` | `BAR_CHART()` |
| 통계/수치 강조 | `STAT_ROW()` | `METRIC_CARD()` |
| 예산/비율 | `PIE_CHART()` / `BAR_CHART()` | `TABLE()` |
| 추세/성장 | `LINE_CHART()` | `BAR_CHART()` |
---
## Part 9: HIGHLIGHT 예산 규칙
```
HIGHLIGHT 최대 사용량: 콘텐츠 슬라이드의 15% 이하
- 50장 기준 최대 7회
HIGHLIGHT 대안:
- 짧은 인사이트 → ACCENT_LINE + T(bold)
- 인용문/출처 → QUOTE(modern)
- 섹션 내 구분 → DIVIDER(thick)
- 데이터 인사이트 → METRIC_CARD / DONUT_LABEL
- 그라디언트 강조 → HIGHLIGHT(grad=True) (허용)
```
---
## Part 10: 금지 패턴
```
❌ COLS+HIGHLIGHT 동일 조합 3회 이상 반복
❌ TABLE+HIGHLIGHT 동일 조합 3회 이상 반복
❌ 같은 Phase 내 HIGHLIGHT 연속 2장
❌ 상위 3개 함수가 전체 콘텐츠 호출의 50% 이상 차지
❌ slide_kit 헬퍼 함수를 스크립트 내에 재정의
❌ RGBColor 직접 하드코딩 → C["color"] 사용
❌ 폰트명 직접 쓰기 → FONT 상수 사용
❌ "맑은 고딕" 등 다른 폰트 → Pretendard만
```
---
## Part 11: 시각 효과 최소 기준 (50장 기준)
| 효과 | 최소 횟수 | 적용 위치 |
|------|----------|----------|
| `add_shadow(preset=)` | 6회+ | CARD, 컨셉 슬라이드 |
| `gradient_bg()` | 3회+ | Phase 3 컨셉, 요약 |
| `ACCENT_LINE()` | 3회+ | HIGHLIGHT 대체 |
| `DIVIDER()` | 2회+ | 슬라이드 내 섹션 구분 |
| `shadow=True` (COLS/GRID/KPIS) | 5회+ | 카드형 레이아웃 |
---
## Part 12: Phase별 권장 시각 요소
| Phase | 필수 시각 요소 |
|-------|-------------|
| 0 HOOK | 대형 텍스트(44-60pt) + IMG_PH + HIGHLIGHT |
| 1 SUMMARY | HIGHLIGHT + KPIS + COLS |
| 2 INSIGHT | METRIC_CARD + COMPARE + BAR_CHART + HIGHLIGHT |
| 3 CONCEPT | PYRAMID + FLOW + COMPARE + IMG_PH |
| 4 ACTION | COLS + TABLE + ICON_CARDS + IMG_PH |
| 5 MANAGEMENT | ORG + GANTT_CHART + FLOW + TABLE |
| 6 WHY US | GRID + TABLE + STAT_ROW + HIGHLIGHT |
| 7 INVESTMENT | PIE_CHART + TABLE + KPIS + STAT_ROW |
---
## Part 13: ★★★ Premium Design Layer (디자인 퀄리티 상향)
코드 변환 시 아래 규칙을 **반드시** 적용하여 디자인 퀄리티를 높입니다.
### 13-1. 배경 다양성 (단색 탈피)
**콘텐츠 슬라이드도 배경에 변화를 줍니다:**
| 배경 유형 | 코드 | 용도 |
|----------|------|------|
| white (기본) | `bg(s, C["white"])` | 일반 콘텐츠 |
| light (밝은 회색) | `bg(s, C["light"])` | white 연속 방지, 부드러운 변주 |
| dark (다크) | `bg(s, C["dark"])` | 임팩트/강조 슬라이드 |
| light gradient | `gradient_bg(s, C["white"], C["light"], angle=180.0)` | **NEW** 미세 그라디언트 |
| primary tint | `gradient_bg(s, C["white"], lighten(C["primary"], 0.85), angle=180.0)` | **NEW** 브랜드 색조 |
| teal tint | `gradient_bg(s, C["white"], lighten(C["teal"], 0.85), angle=180.0)` | **NEW** 포인트 색조 |
**배경 배분 기준 (50장 기준):**
```
white: 50~55% (25~28장)
light: 15~20% (8~10장)
dark: 10~15% (5~8장)
light gradient / tint: 10~15% (5~8장) ← NEW: 단색 대비 변주
특수 (cover/section/closing): 나머지
```
**적용 위치 가이드:**
- light gradient → Phase 2 분석 슬라이드, Phase 4 콘텐츠 예시
- primary tint → Phase 3 전략 슬라이드, Phase 6 역량
- teal tint → Phase 4 디지털/테크 슬라이드
- 같은 tint를 연속 2장 초과 사용 금지
### 13-2. 그림자 프리셋 활용 (depth layering)
**shadow=True/False 대신 프리셋을 적극 활용합니다:**
| 프리셋 | 효과 | 적용 대상 |
|--------|------|----------|
| `"subtle"` | 은은한 부유감 | light/white 배경 위 일반 카드 |
| `"normal"` | 기본 깊이감 | 강조 카드, COLS |
| `"elevated"` | 강한 부유감 | 다크 배경 위 카드, 핵심 메시지 카드 |
| `"card"` | 카드 전용 | CARD(), METRIC_CARD |
**프리셋 적용 규칙:**
```python
# ❌ 기본 shadow=True만 사용 (퀄리티 낮음)
COLS(s, items, shadow=True)
# ✅ 배경에 맞는 프리셋 선택
# white/light 배경 → subtle 또는 normal
sh = COLS(s, items, shadow=True) # 내부적으로 기본 그림자
# 추가 강조 카드에는:
card = CARD(s, x, y, w, h, title, body, shadow=True)
# dark 배경 → elevated 필수 (안 보이면 의미 없음)
sh = RBOX(s, x, y, w, h, C["primary"], radius=0.08)
add_shadow(sh, preset="elevated")
```
**최소 사용 기준 (50장 기준):**
```
add_shadow(preset="subtle"): 5회+
add_shadow(preset="elevated"): 3회+ (다크 배경 카드)
add_shadow(preset="card"): 3회+ (CARD/METRIC_CARD)
```
### 13-3. 타이포그래피 웨이트 활용
**6가지 웨이트를 계층적으로 사용합니다:**
| 웨이트 | FONT_W 키 | 용도 |
|--------|----------|------|
| `Black` | `FONT_W["black"]` | 표지/섹션 구분자 대형 숫자 |
| `Bold` | `FONT_W["bold"]` | Action Title, 카드 제목 |
| `SemiBold` | `FONT_W["semibold"]` | 소제목, 강조 본문, KPI value |
| `Medium` | `FONT_W["medium"]` | 리드 텍스트, 설명 강조 |
| `Regular` | `FONT_W["regular"]` | 일반 본문 |
| `Light` | `FONT_W["light"]` | 대형 텍스트(44pt+), 캡션, 출처 |
**적용 예시:**
```python
# 대형 인사이트 텍스트 — Light로 세련됨 + Bold 키워드 혼합
T(s, "시장의 변화가\n시작되고 있습니다", ML, v.next(2.0),
Inches(CW_IN*0.6), Inches(2.0), sz=44, fn=FONT_W["light"], c=C["dark"])
# 리드 텍스트 — Medium으로 본문과 차별화
T(s, "데이터가 말하는 3대 시장 기회", ML, v.next(0.5),
Inches(CW_IN), Inches(0.5), sz=16, fn=FONT_W["medium"], c=C["gray"])
# KPI 수치 — SemiBold로 임팩트
T(s, "+30%", ML, v.next(1.0), Inches(3), Inches(1.0),
sz=36, fn=FONT_W["semibold"], c=C["primary"], align="center")
```
**최소 사용 기준:**
```
FONT_W["light"]: 3회+ (대형 텍스트, 캡션)
FONT_W["medium"]: 5회+ (리드/부제/설명 강조)
FONT_W["semibold"]: 5회+ (소제목, KPI 수치)
```
### 13-4. 시각 악센트 요소 (polish)
**디자인 완성도를 높이는 미세 요소들을 적극 사용합니다:**
```python
# ① ACCENT_LINE — 텍스트 블록 좌측 수직 악센트
ACCENT_LINE(s, ML, v.peek(), Inches(1.5), C["primary"])
T(s, "핵심 메시지 텍스트...", Inches(ML_IN + 0.3), v.next(1.5), ...)
# ② DIVIDER — 슬라이드 내 섹션 구분 (thick/double 활용)
DIVIDER(s, y=v.next(0.05), style="thick", color=C["primary"])
# ③ OVERLAY — 이미지 위 반투명 레이어 + 텍스트
IMG_PH(s, ML, v.peek(), Inches(CW_IN), Inches(3.5), label="[배경 이미지]")
OVERLAY(s, ML, v.peek(), Inches(CW_IN), Inches(3.5), C["dark"], alpha=40000)
T(s, "이미지 위 텍스트", ML, v.next(3.5), Inches(CW_IN), Inches(3.5),
sz=36, c=C["white"], bold=True, align="center")
# ④ gradient_shape — 카드/도형에 그라디언트 채우기
sh = RBOX(s, x, y, w, h, C["primary"], radius=0.08)
gradient_shape(sh, C["primary"], C["secondary"], angle=135.0)
add_shadow(sh, preset="elevated")
# ⑤ ORBOX — 아웃라인 뱃지/태그
ORBOX(s, x, y, Inches(2), Inches(0.4), text="Phase 1",
sz=10, lc=C["primary"], tc=C["primary"], radius=0.15)
```
**최소 사용 기준 (50장 기준):**
```
ACCENT_LINE: 5회+ (HIGHLIGHT 대체)
DIVIDER: 3회+ (슬라이드 내 구분)
OVERLAY: 2회+ (이미지 슬라이드)
gradient_shape: 3회+ (고급 카드)
ORBOX: 3회+ (태그/뱃지)
```
### 13-5. 컬러 활용 (색상 깊이)
**C 딕셔너리의 파생색과 darken/lighten 함수를 활용합니다:**
```python
# ① 카드 배경에 파생색 활용 (흰색 카드 대신)
RBOX(s, x, y, w, h, C["primary_light"], radius=0.08) # 연한 프라이머리 배경
RBOX(s, x, y, w, h, C["teal_light"], radius=0.08) # 연한 틸 배경
RBOX(s, x, y, w, h, C["card_bg"], radius=0.08) # 전용 카드 배경
# ② darken/lighten으로 미세 색상 조정
header_color = darken(C["primary"], 0.1) # 약간 어두운 프라이머리
accent_bg = lighten(C["accent"], 0.7) # 매우 밝은 액센트 (배경용)
soft_teal = lighten(C["teal"], 0.6) # 부드러운 틸 (배경용)
# ③ COLS/GRID 컬러 파라미터 활용
COLS(s, items, colors=[C["primary"], C["secondary"], C["teal"]], shadow=True)
GRID(s, items, colors=[C["primary"], C["teal"], C["secondary"], C["accent"]])
```
**색상 대비 필수 확인:**
```
다크 배경 위 텍스트 → C["white"] 또는 lighten(C["secondary"], 0.3)
다크 배경 위 카드 → C["primary"], C["secondary"] (dark 아닌 색상)
light 배경 위 카드 → C["white"] + shadow (배경과 분리)
```
### 13-6. Phase 3 컨셉 슬라이드 필수 패턴
**Phase 3에는 아래 3종 슬라이드를 반드시 포함합니다:**
#### Concept Reveal (컨셉 공개)
```python
s = new_slide(prs); bg(s, C["dark"]); TB(s, "Action Title", pg=pg, dark=True)
v = VStack()
# 대형 컨셉 키워드 (Light 웨이트로 세련됨)
T(s, "CONNECT\n& GROW", ML, v.next(2.5), Inches(CW_IN), Inches(2.5),
sz=60, fn=FONT_W["light"], c=C["white"], align="center")
# 하단 4단계 순환 카드
COLS(s, [
{"title": "Discover", "body": ["시장 인사이트", "타겟 분석"]},
{"title": "Design", "body": ["전략 설계", "채널 기획"]},
{"title": "Deliver", "body": ["콘텐츠 제작", "캠페인 실행"]},
{"title": "Develop", "body": ["성과 분석", "최적화 반복"]},
], y=v.next(2.2), colors=[C["primary"], C["secondary"], C["teal"], C["accent"]],
shadow=True)
```
#### Strategy Synergy Map (전략 시너지)
```python
s = new_slide(prs)
gradient_bg(s, C["white"], lighten(C["primary"], 0.85), angle=180.0)
TB(s, "3대 전략이 만드는 시너지 효과", pg=pg)
v = VStack()
# Win Theme 3개를 FLOW로 연결
FLOW(s, [
{"step": "W1", "title": WIN["key1"], "desc": "설명 텍스트"},
{"step": "W2", "title": WIN["key2"], "desc": "설명 텍스트"},
{"step": "W3", "title": WIN["key3"], "desc": "설명 텍스트"},
], y=v.next(2.0))
# 시너지 메시지
HIGHLIGHT(s, "3대 전략의 통합이 [프로젝트 목표] 달성의 핵심",
y=v.next(0.8), grad=True)
```
#### Big Idea Reveal (빅 아이디어)
```python
s = new_slide(prs); bg(s, C["dark"]); TB(s, "Action Title", pg=pg, dark=True)
v = VStack()
# 중앙 컨셉 메시지
HIGHLIGHT(s, "핵심 컨셉 한 줄 메시지", y=v.next(1.0), grad=True)
# 3-Step 실행 카드
COLS(s, [
{"title": "Step 1: 인지", "body": ["인지도 확보", "매체 최적화"]},
{"title": "Step 2: 전환", "body": ["퍼널 설계", "CTA 최적화"]},
{"title": "Step 3: 충성", "body": ["재구매 유도", "커뮤니티 구축"]},
], y=v.next(2.5), shadow=True,
colors=[C["primary"], C["secondary"], C["teal"]])
# Bridge
T(s, "이 전략을 구현할 구체적 실행 계획을 소개합니다",
ML, v.next(0.5), Inches(CW_IN), Inches(0.5),
sz=14, fn=FONT_W["medium"], c=C["lgray"], align="center")
```
### 13-7. 디자인 완성도 체크리스트
코드 작성 완료 후 아래 항목을 자체 검증합니다:
```
[필수] 배경 다양성
□ light 배경 사용 8장+
□ light gradient / tint 배경 사용 5장+
□ white 5장 연속 없음
[필수] 그림자 깊이
□ add_shadow(preset="subtle") 5회+
□ add_shadow(preset="elevated") 3회+ (다크 배경)
□ 다크 배경 위 카드에 elevated 그림자 적용됨
[필수] 타이포 계층
□ FONT_W["light"] 3회+ 사용
□ FONT_W["medium"] 5회+ 사용
□ FONT_W["semibold"] 5회+ 사용
[필수] 시각 악센트
□ ACCENT_LINE 5회+ 사용
□ DIVIDER 3회+ 사용
□ gradient_shape 또는 OVERLAY 2회+ 사용
□ ORBOX(뱃지/태그) 3회+ 사용
[필수] 컬러 활용
□ C["primary_light"], C["teal_light"] 등 파생색 사용
□ darken()/lighten() 활용 3회+
□ COLS/GRID에 colors= 파라미터 활용 5회+
[필수] Phase 3 컨셉
□ Concept Reveal (다크+60pt+4카드)
□ Strategy Synergy Map (FLOW+HIGHLIGHT)
□ Big Idea Reveal (다크+3-Step)
```
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!