
    i                     >   d Z ddlZddlZddlZddlmZ ddlZddlmZ ddl	m
Z
mZmZmZ ej                  j                  d e ee      j$                               ddlZeZeZdZdZeZe
dz  Zed	z  Zed
z  ZdZdZdZdefdZ dedefdZ!d Z"e#dk(  r e"        yy)uI   컨셉 #28 W Concept Style — 에디토리얼 미니멀 이미지 생성    N)Path)sync_playwright)WORKSPACE_ROOT
CTA_MIN_PXHEAD_SUB_RATIOSUBHEAD_MIN_PXX   gffffff?z1output/meta-ads/concept-catalog/28-wconcept-stylezbg.jpgz
sample.pngz0https://generativelanguage.googleapis.com/v1betazAbstract minimalist empty background, very light warm cream white color, extremely clean with subtle paper grain texture, soft ambient lighting, no objects, no text, no people, high-end editorial aesthetic, square formatu  <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
  * { margin: 0; padding: 0; box-sizing: border-box; }
  body {
    width: 1080px;
    height: 1080px;
    overflow: hidden;
    font-family: 'Pretendard', 'Noto Sans KR', 'Noto Serif KR', sans-serif;
    background-color: #F5F5F3;
  }
  .container {
    position: relative;
    width: 1080px;
    height: 1080px;
    background-image: url('__BG_PATH__');
    background-size: cover;
    background-position: center;
  }

  /* 좌측 세로 텍스트 (RECRUITING 2026) — writing-mode 방식으로 변경 */
  .vertical-label {
    position: absolute;
    left: 28px;
    top: 50%;
    transform: translateY(-50%);
    writing-mode: vertical-rl;
    text-orientation: mixed;
    transform: translateY(-50%) rotate(180deg);
    font-size: {_CTA_PX}px;
    font-weight: 300;
    color: #8C8C8C;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    white-space: nowrap;
  }

  /* 좌측 세로 장식선 */
  .left-line {
    position: absolute;
    left: 90px;
    top: 100px;
    bottom: 100px;
    width: 1px;
    background: linear-gradient(to bottom, transparent, #C8C8C8 20%, #C8C8C8 80%, transparent);
  }

  /* 우측 콘텐츠 영역 */
  .content-area {
    position: absolute;
    left: 120px;
    right: 64px;
    bottom: 90px;
  }

  /* 상단 구분자 작은 텍스트 */
  .eyebrow {
    font-size: {_CTA_PX}px;
    font-weight: 300;
    color: #8C8C8C;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    margin-bottom: 32px;
  }

  /* 메인 헤드라인 — 세리프 느낌 (Noto Serif KR 또는 Noto Sans KR Light) */
  .headline {
    font-size: {_SIZE_88PX}px;
    font-weight: 200;
    color: #1C1C1C;
    line-height: {_LH_1_15};
    letter-spacing: -0.025em;
    margin-bottom: 36px;
    font-family: 'Noto Serif KR', 'Pretendard', serif;
  }

  /* 얇은 구분선 */
  .divider {
    width: 56px;
    height: 1px;
    background: #1C1C1C;
    margin-bottom: 32px;
  }

  /* 보조 텍스트 */
  .sub-text {
    font-size: {_SUBHEAD_PX}px;
    font-weight: 100;
    color: #8C8C8C;
    line-height: {_LH_RATIO};
    letter-spacing: -0.01em;
    margin-bottom: 44px;
  }

  /* CTA — 버건디 밑줄 링크 스타일 */
  .cta {
    font-size: {_CTA_PX}px;
    font-weight: 400;
    color: #8B1A2F;
    letter-spacing: 0.04em;
    border-bottom: 1.5px solid #8B1A2F;
    display: inline-block;
    padding-bottom: 4px;
  }

  /* 우상단 작은 에디토리얼 넘버 */
  .issue-number {
    position: absolute;
    top: 60px;
    right: 64px;
    font-size: {_CTA_PX}px;
    font-weight: 200;
    color: #C0C0C0;
    letter-spacing: 0.08em;
  }

  /* 좌상단 브랜드 마크 */
  .brand-mark {
    position: absolute;
    top: 60px;
    left: 120px;
    font-size: {_CTA_PX}px;
    font-weight: 800;
    color: #0A0A0A;
    letter-spacing: 0.12em;
    text-transform: uppercase;
  }
</style>
</head>
<body>
<div class="container">
  <div class="left-line"></div>
  <div class="vertical-label">Recruiting 2026</div>
  <div class="brand-mark">CAREER</div>
  <div class="issue-number">No. 28</div>
  <div class="content-area">
    <div class="eyebrow">Editorial</div>
    <div class="headline">열심히는 하는데,<br>월급은 제자리걸음?</div>
    <div class="divider"></div>
    <div class="sub-text">당신의 커리어,<br>다시 디자인하세요</div>
    <div class="cta">확인하기 →</div>
  </div>
</div>
</body>
</html>
returnc                     t        j                  d      } | st        d       yd|  dd}t         d}dd	t        igigd
ddgid}t        d       t        j                  |||d      }|j                  dk7  r)t        d|j                   d|j                  dd         y|j                         }|j                  di g      d   j                  di       j                  dg       D ]J  }d|v st        j                  |d   d         }t        j                  |       t        dt                 y t        d       y)u;   Gemini SA 토큰으로 배경 이미지를 생성합니다.z3https://www.googleapis.com/auth/generative-languageu     [오류] SA 토큰 없음FzBearer zapplication/json)AuthorizationzContent-Typez6/models/gemini-3.1-flash-image-preview:generateContentpartstextresponseModalitiesTEXTIMAGE)contentsgenerationConfigu     배경 생성 요청 중...x   )headersjsontimeout   u     [오류] z: Ni,  
candidatesr   content
inlineDatadatau     배경 저장 완료: Tu"     [오류] 이미지 파트 없음)gcloud_authget_service_account_tokenprintGEMINI_API_BASE	BG_PROMPTrequestspoststatus_coder   r   getbase64	b64decodeBG_PATHwrite_bytes)sa_tokenr   urlpayloadrespr   part	img_bytess           Z/home/jay/workspace/.worktrees/task-2116-dev1/tools/ai-image-gen/gen_concept28_wconcept.pygenerate_backgroundr1      sX   445jkH+,")( 4FXYGS
TC 34561FG3DEG 

)*==gGSID3D,,-R		$3/@AB99;Dt,Q/33IrBFFwPRS 4((l);F)CDI	*,WI67 

