Runtime
- Next.js 14.2.35 App Router
- TypeScript strict
- Node 20
SARL Archimaides — refonte from scratch d’un Wix moisi de 2007 en site Next 14 luxe en 1 jour de build.
Client : Alain. Architecte d’intérieur, Toulouse.
Build-day 2026-04-27 : ~2 heures portail-à-portail, 24 pages générées, refonte from scratch d’un Wix lazy-load qu’aucun scraper (même Playwright) n’arrivait à attaquer proprement. Photos remplacées par des placeholders typographiques quand la qualité Wix scrape ne passait pas.
Tout le contenu typé en TS, motion / SEO factorisés, App Router 24 pages structurées par intention.
SIREN, SIRET, capital, équipe, stats, coordonnées — un seul fichier typé. Tous les composants importent depuis là. Modif info légale = 1 patch, jamais 24.
lib/motion.ts pour les variants Framer Motion réutilisables. lib/seo.ts expose buildPageMetadata et buildLocalBusinessJsonLd — chaque page n’écrit que ses overrides.
5 marketing + 6 détails projets + 3 prestations + 3 légales + sitemap + robots + manifest + OG dynamique. Tout en RSC sauf les composants motion isolés dans des fichiers voisins client.
Palette serrée : ivoire #FAFAF7 + ink #18181B + accent lavande poudré #B5AFD0 + deep #8E87B5. Le deep est arrivé pour résoudre un problème de luminance trop proche du fond ivoire sur les barres scaleX.
Inter et Inter Tight uniquement. Jamais d’italique. Jamais d’autre fonte. Geist Mono indispo dans next/font à la date du build : remplacé par JetBrains Mono là où nécessaire.
Photos client en lazy-load Wix : qualité scrape insuffisante. Remplacement par un composant ProjectPlaceholder typographique (lettrage projet + accent lavande) en attendant un shoot HD propre.
Barre lavande scaleX tracée sur SectionLabel uniquement. MetaLabel reste plat. Évite la confusion hiérarchique sur les pages projets denses.
Source unique pour le SEO local — réutilisée par chaque page concernée.
import type { Metadata } from "next";
import { COMPANY } from "./company";
export function buildPageMetadata(over: Partial<Metadata> = {}): Metadata {
return {
title: { default: COMPANY.name, template: `%s · ${COMPANY.name}` },
description: COMPANY.tagline,
metadataBase: new URL(COMPANY.url),
openGraph: { type: "website", siteName: COMPANY.name },
...over,
};
}
export function buildLocalBusinessJsonLd() {
return {
"@context": "https://schema.org",
"@type": "InteriorDesignStudio",
name: COMPANY.name,
url: COMPANY.url,
telephone: COMPANY.phone,
address: {
"@type": "PostalAddress",
streetAddress: COMPANY.address.street,
addressLocality: COMPANY.address.city,
postalCode: COMPANY.address.zip,
addressCountry: "FR",
},
geo: { "@type": "GeoCoordinates", latitude: COMPANY.geo.lat, longitude: COMPANY.geo.lng },
areaServed: COMPANY.areaServed,
};
}