42

MC Accordion

A component that allows expanding and collapsing content sections.

Overview

The mc-accordion is a disclosure component of Micro Club UI. Built on the @base-ui/react accordion primitive, it helps organize related content into expandable sections while keeping keyboard navigation and accessibility behavior handled for you.

As a part of Micro Club UI, this component is designed for instant deployment into your codebase, giving you full ownership of its look and behavior.

Preview

Loading...
import {  McAccordion,  McAccordionContent,  McAccordionItem,  McAccordionTrigger,} from '@/components/ui/mc-accordion';export function AccordionDemo() {  return (    <McAccordion defaultValue={['product']} className="max-w-lg">      <McAccordionItem value="product">        <McAccordionTrigger>Product Information</McAccordionTrigger>        <McAccordionContent>          <p>            Our flagship product combines cutting-edge technology with sleek design. Built with            premium materials, it offers unparalleled performance and reliability.          </p>          <p>            Key features include advanced processing capabilities, and an intuitive user interface            designed for both beginners and experts.          </p>        </McAccordionContent>      </McAccordionItem>      <McAccordionItem value="shipping">        <McAccordionTrigger>Shipping Details</McAccordionTrigger>        <McAccordionContent>          <p>We offer standard (5-7 days), express (2-3 days), and overnight shipping.</p>          <p>            Free shipping on international orders is available once the minimum order amount is            reached.          </p>        </McAccordionContent>      </McAccordionItem>      <McAccordionItem value="returns">        <McAccordionTrigger>Return Policy</McAccordionTrigger>        <McAccordionContent>          <p>            Returns accepted within 30 days. Items must be unused and in original packaging. Refunds            processed within 5-7 business days.          </p>        </McAccordionContent>      </McAccordionItem>    </McAccordion>  );}export default AccordionDemo;

Add to Your Project

Deploy the mc-accordion directly to your components/ui directory:

npx mcoli-ui@latest add mc-accordion
pnpm dlx mcoli-ui@latest add mc-accordion
yarn dlx mcoli-ui@latest add mc-accordion
bunx mcoli-ui@latest add mc-accordion

Manual Setup

If you prefer manual control:

Install the core dependencies
npm install @base-ui/react lucide-react
pnpm add @base-ui/react lucide-react
yarn add @base-ui/react lucide-react
bun add @base-ui/react lucide-react
Copy the source code
import { Accordion as AccordionPrimitive } from '@base-ui/react/accordion';import { ChevronDownIcon, ChevronUpIcon } from 'lucide-react';import { cn } from '@/lib/utils';function McAccordion({ className, ...props }: AccordionPrimitive.Root.Props) {  return (    <AccordionPrimitive.Root      data-slot="accordion"      className={cn('flex w-[503px] flex-col', className)}      {...props}    />  );}function McAccordionItem({ className, ...props }: AccordionPrimitive.Item.Props) {  return (    <AccordionPrimitive.Item      data-slot="accordion-item"      className={cn('not-last:border-b', className)}      {...props}    />  );}function McAccordionTrigger({ className, children, ...props }: AccordionPrimitive.Trigger.Props) {  return (    <AccordionPrimitive.Header className="flex">      <AccordionPrimitive.Trigger        data-slot="accordion-trigger"        className={cn(          'group/accordion-trigger paragraph-md relative flex flex-1 items-start justify-between rounded-lg border border-transparent py-2.5 text-left font-semibold transition-all outline-none hover:underline focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:after:border-ring aria-disabled:pointer-events-none aria-disabled:opacity-50 **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground',          className        )}        {...props}      >        {children}        <ChevronDownIcon          data-slot="accordion-trigger-icon"          className="pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden"        />        <ChevronUpIcon          data-slot="accordion-trigger-icon"          className="pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline"        />      </AccordionPrimitive.Trigger>    </AccordionPrimitive.Header>  );}function McAccordionContent({ className, children, ...props }: AccordionPrimitive.Panel.Props) {  return (    <AccordionPrimitive.Panel      data-slot="accordion-content"      className="paragraph-sm overflow-hidden font-normal text-muted-foreground data-open:animate-accordion-down data-closed:animate-accordion-up"      {...props}    >      <div        className={cn(          'flex h-(--accordion-panel-height) flex-col gap-4 pt-0 pb-2.5 data-ending-style:h-0 data-starting-style:h-0 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground',          className        )}      >        {children}      </div>    </AccordionPrimitive.Panel>  );}export { McAccordion, McAccordionItem, McAccordionTrigger, McAccordionContent };
Adjust import paths

