CTA Section
Image-backed dark CTA used site-wide. Dark-blue gradient background image with a soft darken overlay, accent ring + glow shadow, and a large CTA pill button.
Default Preview
Default site-wide variant — heading + subtitle + button, no eyebrow.
Let's start something big
Open to full-time, freelance, and contract work. Book a free 30min intro call to chat or send me an email.
With Eyebrow (Services Variant)
Same card with an optional uppercase eyebrow above the heading and the subtitle suppressed. This is the variant rendered at the bottom of the Services module.
Pick the offering that fits — we'll shape the engagement together.
View Full Version
Props
eyebrow
string (optional)Small uppercase label rendered above the heading. Omit (or pass an empty string) to hide it.
title
string (optional)Default: "Let's start something big"
subtitle
string (optional)Default: "Open to full-time, freelance, and contract work. Book a free 30min intro call to chat or send me an email." Pass an empty string (subtitle="") to hide it entirely.
buttonText
string (optional)Default: "Get in touch"
buttonHref
string (optional)Default: "/contact"
Visual Composition
Background
/images/services-cta-bg.jpg served at bg-cover bg-center with a 135deg darken gradient overlay (rgba(2,2,2,0.55) → 0.15 → 0.55).
Ring + glow
shadow-[0_0_0_1px_var(--accent-soft),0_20px_60px_rgba(11,95,212,0.25)] — 1px accent ring plus a soft blue page glow.
Button
Uses CTAButton — the large animated-glow pill — for visual consistency with hero/contact CTAs elsewhere on the site.
Usage
import { CTASection } from '@/components/sections/CTASection'
// Default site-wide usage (homepage, blog, work, faq, etc.)
<CTASection />
// With custom content
<CTASection
title="Ready to get started?"
subtitle="Let's build something amazing together."
buttonText="Contact me"
buttonHref="/contact"
/>
// Services-module variant: with eyebrow, no subtitle
<CTASection
eyebrow="Start a conversation"
title="Pick the offering that fits — we'll shape the engagement together."
subtitle=""
buttonText="Get in touch"
/>Embed Without Section Wrapper (CTACard)
When you need the card inline inside an existing layout (e.g. the Services module), import CTACard instead — it renders the visual chrome without the py-20 lg:py-32 section padding or the max-w-[1200px] container.
import { CTACard } from '@/components/sections/CTASection'
<div className="mt-12 lg:mt-16">
<CTACard
eyebrow="Start a conversation"
title="Pick the offering that fits — we'll shape the engagement together."
subtitle=""
buttonText="Get in touch"
/>
</div>Import
import { CTASection, CTACard } from '@/components/sections/CTASection'