./    html_contentc                    t         dz  }|j                  | d       t               5 }|j                  j	                         }|j                  ddd      }|j                  d|        |j                  d       |j                  t        t              d	
       |j                          ddd       t        dt                y# 1 sw Y   xY w)u-   Playwright로 HTML을 PNG로 캡처합니다.zoverlay.htmlzutf-8)encodingi8  )widthheight)viewportfile://i  png)pathtypeNu     PNG 저장 완료: T)
OUTPUT_DIR
write_textr   chromiumlaunchnew_pagegotowait_for_timeout
screenshotstrSAMPLE_PATHcloser   )r3   	html_filepbrowserpages        r0   render_htmlrL      s    ^+I8		 a**##%44)HI		GI;'(d#S-E: 
!+
/0 s   BCCc                     t         j                  dd       t        d       t               } | st	        j
                  d       t        d       dt         }t        j                  d|      }t        |       t        dt                y )	NT)parentsexist_oku    [1/2] 배경 이미지 생성...   u$   [2/2] HTML 오버레이 렌더링...r9   __BG_PATH__u	   
완료: )r=   mkdirr   r1   sysexitr(   HTML_TEMPLATEreplacerL   rF   )okbg_urlhtmls      r0   mainrZ      sr    TD1	
,-		B	
01wi F  7D	J{m
$%r2   __main__)$__doc__r&   rS   timepathlibr   r"   playwright.sync_apir   
gen_configr   r   r   r   r;   insertrE   __file__parentr   _CTA_PX_SUBHEAD_PX
_SIZE_88PX_LH_1_15	_LH_RATIOr=   r(   rF   r    r!   rU   boolr1   rL   rZ   __name__ r2   r0   <module>rl      s    O  
    / Q Q 3tH~,,- . 

	 QQ

x
<'D2 
SlT 8c d & zF r2   