diff --git a/src/apps/gameboard/tests/integrated/test_views.py b/src/apps/gameboard/tests/integrated/test_views.py index 6c7a476..aa65262 100644 --- a/src/apps/gameboard/tests/integrated/test_views.py +++ b/src/apps/gameboard/tests/integrated/test_views.py @@ -640,6 +640,49 @@ class MySeaPickerPhaseTemplateTest(TestCase): self.assertNotContains(response, "my-sea-picker") +class MySeaPolarityMatchesMySignTest(TestCase): + """Bug 2026-05-21 (user-reported): a levity sig chosen on /billboard/ + my-sign/ rendered as gravity-styled on /gameboard/my-sea/ (priUser bg + + secUser text) — and vice versa for gravity sigs (which then collided + w. the hardcoded --secUser corner-rank color in `.sea-sig-card`, + making the rank + suit-icon invisible against a --secUser bg). + + Root cause was a polarity inversion in `my_sea.html:10` — + `{% if significator_reversed %}gravity{% else %}levity{% endif %}` — + opposite of `my_sign.html:22` + its JS `_polarity()`. This test pins + the two surfaces to agree on the same `User.significator_reversed` + → `data-polarity` mapping, so any future drift gets caught.""" + + def setUp(self): + from apps.epic.models import personal_sig_cards + self.user = User.objects.create(email="polarity@test.io") + self.client.force_login(self.user) + target = personal_sig_cards(self.user)[0] + self.user.significator = target + self.user.save(update_fields=["significator"]) + + def test_unreversed_sig_renders_gravity_on_both_surfaces(self): + """`significator_reversed=False` (the on-creation default) renders + data-polarity="gravity" on BOTH my_sign + my_sea — the convention + established by my_sign's Sprint 4a picker + its `_polarity()` JS.""" + self.user.significator_reversed = False + self.user.save(update_fields=["significator_reversed"]) + sea = self.client.get(reverse("my_sea")).content.decode() + sign = self.client.get(reverse("billboard:my_sign")).content.decode() + self.assertIn('data-polarity="gravity"', sea) + self.assertIn('data-polarity="gravity"', sign) + + def test_reversed_sig_renders_levity_on_both_surfaces(self): + """`significator_reversed=True` (FLIP-toggled on my_sign) renders + data-polarity="levity" on BOTH surfaces.""" + self.user.significator_reversed = True + self.user.save(update_fields=["significator_reversed"]) + sea = self.client.get(reverse("my_sea")).content.decode() + sign = self.client.get(reverse("billboard:my_sign")).content.decode() + self.assertIn('data-polarity="levity"', sea) + self.assertIn('data-polarity="levity"', sign) + + class MySeaSpreadFormTemplateTest(TestCase): """Sprint 5 iter 3 — form col + SPREAD dropdown structure + default- spread context + cross's `data-spread-shape` attribute. Iter 3 spec diff --git a/src/static_src/scss/_card-deck.scss b/src/static_src/scss/_card-deck.scss index 4e1d215..1cb0fee 100644 --- a/src/static_src/scss/_card-deck.scss +++ b/src/static_src/scss/_card-deck.scss @@ -1364,13 +1364,20 @@ $sea-card-h: 6.5rem; position: relative; z-index: 2; + // Corner-rank + suit-icon track `color` so the polarity rules below + // (which set `.sig-stage-card { color: ... }` to --priUser for levity) + // flip the contrast w. the card's bg. The default (gravity, --priUser + // bg) inherits --secUser from the `.sig-stage-card.sea-sig-card` rule + // below; the levity polarity rule overrides `.sig-stage-card { color }` + // to --priUser, which propagates down through currentColor. .fan-corner-rank { font-size: 1.2rem; font-weight: 700; line-height: 1; - color: rgba(var(--secUser), 0.85); + color: currentColor; + opacity: 0.85; } - i { font-size: 1rem; color: rgba(var(--secUser), 0.75); } + i { font-size: 1rem; color: currentColor; opacity: 0.75; } } // .sig-stage-card is normally scoped inside .sig-stage — re-apply the card shell @@ -1384,6 +1391,7 @@ $sea-card-h: 6.5rem; border-radius: 0.5rem; background: rgba(var(--priUser), 1); border: 0.15rem solid rgba(var(--secUser), 0.6); + color: rgba(var(--secUser), 1); // default (gravity) text color; `[data-polarity="levity"] .sig-stage-card { color: --priUser }` overrides for levity. Corner-rank + suit-icon track currentColor. display: flex; flex-direction: column; position: relative; diff --git a/src/templates/apps/gameboard/my_sea.html b/src/templates/apps/gameboard/my_sea.html index 52dfeb6..ff6bda9 100644 --- a/src/templates/apps/gameboard/my_sea.html +++ b/src/templates/apps/gameboard/my_sea.html @@ -7,7 +7,7 @@ {% block content %}