- Surse complete web (React/Vite) + mobil (React Native/Expo) + extensie (MV3) - Documentație de livrare: ghid utilizare, matrice trasabilitate cerințe, raport testare furnizor - Artefacte binare: imagine Docker didi-frontend:lot3-1.0, APK, extensie v3.2.6 + SHA256SUMS - Configurare adresă platformă externalizată (build args / .env / config.js) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
80 lines
2.7 KiB
JavaScript
80 lines
2.7 KiB
JavaScript
const sharp = require('sharp');
|
|
const path = require('path');
|
|
|
|
const ASSETS = path.join(__dirname, '..', 'assets');
|
|
|
|
function gradient(id) {
|
|
return `<linearGradient id="${id}" x1="0" y1="1" x2="1" y2="0">
|
|
<stop offset="0%" stop-color="#0A0014"/>
|
|
<stop offset="100%" stop-color="#2D1066"/>
|
|
</linearGradient>`;
|
|
}
|
|
|
|
// Full square icon (iOS + fallback)
|
|
function makeIcon(size) {
|
|
const ts = Math.round(size * 0.32);
|
|
const cx = size / 2;
|
|
const cy = size / 2 + ts * 0.1;
|
|
return `<svg width="${size}" height="${size}" xmlns="http://www.w3.org/2000/svg">
|
|
<defs>${gradient('bg')}</defs>
|
|
<rect width="${size}" height="${size}" fill="url(#bg)"/>
|
|
<text x="${cx}" y="${cy}"
|
|
font-family="Arial Rounded MT Bold, Verdana, Arial, sans-serif"
|
|
font-size="${ts}" font-weight="700" fill="white"
|
|
text-anchor="middle" dominant-baseline="central"
|
|
letter-spacing="4">didi</text>
|
|
</svg>`;
|
|
}
|
|
|
|
// Adaptive foreground: FULL SQUARE gradient + text (no circle!)
|
|
// Android handles the masking (circle, squircle, etc.)
|
|
function makeAdaptive(size) {
|
|
const ts = Math.round(size * 0.25);
|
|
const cx = size / 2;
|
|
const cy = size / 2 + ts * 0.1;
|
|
return `<svg width="${size}" height="${size}" xmlns="http://www.w3.org/2000/svg">
|
|
<defs>${gradient('fg')}</defs>
|
|
<rect width="${size}" height="${size}" fill="url(#fg)"/>
|
|
<text x="${cx}" y="${cy}"
|
|
font-family="Arial Rounded MT Bold, Verdana, Arial, sans-serif"
|
|
font-size="${ts}" font-weight="700" fill="white"
|
|
text-anchor="middle" dominant-baseline="central"
|
|
letter-spacing="3">didi</text>
|
|
</svg>`;
|
|
}
|
|
|
|
// Favicon
|
|
function makeFavicon(size) {
|
|
const ts = Math.round(size * 0.40);
|
|
return `<svg width="${size}" height="${size}" xmlns="http://www.w3.org/2000/svg">
|
|
<defs>${gradient('fv')}</defs>
|
|
<rect width="${size}" height="${size}" rx="${size * 0.15}" fill="url(#fv)"/>
|
|
<text x="${size/2}" y="${size/2 + ts * 0.08}"
|
|
font-family="Arial Rounded MT Bold, Verdana, Arial, sans-serif"
|
|
font-size="${ts}" font-weight="700" fill="white"
|
|
text-anchor="middle" dominant-baseline="central"
|
|
letter-spacing="1">didi</text>
|
|
</svg>`;
|
|
}
|
|
|
|
async function main() {
|
|
await sharp(Buffer.from(makeIcon(1024)))
|
|
.png().toFile(path.join(ASSETS, 'icon.png'));
|
|
console.log('icon.png');
|
|
|
|
await sharp(Buffer.from(makeAdaptive(1024)))
|
|
.png().toFile(path.join(ASSETS, 'adaptive-icon.png'));
|
|
console.log('adaptive-icon.png');
|
|
|
|
await sharp(Buffer.from(makeIcon(1024)))
|
|
.png().toFile(path.join(ASSETS, 'splash-icon.png'));
|
|
console.log('splash-icon.png');
|
|
|
|
await sharp(Buffer.from(makeFavicon(256)))
|
|
.resize(48, 48).png().toFile(path.join(ASSETS, 'favicon.png'));
|
|
console.log('favicon.png');
|
|
|
|
console.log('Done!');
|
|
}
|
|
|
|
main().catch(console.error);
|