Ë
    0ÛÀj5/  ã                   óì   — d Z ddlZddlmZmZmZ ej                  j                  d«      ZdZ	dZ
dZdZd	Zd
\  ZZdZdZdZdZdZdZdZdZdZd\  ZZi Zd„ Zd„ Z G d„ d«      Zdefd„Z de!de"fd„Z#d„ Z$y)uë  ss_carousel_lib.py â€” ENGINE STANDAR carousel StudioSoft (FIXED 16 Sep 2026).

Mengikuti standar kartu Threads SS yang sudah di-approve Bos (gen_uky_center.py):
  â€¢ RATA KIRI
  â€¢ SATU BLOK DI TENGAH VERTIKAL (jarak atas = jarak bawah) -> tidak ada void
    besar di bawah seperti versi lama
  â€¢ TANPA garis separator (tick "-----" dihapus)
  â€¢ Judul Poppins-Bold 85 / body Poppins-Regular 36 / sub 30 â€” konsisten semua slide
  â€¢ Line advance = standar Bos: judul size+8, body size+12 (JANGAN pakai metrics
    penuh 1.41Ã—size â€” bikin kendur & overflow ke footer)
  â€¢ Judul auto-fit: ukuran diturunkan otomatis supaya tidak melebihi lebar kanvas

WARNA (perintah Bos 16 Sep 2026): BIRU TUA #122B63 sebagai background (atau sebagai
teks kalau background putih â€” versi bergantian).

AUTO-FIT: kalau isi slide kepanjangan, engine mengecilkan jarak (air) lalu ukuran
huruf bertahap sampai pasti tidak menabrak footer.

Cara pakai:
    from ss_carousel_lib import Slide, SKY
    s = Slide(num=1, total=4, tag="", bg=(18, 43, 99))
    s.title(["CEPAT =", "RANKING"])
    s.para("Kecepatan website penentu halaman pertama.", size=30)
    s.bullets(["LCP: loading konten utama", "INP: respons terhadap klik"])
    s.render("01.png", out_dir="...")
