Update website to use simpler, more direct language for user submissions
Adjusted synthesis prompt and frontend copy to shift from a solemn, manifesto-like tone to a practical, direct communication style for user contributions and political representatives. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 923ae0e3-a363-4db8-b04a-e8baca2a1330 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 1a34f0b7-23c8-4e2d-a327-0e8096495ea3 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/8af7d2ec-2cc3-4ece-8af3-9f071488d072/923ae0e3-a363-4db8-b04a-e8baca2a1330/qrVKaka Replit-Helium-Checkpoint-Created: true
This commit is contained in:
@@ -95,10 +95,10 @@ export default function About() {
|
||||
|
||||
<header className="mb-12 space-y-4">
|
||||
<h1 className="text-4xl md:text-5xl font-serif font-bold text-primary">
|
||||
À propos de La Voix du Peuple
|
||||
À propos
|
||||
</h1>
|
||||
<p className="text-xl font-serif text-muted-foreground leading-relaxed">
|
||||
Une place publique numérique où les voix individuelles forment un manifeste démocratique collectif, guidé par le droit international des droits humains.
|
||||
Un outil simple pour recueillir les propositions citoyennes, les synthétiser et les rendre lisibles par les élus qui nous représentent.
|
||||
</p>
|
||||
</header>
|
||||
|
||||
@@ -109,7 +109,7 @@ export default function About() {
|
||||
<h2>Le concept</h2>
|
||||
</div>
|
||||
<p className="leading-relaxed text-foreground/90 font-serif text-lg">
|
||||
La démocratie exige à la fois la liberté d'expression et un socle commun de valeurs. Cette plateforme offre aux citoyens un espace pour soumettre leurs idées en faveur d'une société meilleure. Ces voix distinctes sont tissées en temps réel pour former une synthèse vivante — un pamphlet numérique moderne qui reflète nos aspirations collectives.
|
||||
Cette plateforme permet à tout citoyen de soumettre une proposition, une demande ou une préoccupation. Ces contributions sont agrégées et synthétisées automatiquement pour produire un résumé clair, directement utilisable par des représentants politiques, des associations ou des collectivités.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
@@ -119,7 +119,7 @@ export default function About() {
|
||||
<h2>Le filtre démocratique</h2>
|
||||
</div>
|
||||
<p className="leading-relaxed text-foreground/90 font-serif text-lg">
|
||||
Toute prise de parole ne contribue pas nécessairement au bien commun. Pour préserver l'intégrité de l'agora, un agent d'intelligence artificielle agit comme gardien civique. Chaque idée soumise est évaluée à la lumière des droits fondamentaux reconnus par le droit international avant de pouvoir rejoindre la synthèse collective.
|
||||
Pour maintenir un espace de dialogue constructif, chaque contribution est évaluée automatiquement par un agent d'intelligence artificielle. Les contenus contraires aux droits fondamentaux reconnus par le droit international ne sont pas intégrés à la synthèse.
|
||||
</p>
|
||||
<div className="bg-muted/30 p-6 rounded-none border-l-4 border-primary">
|
||||
<h3 className="font-bold font-mono uppercase tracking-widest text-sm mb-3">
|
||||
@@ -134,7 +134,7 @@ export default function About() {
|
||||
</ul>
|
||||
</div>
|
||||
<p className="leading-relaxed text-foreground/90 font-serif text-lg">
|
||||
Lorsqu'une contribution ne peut être retenue, l'auteur en est informé discrètement, sans jugement de sa personne — seulement de la conformité du contenu aux valeurs fondamentales de cet espace commun.
|
||||
Lorsqu'une contribution n'est pas retenue, l'auteur en est informé sans que sa contribution ne soit rendue publique.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
@@ -144,7 +144,7 @@ export default function About() {
|
||||
<h2>La synthèse</h2>
|
||||
</div>
|
||||
<p className="leading-relaxed text-foreground/90 font-serif text-lg">
|
||||
Une idée acceptée ne reste pas isolée. Un second agent lit en continu le flux des idées validées et les tisse en un texte cohérent, éloquent, rédigé à la première personne du pluriel — « Nous, le peuple ». Ce texte, actualisé toutes les 15 secondes, représente l'humeur collective, les préoccupations et les espoirs des citoyens qui ont pris la parole.
|
||||
Dès qu'une contribution est intégrée, un second agent relit l'ensemble des propositions reçues et produit un résumé structuré par thèmes. Ce document, mis à jour en temps réel, est conçu pour être directement transmis à des élus, des services publics ou toute instance décisionnelle.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
@@ -154,7 +154,7 @@ export default function About() {
|
||||
<h2>Fondements juridiques</h2>
|
||||
</div>
|
||||
<p className="leading-relaxed text-foreground/90 font-serif text-lg">
|
||||
Le filtre s'appuie sur les textes fondateurs du droit international des droits humains. Voici les instruments qui guident chaque décision d'intégration ou de non-intégration d'une contribution.
|
||||
La modération s'appuie sur les textes internationaux suivants. Les articles cités fondent les critères d'acceptation et de refus des contributions.
|
||||
</p>
|
||||
|
||||
<div className="space-y-8">
|
||||
|
||||
@@ -31,8 +31,8 @@ import {
|
||||
|
||||
const submitIdeaSchema = z.object({
|
||||
content: z.string()
|
||||
.min(10, "Votre idée doit comporter au moins 10 caractères pour avoir du poids.")
|
||||
.max(1000, "La concision est une vertu. Restez sous 1 000 caractères."),
|
||||
.min(10, "Votre contribution doit faire au moins 10 caractères.")
|
||||
.max(1000, "Merci de rester sous 1 000 caractères."),
|
||||
author: z.string().max(100).optional(),
|
||||
});
|
||||
|
||||
@@ -96,13 +96,13 @@ export default function Home() {
|
||||
if (result.accepted) {
|
||||
setSubmitResult({
|
||||
success: true,
|
||||
message: "Votre voix a été intégrée au manifeste collectif.",
|
||||
message: "Votre contribution a été ajoutée à la synthèse.",
|
||||
});
|
||||
form.reset();
|
||||
} else {
|
||||
setSubmitResult({
|
||||
success: false,
|
||||
message: "Cette contribution n'a pas pu être intégrée au manifeste car elle n'est pas en accord avec les valeurs fondamentales qui guident cet espace commun.",
|
||||
message: "Cette contribution n'a pas pu être intégrée : elle n'est pas compatible avec le cadre de modération de cette plateforme.",
|
||||
reason: result.reason ?? undefined,
|
||||
});
|
||||
}
|
||||
@@ -125,10 +125,10 @@ export default function Home() {
|
||||
<div className="p-6 md:p-8 flex flex-col gap-6 flex-shrink-0 border-b border-border/40">
|
||||
<div className="space-y-2">
|
||||
<h1 className="text-3xl font-serif font-bold text-primary tracking-tight">
|
||||
Parlez à la République
|
||||
Vos propositions
|
||||
</h1>
|
||||
<p className="text-muted-foreground font-mono text-sm uppercase tracking-wider">
|
||||
Votre voix compte. Partagez votre vision pour l'avenir.
|
||||
<p className="text-muted-foreground text-sm">
|
||||
Soumettez vos idées. Elles sont synthétisées et transmises à vos représentants.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -142,7 +142,7 @@ export default function Home() {
|
||||
<FormLabel className="sr-only">Votre idée</FormLabel>
|
||||
<FormControl>
|
||||
<Textarea
|
||||
placeholder="Quel changement souhaitez-vous ? Exprimez-vous librement."
|
||||
placeholder="Quelle proposition souhaitez-vous faire remonter ?"
|
||||
className="min-h-[120px] resize-none font-serif text-lg bg-background border-primary/20 focus-visible:ring-primary placeholder:text-muted-foreground/50"
|
||||
data-testid="input-idea-content"
|
||||
{...field}
|
||||
@@ -181,7 +181,7 @@ export default function Home() {
|
||||
{submitIdea.isPending ? (
|
||||
<><Loader2 className="mr-2 h-4 w-4 animate-spin" /> Envoi…</>
|
||||
) : (
|
||||
<><PenTool className="mr-2 h-4 w-4" /> Proclamer</>
|
||||
<><PenTool className="mr-2 h-4 w-4" /> Contribuer</>
|
||||
)}
|
||||
</Button>
|
||||
</div>
|
||||
@@ -199,7 +199,7 @@ export default function Home() {
|
||||
: <Info className="h-4 w-4 text-amber-600" />
|
||||
}
|
||||
<AlertTitle>
|
||||
{submitResult.success ? "Proclamation enregistrée" : "Contribution non retenue"}
|
||||
{submitResult.success ? "Contribution enregistrée" : "Contribution non retenue"}
|
||||
</AlertTitle>
|
||||
<AlertDescription>
|
||||
{submitResult.message}
|
||||
@@ -217,13 +217,14 @@ export default function Home() {
|
||||
<AccordionItem value="valeurs" className="border-none">
|
||||
<AccordionTrigger className="text-xs font-mono uppercase tracking-widest text-muted-foreground hover:no-underline py-3">
|
||||
<span className="flex items-center gap-2">
|
||||
<Scale className="h-3 w-3" /> Nos valeurs & fondements juridiques
|
||||
<Scale className="h-3 w-3" /> Cadre de modération
|
||||
</span>
|
||||
</AccordionTrigger>
|
||||
<AccordionContent>
|
||||
<p className="text-xs text-muted-foreground font-serif mb-4 leading-relaxed">
|
||||
Cet espace est régi par les grands textes fondateurs du droit international
|
||||
des droits humains. Toute contribution est évaluée à leur lumière.
|
||||
<p className="text-xs text-muted-foreground mb-4 leading-relaxed">
|
||||
Les contributions sont modérées selon les textes fondamentaux du droit
|
||||
international des droits humains. Les contenus contraires à ces principes
|
||||
ne sont pas intégrés.
|
||||
</p>
|
||||
<div className="space-y-3">
|
||||
{VALEURS.map((v) => (
|
||||
@@ -247,7 +248,7 @@ export default function Home() {
|
||||
<ScrollArea className="flex-1 bg-muted/30">
|
||||
<div className="p-6 md:p-8">
|
||||
<h2 className="text-xs font-mono font-bold uppercase tracking-widest text-muted-foreground mb-6 flex items-center gap-2">
|
||||
<TrendingUp className="h-3 w-3" /> Proclamations récentes
|
||||
<TrendingUp className="h-3 w-3" /> Contributions récentes
|
||||
</h2>
|
||||
|
||||
<div className="space-y-8">
|
||||
@@ -277,8 +278,8 @@ export default function Home() {
|
||||
</div>
|
||||
))
|
||||
) : (
|
||||
<div className="text-center p-8 text-muted-foreground font-mono text-sm border border-dashed border-border/60">
|
||||
Aucune proclamation enregistrée. Soyez le premier à prendre la parole.
|
||||
<div className="text-center p-8 text-muted-foreground text-sm border border-dashed border-border/60">
|
||||
Aucune contribution enregistrée pour l'instant.
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
@@ -299,17 +300,17 @@ export default function Home() {
|
||||
<div className="flex justify-between items-start mb-12">
|
||||
<div>
|
||||
<h2 className="text-sm font-mono font-bold uppercase tracking-widest text-primary flex items-center gap-2">
|
||||
<Users className="h-4 w-4" /> La Voix du Peuple
|
||||
<Users className="h-4 w-4" /> Synthèse des contributions
|
||||
</h2>
|
||||
<p className="text-xs font-mono text-muted-foreground mt-1">
|
||||
La synthèse vivante de la pensée démocratique
|
||||
Mise à jour à chaque nouvelle contribution
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{stats && (
|
||||
<div className="text-xs font-mono text-right" data-testid="text-stats">
|
||||
<div className="flex flex-col">
|
||||
<span className="text-muted-foreground">Voix rejointes</span>
|
||||
<span className="text-muted-foreground">Contributions intégrées</span>
|
||||
<span className="font-bold text-primary">{stats.accepted}</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -321,7 +322,7 @@ export default function Home() {
|
||||
<div className="flex flex-col items-center justify-center gap-4 text-muted-foreground">
|
||||
<Loader2 className="h-8 w-8 animate-spin text-primary" />
|
||||
<span className="font-mono text-sm uppercase tracking-widest">
|
||||
À l'écoute du peuple…
|
||||
Chargement…
|
||||
</span>
|
||||
</div>
|
||||
) : synthesis ? (
|
||||
@@ -334,7 +335,7 @@ export default function Home() {
|
||||
<div>{synthesis.text}</div>
|
||||
) : (
|
||||
<p className="text-muted-foreground italic text-center text-xl">
|
||||
Les pages de notre manifeste sont encore vierges. Prenez la parole.
|
||||
Aucune contribution pour l'instant.
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
@@ -345,14 +346,14 @@ export default function Home() {
|
||||
data-testid="text-synthesis-meta"
|
||||
>
|
||||
<span>
|
||||
Synthèse de {synthesis.ideaCount} idée{synthesis.ideaCount !== 1 ? "s" : ""} citoyenne{synthesis.ideaCount !== 1 ? "s" : ""}
|
||||
Basé sur {synthesis.ideaCount} contribution{synthesis.ideaCount !== 1 ? "s" : ""}
|
||||
</span>
|
||||
<span className="flex items-center gap-2">
|
||||
<span className="relative flex h-2 w-2">
|
||||
<span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-primary opacity-75" />
|
||||
<span className="relative inline-flex rounded-full h-2 w-2 bg-primary" />
|
||||
</span>
|
||||
En direct • {format(new Date(synthesis.updatedAt), "HH:mm:ss")}
|
||||
Mis à jour le {format(new Date(synthesis.updatedAt), "d MMM à HH:mm", { locale: fr })}
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
|
||||
Reference in New Issue
Block a user