2026-04-26 21:30:27 -04:00
|
|
|
{% load static %}
|
|
|
|
|
{# PICK SEA overlay — Celtic Cross spread entry #}
|
|
|
|
|
{# Included in room.html when table_status == "SKY_SELECT" and sky_confirmed #}
|
|
|
|
|
{# Layout is the reverse of PICK SKY: cards left (transparent), form right #}
|
|
|
|
|
|
|
|
|
|
<div class="sea-backdrop"></div>
|
2026-04-28 23:02:49 -04:00
|
|
|
<div class="sea-overlay" id="id_sea_overlay"
|
PICK SEA Sprint C: sea stage card viewer — FLIP in, SPIN/FYI, deposit/re-expand — TDD
- sea.js: SeaDeal module — openStage() shows big card viewer w. flip-in animation;
SPIN toggles stage-card--reversed; FYI shows energies/operations (Energy/Operation
titles, PRV/NXT nav); backdrop click deposits card to slot; click deposited slot
re-opens stage; resetHand() clears hand on DEL
- sea_deck view: adds name_group/name_title/reversal/keywords_upright/keywords_reversed/
energies/operations to each card dict (full sig-select stage data set)
- _sea_overlay.html: data-sea-user-polarity attr; sea stage HTML (sig-stage-card shell
+ fan-card-face-upright/reversal structure + sea-stat-block w. SPIN/FYI/PRV/NXT);
FLIP click calls SeaDeal.openStage(); _fillPos removed (sea.js handles slot fill);
_reset calls SeaDeal.resetHand()
- room.html: sea.js included alongside sig-select.js
- _card-deck.scss: sea-stage layout (fixed overlay, backdrop, content row); sea-stage-card
w. @keyframes sea-flip-in (3D rotateY perspective); sea-stat-block scoped styles
incl. SPIN/FYI btns, stat faces, sig-info FYI panel
- SeaDealSpec.js: 20 Jasmine specs — openStage, SPIN, FYI, backdrop dismiss, slot re-expand
Code architected by Disco DeDisco <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 01:12:06 -04:00
|
|
|
data-sea-deck-url="{% url 'epic:sea_deck' room.id %}"
|
|
|
|
|
data-sea-user-polarity="{{ user_polarity }}">
|
2026-04-26 21:30:27 -04:00
|
|
|
|
|
|
|
|
<div class="sea-modal-wrap">
|
|
|
|
|
<div class="sea-modal">
|
|
|
|
|
|
|
|
|
|
<header class="sea-modal-header">
|
2026-05-08 15:49:58 -04:00
|
|
|
<h2>SEA <span>SELECT</span></h2>
|
2026-05-01 02:06:55 -04:00
|
|
|
<p>Draw +6 cards to describe your character's influences and seed the map.</p>
|
2026-04-26 21:30:27 -04:00
|
|
|
</header>
|
|
|
|
|
|
|
|
|
|
<div class="sea-modal-body">
|
|
|
|
|
|
|
|
|
|
{# ── Cards column (transparent) ───────────────────────────── #}
|
|
|
|
|
<div class="sea-cards-col">
|
|
|
|
|
<div class="sea-cross">
|
2026-04-28 23:02:49 -04:00
|
|
|
{# Crown — CC pos 3 / EV pos 5 #}
|
2026-04-29 14:19:30 -04:00
|
|
|
<div class="sea-crucifix-cell sea-pos-crown">
|
2026-04-26 21:30:27 -04:00
|
|
|
<div class="sea-card-slot sea-card-slot--empty"></div>
|
|
|
|
|
</div>
|
2026-04-28 23:02:49 -04:00
|
|
|
{# Beneath (past) — CC pos 4 / EV pos 3 #}
|
2026-04-29 14:19:30 -04:00
|
|
|
<div class="sea-crucifix-cell sea-pos-leave">
|
2026-04-26 21:30:27 -04:00
|
|
|
<div class="sea-card-slot sea-card-slot--empty"></div>
|
|
|
|
|
</div>
|
2026-04-28 23:02:49 -04:00
|
|
|
{# Center — Significator (always placed) + Cover + Cross overlaid #}
|
2026-04-29 14:19:30 -04:00
|
|
|
<div class="sea-crucifix-cell sea-pos-core">
|
2026-04-28 23:30:07 -04:00
|
|
|
<div class="sig-stage-card sea-sig-card" style="--sig-card-w: 4rem">
|
2026-04-26 21:30:27 -04:00
|
|
|
{% if my_tray_sig %}
|
2026-04-28 23:30:07 -04:00
|
|
|
<span class="fan-corner-rank">{{ my_tray_sig.corner_rank }}</span>
|
|
|
|
|
{% if my_tray_sig.suit_icon %}<i class="fa-solid {{ my_tray_sig.suit_icon }}"></i>{% endif %}
|
2026-04-26 21:30:27 -04:00
|
|
|
{% endif %}
|
|
|
|
|
</div>
|
2026-04-28 23:02:49 -04:00
|
|
|
{# Cover — CC/EV pos 1, stacked face-up on Sig #}
|
|
|
|
|
<div class="sea-pos-cover">
|
|
|
|
|
<div class="sea-card-slot sea-card-slot--empty"></div>
|
|
|
|
|
</div>
|
|
|
|
|
{# Cross — CC/EV pos 2, rotated 90° on Cover #}
|
|
|
|
|
<div class="sea-pos-cross">
|
|
|
|
|
<div class="sea-card-slot sea-card-slot--empty sea-card-slot--crossing"></div>
|
|
|
|
|
</div>
|
2026-04-26 21:30:27 -04:00
|
|
|
</div>
|
2026-04-28 23:02:49 -04:00
|
|
|
{# Before (future) — CC pos 5 / EV pos 6 #}
|
2026-04-29 14:19:30 -04:00
|
|
|
<div class="sea-crucifix-cell sea-pos-loom">
|
2026-04-26 21:30:27 -04:00
|
|
|
<div class="sea-card-slot sea-card-slot--empty"></div>
|
|
|
|
|
</div>
|
2026-04-28 23:02:49 -04:00
|
|
|
{# Behind (root) — CC pos 6 / EV pos 4 #}
|
2026-04-29 14:19:30 -04:00
|
|
|
<div class="sea-crucifix-cell sea-pos-lay">
|
2026-04-26 21:30:27 -04:00
|
|
|
<div class="sea-card-slot sea-card-slot--empty"></div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{# ── Form column (priUser / opaque) ───────────────────────── #}
|
|
|
|
|
<div class="sea-form-col">
|
|
|
|
|
|
|
|
|
|
<div class="sea-form-main">
|
|
|
|
|
<div class="sea-field">
|
2026-04-30 21:01:52 -04:00
|
|
|
<label for="id_sea_spread" id="id_sea_spread_label">Spread</label>
|
2026-05-01 00:11:40 -04:00
|
|
|
{% comment %}
|
|
|
|
|
Reversal-rate hint — `stack_reversal_pct` flows from
|
|
|
|
|
apps.epic.utils.stack_reversal_probability via the
|
|
|
|
|
view. Currently a module default; placeholder UI for
|
|
|
|
|
a forthcoming per-user setting.
|
|
|
|
|
{% endcomment %}
|
|
|
|
|
<p class="sea-reversal-hint">{{ stack_reversal_pct|default:25 }}% reversals</p>
|
2026-04-30 21:01:52 -04:00
|
|
|
{% comment %}
|
|
|
|
|
Custom combobox — native <select> dropdowns ignore most CSS on
|
|
|
|
|
Firefox/Chrome (OS-rendered list); this gives full styling control.
|
|
|
|
|
combobox.js wires up the keyboard nav, click-outside-to-close, and
|
|
|
|
|
writes the chosen value to the hidden <input id="id_sea_spread"> so
|
|
|
|
|
sea.js's existing `spreadSel.value` read still works.
|
|
|
|
|
{% endcomment %}
|
|
|
|
|
<input type="hidden" id="id_sea_spread" name="spread"
|
|
|
|
|
value="{% if user_polarity == 'levity' %}waite-smith{% else %}escape-velocity{% endif %}">
|
|
|
|
|
<div class="sea-select"
|
|
|
|
|
data-combobox
|
|
|
|
|
data-combobox-target="id_sea_spread"
|
|
|
|
|
role="combobox"
|
|
|
|
|
aria-expanded="false"
|
|
|
|
|
aria-haspopup="listbox"
|
|
|
|
|
aria-labelledby="id_sea_spread_label"
|
|
|
|
|
tabindex="0">
|
|
|
|
|
<span class="sea-select-current">{% if user_polarity == "levity" %}Celtic Cross, Waite-Smith{% else %}Celtic Cross, Escape Velocity{% endif %}</span>
|
|
|
|
|
<span class="sea-select-arrow" aria-hidden="true">▾</span>
|
|
|
|
|
<ul class="sea-select-list" role="listbox">
|
|
|
|
|
{% if user_polarity == "levity" %}
|
|
|
|
|
<li role="option" data-value="waite-smith" aria-selected="true">Celtic Cross, Waite-Smith</li>
|
|
|
|
|
<li role="option" data-value="escape-velocity" aria-selected="false">Celtic Cross, Escape Velocity</li>
|
|
|
|
|
{% else %}
|
|
|
|
|
<li role="option" data-value="escape-velocity" aria-selected="true">Celtic Cross, Escape Velocity</li>
|
|
|
|
|
<li role="option" data-value="waite-smith" aria-selected="false">Celtic Cross, Waite-Smith</li>
|
|
|
|
|
{% endif %}
|
|
|
|
|
</ul>
|
|
|
|
|
</div>
|
2026-04-26 21:30:27 -04:00
|
|
|
</div>
|
2026-04-28 23:02:49 -04:00
|
|
|
|
|
|
|
|
{# Two face-down deck piles — tap to proffer OK #}
|
|
|
|
|
<div class="sea-stacks">
|
2026-04-28 23:30:07 -04:00
|
|
|
<span class="sea-stacks-label">DECKS</span>
|
2026-04-28 23:02:49 -04:00
|
|
|
<div class="sea-deck-stack sea-deck-stack--gravity">
|
2026-04-28 23:30:07 -04:00
|
|
|
<div class="sea-stack-face">
|
PICK SEA Sprint C: sea stage card viewer — FLIP in, SPIN/FYI, deposit/re-expand — TDD
- sea.js: SeaDeal module — openStage() shows big card viewer w. flip-in animation;
SPIN toggles stage-card--reversed; FYI shows energies/operations (Energy/Operation
titles, PRV/NXT nav); backdrop click deposits card to slot; click deposited slot
re-opens stage; resetHand() clears hand on DEL
- sea_deck view: adds name_group/name_title/reversal/keywords_upright/keywords_reversed/
energies/operations to each card dict (full sig-select stage data set)
- _sea_overlay.html: data-sea-user-polarity attr; sea stage HTML (sig-stage-card shell
+ fan-card-face-upright/reversal structure + sea-stat-block w. SPIN/FYI/PRV/NXT);
FLIP click calls SeaDeal.openStage(); _fillPos removed (sea.js handles slot fill);
_reset calls SeaDeal.resetHand()
- room.html: sea.js included alongside sig-select.js
- _card-deck.scss: sea-stage layout (fixed overlay, backdrop, content row); sea-stage-card
w. @keyframes sea-flip-in (3D rotateY perspective); sea-stat-block scoped styles
incl. SPIN/FYI btns, stat faces, sig-info FYI panel
- SeaDealSpec.js: 20 Jasmine specs — openStage, SPIN, FYI, backdrop dismiss, slot re-expand
Code architected by Disco DeDisco <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 01:12:06 -04:00
|
|
|
<button class="btn btn-reveal sea-stack-ok" type="button">FLIP</button>
|
2026-04-28 23:30:07 -04:00
|
|
|
</div>
|
|
|
|
|
<span class="sea-stack-name">Gravity</span>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="sea-deck-stack sea-deck-stack--levity">
|
|
|
|
|
<div class="sea-stack-face">
|
PICK SEA Sprint C: sea stage card viewer — FLIP in, SPIN/FYI, deposit/re-expand — TDD
- sea.js: SeaDeal module — openStage() shows big card viewer w. flip-in animation;
SPIN toggles stage-card--reversed; FYI shows energies/operations (Energy/Operation
titles, PRV/NXT nav); backdrop click deposits card to slot; click deposited slot
re-opens stage; resetHand() clears hand on DEL
- sea_deck view: adds name_group/name_title/reversal/keywords_upright/keywords_reversed/
energies/operations to each card dict (full sig-select stage data set)
- _sea_overlay.html: data-sea-user-polarity attr; sea stage HTML (sig-stage-card shell
+ fan-card-face-upright/reversal structure + sea-stat-block w. SPIN/FYI/PRV/NXT);
FLIP click calls SeaDeal.openStage(); _fillPos removed (sea.js handles slot fill);
_reset calls SeaDeal.resetHand()
- room.html: sea.js included alongside sig-select.js
- _card-deck.scss: sea-stage layout (fixed overlay, backdrop, content row); sea-stage-card
w. @keyframes sea-flip-in (3D rotateY perspective); sea-stat-block scoped styles
incl. SPIN/FYI btns, stat faces, sig-info FYI panel
- SeaDealSpec.js: 20 Jasmine specs — openStage, SPIN, FYI, backdrop dismiss, slot re-expand
Code architected by Disco DeDisco <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 01:12:06 -04:00
|
|
|
<button class="btn btn-reveal sea-stack-ok" type="button">FLIP</button>
|
2026-04-28 23:30:07 -04:00
|
|
|
</div>
|
|
|
|
|
<span class="sea-stack-name">Levity</span>
|
2026-04-28 23:02:49 -04:00
|
|
|
</div>
|
|
|
|
|
</div>
|
2026-04-26 21:30:27 -04:00
|
|
|
</div>
|
|
|
|
|
|
2026-04-28 23:02:49 -04:00
|
|
|
<div class="sea-form-actions">
|
|
|
|
|
<button type="button" id="id_sea_lock_hand" class="btn btn-primary" disabled>
|
|
|
|
|
LOCK HAND
|
|
|
|
|
</button>
|
|
|
|
|
<button type="button" id="id_sea_del" class="btn btn-danger">
|
|
|
|
|
DEL
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
2026-04-26 21:30:27 -04:00
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
</div>{# /.sea-modal-body #}
|
|
|
|
|
|
|
|
|
|
</div>{# /.sea-modal #}
|
|
|
|
|
|
|
|
|
|
<button type="button" id="id_sea_cancel" class="btn btn-cancel btn-sm">NVM</button>
|
|
|
|
|
|
|
|
|
|
</div>{# /.sea-modal-wrap #}
|
PICK SEA Sprint C: sea stage card viewer — FLIP in, SPIN/FYI, deposit/re-expand — TDD
- sea.js: SeaDeal module — openStage() shows big card viewer w. flip-in animation;
SPIN toggles stage-card--reversed; FYI shows energies/operations (Energy/Operation
titles, PRV/NXT nav); backdrop click deposits card to slot; click deposited slot
re-opens stage; resetHand() clears hand on DEL
- sea_deck view: adds name_group/name_title/reversal/keywords_upright/keywords_reversed/
energies/operations to each card dict (full sig-select stage data set)
- _sea_overlay.html: data-sea-user-polarity attr; sea stage HTML (sig-stage-card shell
+ fan-card-face-upright/reversal structure + sea-stat-block w. SPIN/FYI/PRV/NXT);
FLIP click calls SeaDeal.openStage(); _fillPos removed (sea.js handles slot fill);
_reset calls SeaDeal.resetHand()
- room.html: sea.js included alongside sig-select.js
- _card-deck.scss: sea-stage layout (fixed overlay, backdrop, content row); sea-stage-card
w. @keyframes sea-flip-in (3D rotateY perspective); sea-stat-block scoped styles
incl. SPIN/FYI btns, stat faces, sig-info FYI panel
- SeaDealSpec.js: 20 Jasmine specs — openStage, SPIN, FYI, backdrop dismiss, slot re-expand
Code architected by Disco DeDisco <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 01:12:06 -04:00
|
|
|
|
|
|
|
|
{# ── Sea stage — big card viewer ─────────────────────────────────────────── #}
|
|
|
|
|
<div class="sea-stage" id="id_sea_stage" style="display:none">
|
|
|
|
|
<div class="sea-stage-backdrop"></div>
|
2026-04-30 21:51:23 -04:00
|
|
|
<div class="sea-stage-content">
|
2026-04-30 21:01:52 -04:00
|
|
|
<div class="sig-stage-card sea-stage-card">
|
PICK SEA Sprint C: sea stage card viewer — FLIP in, SPIN/FYI, deposit/re-expand — TDD
- sea.js: SeaDeal module — openStage() shows big card viewer w. flip-in animation;
SPIN toggles stage-card--reversed; FYI shows energies/operations (Energy/Operation
titles, PRV/NXT nav); backdrop click deposits card to slot; click deposited slot
re-opens stage; resetHand() clears hand on DEL
- sea_deck view: adds name_group/name_title/reversal/keywords_upright/keywords_reversed/
energies/operations to each card dict (full sig-select stage data set)
- _sea_overlay.html: data-sea-user-polarity attr; sea stage HTML (sig-stage-card shell
+ fan-card-face-upright/reversal structure + sea-stat-block w. SPIN/FYI/PRV/NXT);
FLIP click calls SeaDeal.openStage(); _fillPos removed (sea.js handles slot fill);
_reset calls SeaDeal.resetHand()
- room.html: sea.js included alongside sig-select.js
- _card-deck.scss: sea-stage layout (fixed overlay, backdrop, content row); sea-stage-card
w. @keyframes sea-flip-in (3D rotateY perspective); sea-stat-block scoped styles
incl. SPIN/FYI btns, stat faces, sig-info FYI panel
- SeaDealSpec.js: 20 Jasmine specs — openStage, SPIN, FYI, backdrop dismiss, slot re-expand
Code architected by Disco DeDisco <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 01:12:06 -04:00
|
|
|
<div class="fan-card-corner fan-card-corner--tl">
|
|
|
|
|
<span class="fan-corner-rank"></span>
|
|
|
|
|
<i class="fa-solid stage-suit-icon" style="display:none"></i>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="fan-card-face">
|
|
|
|
|
<div class="fan-card-face-upright">
|
|
|
|
|
<p class="fan-card-name-group"></p>
|
|
|
|
|
<p class="sig-qualifier-above"></p>
|
2026-05-01 02:06:55 -04:00
|
|
|
<p class="fan-card-name"></p>
|
PICK SEA Sprint C: sea stage card viewer — FLIP in, SPIN/FYI, deposit/re-expand — TDD
- sea.js: SeaDeal module — openStage() shows big card viewer w. flip-in animation;
SPIN toggles stage-card--reversed; FYI shows energies/operations (Energy/Operation
titles, PRV/NXT nav); backdrop click deposits card to slot; click deposited slot
re-opens stage; resetHand() clears hand on DEL
- sea_deck view: adds name_group/name_title/reversal/keywords_upright/keywords_reversed/
energies/operations to each card dict (full sig-select stage data set)
- _sea_overlay.html: data-sea-user-polarity attr; sea stage HTML (sig-stage-card shell
+ fan-card-face-upright/reversal structure + sea-stat-block w. SPIN/FYI/PRV/NXT);
FLIP click calls SeaDeal.openStage(); _fillPos removed (sea.js handles slot fill);
_reset calls SeaDeal.resetHand()
- room.html: sea.js included alongside sig-select.js
- _card-deck.scss: sea-stage layout (fixed overlay, backdrop, content row); sea-stage-card
w. @keyframes sea-flip-in (3D rotateY perspective); sea-stat-block scoped styles
incl. SPIN/FYI btns, stat faces, sig-info FYI panel
- SeaDealSpec.js: 20 Jasmine specs — openStage, SPIN, FYI, backdrop dismiss, slot re-expand
Code architected by Disco DeDisco <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 01:12:06 -04:00
|
|
|
<p class="sig-qualifier-below"></p>
|
|
|
|
|
</div>
|
|
|
|
|
<p class="fan-card-arcana"></p>
|
|
|
|
|
<div class="fan-card-face-reversal">
|
|
|
|
|
<p class="fan-card-reversal-name"></p>
|
|
|
|
|
<p class="fan-card-reversal-qualifier"></p>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="fan-card-corner fan-card-corner--br">
|
|
|
|
|
<span class="fan-corner-rank"></span>
|
|
|
|
|
<i class="fa-solid stage-suit-icon" style="display:none"></i>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="sig-stat-block sea-stat-block">
|
2026-04-30 21:01:52 -04:00
|
|
|
<button class="btn btn-reverse spin-btn" type="button">SPIN</button>
|
|
|
|
|
<button class="btn btn-info fyi-btn" type="button">FYI</button>
|
PICK SEA Sprint C: sea stage card viewer — FLIP in, SPIN/FYI, deposit/re-expand — TDD
- sea.js: SeaDeal module — openStage() shows big card viewer w. flip-in animation;
SPIN toggles stage-card--reversed; FYI shows energies/operations (Energy/Operation
titles, PRV/NXT nav); backdrop click deposits card to slot; click deposited slot
re-opens stage; resetHand() clears hand on DEL
- sea_deck view: adds name_group/name_title/reversal/keywords_upright/keywords_reversed/
energies/operations to each card dict (full sig-select stage data set)
- _sea_overlay.html: data-sea-user-polarity attr; sea stage HTML (sig-stage-card shell
+ fan-card-face-upright/reversal structure + sea-stat-block w. SPIN/FYI/PRV/NXT);
FLIP click calls SeaDeal.openStage(); _fillPos removed (sea.js handles slot fill);
_reset calls SeaDeal.resetHand()
- room.html: sea.js included alongside sig-select.js
- _card-deck.scss: sea-stage layout (fixed overlay, backdrop, content row); sea-stage-card
w. @keyframes sea-flip-in (3D rotateY perspective); sea-stat-block scoped styles
incl. SPIN/FYI btns, stat faces, sig-info FYI panel
- SeaDealSpec.js: 20 Jasmine specs — openStage, SPIN, FYI, backdrop dismiss, slot re-expand
Code architected by Disco DeDisco <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 01:12:06 -04:00
|
|
|
<div class="stat-face stat-face--upright">
|
|
|
|
|
<p class="stat-face-label">Emanation</p>
|
|
|
|
|
<ul class="stat-keywords" id="id_sea_stat_upright"></ul>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="stat-face stat-face--reversed">
|
|
|
|
|
<p class="stat-face-label">Reversal</p>
|
|
|
|
|
<ul class="stat-keywords" id="id_sea_stat_reversed"></ul>
|
|
|
|
|
</div>
|
tray sig-card tooltip: portal w. PRV|NXT pager — TDD
Phase 2 of the apps.tooltips integration on the tray. Hovering
.tray-sig-card > .sig-stage-card opens #id_tooltip_portal w. an FYI panel
that mirrors #id_fan_fyi_panel (Energy / Operation entries cycled via
PRV|NXT), but w.o. the stage block, w.o. Reversal entries, & w.o. the fan
stage's click-to-dismiss handler — the panel-body click is reserved for
future drag-and-drop on .tray-sig-card:active.
- _partials/_sig_fyi_panel.html — new partial, the .sig-info + PRV|NXT
block extracted out of game_kit.html, _sig_select_overlay.html, &
_sea_overlay.html. {% include %}d back from those 3 callers; pure
copy-paste extraction (no behavioural change to fan stage, sig select,
or sea select).
- room.html: .tray-sig-card > .sig-stage-card gains data-energies +
data-operations (the only attrs StageCard.buildInfoData reads), keyed
off my_tray_sig.energies_json / .operations_json (existing TarotCard
properties).
- tray-tooltip.js: new sig branch — _showSig() builds the panel inline,
paints via StageCard.renderFyi, & wires PRV|NXT cycle handlers; the
mousemove union now covers the .fyi-prev / .fyi-next btn rects (the
btns hang past the portal's left & right edges) so mouse-over them
keeps the panel alive. Click stopPropagation on the btns prevents the
panel-body click from reaching anything else.
- TrayTooltipSpec: 6 new sig-branch specs (panel structure; first energy
entry rendered; PRV|NXT cycling; body click no-dismiss; pointer over
btn rects keeps panel alive; pointer outside full union clears).
- test_component_tray_tooltip.py: 4 sig FTs (hover populates portal w.
Energy/TESTLIBIDO/effect/1-of-2; PRV|NXT cycle; body click does NOT
dismiss; mouseleave clears).
FT helper note — the sig FT's _hover dispatches a synthetic mouseenter
via JS rather than ActionChains.move_to_element, because the role-card
& sig-card cells sit side-by-side in the tray grid: the pointer's
animated path crosses the role-card on its way to the sig-card &
opens the role tooltip mid-flight, which then occludes the sig stage
by the time the move lands. Direct dispatch lands the event on the
intended trigger w.o. the cross-cell drag-by.
313 epic ITs + 335 Jasmine specs (incl. 6 new) + 6 tray-tooltip FTs all
green.
Code architected by Disco DeDisco <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 21:07:33 -04:00
|
|
|
{% include "apps/gameboard/_partials/_sig_fyi_panel.html" with panel_id="id_sea_fyi_panel" panel_extra_attrs='style="display:none"' %}
|
PICK SEA Sprint C: sea stage card viewer — FLIP in, SPIN/FYI, deposit/re-expand — TDD
- sea.js: SeaDeal module — openStage() shows big card viewer w. flip-in animation;
SPIN toggles stage-card--reversed; FYI shows energies/operations (Energy/Operation
titles, PRV/NXT nav); backdrop click deposits card to slot; click deposited slot
re-opens stage; resetHand() clears hand on DEL
- sea_deck view: adds name_group/name_title/reversal/keywords_upright/keywords_reversed/
energies/operations to each card dict (full sig-select stage data set)
- _sea_overlay.html: data-sea-user-polarity attr; sea stage HTML (sig-stage-card shell
+ fan-card-face-upright/reversal structure + sea-stat-block w. SPIN/FYI/PRV/NXT);
FLIP click calls SeaDeal.openStage(); _fillPos removed (sea.js handles slot fill);
_reset calls SeaDeal.resetHand()
- room.html: sea.js included alongside sig-select.js
- _card-deck.scss: sea-stage layout (fixed overlay, backdrop, content row); sea-stage-card
w. @keyframes sea-flip-in (3D rotateY perspective); sea-stat-block scoped styles
incl. SPIN/FYI btns, stat faces, sig-info FYI panel
- SeaDealSpec.js: 20 Jasmine specs — openStage, SPIN, FYI, backdrop dismiss, slot re-expand
Code architected by Disco DeDisco <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 01:12:06 -04:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
2026-04-26 21:30:27 -04:00
|
|
|
</div>{# /.sea-overlay #}
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
(function () {
|
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
|
|
const overlay = document.getElementById('id_sea_overlay');
|
|
|
|
|
const cancelBtn = document.getElementById('id_sea_cancel');
|
|
|
|
|
|
|
|
|
|
function openSea() {
|
|
|
|
|
document.documentElement.classList.add('sea-open');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function closeSea() {
|
|
|
|
|
document.documentElement.classList.remove('sea-open');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const pickSeaBtn = document.getElementById('id_pick_sea_btn');
|
|
|
|
|
if (pickSeaBtn) pickSeaBtn.addEventListener('click', openSea);
|
|
|
|
|
cancelBtn.addEventListener('click', closeSea);
|
2026-04-28 23:02:49 -04:00
|
|
|
|
|
|
|
|
// ── Deck draw ──────────────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
const SEA_DECK_URL = overlay.dataset.seaDeckUrl;
|
|
|
|
|
|
|
|
|
|
const SPREAD_ORDER = {
|
2026-04-29 14:19:30 -04:00
|
|
|
'waite-smith': ['.sea-pos-cover', '.sea-pos-cross', '.sea-pos-crown', '.sea-pos-lay', '.sea-pos-loom', '.sea-pos-leave'],
|
|
|
|
|
'escape-velocity': ['.sea-pos-cover', '.sea-pos-cross', '.sea-pos-lay', '.sea-pos-leave', '.sea-pos-crown', '.sea-pos-loom'],
|
2026-04-28 23:02:49 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
let levityPile = [], gravityPile = [];
|
|
|
|
|
let _filled = 0;
|
|
|
|
|
let _activeStack = null;
|
|
|
|
|
|
|
|
|
|
const spreadSel = overlay.querySelector('#id_sea_spread');
|
|
|
|
|
const lockBtn = overlay.querySelector('#id_sea_lock_hand');
|
|
|
|
|
const delBtn = overlay.querySelector('#id_sea_del');
|
|
|
|
|
|
|
|
|
|
function _spreadKey() {
|
|
|
|
|
return spreadSel ? spreadSel.value : 'waite-smith';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function _nextPosSelector() {
|
|
|
|
|
const order = SPREAD_ORDER[_spreadKey()] || SPREAD_ORDER['waite-smith'];
|
|
|
|
|
return order[_filled] || null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function _hideOk() {
|
|
|
|
|
if (_activeStack) {
|
|
|
|
|
const ok = _activeStack.querySelector('.sea-stack-ok');
|
|
|
|
|
if (ok) ok.style.display = 'none';
|
2026-04-28 23:30:07 -04:00
|
|
|
_activeStack.classList.remove('sea-deck-stack--active');
|
2026-04-28 23:02:49 -04:00
|
|
|
_activeStack = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function _showOk(stack) {
|
|
|
|
|
_hideOk();
|
|
|
|
|
_activeStack = stack;
|
2026-04-28 23:30:07 -04:00
|
|
|
stack.classList.add('sea-deck-stack--active');
|
2026-04-28 23:02:49 -04:00
|
|
|
const ok = stack.querySelector('.sea-stack-ok');
|
|
|
|
|
if (ok) ok.style.display = '';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function _reset() {
|
|
|
|
|
_filled = 0;
|
|
|
|
|
_hideOk();
|
|
|
|
|
overlay.querySelectorAll('.sea-card-slot').forEach(s => {
|
2026-04-29 02:30:59 -04:00
|
|
|
s.classList.remove('sea-card-slot--filled', 'sea-card-slot--visible', 'sea-card-slot--focused', 'sea-card-slot--levity', 'sea-card-slot--gravity');
|
2026-04-28 23:02:49 -04:00
|
|
|
s.classList.add('sea-card-slot--empty');
|
2026-04-28 23:30:07 -04:00
|
|
|
s.innerHTML = '';
|
2026-04-28 23:02:49 -04:00
|
|
|
delete s.dataset.cardId;
|
PICK SEA Sprint C: sea stage card viewer — FLIP in, SPIN/FYI, deposit/re-expand — TDD
- sea.js: SeaDeal module — openStage() shows big card viewer w. flip-in animation;
SPIN toggles stage-card--reversed; FYI shows energies/operations (Energy/Operation
titles, PRV/NXT nav); backdrop click deposits card to slot; click deposited slot
re-opens stage; resetHand() clears hand on DEL
- sea_deck view: adds name_group/name_title/reversal/keywords_upright/keywords_reversed/
energies/operations to each card dict (full sig-select stage data set)
- _sea_overlay.html: data-sea-user-polarity attr; sea stage HTML (sig-stage-card shell
+ fan-card-face-upright/reversal structure + sea-stat-block w. SPIN/FYI/PRV/NXT);
FLIP click calls SeaDeal.openStage(); _fillPos removed (sea.js handles slot fill);
_reset calls SeaDeal.resetHand()
- room.html: sea.js included alongside sig-select.js
- _card-deck.scss: sea-stage layout (fixed overlay, backdrop, content row); sea-stage-card
w. @keyframes sea-flip-in (3D rotateY perspective); sea-stat-block scoped styles
incl. SPIN/FYI btns, stat faces, sig-info FYI panel
- SeaDealSpec.js: 20 Jasmine specs — openStage, SPIN, FYI, backdrop dismiss, slot re-expand
Code architected by Disco DeDisco <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 01:12:06 -04:00
|
|
|
delete s.dataset.posKey;
|
2026-04-28 23:02:49 -04:00
|
|
|
});
|
|
|
|
|
if (lockBtn) lockBtn.disabled = true;
|
PICK SEA Sprint C: sea stage card viewer — FLIP in, SPIN/FYI, deposit/re-expand — TDD
- sea.js: SeaDeal module — openStage() shows big card viewer w. flip-in animation;
SPIN toggles stage-card--reversed; FYI shows energies/operations (Energy/Operation
titles, PRV/NXT nav); backdrop click deposits card to slot; click deposited slot
re-opens stage; resetHand() clears hand on DEL
- sea_deck view: adds name_group/name_title/reversal/keywords_upright/keywords_reversed/
energies/operations to each card dict (full sig-select stage data set)
- _sea_overlay.html: data-sea-user-polarity attr; sea stage HTML (sig-stage-card shell
+ fan-card-face-upright/reversal structure + sea-stat-block w. SPIN/FYI/PRV/NXT);
FLIP click calls SeaDeal.openStage(); _fillPos removed (sea.js handles slot fill);
_reset calls SeaDeal.resetHand()
- room.html: sea.js included alongside sig-select.js
- _card-deck.scss: sea-stage layout (fixed overlay, backdrop, content row); sea-stage-card
w. @keyframes sea-flip-in (3D rotateY perspective); sea-stat-block scoped styles
incl. SPIN/FYI btns, stat faces, sig-info FYI panel
- SeaDealSpec.js: 20 Jasmine specs — openStage, SPIN, FYI, backdrop dismiss, slot re-expand
Code architected by Disco DeDisco <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 01:12:06 -04:00
|
|
|
if (window.SeaDeal) SeaDeal.resetHand();
|
2026-04-28 23:02:49 -04:00
|
|
|
_fetchDeck();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function _fetchDeck() {
|
|
|
|
|
fetch(SEA_DECK_URL, { credentials: 'same-origin' })
|
|
|
|
|
.then(r => r.json())
|
|
|
|
|
.then(data => { levityPile = data.levity || []; gravityPile = data.gravity || []; })
|
|
|
|
|
.catch(() => {});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
overlay.querySelectorAll('.sea-deck-stack').forEach(stack => {
|
|
|
|
|
stack.addEventListener('click', e => {
|
|
|
|
|
e.stopPropagation();
|
|
|
|
|
_activeStack === stack ? _hideOk() : _showOk(stack);
|
|
|
|
|
});
|
|
|
|
|
const ok = stack.querySelector('.sea-stack-ok');
|
|
|
|
|
if (ok) {
|
|
|
|
|
ok.style.display = 'none';
|
|
|
|
|
ok.addEventListener('click', e => {
|
|
|
|
|
e.stopPropagation();
|
|
|
|
|
const isLevity = stack.classList.contains('sea-deck-stack--levity');
|
|
|
|
|
const pile = isLevity ? levityPile : gravityPile;
|
|
|
|
|
const card = pile.length ? pile.shift() : null;
|
|
|
|
|
const pos = _nextPosSelector();
|
PICK SEA Sprint C: sea stage card viewer — FLIP in, SPIN/FYI, deposit/re-expand — TDD
- sea.js: SeaDeal module — openStage() shows big card viewer w. flip-in animation;
SPIN toggles stage-card--reversed; FYI shows energies/operations (Energy/Operation
titles, PRV/NXT nav); backdrop click deposits card to slot; click deposited slot
re-opens stage; resetHand() clears hand on DEL
- sea_deck view: adds name_group/name_title/reversal/keywords_upright/keywords_reversed/
energies/operations to each card dict (full sig-select stage data set)
- _sea_overlay.html: data-sea-user-polarity attr; sea stage HTML (sig-stage-card shell
+ fan-card-face-upright/reversal structure + sea-stat-block w. SPIN/FYI/PRV/NXT);
FLIP click calls SeaDeal.openStage(); _fillPos removed (sea.js handles slot fill);
_reset calls SeaDeal.resetHand()
- room.html: sea.js included alongside sig-select.js
- _card-deck.scss: sea-stage layout (fixed overlay, backdrop, content row); sea-stage-card
w. @keyframes sea-flip-in (3D rotateY perspective); sea-stat-block scoped styles
incl. SPIN/FYI btns, stat faces, sig-info FYI panel
- SeaDealSpec.js: 20 Jasmine specs — openStage, SPIN, FYI, backdrop dismiss, slot re-expand
Code architected by Disco DeDisco <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 01:12:06 -04:00
|
|
|
if (card && pos) {
|
|
|
|
|
_filled++;
|
|
|
|
|
if (lockBtn) lockBtn.disabled = (_filled < 6);
|
|
|
|
|
if (window.SeaDeal) SeaDeal.openStage(card, pos, isLevity);
|
|
|
|
|
}
|
2026-04-28 23:02:49 -04:00
|
|
|
_hideOk();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
overlay.addEventListener('click', _hideOk);
|
|
|
|
|
if (delBtn) delBtn.addEventListener('click', _reset);
|
|
|
|
|
|
|
|
|
|
_fetchDeck();
|
2026-04-29 02:30:59 -04:00
|
|
|
if (window.SeaDeal) SeaDeal.reinit();
|
2026-04-26 21:30:27 -04:00
|
|
|
})();
|
|
|
|
|
</script>
|