Skip to content

AccordionTrigger: className prop replaces rather than appending #2480

Description

@dbjorge

Steps to reproduce

<Accordion>
  <AccordionTrigger className={'extraTriggerClass'}>trigger</AccordionTrigger>
  <AccordionContent className={'extraContentClass'}>content</AccordionContent>
</Accordion>

Expected Behavior

Should result in a trigger button with classes like Accordion__trigger ExpandCollapse__trigger extraTriggerClass

(it actually results in extraTriggerClass ExpandCollapse__trigger)

Root cause

The bug is a prop-spread ordering issue in Accordion.tsx:98-107:

<PanelTrigger
  ...
  className={classnames('Accordion__trigger', trigger.props.className)}  // ← line 101: "Accordion__trigger extraTriggerClass"
  ...
  {...trigger.props}                                                      // ← line 104: spreads className:"extraTriggerClass", clobbering line 101
>

Tracing the reproduction (<AccordionTrigger className="extraTriggerClass">):

  1. Line 101 composes the intended value: "Accordion__trigger extraTriggerClass".
  2. Line 104 spreads {...trigger.props} after the explicit className. Since trigger.props contains className: "extraTriggerClass", the later spread overwrites the composed value. PanelTrigger receives just "extraTriggerClass"Accordion__trigger is silently dropped.
  3. PanelTrigger.tsx:41 then composes its own: classnames("extraTriggerClass", 'ExpandCollapse__trigger', ...)"extraTriggerClass ExpandCollapse__trigger".

Version

7.2.0

What browser(s) are you experiencing the problem on?

Chrome

Relevant log output

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions