1+ diff --git a/assets/theme-v2/css/layout.css b/assets/theme-v2/css/layout.css
2+ index a9614b412..b392b3306 100644
3+ --- a/assets/theme-v2/css/layout.css
4+ +++ b/assets/theme-v2/css/layout.css
5+ @@ -733,7 +733,7 @@ body.tool-focus-mode .tool-workspace--table-scroll-focus .tool-table-scroll-regi
6+ .footer {
7+ margin-top: var(--space-46);
8+ border-top: var(--border-standard);
9+ - padding: var(--space-24) var(--space-0);
10+ + padding: var(--space-0) var(--space-0) var(--space-24);
11+ color: var(--muted)
12+ }
13+
114diff --git a/assets/theme-v2/css/status.css b/assets/theme-v2/css/status.css
215index 88e0d5e64..8fd18d811 100644
316--- a/assets/theme-v2/css/status.css
@@ -292,10 +305,10 @@ index fdb367328..24c935311 100644
292305
293306 export function refreshToolboxStatusBar() {
294307diff --git a/docs_build/dev/BUILD_PR.md b/docs_build/dev/BUILD_PR.md
295- index 65c4d9709..43a7f37d3 100644
308+ index 65c4d9709..5cf00344c 100644
296309--- a/docs_build/dev/BUILD_PR.md
297310+++ b/docs_build/dev/BUILD_PR.md
298- @@ -1,40 +1,48 @@
311+ @@ -1,40 +1,50 @@
299312- # PR_26175_ALFA_002-toolbox-status-bar-context-polish
300313+ # PR_26175_ALFA_003-toolbox-status-bar-single-row-polish
301314
@@ -317,6 +330,7 @@ index 65c4d9709..43a7f37d3 100644
317330+ - Remove selected game purpose from the visible status bar.
318331+ - Keep the game name and status message on the same row at desktop/toolbox widths.
319332 - Preserve normal placement above the footer.
333+ + - Remove redundant footer spacing below toolbox content by setting the shared Theme V2 footer top padding to `0px`.
320334 - Preserve fullscreen/tool display mode bottom anchoring.
321335+ - Ensure fullscreen center tool content and its scrollbar stop above the fixed status bar.
322336+ - Add bottom reserve equal to the status bar height for the fullscreen center tool area.
@@ -332,6 +346,7 @@ index 65c4d9709..43a7f37d3 100644
332346 - `docs_build/dev/BUILD_PR.md`
333347 - `assets/theme-v2/js/toolbox-status-bar.js`
334348 - `assets/theme-v2/css/status.css`
349+ + - `assets/theme-v2/css/layout.css`
335350 - `tests/playwright/tools/ToolboxSelectedGameStatusBar.spec.mjs`
336351- - `docs_build/dev/reports/PR_26175_ALFA_002-toolbox-status-bar-context-polish_report.md`
337352- - `docs_build/dev/reports/PR_26175_ALFA_002-toolbox-status-bar-context-polish_validation-lane.md`
@@ -357,7 +372,15 @@ index 65c4d9709..43a7f37d3 100644
357372 - No engine core changes.
358373 - No `start_of_day` folder changes.
359374
360- @@ -55,5 +63,5 @@ rg -n "<style|style=" assets/theme-v2/js/toolbox-status-bar.js assets/theme-v2/c
375+ @@ -48,12 +58,12 @@ npx playwright test tests/playwright/tools/ToolboxSelectedGameStatusBar.spec.mjs
376+ Also verify the changed source does not introduce inline styles or style blocks:
377+
378+ ```powershell
379+ - rg -n "<style|style=" assets/theme-v2/js/toolbox-status-bar.js assets/theme-v2/css/status.css tests/playwright/tools/ToolboxSelectedGameStatusBar.spec.mjs
380+ + rg -n "<style|style=" assets/theme-v2/js/toolbox-status-bar.js assets/theme-v2/css/status.css assets/theme-v2/css/layout.css tests/playwright/tools/ToolboxSelectedGameStatusBar.spec.mjs
381+ ```
382+
383+ ## Artifact
361384 Create repo-structured delta ZIP:
362385
363386 ```text
@@ -366,10 +389,10 @@ index 65c4d9709..43a7f37d3 100644
366389 ```
367390diff --git a/docs_build/dev/reports/PR_26175_ALFA_003-toolbox-status-bar-single-row-polish_report.md b/docs_build/dev/reports/PR_26175_ALFA_003-toolbox-status-bar-single-row-polish_report.md
368391new file mode 100644
369- index 000000000..7d05d0364
392+ index 000000000..46bb184b9
370393--- /dev/null
371394+++ b/docs_build/dev/reports/PR_26175_ALFA_003-toolbox-status-bar-single-row-polish_report.md
372- @@ -0,0 +1,18 @@
395+ @@ -0,0 +1,19 @@
373396+ # PR_26175_ALFA_003-toolbox-status-bar-single-row-polish Report
374397+
375398+ ## Summary
@@ -380,6 +403,7 @@ index 000000000..7d05d0364
380403+ - Kept the visible status bar contract to selected game name on the left and current status message in the center.
381404+ - Preserved Game Hub ownership of selected-game context and Idea Board selected-game filtering exclusion.
382405+ - Preserved normal placement above the footer.
406+ + - Removed redundant spacing beneath toolbox content by setting shared Theme V2 footer top padding to `0px`.
383407+ - Preserved fullscreen bottom anchoring and reserved the status-bar height for the fullscreen center tool area.
384408+ - Updated targeted Playwright coverage for removed labels, visible game/message text, same-row layout, and fullscreen center-panel bounds.
385409+
@@ -390,10 +414,10 @@ index 000000000..7d05d0364
390414+ - Theme V2 shared CSS/classes remain the styling surface.
391415diff --git a/docs_build/dev/reports/PR_26175_ALFA_003-toolbox-status-bar-single-row-polish_requirements-checklist.md b/docs_build/dev/reports/PR_26175_ALFA_003-toolbox-status-bar-single-row-polish_requirements-checklist.md
392416new file mode 100644
393- index 000000000..d6b988ef9
417+ index 000000000..8556dc162
394418--- /dev/null
395419+++ b/docs_build/dev/reports/PR_26175_ALFA_003-toolbox-status-bar-single-row-polish_requirements-checklist.md
396- @@ -0,0 +1,18 @@
420+ @@ -0,0 +1,20 @@
397421+ # PR_26175_ALFA_003-toolbox-status-bar-single-row-polish Requirements Checklist
398422+
399423+ - PASS: Status bar displays only selected game name and status message.
@@ -402,6 +426,8 @@ index 000000000..d6b988ef9
402426+ - PASS: Visible labels were removed.
403427+ - PASS: Selected game purpose was removed from the visible status bar.
404428+ - PASS: Game name and status message are on the same row.
429+ + - PASS: Shared Theme V2 footer top padding is `0px`.
430+ + - PASS: Redundant status bar/footer spacing below toolbox content was removed.
405431+ - PASS: Fullscreen status bar remains fixed at the bottom.
406432+ - PASS: Fullscreen center panel stops above the status bar.
407433+ - PASS: Fullscreen center panel has bottom reserve equal to the status bar height.
@@ -414,10 +440,10 @@ index 000000000..d6b988ef9
414440+ - PASS: Targeted Playwright coverage was updated and passed.
415441diff --git a/docs_build/dev/reports/PR_26175_ALFA_003-toolbox-status-bar-single-row-polish_validation-lane.md b/docs_build/dev/reports/PR_26175_ALFA_003-toolbox-status-bar-single-row-polish_validation-lane.md
416442new file mode 100644
417- index 000000000..eba7f2a1e
443+ index 000000000..059266001
418444--- /dev/null
419445+++ b/docs_build/dev/reports/PR_26175_ALFA_003-toolbox-status-bar-single-row-polish_validation-lane.md
420- @@ -0,0 +1,26 @@
446+ @@ -0,0 +1,27 @@
421447+ # PR_26175_ALFA_003-toolbox-status-bar-single-row-polish Validation Lane
422448+
423449+ ## Commands
@@ -428,7 +454,7 @@ index 000000000..eba7f2a1e
428454+ Result: PASS, 6 tests passed.
429455+
430456+ ```powershell
431- + rg -n "<style|style=" assets/theme-v2/js/toolbox-status-bar.js assets/theme-v2/css/status.css tests/playwright/tools/ToolboxSelectedGameStatusBar.spec.mjs
457+ + rg -n "<style|style=" assets/theme-v2/js/toolbox-status-bar.js assets/theme-v2/css/status.css assets/theme-v2/css/layout.css tests/playwright/tools/ToolboxSelectedGameStatusBar.spec.mjs
432458+ ```
433459+
434460+ Result: PASS, no matches.
@@ -440,15 +466,17 @@ index 000000000..eba7f2a1e
440466+ - Selected game purpose is not visible.
441467+ - Status message is visible in the center area.
442468+ - Game name and status message occupy the same row.
469+ + - Shared Theme V2 footer top padding is `0px` beneath the status bar.
443470+ - Fullscreen status bar remains fixed to the bottom.
444471+ - Fullscreen center panel bottom is above the status bar.
445472+ - Fullscreen center panel has a bottom reserve equal to the status bar height.
446473+ - Idea Board remains excluded from selected-game filtering.
447474diff --git a/docs_build/dev/reports/codex_changed_files.txt b/docs_build/dev/reports/codex_changed_files.txt
448- index fb32c88ea..8d10dee5a 100644
475+ index fb32c88ea..c218c84cc 100644
449476--- a/docs_build/dev/reports/codex_changed_files.txt
450477+++ b/docs_build/dev/reports/codex_changed_files.txt
451- @@ -1,9 +1,9 @@
478+ @@ -1,9 +1,10 @@
479+ + assets/theme-v2/css/layout.css
452480 assets/theme-v2/css/status.css
453481 assets/theme-v2/js/toolbox-status-bar.js
454482 docs_build/dev/BUILD_PR.md
@@ -462,10 +490,10 @@ index fb32c88ea..8d10dee5a 100644
462490 docs_build/dev/reports/codex_review.diff
463491 tests/playwright/tools/ToolboxSelectedGameStatusBar.spec.mjs
464492diff --git a/tests/playwright/tools/ToolboxSelectedGameStatusBar.spec.mjs b/tests/playwright/tools/ToolboxSelectedGameStatusBar.spec.mjs
465- index 065fbce4a..aacaa2c19 100644
493+ index 065fbce4a..9b54f9176 100644
466494--- a/tests/playwright/tools/ToolboxSelectedGameStatusBar.spec.mjs
467495+++ b/tests/playwright/tools/ToolboxSelectedGameStatusBar.spec.mjs
468- @@ -113,21 +113,62 @@ function creatorSession() {
496+ @@ -113,21 +113,64 @@ function creatorSession() {
469497 };
470498 }
471499
@@ -500,6 +528,7 @@ index 065fbce4a..aacaa2c19 100644
500528+ };
501529+ };
502530 const footer = document.querySelector("footer.footer");
531+ + const footerStyle = footer ? getComputedStyle(footer) : null;
503532+ const centerPanel = document.querySelector(".tool-center-panel");
504533+ const gameName = bar.querySelector("[data-toolbox-selected-game-name]");
505534+ const message = bar.querySelector("[data-toolbox-status-message]");
@@ -519,6 +548,7 @@ index 065fbce4a..aacaa2c19 100644
519548 dataset: { ...bar.dataset },
520549 filter: document.body.dataset.toolboxSelectedGameFilter || "",
521550 footerFollowsBar: footer ? Boolean(bar.compareDocumentPosition(footer) & Node.DOCUMENT_POSITION_FOLLOWING) : false,
551+ + footerPaddingTop: footerStyle ? parseFloat(footerStyle.paddingTop) || 0 : null,
522552 gameId: document.body.dataset.toolboxSelectedGameId || "",
523553- gameText: bar.querySelector("[data-toolbox-selected-game]")?.textContent.replace(/\s+/g, " ").trim() || "",
524554- messageText: bar.querySelector("[data-toolbox-status-center]")?.textContent.replace(/\s+/g, " ").trim() || "",
@@ -531,7 +561,7 @@ index 065fbce4a..aacaa2c19 100644
531561 topBeforeFooter: footerBox ? barBox.bottom <= footerBox.top + 1 : false,
532562 };
533563 });
534- @@ -141,12 +182 ,12 @@ test("shared toolbox status bar shows selected Game Hub game above the footer",
564+ @@ -141,12 +184 ,12 @@ test("shared toolbox status bar shows selected Game Hub game above the footer",
535565 await expect(statusBar).toBeVisible();
536566 await expect(page.locator("style, [style], script:not([src])")).toHaveCount(0);
537567 await expect(statusBar).not.toContainText("Environment");
@@ -548,7 +578,11 @@ index 065fbce4a..aacaa2c19 100644
548578 await expect(statusBar.locator("[data-toolbox-status-message]")).toContainText("Game Design mock repository ready.");
549579 await expect(page.locator("body")).toHaveAttribute("data-toolbox-selected-game-id", "demo-game");
550580 await expect(page.locator("body")).toHaveAttribute("data-toolbox-selected-game-filter", "active");
551- @@ -157,6 +198,11 @@ test("shared toolbox status bar shows selected Game Hub game above the footer",
581+ @@ -154,9 +197,15 @@ test("shared toolbox status bar shows selected Game Hub game above the footer",
582+ const snapshot = await statusBarSnapshot(page);
583+ expect(snapshot.footerFollowsBar).toBe(true);
584+ expect(snapshot.topBeforeFooter).toBe(true);
585+ + expect(snapshot.footerPaddingTop).toBe(0);
552586 expect(snapshot.position).not.toBe("fixed");
553587 expect(snapshot.dataset.selectedGameState).toBe("active");
554588 expect(snapshot.dataset.selectedGameRequired).toBe("true");
@@ -560,7 +594,7 @@ index 065fbce4a..aacaa2c19 100644
560594
561595 expectNoPageFailures(failures);
562596 } finally {
563- @@ -175,11 +221 ,14 @@ test("shared toolbox status bar center reports save state after Game Hub saves",
597+ @@ -175,11 +224 ,14 @@ test("shared toolbox status bar center reports save state after Game Hub saves",
564598 await addGameRow.getByLabel("Status").selectOption("Ready for Testing");
565599 await addGameRow.getByRole("button", { name: "Save" }).click();
566600
@@ -580,7 +614,7 @@ index 065fbce4a..aacaa2c19 100644
580614
581615 expectNoPageFailures(failures);
582616 } finally {
583- @@ -199,6 +248 ,9 @@ test("shared toolbox status bar anchors to the bottom in tool display mode", asy
617+ @@ -199,6 +251 ,9 @@ test("shared toolbox status bar anchors to the bottom in tool display mode", asy
584618 expect(snapshot.position).toBe("fixed");
585619 expect(Math.abs(snapshot.bottomGap)).toBeLessThanOrEqual(2);
586620 expect(snapshot.gameText).toContain("Demo Game");
@@ -590,7 +624,7 @@ index 065fbce4a..aacaa2c19 100644
590624
591625 expectNoPageFailures(failures);
592626 } finally {
593- @@ -213,12 +265 ,15 @@ test("Game Hub owner selection updates the global toolbox status bar", async ({
627+ @@ -213,12 +268 ,15 @@ test("Game Hub owner selection updates the global toolbox status bar", async ({
594628 await expect(page.locator("[data-toolbox-selected-game-name]")).toHaveText("Demo Game");
595629 await page.locator("[data-game-toggle='gravity-demo']").click();
596630 await expect(page.locator("[data-toolbox-selected-game-name]")).toHaveText("Gravity Demo");
@@ -610,7 +644,7 @@ index 065fbce4a..aacaa2c19 100644
610644
611645 expectNoPageFailures(failures);
612646 } finally {
613- @@ -231,12 +286 ,12 @@ test("non-Idea Board toolbox pages show a creator-safe prompt when no Game Hub g
647+ @@ -231,12 +289 ,12 @@ test("non-Idea Board toolbox pages show a creator-safe prompt when no Game Hub g
614648
615649 try {
616650 const statusBar = page.locator("[data-toolbox-status-bar]");
@@ -627,7 +661,7 @@ index 065fbce4a..aacaa2c19 100644
627661 await expect(page.locator("body")).toHaveAttribute("data-toolbox-selected-game-filter", "missing");
628662 await expect(page.locator("body")).not.toHaveAttribute("data-toolbox-selected-game-id", /.+/);
629663
630- @@ -256,9 +311 ,10 @@ test("Idea Board is excluded from selected-game filtering and does not show the
664+ @@ -256,9 +314 ,10 @@ test("Idea Board is excluded from selected-game filtering and does not show the
631665 try {
632666 const statusBar = page.locator("[data-toolbox-status-bar]");
633667 await expect(statusBar).toBeVisible();
0 commit comments