- Déplacement du site de public/ vers src/ ; la page devient un gabarit Nunjucks (src/index.njk) généré par Eleventy dans _site/. - Saison, licence et cotisations extraites dans src/_data/saison.yml ; bureau, adresse postale et email dans src/_data/contacts.yml. - Ajout de .pages.yml : formulaires Pages CMS en français, avec validation des saisies (saison, prix, téléphone, code postal, email). - netlify.toml : build « npm run build » (Node 22), publication de _site. - README : notice d'utilisation de Pages CMS, nouvelle structure du dépôt et suppression des données dupliquées devenues obsolètes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>main
@ -0,0 +1,2 @@ |
|||
node_modules/ |
|||
_site/ |
|||
@ -0,0 +1,126 @@ |
|||
# Configuration de Pages CMS (https://app.pagescms.org) |
|||
# Définit les formulaires permettant de modifier le site sans toucher au code. |
|||
|
|||
content: |
|||
- name: saison |
|||
label: Saison et tarifs |
|||
type: file |
|||
path: src/_data/saison.yml |
|||
format: yaml |
|||
fields: |
|||
- name: annee |
|||
label: Saison en cours |
|||
type: string |
|||
required: true |
|||
description: "Format : 2026-2027" |
|||
pattern: |
|||
regex: "^\\d{4}-\\d{4}$" |
|||
message: "Indiquez la saison au format 2026-2027" |
|||
- name: licence |
|||
label: Licence FFEPGV (obligatoire) |
|||
type: object |
|||
fields: |
|||
- name: prix |
|||
label: Prix de la licence (€) |
|||
type: string |
|||
required: true |
|||
description: "Exemple : 29,80" |
|||
pattern: |
|||
regex: "^\\d+([,.]\\d{1,2})?$" |
|||
message: "Indiquez un montant comme 29,80 ou 100 (sans le symbole €)" |
|||
- name: avantages |
|||
label: Ce qui est inclus |
|||
type: string |
|||
list: true |
|||
- name: cotisations |
|||
label: Cotisations |
|||
type: object |
|||
description: "Une carte par formule, affichée dans l'ordre de la liste. L'icône (1, 2, 3…) suit cet ordre." |
|||
list: |
|||
collapsible: |
|||
collapsed: true |
|||
summary: "{fields.titre} : {fields.prix} €" |
|||
fields: |
|||
- name: titre |
|||
label: Intitulé |
|||
type: string |
|||
required: true |
|||
description: "Exemple : 1 cours / semaine" |
|||
- name: prix |
|||
label: Cotisation annuelle (€) |
|||
type: string |
|||
required: true |
|||
description: "Exemple : 100,00 (la licence est ajoutée automatiquement sous le prix)" |
|||
pattern: |
|||
regex: "^\\d+([,.]\\d{1,2})?$" |
|||
message: "Indiquez un montant comme 100,00 ou 100 (sans le symbole €)" |
|||
- name: populaire |
|||
label: Mettre en avant (badge « Le plus populaire ») |
|||
type: boolean |
|||
description: "À cocher sur une seule formule" |
|||
- name: avantages |
|||
label: Points forts |
|||
type: string |
|||
list: true |
|||
|
|||
- name: contacts |
|||
label: Contacts |
|||
type: file |
|||
path: src/_data/contacts.yml |
|||
format: yaml |
|||
fields: |
|||
- name: bureau |
|||
label: Membres du bureau |
|||
type: object |
|||
list: |
|||
collapsible: |
|||
collapsed: true |
|||
summary: "{fields.role} : {fields.prenom} {fields.nom}" |
|||
fields: |
|||
- name: role |
|||
label: Fonction |
|||
type: string |
|||
required: true |
|||
description: "Exemple : Présidente, Trésorier, Secrétaire…" |
|||
- name: prenom |
|||
label: Prénom |
|||
type: string |
|||
required: true |
|||
- name: nom |
|||
label: Nom |
|||
type: string |
|||
required: true |
|||
description: "Affiché automatiquement en majuscules" |
|||
- name: telephone |
|||
label: Téléphone |
|||
type: string |
|||
description: "Format : 06 12 34 56 78 (laisser vide pour ne pas afficher de numéro)" |
|||
pattern: |
|||
regex: "^(0\\d( \\d{2}){4})?$" |
|||
message: "Indiquez le numéro au format 06 12 34 56 78" |
|||
- name: adresse |
|||
label: Adresse postale |
|||
type: object |
|||
fields: |
|||
- name: rue |
|||
label: Numéro et rue |
|||
type: string |
|||
required: true |
|||
- name: code_postal |
|||
label: Code postal |
|||
type: string |
|||
required: true |
|||
pattern: |
|||
regex: "^\\d{5}$" |
|||
message: "Le code postal comporte 5 chiffres" |
|||
- name: ville |
|||
label: Ville |
|||
type: string |
|||
required: true |
|||
- name: email |
|||
label: Adresse email |
|||
type: string |
|||
required: true |
|||
pattern: |
|||
regex: "^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$" |
|||
message: "Adresse email invalide" |
|||
@ -0,0 +1,35 @@ |
|||
import { load as chargerYaml } from "js-yaml"; |
|||
|
|||
export default function (eleventyConfig) { |
|||
// Fichiers de données modifiés via Pages CMS (src/_data/*.yml)
|
|||
eleventyConfig.addDataExtension("yml,yaml", (contenu) => chargerYaml(contenu)); |
|||
|
|||
// Images et autres fichiers statiques copiés tels quels
|
|||
eleventyConfig.addPassthroughCopy("src/*.{png,jpg,jpeg,webp,svg,ico}"); |
|||
|
|||
// "29,80" ou "29.8" → { euros: "29", centimes: "80" }
|
|||
eleventyConfig.addFilter("prix", (valeur) => { |
|||
const [euros, centimes = ""] = String(valeur).trim().replace(".", ",").split(","); |
|||
// Espace insécable avant « : ; ! ? » (typographie française)
|
|||
eleventyConfig.addFilter("nbsp", (texte) => |
|||
String(texte).replace(/ ([:;!?»])/g, "\u00a0$1").replace(/« /g, "«\u00a0") |
|||
); |
|||
|
|||
return { euros, centimes: centimes.padEnd(2, "0") }; |
|||
}); |
|||
|
|||
// "06 20 17 47 54" → "+33620174754" (pour les liens tel:)
|
|||
eleventyConfig.addFilter("tel", (numero) => { |
|||
const chiffres = String(numero).replace(/[^\d+]/g, ""); |
|||
return chiffres.startsWith("0") ? "+33" + chiffres.slice(1) : chiffres; |
|||
}); |
|||
|
|||
// Espace insécable avant « : ; ! ? » (typographie française)
|
|||
eleventyConfig.addFilter("nbsp", (texte) => |
|||
String(texte).replace(/ ([:;!?»])/g, "\u00a0$1").replace(/« /g, "«\u00a0") |
|||
); |
|||
|
|||
return { |
|||
dir: { input: "src", output: "_site" }, |
|||
}; |
|||
} |
|||
@ -0,0 +1,14 @@ |
|||
{ |
|||
"name": "gvdc-site", |
|||
"private": true, |
|||
"description": "Site de l'association Gymnastique Volontaire de Conches-en-Ouche", |
|||
"type": "module", |
|||
"scripts": { |
|||
"build": "eleventy", |
|||
"start": "eleventy --serve" |
|||
}, |
|||
"devDependencies": { |
|||
"@11ty/eleventy": "^3.1.6", |
|||
"js-yaml": "^5.4.2" |
|||
} |
|||
} |
|||
@ -0,0 +1,19 @@ |
|||
# Bureau et coordonnées — modifiable via Pages CMS (https://app.pagescms.org) |
|||
bureau: |
|||
- role: Présidente |
|||
prenom: Monique |
|||
nom: LORIEUL |
|||
telephone: 06 20 17 47 54 |
|||
- role: Trésorière |
|||
prenom: Patricia |
|||
nom: ODEN |
|||
telephone: 06 84 44 03 07 |
|||
- role: Secrétaire |
|||
prenom: Khalissa |
|||
nom: SELMANI |
|||
telephone: 06 77 43 42 31 |
|||
adresse: |
|||
rue: 2 Place du onze novembre 1918 |
|||
code_postal: "27190" |
|||
ville: Conches-en-Ouche |
|||
email: gymnastiquevolontaireconches@gmail.com |
|||
@ -0,0 +1,26 @@ |
|||
# Saison en cours et tarifs — modifiable via Pages CMS (https://app.pagescms.org) |
|||
annee: "2026-2027" |
|||
licence: |
|||
prix: "29,80" |
|||
avantages: |
|||
- Affiliation FFEPGV |
|||
- Assurance incluse |
|||
- Espace personnel FFEPGV |
|||
- Reçu fiscal |
|||
cotisations: |
|||
- titre: 1 cours / semaine |
|||
prix: "100,00" |
|||
populaire: true |
|||
avantages: |
|||
- "Au choix : Lundi, Mercredi ou Vendredi" |
|||
- 1 heure par séance |
|||
- Cours multisports |
|||
- Moniteur qualifié |
|||
- titre: 2 cours / semaine |
|||
prix: "155,00" |
|||
populaire: false |
|||
avantages: |
|||
- Parmi les 3 créneaux |
|||
- 1 heure par séance |
|||
- Progression optimisée |
|||
- Moniteur qualifié |
|||
|
Before Width: | Height: | Size: 176 KiB After Width: | Height: | Size: 176 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 106 KiB |
|
Before Width: | Height: | Size: 154 KiB After Width: | Height: | Size: 154 KiB |
|
Before Width: | Height: | Size: 195 KiB After Width: | Height: | Size: 195 KiB |
|
Before Width: | Height: | Size: 157 KiB After Width: | Height: | Size: 157 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |