From 4742f724f1adac8f956d797ddf1cfe18c9ced74a Mon Sep 17 00:00:00 2001 From: Mathias Date: Sun, 27 Sep 2026 15:13:00 +0200 Subject: [PATCH] fonts and colors --- .gitignore | 6 + site/fonts/montserrat-latin-400-aspect.woff2 | Bin 0 -> 18976 bytes site/fonts/montserrat-latin-700-aspect.woff2 | Bin 0 -> 18912 bytes site/index.html | 13 +- site/style/base.css | 49 ++++++- tools/rescale-aspect.py | 144 +++++++++++++++++++ 6 files changed, 201 insertions(+), 11 deletions(-) create mode 100644 site/fonts/montserrat-latin-400-aspect.woff2 create mode 100644 site/fonts/montserrat-latin-700-aspect.woff2 create mode 100644 tools/rescale-aspect.py diff --git a/.gitignore b/.gitignore index e69de29..33c9089 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1,6 @@ +# Pristine Montserrat originals, re-downloadable by tools/rescale-aspect.py. +tools/_originals/ + +# Python bytecode +__pycache__/ +*.pyc diff --git a/site/fonts/montserrat-latin-400-aspect.woff2 b/site/fonts/montserrat-latin-400-aspect.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2a073ec18cd56494ce2d93293f012f5aaab81ba7 GIT binary patch literal 18976 zcmV)DK*7IvPew8T0RR9107@VL5dZ)H0KbR;07<{900000000000000000000 z0000QfjS$3m>wL8BnDtVQ&d4zNC1UQ2z&{j6bgZg4DEaYHUcCAiU13R0ssUc1%!SF zk24H|C>zeL6>OWvo!bE%{rR?ijYh|34=uG8n^x@n4$; zG23XBjvPU5HP-f8%jnaH65Nik@8miAV5_V@K3!9sdWuaYCd9-Sn%@tWAguReo{#zW zyqg?osGuqdViJ{@@27EunNBtaNlYd7UsOf9`0{sg>ZGRV;x6J-rSk4>{mdEIHug^P zGMPO8Q0LdVuaf+hhYc@Bq<7=`d46tx?tO1>$u_pP0NHp%jRg@Qd?ZJTUq+>rfoT8Y zW9Bc6#%S!uY_I|qzLS5xKLoqyy_9ANmIjiEKm=MB%XokyTDAc%;EFG`KRnIpzXDb8 z1Oh=qAR%HGv5QB=ACQ*c>bS5^uG6FiNw8aHu+pNCi@H>@qrAuG`XS`~!BH z!KveX;5bN$4*}G^k>CLT|CdwyUm8K?Yhoo;fb621g6%S&c3GpbEY}Xf!nI}lsw^;+ z*eP;$-`i96f8G2ahV^a38^7uL&n~LZoQkD*(?DCeNCLS8c|iYZrZq>4UGQ;>prB7P zMF=!g8rqSuXH8~Ybg2)r3zEw&2=hlVyi0?`VLbAmem^(MyOoH?Y*(3fgw)O^h^wR<(87efnkk$jD`IH?Ir{OOvfpsx)5-?ZP`nS>I0LJh8zW|3$- z#@|fx&d%&EFuSzbrDdsEY94h%X~mcBz;RGR>j|Z)pjuT=VL>>A^WF9@r2X*x|5T;= zy60znb*b)}Xih41+N`Gp79jh}t>U~WYq{NM%;BV)vRkWiQH9t!_v+k~7*#5z&MrDPrF%Dpi@LHu{8iNtjOoj|7>mM)1T(w$ z@8#?Mea(T4#T$zt>fTt?q1Fweh>rCcl6^Pgd$nxv9^KtN&&o(vl8lUuj3jIC?*C&< z?ZJ`JW_;|z1qfSCcN&`?@0h@xfg!-5I506W1RJXrLPGHj6G9XaEA9}Tcu0b5NUmx~ ztrjRnikX9e2!SX-j)&-K$jJ>QH$%tk^1gyY5CWJP76*@i|DLwGRMHC79C{!KvA zh=C_)T*tnASyH7+6eCOkFIoYd8x)FmW`*K6(?W4TUG2=SvF&Q2TBFu0h1&EzA`<2h zh=q7agrt;gs4*P5($O>U;K@rLLcGu8ZV{8yizNtg2qDhv5{mYW!2*H+-Yi&+2d)HFe=yfSn&F=Z(L1PUf1)t+?bl}I zD@NNqg2d+f%03|YYM#x5xi#Hj=aD-(ha1-A6?aVMtYy~0V2aCU;RemY+0#D1&ctb9 zHpEeSrfnK0HsSG(eTXqmKn==9JI=$5H8C1ZgqVYI1oVIU@-8ntanB8xovq@ygPz6d zJ$R38Hd^gpOU>sGpQ+7M<1I6wON)9ng50ccFUIKk@u1;IO-X`B3lN0>{)XZ{%WEl% z4R2UUr<&^n9#TNof=){aAM8MsN}e4&z^s!s(wt6`kG8r8UV<3o)-)9Z2~?5K>t$G~eG4szcCiJKQpYE+*s(RB(1H$`Ps?4n&BoJ43z)`&eilTK zg^&VBp%{e}%2dMymP(5T%2k=&bBso}KSxE3{X-f+freO&QvRd&|Io}0xOuyxuf4Ez z)cVr3zh2?5g!qTbh)SO&l@)NO`uw?`_#v-6oAkgf-Lsx|(qUaw?$Bwi!{Lr+E%!AG z&DQSMqbVn9F{G!^=AVNJg<`@v)P>REWpBF@C>T-DxLFFz-lpY@VT~q49E6YNf&cY+ z=f%EHpl|?Irov|jA~)IdjgRg$FFM9_ww$fqZ-R!vLc9K+-~8BPV2&6JP29vtsFPs( z%mgNA40_81CNO~sBEwyVy3NJ{FY}p80fqd*6qdRz6-C&d$ke%@+M~KVr=I%OO=tLD z`i-BmlmEN4QhBJwu z3c@&i1SkGVb{|MluuZejZivKTGdS-S)G2%_0juvrYL&^wsdJv~<>?q7a>08pY{4u0 zaAOFUg!wk%MarfQ0s(|tuqY!vO7Y2if=a47-jM~RUD-!D z3A|Cw#*}~&S->uY{1BMW?iPZh!@h1eX980<1lRRox_9w|w!ag{|s?Sgumm5))x@lG&OOKLFyj z7}4sn>OI8?Jfp&E4p(*%9Bca2X}FR425o0-D#*F*zwQwRVg0Y>wy^OmxhZdL6CGCbPiweyptED_0)u zew2(14Q(~xiu7~wh$LJ}OdjbmDBUN8XD`5a4`2;unafZG=+AIW`07OaCQUkRl><{a zaNVH$5N{-pWG|~{ELT>F*>h(@>M5QS?=JEEt+m3)7#y2!s;%6Q=O95z6B&;tq-;3 zvqq^L5J_g=rlXX*i4?#maI19t;||cFdy+m52#VDN%*D$pu(EJ;xQgTd|6@Y~M20TCwGC15?;g+eET{G3A1Jy#+8z%HT zBd=06wuw076c|@k%mo?`3K zL#S6TmKRjLEYJ`+8;F`c#GMwRr-wqL!%*lDgiDMy$DgzRKfF4>D+v%7=m*;|`w&rN;UxgP3G)qX4$Vd7-%gBjgIKonluu4m6af%!a!((-O z+l9(wXSBd(Bx`#rW#b`nayLUx*=3wlFLG)Tb)0`+uw;9kl9%yQFuR69D~P`vLh972 z&EDY_@d|Gj8tUeznyWh8%U{si1I^F17HHD`i74Or)_3{1BFie+DQewy`CJ$qw}qD; z$2-d=a*87E*KDuLXB+SSRxtAi?)Tts{9=b+H}OXqhN%>aRr zr?V^$H*B^1*wp`~HG+LpsW2Lc)qWZqj>XX0?B}>q1NLaJ+lCt#f%k3Biu`RhZ!Er3 z_PjMu#h|Geoi1=l^)&>1r!T=d9c5?tSQMb6=mYfS^CtL*3J*e`J#9CO_J1wwUE03& z5}-b7o=gIPAy60`Po&ZLWaJc;e2i-JS}RtyCyN4FEg-8KY;{7cW~kK!w>t1vBhhN3 zSv_>CmCve^v1;V3c15d8$*T8ptKK+GwZgjlXg+{Adk_qDm^u{@pVh~^0H7hg#!x;0 z%whnecidBa=6SqWZ`54wJ3;5C2Qw%!XWm%AsRkCKAJjMi97oqU;auM-lq6`6&ucIQ zS}zROc=q|OL2Z;Es)ccB7>gsgt3{FPQaDqyR)|SKDtU%$MgOW*R(wj4S1|m*LwFv3 z{2^?IF;0Xp0hfBXQmJ$Ez&#qm+Pc@bL6^|KQ7XO1qz2E@J~8=Mw$9Ql!pcG5wxB7<40mwDk8MzYzy0(=x{QRXwhKu{48fdIm{b2~tQPjG zZp{b(SC%BHK4r^4j+RBm4LSg+f4)gI>s9v`i54bbMf|?%urH`+Rqc@31gHP3(&UG5 z-!>A>>+@`!@g^dW7%YKAWo2XMU@&!#U-T#{KQi|dcE+{D{l-WEX)>-h9yge zq86mJIFV#IgoQ{_2(=0l;SvZrEI4pQw)nvkp754Euu;H9fe4Y1849_=5&rT90fdOx zHo{rhK$oybJTvlf;J(c<7t)m+#gKDHz5%YAht(6{yS)>*xl~&J#nSpMzw+8Fvg~|a z|D?BhB)d5t;Z_)KUOH>i98GPydewq=QkFv7t8>7Ylk@iJsRS22GMZ!6E*FS}*(hcK zmz~FZOU5BJEGJjlC9%b;20V0v!78kE1S25iv8#xA2S-1uuM{8%@3Z@q8BFDknl839 zRO_=^^4I}V{2ArS1kksc2T3bYCS+ zs2t6|=ApAUqM?s27MEMiV6&M>s|)T#*4zQY9Of-H4lLoC@z@d^N6M5(p-P!8 z<&CVV*XRZE(w7mpv|&ymY1J??Xp2~$a9xWTD(PETsl2H~TOs?V4d)efY)bT;mXa%D zh>LBR=fySV77y}V(s+TFC&|UlNMzqROPu;=-5+m@!n^I)c1tH3=Hz4QFQ?ufzw*1H z^@m;G$#CN(8bjMSyZf{%#f^~mxD^uJno|VBnys>YRxz+#Z=y6v>5;gTZR7c4gPbr_ z(F~VW=MgDN8&B_b!KKgZEqh=-E~iq3&PSJa$YJsA<}<{VuMn-d(ZZE@ZYYDedg5(n zBh$WAmNHK=wb%JBqG0zyJ|}5xY|(EqW@K^>x(4@A+yE>RMSoLMk6_K?eX8Inz~W=l zYMw2#sMu|irkvL^b-&fKvScFFIuc_i2s;9!ZG3zf^|W}i5+oXvbh~w&TM0UL)E)Ga1Or8~t0*#a z?|~6nOKRpV2Jw2Ps)Xs|{TA!OOQ_yBaVop&1ri>?1H$~u<~lMiWm; zB)tf4A`I=QZW*UK`r>8^8#9vyNjF=e_2EH;kpDGH(JIk)JB+s5ZY}mZV65X#80Vr(Cb;gpNp8AnvODgW;+}h^ zdf=g7y!Fm+KKS4deZFYZuU|W?0>Z_?!-Mb%5G>FT85x3{4Mau7hMGOZfd;{y7NVm= z(9=T<3}ifb;Pd2*&5u8!00Arn3L+OQm{f>pTrpyhVhw>MOQw<{1(qreDP2023^_=- z@`wzTk2K71ECtG7<;t;Cs6eVz39C|trCK$y8Z}6@YFVn&h|;7P&qyOFj53B&ix#x8 zT3H%rJk5y!0L%b^jzA#Srhr{SAP%5V`!JXpINSvSVF8JBh(a61U`^t1M)7!i1cF5( z(HV(kolMb2rP^j?HOE^`~cg66^5MPCN;3w+@lOdtzm-_YbXRr7^KA8 zqF~XeV-a;*9JzQ1w=D}S%94+z&B>J^8`n_ZR=#kR!c&$al_{g#QWQl{Rw^VXB6vPu zt8l3$_M{Sf@`#iqA|-&>*I1<06=_{XRnh!C7g1FOsgkC?kk;AF>V3rdL12h3TXdLx zS5rT=LA6o^@}!D`2+?#rFtb?oMzSwR#cUJF+S}|~B2Yg%n;3SOlQ*1_DsCxR48k2{Fge&)bTSFV0ILIQ z0BZqj1M33o0qX-B0UHB50J{KjiYo*Ra5%<@UkBrF`TKXlolHkqWCo*r){iK-A#Op}FzfS+D;U>ZUYd)ZDT>%0kuyJtlz$H^lW@)lW0#Etn{Qj%_ zt=`v+fT<7f)YZWF#|@?;XnI*uW`f$6bw$-s{-TilW3pa1*EB%t+tLY%AJw!mK**pG z!h;JRj*|DihL|M@5F(%p6cU9^F=E#@2BfTtozG6ceUcHlW3RNMEx2-0Q_@WsNmFA6BmcnF9DqTl_IaOu)q z%YYATmX}z|t%5YJPNtqgAMfz_Xmr4i)G)unR|%ij5!>mNqfq<{ge7D@?6VMC{&O#wjpFFg9vhM zJVB29IFmqd39IBzprl%_CaA4))Juz9#6jBX9Rc=Xe|0cYiJ17?N->H1=T@u@VnapE z7Q>D`2acRLbK%M@8LsCg8BI?l*cX&^NB&Zk;_tCQbi7Qgaz;l<4kUzeCNv2ciBgiS zG#3tPbei(fl8LSIFDKqAmL?ZjK4!)Ob>id%R(c;jo930^Y|n>-?SLJ<1MA$4WE=#O zj!C!wKY-5DK1_hl3#cVG1;7LZ1mVEIC>WRm@AtX92?6k5N!$f04WW?;2#z|yk3su6 zurxEMhXWMQ0HY8PFbY|_0?UiQ!T|;|2sGY$KQhQu#ymX7=hoa=M34lRa9FqdT;@7+ zi?L?Zj6LJbcr!sv40H2Dd%IZ^=S-5=%YOV224i>#^0$qV8l=xdt$}C=PV<|LlCkNx z7ZaHK#Y$3Fe@xmOyMX`qG}oCE0Px=*=h5fCSY=zl=bz27#b1i^;rAb(9?w-~Z=dcz zKmbbvo9hVxa;d)q$i+w7rRUd;YWuI{HhbK1$O{ARy6vtvfZhVgi*Pgo{-yRs}ny(%vxX1czurdDiyJvqwT5r7T z)>>noeJB`-gN2PtKuXM#gbgd!1`)F7!jTg<&fat7%ZoQ3L9}W_2o)wuxJc3B43X$3 zNwQ@y$~4$;#Y_s7D)K>zMkCZ~Fj|E%G@7Lh8IggpqMG*<=!UCs5iY|OxP)&50zV8` z0*Wdp0JOEz&r4u(bY@q(gA}AMm0s?~EHFUyz?P04B?QT#Vkof=R|5;3FxmI+*}ZH1 zy0vSjCMU+nMpv&|xnlXUr6a>bg9H72y*=GsogM9Mtu4vsrpAW)xv2Iwion!-1gVQnam!?X7vb4Mb zs;DfWQKmIL;u2AyurRAr*G!KCV%%oymvFRvN#2%+xk!YFdHB#uM~$njibl^eUsEpV z%;a3zc%pH`CS0u=3AV)&H;hG>ew`?6SwL{|uaovGAyxju#r+jrWK^dRiAhc|O_PCi zpqJA8LY1yp^@>cn;<$??LY1n~t%gvE(uF3)S^=g?Qgs$#SxKiocjbdvE5$6gKnO<; z&NUmMXD)TNrre5KbsN+~%@NDk*Gc*h0TP7cIX2-w@@miBM8A=pqDq7#k^PE2sZzat zu1>JDBpTiv&)1r2!GcqT{g#8k=65TRytp2xR?Q;~8y?mm0>rxr$9ktYj|3xz<80sZ z7QE8#!QIs;8C^F>mM4l`+_6LM<*_I(J5qIvv1VUpk84ZT8yRwBpb5?nH~_(|5!ZcB zfg$<9T6N-0^Gf-RnrGb)>>ShPS=hV&G{UUraz8a8ff%9EWz1X zwW{e1%V{cveQxWcPZNvM&-plknG?$KMAfsJ#%{>?FuHEk$h0hu69h|NEyd|V9NEM^ zELu?lhQ&!mV~_1X z`?zF>N;^n=7bmR-u|Lz`N6EW~^sX_M)k;C-X&MF>F1z|+ zds0uUu#^ijF{)q!6&2!1+c`2}-C&h=uwu`k?vXa2cL6|i2xX{o&XM(H7C~7=w)Mor zoO_1D1ZLHoV}PQp&lPY`*@Vhjy8|{Olo+@*B|+cYtM8X`jj-em6z|BkU{1>HEi7e8 zS9Wy0pBgJsMs@1yY)}mbLA6lU9fC6^5+-rFoy6j{iA&2|!O`Gd!`!XyF$pkkG0LK2 zY$)fxlcU{xhv@wXju-D*c9aiMpKbXu!}(eXj}vGTd-9}OO+8gX%?K%Xjp?+zW@c;E z(ap?_#L(G02B~vM!wCIJt3(p5<|2l0?|Xm|>hg#ZQ=ZS|B~MQLeuy4m&*xp>Y?>+? zkN=Q2zGswT)UUNB6d>7JQuG*KTI*0CMciVUZut-@*D2Pq%ShusHK@P~@Cs$)ao{MW z15yftKh8>f-WivTYwlRcTUx<$M5B*@M%~SZbJJJUte1;-fsPso6Gkq!&HV_f+g=@T zR8FKMCuETRG6#0SER?ejk~_Wr| zAou`I$9~GV&C02cl-ek!3|cKATmLaG-2%Ae;qn4uPD)1b+Vouo3A%~Wbfr>nCU!4- znV-DWo(_{~g{<1X;CGWs2EdG6D1P^U%|Q^tZKtx-M-s8R0=@33bX87^#;tKBeyw_B z4eUDvD)+x81T}5ctsfIU5uP`jGaC%vmdPt%x63XZi1udPU-M zkqmM8L;3Cf?Vu?8!_T)5u-h+tbo&G*Kc{bjPP+^_*`V!2=B_3`O%2@Syi=_a!-M^= z1h+DR-%vF=lo*0vpzU^K`lDTU+riFk*CZH)MBmq!)V$&{9CCh!zSExCGGmv3FB~jk zd$#HFwvEGv{Y@AK>G1g?W*)`dKkr}7yI-b{TvwHHFm+%Cmtlen4 zuH!VeKId9)(siv?hs|$fGmO{55{v&=?$vbo?9 z5*C?`5CKMN4dpk`9i2XG?(Fj4!*t4QLs{81;aG3B|qkg!uCPZ z6jLHb`MA>tH>k)S!NgIeg@Yny%M(E<#`rbdP65P^c}~-_5RT>) z!YVkl@7X-MA4A6NgD2U@pUZ9U%I-2#eU6|R5no3XC>**FRIxwDu3|MEA`KJ|tcAk8 z<0SaRHnuJq90hO)D6|z2uP^q|ZeFH6^vOvaPLE9y6eyee2yDlyxqP>*X8e3WK77s$XL0X1Ud}uMWSlf&(_xv0=co^!gQB|{j2N)= zjyd!Xkn$42%Au)VBWakOzG+JHC8&X!?zu{~!czTT1^{O61(S zjRu?lVJ8ppeAz;>KO+y@uriP%quTR(Ic-ZmGI<;Ws8|UFbm%0a3b1e55A37y5oqnl z>(>Hty;}2FLz{}oOr+^{O% zxpC*gF)8Bo(c#gmsLw$7g zgeGp6{!)*UiW!W_dW>V+5kRGbSNtRrXKjj&&TVB{4bIE=z2lT4qvfh4lN#*5rAk0J zJfUG=s|cHo@WXYt`1j5LXPxvG8@3VLp{S$llRg40x@|I?k+dB2zX3D%>@8yqjx}Ut zILvD?s%77+8(oZDWk1%I{6Yb8rf?W_Y4Kr< zWeGm4;Tmp{CPq8-ekAzfG@5l6zSNOWVg-L|Yf37T#p55d5i9a*Q&UnsVZQ_-@-u7( zp>J=6toceF1npN`Z$2I4xZI9G+PCe%f|cd5bARTW>YMaQRYm+^X&7yKj8(C&CuV-Bby)7{El`Sg=h3d5vg z6O@6cx8RouoBXVTASXQ}XjT~?<>H_PXg}=u* z`S26_6}jS;kdbCYfIbp%S!cD$FD-6vhg_BOGoL?iQRF9IWI3@M>#N{9-BHgwL(-25 zl;3LNI^jG>FgE_2u=H7hdArt3eR;`6Nk3Iiz zJFYq%RY(6kni-VF4cU`qa*J=LA`kAHo1ME8tTvqZzD(WpeH28SPJgR*-5D%yCsDvQ z@1u3A=eE)j)jB_;U#VifbANl~-6F#uN(j*T6b%OY zdyN*wqg?$kWHh&NdSum01xLKETYv@SO>Hd%+vO-V z>+3xkMH}#$;cEJIWIq++^N{S5A*Czo4*r${@^`UzTS zg{C?O7l(WyUfbk6oz&uK!=sH$yMwf6k5EYn@;Yh#0ZIkFiH=&_Msw-$LtMWJ-(BFk7LRZrHkmG zZ$`?Yfbs0lomN=5N`7peMt=rk8Jo?i4~c)82<5U|(ae(x_*stA$o|-sWwi3D>R`mt z;c`FiDKF0}<5j|wGP@?zt^Dgum7qRo+y#A)LIY)PaTMTUQ!EBb4W_evfbo$3MbxJ$k@#Tcil55MPpWj-pysIR2#A)_NL zWLFcZCxHpiYpQ9fLxe$>K>U@~ClpmiR zdf4A4-V_Q65470}<7mISZNL-Z%T+aEJX|%H1Of#Pr;S> zsAEVcs)lgvzG^r@1&xCztiWX6ULYg2MFQ_3C{!T|B_`Hg zK`!;_cXT*YygQJ~#$SilTQ;tThu4!E)&s!hlq_4jT{ZpRQqPI&?~sN0E5pmc{QdJ9 z%RaQuZ}Pm_nS$W1AEW!quPV=Wx!}A3g{XQ^Mzv3h{`agu=BfW;i#L>diw+bYG(Pb{ zIe@Jxya5ihi>E^&0d@Of0>|2cpvo|-sz!{3S%YRXl2|b9qT?w+X>d*M6jpp1pRKo! zoN648neNF=kvUU?nvvF6O!z}bmk}Nc`rzR%#PRTDI_1i>XsoF=7E4C2T>>+vSInUv!#*OcLBbPg zQH0nvwtwR8RVgxF>k>V(r-0a7us`qewP>u_wfIR28>2~|zTK|WX~@bg+-_q-98Q0LS&zA z4@wtGA5zL~`b9Sv1)>3f_egI}+$kuxW@06HElOW7rEA)V^Xse%fj~<6^+X1yZE~wk%miy!-m6iuQXUnc(OkTKp*<+# zXM-S8H;hnD#p_g)aU4dPZQ7~oh<42!j-3XD?p-v*8r(R8Kz6ktiJJw@ZxTr2Q1hG3 zI6wI&1p*Q)v+LG|BD$$J8K$k(9DlA8=W(GUSJ-SO7>GmMHblpBGqqX(UD8x+)2@kB zYp3v$COC$xChOwLsTiRm)EhRnkPDM|{I`&^^9R{Oi}Vn9iw(JYX`kIL=?K9(RYWJx z@FedZnji#wYV_+Kw7t?ERIX^i^(gMC_xe3eIOd7_19~dm*Z=2sW&lf)EVuMQ!qr zz^k{`;&Fo*lUByCUi(yCgxf+pd3f653H?d5WMqKKP^`rcPenrT+7>&CklH#M+4_Kv z0Dy-2WYS?aInBjvr->`I% zJrSH~W&!DtQctKRRb`@yVbcf+@@`Nk77o_@MwkZsPntuud1!>doN4uhCAp`C1J01@ zLe8USt_9g*(}1A-Gv>E%F#nMnxOO*RD+rffIrI)*P@!MTXMU!5Zw~oNBInzD91uqq zx>%Q>iWWNmS5~~#;rC)PoSf&$wxfjCh`E}Z_y$(3Vp+_f(*;$cgkDzS`t4Lny*eb5 z)|p8~bBzK#Ad%>Zx6DA7jj*`~BGkO^=A$wc2uQ6_CGPfn^_DmpGl>a^mB1u=3_i5K zu9^gZ=Z>MsC0f}Pn*Lc7Y+8lFduYW6Y4ZIv`aYWaII7+8$F})@Kv$Q3!Fd6(?TUIH!2kHF(KP+sYkoqBGQr?t(Fi8vqpm}fQ)XM!4fyeP%#d%y$pTyz9*z6 zQz=X7P_xfB03}6K#r0=buJpbD7YTDm+`vFUrG!=KvI(YJTLBoQlzT$Jj~$+Ds9B5)svHo%(m{&BydT+_ zzTYkzZe7y+`2w(@ETsxnlNnRQT4XjG`_wVatZDN67Tgo{TPih{tkRWhw!|tFp_XDu7kt+)lit;bcWSj&WS}TcLQMEXX*6#47%(a%28V3gA~f< zLfQmKT%DdO7Nk~;rySWuN6>hjphIWTMZ}VzUQ&Qn zt`b#q8QJu~8P9#w|pO<{>h5>Sf@Op@L+hpP}l4|92ObA^JmegS`eyUw$gGCp9A zQ}VXNx&>6erfe%J-b$fP6c6+u5<2we!qM;UuiYUU4<6u0wJw-y^o3ib7LyFkSjjg@d2;SPyhf?wSmZ<&F%{ zZ}1MFQs9!F+mlc2$zAV@n%@K5Cgg6W6>iSW>n)`90xvdkp8%qOHJS;fhxYY7p#*!n z#ZB@ByZ6W!iA}JyPkd*`b^$E_yKdP=+r9(v7-30+Y|)WbIyx@OsHd0?A*5So>*;TH;kMenCFeN&mR{dV)3tdYoOvTaOrzB69F#z+ck=hLmN)xnlkeCJyn-tR(S{`NIP&zT3nU=;8=6 zk=gJuyL-sa0jFIXmC7TqjOnv`zX@I0UdDf#FIp^CocQDtd<-0@VV1kaf{<1x4EjWx z9}dYIwl#nwjZ8GJo~l3X;|f*JC@R1F^Zdos?;xGZyLm>v2y%R<=-mC4FH00Wr<2Fa zze*NLE8i_Ve}CS)5~aZDar4RS5qps?0i*KXsi)_bg1m`3Ct zSk!{!qE?SqE+B;#8AHrq-Nke&6q31%wc%2$yNY+@iS7@b6hC%l|LQw@J>b<3uSKjL z++uYj(e2xCKB#5#p_EGw3TjR0PFPtBFmbLvQeaAi7YIhS@joit%6 z&{F@+!A$Zc`E^pgQ4KiBPx8OS{+MO|K8s$0H{5@2f-XWAcH>e2K3FiPoSSZFNrWY8In8_id^d6pF%v(HP&4)_2F$Zvw$f%{8;E znsY?oV^*+!DZx7>w(v3kEV#MvW#!9rkK8ugB-W3CL=EE!2UJkT$>u>?P(ajZI#kNb z;vru^0E}AvtRDV_Aa3dQ=M)c9w&4^#1b~CBno{IegDI&=*C)#ph_PJwDK7T{Gmaq4 z#Q8qHH0ZF4#^-BxM{(DF&K$D~(8YBQ_o?!P5gGYp9}ksz4+gSB$oqH9>>y{RX=``N zb^>nr%I($%Hr>C;`e-nW*7>%oU(*I^K|I(G|Oy)0e^bhss^hhS9IES@>7s;gFo=$$5joB>n{Q`i4 zj>#9u0m$#Z!$U>1P5H$`x4(<$6{>8doFV`}z0cQv^Y#nZvgzvz3-%XND9!BGDordQ z4q%fk*2fa|#{d8$KN1BC&&=dd+p{@-d>gxfc4l`Dbwvp$jTaAAC*7b7wWDBEQsGkv z)F1Z>%rRx0M%zrGY@!wRfrL%jb}7}CofV}iHTPxKSTmZL6ZrbU;QRZE5qok3oL`Bsi&=sZ7~3UXAO-fE^d$muPGvSl@Y=QiWtDzm zs15+XZCMT}#gUb5rEva6wf0(M^Ah)9>xtHPen`Zm>YUVsVEdI2y(ae5c33P_(t~HSaf{N_avgc=<_DT&H!_NM4(ui^vjd09XL4|m@Yl#iq|(6IVydS-`Mn>He^B7 z^YnbZKrhsb^kTh4FLjrV&BeUp>eS}Bhxz#q(0bt#7p&2vx7XWG+=G(&PlJ<-Hg(ZVx^*{K^;K@9ZdkxgeUsbSb=p~=>A_)V!q%EbSKM}e5XH9K zp!$`kI(xAGB6#PkXZXj9V?3(XrNs#A%MEz|Vb8E)ulMO8UN4EcWU5J%+~@c6qe$@W}D- z?tP$X$LH~2uM3#n*Kse}36HbQFsRM<1>4N@uj=EgNAdjsd z-0^IK;wOCOOO>LLR$MW9H5X!SgQD0so*G+V`&FS18bSV(iV`|6Azk2(9^Vy z!^WqLc0C(3+qBB8Qw(X#bvw{+jfXj$VPC#!px-gH8unE+`FbSkxZwKbE-k};!T>to zcyJy-1pe`IXA9ot8CT%dL^Y+IYWKcoDU4mXwI@y9$u;$W7KN$McF?iC-;`aJtV2#7 zgGan&=<0aI*Vdow`6u50Kk(n3&6qsBd$p1BOg$HD&4RHq#fkAQc)_*$L8E zI0@4*74ACv*s+_s5QTWcVO?vTPLsRbXx#ilR9C_qUpFqI_aE0bfb03U8QrdKsnz!Y zzjf@S!Zc`vKYvmyJ45ykG^WS=vP`Xg*5vtS#R?_G=2gf39KW(J>DQkf0{Vj=4mW)p zzD56c6PM@-`1rr|fN%d^`{v^RziMV*NC@;`fPkS>+2(;T@!vC;6k7cnXK}x-CXV;S0$ka<5ofw=sGwdecf$Hs5j5dyii z{jy$2i$7}o7RuQ?S*E}2bZ|{iMEz6#_W67fO=q^%CoG%L_PgblbNUz(6L+{qWXy-T zq%33TYk^Ezn1mHa<>47U6%VvV@RA)c6bXr&*e5w(xZd3c-~XHx60>geB41X1E{SPJ zJvK&MlBxU2;p7dtqtS#FTq+(juY~Gl>>N*QhtEswe@l*~K)7Bqb4Wod*;gx18}B%I zoGAC>lvnn7m^3$Ao6iPSof{Xen^7RccnE+X@P=@RgGlh}2}^B*ym$}Rpa2y(dUn() zV$0i?nOod+a!U{?(1NXh z6;qqGfoW=$B!8!DXUnkX6h}m9IK<8OGZ|{bd`7BPFY7;9S4BZeNN=IH5P)e#A==jm zFN&{q`4c(DEQflEfYab8I2{g#cVQ3M8=i+_U@tfnu7v}V9hB@~?^YSO1_rd)G*9&$ zCudj5_|32(><@3nPmjKof^u+G@%Wg{5U7Wf&{q}>_;j;&U-cLc)*(K)G(=)ph*u~twND(C6i^!HEr3v-w_%GF~~YwEK#d;F4SsD zKteXI$JeXVpv;g-qGSV0lPwyRt8guy^i<}E&8nF+$O;-&q|9Ul((_o)E0SRrpCw@` z(;j)jG9`%=tRo!NlUqlZVRVd!GUXUvRPf}|IqDzqAudxt` zkeDS2DVmI&VxZ~q>hj5FeS=N25%s@z8t$}oSrSoETZi-?d;dD(Hx?)o;n6cBw#8Oa z_ym4dAWVd#j@f3r9d=q{t^E#Q;c>wAyI=jOO}i=a;Ms6JrrL)cuYNH<-U+?+&Mpi) zw&pPD5E(_B`10c~K%gMOLWBwvE&>XJBbbpatZeKYoLt;IynOrufTT+B zJBh{Z!P=nTk<b?NAZeY!YE#C-BZz{7t7&;L90cMZlFWxC61h4>?j~dJahzd{3bbm zOLPS8@L{A8bOS-)AV;8pKtRwX2RRM`fdVQ|0m8ICE?Xq;Mj?DDuOFJkQtc#JORb%p_m$FX*@)e64Bt%A~DW1&7Rkw*Q9;)bSX486D zLm@MDIV!KKUN4rTkEd78W?4l{QOazq>+O7zsVFj@(Oft5>{2o0Y%Uyz6>P13ZZ4BY5xThU=ivnY+a|QOK!Jhu|h;uOOisSv@tJu zbZW>2uu{wE@fMGsg19{!A{xCv3fqFYM^Pbs5h(4aK(>;_iiUjq1Xo{{Dcv*V z?R;FuSFs@s|6GK<0vtE}r&s7gT23=V!}%|zu9Ad`{TNF2-wYpikRfN;tgI3VX+;8J zPLnWa7~*myM2xJk3|T?hSb|@g<&|a=+>!*dC{a$A3{8|3BuZ&eGQC(|^j}n{uiX(n zM*Gi|Ut}uyuRxi}3+2w_gz};}(af2Qu}I_RlXOBBCRmDXW@UDm)lSnLEAjJLQj$w6 zX-fQgC+ou{_3xZD9-84y6aViagb8>Z-rha*pPGh~Fa?{T42R+Col%#urJm8G9cp1h zOKF?6vUXUj9j41Vbpids?rae^@lQQzIygQqbCb~<;MbZbb`!2!AS$mKrivRI5r56S z|M?SIFLdx{!hRL-I?Y9*s(YA_V%o)%ssI20%-e48 literal 0 HcmV?d00001 diff --git a/site/fonts/montserrat-latin-700-aspect.woff2 b/site/fonts/montserrat-latin-700-aspect.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9c95a9c464a025c2d0d817f7bc82af49261f8cac GIT binary patch literal 18912 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 Raum und Linie + + - @@ -21,9 +18,9 @@
-

