diff --git a/.github/chatmodes/fixer.chatmode.md b/.github/chatmodes/fixer.chatmode.md
index 0e35b6450b..e309949f6e 100644
--- a/.github/chatmodes/fixer.chatmode.md
+++ b/.github/chatmodes/fixer.chatmode.md
@@ -1,7 +1,7 @@
---
description: 'Fix and verify issues in app'
model: GPT-5 (Preview)
-tools: ['extensions', 'codebase', 'usages', 'vscodeAPI', 'problems', 'changes', 'testFailure', 'fetch', 'findTestFiles', 'searchResults', 'githubRepo', 'runTests', 'runCommands', 'runTasks', 'editFiles', 'runNotebooks', 'search', 'new', 'get_issue', 'get_issue_comments', 'get-library-docs', 'playwright', 'pylance mcp server']
+tools: ['extensions', 'codebase', 'usages', 'vscodeAPI', 'problems', 'changes', 'testFailure', 'fetch', 'findTestFiles', 'searchResults', 'githubRepo', 'runTests', 'runCommands', 'runTasks', 'editFiles', 'runNotebooks', 'search', 'new', 'create_pull_request', 'get_issue', 'get_issue_comments', 'get-library-docs', 'playwright', 'pylance mcp server']
---
# Fixer Mode Instructions
@@ -25,3 +25,8 @@ You MUST check task output readiness before debugging, testing, or declaring wor
- Backend: Quart was started with --reload; Python changes trigger an automatic restart.
- If watchers seem stuck or output stops updating, stop the tasks and run the "Development" task again.
- To interact with a running application, use the Playwright MCP server
+
+## Committing the change
+
+When change is complete, offer to make a new branch, git commit, and pull request.
+Make sure the PR follows the PULL_REQUEST_TEMPLATE.md format, with all sections filled out and appropriate checkboxes checked.
diff --git a/app/frontend/src/pages/layout/Layout.module.css b/app/frontend/src/pages/layout/Layout.module.css
index 4854140247..4f53c0177e 100644
--- a/app/frontend/src/pages/layout/Layout.module.css
+++ b/app/frontend/src/pages/layout/Layout.module.css
@@ -4,6 +4,12 @@
height: 100%;
}
+.main {
+ display: flex;
+ flex: 1;
+ min-height: 0; /* allow inner scroll areas to work inside flex container */
+}
+
.header {
background-color: #222222;
color: #f2f2f2;
diff --git a/app/frontend/src/pages/layout/Layout.tsx b/app/frontend/src/pages/layout/Layout.tsx
index 2086129292..1bf90f9c0a 100644
--- a/app/frontend/src/pages/layout/Layout.tsx
+++ b/app/frontend/src/pages/layout/Layout.tsx
@@ -75,7 +75,9 @@ const Layout = () => {
-
+
+
+
);
};
diff --git a/requirements-dev.txt b/requirements-dev.txt
index c035649f27..cece1adac8 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -12,3 +12,4 @@ pytest-snapshot
pre-commit
pip-tools
mypy==1.14.1
+axe-playwright-python
diff --git a/tests/e2e.py b/tests/e2e.py
index adb5805e07..5d4252d00b 100644
--- a/tests/e2e.py
+++ b/tests/e2e.py
@@ -10,6 +10,7 @@
import pytest
import requests
import uvicorn
+from axe_playwright_python.sync_playwright import Axe
from playwright.sync_api import Page, Route, expect
import app
@@ -110,6 +111,10 @@ def handle(route: Route):
expect(page.get_by_role("button", name="Clear chat")).to_be_disabled()
expect(page.get_by_role("button", name="Developer settings")).to_be_enabled()
+ # Check accessibility of page in initial state
+ results = Axe().run(page)
+ assert results.violations_count == 0, results.generate_report()
+
# Ask a question and wait for the message to appear
page.get_by_placeholder("Type a new question (e.g. does my plan cover annual eye exams?)").click()
page.get_by_placeholder("Type a new question (e.g. does my plan cover annual eye exams?)").fill(