{% 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.
Shared site chrome (ADR-113 / BR-BW-TPL-008): the default header and footer
mirror brickwork/components/_site_header.html and _site_footer.html and emit
.bw-site-* only (the 3.37 dual-class marketing aliases closed in 4.0.0).
Docs must use the shared includes with .bw-site-* only. Django {% include %}
cannot expose named blocks to pages that extend this shell, so the block
seams below stay here while the markup mirrors the shared includes.
Named blocks (semver-public, BR-BW-TPL-001), all empty-graceful:
marketing_header_modifiers
empty by default. Set to bw-site-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-site-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-site-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 %}). Menu-driven rows should use
{% bw_nav_header %} (ADR-113).
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