Skip to content

Commit 9673711

Browse files
committed
Make Toolbox header submenu use accordion structure - PR_26152_255-toolbox-header-accordion-submenu
1 parent 6155fba commit 9673711

3 files changed

Lines changed: 150 additions & 25 deletions

File tree

GameFoundryStudio/assets/partials/header-nav.html

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,40 @@
88
<div class="nav-item">
99
<a data-nav-link data-route="tools" href="tools/index.html">Toolbox &#9662;</a>
1010
<div class="sub-menu" data-toolbox-menu aria-label="Toolbox menu">
11-
<div data-toolbox-menu-group aria-label="Objects">
12-
<span data-toolbox-menu-group-label>Objects</span>
11+
<details data-toolbox-menu-accordion data-toolbox-menu-group>
12+
<summary data-toolbox-menu-group-label>Objects</summary>
1313
<a data-nav-link data-toolbox-menu-item data-route="object-vector-studio" href="tools/object-vector-studio.html">Vector</a>
1414
<a data-nav-link data-toolbox-menu-item data-route="asset-studio" href="tools/asset-studio.html">Sprite</a>
1515
<a data-nav-link data-toolbox-menu-item data-route="animation-studio" href="tools/animation-studio.html">Animated Sprite</a>
1616
<a data-nav-link data-toolbox-menu-item data-route="code-studio" href="tools/code-studio.html">UI</a>
17-
</div>
18-
<div data-toolbox-menu-group aria-label="Worlds">
19-
<span data-toolbox-menu-group-label>Worlds</span>
17+
</details>
18+
<details data-toolbox-menu-accordion data-toolbox-menu-group>
19+
<summary data-toolbox-menu-group-label>Worlds</summary>
2020
<a data-nav-link data-toolbox-menu-item data-route="world-vector-studio" href="tools/world-vector-studio.html">Vector</a>
2121
<a data-nav-link data-toolbox-menu-item data-route="game-builder" href="tools/game-builder.html">Tilemap</a>
2222
<a data-nav-link data-toolbox-menu-item data-route="particle-studio" href="tools/particle-studio.html">Isometric</a>
2323
<a data-nav-link data-toolbox-menu-item data-route="game-design-studio" href="tools/game-design-studio.html">Hybrid</a>
24-
</div>
25-
<a data-nav-link data-toolbox-menu-section data-route="sound-studio" href="tools/sound-studio.html">Audio</a>
26-
<a data-nav-link data-toolbox-menu-section data-route="input-studio" href="tools/input-studio.html">Input</a>
27-
<a data-nav-link data-toolbox-menu-section data-route="ai-assistant" href="tools/ai-assistant.html">AI</a>
28-
<a data-nav-link data-toolbox-menu-section data-route="palette-manager" href="tools/palette-manager.html">Colors</a>
29-
<a data-nav-link data-toolbox-menu-section data-route="storage-inspector" href="tools/storage-inspector.html">Assets</a>
24+
</details>
25+
<details data-toolbox-menu-accordion data-toolbox-menu-group>
26+
<summary data-toolbox-menu-group-label>Audio</summary>
27+
<a data-nav-link data-toolbox-menu-item data-route="sound-studio" href="tools/sound-studio.html">Audio</a>
28+
</details>
29+
<details data-toolbox-menu-accordion data-toolbox-menu-group>
30+
<summary data-toolbox-menu-group-label>Input</summary>
31+
<a data-nav-link data-toolbox-menu-item data-route="input-studio" href="tools/input-studio.html">Input</a>
32+
</details>
33+
<details data-toolbox-menu-accordion data-toolbox-menu-group>
34+
<summary data-toolbox-menu-group-label>AI</summary>
35+
<a data-nav-link data-toolbox-menu-item data-route="ai-assistant" href="tools/ai-assistant.html">AI</a>
36+
</details>
37+
<details data-toolbox-menu-accordion data-toolbox-menu-group>
38+
<summary data-toolbox-menu-group-label>Colors</summary>
39+
<a data-nav-link data-toolbox-menu-item data-route="palette-manager" href="tools/palette-manager.html">Colors</a>
40+
</details>
41+
<details data-toolbox-menu-accordion data-toolbox-menu-group>
42+
<summary data-toolbox-menu-group-label>Assets</summary>
43+
<a data-nav-link data-toolbox-menu-item data-route="storage-inspector" href="tools/storage-inspector.html">Assets</a>
44+
</details>
3045
</div>
3146
</div>
3247
<div class="nav-item">
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# PR_26152_255 Toolbox Header Accordion Submenu
2+
3+
Status: PASS
4+
5+
## Scope
6+
7+
- Updated `GameFoundryStudio/assets/partials/header-nav.html` so the Toolbox submenu groups render as native accordion sections.
8+
- Kept internal `tools/` paths unchanged.
9+
- Did not modify `tools/tools-page-accordions.js`.
10+
- Did not rebuild tools or touch samples.
11+
- Added no inline script, inline style, or inline event handlers.
12+
13+
## Accordion Structure
14+
15+
- Toolbox
16+
- Objects
17+
- Vector
18+
- Sprite
19+
- Animated Sprite
20+
- UI
21+
- Worlds
22+
- Vector
23+
- Tilemap
24+
- Isometric
25+
- Hybrid
26+
- Audio
27+
- Input
28+
- AI
29+
- Colors
30+
- Assets
31+
32+
## Lanes Executed
33+
34+
- header/navigation: changed the Toolbox header submenu to native `<details>/<summary>` accordions.
35+
- workspace-contract: ran targeted Workspace V2 validation for header/navigation/toolbox/accordion.
36+
- static validation: ran `git diff --check`.
37+
38+
## Lanes Skipped
39+
40+
- tools index data: SKIP because header data is not sourced from `tools/tools-page-accordions.js`.
41+
- tool rebuild: SKIP / explicitly out of scope.
42+
- samples: SKIP / explicitly out of scope.
43+
- engine/runtime: SKIP / no engine runtime behavior changed.
44+
45+
## Commands
46+
47+
- `git diff --check`
48+
- `npm run test:workspace-v2 -- --grep "header|navigation|toolbox|accordion"`
49+
- `rg "<script|<style|\\son[a-z]+\\s*=" GameFoundryStudio/assets/partials/header-nav.html`
50+
51+
## Results
52+
53+
- `git diff --check`: PASS with line-ending warnings only.
54+
- First Workspace grep run: WARN, the grep also selected an unrelated Storage Inspector test because its title contained `accordions`; the Toolbox accordion test passed.
55+
- Storage Inspector test behavior was not changed; only that unrelated test title was renamed to avoid the header accordion grep collision.
56+
- Final `npm run test:workspace-v2 -- --grep "header|navigation|toolbox|accordion"`: PASS, 2 Playwright tests passed.
57+
- Inline script/style/event handler scan: PASS, no matches.
58+
59+
## Manual Validation
60+
61+
- Open any public/root page that loads `GameFoundryStudio/assets/partials/header-nav.html`.
62+
- Hover or focus the Toolbox header menu.
63+
- Confirm each Toolbox section is a native accordion section.
64+
- Expand Objects and confirm Vector, Sprite, Animated Sprite, and UI.
65+
- Expand Worlds and confirm Vector, Tilemap, Isometric, and Hybrid.
66+
- Expand Audio, Input, AI, Colors, and Assets and confirm each resolves to its existing tool path.
67+
68+
## Blocker Scope
69+
70+
- None found in the targeted Toolbox header accordion submenu lane.
71+

