{% extends "brickwork/shell/base.html" %}
{% load i18n static %}
{% comment %}
Marketing shell (04-interfaces.md section 4d, 1.2.0, BR-BW-MKT-005): the
public-site counterpart of shell/app.html. It reuses base.html's document
skeleton (the {% static %} CSS link, the theme/density/dir attributes on
, the skip link, the no-JS floor, the toast/modal roots) and adds only
the public header/nav/footer regions the app shell does not have. A marketing
page {% extends %} this shell and is itself {% extends %}d by a consuming
page (BR-BW-PAGE-001 at marketing scope), never {% include %}d.
Named blocks (semver-public, BR-BW-TPL-001), all empty-graceful:
marketing_header_modifiers
empty by default. Set to bw-marketing-header--overlay
to opt into overlay mode (ADR-105 / BR-BW-MKT-006).
marketing_header_attrs
empty by default. Extra attributes on (include
a leading space), e.g. data-bw-nav-context="dark".
marketing_header default: a header row with brand_logo/brand_wordmark at
the inline start and marketing_nav at the end.
brand_logo wrapped in the brickwork-owned
.bw-marketing-header__brand-mark element (#83, the
app shell's brickwork#93 wrapper precedent): an
img/svg dropped in is capped at
--bw-component-logo-height (2rem) with width following
the intrinsic ratio, and the wrapper stays
flex: 0 0 auto so the nav/actions keep the remaining
width. Override the token (or the zero-specificity
rule) to resize; an unfilled block leaves an :empty
wrapper that collapses to nothing.
brand_wordmark wrapped in .bw-marketing-header__brand-wordmark, the
same treatment as brand_logo (a text wordmark is
unaffected: the height cap targets only img/svg).
marketing_nav the primary public nav: a plain list of links, no
active-route resolver dependency (a marketing site's
nav is a small fixed set, unlike the app shell's
{% bw_nav %}).
marketing_actions header-end CTA cluster (e.g. "Sign in" + "Get started");
see the auth-aware pattern below (#85).
content the page body; the one region a page fills. Direct
children still receive the legacy marketing measure
via `.bw-marketing__content > *`. New custom bands
should use `.bw-section` / `.bw-section__inner`
(ADR-057 Phase A / #667; see `_section.html` and
INTEGRATION section 13) so atmosphere can run edge to
edge without a site-owned inner rail.
marketing_footer empty consumer-owned footer-content slot. The shell
supplies its footer landmark and inner container, but
never link groups, columns, or site-map copy.
footer_legal empty consumer-owned fine-print slot beneath the
footer-content slot; its wrapper collapses when empty.
Region blocks (3.15.0, icvoss/django-brickwork#263, the app shell's
subnav_region/breadcrumbs_region/page_header_region/footer_region idiom at
BR-BW-TPL-001 extended here): a `*_region` block wraps the ELEMENT around an
inner content block, as a second, outer override seam. Filling only the
inner block (marketing_nav, marketing_actions, marketing_footer) is
unaffected: the markup is unchanged, and the rendered output differs only by
the whitespace-only lines the wrapper tags leave behind (identical once
whitespace is collapsed, which is what a consumer's own snapshot test should
compare on); overriding the `_region` block
instead replaces the wrapper element itself (e.g. to add attributes the
wrapper does not carry); overriding a `_region` block EMPTY removes the
region and its chrome entirely, which the inner-block-only seam can never do
since the wrapper element still renders around an empty inner block. This is
the seam #263 needed: a consumer adding a mobile-nav toggle as a sibling of
the nav overrides marketing_nav_region (or marketing_actions_region) to
insert the toggle alongside the existing