Skip to content

Commit 968ba1e

Browse files
authored
Merge pull request #15690 from ethereum/staging
Back merge `staging` into `dev`
2 parents 4820bc1 + 0161f98 commit 968ba1e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+1523
-107
lines changed

app/[locale]/10years/page.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -236,10 +236,7 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => {
236236
<p className="text-md">
237237
{t("page-10-year-host-event-description")}
238238
</p>
239-
<ButtonLink
240-
href="https://blog.ethereum.org/2025/04/24/ten-years"
241-
hideArrow
242-
>
239+
<ButtonLink href="https://10yearsofethereum.paperform.co" hideArrow>
243240
{t("page-10-year-host-event-cta")}
244241
</ButtonLink>
245242
</div>

app/[locale]/developers/page.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ const DevelopersPage = async ({
135135
eventAction: "click",
136136
eventName: "speedrun",
137137
}}
138+
rel="noopener"
138139
>
139140
{t("page-developers-speedrunethereum-link")}
140141
</ButtonLink>
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { Card } from "@/components/ui/card"
2+
3+
import { cn } from "@/lib/utils/cn"
4+
5+
import type { Case } from "../types"
6+
7+
type CaseCardProps = {
8+
caseStudy: Case
9+
className?: string
10+
}
11+
12+
const CaseCard = ({
13+
caseStudy: { name, content },
14+
className,
15+
}: CaseCardProps) => (
16+
<Card
17+
className={cn(
18+
"space-y-1 rounded-4xl border bg-background p-6 shadow-window-box",
19+
className
20+
)}
21+
>
22+
<h3 className="text-xl">{name}</h3>
23+
<p className="text-body-medium">{content}</p>
24+
</Card>
25+
)
26+
27+
export default CaseCard
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { cn } from "@/lib/utils/cn"
2+
3+
import type { Case } from "../types"
4+
5+
import CaseCard from "./CaseCard"
6+
7+
const CasesColumn = ({
8+
cases,
9+
className,
10+
}: {
11+
cases: Case[]
12+
className?: string
13+
}) => (
14+
<div className={cn("flex w-full flex-col gap-4", className)}>
15+
{cases.map((caseStudy, index) => (
16+
<CaseCard key={index} caseStudy={caseStudy} />
17+
))}
18+
</div>
19+
)
20+
21+
export default CasesColumn
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
"use client"
2+
3+
import { Swiper, SwiperSlide } from "@/components/ui/swiper"
4+
5+
import type { Case } from "../types"
6+
7+
import CaseCard from "./CaseCard"
8+
9+
import { useBreakpointValue } from "@/hooks/useBreakpointValue"
10+
11+
const CasesSwiper = ({ cases }: { cases: Case[] }) => {
12+
const slidesPerView = useBreakpointValue({
13+
base: 1.2,
14+
sm: 2.2,
15+
})
16+
17+
return (
18+
<Swiper spaceBetween={8} slidesPerView={slidesPerView}>
19+
{cases.map((caseStudy) => (
20+
<SwiperSlide
21+
key={caseStudy.name}
22+
className="first:ms-4 [&:last-child_div]:w-[calc(100%-2rem)]"
23+
>
24+
<CaseCard
25+
caseStudy={caseStudy}
26+
className="h-full w-full !shadow-none"
27+
/>
28+
</SwiperSlide>
29+
))}
30+
</Swiper>
31+
)
32+
}
33+
34+
export default CasesSwiper
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import dynamic from "next/dynamic"
2+
3+
import { Card } from "@/components/ui/card"
4+
import { Skeleton } from "@/components/ui/skeleton"
5+
6+
import { cn } from "@/lib/utils/cn"
7+
8+
import type { Feature } from "../types"
9+
10+
const FallbackIcon = () => <Skeleton className="size-16" />
11+
12+
const IconComponents = {
13+
ExtraSecurity: dynamic(
14+
() => import("@/components/icons/extra-security.svg"),
15+
{ loading: () => <FallbackIcon /> }
16+
),
17+
FutureProofing: dynamic(
18+
() => import("@/components/icons/future-proofing.svg"),
19+
{ loading: () => <FallbackIcon /> }
20+
),
21+
BetterUX: dynamic(() => import("@/components/icons/better-ux.svg"), {
22+
loading: () => <FallbackIcon />,
23+
}),
24+
CheaperTransactions: dynamic(
25+
() => import("@/components/icons/cheaper-transactions.svg"),
26+
{ loading: () => <FallbackIcon /> }
27+
),
28+
}
29+
30+
type IconComponent = keyof typeof IconComponents
31+
32+
const FeatureCard = ({
33+
feature: { header, content, iconName },
34+
className,
35+
}: {
36+
feature: Feature
37+
className?: string
38+
}) => {
39+
const Icon = IconComponents[iconName as IconComponent]
40+
return (
41+
<Card
42+
key={header}
43+
className={cn(
44+
"space-y-4 rounded-4xl border bg-background px-6 py-8 shadow-window-box",
45+
className
46+
)}
47+
>
48+
<Icon className="text-7xl text-primary" />
49+
<h3 className="text-xl">{header}</h3>
50+
{content.map((p, i) => (
51+
<p key={i} className="mb-8 last:mb-0">
52+
{p}
53+
</p>
54+
))}
55+
</Card>
56+
)
57+
}
58+
59+
export default FeatureCard
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
"use client"
2+
3+
import { Swiper, SwiperSlide } from "@/components/ui/swiper"
4+
5+
import type { Feature } from "../types"
6+
7+
import FeatureCard from "./FeatureCard"
8+
9+
import { useBreakpointValue } from "@/hooks/useBreakpointValue"
10+
11+
const FeaturesSwiper = ({ features }: { features: Feature[] }) => {
12+
const slidesPerView = useBreakpointValue({
13+
base: 1.1,
14+
sm: 1.5,
15+
})
16+
17+
return (
18+
<Swiper spaceBetween={8} slidesPerView={slidesPerView}>
19+
{features.map((feature) => (
20+
<SwiperSlide
21+
key={feature.header}
22+
className="first:ms-4 [&:last-child_div]:me-8"
23+
>
24+
<FeatureCard feature={feature} className="h-full !shadow-none" />
25+
</SwiperSlide>
26+
))}
27+
</Swiper>
28+
)
29+
}
30+
31+
export default FeaturesSwiper

app/[locale]/enterprise/constants.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
// TODO: Confirm
2+
export const ENTERPRISE_MAILTO =
3+
"mailto:[email protected]?subject=Enterprise%20inquiry"

0 commit comments

Comments
 (0)