← Projets

Synerlab

Un site WordPress bâti comme un jeu de blocs : un page builder maison qui laisse le client composer chaque page, sur un front-end webpack en JavaScript orienté objet.

Accueil de synerlab.ca : photo noir et blanc traversée d'un biseau vert-turquoise, titre « Envie de transformer l'économie? » et bouton « Déposer un projet ».
Client
MRC d'Argenteuil · Synerlab
Mon rôle
Gestion, structure et programmation
Techno
WordPress · page builder maison · webpack · JS orienté objet · SCSS
En ligne
synerlab.ca (nouvel onglet) ↗

Le mandat

Synerlab, le centre d'innovation en économie circulaire de la MRC d'Argenteuil, devait présenter trois offres très différentes (facilitation, incubation, laboratoire industriel), plus un parc industriel et un appel à projets en continu. Et l'équipe devait pouvoir faire évoluer ces pages sans repasser par un développeur.

Mon rôle : la gestion et la structure du projet avec Bernard Imbert, puis toute la programmation. Le concept visuel venait du design ; mon travail, c'était de le transformer en système que le client peut manipuler.

Un page builder maison

Plutôt que des gabarits figés, le thème expose une bibliothèque de blocs. Dans l'administration, le client empile les sections qu'il veut, dans l'ordre qu'il veut, et remplit leurs champs : aucune page n'est codée en dur.

Dix blocs couvrent tout le site : hero, texte-image, cartes, blocs de couleur, icônes, texte simple, citation, partenaires, liste d'articles et formulaire. Chaque section partage la même enveloppe (o-section) ; le bloc ne s'occupe que de son contenu.

Accueil

  1. hero
  2. text-image
  3. cards
  4. partners
  5. partners

Synercité

  1. hero--no-shape
  2. simple-text
  3. hero--no-shape
  4. simple-text
  5. type_icons
  6. type_icons

Laboratoire

  1. simple-text
  2. blocs
  3. hero--standalone

À propos

  1. text-image--reverse
  2. quote
  3. simple-text
  4. hero--standalone
  5. type_icons

Déposer un projet

  1. simple-text
  2. quote
  3. simple-text
  4. form
Composition réelle des pages en ligne, relevée dans le HTML : chaque page est une pile de blocs choisie par le client.

Des variantes plutôt que des gabarits

Un même bloc couvre plusieurs besoins grâce à des modificateurs : le hero devient bandeau autonome (--standalone) ou perd sa forme géométrique (--no-shape), le texte-image s'inverse (--reverse) ou fait chevaucher son média, une section bascule sur le fond de couleur de la marque (--quaterny).

Résultat : peu de code, beaucoup de combinaisons. Les trois pages de services utilisent exactement la même recette (texte, blocs de couleur, bandeau) et restent pourtant distinctes.

Le bloc « cartes » de l'accueil : trois tuiles photo avec un biseau de couleur.

Un front-end orienté objet

Le JavaScript est découpé en classes, regroupées par webpack avec le SCSS du thème. Une classe Main démarre l'application, puis une ComponentFactory parcourt le DOM : chaque élément qui porte un attribut data-component reçoit l'instance de la classe correspondante.

Le PHP n'a donc qu'à écrire data-component="Carousel" dans le gabarit d'un bloc pour lui donner un comportement. Ajouter un composant, c'est écrire une classe et l'inscrire dans la liste.

export default class ComponentFactory {
  constructor() {
    this.componentInstances = [];
    this.componentList = { Carousel, Header, Scrolly };
    this.init();
  }

  init() {
    document.querySelectorAll('[data-component]').forEach((element) => {
      const Component = this.componentList[element.dataset.component];
      if (Component) this.componentInstances.push(new Component(element));
    });
  }
}
ComponentFactory (simplifié) : le lien entre les blocs PHP et les classes JS.

Des composants configurables par attributs

Chaque composant lit ses options dans le HTML. Header masque l'en-tête au défilement si data-auto-hide est présent et gère la navigation mobile. Scrolly révèle les éléments avec un IntersectionObserver, avec un décalage en cascade (data-stagger) ou en boucle (data-repeat). Carousel enveloppe Swiper.

Les blocs restent ainsi déclaratifs : le client choisit un bloc, le gabarit pose les bons attributs, la classe fait le reste.

Le bloc « blocs » de la page Laboratoire : quatre tuiles de couleur.

Une structure CSS prévisible

Le SCSS suit une nomenclature à préfixes : o- pour les objets de mise en page (o-section, o-wrapper), u- pour les utilitaires (u-hidden-visually), et BEM pour les blocs (card__media, text-image__content, partners__content--white).

On sait en lisant une classe d'où elle vient et ce qu'elle a le droit de toucher : un bloc ne déborde jamais sur un autre, ce qui rend les combinaisons du page builder sûres.

Un dépôt de projet intégré

Le formulaire d'appel à projets est lui-même un bloc : le client le place où il veut, sous les sections d'explication. Le formulaire est géré par une extension WordPress et habillé par le thème, pour que l'équipe modifie ses champs sans toucher au code.

Responsive par bloc

Chaque bloc gère sa propre adaptation : les cartes s'empilent, le texte-image passe en colonne, la navigation bascule dans le menu mobile du composant Header. Une page composée par le client reste donc correcte sur téléphone, peu importe l'ordre des blocs.

  • Accueil sur téléphone : le bloc texte-image passe en colonne et les cartes de services s'empilent. Accueil · text-image + cards
  • Page Laboratoire sur téléphone : les quatre blocs de couleur empilés. Laboratoire · blocs
  • Page Synercité sur téléphone : hero photo, en-tête avec menu mobile, puis texte simple. Synercité · hero + simple-text
  • Page Déposer un projet sur téléphone : coordonnées puis champs du formulaire. Déposer un projet · form

Crédits

Client
MRC d'Argenteuil · Synerlab
Gestion et structure
Matthieu Parent, Bernard Imbert
Programmation
Matthieu Parent
Design
Christine Martel

Captures réalisées sur le site en ligne. Photographies et logos : propriété de leurs auteurs et de MRC d'Argenteuil · Synerlab.