Commit Graph

59 Commits

Author SHA1 Message Date
Enguerrand Ozano
97379506e4 Fix login3 2026-02-28 22:12:37 +01:00
Enguerrand Ozano
65f6d1c4d6 Fix login 2026-02-28 20:45:12 +01:00
Enguerrand Ozano
a48468ae45 Fix params/searchParams types for Next.js app router 2026-02-28 20:00:04 +01:00
Enguerrand Ozano
7f7a2f4edd Fix params/searchParams types for Next.js app router 2026-02-28 19:43:43 +01:00
Enguerrand Ozano
2d330160e9 Fix params/searchParams types for Next.js app router 2026-02-28 19:41:31 +01:00
Enguerrand Ozano
cdb50e0414 Fix params/searchParams types for Next.js app router 2026-02-28 19:37:34 +01:00
Enguerrand Ozano
54d2512be0 fix: use direct config import in payload page 2026-02-28 15:21:06 +01:00
Enguerrand Ozano
34629b228d fix: move importMap to correct folder 2026-02-28 15:19:54 +01:00
Enguerrand Ozano
e6a982e735 feat: add payload routes on /gestion59 2026-02-28 15:17:56 +01:00
Claude
6028dec0d8 feat: site plus clair — photo hero, cards blanches, suppression emojis + budget
- Hero : photo construction (Unsplash) avec gradient overlay, carte glassmorphisme
- Services : fond blanc, numérotation 01/02/03 à la place des emojis
- CTA band : photo brique + overlay rouge brique 90%
- Témoignages : fond pierre clair (bg-stone-bg), cards blanches avec bordures
- Partenaires : suppression emojis, labels texte seuls
- Contact section : photo subtile en arrière-plan gauche
- ContactForm : suppression du champ budget

https://claude.ai/code/session_01Uec4iHjcPwB1pU41idWEdF
2026-02-27 20:45:08 +00:00
Claude
8ed671cb9c feat: refonte UI éditoriale — toutes les pages secondaires
Contact :
- Redesign complet split dark/light identique à la homepage
- Infos gauche (dark navy) : téléphone animé, email, adresse, zones, stats
- Formulaire droit (stone-bg) avec labels uppercase et champs squarés

Services :
- Liste éditoriale sur dark navy — layout grid 12 cols numéroté
- Keywords en pills squared, arrow animée, border-top orange

Réalisations :
- Filtres squared (suppression rounded-full)
- Cards avec overlay slide-from-bottom rouge brique
- Badge catégorie orange + CTA bottom dark navy

Partenaires :
- Hero dark + diagonal panel
- Bloc stats 2-col avec border-l orange
- Grid 4-col squared, grayscale → couleur au hover
- CTA dark avec texture

ServicePageLayout (composant partagé) :
- Composant réutilisable pour toutes les pages de service
- Hero dark + diagonal + back link
- Stats border-l-2 orange
- Items grid dark avec service-card-dark
- SEO text 2-col
- Contact split dark/light

Pages mises à jour avec ServicePageLayout :
- renovation/page.tsx
- assainissement/page.tsx
- creation-acces/page.tsx
- demolition/page.tsx

construction-maison/page.tsx :
- Redesign complet en standalone avec le même pattern éditorial

https://claude.ai/code/session_01Uec4iHjcPwB1pU41idWEdF
2026-02-27 17:22:57 +00:00
Claude
5493d6a660 feat: refonte UI éditoriale — style Messager + animations boutons
Navbar :
- Style éditorial : liens uppercase tracking-wide, underline slide au hover
- Bouton "Devis gratuit" avec animation slide-fill
- Active state par pathname

Page d'accueil :
- Hero split : texte gauche (clamp typography) + panneau diagonal brique droit
- Services : fond navy-light, cards avec bordure top orange, emoji + arrow animée
- Bande CTA : bg-orange full-width, btn-fill-white + btn-outline-light
- Réalisations : grid avec overlay slide-from-bottom au hover (rouge brique)
- Témoignages : dark navy, cards avec border-top
- Zone intervention : split 2 cols, pills uppercase
- Partenaires : grid 8 cols, grayscale → couleur au hover
- FAQ : split 2 cols, accordion avec icône + rotation
- Contact : split dark/light — infos gauche + formulaire droit

