diff --git a/TODO.md b/TODO.md index d308f94..dd234fe 100644 --- a/TODO.md +++ b/TODO.md @@ -109,3 +109,21 @@ - [x] All `$required = true` callers in `form.php`, `fieldset-tfe-info.php`, `fieldset-academic.php`, `fieldset-licence-explanation.php`, `fieldset-files.php` changed to `!$adminMode` - [x] Hardcoded `required` HTML attributes in `fieldset-tfe-info.php` (synopsis, objet radios), `fieldset-licence-explanation.php` (access type radios), `jury-fieldset.php` (promoteur, lecteurs interne/externe) gated on `!$adminMode` - [x] Dynamic JS `ulbInput.required` in jury fieldset also gated +# TODO + +- [x] Make all heading font sizes the same (slightly smaller than current h1) in common.css +- [x] Remove individual font-size overrides from other CSS files so they inherit +- [x] Standardise header nav structure: admin uses nav-left/nav-right like public +- [x] Unify font-size for all nav links (logo + nav links all use var(--step--1)) +- [x] Clean up redundant CSS rules (.nav-logo, .nav-left-links) +- [x] Update admin.css selectors to match new header structure +- [x] Bump nav font-size to var(--step-0) +- [x] Add small inverted top gradient to admin body +- [x] Commit +- [x] Cap home page cards grid to max 3 columns (was auto-fill, now repeat(3, 1fr) with 2→1 column breakpoints) +- [x] Remove Modifier link from admin header when on edit page +- [x] Move admin nav links to right side, keep only logo on left +- [x] Remove Mots-clés from admin header, add as button in dashboard toolbar; use grid layout (title|stats, search|buttons) +- [x] Group admin toolbar buttons: + Ajouter + Mots-clés stacked above Import/Export +- [x] Stack admin filters vertically: search+button row above dropdowns row +- [x] Standardise form inputs/selects/textareas in common.css: padding, --radius var, 2px accent border on focus diff --git a/app/public/assets/css/admin.css b/app/public/assets/css/admin.css index f14e2a0..2ab6004 100644 --- a/app/public/assets/css/admin.css +++ b/app/public/assets/css/admin.css @@ -16,16 +16,10 @@ white-space: nowrap; scrollbar-width: thin; } -.admin-body header nav > a, -.admin-body header nav ul { +.admin-body header nav .nav-left, +.admin-body header nav .nav-right-links { flex-shrink: 0; } -.admin-body header nav, -.admin-body header nav ul, -.admin-body header nav li { - list-style: none; - flex-wrap: nowrap; -} .admin-body header nav ul [data-nav-logout] a { opacity: 0.6; @@ -40,7 +34,7 @@ } /* Public-site link icon in admin nav */ -.admin-body header nav > a svg { +.admin-body header nav .nav-logo svg { vertical-align: middle; margin-right: 0.4em; } @@ -57,14 +51,17 @@ overflow-y: auto; padding: var(--space-l) var(--space-l) var(--space-2xl); width: 100%; + background: linear-gradient( + 180deg, + rgba(149, 87, 181, 0.18) 0%, + rgba(0, 0, 0, 0) 6% + ); } .admin-body main > h1, .admin-list-header > h1 { - font-size: var(--step-2); - font-weight: 600; - letter-spacing: 0.08em; text-transform: uppercase; + letter-spacing: 0.08em; margin: 0 0 var(--space-l) 0; } @@ -115,7 +112,7 @@ .toast { padding: var(--space-s) var(--space-m); - border-radius: 8px; + border-radius: var(--radius); font-size: var(--step-0); border-left: 4px solid; box-shadow: 0 6px 24px rgba(0, 0, 0, 0.25); @@ -170,7 +167,7 @@ .admin-stat { background: var(--bg-secondary); border: 1px solid var(--border-primary); - border-radius: 4px; + border-radius: var(--radius); padding: var(--space-2xs) var(--space-s); min-width: 0; display: flex; @@ -201,7 +198,7 @@ gap: var(--space-s); background: var(--bg-secondary); border: 1px solid var(--border-primary); - border-radius: 4px; + border-radius: var(--radius); padding: var(--space-2xs) var(--space-s); margin-bottom: var(--space-m); font-size: var(--step--1); @@ -245,23 +242,6 @@ align-items: center; } -.admin-filters input[type="text"], -.admin-filters select { - border: 1px solid var(--border-primary); - border-radius: 3px; - font-size: var(--step--1); - font-family: inherit; - padding: var(--space-3xs) var(--space-xs); - background: transparent; - cursor: pointer; -} - -.admin-filters input[type="text"]:focus, -.admin-filters select:focus { - outline: none; - border-color: var(--accent-primary); -} - .admin-filters-btn { /* deprecated alias for .btn--primary; kept for backward-compat */ } @@ -278,7 +258,7 @@ padding: var(--space-2xs) var(--space-s); background: var(--bg-secondary); border: 1px solid var(--border-primary); - border-radius: 4px; + border-radius: var(--radius); margin-bottom: var(--space-s); font-size: var(--step--1); } @@ -326,7 +306,7 @@ .status-badge { display: inline-block; padding: var(--space-3xs) var(--space-2xs); - border-radius: 3px; + border-radius: var(--radius); font-size: var(--step--2); font-weight: 500; letter-spacing: 0.04em; @@ -346,7 +326,7 @@ display: inline-block; font-size: var(--step--2); padding: var(--space-3xs) var(--space-3xs); - border-radius: 3px; + border-radius: var(--radius); background: var(--bg-tertiary); color: var(--text-secondary); letter-spacing: 0.03em; @@ -411,14 +391,13 @@ /* ── Thesis info sections (thanks page) ─────────────────────────────────── */ .admin-body main > section:not([aria-labelledby^="settings-"]) { border: 1px solid var(--border-primary); - border-radius: 6px; + border-radius: var(--radius); padding: var(--space-m); margin-bottom: var(--space-m); } .admin-body main > section:not([aria-labelledby^="settings-"]) h2 { margin: 0 0 var(--space-s); - font-size: var(--step-1); border-bottom: 1px solid var(--border-primary); padding-bottom: var(--space-2xs); } @@ -449,7 +428,6 @@ } .admin-body main > section[aria-labelledby^="settings-"] > h2 { - font-size: var(--step-1); font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; @@ -490,7 +468,7 @@ /* ── Account status block ───────────────────────────────────────────────── */ .admin-account-status { border: 1px solid var(--border-primary); - border-radius: 4px; + border-radius: var(--radius); padding: var(--space-s) var(--space-m); margin-bottom: var(--space-l); display: flex; @@ -514,7 +492,7 @@ font-family: ui-monospace, "SFMono-Regular", Consolas, monospace; font-size: var(--step--2); border: 1px solid var(--border-primary); - border-radius: 3px; + border-radius: var(--radius); padding: var(--space-3xs) var(--space-3xs); color: var(--text-secondary); background: var(--bg-secondary); @@ -529,7 +507,7 @@ /* ── Danger zone (account page) ─────────────────────────────────────────── */ .admin-danger-zone { border: 1px solid var(--danger-border-muted); - border-radius: 4px; + border-radius: var(--radius); padding: var(--space-m) var(--space-m); display: flex; align-items: center; @@ -553,7 +531,7 @@ .admin-login-box { background: var(--bg-secondary); border: 1px solid var(--border-primary); - border-radius: 4px; + border-radius: var(--radius); padding: var(--space-l); width: 100%; max-width: 380px; @@ -561,7 +539,6 @@ .admin-login-box h2 { margin: 0 0 var(--space-m); - font-size: var(--step-0); font-weight: 500; text-align: center; } @@ -597,7 +574,7 @@ background: var(--success-muted-bg); border: 1px solid var(--success); border-left: 3px solid var(--success); - border-radius: 4px; + border-radius: var(--radius); padding: var(--space-xs) var(--space-s); font-size: var(--step--1); margin: 0; @@ -607,7 +584,7 @@ background: var(--accent-muted); border: 1px solid var(--error); border-left: 3px solid var(--error); - border-radius: 4px; + border-radius: var(--radius); padding: var(--space-xs) var(--space-s); font-size: var(--step--1); margin-bottom: var(--space-s); @@ -712,39 +689,55 @@ max-height: 100px; object-fit: cover; border: 1px solid var(--border-primary); - border-radius: 3px; + border-radius: var(--radius); display: block; margin-top: var(--space-2xs); } /* ── List page toolbar (title + filters + stats + import, one row) ───────── */ .admin-list-toolbar { - display: flex; - align-items: center; - gap: var(--space-m); + display: grid; + grid-template-columns: 1fr auto; + gap: var(--space-m) var(--space-l); margin-bottom: var(--space-m); - flex-wrap: wrap; + align-items: center; } .admin-list-toolbar h1 { margin: 0; white-space: nowrap; - flex-shrink: 0; +} + +.admin-list-toolbar .admin-stats { + justify-self: end; } .admin-list-toolbar .admin-filters { - flex: 1; + display: flex; + flex-direction: column; + gap: var(--space-xs); margin-bottom: 0; - flex-wrap: wrap; min-width: 0; } -.admin-list-toolbar .admin-filters input[type="text"] { +.admin-list-toolbar .admin-filters__search { + display: flex; + gap: var(--space-xs); + align-items: center; +} + +.admin-list-toolbar .admin-filters__search input[type="text"] { min-width: 10rem; flex: 1 1 10rem; } -.admin-list-toolbar .admin-filters select { +.admin-list-toolbar .admin-filters__dropdowns { + display: flex; + gap: var(--space-xs); + flex-wrap: wrap; +} + +.admin-list-toolbar .admin-filters__dropdowns select { min-width: 7rem; flex: 1 1 7rem; } @@ -754,10 +747,16 @@ } .admin-list-toolbar__right { + display: flex; + flex-direction: column; + gap: var(--space-xs); +} + +.admin-btn-group { display: flex; align-items: center; - gap: var(--space-s); - flex-shrink: 0; + gap: var(--space-xs); + flex-wrap: wrap; } /* ── Dialog ───────────────────────────────────────────────────────────── */ @@ -776,7 +775,6 @@ } .admin-dialog__header h2 { - font-size: var(--step-0); font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; @@ -792,7 +790,7 @@ color: var(--text-tertiary); padding: var(--space-3xs); line-height: 1; - border-radius: 3px; + border-radius: var(--radius); transition: color 0.15s; } @@ -853,7 +851,7 @@ font-size: var(--step--2); font-family: ui-monospace, "SFMono-Regular", Consolas, monospace; border: 1px solid var(--border-primary); - border-radius: 3px; + border-radius: var(--radius); padding: var(--space-xs); background: var(--bg-secondary); } @@ -876,7 +874,7 @@ margin-bottom: var(--space-m); font-size: var(--step--1); border: 1px solid var(--border-primary); - border-radius: 4px; + border-radius: var(--radius); background: var(--bg-secondary); } @@ -980,7 +978,7 @@ font-family: ui-monospace, "SFMono-Regular", Consolas, monospace; font-size: var(--step--2); border: 1px solid var(--border-primary); - border-radius: 3px; + border-radius: var(--radius); padding: var(--space-3xs); color: var(--text-secondary); background: var(--bg-secondary); @@ -1002,19 +1000,14 @@ .param-form input[type="password"] { width: 100%; max-width: 380px; - background: transparent; border: none; border-bottom: 1px solid var(--border-primary); - font-size: var(--step--1); - font-family: inherit; - padding: var(--space-3xs) 0; border-radius: 0; - transition: border-color 0.15s; + padding: var(--space-3xs) 0; } .param-form input[type="password"]:focus { - outline: none; - border-bottom-color: var(--accent-primary); + border-bottom: 2px solid var(--accent-primary); } .param-form > button { @@ -1097,12 +1090,6 @@ .param-smtp-test-row input[type="email"] { width: 100%; padding: var(--space-xs) var(--space-s); - border: 1px solid var(--border-primary); - border-radius: 4px; - background: var(--bg-primary); - color: var(--text-primary); - font-size: var(--step--1); - box-sizing: border-box; } .param-smtp-test-row input[type="email"]:focus { outline: 2px solid var(--accent-primary); @@ -1146,28 +1133,18 @@ .param-grid input[type="email"], .param-grid select { width: 100%; - background: transparent; border: none; border-bottom: 1px solid var(--border-primary); - font-size: var(--step--1); - font-family: inherit; - padding: var(--space-3xs) 0; border-radius: 0; - transition: border-color 0.15s; + padding: var(--space-3xs) 0; } .param-grid input:focus, .param-grid select:focus { - outline: none; - border-bottom-color: var(--accent-primary); + border-bottom: 2px solid var(--accent-primary); } .param-grid select { - cursor: pointer; - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23999' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E"); - background-repeat: no-repeat; background-position: right 0 center; padding-right: 1.2rem; - -webkit-appearance: none; - appearance: none; } .param-fieldset-inline legend { padding: 0 var(--space-xs); @@ -1190,7 +1167,7 @@ /* ── Settings page sections — legacy aliases (kept for any remaining use) ─ */ .admin-settings-section { border: 1px solid var(--border-primary); - border-radius: 6px; + border-radius: var(--radius); padding: var(--space-m) var(--space-l); margin-bottom: var(--space-l); } @@ -1213,7 +1190,7 @@ gap: var(--space-s); background: var(--bg-secondary); border: 1px solid var(--border-primary); - border-radius: 4px; + border-radius: var(--radius); padding: var(--space-xs) var(--space-m); font-size: var(--step--1); } @@ -1234,7 +1211,7 @@ .admin-account-status { border: 1px solid var(--border-primary); - border-radius: 4px; + border-radius: var(--radius); padding: var(--space-s) var(--space-m); margin-bottom: var(--space-l); display: flex; @@ -1258,7 +1235,7 @@ font-family: ui-monospace, "SFMono-Regular", Consolas, monospace; font-size: var(--step--2); border: 1px solid var(--border-primary); - border-radius: 3px; + border-radius: var(--radius); padding: var(--space-3xs) var(--space-3xs); color: var(--text-secondary); background: var(--bg-secondary); @@ -1272,7 +1249,7 @@ .admin-danger-zone { border: 1px solid var(--danger-border-muted); - border-radius: 4px; + border-radius: var(--radius); padding: var(--space-m) var(--space-m); display: flex; align-items: center; @@ -1299,7 +1276,7 @@ gap: var(--space-m); background: var(--bg-secondary); border: 1px solid var(--border-primary); - border-radius: 4px; + border-radius: var(--radius); padding: var(--space-xs) var(--space-m); cursor: pointer; } @@ -1388,7 +1365,7 @@ min-height: 2.75rem; padding: 0 var(--space-2xs); border: 1px solid var(--border-secondary); - border-radius: 10px; + border-radius: var(--radius); color: var(--text-primary); font-size: var(--step--1); text-decoration: none; @@ -1434,7 +1411,7 @@ gap: var(--space-m); background: var(--bg-secondary); border: 1px solid var(--border-primary); - border-radius: 4px; + border-radius: var(--radius); padding: var(--space-xs) var(--space-m); cursor: pointer; } @@ -1531,7 +1508,7 @@ .fhb-sortable-panel, .fhb-form-preview-panel { border: 1px solid var(--border-primary); - border-radius: 6px; + border-radius: var(--radius); padding: var(--space-s); background: var(--bg-secondary); } @@ -1581,7 +1558,7 @@ background: var(--bg-primary); border: 1px solid var(--border-primary); border-left: 4px solid var(--accent-primary); - border-radius: 4px; + border-radius: var(--radius); padding: var(--space-2xs) var(--space-xs); cursor: default; transition: box-shadow 0.15s, border-color 0.15s; @@ -1670,7 +1647,7 @@ .fhb-fieldset-preview { border: 1px solid var(--border-secondary); - border-radius: 4px; + border-radius: var(--radius); padding: var(--space-xs); background: var(--bg-primary); } @@ -1700,7 +1677,7 @@ display: flex; align-items: center; gap: var(--space-2xs); - border-radius: 4px; + border-radius: var(--radius); padding: var(--space-3xs) var(--space-xs); font-size: var(--step--2); border: 1px dashed var(--border-primary); @@ -1731,6 +1708,6 @@ font-weight: 600; color: var(--accent-primary); background: var(--accent-muted); - border-radius: 2px; + border-radius: var(--radius); padding: 0 4px; } diff --git a/app/public/assets/css/apropos.css b/app/public/assets/css/apropos.css index b1beb6c..a9e3b47 100644 --- a/app/public/assets/css/apropos.css +++ b/app/public/assets/css/apropos.css @@ -158,24 +158,10 @@ margin-bottom: 0; } -.prose h1, -.prose h2, -.prose h3 { - font-family: var(--font-display); - font-weight: 400; +.prose :where(h1, h2, h3) { margin: 1.5em 0 0.5em 0; } -.prose h1 { - font-size: var(--step-3); -} -.prose h2 { - font-size: var(--step-2); -} -.prose h3 { - font-size: var(--step-1); -} - .prose a { color: var(--accent-primary); text-decoration: underline; @@ -204,7 +190,7 @@ font-size: 0.88em; background: var(--bg-tertiary); padding: 0.1em 0.3em; - border-radius: 2px; + border-radius: var(--radius); } /* ------------------------------------------------------------------ */ diff --git a/app/public/assets/css/common.css b/app/public/assets/css/common.css index 93ffced..228fb4e 100644 --- a/app/public/assets/css/common.css +++ b/app/public/assets/css/common.css @@ -48,14 +48,7 @@ header { ); .nav-logo { - font-family: var(--font-display); - letter-spacing: 0.12em; - text-transform: uppercase; - color: var(--accent-foreground); text-decoration: none; - text-shadow: - 0 0 16px var(--header-shadow-strong), - 0 0 32px var(--header-shadow-soft); } .nav-left { @@ -66,7 +59,6 @@ header { .nav-left-links, .nav-right-links { - font-family: var(--font-display); display: flex; gap: var(--space-l); align-items: center; @@ -80,7 +72,7 @@ header { display: flex; align-items: center; justify-content: space-between; - font-size: var(--step-2); + font-size: var(--step-0); a { font-family: var(--font-display); @@ -88,6 +80,9 @@ header { text-transform: uppercase; color: var(--accent-foreground); text-decoration: none; + text-shadow: + 0 0 16px var(--header-shadow-strong), + 0 0 32px var(--header-shadow-soft); } ul { @@ -100,21 +95,9 @@ header { } ul a { - font-size: var(--step--1); - letter-spacing: 0.12em; - text-transform: uppercase; - color: var(--accent-foreground); - text-decoration: none; transition: opacity 0.15s; } - a, - ul a { - text-shadow: - 0 0 16px var(--header-shadow-strong), - 0 0 32px var(--header-shadow-soft); - } - ul a:hover { opacity: 1; } @@ -260,7 +243,6 @@ header { display: block; width: 100%; padding: var(--space-s) var(--space-s); - font-size: var(--step-1); text-align: left; } @@ -300,6 +282,21 @@ main * { word-break: break-word; } +/* ============================================================ + HEADINGS — global scale, shared by admin + public pages + All headings use the same font size (slightly smaller than + the previous h1). Individual page overrides for size have + been removed so everything inherits from here. + ============================================================ */ + +:where(h1, h2, h3, h4, h5, h6) { + font-family: var(--font-display); + font-size: var(--step-2); + font-weight: 400; + margin: 0 0 var(--space-l) 0; + line-height: 1.15; +} + /* ============================================================ SEARCH BAR (shared) ============================================================ */ @@ -310,37 +307,37 @@ main * { background: linear-gradient(180deg, var(--gradient-4) 0%, #ffffffee 100%); } -.header-search-wrap form[role="search"] { +.header-search-form { + width: 100%; +} + +.header-search-input-wrap { + position: relative; display: flex; align-items: center; - gap: var(--space-2xs); - padding: var(--space-3xs) var(--space-s); - border: 1px solid var(--accent-primary); - border-radius: 10px; - background: var(--bg-primary); - width: 100%; - color: var(--accent-primary); } -.header-search-wrap form[role="search"] svg { - color: var(--text-tertiary); - flex-shrink: 0; - width: 16px; - height: 16px; +.header-search-icon { + position: absolute; + left: var(--space-s); + width: 18px; + height: 18px; stroke: var(--accent-primary); + pointer-events: none; } -.header-search-wrap form[role="search"] input { - flex: 1; - border: none; - font-size: var(--step--1); +.header-search-input-wrap input { + width: 100%; + padding: var(--space-xs) var(--space-s) var(--space-xs) var(--space-xl); + border: 1px solid var(--accent-primary); + border-radius: var(--radius); + background: var(--bg-primary); + font-size: var(--step-0); color: var(--text-primary); - background: transparent; - padding: var(--space-3xs) 0; font-family: inherit; } -.header-search-wrap form[role="search"] input::placeholder { +.header-search-input-wrap input::placeholder { color: var(--accent-primary); } @@ -380,10 +377,12 @@ main * { top: 0; } -/* Consistent keyboard-focus outline for all interactive elements */ +/* Consistent keyboard-focus ring for all interactive elements */ :focus-visible { - outline: 2px solid var(--accent-primary); - outline-offset: 2px; + outline: none; + box-shadow: 0 0 0 2px var(--accent-primary); + border-radius: var(--radius); + padding: var(--space-3xs) var(--space-xs); } /* Respect user motion preferences */ @@ -396,10 +395,61 @@ main * { } } +/* ============================================================ + FORM ELEMENTS — base input / select / textarea / button +============================================================ */ + +label { + display: block; + margin-bottom: var(--space-3xs); +} + +input:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not([type="hidden"]):not([type="submit"]):not([type="button"]):not([type="reset"]):not([type="color"]), +select, +textarea { + font-family: inherit; + font-size: var(--step--1); + padding: var(--space-2xs) var(--space-xs); + border: 1px solid var(--border-primary); + border-radius: var(--radius); + background: transparent; + color: var(--text-primary); + transition: border-color 0.15s; +} + +input:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not([type="hidden"]):not([type="submit"]):not([type="button"]):not([type="reset"]):not([type="color"]):focus, +select:focus, +textarea:focus { + outline: none; + border: 2px solid var(--accent-primary); +} + +input::placeholder, +textarea::placeholder { + color: var(--text-tertiary); + font-size: var(--step--1); +} + +textarea { + resize: vertical; + min-height: 80px; + line-height: 1.5; +} + +select { + cursor: pointer; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23999' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 0.5rem center; + padding-right: 1.5rem; + -webkit-appearance: none; + appearance: none; +} + /* ============================================================ BUTTONS — shared .btn base class Targets both and - - - + +
+ + + +
-
-
-
Total
-
-
-
-
Publiés
-
-
-
-
Attente
-
-
-
-
Ajouter un TFE - - - Exporter CSV - - - Exporter fichiers - +
+ + Ajouter un TFE + Mots-clés +
+
+ + + Exporter CSV + + + Exporter fichiers + +
diff --git a/app/templates/header.php b/app/templates/header.php index d75a897..0d50cdc 100644 --- a/app/templates/header.php +++ b/app/templates/header.php @@ -12,13 +12,14 @@ $_thesisId = $_GET['id'] ?? null;