tomiabe on GitHub

tomiabe/tomiabestudio

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

4 files reviewed·August 23, 2026

View on GitHub

Elevated

Design risk in this codebase.

4issues
Critical & Serious

Top fix

Add dialog role, focus trap, and accessible name to mobile menu overlay.

See the fix

Verdict

Strong system thinking and fragile interaction layer coexist in the same codebase, pulling the score in opposite directions. The mobile menu is the single biggest liability: an unlabelled close button inside an untrapped overlay breaks keyboard and screen-reader access simultaneously.

Files Rams reviewed

assets/email-signature/tomi-abe-signature-2.html

assets/email-signature/tomi-abe-signature.html

index.html

css/onepage.css

92/100

Accessibility

2 critical1 serious
AccessibilityCritical

index.html:114

Mobile menu overlay missing dialog role and focus trap, keyboard leaks through

The `<div id="mobile-menu" class="menu-wrap" aria-hidden="true">` at line 114 has no `role="dialog"`, no `aria-label`, and no focus trap. When the panel opens, keyboard focus can reach every link and button behind the overlay.

Why it matters

Keyboard users tab into hidden page content while the menu is open, breaking navigation and disorienting screen-reader users who get no overlay announcement.

Fix

Add role="dialog", aria-modal="true", and aria-label to the panel, and implement a JS focus trap on open.

<div id="mobile-menu" class="menu-wrap" aria-hidden="true">
  <div class="menu-backdrop" data-close-menu></div>
  <div class="menu-panel">
<div id="mobile-menu" class="menu-wrap" aria-hidden="true">
  <div class="menu-backdrop" data-close-menu></div>
  <div class="menu-panel" role="dialog" aria-modal="true" aria-label="Site navigation">
AccessibilityCritical

index.html:118

Mobile menu close button has no accessible name for screen readers

The `<button class="menu-close" data-close-menu></button>` at line 118 of index.html is completely empty: no text, no aria-label, no child icon. Screen readers announce it as "button" with no action name.

Why it matters

Keyboard and screen-reader users cannot identify or operate the only explicit close control for the mobile menu.

Fix

Add aria-label="Close menu" to every icon-only button.

<button class="menu-close" data-close-menu></button>
<button class="menu-close" data-close-menu aria-label="Close menu"></button>
AccessibilitySerious

assets/email-signature/tomi-abe-signature.html:50

Bullet separator is invisible at 1.3:1 contrast in both email signatures

Both signature files use `<span style="color:#27272a;">&#8226;</span>` on the `#09090b` table background. #27272a on #09090b computes to ~1.3:1: the separator is invisible to anyone with reduced contrast sensitivity.

Why it matters

The separator that distinguishes the two contact links disappears, making the line harder to parse.

Fix

Match the separator color to the surrounding link text (#a1a1aa) so it remains visible.

<span style="display:inline-block; padding:0 10px; color:#27272a;">&#8226;</span>
<span style="display:inline-block; padding:0 10px; color:#a1a1aa;">&#8226;</span>
98/100

Motion

1 serious
MotionSerious

css/onepage.css:67

Theme-switch color transition runs unguarded for vestibular-sensitive users

The `body` rule at line 67 of css/onepage.css declares `transition: background-color 0.4s ease, color 0.4s ease` with no `@media (prefers-reduced-motion: reduce)` guard. Every theme switch animates for users who have opted out of motion.

Why it matters

Users with vestibular disorders who set prefers-reduced-motion still experience a 0.4 s flashing color change on every theme switch.

Fix

Wrap color transitions in a prefers-reduced-motion media query so they fire only for users who accept motion.

body {
  font-family: var(--font-body);
  background-color: color-mix(in srgb, var(--theme-bg) 88%, transparent);
  color: var(--theme-fg);
  transition: background-color 0.4s ease, color 0.4s ease;
}
body {
  font-family: var(--font-body);
  background-color: color-mix(in srgb, var(--theme-bg) 88%, transparent);
  color: var(--theme-fg);
}
@media (prefers-reduced-motion: no-preference) {
  body {
    transition: background-color 0.4s ease, color 0.4s ease;
  }
}

Typography

No issues found

Color

No issues found

Spacing

No issues found

Components

No issues found

UX

No issues found

Craft

No issues found

Working well

  • The prefers-reduced-motion guard on `.animate-scroll-up` is exactly right: the animation is declared, the media query cancels it, and the card image and fader transitions get the same treatment in the same block: three animation sites covered in one focused pass.
  • The drawer component uses `role="dialog" aria-modal="true" aria-label="Item details"`: that trio satisfies the overlay naming contract correctly and gives screen readers an immediate context announcement on open. The mobile menu should mirror this pattern.

Scored August 23, 2026 with Rams Engine v0.0.4 · Engine changelog

This page is an automated design review of tomiabe/tomiabestudio’s UI code: 4 files read against 309 versioned rules covering accessibility, color, typography, spacing, components, UX, motion, and craft. The score is out of 100; confirmed criticals cap it — one at 59, two at 49, three or more at 39.

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