
    sij&                     r   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
  ee      j                  Z ed      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&                  j)                  d ee             ddl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_playwrightzC/home/jay/workspace/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.pnga|  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     H/home/jay/workspace/tools/ai-image-gen/_backup/gen_13_css_gradient_v2.py	<genexpr>z&generate_background.<locals>.<genexpr>O   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_backgroundrN   *   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        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: 44px;
    font-weight: 600;
    color: #7EC8E3;
    letter-spacing: 0.05em;
    margin-bottom: 40px;
    line-height: 1.2;
  }

  /* 헤드라인 */
  .headline {
    font-size: 88px;
    font-weight: 800;
    color: #FFFFFF;
    line-height: 1.15;
    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: 72px;
    font-weight: 700;
    color: #00E5A0;
    line-height: 1.2;
    letter-spacing: -0.02em;
  }

  .supporting {
    font-size: 64px;
    font-weight: 600;
    color: #FFFFFF;
    line-height: 1.2;
    letter-spacing: -0.02em;
  }

  /* 긴급 배지 */
  .urgent-badge {
    font-size: 40px;
    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: 1.4;
    margin-bottom: 40px;
  }

  /* CTA 버튼 */
  .cta-btn {
    font-size: 44px;
    font-weight: 700;
    color: #0a1628;
    background: #00E5A0;
    border-radius: 50px;
    padding: 20px 56px;
    display: inline-block;
    line-height: 1.2;
    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	HTML_PATHr;   r<   
write_text)rO   bg_cssbg_stylehtmls       r   
build_htmlrY   b   s    	
127>># 12"5'x/ef g 	* J V+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yr^   r_   )pathtypeclipu     캡처 완료: N)r(   
OUTPUT_DIRr<   r   chromiumlaunchnew_pagegotorS   wait_for_timeout
screenshotstr
FINAL_PATHclose)r[   r   browserpages       r   capture_imageru   "  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(   rq   rN   rY   ru   shutilcopy2rp   	COPY_PATHstatst_size)rO   r[   result_pathsize_kbs       r   mainr~   ;  s    	(O	
45	HZL
!"	(O "#G 7#I  	*K LL[!3y>2	i[
)* ((4/G		$[MGC=
EF	&yk
23	(OrZ   __main__) __doc__r8   r   rw   sysr2   pathlibr   r3   playwright.sync_apir   __file__r;   TOOL_DIRri   r:   rT   rq   ry   rf   insertrp   r)   r1   r-   r,   r+   rN   rY   ru   r~   __name__r   rZ   r   <module>r      s  
    
    / >  WX

X

+n
<x+-0DD	/)
22	 3x= ! . 
 (DD5T 5p}t } }@T d 24 zF rZ   