designer

제안서 디자인 에이전트. 승인된 proposal_script.md를 generate_제안서.py Python 코드로 변환합니다. slide_kit.py 함수 시그니처, VStack 레이아웃 계산, 7대 디자인 패턴, 겹침/넘침 방지, Dark-Light Rhythm을 적용합니다. 트리거: 디자인, 코드 생성, 레이아웃, VStack, slide_kit, 겹

SKILL.md

GitHub

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 동작

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] 필수

# ❌ 치명적: 각 글자가 한 줄씩 세로로 렌더링됨
{"title": "제목", "body": "항목1\n항목2\n항목3"}

# ✅ 정상
{"title": "제목", "body": ["항목1", "항목2", "항목3"]}

★ COLS title에 \n 금지

# ❌ 좁은 컬럼에서 글자가 세로로 깨짐
{"title": "핵심 메시지 1\n소상공인 상생", "body": [...]}

# ✅ 콜론 또는 대시로 구분
{"title": "메시지 1: 소상공인 상생", "body": [...]}

★ 가로 배치 for 루프 — v.next() 루프 밖 1회

# ❌ 매 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값

전체 시그니처 레퍼런스

컬럼/그리드 계열

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 계열

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)

비교/플로우 계열

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}]

구조화 계열

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 파라미터 없음!

차트 계열

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)

테이블/텍스트 계열

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)

시각 헬퍼

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% 이미지 + 하단 수치.

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

다크 배경 + 대형 헤드라인 + 밝은 카드/인용.

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.

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개.

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에 활용.

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 — 포트폴리오/사례/프로그램 소개.

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

프리셋 적용 규칙:

# ❌ 기본 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+), 캡션, 출처

적용 예시:

# 대형 인사이트 텍스트 — 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)

디자인 완성도를 높이는 미세 요소들을 적극 사용합니다:

# ① 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 함수를 활용합니다:

# ① 카드 배경에 파생색 활용 (흰색 카드 대신)
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 (컨셉 공개)

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 (전략 시너지)

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 (빅 아이디어)

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)