- src/lib/tags.ts (pur) : mots-clés par métier pour les 104 catégories,
vocabulaire transversal détecté dans la description (fait maison, bio,
livraison, sur rendez-vous, devis gratuit…), suggestTags() qui combine
métier, commune et description, autoTags() qui n'intervient qu'à vide.
- Enregistrement : addMember, updateMember et updateOwnProfile passent par
resolveMemberTags() ; un champ laissé vide reçoit les suggestions, une
saisie n'est jamais remplacée.
- Formulaires : composant TagsField (champ non contrôlé + pastilles de
suggestions recalculées à chaque frappe depuis catégorie, commune et
description ; « Tout ajouter »), dans l'espace adhérent et la fiche staff.
- Fiche publique : les fiches jamais ré-enregistrées affichent les tags
suggérés et les transmettent dans LocalBusiness.keywords.
- tests/tags.test.ts : couverture de chaque métier, nettoyage, détection,
ordre des suggestions, non-écrasement.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HDbKbJrPWweXXYSxA8MXW7
- Fiches adhérents : URL canonique /adherents/12-au-bon-pain-frouard
(memberPath). L'identifiant en tête suffit ; /adherents/12 et tout slug
périmé sont redirigés de façon permanente vers la forme canonique, donc
les anciens liens et les partages sociaux restent valides. Tous les liens
(accueil, carrousel, annuaire, JSON-LD, sitemap, publications Facebook /
LinkedIn) passent par memberPath.
- Pages métier /annuaire/[categorie] : une page indexable par catégorie
avec titre, introduction (effectif, communes), grille d'adhérents, fil
d'Ariane et ItemList. Sans adhérent : noindex et hors sitemap. Section
« Parcourir par métier » sur l'annuaire et « Autres métiers » sur chaque
page pour le maillage interne.
- Composants partagés MemberCard et CategoryLinks ; slugify déplacé dans
src/lib/slug.ts.
- Backend : conseils de rédaction sous les champs description et tags des
formulaires adhérent (espace adhérent et fiche staff).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HDbKbJrPWweXXYSxA8MXW7
- Accueil : le bandeau « Faites partie de l'aventure » affiche le nombre
d'adhérents validés (statut active) au lieu de « plus de 120 » codé en dur.
- Pied de page : les boutons Facebook / LinkedIn ont la même largeur (grille à
une colonne dimensionnée sur le plus long) et une icône à largeur fixe.
- Catégories : référentiel unique dans src/db/categories.ts (104 métiers, dont
assurance, bazar/discount, grande distribution, librairie-presse, tabac,
vétérinaire, auto-école, etc.), inséré par la migration 0012 avec
ON CONFLICT (slug) : les catégories manquantes apparaissent au prochain
démarrage, sans écraser un libellé renommé depuis le backend. Le seed et
l'action « Ajouter une catégorie » réutilisent ce référentiel et sa palette.
- tests/categories.test.ts vérifie unicité des slugs, contraintes de la table
et cohérence entre le référentiel et la migration.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HDbKbJrPWweXXYSxA8MXW7
Trois colonnes dont une très large laissaient le tiers droit vide, les titres ne
se distinguaient pas des liens, et les deux icônes sociales flottaient en bas à
gauche sans rattachement.
- Quatre colonnes : marque, Accès rapide, Informations, Nous suivre. La largeur
est enfin occupée, et la dernière colonne accueille aussi les coordonnées de
l'association dès qu'elles sont renseignées dans Paramètres.
- Titres en capitales espacées sur le brun de la marque : ils reprennent le
vocabulaire des pastilles utilisées partout ailleurs sur le site, et se lisent
désormais comme des titres.
- Icônes sociales remplacées par des boutons libellés, calés à gauche pour ne
pas s'étirer en pavés vides.
- Filet doré en haut du bloc, pastille dorée devant « Bassin de Pompey » : la
page se referme au lieu de s'arrêter sur une ligne grise.
- Liens plus aérés, décalage léger au survol.
- Deux entrées utiles ajoutées : Rencontres passées et Espace adhérent.
- Replis : 3 colonnes sur tablette, 2 sur téléphone avec la marque et les
réseaux sur toute la largeur.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QXNXRC4j5VLfKvpyyisrnb
Le bandeau Mission tenait en une phrase et ne disait pas ce que l'adhésion
apporte concrètement.
- Mission réécrite en trois paragraphes : le réseau et les rencontres, la mise
en avant de chaque adhérent auprès des habitants et des professionnels, et
l'objectif double clients de proximité / courants d'affaires locaux.
- Nouveau bloc de quatre cartes sous le bandeau : se rencontrer, gagner en
visibilité (site et réseaux sociaux), attirer des clients en B to C,
développer des affaires en B to B.
- Les deux contenus sont éditables dans Paramètres : la mission accepte des
paragraphes séparés par une ligne vide, les apports suivent la convention
« Titre|Description » déjà utilisée pour le directoire.
- Migration 0009 : le texte de mission n'est remplacé que s'il est resté celui
d'origine, une version réécrite à la main n'est jamais écrasée.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QXNXRC4j5VLfKvpyyisrnb
Le menu empilait douze liens sous un seul intitulé, avec des carrés, ronds et
losanges qui ne portaient aucun sens. Sur téléphone, la barre latérale se
dépliait en ligne et devenait un pavé de boutons inutilisable.
Navigation
- Six rubriques au lieu d'une pile : Pilotage, Vie du réseau, Rencontres,
Communication, Configuration, Côté adhérent. Le quotidien est ainsi séparé de
ce qu'on ne touche qu'occasionnellement.
- Une icône par entrée (`BackendIcons.tsx`) à la place des formes génériques.
- Le menu devient une table de données filtrée par capacité, au lieu de douze
blocs JSX répétant les mêmes appels à `can()`.
Mobile
- Sous 1024px la barre latérale devient un tiroir : voile de fond, fermeture par
Échap, par clic hors zone et à la navigation, défilement de la page bloqué,
actions Voir le site / Déconnexion rapatriées dans le tiroir.
- `min-height: 0` sur la zone de navigation : sans lui l'enfant flex refusait de
rétrécir et la carte utilisateur recouvrait les derniers liens, interceptant
les clics.
- En-tête public repensé : logo toujours présent sur téléphone (seul retour à
l'accueil), accès adhérent sur la même ligne, navigation répartie en dessous
au lieu de se replier en escalier.
- Liste des adhérents : le tableau à cinq colonnes devient une fiche par
adhérent, sur deux lignes constantes, sans défilement horizontal.
- Compteurs du tableau de bord en deux colonnes plutôt qu'empilés.
Vérifié : aucun débordement horizontal sur les 23 pages en 320, 390 et 768 px ;
tiroir et cibles tactiles testés au doigt sur toutes les interactions.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QXNXRC4j5VLfKvpyyisrnb
Bloc « Informations pratiques » (fiche adhérent)
- Suppression des dégradés hors palette (radial doré de la section, dégradés
crème/bleu des deux sous-cartes) au profit du vocabulaire visuel du site :
carte blanche bordée, sous-cartes plates sur le fond de champ, variables CSS.
- La pastille « Préparer votre visite » devient une puce arrondie identique aux
badges du reste du site ; le chip d'ouverture reprend les teintes de statut.
- Les glyphes texte ◷ et ↗ sont remplacés par des icônes SVG cohérentes.
Suspension des promotions
- Nouveau statut `suspended` + colonnes `suspended_by` / `suspended_by_id` /
`suspended_at`.
- L'adhérent suspend et réactive ses propres promotions depuis Mon espace ;
l'association suspend et réactive n'importe laquelle depuis le backoffice.
- Une suspension décidée par l'association ne peut pas être levée par
l'adhérent : le motif est affiché dans son espace.
- Les lectures publiques filtrant déjà sur `live`, une promo suspendue quitte
immédiatement l'accueil, l'annuaire et la fiche.
Publication Facebook / LinkedIn
- `src/lib/social.ts` : publication d'une promo en ligne sur la page Facebook
(Graph API, upload multipart car les images sont en data-URI) et sur la page
LinkedIn (Posts API + Images API en trois étapes).
- Jetons d'accès exclusivement en variables d'environnement ; un réseau non
configuré masque son bouton.
- Table `social_posts` : chaque tentative est tracée, un échec est rattrapé et
affiché sur la carte de la promo sans interrompre le backoffice.
- Nouvelle capacité RBAC `publishSocial` (admin + modérateur).
Liens sociaux publics
- Réglages `association_facebook` / `association_linkedin` éditables dans
Paramètres, préremplis avec les pages de l'association.
- Section « Plein R sur les réseaux » sur l'accueil et icônes dans le pied de
page, masquées si le réglage est vide.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QXNXRC4j5VLfKvpyyisrnb
- Anti-debordement horizontal global (overflow-x hidden, img max-width)
- Container : padding reduit a 16px sous 640px
- En-tete/pied de page : padding horizontal fluide (clamp), en-tete wrap
- Titres principaux en clamp() (accueil hero/h2, annuaire, fiche) pour
ne plus deborder sur petit ecran
- Liste adherents du back-office : defilement horizontal (.table-scroll)
au lieu de colonnes ecrasees
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Retire le kill-switch prefers-reduced-motion (* { animation:none }) qui
coupait toutes les animations : etoiles, flottement du logo, apparitions
au defilement ne bougeaient pas. Animations desormais toujours actives.
- Nouveau StarField : champ d'etoiles qui scintillent ET derivent
(keyframe plr-drift via propriete translate, cumulee au scintillement),
place dans le hero. Contenu du hero passe au-dessus (z-index).
- Carrousel : fondu force (n'est plus desactive sous reduced-motion).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Remplace le defilement continu par 3 cartes fixes et propres. Toutes
les 20 s, les cartes disparaissent une a une (fondu decale) puis les
3 suivantes apparaissent une a une. Rotation equitable sur tous les
adherents actifs. Respecte prefers-reduced-motion (bascule sans fondu).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Hero : logo centre verticalement (alignItems center)
- Titre "A l'honneur ce mois-ci" -> "A l'honneur"
- Remplace les 3 fiches "mise en avant" par un carrousel auto-defilant
de tous les adherents actifs, en rotation equitable (l'ordre pivote
d'un cran par heure). Pause au survol, respecte prefers-reduced-motion.
- Retire la coche "Mettre a l'honneur" du back-office (edition adherent)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Enrichit la fiche : couverture + avatar, identité (catégorie, localisation,
adhérent depuis, boutons Appeler/Itinéraire), à propos multi-paragraphes + tags,
informations pratiques (horaires + contact tél/email/site), carte Google Maps,
colonne promotions en cours et CTA contact.
Ajoute les champs members: cover_url, phone, website, postal_code, member_since,
hours, tags (migration 0001) ; éditables dans le back-office ; seed enrichi
(Au Bon Pain conforme à la maquette).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XwfhYHzC9hQWPDnQ2p53GL