Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
01e973e
initial home redesign commit
pettinarip Feb 9, 2026
4d212c9
perf(homepage-2026): add SEO metadata and dynamic imports
pettinarip Feb 9, 2026
41418cc
feat(data): integrate dune api for account holders kpi
pettinarip Feb 9, 2026
d41f2a9
perf: remove priority from below-fold trustlogos image
pettinarip Feb 9, 2026
38af950
refactor(homepage): consolidate savingscarousel desktop/mobile compon…
pettinarip Feb 10, 2026
d033ce3
refactor(homepage): hardcode apy data in savingscarousel
pettinarip Feb 10, 2026
c8ac62a
Merge remote-tracking branch 'origin/dev' into home-redesign
pettinarip Feb 10, 2026
c41ec69
feat(homepage): add minimal i18n wrapper for simulator glossary tooltips
pettinarip Feb 10, 2026
96a8720
fix(homepage): increase mastercard logo size for visual consistency
pettinarip Feb 10, 2026
982486b
refactor(homepage): remove animation from eth holders metric
pettinarip Feb 11, 2026
825d5d3
feat(homepage): add persona modal to hero start here button
pettinarip Feb 11, 2026
e92eb20
feat(homepage): simulate live transaction counter with incremental up…
pettinarip Feb 11, 2026
d7684d7
fix(homepage): prevent never offline card from being cut off at lapto…
pettinarip Feb 11, 2026
7bb7616
fix link
pettinarip Feb 11, 2026
5b2eb5c
refactor(homepage): extract shared floatingcard component
pettinarip Feb 11, 2026
102f68e
fix(homepage): add spacing between savings carousel slides
pettinarip Feb 11, 2026
3fc103f
fix(a11y): add missing dialog description to persona modal
pettinarip Feb 11, 2026
be9036a
feat: add ab test for homepage 2026 redesign
pettinarip Feb 11, 2026
3318528
feat(ab-test): add variant c (direct buttons) to homepage redesign test
pettinarip Feb 12, 2026
6f65842
fix(ab-test): use dynamic site url for branch/preview deploys
pettinarip Feb 12, 2026
66f53c0
polish hero cta buttons to match figma design
pettinarip Feb 12, 2026
e20b163
enable matomo for all envs
pettinarip Feb 12, 2026
b183147
fix: prevent matomo double init in react strict mode
pettinarip Feb 12, 2026
a7f5e3e
feat: add scroll depth tracking for homepage ab test
pettinarip Feb 12, 2026
70e44a5
feat: add section view and click tracking for homepage ab test
pettinarip Feb 13, 2026
e3cf724
cleanup
pettinarip Feb 13, 2026
4ca0af4
edit button content
pettinarip Feb 13, 2026
b6db9a5
fix(seo): serve original variant to bots during A/B tests
pettinarip Feb 16, 2026
a31cb08
fix: graceful degradation for homepage data fetching with force-dynamic
pettinarip Feb 16, 2026
86571f4
Merge pull request #17294 from ethereum/home-redesign-ab-test
pettinarip Feb 18, 2026
9fb1b3a
fix: address pr review feedback for homepage components
pettinarip Feb 18, 2026
5ba8a3d
refactor: use section component with id in trustlogos
pettinarip Feb 18, 2026
d117fc7
fix: use external url for enterprise links to avoid cors prefetch errors
pettinarip Feb 18, 2026
846d0cc
Merge remote-tracking branch 'origin/dev' into home-redesign
pettinarip Feb 18, 2026
602a420
Merge branch 'dev' into home-redesign
pettinarip Feb 19, 2026
fc7b77d
fix(analytics): enable sendbeacon for reliable click tracking during …
pettinarip Feb 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,177 changes: 655 additions & 522 deletions app/[locale]/page.tsx

Large diffs are not rendered by default.

4 changes: 3 additions & 1 deletion app/[locale]/what-is-ethereum/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ import { getAppPageContributorInfo } from "@/lib/utils/contributors"
import { getMetadata } from "@/lib/utils/metadata"
import { screens } from "@/lib/utils/screen"

import { ENTERPRISE_ETHEREUM_URL } from "@/lib/constants"

import WhatIsEthereumPageJsonLD from "./page-jsonld"

