diff --git a/src/components/Conjoncturel.astro b/src/components/Conjoncturel.astro new file mode 100644 index 0000000..61a4679 --- /dev/null +++ b/src/components/Conjoncturel.astro @@ -0,0 +1,12 @@ +--- +// Couche 3 — Conjoncturel : actualité des 6 derniers mois, décisions récentes, polémiques +--- +
+
+ Conjoncturel + Actualité des 6 derniers mois — décisions, polémiques, sondages récents +
+
+ +
+
diff --git a/src/components/Kpi.astro b/src/components/Kpi.astro new file mode 100644 index 0000000..769045c --- /dev/null +++ b/src/components/Kpi.astro @@ -0,0 +1,35 @@ +--- +interface Props { + valeur: string; + label: string; + source?: string; + annee?: string | number; + tendance?: 'hausse' | 'baisse' | 'stable' | 'critique' | 'alerte'; + contexte?: string; +} + +const { valeur, label, source, annee, tendance = 'stable', contexte } = Astro.props; + +const tendanceConfig: Record = { + hausse: { icon: '↑', couleur: '#16a34a' }, + baisse: { icon: '↓', couleur: '#dc2626' }, + stable: { icon: '→', couleur: '#6b7280' }, + critique: { icon: '⚠', couleur: '#dc2626' }, + alerte: { icon: '!', couleur: '#d97706' }, +}; + +const cfg = tendanceConfig[tendance] ?? tendanceConfig.stable; +--- +
+
+ {valeur} + {cfg.icon} +
+
{label}
+ {contexte &&
{contexte}
} + {source && ( +
+ {source}{annee ? ` · ${annee}` : ''} +
+ )} +
diff --git a/src/components/Politique.astro b/src/components/Politique.astro new file mode 100644 index 0000000..e82dc8f --- /dev/null +++ b/src/components/Politique.astro @@ -0,0 +1,12 @@ +--- +// Couche 2 — Dimension politique : ce qui fait débat selon les valeurs et les intérêts +--- +
+
+ Politique + Ce qui fait débat selon les valeurs et les intérêts +
+
+ +
+
diff --git a/src/components/Sondage.astro b/src/components/Sondage.astro new file mode 100644 index 0000000..81a6985 --- /dev/null +++ b/src/components/Sondage.astro @@ -0,0 +1,45 @@ +--- +interface Props { + question: string; + pct: number; + reponse?: string; + source: string; + annee: number | string; + note?: string; + couleur?: string; +} + +const { + question, + pct, + reponse = "Oui / D'accord", + source, + annee, + note, + couleur = '#1e3a6e', +} = Astro.props; + +const largeur = Math.min(Math.max(pct, 3), 100); +--- +
+
+ « {question} » +
+
+
+
+
+
+ {pct}% +
+
+
+
{reponse}
+
{source} · {annee}
+
+ {note && ( +
+ {note} +
+ )} +
diff --git a/src/components/Structurel.astro b/src/components/Structurel.astro new file mode 100644 index 0000000..b4fec7a --- /dev/null +++ b/src/components/Structurel.astro @@ -0,0 +1,12 @@ +--- +// Couche 1 — Facteurs structurels : contraintes de long terme, invariants institutionnels +--- +
+
+ Structurel + Ce qui ne change pas facilement — contraintes de fond +
+
+ +
+
diff --git a/src/components/Timeline.astro b/src/components/Timeline.astro new file mode 100644 index 0000000..2327f9a --- /dev/null +++ b/src/components/Timeline.astro @@ -0,0 +1,43 @@ +--- +export interface TimelineItem { + annee: string | number; + titre: string; + description: string; + impact?: 'positif' | 'negatif' | 'neutre' | 'majeur'; +} + +interface Props { + items: TimelineItem[]; +} + +const { items } = Astro.props; + +const impactConfig: Record = { + positif: { couleur: '#16a34a', fond: '#f0fdf4' }, + negatif: { couleur: '#dc2626', fond: '#fef2f2' }, + majeur: { couleur: '#d97706', fond: '#fffbeb' }, + neutre: { couleur: '#6b7280', fond: '#f9fafb' }, +}; +--- +
+ +
+ + {items.map((item) => { + const cfg = impactConfig[item.impact ?? 'neutre']; + return ( +
+ +
+ +
+
+ {item.annee} + {item.titre} +
+

{item.description}

+
+
+ ); + })} +
diff --git a/src/content.config.ts b/src/content.config.ts index 0cb33e8..02c08c4 100644 --- a/src/content.config.ts +++ b/src/content.config.ts @@ -9,8 +9,38 @@ const themesCollection = defineCollection({ description: z.string(), ordre: z.number(), priorite: z.enum(['critique', 'haute', 'normale']).default('normale'), + + // Budget & effectifs budget_etat_milliards: z.number().optional(), effectifs_publics: z.number().optional(), + + // KPI principal affiché dans le header + kpi_valeur: z.string().optional(), + kpi_label: z.string().optional(), + kpi_tendance: z.enum(['hausse', 'baisse', 'stable', 'critique', 'alerte']).optional(), + kpi_contexte: z.string().optional(), + + // Opinion publique (1 chiffre clé pour la sidebar) + opinion_pct: z.number().optional(), + opinion_question: z.string().optional(), + opinion_source: z.string().optional(), + opinion_annee: z.number().optional(), + + // Comparaison internationale + rang_eu: z.number().optional(), + nb_pays_compares: z.number().optional(), + + // Sections présentes — pilote la nav + sections: z.array(z.enum([ + 'diagnostic', 'historique', 'enjeux', 'international', + 'opinion', 'acteurs', 'propositions', 'scenarios', 'sources', + ])).default(['diagnostic', 'enjeux', 'propositions', 'scenarios', 'sources']), + + // Qualité + score_sources: z.number().optional(), + nb_propositions: z.number().optional(), + + // Tags & sources tags: z.array(z.string()).default([]), sources_data: z.array(z.string()).default([]), derniere_maj: z.string(), @@ -24,7 +54,7 @@ const propositionsCollection = defineCollection({ titre: z.string(), theme: z.string(), source: z.string(), - type_source: z.enum(['parti', 'think-tank', 'rapport-officiel', 'programme-presidentiel', 'rapport-parlementaire']), + type_source: z.enum(['parti', 'think-tank', 'rapport-officiel', 'programme-presidentiel', 'rapport-parlementaire', 'irpf']), orientation: z.enum(['gauche', 'centre-gauche', 'centre', 'centre-droit', 'droite', 'autre']).optional(), annee: z.number(), horizon: z.enum(['court-terme', 'moyen-terme', 'long-terme']).default('moyen-terme'), @@ -52,7 +82,7 @@ const acteursCollection = defineCollection({ loader: glob({ pattern: '**/*.{md,mdx}', base: './src/content/acteurs' }), schema: z.object({ nom: z.string(), - type: z.enum(['think-tank', 'institution-publique', 'parti-politique', 'organisation-internationale', 'media']), + type: z.enum(['think-tank', 'institution-publique', 'parti-politique', 'organisation-internationale', 'media', 'syndicat', 'federation']), orientation: z.enum(['gauche', 'centre-gauche', 'centre', 'centre-droit', 'droite', 'neutre']).optional(), specialites: z.array(z.string()).default([]), site: z.string().url().optional(), diff --git a/src/content/themes/_TEMPLATE.mdx b/src/content/themes/_TEMPLATE.mdx new file mode 100644 index 0000000..e8cdf14 --- /dev/null +++ b/src/content/themes/_TEMPLATE.mdx @@ -0,0 +1,316 @@ +--- +title: "Titre du thème" +slug: "slug-du-theme" +description: "Résumé en 1-2 phrases — situation, enjeux principaux." +ordre: 99 +priorite: haute + +# Budget & effectifs +budget_etat_milliards: 0 +effectifs_publics: 0 + +# KPI affiché dans le header +kpi_valeur: "XX%" +kpi_label: "Indicateur principal" +kpi_tendance: stable # hausse | baisse | stable | critique | alerte +kpi_contexte: "vs. UE : XX%" + +# Opinion (1 chiffre clé) +opinion_pct: 0 +opinion_question: "Question posée aux Français" +opinion_source: "Eurobaromètre" +opinion_annee: 2024 + +# Comparaison internationale +rang_eu: 0 +nb_pays_compares: 27 + +# Sections disponibles → pilote la nav +sections: + - diagnostic + - historique + - enjeux + - international + - opinion + - acteurs + - propositions + - scenarios + - sources + +# Qualité +score_sources: 0 +nb_propositions: 0 + +# Tags & sources +tags: [] +sources_data: [] +derniere_maj: "2026-06" +--- + +import Structurel from '../../components/Structurel.astro'; +import Politique from '../../components/Politique.astro'; +import Conjoncturel from '../../components/Conjoncturel.astro'; +import Kpi from '../../components/Kpi.astro'; +import Sondage from '../../components/Sondage.astro'; +import Timeline from '../../components/Timeline.astro'; + +## Diagnostic {#diagnostic} + +[Intro : 2-3 phrases de synthèse — le paradoxe ou la tension centrale du sujet en France] + +### Indicateurs clés + + + + + +### La situation actuelle + +[Analyse détaillée, chiffrée, sourcée. 4-6 paragraphes. Chaque chiffre cite sa source entre parenthèses italiques.] + +### Chiffres clés + +| Indicateur | France | Référence | Tendance | Source | +|-----------|--------|-----------|---------|--------| +| ... | ... | ... | → | ... | + +--- + +## Historique {#historique} + +[Phrase d'intro : pourquoi l'histoire explique la situation actuelle] + +### Chronologie des réformes majeures (30 ans) + +export const timelineItems = [ + { + annee: "1995", + titre: "Exemple réforme", + description: "Description concise de l'impact.", + impact: "neutre" + }, + { + annee: "2004", + titre: "Tournant majeur", + description: "Ce qui a changé structurellement.", + impact: "majeur" + }, + { + annee: "2017", + titre: "Réforme récente", + description: "Résultats observés.", + impact: "positif" + }, +]; + + + +### Les tournants décisifs + +[Analyse des 2-3 moments qui ont le plus façonné la situation actuelle. Pourquoi ces réformes ont réussi ou échoué.] + +--- + +## Enjeux {#enjeux} + +[Intro : les trois couches de lecture du problème] + + + +### Contraintes de fond + +[Ce qui est difficile à changer : démographie, géographie, culture administrative, contraintes constitutionnelles ou européennes, économie politique. Chiffres structurels.] + +- **Contrainte 1** : ... +- **Contrainte 2** : ... +- **Invariant** : ... + + + + + +### Ce qui fait débat + +[Les fractures politiques réelles sur ce sujet. Positions des 6 familles : gauche (LFI/PS), écologistes (EELV), centre (Renaissance/MoDem), droite (LR), extrême droite (RN), souverainistes. Votes parlementaires récents.] + +| Famille | Position | Argument central | Textes récents | +|---------|---------|-----------------|---------------| +| Gauche (LFI/PS) | ... | ... | ... | +| Écologistes | ... | ... | ... | +| Centre (Renaissance) | ... | ... | ... | +| Droite (LR) | ... | ... | ... | +| RN | ... | ... | ... | + + + + + +### Actualité (6 derniers mois) + +[Décisions gouvernementales, textes en cours, polémiques, derniers sondages. Référence aux événements de fin 2025 / début 2026.] + +- **[Mois AAAA]** : ... +- **[Mois AAAA]** : ... +- **Texte en cours** : ... + + + +--- + +## International {#international} + +### Comparaison UE & OCDE + +| Pays | Indicateur principal | [Indicateur 2] | [Indicateur 3] | Note | +|------|---------------------|---------------|---------------|------| +| **France** | **XX** | **XX** | **XX** | Situation spécifique | +| Allemagne | XX | XX | XX | — | +| Suède | XX | XX | XX | Modèle de référence | +| Espagne | XX | XX | XX | — | +| Moyenne UE | XX | XX | XX | — | + +### Ce que recommandent les institutions + +**OCDE :** [Recommandation principale, numéro de rapport, année] + +**Commission européenne :** [Position / Country Report France 2024] + +**FMI :** [Recommandation Article IV 2024] + +**Cour des comptes :** [Recommandation rapport récent] + +**France Stratégie :** [Recommandation publication récente] + +### Bonnes pratiques — ce qui fonctionne ailleurs + +**[Pays modèle 1] — [Mesure]** : [Description et résultats mesurés] + +**[Pays modèle 2] — [Mesure]** : [Description et résultats mesurés] + +--- + +## Opinion {#opinion} + +### Ce qu'en pensent les Français + + + + + +### Évolution dans le temps + +[Analyse de la tendance : est-ce que l'opinion s'améliore ou se dégrade ? Depuis quand ? Quels événements ont influencé l'opinion ?] + +| Année | % satisfaction | Source | +|-------|---------------|--------| +| 2018 | XX% | ... | +| 2020 | XX% | ... | +| 2022 | XX% | ... | +| 2024 | XX% | ... | + +### Clivages dans l'opinion + +[Différences significatives par âge, revenu, territoire, orientation politique] + +--- + +## Acteurs {#acteurs} + +### Institutions décisionnaires + +| Institution | Rôle | Tutelle | Budget | Responsable | +|------------|------|---------|--------|------------| +| Ministère ... | ... | Premier ministre | XX Md€ | [Ministre] | +| [Agence/établissement] | ... | [Ministère] | XX M€ | ... | + +### Think tanks — par orientation + +| Think tank | Orientation | Spécialité | Publications récentes | +|-----------|------------|-----------|----------------------| +| Institut Montaigne | Centre-droit | ... | [Titre rapport, 2024] | +| Terra Nova | Centre-gauche | ... | [Titre rapport, 2024] | +| iFRAP | Libéral | ... | [Titre rapport, 2024] | +| Fondapol | Centre-droit | ... | ... | +| OFCE | Centre-gauche | ... | ... | +| CAE | Neutre/expert | ... | ... | + +### Syndicats, fédérations, organisations professionnelles + +[Les acteurs intermédiaires qui pèsent sur les décisions dans ce secteur] + +--- + +## Propositions {#propositions} + +### Comparatif des positions partisanes + +| Parti | Proposition principale | Coût estimé | Horizon | Cohérence | +|-------|----------------------|------------|---------|-----------| +| LFI | ... | XX Md€ | CT | ... | +| PS | ... | XX Md€ | MT | ... | +| EELV | ... | XX Md€ | LT | ... | +| Renaissance | ... | XX Md€ | MT | ... | +| LR | ... | XX Md€ | MT | ... | +| RN | ... | XX Md€ | CT | ... | + +### Recommandations institutionnelles + +[Synthèse des recommandations OCDE + CE + Cour des comptes + France Stratégie, classées par faisabilité politique] + +### Propositions IRPF + +> **Notre analyse** : [1 paragraphe de cadrage — pourquoi ces propositions, quelle philosophie] + +**Proposition 1 — [Titre court]** +[Description, impact attendu, coût, horizon, conditions de réussite] + +**Proposition 2 — [Titre court]** +[Description, impact attendu, coût, horizon, conditions de réussite] + +**Proposition 3 — [Titre court]** +[Description, impact attendu, coût, horizon, conditions de réussite] + +--- + +## Scénarios 2027–2032 {#scenarios} + +### Scénario A — Continuité (probabilité : XX%) +**Hypothèse** : [statu quo politique] +**Impact** : [dégradation / stabilisation] +**Risques** : ... + +### Scénario B — Réforme graduelle (probabilité : XX%) +**Hypothèse** : [coalition + X réformes adoptées] +**Impact** : [amélioration mesurable] +**Conditions** : ... + +### Scénario C — Rupture (probabilité : XX%) +**Hypothèse** : [changement de majorité / crise déclenchante] +**Impact** : [transformation structurelle] +**Conditions** : ... + +--- + +## Sources {#sources} + +### Sources primaires +- [Auteur, *Titre*, Institution, Année. URL] + +### Sources secondaires +- [...] + +### Données +- [Base de données, institution, accès] diff --git a/src/pages/index.astro b/src/pages/index.astro index a930724..b752ff4 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -88,7 +88,7 @@ const rapports = (await getCollection('rapports')).slice(0, 3);
{themes.slice(0, 6).map((theme) => ( - +
{theme.data.title}

{theme.data.description}

diff --git a/src/pages/themes/[slug].astro b/src/pages/themes/[slug].astro index 1a92610..3c89e5d 100644 --- a/src/pages/themes/[slug].astro +++ b/src/pages/themes/[slug].astro @@ -16,17 +16,44 @@ const { Content } = await render(theme); const allPropositions = await getCollection('propositions'); const propositions = allPropositions.filter(p => p.data.theme === theme.data.slug); +// Sections configurées dans le frontmatter → nav dynamique +const SECTION_LABELS: Record = { + diagnostic: 'Diagnostic', + historique: 'Historique', + enjeux: 'Enjeux', + international: 'International', + opinion: 'Opinion', + acteurs: 'Acteurs', + propositions: 'Propositions', + scenarios: 'Scénarios', + sources: 'Sources', +}; + +const navSections = theme.data.sections.map(s => ({ + id: s, + label: SECTION_LABELS[s] ?? s, +})); + function orientationBadge(o?: string) { const map: Record = { - 'gauche': 'background:#fee2e2;color:#991b1b', + 'gauche': 'background:#fee2e2;color:#991b1b', 'centre-gauche': 'background:#fce7f3;color:#9d174d', - 'centre': 'background:#dbeafe;color:#1e40af', - 'centre-droit': 'background:#ede9fe;color:#5b21b6', - 'droite': 'background:#f3e8ff;color:#6b21a8', - 'neutre': 'background:#f3f4f6;color:#374151', + 'centre': 'background:#dbeafe;color:#1e40af', + 'centre-droit': 'background:#ede9fe;color:#5b21b6', + 'droite': 'background:#f3e8ff;color:#6b21a8', + 'neutre': 'background:#f3f4f6;color:#374151', + 'irpf': 'background:#0f172a;color:white', }; return map[o ?? 'neutre'] ?? map['neutre']; } + +function tendanceCouleur(t?: string) { + return { hausse: '#16a34a', baisse: '#dc2626', stable: '#6b7280', critique: '#dc2626', alerte: '#d97706' }[t ?? 'stable'] ?? '#6b7280'; +} + +function tendanceIcon(t?: string) { + return { hausse: '↑', baisse: '↓', stable: '→', critique: '⚠', alerte: '!' }[t ?? 'stable'] ?? '→'; +} ---
- -
-
-
- {theme.data.priorite === 'critique' && ( - PRIORITÉ CRITIQUE - )} -

{theme.data.title}

-

{theme.data.description}

-
- {theme.data.budget_etat_milliards && ( -
-
{theme.data.budget_etat_milliards} Md€
-
Budget État 2025
-
+ +
+
+
+
+ {theme.data.priorite === 'critique' && ( + PRIORITÉ CRITIQUE )} -
-
{propositions.length}
-
Propositions recensées
+ {theme.data.priorite === 'haute' && ( + PRIORITÉ HAUTE + )} +

{theme.data.title}

+

{theme.data.description}

+ + +
+ {theme.data.kpi_valeur && ( +
+
+ {theme.data.kpi_valeur} + {tendanceIcon(theme.data.kpi_tendance)} +
+
{theme.data.kpi_label}
+ {theme.data.kpi_contexte &&
{theme.data.kpi_contexte}
} +
+ )} + {theme.data.budget_etat_milliards && ( +
+
{theme.data.budget_etat_milliards} Md€
+
Budget État 2025
+
+ )} + {theme.data.opinion_pct && ( +
+
{theme.data.opinion_pct}%
+
{theme.data.opinion_question ?? 'Satisfaction'}
+ {theme.data.opinion_source &&
{theme.data.opinion_source} · {theme.data.opinion_annee}
} +
+ )} +
+
{propositions.length}
+
Propositions
+
+ {theme.data.score_sources && ( +
+
{theme.data.score_sources}
+
Sources vérifiées
+
+ )}
-
-
-
Mis à jour
-
{theme.data.derniere_maj}
-
-
Sources data
- {theme.data.sources_data.map(s => ( -
{s}
- ))} + + +
+
Mis à jour
+
{theme.data.derniere_maj}
+ {theme.data.rang_eu && ( +
+
Rang UE
+
{theme.data.rang_eu}/{theme.data.nb_pays_compares ?? 27}
+
+ )} +
+
Sources data
+ {theme.data.sources_data.slice(0, 6).map(s => ( +
{s}
+ ))} +
- -