é    N)ÚImageÚ	ImageDrawÚ	ImageFontz~/.fonts)é   éG   éa   )é   é+   éc   )é8   é½   éø   )éÿ   r   r   )é%   r   éë   )i8  iF  éF   éU   é$   é   é.   é(   é4   é   )é–   iÄ  c                 óª   — | |f}|t         vr?t        j                  t        j                  j                  t        | «      |«      t         |<   t         |   S ©N)Ú_cacher   ÚtruetypeÚosÚpathÚjoinÚFONT_DIR)ÚnameÚsizeÚkeys      úB/home/mantapman/.hermes/profiles/atun/workspace/ss_carousel_lib.pyÚFr'   7   sB   € Ø�ˆ,€CØ
”&ÑÜ×(Ñ(¬¯©¯©´hÀÓ)EÀtÓLŒˆs‰Ü�#‰;Ðó    c                 óà   — g d}}| j                  «       D ]C  }|›d|›�j                  «       }|j                  |«      |k  r|}Œ/|r|j                  |«       |}ŒE |r|j                  |«       |S )NÚ ú )ÚsplitÚstripÚ	getlengthÚappend)ÚtextÚfontÚmax_wÚlinesÚcurÚwordÚtests          r&   Úwrapr7   >   ss   € Ø�Rˆ3€EØ—
‘
“ò ˆÚ¡Ð%×,Ñ,Ó.ˆØ�>‰>˜$Ó 5Ò(Ø‰CáØ—‘˜SÔ!Ø‰Cðñ Ø�‰�SÔØ€Lr(   c                   óŒ   — e Zd ZdZddeddedfd„Zeddfd	„Ze	e
d
fd„Zedddfd„Zeddfd„Zddeefd„Zd„ Zdd„Zd„ Zdd„Zy)ÚSlidezISatu kartu. Semua blok dikumpulkan dulu, baru digambar terpusat vertikal.é   z#edukasikesehatanÚ
STUDIOSOFTzwww.studiosoft.idNc	                 ó²   — || _         || _        |xs || _        t        |«      t        |«      |c| _        | _        | _        ||c| _        | _        g | _	        y r   )
ÚbgÚfgÚ	dot_colorÚstrÚnumÚtotalÚtagÚbrandÚfooter_leftÚitems)	ÚselfrA   rB   rC   r=   rD   rE   r>   r?   s	            r&   Ú__init__zSlide.__init__P   sS   € ð ˆŒØˆŒØ"š bˆŒÜ),¨S«´3°u³:¸sÐ&ˆŒ�$”*˜dœhØ',¨kÐ$ˆŒ
�DÔ$Øˆ�
r(   é0   c                 óŠ   — t        |t        «      r|g}| j                  j                  d|||xs | j                  |dœ«       | S )zHparts: str atau list; tiap elemen jadi satu baris (boleh (teks, warna)).r3   ©ÚkindÚpartsr$   Údefault_colorÚafter)Ú
isinstancer@   rF   r/   r>   )rG   rM   r$   rO   Úcolors        r&   ÚtitlezSlide.title[   sE   € ä�eœSÔ!Ø�GˆEØ�
‰
×Ñ 7°UÀDØ,1Ò,<°T·W±WÀuñNô 	Oàˆr(   é   c                 ón   — t        |t        «      r|g}| j                  j                  d||||dœ«       | S )Nr3   rK   ©rP   r@   rF   r/   )rG   rM   r$   rQ   rO   s        r&   Úh2zSlide.h2c   s<   € Ü�eœSÔ!Ø�GˆEØ�
‰
×Ñ 7°UÀDØ,1¸EñCô 	Dàˆr(   r   Fc           	      óf   — | j                   j                  d|||xs | j                  ||dœ«       | S )NÚpara)rL   r0   r$   rQ   ÚboldrO   )rF   r/   r>   )rG   r0   r$   rQ   rO   rY   s         r&   rX   z
Slide.paraj   s6   € Ø�
‰
×Ñ 6°4ÀØ$)Ò$4¨T¯W©W¸dÈUñTô 	Uàˆr(   c                 ó.   — | j                  ||||d¬«      S )NT)r$   rQ   rO   rY   )rX   )rG   r0   r$   rQ   rO   s        r&   Úleadz
Slide.leado   s   € Ø�y‰y˜ D°¸UÈˆyÓNÐNr(   é   c           	      óª   — |D �cg c]   }t        |t        «      r|dfn	|d   |d   f‘Œ" }}| j                  j                  d|||||dœ«       | S c c}w )u@   pairs: [(nama, keterangan)] atau [nama] â€” keterangan boleh "".r*   r   é   Úbullets)rL   ÚpairsÚ	name_sizeÚ	desc_sizeÚgaprO   rU   )rG   r`   rO   rc   ra   rb   ÚpÚnorms           r&   r_   zSlide.bulletsr   sd   € àINÖOÀAœ: a¬Ô-��B‘°A°a±D¸!¸A¹$°<Ñ?ÐOˆÐOØ�
‰
×Ñ 9°tÈ)Ø(1¸#ÈñOô 	Pàˆùò Ps   …%Ac                 óB   — | j                   j                  d|dœ«       | S )Nrc   )rL   Úpx)rF   r/   )rG   rg   s     r&   rc   z	Slide.gapy   s   € Ø�
‰
×Ñ 5°Ñ3Ô4Øˆr(   c                 óÀ  ‡— g }| j                   D �]Å  }|d   }|dk(  r%|j                  dt        |d   |z  «      ddœ«       Œ3t        |j                  dd«      |z  «      }|dk(  r´|d   D �cg c]#  }t	        |t
        «      r
