đ SAISON A Semaine 5 Ăpisode 3 - Une JournĂ©e en Pair-Programming
đ Notions du jour
Aujourdâhui, jâai participĂ© Ă un atelier en pair-programming avec pour objectif de crĂ©er une application web dâardoise pixel art, inspirĂ©e du style rĂ©tro de Space Invaders. Le dĂ©fi ? Tout gĂ©nĂ©rer en JavaScript : la grille de pixels, le formulaire de configuration, et mĂȘme la palette de couleurs. Nous avions seulement une maquette comme point de dĂ©part. Pas de code fourni, juste une idĂ©e Ă concrĂ©tiser !
đïž Mise Ă jour le 16 octobre 2025
Cet article a Ă©tĂ© mis Ă jour pour inclure une amĂ©lioration du code permettant de corriger les problĂšmes rencontrĂ©s Ă©noncĂ©s dans la section đš AmĂ©liorations et DĂ©fis.
Ajout de la section suivante : đȘ Suite et fin !
đ Ătape PrĂ©paratoire : DĂ©couper la Maquette
Le matin, nous avons commencé par analyser la maquette pour identifier les éléments clés :
- Un
<header>contenant un formulaire avec : - Un input pour définir la taille de la grille (en nombre de pixels).
- Un input pour définir la taille des pixels (en pixels).
- Un bouton pour valider et générer la grille.
- Un
<main>contenant : - La grille de pixels (notre ardoise).
- Une palette de couleurs en bas, pour choisir la couleur des pixels.
Action : Nous avons créé une structure HTML basique et ajoutĂ© un peu de CSS pour styliser les Ă©lĂ©ments (couleurs, tailles, etc.). LâidĂ©e Ă©tait de prĂ©parer le terrain pour que JavaScript puisse prendre le relais. Nous sommes partis d'une grille de dĂ©part composĂ©e de 8 x 8 pixels (chaque pixel faisant une taille de 50px) codĂ©e en dur dans le HTML pour prĂ©visualiser le rendu attendu.
<!DOCTYPE html>
<html lang="en">
<body>
<header>
<form action="">
<input type="number" min="" max="" step="1" placeholder="Taille de la grille">
<input type="number" min="" max="" step="1" placeholder="Taille des pixels">
<button type="submit">Valider</button>
</form>
</header>
<main>
<div id="grid">
<!-- Simulate a 8x8 grid -->
<div class="pixel"></div>
<!-- <div class="pixel"></div>
<div class="pixel"></div>
<div class="pixel"></div>
...
<div class="pixel"></div>-->
<div class="pixel"></div>
</div>
<div class="palette"></div>
</main>
<script src="../js/app.js"></script>
</body>
</html>
:root {
--pixel-color-grey-light: #D2DAE2;
--pixel-border-grey-light: #808E9B;
--pixel-color-grey-dark: #485460;
--pixel-border-grey-dark: #1D262D;
--bg-color-main: #665ACE;
--bg-color-header: #3148AD;
}
header {
background-color: var(--bg-color-header);
height: 20dvh;
display: flex;
justify-content: center;
align-items: center;
}
main {
background-color: var(--bg-color-main);
height: 80dvh;
display: flex;
justify-content: center;
align-items: center;
}
#grid {
display: grid;
grid-template-rows: auto;
width: auto;
height: auto;
}
.pixel {
background-color: var(--pixel-color-grey-light);
border: 2px solid var(--pixel-border-grey-light);
height: 50px;
width: 50px;
}
đ» CrĂ©ation de lâApplication avec JavaScript
1ïžâŁ GĂ©nĂ©rer la Grille de Pixels
Objectif : GĂ©nĂ©rer une grille dynamique en fonction de la taille choisie par lâutilisateur.
PremiÚre approche : Avant de nous attaquer à la gestion du formulaire, nous avons commencé avec un prompt() pour demander la taille de la grille, en fixant la taille des pixels à 50px pour les tests.
RĂ©sultat : Une grille de pixels gris clair, prĂȘte Ă ĂȘtre colorĂ©e !

2ïžâŁ Rendre les Pixels Cliquables
Objectif : Changer la couleur dâun pixel au clic (noir par dĂ©faut).
Solution : Nous avons pensé à créer une classe dark afin de l'ajouter à un pixel lorsque celui-ci est cliqué. Si un pixel possÚde la classe dark, alors il prend la couleur noir. En cherchant dans la documentation, nous avons trouver que nous pouvions utiliser un addEventListener avec la méthode toggle() de l'objet classListd'un HTML DOM element pour basculer entre les classes CSS.
CSS associé :
.dark {
background-color: var(--pixel-color-grey-dark); /* Corresponding to #485460 */
border: 2px solid var(--pixel-border-grey-dark); /* Corresponding to #1D262D */
}
RĂ©sultat : Une grille interactive oĂč chaque clic inverse la couleur du pixel !

3ïžâŁ IntĂ©grer le Formulaire
Objectif : Remplacer le prompt() par un formulaire HTML pour configurer la grille.
Ătapes :
- Récupérer les valeurs des inputs (taille de la grille et taille des pixels).
- Générer la grille en fonction de ces valeurs.
Résultat : Un formulaire fonctionnel qui génÚre une grille personnalisée !

