Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
b33f805
feat: update default mailto styling, add mail icon
wackerow Jun 9, 2025
9621f47
feat: migrate old enterprise page, prep for new
wackerow Jun 9, 2025
7c959d2
feat: initialize new enterprise page; hero+layout
wackerow Jun 9, 2025
2a8e0ab
refactor: eth-diamond-rainbow as true svg path
wackerow Jun 9, 2025
32c3d77
theme: update tokens, add data label for selecting
wackerow Jun 9, 2025
d60dbaf
feat: expand enterprise page template
wackerow Jun 9, 2025
61b1ede
feat: implement features grid
wackerow Jun 9, 2025
fdb3dd2
fix: hero image resolution
wackerow Jun 10, 2025
2ac18f5
feat: add cases, desktop
wackerow Jun 10, 2025
afa789d
feat: add reasons; desktop/mobile + intl
wackerow Jun 10, 2025
2976f1a
feat: import enterprise logos
wackerow Jun 10, 2025
8c53513
feat: populate ecosystem players
wackerow Jun 10, 2025
6bdb5d3
fix: gradients, scroll position, spacing, og img
wackerow Jun 10, 2025
c8c00a3
feat: implement marquee animations
wackerow Jun 10, 2025
add59d4
feat: update partner assets
wackerow Jun 10, 2025
3730d82
patch: rename to /uses, avoid redirect conflicts
wackerow Jun 10, 2025
077624a
fix: load icons inside component
wackerow Jun 11, 2025
5f05bb5
polish: logos
wackerow Jun 11, 2025
d092220
feat: add mobile swiper for features
wackerow Jun 11, 2025
bac9141
feat: restyle slider; rm nav; use hanging card
wackerow Jun 11, 2025
cd687c7
feat: add Cases swiper/case/loaders
wackerow Jun 11, 2025
e2bb482
patch: cta hover, logo size, marquee nowrap
wackerow Jun 11, 2025
2b462a6
Merge branch 'dev' into enterprise
wackerow Jun 11, 2025
a492e51
refactor: ENTERPRISE_MAILTO, add default subject param
wackerow Jun 11, 2025
e546db5
refactor: BigNumber pass locale to next-intl/server
wackerow Jun 11, 2025
39bac99
refactor: use em sizing on all logo svgs
wackerow Jun 12, 2025
21d9531
fix: logo sizing bugs; refactor to em sizing
wackerow Jun 12, 2025
886c8be
feat: initialize ActivityStats with stablecoins mcap
wackerow Jun 12, 2025
00a363e
feat: add txCount metric
wackerow Jun 12, 2025
4b4161c
feat: useBreakpointValues for slidesPerView
wackerow Jun 12, 2025
dc01275
a11y: turn on `ssr: false` with loading components
wackerow Jun 12, 2025
c783194
fix: details from design review
wackerow Jun 12, 2025
86fe387
patch: Callout; rm mt from h3 if no emoji
wackerow Jun 12, 2025
638f34b
patch: marquee fade edges
wackerow Jun 12, 2025
462b3be
patch: add missing common breadcrumb string
wackerow Jun 12, 2025
60a05c3
intl: extract remaining string
wackerow Jun 12, 2025
02b8077
matomo: update enterprise mailto events
wackerow Jun 12, 2025
0e7aa6c
patch: copy adjustments
wackerow Jun 12, 2025
47d3ebc
feat: add total value securing metric
wackerow Jun 12, 2025
7d3447d
chore: grammar corrections
wackerow Jun 12, 2025
d61bd74
matomo: differentiate use-cases events
wackerow Jun 13, 2025
9ea0611
small cleanup
corwintines Jun 13, 2025
cb90030
a11y: fix sr/aria issues
wackerow Jun 16, 2025
003e609
copy: adjustments
wackerow Jun 16, 2025
104c49c
refactor: use getLocale from next/server
wackerow Jun 16, 2025
1f1352d
update: copy adjustments
wackerow Jun 18, 2025
5204be7
feat: add additional metrics, polish copy
wackerow Jun 18, 2025
aa582d5
fix: typo
wackerow Jun 18, 2025
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
27 changes: 27 additions & 0 deletions app/[locale]/enterprise/_components/CaseCard.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { Card } from "@/components/ui/card"

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

import type { Case } from "../types"

type CaseCardProps = {
caseStudy: Case
className?: string
}

