Grapes homepage1.57.0
  • Guide
  • Tokens
  • Components
    Grapes on GithubGrapes on Figma
    Interaction
    • Button
    • IconButton
    • FloatingActionBar
    • Link
    Icons
    • Icon
    • HighlightIcon
    Form
    • AmountInput
    • Autocomplete
    • AutocompleteMultiple
    • AutocompletePlace
    • CheckboxBox
    • CheckboxField
    • DatePicker
    • FormField
    • Input
    • OptionGroup
    • PasswordInput
    • PhoneInput
    • RadioBox
    • RadioField
    • RadioGroup
    • Select
    • SwitchField
    • TextArea
    • TextInput
    • Upload
    • UploadButton
    Feedback
    • Badge
    • Banner
    • Callout
    • EmptyState
    • Modal
    • ModalSlideshow
    • DeprecatedModalSlideshow
    • PageModal
    • Skeleton
    • Tag
    • Toast
    • Tooltip
    Data display
    • Accordion
    • Avatar
    • Box
    • Calendar
    • CalendarRange
    • CollapsibleList
    • FileCard
    • InfoTip
    • ListBox
    • ListView
    • Panel
    • SidePanel
    • DeprecatedPreview
    • Table
    • Timeline
    • useDateFormatter
    Navigation
    • DropdownItem
    • DropdownMenu
    • Navigation
    • NavigationItem
    • Popover
    • Tabs

    Accordion

    View source code
    • Usage
    • Props

    Basic usage

    Content Overflow

    The AccordionItem component benefits from an animation effect when it is revealed or concealed. This animation requires the use of an overflow property to ensure the content appears and disappears smoothly.

    As a result, components such as Popover, Select, and DropdownMenu are not compatible with the AccordionItem component, as they cannot properly overflow the AccordionItem's boundaries.

    It is recommended to avoid using these components within an AccordionItem to ensure proper functionality.

    However, if you must use these components within an AccordionItem, you can use the noAnimation prop. This prop will disable the animation, thereby eliminating the need for the overflow property.

    The Accordion is highly customizable and has few styles from the start.

    const accordionItems = [
      "Invite team members",
      "Make a first payment",
      "Order physical cards",
    ];
    
    const Demo = () => {
      return (
        <Accordion>
          {accordionItems.map((accordionItem) => (
            <AccordionItem
              key={accordionItem}
              renderHeader={() => <div>{accordionItem}</div>}
            >
              <div className="p-24 pt-8 text-content-primary">
                Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec
                lectus sed sem porttitor viverra. Vestibulum magna leo.
              </div>
            </AccordionItem>
          ))}
        </Accordion>
      );
    };
    

    Default expanded item

    The open prop lets you select which item should be expanded.

    In an Accordion group, only one AccordionItem can be expanded at a time. If multiple AccordionItem components have the open prop set to true, the last one will be the one that is open.

    If you need to have multiple AccordionItem components open at the same time, you should use the AccordionItem components directly without wrapping them in an Accordion component.

    <Accordion className="w-full text-content-primary">
      <AccordionItem
        open
        renderHeader={() => "Invite team members"}
      >
        <div className="p-24 pt-8">
          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec lectus
          sed sem porttitor viverra. Vestibulum magna leo.
        </div>
      </AccordionItem>
      <AccordionItem renderHeader={() => "Make a first payment"}>
        <div className="p-24 pt-8">
          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec lectus
          sed sem porttitor viverra. Vestibulum magna leo.
        </div>
      </AccordionItem>
    </Accordion>
    

    Open / Close accordion

    To control an AccordionItem, use the useState hook and set the open prop to the desired state.

    function Demo() {
      const [indexOpen, setIndexOpen] = useState("close"); 
    
      return (
        <>
          <Button
            variant="primaryBrand"
            text="Open accordion"
            onClick={() => setIndexOpen("open")}
          />
          <Button
            variant="primaryBrand"
            text="Close accordion"
            onClick={() => setIndexOpen("close")}
          />
          <Accordion className="w-full overflow-hidden">
            <AccordionItem
              open={"open" === indexOpen} 
              renderHeader={() => "Invite team members"}
            >
              <div className="p-24 pt-8 text-content-primary">
                Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec
                lectus sed sem porttitor viverra. Vestibulum magna leo.
              </div>
            </AccordionItem>
          </Accordion>
        </>
      );
    }
    

    Controlled state

    The onToggle prop lets you get the state of an AccordionItem component.

    const Demo = () => {
      const [openItem, setOpenItem] = useState(false); 
    
      return (
        <AccordionItem
          className="w-full"
          open={openItem} 
          onToggle={(open) => setOpenItem(open)}
          renderHeader={() => (openItem ? "Show less" : "Show more")} 
        >
          <div className="p-24 pt-8 text-content-primary">
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec
            lectus sed sem porttitor viverra. Vestibulum magna leo.
          </div>
        </AccordionItem>
      );
    };
    
    Invite team members
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec lectus sed sem porttitor viverra. Vestibulum magna leo.
    Make a first payment
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec lectus sed sem porttitor viverra. Vestibulum magna leo.
    Invite team members
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec lectus sed sem porttitor viverra. Vestibulum magna leo.
    Make a first payment
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec lectus sed sem porttitor viverra. Vestibulum magna leo.
    Invite team members
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec lectus sed sem porttitor viverra. Vestibulum magna leo.
    Show more
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec lectus sed sem porttitor viverra. Vestibulum magna leo.