Run 1 · Nov 4, 2026 · 115 min · 132 steps · 21 pages · Vite + React 18
It's my Basil & Ember pizza site for customers ordering in a hurry. They get stuck in navigation, and I want a completely new look with 3D pizzas and toppings in the background.
I'm testing Basil & Ember, a fictional neighborhood wood-fired pizza restaurant in Maplewood, and the people coming here want to order pickup or book one of its twelve tables. It's a Vite + React app with react-router pages and plain CSS custom properties, no backend and no login anywhere. All 17 menu dishes live in code, the cart persists in localStorage, and checkout, reservations, and the contact form are validated demo flows that don't send or charge anything. I need to remember that confirmation only works right after checkout in the same tab, since the order sits in sessionStorage.
From the code at commit 8c525b009f0b, read by a model.
Journeys
Order a pizza for pickup done
Book a table by the fire done
Find a dish that fits my diet done
Change how many pizzas I'm getting done
Check when they're open done
Screens checked
Reflow · 320×640iPhone · 390×844iPhone landscape · 844×390Just under the breakpoint · 859×1117At the breakpoint · 860×1118Just under the breakpoint · 759×987At the breakpoint · 760×988Laptop · 1280×800Text at 200% · 1280 wideText spacing · 1280 wide
Tried 138 of 167 controls over 132 steps.
App Map
8 pages, grouped by address: what each does, what Fitts found there and what it fixed.
/18 found · 1 fixed (with the pages under it)not reached
Shown because the evidence was strong enough: a measurement, or reviewers agreeing. Most serious first.
Sev 4 · CatastrophicAccessibilityRolled back
Elements must have their visible text as part of their accessible name
On /, and 13 other pages: /menu/menu/margherita/cart/checkout/confirmation/reserve/menu/burrata/about/menu/caesar/menu/funghi/menu/verde/menu/rigatoni/menu/diavola · in src/components/Layout.tsx:21
Elements must have their visible text as part of their accessible name (axe rule label-content-name-mismatch). People using a screen reader, a keyboard or zoom run into this.
The fix Fitts suggests: Fix the markup so the "label-content-name-mismatch" rule passes: elements must have their visible text as part of their accessible name.
Close up
The whole page
Who flagged it
one of Fitts’s own measurements
What Fitts noticed
Noticed Elements must have their visible text as part of their accessible name (axe) step 0 · /
Noticed header.header > div.wrap.header-in > a.brand shows no focus when tabbed to step 0 · /
Noticed Heading levels should only increase by one (axe) step 1 · /menu
Noticed Elements must have their visible text as part of their accessible name (axe) step 1 · /menu
Noticed Heading levels should only increase by one (axe) step 2 · /menu/margherita
Noticed Elements must have their visible text as part of their accessible name (axe) step 2 · /menu/margherita
22 more lines
Noticed Heading levels should only increase by one (axe) step 5 · /cart
Noticed Elements must have their visible text as part of their accessible name (axe) step 5 · /cart
Noticed Heading levels should only increase by one (axe) step 6 · /checkout
Noticed Elements must have their visible text as part of their accessible name (axe) step 6 · /checkout
Noticed Heading levels should only increase by one (axe) step 10 · /confirmation
Noticed Elements must have their visible text as part of their accessible name (axe) step 10 · /confirmation
Noticed Heading levels should only increase by one (axe) step 11 · /reserve
Noticed Elements must have their visible text as part of their accessible name (axe) step 11 · /reserve
Noticed Heading levels should only increase by one (axe) step 23 · /menu/burrata
Noticed Elements must have their visible text as part of their accessible name (axe) step 23 · /menu/burrata
Noticed Heading levels should only increase by one (axe) step 24 · /about
Noticed Elements must have their visible text as part of their accessible name (axe) step 24 · /about
Noticed Heading levels should only increase by one (axe) step 62 · /menu/caesar
Noticed Elements must have their visible text as part of their accessible name (axe) step 62 · /menu/caesar
Noticed Heading levels should only increase by one (axe) step 67 · /menu/funghi
Noticed Elements must have their visible text as part of their accessible name (axe) step 67 · /menu/funghi
Noticed Heading levels should only increase by one (axe) step 77 · /menu/verde
Noticed Elements must have their visible text as part of their accessible name (axe) step 77 · /menu/verde
Noticed Heading levels should only increase by one (axe) step 84 · /menu/rigatoni
Noticed Elements must have their visible text as part of their accessible name (axe) step 84 · /menu/rigatoni
Noticed Heading levels should only increase by one (axe) step 87 · /menu/diavola
Noticed Elements must have their visible text as part of their accessible name (axe) step 87 · /menu/diavola
Evidence
Elements must have their visible text as part of their accessible name (expected passes the axe rule)
See it yourself
Start at http://localhost:5176/ on desktop. Replayed and seen again
Expected
Passes the axe rule
Actual
Elements must have their visible text as part of their accessible name
// Elements must have their visible text as part of their accessible name
// Fitts repro · Chromium 156 · 1536×864 · mouse · light · 100% · no automatic check
// Steps: open the page
import { expect, test } from '@playwright/test';
test("Elements must have their visible text as part of their accessible name", async ({ page }) => {
await page.goto("http://localhost:5176/");
// Expected: Passes the axe rule
// Actual: Elements must have their visible text as part of their accessible name
// Fitts has no automatic oracle for this one: check it by eye, then replace this line.
test.fixme(true, 'check by eye');
});
The fix Rolled back
Rolled back: No fix job run-1/run. The code went back to the last good commit.
Cost $0.0025
Sev 4 · CatastrophicH1 · Visibility of system statusAccessibilityRolled back
No visible focus when using the keyboard
On /, and 13 other pages: /menu/menu/margherita/cart/checkout/confirmation/reserve/menu/burrata/about/menu/caesar/menu/funghi/menu/verde/menu/rigatoni/menu/diavola · in src/components/Layout.tsx:21
Tabbing through the page shows no focus outline, so keyboard users can’t tell where they are.
The fix Fitts suggests: Remove the global outline: none and style :focus-visible instead.
Close up
The whole page
Who flagged it
4 of 5 reviewers (Novice, Accessibility, Power user, Trust & ethics), and one of Fitts’s own measurements
What Fitts noticed
Noticed div.wrap.header-in > nav.nav > a.active shows no focus when tabbed to step 0 · /
Noticed div.wrap.header-in > nav.nav > a shows no focus when tabbed to step 0 · /
Noticed header.header > div.wrap.header-in > a.cart-btn shows no focus when tabbed to step 0 · /
Noticed div.wrap > div.filters > input.search shows no focus when tabbed to step 1 · /menu
Noticed div.filters > div.chip-row > button.chip.on shows no focus when tabbed to step 1 · /menu
Noticed div.filters > div.chip-row > button.chip shows no focus when tabbed to step 1 · /menu
69 more lines
Noticed section.section > div.wrap > a shows no focus when tabbed to step 2 · /menu/margherita
Noticed div.radio-row > label.radio-pill > input shows no focus when tabbed to step 2 · /menu/margherita
Noticed div.check-row > label > input shows no focus when tabbed to step 2 · /menu/margherita
Noticed "Add to cart · $14.00" is hidden while focused (0% visible) step 2 · /menu/margherita
Noticed "Full menu" is hidden while focused (0% visible) step 2 · /menu/margherita
Noticed "Reserve a table" is hidden while focused (0% visible) step 2 · /menu/margherita
Noticed "Your cart" is hidden while focused (0% visible) step 2 · /menu/margherita
Noticed "Our story" is hidden while focused (0% visible) step 2 · /menu/margherita
Noticed 6 navigation links before the content, no skip link step 2 · /menu/margherita
Noticed div > span.qty > button shows no focus when tabbed to step 5 · /cart
Noticed div > div > button shows no focus when tabbed to step 5 · /cart
Noticed div.two-col > div.panel > button shows no focus when tabbed to step 5 · /cart
Noticed div.two-col > div.panel > a.btn.btn-ember shows no focus when tabbed to step 5 · /cart
Noticed div.two-col > div.panel > a shows no focus when tabbed to step 5 · /cart
Noticed 6 navigation links before the content, no skip link step 5 · /cart
Noticed input#co-name shows no focus when tabbed to step 6 · /checkout
Noticed input#co-phone shows no focus when tabbed to step 6 · /checkout
Noticed select#co-time shows no focus when tabbed to step 6 · /checkout
Noticed div.two-col > div.panel > button.btn.btn-ember shows no focus when tabbed to step 6 · /checkout
Noticed div.two-col > div.panel > a shows no focus when tabbed to step 6 · /checkout
Noticed Full menu shows no focus when tabbed to step 6 · /checkout
Noticed div.wrap > div > a.btn.btn-dark shows no focus when tabbed to step 10 · /confirmation
Noticed div.wrap > div > a.btn.btn-ghost shows no focus when tabbed to step 10 · /confirmation
Noticed Full menu shows no focus when tabbed to step 10 · /confirmation
Noticed Reserve a table shows no focus when tabbed to step 10 · /confirmation
Noticed Your cart shows no focus when tabbed to step 10 · /confirmation
Noticed Our story shows no focus when tabbed to step 10 · /confirmation
Noticed "Full menu" is hidden while focused (0% visible) step 10 · /confirmation
Noticed "Reserve a table" is hidden while focused (0% visible) step 10 · /confirmation
Noticed 6 navigation links before the content, no skip link step 10 · /confirmation
Noticed input#rv-name shows no focus when tabbed to step 11 · /reserve
Noticed input#rv-phone shows no focus when tabbed to step 11 · /reserve
Noticed input#rv-date shows no focus when tabbed to step 11 · /reserve
Noticed "Full menu" is hidden while focused (0% visible) step 11 · /reserve
Noticed 6 navigation links before the content, no skip link step 11 · /reserve
Noticed section.section > div.wrap > a shows no focus when tabbed to step 23 · /menu/burrata
Noticed div.check-row > label > input shows no focus when tabbed to step 23 · /menu/burrata
Noticed "Full menu" is hidden while focused (0% visible) step 23 · /menu/burrata
Noticed "Reserve a table" is hidden while focused (0% visible) step 23 · /menu/burrata
Noticed "Your cart" is hidden while focused (0% visible) step 23 · /menu/burrata
Noticed 6 navigation links before the content, no skip link step 23 · /menu/burrata
Noticed Basil and Ember home shows no focus when tabbed to step 24 · /about
Noticed Home shows no focus when tabbed to step 24 · /about
Noticed Menu shows no focus when tabbed to step 24 · /about
Noticed Reservations shows no focus when tabbed to step 24 · /about
Noticed About & Contact shows no focus when tabbed to step 24 · /about
Noticed Cart shows no focus when tabbed to step 24 · /about
Noticed section.section > div.wrap > a shows no focus when tabbed to step 62 · /menu/caesar
Noticed div.check-row > label > input shows no focus when tabbed to step 62 · /menu/caesar
Noticed "Full menu" is hidden while focused (0% visible) step 62 · /menu/caesar
Noticed "Reserve a table" is hidden while focused (0% visible) step 62 · /menu/caesar
Noticed "Your cart" is hidden while focused (0% visible) step 62 · /menu/caesar
Noticed "Our story" is hidden while focused (0% visible) step 62 · /menu/caesar
Noticed 6 navigation links before the content, no skip link step 62 · /menu/caesar
Noticed section.section > div.wrap > a shows no focus when tabbed to step 67 · /menu/funghi
Noticed div.radio-row > label.radio-pill > input shows no focus when tabbed to step 67 · /menu/funghi
Noticed div.check-row > label > input shows no focus when tabbed to step 67 · /menu/funghi
Noticed section.section > div.wrap > a shows no focus when tabbed to step 77 · /menu/verde
Noticed div.radio-row > label.radio-pill > input shows no focus when tabbed to step 77 · /menu/verde
Noticed div.check-row > label > input shows no focus when tabbed to step 77 · /menu/verde
Noticed section.section > div.wrap > a shows no focus when tabbed to step 84 · /menu/rigatoni
Noticed div.check-row > label > input shows no focus when tabbed to step 84 · /menu/rigatoni
Noticed "Full menu" is hidden while focused (0% visible) step 84 · /menu/rigatoni
Noticed "Reserve a table" is hidden while focused (0% visible) step 84 · /menu/rigatoni
Noticed "Your cart" is hidden while focused (0% visible) step 84 · /menu/rigatoni
Noticed 6 navigation links before the content, no skip link step 84 · /menu/rigatoni
Noticed section.section > div.wrap > a shows no focus when tabbed to step 87 · /menu/diavola
Noticed div.radio-row > label.radio-pill > input shows no focus when tabbed to step 87 · /menu/diavola
Noticed div.check-row > label > input shows no focus when tabbed to step 87 · /menu/diavola
Evidence
no visible change when focused with Tab (expected a visible focus indicator)
section.section > div.wrap > a shows no focus when tabbed to
"Add to cart · $14.00" is hidden while focused (0% visible)
See it yourself
Start at http://localhost:5176/ on desktop. Replayed and seen again
Press Tab from the top of the page
Tab through Back to menu, Size and toppings to Add to cart
// No visible focus when using the keyboard
// Fitts repro · Chromium 156 · 1536×864 · mouse · light · 100%
// Steps: Press Tab from the top of the page → Tab through Back to menu, Size and toppings to Add to cart
import { expect, test } from '@playwright/test';
test("No visible focus when using the keyboard", async ({ page }) => {
await page.goto("http://localhost:5176/");
// By hand: Press Tab from the top of the page
// By hand: Tab through Back to menu, Size and toppings to Add to cart
// Focus is visible (WCAG 2.4.7): focusing changes how the element looks.
const el = page.getByTestId("e1");
const before = await el.evaluate((e) => { const s = getComputedStyle(e); return [s.outlineStyle, s.outlineWidth, s.boxShadow, s.borderColor, s.backgroundColor].join('|'); });
await el.focus();
const after = await el.evaluate((e) => { const s = getComputedStyle(e); return [s.outlineStyle, s.outlineWidth, s.boxShadow, s.borderColor, s.backgroundColor].join('|'); });
expect(after).not.toBe(before);
});
The fix Rolled back
Rolled back: No fix job run-1/run. The code went back to the last good commit.
Cost $0.0025
Sev 4 · CatastrophicH7 · Flexibility and efficiency of useUsabilityOpen: not fixed in this run
No pickup time to choose
On /menu/margherita, and 9 other pages: /cart/checkout/confirmation/menu/burrata/menu/caesar/menu/funghi/menu/verde/menu/rigatoni/menu/diavola · in src/App.test.tsx:32
You can build the Margherita and add it to cart, but you are never asked when you will pick it up. For a rushed pickup order this leaves you unsure when to arrive.
The fix Fitts suggests: Add a pickup time picker to the builder and carry it through to the cart.
Who flagged it
5 of 5 reviewers (Novice, Power user, Accessibility, Trust & ethics, Visual design)
What Fitts noticed
Tapped Pickup time · nothing changed on screen step 55 · /checkout
Evidence
Controls are only Size, Add toppings, Notes, Quantity, Add to cart
Page says 'Pickup only. Pay at the counter' with no time choice
Build yours panel shows Size, Add toppings, Notes for the kitchen, Quantity
See it yourself
Start at http://localhost:5176/menu/margherita on desktop. Seen once during the run
Expected
A pickup time can be chosen while building a pickup order
Actual
There is no time field anywhere on the builder or cart confirmation
Environment
Chromium 156 · 1536×864 · mouse · light · 100%
The Playwright test Fitts wrote
// No pickup time to choose
// Fitts repro · Chromium 156 · 1536×864 · mouse · light · 100% · no automatic check
// Steps: open the page
import { expect, test } from '@playwright/test';
test("No pickup time to choose", async ({ page }) => {
await page.goto("http://localhost:5176/menu/margherita");
// Expected: A pickup time can be chosen while building a pickup order
// Actual: There is no time field anywhere on the builder or cart confirmation
// Fitts has no automatic oracle for this one: check it by eye, then replace this line.
test.fixme(true, 'check by eye');
});
Sev 3 · MajorH4 · Consistency and standardsLook & feelVerified
Too many text sizes
On /, and 13 other pages: /menu/menu/margherita/cart/checkout/confirmation/reserve/menu/burrata/about/menu/caesar/menu/funghi/menu/verde/menu/rigatoni/menu/diavola · in src/pages/AboutPage.tsx:34
The site uses 16 font sizes; more than about 6 makes the hierarchy hard to read.
The fix Fitts suggests: Settle on a type scale of about 6 sizes and use them throughout.
Close up
The whole page
Who flagged it
1 of 5 reviewers (Visual design), and one of Fitts’s own measurements
// Too many text sizes
// Fitts repro · Chromium 156 · 1536×864 · mouse · light · 100% · no automatic check
// Steps: open the page
import { expect, test } from '@playwright/test';
test("Too many text sizes", async ({ page }) => {
await page.goto("http://localhost:5176/");
// Expected: At most 6 sizes
// Actual: 16 font sizes: 22px, 12px, 14.5px, 14px, 12.5px, 76px, 18px, 15px, 13px, 17px, 13.5px, 44px, 16px, 20px, 19px, 42px
// Fitts has no automatic oracle for this one: check it by eye, then replace this line.
test.fixme(true, 'check by eye');
});
The fix Verified
Re-checked on the fix branch’s own dev server: “Too many text sizes” is gone, and no new problems at severity 2 or higher appeared on /.
The project’s own tests and CI checks, where it has them, still passed before the change was committed.
Before the fix: 16 font sizes: 22px, 12px, 14.5px, 14px, 12.5px, 76px, 18px, 15px, 13px, 17px, 13.5px, 44px, 16px, 20px, 19px, 42px (expected at most 6 sizes).
Sev 3 · MajorH8 · Aesthetic and minimalist designLook & feelRolled back
Spacing is inconsistent and off-grid
On /, and 13 other pages: /menu/menu/margherita/cart/checkout/confirmation/reserve/menu/burrata/about/menu/caesar/menu/funghi/menu/verde/menu/rigatoni/menu/diavola · in src/components/Layout.tsx:44
Padding and margins use odd values (padding-top 3px), so spacing looks uneven from one element to the next.
The fix Fitts suggests: Use spacing tokens on a 4px grid.
Close up
The whole page
Who flagged it
1 of 5 reviewers (Visual design), and one of Fitts’s own measurements
What Fitts noticed
Noticed spacing off the grid: padding-top 3px step 0 · /
Noticed spacing off the grid: padding-top 5px step 0 · /
Noticed spacing off the grid: margin-top 6px step 0 · /
Noticed spacing off the grid: padding-top 7px step 0 · /
Noticed spacing off the grid: padding-top 9px step 0 · /
Noticed spacing off the grid: row-gap 10px step 0 · /
67 more lines
Noticed spacing off the grid: padding-top 3px step 1 · /menu
Noticed spacing off the grid: padding-top 5px step 1 · /menu
Noticed spacing off the grid: row-gap 6px step 1 · /menu
Noticed spacing off the grid: padding-top 9px step 1 · /menu
Noticed spacing off the grid: row-gap 10px step 1 · /menu
Noticed spacing off the grid: padding-top 13px step 1 · /menu
Noticed spacing off the grid: margin-top 3px step 2 · /menu/margherita
Noticed spacing off the grid: padding-top 5px step 2 · /menu/margherita
Noticed spacing off the grid: row-gap 6px step 2 · /menu/margherita
Noticed spacing off the grid: padding-top 9px step 2 · /menu/margherita
Noticed spacing off the grid: row-gap 10px step 2 · /menu/margherita
Noticed spacing off the grid: padding-top 11px step 2 · /menu/margherita
Noticed spacing off the grid: margin-top 3px step 5 · /cart
Noticed spacing off the grid: margin-bottom 6px step 5 · /cart
Noticed spacing off the grid: padding-top 7px step 5 · /cart
Noticed spacing off the grid: padding-top 9px step 5 · /cart
Noticed spacing off the grid: row-gap 10px step 5 · /cart
Noticed spacing off the grid: padding-top 13px step 5 · /cart
Start at http://localhost:5176/ on desktop. Replayed and seen again
Expected
A multiple of 4px
Actual
Padding-top 3px
Environment
Chromium 156 · 1536×864 · mouse · light · 100%
The Playwright test Fitts wrote
// Spacing is inconsistent and off-grid
// Fitts repro · Chromium 156 · 1536×864 · mouse · light · 100% · no automatic check
// Steps: open the page
import { expect, test } from '@playwright/test';
test("Spacing is inconsistent and off-grid", async ({ page }) => {
await page.goto("http://localhost:5176/");
// Expected: A multiple of 4px
// Actual: Padding-top 3px
// Fitts has no automatic oracle for this one: check it by eye, then replace this line.
test.fixme(true, 'check by eye');
});
The fix Rolled back
Rolled back: no change made: No fix job run-1/run. The code went back to the last good commit.
Cost $0.011
Sev 3 · MajorH8 · Aesthetic and minimalist designErgonomicsRolled back
Page scrolls sideways on small screens
On /, and 13 other pages: /menu/menu/margherita/cart/checkout/confirmation/reserve/menu/burrata/about/menu/caesar/menu/funghi/menu/verde/menu/rigatoni/menu/diavola · seen at iPhone · 390×844 · in src/pages/AboutPage.tsx:34
At narrow widths the page is wider than the screen (page is 354px wide at 360px).
The fix Fitts suggests: Let content wrap and size to the viewport.
Close up
The whole page
Who flagged it
5 of 5 reviewers (Novice, Power user, Accessibility, Visual design, Trust & ethics), and one of Fitts’s own measurements
What Fitts noticed
Noticed the page is 354px wide at 360px step 1 · /menu
Noticed the page is 354px wide at 360px step 2 · /menu/margherita
Noticed the page is 359px wide at 360px step 5 · /cart
Noticed the page is 359px wide at 360px step 6 · /checkout
Noticed the page is 354px wide at 360px step 10 · /confirmation
Noticed the page is 379px wide at 360px step 11 · /reserve
14 more lines
Noticed the page is 354px wide at 360px step 23 · /menu/burrata
Noticed the page is 354px wide at 360px step 24 · /about
Noticed the page is 359px wide at 360px step 62 · /menu/caesar
Noticed the page is 359px wide at 360px step 67 · /menu/funghi
Noticed the page is 359px wide at 360px step 77 · /menu/verde
Noticed the page is 359px wide at 360px step 84 · /menu/rigatoni
Noticed the page is 359px wide at 360px step 87 · /menu/diavola
Noticed the page is 359px wide at 320px step 101 · /menu/margherita
Noticed the page is 359px wide at 320px step 101 · /menu/burrata
Noticed the page is 359px wide at 320px step 101 · /menu/verde
Noticed the page is 359px wide at 320px step 101 · /menu/rigatoni
Noticed the page is 1522px wide at 860px step 101 · /menu/rigatoni
Noticed the page is 1522px wide at 860px step 101 · /menu/diavola
Noticed the page is 1426px wide at 759px step 101 · /menu/burrata
Evidence
page is 354px wide at 360px (expected no sideways scrolling at 360px)
page is 354px wide at 360px
page is 359px wide at 320px
The fix Rolled back
Rolled back: No fix job run-1/run. The code went back to the last good commit.
Cost $0.0025
Sev 3 · MajorH7 · Flexibility and efficiency of useAccessibilityRolled back
The focused control is hidden
On /, and 12 other pages: /menu/menu/margherita/checkout/confirmation/reserve/menu/burrata/about/menu/caesar/menu/funghi/menu/verde/menu/rigatoni/menu/diavola · in src/pages/Home.tsx:36
"See full menu" is hidden while focused (40% visible): keyboard users can't see where they are.
The fix Fitts suggests: Leave room for sticky headers (scroll-padding-top) and keep focused controls in view.
Close up
The whole page
Who flagged it
4 of 5 reviewers (Power user, Accessibility, Novice, Trust & ethics), and one of Fitts’s own measurements
What Fitts noticed
Noticed "See full menu" is hidden while focused (40% visible) step 0 · /
Noticed "Neighborhood favorite
Margherita Classic" is hidden while focused (0% visible) step 0 · /
Noticed "Neighborhood favorite
Ember Pepperoni
C" is hidden while focused (0% visible) step 0 · /
Noticed "Neighborhood favorite
Diavola
Spicy sop" is hidden while focused (40% visible) step 0 · /
Noticed "Start an order" is hidden while focused (0% visible) step 0 · /
Noticed "Hours & directions" is hidden while focused (0% visible) step 0 · /
45 more lines
Noticed "Pizza Verde
Basil pesto, zucchini ribbo" is hidden while focused (0% visible) step 1 · /menu
Noticed "Neighborhood favorite
Diavola
Spicy sop" is hidden while focused (0% visible) step 1 · /menu
Noticed "Burrata & Prosciutto
Creamy Puglian bur" is hidden while focused (40% visible) step 1 · /menu
Noticed "Ember Arancini
Crisp saffron risotto, s" is hidden while focused (40% visible) step 1 · /menu
Noticed "Sunday Meatballs
Beef and pork meatball" is hidden while focused (40% visible) step 1 · /menu
Noticed "Little Gem Caesar
Little gem lettuce, w" is hidden while focused (0% visible) step 1 · /menu
Noticed "Add to cart · $14.00" is hidden while focused (0% visible) step 2 · /menu/margherita
Noticed 6 navigation links before the content, no skip link step 2 · /menu/margherita
Noticed "Full menu" is hidden while focused (40% visible) step 6 · /checkout
Noticed "Reserve a table" is hidden while focused (0% visible) step 6 · /checkout
Noticed "Your cart" is hidden while focused (0% visible) step 6 · /checkout
Noticed 6 navigation links before the content, no skip link step 6 · /checkout
Noticed "Full menu" is hidden while focused (0% visible) step 10 · /confirmation
Noticed 6 navigation links before the content, no skip link step 10 · /confirmation
Noticed "Full menu" is hidden while focused (0% visible) step 11 · /reserve
Noticed 6 navigation links before the content, no skip link step 11 · /reserve
Noticed "Full menu" is hidden while focused (0% visible) step 23 · /menu/burrata
Noticed 6 navigation links before the content, no skip link step 23 · /menu/burrata
Noticed "input#ct-name" is hidden while focused (0% visible) step 24 · /about
Noticed "input#ct-email" is hidden while focused (0% visible) step 24 · /about
Noticed "textarea#ct-msg" is hidden while focused (0% visible) step 24 · /about
Noticed "Send message" is hidden while focused (0% visible) step 24 · /about
Noticed "Full menu" is hidden while focused (0% visible) step 24 · /about
Noticed "Reserve a table" is hidden while focused (0% visible) step 24 · /about
Noticed "Full menu" is hidden while focused (0% visible) step 62 · /menu/caesar
Noticed 6 navigation links before the content, no skip link step 62 · /menu/caesar
Noticed "−" is hidden while focused (0% visible) step 67 · /menu/funghi
Noticed "Add to cart · $18.00" is hidden while focused (0% visible) step 67 · /menu/funghi
Noticed "Full menu" is hidden while focused (0% visible) step 67 · /menu/funghi
Noticed "Reserve a table" is hidden while focused (0% visible) step 67 · /menu/funghi
Noticed "Your cart" is hidden while focused (0% visible) step 67 · /menu/funghi
Noticed "Our story" is hidden while focused (0% visible) step 67 · /menu/funghi
Noticed "Add to cart · $16.00" is hidden while focused (0% visible) step 77 · /menu/verde
Noticed "Full menu" is hidden while focused (0% visible) step 77 · /menu/verde
Noticed "Reserve a table" is hidden while focused (0% visible) step 77 · /menu/verde
Noticed "Your cart" is hidden while focused (0% visible) step 77 · /menu/verde
Noticed "Our story" is hidden while focused (0% visible) step 77 · /menu/verde
Noticed 6 navigation links before the content, no skip link step 77 · /menu/verde
Noticed "Full menu" is hidden while focused (0% visible) step 84 · /menu/rigatoni
Noticed 6 navigation links before the content, no skip link step 84 · /menu/rigatoni
Noticed "Add to cart · $18.00" is hidden while focused (0% visible) step 87 · /menu/diavola
Noticed "Full menu" is hidden while focused (0% visible) step 87 · /menu/diavola
Noticed "Reserve a table" is hidden while focused (0% visible) step 87 · /menu/diavola
Noticed "Your cart" is hidden while focused (0% visible) step 87 · /menu/diavola
Noticed 6 navigation links before the content, no skip link step 87 · /menu/diavola
Evidence
"See full menu" is hidden while focused (40% visible) (expected the focused control in view)
"Neighborhood favorite
Margherita Classic" is hidden while focused (0% visible) (expected the focused control in view)
"Neighborhood favorite
Ember Pepperoni
C" is hidden while focused (0% visible) (expected the focused control in view)
"Add to cart · $14.00" is hidden while focused (0% visible)
6 navigation links before the content, no skip link
The fix Rolled back
Rolled back: No fix job run-1/run. The code went back to the last good commit.
Cost $0
Sev 3 · MajorH7 · Flexibility and efficiency of useErgonomicsRolled back
Page scrolls sideways on small screens on a phone
On /menu, and 7 other pages: /menu/margherita/menu/burrata/menu/caesar/menu/funghi/menu/verde/menu/rigatoni/menu/diavola · seen at Reflow · 320×640 · in src/components/Layout.tsx:21
At narrow widths the page is wider than the screen (page is 359px wide at 320px).
The fix Fitts suggests: Let content wrap and size to the viewport.
Who flagged it
1 of 5 reviewers (Power user), and one of Fitts’s own measurements
What Fitts noticed
Noticed the page is 359px wide at 320px step 101 · /menu
Noticed the page is 359px wide at 320px step 101 · /menu/caesar
Noticed the page is 359px wide at 320px step 101 · /menu/funghi
Noticed the page is 359px wide at 320px step 101 · /menu/verde
Noticed the page is 359px wide at 320px step 101 · /menu/rigatoni
Noticed the page is 359px wide at 320px step 101 · /menu/diavola
Noticed text overlaps the text below it with wider spacing step 101 · /menu
Evidence
page is 359px wide at 320px on Reflow · 320×640 (expected no sideways scrolling at 320px)
page is 359px wide at 320px
page is 1426px wide at 759px
How Fitts got there
Tapped “Order pickup” → /menu
The fix Rolled back
Rolled back: No fix job run-1/run. The code went back to the last good commit.
Cost $0
Sev 3 · MajorH1 · Visibility of system statusAccessibilityOpen: not fixed in this run
Text breaks with wider spacing on Text spacing · 1280 wide
On /menu, and 7 other pages: /menu/margherita/menu/burrata/menu/caesar/menu/funghi/menu/verde/menu/rigatoni/menu/diavola · seen at Text spacing · 1280 wide · in src/components/Layout.tsx:21
With WCAG’s text spacing applied (1.5 line height, wider letters and words), text overlaps the text below it with wider spacing.
The fix Fitts suggests: Let text containers grow with their content; avoid fixed heights and overflow: hidden on text.
Who flagged it
2 of 5 reviewers (Accessibility, Visual design), and one of Fitts’s own measurements
What Fitts noticed
Noticed text overlaps the text below it with wider spacing step 101 · /menu
Noticed text overlaps the text below it with wider spacing step 101 · /menu/margherita
Noticed text overlaps the text below it with wider spacing step 101 · /menu/burrata
Noticed text overlaps the text below it with wider spacing step 101 · /menu/caesar
Noticed text overlaps the text below it with wider spacing step 101 · /menu/funghi
Noticed text overlaps the text below it with wider spacing step 101 · /menu/verde
Noticed text overlaps the text below it with wider spacing step 101 · /menu/rigatoni
Noticed text overlaps the text below it with wider spacing step 101 · /menu/diavola
Evidence
text overlaps the text below it with wider spacing on Text spacing · 1280 wide (expected text that keeps its room at 1.5 line height)
text overlaps the text below it with wider spacing
How Fitts got there
Tapped “Order pickup” → /menu
Sev 3 · MajorAccessibilityRolled back
Heading levels should only increase by one
On /menu, and 12 other pages: /menu/margherita/cart/checkout/confirmation/reserve/menu/burrata/about/menu/caesar/menu/funghi/menu/verde/menu/rigatoni/menu/diavola · in src/components/MenuCard.tsx:7
Heading levels should only increase by one (axe rule heading-order). People using a screen reader, a keyboard or zoom run into this.
The fix Fitts suggests: Fix the markup so the "heading-order" rule passes: heading levels should only increase by one.
Close up
The whole page
Who flagged it
one of Fitts’s own measurements
Evidence
Heading levels should only increase by one (expected passes the axe rule)
Rolled back: No fix job run-1/run. The code went back to the last good commit.
Cost $0
Sev 3 · MajorH7 · Flexibility and efficiency of useErgonomicsRolled back
Tap target is too small
On /cart, and 1 other page: /checkout · in src/pages/CartPage.tsx:44
This control is 66×20px, smaller than the 24×24px minimum, so it's easy to miss.
The fix Fitts suggests: Give it at least 44×44px of tappable area (padding counts).
Close up
The whole page
Who flagged it
5 of 5 reviewers (Novice, Power user, Accessibility, Trust & ethics, Visual design), and one of Fitts’s own measurements
What Fitts noticed
Noticed div > div > button is small to tap: 66×20px (needs at least 24×24px) step 5 · /cart
Noticed div.two-col > div.panel > a is small to tap: 388×18px (needs at least 24×24px) step 5 · /cart
Noticed div.two-col > div.panel > a is small to tap: 388×18px (needs at least 24×24px) step 6 · /checkout
Noticed Remove is small to tap: 66×20px (needs at least 24×24px) step 30 · /cart
Noticed Add more from the menu is small to tap: 388×18px (needs at least 24×24px) step 30 · /cart
Noticed Back to cart is far and small for a primary action: ID 5.1 bits (580px away, 18px wide) step 57 · /checkout
Evidence
66×20px (expected at least 24×24px)
388×18px (expected at least 24×24px)
Remove is small to tap: 66×20px (needs at least 24×24px)
13 more targets are under the comfortable 44px for touch
Remove is small to tap: 66x20px (needs at least 24x24px)
How Fitts got there
Tapped “View cart & checkout” → /cart
The fix Rolled back
Rolled back: No fix job run-1/run. The code went back to the last good commit.
Cost $0
Sev 3 · MajorH7 · Flexibility and efficiency of useUsabilityOpen: not fixed in this run
No way to set pickup time
On /checkout · in src/pages/CartPage.tsx:58
When filling out a pickup order on checkout, there is no way to enter a pickup time, which makes scheduling pickup difficult.
The fix Fitts suggests: Add a pickup time input to the pickup checkout flow.
Who flagged it
1 of 1 reviewers (You)
Evidence
You said: “When you were filling out a pickup order, you should have been able to put in a pickup time.”
See it yourself
Start at http://localhost:5176/checkout on desktop. Reported by the owner
Expected
Actual
When filling out a pickup order on checkout, there is no way to enter a pickup time, which makes scheduling pickup difficult.
Environment
Chromium 156 · 1536×864 · mouse · light · 100%
The Playwright test Fitts wrote
// No way to set pickup time
// Fitts repro · Chromium 156 · 1536×864 · mouse · light · 100% · no automatic check
// Steps: open the page
import { expect, test } from '@playwright/test';
test("No way to set pickup time", async ({ page }) => {
await page.goto("http://localhost:5176/checkout");
// Expected: Add a pickup time input to the pickup checkout flow.
// Actual: When filling out a pickup order on checkout, there is no way to enter a pickup time, which makes scheduling pickup difficult.
// Fitts has no automatic oracle for this one: check it by eye, then replace this line.
test.fixme(true, 'check by eye');
});
Sev 3 · MajorH3 · User control and freedomUsabilityOpen: not fixed in this run
No back or cancel in this flow
On /checkout, and 3 other pages: /menu/menu/funghi/menu/diavola · in src/pages/ItemPage.tsx:41
There’s no back or cancel control on /menu, so people who change their mind are stuck.
The fix Fitts suggests: Add a Back link (and Cancel) on every step.
Who flagged it
3 of 5 reviewers (Power user, Trust & ethics, Novice), and one of Fitts’s own measurements
What Fitts noticed
Noticed going back lost what I typed: no back or cancel control on /menu step 48 · /checkout
Noticed going back lost what I typed: no back or cancel control on /menu/ember-pepperoni step 59 · /menu
Noticed going back lost what I typed: no back or cancel control on /menu step 75 · /menu/funghi
Noticed going back lost what I typed: no back or cancel control on /menu step 95 · /menu/diavola
Evidence
no back or cancel control on /menu (expected a visible way back that keeps what was entered)
no back or cancel control on /menu/ember-pepperoni (expected a visible way back that keeps what was entered)
Noticed going back lost what I typed: no back or cancel control on /menu
no back or cancel control on /menu
going back lost what I typed
How Fitts got there
Tapped “Continue to pickup details” → /checkout
Sev 3 · MajorH4 · Consistency and standardsContentOpen: not fixed in this run
No lunch reservation times offered
On /reserve · in src/pages/ReservePage.tsx:61
You cannot book a lunch table even though the site says it opens at 12pm Fri-Sun. Midday visitors have no way to reserve.
The fix Fitts suggests: Generate Time options from the Hours for the selected date, including 12pm slots Fri-Sun.
Close up
The whole page
Who flagged it
2 of 5 reviewers (Novice, Trust & ethics)
Evidence
Time shows "7:00 PM" with options 5:00 PM to 9:00 PM
Footer Hours: Fri-Sat 12pm-11pm / Sun 12pm-9pm
You're booked, fitts-test. Table for 2 ... We'll text 5550100
How Fitts got there
Tapped “Reserve a table for next time” → /reserve
Sev 3 · MajorH8 · Aesthetic and minimalist designErgonomicsRolled back
Page scrolls sideways on small screens on Just under the breakpoint · 759×987
On /menu/burrata, and 5 other pages: /menu/caesar/menu/funghi/menu/verde/menu/rigatoni/menu/diavola · seen at Just under the breakpoint · 759×987 · in src/components/Layout.tsx:21
At narrow widths the page is wider than the screen (page is 1426px wide at 759px).
The fix Fitts suggests: Let content wrap and size to the viewport.
Who flagged it
1 of 5 reviewers (Visual design), and one of Fitts’s own measurements
What Fitts noticed
Noticed the page is 1426px wide at 759px step 101 · /menu/burrata
Noticed the page is 1426px wide at 759px step 101 · /menu/funghi
Noticed the page is 1426px wide at 759px step 101 · /menu/rigatoni
Noticed the page is 1426px wide at 759px step 101 · /menu/diavola
Noticed text overlaps the text below it with wider spacing step 101 · /menu/burrata
Evidence
page is 1426px wide at 759px on Just under the breakpoint · 759×987 (expected no sideways scrolling at 759px)
Rolled back: No fix job run-1/run. The code went back to the last good commit.
Cost $0
Sev 3 · MajorH8 · Aesthetic and minimalist designErgonomicsRolled back
Page scrolls sideways on small screens on At the breakpoint · 860×1118
On /menu/caesar, and 4 other pages: /menu/funghi/menu/verde/menu/rigatoni/menu/diavola · seen at At the breakpoint · 860×1118 · in src/components/Layout.tsx:21
At narrow widths the page is wider than the screen (page is 1522px wide at 860px).
The fix Fitts suggests: Let content wrap and size to the viewport.
Who flagged it
2 of 5 reviewers (Accessibility, Trust & ethics), and one of Fitts’s own measurements
What Fitts noticed
Noticed the page is 359px wide at 360px step 62 · /menu/caesar
Noticed the page is 1522px wide at 860px step 101 · /menu/caesar
Noticed the page is 1522px wide at 860px step 101 · /menu/funghi
Noticed the page is 1522px wide at 860px step 101 · /menu/verde
Noticed the page is 1426px wide at 759px step 101 · /menu/caesar
Noticed the page is 1426px wide at 759px step 101 · /menu/verde
Noticed text overlaps the text below it with wider spacing step 101 · /menu/caesar
Evidence
page is 1522px wide at 860px on At the breakpoint · 860×1118 (expected no sideways scrolling at 860px)
page is 359px wide at 360px
page is 1522px wide at 860px
How Fitts got there
Tapped “View Little Gem Caesar” → /menu/caesar
The fix Rolled back
Rolled back: No fix job run-1/run. The code went back to the last good commit.
Cost $0
Sev 1 · CosmeticAccessibilityRolled back
No way to skip the navigation
On /, and 13 other pages: /menu/menu/margherita/cart/checkout/confirmation/reserve/menu/burrata/about/menu/caesar/menu/funghi/menu/verde/menu/rigatoni/menu/diavola
6 navigation links before the content, no skip link, so keyboard users tab through all of it on every page.
The fix Fitts suggests: Add a "Skip to content" link as the first focusable element.
Who flagged it
1 of 5 reviewers (Accessibility), and one of Fitts’s own measurements
What Fitts noticed
Noticed 6 navigation links before the content, no skip link step 5 · /cart
Evidence
6 navigation links before the content, no skip link (expected a "Skip to content" link first)
6 navigation links before the content, no skip link
The fix Rolled back
Rolled back: No fix job run-1/run. The code went back to the last good commit.
Cost $0
Sev 1 · CosmeticH7 · Flexibility and efficiency of useErgonomicsOpen: not fixed in this run
Main action is hard to reach
On /menu/margherita, and 7 other pages: /about/checkout/menu/caesar/menu/funghi/menu/verde/menu/rigatoni/menu/diavola · in src/pages/ItemPage.tsx:41
Reaching it takes ID 4.1 bits (729px away, 46px wide).
The fix Fitts suggests: Make it bigger and put it near where the previous step ended.
Close up
The whole page
Who flagged it
4 of 5 reviewers (Power user, Novice, Accessibility, Visual design), and one of Fitts’s own measurements
What Fitts noticed
Noticed Add to cart · $14.00 is far and small for a primary action: ID 4.1 bits (729px away, 46px wide) step 28 · /menu/margherita
Noticed Send message is far and small for a primary action: ID 4.2 bits (808px away, 46px wide) step 32 · /about
Noticed Add to cart · $11.00 is far and small for a primary action: ID 4.1 bits (729px away, 46px wide) step 63 · /menu/caesar
Noticed ← Back to menu is far and small for a primary action: ID 5.3 bits (698px away, 18px wide) step 66 · /menu/caesar
Noticed ← Back to menu is far and small for a primary action: ID 5.4 bits (743px away, 18px wide) step 75 · /menu/funghi
Noticed Add to cart · $16.00 is far and small for a primary action: ID 4.1 bits (729px away, 46px wide) step 78 · /menu/verde
6 more lines
Noticed ← Back to menu is far and small for a primary action: ID 5.4 bits (743px away, 18px wide) step 82 · /menu/verde
Noticed Add to cart · $17.00 is far and small for a primary action: ID 4.1 bits (729px away, 46px wide) step 85 · /menu/rigatoni
Noticed ← Back to menu is far and small for a primary action: ID 5.6 bits (877px away, 18px wide) step 95 · /menu/diavola
Noticed About & Contact is far and small for a primary action: ID 4.5 bits (755px away, 34px wide) step 102 · /menu/diavola
Noticed About & Contact is far and small for a primary action: ID 4.5 bits (755px away, 34px wide) step 106 · /checkout
Noticed Back to cart is far and small for a primary action: ID 5.1 bits (580px away, 18px wide) step 123 · /checkout
Evidence
ID 4.1 bits (729px away, 46px wide) (expected at most 4 bits for a main action)
ID 4.2 bits (808px away, 46px wide) (expected at most 4 bits for a main action)
Add to cart · $14.00 is far and small for a primary action: ID 4.1 bits (729px away, 46px wide)
Send message is far and small for a primary action: ID 4.2 bits (808px away, 46px wide)
Not enough evidence to show as findings. Listed so nothing is hidden.
Sev 3 · MajorSame links named differentlyon /confirmation The same destinations are named differently in header, body, and footer, forcing hurried mobile users to pause and guess.
Sev 3 · MajorKeyboard focus invisible, links off-screenon /menu/burrata A keyboard user cannot see where they are because focus has no indicator and footer links receive focus while off-screen, with no skip link to bypass navigation.
Sev 3 · MajorKeyboard tabbing loses your placeon /about Keyboard power users lose their place tabbing this page: there is no focus ring and the form controls scroll out of view with focus jumping backwards.
Sev 3 · MajorNo map next to address and hourson /about People trying to line up the address against opening hours find no map, so they bounce between Cart and About and give up.
Sev 2 · MinorMenu link named three different wayson /reserve A repeat customer scanning fast sees three different labels for the same place and must hesitate to be sure.
Sev 2 · MinorCart called different nameson /menu/verde The cart is called Cart in the header, Your cart in the footer, and View cart & checkout after adding, so a repeat user must re-learn the same action.
Which models did what
Every model call in this run, grouped by model. The model that writes a fix never grades it.
Model
Its jobs here
Calls
Tokens in / out
Cost
Muse Spark 1.3Meta
the interview, choosing what to try, the theme check, reviewing pages
256
1.2M / 203.1k
$2.17
ElevenLabs Flash v2.5ElevenLabs
speaking
97
0 / 0
$0.888
Muse Wonder 1.0Meta
reading the code
1
39.7k / 4.5k
$0.249
SAM 3.1Meta
outlining elements
5
0 / 0
$0.013
Muse Voice Transcribe 1.0Meta
hearing the owner
27
0 / 0
$0.0071
Cost per model call
$3.33 in all (the run’s cap was $8.00). Time is minutes into the run.