Globals.css :
- Classes .btn, .btn-fill, .btn-outline-dark/light, .btn-fill-white, .btn-arrow
- Animation slide-from-left via ::before pseudo-element
- .realisation-overlay (slide-up), .hero-diagonal-panel (clip-path)
- .nav-link (underline grow), .service-card-dark, .faq-icon

ContactForm + Footer : style éditorial squares, uppercase labels

https://claude.ai/code/session_01Uec4iHjcPwB1pU41idWEdF
2026-02-27 13:36:10 +00:00
Claude
a133f195c2 feat: nouvelle DA rouge brique + domaine obc-maconnerie.fr
- Palette DA : rouge brique #8B1A1A, gris ardoise #6B7B7A, blanc cassé #F8F6F4
- globals.css : refonte complète @theme inline avec toutes les variables de couleur
- Ajout utilitaires CSS : .texture-dark, .hero-accent, .brick-divider, .section-label
- Animations pulse-glow et stat-glow adaptées au rouge brique
- app/page.tsx : hero amélioré (font-black, texture béton, accent diagonal brique)
- Correction domaine : obc-terrassement.fr → obc-maconnerie.fr dans tous les fichiers
- ContactForm : couleurs état erreur corrigées (variables CSS)

https://claude.ai/code/session_01Uec4iHjcPwB1pU41idWEdF
2026-02-27 13:17:02 +00:00
Claude
15c60a274c feat: préparation Payload CMS — couche d'abstraction contenu
Sépare données et affichage pour basculer vers Payload CMS sans réécrire les composants.

