
    i'                        d Z ddlZddl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  ee      j                   Zedz  Zedz  dz  d	z  Zedz  dz  d
z  Zedz  Zedz  Zej.                  j1                  d ee             ddlZeZdZeZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&defdZ'dedz  defdZ(dedefdZ)d Z*e+dk(  r e*        yy)up   
#13 CSS Flexbox + 그라디언트 배너 v2 생성기
Gemini 배경 + HTML 오버레이 하이브리드 방식
    N)Path)sync_playwright)WORKSPACE_ROOT
CTA_MIN_PXSUBHEAD_MIN_PXz/output/meta-ads/concept-catalog/13-css-gradientoutputz	v4-hybridzbg_13_v2.jpgzoverlay_13_v2.htmlzsample-v2.pngz13-css-gradient-v2.png,   H   X   g333333?gffffff?gffffff?a|  Dark blue-green gradient abstract background, professional and corporate feel, deep navy blue (#0a1628) at top-left transitioning to dark teal green (#0d3d3a) at bottom-right, subtle geometric grid overlay with very faint lines, no text, no people, no logos, clean minimal texture, high contrast, very dark overall, 1080x1080 square format. Pure abstract gradient background only.zgemini-3-pro-image-previewz0https://generativelanguage.googleapis.com/v1betaz3https://www.googleapis.com/auth/generative-languagereturnc            	         t        d       	 t        d       t        j                  t              } t         dt
         d}d|  dd}ddt        igigdddgid}t        j                         }t        j                  |||d      }|j                  dk7  r4t        d|j                   d|j                  dd         t        d       y|j                         }|j!                  di g      d   j!                  di       j!                  dg       }	t#        d |	D        d      }
|
st        d       y|
d    j!                  d!d"      }t%        j&                  |
d    d#         }t(        j*                  j-                  d$d$%       d&|v rd'nd(}t(        j/                  |      }|j1                  |       t        j                         |z
  }t        d)|j2                   d*t5        |      d+d,|d-d.       |S # t        $ rR}t        j                  d      }|r"t        d	       t         dt
         d
