From d28f10de9a853818d9959dbcdbcaf863818c8891 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 10 Sep 2026 12:28:04 +0000 Subject: [PATCH] =?UTF-8?q?Remplace=20=C2=AB=20M=C3=A9diation=20=C2=BB=20p?= =?UTF-8?q?ar=20=C2=AB=20Un=20souci=20=3F=20=C2=BB,=20et=20rend=20l'en-t?= =?UTF-8?q?=C3=AAte=20=C3=A0=20sa=20ligne?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit « Médiation » est le mot du bureau, pas celui d'un parent qui hésite à écrire : il faut déjà savoir ce que le terme recouvre pour cliquer dessus. Le bouton dit maintenant « Un souci ? », l'adresse devient /contact, et le mot disparaît de la page, de l'e-mail reçu par le bureau et des noms de composants. L'en-tête, lui, passait sur deux lignes dès qu'un troisième bouton s'ajoutait : il manquait exactement 2 pixels à 390 px. Les trois actions tiennent désormais sur une seule ligne à partir de 360 px — icône du bouton rouge repoussée au-delà de 640 px, marges resserrées, et « S'inscrire » plutôt que « Créer un compte » sur petit écran. L'en-tête retrouve ses 76 px de haut, sa hauteur d'avant cette fonctionnalité. En dessous de 360 px — un iPhone SE de première génération — les actions passent sur deux rangées plutôt que de déborder : c'est le seul cas où la ligne unique cède, et rien n'est masqué. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_014SfQYBU4xXTeSEHKhHQXdD --- src/app/api/{mediation => contact}/route.ts | 10 +++++----- src/app/{mediation => contact}/page.tsx | 14 ++++++------- .../{mediation-form.tsx => contact-form.tsx} | 6 +++--- src/components/site-header.tsx | 20 +++++++++++-------- src/lib/notifications/emails.ts | 14 ++++++------- src/lib/validation.ts | 10 +++++----- 6 files changed, 39 insertions(+), 35 deletions(-) rename src/app/api/{mediation => contact}/route.ts (88%) rename src/app/{mediation => contact}/page.tsx (96%) rename src/components/{mediation-form.tsx => contact-form.tsx} (98%) diff --git a/src/app/api/mediation/route.ts b/src/app/api/contact/route.ts similarity index 88% rename from src/app/api/mediation/route.ts rename to src/app/api/contact/route.ts index f46c88e..1272ff4 100644 --- a/src/app/api/mediation/route.ts +++ b/src/app/api/contact/route.ts @@ -2,18 +2,18 @@ import { NextResponse } from "next/server"; import { handleApiError, HttpError } from "@/lib/auth/guards"; import { sendEmail } from "@/lib/notifications/email"; -import { mediationRequestEmail } from "@/lib/notifications/emails"; +import { familyMessageEmail } from "@/lib/notifications/emails"; import { getAssociationSettings, getRecaptchaRuntimeConfig, } from "@/lib/services/association-settings"; import { verifyRecaptcha } from "@/lib/services/recaptcha"; -import { mediationRequestSchema } from "@/lib/validation"; +import { familyMessageSchema } from "@/lib/validation"; export const dynamic = "force-dynamic"; /** - * Demande de médiation adressée à l'association par une famille. + * Message d'une famille qui rencontre une difficulté avec l'école. * * Le message part vers l'adresse de contact configurée et n'est écrit nulle * part : une difficulté avec un enseignant n'a rien à faire dans une base de @@ -23,7 +23,7 @@ export const dynamic = "force-dynamic"; */ export async function POST(req: Request) { try { - const data = mediationRequestSchema.parse(await req.json()); + const data = familyMessageSchema.parse(await req.json()); // Robot repéré au champ caché : on répond comme si tout allait bien. if (data.website && data.website.trim().length > 0) { @@ -53,7 +53,7 @@ export async function POST(req: Request) { const sent = await sendEmail({ to: destination, replyTo: data.email, - ...mediationRequestEmail({ + ...familyMessageEmail({ name: data.name, email: data.email, phone: data.phone, diff --git a/src/app/mediation/page.tsx b/src/app/contact/page.tsx similarity index 96% rename from src/app/mediation/page.tsx rename to src/app/contact/page.tsx index 5398ad4..17195ee 100644 --- a/src/app/mediation/page.tsx +++ b/src/app/contact/page.tsx @@ -9,7 +9,7 @@ import { import type { Metadata } from "next"; import Link from "next/link"; -import { MediationForm } from "@/components/mediation-form"; +import { ContactForm } from "@/components/contact-form"; import { SiteFooter } from "@/components/site-footer"; import { SiteHeader } from "@/components/site-header"; import { getAssociationSettings } from "@/lib/services/association-settings"; @@ -17,7 +17,7 @@ import { getAssociationSettings } from "@/lib/services/association-settings"; export const dynamic = "force-dynamic"; /** - * Page publique « Parler à l'association ». + * Page publique « On vous écoute ». * * Un parent qui arrive ici a souvent hésité avant d'écrire. La page dit en * trois temps ce qui va se passer, promet la discrétion — promesse tenue par le @@ -27,8 +27,8 @@ export const dynamic = "force-dynamic"; export async function generateMetadata(): Promise { const settings = await getAssociationSettings(); - const title = `Parler à ${settings.associationName}`; - const description = `Une difficulté avec l’école ? Les parents ${settings.associationName} vous écoutent et vous accompagnent auprès de l’équipe enseignante.`; + const title = `Un souci ? Parlons-en — ${settings.associationName}`; + const description = `Une difficulté avec l’école ? Les parents ${settings.associationName} vous écoutent et font le lien avec l’équipe enseignante.`; return { title, description, @@ -60,7 +60,7 @@ const ETAPES = [ }, ]; -export default async function MediationPage() { +export default async function ContactPage() { const settings = await getAssociationSettings(); const contactEmail = settings.contactEmail?.trim() || null; @@ -77,7 +77,7 @@ export default async function MediationPage() {
- Médiation + On vous écoute

Quelque chose coince avec l’école ?{" "} @@ -187,7 +187,7 @@ export default async function MediationPage() { ne lira ce message.

- -