From 915ccea0b546d5ad2fdd89ac6296c78295e7a2b2 Mon Sep 17 00:00:00 2001 From: Jess Sullivan Date: Sun, 24 May 2026 18:43:24 -0400 Subject: [PATCH] fix: keep footer clear in previews --- e2e/navigation.spec.ts | 20 ++++++++++++++++++++ src/routes/+layout.svelte | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/e2e/navigation.spec.ts b/e2e/navigation.spec.ts index adda410..36b72dd 100644 --- a/e2e/navigation.spec.ts +++ b/e2e/navigation.spec.ts @@ -34,6 +34,26 @@ test.describe('Navigation', () => { await expect(footer.locator('a[href="/feed.xml"]')).toBeVisible(); await expect(footer.locator('a[href="/feed.json"]')).toBeVisible(); }); + + test('footer keeps bottom clearance in preview-sized viewports', async ({ page }) => { + await page.setViewportSize({ width: 390, height: 844 }); + await page.goto('/cv'); + await page.evaluate(() => window.scrollTo(0, document.documentElement.scrollHeight)); + + const clearance = await page.evaluate(() => { + const footer = Array.from(document.querySelectorAll('footer')).at(-1); + if (!footer) return 0; + + const visibleDescendants = Array.from(footer.querySelectorAll('*')) + .map((element) => element.getBoundingClientRect()) + .filter((rect) => rect.width > 0 && rect.height > 0); + const lowestContentBottom = Math.max(...visibleDescendants.map((rect) => rect.bottom)); + + return window.innerHeight - lowestContentBottom; + }); + + expect(clearance).toBeGreaterThanOrEqual(88); + }); }); test.describe('About Page', () => { diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 8e2873e..47cd633 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -288,7 +288,7 @@ {@render children()} -