{% comment %} FAQ (04-interfaces.md section 4d): the FAQ section wrapper. Structural, consumed via {% include %} (BR-BW-MKT ยง4d structural-include doctrine). Composes _disclosure.html per BR-BW-MKT-004 (a marketing component reuses an existing primitive rather than reimplementing it): this template is only the heading + a stack of disclosures, never a new accordion interaction primitive. The no-JS floor is therefore free by construction (BR-BW-HTMX-001/006): _disclosure.html ships no JavaScript at all. Required context: none. Optional context: heading (str): the section heading. items (list of dicts): {question, answer}. Each renders through {% include "brickwork/components/_disclosure.html" %} with label=question, content=answer. single_open (bool, default False): when set, every disclosure shares a name so only one opens at a time, using _disclosure.html's native
exclusive-group mechanism. An empty (or omitted) items list renders the heading alone (or nothing, if that too is empty). items is list-shaped, so it has no flat-kwarg spelling (#98): a Django template cannot build a list inline, so supply it from context (the view, or a wrapper template's own data). A template-authored page with static questions (the ADR-056 compose-it-yourself shape) instead includes brickwork/components/_disclosure.html directly once per question (its contract is flat strings: label=question, content=answer, plus a shared name for the single-open behaviour); stacking disclosures is all this wrapper does. {% endcomment %} {% if heading or items %}
{% if heading %}

{{ heading }}

{% endif %} {% if items %}
{% for item in items %} {% if single_open %} {% include "brickwork/components/_disclosure.html" with label=item.question content=item.answer name="bw-faq" %} {% else %} {% include "brickwork/components/_disclosure.html" with label=item.question content=item.answer %} {% endif %} {% endfor %}
{% endif %}
{% endif %}