UI_POLISH_1_PLAN

gxwf-ui polish — round 2

Date: 2026-04-23 Parent context: Round 1 redesign landed on branch styling in galaxy-tool-util-ts. Dropped gold borders, moved Clean/Lint/Export/Diagram to primary tabs, tucked Validate/Roundtrip/Convert behind ⋯ menu, added IWC nav link, tooltips, OS-dark default, dashboard filter + count + sort. Worktree: /Users/jxc755/projects/worktrees/galaxy-tool-util/branch/styling. Key files: packages/gxwf-ui/src/{App.vue, main.ts, views/*, components/*}, packages/gxwf-ui/src/styles/galaxy.css, packages/gxwf-ui/src/theme.ts, packages/gxwf-e2e/src/locators.ts.

What round 1 deliberately left on the table

Goals for round 2

Make the workflow view feel content-first, make operations feel like tools you reach for against that content, polish Files view to parity with workflows view, and tighten interaction feedback. Still no full agency-grade pass — save that for round 3 once these land.


Phase A — Diagram as primary region (WorkflowView rehierarchy)

Why: Round 1 made Diagram the default tab but it still competes with Clean/Lint/Export in the tab strip. The user asks repeatedly to “see the workflow”, so the diagram should always be visible when a workflow is open, not one of four equal modes.

Shape:

Files touched:

Risks/unknowns:

Tests:


Phase B — Files view parity

Why: Files view still has the old visual treatment (textarea fallback + Monaco side-by-side), inline save/error blocks, and no help text. Dashboard and WorkflowView set a new bar; FileView reads as unfinished.

Shape:

Files touched:

Tests:


Phase C — Spacing / type / motion pass

Why: Round 1 removed ornamentation; round 2 tightens proportions. Current spacing mixes 0.25 / 0.35 / 0.4 / 0.6 / 0.75 / 1 / 1.5rem. No motion anywhere.

Shape:

Files touched: styles/galaxy.css, every *.vue with a <style scoped> block (~10 files).

Tests: visual regression via Playwright screenshots against a couple of representative pages (Dashboard, WorkflowView, FileView). Out-of-scope: per-token unit tests.


Phase D — Bundle split

Why: pnpm build emits single 8MB chunk; gzip ~2MB. First paint on cold cache is noticeable even locally. Monaco + vscode-services are most of it, and only Files view uses them.

Shape:

Files touched: router/index.ts, possibly composables/useMermaid.ts (if eagerly imported), App.vue (no change expected).

Tests: pnpm build output check — Dashboard-only chunk should be well under 1MB. Add a scripts/check-bundle-size.mjs that fails if the main chunk exceeds a threshold (e.g. 1.5MB gzip). Wire into make check? Discuss — could be noisy.


Phase E — redesign-existing-projects skill pass

Why: User’s own prompt flagged this — after structural polish, run the skill to catch “generic AI” leftovers (shadow stacking, overly muted colors, default button chrome, unused whitespace).

Shape: Invoke the skill against the current branch. Cherry-pick suggestions; ignore anything that fights the Galaxy palette or reintroduces ornament. This is the one phase that ships as a separate PR for a cleaner diff.


Unified testing approach

Ordering

A → B → C → D → E. A and B can interleave if someone else picks up one. C is a sweep best done after A+B settle so we don’t touch files twice. D is independent, but easier last so the route-split doesn’t need to be re-tested after every visual change. E is last by definition.

Out of scope (round 3 candidates)

Unresolved questions