{% extends "base.html" %} {% block title %}{{ sides.a.rel }} · {{ sides.b.rel }} · compare · {{ name }} · The Booth{% endblock %} {# data-booth: without it Reveal all's script and the head script's reveal restore both bail (r3 C6). #} {% block html_attrs %} data-booth="{{ name }}"{% endblock %} {# COMPARE (R3). Two items of the review ring side by side, one judgment each: flag the winner. The pair is two rels in the URL, always (INV-1); the active side and the linked stepping ride the URL as view state. Everything a mark can change is a `data-region` keyed by SIDE, never by rel (`a == b` would duplicate it) and never `item-` (the swap reads that as a stale tile). THE STAGES NEVER ARE: swapping one would restart a playing track. The root carries `review` so the review's blur, 1:1 and Reveal-all rules apply unchanged; `.compare` overrides its grid. #} {% macro num(n) -%}#{{ "%0*d"|format(ord_width, n) }}{%- endmacro %} {% block content %}
✕ compare {{ num(sides.a.ordinal) }} · {{ num(sides.b.ordinal) }} ‹‹ ›› {# JS-only, like the stage toggle: without JS there are no keys to link, and the per-side and both-sides links above step either way. #} {% if any_image %} {% endif %} {% if film | selectattr('blurred') | list %}{% endif %}
{% for key in ('a', 'b') %}{% set s = sides[key] %}{% set L = key | upper %}
‹
{{ L }} {{ num(s.ordinal) }} {{ s.rel }}{% if s.flagged %} ✔ flagged{% endif %}
› review {{ L }}
{% if s.kind == 'image' %}{{ s.rel }} {% elif s.kind == 'video' %} {% else %} {% endif %}
{# Over the stage, never inside its scrolled content; JS-only, so `hidden` until bound (the review's pattern). #} {% if s.blurred %}{% endif %}
{% if s.caption %}
{{ s.caption }}
{% endif %}
{% endfor %}
← → Space step · A B flag · X side · L link · Z Fit/1:1 · Esc review
{# THE FILMSTRIP IS THE PICKER: the review ring in ring order. Without JS a frame is a link that replaces the active side from the URL (B by default); with JS a click replaces the side that is active NOW. #}
{% include "_stage_js.html" %} {% endblock %}