Skip to content

Commit b36241f

Browse files
author
DavidQ
committed
Fix Workspace Manager V2 theme parity and mark old Workspace V2 deprecated - PR_26126_112-workspace-manager-v2-theme-contract-fix
1 parent 208d8c5 commit b36241f

5 files changed

Lines changed: 186 additions & 24 deletions

File tree

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# PR_26126_112 Deprecated Workspace V2 Notes
2+
3+
## Deprecated Surface
4+
- `tools/workspace-v2/` is treated as deprecated for this PR.
5+
- No files under `tools/workspace-v2/` were modified.
6+
- Workspace Manager V2 theme work stayed under `tools/workspace-manager-v2/` and its dedicated Playwright coverage.
7+
8+
## Scope Guard
9+
- Command check: `git diff --name-only | rg "^tools/workspace-v2/"`
10+
- Result: no changed files under deprecated `tools/workspace-v2/`.
11+
12+
## Integration Boundary
13+
- This PR does not add new Asset Manager V2 integration behavior.
14+
- Existing Workspace Manager V2 launch coverage remains in place so the workspace-v2 aggregate gate can continue to validate current launch guard behavior.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# PR_26126_112 Manual Validation Notes
2+
3+
## Automated Validation
4+
- `npm run test:workspace-v2` passed.
5+
- Result: 18 Playwright tests passed.
6+
7+
## Manual Checks
8+
1. Open `tools/workspace-manager-v2/index.html`.
9+
- Expected: Workspace Manager V2 uses the same purple shared tool theme as Tool Template V2, Palette Manager V2, Preview Generator V2, and Asset Manager V2.
10+
- Expected: header, app shell, panels, accordions, select, status textarea, and summary surfaces use shared theme colors.
11+
2. Inspect Workspace Manager V2 source.
12+
- Expected: stylesheet import order is `main.css`, `hubCommon.css`, `accordionV2.css`, then `workspaceManagerV2.css`.
13+
- Expected: body has `tools-platform-tool-page`, `tools-platform-surface`, and `hub-page-tools`.
14+
3. Confirm deprecated Workspace V2 was not touched.
15+
- Expected: no changed files under `tools/workspace-v2/`.
16+
4. Open `tools/asset-manager-v2/index.html?workspace=prod`.
17+
- Expected: direct production launch remains blocked by the Asset Manager V2 launch guard.
18+
19+
## Out Of Scope
20+
- No sample JSON validation was performed or required.
21+
- No sample JSON was modified.
22+
- No new Asset Manager V2 integration behavior was added.
23+
- Full samples smoke test was skipped because the change is scoped to Workspace Manager V2 theme parity and targeted Playwright coverage.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# PR_26126_112 Theme Parity Notes
2+
3+
## Workspace Manager V2 Theme Fix
4+
- `tools/workspace-manager-v2/styles/workspaceManagerV2.css` now maps its local surface variables to the shared First-Class Tool V2 theme tokens:
5+
- `--bg-gradient`
6+
- `--panel`
7+
- `--surface-inline`
8+
- `--surface-border`
9+
- `--line`
10+
- `--text`
11+
- `--muted`
12+
- `--accent`
13+
- Local green/teal hardcoded colors were removed from Workspace Manager V2 CSS.
14+
- The local CSS retains native browser button system colors, matching the existing `tools/templates-v2` pattern.
15+
- Workspace Manager V2 app shell, frame, panel, accordion, input, and status surfaces now resolve through the same token source used by Tool Template V2, Palette Manager V2, Preview Generator V2, and Asset Manager V2.
16+
17+
## First-Class Tool V2 Contract Check
18+
- CSS import order remains:
19+
1. `../../src/engine/theme/main.css`
20+
2. `../../src/engine/ui/hubCommon.css`
21+
3. `../../src/engine/theme/accordionV2/accordionV2.css`
22+
4. `./styles/workspaceManagerV2.css`
23+
- Body classes remain:
24+
- `tools-platform-tool-page`
25+
- `tools-platform-surface`
26+
- `hub-page-tools`
27+
- Playwright validates the import order, body class usage, absence of local hardcoded CSS color literals, and computed style parity against shared tokens.
28+
29+
## Forward-Looking Theme Contract
30+
- New first-class tools should import the same theme sources in the same order before local tool CSS.
31+
- New first-class tools should use local CSS variables only as semantic aliases to approved shared theme tokens.
32+
- New first-class tools should not introduce local color palettes, local gradients, local rgba surfaces, or local text colors unless a future PR explicitly adds the token to the shared theme source.
33+
- Tool-local CSS may define layout, spacing, sizing, and component-specific structure, but color and surface values should resolve through shared theme tokens.

