From 85f8730b60ae527760cb66a5b0ac85be2f16578f Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Sun, 14 Jun 2026 08:59:04 -0400 Subject: [PATCH] Add favicon assets - Contributes to google/docsy#2357 - Adds `favicon.svg`, `favicon.ico`, and `apple-touch-icon.png` under `static/` so the Docsy theme's default favicons partial discovers and links them; the example lost its favicon when google/docsy#2653 dropped the theme's bundled defaults - Reuses docsy.dev's favicon assets verbatim -- all three files are byte-identical to docsy.dev's so the example provably uses the same Docsy-logo artwork it already shows in its navbar - Bumps the Docsy theme module to a commit that includes the discovery partial (google/docsy#2654) - Adds `tests/favicons.test.mjs` asserting the three discovered ``s render in the built home page --- go.mod | 2 +- go.sum | 4 ++-- static/apple-touch-icon.png | Bin 0 -> 4361 bytes static/favicon.ico | Bin 0 -> 15086 bytes static/favicon.svg | 17 ++++++++++++++++ tests/favicons.test.mjs | 38 ++++++++++++++++++++++++++++++++++++ 6 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 static/apple-touch-icon.png create mode 100644 static/favicon.ico create mode 100644 static/favicon.svg create mode 100644 tests/favicons.test.mjs diff --git a/go.mod b/go.mod index 2e99b518bd..673eaf706b 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,4 @@ module github.com/google/docsy-example go 1.12 -require github.com/google/docsy/theme v0.0.0-20260612162003-f22a352d4262 // indirect +require github.com/google/docsy/theme v0.0.0-20260614124843-f516706840c3 // indirect diff --git a/go.sum b/go.sum index 890e9219d4..6ec45ab704 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,6 @@ github.com/FortAwesome/Font-Awesome v0.0.0-20241216213156-af620534bfc3 h1:/iluJkJiyTAdnqrw3Yi9rH2HNHhrrtCmj8VJe7I6o3w= github.com/FortAwesome/Font-Awesome v0.0.0-20241216213156-af620534bfc3/go.mod h1:IUgezN/MFpCDIlFezw3L8j83oeiIuYoj28Miwr/KUYo= -github.com/google/docsy/theme v0.0.0-20260612162003-f22a352d4262 h1:DGXSMc4p24g6M1S4cQ43pRdHfUGdlMRjlraSijTABcw= -github.com/google/docsy/theme v0.0.0-20260612162003-f22a352d4262/go.mod h1:CGCFFJjc3PAYexPDsQqTbB3/lWnncwlwKLnSQkDaaF0= +github.com/google/docsy/theme v0.0.0-20260614124843-f516706840c3 h1:5iDfW1iwC8gZ3caayHWOyukUG4C7MLb1aL1l+vBP2yc= +github.com/google/docsy/theme v0.0.0-20260614124843-f516706840c3/go.mod h1:CGCFFJjc3PAYexPDsQqTbB3/lWnncwlwKLnSQkDaaF0= github.com/twbs/bootstrap v5.3.8+incompatible h1:eK1fsXP7R/FWFt+sSNmmvUH9usPocf240nWVw7Dh02o= github.com/twbs/bootstrap v5.3.8+incompatible/go.mod h1:fZTSrkpSf0/HkL0IIJzvVspTt1r9zuf7XlZau8kpcY0= diff --git a/static/apple-touch-icon.png b/static/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4f4f9da2128402651b727c23078811dda90e3d55 GIT binary patch literal 4361 zcmcIoX*d+_*H)IKED_0?rHr2~jD5+zM#wg{!H5xKOAUh&LY55K_pzpkEGc`)HqvOw z2xA>t8%r3Bb>HVa*L9x+3v)weCLSgl8X9I}BRwnX z+4S#XWT5UEBMfphG;E{BdfL_@Q-27cfa`GNmz}MywiR4*dD>{V5X*&&l8_Jec;2OH z?)S8c@ztCA6Sj-vwu&DeLyeYiXJ!+HSVN6&XPVi(DGqLd)K&H2@VI`5}Lb?KOhEh?;brktcMaOj&uViNzIlh_kWN;+qv8Cm0tv;_$SL zJFwU2*gB)p9y?L!f&_chHs@uB!$dl%aQ$emPGRjU;I#jyxxQUs-c~uKcYgjB1Oib` zS=v`Fk~d3-0!@U|(C^-1HUiac0=3_ac^_>4>K#fK8(Iz;RD1l~jXS5(ST47`qoXiW z!j3(uuU%l6gOfA3#KIL{>m0t_eTf7!5w9EAogoVD4-PUqJ3E(KiBHrzn~JjUAey$E z^yvw6bJ({J-#oV(bnpQMIrZH&VNGD+SJeaZRFsv`4!^4c@4%|7&ZmP_%`}VQkRmm> z^poG;E}t}r>zp@rJ>kmVNhZ^quQ0gbbvFYRtlQq7QQ8 z;usYDW{gZtucR!YGu*?&3t-dDfyaB^bpvfnqENv+%?MRqMPGDF%db}m504j8j?Dq2 z85OFvOcYw2C-23wfvC_Swt27%DlXOD{p)t!ZqD`@HnbzR>pOtaeswo+2j5w%nzo^DK}8HvtRwY9bVYVzjDmH{6i+WiaZ_-Tf-q#z@C z3SZr2mDZ_`HiZ85jEj%&5ZH3Ot$pe1DR~Y%_TZiw;Cc{#+zVUui0WQGM$MZtVKjQ7 zB*UGGl==}d-9BsCAYzwj-0Vld93Fngiy$RLS7~I;(#48Gq74Nju8#qutX2n5f?m_j zFpox1onbqSJ@|`#R^L0D>X6lv_{z;Kr{Dwi_lGNmax&2$kO;$Prxb~2#VvIFt_gb4 z`y2SikR5ljw!3EW%81e&alSi-vnAg$n&q>H+))23UeE{E?hM!)wP&02t3S$IP~=y} zqtVC52r5~tnv|7w*qaq>F_{XKUNjdCP(h(ZZSPK*d4(0{CzL}pS8Y}nS5d?PXmRIr z8m_PttD3cM0z#6sArVMTsle4tj0sbKz(7~elEA=$%-6o3TR+xNQfBE zy

