{# Follow the OS appearance. The matching theme-color keeps the iOS status
bar / Android chrome in step with the rendered background. #}
{% block title %}ARGOS{% endblock %}
{# ?v= is a hash of the CSS/JS bundle: a changed file is a new URL, so no
HTTP or service-worker cache can keep serving the old copy. #}
{% set path = request.url.path %}
{% set on_feed = path == '/feed' or path.startswith('/feed/') or path.startswith('/event/') or path.startswith('/item/') %}
{% set on_portfolio = path == '/portfolio' or path.startswith('/portfolio/') %}
{% set on_settings = path == '/settings' %}
{# A detail page opened from the portfolio belongs to the portfolio tab. #}
{% if back_to | default('') == 'portfolio' %}{% set on_feed = false %}{% set on_portfolio = true %}{% endif %}
{# Symbol-style glyphs, drawn once and reused by both navs. #}
{% macro icon(name) -%}
{%- endmacro %}
{# Desktop navigation — a translucent sidebar (≥768px). On mobile it is
hidden in favour of the top bar + bottom tab bar below. #}
{# Mobile top bar (<768px) — a translucent material content scrolls under. #}
ARGOS
Observatory
{% block content %}{% endblock %}
{# Mobile bottom tab bar (<768px). #}
{# Not deferred: pagereveal must be listened for before the first frame.
At the end of the cards already exist when it runs. No
render-blocking is used to guarantee that — holding the first frame until
the whole list arrived made every navigation wait on the network; if the
page paints first, the back-morph simply degrades to a crossfade. #}
{# ARG-207: Impression (feed) + Dwell (detail) collection. Not precached in
sw.js's APP_SHELL on purpose — a plain runtime network load is enough and
avoids bumping CACHE_VERSION here (see sw.js comment). #}