feat: finish portfolio title, navigation, and destination effects

Add the approved name animation, rounded docking navigation, localized keyboard focus cue, unified builds card, and destination copy hierarchy.

Introduce lightweight one-shot meteors and a sun ring that repeats every three seconds at Contact. Open the email action in a separate browsing context. Preserve reduced-motion behavior and keep private handoff and visual-check artifacts out of version control.

Validation: 649 tests passed; all 20 failures in world-models and SceneCanvas reproduce on baseline 103427f. Typecheck, artifact verification, and transfer budgets passed. Client/SSR preview build passed before this commit. Existing baseline test failures remain unchanged.
This commit is contained in:
2026-09-05 22:16:42 +03:00
parent 103427f95b
commit f46131723b
31 changed files with 948 additions and 51 deletions

View File

@@ -1,5 +1,5 @@
import type { PortfolioContent } from "@/content/types";
import { expect, expectInsetFocusIndicator, test } from "../helpers/serve-dist";
import { expect, expectContentFocusCue, test } from "../helpers/serve-dist";
test.use({ javaScriptEnabled: false });
@@ -401,7 +401,7 @@ test("keeps every raw SSR reading-path segment visible without JavaScript", asyn
.locator("main > section")
.evaluateAll((sections) => sections.map((section) => section.id)),
).toEqual(sectionIds);
expect(await page.locator("main > section > h2").allTextContents()).toEqual(
expect(await page.locator("main > section h2").allTextContents()).toEqual(
sectionHeadings,
);
@@ -518,7 +518,7 @@ test("activating the skip link focuses visible portfolio content without JavaScr
"tabindex",
"-1",
);
await expectInsetFocusIndicator(page, "#portfolio-content");
await expectContentFocusCue(page);
});
test("retains native section navigation when scripts are disabled", async ({