fix(build): serve favicon + all res/ icons at their referenced /public paths

The static-copy step landed the android icons at dist/public/android/ (stripBase
dropped the res/ segment), never copied public/res/apple/ or public/favicon.ico at
all, and the manifest pointed at /res/android/ — so every PWA icon, apple-touch
icon, og:image, and the favicon 404'd on the live server.

Copy all of public/res -> dist/public/res and public/favicon.ico -> dist/public/,
and point manifest.json icons at ./public/res/android/ — matching the /public/res
and /public/favicon.ico paths index.html already uses. Verified in dist/.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-07 20:28:40 -04:00
parent 45afc9ba7e
commit 4236621c7a
2 changed files with 23 additions and 14 deletions
+12 -12
View File
@@ -11,58 +11,58 @@
"theme_color": "#980000", "theme_color": "#980000",
"icons": [ "icons": [
{ {
"src": "./res/android/android-chrome-36x36.png", "src": "./public/res/android/android-chrome-36x36.png",
"sizes": "36x36", "sizes": "36x36",
"type": "image/png" "type": "image/png"
}, },
{ {
"src": "./res/android/android-chrome-48x48.png", "src": "./public/res/android/android-chrome-48x48.png",
"sizes": "48x48", "sizes": "48x48",
"type": "image/png" "type": "image/png"
}, },
{ {
"src": "./res/android/android-chrome-72x72.png", "src": "./public/res/android/android-chrome-72x72.png",
"sizes": "72x72", "sizes": "72x72",
"type": "image/png" "type": "image/png"
}, },
{ {
"src": "./res/android/android-chrome-96x96.png", "src": "./public/res/android/android-chrome-96x96.png",
"sizes": "96x96", "sizes": "96x96",
"type": "image/png" "type": "image/png"
}, },
{ {
"src": "./res/android/android-chrome-144x144.png", "src": "./public/res/android/android-chrome-144x144.png",
"sizes": "144x144", "sizes": "144x144",
"type": "image/png" "type": "image/png"
}, },
{ {
"src": "./res/android/android-chrome-192x192.png", "src": "./public/res/android/android-chrome-192x192.png",
"sizes": "192x192", "sizes": "192x192",
"type": "image/png" "type": "image/png"
}, },
{ {
"src": "./res/android/android-chrome-256x256.png", "src": "./public/res/android/android-chrome-256x256.png",
"sizes": "256x256", "sizes": "256x256",
"type": "image/png" "type": "image/png"
}, },
{ {
"src": "./res/android/android-chrome-384x384.png", "src": "./public/res/android/android-chrome-384x384.png",
"sizes": "384x384", "sizes": "384x384",
"type": "image/png" "type": "image/png"
}, },
{ {
"src": "./res/android/android-chrome-512x512.png", "src": "./public/res/android/android-chrome-512x512.png",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png" "type": "image/png"
}, },
{ {
"src": "./res/android/maskable-192x192.png", "src": "./public/res/android/maskable-192x192.png",
"sizes": "192x192", "sizes": "192x192",
"type": "image/png", "type": "image/png",
"purpose": "maskable" "purpose": "maskable"
}, },
{ {
"src": "./res/android/maskable-512x512.png", "src": "./public/res/android/maskable-512x512.png",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png", "type": "image/png",
"purpose": "maskable" "purpose": "maskable"
@@ -77,7 +77,7 @@
"url": "/", "url": "/",
"icons": [ "icons": [
{ {
"src": "res/android/android-chrome-96x96.png", "src": "public/res/android/android-chrome-96x96.png",
"sizes": "96x96" "sizes": "96x96"
} }
] ]
+11 -2
View File
@@ -38,9 +38,18 @@ const copyFiles = {
rename: { stripBase: true }, rename: { stripBase: true },
}, },
{ {
src: 'public/res/android', // All of public/res/ (android + apple icons, logos, svg) → dist/public/res/,
// matching the /public/res/... paths used by index.html and manifest.json.
// (The old android-only target stripped `res/` and landed at /public/android/,
// so every icon 404'd — apple/ + favicon weren't copied at all.)
src: 'public/res',
dest: 'public/', dest: 'public/',
rename: { stripBase: 2 }, rename: { stripBase: 1 },
},
{
src: 'public/favicon.ico',
dest: 'public/',
rename: { stripBase: 1 },
}, },
{ {
src: 'public/locales', src: 'public/locales',