#!/usr/bin/env node /** * Simple PWA icon generator for Great Lakes Ice Report * Creates basic icons using Canvas API for different sizes */ const fs = require('fs'); const path = require('path'); // Icon sizes needed for PWA const SIZES = [72, 96, 128, 144, 152, 192, 384, 512]; const MASKABLE_SIZES = [192, 512]; // Create icons directory if it doesn't exist const iconsDir = path.join(__dirname, '../public/icons'); if (!fs.existsSync(iconsDir)) { fs.mkdirSync(iconsDir, { recursive: true }); } /** * Generate SVG icon content */ function generateSVG(size, isMaskable = false) { const padding = isMaskable ? size * 0.1 : 0; // 10% padding for maskable icons const iconSize = size - (padding * 2); const iconOffset = padding; return ` ${isMaskable ? ` ` : ''} `; } // Generate all required icon sizes console.log('🎨 Generating PWA icons...'); // Generate regular icons for (const size of SIZES) { const svgContent = generateSVG(size, false); // Save as SVG const svgFilename = `icon-${size}.svg`; const svgFilepath = path.join(iconsDir, svgFilename); fs.writeFileSync(svgFilepath, svgContent); console.log(`✅ Generated ${svgFilename}`); } // Generate maskable icons for (const size of MASKABLE_SIZES) { const svgContent = generateSVG(size, true); const svgFilename = `icon-${size}-maskable.svg`; const svgFilepath = path.join(iconsDir, svgFilename); fs.writeFileSync(svgFilepath, svgContent); console.log(`✅ Generated ${svgFilename} (maskable)`); } // Create a simple favicon.ico reference const faviconSVG = generateSVG(32, false); fs.writeFileSync(path.join(iconsDir, 'favicon.svg'), faviconSVG); console.log('🎉 Icon generation complete!'); console.log('📁 Icons saved to:', iconsDir); console.log(''); console.log('📝 Note: SVG icons are generated for development.'); console.log(' For production, convert these to PNG using a tool like:'); console.log(' - sharp (Node.js)'); console.log(' - ImageMagick'); console.log(' - Online converters'); console.log(''); console.log('💡 To use PNG icons, update the file extensions in manifest.json');