{# Reusable chat dialog: header, scrolling transcript, busy-status bar, and a message form. Element ids derive from `id` ({{id}}-messages, {{id}}-form, {{id}}-message, {{id}}-status, {{id}}-elapsed, {{id}}-cancel) so page modules can wire behavior; styles live in static/components/chat_dialog.css. Pass disabled=true for a display-only transcript (no send/cancel controls). #} {% macro chat_messages(messages, empty_text) %} {% if messages %} {% for message in messages %}
{{ message.content }}
{% endfor %} {% else %}
{{ empty_text }}
{% endif %} {% endmacro %} {% macro chat_dialog(id, title, subtitle, placeholder, messages=none, empty_text='', disabled=false) %}

{{ title }}

{{ subtitle }}

{{ chat_messages(messages, empty_text) }}
{% if not disabled %}
{% endif %}
{% endmacro %}