Files
xamxam/TODO.md
Pontoporeia 94e9060dc7 WCAG 4.1.2: add WebVTT caption support for <video> elements on tfe.php
Problem: <video> elements on tfe.php had no <track kind="captions"> element,
violating WCAG 4.1.2 (name, role, value) for video content.

Changes:
- public/tfe.php: collect all text/vtt files from the thesis file list before
  rendering; skip standalone rendering of .vtt entries; for each MP4 emit a
  <track kind="captions" srclang="fr" label="Sous-titres" default> pointing
  to the N-th VTT file (N-th video paired with N-th caption in document order)
- public/media.php: add text/vtt to allowed MIME list; normalise finfo
  text/plain -> text/vtt for .vtt files; add vtt branch to cache/header
  block (Content-Type: text/vtt; charset=utf-8, 1-day cache)
- public/admin/actions/formulaire.php: allow .vtt uploads (text/vtt MIME,
  vtt extension); normalise text/plain finfo result; set file_type='caption'
  for VTT files so they are distinguishable from other thesis files
- public/admin/add.php: extend files field accept attr to include .vtt;
  update hint text to document the VTT sidecar convention

VTT files uploaded under theses/ inherit the same access_type visibility
gate in media.php as all other thesis content (403 for access_type_id=3).
2026-04-06 15:33:08 +02:00

6.1 KiB
Raw Blame History

TODO

Pending tasks have been split into topic files under todo/:

File Topic
todo/01-css-semantic-refactor.md CSS class audit, semantic HTML (public + admin), inline style extraction, favicon
todo/02-php-components.md Form field partials, shared UI partials, controller extraction, backend maintenance
todo/03-system-cache.md system_cache table, SystemCache class, system.php refactor
todo/04-accessibility.md WCAG 2.1 AA - remaining failures grouped by success criterion

Recently completed (this session)

  • WCAG 4.1.2 <video> captions — tfe.php now emits <track kind="captions"> for each MP4 when a .vtt sidecar exists (N-th VTT paired with N-th video). formulaire.php accepts .vtt uploads (file_type='caption', MIME normalised). media.php serves text/vtt with correct headers and visibility gating. Admin add.php file-field hint documents the .vtt upload convention.

  • admin/edit.php — WCAG 4.1.2: removed mb_strimwidth truncation from $accessOptions mapping; access type <select> options now include full description text (name — description) so the accessible name is unambiguous for screen readers

  • public/assets/favicon.svg — created public favicon: brand-purple (#9557b5) rounded square with white "P" lettermark; distinct from admin_favicon.svg (archive-restore icon in #c104fc)

  • templates/head.php — favicon <link> now selects favicon.svg (public) vs admin_favicon.svg (admin) based on $isAdmin; closes todo/01-css-semantic-refactor.md favicon task

  • todo/04-accessibility.md — marked WCAG 3.1.1 lang audit and WCAG 4.1.2 select truncation items as done

  • todo/01-css-semantic-refactor.md — marked favicon task as done

  • admin.css - added [aria-current="page"] rule for admin nav links (border-bottom: 2px solid currentColor; padding-bottom: 1px) fixing WCAG 1.4.1 (active nav link had no non-colour indicator)

  • admin.css - fixed undefined --admin-purple variable in pagination hover; replaced with --accent-primary (same #9557b5 value)

  • todo/01-css-semantic-refactor.md - audited all CSS/HTML refactor tasks; marked ~15 items as already-done (.admin-main, .admin-page-title, .admin-form-row, .admin-label, .admin-input/select/textarea, .admin-table, .admin-fieldset, tfe.css class replacements, search.css selector, login.php/edit.php inline styles, admin-alert replacement, form partial hints)

  • todo/04-accessibility.md - marked WCAG 1.4.1 admin nav and --admin-purple audit items as completed

  • admin/index.php - server-side pagination (25/page); Database::getThesesListCount() added; getThesesList() extended with $limit/$offset; access_type JOIN added to query (was missing); result-count meta line added; .pagination-wrap + .pagination-btn + .pagination-info styles added to admin.css

  • checkbox-list.php - replaced <div class="admin-checkbox-list"> with <fieldset class="admin-checkbox-group"><legend class="sr-only">...</legend><ul> (WCAG 1.3.1 fix)

  • admin.css - replaced .admin-checkbox-list with .admin-body fieldset.admin-checkbox-group > ul semantic selectors; added span.admin-row-label as visible label column counterpart

  • login.php - wrapped content in <main id="main-content"> landmark

  • account.php - <div class="admin-account-status"><dl>; __row divs kept; __label spans → <dt>; admin-danger-zone__description div → <p>

  • index.php - maintenance bar <div><aside role="status" aria-label="Statut du site">

  • add.php / edit.php - autocomplete="name" on author field, autocomplete="email" on contact field

  • tags.php - all inline style= attributes removed; sizing/spacing moved to CSS (.admin-input--inline, .admin-select--inline, .admin-inline-form + .admin-inline-form, .admin-tags-count)

  • Marked already-done items in todo files: stats <dl>, thanks.php <section>, scope="col" on both tables, tfe.php inline styles, role="alert" on flash messages

  • admin-submit-wrapadmin-form-footer rename: updated all 6 admin templates (add.php, edit.php, login.php, account.php, import.php, pages-edit.php) and all 8 CSS selectors in admin.css (.admin-form > div:not(...) exclusion guards, .admin-login-box overrides). Closes todo/01-css-semantic-refactor.md submit-wrap task.

  • Marked status-badge.php partial and WCAG 1.3.1 status-badge items as already-done in todo/02-php-components.md and todo/04-accessibility.md (partial + CSS were fully implemented; TODO had not been updated)

  • public/index.php — WCAG 2.4.4: home page cards now append <span class="sr-only">, YEAR</span> to each cards <p> link text so screen readers get unique link names when two theses share the same title

  • todo/04-accessibility.md — WCAG 2.4.3: marked back-link focus-order item as already done (tfe-back-link is already the first DOM element in .tfe-left, before <h1>)

  • jury-fieldset.php — WCAG 3.3.2: replaced bare <label>Lecteur·ices :</label> with <fieldset class="admin-jury-lecteurs"><legend>Lecteur·ices</legend> so the lecteur group has a proper programmatic label

  • jury-fieldset.php — WCAG 4.1.2: all "Externe" checkboxes (promoteur + each lecteur row, static + dynamically added via JS) now carry aria-label="[Role] — externe" providing group context without visible redundancy

  • jury-fieldset.php — WCAG 2.1.1: jury remove buttons verified to have descriptive aria-label="Supprimer le lecteur·ice N" on all rows (static + dynamic)

  • admin.css — added .admin-body fieldset fieldset.admin-jury-lecteurs rule: strips border/background on the nested lecteur fieldset so it renders as a visual sub-group, not a double-bordered card

  • todo/04-accessibility.md — WCAG 1.4.4 + 1.4.12 audited and marked done: all font-sizes are rem; no overflow:hidden on essential text content