Rams MCP · The full engine, now in your coding agent
vuejs on GitHub

vuejs/core

Reviewed against Rams quality heuristics: accessibility, color, typography, spacing, components, motion, UX, and craft.

30 files reviewed·July 29, 2026

View on GitHub

Elevated

Design risk in this codebase.

4issues
Critical & Serious

Top fix

Restore a visible focus outline for keyboard-navigated buttons

See the fix

Verdict

Custom properties do the theming work, but nobody checked what happens at the edges: dark mode, focus, contrast. The toolbar looks intentional yet fails the keyboard and low-vision users who rely on its core controls most.

Files Rams reviewed

packages-private/sfc-playground/src/App.vue

packages-private/sfc-playground/src/Header.vue

packages-private/sfc-playground/src/VersionSelect.vue

packages-private/sfc-playground/src/icons/Sun.vue

packages-private/dts-test/componentInstance.test-d.tsx

packages-private/dts-test/componentTypeExtensions.test-d.tsx

packages-private/dts-test/functionalComponent.test-d.tsx

packages-private/dts-test/tsx.test-d.tsx

packages-private/sfc-playground/src/download/template/index.html

packages-private/sfc-playground/src/icons/Copy.vue

packages-private/sfc-playground/src/icons/Download.vue

packages-private/sfc-playground/src/icons/GitHub.vue

packages-private/sfc-playground/src/icons/Moon.vue

packages-private/sfc-playground/src/icons/Reload.vue

packages-private/sfc-playground/src/icons/Share.vue

packages-private/template-explorer/style.css

packages/vue/__tests__/e2e/hydration-strat-custom.html

packages/vue/__tests__/e2e/hydration-strat-interaction.html

packages/vue/__tests__/e2e/hydration-strat-media.html

packages/vue/__tests__/e2e/hydration-strat-visible.html

packages/vue/examples/classic/commits.html

packages/vue/examples/classic/grid.html

packages/vue/examples/classic/markdown.html

packages/vue/examples/classic/svg.html

packages/vue/examples/classic/todomvc.html

packages/vue/examples/classic/tree.html

packages/vue/examples/composition/commits.html

packages/vue/examples/composition/grid.html

packages/vue/examples/composition/markdown.html

packages/vue/examples/composition/svg.html

95/100

Color

1 critical1 serious
ColorCritical

packages-private/sfc-playground/src/Header.vue:224

White label text on green toggle background fails contrast for DEV/SSR state

The .toggle-prod span ("DEV"/"PROD") and the enabled states of .toggle-ssr and .toggle-autosave ("SSR ON", "AutoSave ON") render white text (#fff) on var(--green). At ~2.97:1 this sits well under WCAG AA's 4.5:1 minimum for 12px text, so the label is one of the hardest-to-read elements in the header.

Why it matters

Users scanning the header for build mode or SSR/autosave state get a washed-out label that's hard to read at a glance, and the failure hits every state toggle in the toolbar, not just one.

Fix

Darken the green background or switch the label text to a near-black color so contrast clears 4.5:1 at this font size.

.toggle-prod span {
  background: var(--green);
  color: #fff;
}
.toggle-prod span {
  background: var(--green);
  color: #0d0d0d;
}
ColorSerious

packages-private/sfc-playground/src/Header.vue:90

Nav icon color token never redefined for dark mode, dropping contrast

The `nav` block sets `--btn: #666` for icon and button color, but no `.dark nav` override redefines it. Against the dark nav background (~#1a1a1a), --btn computes to roughly 2.8:1, under the button/icon contrast used for GitHub link and toggle icons in Header.vue.

Why it matters

Anyone using dark mode gets low-contrast icons in the primary navigation, making the GitHub link and control icons harder to spot and click confidently.

Fix

Add a `.dark nav { --btn: <lighter gray>; }` override so icon contrast holds against the dark background.

nav {
  --bg: #fff;
  --btn: #666;
}
nav {
  --bg: #fff;
  --btn: #666;
}
.dark nav {
  --btn: #aaa;
}
98/100

Accessibility

1 serious
AccessibilitySerious

packages-private/sfc-playground/src/App.vue:197

Global button reset strips focus outline with no replacement for keyboard users

The global `button` reset in App.vue sets `outline: none` with no `:focus-visible` style anywhere nearby to restore an indicator. This rule applies to every button in the playground, including the prod/SSR/autosave toggles and icon actions in Header.vue.

Why it matters

Keyboard users tabbing through the toolbar get no visual confirmation of which control is focused, so they lose track of position and can trigger the wrong toggle.

Fix

Restore a visible focus indicator with a `:focus-visible` rule instead of removing outline outright.

button {
  border: none;
  outline: none;
  cursor: pointer;
  margin: 0;
  background-color: transparent;
}
button {
  border: none;
  cursor: pointer;
  margin: 0;
  background-color: transparent;
}
button:focus-visible {
  outline: 2px solid var(--green);
  outline-offset: 2px;
}

Get this score on every PR.

Rams reviews each pull request on your repo and posts inline one-click fixes — about a minute per review.

Install Rams free
98/100

Typography

1 serious
TypographySerious

packages-private/sfc-playground/src/App.vue:184

Body text set at 13px sits below comfortable reading size app-wide

The `body` rule in App.vue sets `font-size: 13px` as the base size for the entire playground shell, which cascades to every unstyled text node outside the editor panes.

Why it matters

Running the whole app a point below the 14px comfortable minimum for UI copy makes labels and secondary text harder to read, especially for users on lower-density displays.

Fix

Raise the base body font size to 14px so default text meets a comfortable reading minimum.

body {
  font-size: 13px;
  font-family:
    -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
    Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
  margin: 0;
  --base: #444;
  --nav-height: 50px;
}
body {
  font-size: 14px;
  font-family:
    -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
    Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
  margin: 0;
  --base: #444;
  --nav-height: 50px;
}

Spacing

No issues found

Components

No issues found

Motion

No issues found

UX

No issues found

Craft

No issues found

Working well

  • The active version in VersionSelect is marked with both a distinct color and a real `.active` class tied to selection state, so the selected item's text still communicates which version is current even without relying on color alone.
  • Hover feedback on `.links button` and `.github` is defined through a single shared selector in Header.vue, so every nav icon gets the same interactive affordance instead of one-off hover rules drifting per element.
  • VersionSelect shows a "loading versions..." state instead of rendering blank while the fetch is in flight, which keeps the control from reading as broken during the wait.

Scored July 29, 2026 with Rams Engine v0.0.3 · Engine changelog

This page is an automated design review of vuejs/core’s UI code: 30 files read against 258 versioned rules covering accessibility, color, typography, spacing, components, UX, motion, and craft. The score is out of 100; any confirmed critical issue caps it at 59.

More design scores

Score your own repo.

Free on public repos, no account. The same engine that scored this page reads your UI code and mints a score page like this one.

Public repos only. The full engine reviews the UI code and mints a public score page — we email you the link too. Already-scored repos open instantly.

Or get a design review on every pull requestInstall Rams