| }ddi}nt        d|       Y d}~d}~ww xY w)/u2   Gemini API로 배경 이미지를 생성합니다.u!   [1/3] Gemini 배경 생성 중...u      SA Bearer 토큰 인증 사용z/models/z:generateContentzBearer zapplication/json)AuthorizationContent-TypeGEMINI_API_KEYu      API Key 인증 fallback 사용z:generateContent?key=r   u   인증 실패: NpartstextresponseModalitiesIMAGETEXT)contentsgenerationConfigx   )headersjsontimeout   u     [경고] Gemini API 실패 (z): i,  u7     → CSS 그라디언트 배경으로 대체합니다.
candidatesr   contentc              3   *   K   | ]  }d |v s|  yw)
inlineDataN ).0ps     Z/home/jay/workspace/.worktrees/task-2116-dev1/tools/ai-image-gen/gen_13_css_gradient_v2.py	<genexpr>z&generate_background.<locals>.<genexpr>X   s     =Q<1+<q=s   	uK     [경고] 이미지 데이터 없음 → CSS 그라디언트 배경 사용r    mimeTypez
image/jpegdataTparentsexist_okjpegz.jpgz.pngu     배경 생성 완료:  (,z bytes, z.1fu   초))printgcloud_authget_service_account_tokenGEMINI_SCOPEGEMINI_API_BASEMODEL_ID	Exceptionget_api_keyRuntimeError	BG_PROMPTtimerequestspoststatus_coder   r   getnextbase64	b64decodeBG_PATHparentmkdirwith_suffixwrite_bytesnamelen)tokenurlr   eapi_keypayloadstartrespr'   r   
image_part	mime_typeimage_bytesext	actual_bgelapseds                   r$   generate_backgroundrT   3   s_   	
-.60155lC !(3CD&ug..
  34561GV3DEG
 IIKE==gGSID3.t/?/?.@DIIdsOCTUVGH99;DHH\B4(+//	2>BB7BOE=%=tDJ[\<(,,ZFI"":l#;F#CDKNN5i'&VC##C(I+&iikE!G	$Y^^$4Bs;7G6J(SZ[^R__c
deQ  6))*:;46$%XhZ7LWIVC%'9:G455 6s   <G5 5	I>AIIbg_pathc                    t        d       | r+| j                         rd| j                          d}d| d}nd}d| dt         d	t         d
t
         dt         dt         dt         dt         dt         dt         dt         dt         dt         d}t        j                  j                  dd       t        j                  |d       t        dt                t        S )u,   HTML 오버레이 파일을 생성합니다.u%   [2/3] HTML 오버레이 생성 중...zurl('file://z')zbackground-image: z6; background-size: cover; background-position: center;zXbackground: linear-gradient(135deg, #0a1628 0%, #0d2d3a 40%, #0a3d35 70%, #062620 100%);a  <!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=1080">
<style>
  @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;700;800;900&display=swap');

  * { margin: 0; padding: 0; box-sizing: border-box; }

  body {
    width: 1080px;
    height: 1080px;
    overflow: hidden;
    font-family: 'Pretendard', 'Noto Sans KR', 'Apple SD Gothic Neo', sans-serif;
  }

  .canvas {
    width: 1080px;
    height: 1080px;
    position: relative;
    u  
  }

  /* 배경 위에 깊이감 있는 오버레이 */
  .canvas::before {
    content: '';
    position: absolute;
    inset: 0;
    background: linear-gradient(
      160deg,
      rgba(10,22,40,0.55) 0%,
      rgba(6,20,35,0.45) 50%,
      rgba(5,30,28,0.50) 100%
    );
    z-index: 0;
  }

  /* 미묘한 그리드 패턴 오버레이 */
  .canvas::after {
    content: '';
    position: absolute;
    inset: 0;
    background-image:
      linear-gradient(rgba(0,229,160,0.04) 1px, transparent 1px),
      linear-gradient(90deg, rgba(0,229,160,0.04) 1px, transparent 1px);
    background-size: 60px 60px;
    z-index: 0;
  }

  .content {
    position: relative;
    z-index: 1;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    justify-content: flex-start;
    padding: 60px 72px 60px 72px;
    height: 100%;
    gap: 0;
  }

  /* 상단 라벨 */
  .label {
    font-size: ztpx;
    font-weight: 600;
    color: #7EC8E3;
    letter-spacing: 0.05em;
    margin-bottom: 40px;
    line-height: u9   ;
  }

  /* 헤드라인 */
  .headline {
    font-size: z?px;
    font-weight: 800;
    color: #FFFFFF;
    line-height: u  ;
    margin-bottom: 40px;
    letter-spacing: -0.02em;
    word-break: keep-all;
  }

  /* 구분선 */
  .divider {
    width: 200px;
    height: 2px;
    background: #00E5A0;
    margin-bottom: 40px;
    flex-shrink: 0;
  }

  /* 혜택 블록 */
  .benefits {
    display: flex;
    flex-direction: column;
    gap: 20px;
    margin-bottom: 40px;
  }

  .sub-copy {
    font-size: z?px;
    font-weight: 700;
    color: #00E5A0;
    line-height: zC;
    letter-spacing: -0.02em;
  }

  .supporting {
    font-size: z?px;
    font-weight: 600;
    color: #FFFFFF;
    line-height: u[   ;
    letter-spacing: -0.02em;
  }

  /* 긴급 배지 */
  .urgent-badge {
    font-size: zpx;
    font-weight: 600;
    color: #FF3C3C;
    border: 1px solid #FF3C3C;
    background: rgba(255, 60, 60, 0.15);
    border-radius: 6px;
    padding: 8px 20px;
    display: inline-block;
    line-height: uO   ;
    margin-bottom: 40px;
  }

  /* CTA 버튼 */
  .cta-btn {
    font-size: zpx;
    font-weight: 700;
    color: #0a1628;
    background: #00E5A0;
    border-radius: 50px;
    padding: 20px 56px;
    display: inline-block;
    line-height: u  ;
    letter-spacing: -0.01em;
    cursor: pointer;
  }
</style>
</head>
<body>
<div class="canvas">
  <div class="content">
    <!-- 상단 라벨 -->
    <div class="label">T.O.P 사업단</div>

    <!-- 헤드라인 -->
    <div class="headline">월급은 왜<br>제자리걸음?</div>

    <!-- 구분선 -->
    <div class="divider"></div>

    <!-- 혜택 블록 -->
    <div class="benefits">
      <div class="sub-copy">신입 최대 1,000만원</div>
      <div class="supporting">경력직 직전연봉 50%</div>
    </div>

    <!-- 긴급 배지 -->
    <div class="urgent-badge">정착지원금 2026.7월 변경 예정</div>

    <!-- CTA 버튼 -->
    <div class="cta-btn">지금 상담 신청하기 →</div>
  </div>
</div>
</body>
</html>Tr(   zutf-8)encodingu     HTML 저장: )r.   existsresolve
_SIZE_44PX_LH_1_2
_SIZE_88PX_LH_1_15
_SIZE_72PX_SUBHEAD_PX_CTA_PX_LH_1_4	HTML_PATHrA   rB   
write_text)rU   bg_cssbg_stylehtmls       r$   
build_htmlrg   k   s6   	
127>># 12"5'x/ef g 	* J +V | 
  
 |   0 |   
 }    y    |    WkDZ 4$70	OI;
