From 448741aad8f889a519da72871293733abcc05e17 Mon Sep 17 00:00:00 2001 From: "planetrenox@protonmail.com" Date: Thu, 22 Oct 2026 19:54:58 +0000 Subject: [PATCH] Add transparent WebP versions of the two GIFs, one gallery tile per name heart/wink.webp is the keyed-out version of heart/wink.gif. The standing cat in cat/tail.gif is now cat/wag.{webp,gif} since cat/tail.webp is a different drawing; cat/tail.gif stays so old links work but is no longer listed. Gallery images get a content hash in the query so browsers pick up changed files instead of showing cached copies. Co-Authored-By: Claude Opus 5.5 --- public/cat/wag.gif | Bin 0 -> 13986 bytes public/cat/wag.webp | Bin 0 -> 7264 bytes public/heart/wink.webp | Bin 0 -> 5106 bytes vite.config.js | 28 ++++++++++++++++------------ 4 files changed, 16 insertions(+), 12 deletions(-) create mode 100644 public/cat/wag.gif create mode 100644 public/cat/wag.webp create mode 100644 public/heart/wink.webp diff --git a/public/cat/wag.gif b/public/cat/wag.gif new file mode 100644 index 0000000000000000000000000000000000000000..d0632415f988e8a9506aea0fc83fb4b1525e77b8 GIT binary patch literal 13986 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 literal 0 HcmV?d00001 diff --git a/public/cat/wag.webp b/public/cat/wag.webp new file mode 100644 index 0000000000000000000000000000000000000000..2bb35f720ae759c4259c857837beb601d19f2286 GIT binary patch literal 7264 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 literal 0 HcmV?d00001 diff --git a/public/heart/wink.webp b/public/heart/wink.webp new file mode 100644 index 0000000000000000000000000000000000000000..67ce4a0ab0b2ab64a49ee6dc983fc62f00a1c639 GIT binary patch literal 5106 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 Ub)It~VJGvv6OwuEFUD%_uK)l5 literal 0 HcmV?d00001 diff --git a/vite.config.js b/vite.config.js index 42c4f6f..3fe7587 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,17 +1,21 @@ // fills in index.html from whatever is in public/ -// anything rendered from gen/ gets one tile with webp + gif links, older hand-made files get a tile each -import{readdirSync as rd,readFileSync as rf,existsSync as ex}from'fs' +// one tile per name: shows the .webp (or the .gif if that's all there is) and links every format +// tile images get ?v= so browsers drop old copies when a file changes, links stay clean for hotlinking +import{readdirSync as rd,readFileSync as rf}from'fs' +import{createHash}from'crypto' +const hidden=['cat/tail.gif'] // same drawing as cat/wag.gif, kept so old links still work const walk=d=>rd(d,{withFileTypes:true}).flatMap(e=>e.isDirectory()?walk(`${d}/${e.name}`):`${d}/${e.name}`) -const dims=f=>{const b=rf(f);return f.endsWith('.gif')?[b.readUInt16LE(6),b.readUInt16LE(8)]:[b.readUIntLE(24,3)+1,b.readUIntLE(27,3)+1]} +const dims=(b,x)=>x=='gif'?[b.readUInt16LE(6),b.readUInt16LE(8)]:[b.readUIntLE(24,3)+1,b.readUIntLE(27,3)+1] const gallery=()=>{ - const seen=new Set - return walk('public').filter(f=>/\.(webp|gif)$/.test(f)).sort().map(f=>{ - const id=f.slice(7).replace(/\.\w+$/,''),g=ex(`gen/${id}.js`) - if(g&&seen.has(id))return'' - seen.add(id) - const src=g?`/${id}.webp`:f.slice(6),[w,h]=dims('public'+src) - const links=(g?['webp','gif']:[f.split('.').pop()]).map(x=>`${x}`).join(' ') - return`
${id.replace('/',' ')}
${links}
` - }).filter(Boolean).join('\n') + const g={} + for(const f of walk('public').filter(f=>/\.(webp|gif)$/.test(f)).sort()){ + const p=f.slice(7),x=p.split('.').pop() + if(!hidden.includes(p))(g[p.slice(0,-x.length-1)]??={})[x]=f + } + return Object.entries(g).map(([id,fm])=>{ + const x=fm.webp?'webp':'gif',b=rf(fm[x]),[w,h]=dims(b,x),v=createHash('md5').update(b).digest('hex').slice(0,8) + const links=['webp','gif'].filter(k=>fm[k]).map(k=>`${k}`).join(' ') + return`
${id.replace('/',' ')}
${links}
` + }).join('\n') } export default{plugins:[{name:'gallery',transformIndexHtml:h=>h.replace('',gallery())}]}