diff --git a/src/components/patterns/Footer/Footer.css b/src/components/patterns/Footer/Footer.css index 14804b7276..ff19ce4f61 100644 --- a/src/components/patterns/Footer/Footer.css +++ b/src/components/patterns/Footer/Footer.css @@ -72,12 +72,23 @@ justify-content: center; gap: var(--space-6); + a { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: var(--size-6); + min-height: var(--size-6); + } + li { display: inline; } svg { color: var(--color-icon-primary); + width: var(--size-4); + height: var(--size-4); + flex-shrink: 0; } svg path { @@ -86,6 +97,8 @@ @media (--xs-only) { padding: var(--space-4) 0 var(--space-6); + flex-wrap: wrap; + gap: var(--space-3); } @media (--md-up) { diff --git a/tests/e2e/homepage.spec.ts b/tests/e2e/homepage.spec.ts index 38eb280304..d7c0383d23 100644 --- a/tests/e2e/homepage.spec.ts +++ b/tests/e2e/homepage.spec.ts @@ -242,4 +242,40 @@ test.describe('Homepage Content', () => { await expect(blueskyLink).toBeVisible(); await expect(rssLink).toBeVisible(); }); + + test('should preserve minimum social icon and target sizes on narrow screens', async ({ + page, + }) => { + await page.setViewportSize({ width: 390, height: 844 }); + + const footer = page.getByTestId('footer'); + const measurementTolerance = 0.01; + const socialLinks = [ + footer.getByRole('link', { name: /GitHub/i }), + footer.getByRole('link', { name: /Youtube/i }), + footer.getByRole('link', { name: /X account/i }), + footer.getByRole('link', { name: /slack/i }), + footer.getByRole('link', { name: /Open Collective/i }), + footer.getByRole('link', { name: /bluesky/i }), + footer.getByRole('link', { name: /RSS Feed/i }), + ]; + + for (const link of socialLinks) { + const linkBox = await link.boundingBox(); + const iconBox = await link.locator('svg').boundingBox(); + + expect(linkBox).not.toBeNull(); + expect(iconBox).not.toBeNull(); + expect(linkBox!.width).toBeGreaterThanOrEqual(24 - measurementTolerance); + expect(linkBox!.height).toBeGreaterThanOrEqual(24 - measurementTolerance); + expect(iconBox!.width).toBeGreaterThanOrEqual(16 - measurementTolerance); + expect(iconBox!.height).toBeGreaterThanOrEqual(16 - measurementTolerance); + } + + const viewport = await page.evaluate(() => ({ + clientWidth: document.documentElement.clientWidth, + scrollWidth: document.documentElement.scrollWidth, + })); + expect(viewport.scrollWidth).toBeLessThanOrEqual(viewport.clientWidth); + }); });