import contributionBanner from "@/public/images/doge-computer.png"
Expand Down Expand Up @@ -788,7 +790,7 @@ const Page = async ({ params }: { params: PageParams }) => {
})}
</p>
</div>
<ButtonLink href="/enterprise/">
<ButtonLink href={ENTERPRISE_ETHEREUM_URL}>
{t("page-what-is-ethereum-start-business-cta")}
</ButtonLink>
</CardContent>
Expand Down
5 changes: 3 additions & 2 deletions app/api/ab-config/route.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { NextResponse } from "next/server"

import { IS_PREVIEW_DEPLOY, IS_PROD } from "@/lib/utils/env"
import { IS_PROD } from "@/lib/utils/env"

import type { ABTestConfig, MatomoExperiment } from "@/lib/ab-testing/types"

Expand Down Expand Up @@ -33,8 +33,9 @@ const getPreviewConfig = () => ({

export async function GET() {
// Preview mode: Show menu with original default
if (!IS_PROD || IS_PREVIEW_DEPLOY)
if (!IS_PROD) {
return NextResponse.json(getPreviewConfig())
}

try {
const matomoUrl = process.env.NEXT_PUBLIC_MATOMO_URL
Expand Down
Binary file added public/images/homepage/built-to-last.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
14 changes: 14 additions & 0 deletions public/images/homepage/eth.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/homepage/features/global.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/homepage/features/ownership.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/homepage/get-started/learn.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/homepage/logos/blackrock.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/homepage/logos/jpmorgan.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/homepage/logos/mastercard.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/homepage/logos/paypal.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/homepage/logos/robinhood.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/homepage/logos/visa.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/homepage/savings/borrowing.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/homepage/savings/defi.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/homepage/savings/remittances.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 12 additions & 3 deletions src/components/BigNumber/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -118,9 +118,18 @@ const BigNumber = async ({
</div>
</>
) : (
<span className="pt-4 text-md text-body-medium">
{t("loading-error-refresh")}
</span>
<>
<div
data-label="value"
className={valueVariants({ variant })}
aria-label={t("loading-error-refresh")}
>
</div>
<div className={childrenVariants({ variant })}>
<span>{children}</span>
</div>
</>
)}
</div>
)
Expand Down
4 changes: 3 additions & 1 deletion src/components/Footer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import Translation from "@/components/Translation"
import { cn } from "@/lib/utils/cn"
import { scrollIntoView } from "@/lib/utils/scrollIntoView"

import { ENTERPRISE_ETHEREUM_URL } from "@/lib/constants"

import { Button } from "./ui/buttons/Button"
import { BaseLink } from "./ui/Link"
import { List, ListItem } from "./ui/list"
Expand Down Expand Up @@ -185,7 +187,7 @@ const Footer = ({ lastDeployLocaleTimestamp }: FooterProps) => {
text: t("nav-docs-design-label"),
},
{
href: "https://institutions.ethereum.org/",
href: ENTERPRISE_ETHEREUM_URL,
text: t("enterprise-mainnet"),
},
{
Expand Down
187 changes: 187 additions & 0 deletions src/components/Hero/HomeHero2026/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
import { Fragment } from "react"
import { getImageProps, type StaticImageData } from "next/image"

import type { ClassNameProp } from "@/lib/types"

import LanguageMorpher from "@/components/Homepage/LanguageMorpher"
import PersonaModalCTA from "@/components/Homepage/PersonaModalCTA"
import EthGlyphIcon from "@/components/icons/eth-glyph.svg"
import EthTokenIcon from "@/components/icons/eth-token.svg"
import EthWalletIcon from "@/components/icons/eth-wallet.svg"
import TryAppsIcon from "@/components/icons/phone-homescreen.svg"
import SvgButtonLink, {
type SvgButtonLinkProps,
} from "@/components/ui/buttons/SvgButtonLink"

import { cn } from "@/lib/utils/cn"
import { breakpointAsNumber } from "@/lib/utils/screen"

import heroBase from "@/public/images/home/hero.png"
import hero2xl from "@/public/images/home/hero-2xl.png"

export type CTAVariant = "modal" | "direct-buttons"

type HomeHero2026Props = ClassNameProp & {
image?: StaticImageData
image2xl?: StaticImageData
alt?: string
ctaVariant?: CTAVariant
eventCategory?: string
}

const directButtonCTAs = [
{
label: "Learn Ethereum",
description: "What is Ethereum?",
href: "/what-is-ethereum/",
Svg: EthGlyphIcon,
className: "text-accent-a hover:text-accent-a-hover",
eventName: "learn_ethereum",
},
{
label: "Pick a wallet",
description: "Create accounts, manage assets",
href: "/wallets/find-wallet/",
Svg: EthWalletIcon,
className: "text-primary hover:text-primary-hover",
eventName: "pick_wallet",
},
{
label: "Get ETH",
description: "The currency of Ethereum",
href: "/get-eth/",
Svg: EthTokenIcon,
className: "text-accent-b hover:text-accent-b-hover",
eventName: "get_eth",
},
{
label: "Try apps",
description: "See what Ethereum can do",
href: "/dapps/",
Svg: TryAppsIcon,
className: "text-accent-c hover:text-accent-c-hover",
eventName: "try_apps",
},
]

const HomeHero2026 = ({
className,
image,
image2xl,
alt: altProp,
ctaVariant = "modal",
eventCategory = "Homepage",
}: HomeHero2026Props) => {
const baseImage = image ?? heroBase
const xlImage = image2xl ?? image ?? hero2xl
const alt = altProp ?? "Ethereum illustration"

const common = {
alt,
sizes: `(max-width: ${breakpointAsNumber["2xl"]}px) 100vw, ${breakpointAsNumber["2xl"]}px`,
priority: true,
}

const {
props: { srcSet: srcSet2xl },
} = getImageProps({ ...common, ...xlImage, quality: 20 })

const {
props: { srcSet: srcSetMd },
} = getImageProps({ ...common, ...baseImage, quality: 10 })

const {
props: { srcSet: srcSetBase, ...rest },
} = getImageProps({ ...common, ...baseImage, quality: 5 })

return (
<section className={cn("w-full", className)}>
<div className="h-[240px] overflow-hidden md:h-[380px] lg:h-[480px]">
<picture>
<source
media={`(min-width: ${breakpointAsNumber["2xl"]}px)`}
srcSet={srcSet2xl}
/>
<source
media={`(min-width: ${breakpointAsNumber["md"]}px) and (max-width: ${breakpointAsNumber["2xl"] - 1}px)`}
srcSet={srcSetMd}
/>
<source
media={`(max-width: ${breakpointAsNumber["md"] - 1}px)`}
srcSet={srcSetBase}
/>
<img {...rest} alt={alt} className="h-full w-full object-cover" />
</picture>
</div>

<div className="flex flex-col items-center px-4 py-12 text-center lg:py-16">
<div className="flex w-full flex-col items-center gap-4">
<LanguageMorpher />

<div className="flex flex-col items-center gap-8">
<h1 className="max-w-[893px] text-4xl font-black leading-[1.1] md:text-6xl lg:text-7xl lg:leading-[0.9]">
The internet that the world can rely on.
</h1>

<p className="max-w-[741px] text-lg leading-relaxed tracking-[0.07px] text-body-medium md:text-2xl md:leading-[1.625]">
Ethereum is the global network where you control your assets, your
data, and your identity.
</p>

{ctaVariant === "modal" ? (
<PersonaModalCTA eventCategory={eventCategory} />
) : (
<div className="-mb-8 grid w-full grid-cols-2 gap-x-4 gap-y-8 border-b py-20 md:grid-cols-4 md:gap-x-10 lg:-mb-12">
{directButtonCTAs.map(
({
label,
description,
href,
className: ctaClass,
Svg,
eventName,
}) => {
const Link = (
props: Omit<
SvgButtonLinkProps,
"Svg" | "href" | "label" | "children"
>
) => (
<SvgButtonLink
Svg={Svg}
href={href}
label={label}
customEventOptions={{
eventCategory,
eventAction: "cta_click",
eventName,
}}
{...props}
>
<p className="text-body">{description}</p>
</SvgButtonLink>
)
return (
<Fragment key={label}>
<Link
className={cn("xl:hidden", ctaClass)}
variant="col"
/>
<Link
className={cn("hidden xl:block", ctaClass)}
variant="row"
/>
</Fragment>
)
}
)}
</div>
)}
</div>
</div>
</div>
</section>
)
}

export default HomeHero2026
4 changes: 2 additions & 2 deletions src/components/Homepage/BentoCardSwiper.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ const BentoCardSwiper = ({
onSlideChange={({ activeIndex }) => {
trackCustomEvent({
eventCategory,
eventAction: "mobile use cases",
eventName: `swipe to card ${activeIndex + 1}`,
eventAction: "cta_swipe",
eventName: String(activeIndex + 1),
})
}}
>
Expand Down
Loading