polish: complete copy rewrite + i18n fixes + dead link cleanup
All checks were successful
Build & Push / build-and-push (push) Successful in 1m47s
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:
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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' ? (
|
||||||
|
|||||||
@@ -421,7 +421,7 @@ export default function Philosophy() {
|
|||||||
/>
|
/>
|
||||||
|
|
||||||
{/* Attribution */}
|
{/* Attribution */}
|
||||||
<p className="label-md text-outline">Founded on the Côte d’Azur</p>
|
<p className="label-md text-outline">{t('philosophy.foundedLocation')}</p>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user