Files
xamxam/public/assets/main.css
Pontoporeia a84d6d560a a11y: nav aria-label, search role=search + label, card hover motion guard
- templates/nav.php: add aria-label="Navigation principale" to <nav>; emit
  aria-current="page" on the active link alongside the existing CSS class
  so screen readers announce the current page without relying on colour/style alone

- templates/search-bar.php: add role="search" + aria-label="Recherche" to
  the <form>; add a visually-hidden <label for="site-search-input"> linked to
  the input via id="site-search-input", satisfying WCAG 3.3.2 (labels/instructions)
  and 4.1.2 (name/role/value) — placeholder text alone is not a label

- public/assets/main.css: add @media (prefers-reduced-motion: reduce) block that
  sets transition:none and transform:none on .card__media img/video hover, so the
  scale(1.02) zoom is fully suppressed for users who opt out of motion (WCAG 2.3.3 /
  prefers-reduced-motion); the global transition-duration guard in common.css already
  covers all other transitions but does not zero the transform value itself

Fixes TODO sections: G (nav/search-bar landmark names), I (site-search form ARIA),
3.3.2 (search input label), prefers-reduced-motion (card hover transform gate)
2026-03-28 18:13:53 +01:00

230 lines
4.1 KiB
CSS

/* ============================================================
HOME PAGE (index.php)
============================================================ */
.home-body {
display: flex;
flex-direction: column;
height: 100vh;
overflow: hidden;
background: var(--white);
}
/* Cards grid — scrollable main area */
.home-main {
flex: 1;
overflow-y: auto;
overflow-x: hidden;
padding: 0;
}
.cards-container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 0;
}
@media (min-width: 1400px) {
.cards-container {
grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
}
}
@media (max-width: 768px) {
.cards-container {
grid-template-columns: repeat(2, 1fr);
}
}
/* Each card = media thumbnail + text below */
.card-link {
text-decoration: none;
color: inherit;
display: block;
}
.card {
display: flex;
flex-direction: column;
cursor: pointer;
border: none;
background: var(--white);
overflow: hidden;
}
.card__media {
width: 100%;
aspect-ratio: 4/3;
overflow: hidden;
background: #e8e8e8;
position: relative;
}
.card__media img,
.card__media video {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
transition: transform 0.3s ease;
}
.card:hover .card__media img,
.card:hover .card__media video {
transform: scale(1.02);
}
.card__media--placeholder {
width: 100%;
height: 100%;
background: linear-gradient(135deg, #e8e8e8, #d0d0d0);
display: flex;
align-items: center;
justify-content: center;
color: #aaa;
font-size: 2rem;
}
.card__media--gradient {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 1rem;
text-align: center;
box-sizing: border-box;
}
.card__gradient-author {
color: #fff;
font-size: 0.75rem;
opacity: .85;
margin-bottom: .25rem;
display: block;
}
.card__gradient-title {
color: #fff;
font-size: 0.85rem;
font-weight: 600;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
/* Latest-year label */
.home-latest-label {
font-style: italic;
}
.card__info {
padding: 0.55rem 0.5rem 0.65rem;
font-size: 0.88rem;
line-height: 1.35;
color: var(--black);
}
.card__info .authors {
margin: 0;
font-weight: 400;
}
.card__info .title {
margin: 0;
font-weight: 400;
color: var(--text-muted);
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
/* Filter info */
.filter-info {
background: var(--purple-light);
color: var(--purple-dark);
padding: 0.4rem 1.5rem;
font-size: 0.85rem;
display: flex;
align-items: center;
gap: 1rem;
flex-shrink: 0;
}
.clear-filter {
color: var(--purple-dark);
text-decoration: none;
padding: 0.15rem 0.6rem;
background: rgba(149, 87, 181, 0.12);
border-radius: 3px;
font-size: 0.82rem;
}
.clear-filter:hover {
background: rgba(149, 87, 181, 0.22);
}
/* Pagination */
.pagination-wrap {
display: flex;
justify-content: center;
align-items: center;
gap: 0.5rem;
padding: 1rem;
border-top: 1px solid var(--border-color);
background: var(--white);
flex-shrink: 0;
}
.pagination-btn {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 2rem;
height: 2rem;
padding: 0 0.5rem;
border: 1px solid var(--border-color);
border-radius: 3px;
color: var(--black);
font-size: 0.9rem;
text-decoration: none;
transition: all 0.15s;
}
.pagination-btn:hover:not(.disabled) {
border-color: var(--purple);
color: var(--purple);
}
.pagination-btn.disabled {
opacity: 0.3;
cursor: not-allowed;
pointer-events: none;
}
.pagination-info {
font-size: 0.9rem;
color: var(--text-muted);
padding: 0 0.5rem;
}
.page-current {
font-weight: 600;
color: var(--black);
}
/* Suppress card hover scale for users who prefer reduced motion */
@media (prefers-reduced-motion: reduce) {
.card__media img,
.card__media video {
transition: none;
}
.card:hover .card__media img,
.card:hover .card__media video {
transform: none;
}
}