Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 0 additions & 7 deletions .github/workflows/e2e-sites.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,6 @@ jobs:
name: ${{ matrix.framework }} on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
timeout-minutes: 25
# Next.js leg is advisory until the fixture is converted to a pure
# static export. chromiumoxide 0.9.1 (PR #232) fixed the WebSocket
# 'Invalid message' bug, but Next.js's client-side hydration still
# produces non-deterministic computed-style timing across runs on
# Linux + Windows. macOS happens to be stable. Tracking the static
# fixture rewrite as aram-devdocs/plumb#233.
continue-on-error: ${{ matrix.framework == 'nextjs' }}
strategy:
fail-fast: false
matrix:
Expand Down
11 changes: 6 additions & 5 deletions e2e-sites/nextjs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,9 @@ matches the rest of the matrix.

`expected.json` sets a `wait_for` block that the harness threads onto
`plumb lint --wait-for <selector> --wait-ms <ms>`. The selector is
`html[data-plumb-ready="true"]`; the marker is set from a `useEffect`
in `app/plumb-ready.tsx`, so it appears only after React has hydrated
the tree on the client. Without it Chromium occasionally captures a
half-hydrated DOM under CI load — that flake was the reason the leg
ran with `continue-on-error: true` in `e2e-sites.yml`.
`html[data-plumb-ready="true"]`; the marker is server-rendered
directly onto the `<html>` element in `app/layout.tsx`, so it appears
on the very first paint. The fixture is a pure static export with no
`'use client'` components — Chromium captures a stable, byte-identical
DOM on every run, which is what the harness's 3× determinism check
relies on.
7 changes: 6 additions & 1 deletion e2e-sites/nextjs/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,13 @@ export default function RootLayout({
}: {
children: React.ReactNode;
}) {
// `data-plumb-ready="true"` is server-rendered directly onto the
// `<html>` element so the harness's `wait_for` selector resolves
// against the very first paint. No `'use client'` component is
// needed; the resulting `out/index.html` is a deterministic static
// artifact, byte-stable across Linux/macOS/Windows builds.
return (
<html lang="en">
<html lang="en" data-plumb-ready="true">
<body className="bg-white text-[#0b0b0b]">{children}</body>
</html>
);
Expand Down
3 changes: 0 additions & 3 deletions e2e-sites/nextjs/app/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,9 @@
// Same intentional violations as the rest of the matrix: see
// ../README.md.

import PlumbReady from "./plumb-ready";

export default function Page() {
return (
<main className="p-6">
<PlumbReady />
<section className="bg-white text-[#0b0b0b] p-4 mb-6">
<h1 className="text-2xl font-semibold mb-2">Plumb e2e — nextjs</h1>
<p className="text-base">
Expand Down
18 changes: 0 additions & 18 deletions e2e-sites/nextjs/app/plumb-ready.tsx

This file was deleted.

2 changes: 1 addition & 1 deletion e2e-sites/nextjs/expected.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"$comment": "Next.js 14 statically exported. The framework injects a hidden `<next-route-announcer>` that uses the visually-hidden `margin: -1px` trick — that contributes 4 grid + 4 scale violations on top of the intentional `p-[13px]` hero. Expected counts are doubled accordingly. The non-target rules `sibling/height-consistency` and `sibling/padding-consistency` also fire on the announcer; they're not asserted on. The `wait_for` block points at a `data-plumb-ready` sentinel set from a `useEffect` in `app/plumb-ready.tsx`, which guarantees post-hydration capture and ends the CI flake that previously kept this leg advisory.",
"$comment": "Next.js 14 statically exported. The framework injects a hidden `<next-route-announcer>` that uses the visually-hidden `margin: -1px` trick — that contributes 4 grid + 4 scale violations on top of the intentional `p-[13px]` hero. Expected counts are doubled accordingly. The non-target rules `sibling/height-consistency` and `sibling/padding-consistency` also fire on the announcer; they're not asserted on. The `wait_for` block points at a `data-plumb-ready` sentinel server-rendered onto `<html>` in `app/layout.tsx`, which makes the captured DOM byte-stable across Linux/macOS/Windows runs.",
"target_rules": [
"color/palette-conformance",
"spacing/grid-conformance",
Expand Down
Loading