From 088d76441c6376d918c7e6c46be0f1f986c563f1 Mon Sep 17 00:00:00 2001 From: cgasser Date: Fri, 22 May 2026 12:11:01 +0200 Subject: [PATCH] Add favicon: M monogram on green background SVG master + PNG exports at 16x16, 32x32 and 180x180 (Apple touch icon). Generated via puppeteer from favicon.svg. Wired into and Dockerfile. Co-Authored-By: Claude Sonnet 4.6 --- Dockerfile | 1 + apple-touch-icon.png | Bin 0 -> 2449 bytes favicon-16x16.png | Bin 0 -> 337 bytes favicon-32x32.png | Bin 0 -> 564 bytes favicon.svg | 6 ++++++ generate-favicons.js | 40 ++++++++++++++++++++++++++++++++++++++++ index.html | 4 ++++ 7 files changed, 51 insertions(+) create mode 100644 apple-touch-icon.png create mode 100644 favicon-16x16.png create mode 100644 favicon-32x32.png create mode 100644 favicon.svg create mode 100644 generate-favicons.js diff --git a/Dockerfile b/Dockerfile index 7568757..f96a64a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,5 +4,6 @@ COPY nginx.conf /etc/nginx/conf.d/default.conf COPY index.html /usr/share/nginx/html/ COPY marszalek-architekten-infosheet.pdf /usr/share/nginx/html/ COPY images/ /usr/share/nginx/html/images/ +COPY favicon.svg favicon-16x16.png favicon-32x32.png apple-touch-icon.png /usr/share/nginx/html/ EXPOSE 80 diff --git a/apple-touch-icon.png b/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f74420245da41e2712c727b184dfbd42dc6aa233 GIT binary patch literal 2449 zcmb`J*IN@<6Ndu{NraFDrT4Z9l0|xpgwO@41`SOxf`ZbEbQc1K1(6o13QHDbgAI^` z5>TW{6{AFYN2CX&Dd5V6i|;@9F3y>G&Uxnf&Af9llj>k+$%FNg)s%UM})?etdAY}9CwaySi=ML_qtt`19Mg2M|RV8xn(y5=$ z%7Nk`H-cw-a~nec4*Bhg1g}c-NoQX46-82lTsN=jDXVJ>V8^WHMZ>}2n;v(oigm-- z;RB2#PmQ`;(|*1E)9CO06Pm^M$R$x#X@(7aJYu&C-VzHJEPp7*H5&b-)MK3-5e<@Y3zDuxr4>X0j0wLzGY&i1V! zbL^aGN72H!`~(anx$sfFY0Vii)b^aM<BaWlDa%tB+dL>s29 z#r$`lmnz1(0yhVa_AylW)y0}jn*#7*P-`f z13$PJkn!n26;+@Df)v2RF~gdF0LIMr%6Dmh?f0(qlBmwIXJ5HOg$wQ5tjz};8!Ht& z4Iv13SO9p#xAs1jd;C4)5zqBILwv3By2QMve?DMoNeB7p;y>r~m%GSjbd76p<1I^g z=AzD5riSPiO@5W?xa2JpT~x~8(;AM>nSY8zh3e0G6C2b&l=v6ei`XpWu;Ja`uu^-sCjtnnKHcr=cdr5V!RFZ=aOO524{J zJf$DuY-_U1kF49&h6OnLELp$p>6Ed}`g9R1E7z4+@ol4aFW3f0%!B;=ock%IJftTy zqT~Q5RHh-cwAk+ZZGd`2$#630)HZ1FnZEnrYHS`Mm7(0V)^s$4;s1xJT;JAQJ~KquT5~?VPFMXkWoZX-l734d$SAIv@ar0QMO%hxqtyk^I#K17B9$#w=8AkW@ zI`$68{B&P8svf#w^`ZeYU`5aeQlIez`1_cHY)z7z{T4CMl&UAfUbVt7udARtM_XT} z5!vIuM`87%x%Zb=cI{d806zWh#GJ@Y4fEyD>c;rRc_%1A7(2r;+!X9qN z4kNu37na-+z^h3X3RnRS9?_*oTH;(FK4U3ZxUG0PAQ8te1*0c6M(#L6R|u3`mKcHI zVTu60d~*A^gN>rT=9hWRD(`UMsEF5Ny$d*OdVB5U8iI}BV1q=BC%>oIeYjLn}vsDQ$XXrcp#=aB%>0Cv>i5dpn$h9^V z2nS9ARL6qgi_9;)K-)^S|EIY?$v6JeUIRMdN{Ne-B{n1EW!QbRb@sjW8%pFw`L3vH z-IA%%*UN>0IbIBvfmg3JQ(?Lv+c8SLNAJ2LFeBqYT$hG7W3ZK}!Px{dp=WC)J(nh1^ZSQj>7`WVB0x6bx!3^E@VhwMr{#PKjJ#%@ys%wc zE9sIfW9;pq-sDI8EA~`Ggb#c&7f>9 z^5vejmf@kdzHI&?gbX~XViNwHW*{rEyHbV^M#bp?O7~o#3fn&I&DjAvl?rKkQfIpn zSk}om(*GNw?ZPj9Nr+%sa6So=i~ksIL}pB%`p?UVD3(^4lBw19@TNzkm=Vc7GND5M zVyL#4Gnbyta^=P^#Kil@=U4@~FVJ}uo|nu^ttThcACv`@F>)3*PfG2-k~M@L(rGHH$jKHjK+0PnMc#-gc# Ro}3qemARc+rOCC#{{Vzll-mFR literal 0 HcmV?d00001 diff --git a/favicon-16x16.png b/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..22f0160e43466d20f49342294563dd853197235f GIT binary patch literal 337 zcmV-X0j~auP)pV#M-Qx*-M;c zv&otB{pX*vdm^JXnJav=}q(bCW?py-6SGjSe#YFCeT*zeCFxpCYFUMw+Pcj)#wnO7o^G zBkf1WRqU>C5Ly6%S@`{#o&tU_g3+HLmg#(Ag`gd!Wx`5kveqsLY=bro_6-04|Nl8+ jWKsYC00v1!K~w_(`EhEZzx8p=00000NkvXXu0mjf$H$O} literal 0 HcmV?d00001 diff --git a/favicon-32x32.png b/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..b4985b220ab28cc4ddb25aa6d5581ad679f8f3d2 GIT binary patch literal 564 zcmV-40?Yl0P)VWR%$_k4`6|%i4|JeYQ#iZpFpD(l>`$Xz!DQ<^bN$ygc1rLKocp% z&cYb~#DMz|7KZb@+ub|PhF^8Z?e2Ut`|Xl(NKj~#JzuAzHqn-NP0?^^SVR|389FRj z)UptKu1>e&!!pH7wV9!nvD`Wp#Y>LjCpF!q38!239xu=Kz^LSGi^AZy9%4Jh_8fzY z+fxIBcTe7oMYz`k2j{PRy_6laz|Gk>nR0nN892rc8c@4V(8HZWx?qmVyg&g!B@;K5 zvRdVo1a!8dtiBaGRr3{)Ui|JaT1otJ^j}=DiY={uk+Fao;nt14_s+AbA$f2)*H{2p z5LJ+s2r4bUVGO{WpzM_d;LNV(KYQagR$H{p#^~KPCp|r zFYvwRVw%vGR=;w4q6qEcx7smy|DmpNT6#xj{g5_7Z_3o)iquu0ubD^?2!lnCZ=;^ zKP(iVkJp<6|WFt%=w+x>WI8rTD2Lwv84UU8+!1 z5Fq0000 + + + + + diff --git a/generate-favicons.js b/generate-favicons.js new file mode 100644 index 0000000..f66eb64 --- /dev/null +++ b/generate-favicons.js @@ -0,0 +1,40 @@ +const puppeteer = require('puppeteer-core'); +const path = require('path'); +const fs = require('fs'); + +const CHROME = 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe'; +const SVG = fs.readFileSync(path.join(__dirname, 'favicon.svg'), 'utf8'); + +const sizes = [ + { name: 'favicon-16x16.png', px: 16 }, + { name: 'favicon-32x32.png', px: 32 }, + { name: 'apple-touch-icon.png', px: 180 }, +]; + +(async () => { + const browser = await puppeteer.launch({ + executablePath: CHROME, + headless: 'new', + args: ['--no-sandbox'], + }); + + const page = await browser.newPage(); + + for (const { name, px } of sizes) { + await page.setViewport({ width: px, height: px, deviceScaleFactor: 1 }); + await page.setContent(` + + +`); + await page.waitForNetworkIdle(); + const out = path.join(__dirname, name); + await page.screenshot({ path: out, clip: { x: 0, y: 0, width: px, height: px }, omitBackground: true }); + console.log(`OK ${name} (${px}x${px})`); + } + + await browser.close(); +})(); diff --git a/index.html b/index.html index d56deca..26aef71 100644 --- a/index.html +++ b/index.html @@ -4,6 +4,10 @@ + + + + Marszalek Architekten · Perchtoldsdorf