mirror of
https://github.com/pbakaus/impeccable.git
synced 2026-09-12 06:06:37 +03:00
New rule: body-text-viewport-edge flags body paragraphs that render flush
against the left/right viewport edges (no container padding). Tested via
the new tests/fixtures/antipatterns/body-text-viewport-edge.html fixture
(3 flag cases, 5 pass cases) and the test in detect-antipatterns-browser.
False-positive class fixes — all jsdom-mode only (real browsers resolve
the cascade correctly so these gates stay inert there). Five related
gaps that compounded into ~14× spurious contrast findings on Tailwind v4
pages with OKLCH color tokens:
• OKLCH parser. jsdom returns the literal "oklch(...)" string from
getComputedStyle; the detector now converts to sRGB via Björn
Ottosson's matrices. Handles Tailwind v4's compact minified form
"oklch(21.5%.02 50)" (no space after %).
• var() resolution. resolveBackground + checkElementColors now
accept the existing customPropMap and parse `var(--color-paper)`
etc. as proper RGB via the new parseColorResolved helper.
• bg-color before bg-image. The old order bailed on any gradient
ancestor before checking for a solid background-color underneath,
causing the body's decorative paper-grain gradient to be measured
against instead of the page's actual `bg-paper` cream.
• body/html-level gradient → white fallback. When the only opaque
ancestor we can read is body/html with a gradient overlay (and
jsdom can't decompose `background: var(--paper) gradient` to
extract the solid color), return white instead of falling through
to resolveGradientStops — which was picking up paper-grain noise
colors and using them as the bg.
• Anchor-inherit workaround for jsdom :link UA specificity.
Tailwind v4's preflight declares `a { color: inherit }` (0,0,1).
jsdom's UA stylesheet has `:link { color: blue }` at (0,1,1) and
wins the cascade. Real Chrome wraps :link in :where() (0,0,0) so
the page rule wins. When the page declares the inherit rule AND
we see jsdom's default `rgb(0,0,238)` on an anchor, walk to the
nearest non-anchor ancestor and use its color.
• Alpha-fallback safety gate. When text has alpha<1 AND we couldn't
find an opaque ancestor (effectiveBg null), skip the contrast
finding. Covers any remaining FP class the deeper fixes miss.
Verified end-to-end against an Opus iter-1 artifact on Tailwind v4 with
14 cream/cream FPs + 2 blue-link UA FPs before; 0 findings after, while
the color.html fixture's 12 real low-contrast cases continue to flag
(verified via direct detectHtml calls).
cli/engine/detect-antipatterns-browser.js is the generated browser
distribution — regenerated from .mjs via scripts/build-browser-detector.js
(no manual edits to the generated file).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>