{% load lyric_extras %} {# Gate-position circles (1–6). Each carries a `.tt-pos-*` state class + #} {# `data-tt-*` payload (sprint 2026-06-02) that position-tooltip.js reads on #} {# hover to fill #id_position_tooltip_portal — @handle / title / seat-sig / #} {# bud shoptalk / #tokens / seat-clock expiry. NB: the `.tt-pos-*` class is #} {# appended AFTER `role-assigned` so the `gate-slot filled role-assigned` #} {# substring (RoleSelectRenderingTest) stays intact, and `class` stays first #} {# (before data-slot) for the class-attr regex IT. #}
{% for pos in gate_positions %}
{{ pos.slot.slot_number }} {% if pos.slot.gamer %}{{ pos.slot.gamer|at_handle }}{% else %}empty{% endif %} {% if pos.is_me_also %} {# CARTE: the viewer's own seat they aren't currently acting #} {# as — a switch href loads that seat's view (?seat=N). #} {% endif %} {% if pos.slot.status == 'RESERVED' and pos.slot.gamer == request.user %}
{% csrf_token %} {% if is_last_slot %} {% else %} {% endif %}
{% elif carte_active and pos.slot.status == 'EMPTY' and pos.slot.slot_number == carte_next_slot_number %}
{% csrf_token %}
{% elif carte_active and pos.slot.status == 'FILLED' and pos.slot.slot_number == carte_nvm_slot_number %}
{% csrf_token %}
{% endif %}
{% endfor %}