UI/UX Review for GA (1.x) β
A per-surface review of the KiCad Studio extension UI against the GA bar in GA Readiness. The product was already strong going in; this records the state of each surface, what changed this review cycle, and what is deferred (and why).
Status key: β meets the bar Β· π‘ met with a deferred follow-up Β· βοΈ deferred to an environment this review could not exercise.
Cross-cutting foundations β
| Concern | State | Evidence |
|---|---|---|
| Theming | β | All colors derive from --vscode-* tokens with fallbacks (media/styles/{bom,viewer}.css). The two literal hex values are fallbacks for --vscode-testing-iconPassed / --vscode-editorWarning-foreground, not hardcoded colors. |
| Reduced motion | β | Both stylesheets carry @media (prefers-reduced-motion: reduce) (universal transition/animation/scroll reset + spinner stop). |
| High contrast | β | Both stylesheets carry @media (forced-colors: active) focus outlines using CanvasText. |
| Focus visibility | β | :focus-visible styling present; tab order and accessible names asserted by the axe suite. |
| Keyboard operability | β | table-wrapper[tabindex=0] reference pattern in BOM; axe suite checks deterministic tab traversal and no focus traps. |
| Status semantics | β | role="status"/role="alert" + aria-live on loading/empty/error regions. |
| Localization | β | en/tr parity (397/397) with a guardrail that fails on new untranslated strings (check:nls-parity). |
| Command surface | β | Palette gating, inline title icons, and an editor context menu landed this cycle (menu hygiene). |
Per-surface review β
| Surface | Empty | Loading | Error | Notes |
|---|---|---|---|---|
| BOM webview | β
#bom-empty | β
#loading-row | β | Reference implementation for the others. |
| Netlist webview | β summary "No schematic opened." / "0 net entries" | β
provider-driven status ("Loading netlistβ¦") | β
#error-card (role="alert") | States are driven by the provider status payload rather than webview-local elements; all three are visual-snapshot locked (netlist-loading/success/error). |
| Visual Diff webview | β | β | β | Empty/error handling present in diff.js. |
| Viewer (KiCanvas PCB/Schematic) | n/a (canvas) | β | β | Canvas content has documented keyboard-accessible alternatives per Accessibility; loading + error states snapshot-locked. |
| Quality Gate view | β | β | β | Project-gated (kicadstudio.hasProject); axe-covered. |
| Validation / DRC views | β | β | β | viewsWelcome empty states for tree views; DRC Rule Editor axe-covered. |
| Sidebar tree views (11) | β | β | β | viewsWelcome provides first-run/empty guidance per view. |
Changed this review cycle β
- Menu & command-surface hygiene β palette gating, inline
view/titleicons, editor context menu; removed an always-falsewhenclause that hid library commands. - i18n guardrail β
check:nls-paritynow fails on newly-untranslated user-facing strings. - Versioning story β reframed the beta program as an ongoing preview channel for the stable 1.x line.
- Accessibility evidence β recorded the automated axe baseline in Accessibility.
Deferred (environment-bound) β
- βοΈ Visual-snapshot refresh. The webview baselines (
test/visual/__screenshots__) are platform-specific; regenerating them off the Linux CI runner would produce mismatching images. Any pixel-affecting UI change must regenerate on the CI platform. - βοΈ Manual screen-reader pass. NVDA (Windows) / VoiceOver (macOS) verification is a documented release gate that needs a screen reader and a human; it is not a CI gate.
Conclusion β
Every in-scope surface meets the GA bar for states, theming, motion, contrast, keyboard operability, and localization. The two deferred items are release-time verification steps that require a specific environment, not outstanding defects.