Hier entsteht eine neue Seite.

+

🚧 Hier entsteht eine neue Seite.

- Der schnellste Weg zu mir: + 📬 Der schnellste Weg zu mir: mail@raum-und-linie.de.

diff --git a/site/style/base.css b/site/style/base.css index 96ef032..33a82ff 100644 --- a/site/style/base.css +++ b/site/style/base.css @@ -1,5 +1,48 @@ -:root{ - --color-background: #faf9f7; - --font-body: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; +@font-face { + font-family: "Montserrat"; + font-style: normal; + font-weight: 400; /* 400 = Regular */ + font-display: swap; /* show the fallback first, swap in later */ + src: url("../fonts/montserrat-latin-400-aspect.woff2") format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, + U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, + U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } +@font-face { + font-family: "Montserrat"; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url("../fonts/montserrat-latin-700-aspect.woff2") format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, + U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, + U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} + +:root{ + --color-canvas: #faf9f7; + --color-banner-background: #435245; + --color-banner-text: orange; + --font-body: "Montserrat", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; +} + +body { + background-color: var(--color-canvas); + font-family: var(--font-body); + margin: 0px; +} + +header { + color: var(--color-banner-text); + background-color: var(--color-banner-background); + padding-left: 32px; + display: flex; + justify-content: center; +} + +main { + max-width: 42rem; + margin-inline: auto; + padding-inline: 1rem; +} diff --git a/tools/rescale-aspect.py b/tools/rescale-aspect.py new file mode 100644 index 0000000..aee86d0 --- /dev/null +++ b/tools/rescale-aspect.py @@ -0,0 +1,144 @@ +#!/usr/bin/env python3 +"""Generate the aspect-adjusted Montserrat webfonts used by the site. + +The design calls for the typeface to be 110% as tall and 85% as wide as +the original Montserrat. CSS cannot do this: `font-stretch` only *selects* +a width variant from a family, it never scales, and Montserrat has no +width axis (its variable build only has `wght`). So the adjustment is baked +into the font files themselves. + +Scaling a font's aspect ratio means changing the relationship between the +glyph *outlines* and the *advance widths*. If you scale the shapes but not +the advances, the browser still reserves the original width and every line +looks loosely spaced and wraps too early. So this script scales, in order: + + 1. every glyph outline coordinate (x * 0.85, y * 1.10) + 2. every composite glyph component offset (e.g. the accent on "a-umlaut") + 3. every advance width and side bearing (x * 0.85) <- affects layout + 4. every vertical metric (ascent, descent, capHeight, xHeight) (y * 1.10) + +Non-uniform scaling invalidates TrueType hinting, so the hinting programs +and the pixel-metric tables that reference the old coordinates are dropped. + +Usage: + pip install "fonttools[woff]" # or: python3 -m venv .venv && ... + python3 tools/rescale-aspect.py + +Pristine originals are cached in tools/_originals/ (git-ignored) and +downloaded from a PINNED Fontsource version, so re-running always yields +byte-identical output. The cache is disposable: delete it any time. +""" + +import sys +import urllib.request +from pathlib import Path + +try: + from fontTools.ttLib import TTFont + from fontTools.ttLib.tables.ttProgram import Program +except ImportError: + sys.exit('fontTools is missing. Install it with: pip install "fonttools[woff]"') + +# ---- design parameters ---------------------------------------------------- +SCALE_X = 0.85 # width -> 85% +SCALE_Y = 1.10 # height -> 110% + +# Only the weights the site actually uses. Each unused weight is a file +# nobody downloads, so there is no reason to ship it. +WEIGHTS = (400, 700) + +# Pinned so the output never silently changes under you. +FONTSOURCE_VERSION = "5.3.0" +CDN = f"https://cdn.jsdelivr.net/fontsource/fonts/montserrat@{FONTSOURCE_VERSION}" + +ROOT = Path(__file__).resolve().parent.parent +CACHE = ROOT / "tools" / "_originals" +OUT = ROOT / "site" / "fonts" + +# Tables whose contents are tied to the old coordinate space. +STALE_TABLES = ("hdmx", "LTSH", "VDMX", "gasp") + + +def fetch_original(weight: int) -> Path: + """Download the pristine woff2 into the cache if it isn't there yet.""" + CACHE.mkdir(parents=True, exist_ok=True) + dest = CACHE / f"montserrat-latin-{weight}-normal.woff2" + if not dest.exists(): + url = f"{CDN}/latin-{weight}-normal.woff2" + print(f" downloading {url}") + with urllib.request.urlopen(url) as response: + dest.write_bytes(response.read()) + return dest + + +def transform(src: Path, dst: Path) -> None: + font = TTFont(src) + glyf = font["glyf"] + order = font.getGlyphOrder() + + # 1 + 2. outlines and composite offsets + for name in order: + g = glyf[name] + if g.isComposite(): + # Every level's offset is scaled; nesting composes correctly + # because (0.85*a + 0.85*b) == 0.85 * (a + b). + for comp in g.components: + comp.x = round(comp.x * SCALE_X) + comp.y = round(comp.y * SCALE_Y) + elif g.numberOfContours > 0: + # Affine-scaling every point of a quadratic outline keeps it a + # valid quadratic, so no curve conversion is needed. + coords = g.coordinates + for i in range(len(coords)): + x, y = coords[i] + coords[i] = (x * SCALE_X, y * SCALE_Y) + g.program = Program() # hinting no longer matches the coordinates + + # 3. horizontal metrics -- this is the part that makes layout reflow + hmtx = font["hmtx"] + for name in order: + advance, lsb = hmtx[name] + hmtx[name] = (round(advance * SCALE_X), round(lsb * SCALE_X)) + + # 4. vertical metrics, so the line box grows to match the taller glyphs + hhea, os2 = font["hhea"], font["OS/2"] + for table, attr in ((hhea, "ascent"), (hhea, "descent"), (hhea, "lineGap"), + (os2, "sTypoAscender"), (os2, "sTypoDescender"), + (os2, "sTypoLineGap"), (os2, "usWinAscent"), + (os2, "usWinDescent"), + (os2, "sCapHeight"), (os2, "sxHeight")): + value = getattr(table, attr, None) + if value is not None: + setattr(table, attr, round(value * SCALE_Y)) + + for table in STALE_TABLES: + if table in font: + del font[table] + + font.recalcBBoxes = True + font.save(dst) + font.close() + + +def report(path: Path) -> None: + f = TTFont(path) + cmap = f.getBestCmap() + r = f["glyf"][cmap[ord("R")]] + umlaut = f["glyf"][cmap[ord("ä")]] + print(f" {path.name} ({path.stat().st_size:,} bytes)") + print(f" 'R' advance={f['hmtx']['R'][0]:4d} capHeight={f['OS/2'].sCapHeight}" + f" xHeight={f['OS/2'].sxHeight}") + print(f" umlauts still composite: {umlaut.isComposite()}" + f" glyphs: {f['maxp'].numGlyphs}") + f.close() + + +if __name__ == "__main__": + print(f"Montserrat {FONTSOURCE_VERSION} -> height {SCALE_Y:.0%}, width {SCALE_X:.0%}\n") + OUT.mkdir(parents=True, exist_ok=True) + for weight in WEIGHTS: + original = fetch_original(weight) + target = OUT / f"montserrat-latin-{weight}-aspect.woff2" + transform(original, target) + report(target) + print("\nDone. Point your @font-face src: at the *-aspect.woff2 files.")