Accordion

Accordion

This is Twig implementation of the Accordion component.

Default usage (Stay open)


                                                
                                                <Accordion>
                                                  <AccordionItem id="AccordionItemExample0">
                                                    <AccordionHeader id="AccordionItemExample0Header" for="AccordionItemExample0Content">
                                                      Accordion Header
                                                    </AccordionHeader>
                                                    <AccordionContent id="AccordionItemExample0Content" labelledById="AccordionItemExample0Header">
                                                      Accordion Content
                                                    </AccordionContent>
                                                  </AccordionItem>
                                                  <AccordionItem id="AccordionItemExample1">
                                                    <AccordionHeader id="AccordionItemExample1Header" for="AccordionItemExample1Content">
                                                      Accordion Header
                                                    </AccordionHeader>
                                                    <AccordionContent id="AccordionItemExample1Content" labelledById="AccordionItemExample1Header">
                                                      Accordion Content
                                                    </AccordionContent>
                                                  </AccordionItem>
                                                  <AccordionItem id="AccordionItemExample2">
                                                    <AccordionHeader id="AccordionItemExample2Header" for="AccordionItemExample2Content">
                                                      Accordion Header
                                                    </AccordionHeader>
                                                    <AccordionContent id="AccordionItemExample2Content" labelledById="AccordionItemExample2Header">
                                                      Accordion Content
                                                    </AccordionContent>
                                                  </AccordionItem>
                                                  <AccordionItem id="AccordionItemExample3">
                                                    <AccordionHeader id="AccordionItemExample3Header" for="AccordionItemExample3Content">
                                                      Accordion Header
                                                    </AccordionHeader>
                                                    <AccordionContent id="AccordionItemExample3Content" labelledById="AccordionItemExample3Header">
                                                      Accordion Content
                                                    </AccordionContent>
                                                  </AccordionItem>
                                                  ...
                                                </Accordion>

Usage with initial open state (Stay open)


                                                
                                                <Accordion>
                                                  <AccordionItem id="AccordionItemExample0">
                                                    <AccordionHeader id="AccordionItemExample0Header" for="AccordionItemExample0Content">
                                                      Accordion Header
                                                    </AccordionHeader>
                                                    <AccordionContent id="AccordionItemExample0Content" labelledById="AccordionItemExample0Header">
                                                      Accordion Content
                                                    </AccordionContent>
                                                  </AccordionItem>
                                                  <AccordionItem id="AccordionItemExample1">
                                                    <AccordionHeader id="AccordionItemExample1Header" for="AccordionItemExample1Content" isOpen>
                                                      Accordion Header
                                                    </AccordionHeader>
                                                    <AccordionContent id="AccordionItemExample1Content" labelledById="AccordionItemExample1Header" isOpen>
                                                      Accordion Content
                                                    </AccordionContent>
                                                  </AccordionItem>
                                                </Accordion>

Usage with only one open item at a time


                                                
                                                <Accordion id="AccordionExample">
                                                  <AccordionItem id="AccordionItemExample0">
                                                    <AccordionHeader id="AccordionItemExample0Header" for="AccordionItemExample0Content">
                                                      Accordion Header
                                                    </AccordionHeader>
                                                    <AccordionContent
                                                      id="AccordionItemExample0Content"
                                                      labelledById="AccordionItemExample0Header"
                                                      parent="AccordionExample"
                                                    >
                                                      Accordion Content
                                                    </AccordionContent>
                                                  </AccordionItem>
                                                  <AccordionItem id="AccordionItemExample1">
                                                    <AccordionHeader id="AccordionItemExample1Header" for="AccordionItemExample1Content">
                                                      Accordion Header
                                                    </AccordionHeader>
                                                    <AccordionContent
                                                      id="AccordionItemExample1Content"
                                                      labelledById="AccordionItemExample1Header"
                                                      parent="AccordionExample"
                                                    >
                                                      Accordion Content
                                                    </AccordionContent>
                                                  </AccordionItem>
                                                </Accordion>

