perf+a11y: WAL mode for SQLite, skip links, :focus-visible, .sr-only

SQLite performance (Database::__construct):
- PRAGMA journal_mode = WAL: eliminates full-DB read locks on write, safe
  for concurrent PHP-FPM workers
- PRAGMA synchronous = NORMAL: durable on commit without full fsync per write
- PRAGMA cache_size = -8000: ~8 MB page cache per connection

Accessibility foundation (WCAG 2.1 AA):
- common.css: add .sr-only utility, .skip-link (hidden until focused),
  global :focus-visible (2px purple outline, 2px offset),
  prefers-reduced-motion guard; remove bare outline:none from
  .site-search__input
- admin.css: same :focus-visible, skip-link, and motion guard scoped to
  admin purple; remove outline:none from .admin-input/.admin-select/
  .admin-textarea and .admin-filters select (both had :focus border rules
  already, so focus is still visually communicated)
- search.css: remove outline:none from .search-filter-select (already has
  :focus border-color rule)
- All 5 public pages (index, search, tfe, apropos, licence): add
  <a href="#main-content" class="skip-link"> as first child of <body>;
  add id="main-content" to <main>
- templates/admin/head.php: same skip link; aria-label="Navigation admin"
  on <nav>; id="main-content" on all 10 admin <main> elements

All 4 test suites pass (unit, integration, security, rate-limit).
This commit is contained in:
Pontoporeia
2026-03-27 13:45:01 +01:00
parent a9877b1d1d
commit 42af4644c5
23 changed files with 128 additions and 45 deletions

View File

@@ -18,7 +18,7 @@ if (empty($_SESSION['csrf_token'])) {
?>
<?php require_once APP_ROOT . '/templates/admin/head.php'; ?>
<main class="admin-main">
<main class="admin-main" id="main-content">
<h1 class="admin-page-title">Compte administrateur</h1>
<?php if ($error): ?>

View File

@@ -41,7 +41,7 @@ function wasSelected($key, $value) {
?>
<?php require_once APP_ROOT . '/templates/admin/head.php'; ?>
<main class="admin-main">
<main class="admin-main" id="main-content">
<h1 class="admin-page-title">Ajouter un TFE</h1>
<?php if ($error): ?>

View File

@@ -234,7 +234,7 @@ try {
?>
<?php require_once APP_ROOT . '/templates/admin/head.php'; ?>
<main class="admin-main">
<main class="admin-main" id="main-content">
<h1 class="admin-page-title">Modifier un TFE</h1>
<?php if ($error): ?>

View File

@@ -279,7 +279,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['csv_file'])) {
?>
<?php require_once APP_ROOT . '/templates/admin/head.php'; ?>
<main class="admin-main">
<main class="admin-main" id="main-content">
<h1 class="admin-page-title">Importer une liste de TFE</h1>
<?php if (!empty($errors)): ?>

View File

@@ -62,7 +62,7 @@ document.addEventListener('DOMContentLoaded', () => {
});
</script>
<main class="admin-main">
<main class="admin-main" id="main-content">
<h1 class="admin-page-title">Liste des TFE</h1>
<?php if (isset($_SESSION['error'])): ?>

View File

@@ -33,7 +33,7 @@ $pageTitle = "Éditer : " . htmlspecialchars($page['title']);
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/easymde/dist/easymde.min.css">
<main class="admin-main">
<main class="admin-main" id="main-content">
<h1 class="admin-page-title">Éditer : <?= htmlspecialchars($page['title']) ?></h1>
<form action="/admin/actions/page.php" method="post" class="admin-form">

View File

@@ -20,7 +20,7 @@ unset($_SESSION['success']);
?>
<?php require_once APP_ROOT . '/templates/admin/head.php'; ?>
<main class="admin-main">
<main class="admin-main" id="main-content">
<h1 class="admin-page-title">Pages statiques</h1>
<?php if ($success): ?>

View File

@@ -601,7 +601,7 @@ require_once APP_ROOT . '/templates/admin/head.php';
.nginx-location { color: #79dac8; }
</style>
<main class="admin-main">
<main class="admin-main" id="main-content">
<h1 class="admin-page-title">Système</h1>
<p class="sys-refresh-note">

View File

@@ -24,7 +24,7 @@ unset($_SESSION['admin_error'], $_SESSION['admin_success']);
?>
<?php require_once APP_ROOT . '/templates/admin/head.php'; ?>
<main class="admin-main">
<main class="admin-main" id="main-content">
<h1 class="admin-page-title">Mots-clés (<?= count($tags) ?>)</h1>
<?php if ($error): ?>

View File

@@ -73,7 +73,7 @@ $pageTitle = "Récapitulatif TFE";
?>
<?php require_once APP_ROOT . '/templates/admin/head.php'; ?>
<main class="admin-main">
<main class="admin-main" id="main-content">
<h1 class="admin-page-title">Récapitulatif TFE</h1>
<?php if ($error): ?>