Nouveaux fichiers :
- lib/site-config.ts : source unique de vérité pour toutes les données du site (as const)
- lib/content.ts : couche async entre données et composants (static aujourd'hui, Payload demain)
- types/content.ts : types TypeScript partagés (Service, Realisation, Partner, BlogPost, etc.)
- payload/ : schémas CollectionConfig et GlobalConfig commentés prêts à activer

Données enrichies dans siteConfig :
- partners : ajout du champ desc pour chaque partenaire
- realisations : 6 entrées complètes avec categorie et color
- blogPosts : 6 articles avec slug, titre, extrait, cat, date, readTime

Refactorisations (composants → content layer) :
- Navbar, Footer : importent siteConfig directement (client component)
- app/page.tsx : async, Promise.all sur getServices/getTestimonials/getFAQ/getValues/getPartners/getRealisations
- app/services/page.tsx : getServices() + getSiteConfig()
- app/contact/page.tsx : getSiteConfig() pour phone, email, address, zones
- app/realisations/page.tsx : getRealisations() + getSiteConfig()
- app/partenaires/page.tsx : getPartners()
- app/blog/page.tsx : getBlogPosts()
- app/blog/[slug]/page.tsx : getBlogPost() + getBlogPosts() pour generateStaticParams
- LocalSEOPage.tsx : siteConfig pour services list, phone, address
- 5 pages service (construction-maison, renovation, assainissement, creation-acces, demolition) : getSiteConfig() pour phone
- Pages légales et SEO locales : siteConfig importé pour données dynamiques

Corrections URL :
- Toutes les URLs canoniques obc-maconnerie.fr → obc-terrassement.fr (30+ fichiers)
- layout.tsx : BASE_URL depuis siteConfig.url
- robots.ts, sitemap.ts : BASE_URL depuis siteConfig.url
- api/contact/route.ts : email fallback → obc-terrassement.fr

https://claude.ai/code/session_01Uec4iHjcPwB1pU41idWEdF
2026-02-27 13:05:19 +00:00
Claude
3adcec00b7 feat: Transform HookLab to OBC Maçonnerie showcase site
Complete transformation of the Next.js project into a professional
showcase site for OBC Maçonnerie (Benoît Colin, maçon in Nord 59).

Key changes:
- Remove all HookLab/Sanity/Supabase/Stripe/admin/training infrastructure
- Full OBC Maçonnerie identity: logo, colors, contact info, SIREN
- Schema.org LocalBusiness structured data for Benoît Colin
- SEO metadata for all pages targeting Nord 59 keywords

New pages created (23 total):
- Home page with 10 sections (hero, services, pillars, partners,
  zone, realisations, testimonials, FAQ, contact form, footer)
- Service pages: construction-maison, renovation, assainissement,
  creation-acces, demolition, services
- Secondary pages: realisations, partenaires, contact
- Blog: listing + 6 SEO articles with static content
- 8 local SEO pages: Orchies, Douai, Valenciennes, Mouchin,
  Flines-lès-Raches, Saint-Amand-les-Eaux
- Legal pages: mentions-legales, cgv, confidentialite (OBC adapted)

Components:
- Navbar with OBC branding + mobile menu
- Footer with dark navy theme, services + navigation links
- ContactForm client component (devis request)
- LocalSEOPage reusable component for local SEO pages
- CookieBanner updated with OBC cookie key

Config:
- layout.tsx: OBC metadata, Schema.org, no Sanity CDN
- globals.css: stone color variables added
- next.config.ts: removed Sanity CDN remotePatterns
- sitemap.ts: all 30 OBC pages
- robots.ts: allow all except /api/
- api/contact/route.ts: OBC devis email template

https://claude.ai/code/session_01Uec4iHjcPwB1pU41idWEdF
2026-02-27 09:05:03 +00:00
Claude
d1da2ba823 fix(email): set admin notification recipient to enguerrandbusiness@outlook.com
https://claude.ai/code/session_01PzA98VhLMmsHpzs7gnLHGs
2026-02-23 07:45:20 +00:00
Claude
6c33406e13 feat(email): wire all forms to Resend — contact, devis, candidature notifs
- Create /api/contact → sends admin notification email on audit request
- Create /api/devis → sends admin notification email on macon devis request
- Contact.tsx: make inputs controlled, call /api/contact on submit
- MaconClient.tsx DevisForm: add controlled state + submit handler calling /api/devis, add success/error states
- /api/candidature: add admin notification email alongside candidate confirmation
- /api/admin/candidatures/[id]/reject: fetch candidate info + send rejection email

All routes read ADMIN_EMAIL env var for admin notifications (fallback to RESEND_FROM_EMAIL).

https://claude.ai/code/session_01PzA98VhLMmsHpzs7gnLHGs
2026-02-23 07:36:00 +00:00
Claude
d54278969a fix(img-api): proxy image content instead of redirecting to fix Google indexing errors
Replace all NextResponse.redirect() calls with a proxyImage() helper that
fetches the upstream URL server-side and streams the response body directly.

This eliminates:
- Redirect chains (API → Supabase signed URL → S3/CDN)
- Overly long redirect URLs (Supabase JWT tokens)
- Potential empty/invalid redirect targets

Also adds X-Robots-Tag: noindex, nofollow on all responses from this
technical route to prevent Google from crawling it directly.

https://claude.ai/code/session_01PzA98VhLMmsHpzs7gnLHGs
2026-02-23 07:27:07 +00:00
Claude
800a9c08b4 feat(upload): optimisation automatique WebP avec Sharp
- Installe sharp pour le traitement d'image côté serveur
- Conversion automatique de tout upload en WebP (meilleur ratio qualité/web)
- Auto-rotation basée sur l'orientation EXIF (corrige les photos de téléphone)
- Strip de toutes les métadonnées personnelles (GPS, appareil, EXIF)
- Compression adaptative par paliers (q82 → q72 → q62 → q50) pour viser ≤ 1 Mo
- Augmentation de la limite brute à 20 Mo (avant optimisation)
- Métadonnées Supabase Storage : Content-Type + Cache-Control 1 an
- UI : stats d'optimisation affichées après upload (ex: "2400 Ko → 680 Ko (WebP q82)")
- Mise à jour du texte d'aide dans l'admin images

https://claude.ai/code/session_01PzA98VhLMmsHpzs7gnLHGs
2026-02-21 09:17:39 +00:00
Claude
3843595e18 security: corriger les vraies vulnérabilités détectées par l'audit
1. MIME spoofing (upload) — app/api/admin/upload/route.ts
   - Ajout de la validation par magic bytes : lit les premiers octets du
     fichier et vérifie la signature binaire réelle (JPEG FF D8 FF,
     PNG 89 50 4E 47, GIF 47 49 46 38, WebP RIFF+WEBP, AVIF ftyp box)
   - Extension dérivée exclusivement du MIME validé côté serveur
     (MIME_TO_EXT), jamais du nom de fichier fourni par le client
   - Un fichier .exe renommé en .jpg est désormais rejeté

2. Générateur de mot de passe non-cryptographique — stripe/webhook/route.ts
   - Remplace Math.random() (non-déterministe mais prévisible) par
     crypto.getRandomValues() (CSPRNG, conforme Web Crypto API)

3. Headers HTTP de sécurité manquants — middleware.ts (nouveau)
   - X-Content-Type-Options: nosniff (anti MIME-sniffing navigateur)
   - X-Frame-Options: SAMEORIGIN (anti clickjacking)
   - Referrer-Policy: strict-origin-when-cross-origin
   - Permissions-Policy: désactive camera, micro, geolocation
   - Content-Security-Policy: whitelist stricte par type de ressource
     (scripts, styles, images Unsplash/Supabase/Sanity, connect Supabase/Stripe,
     frames Stripe uniquement, object-src none, form-action self)

https://claude.ai/code/session_01PzA98VhLMmsHpzs7gnLHGs
2026-02-21 09:01:21 +00:00
Claude
22d3c0658e fix: corriger l'erreur TypeScript dans le proxy /api/img/[key]
Le typage Supabase inférait "never" sur data car site_images n'est pas
dans le schéma TypeScript généré. Cast de res.data après le await au
lieu du cast global sur .single().

https://claude.ai/code/session_01PzA98VhLMmsHpzs7gnLHGs
2026-02-20 08:09:07 +00:00
Claude
9fe1f8bea2 fix: éliminer définitivement les bugs d'affichage des images privées
Cause racine : les Signed URLs Supabase étaient générées au moment du
rendu ISR et embarquées dans le HTML mis en cache. Si Vercel servait
le HTML avant régénération ou si la signed URL expirait, l'image
était cassée et necessitait plusieurs rechargements.

Solution — proxy /api/img/[key] :
- app/api/img/[key]/route.ts : nouvelle route publique force-dynamic
  qui génère une Signed URL fraîche à chaque requête image (TTL 1h),
  avec Cache-Control 55 min côté navigateur/CDN ; fallback sur l'image
  Unsplash par défaut si createSignedUrl échoue ; 302 direct pour les
  URLs externes
- lib/site-images.ts : getSiteImages() ne génère plus jamais de Signed
  URL — les chemins storage: retournent /api/img/<key> (URL permanente),
  les URLs externes sont retournées telles quelles

Résultat : le HTML statique/ISR ne contient plus jamais de signed URL
éphémère → zéro image cassée, zéro rechargement nécessaire.

https://claude.ai/code/session_01PzA98VhLMmsHpzs7gnLHGs
2026-02-20 07:16:20 +00:00
Claude
c18bc4f6fd feat: ajouter la photo de Cyprien dans l'admin et la page maçon
- lib/site-images.ts : nouvelle clé macon_photo_cyprien (url vide par
  défaut, l'admin upload la vraie photo)
- app/macon/page.tsx : remplace le placeholder SVG par un <img> conditionnel
  — affiche l'image quand la clé est renseignée, conserve le placeholder
  texte "Photo de Cyprien (sur le chantier)" tant qu'aucune photo n'est
  uploadée

https://claude.ai/code/session_01PzA98VhLMmsHpzs7gnLHGs
2026-02-19 11:34:42 +00:00
Claude
eb0c2150e5 fix: résoudre le cache Next.js qui bloquait la mise à jour des images
- app/macon/page.tsx + app/paysagiste/page.tsx : ajout de
  export const revalidate = 60 pour activer l'ISR (les pages étaient
  générées statiquement à la build, getSiteImages() n'était jamais
  rappelé entre deux déploiements)
- app/api/admin/site-images/route.ts : appel de revalidatePath() après
  chaque PUT réussi pour purger immédiatement le cache de la page
  concernée (macon_, paysagiste_ → leur page démo, sinon → /)
  Résultat : la page se met à jour dans la seconde qui suit la sauvegarde
  dans l'admin, sans attendre le délai de 60s

https://claude.ai/code/session_01PzA98VhLMmsHpzs7gnLHGs
2026-02-19 11:28:39 +00:00
Claude
51bc7e1103 feat: répertorier toutes les images des démos dans l'admin
- lib/site-images.ts : ajout de 21 nouvelles clés d'images couvrant
  les démos Maçon et Paysagiste (héro, sliders avant/après nommés
  "photo gauche slider N" / "photo droite slider N", cards services,
  photo équipe, galerie 8 photos, CTA) ; renommage des labels accueil
  pour les distinguer clairement
- app/macon/page.tsx : composant rendu async, images.macon_hero et
  images.macon_slider{1,2,3}_{gauche,droite} remplacent les URLs Unsplash
- app/paysagiste/page.tsx : composant rendu async, tableau realisations
  déplacé à l'intérieur pour utiliser images.*, toutes les 6 balises
  <img> hardcodées (héro, services, savoir-faire, équipe, CTA, galerie)
  remplacées par les clés images.*

https://claude.ai/code/session_01PzA98VhLMmsHpzs7gnLHGs
2026-02-19 06:48:11 +00:00
Claude
7a46501ba3 feat: upload images vers bucket Supabase privé avec Signed URLs
- Nouvelle route POST /api/admin/upload : upload multipart vers le bucket
  private-gallery, validation MIME + taille (max 5 Mo), retourne storage:path
- lib/site-images.ts : détecte le préfixe "storage:" et génère une Signed
  URL temporaire (60 min) côté serveur avant chaque rendu de page
- GET /api/admin/site-images : résout aussi les signed URLs pour les previews
  admin (champ previewUrl distinct de url brute)
- PUT /api/admin/site-images : accepte désormais les chemins "storage:..."
  en plus des URLs externes
- Page admin images : drag & drop + input file avec upload automatique +
  sauvegarde en BDD, badge "bucket privé", instructions SQL pour créer
  la table et la policy du bucket private-gallery

https://claude.ai/code/session_01PzA98VhLMmsHpzs7gnLHGs
2026-02-19 06:16:15 +00:00
Claude
db0adf6315 feat: complete restructure of macon demo page with 8 SEO-optimized sections
- Hero: full-screen background image, H1 targeting Orchies/Cysoing/Saint-Amand,
  4.9/5 Google badge, dual CTA (devis + appeler)
- Réassurance: 3 blocks (décennale, devis gratuit, intervention rapide)
- Services: 4 detailed cards (extension, maçonnerie générale, rénovation, extérieur)
  with rich SEO keyword content (IPN, rejointoiement, dalle béton, etc.)
- Avant/Après: slider with project legends and local city names
- Zone d'intervention: OpenStreetMap centered on Saméon + SEO-rich city list
  (Orchies, Cysoing, Saint-Amand, Landas, Beuvry, Nomain, Genech, Templeuve)
- Qui suis-je: Cyprien's bio with trust points (interlocuteur unique, zéro
  sous-traitance, chantier propre)
