Livrare Lot 3 (Frontend): aplicație web, aplicație mobilă Android, extensie browser

- 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>
This commit is contained in:
Top Clossers 2026-07-17 12:33:59 +03:00
commit cec967f953
321 changed files with 80506 additions and 0 deletions

View file

@ -0,0 +1,80 @@
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);