From b5fbc3d354beed8b73c6c4e2346240be2d5433b5 Mon Sep 17 00:00:00 2001 From: Disco DeDisco Date: Tue, 28 Apr 2026 20:48:47 -0400 Subject: [PATCH] =?UTF-8?q?SIG=20SELECT:=20fix=20major=20arcana=20reversed?= =?UTF-8?q?=20face=20slot=20order=20=E2=80=94=20title=20first,=20qualifier?= =?UTF-8?q?=20second=20after=20spin=20=E2=80=94=20TDD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DOM-second flex child appears first after card rotates 180°; swap qualifier/name slot assignments for major arcana so reversed face reads "The Schizo, / Enlightened" not "Enlightened / The Schizo"; spec updated to document the slot-swap invariant Code architected by Disco DeDisco Git commit message Co-Authored-By: Claude Sonnet 4.6 --- src/apps/epic/static/apps/epic/sig-select.js | 6 ++++-- src/static/tests/SigSelectSpec.js | 7 ++++--- src/static_src/tests/SigSelectSpec.js | 7 ++++--- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/apps/epic/static/apps/epic/sig-select.js b/src/apps/epic/static/apps/epic/sig-select.js index e179f88..29b8173 100644 --- a/src/apps/epic/static/apps/epic/sig-select.js +++ b/src/apps/epic/static/apps/epic/sig-select.js @@ -148,8 +148,10 @@ var SigSelect = (function () { // - Non-major w/o reversal: fall back to mirroring the polarity qualifier var reversal = cardEl.dataset.reversal || ''; if (isMajor) { - stageCard.querySelector('.fan-card-reversal-qualifier').textContent = qualifier; - stageCard.querySelector('.fan-card-reversal-name').textContent = title; + // Slots are swapped vs. non-major: spin reverses DOM order visually, + // so qualifier-slot (DOM-second) appears first and name-slot (DOM-first) appears second. + stageCard.querySelector('.fan-card-reversal-qualifier').textContent = title + ','; + stageCard.querySelector('.fan-card-reversal-name').textContent = qualifier; } else if (reversal) { stageCard.querySelector('.fan-card-reversal-qualifier').textContent = reversal; stageCard.querySelector('.fan-card-reversal-name').textContent = title; diff --git a/src/static/tests/SigSelectSpec.js b/src/static/tests/SigSelectSpec.js index 6bce582..a07bd8a 100644 --- a/src/static/tests/SigSelectSpec.js +++ b/src/static/tests/SigSelectSpec.js @@ -548,13 +548,14 @@ describe("SigSelect", () => { .toBe(card.dataset.nameTitle); }); - it("major arcana reversed face: polarity qualifier + card title (concept name in FYI)", () => { + it("major arcana reversed face: title, in qualifier slot (first after spin); qualifier in name slot (second)", () => { makeFixture({ polarity: "levity", userRole: "PC" }); card.dataset.arcana = "Major Arcana"; card.dataset.nameTitle = "The Schizo"; hover(); - expect(stageCard.querySelector(".fan-card-reversal-qualifier").textContent).toBe("Elevated"); - expect(stageCard.querySelector(".fan-card-reversal-name").textContent).toBe("The Schizo"); + // DOM-second element appears first after card spins — so title goes in qualifier slot + expect(stageCard.querySelector(".fan-card-reversal-qualifier").textContent).toBe("The Schizo,"); + expect(stageCard.querySelector(".fan-card-reversal-name").textContent).toBe("Elevated"); }); it("non-major without data-reversal: reversal-name empty, qualifier mirrors polarity", () => { diff --git a/src/static_src/tests/SigSelectSpec.js b/src/static_src/tests/SigSelectSpec.js index 6bce582..a07bd8a 100644 --- a/src/static_src/tests/SigSelectSpec.js +++ b/src/static_src/tests/SigSelectSpec.js @@ -548,13 +548,14 @@ describe("SigSelect", () => { .toBe(card.dataset.nameTitle); }); - it("major arcana reversed face: polarity qualifier + card title (concept name in FYI)", () => { + it("major arcana reversed face: title, in qualifier slot (first after spin); qualifier in name slot (second)", () => { makeFixture({ polarity: "levity", userRole: "PC" }); card.dataset.arcana = "Major Arcana"; card.dataset.nameTitle = "The Schizo"; hover(); - expect(stageCard.querySelector(".fan-card-reversal-qualifier").textContent).toBe("Elevated"); - expect(stageCard.querySelector(".fan-card-reversal-name").textContent).toBe("The Schizo"); + // DOM-second element appears first after card spins — so title goes in qualifier slot + expect(stageCard.querySelector(".fan-card-reversal-qualifier").textContent).toBe("The Schizo,"); + expect(stageCard.querySelector(".fan-card-reversal-name").textContent).toBe("Elevated"); }); it("non-major without data-reversal: reversal-name empty, qualifier mirrors polarity", () => {