polish: complete copy rewrite + i18n fixes + dead link cleanup
All checks were successful
Build & Push / build-and-push (push) Successful in 1m47s

- 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) <noreply@anthropic.com>
This commit is contained in:
2026-03-26 16:12:50 +01:00
parent b2f9fd3222
commit 683e0b3e43
8 changed files with 309 additions and 192 deletions

View File

@@ -15,31 +15,28 @@ import type { StepProps } from './WizardContainer';
interface ServiceOption { interface ServiceOption {
id: string; id: string;
icon: React.ElementType; icon: React.ElementType;
title: string; titleKey: string;
description: string; descriptionKey: string;
} }
const SERVICES: ServiceOption[] = [ const SERVICES: ServiceOption[] = [
{ {
id: 'web', id: 'web',
icon: Globe, icon: Globe,
title: 'Web Design & Development', titleKey: 'services.web.title',
description: descriptionKey: 'services.web.description',
'Bespoke websites and web applications built from scratch — pixel-perfect design, blazing performance, and clean code.',
}, },
{ {
id: 'systems', id: 'systems',
icon: Cog, icon: Cog,
title: 'Custom Systems', titleKey: 'services.systems.title',
description: descriptionKey: 'services.systems.description',
'Purpose-built CRMs, internal tools, and business platforms crafted to match exactly how your team works.',
}, },
{ {
id: 'infrastructure', id: 'infrastructure',
icon: Server, icon: Server,
title: 'Digital Infrastructure', titleKey: 'services.infrastructure.title',
description: descriptionKey: 'services.infrastructure.description',
'Private cloud hosting, data sovereignty, DevOps pipelines, and security hardening — your stack, fully owned.',
}, },
]; ];
@@ -78,9 +75,11 @@ interface ServiceCardProps {
option: ServiceOption; option: ServiceOption;
selected: boolean; selected: boolean;
onToggle: () => void; onToggle: () => void;
title: string;
description: string;
} }
function ServiceCard({ option, selected, onToggle }: ServiceCardProps) { function ServiceCard({ option, selected, onToggle, title, description }: ServiceCardProps) {
const Icon = option.icon; const Icon = option.icon;
return ( return (
@@ -117,9 +116,9 @@ function ServiceCard({ option, selected, onToggle }: ServiceCardProps) {
selected ? 'text-primary-dark' : 'text-on-surface', selected ? 'text-primary-dark' : 'text-on-surface',
)} )}
> >
{option.title} {title}
</p> </p>
<p className="text-xs text-outline leading-relaxed">{option.description}</p> <p className="text-xs text-outline leading-relaxed">{description}</p>
</div> </div>
{/* Checkbox */} {/* Checkbox */}
@@ -160,9 +159,11 @@ function ServiceCard({ option, selected, onToggle }: ServiceCardProps) {
interface AIToggleProps { interface AIToggleProps {
enabled: boolean; enabled: boolean;
onToggle: () => void; onToggle: () => void;
label: string;
description: string;
} }
function AIToggle({ enabled, onToggle }: AIToggleProps) { function AIToggle({ enabled, onToggle, label, description }: AIToggleProps) {
return ( return (
<button <button
type="button" type="button"
@@ -192,10 +193,10 @@ function AIToggle({ enabled, onToggle }: AIToggleProps) {
)} )}
aria-hidden="true" aria-hidden="true"
/> />
Enhance with AI {label}
</span> </span>
<p className="text-xs text-outline mt-0.5"> <p className="text-xs text-outline mt-0.5">
We layer intelligent automation into every system we build. {description}
</p> </p>
</div> </div>
{/* Switch */} {/* Switch */}
@@ -269,6 +270,8 @@ export default function StepServices({ formData, setFormData, onNext }: StepProp
option={option} option={option}
selected={formData.services.includes(option.id)} selected={formData.services.includes(option.id)}
onToggle={() => toggleService(option.id)} onToggle={() => toggleService(option.id)}
title={t(option.titleKey)}
description={t(option.descriptionKey)}
/> />
))} ))}
{/* Empty-state hint */} {/* Empty-state hint */}
@@ -281,7 +284,7 @@ export default function StepServices({ formData, setFormData, onNext }: StepProp
transition={{ duration: 0.2 }} transition={{ duration: 0.2 }}
className="text-xs text-outline/60 text-center pt-1 pb-0.5 select-none" className="text-xs text-outline/60 text-center pt-1 pb-0.5 select-none"
> >
Select at least one service to continue {t('selectService')}
</motion.p> </motion.p>
)} )}
</AnimatePresence> </AnimatePresence>
@@ -289,7 +292,12 @@ export default function StepServices({ formData, setFormData, onNext }: StepProp
{/* AI Toggle */} {/* AI Toggle */}
<div className="flex flex-col gap-3"> <div className="flex flex-col gap-3">
<AIToggle enabled={formData.aiEnabled} onToggle={toggleAI} /> <AIToggle
enabled={formData.aiEnabled}
onToggle={toggleAI}
label={t('aiToggle')}
description={t('aiDescription')}
/>
{/* AI type chips — stagger in */} {/* AI type chips — stagger in */}
<AnimatePresence> <AnimatePresence>

View File

@@ -8,17 +8,17 @@ import CalButton from '@/components/ui/CalButton'
// ── Static link data ───────────────────────────────────────────────────────── // ── Static link data ─────────────────────────────────────────────────────────
const SERVICE_LINKS = [ const SERVICE_LINKS = [
{ label: 'Design & Development', href: '/services#design-development' }, { labelKey: 'serviceLinks.designDev', href: '/#services' },
{ label: 'Custom Systems', href: '/services#custom-systems' }, { labelKey: 'serviceLinks.customSystems', href: '/#services' },
{ label: 'Digital Infrastructure', href: '/services#infrastructure' }, { labelKey: 'serviceLinks.infrastructure', href: '/#services' },
{ label: 'AI & Automation', href: '/services#ai-automation' }, { labelKey: 'serviceLinks.aiAutomation', href: '/#services' },
] as const ] as const
// Studio links use nav translation keys where they exist (process, work, about) // Studio links use nav translation keys where they exist
const STUDIO_NAV_LINKS = [ const STUDIO_NAV_LINKS = [
{ navKey: 'process' as const, href: '/#process' }, { navKey: 'process' as const, href: '/#process' },
{ navKey: 'work' as const, href: '/work' }, { navKey: 'work' as const, href: '/#work' },
{ navKey: 'about' as const, href: '/about' }, { navKey: 'about' as const, href: '/#about' },
] as const ] as const
function LinkedInIcon({ className }: { className?: string }) { function LinkedInIcon({ className }: { className?: string }) {
@@ -131,10 +131,10 @@ export default function Footer() {
<div> <div>
<FooterHeading>{t('services')}</FooterHeading> <FooterHeading>{t('services')}</FooterHeading>
<ul className="flex flex-col gap-3" role="list"> <ul className="flex flex-col gap-3" role="list">
{SERVICE_LINKS.map(({ label, href }) => ( {SERVICE_LINKS.map(({ labelKey, href }) => (
<li key={label}> <li key={labelKey}>
<InternalLink href={href} className={linkClass}> <InternalLink href={href} className={linkClass}>
{label} {t(labelKey)}
</InternalLink> </InternalLink>
</li> </li>
))} ))}
@@ -155,7 +155,7 @@ export default function Footer() {
{/* Contact — separate entry pointing to configure section */} {/* Contact — separate entry pointing to configure section */}
<li> <li>
<InternalLink href="/#configure" className={linkClass}> <InternalLink href="/#configure" className={linkClass}>
Contact {tNav('configure')}
</InternalLink> </InternalLink>
</li> </li>
</ul> </ul>

View File

@@ -80,7 +80,7 @@ export default function Configurator() {
className="flex flex-col gap-3 pt-2" className="flex flex-col gap-3 pt-2"
> >
<p className="text-xs font-semibold uppercase tracking-label text-outline/70"> <p className="text-xs font-semibold uppercase tracking-label text-outline/70">
How it works {t('howItWorks')}
</p> </p>
{/* Vertical accent line + steps */} {/* Vertical accent line + steps */}
<div className="flex gap-4"> <div className="flex gap-4">
@@ -99,7 +99,7 @@ export default function Configurator() {
className="pt-1 flex items-center gap-2" className="pt-1 flex items-center gap-2"
> >
<ShieldCheck size={14} strokeWidth={1.75} className="text-primary flex-shrink-0" aria-hidden="true" /> <ShieldCheck size={14} strokeWidth={1.75} className="text-primary flex-shrink-0" aria-hidden="true" />
<p className="text-xs text-outline">No commitment required</p> <p className="text-xs text-outline">{t('noCommitment')}</p>
</motion.div> </motion.div>
</motion.div> </motion.div>
</div> </div>

View File

@@ -79,10 +79,9 @@ const rightColumnVariant = {
export default function Hero() { export default function Hero() {
const t = useTranslations('hero'); const t = useTranslations('hero');
// Split the raw title on the {exclusively} placeholder // Split the raw title on the {accentWord} placeholder
// Expected translation: "Built {exclusively} for ambitious brands."
const rawTitle: string = t.raw('title'); const rawTitle: string = t.raw('title');
const parts = rawTitle.split('{exclusively}'); const parts = rawTitle.split('{accentWord}');
const before = parts[0] ?? ''; const before = parts[0] ?? '';
const after = parts[1] ?? ''; const after = parts[1] ?? '';
@@ -99,7 +98,7 @@ export default function Hero() {
: []; : [];
const allWords: WordItem[] = [ const allWords: WordItem[] = [
...beforeWords, ...beforeWords,
{ type: 'accent', text: 'exclusively' }, { type: 'accent', text: t('accentWord') },
...afterWords, ...afterWords,
]; ];
@@ -128,7 +127,7 @@ export default function Hero() {
<div className="relative z-10 w-full max-w-screen-xl mx-auto px-6 lg:px-12 xl:px-16 flex flex-col lg:flex-row lg:items-center min-h-screen"> <div className="relative z-10 w-full max-w-screen-xl mx-auto px-6 lg:px-12 xl:px-16 flex flex-col lg:flex-row lg:items-center min-h-screen">
{/* ── LEFT COLUMN — text content (55% on desktop) ─────────────── */} {/* ── LEFT COLUMN — text content (55% on desktop) ─────────────── */}
<div className="flex-1 lg:max-w-[58%] flex flex-col justify-center pt-40 pb-16 lg:pt-28 lg:pb-0"> <div className="flex-1 lg:max-w-[58%] flex flex-col justify-center pt-24 pb-16 lg:pt-28 lg:pb-0">
{/* Headline — word-by-word stagger */} {/* Headline — word-by-word stagger */}
<motion.h1 <motion.h1
@@ -136,7 +135,7 @@ export default function Hero() {
variants={headlineContainer} variants={headlineContainer}
initial="hidden" initial="hidden"
animate="visible" animate="visible"
aria-label={rawTitle.replace('{exclusively}', 'exclusively')} aria-label={rawTitle.replace('{accentWord}', t('accentWord'))}
> >
{allWords.map((word, i) => {allWords.map((word, i) =>
word.type === 'accent' ? ( word.type === 'accent' ? (

View File

@@ -421,7 +421,7 @@ export default function Philosophy() {
/> />
{/* Attribution */} {/* Attribution */}
<p className="label-md text-outline">Founded on the Côte d&rsquo;Azur</p> <p className="label-md text-outline">{t('philosophy.foundedLocation')}</p>
</motion.div> </motion.div>
</div> </div>

View File

@@ -15,46 +15,44 @@ import { Lock, Clock, ArrowRight } from 'lucide-react';
// ─── Types ──────────────────────────────────────────────────────────────────── // ─── Types ────────────────────────────────────────────────────────────────────
interface Project { interface Project {
title: string; /** i18n key under "work.projects" (e.g. "monaco") */
description: string; i18nKey: string;
tags: string[];
slug: string; slug: string;
/** number of tags to resolve from the translation array */
tagCount: number;
featured?: boolean; featured?: boolean;
} }
interface ComingSoonItem { interface ComingSoonItem {
title: string; /** i18n key under "work.comingSoonProjects" (e.g. "riviera") */
subtitle: string; i18nKey: string;
confidential?: boolean;
} }
// ─── Data ────────────────────────────────────────────────────────────────────── // ─── Data ──────────────────────────────────────────────────────────────────────
const PROJECTS: Project[] = [ const PROJECTS: Project[] = [
{ {
title: 'Monaco Ocean Protection Challenge', i18nKey: 'monaco',
description:
"A comprehensive judging and analytics system with advanced AI jury integration for one of the Mediterranean's most prestigious conservation events.",
tags: ['AI Integration', 'Platform'],
slug: 'monaco-ocean', slug: 'monaco-ocean',
tagCount: 2,
featured: true, featured: true,
}, },
{ {
title: 'Port Nimara', i18nKey: 'portNimara',
description: 'Scalable digital hub for maritime logistics.',
tags: ['Website', 'Infrastructure'],
slug: 'port-nimara', slug: 'port-nimara',
tagCount: 2,
}, },
{ {
title: 'Port Amador', i18nKey: 'portAmador',
description: 'Premium digital experience for elite nautical services.',
tags: ['Website', 'Infrastructure'],
slug: 'port-amador', slug: 'port-amador',
tagCount: 2,
}, },
]; ];
const COMING_SOON: ComingSoonItem[] = [ const COMING_SOON: ComingSoonItem[] = [
{ title: 'Confidential Riviera Project', subtitle: 'Coming Soon' }, { i18nKey: 'riviera', confidential: true },
{ title: 'Sophia Antipolis AI Startup', subtitle: 'Launching Q4' }, { i18nKey: 'sophia' },
]; ];
// ─── Animation Variants ─────────────────────────────────────────────────────── // ─── Animation Variants ───────────────────────────────────────────────────────
@@ -371,7 +369,11 @@ function TagChip({ label, showDot = false }: { label: string; showDot?: boolean
// ─── Featured Card ──────────────────────────────────────────────────────────── // ─── Featured Card ────────────────────────────────────────────────────────────
function FeaturedCard({ project, readLabel }: { project: Project; readLabel: string }) { function FeaturedCard({ project, readLabel, t }: { project: Project; readLabel: string; t: (key: string) => string }) {
const tags = Array.from({ length: project.tagCount }, (_, i) =>
t(`work.projects.${project.i18nKey}.tags.${i}`),
);
return ( return (
<motion.article <motion.article
variants={featuredCardVariants} variants={featuredCardVariants}
@@ -392,24 +394,24 @@ function FeaturedCard({ project, readLabel }: { project: Project; readLabel: str
<div className="flex flex-col flex-1 p-7 gap-4"> <div className="flex flex-col flex-1 p-7 gap-4">
{/* Tags */} {/* Tags */}
<div className="flex flex-wrap gap-2"> <div className="flex flex-wrap gap-2">
{project.tags.map((tag, i) => ( {tags.map((tag, i) => (
<TagChip key={tag} label={tag} showDot={i > 0} /> <TagChip key={tag} label={tag} showDot={i > 0} />
))} ))}
</div> </div>
{/* Title */} {/* Title */}
<h3 className="font-serif text-2xl font-semibold text-on-surface leading-snug"> <h3 className="font-serif text-2xl font-semibold text-on-surface leading-snug">
{project.title} {t(`work.projects.${project.i18nKey}.title`)}
</h3> </h3>
{/* Description */} {/* Description */}
<p className="text-sm text-outline leading-relaxed flex-1"> <p className="text-sm text-outline leading-relaxed flex-1">
{project.description} {t(`work.projects.${project.i18nKey}.description`)}
</p> </p>
{/* CTA */} {/* CTA */}
<Link <Link
href={`/work/${project.slug}`} href={`/work/${project.slug}` as any}
className={cn( className={cn(
'inline-flex items-center gap-2 text-sm font-medium text-primary-dark', 'inline-flex items-center gap-2 text-sm font-medium text-primary-dark',
'mt-1 group/link', 'mt-1 group/link',
@@ -435,8 +437,11 @@ const SLUG_TO_VARIANT: Record<string, 'nimara' | 'amador'> = {
'port-amador': 'amador', 'port-amador': 'amador',
}; };
function SmallCard({ project, readLabel }: { project: Project; readLabel: string }) { function SmallCard({ project, readLabel, t }: { project: Project; readLabel: string; t: (key: string) => string }) {
const cardVariant = SLUG_TO_VARIANT[project.slug] ?? 'nimara'; const cardVariant = SLUG_TO_VARIANT[project.slug] ?? 'nimara';
const tags = Array.from({ length: project.tagCount }, (_, i) =>
t(`work.projects.${project.i18nKey}.tags.${i}`),
);
return ( return (
<motion.article <motion.article
@@ -469,24 +474,24 @@ function SmallCard({ project, readLabel }: { project: Project; readLabel: string
<div className="flex flex-col flex-1 p-5 gap-3"> <div className="flex flex-col flex-1 p-5 gap-3">
{/* Tags */} {/* Tags */}
<div className="flex flex-wrap gap-1.5"> <div className="flex flex-wrap gap-1.5">
{project.tags.map((tag, i) => ( {tags.map((tag, i) => (
<TagChip key={tag} label={tag} showDot={i > 0} /> <TagChip key={tag} label={tag} showDot={i > 0} />
))} ))}
</div> </div>
{/* Title */} {/* Title */}
<h3 className="font-serif text-lg font-semibold text-on-surface leading-snug"> <h3 className="font-serif text-lg font-semibold text-on-surface leading-snug">
{project.title} {t(`work.projects.${project.i18nKey}.title`)}
</h3> </h3>
{/* Description */} {/* Description */}
<p className="text-xs text-outline leading-relaxed flex-1"> <p className="text-xs text-outline leading-relaxed flex-1">
{project.description} {t(`work.projects.${project.i18nKey}.description`)}
</p> </p>
{/* CTA */} {/* CTA */}
<Link <Link
href={`/work/${project.slug}`} href={`/work/${project.slug}` as any}
className="inline-flex items-center gap-1.5 text-xs font-medium text-primary-dark group/link" className="inline-flex items-center gap-1.5 text-xs font-medium text-primary-dark group/link"
> >
<span className="relative after:absolute after:bottom-0 after:left-0 after:h-px after:w-full after:bg-primary-dark after:origin-left after:scale-x-100 after:transition-transform after:duration-200"> <span className="relative after:absolute after:bottom-0 after:left-0 after:h-px after:w-full after:bg-primary-dark after:origin-left after:scale-x-100 after:transition-transform after:duration-200">
@@ -504,9 +509,8 @@ function SmallCard({ project, readLabel }: { project: Project; readLabel: string
// ─── Coming Soon Card ───────────────────────────────────────────────────────── // ─── Coming Soon Card ─────────────────────────────────────────────────────────
function ComingSoonCard({ item }: { item: ComingSoonItem }) { function ComingSoonCard({ item, t }: { item: ComingSoonItem; t: (key: string) => string }) {
const isConfidential = item.subtitle === 'Coming Soon'; const Icon = item.confidential ? Lock : Clock;
const Icon = isConfidential ? Lock : Clock;
return ( return (
<motion.div <motion.div
@@ -533,9 +537,11 @@ function ComingSoonCard({ item }: { item: ComingSoonItem }) {
/> />
<div> <div>
<p className="font-serif text-base font-medium text-on-surface/60 leading-snug"> <p className="font-serif text-base font-medium text-on-surface/60 leading-snug">
{item.title} {t(`work.comingSoonProjects.${item.i18nKey}.title`)}
</p>
<p className="label-md text-outline/70 mt-1">
{t(`work.comingSoonProjects.${item.i18nKey}.subtitle`)}
</p> </p>
<p className="label-md text-outline/70 mt-1">{item.subtitle}</p>
</div> </div>
</div> </div>
</motion.div> </motion.div>
@@ -609,6 +615,7 @@ export default function SelectedWorks() {
<FeaturedCard <FeaturedCard
project={featuredProject} project={featuredProject}
readLabel={t('work.readCaseStudy')} readLabel={t('work.readCaseStudy')}
t={t}
/> />
</div> </div>
@@ -619,6 +626,7 @@ export default function SelectedWorks() {
key={project.slug} key={project.slug}
project={project} project={project}
readLabel={t('work.readCaseStudy')} readLabel={t('work.readCaseStudy')}
t={t}
/> />
))} ))}
</div> </div>
@@ -633,7 +641,7 @@ export default function SelectedWorks() {
className="grid grid-cols-1 sm:grid-cols-2 gap-5" className="grid grid-cols-1 sm:grid-cols-2 gap-5"
> >
{COMING_SOON.map((item) => ( {COMING_SOON.map((item) => (
<ComingSoonCard key={item.title} item={item} /> <ComingSoonCard key={item.i18nKey} item={item} t={t} />
))} ))}
</motion.div> </motion.div>

View File

@@ -1,7 +1,7 @@
{ {
"nav": { "nav": {
"services": "Services", "services": "Services",
"configure": "Configure", "configure": "Get Started",
"process": "Process", "process": "Process",
"work": "Work", "work": "Work",
"about": "About", "about": "About",
@@ -9,63 +9,63 @@
"bookCall": "Book a Call" "bookCall": "Book a Call"
}, },
"hero": { "hero": {
"eyebrow": "Bespoke Digital Studio", "title": "Websites, software, and infrastructure — designed and built {accentWord} around you.",
"title": "Your website, your infrastructure, your AI — built {exclusively} for you.", "accentWord": "entirely",
"subtitle": "We design and develop complete digital ecosystems for ambitious businesses on the Côte d'Azur and beyond. No templates, no compromises.", "subtitle": "We design custom websites, build purpose-built software, and run private infrastructure that you own and control. One team, from first pixel to final deployment.",
"cta": "Configure Your Project", "cta": "Start Your Project",
"ctaSecondary": "See Our Work", "ctaSecondary": "See Our Work",
"trust": "Trusted by businesses across the Riviera" "trust": "Trusted by businesses across the Riviera"
}, },
"trustBar": { "trustBar": {
"customBuilt": { "customBuilt": {
"title": "Custom-Built", "title": "Built From Scratch",
"description": "Tailored architecture from the first line of code." "description": "Every project designed and coded to your exact requirements. No templates, no shortcuts."
}, },
"privateInfra": { "privateInfra": {
"title": "Private Infrastructure", "title": "You Own Everything",
"description": "Secure, dedicated cloud environments for your data." "description": "Private servers, your data, your tools — fully controlled and owned by you."
}, },
"aiPowered": { "aiPowered": {
"title": "AI-Powered", "title": "One Team, End to End",
"description": "Intelligent automation that scales your productivity." "description": "Design, development, hosting, and support from a single dedicated team."
}, },
"rivieraBased": { "rivieraBased": {
"title": "Riviera-Based", "title": "AI Where It Matters",
"description": "Local expertise for global ambitions." "description": "Intelligent features and automation built directly into your systems."
} }
}, },
"services": { "services": {
"eyebrow": "Our Capabilities", "eyebrow": "What We Do",
"title": "Three Pillars of Digital Excellence", "title": "Design. Build. Run.",
"web": { "web": {
"title": "Design & Development", "title": "Websites & Web Apps",
"features": ["Bespoke UI/UX Design", "Modern Web Applications", "E-commerce & Platforms", "Performance Optimization"] "features": ["Custom Web Design", "Responsive Development", "SEO & Performance", "Content Management"]
}, },
"systems": { "systems": {
"title": "Custom Systems", "title": "Custom Software",
"features": ["CRM & Management Platforms", "Bespoke Business Software", "API & Integration Architecture", "Internal Tooling"] "features": ["Management Platforms", "CRMs & Business Tools", "Booking & Scheduling", "API Integrations"]
}, },
"infrastructure": { "infrastructure": {
"title": "Digital Infrastructure", "title": "Private Infrastructure",
"features": ["Dedicated Cloud Hosting", "Data Sovereignty Solutions", "Security Hardening", "DevOps & Maintenance"] "features": ["Dedicated Servers", "Email & Cloud Storage", "Security & Encryption", "Monitoring & Support"]
}, },
"aiNarrative": "We build your digital ecosystem — then make it intelligent." "aiNarrative": "And when you're ready, we layer AI into everything — from intelligent features in your software to automation that connects all your tools."
}, },
"configurator": { "configurator": {
"eyebrow": "Interactive Studio", "eyebrow": "Get Started",
"title": "Let's define your project scope.", "title": "Tell us what you need.",
"description": "Configure your requirements and we'll generate a personalized project brief.", "description": "Walk through a few questions and we'll put together a project brief tailored to you.",
"step1": { "step1": {
"title": "What are we building together?", "title": "What do you need?",
"subtitle": "Select the services that match your vision." "subtitle": "Select the services that match your project."
}, },
"step2": { "step2": {
"title": "Tell us about your project", "title": "Tell us about your project",
"subtitle": "This helps us prepare the right approach before our first call." "subtitle": "A few details help us prepare the right approach."
}, },
"step3": { "step3": {
"title": "Almost there", "title": "Your details",
"subtitle": "We'll generate a personalized project brief and send it to your inbox." "subtitle": "We'll send you a personalized project brief."
}, },
"complete": { "complete": {
"title": "Your project brief is ready", "title": "Your project brief is ready",
@@ -73,73 +73,124 @@
"bookTitle": "Book a Consultation", "bookTitle": "Book a Consultation",
"bookSubtitle": "30 minutes to discuss your brief with our team" "bookSubtitle": "30 minutes to discuss your brief with our team"
}, },
"aiToggle": "Enhance with AI", "howItWorks": "How it works",
"aiDescription": "We layer intelligent automation into every system we build.", "noCommitment": "No commitment required",
"selectService": "Select at least one service to continue",
"services": {
"web": {
"title": "Web Design & Development",
"description": "Custom websites and web applications — designed from scratch, built for performance, and optimized for search engines."
},
"systems": {
"title": "Custom Software",
"description": "Management platforms, CRMs, and business tools built to match exactly how your team works."
},
"infrastructure": {
"title": "Private Infrastructure",
"description": "Dedicated servers with email, cloud storage, and business tools — fully owned and controlled by you."
}
},
"aiToggle": "Add AI Integration",
"aiDescription": "Intelligent features and automation built directly into your systems.",
"generateBrief": "Generate My Brief", "generateBrief": "Generate My Brief",
"nextStep": "Next Step", "nextStep": "Next Step",
"back": "Back" "back": "Back"
}, },
"process": { "process": {
"eyebrow": "Our Method", "eyebrow": "How We Work",
"title": "Architecture of a Project", "title": "From Idea to Launch",
"steps": { "steps": {
"discovery": { "discovery": {
"title": "Discovery", "title": "Discovery",
"description": "Understanding your business, users, and technical landscape." "description": "We learn your business, your users, and what you actually need built."
}, },
"strategy": { "strategy": {
"title": "Strategy & Architecture", "title": "Strategy & Planning",
"description": "Defining the blueprint — from data model to deployment plan." "description": "We define the architecture, choose the right tools, and map out the build."
}, },
"build": { "build": {
"title": "Design & Build", "title": "Design & Build",
"description": "Crafting every pixel and every line of code." "description": "Your project takes shape — pixel by pixel, feature by feature."
}, },
"launch": { "launch": {
"title": "Launch & Evolve", "title": "Launch & Support",
"description": "Deployment, monitoring, and continuous improvement." "description": "We deploy, monitor, and keep everything running smoothly."
} }
} }
}, },
"work": { "work": {
"eyebrow": "Selected Works", "eyebrow": "Our Work",
"title": "Digital Landmarks", "title": "Projects We've Built",
"readCaseStudy": "Read Case Study", "readCaseStudy": "View Project",
"comingSoon": "Coming Soon" "comingSoon": "Coming Soon",
"projects": {
"monaco": {
"title": "Monaco Ocean Protection Challenge",
"description": "A judging and analytics platform with AI-powered filtering, automated judge assignment, and intelligent project review for one of the Mediterranean's leading conservation events.",
"tags": ["Custom Software", "AI Integration"]
},
"portNimara": {
"title": "Port Nimara",
"description": "Custom website and full CRM for lead management, berth assignment, and marina operations.",
"tags": ["Website", "Custom Software"]
},
"portAmador": {
"title": "Port Amador",
"description": "Website and private digital infrastructure — cloud storage, email, and file management for a premium marina.",
"tags": ["Website", "Infrastructure"]
}
},
"comingSoonProjects": {
"riviera": {
"title": "Confidential Riviera Project",
"subtitle": "Coming Soon"
},
"sophia": {
"title": "Sophia Antipolis AI Startup",
"subtitle": "Launching Q4"
}
}
}, },
"philosophy": { "philosophy": {
"eyebrow": "The LetsBe. Way", "eyebrow": "Why It Matters",
"title": "Digital Sovereignty is not a luxury.", "title": "Your tools should belong to you.",
"subtitle": "We believe that every modern business is, at its core, a software company. We help you own your tools, your data, and your future.", "subtitle": "Most businesses rent their digital life from a dozen different platforms. We think there's a better way — one where you own your data, control your infrastructure, and aren't locked into anyone's pricing page.",
"ownership": { "ownership": {
"title": "Ownership & Privacy", "title": "Own Your Stack",
"description": "We move you away from standard SaaS dependencies into private cloud environments where you own 100% of your data." "description": "We move you off scattered SaaS subscriptions and onto private infrastructure — servers, email, cloud storage, and tools that you control."
}, },
"craftsmanship": { "craftsmanship": {
"title": "Craftsmanship", "title": "No Shortcuts",
"description": "We don't use page builders or bloated themes. We write clean, semantic code that is lightning-fast and search-engine optimized." "description": "We write clean, hand-crafted code optimized for speed and search engines. No page builders, no bloated themes, no technical debt."
}, },
"oneTeam": { "oneTeam": {
"title": "One Team, Everything", "title": "One Relationship",
"description": "From the initial Figma frame to the Kubernetes deployment, we manage the entire lifecycle under one roof." "description": "From the initial design through development to ongoing support — one team that knows your business inside and out."
}, },
"quote": "Our mission is to bring the precision of architecture to the fluidity of the web." "quote": "We build technology that works for your business — not the other way around.",
"foundedLocation": "Based on the Côte d'Azur"
}, },
"cta": { "cta": {
"eyebrow": "Let's Talk", "eyebrow": "Let's Talk",
"title": "Ready to build something exceptional?", "title": "Ready to build something?",
"subtitle": "From the first consultation to launch day, we're with you every step of the way.", "subtitle": "Tell us what you need. No pitch decks, no pressure — just a conversation about what's possible.",
"cta": "Configure Your Project", "cta": "Start Your Project",
"configure": "Configure Your Project", "configure": "Start Your Project",
"email": "hello@letsbe.biz", "email": "hello@letsbe.biz",
"reassurance": "No commitment required — just a conversation about what's possible." "reassurance": "No commitment required."
}, },
"footer": { "footer": {
"tagline": "Designing and engineering the digital backbone of tomorrow's leaders.", "tagline": "Custom websites, software, and infrastructure for businesses that want to own their digital future.",
"location": "Côte d'Azur, France", "location": "Côte d'Azur, France",
"services": "Services", "services": "Services",
"studio": "Studio", "studio": "Studio",
"connect": "Connect", "connect": "Connect",
"serviceLinks": {
"designDev": "Websites & Web Apps",
"customSystems": "Custom Software",
"infrastructure": "Private Infrastructure",
"aiAutomation": "AI Integration"
},
"privacy": "Privacy Policy", "privacy": "Privacy Policy",
"terms": "Terms of Service" "terms": "Terms of Service"
} }

View File

@@ -1,7 +1,7 @@
{ {
"nav": { "nav": {
"services": "Services", "services": "Services",
"configure": "Configurer", "configure": "Démarrer",
"process": "Méthode", "process": "Méthode",
"work": "Réalisations", "work": "Réalisations",
"about": "À propos", "about": "À propos",
@@ -9,137 +9,188 @@
"bookCall": "Réserver un Appel" "bookCall": "Réserver un Appel"
}, },
"hero": { "hero": {
"eyebrow": "Studio Digital Sur Mesure", "title": "Sites web, logiciels et infrastructure — conçus et développés {accentWord} autour de vous.",
"title": "Votre site, votre infrastructure, votre IA — conçus {exclusively} pour vous.", "accentWord": "entièrement",
"subtitle": "Nous concevons et développons des écosystèmes digitaux complets pour les entreprises ambitieuses sur la Côte d'Azur et au-delà. Pas de templates, pas de compromis.", "subtitle": "Nous concevons des sites web sur mesure, développons des logiciels dédiés et gérons une infrastructure privée qui vous appartient. Une seule équipe, du premier pixel au déploiement final.",
"cta": "Configurez Votre Projet", "cta": "Démarrer Votre Projet",
"ctaSecondary": "Voir Nos Réalisations", "ctaSecondary": "Voir Nos Réalisations",
"trust": "La confiance des entreprises de la Riviera" "trust": "La confiance des entreprises de la Riviera"
}, },
"trustBar": { "trustBar": {
"customBuilt": { "customBuilt": {
"title": "Sur Mesure", "title": "Conçu Sur Mesure",
"description": "Architecture personnalisée dès la première ligne de code." "description": "Chaque projet est designé et codé selon vos besoins exacts. Pas de templates, pas de raccourcis."
}, },
"privateInfra": { "privateInfra": {
"title": "Infrastructure Privée", "title": "Tout Vous Appartient",
"description": "Environnements cloud dédiés et sécurisés pour vos données." "description": "Serveurs privés, vos données, vos outils — entièrement contrôlés et détenus par vous."
}, },
"aiPowered": { "aiPowered": {
"title": "Propulsé par l'IA", "title": "Une Seule Équipe",
"description": "Automatisation intelligente qui démultiplie votre productivité." "description": "Design, développement, hébergement et support par une seule équipe dédiée."
}, },
"rivieraBased": { "rivieraBased": {
"title": "Basé sur la Riviera", "title": "L'IA Là Où Ça Compte",
"description": "Expertise locale pour des ambitions globales." "description": "Fonctionnalités intelligentes et automatisation intégrées directement dans vos systèmes."
} }
}, },
"services": { "services": {
"eyebrow": "Nos Compétences", "eyebrow": "Ce Que Nous Faisons",
"title": "Trois Piliers d'Excellence Digitale", "title": "Concevoir. Développer. Héberger.",
"web": { "web": {
"title": "Design & Développement", "title": "Sites Web & Applications",
"features": ["Design UI/UX Sur Mesure", "Applications Web Modernes", "E-commerce & Plateformes", "Optimisation des Performances"] "features": ["Design Web Sur Mesure", "Développement Responsive", "SEO & Performance", "Gestion de Contenu"]
}, },
"systems": { "systems": {
"title": "Systèmes Personnalisés", "title": "Logiciels Sur Mesure",
"features": ["CRM & Plateformes de Gestion", "Logiciels Métier Sur Mesure", "Architecture API & Intégration", "Outillage Interne"] "features": ["Plateformes de Gestion", "CRM & Outils Métier", "Réservation & Planning", "Intégrations API"]
}, },
"infrastructure": { "infrastructure": {
"title": "Infrastructure Digitale", "title": "Infrastructure Privée",
"features": ["Hébergement Cloud Dédié", "Solutions de Souveraineté des Données", "Renforcement de la Sécurité", "DevOps & Maintenance"] "features": ["Serveurs Dédiés", "Email & Stockage Cloud", "Sécurité & Chiffrement", "Monitoring & Support"]
}, },
"aiNarrative": "Nous construisons votre écosystème digital — puis nous le rendons intelligent." "aiNarrative": "Et quand vous êtes prêt, nous intégrons l'IA dans l'ensemble — des fonctionnalités intelligentes dans vos logiciels à l'automatisation qui connecte tous vos outils."
}, },
"configurator": { "configurator": {
"eyebrow": "Studio Interactif", "eyebrow": "Démarrer",
"title": "Définissons le périmètre de votre projet.", "title": "Dites-nous ce dont vous avez besoin.",
"description": "Configurez vos besoins et nous générerons un brief personnalisé.", "description": "Répondez à quelques questions et nous préparerons un brief projet sur mesure pour vous.",
"step1": { "step1": {
"title": "Que construisons-nous ensemble ?", "title": "De quoi avez-vous besoin ?",
"subtitle": "Sélectionnez les services qui correspondent à votre vision." "subtitle": "Sélectionnez les services qui correspondent à votre projet."
}, },
"step2": { "step2": {
"title": "Parlez-nous de votre projet", "title": "Parlez-nous de votre projet",
"subtitle": "Cela nous aide à préparer la bonne approche avant notre premier échange." "subtitle": "Quelques détails nous aident à préparer la bonne approche."
}, },
"step3": { "step3": {
"title": "Presque terminé", "title": "Vos coordonnées",
"subtitle": "Nous générerons un brief personnalisé et l'enverrons dans votre boîte mail." "subtitle": "Nous vous enverrons un brief projet personnalisé."
}, },
"complete": { "complete": {
"title": "Votre brief est prêt", "title": "Votre brief projet est prêt",
"subtitle": "Vérifiez votre boîte mail — nous avons envoyé un brief détaillé à {email}", "subtitle": "Vérifiez votre boîte mail — nous avons envoyé un brief détaillé à {email}",
"bookTitle": "Réservez une Consultation", "bookTitle": "Réservez une Consultation",
"bookSubtitle": "30 minutes pour discuter de votre brief avec notre équipe" "bookSubtitle": "30 minutes pour discuter de votre brief avec notre équipe"
}, },
"aiToggle": "Enrichir avec l'IA", "howItWorks": "Comment ça marche",
"aiDescription": "Nous intégrons l'automatisation intelligente dans chaque système que nous construisons.", "noCommitment": "Sans engagement",
"selectService": "Sélectionnez au moins un service pour continuer",
"services": {
"web": {
"title": "Design & Développement Web",
"description": "Sites web et applications sur mesure — conçus de zéro, optimisés pour la performance et le référencement."
},
"systems": {
"title": "Logiciels Sur Mesure",
"description": "Plateformes de gestion, CRM et outils métier conçus pour correspondre exactement à votre façon de travailler."
},
"infrastructure": {
"title": "Infrastructure Privée",
"description": "Serveurs dédiés avec email, stockage cloud et outils métier — entièrement détenus et contrôlés par vous."
}
},
"aiToggle": "Ajouter l'Intégration IA",
"aiDescription": "Fonctionnalités intelligentes et automatisation intégrées directement dans vos systèmes.",
"generateBrief": "Générer Mon Brief", "generateBrief": "Générer Mon Brief",
"nextStep": "Étape Suivante", "nextStep": "Étape Suivante",
"back": "Retour" "back": "Retour"
}, },
"process": { "process": {
"eyebrow": "Notre Méthode", "eyebrow": "Notre Méthode",
"title": "Architecture d'un Projet", "title": "De l'Idée au Lancement",
"steps": { "steps": {
"discovery": { "discovery": {
"title": "Découverte", "title": "Découverte",
"description": "Comprendre votre entreprise, vos utilisateurs et votre paysage technique." "description": "Nous apprenons votre activité, vos utilisateurs et ce que vous avez réellement besoin de construire."
}, },
"strategy": { "strategy": {
"title": "Stratégie & Architecture", "title": "Stratégie & Planification",
"description": "Définir le plan — du modèle de données au plan de déploiement." "description": "Nous définissons l'architecture, choisissons les bons outils et planifions la construction."
}, },
"build": { "build": {
"title": "Design & Construction", "title": "Design & Construction",
"description": "Façonner chaque pixel et chaque ligne de code." "description": "Votre projet prend forme — pixel par pixel, fonctionnalité par fonctionnalité."
}, },
"launch": { "launch": {
"title": "Lancement & Évolution", "title": "Lancement & Support",
"description": "Déploiement, monitoring et amélioration continue." "description": "Nous déployons, surveillons et assurons le bon fonctionnement de tout."
} }
} }
}, },
"work": { "work": {
"eyebrow": "Réalisations Sélectionnées", "eyebrow": "Nos Réalisations",
"title": "Réalisations Digitales", "title": "Projets Que Nous Avons Construits",
"readCaseStudy": "Lire l'Étude de Cas", "readCaseStudy": "Voir le Projet",
"comingSoon": "Bientôt Disponible" "comingSoon": "Bientôt Disponible",
"projects": {
"monaco": {
"title": "Monaco Ocean Protection Challenge",
"description": "Plateforme de jugement et d'analyse avec filtrage par IA, assignation automatique des juges et évaluation intelligente des projets pour l'un des événements de conservation majeurs de la Méditerranée.",
"tags": ["Logiciel Sur Mesure", "Intégration IA"]
},
"portNimara": {
"title": "Port Nimara",
"description": "Site web sur mesure et CRM complet pour la gestion des prospects, l'attribution des places et les opérations de la marina.",
"tags": ["Site Web", "Logiciel Sur Mesure"]
},
"portAmador": {
"title": "Port Amador",
"description": "Site web et infrastructure digitale privée — stockage cloud, email et gestion de fichiers pour une marina premium.",
"tags": ["Site Web", "Infrastructure"]
}
},
"comingSoonProjects": {
"riviera": {
"title": "Projet Confidentiel Riviera",
"subtitle": "Bientôt Disponible"
},
"sophia": {
"title": "Startup IA Sophia Antipolis",
"subtitle": "Lancement T4"
}
}
}, },
"philosophy": { "philosophy": {
"eyebrow": "La Philosophie LetsBe.", "eyebrow": "Pourquoi C'est Important",
"title": "La souveraineté digitale n'est pas un luxe.", "title": "Vos outils devraient vous appartenir.",
"subtitle": "Nous croyons que chaque entreprise moderne est, en son cœur, une entreprise logicielle. Nous vous aidons à posséder vos outils, vos données et votre avenir.", "subtitle": "La plupart des entreprises louent leur vie digitale à une dizaine de plateformes différentes. Nous pensons qu'il y a mieux — un monde où vous possédez vos données, contrôlez votre infrastructure et n'êtes enfermé dans la grille tarifaire de personne.",
"ownership": { "ownership": {
"title": "Propriété & Confidentialité", "title": "Maîtrisez Votre Stack",
"description": "Nous vous éloignons des dépendances SaaS standard vers des environnements cloud privés où vous possédez 100% de vos données." "description": "Nous vous libérons des abonnements SaaS dispersés pour vous installer sur une infrastructure privée — serveurs, email, stockage cloud et outils que vous contrôlez."
}, },
"craftsmanship": { "craftsmanship": {
"title": "Artisanat", "title": "Pas de Raccourcis",
"description": "Nous n'utilisons pas de constructeurs de pages ou de thèmes surchargés. Nous écrivons du code propre et sémantique, ultra-rapide et optimisé pour le référencement." "description": "Nous écrivons du code propre, artisanal, optimisé pour la vitesse et le référencement. Pas de constructeurs de pages, pas de thèmes surchargés, pas de dette technique."
}, },
"oneTeam": { "oneTeam": {
"title": "Une Équipe, Tout", "title": "Une Seule Relation",
"description": "Du premier frame Figma au déploiement Kubernetes, nous gérons l'intégralité du cycle de vie sous un même toit." "description": "Du design initial au développement jusqu'au support continu — une seule équipe qui connaît votre activité de A à Z."
}, },
"quote": "Notre mission est d'apporter la précision de l'architecture à la fluidité du web." "quote": "Nous construisons la technologie qui travaille pour votre entreprise — pas l'inverse.",
"foundedLocation": "Basé sur la Côte d'Azur"
}, },
"cta": { "cta": {
"eyebrow": "Parlons-en", "eyebrow": "Parlons-en",
"title": "Prêt à construire quelque chose d'exceptionnel ?", "title": "Prêt à construire quelque chose ?",
"subtitle": "De la première consultation au jour du lancement, nous vous accompagnons à chaque étape.", "subtitle": "Dites-nous ce dont vous avez besoin. Pas de slides, pas de pression — juste une conversation sur ce qui est possible.",
"cta": "Configurez Votre Projet", "cta": "Démarrer Votre Projet",
"configure": "Configurez Votre Projet", "configure": "Démarrer Votre Projet",
"email": "hello@letsbe.biz", "email": "hello@letsbe.biz",
"reassurance": "Sans engagement — juste une conversation sur ce qui est possible." "reassurance": "Sans engagement."
}, },
"footer": { "footer": {
"tagline": "Concevoir et construire la colonne vertébrale digitale des leaders de demain.", "tagline": "Sites web, logiciels et infrastructure sur mesure pour les entreprises qui veulent maîtriser leur avenir digital.",
"location": "Côte d'Azur, France", "location": "Côte d'Azur, France",
"services": "Services", "services": "Services",
"studio": "Studio", "studio": "Studio",
"connect": "Contact", "connect": "Contact",
"serviceLinks": {
"designDev": "Sites Web & Applications",
"customSystems": "Logiciels Sur Mesure",
"infrastructure": "Infrastructure Privée",
"aiAutomation": "Intégration IA"
},
"privacy": "Politique de Confidentialité", "privacy": "Politique de Confidentialité",
"terms": "Conditions d'Utilisation" "terms": "Conditions d'Utilisation"
} }