2026-05-21 23:25:26 +02:00
|
|
|
'use client';
|
|
|
|
|
|
|
|
|
|
import { Menu, X } from 'lucide-react';
|
|
|
|
|
import Link from 'next/link';
|
feat(landing): honest high-end redesign — kill fake social proof, brand gradient identity, final CTA, mobile fixes
- removed fabricated fork counts/'verified' badges, 'our customers ship
today' copy, pseudo client logo marks and stale v0.1 badge (zero-user
product must not fake traction)
- new proof-by-specificity band: verifiable links to /docs/oauth, /status,
/security instead of testimonial cosplay
- identity: indigo-to-cyan brand gradient, indigo-tinted elevated surfaces,
mono section kickers, terminal-chrome hero rotator, gradient h-11 CTA
- how-it-works as connected pipeline; new final CTA band (page no longer
ends on FAQ); footer upgraded to 4-column product/resources/legal
- lib/pricing.ts single tier source for pricing page + landing teaser;
annual-billing FAQ claim softened to truth (no annual checkout exists)
- hero video preload=metadata + IntersectionObserver play (2.6MB off the
critical path); 44px touch targets; mobile menu: Guides link, CTA,
scroll-lock, escape/outside-tap close
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SXUwmPVRTD8AKQtio6gCN5
2026-07-08 23:00:25 +02:00
|
|
|
import { useEffect, useRef, useState } from 'react';
|
2026-05-21 23:25:26 +02:00
|
|
|
|
|
|
|
|
const LINKS = [
|
|
|
|
|
{ href: '/#how', label: 'How it works' },
|
|
|
|
|
{ href: '/templates', label: 'Templates' },
|
|
|
|
|
{ href: '/pricing', label: 'Pricing' },
|
|
|
|
|
{ href: '/docs', label: 'Docs' },
|
feat(landing): honest high-end redesign — kill fake social proof, brand gradient identity, final CTA, mobile fixes
- removed fabricated fork counts/'verified' badges, 'our customers ship
today' copy, pseudo client logo marks and stale v0.1 badge (zero-user
product must not fake traction)
- new proof-by-specificity band: verifiable links to /docs/oauth, /status,
/security instead of testimonial cosplay
- identity: indigo-to-cyan brand gradient, indigo-tinted elevated surfaces,
mono section kickers, terminal-chrome hero rotator, gradient h-11 CTA
- how-it-works as connected pipeline; new final CTA band (page no longer
ends on FAQ); footer upgraded to 4-column product/resources/legal
- lib/pricing.ts single tier source for pricing page + landing teaser;
annual-billing FAQ claim softened to truth (no annual checkout exists)
- hero video preload=metadata + IntersectionObserver play (2.6MB off the
critical path); 44px touch targets; mobile menu: Guides link, CTA,
scroll-lock, escape/outside-tap close
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SXUwmPVRTD8AKQtio6gCN5
2026-07-08 23:00:25 +02:00
|
|
|
{ href: '/guides', label: 'Guides' },
|
2026-05-21 23:25:26 +02:00
|
|
|
{ href: '/changelog', label: 'Changelog' },
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
/** Hamburger menu shown below the md breakpoint, where the inline nav is hidden. */
|
|
|
|
|
export function MarketingMobileMenu() {
|
|
|
|
|
const [open, setOpen] = useState(false);
|
feat(landing): honest high-end redesign — kill fake social proof, brand gradient identity, final CTA, mobile fixes
- removed fabricated fork counts/'verified' badges, 'our customers ship
today' copy, pseudo client logo marks and stale v0.1 badge (zero-user
product must not fake traction)
- new proof-by-specificity band: verifiable links to /docs/oauth, /status,
/security instead of testimonial cosplay
- identity: indigo-to-cyan brand gradient, indigo-tinted elevated surfaces,
mono section kickers, terminal-chrome hero rotator, gradient h-11 CTA
- how-it-works as connected pipeline; new final CTA band (page no longer
ends on FAQ); footer upgraded to 4-column product/resources/legal
- lib/pricing.ts single tier source for pricing page + landing teaser;
annual-billing FAQ claim softened to truth (no annual checkout exists)
- hero video preload=metadata + IntersectionObserver play (2.6MB off the
critical path); 44px touch targets; mobile menu: Guides link, CTA,
scroll-lock, escape/outside-tap close
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SXUwmPVRTD8AKQtio6gCN5
2026-07-08 23:00:25 +02:00
|
|
|
const rootRef = useRef<HTMLDivElement>(null);
|
|
|
|
|
|
|
|
|
|
// While the panel is open: lock body scroll, close on Escape and on any
|
|
|
|
|
// pointerdown outside the menu subtree. All three effects unwind together
|
|
|
|
|
// when the panel closes or the component unmounts.
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (!open) return;
|
|
|
|
|
const prevOverflow = document.body.style.overflow;
|
|
|
|
|
document.body.style.overflow = 'hidden';
|
|
|
|
|
const onKey = (e: KeyboardEvent) => {
|
|
|
|
|
if (e.key === 'Escape') setOpen(false);
|
|
|
|
|
};
|
|
|
|
|
const onPointerDown = (e: PointerEvent) => {
|
|
|
|
|
if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(false);
|
|
|
|
|
};
|
|
|
|
|
document.addEventListener('keydown', onKey);
|
|
|
|
|
document.addEventListener('pointerdown', onPointerDown);
|
|
|
|
|
return () => {
|
|
|
|
|
document.body.style.overflow = prevOverflow;
|
|
|
|
|
document.removeEventListener('keydown', onKey);
|
|
|
|
|
document.removeEventListener('pointerdown', onPointerDown);
|
|
|
|
|
};
|
|
|
|
|
}, [open]);
|
|
|
|
|
|
2026-05-21 23:25:26 +02:00
|
|
|
return (
|
feat(landing): honest high-end redesign — kill fake social proof, brand gradient identity, final CTA, mobile fixes
- removed fabricated fork counts/'verified' badges, 'our customers ship
today' copy, pseudo client logo marks and stale v0.1 badge (zero-user
product must not fake traction)
- new proof-by-specificity band: verifiable links to /docs/oauth, /status,
/security instead of testimonial cosplay
- identity: indigo-to-cyan brand gradient, indigo-tinted elevated surfaces,
mono section kickers, terminal-chrome hero rotator, gradient h-11 CTA
- how-it-works as connected pipeline; new final CTA band (page no longer
ends on FAQ); footer upgraded to 4-column product/resources/legal
- lib/pricing.ts single tier source for pricing page + landing teaser;
annual-billing FAQ claim softened to truth (no annual checkout exists)
- hero video preload=metadata + IntersectionObserver play (2.6MB off the
critical path); 44px touch targets; mobile menu: Guides link, CTA,
scroll-lock, escape/outside-tap close
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SXUwmPVRTD8AKQtio6gCN5
2026-07-08 23:00:25 +02:00
|
|
|
<div ref={rootRef} className="md:hidden">
|
2026-05-21 23:25:26 +02:00
|
|
|
<button
|
|
|
|
|
type="button"
|
|
|
|
|
aria-label={open ? 'Close menu' : 'Open menu'}
|
|
|
|
|
aria-expanded={open}
|
|
|
|
|
onClick={() => setOpen((v) => !v)}
|
feat(landing): honest high-end redesign — kill fake social proof, brand gradient identity, final CTA, mobile fixes
- removed fabricated fork counts/'verified' badges, 'our customers ship
today' copy, pseudo client logo marks and stale v0.1 badge (zero-user
product must not fake traction)
- new proof-by-specificity band: verifiable links to /docs/oauth, /status,
/security instead of testimonial cosplay
- identity: indigo-to-cyan brand gradient, indigo-tinted elevated surfaces,
mono section kickers, terminal-chrome hero rotator, gradient h-11 CTA
- how-it-works as connected pipeline; new final CTA band (page no longer
ends on FAQ); footer upgraded to 4-column product/resources/legal
- lib/pricing.ts single tier source for pricing page + landing teaser;
annual-billing FAQ claim softened to truth (no annual checkout exists)
- hero video preload=metadata + IntersectionObserver play (2.6MB off the
critical path); 44px touch targets; mobile menu: Guides link, CTA,
scroll-lock, escape/outside-tap close
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SXUwmPVRTD8AKQtio6gCN5
2026-07-08 23:00:25 +02:00
|
|
|
className="flex size-11 items-center justify-center rounded-md text-[--color-fg-muted] transition-colors hover:text-[--color-fg]"
|
2026-05-21 23:25:26 +02:00
|
|
|
>
|
|
|
|
|
{open ? <X size={18} /> : <Menu size={18} />}
|
|
|
|
|
</button>
|
|
|
|
|
{open && (
|
2026-05-23 18:43:57 +02:00
|
|
|
<div
|
|
|
|
|
// Background via inline style: Tailwind v4's bracket-arbitrary syntax
|
|
|
|
|
// `bg-[--color-X]` emits invalid CSS (it forgets the var() wrapper),
|
|
|
|
|
// so the class compiles to `background-color: --color-bg` which the
|
|
|
|
|
// browser falls back to transparent. Inline `var()` is unambiguous.
|
|
|
|
|
className="absolute inset-x-0 top-12 z-40 border-b border-[--color-border] shadow-lg shadow-black/40 backdrop-blur-md"
|
|
|
|
|
style={{
|
feat(landing): honest high-end redesign — kill fake social proof, brand gradient identity, final CTA, mobile fixes
- removed fabricated fork counts/'verified' badges, 'our customers ship
today' copy, pseudo client logo marks and stale v0.1 badge (zero-user
product must not fake traction)
- new proof-by-specificity band: verifiable links to /docs/oauth, /status,
/security instead of testimonial cosplay
- identity: indigo-to-cyan brand gradient, indigo-tinted elevated surfaces,
mono section kickers, terminal-chrome hero rotator, gradient h-11 CTA
- how-it-works as connected pipeline; new final CTA band (page no longer
ends on FAQ); footer upgraded to 4-column product/resources/legal
- lib/pricing.ts single tier source for pricing page + landing teaser;
annual-billing FAQ claim softened to truth (no annual checkout exists)
- hero video preload=metadata + IntersectionObserver play (2.6MB off the
critical path); 44px touch targets; mobile menu: Guides link, CTA,
scroll-lock, escape/outside-tap close
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SXUwmPVRTD8AKQtio6gCN5
2026-07-08 23:00:25 +02:00
|
|
|
backgroundColor: 'color-mix(in oklab, var(--color-bg) 92%, transparent)',
|
2026-05-23 18:43:57 +02:00
|
|
|
}}
|
|
|
|
|
>
|
feat(landing): honest high-end redesign — kill fake social proof, brand gradient identity, final CTA, mobile fixes
- removed fabricated fork counts/'verified' badges, 'our customers ship
today' copy, pseudo client logo marks and stale v0.1 badge (zero-user
product must not fake traction)
- new proof-by-specificity band: verifiable links to /docs/oauth, /status,
/security instead of testimonial cosplay
- identity: indigo-to-cyan brand gradient, indigo-tinted elevated surfaces,
mono section kickers, terminal-chrome hero rotator, gradient h-11 CTA
- how-it-works as connected pipeline; new final CTA band (page no longer
ends on FAQ); footer upgraded to 4-column product/resources/legal
- lib/pricing.ts single tier source for pricing page + landing teaser;
annual-billing FAQ claim softened to truth (no annual checkout exists)
- hero video preload=metadata + IntersectionObserver play (2.6MB off the
critical path); 44px touch targets; mobile menu: Guides link, CTA,
scroll-lock, escape/outside-tap close
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SXUwmPVRTD8AKQtio6gCN5
2026-07-08 23:00:25 +02:00
|
|
|
<nav className="mx-auto flex max-w-6xl flex-col px-6 pb-5">
|
2026-05-21 23:25:26 +02:00
|
|
|
{LINKS.map((l) => (
|
|
|
|
|
<Link
|
|
|
|
|
key={l.href}
|
|
|
|
|
href={l.href}
|
|
|
|
|
onClick={() => setOpen(false)}
|
feat(landing): honest high-end redesign — kill fake social proof, brand gradient identity, final CTA, mobile fixes
- removed fabricated fork counts/'verified' badges, 'our customers ship
today' copy, pseudo client logo marks and stale v0.1 badge (zero-user
product must not fake traction)
- new proof-by-specificity band: verifiable links to /docs/oauth, /status,
/security instead of testimonial cosplay
- identity: indigo-to-cyan brand gradient, indigo-tinted elevated surfaces,
mono section kickers, terminal-chrome hero rotator, gradient h-11 CTA
- how-it-works as connected pipeline; new final CTA band (page no longer
ends on FAQ); footer upgraded to 4-column product/resources/legal
- lib/pricing.ts single tier source for pricing page + landing teaser;
annual-billing FAQ claim softened to truth (no annual checkout exists)
- hero video preload=metadata + IntersectionObserver play (2.6MB off the
critical path); 44px touch targets; mobile menu: Guides link, CTA,
scroll-lock, escape/outside-tap close
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SXUwmPVRTD8AKQtio6gCN5
2026-07-08 23:00:25 +02:00
|
|
|
className="flex min-h-11 items-center border-b border-[--color-border] text-[14px] text-[--color-fg-muted] transition-colors hover:text-[--color-fg]"
|
2026-05-21 23:25:26 +02:00
|
|
|
>
|
|
|
|
|
{l.label}
|
|
|
|
|
</Link>
|
|
|
|
|
))}
|
feat(landing): honest high-end redesign — kill fake social proof, brand gradient identity, final CTA, mobile fixes
- removed fabricated fork counts/'verified' badges, 'our customers ship
today' copy, pseudo client logo marks and stale v0.1 badge (zero-user
product must not fake traction)
- new proof-by-specificity band: verifiable links to /docs/oauth, /status,
/security instead of testimonial cosplay
- identity: indigo-to-cyan brand gradient, indigo-tinted elevated surfaces,
mono section kickers, terminal-chrome hero rotator, gradient h-11 CTA
- how-it-works as connected pipeline; new final CTA band (page no longer
ends on FAQ); footer upgraded to 4-column product/resources/legal
- lib/pricing.ts single tier source for pricing page + landing teaser;
annual-billing FAQ claim softened to truth (no annual checkout exists)
- hero video preload=metadata + IntersectionObserver play (2.6MB off the
critical path); 44px touch targets; mobile menu: Guides link, CTA,
scroll-lock, escape/outside-tap close
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SXUwmPVRTD8AKQtio6gCN5
2026-07-08 23:00:25 +02:00
|
|
|
<Link
|
|
|
|
|
href="/login"
|
|
|
|
|
onClick={() => setOpen(false)}
|
|
|
|
|
className="btn-brand mt-4 inline-flex h-11 w-full items-center justify-center rounded-md text-[14px] font-medium"
|
|
|
|
|
>
|
|
|
|
|
Start building free →
|
|
|
|
|
</Link>
|
2026-05-21 23:25:26 +02:00
|
|
|
</nav>
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|