Skip to content
Template Empire
Browse components

Integration Stack Carousel

A free React integration carousel that turns connected software stacks into layered, navigable stories.

Customise

22px
12px
5deg
0.52s

Code

<IntegrationStackCarousel
  title="Every tool has a role"
  description={
    "Show the complete systems behind your product, " +
    "not just the logos on the box."
  }
  stacks={stacks}
/>

Integration Stack Carousel is a free React integration carousel for Next.js and Tailwind that presents complete software relationships as layered cards instead of a passive logo strip. Each stack names the tools, explains their roles and closes with a practical outcome, so visitors can understand how the system works before they follow a link.

Motion retargets the layered transform from its current visual state whenever a visitor uses the previous, next or labelled position controls. The tallest card stays reserved for zero layout shift, stable IDs preserve selection through data changes, fine pointers receive a restrained spring tilt, and reduced-motion or coarse-pointer visitors keep a calm, fully operable carousel.

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/integration-stack-carousel

Usage

import { IntegrationStackCarousel } from "@/components/integration-stack-carousel";

const stacks = [
  {
    id: "release",
    label: "Release command",
    description: "Connect scope, source control and production health.",
    integrations: [
      { id: "linear", label: "Linear", role: "Scope and milestones" },
      { id: "github", label: "GitHub", role: "Pull requests and checks" },
      { id: "vercel", label: "Vercel", role: "Preview and production deploys" },
    ],
    proof: "Every launch carries evidence from approved scope to production.",
    href: "/integrations/release",
  },
  {
    id: "revenue",
    label: "Revenue intelligence",
    description: "Join billing events to account context.",
    integrations: [
      { id: "stripe", label: "Stripe", role: "Billing events" },
      { id: "hubspot", label: "HubSpot", role: "Account context" },
    ],
    proof: "Commercial teams see one shared customer signal.",
  },
  {
    id: "support",
    label: "Customer support",
    description: "Connect conversations to product evidence.",
    integrations: [
      { id: "intercom", label: "Intercom", role: "Customer conversations" },
      { id: "posthog", label: "PostHog", role: "Product behaviour" },
    ],
    proof: "Support can answer with the journey already in view.",
  },
];

export function Example() {
  return (
    <IntegrationStackCarousel
      title="Every tool has a role"
      description="Show the complete systems behind your product."
      stacks={stacks}
    />
  );
}

Props

PropTypeDefaultDescription
eyebrowstring"Stacks that work together"Introductory label above the section title.
titlestringrequiredSection heading rendered as an h2.
descriptionstringundefinedOptional supporting section copy.
stacks{ id; label; description; integrations; proof; href? }[]requiredThree to seven connected stack stories. Every stack and nested integration requires a unique, stable ID.
activeIdstringundefinedControlled active stack ID.
defaultActiveIdstringfirst stack IDInitial stack ID for uncontrolled usage.
onActiveChange(id: string) => voidundefinedCalled with a valid stable ID after previous, next or position navigation.
cardSpreadnumber22Horizontal layer spread in pixels, clamped from 10 to 44.
depthnumber12Per-layer z-depth in pixels, clamped from 4 to 24.
maxTiltnumber5Maximum fine-pointer active-card tilt in degrees, clamped from 0 to 8.
transitionDurationnumber0.52Transition duration in seconds, clamped from 0.2 to 1.
classNamestringundefinedAdditional classes merged onto the section root.

Customisation

The content stays in the stacks array while effect geometry remains independent. Tune cardSpread for the visible fan, depth for the layered perspective, maxTilt for fine-pointer response and transitionDuration for the navigation cadence. Every value is clamped to the component's tested range.

<IntegrationStackCarousel
  title="Systems built around the customer"
  stacks={stacks}
  cardSpread={30}
  depth={16}
  maxTilt={3}
  transitionDuration={0.65}
/>

Frequently asked questions

Is Integration Stack Carousel free for commercial use?
Yes. Integration Stack Carousel is MIT licensed, so you can use it in personal and commercial projects without attribution.
Is the integration carousel accessible and stable?
Yes. Before JavaScript, every stack is readable in a static horizontal grid. After enhancement, the region, slides, previous and next controls, labelled position buttons, active state, inert inactive links and polite user-triggered status follow accessible carousel behaviour. Intrinsic sizer cards reserve the tallest story, so navigation produces zero layout shift.
How do I customise the layered card effect?
Use cardSpread, depth, maxTilt and transitionDuration to change geometry and pace without editing stack wording. Reduced motion removes translation, scale, depth and tilt automatically, while coarse pointers never enable the tilt interaction.

Related components

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