tests/playwright/tools/WorkspaceManagerV2.spec.mjs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,81 @@ test.describe("Workspace Manager V2 bootstrap", () => {
4949
}
5050
});
5151

52+
test("uses First-Class Tool V2 theme contract", async ({ page }) => {
53+
const server = await openWorkspaceManagerV2(page);
54+
const pageErrors = [];
55+
56+
page.on("pageerror", (error) => {
57+
pageErrors.push(error.message);
58+
});
59+
60+
try {
61+
await expect(page.locator("body")).toHaveClass(/tools-platform-tool-page/);
62+
await expect(page.locator("body")).toHaveClass(/tools-platform-surface/);
63+
await expect(page.locator("body")).toHaveClass(/hub-page-tools/);
64+
const themeContract = await page.evaluate(async () => {
65+
const stylesheetPaths = Array.from(document.querySelectorAll('link[rel="stylesheet"]'))
66+
.map((link) => new URL(link.href).pathname);
67+
const css = await fetch("/tools/workspace-manager-v2/styles/workspaceManagerV2.css", { cache: "no-store" }).then((response) => response.text());
68+
const probeStyle = (property, value) => {
69+
const probe = document.createElement("div");
70+
probe.style[property] = value;
71+
document.body.append(probe);
72+
const computed = getComputedStyle(probe)[property];
73+
probe.remove();
74+
return computed;
75+
};
76+
const bodyStyle = getComputedStyle(document.body);
77+
const shellStyle = getComputedStyle(document.querySelector(".workspace-manager-v2.app-shell"));
78+
const panelStyle = getComputedStyle(document.querySelector(".workspace-manager-v2__panel"));
79+
const summaryStyle = getComputedStyle(document.querySelector(".tools-platform-frame__accordion-summary"));
80+
const textareaStyle = getComputedStyle(document.querySelector("#statusLog"));
81+
return {
82+
bodyBackground: bodyStyle.backgroundImage,
83+
bodyColor: bodyStyle.color,
84+
cssHasHardcodedColors: /#[0-9a-f]{3,8}|rgba?\(|linear-gradient/i.test(css),
85+
cssUsesThemeTokens: [
86+
"--workspace-manager-v2-bg: var(--bg-gradient);",
87+
"--workspace-manager-v2-panel: var(--panel);",
88+
"--workspace-manager-v2-surface: var(--surface-inline);",
89+
"--workspace-manager-v2-line: var(--line);",
90+
"--workspace-manager-v2-text: var(--text);",
91+
"--workspace-manager-v2-muted: var(--muted);",
92+
"--workspace-manager-v2-accent: var(--accent);"
93+
].every((snippet) => css.includes(snippet)),
94+
expectedBackground: probeStyle("backgroundImage", "var(--bg-gradient)"),
95+
expectedInputBackground: probeStyle("backgroundColor", "var(--surface-inline)"),
96+
expectedLine: probeStyle("borderColor", "var(--line)"),
97+
expectedPanel: probeStyle("backgroundColor", "var(--panel)"),
98+
expectedText: probeStyle("color", "var(--text)"),
99+
panelBackground: panelStyle.backgroundColor,
100+
shellBorder: shellStyle.borderTopColor,
101+
stylesheetPaths,
102+
summaryBackground: summaryStyle.backgroundColor,
103+
textareaBackground: textareaStyle.backgroundColor
104+
};
105+
});
106+
expect(themeContract.stylesheetPaths).toEqual([
107+
"/src/engine/theme/main.css",
108+
"/src/engine/ui/hubCommon.css",
109+
"/src/engine/theme/accordionV2/accordionV2.css",
110+
"/tools/workspace-manager-v2/styles/workspaceManagerV2.css"
111+
]);
112+
expect(themeContract.cssHasHardcodedColors).toBe(false);
113+
expect(themeContract.cssUsesThemeTokens).toBe(true);
114+
expect(themeContract.bodyColor).toBe(themeContract.expectedText);
115+
expect(themeContract.bodyBackground).toBe(themeContract.expectedBackground);
116+
expect(themeContract.shellBorder).toBe(themeContract.expectedLine);
117+
expect(themeContract.panelBackground).toBe(themeContract.expectedPanel);
118+
expect(themeContract.summaryBackground).toBe(themeContract.expectedPanel);
119+
expect(themeContract.textareaBackground).toBe(themeContract.expectedInputBackground);
120+
expect(pageErrors).toEqual([]);
121+
} finally {
122+
await coverageReporter.stop(page);
123+
await server.close();
124+
}
125+
});
126+
52127
test("launches Asset Manager V2 through Workspace Manager V2 session context", async ({ page }) => {
53128
const server = await openWorkspaceManagerV2(page);
54129
const pageErrors = [];

tools/workspace-manager-v2/styles/workspaceManagerV2.css

Lines changed: 41 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
:root {
2-
--workspace-manager-v2-bg: linear-gradient(180deg, #1f2937 0%, #365314 52%, #0f766e 100%);
3-
--workspace-manager-v2-panel: rgba(17, 24, 39, 0.94);
4-
--workspace-manager-v2-surface: rgba(8, 47, 73, 0.72);
5-
--workspace-manager-v2-line: rgba(209, 250, 229, 0.24);
6-
--workspace-manager-v2-input: rgba(6, 78, 59, 0.9);
7-
--workspace-manager-v2-text: #f8fafc;
8-
--workspace-manager-v2-muted: #d1fae5;
9-
--workspace-manager-v2-accent: #86efac;
10-
--workspace-manager-v2-warning: #fde68a;
11-
--workspace-manager-v2-danger: #fecaca;
12-
--workspace-manager-v2-shadow: 0 18px 38px rgba(0, 0, 0, 0.24);
2+
--workspace-manager-v2-bg: var(--bg-gradient);
3+
--workspace-manager-v2-panel: var(--panel);
4+
--workspace-manager-v2-surface: var(--surface-inline);
5+
--workspace-manager-v2-input: var(--surface-inline);
6+
--workspace-manager-v2-line: var(--line);
7+
--workspace-manager-v2-surface-border: var(--surface-border);
8+
--workspace-manager-v2-text: var(--text);
9+
--workspace-manager-v2-muted: var(--muted);
10+
--workspace-manager-v2-accent: var(--accent);
11+
--workspace-manager-v2-header-surface: var(--tools-shell-glass, var(--panel));
12+
--workspace-manager-v2-shadow: var(--tools-shell-shadow, none);
13+
--workspace-manager-v2-shadow-strong: var(--tools-shell-shadow-strong, none);
1314
color-scheme: dark;
1415
font-family: Inter, Segoe UI, system-ui, sans-serif;
1516
}
@@ -56,12 +57,17 @@ textarea:focus-visible {
5657

5758
select,
5859
textarea {
59-
border: 1px solid var(--workspace-manager-v2-line);
60-
border-radius: 8px !important;
60+
border: 1px solid var(--workspace-manager-v2-surface-border);
61+
border-radius: 10px !important;
6162
background: var(--workspace-manager-v2-input);
6263
color: var(--workspace-manager-v2-text);
6364
}
6465

66+
select:hover,
67+
textarea:hover {
68+
border-color: var(--card-hover-border);
69+
}
70+
6571
.is-collapsible {
6672
border-bottom: 1px solid var(--workspace-manager-v2-line);
6773
background: transparent;
@@ -95,12 +101,15 @@ textarea {
95101
--tools-platform-frame-surface: var(--workspace-manager-v2-panel);
96102
--tools-platform-frame-line: var(--workspace-manager-v2-line);
97103
border: 1px solid var(--workspace-manager-v2-line);
98-
border-radius: 8px;
99-
background: var(--workspace-manager-v2-panel);
104+
border-radius: 18px;
105+
background: var(--workspace-manager-v2-bg);
100106
box-shadow: var(--workspace-manager-v2-shadow);
107+
color: var(--workspace-manager-v2-text);
101108
}
102109

103110
.workspace-manager-v2__local-shell-frame .tools-platform-frame__accordion-content {
111+
display: grid;
112+
gap: 10px;
104113
padding: 12px 14px;
105114
}
106115

@@ -109,18 +118,22 @@ textarea {
109118
align-items: center;
110119
justify-content: space-between;
111120
gap: 12px;
112-
border-radius: 8px;
113-
background: rgba(20, 83, 45, 0.86);
121+
border-radius: 12px;
122+
background: var(--workspace-manager-v2-header-surface);
114123
padding: 12px 14px;
115124
}
116125

117-
.workspace-manager-v2__local-shell-frame h1,
118-
.workspace-manager-v2__local-shell-frame h2,
126+
.workspace-manager-v2__local-shell-frame .tools-platform-frame__title,
127+
.workspace-manager-v2__local-shell-frame .tools-platform-frame__eyebrow,
119128
.workspace-manager-v2__local-shell-frame .tools-platform-frame__meta {
120129
margin: 0;
121130
}
122131

123-
.workspace-manager-v2__local-shell-frame h2,
132+
.workspace-manager-v2__local-shell-frame .tools-platform-frame__title {
133+
color: var(--workspace-manager-v2-text);
134+
}
135+
136+
.workspace-manager-v2__local-shell-frame .tools-platform-frame__eyebrow,
124137
.workspace-manager-v2__local-shell-frame .tools-platform-frame__meta {
125138
color: var(--workspace-manager-v2-muted);
126139
}
@@ -140,13 +153,16 @@ textarea {
140153
.workspace-manager-v2.app-shell {
141154
height: calc(100vh - 137px);
142155
min-height: 0;
143-
width: min(1500px, calc(100% - 32px));
156+
width: min(1600px, calc(100% - 32px));
144157
display: grid;
145-
grid-template-columns: 300px minmax(0, 1fr) 360px;
158+
grid-template-columns: 340px minmax(0, 1fr) 360px;
146159
gap: 14px;
147160
margin: 0 auto 16px;
161+
border: 1px solid var(--workspace-manager-v2-line);
162+
border-radius: 20px;
163+
box-shadow: var(--workspace-manager-v2-shadow-strong);
148164
overflow: hidden;
149-
padding: 16px 0 0;
165+
padding: 16px;
150166
}
151167

152168
.workspace-manager-v2__panel {
@@ -173,6 +189,7 @@ textarea {
173189
border: 1px solid var(--workspace-manager-v2-line);
174190
border-radius: 8px;
175191
background: var(--workspace-manager-v2-surface);
192+
box-shadow: var(--workspace-manager-v2-shadow);
176193
overflow: hidden;
177194
}
178195

@@ -261,7 +278,7 @@ textarea {
261278
min-width: 0;
262279
border: 1px solid var(--workspace-manager-v2-line);
263280
border-radius: 8px;
264-
background: rgba(17, 24, 39, 0.52);
281+
background: var(--workspace-manager-v2-surface);
265282
padding: 12px;
266283
}
267284

0 commit comments

Comments
 (0)