Skip to content
This repository was archived by the owner on Mar 17, 2026. It is now read-only.

Commit bb54d9c

Browse files
committed
rename testimonials, add bottom cta
1 parent 21e242e commit bb54d9c

File tree

3 files changed

+77
-18
lines changed

3 files changed

+77
-18
lines changed

apps/web/app/(base-org)/developers/page.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ import Container from 'apps/web/src/components/base-org/Container';
44
import { Hero } from 'apps/web/src/components/Developers/Hero';
55
import { UseCases } from 'apps/web/src/components/Developers/UseCases';
66
import { Customers } from 'apps/web/src/components/Developers/Customers';
7-
import { Quotes } from 'apps/web/src/components/Developers/Quotes';
7+
import { Testimonials } from 'apps/web/src/components/Developers/Testimonials';
88
import { Tools } from 'apps/web/src/components/Developers/Tools';
99
import { WhyBase } from 'apps/web/src/components/Developers/WhyBase';
10+
import { BottomCta } from 'apps/web/src/components/Developers/BottomCta';
1011

1112
export const metadata: Metadata = {
1213
metadataBase: new URL('https://base.org'),
@@ -25,9 +26,10 @@ export default async function Developers() {
2526
<Hero />
2627
<UseCases />
2728
<Customers />
28-
<Quotes />
29+
<Testimonials />
2930
<Tools />
3031
<WhyBase />
32+
<BottomCta />
3133
</main>
3234
</Container>
3335
</AnalyticsProvider>
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
'use client';
2+
3+
import { ButtonVariants } from 'apps/web/src/components/base-org/Button/types';
4+
import { ButtonWithLinkAndEventLogging } from 'apps/web/src/components/Button/ButtonWithLinkAndEventLogging';
5+
import { useCallback, useState } from 'react';
6+
import { Icon } from 'apps/web/src/components/Icon/Icon';
7+
import Title from 'apps/web/src/components/base-org/typography/Title';
8+
import { TitleLevel } from 'apps/web/src/components/base-org/typography/Title/types';
9+
10+
export function BottomCta() {
11+
const [hasCopied, setHasCopied] = useState(false);
12+
13+
const handleCopy = useCallback(() => {
14+
void navigator.clipboard.writeText('npm create onchain');
15+
setHasCopied(true);
16+
setTimeout(() => setHasCopied(false), 2000); // Reset after 2 seconds
17+
}, []);
18+
19+
return (
20+
<section className="my-24 w-full bg-black">
21+
<div className="flex flex-col items-center rounded-2xl bg-dark-palette-backgroundAlternate py-16">
22+
<Title level={TitleLevel.Title1} as="h2">
23+
Together, we&apos;re updating the Internet with a new dev platform.
24+
</Title>
25+
<Title level={TitleLevel.Title4} as="p" className="mt-2">
26+
Start building with a starter template or see documentation.
27+
</Title>
28+
<div className="mt-8 flex flex-col justify-center gap-4 sm:flex-row">
29+
<button
30+
type="button"
31+
className="inline-flex items-center gap-2.5 rounded-xl bg-white px-4 py-2 font-bold text-dark-palette-primaryForeground transition-colors hover:bg-white/90"
32+
onClick={handleCopy}
33+
>
34+
npm create onchain
35+
{hasCopied ? (
36+
<div className="text-green-60">
37+
<Icon name="checkmark" width="24" height="24" color="currentColor" />
38+
</div>
39+
) : (
40+
<Icon name="copy" width="24" height="24" color="currentColor" />
41+
)}
42+
</button>
43+
<ButtonWithLinkAndEventLogging
44+
variant={ButtonVariants.SecondaryOutline}
45+
iconName="arrowRight"
46+
iconSize="24"
47+
buttonClassNames="flex w-40 items-center justify-between px-4 py-3"
48+
href=""
49+
eventName="bottom-cta"
50+
>
51+
Documentation
52+
</ButtonWithLinkAndEventLogging>
53+
</div>
54+
</div>
55+
</section>
56+
);
57+
}

apps/web/src/components/Developers/Quotes/index.tsx renamed to apps/web/src/components/Developers/Testimonials/index.tsx

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ import { TitleLevel } from 'apps/web/src/components/base-org/typography/Title/ty
1010

1111
type Tab = 'build' | 'scale' | 'monetize';
1212

13-
type Quote = {
13+
type Testimonial = {
1414
text: string;
1515
author: string;
1616
role: string;
1717
tab: Tab;
1818
};
1919

20-
const quotes: Quote[] = [
20+
const testimonials: Testimonial[] = [
2121
{
2222
text: "Base's developer platform helped us launch our NFT marketplace in days instead of months.",
2323
author: 'Sarah Chen',
@@ -38,10 +38,10 @@ const quotes: Quote[] = [
3838
},
3939
];
4040

41-
export function Quotes() {
41+
export function Testimonials() {
4242
const [activeTab, setActiveTab] = useState<Tab>('build');
4343

44-
const quoteAnimation = useMemo(
44+
const testimonialAnimation = useMemo(
4545
() => ({
4646
initial: { opacity: 0, y: 20 },
4747
animate: { opacity: 1, y: 0 },
@@ -74,22 +74,22 @@ export function Quotes() {
7474

7575
<div className="relative">
7676
<AnimatePresence mode="wait">
77-
{quotes
78-
.filter((quote) => quote.tab === activeTab)
79-
.map((quote) => (
77+
{testimonials
78+
.filter((testimonial) => testimonial.tab === activeTab)
79+
.map((testimonial) => (
8080
<motion.div
81-
key={quote.tab}
82-
initial={quoteAnimation.initial}
83-
animate={quoteAnimation.animate}
84-
exit={quoteAnimation.exit}
85-
transition={quoteAnimation.transition}
81+
key={testimonial.tab}
82+
initial={testimonialAnimation.initial}
83+
animate={testimonialAnimation.animate}
84+
exit={testimonialAnimation.exit}
85+
transition={testimonialAnimation.transition}
8686
className="space-y-8"
8787
>
8888
<blockquote className="space-y-4">
89-
<Title level={TitleLevel.Display3}>&ldquo;{quote.text}&rdquo;</Title>
89+
<Title level={TitleLevel.Display3}>&ldquo;{testimonial.text}&rdquo;</Title>
9090
<div className="text-dark-palette-foregroundMuted">
91-
<Title level={TitleLevel.Title4}>{quote.author}</Title>
92-
<Title level={TitleLevel.Title4}>{quote.role}</Title>
91+
<Title level={TitleLevel.Title4}>{testimonial.author}</Title>
92+
<Title level={TitleLevel.Title4}>{testimonial.role}</Title>
9393
</div>
9494
</blockquote>
9595
<ButtonWithLinkAndEventLogging
@@ -100,7 +100,7 @@ export function Quotes() {
100100
buttonClassNames="flex w-40 items-center justify-between px-4 py-3"
101101
href="/stories"
102102
target="_blank"
103-
eventName="developers_quotes"
103+
eventName="testimonials"
104104
>
105105
More stories
106106
</ButtonWithLinkAndEventLogging>

0 commit comments

Comments
 (0)