{% extends "core/base.html" %} {% load static tooltip_tags %} {% block title_text %}Gameboard{% endblock title_text %} {# Two-word reel: GAME ROOM rests in view; GAME SCROLL is parked just below #} {# in the title slot's bottom fade. room-scroll.js toggles `.is-scroll` on #} {# the

when the table-hex aperture snaps to the provenance feed, and #} {# the CSS reel slides ROOM up & out / SCROLL up & in (reverses on scroll- #} {# up). The window span carries `data-letters-split` so base.html's letter- #} {# splitter skips it and splits the two inner `.gr-word`s instead. Only in #} {# the table phase (a scroll exists to reveal); the gate phase stays plain. #} {% block header_text %}Game{% if room.table_status %}roomscroll{% else %}room{% endif %}{% endblock header_text %} {% block content %}
{# Table-hex aperture — a binary scroll-snap viewport (mirrors my_sky's #} {# wheel<->form swap): the hex pane is the default view; from Role #} {# Select onwards a 2nd pane holds the room's provenance feed, revealed #} {# by scrolling DOWN. `is-scrollable` engages scroll-snap (2 panes), so #} {# the hex content is replaced entirely by the Scroll (no partial scroll #} {# — `scroll-snap-stop: always`). DRY seam: my_sea reuses _room_scroll. #}
{# SCAN SIGS advances the whole table past role-select — gated on #} {# the viewer's token cost being current (a lapsed gamer gets GATE #} {# VIEW in the center instead; only their own ROLE pick survives). #} {% if room.table_status == "ROLE_SELECT" and viewer_cost_current %} {% endif %}
{# ROLE card-stack — the gamer's own role pick stays #} {# available even when their token cost has lapsed #} {# (deposit-privilege grace, 7d), so it renders OUTSIDE #} {# the cost gate below. #} {% if room.table_status == "ROLE_SELECT" and card_stack_state %}
{% if card_stack_state == "ineligible" %} {% endif %}
{% endif %} {% if not viewer_cost_current %} {# Token cost lapsed → GATE VIEW supersedes SCAN SIGS #} {# / CAST SKY / DRAW SEA / the sig waiting msg. The #} {# gamer keeps their seat through the renewal grace; #} {# GATE VIEW routes to the renewal gate-view. Only #} {# the ROLE pick (above) survives. ` {% else %} {% if room.table_status == "SKY_SELECT" %} {% if sky_confirmed %} {% else %} {% endif %} {% elif room.table_status == "SIG_SELECT" %} {% if polarity_done %}

{% if user_polarity == "levity" %}Gravity settling . . .{% else %}Levity appraising . . .{% endif %}

{% endif %} {% endif %} {% endif %}
{# Seats — fa-chair layout persists from ROLE_SELECT through SIG_SELECT #} {% for pos in gate_positions %}
{{ pos.role_label }} {% if pos.role_label in starter_roles %} {% else %} {% endif %}
{% endfor %}
{# /.room-shell #} {# Position circles scroll away WITH the hex (they live inside the hex #} {# pane, not at room-page root). Neither the aperture nor the pane sets #} {# z-index/transform, so the strip's z-130 still resolves in the root #} {# stacking context — above the gate/sig overlays — as before. #} {% if room.gate_status != "RENEWAL_DUE" and room.table_status != "SIG_SELECT" %} {% include "apps/gameboard/_partials/_table_positions.html" %} {% endif %}
{# /.room-hex-pane #} {% if room.table_status %}
{% include "apps/gameboard/_partials/_room_scroll.html" %}
{% endif %}
{# /.room-aperture #} {# Phase overlays are gated on `viewer_cost_current` too: a lapsed gamer #} {# gets GATE VIEW in the center, so the SIG/SKY/SEA modals (which embed #} {# their trigger-btn ids in JS) must not render alongside it. #} {# Sig Select overlay — suppressed once this gamer's polarity sigs are assigned #} {% if room.table_status == "SIG_SELECT" and user_polarity and not polarity_done and viewer_cost_current %} {% include "apps/gameboard/_partials/_sig_select_overlay.html" %} {% endif %} {# Sky (Pick Sky) overlay — natal chart entry #} {% if room.table_status == "SKY_SELECT" and not sky_confirmed and viewer_cost_current %} {% include "apps/gameboard/_partials/_sky_overlay.html" %} {% endif %} {# Sky tooltip: sibling of .sky-overlay, not inside .sky-modal-wrap (which has transform) #} {% if room.table_status == "SKY_SELECT" and not sky_confirmed and viewer_cost_current %} {% endif %} {# Sea (Pick Sea) overlay — Celtic Cross spread entry #} {% if room.table_status == "SKY_SELECT" and sky_confirmed and viewer_cost_current %} {% include "apps/gameboard/_partials/_sea_overlay.html" %} {% endif %} {# Gamer-needed stub — a seat lapsed past its renewal grace and was #} {# auto-BYE'd, so the table no longer fills all six. Minimal stub #} {# until the mid-game re-seat flow lands (_table_positions + #} {# _gatekeeper are already suppressed for RENEWAL_DUE below). #} {% if room.gate_status == "RENEWAL_DUE" %}

A seat opened — awaiting a gamer.

{% endif %} {% if not room.table_status and room.gate_status != "RENEWAL_DUE" %} {% include "apps/gameboard/_partials/_gatekeeper.html" %} {# Owner-only invite affordance: handshake btn at the upper-right #} {# of the right sidebar w. slide-out + autocomplete. Replaces the #} {# legacy inline `
` panel. #} {% if request.user == room.owner %} {% include "apps/billboard/_partials/_bud_invite_panel.html" %} {% endif %} {% endif %} {% if room.table_status %}
{% endif %} {% comment %} Tray-tooltip portal — sibling of the tray so it sits at room-page root, not inside the tray's overflow:hidden / mask-image clip. JS populates innerHTML on hover of .tray-role-card > img (and Phase 2: sig card). {% endcomment %} {% if room.table_status %} {% endif %} {# Position-circle tooltip portal — rendered whenever the circles can #} {# (gatekeeper + role-select; the SIG_SELECT phase hides the strip). #} {% include "apps/gameboard/_partials/_position_tooltip.html" %} {# scroll_filter (table phase only) adds the Frame/Redact gear pane that #} {# room-scroll.js swaps in when the aperture is scrolled to the feed. #} {% include "apps/gameboard/_partials/_room_gear.html" with scroll_filter=room.table_status %} {% include "apps/gameboard/_partials/_burger.html" %}
{% endblock content %} {% block scripts %} {# Brief module — needed by _bud_invite_panel's OK handler so the #} {# slide-down banner shows up on a successful gatekeeper invite. #} {% endblock scripts %}