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
Email
hello@example.com
Map placeholder

Contact With Cards

Contact us

Choose the right team below, or send a general message using the form.

Sales

Questions about pricing or plans.

sales@example.com

Support

Get help with your account.

support@example.com

Press

Media and press inquiries.

press@example.com

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

PropTypeDefaultDescription
variant'card' | 'plain''card'Container chrome
titlestring'Get in touch'Heading text
descriptionstringDefault copySupporting text
onSubmit(values: ContactFormValues) => void | Promise<void>-Called with { name, email, message }

ContactSplit

PropTypeDefaultDescription
titlestring"Let's talk"Heading text
descriptionstringDefault copySupporting text
addressstringDefault copyDisplayed with a map-pin icon
phonestringDefault copyDisplayed with a phone icon
emailstringDefault copyDisplayed with a mail icon
showMapbooleantrueShow a placeholder map panel
onSubmit(values: ContactFormValues) => void | Promise<void>-Called with { name, email, message }

ContactWithCards

PropTypeDefaultDescription
titlestring'Contact us'Heading text
descriptionstringDefault copySupporting text
cardsContactCardInfo[]Sales / Support / Press{ icon?, title, description?, email }
onSubmit(values: ContactFormValues) => void | Promise<void>-Called with { name, email, message }

ContactMinimal

PropTypeDefaultDescription
titlestring'Send us a message'Heading text
placeholderstring'you@example.com'Email input placeholder
messagePlaceholderstring'Add a message (optional)'Textarea placeholder, expands on focus
onSubmit(values: ContactMinimalValues) => void | Promise<void>-Called with { email, message? }
Previous
Auth Forms