'(    	html_pathc           
      (   t        d       t        j                  dd       t               5 }|j                  j                  ddg      }	 |j                  ddd	      }|j                  d
| j                          d       |j                  d       |j                  t        t              dddddd       t        dt                |j                          	 ddd       t        S # |j                          w xY w# 1 sw Y   t        S xY w)u7   Playwright로 HTML을 1080x1080 PNG로 캡처합니다.u   [3/3] Playwright 캡처 중...Tr(   z--no-sandboxz--disable-setuid-sandbox)argsi8  )widthheight)viewportzfile://networkidle)
wait_untili  pngr   )xyrl   rm   )pathtypeclipu     캡처 완료: N)r.   
OUTPUT_DIRrB   r   chromiumlaunchnew_pagegotorY   wait_for_timeout
screenshotstr
FINAL_PATHclose)ri   r#   browserpages       r$   capture_imager   +  s    	
*+TD1		 a**##.:T)U#V	##tt-L#MD II	 1 1 345-IP !!$'OOZuQR]amqCrOs%j\23MMO   MMO  s$   DBC.D.D  DDc                     t        d       t        d       t        dt                t        d       t               } t        |       }t	        |      }t        j                  t        |      t        t                     t        dt                |j                         j                  dz  }t        d       t        d| d|d	d
       t        dt                t        d       y )Nz<============================================================u(   #13 CSS Gradient 배너 v2 생성 시작u   출력: u   
복사 완료: i   u   
생성 완료!z  sample-v2.png       : r,   z.0fz KB)z  13-css-gradient-v2.png: )r.   r   rT   rg   r   shutilcopy2r~   	COPY_PATHstatst_size)rU   ri   result_pathsize_kbs       r$   mainr   D  s    	(O	
45	HZL
!"	(O "#G 7#I  	*K LL[!3y>2	i[
)* ((4/G		$[MGC=
EF	&yk
23	(Orh   __main__),__doc__r>   r   r   sysr8   pathlibr   r9   playwright.sync_apir   
gen_configr   r   r   __file__rA   TOOL_DIRrw   r@   rb   r   r   rt   insertr~   r/   r`   rZ   r_   r^   r\   r[   r]   ra   r7   r3   r2   r1   rT   rg   r   r   __name__r!   rh   r$   <module>r      s4  
    
    / A A >  OO

X

+n
<x+-0DD	/)
22	 3x= ! 





. 
 (DD5T 5p}t } }@T d 24 zF rh   