Ensure your @/lib/utils or equivalent classname helper is correctly imported.

Usage

import {
  McAccordion,
  McAccordionContent,
  McAccordionItem,
  McAccordionTrigger,
} from '@/components/ui/mc-accordion';

export default function Example() {
  return (
    <McAccordion defaultValue={['product']} className="w-full max-w-[503px]">
      <McAccordionItem value="product">
        <McAccordionTrigger>Product Information</McAccordionTrigger>
        <McAccordionContent>
          <p>Our flagship product combines cutting-edge technology with sleek design.</p>
        </McAccordionContent>
      </McAccordionItem>
    </McAccordion>
  );
}

Examples

Basic Accordion

<McAccordion defaultValue={['product']} className="w-full max-w-[503px]">
  <McAccordionItem value="product">
    <McAccordionTrigger>Product Information</McAccordionTrigger>
    <McAccordionContent>
      <p>Our flagship product combines cutting-edge technology with sleek design.</p>
      <p>Key features include advanced processing capabilities and an intuitive interface.</p>
    </McAccordionContent>
  </McAccordionItem>

  <McAccordionItem value="shipping">
    <McAccordionTrigger>Shipping Details</McAccordionTrigger>
    <McAccordionContent>
      <p>We offer standard, express, and overnight shipping.</p>
      <p>Free international shipping is available over the minimum order amount.</p>
    </McAccordionContent>
  </McAccordionItem>

  <McAccordionItem value="returns">
    <McAccordionTrigger>Return Policy</McAccordionTrigger>
    <McAccordionContent>
      <p>Returns are accepted within 30 days when items are unused and in original packaging.</p>
    </McAccordionContent>
  </McAccordionItem>
</McAccordion>

Width Control

The accordion already accepts className, so width is usually controlled from the parent with Tailwind utilities.

<McAccordion className="w-full max-w-[503px]">...</McAccordion>

Use w-[503px] for a fixed width, or w-full max-w-[503px] for a responsive layout that keeps the default width as a maximum.

Long Trigger Text

When trigger labels are long, keep the chevron separated from the text so content wraps cleanly instead of sliding underneath the icon.

<McAccordionItem value="faq">
  <McAccordionTrigger>
    What happens if my accordion title is much longer than a single line?
  </McAccordionTrigger>
  <McAccordionContent>
    <p>The trigger text should wrap naturally while the chevron keeps its own space.</p>
  </McAccordionContent>
</McAccordionItem>

Multiple Paragraphs

McAccordionContent works well with stacked content such as paragraphs, links, and lists.

<McAccordionContent>
  <p>First paragraph of supporting information.</p>
  <p>Second paragraph with more details.</p>
  <a href="#learn-more">Learn more</a>
</McAccordionContent>

API Reference

McAccordion

PropTypeDefaultDescription
classNamestringundefinedAdditional CSS classes, commonly used to control width
defaultValuestring[]undefinedThe item values opened by default
valuestring[]undefinedControlled open item values
onValueChange(value: string[]) => voidundefinedCalled when open items change

All other props from @base-ui/react/accordion root are supported.

McAccordionItem

PropTypeDefaultDescription
valuestring-Unique value used to identify the item
classNamestringundefinedAdditional CSS classes

All other props from @base-ui/react/accordion item are supported.

McAccordionTrigger

PropTypeDefaultDescription
childrenReactNode-The clickable heading content
classNamestringundefinedAdditional CSS classes
disabledbooleanfalsePrevents interaction for the trigger

All other props from @base-ui/react/accordion trigger are supported.

McAccordionContent

PropTypeDefaultDescription
childrenReactNode-The revealed content
classNamestringundefinedAdditional CSS classes

All other props from @base-ui/react/accordion panel are supported.

On this page