|d   |d	   fn||d
   f‘Œ% }}t        dt        |d   |z  «      «      }	|	dkD  r,t        d|	«      Št        ˆfd„|D «       «      rn|	dz  }	|	dkD  rŒ,t        d|	«      Š|	dz   }
|j                  d|‰|
||
t        |«      z  dœ«       �Œ
|dk(  r‡t        dt        |d   |z  «      «      }	t        |j                  d«      rdnd|	«      Št        |d   ‰t        dt        z  z
  «      }|	dz   }
|j                  d|‰|d   |
||
t        |«      z  dœ«       �Œ–|dk(  s�Œ�t        dt        |d   |z  «      «      }t        dt        |d   |z  «      «      }t        d|«      t        d|«      }}|dz   |dz   }}t        |d   |z  «      }t        t        z
  t        z
  t        z
  }g }|d   D ]R  \  }}t        |||«      }|rt        |||«      ng }|j                  |||t        |«      z  |t        |«      z  z   f«       ŒT t        d„ |D «       «      |t        dt        |«      d	z
  «      z  z   }|j                  d||||||||dœ	«       �ŒÈ |S c c}w ) NrL   rc   rg   r   )rL   ÚhrO   rO   r3   rM   r^   rN   é   r$   rS   úPoppins-Bold.ttfc              3   óh   •K  — | ])  \  }}‰j                  |«      t        d t        z  z
  k  –— Œ+ y­w©é   N)r.   ÚWÚM)Ú.0ÚtÚ_Úfs      €r&   ú	<genexpr>zSlide._build.<locals>.<genexpr>Œ   s*   øè ø€ ÒG¹4¸1¸a˜1Ÿ;™; q›>¬Q°´Q±©YÕ6ÑGùs   ƒ/2rn   r   )rL   r3   r1   ÚsteprO   ri   rX   rY   zPoppins-SemiBold.ttfúPoppins-Regular.ttfr0   rQ   )rL   r3   r1   rQ   rv   rO   ri   r_   ra   rb   r`   c              3   ó&   K  — | ]	  }|d    –— Œ y­wrm   © )rq   Úbs     r&   ru   zSlide._build.<locals>.<genexpr>¦   s   è ø€ Ò- ˜˜!�Ñ-ùó   ‚)	rL   ÚblocksÚfnÚfdÚnsÚdsrc   rO   ri   )rF   r/   ÚintÚgetrP   ÚtupleÚmaxr'   ÚallÚlenr7   ro   rp   ÚBULLET_INDENTÚsum)rG   ÚairÚshrinkÚoutÚitÚkrO   rd   Úrawr$   rv   r3   ÚnszÚdszr}   r~   r   r€   ÚgÚavailr|   r#   ÚdescÚnlÚdlri   rt   s                             @r&   Ú_buildzSlide._build~   s*  ø€ ØˆØ—*‘*ó (	SˆBØ�6‘
ˆAØ�EŠzØ—
‘
 E´°B°t±H¸s±NÓ0CÈaÑPÔQØÜ˜Ÿ™˜w¨Ó*¨SÑ0Ó1ˆEØ�GŠ|à " 7¡ö-Øô (2°!´UÔ';˜˜!™˜a ™d‘|À!ÀRÈÑEXÐAYÑYð -�ð -ä˜2œs 2 f¡:°Ñ#6Ó7Ó8�Ø˜R’iÜÐ,¨dÓ3�AÜÓGÀ3ÔGÔGØØ˜A‘I�Dð	 ˜R“iô
 Ð(¨$Ó/�Ø˜a‘x�Ø—
‘
 G°cÀ1Ø$(°5¸tÄcÈ#Ãh¹ñPö Qà�f’Ü˜2œs 2 f¡:°Ñ#6Ó7Ó8�Ü°·±°v´Ñ,ÐDYÐ[_Ó`�Ü˜R ™Z¨¬A°´A±©IÓ6�Ø˜b‘y�Ø—
