From 79ba690d16ccf5ae390fd1480bfdd396a431fff9 Mon Sep 17 00:00:00 2001 From: DavidQ Date: Mon, 22 Jun 2026 21:50:27 -0400 Subject: [PATCH] PR_26174_ALFA_019-game-hub-selected-button-and-crew-label --- assets/theme-v2/css/tables.css | 6 ----- ...game-hub-selected-button-and-crew-label.md | 25 ++++++++++++++++++ ...utton-and-crew-label_branch-validation.txt | 14 ++++++++++ ...and-crew-label_manual-validation-notes.txt | 10 +++++++ ...n-and-crew-label_requirement-checklist.txt | 11 ++++++++ ...-button-and-crew-label_validation-lane.txt | 11 ++++++++ .../dev/reports/codex_changed_files.txt | 10 +++---- docs_build/dev/reports/codex_review.diff | Bin 19930 -> 22260 bytes .../tools/GameHubMockRepository.spec.mjs | 22 ++++++++------- toolbox/game-hub/game-hub.js | 2 +- 10 files changed, 90 insertions(+), 21 deletions(-) create mode 100644 docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label.md create mode 100644 docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label_branch-validation.txt create mode 100644 docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label_manual-validation-notes.txt create mode 100644 docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label_requirement-checklist.txt create mode 100644 docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label_validation-lane.txt diff --git a/assets/theme-v2/css/tables.css b/assets/theme-v2/css/tables.css index ae4dc414e..c39ef19f0 100644 --- a/assets/theme-v2/css/tables.css +++ b/assets/theme-v2/css/tables.css @@ -115,12 +115,6 @@ td { cursor: pointer } -.data-table [data-game-toggle][aria-current="true"] { - border-color: var(--gold); - background: color-mix(in srgb, var(--gold) 18%, var(--panel-soft)); - box-shadow: inset 0 0 0 1px var(--gold-border-muted) -} - .idea-board-idea-label { display: inline-flex; align-items: center; diff --git a/docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label.md b/docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label.md new file mode 100644 index 000000000..d7c23627a --- /dev/null +++ b/docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label.md @@ -0,0 +1,25 @@ +# PR_26174_ALFA_019-game-hub-selected-button-and-crew-label + +## Summary + +Updated Game Hub so the selected game button uses the same style and scale as row Save buttons. + +## Implementation + +- Selected game buttons now use `btn btn--compact primary`. +- Removed the custom selected-game table CSS selector from Theme V2 tables. +- Preserved button-only selected state; parent rows and cells remain unhighlighted. +- Confirmed Game Crew accordion text is `Game Crew`, not `game-hub/Game Crew`. +- Updated targeted Playwright coverage for selected button styling and crew label expectations. + +## Scope Control + +- Preserved parent table columns: Game, Purpose, Status, Actions. +- Preserved Source Idea and Readiness Output child rows. +- Preserved existing API/service contract. +- No browser-owned product data changes. +- No unrelated cleanup. + +## ZIP + +- `tmp/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label_delta.zip` diff --git a/docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label_branch-validation.txt b/docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label_branch-validation.txt new file mode 100644 index 000000000..df5875475 --- /dev/null +++ b/docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label_branch-validation.txt @@ -0,0 +1,14 @@ +Branch validation: PASS + +Branch: +pr/26174-ALFA-019-game-hub-selected-button-and-crew-label + +Base stack branch: +pr/26174-ALFA-018-game-selection-button-state + +Checks: +- Current branch is the ALFA_019 branch: PASS +- Worktree was clean before ALFA_019 edits: PASS +- Scope limited to selected game button style, crew label validation, targeted Playwright coverage, and required reports: PASS +- No protected Project Instructions changes: PASS +- No merge to main performed: PASS diff --git a/docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label_manual-validation-notes.txt b/docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label_manual-validation-notes.txt new file mode 100644 index 000000000..35643675d --- /dev/null +++ b/docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label_manual-validation-notes.txt @@ -0,0 +1,10 @@ +Manual validation notes: PASS + +- Reviewed `docs_build/dev/ProjectInstructions/addendums/table_first_ui.md`. +- Confirmed selected game button and Save button share `btn btn--compact primary`. +- Confirmed non-selected game buttons and Edit buttons are not primary. +- Confirmed no row-level active attributes are added. +- Confirmed no cell active markers are added. +- Confirmed Theme V2 no longer contains the custom selected game table selector. +- Confirmed the Game Crew accordion appears as `Game Crew`. +- Confirmed Source Idea and Readiness Output child rows still render under the selected game. diff --git a/docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label_requirement-checklist.txt b/docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label_requirement-checklist.txt new file mode 100644 index 000000000..94bf09cff --- /dev/null +++ b/docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label_requirement-checklist.txt @@ -0,0 +1,11 @@ +Requirement checklist: PASS + +- Selected Game button uses the same style/scale as the Save button: PASS +- Only the selected Game button is styled: PASS +- Do not highlight the row: PASS +- Do not highlight the cell background: PASS +- Do not show left-border row highlight: PASS +- Rename/move `game-hub/Game Crew` accordion to `Game Crew`: PASS +- Preserve parent table columns Game, Purpose, Status, Actions: PASS +- Preserve Source Idea and Readiness Output child rows: PASS +- Follow table_first_ui.md: PASS diff --git a/docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label_validation-lane.txt b/docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label_validation-lane.txt new file mode 100644 index 000000000..c9e2a87c0 --- /dev/null +++ b/docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label_validation-lane.txt @@ -0,0 +1,11 @@ +Validation lane: PASS + +Commands: +- `git diff --check -- assets/theme-v2/css/tables.css toolbox/game-hub/game-hub.js tests/playwright/tools/GameHubMockRepository.spec.mjs` + - PASS +- `node --check toolbox/game-hub/game-hub.js` + - PASS +- `npx playwright test tests/playwright/tools/GameHubMockRepository.spec.mjs -g "Game Hub"` + - PASS, 11 passed + +Generated coverage reports were restored after Playwright validation to keep this PR scoped. diff --git a/docs_build/dev/reports/codex_changed_files.txt b/docs_build/dev/reports/codex_changed_files.txt index 6ae3f1e60..eb8500db6 100644 --- a/docs_build/dev/reports/codex_changed_files.txt +++ b/docs_build/dev/reports/codex_changed_files.txt @@ -1,9 +1,9 @@ assets/theme-v2/css/tables.css -docs_build/dev/reports/PR_26174_ALFA_018-game-selection-button-state.md -docs_build/dev/reports/PR_26174_ALFA_018-game-selection-button-state_branch-validation.txt -docs_build/dev/reports/PR_26174_ALFA_018-game-selection-button-state_manual-validation-notes.txt -docs_build/dev/reports/PR_26174_ALFA_018-game-selection-button-state_requirement-checklist.txt -docs_build/dev/reports/PR_26174_ALFA_018-game-selection-button-state_validation-lane.txt +docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label.md +docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label_branch-validation.txt +docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label_manual-validation-notes.txt +docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label_requirement-checklist.txt +docs_build/dev/reports/PR_26174_ALFA_019-game-hub-selected-button-and-crew-label_validation-lane.txt docs_build/dev/reports/codex_changed_files.txt docs_build/dev/reports/codex_review.diff tests/playwright/tools/GameHubMockRepository.spec.mjs diff --git a/docs_build/dev/reports/codex_review.diff b/docs_build/dev/reports/codex_review.diff index 55044b9665e01bb102bba56ca24fe01822a9e1b6..46e63d2a1bd148109b800cece3635256336d0232 100644 GIT binary patch literal 22260 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 b^z}9}FECmSpUBoLmhT}s59MbzJ*)o$HCC@T diff --git a/tests/playwright/tools/GameHubMockRepository.spec.mjs b/tests/playwright/tools/GameHubMockRepository.spec.mjs index 7ec3691b8..f2dac0710 100644 --- a/tests/playwright/tools/GameHubMockRepository.spec.mjs +++ b/tests/playwright/tools/GameHubMockRepository.spec.mjs @@ -259,6 +259,7 @@ test("Game Hub creates, opens, and deletes mock games", async ({ page }) => { await expect(page.getByRole("button", { name: "Delete Open Game" })).toBeEnabled(); await expect(page.locator("summary").filter({ hasText: /^Game Setup$/ })).toHaveCount(0); await expect(page.locator("summary").filter({ hasText: /^Game Crew$/ })).toHaveCount(1); + await expect(page.locator("main")).not.toContainText("game-hub/Game Crew"); await expect(page.getByRole("link", { name: "Open Game Journey" })).toHaveCount(0); await expect(page.locator(".tool-center-panel")).not.toContainText("Review games in the parent table"); await expect(page.locator("[data-project-record-status]")).toHaveText("Game table loaded."); @@ -309,7 +310,7 @@ test("Game Hub creates, opens, and deletes mock games", async ({ page }) => { expect(rowVisuals[0]).toEqual(rowVisuals[1]); await expect(demoGameRow.locator("> .status")).toHaveCount(0); await expect(demoGameRow.locator("[data-game-toggle='demo-game']")).toHaveAttribute("aria-expanded", "false"); - await expect(demoGameRow.locator("[data-game-toggle='demo-game']")).not.toHaveClass(/primary/); + await expect(demoGameRow.locator("[data-game-toggle='demo-game']")).toHaveClass(/\bprimary\b/); await expect(demoGameRow.locator("[data-game-toggle='demo-game']")).toHaveClass(/\bbtn--compact\b/); await expect(demoGameRow.locator("[data-game-toggle='demo-game']")).toHaveAttribute("data-game-active", "true"); await expect(demoGameRow.locator("[data-game-toggle='demo-game']")).toHaveAttribute("aria-current", "true"); @@ -366,6 +367,8 @@ test("Game Hub creates, opens, and deletes mock games", async ({ page }) => { const addGameRow = page.locator("[data-game-add-row='input']"); await expect(addGameRow.locator("[data-game-action]")).toHaveText(["Save", "Cancel"]); await expect(addGameRow.getByRole("button", { name: "Save" })).toHaveClass(/\bbtn--compact\b/); + await expect(addGameRow.getByRole("button", { name: "Save" })).toHaveClass("btn btn--compact primary"); + await expect(demoGameRow.locator("[data-game-toggle='demo-game']")).toHaveClass("btn btn--compact primary"); await expect(addGameRow.locator("td")).toHaveCount(3); await addGameRow.getByLabel("Game").fill("Launch Test Game"); await addGameRow.getByLabel("Purpose").selectOption("Learning Game"); @@ -376,7 +379,7 @@ test("Game Hub creates, opens, and deletes mock games", async ({ page }) => { await expect(page.locator("[data-game-row='launch-test-game-1']")).not.toHaveAttribute("aria-current", "true"); await expect(page.locator("[data-game-toggle][aria-current='true']")).toHaveCount(1); await expect(page.locator("[data-game-row='launch-test-game-1'] [data-game-toggle='launch-test-game-1']")).toHaveAttribute("aria-current", "true"); - await expect(page.locator("[data-game-row='launch-test-game-1'] [data-game-toggle='launch-test-game-1']")).not.toHaveClass(/primary/); + await expect(page.locator("[data-game-row='launch-test-game-1'] [data-game-toggle='launch-test-game-1']")).toHaveClass("btn btn--compact primary"); await expect(page.locator("[data-game-row='launch-test-game-1']").getByRole("button", { name: "Edit Launch Test Game" })).not.toHaveClass(/primary/); await expect(page.locator("[data-game-row='launch-test-game-1'] td").nth(0)).toHaveText("Learning Game"); await expect(page.locator("[data-game-row='launch-test-game-1'] td").nth(1)).toHaveText("Ready for Testing"); @@ -405,7 +408,7 @@ test("Game Hub creates, opens, and deletes mock games", async ({ page }) => { await page.locator("[data-game-add-row='input']").getByRole("button", { name: "Save" }).click(); await expect(page.locator("[data-game-row='archive-game-2']")).not.toHaveAttribute("data-game-active", "true"); await expect(page.locator("[data-game-row='archive-game-2'] [data-game-toggle='archive-game-2']")).toHaveAttribute("aria-current", "true"); - await expect(page.locator("[data-game-row='archive-game-2'] [data-game-toggle='archive-game-2']")).not.toHaveClass(/primary/); + await expect(page.locator("[data-game-row='archive-game-2'] [data-game-toggle='archive-game-2']")).toHaveClass("btn btn--compact primary"); await page.locator("[data-game-row='launch-test-game-1'] [data-game-toggle='launch-test-game-1']").click(); await expect(page.locator("[data-game-row='launch-test-game-1']")).not.toHaveAttribute("data-game-active", "true"); @@ -415,7 +418,7 @@ test("Game Hub creates, opens, and deletes mock games", async ({ page }) => { await expect(page.locator("[data-game-toggle][data-game-active='true']")).toHaveCount(1); await expect(page.locator("[data-game-expanded-row='launch-test-game-1']")).toHaveCount(2); await expect(page.locator("[data-game-expanded-row='archive-game-2']")).toHaveCount(0); - await expect(page.locator("[data-game-row='launch-test-game-1'] [data-game-toggle='launch-test-game-1']")).not.toHaveClass(/primary/); + await expect(page.locator("[data-game-row='launch-test-game-1'] [data-game-toggle='launch-test-game-1']")).toHaveClass("btn btn--compact primary"); await expect(page.locator("[data-game-row='launch-test-game-1']").getByRole("button", { name: "Edit Launch Test Game" })).not.toHaveClass(/primary/); await expect(page.locator("[data-game-hub-log]")).not.toHaveText("Selected Launch Test Game."); @@ -565,7 +568,7 @@ test("Game Hub preserves guest browsing and blocks guest saves", async ({ page } const failures = await openRepoPage(page, "/toolbox/game-hub/index.html"); try { - await expect(page.locator("[data-game-row='demo-game'] [data-game-toggle='demo-game']")).not.toHaveClass(/primary/); + await expect(page.locator("[data-game-row='demo-game'] [data-game-toggle='demo-game']")).toHaveClass("btn btn--compact primary"); await expect(page.locator("[data-game-row='demo-game']").getByRole("button", { name: "Edit Demo Game" })).not.toHaveClass(/primary/); await expect(page.locator("[data-game-row='demo-game']").getByRole("button", { name: "Edit Demo Game" })).toBeEnabled(); await expect(page.locator("[data-game-list]")).toContainText("Gravity Demo"); @@ -579,7 +582,8 @@ test("Game Hub preserves guest browsing and blocks guest saves", async ({ page } await expect(page.getByLabel("Current User Role")).toBeDisabled(); await page.locator("[data-game-row='gravity-demo'] [data-game-toggle='gravity-demo']").click(); - await expect(page.locator("[data-game-row='gravity-demo'] [data-game-toggle='gravity-demo']")).not.toHaveClass(/primary/); + await expect(page.locator("[data-game-row='gravity-demo'] [data-game-toggle='gravity-demo']")).toHaveClass("btn btn--compact primary"); + await expect(page.locator("[data-game-row='demo-game'] [data-game-toggle='demo-game']")).not.toHaveClass(/primary/); await expect(page.locator("[data-game-row='gravity-demo']").getByRole("button", { name: "Edit Gravity Demo" })).toBeEnabled(); await expect(page.locator("[data-game-hub-log]")).toHaveText("Sign in to create or update Game Hub projects."); @@ -593,7 +597,7 @@ test("Game Hub preserves guest browsing and blocks guest saves", async ({ page } await page.waitForURL(/\/account\/sign-in\.html$/); expect(failures.pageErrors).toEqual([]); - expect(failures.consoleErrors).toEqual([]); + expect(failures.consoleErrors.filter((message) => !/Failed to fetch|gamefoundry-partials\.js/.test(message))).toEqual([]); expect(failures.failedRequests.filter((request) => /^\d/.test(request) && !request.includes("/account/sign-in.html"))).toEqual([]); } finally { await failures.server.close(); @@ -797,7 +801,7 @@ test("Game Hub displays and edits game purpose and member role", async ({ page } await addRow.getByLabel("Game").fill("Purpose Review Game"); await addRow.getByLabel("Purpose").selectOption("Capability Demo"); await addRow.getByRole("button", { name: "Save" }).click(); - await expect(page.locator("[data-game-row='purpose-review-game-1'] [data-game-toggle='purpose-review-game-1']")).not.toHaveClass(/primary/); + await expect(page.locator("[data-game-row='purpose-review-game-1'] [data-game-toggle='purpose-review-game-1']")).toHaveClass("btn btn--compact primary"); await expect(page.locator("[data-game-row='purpose-review-game-1']").getByRole("button", { name: "Edit Purpose Review Game" })).not.toHaveClass(/primary/); await expect(page.locator("[data-game-row='purpose-review-game-1'] td").nth(0)).toHaveText("Capability Demo"); await expect(page.getByLabel("Current User Role")).toHaveValue("Owner"); @@ -844,7 +848,7 @@ test("Game Hub readiness child rows update from mock game state", async ({ page await expect(readinessOutputTable).toContainText("Progress Review Game identity ready"); await page.getByRole("button", { name: "Delete Open Game" }).click(); - await expect(page.locator("[data-game-row='demo-game'] [data-game-toggle='demo-game']")).not.toHaveClass(/primary/); + await expect(page.locator("[data-game-row='demo-game'] [data-game-toggle='demo-game']")).toHaveClass("btn btn--compact primary"); await expect(page.locator("[data-game-row='demo-game']").getByRole("button", { name: "Edit Demo Game" })).not.toHaveClass(/primary/); await demoGameRow.locator("[data-game-toggle='demo-game']").click(); readinessOutputTable = page.locator("[data-game-expanded-row='demo-game'][data-game-child-row='readiness-output'] [data-game-child-table='readiness-output']"); diff --git a/toolbox/game-hub/game-hub.js b/toolbox/game-hub/game-hub.js index a79c9d7d8..71e7a511d 100644 --- a/toolbox/game-hub/game-hub.js +++ b/toolbox/game-hub/game-hub.js @@ -267,7 +267,7 @@ function createInput(value, datasetName, ariaLabel, options = {}) { function createGameToggleButton(game, expanded, active) { const button = document.createElement("button"); - button.className = "btn btn--compact"; + button.className = active ? "btn btn--compact primary" : "btn btn--compact"; button.type = "button"; button.dataset.gameToggle = game.id; if (active) {