4ïžâŁ Partie Bonus : CrĂ©er la Palette de Couleurs
Objectif : Ajouter une palette de couleurs pour modifier la couleur des pixels.
Ătapes :
- Créer la palette (une
<div>par couleur). - Permettre Ă lâutilisateur de sĂ©lectionner une couleur.
- Appliquer la couleur sélectionnée aux pixels cliqués.
Ajout de la palette dans le fichier html :
<!-- Add a <div> containing the different colors into the <main> section -->
<div class="palette">
<!-- Add a <div> by color -->
<div class="grey"></div>
<div class="dark"></div>
<div class="orange"></div>
<div class="green"></div>
</div>
CSS pour la palette :
.grey {
background-color: var(--pixel-color-grey-light);
border: 2px solid var(--pixel-border-grey-light);
}
.dark {
background-color: var(--pixel-color-grey-dark);
border: 2px solid var(--pixel-border-grey-dark);
}
.green {
background-color: var(--pixel-color-green);
border: 2px solid var(--pixel-border-green);
}
.orange {
background-color: var(--pixel-color-orange);
border: 2px solid var(--pixel-border-orange);
}
.palette {
background-color: #4A45A3;
padding: 2rem;
display: flex;
gap: 1rem;
align-items: center;
justify-content: space-between;
position: absolute;
right: 0;
bottom: 0;
}
.palette > * {
width: 40px;
height: 40px;
border-radius: 50%;
border-width: 4px;
}
/* If a color is clicked, this class will be added to change the color size
and to specify that the color is selected */
.color-selected {
width: 80px;
height: 80px;
}
Rendu avec la palette

Il faut maintenant pouvoir sélectionner les couleurs sur la Palette et les lier aux Pixels.
Solution partielle trouvĂ©e : En cherchant dans la documentation, nous avons utilisĂ© classList.item() pour rĂ©cupĂ©rer la classe de la couleur sĂ©lectionnĂ©e et lâappliquer aux pixels.
// ...
/**
* Update "click" event in the grid generation part
* By Handling "click" event to change pixel color
*/
pixel.addEventListener("click", () => {
// Get the selected color from palette
const selectedColor = document.querySelector(".color-selected").classList.item(0);
// Get current color of the pixel
const currentPixelColor = pixel.classList.item(1);
// Replace current color with selected color
pixel.classList.replace(currentPixelColor, selectedColor);
});
// ...
// Get all color elements from the palette
const paletteColors = document.querySelectorAll(".palette > *");
// Handles click event to select a color from the palette
for (const color of paletteColors) {
color.addEventListener("click", () => {
// Toggle 'color-selected' on the clicked color
color.classList.toggle("color-selected");
});
}
Résultat final obtenu : Les pixels prennent la couleur sélectionnée dans la palette !

đš AmĂ©liorations et DĂ©fis
ProblĂšme rencontrĂ© : La solution proposĂ©e reste Ă optimiser. En effet, lorsque l'on clique sur une couleur pour la sĂ©lectionner il faudrait que celle-ci devienne sĂ©lectionnĂ©e et que toutes les autres couleurs ne soient plus sĂ©lectionnĂ©es. Le comportement actuel est que lorsqu'on clique sur une couleur, les autres couleurs restent sĂ©lectionnĂ©es si elles ont dĂ©jĂ Ă©tĂ© sĂ©lectionnĂ©es avant. Ce qui fait que l'on peut sĂ©lectionner toutes les couleurs en mĂȘme temps.
Il faut cliquer à nouveau sur une couleur déjà sélectionnée pour la dé-sélectionner grùce à toggle(). En l'état pour pouvoir changer la couleur des pixels il faut sélectionner une seule couleur et dé-sélectionner manuellement les autres couleurs afin de n'avoir qu'une seule couleur sélectionnée dans la palette. Ensuite on peut cliquer sur les pixels afin de changer leur couleur.
đĄ Ce Que Jâai Appris Aujourdâhui
- Le pair programming est puissant : Travailler Ă deux permet de rĂ©soudre des problĂšmes plus rapidement et dâapprendre des approches diffĂ©rentes.
- La documentation est une alliĂ©e : Sans elle, nous nâaurions pas trouvĂ©
classList.toggle()ouclassList.item(). - Les petites victoires comptent : Chaque Ă©tape franchie (mĂȘme minuscule) est une avancĂ©e !
- Lâimportance des tests : Tester chaque fonctionnalitĂ© au fur et Ă mesure Ă©vite les bugs cumulatifs.
đȘ Suite et fin !
Ce paragraphe a été ajouté lors de la mise à jour du 16 octobre 2025.
AprĂšs une bonne nuit de sommeil đđ€ Ă rĂȘver de grilles, de pixels et de lignes de code. Je me rĂ©veille đŽ en pensant avoir trouvĂ© comment ne sĂ©lectionner qu'une seule couleur sur la palette sans les sĂ©lectionner toutes en mĂȘme temps.
Pour cela je me suis dit que lorsque je sélectionne une couleur sur la palette, il faut que dé-sélectionne toutes les couleurs de la palette qui sont sélectionnées d'abord (c'est-à -dire qu'elles possÚdent la classe color-selected).
Voici ma solution :
/**
* Handles click event to select a color from the palette
*/
for (const color of paletteColors) {
color.addEventListener("click", () => {
// If the color is not already selected
if (!color.classList.contains("color-selected")) {
// Remove 'color-selected' from all colors
for (const color of paletteColors) {
if (color.classList.contains("color-selected")) {
color.classList.toggle("color-selected");
}
}
}
// Toggle 'color-selected' on the clicked color
color.classList.toggle("color-selected");
});
}
Résultat final obtenu : Les pixels prennent la couleur sélectionnée dans la palette !
