🐾 {{ app_name }}
{% if not anon %}
{#- Grouped menus (templating.nav_groups). One markup, two layouts: dropdowns in the header
on a wide screen, a tab bar at the foot of a phone whose menus open as a sheet above
it. keeps one open at a time; app.js closes it on an outside tap. -#}
{% if pup_chip %}{{ pup_chip.text }}{% if pup_chip.moving %}🧳 moving{% endif %}{% endif %}
{% if safeword_paused %}🛑 paused{% endif %}
{% if event %}{{ event.sign }} {{ event.day }}/{{ event.days }}{% endif %}
{% endif %}
{#- A refused form's own values (web/kept.py). DATA, not a script: app.js reads it and
refills the form it came from. Nothing in it is new to this browser — it is what the
pup just sent. -#}
{% if kept %}{% endif %}
{% if beta_due %}
{{ beta_due.icon }} Beta: the {{ beta_due.title }} survey is ready for you — five minutes, {{ beta_due.when }}. Take it →
{% endif %}
{% block body %}{% endblock %}
{# no /docs link: Swagger is off because its page fetches swagger-ui from a CDN #}
{#- 🔴 COMPUTED, never a constant: `footer_egress` is the list of modules reaching the network
right now (Module.egress_active). It used to read "local only" while a calendar feed was
being fetched every half hour. None = could not be established, and then it claims
nothing either way. A reserved name, set by render() alone: a page's own `egress` is
something else (see templating.render). -#}
{% block scripts %}{% endblock %}