Skip to content

moooon

Motir

Vibe your whole project. Bring an idea — Motir's three AI layers plan it, track it, and ship it, end to end. You're looking at Motir, built in Motir.

  • Vibe Project
  • Open Source
  • AI Agent
  • AI Loop
1
requests
0
upvotes
145
planned
1,361
shipped

Motir · Work items

MOTIR-3984Done

motir.co's footer ships `--el-text-muted` on `--el-surface-soft` — 4.34:1 on EVERY page of the site, and `aaMatrix`'s PAIRS carries that ink against the card but not against the band

Found while running MOTIR-3931, by the element scan that card's measurement section documents. This is the same pair, one surface over, in RUNTIME CODE rather than in an asset — so it is live on motir.co now, and MOTIR-3931 does not claim it.

The defect

app/_components/SiteFooter.tsx opens the footer with bg-(--el-surface-soft) (line 62) and closes it with a legal strip that no Card intervenes on:

<div className="col-span-full border-t border-(--el-border) pt-4 text-[12px] text-(--el-text-muted)">

--el-text-muted on --el-surface-soft is 4.34:1 in the light theme of the default motir palette. 12px is not WCAG large text, so 1.4.3 asks 4.5:1. theme.css states the number itself at the token's declaration and adds the rule in its own words: "a muted caption belongs inside a card, never on a panel" (MOTIR-2455).

SiteFooter is rendered by app/layout.tsx, so this is every page of motir.co, not one route.

The rest of the footer is already right, which is what makes the strip look deliberate rather than missed: the body copy and every link are --el-text-secondary on the same band. One element is on the wrong ink.

The measurement, and its control

Re-taken against the pinned @motir/design-system@0.1.1 over all ten palettes in both themes, by the harness recorded in design/marketing/design-notes.md § How this asset was measured (widened by MOTIR-3931):

ink--el-page-bg / --el-card--el-surface--el-surface-soft--el-muted
--el-text-muted, light motir4.54 ✓4.17 ✗4.34 ✗4.12 ✗
light, the ten-palette sweep0/101/101/101/10
dark, all ten

The failing palette is motir alone, light only — and motir is the default a first-time visitor is served. Control: the four figures above reproduce theme.css's own quoted sentence (4.54 / 4.17 / 4.34 / 4.12) to the digit.

The second half — the test that would have caught it has the ink but not the surface

tests/aaMatrix.test.ts (shipped by MOTIR-1043) carries --el-text-muted in its PAIRS list against --el-card — the surface MOTIR-1043 moved the axis rail onto — and does not carry it against --el-surface-soft. So the matrix is green, correctly, about a pair that is not the one the footer paints. A pair list is written by somebody who already knows which pairs to write, which is the failure MOTIR-3931 exists to record, arriving here for the third time in three days (after MOTIR-3874 and MOTIR-3931 itself).

The asset is FAITHFUL, so it is fixed with the code and not before

design/marketing/landing.mock.html's div.legal inside footer.foot draws the identical pair at the identical 4.34, ×2. That is the mock being correct about what ships, so correcting it ahead of the code would make the asset draw a page that does not exist — the inverse of MOTIR-3931's defect. Both halves land in this card's one pull request, and landing.png is re-exported with them (the three-file rule).

Acceptance criteria

  • app/_components/SiteFooter.tsx's legal strip no longer paints --el-text-muted on the --el-surface-soft band — either the ink moves to --el-text-secondary (what the rest of that footer already uses) or the strip moves onto a card surface. Whichever is chosen, the reason is recorded in the file, with the number.
  • tests/aaMatrix.test.ts's PAIRS gains --el-text-muted / --el-text-eyebrow / --el-text-helper against --el-surface-soft, --el-surface and --el-muted — every surface this site paints them on — so the matrix rules on the pair the footer draws rather than only on the one the rail draws. The existing --el-card entries stay.
  • The suite is RED on the current footer before the fix and green after it, and the pull request body says so (reproduce-before-fix).
  • design/marketing/landing.mock.html's div.legal matches the fixed component, and landing.png is re-exported at its own existing viewport (2640px wide, deviceScaleFactor: 2).
  • design/marketing/design-notes.md records the pair and its number in the landing half of the file, as MOTIR-3931 did for the showcase half.
  • pnpm lint, format:check, typecheck, build, test.

Advisory dispositions

validate_work_item returned two at create time. Both are disposed of here, and the edge one is WIRED rather than noted.

  • reference · likely-missing-edge — names MOTIR-3931 at in_progress — APPLIES, and it is wired. Criterion 5 reads a design-notes.md section that exists only on MOTIR-3931's unmerged branch, and both cards edit that same file plus design/marketing/**. So this card is blocked_by MOTIR-3931, and it was MOVED into MOTIR-656 alongside it so the edge is intra-container rather than cross-parent (gate 7). Re-running log-bug.md's EDGE TEST with that edge visible is also what chose this parent: a dependency edge to a not-done card in the finding story is the YES branch, and 8.3 genuinely is not finished while every page of the site it built fails AA in its footer.
  • shape · likely-self-blocking-design (design criterion 4, surface criterion 1) — DOES NOT APPLY, and the detector has the order inverted. It fires where one criterion produces a design a later one builds against. Here criterion 1 changes the COMPONENT and criterion 4 makes the ASSET match the changed component — the asset is downstream of the code, not upstream. That inversion is this card's whole point: the mock is currently FAITHFUL, so splitting the two would leave it drawing a page that does not exist for as long as the split lasted, which is the exact defect MOTIR-3931 was filed about. One repository, one pull request, both layers, by construction.

Boundary

Not a token change. --el-text-muted's values are motir-core's and are deliberate (MOTIR-2455); nothing here asks for a republish of @motir/design-system. And not the board-chrome question — the 54 annotation-layer sites in the same two mocks are a separate card, because they turn on a decision rather than on a number.