J'ai construit le front comme une galerie avant d'y greffer la boutique : palette sombre (#0E1114, texte blanc chaud), Space Grotesk en titrage et Inter en lecture, larges respirations, animations discrètes au scroll et parallaxe sur le hero — « moins d'interface, plus de photographie ».
Toute la logique commerciale est isolée du reste : le catalogue, les commandes, les paiements (mock ou Stripe) et le stockage (local, S3/R2 ou Vercel Blob) sont des couches indépendantes interchangeables. Le prix est toujours recalculé côté serveur et les informations du produit sont figées en snapshot au moment de l'achat : une modification de tarif ne réécrit jamais une facture passée.
J'ai traité la protection des fichiers comme un vrai enjeu : aucune image haute résolution n'est exposée dans le dossier public. Les aperçus passent par un endpoint qui applique un watermark à la volée, et l'achat génère un jeton signé expirant en 5 minutes avec un quota de téléchargements, vérifié à chaque requête.
Le backoffice va plus loin qu'un simple CRUD : éditeur visuel de l'ordre des produits en glisser-déposer (photos et éditions sur deux zones distinctes, avec mise en avant du premier élément), upload d'images, publication, gestion des commandes, des utilisateurs et export des factures en PDF.