Slot

You can pass custom content (including HTML) into the slot inside Accordion Header:


                                                
                                                <AccordionHeader
                                                  id="AccordionItemExample1Header"
                                                  for="AccordionItemExample1Content"
                                                  UNSAFE_slot="<span>my content</span>"
                                                >
                                                  Accordion Item
                                                </AccordionHeader>

⚠️ Due to TwigX limitations, TwigX content is not allowed inside slot. To pass TwigX content into the slot, you must render it first and then pass the rendered result into the slot:


                                                
                                                {# This works #}
                                                
                                                {% set slotContent %}
                                                  <Pill color="selected">3</Pill>
                                                {% endset %}
                                                
                                                <AccordionHeader
                                                    id="AccordionItemExample1Header"
                                                    for="AccordionItemExample1Content"
                                                    UNSAFE_slot={{ slotContent }}
                                                >
                                                    Accordion Item
                                                </AccordionHeader>
                                                
                                                {# This DOES NOT WORK #}
                                                
                                                <AccordionHeader
                                                    id="AccordionItemExample1Header"
                                                    for="AccordionItemExample1Content"
                                                    UNSAFE_slot="<Pill color="selected">3</Pill>"
                                                >
                                                    Accordion Item
                                                </AccordionHeader>

Usage without lexer:


                                                
                                                {% embed "@spirit/accordion.twig" with { props: {
                                                  id: 'AccordionExample',
                                                } } %}
                                                    {% block content %}
                                                        {% embed "@spirit/accordionItem.twig" with { props: {
                                                          id: `AccordionItemExample`,
                                                        } } %}
                                                            {% block content %}
                                                                {% embed "@spirit/accordionHeader.twig" with { props: {
                                                                  id: 'AccordionItemExampleHeader',
                                                                  for: 'AccordionItemExampleContent',
                                                                  isOpen: true,
                                                                } } %}
                                                                    {% block content %}
                                                                        Accordion Header
                                                                    {% endblock %}
                                                                {% endembed %}
                                                                {% embed "@spirit/accordionContent.twig" with { props: {
                                                                  id: 'AccordionItemExampleContent',
                                                                  labelledById: 'AccordionItemExampleHeader',
                                                                  parent: 'AccordionExample',
                                                                  isOpen: true,
                                                                } } %}
                                                                    {% block content %}
                                                                        Accordion Content
                                                                    {% endblock %}
                                                                {% endembed %}
                                                            {% endblock %}
                                                        {% endembed %}
                                                    {% endblock %}
                                                {% endembed %}

API

The Accordion itself consists of several components which cannot be used independently.

Accordion

Name Type Default Required Description
elementType string section Custom element type
id string null optional It depends on whether the "Stay open" functionality is used. If so, the id field is not required.

AccordionItem

Name Type Default Required Description
elementType string article Custom element type
id string null AccordionItem ID

AccordionHeader

Name Type Default Required Description
elementType string h3 Custom element type
for string null AccordionContent ID
id string null AccordionHeader ID
isOpen string false Whether the item is open
UNSAFE_slot HTML Side slot in the header

AccordionContent

Name Type Default Required Description
id string null AccordionContent ID
isOpen bool false If true, make the item open on page load
labelledById string null AccordionHeader ID
parent string null A parent element selector that ensures that only one item is open at a time

On top of the API options, the components accept additional attributes. If you need more control over the styling of a component, you can use style props and escape hatches.

JavaScript Plugin

For full functionality, you need to provide Spirit JavaScript:


                                                
                                                <script src="node_modules/@lmc-eu/spirit-web/js/cjs/spirit-web.min.js" async></script>

Please consult the main README for how to include JavaScript plugins.

Or, feel free to write the controlling script yourself.

👉 Check the component's docs in the web package to see the full documentation and API of the plugin.