Commit Graph

102 Commits

Author SHA1 Message Date
Enguerrand Ozano
e69fa0fff2 Add dedicated users/me route using payload.auth 2026-03-01 12:11:21 +01:00
Enguerrand Ozano
ac4a88d08b Add dedicated users/me route using payload.auth 2026-03-01 10:58:14 +01:00
Enguerrand Ozano
142d0167a8 Change temp admin email 2026-03-01 10:45:11 +01:00
Enguerrand Ozano
bbc60d2aa8 Fix create-admin route typing 2026-03-01 10:39:54 +01:00
Enguerrand Ozano
1b0014337b Add temporary create-admin route for Payload 2026-03-01 10:37:04 +01:00
Enguerrand Ozano
bfaaf8a263 Wire Payload REST API under /gestion59/api 2026-02-28 22:48:20 +01:00
Enguerrand Ozano
d91cfd9f53 Move Payload API under /gestion59/api 2026-02-28 22:40:36 +01:00
Enguerrand Ozano
a13ac539e2 Fix Payload admin routes and Next page props 2026-02-28 22:28:19 +01:00
Enguerrand Ozano
78aa17b8da Fix login3 2026-02-28 22:14:38 +01:00
Enguerrand Ozano
97379506e4 Fix login3 2026-02-28 22:12:37 +01:00
Enguerrand Ozano
79ba505e70 Fix login2 2026-02-28 21:16:05 +01:00
Enguerrand Ozano
65f6d1c4d6 Fix login 2026-02-28 20:45:12 +01:00
Enguerrand Ozano
dfa2c8743f Fix params/searchParams types for Next.js app router 2026-02-28 20:28:20 +01:00
Enguerrand Ozano
238708bd7c Fix params/searchParams types for Next.js app router 2026-02-28 20:23:51 +01:00
Enguerrand Ozano
a48468ae45 Fix params/searchParams types for Next.js app router 2026-02-28 20:00:04 +01:00
Enguerrand Ozano
7651a45586 Fix params/searchParams types for Next.js app router 2026-02-28 19:49:30 +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
fc881e5178 Configure Payload + Postgres on Dokploy 2026-02-28 18:45:36 +01:00
Enguerrand Ozano
2895ae0cd3 Configure Payload with Postgres + push true 2026-02-28 18:33:30 +01:00
Enguerrand Ozano
26c916b940 feat: add media collection to payload 2026-02-28 15:23:20 +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
Enguerrand Ozano
65a222fbc7 feat: activate payload cms collections 2026-02-28 15:13:45 +01:00
Enguerrand Ozano
0cafc29408 fix: remove commented payload collections from config 2026-02-28 14:58:58 +01:00
Enguerrand Ozano
4f71670212 fix: node 20 + npm install for tailwind v4 2026-02-28 14:48:32 +01:00
Enguerrand Ozano
05284eab72 add payload cms config 2026-02-28 14:34:53 +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
bb6e367184 fix: résoudre les deux erreurs de build TypeScript
- Supprimer LocalSeoPage.tsx (conflit de casse avec LocalSEOPage.tsx)
- Typer keywords comme readonly string[] dans Service pour compatibilité as const

https://claude.ai/code/session_01Uec4iHjcPwB1pU41idWEdF
2026-02-27 18:21:36 +00:00
Claude
f72b5fbc38 fix: LocalSEOPage — supprime accès module-level siteConfig.services
Le build Vercel échouait car le composant accédait à siteConfig.services
au niveau module (hors fonction), ce qui créait une erreur TypeScript
lors de la phase de collecte des pages.

Corrections :
- Remplace le module-level .map() sur siteConfig.services par un tableau
  statique SERVICE_LINKS (même données, mais sans inférence TypeScript complexe)
- Refonte éditoriale complète du composant : hero dark + diagonal panel,
  stats border-l orange, services grid dark, texte split 2-col,
  zones communes voisines, contact split dark/light
- Suppression des rounded-xl, rounded-2xl → style squared cohérent
- Boutons : .btn .btn-fill / .btn-outline-light / .btn-outline-dark

https://claude.ai/code/session_01Uec4iHjcPwB1pU41idWEdF
2026-02-27 18:10:39 +00:00
Claude
956c7ece01 fix: purge dépendances orphelines + force cleanDistDir
Cause du build error :
  Le CI avait dans son cache .next des routes compilées d'une ancienne
  version du projet (/api/admin/candidatures/[id]/approve) qui instanciait
  un SDK Anthropic sans clé API.

Corrections :
- next.config.ts : ajout de cleanDistDir: true pour forcer la suppression
  des fichiers .next orphelins à chaque build
- package.json : suppression des dépendances non utilisées héritées de
  l'ancienne version (sanity, @sanity/*, stripe, @stripe/*, @supabase/*)
