Skip to content

Features & services

Services Accordion

Section header and every service as a numbered row that opens to photos, a description, a link and the tools used.

Layout and motion from the Nitip template — see it in context

Installation

$ npx shadcn@latest add https://framebrick.co/r/blocks/services-accordion.json

Usage

import { ServicesAccordion } from "@/components/services-accordion";

<ServicesAccordion
  title="Expertise"
  action={{ label: "All services", href: "/services" }}
  services={[
    {
      title: "Paid advertising",
      href: "/services/paid-advertising",
      description: "Search and social campaigns built around your margins.",
      images: [{ src: "/services/ads-1.jpg", alt: "…" }, { src: "/services/ads-2.jpg", alt: "…" }],
      tools: [{ label: "Google Ads", href: "https://ads.google.com" }],
    },
  ]}
/>

Props

PropTypeDefaultDescription
title / leadstring—Section heading (h2) and the large lead under the divider.
metastring—Short line beside the title from 768px (a year range, a count).
action{ label, href }All servicesButton beside the title; under it on phones.
services{ title, href, description, images: [img, img], tools? }[]5 servicesOne row each, numbered 01, 02…; row titles are h3.
initiallyOpennumber1How many rows start open.
labels{ details, tools, more }What we do, Tools, Learn moreText inside an open row.
classNamestring—Classes for the <section>.
  • Rows open on their own (several can be open), the first starts open, closed rows sit at 50% until hovered or focused, and height opens with a spring (bounce 0, 0.4s) while the content fades in.
  • An open row shows the tools first on phones; from 768px the tools take a 256px (1024px: 300px) column on the right.
  • Tools with an href open in a new tab. Nitip's divider segment in front of the title is not part of accordion-list; rows use full dividers.

AI prompt

Paste into v0, Lovable, Bolt or Claude to rebuild this block in your own project.

Create a React + Tailwind CSS + Motion block called ServicesAccordion (Next.js).
- <section className="py-(--section-y)">, container mx-auto max-w-(--container) px-(--gutter), column gap-12 md:gap-16 lg:gap-20.
- Header: a row from 768px (items-end, justify-between; stacked on phones): h2 font-heading text-h2 font-semibold tracking-tight,
  an optional muted meta, a shadcn-style button; then an <hr>; then a lead (text-h3 font-medium) max-w-3xl aligned to the right edge.
- Rows: divided accordion (border-b), each trigger a button inside an h3 with a muted two-digit number (from 640px), the title
  (font-heading text-h3 semibold) and a plus that rotates 45° when open; aria-expanded / aria-controls; several rows can be
  open; the first starts open; closed rows at opacity 50%, 100% on hover and focus. Panel height 0 → auto with a spring
  (bounce 0, 0.4s), opacity in 0.25s after 0.1s, out in 0.15s; closed panels inert.
- Panel: from 768px a row (items-end, gap-12 / lg:gap-24): left — two 8:5 photos side by side (rounded-lg), "What we do" over an
  <hr> and a muted description, a text link "Learn more" whose underline grows on hover; right — a 256px (lg 300px) "Tools"
  column: <hr> and rows with a border-b, the label and an 8px dot, links open in a new tab. On phones the tools come first.
- Only shadcn variables and block tokens.

Be the first to know

Get new templates and components first

One short email when we release a template or a free component. No spam — unsubscribe anytime.

We use your email only for Framebrick updates. Privacy policy