
    is9                         d Z ddlZddlZddlmZ ddlmZ ddlmZ  ed      Z	e	j                  dd       d	Zd
ZdZdedededefdZdedededefdZd Zedk(  r e        yy)u   
Google Display Ad Generator - Angle B (성장 데이터)
Design Concept: #23 나이키 스타일
Nike-style: pure black, high contrast, powerful typography
    N)Path)sync_playwright)Imagez8/home/jay/workspace/output/google-ads/angle-B/productionT)parentsexist_oku  <!DOCTYPE html>
<html><head>
<meta charset="UTF-8">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;700;900&display=swap" rel="stylesheet">
<style>
  * { margin:0; padding:0; box-sizing:border-box; }
  body { width:1200px; height:628px; overflow:hidden; background:#000; }
  .container {
    position:relative;
    width:1200px;
    height:628px;
    background:#000;
    display:flex;
    flex-direction:column;
    justify-content:center;
    padding:0 80px;
    overflow:hidden;
  }

  /* Subtle diagonal accent line */
  .bg-line {
    position:absolute;
    top:0; right:260px;
    width:3px;
    height:100%;
    background: linear-gradient(to bottom, transparent, #ffffff22, transparent);
  }
  .bg-line2 {
    position:absolute;
    top:0; right:240px;
    width:1px;
    height:100%;
    background: linear-gradient(to bottom, transparent, #ffffff11, transparent);
  }

  /* GROWTH tag */
  .tag {
    font-family: 'Noto Sans KR', sans-serif;
    font-weight:900;
    font-size:22px;
    letter-spacing:8px;
    color:#ffffff44;
    text-transform:uppercase;
    margin-bottom:28px;
  }

  /* Main headline */
  .headline {
    font-family: 'Noto Sans KR', sans-serif;
    font-weight:900;
    font-size:84px;
    line-height:1.0;
    color:#ffffff;
    letter-spacing:-2px;
    margin-bottom:16px;
  }

  /* Accent number – the hero element */
  .accent-number {
    font-family: 'Noto Sans KR', sans-serif;
    font-weight:900;
    font-size:100px;
    line-height:1.0;
    color:#ffffff;
    letter-spacing:-3px;
    margin-bottom:20px;
    /* Slight stroke for depth */
    text-shadow: 0 0 60px rgba(255,255,255,0.15);
  }
  .accent-number .highlight {
    color:#ffffff;
    position:relative;
    display:inline-block;
  }
  /* Underline bar under number */
  .accent-bar {
    width:320px;
    height:6px;
    background:#fff;
    margin-bottom:28px;
  }

  /* Member count */
  .member-count {
    font-family: 'Noto Sans KR', sans-serif;
    font-weight:700;
    font-size:64px;
    line-height:1.0;
    color:#ffffffaa;
    letter-spacing:-1px;
    margin-bottom:36px;
  }

  /* Bottom bar */
  .bottom-bar {
    display:flex;
    align-items:center;
    gap:24px;
  }
  .brand {
    font-family: 'Noto Sans KR', sans-serif;
    font-weight:900;
    font-size:40px;
    color:#fff;
    letter-spacing:2px;
  }
  .divider {
    width:2px;
    height:40px;
    background:#ffffff44;
  }
  .cta {
    font-family: 'Noto Sans KR', sans-serif;
    font-weight:700;
    font-size:40px;
    color:#fff;
    letter-spacing:1px;
  }

  /* Right-side vertical text decoration */
  .right-deco {
    position:absolute;
    right:60px;
    top:50%;
    transform:translateY(-50%) rotate(90deg);
    font-family: 'Noto Sans KR', sans-serif;
    font-weight:900;
    font-size:18px;
    letter-spacing:12px;
    color:#ffffff18;
    white-space:nowrap;
    text-transform:uppercase;
  }
</style>
</head>
<body>
<div class="container">
  <div class="bg-line"></div>
  <div class="bg-line2"></div>
  <div class="right-deco">GROWTH DATA 2024</div>

  <div class="tag">GROWTH</div>
  <div class="headline">판을 바꾸는 전략</div>
  <div class="accent-number"><span class="highlight">매출 1,863% 성장</span></div>
  <div class="accent-bar"></div>
  <div class="member-count">482명 → 5,500명</div>
  <div class="bottom-bar">
    <span class="brand">T.O.P 사업단</span>
    <div class="divider"></div>
    <span class="cta">지금 지원하기 →</span>
  </div>
</div>
</body>
</html>un  <!DOCTYPE html>
<html><head>
<meta charset="UTF-8">
<link href="https://fonts.googleapis.com/css2?family=Noto Sans KR:wght@400;700;900&display=swap" rel="stylesheet">
<style>
  * { margin:0; padding:0; box-sizing:border-box; }
  body { width:1200px; height:1200px; overflow:hidden; background:#000; }
  .container {
    position:relative;
    width:1200px;
    height:1200px;
    background:#000;
    display:flex;
    flex-direction:column;
    align-items:center;
    justify-content:center;
    overflow:hidden;
  }

  /* Horizontal rule decorations */
  .h-line-top {
    position:absolute;
    top:120px; left:80px; right:80px;
    height:1px;
    background: linear-gradient(to right, transparent, #ffffff33, transparent);
  }
  .h-line-bot {
    position:absolute;
    bottom:120px; left:80px; right:80px;
    height:1px;
    background: linear-gradient(to right, transparent, #ffffff33, transparent);
  }

  /* Big corner text */
  .corner-tl {
    position:absolute;
    top:52px; left:80px;
    font-family: 'Noto Sans KR', sans-serif;
    font-weight:900;
    font-size:20px;
    letter-spacing:8px;
    color:#ffffff28;
    text-transform:uppercase;
  }
  .corner-br {
    position:absolute;
    bottom:52px; right:80px;
    font-family: 'Noto Sans KR', sans-serif;
    font-weight:900;
    font-size:20px;
    letter-spacing:8px;
    color:#ffffff28;
    text-transform:uppercase;
  }

  /* Content stack – centered */
  .content {
    display:flex;
    flex-direction:column;
    align-items:center;
    text-align:center;
    gap:0;
  }

  .tag {
    font-family: 'Noto Sans KR', sans-serif;
    font-weight:900;
    font-size:26px;
    letter-spacing:12px;
    color:#ffffff44;
    text-transform:uppercase;
    margin-bottom:48px;
  }

  .headline {
    font-family: 'Noto Sans KR', sans-serif;
    font-weight:900;
    font-size:84px;
    line-height:1.1;
    color:#fff;
    letter-spacing:-2px;
    margin-bottom:60px;
  }

  /* Hero number block */
  .hero-block {
    display:flex;
    flex-direction:column;
    align-items:center;
    margin-bottom:60px;
  }
  .hero-label {
    font-family: 'Noto Sans KR', sans-serif;
    font-weight:700;
    font-size:36px;
    color:#ffffff66;
    letter-spacing:4px;
    margin-bottom:10px;
  }
  .hero-number {
    font-family: 'Noto Sans KR', sans-serif;
    font-weight:900;
    font-size:140px;
    line-height:0.9;
    color:#ffffff;
    letter-spacing:-6px;
    text-shadow: 0 0 80px rgba(255,255,255,0.12);
  }
  .hero-unit {
    font-family: 'Noto Sans KR', sans-serif;
    font-weight:900;
    font-size:64px;
    color:#ffffff;
    letter-spacing:0;
    margin-top:8px;
  }

  /* Accent bar */
  .accent-bar {
    width:160px;
    height:6px;
    background:#fff;
    margin:0 auto 56px;
  }

  /* Members */
  .members {
    font-family: 'Noto Sans KR', sans-serif;
    font-weight:700;
    font-size:64px;
    color:#ffffffaa;
    letter-spacing:-1px;
    margin-bottom:72px;
  }

  /* CTA bar */
  .cta-bar {
    display:flex;
    align-items:center;
    gap:32px;
    padding:28px 60px;
    border:2px solid #ffffff44;
  }
  .brand {
    font-family: 'Noto Sans KR', sans-serif;
    font-weight:900;
    font-size:44px;
    color:#fff;
    letter-spacing:3px;
  }
  .divider {
    width:2px;
    height:44px;
    background:#ffffff44;
  }
  .cta {
    font-family: 'Noto Sans KR', sans-serif;
    font-weight:700;
    font-size:44px;
    color:#fff;
  }
</style>
</head>
<body>
<div class="container">
  <div class="h-line-top"></div>
  <div class="h-line-bot"></div>
  <div class="corner-tl">GROWTH</div>
  <div class="corner-br">2024 DATA</div>

  <div class="content">
    <div class="tag">GROWTH</div>
    <div class="headline">판을 바꾸는 전략</div>

    <div class="hero-block">
      <div class="hero-label">매출</div>
      <div class="hero-number">1,863</div>
      <div class="hero-unit">% 성장</div>
    </div>

    <div class="accent-bar"></div>
    <div class="members">482명 → 5,500명</div>

    <div class="cta-bar">
      <span class="brand">T.O.P 사업단</span>
      <div class="divider"></div>
      <span class="cta">지금 지원하기 →</span>
    </div>
  </div>
</div>
</body>
</html>u7
  <!DOCTYPE html>
<html><head>
<meta charset="UTF-8">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;700;900&display=swap" rel="stylesheet">
<style>
  * { margin:0; padding:0; box-sizing:border-box; }
  body { width:600px; height:500px; overflow:hidden; background:#000; }
  .container {
    position:relative;
    width:600px;
    height:500px;
    background:#000;
    display:flex;
    flex-direction:column;
    align-items:center;
    justify-content:center;
    overflow:hidden;
  }

  /* Top / bottom thin lines */
  .h-line-top {
    position:absolute;
    top:48px; left:36px; right:36px;
    height:1px;
    background: linear-gradient(to right, transparent, #ffffff44, transparent);
  }
  .h-line-bot {
    position:absolute;
    bottom:48px; left:36px; right:36px;
    height:1px;
    background: linear-gradient(to right, transparent, #ffffff44, transparent);
  }

  .tag {
    font-family: 'Noto Sans KR', sans-serif;
    font-weight:900;
    font-size:16px;
    letter-spacing:8px;
    color:#ffffff44;
    text-transform:uppercase;
    margin-bottom:24px;
  }

  /* Hero percent */
  .hero-pct {
    font-family: 'Noto Sans KR', sans-serif;
    font-weight:900;
    font-size:110px;
    line-height:0.9;
    color:#fff;
    letter-spacing:-4px;
    text-shadow: 0 0 60px rgba(255,255,255,0.12);
  }
  .hero-label {
    font-family: 'Noto Sans KR', sans-serif;
    font-weight:900;
    font-size:42px;
    color:#fff;
    letter-spacing:0px;
    margin-top:6px;
    margin-bottom:20px;
  }

  .accent-bar {
    width:80px;
    height:5px;
    background:#fff;
    margin-bottom:24px;
  }

  /* Brand */
  .brand {
    font-family: 'Noto Sans KR', sans-serif;
    font-weight:900;
    font-size:32px;
    color:#fff;
    letter-spacing:6px;
    margin-bottom:12px;
  }

  /* Members sub */
  .members {
    font-family: 'Noto Sans KR', sans-serif;
    font-weight:700;
    font-size:20px;
    color:#ffffff77;
    letter-spacing:1px;
    margin-bottom:20px;
  }

  .cta {
    font-family: 'Noto Sans KR', sans-serif;
    font-weight:700;
    font-size:20px;
    color:#fff;
    border:1.5px solid #ffffff66;
    padding:10px 28px;
    letter-spacing:1px;
  }
</style>
</head>
<body>
<div class="container">
  <div class="h-line-top"></div>
  <div class="h-line-bot"></div>

  <div class="tag">GROWTH</div>
  <div class="hero-pct">1,863%</div>
  <div class="hero-label">매출 성장</div>
  <div class="accent-bar"></div>
  <div class="brand">T.O.P</div>
  <div class="members">482명 → 5,500명</div>
  <div class="cta">지금 지원하기 →</div>
</div>
</body>
</html>html_contentwidthheightoutput_pathc           	      l   t        j                  dddd      5 }|j                  |        |j                  }ddd       	 t	               5 }|j
                  j                         }|j                  ||d      }|j                  d	        |j                  d
       |j                  t        |      dd||d       |j                          ddd       t        j                         t        d| d| d| d       y# 1 sw Y   xY w# 1 sw Y   @xY w# t        j                         w xY w)z+Render HTML string to PNG using Playwright.z.htmlwzutf-8F)suffixmodeencodingdeleteN)r	   r
   )viewportzfile://i	  r   )xyr	   r
   )pathclipz	  Saved:  (r   ))tempfileNamedTemporaryFilewritenamer   chromiumlaunchnew_pagegotowait_for_timeout
screenshotstrcloseosunlinkprint)	r   r	   r
   r   ftmp_pathpbrowserpages	            H/home/jay/workspace/output/google-ads/angle-B/production/generate_ads.pyrender_html_to_pngr.     s   		$	$G#X]	^ bc	66
 	!jj'')G##u-O#PDIIz*+!!$'OO[!1aaRWci8jOkMMO	 			(	Ik]"UG1VHA
