From b4ebd37cc3d1d0baf1559d6f732f63d6e9045dc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D1=82=D0=BE=D0=BD=20=D0=A2=D1=80=D0=BE=D1=88?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Sat, 22 Aug 2026 11:36:14 +0300 Subject: [PATCH] fix: unstretched PWA icons, maskable purpose, theme-aware favicon - generate-icons.py: preserve SVG aspect ratio (was stretched 1.49x), art at 80% for maskable safe zone, emit transparent cross-gold.png - manifest icons: purpose 'any maskable' - applyTheme(): compose favicon per app theme (chrome bg + gold cross) --- scripts/generate-icons.py | 48 +++++++++++++++++++++++++++--------- src/ui/app.ts | 35 ++++++++++++++++++++++++++ static/icons/cross-gold.png | Bin 0 -> 8414 bytes static/icons/icon-192.png | Bin 3049 -> 3058 bytes static/icons/icon-512.png | Bin 7353 -> 6746 bytes vite.config.ts | 4 +-- 6 files changed, 74 insertions(+), 13 deletions(-) create mode 100644 static/icons/cross-gold.png diff --git a/scripts/generate-icons.py b/scripts/generate-icons.py index 9a66c70..c0a974d 100644 --- a/scripts/generate-icons.py +++ b/scripts/generate-icons.py @@ -15,31 +15,57 @@ os.makedirs(ICONS_DIR, exist_ok=True) GOLD = (0xC5, 0xA5, 0x5A) NAVY = (0x1A, 0x1A, 0x2E) RENDER_SIZE = 2048 +ART_SCALE = 0.8 # art occupies this fraction of the canvas (maskable safe zone) -def generate_icon(size): + +def render_svg(): with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as tmp: tmp_path = tmp.name try: subprocess.run([ 'rsvg-convert', - '-w', str(RENDER_SIZE), '-h', str(RENDER_SIZE), + '--keep-aspect-ratio', SVG_PATH, '-o', tmp_path, ], check=True) - img = Image.open(tmp_path).convert('RGBA') - result = Image.new('RGBA', (size, size), NAVY + (255,)) - cross = img.resize((size, size), Image.LANCZOS) - gold_layer = Image.new('RGBA', (size, size), GOLD + (255,)) - result.paste(gold_layer, mask=cross.split()[3]) - return result + return Image.open(tmp_path).convert('RGBA') finally: os.unlink(tmp_path) + +def gold_silhouette(): + img = render_svg() + gold = Image.new('RGBA', img.size, GOLD + (255,)) + gold.putalpha(img.split()[3]) + return gold + + +def gold_art(long_side): + img = gold_silhouette() + scale = long_side / max(img.size) + return img.resize((round(img.width * scale), round(img.height * scale)), Image.LANCZOS) + + +def compose_app_icon(size): + canvas = Image.new('RGBA', (size, size), NAVY + (255,)) + art = gold_art(round(size * ART_SCALE)) + canvas.alpha_composite(art, ((size - art.width) // 2, (size - art.height) // 2)) + return canvas + + +def compose_transparent_art(size): + canvas = Image.new('RGBA', (size, size), (0, 0, 0, 0)) + art = gold_art(size) + canvas.alpha_composite(art, ((size - art.width) // 2, (size - art.height) // 2)) + return canvas + + for size in [192, 512]: - icon = generate_icon(size) out = os.path.join(ICONS_DIR, f'icon-{size}.png') - icon.save(out, 'PNG') + compose_app_icon(size).save(out, 'PNG') print(f'Saved {out} ({size}x{size})') -print('Icons generated.') +transparent_out = os.path.join(ICONS_DIR, 'cross-gold.png') +compose_transparent_art(512).save(transparent_out, 'PNG') +print(f'Saved {transparent_out} (512x512)') diff --git a/src/ui/app.ts b/src/ui/app.ts index 130f622..a35418d 100644 --- a/src/ui/app.ts +++ b/src/ui/app.ts @@ -29,12 +29,47 @@ export class App { this.applyTheme(); } + private faviconImage: HTMLImageElement | null = null; + private faviconCanvas: HTMLCanvasElement | null = null; + private applyTheme() { document.documentElement.className = 'theme-' + (this.settings.theme || 'default'); const chromeColor = getComputedStyle(document.documentElement).getPropertyValue('--clr-browser-chrome').trim(); if (chromeColor) { document.querySelector('meta[name="theme-color"]')?.setAttribute('content', chromeColor); } + this.updateFavicon(chromeColor || '#1a1a2e'); + } + + private updateFavicon(bgColor: string) { + const size = 64; + if (!this.faviconCanvas) this.faviconCanvas = document.createElement('canvas'); + const canvas = this.faviconCanvas; + canvas.width = size; + canvas.height = size; + const ctx = canvas.getContext('2d'); + if (!ctx) return; + ctx.fillStyle = bgColor; + ctx.fillRect(0, 0, size, size); + const draw = () => { + if (!this.faviconImage?.complete || !this.faviconImage.naturalWidth) return; + const artSize = Math.round(size * 0.8); + ctx.drawImage(this.faviconImage, (size - artSize) / 2, (size - artSize) / 2, artSize, artSize); + let link = document.querySelector('link[rel="icon"]'); + if (!link) { + link = document.createElement('link'); + link.rel = 'icon'; + document.head.appendChild(link); + } + link.type = 'image/png'; + link.href = canvas.toDataURL('image/png'); + }; + if (!this.faviconImage) { + this.faviconImage = new Image(); + this.faviconImage.onload = draw; + this.faviconImage.src = '/icons/cross-gold.png'; + } + draw(); } private async checkDataVersion() { diff --git a/static/icons/cross-gold.png b/static/icons/cross-gold.png new file mode 100644 index 0000000000000000000000000000000000000000..6228b55add5baa5c72623f2dc7db50928c5fc98f GIT binary patch literal 8414 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 NuC8-6U)B22e*sKFYxV#D literal 0 HcmV?d00001 diff --git a/static/icons/icon-192.png b/static/icons/icon-192.png index ee844918f6166b039d1b82a5fe61081ac6092651..ee5f8764488d0afd0ffd43bf3f4e1da3a15dc864 100644 GIT binary patch literal 3058 zcmbtWc{J2*8~%-9EHkoZi>!%4&3H+c!8_KJY<(exY$?0!+t~M=^x8ApgoaT@4WytF+

^heGmFA>whyQA?$s?dOLvwIeQs{odYJy2GK3 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 diff --git a/static/icons/icon-512.png b/static/icons/icon-512.png index 7b46ecdcc481ee3c3ced269dbd631ece530c1a84..010b7d862ccc47275ff2f49c1dbe0dd844677987 100644 GIT binary patch literal 6746 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 literal 7353 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 diff --git a/vite.config.ts b/vite.config.ts index b080ef3..ea40800 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -51,8 +51,8 @@ export default defineConfig({ theme_color: '#1a1a2e', orientation: 'portrait', icons: [ - { src: '/icons/icon-192.png', sizes: '192x192', type: 'image/png' }, - { src: '/icons/icon-512.png', sizes: '512x512', type: 'image/png' }, + { src: '/icons/icon-192.png', sizes: '192x192', type: 'image/png', purpose: 'any maskable' }, + { src: '/icons/icon-512.png', sizes: '512x512', type: 'image/png', purpose: 'any maskable' }, ], }, }),