diff --git a/TODO.md b/TODO.md index d6c963b..b57fe86 100644 --- a/TODO.md +++ b/TODO.md @@ -1,23 +1,3 @@ # TODO -- [x] Fix htmx checkbox "Activer la restriction d'accès": add missing csrf_token in #fieldset-restrictions (fixes token invalide + full parametres.php injection) - -- [x] Convert all file inputs to FilePond (CSV import, file-field.php; fix dialog init + missing CSS/JS on index page) -- [x] Fix `account.php`: replace `!==` CSRF token check with `hash_equals` (constant-time comparison) -- [x] Fix `ShareLink::setPassword()`: also encrypt and store plain-text password, matching `create()` behavior -- [x] Audit: confirm all remaining credential comparison sites use constant-time `hash_equals` or `password_verify` -- [x] Fix `.gitignore`: anchor `vendor/` to root (`/vendor/`) so `app/public/assets/js/vendor/` (htmx, OverType, FilePond) is tracked -- [x] Fix migration `025_lowercase_languages.sql`: deduplicate languages before LOWER() to avoid UNIQUE constraint violation (`Néerlandais`/`néerlandais`) -- [x] Fix home page: load ALL published theses grouped by year (desc), shuffled randomly within each year (instead of only ~20 from latest year) -- [x] Répertoire: colonnes à largeurs différenciées (Années plus étroites, Orientations/AP plus larges) -- [x] Répertoire: barres de scroll discrètes (thin + semi-transparentes) -- [x] Répertoire: fontes/graisses conformes à la maquette (Ductus pour titres colonnes, années en bold, etc.) -- [x] Répertoire: diminutifs des AP entre crochets (ex: Design et Politique du Multiple [DPM]) -- [x] Page TFE: enlever le soulignage de tous les mots/liens -- [x] Page TFE: harmoniser minuscules pour mots-clés, langues & formats -- [x] Page TFE: corriger texte inclusif ("utilisateur·ices autorisé·es") -- [x] Page TFE: empêcher les mots-clés de se couper au milieu du mot lors du wrapping -- [x] Page TFE: rendre le texte des TFE internes/interdits éditable dans les paramètres -- [x] Page TFE: afficher CC2r en plus de la licence choisie (ex: "CC2r, CC BY") -- [x] Page TFE: formater le contact au plus court (stripper https://www., afficher @identifiant pour Instagram/Mastodon) -- [x] Page TFE: supprimer le lien de téléchargement du PDF sous l'iframe +- [x] Standardise all links (including header) to be heavy (font-weight: 600) and add violet accent color on hover diff --git a/app/public/assets/css/admin.css b/app/public/assets/css/admin.css index 3782b19..6a1e467 100644 --- a/app/public/assets/css/admin.css +++ b/app/public/assets/css/admin.css @@ -109,7 +109,7 @@ .admin-back-btn:hover { background: var(--bg-secondary); - color: var(--text-primary); + color: var(--accent-primary); } .admin-back-btn svg { @@ -1543,7 +1543,12 @@ th.admin-ap-col { .admin-cancel-link { font-size: var(--step--1); color: var(--text-secondary); - text-decoration: underline; + text-decoration: none; + font-weight: 400; +} + +.admin-cancel-link:hover { + color: var(--accent-primary); } /* ── Pagination (admin list) ─────────────────────────────────────────────── */ @@ -1574,6 +1579,7 @@ th.admin-ap-col { border-radius: var(--radius); color: var(--text-primary); font-size: var(--step--1); + font-weight: 400; text-decoration: none; transition: border-color 0.15s, diff --git a/app/public/assets/css/apropos.css b/app/public/assets/css/apropos.css index abe5a82..7b62ba8 100644 --- a/app/public/assets/css/apropos.css +++ b/app/public/assets/css/apropos.css @@ -67,7 +67,7 @@ } .apropos-toc ul a:hover { - color: var(--text-primary); + color: var(--accent-primary); border-left-color: var(--accent-primary); } @@ -84,7 +84,8 @@ } .apropos-toc-erg a:hover { - opacity: 0.75; + color: var(--accent-primary); + opacity: 1; } .apropos-toc-source { @@ -99,7 +100,8 @@ } .apropos-toc-source a:hover { - opacity: 0.75; + color: var(--accent-primary); + opacity: 1; } /* ------------------------------------------------------------------ */ @@ -237,7 +239,8 @@ } .apropos-contact-card a:hover { - opacity: 0.75; + color: var(--accent-primary); + opacity: 1; } /* ------------------------------------------------------------------ */ diff --git a/app/public/assets/css/base.css b/app/public/assets/css/base.css index a1fcace..b3297c1 100644 --- a/app/public/assets/css/base.css +++ b/app/public/assets/css/base.css @@ -38,6 +38,7 @@ html, body { body { font-family: var(--font-body); + font-weight: 300; background: var(--bg-primary); color: var(--text-primary); background: linear-gradient( diff --git a/app/public/assets/css/components/details.css b/app/public/assets/css/components/details.css index dab50ad..7ee97a1 100644 --- a/app/public/assets/css/components/details.css +++ b/app/public/assets/css/components/details.css @@ -19,8 +19,9 @@ details { summary { font-family: var(--font-display); font-weight: 600; - text-decoration: 1px wavy; + text-decoration: none; color: var(--accent-secondary); + transition: color 0.15s; svg { fill: var(--accent-secondary); @@ -28,3 +29,7 @@ summary { height: 1.4em; } } + +summary:hover { + color: var(--accent-primary); +} diff --git a/app/public/assets/css/components/header.css b/app/public/assets/css/components/header.css index 375ced3..ad27e0d 100644 --- a/app/public/assets/css/components/header.css +++ b/app/public/assets/css/components/header.css @@ -51,13 +51,14 @@ header nav ul a { } header nav ul a:hover { - opacity: 1; + color: var(--accent-primary); } header nav ul a[aria-current="page"] { opacity: 1; border-bottom: 1px solid var(--header-nav-active-border); padding-bottom: 1px; + color: var(--accent-foreground); } /* ── Logo ───────────────────────────────────────────────────────────── */ diff --git a/app/public/assets/css/components/links.css b/app/public/assets/css/components/links.css index 7c68a7a..1971237 100644 --- a/app/public/assets/css/components/links.css +++ b/app/public/assets/css/components/links.css @@ -6,10 +6,10 @@ a { color: inherit; text-decoration: none; + font-weight: 400; } a:hover { - text-decoration-line: underline; - text-decoration-style: wavy; - text-decoration-thickness: 1px; + color: var(--accent-primary); + text-decoration: none; } diff --git a/app/public/assets/css/components/pagination.css b/app/public/assets/css/components/pagination.css index 9d02400..ef5ca63 100644 --- a/app/public/assets/css/components/pagination.css +++ b/app/public/assets/css/components/pagination.css @@ -30,6 +30,7 @@ border-radius: var(--radius); color: var(--text-primary); font-size: var(--step--1); + font-weight: 400; text-decoration: none; transition: border-color 0.15s, color 0.15s; } diff --git a/app/public/assets/css/components/toast.css b/app/public/assets/css/components/toast.css index dcf06ce..4503aac 100644 --- a/app/public/assets/css/components/toast.css +++ b/app/public/assets/css/components/toast.css @@ -51,7 +51,13 @@ .toast--warning a { color: inherit; - text-decoration: underline; + font-weight: 400; + text-decoration: none; + transition: color 0.15s; +} + +.toast--warning a:hover { + color: var(--accent-primary); } @keyframes toast-enter { diff --git a/app/public/assets/css/file-access.css b/app/public/assets/css/file-access.css index b6f7bd1..72dcfb3 100644 --- a/app/public/assets/css/file-access.css +++ b/app/public/assets/css/file-access.css @@ -50,7 +50,7 @@ } .access-req-tab:hover { - color: var(--text-primary); + color: var(--accent-primary); } .access-req-tab.active { @@ -163,7 +163,8 @@ } .access-req-card__info a:hover { - text-decoration: underline; + color: var(--accent-primary); + text-decoration: none; } .access-req-card__justification, @@ -224,8 +225,7 @@ } .access-req-pagination__link:hover { - color: var(--accent-secondary); - text-decoration: underline; + color: var(--accent-primary); } .access-req-pagination__info { diff --git a/app/public/assets/css/form.css b/app/public/assets/css/form.css index 1ae9abb..807a679 100644 --- a/app/public/assets/css/form.css +++ b/app/public/assets/css/form.css @@ -419,12 +419,14 @@ background: var(--text-primary); color: var(--bg-primary); text-decoration: none; + font-weight: 400; border-radius: var(--radius); transition: opacity 0.15s; } .share-error a:hover { - opacity: 0.8; + color: var(--accent-primary); + opacity: 1; } /* ── Password gate page ─────────────────────────────────────────────────── */ @@ -1416,8 +1418,7 @@ legend { } .recap-files-name a:hover { - text-decoration: underline; - color: var(--accent); + color: var(--accent-primary); } .recap-files-peertube-id { @@ -1527,7 +1528,7 @@ legend { text-decoration: none; } .file-browser-breadcrumb a:hover { - text-decoration: underline; + color: var(--accent-primary); } .file-browser-sep { color: var(--text-tertiary); diff --git a/app/public/assets/css/public.css b/app/public/assets/css/public.css index a2789e5..a6d4ebe 100644 --- a/app/public/assets/css/public.css +++ b/app/public/assets/css/public.css @@ -191,6 +191,7 @@ .clear-filter:hover { background: var(--accent-secondary); + color: var(--accent-foreground); } /* Pagination */ @@ -222,6 +223,7 @@ color: var(--text-primary); font-size: var(--step--1); text-decoration: none; + font-weight: 400; transition: all 0.15s; } diff --git a/app/public/assets/css/repertoire.css b/app/public/assets/css/repertoire.css index 12d2434..749934c 100644 --- a/app/public/assets/css/repertoire.css +++ b/app/public/assets/css/repertoire.css @@ -282,8 +282,14 @@ .search-reset-link { font-size: var(--step--1); color: var(--text-secondary); - text-decoration: underline; + text-decoration: none; + font-weight: 400; cursor: pointer; + transition: color 0.15s; +} + +.search-reset-link:hover { + color: var(--accent-primary); } /* Search results pagination */ @@ -307,6 +313,7 @@ color: var(--text-primary); font-size: var(--step--1); text-decoration: none; + font-weight: 400; transition: all 0.15s; } diff --git a/app/public/assets/css/system.css b/app/public/assets/css/system.css index 6dff4ff..794ff55 100644 --- a/app/public/assets/css/system.css +++ b/app/public/assets/css/system.css @@ -21,7 +21,7 @@ transition: color .15s, border-color .15s; } .sys-tab:hover { - color: var(--text-primary); + color: var(--accent-primary); } .sys-tab.active { color: var(--accent-primary); @@ -327,7 +327,7 @@ color: var(--accent-primary); text-decoration: none; } -.sys-refresh-note a:hover { text-decoration: underline; } +.sys-refresh-note a:hover { color: var(--accent-primary); } /* ── Cache freshness badges ────────────────────────────────────────────── */ .sys-cache-badge { diff --git a/app/public/assets/css/tfe.css b/app/public/assets/css/tfe.css index cd3e9af..f374cbe 100644 --- a/app/public/assets/css/tfe.css +++ b/app/public/assets/css/tfe.css @@ -57,7 +57,7 @@ } .tfe-meta-label { - font-weight: 400; + font-weight: 300; } .tfe-meta-item a { @@ -67,7 +67,7 @@ } .tfe-meta-item a:hover { - text-decoration: none; + color: var(--accent-primary); } /* Note field: align label to top, value in italics */ @@ -190,7 +190,7 @@ aside figcaption { } .tfe-pdf-fallback a:hover { - text-decoration: none; + color: var(--accent-primary); } /* "Not available" and "no files" notices */ diff --git a/app/public/assets/css/utilities.css b/app/public/assets/css/utilities.css index 96e7ee5..e84a360 100644 --- a/app/public/assets/css/utilities.css +++ b/app/public/assets/css/utilities.css @@ -24,7 +24,7 @@ z-index: 9999; padding: var(--space-2xs) var(--space-s); background: var(--accent-primary); - color: var(--text-primary); + color: var(--accent-foreground); font-size: var(--step--1); font-weight: 600; text-decoration: none; @@ -35,6 +35,11 @@ top: 0; } +.skip-link:hover { + color: var(--accent-primary); + background: var(--accent-foreground); +} + /* Respect user motion preferences */ @media (prefers-reduced-motion: reduce) { *,