{# ══════════════════════════════════════════ #} {# ══════════════════════════════════════════ #} {# The background-image declaration is emitted only when there is one. url('') is not inert: a client may resolve it against the current document and issue a spurious request (#78). #}
{# Dark overlay for text legibility. Hidden from Outlook on purpose: the v:fill above already applies this exact scrim through its own color + opacity attributes, and the Word engine demotes a transparent background-color to a background image, inheriting VML's limitations for a second copy of an effect it has already drawn (#78). Both halves still read one Rgba, so they cannot drift. #}
{# 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. #}

{{ banner_title | escape_html }}

{# Gated on the value, not merely rendered with it: an `img` with an empty `src` is a broken-image icon in every client, and the pair is gated together so the mso and non-mso halves cannot diverge. #} {% 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 }}