From 1ca71a2356e6e0efd4e952ac51ad742b24a9d8f1 Mon Sep 17 00:00:00 2001 From: Aaron Cupp Date: Mon, 1 Jun 2026 20:14:43 -0700 Subject: [PATCH] feat(og): generate social-share image from brand.toml Signed-off-by: Aaron Cupp --- Makefile | 7 +++- brand.toml | 18 +++++++++ logos/og/audiophore-og-1200x630.png | Bin 0 -> 25033 bytes logos/og/audiophore-og-1280x640.png | Bin 0 -> 26688 bytes scripts/build.py | 57 +++++++++++++++++++++++++--- 5 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 logos/og/audiophore-og-1200x630.png create mode 100644 logos/og/audiophore-og-1280x640.png diff --git a/Makefile b/Makefile index 8090b6e..8bd97d2 100644 --- a/Makefile +++ b/Makefile @@ -5,6 +5,7 @@ # make svgs # only SVGs # make pngs # only PNGs (requires SVGs to exist) # make favicons # only favicons +# make og # only Open Graph / social-share cards # make tokens # only color tokens (brand.css + brand.json) # make docs # only BRANDING.md # make clean # remove all generated assets @@ -17,7 +18,7 @@ PYTHON := python3 SCRIPTS := scripts ASSETS := logos -.PHONY: all build svgs pngs favicons tokens docs clean check install help +.PHONY: all build svgs pngs favicons og tokens docs clean check install help all: build docs @@ -28,6 +29,7 @@ help: @echo " svgs - generate only SVGs" @echo " pngs - generate only PNGs (requires SVGs)" @echo " favicons - generate only favicons" + @echo " og - generate Open Graph / social-share cards" @echo " tokens - generate color tokens (brand.css + brand.json)" @echo " docs - regenerate BRANDING.md from brand.toml" @echo " clean - remove all generated assets" @@ -46,6 +48,9 @@ pngs: favicons: $(PYTHON) $(SCRIPTS)/build.py favicon +og: + $(PYTHON) $(SCRIPTS)/build.py og + tokens: $(PYTHON) $(SCRIPTS)/build.py tokens diff --git a/brand.toml b/brand.toml index 04e1acc..7767fe6 100644 --- a/brand.toml +++ b/brand.toml @@ -148,6 +148,24 @@ px = [200, 400, 800] px = [16, 32, 48, 64, 180, 192, 512] ico_sizes = [16, 32, 48, 64] # multi-resolution .ico bundle +# ────────────────────────────────────────────────────────────────────── +# Open Graph / social-share cards +# +# The image link-unfurlers (Slack, Discord, iMessage, Twitter) and +# GitHub's repo/org social-preview pull. The dark-bg lockup centered on +# the dark wash, with safe margins. `make og` renders one PNG per size. +# ────────────────────────────────────────────────────────────────────── + +[og] +background = "wash_dark" # full-bleed background color (palette key) +lockup_variant = "dark_bg" # which lockup treatment to center +margin_ratio = 0.14 # safe padding as a fraction of the shorter axis + +[og.sizes] +# name = [width, height] +web = [1200, 630] # og:image / Twitter summary_large_image +github = [1280, 640] # GitHub repo + org social preview (2:1) + # ────────────────────────────────────────────────────────────────────── # Variants (which color treatments to generate for which assets) # ────────────────────────────────────────────────────────────────────── diff --git a/logos/og/audiophore-og-1200x630.png b/logos/og/audiophore-og-1200x630.png new file mode 100644 index 0000000000000000000000000000000000000000..661d597ff63dcb8aa91f8dbe0e6a359066d86f40 GIT binary patch literal 25033 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 okAQ#gRQ}tv`;Tixkt<$-p7%FJ{3(y<1Bme*a literal 0 HcmV?d00001 diff --git a/logos/og/audiophore-og-1280x640.png b/logos/og/audiophore-og-1280x640.png new file mode 100644 index 0000000000000000000000000000000000000000..f75f2ae64df70b89ef6c399d4be625d7d709eb2a GIT binary patch literal 26688 zcmeEt^y!U?p zf_v|8?=YXwIXdU;bN1eAul20;JUi^0f+RKuDFzY}61KF|S7jum7r-g<_m{}PK`vJG z8aSXD%SwJlLOlKbZZC>QLVAlN{q>6~DC2m=!-r7q5pj{)%tC=I{ZdUE>DlXiX$R!V z2!g-igiIeW+==gv*~)!R%5sap7r&*J4`)!$mpRM)hCgYadJF&i`0=gi?y}WjTUHEQ ztcGvT=Pl2m@0gXduJQ|X;K4}W;}oh}pH7gF%0DBaJ{_BopS^iHu46nmd^&z-diDL; z(@EujFZk~`{MR1-yDt9gAD-OdfBoctd0)qf)SY}{7dhj~4ee|Rm>({YrT zH%mn|zBY0QR%O4A>Xj$_@qJ+)MK>-O4U4@^v0gh$>V7oD1M{hUa~h;%Q|;SubJsHU z5^IUZr~fnjfc)_)-mI1B=^scdFFXHp)Od@8@^qpbfQ0pQbbNvQ@#)w}`2X&L^F=+N z#on;Bv)1y7f}N>hI(quO?OjU#gl3=Kq4ILu)+3-d#1eo({+1%uRX+P03v)eLe)sNO z&UwFB&iST6a@)o1O{&O9eHk|r(l-L;092%PWMdPPz8G(}i>_1+=#iWHT_Ww^9;Cr$ z$$DrmTLE!8Tvw;6^WixXlK2;(;dP(MNo9-2kGCy0Xu~x=k7KrLmC!)XsiWBn6L}*f zq|a|7AOCV$%|8tkf42E3v1JPH;P1L{x`ORZNgb$dmK zuJ>?Ya6}%7$8m&78dtlVM*QW@u86dAcgWZ}jV)~&V@%+CKMBq}6x4{Q3A`=0 z`f+5xcBJ@|wQHVGOeVTpc<{jwz9mq!Y_lw8PHB!|5cN zfN}n$eAYw@X}@f%x#FSm#tMbA3FXs!A_A>GXJywLZ?BQX~Do z85|NOvBTBMNCAGT{omccS^gF+F`hPTOWXub8Ccv>An5@9RQ%B|HvDgjO?pL#E3v* z3QeV07%!?2+y`vb!*P7QDBoEnV<^c4uL|M!xI`Ba7iX6$u+vS88<|`MkR$zk2Y3@l zVgJYG9QjatFkAb1?5KeIX-lr`TB?ZCJwFl>j`-7JM7}-~nJ5CN6L1TKrH2{@{*aluwdrF0db@OW!VmdH`3WOKL;SA$ z=MJ(-@M`CJ?fqANK+YrgWHYYwEp}+c56DR0S?QeF0TUEtpExjm-D1P1BJuyWw8!Ir9^2&(UkhIHhE~%? zCYATi=26yM)~Z$CgoU`c=(q|ZMPB`kiGbYu#!AsL-J9}~3;Wy*Y;;RrpNRZ1>8~8o zX`tkF95^kd5L2qdu(FOSJrpM__`%Dpe?9rY zoOKKQ4m?VBnVsR}quKh}%J(^r`%_~boF!SgvQkn_xhAdLcG`8e6Xp6V{FE_8Ke2=U zj<<-+jb%0(UT55bS+q#8LgXr@7^jdZe^5Lf2q+IZFN+Zl7Ii2=s>|HlM^K+r zIEaSBc+}|Sr?soqrYjt4XP!7aAwyRxPx_Tqw|sWw8%L?MU#3H|n%Y9Mh89>{t91f$ zZ|%AE%w=d=zCvBg&at}k{pAJo*uz@*qW?%~EVn#OMS3w;nREvjp2wnFYGWz(fM7GD zfNo-O<)u|pAr}qY<1qN!UzD%pKXfQBRQE?x=R}Yv=Wp4uN8+_W?i`oQLp;ikm&xA1 zyADKlM-hkQA_BR)WQgXoceYQ?6gNyuInq`18a0ht=LRih?szkY^qfQ_AcnY(QfL)t8>W(9R>T- z;{_4_%Y`1TTL0*;)Z$igamwy{vol_3hbs>I8O;!&`Q*B~>63JgLp!x1{n{1pYY7hf zgaxhq##^AY+^jGOqK zs#bKJCBf;clHKaJh#35mGr6H8imZi*c8=YlRLQ(EdAakF*Bg~5u3Q&>x9y0im{A0u zb<~Ggdy1~iCF_zwB~_17wwYS%c8k@j)dQD;wg*e^+8}jSuH|O8d|%9Z1vhDS+oGJd zz3&zq%4dq02~j#xhbnSS26O9TjYrnGz) z!BxJXpx{Sq9s8rK=l&myN4%#7+|r{C@x9nluoB2e()8We+C8rJS9_1Rj&+ufpbhqJ zo=57*BG8_FT#-lHhgPZ+mwzsnnt95-7#?eGOVBwSR<#d<#ll-#n|D{It3@8L_WNu9 zyM<&bUqPd>RbL6WQ)d#cvNiXkC^1w6Gs9CM7Gc&(@5a%UR=3fS;rrcmtF1M-WiM43 z7FDnLGyf)?`}1{uz{O!7t5s+LUoO|B8DQbu3ul*>YdaY3UH{sV8t%&>Lo0=T!a7n> z0+xt4=?vzIbG^q<%xYE9aQ_v{mzt=4e5*M@S2dn`BR%OP>@)qc1WL+DCc*sV8kZ`M zL&YpB7ny&h+AQqCK5l2{-%quT+g9qO;%KGA@vNqp1%K=0D+!^voLOmW%YY1H&O0eD zD}6f#IRr)iF|ivA8UH}SN_ak!&P55Crm@p*{OIs=dwY`R41B-Z8VZK}_0RTw+`*?` zZfP8m|Deu*xXHuCY4-X)_M@J*C=>*m_QhTHnCs8>d7NZ&xCGIW%BORBnO>pj@q7G| z2O)fun&#(iLU7v5_dDspYzUZa)!2ho-dF&*&%RT3-So@_IdyB~Hyup)a$@qV&J`aEZ2_F+mdWsK}}fzegZpG9aUaH8%5 zVIXXcc};j)z^VlXIomFeC&CI>;eA2Muv)5Gd3E5Aa2QowOH1=pgxt1y;D9}$;o{x) zO%m)IgAC-ed|sLmp?P*{bovyS>}a8v1W-z)#!GW z@U7=)U8Nqs_Aft7o7M7*genoZ=P0L*-}6*@z^6PY>SM3^M}!?TzN-I{`QS80(021j z{lW)Rm_kZcniXWE`gdM(L>BCie$yS~z2krDo?mm8~^v0-e| zh2p*K3s*SLGEzw8osnkBR6So7dtpN5_Vq4t$8oN~6Mqdu*tM1G0LIC}%IymO{xG;D zHV5S~S)(2egH?TY+PMIowrnL8$nIXBElq7UwlOlAt@*heAE&CYl`1a`IT=OGRWqcq8~ge;NA zTPZY2K`s>=-2}w-)Ze000mQY5iq(ZvjzHxI;;LRM9@Twj{X_3T>x)jSk`hK0dVlWg zUUu}02BAAUU~b}iYf-WHZ8V;J%vd`k17;FEJz_ zu3nim*uw$ar35TJ<~gZ>^@shlJ*J}O7WIDOSi`k%soG8V$Syv=b%kNyo(Vf_rJqqN zC9Df|2P&?X(al3-=_i}z|F*L68g~h<qC9z)qmq7E1I!f65AU10o|O!0*zZnAN>&rkjz0PNT- z(pyrO_0OED7Sn0PjK#yp7r8TBE@KnXxN3D=*G&ANo+9LO2+W=FMPQ)I;Zkcq8^oV; zn-+q{`05;dJp@@(Nd1-*Si5@po|d)^+6SgrxasVqnfgaPoMVIn=@+2(EG4$s_UGkx z_M~aW|2X>ouL zW*{=Hm`)i$);p5IebAs|@7R?W?s7N-844B|E7qB7u<2u!Qwq$p$6ev?;lq@yR}Oo@ zCPLIvnhrD~-$_h&UT{qrek;~+3j8W>*`$MHgMFUrYKYtCqw%h%8 z*I*oc=}zq2aMRQ@CgOXRlwMie`UGqi5#||W;p%$yg z3qQzKg&@g5&tMT}SX83I&i^1w;Zy#q?kAA)1m1G~fuVRGQ?wpD0U*GW$}Otk5Ns@LDr*ly1pev5U;sj0Tc)Ofwlr0?}l$7{FWE3ivDK1ePcEAq%!Y0HPVupu=6tF zSZ62;9^wYNYC^QL3Cd~^KK_Q?FFei(e?0cHQ&XF@$5=-EBjHK3N;|8^6$G;;V{2ow z5EFp*Sg(C=65q8a($bt#Jnnbn&g=EQsIywx9GQEx^B^4GxZIWRcz6&CWiv=N^IT46 z^RPV|@cza;o$u6r)^RJy*Ic&}y#MOujmYgy=A*CoqTYZ(AdQ35vHH@K=p61#y}7m1 z55Vfr|GsvLF)Cl7M8|vQ&Lk1H1E8nid-r-{=B;9=4RIU1PLDnbuGgeUOkbWGqpJ>H zUrCLKh~XMQbV#erq>~HggX`_fo)Grw8%Fw^&hP`XP_44iqA>Tpp{)tv0cu zLEhqv+_kOY)ack?31QIueLNgt8BKV)ILhHs4Io7oN%U3UJbaB|;sEVh>%U;CXwP+$ zlDC!)blMBs<3c?1IzhD3)+eNYt7D`dHzI7 z$f>H0jhq9{FU+9Q*FnbYhQaIh zehAshs$@;>t`0N;Cn9=z1HL(K$H}~ZxZOkbW@2PL&;WdQQc%ol#qn~P?XtB8<0zre zdeXd^&8QHX;ST_vHDvozVAm_P2Np>@r}SP}EqOs-?lT)FOBm@pe_ocqlc9V2xsU*7 znBJxS2d}hx-KT>3ngVQL+T|m3VWCgEg-VxxDmXBwcgP>tEemAmeAzdAyZ82^f&APW zx|motYr9&*a`g530-wI7rbaeVMut`I17EZ2$s!3hTl@B;?9mcv@Z-PhY^SQ}%1k5M z>}F3-o4HDZX6um<>~tI|Vdsah>cGd=*0w}h8hC(OnU_*t2sWv{HdvRhOtFe_7MR5! zimMf>69WPq9>>e|UeFe`vbodcdU^qY`<}4!hlhuro}S5qIG_xvQlwBJOEwM8f9yq7 z;H9UfmCHE)(i$xkO(9^fnynt^0@;pQO2A%9$n@Smj#qY%_W7hC8ySzcS)c#4UPipa zovU7*D@Y^buKmSWR3ypuFG9uYsJ9lBYO{8#4X1H1syJM#c(HekJO<$r6K#|%1(E8) z@)g?B?fDG>p}1B%%0Z1-7hq_t5(N=abGhI7s*%LC<}2VMZF7Ghh#}u#mEHa8_j5tE^5D+n<&2B8t16fm7Acd(991Ga8_P#EWKiKI@$NAp$Z?htvELWT63oo(O= zy65qP;>~TI@qWJE*C#98zm`I5RIBbbyd9uapmueiYf2KO`~T4bG!OJEfOg@BnUIJY z>-PLo;yYWdisaX);~yqBoLN>x`0Bh-8m5*l5aL>U~*_jf0Y~LD?_L z(|PL2igq9fUgd?Nxxo~&^K6$0eKmru3gQDzPIdmV2|-G>GWhEer5y zSjZzMPvEC&edb96!(Y~i zEpNii9vIQ8tuh>2NWNomdQ6~%8r$R#tXgJ6tV+|sTl*VUN7PytRmkCGnMsq4Uw#{x z>=TcNC=!{%8@A3pY{vAZXk-hPX5}nZC(;c&naw^zwl6%>U3e(?kG5nY*{ZDw{hPn? z-K|NKk_!GxYx8D_WM--fY&Wh0_O{dH4 zrP%ipQgpT2*YAh@)vHBs<&TmNtm85>GxY}>yk(XetoTe8=UUP-{tYr}WJ5WKZc z$jtbXgxM#IXEj5+Xpdul*KxCYf1+sI>RA7&pj!imfxS-zkL`8dok%%46@a-GC~WxY z1>tHrKg>6Sh*+^B{k~}6*Y}CvQgslFwAwa158-r8-u9ocKCrbYBU~yTUf)nd_IRSa=Oa0XhR5i<;xqDF<*8kXI}CX=W?QC9^Z>we=aNAq1g*#itqS% zczM=cnBKhpw0TYu3yEPIs_8Ml`@q`;d`~dkZfxHM`bF+N9$8xicM*>u;@P#2C zq!@96@Y;Q##ycD(0H^`Z&G+>Zb!QCQ|4i7$PLo_9tPdr7W~NB2FK_$(cQdbo22cXK z2blfdprW@>r?*feChYoEIE8WVMZtp)|jy-5eSi_63)MG8l&jTlw()uDNSrch3`cf%)B7lcdtYl|+h zN=UwpQQp`kQqCbc`Vo>CDG!dL^_1zQtuME>&F=FuorWt(jC^BwI6T@~^f)B(1z0>r zyf7bjC*{1tlgPC802cl_2YlbV%ujCGTe}p(@Z;hAsVZ7&@MA-rO0uw`Ak-&dMKY0p z#3Uv%@;#hV#BVd}bsidSJLBCGXHsajrg&fNG<99oA1&5k)H zu3lk<*f;z3xbZCe-JHM9D~+RNB*y{Y-8H#Wc)zK!Z89weaA;A)%tx_!K0!P}4mw?9sP;ky4}fAT8hIjV9JG43K6m5U+~5eS+Y^TOdq< z)=6&1jl{zF@9`5A7z0M$VGoel6TxxGT3I$7KbkXi*rv=AZ4T)APCcKdmacSXJ z29mpF*8mY$8ZRm;H;+RHf)NLDq+M2&zBkXn1`oN{*ks&phszctiz3*}C4a&U6i%o7 zE!EW& zV3m0t*N?jiA}^=Pn<)fftBq&h9dXB^J>_m3EKqO1y8rvhzPrLuX1hq~GR$BGalc?i z?)ZiBK43=(4H+hAwfhScvwg>X)G!7%L&wPW^t8PrxiYk3avZMu| zIQRQXTWhF)Y4xi-uEb#IJR(liWiE4mwR;b?y5f6|>zz43r!`xSaaAOpIsnhyUQ@Py zKiv!=(meOEUTMMBYk`V@zI`;YFr9uQSe#u=haQhh5#8)oSL2@7oM%djxqSPh#=h1O zcjGiOvbkS8AtRm)bk27RO45Q;jbR90Wt^+;N!<_URlVbUAeFYg{H%r&1Kx!DxnFT* z#1!5N-%J95wTt41Jt@PB9;zy`-dZ2|f7moa{<=4!7)}A7LB-=bjA~Gk+tQlJE6Hl- z-RjPt{)4HKFBU_pPFY@H@s`ZhzwG?J71`v`B6P9XoJsxhtzKDgKEKpP?C3d9Om-R@b3RPpEc*7y%jE?qj z`s|w&5RZQc1me@sD`t^@+((7X3O%lLiGx>N))Z`(6a9?wl@5C)MsxY zByzid(K%odymlAr?OtPZH(G03@6lqoKiLZa9H8Qjj9ou%S})U!>Axz1iF?S1ei8(E ztm}j=@JwJ;BqP?&UMebupg~{V+mMPbvqP43K1|oPKvo?iW9AMF51ZQQ*f@YG=s= zpPQ7k0uQ>J{?D7D8=WaUJxLK|Y9A!DIX|`K=0;WAWqS+UVYaghDzrawcBke!j_bir zAsI+j5e{9d0r>0F+B4IK68ejWAD$a_YN6ud3GSLc1{(ZW3z4vzrcpduV*@#(mpj$( z9~}pNlgqpyt+$Up7^Qiw zJO~MkSL#fEr6)=FajligZtb04knvTaTxNsgL=`vDcL)$@6(mLuk+Bh)&39#0cHUxd zr6*5?ybV0lscHCAyK z6)F7yqIT^hwp#kPZ_V0S>sWHmrO{ICW&`B%R}Gh=+6+`e_7XzkxmJ{L@8cQk#QHh{ zjv>Yiz$*s*%=C%RHu!j&3BzWSs7f~QT{^{cwAXMY5M;V6NM8HYfcFgG{04-IjBb5a zaZbdO>e{&!92HBHIOV-hMm(OA&Q^Ii?Z_xm=+cT#warp$xhkwmi~O_;iR9#3?^?=L z@iQ>{8!K)R>jDuhbEC4#DJYT-_}=Llo0N=Rr_60%zh098fjsfmw9a7Hp2dC!0G(QB zxyI$rM~$yqsk6E8wtjC0zpM-AB-Y}73D^>WAGk`5DRzb#0l&gzQuKSIe~MLS z_wLl`s62Lym+&j9r|y)OAII1(E?Tz(aZ6TCZhFajr<5zguX_J65t72`Svn8h%H$7Y z7K#e7nD`VxV}V6)u?H#&KXz{9Me+t-e8;hfQC8!~A+LBxbzAXNTN2`c+?4dIk7qJ6jH6Wd6}|Dd!V!Q5shnCV6ST)neTN$4Iec zXNNDEpMmwnbU=F=7ok=tpG^Z{V=YlHAdW(>vtI0(B-7e9p+8=M>!kR+Rk4MaYD=1G zfPYGTU1(m)tsc#{U41t$6A?AD^tD1=I$~-?MysLkE^%XzD4GFWL10PWaH17yktlA{ zJ5!pN|J}fWX$Lnwxh9+XY`XoYM8*3{7@*~I3=c`xryjSy!$MoZk55c&cbqV8E$bv9 zNRm5HlFuhek6IA?S(84?N}g2Q zUZco!?bM!HQ0iwUHH2KrN6%LA7^Ue5@eZ!%h593JouyK8ixY>^zsaIYBB5sFy4%GX zh>xZg3iJjOH}dOJY8rrJoLsWL&d8Q87XMXRT5FDA9{&TVUL@u& zV+140g~x9m1Tn=AmDp0%du+(ZO+)W)z)pTe!Q~684YHb9I_b?NckkQCz#K$|Ql9o|H{4#Ic zKkDMJ=V`!rt~&Ha35(NGjRDG&*`cF*^b&QMWK%6e;ua*&Y;j4qQbIRG+OL?*pPa9? z0xfteoL|JM^Mg-+0mdpu`~H1le!|R>_0g=|ix*!w4qrEz4bK{W+=ksBvpz?tv}>yc zsQXuX^mzU0dejByn4+zxaec+fUug3z+erLs0uPZ#uIT9kBLNvpz*gYDg3_Vu73<8j z7E&w1p;XmTt!=^Bh%~Htjo+*(eW{A$Y{&HtHqAgwPzGzEXhJnC+QNTI5?3+GJ zZUP8tFaay)tpqp!MIXuFg`UdpmHiZsbA^Q_tJ=?HGKAv0LeCj=JhV7|u@0%Pl!?{f z@G?puocfWEh2}n5KH}?Z&0aZt(YT^gH{~|#rwmZnZXsMc+u71evTK`Db{nH3@OWjF0e5*BLPy)XUF16MZ{bbXj|q=3vURY{I>J5%%- zZ*$#7Vuo0>+R;k_aoL}>mdyR*cwg;9U5|H?2KPTa^uQPUY^J|utIXcA~ z%ZB54h4P`y%_{?YM(IiEfHKK{9yR&kN`OSZ;^s?L5$#Yeh+|Iumq5!nXGHcLNcm~` z=ne9~nBhZ&nO`rYj8+O7vTI>jVy( z0FJGAfm>hds?8sAQ?~0mMt827ny(TGtv7uTqEzV+@?Wu zHZOCi;^NvZf-)mAn64HZcGdE=3BGexF@YHg7EUq3sh$QyL^o zw>_TVZhI6)A|RihQmu8*AUM^ENV)tdCjj{+G?TA{;Z~N`P%a)(y!YS`AMz)&G>l-& zWqa)ICm);O%WuJczdeN%e11|^TjTs?t;xS;Jug*eUTUzIQL4KGxl(n}O1qzp zvhaO1A2Z!+|7BX8{Y#EA35ke2Nq_Uz_c0>DlnU`kL_sdmk8b)$FW%(Fg#?{B4EHRj zHp$Z#6!XZq#+|B7NF!BZS094(n+t}h`7CJ668uU-~2sQBpqQY#)uK~w+cxIaVfKJXrE zHKBMnxW<18V525pV!$6{>W;VH2;t$mg5kl^7(MzL(UEEY=XJxYci(GfK1X)+>k!A3 z;mX-Ul_zF$#fev=KT2{mMnpdAe_<%SKhTXw^nK?y8OomohZ&R}yq>V5W!vO>Q^|cP zg$KGFLK?r$;97|D9M#a8dtX8ok-CR4++;x?x@BE3_{4l#mTLdm>xreB4aUi?hJ0{v z*}Ws9PiSqh`W^TzneMA|Aic&ZAE#A;>u&DQzY-gaYqLaaoo;-SP7#fL%h53LC51}i ztq>uWT*?PyD`iM&z-2*xF`}7P4cjd1pLPRN+{te$68fvP3`RaKJX$)w>JJ`6qocE& z@<~t@XW5?~n^=xt`Mz39x>U6~5ODWw1-4qPvYm+MK{MReUvE1Ei#R1ZK$LG~Zx{daBfRkG7 zB^IbI1w-b&3#9^!KMk4z$e!1AV3~fj z2+-^50G{944X$RDrs>=bU@9%-{;(28Msosu>=Wu(wB*Z)tq=|4BB`(LYeO%Q{~%ew zH=pa;AOcWgrF!xp%-_%?khPN7D&vhj2*vSCW@hsC2*_+El>fDR!)A*0)imNicN$bI zil_6C`ICxr9`c{f*p~;PxrKg?=~oeMUj}j+0PRK2CtD!`fT`uM#S=(ok6cE-2w7!lbqmKUA{Z?d1+C^%n^wEi5L5Y0IU z-l0rC|BP6(7h?yYe)%`@J--hnepqz=5!WfC9G?3e*{|9pH<#FE=0aSj(avG1uwYdk zdNk{#jpV+*MQLKU)*<#=4Sq+Q{2j@5Aws@F`OBp@on&SL{<#gI8=F}&?35>u$RiF$ zK2Gu7=4ZaVN(tAM$TE8H4xEUk<4pT+ZPpjFhPda@ggRixq32AXP z7H1up{#ocliL$lkzX2BXWgSq4>*ZNf;AtUp0u*g!8dE~D>TR|QEqcFa=%7cVH%<*3 zy)Rq0<64j_xE-nwf1<@mR_KXo)lTGYguivR(vwDT4Gif=?EYK%ywGY;VIT|eOv;{& z?EBEAH9PR|$LM_?YVRl`T)qRwP-qXzVV80+EKo^i7Znmva z3E`}C?<00KRU9i`?aMcij%%ZA78BZORa$KlC06tzIH*5ruQ*}|dHM;@WSea91I*21 zi^=6=5sF;VVz97qE|WWv=S{5BM~K}a{?1Kv!c_gLhX{ad>0hb@K(G>zpm;Qt~g&*y1pq> zt(L+O5?}qLzMHeXv;$|DgnzrOwc4*ERnAAf%XOj}l(Tt`B`PKjgPZur!lguw{S`i2 z%IquVk_V4nbwBFqg3S>;rsxwuqZjLo20`M27R3?W+y+owc}ILeh{&p*ZmKv^V; zjOWO1rbCY@dyFxnnUu@+ts^Hq3sC5u*4lrm+Cp|5?nACfz^1#^ejdR{*6@@OyNuTs zIkxU1R|wkhkm!ei+ru@m64aXa%xst9jmwY^gNhsSosv^@@cOt+qLix%Ep}+m-~lVpOVkn zbTozH;qjMTrEvJ2-P(kbYWBBKYsk!9Z5@3ibSe@@fOUcX9S|#%TX^Y zS7UY9`MH;)pOKR|2PP9$+mWZn+;vhI3SmJ;`y!cUU@gH;-9`z$lt4a7aKl-|G$b%v zQV5WLw1(sP^*tXIMGCPG4l2nbk|y%dX|N|wM{Rbw83`e#*#&fNf1Iw$0q32ryZF0< zBvJR9v2kvqfHpD9o&4_^79Kr|1*MrikCE{JfNyfwFbX!fEb6BJA1y#KGoj^7qatoM z)9dvM5GwXD{rGvZ!B>4CJVU{go39blpg#k13JYywM2lAeE^)OA7#VqGvn3@9jbVj< zq{<4l15a1%flU}S)wGo~FN0qcUeT}|^L0FT2X^1!eDZ%}L$2_Gw$-@X-8)d0>YwCh z3AHS0cK!_tz2df7sPTNe4nE%_snATsA$OU=xDH+4iPgkaA4OW6j=! zkSLYIqT_Q}85%SutQw+FrE&*5VZ7GdE7EeoX4`$}^5s7gg3e(9TVWjg)seA}0jta{-S&1)nK+d(b$nb*MPR1C>>sq!{tzP@{1yCva^uZz1Mbi8ESsFRcJ1!KE_sCb_@@?oQ!Of@VqUWP zv1e?-NVc3~XVi%N4gJiXjzH9KPP^Z*mq#js5iBcShIBEVTalmNE-w(0**RhWsr@e! zkx{(Xr0d0;prg53JApDYRXa|1FjO|qrZ1KK0R}#jG&00b~?l_rnhQ(IM&=uru zHP}F*`Bpkky+E`ndqBpP?yubako8~pUBluz{S6cE53pM$2X{FcXGT+ah8z@FsYW{7&50Y5*_sHa@ zjwkD#(}*v`s4G<~+g<-ceeZxBo04)fBs+$|In8+j5Leh$MN(q)bkEOP2a|Guq{Wo) zX5B7s+zu`47A$SFGH14dj3JtpEskuo-}lVeKvL|7x0^Cqm>}r#p+*kapaK$7$SKWg z1|Qn1mZi;SnleNKsdcT~gYx-_VSFF9L-PSYP$AAGtD;)0tQb(>HeoS%R};d*$mld5 zHTOpUpJ!wf42LOHzzi7Cz`wsfcLQ!A`4L{X0VNQx(B`5d^{iqMTe5`TMcK?gGLD}w zu*cBRCv&%D<$@j;`d`?K#L-$!uz>*syS>{(uuV2c>CvzKXl;z)w0b)`%V85+-MdaO zril4m+scYDCmoecUoJL8frYGPPolbEm8yIdXli9@I4krZS8$s**y5JdvHzS*Qcnbm1&I<`tG3{OH zVWX!KaM%64F%wi(10s>i|UwBso7KNxN{pH!EovIK5c@qLQndUS62HM1cI>Ny*fidG$G#0fc)do-VQMQsjkj{6Y_C6|rfEn5AXK5}0c+c-*;eJ*(?GSeV-siG1 zPhme(NN4+vopcP|ni` zemkcX2c#&lP|v>EExFZH%oovJaXzbo#FW*xMnAm{dUME7U)HPo#s_E3eU5uF)6Y*f zcXjc6V;3k4e=@n7GaF7~|C0}n0A}|vA|~SxwDC{2`G`|7*h)Wb-B&Sblrqfv0LwGmpM7vX?uR&kJu~R^-PB%yi3vuZFrY8&a70@j6dB-a zMpge&yR+j>|1(3BUOH~ESpP3(9t-a)Cc!_Fjy)eYb~|u85`M6zGx%X(_=pz85(k)#-h&2Wzl91$qRv17|djnJ+y%!YfWc=kcp)Z*$gU>h4GZa=>Som<$ zojFaP2NJL-+2! z#2^JW-Mw|u2H%~x=o7S7M)VF`Y|*cRY}z!J0GH(O-rxMN(PC?ubTl2VSE0R$`68Pf zB1*gYJ1>&vB#pT3?#KDiHs<8e`@I-{)=5<#HE>4!Q6>W@Ng#Zb$121}6H%7~6mJNu z7Mcu?O?KPEX~of31(-pIkuFT4gp=0xDcPF~jbKl3Dx(D@p=Ggph3ffTe4)7^3wy`< zj%2-RPBVr)#P|J8K5EfZ-}xQa$8D+*;OkR?j-f-t^&35sS0PJ{IA23BRhPZ%6zZm< zymL2;XQQ+m-8NP=duN4Sp@qMt4*wnamf`2~S1-ypjo+KDUOavgu`W>`Y#(gj@Bt$Z zLNoS0BM+W=j=GHcE=2yh=p&0J$Nc%{-@bw*Y2l?R}sAm2X4#1{-V?@ z*sSkpgmm!duP0p=HtZ`y_A3?ybKt$Pjcd8P8#eyOi}96!iE!4Z`oB~i`mJt~(V(4q6Pz(=zVe2}QbnQ1 zakn|$BnXbxA6UQqoAKZA=KlYyz3cvJD*N`(NJrx}j^gg4P2=r$Y2K$-h`zTW8|Fxi{i1{oJwjNH*MVBrDQ2FHc_U zV4ZRadAnzluGYVq(z-1ISsI4IaEU0{Do;v z=5{mfQ#NKH$;W~b+vX|^W_k}hRxpA)%mG zfK(H#{h3rFFWGddwWQa5SpsC!9%C;!O}2X!I4e z)vWoh(2^4nfN*&X0WnOt)mE;>Tt&wIf z4)bBkRyYUtYE%=i6|+ zDA||th?{JGKP%FL&=^SVME*xw)kK~2b+rhT*qqNHc4J_LrS9EPQsa_zCD5MBYDUL- zi~)CrL5N&y>mY<_cHhSTh0NCkcwBMjF+zN%qd@CHc78X_leF?8n3e6cH5j$yaW3Og zRuo+)rUli`lw1}1@3LKMs4A4gZ%5y!nS?r1xeKP=d;X@IADh#7SN@pxV+&@b%CKAp z=}NzGs88Cw*~L!lPMgp}mPQ}${q}YaIWw999^%G#Ku5A;w6wO4Q zt)GpD3VI(Pui(SLly5Jx$i56BeIaA5h9{S$gWO>_IOh#5#i>y?N74e<1G#Htc9YOg zSG}nCEF`>VoYw)vgWX40)hVLQ5>UvZs$5E1>%{&-dy2rP1wP%61O* z|1#ylfo_AhKdwdtK*uf9#4rd+-Ps8s<=bpKEc5C{u5ogKhcG_o1Ed#{}Ci~V+1}08B)?V&iAVF=M^&mfE;D%+6nQdZ*WYKec098phuM$df>~kUX2#@_1^b3<&|Tkp zG|5dZQT{T8LmTfH3cTe~ll=SDTSR#MF!vZ(Tl-{;K@M%$kDebwSJPZUY$UnO<}wq_ zg(`1EM44j8w*__di$r=zQC59l%bF*V*oGtPmex1O#_xOatS-#I&0i^Vue~xYpn)|2 zxG6Rua;S)vV;Co+;?&?to2m1qmo^QWJm(JtpyMNiS*&c(+mf1x-41o%MYLMO17QVF zZ!fR3m2{8y+AHdjb&GZOEQ|928ZH@{Wf-}Td;OoJ90UZ@;$mr)2Mv$EH{^^vI)2CBZO-$*) z)+vCTJA&eDE!5uoXu`ewwAVFRn`%RTWe>?9ExnhvDlyj923JaMlyzV9bGu1H+XByazuq=BWlxtB1ObxS*#X6#D)QA7`pd3Q3Knw=lkg-@U*7_o?z<(n+V(2z zH7BE9C}m?ClYT&H4ld1<_*I}AP@3L}5{RWRc#u6-1l@am*B9>7&Z<&hxWmHA!fS6? zI)aMI;%ZfT-x6Py4l6cu@kwN|Q;F^B+5QjlO z`$z;#YECoUqvzd3V_?TQsc}FV*T>)?la!5AU#%4Zz=@QU6r*#~-k&Se&Mu`I*>|V9 zt2!<`rq*6_>p)SbM;p(Up&Pf#v2abs;$p5;H@lMN83X_t?n|@@)Lq4u6qoCXJ|ycA zZ1zD(Bcn)ai%mhWeO|ErC!VFGHx@;KYWgB)5zz!0xTVb$t9=qX<}q2NA zPh84dV$ETs`9T6gKkm^$2|wFVe|TgB6uDZ&i9eIZi7~jCbax}3XG9h2F>7|sW981g z`(1>jc$^@Oud18&2_0*_CS-K*&&TH;DWpw_R=R_tPGo44=cc@CCK)QQnM)nNF?aeS z`dy!2eDWUMAef}!a32QhAFHSnuv0OGg+~_-r~F-!*s%7(aSIanOw(%{qr}y@k#4qt zxhOGpcb`w{$ZUFie<1pw0?Q)j!t9;)mq_lRe~L+hm$|UBT*1o-*c{W9*>^=-Lh@{T z1AMcScSh$fwiIqcjsmpHYX;xhFw`>GTk+)|kRja42PnI!(d#oAugcx11;83Ve0saS z$^A1^QaKk(Pn`~bvihTor`+}Q9=?n-chL>T!d#?!3btXApn?0)RVkYbek6WhA>qtB zj=f3=MGp-uL7c}(OSm)tv?vk6Ls~S~-xL>T8)e@NUapOR$xDE^N(v&{RXKjg%jBqx znqcUu5k<4~-g0Qsc+Z4_jI&Ic%G3`QznpcBm=$9gs^>O-0;TQoyB2d=1#4XBXQKpF zZO$Z8@Rd~6#yo=vSR3h`Kd!XbxBEs<>(27gZP}nLg(vSP?iLPtWCpkFXlagif1G%? z`z^1T1af-Pfk9qRXLw}ty1tHWLXtr4*VBjkz^L){0}fNST)vtf0fjiZySr1As!O{R zOr_Xp(U*E=C(qz#LpWT#0ca$GimX&!A1)dSVa_HVuHHnSsWP5dC=_c5%>T&FPyhXD zLjwxB(n??-HG~pp@L{6#A)5 z#wiGW8&ZJ*%vU52x+>(b<}nwc>gi^3fuf>*sjxqor@n*LS~+-)pCNePEuFf_Q-s+=AXQ>%7^{z_}qs9sj6Dz7~4RTcy``~sPO5V^wUJ-p6u zs;bT_UjE`{fvuF}qBB29uKqn^MCUZwJ#BIqwEX9I=tLxS0~GO&6Z6{#BM>IMaGINS z6K(Qc&~0&7`UIwgSs1uE!1%r7lAPENyVMzZ^5D;|#^`M_KOaW{UweF)qSPum33sv& z=o@JZ1v@=4wVa(*Opy!piVPl!vvE<7V{}9f^WbLV zB|x;Io*uY8J?F2nRNeR6?`mc_7GHPsyuqJK z-aM*K*#x4xty|GQ#3i1y5_E2pYAo)utE}YlQK*Mh_%``)TPQa%v9gbv9%C+Ps!mSI;OPYEwrJFQ?n--rc<-{EgKVkbc4tKS&&7U<43VbZSb_9vD2#YdgsjHAA z*P;m;$M$E!Zct--LK;~sTqiXHs7VE`pbPwDU3>eE2rwZy2Y5ZSUDW+wnndwP8JZC zx_)uoi4KCv;qDfcx+gnB(oKE=*=#57f4;R?jV>uuUzV7;etkW6|Hv?J^~9fklX}Hv zs%O`|W|E%L6l~1Hr=Qp#IM(ZIXxKJy=gcJ1rFc_37n|TqYpYPee?k(${!H<4U&@X! z>JR;BR3m#W`n-Q@1}few&(thKa~5c?#c6WnA?>K9fIna%BJ%0BCAi0;qjBKA1FZ_@$s^K(?YAIAi>BV6;z$MowEAnkoHH- zBo5gQh>>eRb#--XDRv0Vc2%KK6F(#YvE3gn5X`v&-R(XnALLHC@qmYt0IVpU)E2g1 zb8GLxaBz#Ah1rgl^RhU`Ik}7GKHw7hj*CjpZlRN#npx3PFCU{S98M;*Nl4DwYvY+zi_gnJB zPtu){Aux7RusrK%wb#llC-OB=AQDY)Buxs=9q)q~uv9MtyrG>^R|uu65&O%Fe6{+& zK@Ui539k~xS2qM7cE9j02KxyYp6+vQNimq!O{ql@9%u{SE8igIdVAnfoHE7tZe|0{ za4M1$70MKTUC0QAe1!qEjnMvbxMqUJB6AH$y3xMlvii}@*IYl-yGN9OP0*RUe}9wv zZG+j4TmNQUm}z7EcKlHXo3}!-<3;k8EBC^?b-#%CM;YP5tP__Q*rj=nUa9LxI5CXI%WuT6t%$;V1nUQlQPrb(o%g z0vz|I^Wi~Cxw3L~a~uMJU_MzH9bs)L4W|=&NkFt%LH;&sPWG$jIpfAL6-*S-y&fnN z$b!Glw4HWqPmtYf|MK@IX6Cird)&Q8)>Sc9CW;oFK$<`lrxs<^nV{&ZL!{C_4k}nx zZNg@A+uMv1;(Phm$A+BrXpKx&&Zs$!vx%m_gVyT1A>a5%WglIqs-?sx%7H)-y}_KD zMD{`vyZ)|kGaAX(kkxZhJSBGZi)fwOeHXLgpL}uTaFz1~(&LRytfgzsmMDe!tA>Ut z=efJBSMp@JV|cWxm7@>d9#R4-%nhW*;I1lgTjqAjv$>~xU0||-=mUs= zAlodT+}YKofWV2(`P*lP3L*uaO7m6)7FW~>*-ZVYO;11qYt@~1Wc>z;Ow;1WP)t8y z#BUm?q}rA_)T^1w$EK>-Ti&;C1aeaCz&(xGq4Xh-o=h-5xf6t|J^<#3*)tnqY37=f z$Q4!1iHEuIT9YnW!J~WAoKc^NoVM#!A7dLEcf)yB&4QUK0od-gT{J%g6?q2K&~<$e z-?M(ZIO(3OT0dTDRhS^_J6<$RTKQhOEGes7#!0#Wb>uPog$r~Pl%T;Hf_bFEgh4aW z$;h5}_D>KD8yfwkNDi>(O%e7*{A(5J!LYF?DKkU07z!pL1g0fl8QI>jqH9sP=c+E5e4yU zM*Rgro89-qgI?D83>|&N({FpumgH+KWv*5F6-+xU5pikuk@IHsx}-Nb1b#k|NJFuV zSgJ20#lG7$>aK*|gx+^qOuDh??LOxu2r0Z@-yx)z{Z1o&&K5BZxw6C>LzaHHeBah~ zwAwxHc|n-nzI{h%-_HnmGxH|4>-z_sjs6syXJc=lbGd5MBrRUtvS<@#=DBidiE2=AAmlwo+dF7uqW+1 zE^Q4*uCx>5Q|{Er73)|bGK}Y4EPzMzFFc8={Bpw)So{%|`q%$<-hWJ1_d4*i5AOT8 zY0R#Rl&3`SHr!6>C8#+~-QC*%kNyAfv*n~G@TO-Mo&eo(e|!e?SKW8v#{ list[Path]: return written +# ─── Open Graph / social cards ────────────────────────────────────── + +def build_og(cfg: dict) -> list[Path]: + """Render social-share cards: the lockup centered on a full-bleed wash.""" + og = cfg["og"] + bg = color(cfg, og["background"]) + margin_ratio = og["margin_ratio"] + + # Source lockup + its intrinsic dimensions (from its own viewBox). + lockup = lockup_svg(cfg, og["lockup_variant"]) + m = re.search(r'viewBox="0 0 (\d+(?:\.\d+)?) (\d+(?:\.\d+)?)"', lockup) + lk_w, lk_h = float(m.group(1)), float(m.group(2)) + lk_inner = extract_inner(lockup) + + written = [] + for name, (W, H) in og["sizes"].items(): + margin = margin_ratio * min(W, H) + scale = min((W - 2 * margin) / lk_w, (H - 2 * margin) / lk_h) + draw_w, draw_h = lk_w * scale, lk_h * scale + tx, ty = (W - draw_w) / 2, (H - draw_h) / 2 + + svg = ( + f'\n' + f'\n' + f' \n' + f' \n' + f' {lk_inner}\n' + f' \n' + f'\n' + ) + dst = OG_DIR / f"audiophore-og-{W}x{H}.png" + cairosvg.svg2png( + bytestring=svg.encode(), write_to=str(dst), + output_width=W, output_height=H, + ) + written.append(dst) + return written + + # ─── Token export (CSS + JSON) ────────────────────────────────────── def _css_var(prefix: str, key: str) -> str: @@ -437,16 +480,16 @@ def write_tokens(cfg: dict) -> list[Path]: def clean(): """Remove all generated assets.""" - for d in (SVG_DIR, PNG_DIR, FAVICON_DIR, TOKENS_DIR): + for d in (SVG_DIR, PNG_DIR, FAVICON_DIR, OG_DIR, TOKENS_DIR): if d.exists(): shutil.rmtree(d) print(f" removed {d.relative_to(ROOT)}") - for d in (SVG_DIR, PNG_DIR, FAVICON_DIR, TOKENS_DIR): + for d in (SVG_DIR, PNG_DIR, FAVICON_DIR, OG_DIR, TOKENS_DIR): d.mkdir(parents=True, exist_ok=True) def ensure_dirs(): - for d in (SVG_DIR, PNG_DIR, FAVICON_DIR, TOKENS_DIR): + for d in (SVG_DIR, PNG_DIR, FAVICON_DIR, OG_DIR, TOKENS_DIR): d.mkdir(parents=True, exist_ok=True) @@ -454,7 +497,7 @@ def main(): parser = argparse.ArgumentParser(description=__doc__.strip().split("\n")[0]) parser.add_argument( "targets", nargs="*", - choices=["all", "symbol", "wordmark", "lockup", "png", "favicon", "tokens", []], + choices=["all", "symbol", "wordmark", "lockup", "png", "favicon", "og", "tokens", []], default=[], help="Which assets to build (default: all)", ) @@ -470,7 +513,7 @@ def main(): targets = set(args.targets) if args.targets else {"all"} if "all" in targets: - targets = {"symbol", "wordmark", "lockup", "png", "favicon", "tokens"} + targets = {"symbol", "wordmark", "lockup", "png", "favicon", "og", "tokens"} if "symbol" in targets: print("Building symbol SVGs…") @@ -492,6 +535,10 @@ def main(): print("Building favicons…") for p in build_favicons(cfg): print(f" {p.relative_to(ROOT)}") + if "og" in targets: + print("Building OG social cards…") + for p in build_og(cfg): + print(f" {p.relative_to(ROOT)}") if "tokens" in targets: print("Exporting color tokens…") for p in write_tokens(cfg):