Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
5 changes: 5 additions & 0 deletions redirects.json
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,11 @@
"destination": "/",
"permanent": true
},
{
"source": "/lp/card",
"destination": "/shhhhh",
"permanent": true
},
{
"source": "/sh",
"destination": "/card",
Expand Down
2 changes: 1 addition & 1 deletion scripts/generate-valid-links.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ function main() {
// Static pages
lines.push('## Static Pages')
lines.push('')
for (const p of ['/', '/careers', '/exchange', '/privacy', '/terms', '/lp/card']) {
for (const p of ['/', '/careers', '/exchange', '/privacy', '/terms', '/shhhhh']) {
lines.push(`- \`${p}\``)
}
lines.push('')
Expand Down
2 changes: 1 addition & 1 deletion scripts/ping-indexnow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ async function getAllPaths(): Promise<string[]> {
const { SUPPORTED_LOCALES } = await import('../src/i18n/types')
const { listContentSlugs } = await import('../src/lib/content')

const paths: string[] = ['/', '/lp/card', '/careers', '/exchange', '/privacy', '/terms']
const paths: string[] = ['/', '/shhhhh', '/careers', '/exchange', '/privacy', '/terms']

for (const locale of SUPPORTED_LOCALES) {
for (const country of Object.keys(COUNTRIES_SEO)) {
Expand Down
2 changes: 1 addition & 1 deletion scripts/verify-content.ts
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ function discoverRoutes(): Set<string> {
const routes = new Set<string>()

// Static pages
for (const p of ['/', '/careers', '/exchange', '/privacy', '/terms', '/lp/card']) {
for (const p of ['/', '/careers', '/exchange', '/privacy', '/terms', '/shhhhh']) {
routes.add(p)
}

Expand Down
867 changes: 0 additions & 867 deletions src/app/lp/card/CardLandingPage.tsx

This file was deleted.

25 changes: 0 additions & 25 deletions src/app/lp/card/page.tsx

This file was deleted.

1 change: 0 additions & 1 deletion src/app/robots.ts
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,6 @@ export default function robots(): MetadataRoute.Robots {
'/privacy',
'/terms',
'/exchange',
'/lp/card',
// SEO routes (all locale-prefixed)
...SUPPORTED_LOCALES.map((l) => `/${l}/`),
],
Expand Down
29 changes: 9 additions & 20 deletions src/app/shhhhh/ShhhhhLandingPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import posthog from 'posthog-js'
import { useTranslations } from 'next-intl'
import { Button } from '@/components/0_Bruddle/Button'
import { Marquee } from '@/components/LandingPage'
import { ScarcityCounter } from '@/components/LandingPage/ScarcityCounter'
import { useAuth } from '@/context/authContext'
import { PixelatedCardFace } from '@/components/Card/share-asset/PixelatedCardFace'
import { inflateWaitlistPosition } from '@/components/Card/doorTally.utils'
Expand Down Expand Up @@ -58,7 +59,11 @@ function WaitlistJoined({
const statValues = ['150M+', '1', '1', '0'] as const
const statLabelKeys = ['statMerchants', 'statBalance', 'statCard', 'statMiddlemen'] as const

const faqKeys = ['q1', 'q2', 'q3', 'q4', 'q5', 'q6', 'q7', 'q8'] as const
// q4 ("WHAT'S THE $10?") is deliberately absent: the welcome-reward claim it
// made is not backed by a seeded perk, so it was removed rather than reworded.
// The remaining keys keep their names — renumbering four catalogs to close the
// gap risks mis-pairing a question with someone else's answer for no gain.
const faqKeys = ['q1', 'q2', 'q3', 'q5', 'q6', 'q7', 'q8'] as const

// The full skip set: keep the codes in sync with SKIP_BADGE_CODES
// (peanut-api-ts src/card/waitlist.ts, pinned in waitlist.test.ts). Icons come
Expand All @@ -81,24 +86,6 @@ const badges: Array<{ code: string; name: string }> = [
const ctaButtonClassName =
'!w-auto bg-white px-7 py-3 text-base font-extrabold hover:bg-white/90 md:px-9 md:py-8 md:text-xl'

function ScarcityCounter() {
const t = useTranslations('shhhhh.hero')
const [count, setCount] = useState(21)
useEffect(() => {
const timer = setTimeout(() => setCount(20), 2500)
return () => clearTimeout(timer)
}, [])
return (
<motion.span
className="mx-1 inline-block whitespace-nowrap bg-n-1 px-2 py-0.5 text-[0.92em] font-extraBlack uppercase tracking-wider text-primary-1"
animate={count === 20 ? { scale: [1, 1.18, 1] } : {}}
transition={{ duration: 0.5, ease: 'easeOut' }}
>
{t('onlyCount', { count })}
</motion.span>
)
}

function StickyShhhhhCTA({ onClick }: { onClick: () => void }) {
const t = useTranslations('shhhhh.hero')
const [visible, setVisible] = useState(false)
Expand Down Expand Up @@ -316,7 +303,9 @@ export default function ShhhhhLandingPage() {
{t('hero.tagline')}
</p>
<p className="font-roboto-flex mt-6 max-w-xl text-xl leading-relaxed md:text-2xl">
{t.rich('hero.body', { counter: () => <ScarcityCounter /> })}
{t.rich('hero.body', {
counter: () => <ScarcityCounter label={(count) => t('hero.onlyCount', { count })} />,
})}
</p>
{isJoined ? (
<div className="mt-8 flex justify-center md:justify-start">
Expand Down
2 changes: 1 addition & 1 deletion src/app/shhhhh/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import ShhhhhLandingPage from './ShhhhhLandingPage'
export const metadata = generateMeta({
title: 'Shhhhh. | The peanut card is out, quietly.',
description:
'A non-custodial card accepted at over 150 million Visa-accepting merchants. We are letting beta users in slowly — about 20 a week.',
'A non-custodial card accepted at over 150 million Visa-accepting merchants. We are letting beta users in slowly — about 50 a week.',
keywords: 'peanut card, non-custodial card, visa-accepting merchants, closed beta, stablecoins',
canonical: '/shhhhh',
})
Expand Down
6 changes: 3 additions & 3 deletions src/app/sitemap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,12 @@ async function generateSitemap(): Promise<MetadataRoute.Sitemap> {
// Homepage
{ path: '', priority: 1.0, changeFrequency: 'weekly' },

// Product pages
{ path: '/lp/card', priority: 0.9, changeFrequency: 'weekly' },

// Public pages
{ path: '/careers', priority: 0.7, changeFrequency: 'monthly' },
{ path: '/exchange', priority: 0.7, changeFrequency: 'weekly' },
// The only card landing URL left — /lp/card is a 308 to it, so the
// target has to be listed.
{ path: '/shhhhh', priority: 0.7, changeFrequency: 'weekly' },

// Legal — the bare /privacy and /terms are redirects; list the real URLs.
{ path: '/en/privacy', priority: 0.5, changeFrequency: 'yearly' },
Expand Down
2 changes: 1 addition & 1 deletion src/assets/icons/pix-logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading