Ce projet est un socle pour générer un site web static pour les éditions du DevFest Dijon.
Le style et l'organisatiaon du site sont grandement inspirés de Hoverboard.
La stack sous-jacente est quant à elle très différente et repose sur Eleventy.
Le dépôt Git est prévu pour avoir :
- La branche
maincontenant la version en cours - Une branche par édition précédente (au format
devfest-dijon-<année>)
Le merges sur les branches branches main et devfest-dijon-<année> déclenches le workflow .github/workflows/firebase-hosting-merge.yml.
Cela correspond à :
- Lint du code
- Build du site
- Déploiement sur le site Firebase correspondant à la
targetdu nom de la branche (mis à part la targetmainqui déploie sur lesitedevfest-dijon, les autrestargets déploient sur unsitedu même nom que latarget)
Les autres branches et le pull-request déclenchent le workflow .github/workflows/firebase-hosting-pull-request.yml.
Cela reprend le mêmes étapes que le workflow .github/workflows/firebase-hosting-merge.yml à la différence que le déploiement Firebase se fait sur channel temporaire.
Le site de preview ainsi créé est accessible 7 jours (dans le cas d'une pull-request, un commentaire indiquant l'adresse de preview est ajouté par Firebase).
- Modifier les données de l'édition (
_dataet_assets) - Personnaliser le style
Les fichiers js dans le répertoire _data
- Utilisées par Eleventy pour générer le contenu des pages
- Inspirées de ce que fournit https://openplanner.fr (en JS pas JSON pour avoir la validation JSDoc)
Le script _data_gen/generate-from-openplanner.js permet de générer certains fichiers JS de données à partir de l'URL d'export JSON depuis OpenPlanner (version public).
Pour exécuter le script : node _data_gen/generate-from-openplanner.js https://storage.googleapis.com/conferencecenterr.appspot.com/events/<xxxxx>/<yyyyy>.json
Les fichiers dans le répertoire _assets
- Personnaliser du style CSS
- Custom properties dans
_assets/style.csspour faire une gestion de thèmes (ultra) simplifiée (https://www.color-hex.com/ peut être un outil utile) - Au besoin modifier des autres fichiers CSS
style.css: styles partagéslayout.css: styles de mise structuration des HTML (ne devrait pas être modifié dans le cadre de la personnalisation du contenu pour un évènement)- 1 fichier CSS par page du site (
session.css,schedule.css)
- Custom properties dans
- Modifier les polices de caractères
- Ajouter les polices comme dépendance dans le projet NPM
- Prendre en compte les fichiers dans
.eleventy.js - Inclure les CSS de la police dans
_layouts/base.njk - Modifier le CSS du projet (utiliser la police de caractères)
On distingue 2 types de contenu images.
Dans tous les cas les fichiers sont référencés avec des URLs relatives au dossier _assets (par exemple /avatar/foo.webp)
-
Les données : référencés dans les fichiers
_data_assets/avatarspour les speakers et les membres de l'équipe organisatrice (taille recommandée 128x128)_assets/sponsorspour les logos des sponsors (taille recommandée 300x150)
-
le style/thème du site : référencés dans les métadonnées Frontmatter des fichiers layouts et template des pages
_layout/base.njkbrandLogo: logo dans le header (taille recommandée 150x30)icons: favicons
_pages/index.njkbigLogo: logo dans la zone hero (taille recommandée 400x150)background: arrière plan de la zone hero (taille recommandée 2000x1100)teamPhoto: photo de l'équipe (taille recommandée 700x500)photos: 8 photos (taille recommandée [500..800]x[500..800])
- sur les autres pages (layout
_layouts/page.njk)image: arrière plan d l'entête (taille recommandée 2000x500)
Attention : penser à vérifier le rendu du texte affiché (en blanc) sur les images d'arrière plan.
Depuis la branche main propre, lancer :
npm run new-edition <année>(exemple : npm run new-edition 2027 pour préparer l'édition 2027 et archiver l'édition courante).
Le script :
- Crée la branche
devfest-dijon-<année-courante>(archive) et y met à jour_data/site.jsonvers l'URL d'archivehttps://devfest-<année-courante>.developers-group-dijon.fr/. - Sur
main: ajoute le mappingtarget→sitedans.firebasercet l'entréehostingcorrespondante dansfirebase.json, met à jour_data/rawEvent.js(nom, dates,previousEditions,callForPaper: null,sponsoringUrl: null), et vide les fichiers OpenPlanner (rawSessions.js,speakers.js,formats.js,categories.js,tracks.js). - Crée 2 commits locaux (pas de
git pushautomatique).
À la fin, le script affiche en sortie les étapes manuelles restantes :
- Créer le site Firebase pour l'archive (interactif, console ou
firebase hosting:sites:create devfest-dijon-<année>). - Configurer le DNS et le domaine personnalisé dans la console Firebase pour
devfest-<année>.developers-group-dijon.fr. - Pousser les deux branches sur GitHub (
git push origin devfest-dijon-<année>etgit push origin main). - Éditer les contenus éditoriaux sur
main:_data/rawEvent.js(visitors, comments, team, dates exactes),_data/sponsors.js,_data/ticketing.js(url/pricings, plusembedUrl— voir ci-dessous), assets visuels (logos, photos). - Si le prestataire de billetterie change et que
embedUrlest utilisée : ajouter son origine àframe-srcet àpayment=(…)dans les en-têtes du targetmaindefirebase.json, sinon l'iframe est bloquée en production. - Régénérer les données quand l'export OpenPlanner est prêt :
node _data_gen/generate-from-openplanner.js <url-json-export>.
_data/ticketing.js porte deux URL, écrites en entier :
url— le lien externe vers la billetterie. Seul champ nécessaire : les déclencheurs (lien « Billetterie » du header, cartes de tarifs de l'accueil) sont alors de simples<a>. Un tarif peut avoir le sien viapricing.url.embedUrl— la même billetterie en version embarquable, paramètres d'intégration compris (côté Skedl :?embed=true&showHero=false&showMerch=true&showSponsors=true…). Sa seule présence transforme les déclencheurs en<button>ouvrant un<dialog>, avec un<noscript>de repli versurl. Surchargeable par tarif viapricing.embedUrl.
Les deux URL sont utilisées telles quelles, sans transformation au build : les paramètres d'intégration se règlent donc dans les données, sans toucher au code. Penser à les faire évoluer ensemble.
Trois conséquences à ne pas oublier quand embedUrl est renseignée :
- son origine doit figurer dans
frame-srcet danspayment=(…)de laPermissions-Policydu targetmain(firebase.json) — sans quoi la CSP bloque l'iframe et la délégation de la Payment Request API échoue. C'est cette listeframe-srcqui constitue la frontière de confiance : l'iframe n'est pas mise ensandbox, un bac à sable assez permissif pour un tunnel de paiement devant inclureallow-scripts+allow-same-origin, combinaison qui permet à l'iframe de le retirer elle-même ; Escne ferme pas le dialog quand le focus est passé dans l'iframe : l'événement clavier part au document embarqué. Comportement inhérent au cross-origin, non corrigeable côté site ; d'où le bouton de fermeture toujours visible, le clic hors panneau et le lien « ouvrir dans un onglet » ;- la hauteur de l'iframe suit le message
skedl:resizeémis par la billetterie (origine et frame émettrice vérifiées, cf._assets/js/ticketing-sheet.js). Un autre prestataire n'émettra pas ce message : l'iframe gardera alors le70dvhde_assets/css/ticketing.csset son défilement interne.
À la racine :
_assets: les ressources statiques (JS de run, CSS, images), non traitées par Eleventy_data: les données utilisées par Eleventy pour générer le siteeleventyComputed.js: construction de nouvelles données pour Eleventy à partir des autres données (traitement, manipulation, etc.)
_eleventy: filtres et shortcodes Eleventy_layout: les layouts des pages_site: résultat du buildpages: les pages (et templates de pages) du site.eleventy.js: la configuration d'Eleventy- autres fichiers et dossiers : fichiers de configuration des outils de build/lint/ci/etc.
- JSDoc :
tsconfig.json - ESLint :
.eslintrc.js,.eslintignore - Prettier :
.prettierrc.js - Stylelint :
.stylelintrc.js - Commitlint :
.commitlintrc.js - Browserlist (code JS de dev + code JS et CSS de run) :
.browserslistrc
Pas de bibliothèques : uniquement du HTML, des CSS et un peu de JS.
Les commandes utiles sont toutes définies comme script dans package.json.
lint: vérifie codeformat: format le codebuild: construit le site dans_siteserve: construit, watch et sert le site en local sur le port8080