‘
 F°UÀAÐPRÐSZÑP[Ø$(°5¸tÄcÈ%ÃjÑ?PñRö Sà�i”Ü˜"œc " [¡/°FÑ":Ó;Ó<�Ü˜"œc " [¡/°FÑ":Ó;Ó<�ÜÐ1°3Ó7¼Ð;PÐRUÓ9V�B�Ø˜q™ #¨¡(�B�Ü˜˜5™	 C™Ó(�ÜœA™¤Ñ-´Ñ1�Ø�Ø"$ W¡+ò I‘J�D˜$Ü˜d B¨Ó.�BÙ26œ˜d B¨Ô.¸B�BØ—M‘M 2 r¨2´°B³©<¸"¼sÀ2»w¹,Ñ+FÐ"GÕHðIô Ñ- fÔ-Ó-°´C¸¼3¸v»;È¹?Ó4KÑ0KÑK�Ø—
‘
 I¸ÀrÐQSØ"$¨B°qÀ5ÈqñRö SðO(	SðR ˆ
ùòE-s   Á-(Kc                 óR  — t         t        z
  }d }dD ]R  }dD ]G  }| j                  ||¬«      }t        d„ |D «       «      t        d„ |D «       «      z   }||k  sŒA||||f} n |sŒR n |€>| j                  dd¬«      }t        d„ |D «       «      t        d	„ |D «       «      z   }||ddf}|S )
N)ç      ð?g®Gázî?g)\�Âõ(ì?g=
×£p=ê?çR¸…ëQè?)r˜   g333333ë?g
×£p=
ç?g333333ã?ç      à?)r‰   rŠ   c              3   ó&   K  — | ]	  }|d    –— Œ y­w©ri   Nry   ©rq   rŒ   s     r&   ru   zSlide._fit.<locals>.<genexpr>±   s   è ø€ Ò4¨˜B˜s�GÑ4ùr{   c              3   ó&   K  — | ]	  }|d    –— Œ y­w©rO   Nry   r�   s     r&   ru   zSlide._fit.<locals>.<genexpr>±   s   è ø€ Ò:WÈ2¸2¸g½;Ñ:Wùr{   rš   r™   c              3   ó&   K  — | ]	  }|d    –— Œ y­wrœ   ry   r�   s     r&   ru   zSlide._fit.<locals>.<genexpr>¹   s   è ø€ Ò0 B˜˜3�Ñ0ùr{   c              3   ó&   K  — | ]	  }|d    –— Œ y­wrŸ   ry   r�   s     r&   ru   zSlide._fit.<locals>.<genexpr>¹   s   è ø€ Ò6SÀr°r¸'µ{Ñ6Sùr{   )ÚBOT_LIMÚTOP_LIMr–   rˆ   )rG   ÚareaÚbestrŠ   r‰   rF   rB   s          r&   Ú_fitz
Slide._fit«   sÎ   € ÜœÑ ˆØˆØ3ò 	ˆFØ4ò �ØŸ™¨°F˜Ó;�ÜÑ4¨eÔ4Ó4´sÑ:WÐQVÔ:WÓ7WÑW�Ø˜D“=Ø! 5¨#¨vÐ6�DÙðò Ùð	ð ˆ<Ø—K‘K C°�KÓ5ˆEÜÑ0¨%Ô0Ó0´3Ñ6SÈUÔ6SÓ3SÑSˆEØ˜5 # tÐ,ˆDØˆr(   c           	      ó´  — | j                  «       \  }}}}t        j                  dt        t        f| j
                  «      }t        j                  |«      }	t        t        t        z   |z
  dz  «      }
t        t        t        |
t        |z
  «      «      }
