nettoyage: Suppression des dossiers de la maquette initiale

This commit is contained in:
MARTIN Julien 2025-11-24 15:43:53 +01:00
parent d6ba6019fb
commit 49f0684ad3
43 changed files with 0 additions and 1772 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 662 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 366 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 501 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 563 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 498 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,51 +0,0 @@
# Charte graphique · **P'titsPas**
*Version 1.0 avril 2025*
---
## 1. Essentiel de la marque
| Élément | Raison d'être |
|---------|---------------|
| **Nom** | *P'titsPas* · évoque le cheminement serein des 0-3 ans |
| **Signature** | « Grandir pas à pas, sereinement » |
| **Valeurs** | Bienveillance · Transparence · Simplicité · Modernité |
---
## 2. Logos officiels
| Variante | Aperçu | Usage |
|----------|--------|-------|
| **Principal** | ![logo principal](P'tisPas_logo_trans.png) | Headers, back-office, print A4+ |
| **Icône** | ![icône](P'titsPas_icone.png) | Favicon, PWA, app mobile |
| **Monochrome** | ![mono](mono_placeholder.svg) | Sérigraphie, tampon, textile sombre |
> **Zone de protection** : laisser au minimum l'équivalent d'une pierre pastel autour du logotype.
---
## 3. Palette de couleurs
| Nom | Hex | Rôle |
|-----|-----|------|
| Violet Pastel | `#c6a3d8` | Accent / information |
| Turquoise | `#8ad0c8` | Actions primaires |
| Jaune Doux | `#f2d269` | Avertissements légers |
| Corail | `#f4a28c` | États d'erreur ou badges « conflit » |
| Encre | `#2f2f2f` | Texte principal |
| Ivoire BG | `#fffef9` | Fond d'application & documents |
---
## 4. Typographies
| Contexte | Fonte | Chargement |
|----------|-------|------------|
| Titres & accroches | **Merienda 600** | Google Fonts |
| Texte courant | **Merriweather 300/400** | Google Fonts |
| UI compact | **Inter** (fallback système) | CDN |
```css
h1, h2 { font-family: "Merienda", cursive; }
body { font-family: "Merriweather", serif; }
```

View File

@ -1,257 +0,0 @@
# Évolutions du Cahier des Charges
Ce document liste les modifications à apporter au cahier des charges original pour le rendre conforme à l'application développée.
## 1. Gestion des Enfants
### Modifications à apporter dans la section "Création de compte parent"
#### Situation actuelle dans le CDC :
- Mentionne uniquement la collecte d'informations sur l'enfant
- Ne précise pas la possibilité d'ajouter plusieurs enfants
- Ne mentionne pas la gestion des naissances multiples
- Ne mentionne pas la gestion des enfants à naître
#### Modifications proposées :
Ajouter le paragraphe suivant après la description de la collecte d'informations sur l'enfant :
```
Les parents peuvent ajouter autant d'enfants que nécessaire. Pour chaque enfant, les informations suivantes sont collectées :
- Prénom
- Date de naissance (ou date prévue pour les enfants à naître)
- Photo (optionnelle)
- Consentement pour l'utilisation de la photo
- Indication si l'enfant fait partie d'une naissance multiple (jumeaux, triplés, etc.)
Les parents peuvent :
- Ajouter un nouvel enfant à tout moment
- Supprimer un enfant ajouté
- Modifier les informations d'un enfant existant
- Indiquer si l'enfant est à naître
- Indiquer si l'enfant fait partie d'une naissance multiple
- Donner ou retirer leur consentement pour l'utilisation de la photo de l'enfant
```
### Modifications à apporter dans la section "Workflow de création de compte"
#### Situation actuelle dans le CDC :
- Étape 3 : "Collecte des informations sur l'enfant"
#### Modifications proposées :
Remplacer l'étape 3 par :
```
3. Collecte des informations sur les enfants
- Ajout d'un premier enfant
- Possibilité d'ajouter d'autres enfants
- Pour chaque enfant :
* Saisie du prénom
* Saisie de la date de naissance (ou date prévue)
* Option d'ajout d'une photo
* Option de consentement photo
* Indication si naissance multiple
* Indication si enfant à naître
- Possibilité de modifier ou supprimer un enfant
```
## 2. Workflow de Création de Compte
### Modifications à apporter dans la section "Workflow de création de compte"
#### Situation actuelle dans le CDC :
- Ne précise pas l'ordre exact des étapes
- Ne mentionne pas le statut du compte après création
- Ne détaille pas le processus de validation
#### Modifications proposées :
Ajouter les précisions suivantes au workflow :
```
Le processus de création de compte suit l'ordre suivant :
1. Collecte des informations du premier parent
2. Option d'ajout d'un second parent
3. Collecte des informations sur les enfants
4. Description de la situation familiale
5. Acceptation des conditions générales
6. Résumé et validation finale
Après la validation :
- Le compte est créé avec le statut "en attente"
- Un gestionnaire doit valider le compte avant son activation
- Les parents reçoivent une notification de la création de leur compte
- Une notification est envoyée aux gestionnaires pour validation
```
## 3. Informations Supplémentaires
### Modifications à apporter dans la section "Création de compte parent"
#### Situation actuelle dans le CDC :
- Ne mentionne pas la possibilité de présentation personnelle
- Ne mentionne pas la gestion des photos
- Ne précise pas les statuts possibles du compte
#### Modifications proposées :
Ajouter les sections suivantes :
```
### Informations complémentaires
Le premier parent peut optionnellement ajouter une présentation personnelle pour décrire sa situation et ses attentes.
### Gestion des photos
Pour chaque enfant, les parents peuvent :
- Ajouter une photo
- Donner ou retirer leur consentement pour l'utilisation de la photo
- La photo est stockée de manière sécurisée
- Le consentement est enregistré avec date et heure
### Statut du compte
Les statuts possibles du compte sont :
- En attente : compte créé, en attente de validation
- Validé : compte activé par un gestionnaire
- Rejeté : compte refusé par un gestionnaire
- Suspendu : compte temporairement désactivé
```
## 4. Validation et Sécurité
### Modifications à apporter dans la section "Validation"
#### Situation actuelle dans le CDC :
- Mentionne la validation par un gestionnaire
- Ne précise pas le processus de validation
- Ne mentionne pas les notifications
#### Modifications proposées :
Ajouter la section suivante :
```
### Processus de validation
1. Création du compte avec statut "en attente"
2. Notification automatique aux gestionnaires
3. Revue des informations par un gestionnaire
4. Décision de validation ou rejet
5. Notification aux parents de la décision
6. Activation ou rejet du compte selon la décision
### Notifications
- Les parents reçoivent une notification à chaque changement de statut
- Les gestionnaires reçoivent une notification pour chaque nouveau compte
- Un historique des validations est conservé
```
## 5. Initialisation de l'Application
### Ajout de l'administrateur par défaut
#### Situation actuelle dans le CDC :
- Ne mentionne pas l'existence d'un administrateur par défaut
- Ne précise pas les identifiants de connexion par défaut
#### Modifications proposées :
Ajouter la section suivante :
```
### Administrateur par défaut
Lors du premier démarrage de l'application, un compte administrateur est automatiquement créé avec les identifiants suivants :
- Email : administrateur@ptitspas.fr
- Mot de passe : password
Ce compte permet d'accéder à toutes les fonctionnalités administratives de l'application.
Le changement de mot de passe est obligatoire lors de la première connexion.
L'application doit forcer ce changement avant d'autoriser l'accès aux fonctionnalités administratives.
```
## 6. Changement de Nom de l'Application
### Situation actuelle dans le CDC :
- L'application est nommée "SuperNounou" dans tout le document
- Les références à l'application utilisent ce nom
### Modifications proposées :
Ajouter la section suivante :
```
### Changement de nom
L'application est renommée "P'titsPas" dans toute la documentation et l'interface utilisateur.
Ce changement implique :
- Mise à jour de toutes les références à "SuperNounou" dans le CDC
- Mise à jour des mentions légales
- Mise à jour de la documentation technique
- Mise à jour des interfaces utilisateur
- Mise à jour des messages système et notifications
- Mise à jour des adresses email (ex: support@ptitspas.fr)
```
### Impact sur l'application :
- Mise à jour de tous les textes statiques dans le code
- Mise à jour des templates d'email
- Mise à jour des messages de notification
- Mise à jour de la documentation utilisateur
- Mise à jour des mentions légales et CGU
## Format de présentation
Pour chaque évolution identifiée, ce document suivra la structure suivante :
1. Section concernée dans le CDC
2. Situation actuelle
3. Modifications proposées
4. Impact sur l'application
## Prochaines évolutions à documenter
- [x] Ajouter d'autres évolutions identifiées
- [ ] Mettre à jour le CDC original
- [ ] Valider les modifications avec les parties prenantes
# Évolutions proposées au cahier des charges
## 1. Workflow de création de compte
### 1.1 Récupération de compte
#### 1.1.1 Fonctionnalités
- Ajout d'un lien "Mot de passe oublié" sur la page de connexion
- Processus de récupération en 3 étapes :
1. Saisie de l'adresse email
2. Envoi d'un lien unique de réinitialisation (valide 24h)
3. Création d'un nouveau mot de passe
#### 1.1.2 Sécurité
- Le lien de réinitialisation doit être unique et à usage unique
- Le lien expire après 24 heures
- Le nouveau mot de passe doit respecter les mêmes critères que lors de la création de compte
- Notification par email lors de la réinitialisation du mot de passe
#### 1.1.3 Interface
- Page dédiée pour la saisie de l'email
- Page de confirmation d'envoi du lien
- Formulaire de réinitialisation du mot de passe
- Messages d'erreur clairs en cas de :
- Email non trouvé
- Lien expiré
- Mot de passe non conforme
## X. Amélioration de la Gestion des Photos Utilisateurs (Proposition)
### X.1 Recadrage et Redimensionnement des Photos
#### X.1.1 Fonctionnalités
- **Contexte :** Lors du téléchargement de photos par les utilisateurs (photos de profil, photos d'enfants).
- **Besoin :** Permettre à l'utilisateur de recadrer l'image (notamment en format carré pour les avatars) et potentiellement de la faire pivoter ou de zoomer avant son enregistrement final.
- **Objectif :** Améliorer l'expérience utilisateur, assurer une meilleure qualité et cohérence visuelle des images stockées et affichées dans l'application.
#### X.1.2 Solution Technique Envisagée (pour discussion)
- L'intégration d'une librairie Flutter tierce dédiée au recadrage d'image (par exemple, `image_cropper` ou `crop_image`) sera nécessaire après la sélection initiale de l'image via `image_picker`.
- La tentative initiale avec `image_cropper` (version 5.0.1) a rencontré des difficultés techniques d'intégration (erreur "Too many positional arguments" persistante avec `AndroidUiSettings`) et a été mise en attente. Une investigation plus approfondie ou l'évaluation d'alternatives sera requise.
#### X.1.3 Impact sur l'application
- Modification du flux de sélection d'image dans les écrans concernés (ex: `parent_register_step3_screen.dart`).
- Ajout potentiel de nouvelles dépendances et configurations spécifiques aux plateformes.
- Mise à jour de la documentation utilisateur si cette fonctionnalité est implémentée.

File diff suppressed because it is too large Load Diff

View File

@ -1,108 +0,0 @@
# SuperNounou SSS-001
## Spécification technique & opérationnelle unifiée
_Version 0.2 24 avril 2025_
---
## 1. Objet
Centraliser tous les aspects **techniques et opérationnels** de la plateforme SuperNounou :
- Sauvegarde & Plan de Reprise dActivité (PRA)
- Spécifications des API & intégrations
- Directives de déploiement, dobservabilité, de CI/CD
## 2. Portée
Instances de production, pré-production et recette (Frontend, Backend, PostgreSQL, stockage objets), scripts dinstallation, pipelines CI/CD, journaux et métriques.
## 3. Références
- CDC SuperNounou V1.1
- ISO 27001 / ISO 22301 bonnes pratiques
- Politique sécurité DSI Enedis #SEC-POL-2024
- RGPD (2016/679)
---
# A Sauvegarde & Plan de Reprise dActivité
### A.1 Architecture de sauvegarde
Schéma bloc, chiffrement AES-256 (KMS), réplication hors-site « Object Storage B ».
### A.2 Stratégie de sauvegarde
| Type | Fréquence | Rétention | Support |
|-------------------|-------------|-----------|--------------------|
| Incrémentale | Quotidienne | 30 j | Object Storage A |
| Complète | Hebdomadaire| 6 mois | Object Storage B |
| Export logique DB | Mensuelle | 5 ans | Stockage Glacier |
### A.3 PRA
RPO 24 h / RTO 4 h scénarios : panne VM, corruption DB, sinistre DC procédure détaillée + escalade.
### A.4 Tests de restauration
Intégrale semestrielle, partielle trimestrielle rapport daudit et actions correctives.
### A.5 Monitoring & alertes
Endpoint Prometheus `/metrics`, tableau Grafana « Backup status », alerte > 26 h sans backup.
### A.6 Rôles
DevOps Lead (implémentation), DBA (tests restore), RSSI (audit).
---
# B API & Intégrations
### B.1 Conventions
OpenAPI 3 livré (`openapi.yaml`), version URL `/api/v1`, ISO 8601 dates.
### B.2 Sécurité API
JWT Bearer (ou OAuth 2), TLS 1.3, rate-limit 100 req/min/IP, signature HMAC pour webhooks.
### B.3 Exemples
Collection Postman, scripts cURL, guide « Appeler lAPI ».
### B.4 Intégrations futures
SSO LDAP/SAML, webhook `contract.validated`, export statistiques CSV.
---
# C Déploiement, CI/CD et Observabilité *(nouveau)*
### C.1 Déploiement communal (on-premise)
- **Objectif** : installation complète sur un serveur Linux ou VM en moins d1 h.
- **Livrable** : solution de packaging **au choix** (Docker Compose, image VM, paquet .deb/.rpm).
- **Script update / rollback** : `update.sh` ou équivalent (backup ➜ pull ➜ migrate ➜ vérif ; rollback ≤ 5 min).
- **Config** : fichier `.env.sample` décrivant toutes les variables.
### C.2 Environnements
- Developpement local (Docker Compose).
- Recette & Production (serveur communal).
- Les étudiants doivent décrire la procédure de bascule Recette → Prod.
### C.3 Pipeline CI/CD
- Pipeline automatisé (tests unitaires + build image + scan CVE) déclenché à chaque merge.
- Lécole fournit son propre dépôt Git/runner.
- Artifacts : images taguées, notes de version (`CHANGELOG.md`).
### C.4 Observabilité & logs
- Journaux applicatifs JSON (timestamp UTC, level, traceId).
- Rotation/retention : 7 jours sur disque, 30 jours sur archive compressée.
- Export métriques Prometheus (`/metrics`) : latence API, nombre de sessions, files dattente hors-ligne.
- Tableaux Grafana dexemple inclus (`grafana_dashboard.json`).
### C.5 SLA et performances (indicatifs)
- Disponibilité mensuelle cible : **≥ 98 %**.
- Temps de réponse P95 des opérations courantes : **< 500 ms**.
- Capacité test : **≈ 50 sessions simultanées** sans dégradation (> 1 s).
---
# D Glossaire
AES-256, JWT, KMS, OpenAPI, RPO, RTO, rate-limit, HMAC, Compose, CI/CD…
---
# E Historique des versions
| Version | Date | Auteur | Commentaire |
|---------|------------|------------------|---------------------------------|
| 0.1-draft | 2025-04-24 | Équipe projet | Création du SSS unifié |
| 0.2 | 2025-04-24 | ChatGPT & Julien | Ajout déploiement / CI/CD / logs |

View File

@ -1,55 +0,0 @@
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:p_tits_pas/screens/auth/login_screen.dart';
import 'package:p_tits_pas/screens/auth/register_choice_screen.dart';
import 'package:p_tits_pas/screens/auth/parent_register_step1_screen.dart';
import 'package:p_tits_pas/screens/auth/parent_register_step2_screen.dart';
import 'package:p_tits_pas/screens/auth/parent_register_step3_screen.dart';
void main() {
// TODO: Initialiser SharedPreferences, Provider, etc.
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'P\'titsPas',
theme: ThemeData(
primarySwatch: Colors.blue, // TODO: Utiliser la palette de la charte graphique
textTheme: GoogleFonts.merriweatherTextTheme(
Theme.of(context).textTheme,
),
visualDensity: VisualDensity.adaptivePlatformDensity,
),
// Gestionnaire de routes initial (simple pour l'instant)
initialRoute: '/', // Ou '/login' selon le point d'entrée désiré
routes: {
'/': (context) => const LoginScreen(), // Exemple, pourrait être RegisterChoiceScreen aussi
'/login': (context) => const LoginScreen(),
'/register-choice': (context) => const RegisterChoiceScreen(),
'/parent-register/step1': (context) => const ParentRegisterStep1Screen(),
'/parent-register/step2': (context) => const ParentRegisterStep2Screen(),
'/parent-register/step3': (context) => const ParentRegisterStep3Screen(),
// TODO: Ajouter les autres routes (step 4, etc., dashboard...)
},
// Gestion des routes inconnues
onUnknownRoute: (settings) {
return MaterialPageRoute(
builder: (context) => Scaffold(
body: Center(
child: Text(
'Route inconnue :\n${settings.name}',
style: GoogleFonts.merriweather(fontSize: 20, color: Colors.red),
textAlign: TextAlign.center,
),
),
),
);
},
);
}
}

View File

@ -1 +0,0 @@

View File

@ -1,22 +0,0 @@
CustomAppTextField(
controller: _firstNameController,
labelText: 'Prénom',
hintText: 'Facultatif si à naître',
isRequired: !widget.childData.isUnbornChild,
),
const SizedBox(height: 6.0),
CustomAppTextField(
controller: _lastNameController,
labelText: 'Nom',
hintText: 'Nom de l\'enfant',
enabled: true,
),
const SizedBox(height: 9.0),
CustomAppTextField(
controller: _dobController,
labelText: widget.childData.isUnbornChild ? 'Date prévisionnelle de naissance' : 'Date de naissance',
hintText: 'JJ/MM/AAAA',
readOnly: true,
onTap: widget.onDateSelect,
suffixIcon: Icons.calendar_today,
),

View File

@ -1,3 +0,0 @@
<?xml version="1.0" encoding="utf-8"?><Error><Code>AuthenticationFailed</Code><Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
RequestId:32300bba-601e-0021-763f-bc1466000000
Time:2025-05-03T15:21:39.1449044Z</Message><AuthenticationErrorDetail>Signed expiry time [Sat, 03 May 2025 15:21:15 GMT] must be after signed start time [Sat, 03 May 2025 15:21:39 GMT]</AuthenticationErrorDetail></Error>

View File

@ -1,63 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>PtitsPas Propositions UI Wizard</title>
<link href="https://fonts.googleapis.com/css2?family=Merienda:wght@600&family=Inter:wght@400;500&display=swap" rel="stylesheet">
<style>
body{background:#fffef9;font-family:Inter,sans-serif;color:#2f2f2f;line-height:1.6;padding:2rem;}
h1,h2{font-family:Merienda,cursive;margin:.5rem 0;}
.grid{display:grid;gap:2rem;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));}
.card{background:#fff;border-radius:18px;box-shadow:0 4px 12px rgba(0,0,0,.05);padding:1.5rem;text-align:center;}
img{max-width:100%;height:auto;border-radius:12px;}
.palette{display:flex;justify-content:center;gap:.5rem;margin-top:.75rem;}
.swatch{width:28px;height:28px;border-radius:50%;}
.code{font-size:.75rem;margin-top:.25rem;}
</style>
</head>
<body>
<h1>Création de compte : idées denchaînement de cartes</h1>
<p>Chaque étape saffiche dans une «carte» pastel. En validant, la carte suivante glisse vers lavant (animation CSS: <code>transform: translateX(-100%)</code> + <code>opacity</code>). Trois styles proposés :</p>
<div class="grid">
<div class="card">
<h2>Style 1 : Watercolor</h2>
<img src="A_digital_graphic_design_image_displays_style_opti.png" alt="watercolor stack"/>
<div class="palette">
<div class="swatch" style="background:#FBC9C4"></div>
<div class="swatch" style="background:#FBD38B"></div>
<div class="swatch" style="background:#A9D8C6"></div>
</div>
<div class="code">#FBC9C4 · #FBD38B · #A9D8C6</div>
<p>Bords arrondis 22px, texture papier sur chaque carte.<br><b>Animation</b> : légère rotation (<em>tilt</em>) pour rappeler un paquet de cartes réaliste.</p>
</div>
<div class="card">
<h2>Style 2 : Minimal pastel</h2>
<img src="A_digital_graphic_design_image_displays_style_opti.png" alt="minimal stack"/>
<div class="palette">
<div class="swatch" style="background:#E3DFFD"></div>
<div class="swatch" style="background:#CFEAE3"></div>
<div class="swatch" style="background:#FFE88A"></div>
</div>
<div class="code">#E3DFFD · #CFEAE3 · #FFE88A</div>
<p>Cartes plates, ombre portée subtile (0 2 8 rgba0,05).<br><b>Animation</b> : slide horizontal + fondu rapide.</p>
</div>
<div class="card">
<h2>Style 3 : Modern vibrant</h2>
<img src="A_digital_graphic_design_image_displays_style_opti.png" alt="modern stack"/>
<div class="palette">
<div class="swatch" style="background:#FB86A2"></div>
<div class="swatch" style="background:#F3D468"></div>
<div class="swatch" style="background:#8AC1E3"></div>
</div>
<div class="code">#FB86A2 · #F3D468 · #8AC1E3</div>
<p>Coins arrondis 12px pour une touche «app mobile».<br><b>Animation</b> : carte sort par la gauche, nouvelle carte zoome légèrement.</p>
</div>
</div>
<footer style="font-size:.8rem;margin-top:2rem">© 2025 PtitsPas maquettes UI</footer>
</body>
</html>