From ee1653e8f964080d2c77e42e13ebe65601223c27 Mon Sep 17 00:00:00 2001 From: Thomas Pinder Date: Thu, 1 Oct 2026 12:22:37 +0200 Subject: [PATCH] docs: add the Impulso favicon The theme links an SVG favicon (an impulse response with its credible bands on a brand-oxblood tile) from every page. favicon.ico and the iOS apple-touch-icon.png, both rendered from the SVG, go to the site root through html_extra_path, next to _redirects and _headers. docs/conf.py records how to regenerate them. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_015fagcMeo1LmLG2Dg3NybmQ --- docs/_brand/apple-touch-icon.png | Bin 0 -> 7365 bytes docs/_brand/favicon.ico | Bin 0 -> 15086 bytes docs/_brand/favicon.svg | 20 ++++++++++++++++++++ docs/conf.py | 11 ++++++++++- 4 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 docs/_brand/apple-touch-icon.png create mode 100644 docs/_brand/favicon.ico create mode 100644 docs/_brand/favicon.svg diff --git a/docs/_brand/apple-touch-icon.png b/docs/_brand/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b360cfbe5673161056782fc20ca4dd49376598e5 GIT binary patch literal 7365 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 F{{!L1A-Mnm literal 0 HcmV?d00001 diff --git a/docs/_brand/favicon.ico b/docs/_brand/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..49c63573e2fdfd9b16116f5b9478474afd3a3153 GIT binary patch literal 15086 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 literal 0 HcmV?d00001 diff --git a/docs/_brand/favicon.svg b/docs/_brand/favicon.svg new file mode 100644 index 0000000..f0f06b0 --- /dev/null +++ b/docs/_brand/favicon.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + diff --git a/docs/conf.py b/docs/conf.py index adb43f0..e1b37bf 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -168,9 +168,18 @@ ogp_social_cards = {"enable": False} html_static_path = ["stylesheets"] html_css_files = ["extra.css"] +# The theme links the SVG favicon from every page. The ICO and the iOS +# home-screen icon go to the site root, where browsers look for them by +# default. Both are rendered from the SVG; after editing it, regenerate them: +# cd docs/_brand +# for s in 16 32 48; do rsvg-convert -w $s -h $s favicon.svg -o /tmp/f$s.png; done +# magick /tmp/f16.png /tmp/f32.png /tmp/f48.png favicon.ico +# sed 's/ rx="7"//g' favicon.svg | rsvg-convert -w 180 -h 180 -o apple-touch-icon.png +# (The apple-touch-icon is square-cornered because iOS applies its own mask.) +html_favicon = "_brand/favicon.svg" # Cloudflare serves the site; _redirects maps directory URLs to index.html and # _headers adds the CORS header that GitHub Pages used to send. -html_extra_path = ["_redirects", "_headers"] +html_extra_path = ["_redirects", "_headers", "_brand/favicon.ico", "_brand/apple-touch-icon.png"] html_theme_options = { "accent_color": "crimson", # names the token family; stylesheets/extra.css re-tones the crimson scale to ledger oxblood "color_mode": "auto", # follow the reader's light/dark preference