Sections
Contact Sections
Contact sections give visitors a fast way to reach your team. Each variant is built with react-hook-form and zod validation and never makes a network request on its own.
Component Variants
Contact Simple
Get in touch
Have a question or feedback? Fill out the form below and we'll get back to you shortly.
Contact Split (Details + Map)
Let's talk
We'd love to hear from you. Reach out using the details below or send us a message.
- Address
- 548 Market Street, San Francisco, CA 94104
- Phone
- +1 (555) 234-5678
- hello@example.com
Map placeholder
Contact With Cards
Contact us
Choose the right team below, or send a general message using the form.
Send us a message
Contact Minimal
Send us a message
Usage
import {
ContactSimple,
ContactSplit,
ContactWithCards,
ContactMinimal,
} from '@/components/ui/contact';
// Contact Simple
<ContactSimple
title="Get in touch"
description="Have a question or feedback?"
onSubmit={async (values) => console.log(values)}
/>
// Contact Split (details + optional map placeholder)
<ContactSplit
title="Let's talk"
address="548 Market Street, San Francisco, CA 94104"
phone="+1 (555) 234-5678"
email="hello@example.com"
showMap
onSubmit={async (values) => console.log(values)}
/>
// Contact With Cards (Sales / Support / Press)
<ContactWithCards
cards={[
{ title: 'Sales', email: 'sales@example.com', description: 'Pricing questions' },
{ title: 'Support', email: 'support@example.com', description: 'Account help' },
{ title: 'Press', email: 'press@example.com', description: 'Media inquiries' },
]}
onSubmit={async (values) => console.log(values)}
/>
// Contact Minimal (inline email + textarea that expands on focus)
<ContactMinimal onSubmit={async (values) => console.log(values)} />
Props Reference
ContactSimple
| Prop | Type | Default | Description |
|---|---|---|---|
variant | 'card' | 'plain' | 'card' | Container chrome |
title | string | 'Get in touch' | Heading text |
description | string | Default copy | Supporting text |
onSubmit | (values: ContactFormValues) => void | Promise<void> | - | Called with { name, email, message } |
ContactSplit
| Prop | Type | Default | Description |
|---|---|---|---|
title | string | "Let's talk" | Heading text |
description | string | Default copy | Supporting text |
address | string | Default copy | Displayed with a map-pin icon |
phone | string | Default copy | Displayed with a phone icon |
email | string | Default copy | Displayed with a mail icon |
showMap | boolean | true | Show a placeholder map panel |
onSubmit | (values: ContactFormValues) => void | Promise<void> | - | Called with { name, email, message } |
ContactWithCards
| Prop | Type | Default | Description |
|---|---|---|---|
title | string | 'Contact us' | Heading text |
description | string | Default copy | Supporting text |
cards | ContactCardInfo[] | Sales / Support / Press | { icon?, title, description?, email } |
onSubmit | (values: ContactFormValues) => void | Promise<void> | - | Called with { name, email, message } |
ContactMinimal
| Prop | Type | Default | Description |
|---|---|---|---|
title | string | 'Send us a message' | Heading text |
placeholder | string | 'you@example.com' | Email input placeholder |
messagePlaceholder | string | 'Add a message (optional)' | Textarea placeholder, expands on focus |
onSubmit | (values: ContactMinimalValues) => void | Promise<void> | - | Called with { email, message? } |