|D �]³  }|d   dk(  r	|
|d   z  }
Œ|d   dk(  r5|d   D ]+  \  }}|	j                  t        |
f||d   |¬«       |
|d	   z  }
Œ- �nZ|d   d
k(  r5|d   D ]+  }|	j                  t        |
f||d   |d   ¬«       |
|d	   z  }
Œ- �n|d   dk(  �rt        |d   «      D �]  \  }\  }}}|
|d   dz  z   dz
  }|	j!                  t        dz   t"        z
  |t"        z
  t        dz   t"        z   |t"        z   g| j$                  ¬«       |
}|D ]9  }|	j                  t        t&        z   |f||d   | j(                  ¬«       ||d   z  }Œ; |D ]9  }|	j                  t        t&        z   |f||d   | j(                  ¬«       ||d   z  }Œ; |
|z   |t+        |d   «      dz
  k  r|d   ndz   }
�Œ |
|d   z  }
�Œ¶ |	j                  t        df| j,                  t/        dd«      | j(                  ¬«       |	j                  t        t        z
  df| j0                  ›d| j2                  ›�t/        dd«      | j(                  d¬«       |	j                  t        t        d z
  f| j4                  t/        dd!«      | j(                  ¬«       | j6                  rH|	j                  t        t        z
  t        d z
  f| j6                  t/        dd!«      | j(                  d¬«       |rmt9        j:                  |d"¬#«       t8        j<                  j?                  ||«      }|jA                  |d$«       |s tC        d%|||t        t        z
  |z
  fz  «       |S |S )&NÚRGBrn   rL   rc   ri   r3   r1   )r1   Úfillrv   rX   rQ   r_   r|   r   r   )r©   r}   r~   r€   r^   r   rO   é"   rk   r   é&   ú/rw   rS   Úrt)r1   r©   Úanchoré:   é   T)Úexist_okÚPNGz-   air=%.2f shrink=%.2f tinggi=%dpx sisa=%dpx)"r¦   r   Únewro   ÚHr=   r   ÚDrawr�   r£   r¢   r„   Úminr0   rp   Ú	enumerateÚellipseÚDOT_Rr?   r‡   r>   r†   rD   r'   rA   rB   rE   rC   r   Úmakedirsr    r!   ÚsaveÚprint)rG   ÚfilenameÚout_dirÚquietrF   Úblock_hr‰   rŠ   ÚimgÚdÚyrŒ   ÚtxtÚcolÚlnÚir”   r•   ÚhhÚcyÚyyr    s                         r&   ÚrenderzSlide.render½   sÆ  € Ø&*§i¡i£kÑ#ˆˆw˜˜VÜ�i‰i˜¤¤1˜v t§w¡wÓ/ˆÜ�N‰N˜3Óˆä”œ7Ñ" WÑ,°Ñ1Ó2ˆÜ”œ˜Q¤¨'Ñ 1Ó2Ó3ˆàó 	ˆBØ�&‰z˜UÒ"Ø�R˜‘W‘�ØØ�&‰z˜WÒ$Ø " 7¡ò $‘H�C˜Ø—F‘FœA˜q˜6 3¨R°©Z¸c�FÔBØ˜˜F™‘O‘Aò$ð �F‘˜vÒ%Ø˜W™+ò $�BØ—F‘FœA˜q˜6 2¨B¨v©J¸RÀ¹[�FÔIØ˜˜F™‘O‘Aò$ð �F‘˜yÓ(Ü'0°°H±Ó'>ó Q‘O�A‘|˜˜B Ø˜R ™X¨™]Ñ*¨QÑ.�BØ—I‘Iœq 1™u¤u™}¨b´5©j¼!¸a¹%Ä%¹-ÈÌeÉÐTØ#'§>¡>ð ô 3à�BØ ò '˜ØŸ™¤¤MÑ 1°2Ð6¸ÀÀDÁÐPT×PWÑPW˜ÔXØ˜b ™h™™ð'ð !ò '˜ØŸ™¤¤MÑ 1°2Ð6¸ÀÀDÁÐPT×PWÑPW˜ÔXØ˜b ™h™™ð'ð ˜B™¨q´3°r¸(±|Ó3DÀqÑ3HÒ/H " U¢)ÈaÑP’AðQð ��G‘ÑŠAð3	ð6 	
