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:
@@ -120,6 +120,19 @@ export async function expectInsetFocusIndicator(
|
||||
});
|
||||
}
|
||||
|
||||
export async function expectContentFocusCue(page: Page): Promise<void> {
|
||||
await expect(page.locator('#portfolio-content')).toBeFocused();
|
||||
const cue = page.locator('.content-focus-cue');
|
||||
await expect(cue).toBeVisible();
|
||||
expect(await page.locator('#portfolio-content').evaluate(element => ({
|
||||
outline: getComputedStyle(element).outlineStyle,
|
||||
shadow: getComputedStyle(element).boxShadow,
|
||||
}))).toEqual({ outline: 'none', shadow: 'none' });
|
||||
const box = await cue.boundingBox();
|
||||
expect(box!.width).toBeLessThan(240);
|
||||
expect(box!.height).toBeLessThan(60);
|
||||
}
|
||||
|
||||
export async function revealNavigationLinks(page: Page): Promise<void> {
|
||||
const summary = page.locator(".site-navigation summary");
|
||||
if (!(await summary.isVisible())) return;
|
||||
|
||||
Reference in New Issue
Block a user