feat(marketing): CTA pulse animation + breadcrumb repositioned below hero

Homepage:
- Wrap "Continue with Google" in a relative group; add rose-300 pulse
  ring (animate-cta-pulse) that fades out smoothly on hover
- @keyframes cta-pulse added to globals.css (2.6s, scale 1→1.22, opacity 0.45→0)

Blog listing (/blog):
- Remove breadcrumb from above the hero header
- Place it in a pt-5 strip directly above the 3-column content grid
  so it reads as "you are here" navigation rather than floating chrome

Blog post (/blog/[slug]):
- Remove breadcrumb from inside the hero gradient section
- Place it in the same pt-5 strip between hero and 3-col grid for
  consistent placement across listing + post pages

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Manohar Gupta 2026-05-29 10:23:28 +05:30
parent e5a59c5191
commit daf6b34281
4 changed files with 42 additions and 27 deletions

View file

@ -54,18 +54,7 @@ export default async function BlogPostPage({
<div className="min-h-screen bg-white"> <div className="min-h-screen bg-white">
{/* Post hero / header */} {/* Post hero / header */}
<div className="bg-gradient-to-br from-rose-50 to-pink-50 border-b border-rose-100"> <div className="bg-gradient-to-br from-rose-50 to-pink-50 border-b border-rose-100">
<div className="max-w-6xl mx-auto px-5 pt-5 pb-10"> <div className="max-w-6xl mx-auto px-5 pt-10 pb-10">
{/* Breadcrumb */}
<div className="mb-8">
<Breadcrumb
items={[
{ label: "Home", href: "/" },
{ label: "Blog", href: "/blog" },
{ label: post.title },
]}
/>
</div>
<div className="max-w-2xl"> <div className="max-w-2xl">
<div className="flex flex-wrap items-center gap-2 mb-5"> <div className="flex flex-wrap items-center gap-2 mb-5">
<span className={`text-xs font-semibold px-2.5 py-0.5 rounded-full ${post.categoryColor}`}> <span className={`text-xs font-semibold px-2.5 py-0.5 rounded-full ${post.categoryColor}`}>
@ -88,8 +77,19 @@ export default async function BlogPostPage({
</div> </div>
</div> </div>
{/* Breadcrumb — between hero and content */}
<div className="max-w-6xl mx-auto px-5 pt-5 pb-1">
<Breadcrumb
items={[
{ label: "Home", href: "/" },
{ label: "Blog", href: "/blog" },
{ label: post.title },
]}
/>
</div>
{/* 3-column body */} {/* 3-column body */}
<div className="max-w-6xl mx-auto px-5 py-10"> <div className="max-w-6xl mx-auto px-5 py-6">
<div className="grid grid-cols-1 lg:grid-cols-[220px_minmax(0,1fr)_200px] gap-10"> <div className="grid grid-cols-1 lg:grid-cols-[220px_minmax(0,1fr)_200px] gap-10">
{/* ── LEFT SIDEBAR: Table of Contents ── */} {/* ── LEFT SIDEBAR: Table of Contents ── */}

View file

@ -23,13 +23,8 @@ const CATEGORIES = Object.values(
export default function BlogPage() { export default function BlogPage() {
return ( return (
<div className="min-h-screen bg-white"> <div className="min-h-screen bg-white">
{/* Breadcrumb */}
<div className="max-w-6xl mx-auto px-5 pt-5">
<Breadcrumb items={[{ label: "Home", href: "/" }, { label: "Blog" }]} />
</div>
{/* Page header */} {/* Page header */}
<div className="bg-gradient-to-br from-rose-50 to-pink-50 border-b border-rose-100 mt-4"> <div className="bg-gradient-to-br from-rose-50 to-pink-50 border-b border-rose-100">
<div className="max-w-6xl mx-auto px-5 py-12 text-center"> <div className="max-w-6xl mx-auto px-5 py-12 text-center">
<div className="mb-2 text-sm font-medium text-rose-500 uppercase tracking-widest">Journal</div> <div className="mb-2 text-sm font-medium text-rose-500 uppercase tracking-widest">Journal</div>
<h1 className="text-4xl font-bold text-gray-900 mb-3 leading-tight">The Tia Blog</h1> <h1 className="text-4xl font-bold text-gray-900 mb-3 leading-tight">The Tia Blog</h1>
@ -39,8 +34,13 @@ export default function BlogPage() {
</div> </div>
</div> </div>
{/* Breadcrumb — sits right above the content grid */}
<div className="max-w-6xl mx-auto px-5 pt-5 pb-1">
<Breadcrumb items={[{ label: "Home", href: "/" }, { label: "Blog" }]} />
</div>
{/* 3-column layout */} {/* 3-column layout */}
<div className="max-w-6xl mx-auto px-5 py-10"> <div className="max-w-6xl mx-auto px-5 py-6">
<div className="grid grid-cols-1 lg:grid-cols-[220px_minmax(0,1fr)_200px] gap-10"> <div className="grid grid-cols-1 lg:grid-cols-[220px_minmax(0,1fr)_200px] gap-10">
{/* ── LEFT SIDEBAR: timeline ── */} {/* ── LEFT SIDEBAR: timeline ── */}

View file

@ -44,13 +44,17 @@ function Hero() {
one day look back on. one day look back on.
</p> </p>
{/* Pulse-ring wrapper — fades ring on hover */}
<div className="relative inline-flex group">
<span className="absolute inset-0 rounded-full bg-rose-300 animate-cta-pulse group-hover:opacity-0 transition-opacity duration-300 pointer-events-none" />
<Link <Link
href="/login" href="/login"
className="inline-flex items-center gap-2.5 bg-white hover:bg-rose-50 border border-gray-200 hover:border-rose-300 text-gray-700 font-semibold px-7 py-3.5 rounded-full text-base transition-all duration-200 shadow-md hover:shadow-lg active:scale-95" className="relative inline-flex items-center gap-2.5 bg-white hover:bg-rose-50 border border-gray-200 hover:border-rose-300 text-gray-700 font-semibold px-7 py-3.5 rounded-full text-base transition-all duration-200 shadow-md hover:shadow-lg active:scale-95"
> >
<GoogleG /> <GoogleG />
Continue with Google Continue with Google
</Link> </Link>
</div>
<p className="mt-4 text-xs text-gray-400">No credit card. No setup fee. Your data is yours.</p> <p className="mt-4 text-xs text-gray-400">No credit card. No setup fee. Your data is yours.</p>
</div> </div>

View file

@ -45,6 +45,17 @@
animation: marquee 20s linear infinite; animation: marquee 20s linear infinite;
} }
/* ── CTA button pulse ring ── */
@keyframes cta-pulse {
0% { transform: scale(1); opacity: 0.45; }
60% { transform: scale(1.18); opacity: 0.1; }
100% { transform: scale(1.22); opacity: 0; }
}
.animate-cta-pulse {
animation: cta-pulse 2.6s ease-out infinite;
}
/* hide scrollbar but keep scroll */ /* hide scrollbar but keep scroll */
.scrollbar-hide { .scrollbar-hide {
scrollbar-width: none; scrollbar-width: none;