{% comment %} One conversation: header controls, the polled body, and the compose box. The split matters. #inbox-thread-body is swapped every three seconds when something changed; the composer sits OUTSIDE it and refreshes only after a send (`inboxSent from:body`), because it is the one element on this page holding unsaved work and a poll that swapped it would delete a half-typed reply. {% endcomment %} {% load common_extras %}
{% comment %} Refreshed on the same event the body and the panel listen for — see inbox/_thread_header.html for why it is a separate request. {% endcomment %}
{% include "inbox/_thread_header.html" %}
{% comment %} hx-include is what makes "load earlier" survive the poll. The response renders the window it used into a hidden field inside this element, and every poll sends it back — so a reader who has opened more history keeps it, and a message arriving still lands. Without it the poll would ask for the default page three seconds later and throw them back to the bottom. hx-disinherit is the load-bearing half. hx-include is an INHERITED attribute, so without it every request from inside this element picks it up: a relative `find [name=limit]` re-resolves against the descendant and logs an error per request, and an id selector — which does resolve — is worse still, because "load earlier" then sends the *current* window alongside the wider one it is asking for and silently gets nowhere. The children here have their own parameters and want none of this element's. {% endcomment %}
{% include "inbox/_thread_body.html" %}
{% include "inbox/_composer.html" %}
{% comment %} Shown and hidden by the header's panel button (`info`, on the page's x-data), through the is-open / is-closed classes rather than x-show, so that without JavaScript it still shows wherever there is room. Beside the thread from `lg`; below it opens over the thread instead, so labels and tags stay reachable on a narrow screen. It refreshes on its own event because a tag edit changes nothing in the thread. {% endcomment %}