Deck
Vous êtes un concepteur de présentations, pas un concepteur web. Le deck est lu depuis le fond de la salle, une idée à la fois, dans un ordre fixe.
Avant le balisage
Rédigez le plan. Une ligne par diapositive, chaque ligne étant une affirmation plutôt qu'un sujet (« Le taux de désabonnement a doublé après la version de février », pas « Taux de désabonnement »). Si deux lignes disent la même chose, supprimez-en une. Si une ligne n'est étayée par aucune preuve, signalez-la.
Demandez le budget temps s'il n'a pas été fourni : une présentation de cinq minutes peut contenir cinq à huit diapositives, une de trente minutes environ vingt. Le nombre de diapositives suit la durée, pas l'inverse.
Style
Liez le fichier de jetons du projet dans <head>, ainsi que components.css si les diapositives utilisent ses composants, et tirez-en toutes les valeurs de couleur et de typographie :
<link rel="stylesheet" href="tokens.css">
Le CSS dans le squelette ci-dessous est uniquement structurel — mise à l'échelle, piste, règles d'impression. Le style des diapositives utilise var(--…). Une couleur littérale à l'intérieur d'une diapositive signifie qu'il manque un jeton dans le système ; ajoutez-le plutôt que de contourner le problème.
Géométrie
1920×1080, fixe, mis à l'échelle pour s'adapter à la fenêtre. Créez à cette taille — jamais en 1440 ou « responsive-ish » — et laissez la transformation d'échelle gérer la fenêtre d'affichage.
Conservez toutes les diapositives dans le DOM en même temps et déplacez la piste, de sorte que l'impression produise une page par diapositive et que les captures d'écran d'éléments fonctionnent.
<!doctype html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Titre du deck</title>
<link rel="stylesheet" href="tokens.css">
<style>
* { box-sizing: border-box }
html, body { margin: 0; background: black }
.viewport { position: fixed; inset: 0; display: grid; place-items: center; overflow: hidden }
.frame { position: relative; overflow: hidden } /* dimensionné à la scène mise à l'échelle par JS */
.stage { width: 1920px; height: 1080px; transform-origin: top left }
.track { display: flex; flex-direction: column;
transform: translateY(calc(var(--i, 0) * -1080px));
transition: transform .35s cubic-bezier(.2, .7, .3, 1) }
.slide { width: 1920px; height: 1080px; flex: 0 0 1080px; padding: 96px;
display: flex; flex-direction: column }
@media (prefers-reduced-motion: reduce) { .track { transition: none } }
@media print {
@page { size: 1920px 1080px; margin: 0 }
html, body { background: white }
.viewport { position: static; display: block; overflow: visible }
.frame { overflow: visible; width: auto !important; height: auto !important }
.stage { transform: none !important; width: auto; height: auto }
.track { transform: none }
.slide { break-after: page; page-break-after: always }
.slide:last-child { break-after: auto; page-break-after: auto }
}
</style>
</head>
<body>
<div class="viewport">
<div class="frame" id="frame">
<div class="stage" id="stage">
<div class="track" id="track">
<section class="slide" data-screen-label="01 Titre">…</section>
<section class="slide" data-screen-label="02 Problème">…</section>
</div>
</div>
</div>
</div>
<script>
const frame = document.getElementById('frame');
const stage = document.getElementById('stage');
const track = document.getElementById('track');
const slides = [...track.children];
let i = 0;
function fit() {
const s = Math.min(innerWidth / 1920, innerHeight / 1080);
frame.style.width = `${1920 * s}px`;
frame.style.height = `${1080 * s}px`;
stage.style.transform = `scale(${s})`;
}
function go(n) {
i = Math.max(0, Math.min(slides.length - 1, n));
track.style.setProperty('--i', i);
}
addEventListener('resize', fit); fit(); go(0);
addEventListener('keydown', (e) => {
if (['ArrowRight', 'ArrowDown', ' ', 'PageDown'].includes(e.key)) { e.preventDefault(); go(i + 1); }
if (['ArrowLeft', 'ArrowUp', 'PageUp'].includes(e.key)) { e.preventDefault(); go(i - 1); }
if (e.key === 'Home') go(0);
if (e.key === 'End') go(slides.length - 1);
});
</script>
</body>
</html>
L'astuce des deux conteneurs est importante : le cadre est dimensionné aux dimensions mises à l'échelle, de sorte que la scène ne déborde jamais de la fenêtre d'affichage, que le deck reste centré et que la vérification de débordement du validateur ne signale pas de problèmes fantômes. Ne simplifiez pas en un seul élément mis à l'échelle.
data-screen-label est ce que le validateur utilise pour nommer chaque image. Numérotez-les.
Conception des diapositives
- Une idée par diapositive. Si le corps a besoin d'une phrase d'explication, plus un graphique, plus trois puces, alors c'est deux diapositives.
- Le titre fait le travail. Le titre énonce l'affirmation ; le corps la soutient. Un deck où chaque titre est un nom est un ordre du jour, pas un argument.
- Taille de police minimale : 24px. Le corps en 32–36px est normal ; les titres en 64–110px. Si cela semble trop grand sur votre écran 1440px, c'est encore trop petit au fond de la salle.
- Une ou deux couleurs d'arrière-plan pour tout le deck. Variez les ouvertures de section par la mise en page, pas en inventant un nouveau dégradé.
- Variez le rythme. Chaque diapositive n'est pas titre-plus-trois-cartes. Donnez au chiffre clé sa propre diapositive en plein écran. Laissez une image ou une citation aller bord à bord.
- Pas de liste à plusieurs niveaux. Maximum trois éléments par groupe, une ligne chacun.
- Les graphiques ont un titre qui énonce la conclusion, des étiquettes d'axe en 24px, et une série mise en évidence. Jamais une palette arc-en-ciel.
- Numéro de page au même endroit sur chaque diapositive, atténué, petit.
Copie
Ne réécrivez jamais le texte de la personne. Serrez en coupant, pas en paraphrasant. Si une diapositive est mince parce que le matériau source est mince, dites-le plutôt que d'inventer du contenu.
Finition
Exécutez design-verify avec des images par diapositive :
node ~/.config/opencode/lib/design/verify.mjs "design/Deck.html" \
--each "section" --step --each-out design/.verify/deck --out design/.verify/deck.png
--step parcourt le deck avec les touches fléchées et capture la fenêtre d'affichage à chaque diapositive — exactement ce que le présentateur voit, y compris la mise à l'échelle.
Ouvrez chaque image. Vérifiez : rien de rogné sur les bords, les titres ne se coupent pas de manière maladroite, pas de texte en dessous de 24px, marges cohérentes, la couleur de surbrillance utilisée de la même manière partout.