// Скрипт для генерации базовых PWA иконок // Требует: npm install sharp const sharp = require('sharp'); const fs = require('fs'); const path = require('path'); const publicDir = path.join(__dirname, 'public'); // Создаем SVG шаблон для обычной иконки (со скругленными углами) const createIconSVG = (size) => ` P `; // Создаем SVG шаблон для maskable иконки (без скругления, контент в безопасной зоне 80%) const createMaskableIconSVG = (size) => ` P `; async function generateIcons() { // Создаем базовые SVG const baseSVG = createIconSVG(512); const svgBuffer = Buffer.from(baseSVG); const maskableSVG = createMaskableIconSVG(512); const maskableSvgBuffer = Buffer.from(maskableSVG); // Генерируем иконки разных размеров const sizes = [ { name: 'favicon.ico', size: 32 }, { name: 'apple-touch-icon.png', size: 180 }, { name: 'pwa-192x192.png', size: 192 }, { name: 'pwa-512x512.png', size: 512 }, { name: 'pwa-maskable-192x192.png', size: 192, maskable: true }, { name: 'pwa-maskable-512x512.png', size: 512, maskable: true } ]; for (const icon of sizes) { // Для maskable иконок используем специальный SVG с контентом в безопасной зоне const sourceBuffer = icon.maskable ? maskableSvgBuffer : svgBuffer; const image = sharp(sourceBuffer).resize(icon.size, icon.size); const outputPath = path.join(publicDir, icon.name); await image.png().toFile(outputPath); console.log(`✓ Создана иконка: ${icon.name} (${icon.size}x${icon.size})`); } console.log('\n✓ Все иконки успешно созданы!'); } // Проверяем наличие sharp try { require('sharp'); generateIcons().catch(console.error); } catch (e) { console.log('Для генерации иконок необходимо установить sharp:'); console.log('npm install sharp --save-dev'); console.log('\nИли создайте иконки вручную используя онлайн генераторы:'); console.log('- https://realfavicongenerator.net/'); console.log('- https://www.pwabuilder.com/imageGenerator'); }