Skip to content
Template Empire
Browse components

Contact Channel Cards

A free React contact section with clear routes, response times, and pointer-aware depth.

Contact Channel Cards is a free React contact section for Next.js, built with Motion and styled with Tailwind. It presents two to six full-card contact links in a responsive list, so visitors can choose sales, support, partnerships, or another team while seeing the response expectation before they leave the page.

Every destination is a real anchor with its label, explanation, and expectation present in the server HTML. Cards reveal once as the section enters view, then fine pointers add spring-smoothed tilt and a local glow without React pointer renders. Touch users keep a static pressed state, keyboard focus receives a centred emphasis without rotation, and reduced motion keeps every card visible and still.

Install

Add the @te registry to your components.json once:

{
  "registries": {
    "@te": "https://templateempire.io/r/{name}.json"
  }
}

Then install the component:

npx shadcn@latest add @te/contact-channel-cards

Usage

import { ContactChannelCards } from "@/components/contact-channel-cards";

const channels = [
  {
    id: "sales",
    label: "Talk to sales",
    description: "Shape the right plan for your product and team.",
    expectation: "Replies within one business day",
    href: "/contact/sales",
  },
  {
    id: "support",
    label: "Get product support",
    description: "Bring a technical question or production issue.",
    expectation: "First response within four hours",
    href: "/support",
  },
];

export function ContactPage() {
  return (
    <ContactChannelCards
      title="Start with the right conversation"
      description="Choose the team best placed to help."
      channels={channels}
      columns={2}
    />
  );
}

Props

PropTypeDefaultDescription
eyebrowstring"Choose the right team"Introductory label rendered above the section heading.
titlestringrequiredSection heading rendered as the single h2.
descriptionstringundefinedOptional supporting copy below the heading.
channels{ id: string; label: string; description: string; expectation: string; href: string; icon?: ReactNode }[]requiredTwo to six stable-ID destinations rendered as semantic list items and full-card anchors.
columns2 | 33Desktop grid columns. Mobile always uses one column.
revealOffsetnumber18Entrance distance in CSS pixels, clamped from 0 to 32.
revealStaggernumber0.07Delay between card entrances in seconds, clamped from 0 to 0.14.
maxTiltnumber5Maximum fine-pointer rotation in degrees, clamped from 0 to 8.
glowSizenumber240Decorative glow diameter in CSS pixels, clamped from 140 to 360.
glowLagnumber0.38Glow spring response in seconds, clamped from 0.15 to 0.8.
radiusnumber20Card radius in CSS pixels, clamped from 8 to 32.
classNamestringundefinedAdditional classes merged onto the section root.

Customisation

Contact Channel Cards exposes three Tier 3 colour tokens. --contact-channel-surface sets the resting card surface, --contact-channel-glow colours the local and centred highlights, and --contact-channel-border-active controls the hover, focus, and pressed border. Each defaults to a semantic token, so the section follows dark and light themes without component edits:

:root {
  --contact-channel-surface: var(--surface);
  --contact-channel-glow: var(--primary);
  --contact-channel-border-active: var(--ring);
}

Frequently asked questions

Is Contact Channel Cards free for commercial use?
Yes. Contact Channel Cards is MIT licensed, so you can use it in personal and commercial projects without attribution.
Is Contact Channel Cards accessible and performant?
Yes. The section uses one labelled h2, a semantic list, and full-card anchors with visible focus rings and response expectations in the accessible name. The once-only reveal changes transform and opacity, pointer movement writes Motion values instead of React state, and touch and reduced-motion modes install no move handler.
How do I customise the card effect and colours?
Use maxTilt, glowSize, glowLag, radius, revealOffset, and revealStagger to tune the geometry and motion. Override the three contact-channel Tier 3 tokens from an ancestor to change the surface, glow, and active border while retaining the semantic theme system.

Related components

Want the full page this belongs to?Template Empire builds complete Next.js templates with contact, product, and conversion sections designed as one system.Explore Template Empire templates