{# ══════════════════════════════════════════ #} {# ══════════════════════════════════════════ #} {# One 2x2 table, not a logo row above a copy block. The logo shares a row with the title and the department shares one with the subtitle, so the two right-hand marks align with the lines they belong to instead of stacking in a band of their own. The left cell carries width="100%" so the right one shrinks to its content — an explicit right-column width would have to be wide enough for the logo *and* the department, and whichever is narrower would then sit short of the frame edge. The copy reads the *resolved* keys, never ``firm_name`` / ``campaign_name`` directly: those are facts, they land last in ``Banner.context()``, and reading them here would make ``Banner.title`` unreachable — silently, since the render would still work. A test greps for exactly that. Jinja comments on purpose: an HTML one would move every golden in the gallery for a note nobody but us reads. #} {# One , not the default banner's mso/non-mso pair: that pair exists because max-width misbehaves inside a v:textbox, and there is no v:textbox here. Outlook ignores max-width and reads the width attribute. No text-shadow either: it buys legibility over a photograph, and there is no photograph. #}

{{ banner_title | escape_html }}

{% if logo_url %} {{ logo_alt | escape_html }} {% endif %}

{{ banner_subtitle | escape_html }}

{% if department %}

{{ department | escape_html }}

{% endif %}
 
{{ date_range | escape_html }} {{ issue_label | escape_html }}