From 17527bab43b026ca52890e710761e7589cdd2411 Mon Sep 17 00:00:00 2001 From: bach Date: Tue, 20 Oct 2026 18:07:21 +0200 Subject: [PATCH] favicon --- web/themes/custom/leshed/apple-touch-icon.png | Bin 0 -> 5508 bytes .../custom/leshed/assets/img/favicon-gen.py | 42 ++++++++++++++++++ web/themes/custom/leshed/favicon.ico | Bin 0 -> 15086 bytes web/themes/custom/leshed/favicon.svg | 1 + web/themes/custom/leshed/leshed.theme | 11 +++++ 5 files changed, 54 insertions(+) create mode 100644 web/themes/custom/leshed/apple-touch-icon.png create mode 100644 web/themes/custom/leshed/assets/img/favicon-gen.py create mode 100644 web/themes/custom/leshed/favicon.ico create mode 100644 web/themes/custom/leshed/favicon.svg diff --git a/web/themes/custom/leshed/apple-touch-icon.png b/web/themes/custom/leshed/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..39fc178e2279f17fecf573403abf07c73e1f4ce7 GIT binary patch literal 5508 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""" +import sys, os +from fontTools.ttLib import TTFont +from fontTools.varLib.instancer import instantiateVariableFont +from fontTools.pens.svgPathPen import SVGPathPen +from fontTools.pens.boundsPen import BoundsPen +F = os.path.join(os.path.dirname(os.path.abspath(__file__)), "../fonts/epilogue/") +UP, IT = "Epilogue-VariableFont_wght.ttf", "Epilogue-Italic-VariableFont_wght.ttf" + +def glyph(font, ch, w): + f = instantiateVariableFont(TTFont(F + font), {"wght": w}) + gs = f.getGlyphSet(); name = f.getBestCmap()[ord(ch)] + p = SVGPathPen(gs); gs[name].draw(p) + b = BoundsPen(gs); gs[name].draw(b) + return p.getCommands(), b.bounds + +def make(out, letters, gap=40): + parts, x = [], None + for font, ch, w in letters: + d, b = glyph(font, ch, w) + dx = -b[0] if x is None else x + gap - b[0] + parts.append((d, dx, b)); x = dx + b[2] + x0 = 0; W = x + y0 = min(b[1] for _, _, b in parts); y1 = max(b[3] for _, _, b in parts); H = y1 - y0 + S, pad = 1000, 140; sc = (S - 2 * pad) / max(W, H) + tx = pad + ((S - 2 * pad) - W * sc) / 2 + ty = pad + ((S - 2 * pad) - H * sc) / 2 + y1 * sc + paths = "".join(f'' for d, dx, _ in parts) + open(out, "w").write( + f'' + f'' + f'{paths}') + +o = sys.argv[1] +# S italique très gras, h droit fin (contraste du logo « Le Shed »). +make(o + "/favicon.svg", [(IT, "S", 900), (UP, "h", 100)]) # 180 px et plus +make(o + "/favicon-tab.svg", [(IT, "S", 900), (UP, "h", 300)]) # onglets +make(o + "/favicon-small.svg", [(IT, "S", 900), (UP, "h", 400)]) # ico 16/32 +# variante inverse, pour comparaison +make(o + "/alt.svg", [(IT, "S", 100), (UP, "h", 900)]) +make(o + "/alt-small.svg", [(IT, "S", 400), (UP, "h", 900)]) diff --git a/web/themes/custom/leshed/favicon.ico b/web/themes/custom/leshed/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..84483abeb74cd9c30ad4d83c1b2fbcffa8da3b11 GIT binary patch literal 15086 zcmeHNd2EeY6#r z5)!5wTP!6+Y>A}{f|h9zgj%Ato;kl;=bQU|@B3cg>%4x?lR3$GcR%NM@4Me!&bfwB z$A~f#6AcdA7&D^{qqkugZQ4|&|K$AboY%GM*K~?u{QQGq{K$2hYzY8Sf);$N{0>|qOoJg(#n-9 z&2|#`^5qLPY0^aLe)8lAoj7rVdi3Z)lP6DB_)ncWMGF@$r0v_cn^>f+gsWDqQu-S= zZcK4;aVkDx!URkIrLJ3e?AS4yHf9zB{?tXM&>U%w8jy_4MX@^Yta$$Ku58ibg? zf7GCzG{JWp|5ZjXI8YbgZJd2Q2sVv%rVaB?%vhfkVc~Hh)|tfoD{~=p1#_qgG7FfO zFD!o>!>8p)-u89v# z^ySN!u4{8>G+3oz&)KzWm)fVIqodV&kA1Us>((@7$`m?({=BsTr?7Woe|4h5!a}v@ zY}$lnv3i;~aiY?R&(n=FGc)Pq$B(A4MvWR#pFVxev>v&1>5`JOWXTde+cAFp_;FXA zb}X}J&o*U*NY>;Vdu{ueJ^(3LA!Ovbqgg!7iuyx6~gzbX%vekDx%xqkgRjT<+PqN1WK z{l@q=Y}k;VJ*ztELVvGby|kA9M$er)r`iTG|D@Hsckk4+pda-XELcD|a|%^dRH*L~ zWoOTxm2AHu`XK9$=*C$&J3E`O7CI61<2;P7EV!Ix zNFK&s^diK6|KPy`DW*Mp_NY4n?gik32M?O_|LD=9)U#(#vpw!CIBQpPRyAcyL~uht z`h@$35YFB@KCFf4zrOyxdi9F#-@mW!InpkeaLbl079Ch?Fu%dNZp1OK?fQe!@eQJ%q1G>$@a?3eq&VW}-n~0rzI<6#tu6f!j_xU?JjQ<(#KDd9Cg#iQZn@PN$;0~DPF$U=F0^LHKPGz4?X_wG1W#j|n>SSvTwyY$7!>m`yuHJ5E$X+>co1Uzq=5e#l&9 z6yr!32)cm*Sb!R_Q(i8|>5v&d*}5nK9Sf-U8zcy$_tmxJLqZ87W{@ z{{x3H%=e@qf878O_dj)a#XY%q@7}a@=~99{)E|u+HA?v+moLXr z(Lcc!48J9~I=TKN!4KK8WlP6>K{DOBw8R@G0x$CH~UVQrB^Z-EQ#U z!OAxd+nC*^D1B(xuARld;wApmr%$`$hh0&pJ9q97`~iYn4>1RYyu=UtmySc?uvzN< z8Nmiyy42A__&tQY#Q*l~TV=1sn+QAGZQKO~1q8dhj$7jM=g$}T$_|fwuht(^u}cJR zV-_u1r2G|v*B-82yVh*&<@lRQ9U}1gz`l-k(vDY8W3Jt}al@1l41V~JL{?4Le^c?- z2;Td^SLNh05?y*YckWz^2*E#a;6O{hQ)0u04JLlfTUYsl z;4jum@WWSBolO`%RFRAC>%UNLZY}|n$a4!(2k(%sUAyL}PVl2Wd`NBtpH8!8&6K`` zgapeT;?~Arey2{I{9=a>X40fd1b@0e(($7Yn2Yd{=!AU}J~0_1`yABk1`@~rEVAq& z-tNtrGl!rv5EA@256b_EZye_oyanvov7?y}U3i!9{CP0Xtb9?xk88&*Y2D8%EqCtR zNt-us_F=rS6Z}~J&zw1<-noe^dk7zr{l5_%!Gt)+IeoXtLz$g0hITAS!?&s9M?1Vx zJbd`D@~NUvcoTs6l9!jK-Z9!`*EBtHPx2?@M)?dt1 zCtRI7cc$^<$19({+Zhh+_U+pjHvAZytgI|Y{7!wc=izPWV4_PoDb_iT=|P#vRM&6}(d!!W?P->vUijV*E2Bqz@S9EWxdZoR9w@ zu*)o03 \ No newline at end of file diff --git a/web/themes/custom/leshed/leshed.theme b/web/themes/custom/leshed/leshed.theme index a6008ac..60235ec 100644 --- a/web/themes/custom/leshed/leshed.theme +++ b/web/themes/custom/leshed/leshed.theme @@ -42,6 +42,17 @@ function leshed_page_attachments_alter(&$page) { ]; } } + + // favicon.ico (racine du thème) est servi par Drupal ; on ajoute la version + // SVG, prioritaire pour les navigateurs qui la gèrent, et l'icône iOS. + $theme_path = base_path() . \Drupal::service('extension.list.theme')->getPath('leshed') . '/'; + $icons = [ + 'leshed_favicon_svg' => ['rel' => 'icon', 'href' => $theme_path . 'favicon.svg', 'type' => 'image/svg+xml'], + 'leshed_apple_touch_icon' => ['rel' => 'apple-touch-icon', 'href' => $theme_path . 'apple-touch-icon.png'], + ]; + foreach ($icons as $key => $attributes) { + $page['#attached']['html_head'][] = [['#tag' => 'link', '#attributes' => $attributes], $key]; + } } /** * Implements hook_preprocess_HOOK() for html.html.twig.