;
};
@@ -101,66 +28,6 @@ export default async function HomePage({ params }: HomePageProps) {
fetchCommunityStats(),
]);
- const PROBLEM_POINTS: ProblemPointType[] = [
- {
- heading: (
-
- {i18n._(msg`The Giant Monolith`)}
-
- ),
- body: msg`Proprietary languages, slow deployment cycles, and "black box" logic.`,
- },
- {
- heading: (
-
- {i18n._(msg`The In-house Burden`)}
-
- ),
- body: msg`It's fragile. V1 ships quickly, but maintaining and making changes is a long term burden.`,
- },
- ];
-
- const HOME_STEPPER_STEPS: HomeStepperStepType[] = [
- {
- heading: (
-
-
- {i18n._(msg`Begin with production-grade`)}
- {' '}
-
- {i18n._(msg`building blocks`)}
-
-
- ),
- body: msg`Compose your CRM and internal apps with a single extensibility toolkit. Data model, layout, and automation.`,
- },
- {
- heading: (
-
-
- {i18n._(msg`Continue iteration`)}
- {' '}
-
- {i18n._(msg`without friction`)}
-
-
- ),
- body: msg`Enjoy unlimited customization using the AI coding tools you already love. Adapt your CRM to fit the way your business grows and wins.`,
- },
- {
- heading: (
-
-
- {i18n._(msg`Stay in control with our`)}
- {' '}
-
- {i18n._(msg`open-source software`)}
-
-
- ),
- body: msg`Don't get locked into someone else's ecosystem. Twenty's developer experience looks like normal software, with local setup, real data, live testing, and no proprietary tooling.`,
- },
- ];
const menuSocialLinks = mergeSocialLinkLabels(MENU_DATA.socialLinks, stats);
return (
@@ -192,186 +59,28 @@ export default async function HomePage({ params }: HomePageProps) {
href="/illustrations/home/helped/money.glb"
as="fetch"
/>
-
-
-
-
-
-
-
-
-
-
-
-
- {i18n._(msg`Build your Enterprise CRM`)}
- {' '}
-
- {i18n._(msg`at\u00A0AI\u00A0Speed`)}
-
-
-
- {i18n._(
- msg`Twenty gives technical teams the building blocks for a custom CRM that meets complex business needs and quickly adapts as the business evolves.`,
- )}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {i18n._(msg`The Problem.`)}
-
-
-
-
- {i18n._(msg`A custom CRM gives your org an edge,`)}
- {' '}
-
- {i18n._(msg`but building one`)}
- {' '}
-
- {i18n._(msg`comes with`)}
- {' '}
-
- {i18n._(msg`tradeoffs`)}
-
-
-
-
-
+
-
-
-
-
-
-
- {i18n._(msg`Stop settling for trade-offs.`)}
-
-
-
-
- {i18n._(msg`Assemble, iterate and adapt a robust CRM,`)}
- {' '}
-
- {i18n._(msg`that's quick to flex`)}
-
-
-
-
- {i18n._(
- msg`Compose your CRM and internal apps with a single extensibility toolkit.`,
- )}
-
-
-
-
-
+
-
+
-
-
-
-
- {i18n._(msg`Skip the clunky UX that always comes with custom.`)}
-
-
-
-
- {i18n._(msg`Make your GTM team happy`)}
-
-
-
- {i18n._(msg`with`)}
- {' '}
-
- {i18n._(msg`a CRM they'll love`)}
-
-
-
-
-
+
-
-
-
+
-
-
-
-
-
+
-
-
-
-
- {i18n._(msg`Any Questions?`)}
-
-
-
-
- {i18n._(msg`Stop fighting custom.`)}
-
-
-
- {i18n._(msg`Start building, with Twenty`)}
-
-
-
-
-
-
-
-
-
+
+
+
+
+
>
);
}
diff --git a/packages/twenty-website/src/app/[locale]/articles/[slug]/page.tsx b/packages/twenty-website/src/app/[locale]/articles/[slug]/page.tsx
index 86dbd30539..5fe88633ba 100644
--- a/packages/twenty-website/src/app/[locale]/articles/[slug]/page.tsx
+++ b/packages/twenty-website/src/app/[locale]/articles/[slug]/page.tsx
@@ -4,12 +4,11 @@ import { SOURCE_LOCALE } from 'twenty-shared/translations';
import { getPublishedArticle, getPublishedArticles } from '@/lib/articles';
import { fetchCommunityStats } from '@/lib/community/fetch-community-stats';
-import { type LocaleRouteParams } from '@/lib/i18n/utils/get-route-i18n';
-import { localeToUrlSegment } from '@/lib/i18n/utils/website-locale-segments';
-import { resolveLocaleParam } from '@/lib/i18n';
+import { type LocaleRouteParams } from '@/lib/i18n/server';
+import { localeToUrlSegment, resolveLocaleParam } from '@/lib/i18n';
import { mergeSocialLinkLabels } from '@/lib/community/merge-social-link-labels';
import { buildArticleJsonLd, buildPageMetadata, JsonLd } from '@/lib/seo';
-import { Articles } from '@/sections/Articles';
+import { ArticlesArticle } from '@/sections/Articles';
import { Menu, MENU_DATA } from '@/sections/Menu';
import { theme } from '@/theme';
@@ -68,18 +67,11 @@ export default async function ArticlePage({ params }: ArticlePageProps) {
return (
<>
-
-
-
-
-
-
-
+ />
+
>
);
}
diff --git a/packages/twenty-website/src/app/[locale]/articles/_components/ArticlesHero.tsx b/packages/twenty-website/src/app/[locale]/articles/_components/ArticlesHero.tsx
new file mode 100644
index 0000000000..4bfe000755
--- /dev/null
+++ b/packages/twenty-website/src/app/[locale]/articles/_components/ArticlesHero.tsx
@@ -0,0 +1,20 @@
+import { HeadingPart } from '@/design-system/components';
+import { HeroBody, HeroHeading, HeroSection } from '@/templates/Hero';
+
+// Articles is English-only (SOURCE_LOCALE-gated), so the copy is literal.
+export function ArticlesHero() {
+ return (
+
+
+ Ideas on
+
+ open-source
+ CRM
+
+
+ Ideas from the team building Twenty on open source CRM, GTM systems, and
+ building software that lasts.
+
+
+ );
+}
diff --git a/packages/twenty-website/src/app/[locale]/articles/page.tsx b/packages/twenty-website/src/app/[locale]/articles/page.tsx
index 486d8d29b4..e7df6bba64 100644
--- a/packages/twenty-website/src/app/[locale]/articles/page.tsx
+++ b/packages/twenty-website/src/app/[locale]/articles/page.tsx
@@ -1,27 +1,21 @@
-import { msg } from '@lingui/core/macro';
import { notFound } from 'next/navigation';
import { SOURCE_LOCALE } from 'twenty-shared/translations';
-import { HeadingPart } from '@/design-system/components';
import { getPublishedArticles } from '@/lib/articles';
import { fetchCommunityStats } from '@/lib/community/fetch-community-stats';
import { mergeSocialLinkLabels } from '@/lib/community/merge-social-link-labels';
import { resolveLocaleParam } from '@/lib/i18n';
-import {
- getRouteI18n,
- type LocaleRouteParams,
-} from '@/lib/i18n/utils/get-route-i18n';
-import { Pages } from '@/lib/pages';
+import { getRouteI18n, type LocaleRouteParams } from '@/lib/i18n/server';
import {
buildArticleListJsonLd,
buildBreadcrumbListJsonLd,
buildRouteMetadata,
JsonLd,
} from '@/lib/seo';
-import { Articles } from '@/sections/Articles';
-import { Hero } from '@/sections/Hero';
+import { ArticlesIndex } from '@/sections/Articles';
+import { ArticlesHero } from '@/app/[locale]/articles/_components/ArticlesHero';
import { Menu, MENU_DATA } from '@/sections/Menu';
-import { TRUSTED_BY_LOGOS, TrustedBy } from '@/sections/TrustedBy';
+import { TrustedBy } from '@/sections/TrustedBy';
import { css } from '@linaria/core';
export const generateMetadata = buildRouteMetadata('articles');
@@ -66,7 +60,10 @@ export default async function ArticlesPage({ params }: ArticlesPageProps) {
notFound();
}
- const [i18n, stats] = await Promise.all([
+ // getRouteI18n sets the request-scoped i18n context that TrustedBy/Menu/
+ // Articles read; this page's own copy is English-only (SOURCE_LOCALE-gated
+ // above), so the returned instance is intentionally unused here.
+ const [, stats] = await Promise.all([
getRouteI18n(params),
fetchCommunityStats(),
]);
@@ -87,41 +84,20 @@ export default async function ArticlesPage({ params }: ArticlesPageProps) {
{posts.length > 0 ? (
) : null}
-
-
-
-
-
-
+ />
-
-
- Ideas on
-
- open-source{' '}
- CRM
-
-
- Ideas from the team building Twenty on open source CRM, GTM systems,
- and building software that lasts.
-
-
-
+
-
+
>
);
}
diff --git a/packages/twenty-website/src/app/[locale]/customers/9dots/page.tsx b/packages/twenty-website/src/app/[locale]/customers/9dots/page.tsx
index 4ade697420..85c76b68cf 100644
--- a/packages/twenty-website/src/app/[locale]/customers/9dots/page.tsx
+++ b/packages/twenty-website/src/app/[locale]/customers/9dots/page.tsx
@@ -1,10 +1,7 @@
-import { CaseStudyPageLayout } from '@/app/[locale]/customers/_components/CaseStudyPageLayout';
+import { CustomersCaseStudyPageLayout } from '@/app/[locale]/customers/_components/CustomersCaseStudyPageLayout';
import { Heading, HeadingPart } from '@/design-system/components';
import { CASE_STUDY_HERO_IMAGES, type CaseStudyData } from '@/lib/customers';
-import {
- getRouteI18n,
- type LocaleRouteParams,
-} from '@/lib/i18n/utils/get-route-i18n';
+import { getRouteI18n, type LocaleRouteParams } from '@/lib/i18n/server';
import { buildLocalizedMetadata } from '@/lib/seo';
import { msg } from '@lingui/core/macro';
@@ -39,10 +36,10 @@ export default async function NineDotsCaseStudyPage({
{i18n._(msg`A real estate agency on WhatsApp`)}
- {' '}
+