!mb@%H1E-W^K@PVMkd2dONsf6Cp@jn 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 Lxn8Y~YxI8r0*Qu5 literal 0 HcmV?d00001 diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8a714844c6a65ba7d1cf67db8e36a5117dd8f5e7 GIT binary patch literal 15086 zcmeHOZBSF$8NPmYyB{6fnNIts9cO1d(;quif7JfypZ1UKblYyHJG0Zy?6~d>e(_PP zA|QU?R$&VTq@d7M5yZ79%7=oWA`nIc3IP&?kniN?>3d@0asvqo+}vHe zyv#Ev=jNXGea?GN&Ux>94ji|FTg9zg$5FYS+qs(Ke!+3v`t{H27wLLFUE8q1UH=Kk z{pR}|_fxuuzM>Y-uT#Nsbe}JYi;Lreg+~`_$K>9P%pmr-fHkl6gnYFL1tjyQz^{`mXuo7(Ul6_{^3wP5?(%G<{o*;wfegn*tV{q_+*tg-)gJIm2^+Gc`qm(389RPjMxeb3;#}6=N*3)6%}Wu zrlw#rnOra$jbLDPwOY*=7Z;~)+O+AFUAuP8+dexx`}dbGU;d=Dv^2>J$@%&D;oG)t zdp#i`f!n`-KXu_t@r=c*SFdt3{^tGtG&eVM`}XbQ4jnoqun!x5Km#~RvS-$oj2xPo0=AJ-1&UDAe$FHT|)7udd z5gQ3VUnDk0M@MfUeXlZ|feO1fCMM>WwC)Vkx-(6fS`27inm&2*q>l9ch58eydDrii z`u+~h$#&sP6@0Cwr3GX^ip>#$3hO`F{~fJq*5EA)Te$5 zWVVQ9-%877<**fJ6-MZS7!_jKH`$CR>9~MX%{fr&6tLJWFx$;S*i5iFLeu}Q(T7N> zOG19jX~bXKgUrT%;aGzZ>9Q15_f*13e;yI5|60QYPTa{ts_YXqDr6XVrh;lx>4m45 zFpPUlyGpU_Gi7RJC;A^Y!s!TnS`y3tj9Q7#b1CTjEEWCN&ta5ePc_A$0<_j+O7%D- z{ePzHMn~a4(S0c!9mJ!rx)6O;X9eiJR)De2J0Y>pe6DV9g7Wh!*iCwY4SyA}{69_a zJh^AJNX{BVPoKpVN6*lF>`xv>f*08LrPrPb z+#!~I&A1K!NLM44Y}DP>Lp5ZDa!`n;0~So^gue~BT+Y^CQPw}^Yuz)UenDrwDpso% zB_$=MJ$v^2VG;4ilGcB_-Ok>r?etFbab#rVS{73TDoc$&czPeLudnA19z2*H78dpj z#d7n$8~Nhnw*L;jQ`((Qr|bQcy(0$#*6*gKCL|^%p4`5D`|H8lW}KLPYPT^nGxKp# zQIVQ35-8|BcI3#BBl+Rs;otSx4#xK$`xLLOii(Q*G4aXtJz5B&`r!PPI zy3Y8D1z$FnuYWx}Fnh|PnN8{7xL=8kEu>H8;8q-Va4SLCqS+?F@)VRJz_JIvQ63O$%~_0|r8?TnCfmo50x#BSk@&Oyn=O0y?k$x7lOgx&d;R}DfzSUY@;zG*U>qFQ5z;KfsAnf_ejnEnQ0Pboy9oa zd;$+f+WeCX;9DvA^G+UT?w!J}@^BojNpzL6{yKE3AD~0s?h_A2+R;7s2v*134I3%> zn`mF=Ky@5GYd!1QuZSq!hONaPBBFFF!b^N(XGxf=9XsRVEmHDlIl%w6okJw?-ghkq zF%{8t{-y;_X&*|V?e~j;Nfqq;+?=hH{F(0zRs(AKZsOvDBJ@u5db=~|y43u6s|DIe zEl{`A!lD}sny+^QN%_^q3c2>$|r|$)BBh z+#WN4)Ds%l-sK-R_haiG6`~Ie`bAX2Ad)gip{KJi-XbM`lbLt%j6XVz!eTAnCH{xg z)HwF31{weH4YpTYa6wDs?W>(XneSR?|9Z#X0sM8xQ=C3O0V|E0rHGXN_wZzA0LHcK zyshWT;!8U34cea_q@2^6FI)acp-><-HPu4-zF68fe9~v4$Mn;B%{CFJ* z_q@D3(0IQX8yovQvAKKvPx{}W{P~@Nf&$Q)chLWOED1~p1M@rat|a_06x==h*%^M) z|66*-X>{f$T`Z8kc+&f$P;vM0pRGTXpT!vO^XUjBXQq2umOZfSfp4Y + + + + + + + + + + + + diff --git a/tests/favicons.test.mjs b/tests/favicons.test.mjs new file mode 100644 index 0000000000..9ed06d07a7 --- /dev/null +++ b/tests/favicons.test.mjs @@ -0,0 +1,38 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { readFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; + +// Verifies that the Docsy theme's default favicons partial discovers and links +// the icon files this site ships in `static/`. Assumes the site has been built +// (`npm run build`); in the `test-only` chain, the check:links prebuild takes +// care of that. + +const home = readFileSync( + fileURLToPath(new URL('../public/index.html', import.meta.url)), + 'utf8', +); + +function head(html) { + return html.match(/]*>([\s\S]*?)<\/head>/i)?.[1] ?? ''; +} + +test('the home page links the favicons supplied in static/', (t) => { + const h = head(home); + assert.match( + h, + //, + 'links favicon.ico', + ); + assert.match( + h, + //, + 'links favicon.svg', + ); + assert.match( + h, + //, + 'links apple-touch-icon.png', + ); + t.diagnostic('all three discovered favicon links present'); +});