diff --git a/dashboard/lib/appShellBypass.tsx b/dashboard/lib/appShellBypass.tsx
new file mode 100644
index 0000000..743bcaf
--- /dev/null
+++ b/dashboard/lib/appShellBypass.tsx
@@ -0,0 +1,5 @@
+import type { ReactNode } from 'react'
+
+export function AppShellBypass({ children }: { children: ReactNode }) {
+ return <>{children}>
+}
diff --git a/dashboard/ui/tests/e2e/auth-pages.spec.ts b/dashboard/ui/tests/e2e/auth-pages.spec.ts
new file mode 100644
index 0000000..aac4801
--- /dev/null
+++ b/dashboard/ui/tests/e2e/auth-pages.spec.ts
@@ -0,0 +1,63 @@
+import { Page, expect, test } from '@playwright/test'
+
+async function expectAuthLayoutWithinViewport(page: Page) {
+ const viewport = page.viewportSize()
+ if (!viewport) {
+ throw new Error('Viewport size is not available')
+ }
+
+ const authLayout = page.getByTestId('auth-layout')
+ await expect(authLayout).toBeVisible()
+
+ const boundingBox = await authLayout.evaluate((element) => {
+ const rect = element.getBoundingClientRect()
+ return {
+ top: rect.top,
+ right: rect.right,
+ bottom: rect.bottom,
+ left: rect.left,
+ }
+ })
+
+ const tolerance = 1
+ expect.soft(boundingBox.top).toBeGreaterThanOrEqual(-tolerance)
+ expect.soft(boundingBox.left).toBeGreaterThanOrEqual(-tolerance)
+ expect.soft(boundingBox.right).toBeLessThanOrEqual(viewport.width + tolerance)
+ expect.soft(boundingBox.bottom).toBeLessThanOrEqual(viewport.height + tolerance)
+
+ await expect(page.locator('nav')).toHaveCount(0)
+}
+
+test.describe('Auth pages', () => {
+ test('login form visible on desktop viewport', async ({ page }) => {
+ await page.setViewportSize({ width: 1280, height: 720 })
+ await page.goto('/login')
+ await page.waitForLoadState('networkidle')
+
+ await expectAuthLayoutWithinViewport(page)
+ })
+
+ test('login form visible on mobile viewport', async ({ page }) => {
+ await page.setViewportSize({ width: 375, height: 812 })
+ await page.goto('/login')
+ await page.waitForLoadState('networkidle')
+
+ await expectAuthLayoutWithinViewport(page)
+ })
+
+ test('register form visible on desktop viewport', async ({ page }) => {
+ await page.setViewportSize({ width: 1280, height: 720 })
+ await page.goto('/register')
+ await page.waitForLoadState('networkidle')
+
+ await expectAuthLayoutWithinViewport(page)
+ })
+
+ test('register form visible on mobile viewport', async ({ page }) => {
+ await page.setViewportSize({ width: 375, height: 812 })
+ await page.goto('/register')
+ await page.waitForLoadState('networkidle')
+
+ await expectAuthLayoutWithinViewport(page)
+ })
+})