largeur_px]. * Applique le multiplicateur et optionnellement un format (ex: 'webp'). */ function srcsetPreset(array $widths, float $mult, ?string $format = null): array { $preset = []; foreach ($widths as $label => $px) { $entry = ['width' => (int) round($px * $mult)]; if ($format !== null) { $entry['format'] = $format; } $preset[$label] = $entry; } return $preset; } /** * Génère une paire de presets (original + webp) depuis un tableau de widths. * Retourne ['name' => [...], 'name-webp' => [...]]. */ function srcsetPair(string $name, array $widths, float $mult): array { return [ $name => srcsetPreset($widths, $mult), $name . '-webp' => srcsetPreset($widths, $mult, 'webp'), ]; } // Multiplicateur global (ex: 1.5 pour avoir de la marge sur les écrans Retina) $m = 1.5; // Définition des widths par usage (une seule fois) $widths = [ 'default' => ['300w' => 300, '600w' => 600, '900w' => 900, '1200w' => 1200], // Galerie portfolio — desktop ~15vw, mobile ~33vw (3 colonnes) 'gallery' => ['200w' => 200, '300w' => 300, '400w' => 400, '600w' => 600, '800w' => 800], // Mockup portfolio — desktop ~25vw, mobile ~90vw 'mockup' => ['350w' => 350, '480w' => 480, '700w' => 700, '960w' => 960], // Vignettes jeux — active: clamp(170px, 18.41vw, 355px) 'thumbnail' => ['170w' => 170, '255w' => 255, '355w' => 355, '510w' => 510, '710w' => 710], ]; return [ 'quality' => 80, 'srcsets' => array_merge( ['default' => srcsetPreset($widths['default'], $m)], srcsetPair('gallery', $widths['gallery'], $m), srcsetPair('mockup', $widths['mockup'], $m), srcsetPair('thumbnail', $widths['thumbnail'], $m), ), ];