diff --git a/src/functional_tests/test_game_my_sea.py b/src/functional_tests/test_game_my_sea.py index 33cb841..9544783 100644 --- a/src/functional_tests/test_game_my_sea.py +++ b/src/functional_tests/test_game_my_sea.py @@ -894,12 +894,12 @@ class MySeaCardDrawTest(FunctionalTest): self.assertIn("btn-primary", action_btn.get_attribute("class")) self.assertEqual(action_btn.get_attribute("data-state"), "auto-draw") delbtn = picker.find_element(By.CSS_SELECTOR, "#id_sea_del") - # DEL renders w. `.btn-disabled` pre-completion (the `×` overlay - # is CSS-only; raw text content is still "DEL" in the DOM). - # Assert on class state — `.text` returns the visible glyph - # rendered by the pseudo-element layer. + # DEL renders w. `.btn-disabled` pre-completion + inner text "×" + # (case-by-case rendering per game-kit tooltip convention; user- + # spec 2026-05-20 dropped the universal pseudo-element ×). self.assertIn("btn-danger", delbtn.get_attribute("class")) self.assertIn("btn-disabled", delbtn.get_attribute("class")) + self.assertEqual(delbtn.text, "×") # Reversal % caption — default 25 hint = picker.find_element(By.CSS_SELECTOR, ".sea-reversal-hint") self.assertIn("25", hint.text) diff --git a/src/static_src/scss/_button-pad.scss b/src/static_src/scss/_button-pad.scss index 97d5ebb..8851e85 100644 --- a/src/static_src/scss/_button-pad.scss +++ b/src/static_src/scss/_button-pad.scss @@ -515,7 +515,7 @@ pointer-events: none; font-size: 1.2rem; padding-bottom: 0.1rem; - color: transparent !important; // hide native text + color: rgba(var(--secUser), 0.25) !important; background-color: rgba(var(--priUser), 1) !important; border-color: rgba(var(--secUser), 0.25) !important; box-shadow: @@ -523,28 +523,6 @@ 0.12rem 0.12rem 0.25rem rgba(0, 0, 0, 0.25), 0.25rem 0.25rem 0.25rem rgba(var(--secUser), 0.12) ; - position: relative; - - // Universal × overlay — any `.btn-disabled` button reads as × - // regardless of its native inner text/icons (DEL → ×, FLIP → ×, - // LOCK HAND → ×, etc.). Templates that already render `×` - // explicitly (e.g. don/doff toggle pairs) just have their inner - // × hidden by `visibility: hidden` on children; the pseudo's - // glyph is the only one visible — no double-× regression. User - // spec 2026-05-20. - > * { visibility: hidden; } - - &::before { - content: "\00d7"; - position: absolute; - inset: 0; - display: flex; - align-items: center; - justify-content: center; - color: rgba(var(--secUser), 0.5); - font-size: 1.5rem; - font-weight: bold; - } &:hover { text-shadow: diff --git a/src/templates/apps/gameboard/my_sea.html b/src/templates/apps/gameboard/my_sea.html index 16945bc..8cf4876 100644 --- a/src/templates/apps/gameboard/my_sea.html +++ b/src/templates/apps/gameboard/my_sea.html @@ -229,12 +229,15 @@ {# DEL starts `.btn-disabled` until the hand is #} {# complete — per Sprint-5-iter-4c spec, the 1/day #} {# quota is committed at first-card-draw + can't be #} - {# refunded by an early DEL. #} + {# refunded by an early DEL. Case-by-case `×` #} + {# rendering matches game-kit tooltip + DON/DOFF #} + {# convention (user-spec 2026-05-20): a disabled btn #} + {# carries × in its own text node, not via a CSS #} + {# overlay. JS `_setComplete` swaps inner text in #} + {# lockstep with the `.btn-disabled` class toggle. #} + class="btn btn-danger{% if not hand_complete %} btn-disabled{% endif %}">{% if hand_complete %}DEL{% else %}×{% endif %} {# Sea stage — portaled modal that opens on FLIP click via #} @@ -439,9 +442,18 @@ // disabled when shown. The deck STACKS themselves stay // click-responsive (so the user can see the disabled // FLIP feedback) — `_locked` gates the actual draw. + // + // DEL btn text follows the game-kit tooltip convention + // (user-spec 2026-05-20): disabled state reads × (the + // template's initial render does the same), active + // state reads DEL. Lockstep w. the `.btn-disabled` + // class so the visual + label always agree. _locked = on; picker.classList.toggle('my-sea-picker--locked', on); - if (delBtn) delBtn.classList.toggle('btn-disabled', !on); + if (delBtn) { + delBtn.classList.toggle('btn-disabled', !on); + delBtn.innerHTML = on ? 'DEL' : '×'; + } if (actionBtn) { actionBtn.dataset.state = on ? 'gate-view' : 'auto-draw'; actionBtn.innerHTML = on ? 'GATE
VIEW' : 'AUTO
DRAW';