const CaseCard = ({
caseStudy: { name, content },
className,
}: CaseCardProps) => (
<Card
className={cn(
"space-y-1 rounded-4xl border bg-background p-6 shadow-window-box",
className
)}
>
<h3 className="text-xl">{name}</h3>
<p className="text-body-medium">{content}</p>
</Card>
)

export default CaseCard
21 changes: 21 additions & 0 deletions app/[locale]/enterprise/_components/CasesColumn.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { cn } from "@/lib/utils/cn"

import type { Case } from "../types"

import CaseCard from "./CaseCard"

const CasesColumn = ({
cases,
className,
}: {
cases: Case[]
className?: string
}) => (
<div className={cn("flex w-full flex-col gap-4", className)}>
{cases.map((caseStudy, index) => (
<CaseCard key={index} caseStudy={caseStudy} />
))}
</div>
)

export default CasesColumn
34 changes: 34 additions & 0 deletions app/[locale]/enterprise/_components/CasesSwiper.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
"use client"

import { Swiper, SwiperSlide } from "@/components/ui/swiper"

import type { Case } from "../types"

import CaseCard from "./CaseCard"

import { useBreakpointValue } from "@/hooks/useBreakpointValue"

const CasesSwiper = ({ cases }: { cases: Case[] }) => {
const slidesPerView = useBreakpointValue({
base: 1.2,
sm: 2.2,
})

return (
<Swiper spaceBetween={8} slidesPerView={slidesPerView}>
{cases.map((caseStudy) => (
<SwiperSlide
key={caseStudy.name}
className="first:ms-4 [&:last-child_div]:w-[calc(100%-2rem)]"
>
<CaseCard
caseStudy={caseStudy}
className="h-full w-full !shadow-none"
/>
</SwiperSlide>
))}
</Swiper>
)
}

export default CasesSwiper
59 changes: 59 additions & 0 deletions app/[locale]/enterprise/_components/FeatureCard.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import dynamic from "next/dynamic"

import { Card } from "@/components/ui/card"
import { Skeleton } from "@/components/ui/skeleton"

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

import type { Feature } from "../types"

const FallbackIcon = () => <Skeleton className="size-16" />

const IconComponents = {
ExtraSecurity: dynamic(
() => import("@/components/icons/extra-security.svg"),
{ loading: () => <FallbackIcon /> }
),
FutureProofing: dynamic(
() => import("@/components/icons/future-proofing.svg"),
{ loading: () => <FallbackIcon /> }
),
BetterUX: dynamic(() => import("@/components/icons/better-ux.svg"), {
loading: () => <FallbackIcon />,
}),
CheaperTransactions: dynamic(
() => import("@/components/icons/cheaper-transactions.svg"),
{ loading: () => <FallbackIcon /> }
),
}

type IconComponent = keyof typeof IconComponents

const FeatureCard = ({
feature: { header, content, iconName },
className,
}: {
feature: Feature
className?: string
}) => {
const Icon = IconComponents[iconName as IconComponent]
return (
<Card
key={header}
className={cn(
"space-y-4 rounded-4xl border bg-background px-6 py-8 shadow-window-box",
className
)}
>
<Icon className="text-7xl text-primary" />
<h3 className="text-xl">{header}</h3>
{content.map((p, i) => (
<p key={i} className="mb-8 last:mb-0">
{p}
</p>
))}
</Card>
)
}

export default FeatureCard
31 changes: 31 additions & 0 deletions app/[locale]/enterprise/_components/FeaturesSwiper.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
"use client"

import { Swiper, SwiperSlide } from "@/components/ui/swiper"

import type { Feature } from "../types"

import FeatureCard from "./FeatureCard"

import { useBreakpointValue } from "@/hooks/useBreakpointValue"

const FeaturesSwiper = ({ features }: { features: Feature[] }) => {
const slidesPerView = useBreakpointValue({
base: 1.1,
sm: 1.5,
})

return (
<Swiper spaceBetween={8} slidesPerView={slidesPerView}>
{features.map((feature) => (
<SwiperSlide
key={feature.header}
className="first:ms-4 [&:last-child_div]:me-8"
>
<FeatureCard feature={feature} className="h-full !shadow-none" />
</SwiperSlide>
))}
</Swiper>
)
}

export default FeaturesSwiper
3 changes: 3 additions & 0 deletions app/[locale]/enterprise/constants.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// TODO: Confirm
export const ENTERPRISE_MAILTO =
"mailto:enterprise@ethereum.org?subject=Enterprise%20inquiry"
Loading