# Story 5.1: Structure du Formulaire et Validation HTML5 ## Status Ready for Dev ## Story **As a** visiteur, **I want** un formulaire de contact clair avec des champs bien identifiés, **so that** je sais exactement quelles informations fournir. ## Acceptance Criteria 1. `/contact` affiche le formulaire avec les champs : Nom (requis), Prénom (requis), Email (requis), Entreprise (optionnel), Catégorie (dropdown requis), Objet (requis), Message (textarea requis) 2. Le champ email utilise `type="email"` pour validation native 3. Le dropdown Catégorie propose : "Je souhaite parler de mon projet", "Je souhaite vous proposer un poste", "Autre" 4. Les champs requis sont marqués visuellement (astérisque ou indication) 5. La validation HTML5 native est activée (required, type="email", maxlength) 6. Les labels sont explicites et associés aux champs (accessibilité) 7. Le formulaire est responsive et utilisable sur mobile ## Tasks / Subtasks - [] **Task 1 : Créer la page contact.php** (AC: 1) - [] Mettre à jour `pages/contact.php` - [] Inclure header, navbar, footer - [] Route `/contact` déjà configurée (Story 3.2) - [] **Task 2 : Créer la structure du formulaire** (AC: 1, 6) - [] Balise `
` avec method POST et action - [] Champ Nom avec label associé (for/id) - [] Champ Prénom avec label associé - [] Champ Email avec label associé - [] Champ Entreprise (optionnel) - [] Dropdown Catégorie - [] Champ Objet - [] Textarea Message - [] **Task 3 : Configurer les attributs HTML5** (AC: 2, 5) - [] `type="email"` sur le champ email - [] `required` sur les champs obligatoires - [] `maxlength` appropriés (100, 255, 200, 5000) - [] `placeholder` pour guider la saisie - [] `autocomplete` pour les champs standards - [] **Task 4 : Marquer les champs requis** (AC: 4) - [] Astérisque visuel sur les labels (span.text-primary) - [] Indication "(optionnel)" sur entreprise - [] **Task 5 : Configurer le dropdown** (AC: 3) - [] Option par défaut "Sélectionnez une catégorie..." - [] 3 options : projet, poste, autre - [] Attribut `required` - [] **Task 6 : Rendre responsive** (AC: 7) - [] Grille sm:grid-cols-2 pour Nom/Prénom et Email/Entreprise - [] Champs empilés sur mobile (grid-cols-1) - [] Boutons flex-col sur mobile, flex-row sur desktop ## Dev Notes ### Page pages/contact.php ```php

Me Contacter

Une question, un projet ? Parlons-en !

0 / 5000 caractères

``` ### Attributs des Champs | Champ | Type | Required | Maxlength | Autocomplete | |-------|------|----------|-----------|--------------| | nom | text | Oui | 100 | family-name | | prenom | text | Oui | 100 | given-name | | email | email | Oui | 255 | email | | entreprise | text | Non | 200 | organization | | categorie | select | Oui | - | - | | objet | text | Oui | 200 | - | | message | textarea | Oui | 5000 | - | ### Responsive | Breakpoint | Layout | |------------|--------| | Mobile | Tous les champs empilés (1 colonne) | | Desktop (sm:) | Nom/Prénom côte à côte, Email/Entreprise côte à côte | ## Testing - [] Tous les champs sont présents (7 champs) - [] Les labels sont associés aux inputs (for/id) - [] Les champs requis ont l'astérisque rouge - [] La validation HTML5 fonctionne (required) - [] Le type="email" valide le format - [] Le dropdown a les 3 options + placeholder - [] Le formulaire est responsive (grilles adaptatives) - [] Le compteur de caractères fonctionne (JS inline) ## Dev Agent Record ### Agent Model Used Claude Opus 4.5 (claude-opus-4-5-20251101) ### File List | File | Action | Description | |------|--------|-------------| | `includes/functions.php` | Modified | Ajout generateCsrfToken() et verifyCsrfToken() | | `pages/contact.php` | Modified | Formulaire complet avec 7 champs | ### Completion Notes - Formulaire avec 7 champs : nom, prénom, email, entreprise, catégorie, objet, message - Token CSRF généré et stocké en session - Validation HTML5 : required, type="email", maxlength - Autocomplete sur les champs standards (family-name, given-name, email, organization) - Layout responsive : 2 colonnes sur desktop, 1 sur mobile - Compteur de caractères en temps réel pour le message - Placeholders de messages succès/erreur (pour Story 5.6) - Spinner de chargement préparé (pour Story 5.2/5.5) ### Debug Log References Aucun problème rencontré. ## Change Log | Date | Version | Description | Author | |------|---------|-------------|--------| | 2026-01-22 | 0.1 | Création initiale | Sarah (PO) | | 2026-01-23 | 1.0 | Implémentation complète | James (Dev) |