Diamond Diamond

ui · 6 variants · 1 categories

Accordion

Collapsible stack — single or multi expand, controlled or uncontrolled, with leading/trailing slots.

npx "@rueda.dev/gems-diamond" add accordion
§01

Display

6 variants
A systematic design toolkit for makers.
faq
A systematic design toolkit for makers.
separated
A systematic design toolkit for makers.
terminal
A systematic design toolkit for makers.
editorial
A systematic design toolkit for makers.
team
A systematic design toolkit for makers.
inset

Usage Guide

How to wire up this component in your app — props, callbacks, customization, and the conventions Diamond shares across the library.

Single vs multi-expand

Default behavior: clicking an item collapses the others. Pass multiple to let any number be open at once.

State

  • Uncontrolled: defaultValue=["id-a", "id-b"] or per-item defaultOpen.
  • Controlled: value + onValueChange with an array of ids.
  • Set disabled on a single item to make it non-interactive.

Item shape

interface AccordionItem {
  id: string;
  title: ReactNode;
  content: ReactNode;
  leading?: ReactNode;   // trigger left slot
  trailing?: ReactNode;  // trigger right slot
  defaultOpen?: boolean;
  disabled?: boolean;
}

Universal patterns

Every Diamond component shares the same prop conventions, so once you learn one you can predict the others.

  • variant — discriminated union of every visual option. Categories shown above are docs-only metadata; the prop is a flat string union.
  • accent — any CSS color string. Overrides --diamond-accent just for that instance via inline style. Cascades into hover, ring, and selection states.
  • asChild (when present) — renders the underlying primitive via @radix-ui/react-slot, letting you compose with <Link>, motion.button, etc.
  • className — merged with internal Tailwind classes via cn(). Use it to override layout, spacing, or colors.
  • Native HTML attributes (onClick, aria-*, data-*, ref, etc.) flow through to the root element without any whitelist.
  • Diamond is the skin: zero domain state, zero fetch, zero providers. You wire data and reactions in your app code; the components just render and emit events.