{% comment %} Page header: a title, optional description, and an actions slot. Used inside the shell's {% block page_header %}. loading=True swaps the title/description for a skeleton (STA-004), never a spinner. Required context: title. Optional: description, loading. Structural, so consumed via {% include %} (like _card.html), including by a caller that extends this template the way _card.html's own docstring shows. Named blocks (semver-public, BR-BW-TPL-001), all empty by default (an unfilled region renders nothing, matching _card.html's region convention), in document order: breadcrumb: above the title row (CMP-034); a consumer typically fills this with {% include "brickwork/components/_breadcrumbs.html" %}. title: wraps the existing {{ title }} rendering (CMP-034); an override replaces the heading markup entirely, mirroring _modal.html's modal_title default-content convention. Not rendered while loading=True (the skeleton stands in for it). title_badge: an inline status badge beside the title (CMP-036), e.g. {% bw_badge "Draft" variant="warning" %}. description: wraps the existing conditional {{ description }} paragraph (CMP-034). Not rendered while loading=True. actions: the page-level action cluster (CMP-034), e.g. one or more {% bw_button %} calls. tabs: a tab strip under the header (CMP-035), e.g. {% bw_tabs ... %}. A call site that supplies only title/description/loading (the pre-existing context-variable path) renders byte-identical output to before these blocks existed: every block's default content is exactly what used to render unconditionally in its place. States: loading=True swaps the title and description for a skeleton (aria-hidden), never a spinner; not-loading is the normal title/ description/actions render. No other interactive state of its own (the title_badge and tabs slots carry whatever states those composed components have). Accessibility: renders the page's own

, so a consuming page must not render a second one; the skeleton state is aria-hidden so a screen reader is not read a string of empty placeholder blocks while loading. Covered by axe.spec.mjs across every app-family fixture that composes it (8 archetypes per the catalogue manifest: console, dashboard, date-range-picker, detail, form, list, settings, wizard). Responsive: no breakpoint switch; no width-dependent CSS on any .bw-page-header* selector. {% endcomment %}
{% block breadcrumb %}{% endblock %} {% if loading %} {% else %}

{% block title %}{{ title }}{% endblock %}

{% block title_badge %}{% endblock %} {% block description %}{% if description %}

{{ description }}

{% endif %}{% endblock %}
{% endif %} {% block actions %}{% endblock %} {% block tabs %}{% endblock %}