- package-lock.json : supprimé (sera régénéré proprement par npm install)

https://claude.ai/code/session_01Uec4iHjcPwB1pU41idWEdF
2026-02-27 18:04:16 +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
45d080197a feat: add WordPress theme hooklab (réplique exacte du site Next.js)
- style.css : design system complet (navy #1B2A4A, orange #E8772E, Inter, animations)
- functions.php : enqueue scripts/styles + handler AJAX formulaire contact
- header.php : navbar sticky avec burger mobile
- front-page.php : toutes les sections (Hero, Problématique, Process, Demos, About, FAQ, Contact)
- footer.php : footer 3 colonnes + bottom bar légal
- js/main.js : scroll reveal, FAQ accordion, menu mobile, formulaire AJAX
- index.php / page.php : templates fallback

https://claude.ai/code/session_01PzA98VhLMmsHpzs7gnLHGs
2026-02-24 21:37:14 +00:00
Claude
c0ed7c50d7 Fix domaine hooklab.fr → hooklab.eu + stratégie hosts file pour tests
- Remplacer hooklab.fr par hooklab.eu partout (domaine réel du site)
- Ajouter instructions hosts file (Mac/Windows) pour tester WordPress
  sans toucher au DNS Vercel existant
- Ajouter note Phase 6 : DNS à faire en dernier, Vercel reste intact

https://claude.ai/code/session_01PzA98VhLMmsHpzs7gnLHGs
2026-02-24 19:45:15 +00:00
Claude
9defbfdc7e Réécrire phases 2.5-6 avec instructions clique par clique pour non-développeur
- 2.5 : Comment accéder à wp-admin et récupérer les identifiants WordOps
- 2.6 : Installation plugins step-by-step (Kadence, Rank Math, WPForms, etc.)
- 2.8 : Créer un sous-site client depuis l'admin réseau
- 2.9 : Donner accès à un client (rôle administrateur de sous-site)
- Phase 3 : Design Kadence clique par clique (Hero, Services, Avis, Contact, Footer)
- Phase 4 : SEO complet (Rank Math, Search Console, articles de blog)
- Phase 5 : Workflow template réutilisable avec NS Cloner + checklist livraison
- Phase 6 : DNS OVH pas à pas avec tableau, SSL WordOps, domaine custom

https://claude.ai/code/session_01PzA98VhLMmsHpzs7gnLHGs
2026-02-24 19:34:20 +00:00
Claude
d0dca510ef Fix SSH user (ubuntu not root) et mode multisite (subdomains)
- SSH : corriger root@ → ubuntu@ (user par défaut OVH Ubuntu)
- Phase 2 : marquer installation WordOps comme faite
- Mettre à jour la commande : --wpsubdir → --wpsubdomain (mode réel)
- Mettre à jour la structure des sous-sites en sous-domaines
- Ajouter note DNS wildcard *.hooklab.fr

https://claude.ai/code/session_01PzA98VhLMmsHpzs7gnLHGs
2026-02-24 19:22:21 +00:00
Claude
af4be01e33 Update PLAN.md: Ubuntu 22, WordOps already installed, SSH troubleshooting
- Corriger Ubuntu 24 → Ubuntu 22.04
- Marquer phases 1.1, 1.3, 1.4 comme faites (WordOps installé)
- Ajouter 4 cas de dépannage pour l'erreur SSH "Permission denied"
- Simplifier Phase 2 avec les commandes WordOps (2 lignes au lieu de 4 étapes manuelles)

https://claude.ai/code/session_01PzA98VhLMmsHpzs7gnLHGs
2026-02-24 19:06:51 +00:00
Claude
0d4c12bad9 Add deployment plan: OVH server + WordPress Multisite for artisan clients
6-phase roadmap covering server setup, WP Multisite isolation,
Kadence design, SEO, client templates, and DNS migration.

https://claude.ai/code/session_01PzA98VhLMmsHpzs7gnLHGs
2026-02-24 18:53:55 +00:00
Claude
6e30de3fe8 fix: replace raw unicode escapes in JSX text with proper HTML entities
\uXXXX escapes in JSX text nodes are not interpreted by JS — replaced
là, «, rêve, », numérique, signés with direct UTF-8 / HTML entities.

https://claude.ai/code/session_01PzA98VhLMmsHpzs7gnLHGs
2026-02-23 08:03:29 +00:00
Claude
4a0b13e690 content: update Problematique section — new positioning copy
Replace "Chacun son métier" with "Mon rôle ? Faire savoir que vous êtes le meilleur."
New body text + 3 solution cards (touristes, concurrents, zéro jargon) with updated engagement block.

https://claude.ai/code/session_01PzA98VhLMmsHpzs7gnLHGs
2026-02-23 07:59:56 +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