�‰”�2ˆw˜Ÿ
™
¬Ð+=¸rÓ)BÈÏÉˆÔQØ	�‰””A‘�rˆ{ t§x£x°·²Ð<ÜÐ+¨RÓ0°t·w±wÀtð 	ô 	Mà	�‰””1�r‘6ˆ{˜D×,Ñ,´1Ð5JÈBÓ3OÐVZ×V]ÑV]ˆÔ^Ø�8Š8Ø�F‰F”Aœ‘Eœ1˜r™6�? D§H¡H´1Ð5JÈBÓ3OØŸ™¨ð ô .ñ Ü�K‰K˜¨$Õ/Ü—7‘7—<‘< ¨Ó2ˆDØ�H‰H�T˜5Ô!ÙÜÐEØ˜f g¬w¼Ñ/@À7Ñ/JÐKñLô MàˆKØˆ
r(   )r˜   r˜   )Nú.T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚBIRU_TUAÚWHITErH   ÚTITLErR   ÚH2ÚSKYrV   ÚSUBrX   ÚLEADr[   ÚNAMEÚDESCr_   rc   r–   r¦   rË   ry   r(   r&   r9   r9   M   s}   „ ÙSà"#Ð)<ÀØ#Ð1DØ Tóð !&¨R°tó ð   s°"ó ð "¨°Q¸Uó ð
 #¨$°aó Oð $%¨"¸Èó òó
+òZô$3r(   r9   Úreturnc                 ó&   — | j                   dz  dk(  S )z:True kalau tanggal genap (warna pertama hari itu = putih).rn   r   )Úday)Útgls    r&   Úmulai_putihrÞ   ý   s   € à�7‰7�Q‰;˜!ÑÐr(   Úurutanc                 óJ   — t        | «      rdnd}|dk(  rdnd}|dz  dk(  r|S |S )z=Warna untuk posisi `urutan` (1 = pertama) pada tanggal `tgl`.ÚputihÚbirurn   r^   )rÞ   )rÝ   rß   Úarz   s       r&   Úwarna_kerä     s2   € ä˜sÔ#‰¨€AØ�w’,‰ G€AØ˜‘
˜a’ˆ1Ð& QÐ&r(   c                 ó¦   — t        || «      dk(  r$t        | ||ft        t        t        dœ|¤Žt        fS t        | ||ft        t        dœ|¤Žt
        fS )z�Slide ke-`num` (1-based) dengan BG ikut pola harian + warna aksen yang cocok.

    Contoh: for i in 1..10: s, aksen = slide_pola(i, 10, "#seo", tanggal)
    rá   )r=   r>   r?   )r=   r>   )rä   r9   rÒ   rÑ   ÚAKSEN_PUTIHrÕ   )rA   rB   rC   rÝ   Úkws        r&   Ú
slide_polarè   	  sW   € ô
 ��SÓ˜WÒ$Ü�S˜% ÐV¬´8ÄxÑVÐSUÑVÔXcÐcÐcÜ��e˜SÐ>¤X´%Ñ>¸2Ñ>ÄÐCÐCr(   )%rÐ   r   ÚPILr   r   r   r    Ú
expanduserr"   ÚNAVYrÑ   rÕ   rÒ   ræ   ro   r´   rp   rÓ   r×   rÖ   rÔ   rØ   rÙ   r‡   r¹   r£   r¢   r   r'   r7   r9   ÚboolrÞ   r�   r@   rä   rè   ry   r(   r&   ú<module>rí      sÃ   ðñó4 
ç +Ñ +à�7‰7×Ñ˜jÓ)€à€Ø€Ø€Ø€Ø€à�€€1Ø€Ø
€Ø	€Ø€Ø€Ø	€Ø	€Ø€Ø	€ØÑ €ˆà	€òò÷cñ cð`˜ó ð
'˜#ð ' #ó 'óDr(   