{# Accordion / collapsible sections — canonical renderer (cycle 247). Contract: ~/.claude/skills/ux-architect/components/parking-lot-primitives.md Parameters: sections : list of {id: str, title: str, content: str|None, endpoint: str|None} Uses the native HTML
/ elements — no Alpine, no HTMX for static content. Static sections rendered with all-closed default; the first section is open. Lazy-loaded sections use HTMX to fetch on first open. The caller supplies `content` as plain text — it is HTML-escaped by Jinja autoescape. If structured content is needed, lazy-load it from a template endpoint via `section.endpoint`. Note: pre-cycle-247 version passed content through `| safe` which was a latent XSS vector (same class as the cycle 241 tooltip fix). Removed because the primitive has no consumer; safe-by-default is preferred. #}
{% for section in sections %}
{{ section.title }}
{% if section.endpoint %} Loading… {% else %} {{ section.content }} {% endif %}
{% endfor %}