Sections
Hero Sections
Hero sections are the first thing your visitors see. TypeScript UI ships six polished, fully responsive hero variants covering the most common landing page patterns, from a simple centered layout to a dark gradient hero and a waitlist capture form.
Component Variants
Hero Centered
TypeScript UI
Build beautiful interfaces, faster
TypeScript UI is a collection of production-ready React components, fully typed and styled with Tailwind CSS, so you can ship polished products without reinventing the basics.
Hero Split (Image Right)
New release
Design systems that scale with your team
Every component in TypeScript UI is accessible, responsive, and built with real-world product teams in mind. Copy, paste, and customize to match your brand.
Hero Split (Image Left)
From idea to production in an afternoon
Stop rebuilding the same buttons, forms, and layouts. TypeScript UI gives your team a shared library of components that just work.
Hero With Screenshot
TypeScript UI
Everything you need to build your next product
A complete component library with headers, heroes, pricing tables, and more, all documented and ready to drop into your Next.js app.
Hero Gradient
Launch week
A component library that feels premium
Dark, gradient-driven hero sections for products that want to make a bold first impression, built with pure CSS and safe for reduced-motion users.
Hero With Stats
Trusted by teams everywhere
The component library developers actually enjoy using
Thousands of teams rely on TypeScript UI to ship faster without sacrificing quality, accessibility, or design consistency.
- Active developers
- 12k+
- Components shipped
- 200+
- Uptime on docs site
- 99.9%
Hero With Form (Waitlist)
Coming soon
TypeScript UI Pro is launching soon
Get early access to advanced components, Figma files, and priority support before we open registration to everyone else.
Usage
import {
HeroCentered,
HeroSplit,
HeroWithScreenshot,
HeroGradient,
HeroWithStats,
HeroWithForm,
} from '@/components/ui/heroes';
// Hero Centered
<HeroCentered
eyebrow="TypeScript UI"
announcement={{ text: 'Introducing v2.0', href: '/changelog' }}
title="Build beautiful interfaces, faster"
description="A collection of production-ready React components, fully typed and styled with Tailwind CSS."
primaryButton={{ text: 'Get started', href: '/docs' }}
secondaryButton={{ text: 'View components', href: '/components' }}
logos={<YourLogos />}
/>
// Hero Split
<HeroSplit
title="Design systems that scale with your team"
description="Every component is accessible, responsive, and built for real product teams."
primaryButton={{ text: 'Browse components', href: '/components' }}
secondaryButton={{ text: 'Read the docs', href: '/docs' }}
imageSrc="/hero-image.jpg"
imageAlt="Description"
imagePosition="right" // or 'left'
/>
// Hero With Screenshot
<HeroWithScreenshot
title="Everything you need to build your next product"
description="A complete component library, documented and ready to drop into your Next.js app."
primaryButton={{ text: 'Get started', href: '/docs' }}
imageSrc="/screenshot.png"
imageAlt="Product dashboard screenshot"
/>
// Hero Gradient
<HeroGradient
title="A component library that feels premium"
description="Dark, gradient-driven hero sections for a bold first impression."
primaryButton={{ text: 'Get started', href: '/docs' }}
secondaryButton={{ text: 'Watch the demo', href: '/demo' }}
/>
// Hero With Stats
<HeroWithStats
title="The component library developers actually enjoy using"
description="Thousands of teams rely on TypeScript UI to ship faster."
primaryButton={{ text: 'Get started', href: '/docs' }}
stats={[
{ value: '12k+', label: 'Active developers' },
{ value: '200+', label: 'Components shipped' },
{ value: '99.9%', label: 'Uptime on docs site' },
]}
/>
// Hero With Form
<HeroWithForm
title="TypeScript UI Pro is launching soon"
description="Get early access before we open registration to everyone else."
primaryButton={{ text: 'Learn more', href: '/pro' }}
buttonText="Join the waitlist"
onSubmit={(email) => console.log(email)}
/>
Props Reference
HeroCentered
| Prop | Type | Default | Description |
|---|---|---|---|
title | string | Required | Main heading text |
description | string | Required | Supporting text |
primaryButton | { text: string; href: string } | Required | Primary action button |
secondaryButton | { text: string; href: string } | - | Optional secondary button |
eyebrow | string | - | Small label displayed above the title |
announcement | { text: string; href: string } | - | Pill link displayed above the title |
logos | ReactNode | - | Optional logo row rendered beneath the buttons |
HeroSplit
| Prop | Type | Default | Description |
|---|---|---|---|
title | string | Required | Main heading text |
description | string | Required | Supporting text |
primaryButton | { text: string; href: string } | Required | Primary action button |
secondaryButton | { text: string; href: string } | - | Optional secondary button |
eyebrow | string | - | Small label displayed above the title |
announcement | { text: string; href: string } | - | Pill link displayed above the title |
imageSrc | string | Required | Image URL |
imageAlt | string | Required | Image alt text |
imagePosition | 'left' | 'right' | 'right' | Image placement |
HeroWithScreenshot
| Prop | Type | Default | Description |
|---|---|---|---|
title | string | Required | Main heading text |
description | string | Required | Supporting text |
primaryButton | { text: string; href: string } | Required | Primary action button |
secondaryButton | { text: string; href: string } | - | Optional secondary button |
eyebrow | string | - | Small label displayed above the title |
announcement | { text: string; href: string } | - | Pill link displayed above the title |
imageSrc | string | Required | Screenshot image URL |
imageAlt | string | Required | Image alt text |
HeroGradient
| Prop | Type | Default | Description |
|---|---|---|---|
title | string | Required | Main heading text |
description | string | Required | Supporting text |
primaryButton | { text: string; href: string } | Required | Primary action button |
secondaryButton | { text: string; href: string } | - | Optional secondary button |
eyebrow | string | - | Small label displayed above the title |
announcement | { text: string; href: string } | - | Pill link displayed above the title |
HeroWithStats
| Prop | Type | Default | Description |
|---|---|---|---|
title | string | Required | Main heading text |
description | string | Required | Supporting text |
primaryButton | { text: string; href: string } | Required | Primary action button |
secondaryButton | { text: string; href: string } | - | Optional secondary button |
eyebrow | string | - | Small label displayed above the title |
announcement | { text: string; href: string } | - | Pill link displayed above the title |
stats | { value: string; label: string }[] | Required | Stat items rendered beside the copy |
HeroWithForm
| Prop | Type | Default | Description |
|---|---|---|---|
title | string | Required | Main heading text |
description | string | Required | Supporting text |
primaryButton | { text: string; href: string } | Required | Primary action button |
secondaryButton | { text: string; href: string } | - | Optional secondary button |
eyebrow | string | - | Small label displayed above the title |
announcement | { text: string; href: string } | - | Pill link displayed above the title |
placeholder | string | 'Enter your email' | Email input placeholder |
buttonText | string | 'Join the waitlist' | Submit button text |
onSubmit | (email: string) => void | - | Form submit handler |