From 683e0b3e434d8748384cdd78ef374ac1d42b922b Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 26 Mar 2026 16:12:50 +0100 Subject: [PATCH] polish: complete copy rewrite + i18n fixes + dead link cleanup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Rewrite all site copy based on founder interview: honest, outcome-focused, premium but approachable tone - Hero: "Websites, software, and infrastructure — designed and built entirely around you." - Services: "Design. Build. Run." with clear pillars (Websites, Custom Software, Infrastructure) - Philosophy: "Your tools should belong to you." — removed Kubernetes reference - Trust bar: concrete value props (Built From Scratch, You Own Everything, One Team, AI) - CTA: "Ready to build something?" — direct, no fluff - Projects: honest descriptions of what was actually delivered - Fix all French translation gaps: hero accent word, configurator cards, project descriptions, footer links, philosophy quote - Fix dead links: footer service links → /#services, work/about → anchors - Restore case study links (dynamic route exists) - Fix mobile hero padding (pt-40 → pt-24) - AI narrative positioned honestly as add-on capability Co-Authored-By: Claude Opus 4.6 (1M context) --- src/components/configurator/StepServices.tsx | 46 ++--- src/components/layout/Footer.tsx | 22 +-- src/components/sections/Configurator.tsx | 4 +- src/components/sections/Hero.tsx | 11 +- src/components/sections/Philosophy.tsx | 2 +- src/components/sections/SelectedWorks.tsx | 74 ++++---- src/i18n/messages/en.json | 171 ++++++++++++------- src/i18n/messages/fr.json | 171 ++++++++++++------- 8 files changed, 309 insertions(+), 192 deletions(-) diff --git a/src/components/configurator/StepServices.tsx b/src/components/configurator/StepServices.tsx index f741913..e99a423 100644 --- a/src/components/configurator/StepServices.tsx +++ b/src/components/configurator/StepServices.tsx @@ -15,31 +15,28 @@ import type { StepProps } from './WizardContainer'; interface ServiceOption { id: string; icon: React.ElementType; - title: string; - description: string; + titleKey: string; + descriptionKey: string; } const SERVICES: ServiceOption[] = [ { id: 'web', icon: Globe, - title: 'Web Design & Development', - description: - 'Bespoke websites and web applications built from scratch — pixel-perfect design, blazing performance, and clean code.', + titleKey: 'services.web.title', + descriptionKey: 'services.web.description', }, { id: 'systems', icon: Cog, - title: 'Custom Systems', - description: - 'Purpose-built CRMs, internal tools, and business platforms crafted to match exactly how your team works.', + titleKey: 'services.systems.title', + descriptionKey: 'services.systems.description', }, { id: 'infrastructure', icon: Server, - title: 'Digital Infrastructure', - description: - 'Private cloud hosting, data sovereignty, DevOps pipelines, and security hardening — your stack, fully owned.', + titleKey: 'services.infrastructure.title', + descriptionKey: 'services.infrastructure.description', }, ]; @@ -78,9 +75,11 @@ interface ServiceCardProps { option: ServiceOption; selected: boolean; onToggle: () => void; + title: string; + description: string; } -function ServiceCard({ option, selected, onToggle }: ServiceCardProps) { +function ServiceCard({ option, selected, onToggle, title, description }: ServiceCardProps) { const Icon = option.icon; return ( @@ -117,9 +116,9 @@ function ServiceCard({ option, selected, onToggle }: ServiceCardProps) { selected ? 'text-primary-dark' : 'text-on-surface', )} > - {option.title} + {title}

-

{option.description}

+

{description}

{/* Checkbox */} @@ -160,9 +159,11 @@ function ServiceCard({ option, selected, onToggle }: ServiceCardProps) { interface AIToggleProps { enabled: boolean; onToggle: () => void; + label: string; + description: string; } -function AIToggle({ enabled, onToggle }: AIToggleProps) { +function AIToggle({ enabled, onToggle, label, description }: AIToggleProps) { return (