- FAQ: 3-question accordion (délai devis, décennale, gravats)
- Smart form: 3 project type buttons (Extension, Rénovation, Petits Travaux)
  then contact details form
- Floating mobile CTA: "Appeler maintenant" button visible only on mobile
- Footer SEO: NAP coordinates, expertise links, legal

https://claude.ai/code/session_01V8YAjpqRQ3bfBYsABYsEgo
2026-02-18 17:21:07 +00:00
ae13b107c5 Update legal mentions page title and content 2026-02-18 08:29:24 +01:00
442a193a0e Update privacy policy page title and content 2026-02-18 08:16:42 +01:00
Claude
0d19ab3f28 fix: add dark backgrounds to all internal pages + RGPD cookie banner
- login, register, candidature, cgv, confidentialite, mentions-legales:
  add bg-dark class so white text is visible on dark background
- admin shell + protected layout: same fix for admin/dashboard pages
- CookieBanner: update styling to match navy/orange branding, add RGPD
  compliance text, include Accepter/Refuser buttons, link to confidentialite
- layout.tsx: import and render CookieBanner globally

https://claude.ai/code/session_01V8YAjpqRQ3bfBYsABYsEgo
2026-02-18 07:04:30 +00:00
Claude
314d713699 fix: restore dark theme tokens for login/admin/legal pages + remove formation SEO
- globals.css: restore missing dark-*, primary, error, warning color tokens
  and gradient-text/gradient-bg utility classes so login, admin, mentions-legales,
  and confidentialite pages render correctly (white text was invisible on white bg)