67! 
	 	 			(s0   D
D BDD DDD D3srcdstc           	          t        j                  |       }|j                  ||ft         j                        }|j	                  |dd       t        d| d| d| d       y)	z/Resize PNG with PIL using high-quality Lanczos.PNGT)optimizeu     Resized → r   r   r   N)r   openresizeLANCZOSsaver'   )r/   r0   r	   r
   imgs        r-   resize_with_pilr9     sV    
**S/C
**eV_emm
4CHHS%$H'	N3%r%&
34    c                  ,   t        d       t        d       t        d       t        t        ddt        dz         t        d       t        t        ddt        d	z         t        d
       t        dz  } t        t
        dd|        t        | t        dz  dd       | j                          t        d       t        t        j                  d            D ];  }|j                         j                  dz  }t        d|j                   d| d       = y )Nu:   
=== Google Display Ads – Angle B (성장 데이터) ===u    Design: #23 나이키 스타일
z[1/3] Rendering 1200x628...i  it  zdisplay-1200x628.png)r	   r
   r   z[2/3] Rendering 1200x1200...zdisplay-1200x1200.pngz([3/3] Rendering 300x250 (via 600x500)...z_tmp_600x500.pngiX  i  zdisplay-300x250.pngi,     )r/   r0   r	   r
   z 
All ads generated successfully!zdisplay-*.pngi   z  z  (z KB))r'   r.   HTML_1200x628
OUTPUT_DIRHTML_1200x1200HTML_600x500r9   r&   sortedglobstatst_sizer   )tmp_600r(   sizes      r-   mainrG     s   	
GH	
-. 

'(!77	 

()!88	 

45--G	 ..	 NN	
-.JOOO45 *vvx4'166(#dV4()*r:   __main__)__doc__r%   r   pathlibr   playwright.sync_apir   PILr   r>   mkdirr=   r?   r@   r#   intr.   r9   rG   __name__ r:   r-   <module>rQ      s    
   / LM
 
    -YxFst8S 8 8c 8PT 8*5 5D 5 5c 5**Z zF r:   