63 lines
No EOL
2.1 KiB
JavaScript
63 lines
No EOL
2.1 KiB
JavaScript
const sharp = require('sharp');
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
const sizes = [72, 96, 128, 144, 152, 192, 384, 512];
|
|
const svgPath = path.join(__dirname, '../public/icons/icon.svg');
|
|
const outputDir = path.join(__dirname, '../public/icons');
|
|
|
|
async function generateIcons() {
|
|
try {
|
|
// Read SVG file
|
|
const svgBuffer = fs.readFileSync(svgPath);
|
|
|
|
// Generate icons for each size
|
|
for (const size of sizes) {
|
|
await sharp(svgBuffer)
|
|
.resize(size, size)
|
|
.png()
|
|
.toFile(path.join(outputDir, `icon-${size}x${size}.png`));
|
|
|
|
console.log(`Generated icon-${size}x${size}.png`);
|
|
}
|
|
|
|
// Generate maskable icons (with padding)
|
|
const maskableSizes = [192, 512];
|
|
for (const size of maskableSizes) {
|
|
const padding = Math.floor(size * 0.1); // 10% padding for maskable
|
|
|
|
await sharp(svgBuffer)
|
|
.resize(size - (padding * 2), size - (padding * 2))
|
|
.extend({
|
|
top: padding,
|
|
bottom: padding,
|
|
left: padding,
|
|
right: padding,
|
|
background: { r: 0, g: 0, b: 0, alpha: 0 }
|
|
})
|
|
.png()
|
|
.toFile(path.join(outputDir, `icon-maskable-${size}x${size}.png`));
|
|
|
|
console.log(`Generated icon-maskable-${size}x${size}.png`);
|
|
}
|
|
|
|
// Copy main icons to public root for backward compatibility
|
|
await sharp(svgBuffer)
|
|
.resize(192, 192)
|
|
.png()
|
|
.toFile(path.join(__dirname, '../public/icon-192x192.png'));
|
|
|
|
await sharp(svgBuffer)
|
|
.resize(512, 512)
|
|
.png()
|
|
.toFile(path.join(__dirname, '../public/icon-512x512.png'));
|
|
|
|
console.log('All icons generated successfully!');
|
|
|
|
} catch (error) {
|
|
console.error('Error generating icons:', error);
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
generateIcons(); |