- layout.tsx: remove "Candidature Formation" from JSON-LD SiteNavigationElement
- candidature/layout.tsx: remove "Formation" from title/description, add noindex
- robots.ts: disallow /candidature/ from crawlers
- sitemap.ts: remove /candidature from sitemap

https://claude.ai/code/session_01V8YAjpqRQ3bfBYsABYsEgo
2026-02-18 06:34:42 +00:00
Claude
c62998d0c2 feat: redesign homepage with triptych process + admin image management
- Redesign Hero section with new copy focused on the triptych offering
- Add Process component (replaces System) with zigzag layout for 3 pillars:
  Google Maps reviews, managed Facebook, converting website
- Redesign AboutMe with orange background and stats row
- Add admin panel for managing site image URLs (replaces Sanity dependency)
- Create site_images API routes and Supabase-backed storage with defaults
- Update FAQ to reference built-in admin panel
- Add site_images table type to database types
- Pass images prop through homepage components

https://claude.ai/code/session_01V8YAjpqRQ3bfBYsABYsEgo
2026-02-17 18:40:30 +00:00
Claude
97744fe3d3 feat: redesign paysagiste demo page inspired by AL Concept
- Full-screen hero with background photo, dark overlay, centered text
- Two large service cards (Création / Entretien) with bg images and green "En savoir +" buttons
- Services description section with checklist and side image
- "Qui sommes-nous" section with team photo and stats (150+ jardins, 10+ ans)
- Values section on dark forest green (#1a3c1a) with arch-shaped cards
- Contact form section with full-width background image and overlay
- Dark green footer with 3 columns (logo, prestations, contact)
- Transparent nav overlay on hero with glass-morphism logo
- Subtle HookLab CTA badge in bottom-left corner
- Removed old light-bg hero, seasonal banner, and flat card layout

https://claude.ai/code/session_01V8YAjpqRQ3bfBYsABYsEgo
2026-02-17 06:13:50 +00:00
Claude
a057f1901f feat: add favicon, structured data & SEO optimization for Google sitelinks
- Add SVG favicon (H logo navy+orange) for all sizes (32, 180, 192, 512)
- Add web manifest (site.webmanifest) for PWA compatibility
- Add theme-color meta tag (#1B2A4A navy)
- Add 3 structured data schemas: LocalBusiness, WebSite, SiteNavigationElement
- WebSite schema enables Google to show site name + search box
- SiteNavigationElement signals main pages for sitelinks display
- Add canonical URLs to all pages (macon, paysagiste, plombier, legal pages)
- Add metadata to pages missing it (mentions-legales, confidentialite, cgv)
- Add candidature/layout.tsx for metadata on client component page
- Optimize sitemap with consistent BASE_URL and candidature/cgv pages
- Add telephone, email, opening hours to LocalBusiness schema

https://claude.ai/code/session_01V8YAjpqRQ3bfBYsABYsEgo
2026-02-16 19:34:36 +00:00
9cb49af079 Fix French accents and improve button styles 2026-02-16 20:25:57 +01:00
76fe4eb1ae Fix French text accents and improve readability
Updated text for better readability and corrected accents in French phrases.
2026-02-16 20:21:36 +01:00
b6158a2653 Fix French accents and special characters in page.tsx
Corrected French accents and special characters in metadata, titles, and descriptions for better readability and accuracy.
2026-02-16 20:20:28 +01:00
ed9109564b Refactor Mentions Légales page structure and content
Updated the mentions légales page with improved formatting and corrected capitalization. Added sections for legal information, hosting, intellectual property, and data protection.
2026-02-16 20:18:49 +01:00
Claude
6555969c30 feat: animated hero with parallax rocket + scroll reveal animations
- Add animated hero section with parallax rocket SVG that descends on scroll
- Add floating decorative particles and gradient layers in hero
- Add staggered text reveal animation on hero h1
- Create ScrollReveal component (IntersectionObserver-based fade/slide)
- Create AnimatedCounter component for stat numbers
- Add scroll animations to all sections (Problematique, System, Demos, AboutMe, FAQ, Contact, Footer)
- Add smooth FAQ accordion transitions
- Add extensive CSS keyframe animations (float, flame, particles, stat glow)

https://claude.ai/code/session_01V8YAjpqRQ3bfBYsABYsEgo
2026-02-16 19:09:16 +00:00
Claude
e94a03f302 fix: professional tone + real photos on demo pages
- Hero: replace aggressive "Arrêtez de perdre des chantiers" with
  professional "Un site à la hauteur de votre savoir-faire"
- Macon: rewrite hero as client-facing (artisan's real site),
  add Unsplash before/after photos to MagicReveal sliders
- Paysagiste: rewrite hero "Transformez votre extérieur" instead of
  "Ne vendez pas des travaux", add real photos to gallery
- Plombier: rewrite hero "Votre plombier réactif et transparent"
  instead of "Convaincre en 3 secondes chrono"
- MagicReveal: now accepts avantImage/apresImage URLs and renders
  real photos with the interactive slider

https://claude.ai/code/session_01H2aRGDaKgarPvhay2HxN6Y
2026-02-16 05:34:40 +00:00
Claude
9025986e66 feat: rebuild 3 demo pages with interactive features + local SEO pages
- Rebuild /macon with cert badge popups, before/after slider, intelligent
  form with urgency detection
- Rebuild /paysagiste with filterable gallery, seasonal banner, WhatsApp
  floating button, devis form
- Rebuild /plombier with sticky call bar, 3-step diagnostic wizard,
  transparent tariffs, zone map
- Add MagicReveal component (interactive before/after slider)
- Update Navbar with real phone number (06 04 40 81 57)
- Update DemosLive cards with new titles and subtitles
- Create sitemap.ts targeting local SEO zones (Douai, Orchies,
  Valenciennes, Saint-Amand, Arleux, Denain)
- Create LocalSeoPage template + 6 city-specific landing pages

https://claude.ai/code/session_01H2aRGDaKgarPvhay2HxN6Y
2026-02-15 22:10:14 +00:00
Claude
a845b47316 feat: refonte complète landing page - nouveau copywriting + 3 démos
- SEO: nouveau title/description optimisé artisans BTP Nord (59)
- Navbar: CTA téléphone cliquable + menu simplifié
- Hero: fond sombre, H1 percutant "aussi solide que vos ouvrages"
- Nouvelle section Problématique (identification pain points)
- System: redesign sombre "Dossier de Confiance" avec 3 piliers tech
- Démos Live: 3 cards vers /macon, /paysagiste, /plombier
- FAQ: nouvelles questions orientées objections (Facebook, site gratuit)
- Footer: SEO avec expertises + zone d'intervention étendue
- /macon: galerie Avant/Après + bouton Urgence Fuite
- /paysagiste: design épuré + filtrage Création vs Entretien
- /plombier: tarifs clairs + formulaire diagnostic rapide

https://claude.ai/code/session_01H2aRGDaKgarPvhay2HxN6Y
2026-02-15 19:14:01 +00:00
Claude
45f5cc0e9e fix: connect Sanity CMS data to live site with revalidation
- Disable Sanity CDN cache so published changes appear immediately
- Add revalidate=60 to page so Next.js refreshes data every 60s
- Wire AboutMe component to use siteSettings from Sanity (name, bio,
  photo, address, map coordinates)

https://claude.ai/code/session_01H2aRGDaKgarPvhay2HxN6Y
2026-02-15 18:35:06 +00:00
Claude
bca3745603 feat: pivot complet - agence web artisans BTP Nord + Sanity CMS
Transformation complète du site HookLab de formation TikTok Shop
vers une landing page haute conversion pour agence web locale ciblant
les artisans du bâtiment dans le Nord (Douai, Orchies, Valenciennes).

- Nouveau design system : bleu nuit/orange sur fond clair (mobile-first)
- Hero avec promesse artisan + CTA orange "Réserver mon Audit"
- Section "Le Système" (3 étapes : Trouvé, Choisi, Contacté)
- Portfolio connecté à Sanity.io (fallback data intégré)
- Section "Qui suis-je" avec carte OpenStreetMap interactive
- FAQ orientée artisans avec JSON-LD pour Google
- Formulaire contact audit gratuit
- SEO local : 12 keywords artisans, JSON-LD LocalBusiness
- Sanity.io schemas (portfolio, siteSettings) + client conditionnel
- Accessibilité : skip-to-content, focus-visible, aria-labels

https://claude.ai/code/session_01H2aRGDaKgarPvhay2HxN6Y
2026-02-15 12:50:52 +00:00
Claude
1926d51213 fix: supprime social proof fake, fixe bannière + navbar, popup mobile
- Supprime SocialProofTicker (notifications fake visiblement artificielles)
- Navbar passe de fixed à sticky pour s'empiler correctement sous la bannière
- Bannière d'annonce responsive (texte court sur mobile, bouton close adapté)
- Hero: réduit le padding top (plus besoin de compenser un navbar fixed)
- Exit-intent popup fonctionne sur mobile (trigger au scroll-up après 60% de page)
- Popup responsive: tailles ajustées pour mobile

https://claude.ai/code/session_01H2aRGDaKgarPvhay2HxN6Y
2026-02-11 16:46:54 +00:00
Claude
ba1d24fa02 feat: refonte complète landing page - tunnel de vente + SEO optimisé
- SEO technique: sitemap.ts, robots.ts, structured data JSON-LD (Organization, Course, FAQPage)
- Meta tags optimisés pour 12+ mots-clés TikTok Shop France
- Hero SEO-optimisé: H1 ciblant "formation TikTok Shop" + "créateur affilié France"
- Nouvelle section ResultsShowcase: stats marché TikTok Shop + timeline 8 semaines
- Tableau comparatif HookLab vs alternatives
- 6 témoignages avec disclaimer Google-compliant (pas de faux avis)
- Pricing avec prix barré, bonus inclus, garantie satisfait ou remboursé
- Badges de confiance (paiement sécurisé, RGPD, support, garantie)
- Pop-up exit-intent (desktop) avec stats marché
- Barre sticky CTA mobile
- Notifications social proof animées
- CTA final avant footer
- Barre d'annonce urgence en haut
- FAQ enrichie (10 questions) avec structured data FAQPage
- Smooth scroll + animations CSS ajoutées

https://claude.ai/code/session_01H2aRGDaKgarPvhay2HxN6Y
2026-02-11 12:03:01 +00:00
fe0df7448f Update fromEmail to new HookLab address 2026-02-10 21:42:13 +01:00
Claude
a6f32dd77a feat: branded HookLab approval email + decouple email from Stripe
- Email sending now independent from Stripe payment link generation
- Professional dark-themed HTML email template matching HookLab branding
- Return emailSent/emailError/stripeError status in API response
- Admin UI shows detailed status after approve action
- Default to onboarding@resend.dev when no custom domain

https://claude.ai/code/session_01H2aRGDaKgarPvhay2HxN6Y
2026-02-10 19:43:05 +00:00
Claude
eafa783040 fix: use configurable RESEND_FROM_EMAIL with onboarding@resend.dev fallback
Allow sending emails without custom domain by defaulting to Resend's
free onboarding address. Set RESEND_FROM_EMAIL env var later when
hooklab.fr domain is purchased and verified.

https://claude.ai/code/session_01H2aRGDaKgarPvhay2HxN6Y
2026-02-10 19:02:43 +00:00
Claude
7be84681f0 fix: login redirect with Suspense boundary + read redirect query param
- Wrap useSearchParams() in Suspense boundary (Next.js requirement)
- Read ?redirect= query param for post-login redirect to /admin
- Auto-detect admin users and redirect to /admin
- Fallback to /dashboard for regular users

https://claude.ai/code/session_01H2aRGDaKgarPvhay2HxN6Y
2026-02-10 17:03:51 +00:00