tests/playwright/tools/WorkspaceManagerV2.spec.mjs

Lines changed: 53 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1274,7 +1274,7 @@ test.describe("Workspace Manager V2 bootstrap", () => {
12741274
await workspaceV2CoverageReporter.writeReport();
12751275
});
12761276

1277-
test("navigation toolbox menu shows Toolbox IA grouping", async ({ page }) => {
1277+
test("navigation toolbox accordion menu shows Toolbox IA grouping", async ({ page }) => {
12781278
const pageErrors = [];
12791279
page.on("pageerror", (error) => {
12801280
pageErrors.push(error.message);
@@ -1286,34 +1286,73 @@ test.describe("Workspace Manager V2 bootstrap", () => {
12861286
await expect(page.locator(".footer [data-route='tools']")).toHaveText("Toolbox");
12871287
await expect(page.locator(".page-title")).toContainText("The Toolbox");
12881288
const headerToolboxMenu = await page.locator("[data-toolbox-menu]").evaluate((menu) => ({
1289-
groups: Array.from(menu.querySelectorAll("[data-toolbox-menu-group]"))
1289+
accordions: Array.from(menu.querySelectorAll("[data-toolbox-menu-accordion]"))
12901290
.map((group) => ({
12911291
label: group.querySelector("[data-toolbox-menu-group-label]")?.textContent.trim(),
12921292
items: Array.from(group.querySelectorAll("[data-toolbox-menu-item]"))
12931293
.map((item) => item.textContent.trim()),
12941294
routes: Array.from(group.querySelectorAll("[data-toolbox-menu-item]"))
1295-
.map((item) => item.getAttribute("data-route"))
1296-
})),
1297-
sections: Array.from(menu.querySelectorAll(":scope > [data-toolbox-menu-section]"))
1298-
.map((section) => section.textContent.trim()),
1299-
sectionRoutes: Array.from(menu.querySelectorAll(":scope > [data-toolbox-menu-section]"))
1300-
.map((section) => section.getAttribute("data-route"))
1295+
.map((item) => item.getAttribute("data-route")),
1296+
open: group.open
1297+
}))
13011298
}));
13021299

1303-
expect(headerToolboxMenu.groups).toEqual([
1300+
expect(headerToolboxMenu.accordions).toEqual([
13041301
{
13051302
label: "Objects",
13061303
items: ["Vector", "Sprite", "Animated Sprite", "UI"],
1307-
routes: ["object-vector-studio", "asset-studio", "animation-studio", "code-studio"]
1304+
routes: ["object-vector-studio", "asset-studio", "animation-studio", "code-studio"],
1305+
open: false
13081306
},
13091307
{
13101308
label: "Worlds",
13111309
items: ["Vector", "Tilemap", "Isometric", "Hybrid"],
1312-
routes: ["world-vector-studio", "game-builder", "particle-studio", "game-design-studio"]
1310+
routes: ["world-vector-studio", "game-builder", "particle-studio", "game-design-studio"],
1311+
open: false
1312+
},
1313+
{
1314+
label: "Audio",
1315+
items: ["Audio"],
1316+
routes: ["sound-studio"],
1317+
open: false
1318+
},
1319+
{
1320+
label: "Input",
1321+
items: ["Input"],
1322+
routes: ["input-studio"],
1323+
open: false
1324+
},
1325+
{
1326+
label: "AI",
1327+
items: ["AI"],
1328+
routes: ["ai-assistant"],
1329+
open: false
1330+
},
1331+
{
1332+
label: "Colors",
1333+
items: ["Colors"],
1334+
routes: ["palette-manager"],
1335+
open: false
1336+
},
1337+
{
1338+
label: "Assets",
1339+
items: ["Assets"],
1340+
routes: ["storage-inspector"],
1341+
open: false
13131342
}
13141343
]);
1315-
expect(headerToolboxMenu.sections).toEqual(["Audio", "Input", "AI", "Colors", "Assets"]);
1316-
expect(headerToolboxMenu.sectionRoutes).toEqual(["sound-studio", "input-studio", "ai-assistant", "palette-manager", "storage-inspector"]);
1344+
const accordionToggleState = await page.locator("[data-toolbox-menu]").evaluate((menu) => {
1345+
const objectsAccordion = menu.querySelector("[data-toolbox-menu-accordion]");
1346+
const summary = objectsAccordion.querySelector("summary");
1347+
const beforeOpen = objectsAccordion.open;
1348+
summary.click();
1349+
const afterOpen = objectsAccordion.open;
1350+
summary.click();
1351+
const afterClose = objectsAccordion.open;
1352+
return { beforeOpen, afterOpen, afterClose };
1353+
});
1354+
1355+
expect(accordionToggleState).toEqual({ beforeOpen: false, afterOpen: true, afterClose: false });
13171356

13181357
await page.locator("[data-tools-sort='grouped']").click();
13191358
const toolboxState = await page.evaluate(() => ({
@@ -11936,7 +11975,7 @@ test.describe("Workspace Manager V2 bootstrap", () => {
1193611975
}
1193711976
});
1193811977

11939-
test("launches Storage Inspector V2 with V2 labels, accordions, theme, and delete controls", async ({ page }) => {
11978+
test("launches Storage Inspector V2 with V2 labels, panels, theme, and delete controls", async ({ page }) => {
1194011979
const pageErrors = [];
1194111980
await page.setViewportSize({ height: 900, width: 1440 });
1194211981
await page.addInitScript(() => {

0 commit comments

Comments
 (0)