Files
xamxam/app/public/assets/css/form-base.css
Pontoporeia 19bf9f101a Refactor apropos/charte/licence pages: shared layout, TOC anchors, and UI polish
Unify the three public pages (à propos, charte, licence) onto a single
grid layout (.page-content) with sticky TOC sidebar, replacing the old
separate  /  /  markup.

- Merge about.php, charte.php, licence.php templates into shared
  .page-content / .content-section structure
- Add CommonMark HeadingPermalinkExtension for stable heading anchors
- Use SlugNormalizer for TOC links so they match rendered heading IDs
- Standardize link styling across content blocks: bold black, accent on
  hover (consistent with global link style)
- Fix code block wrapping: use pre-wrap instead of pre, constrain grid
  columns with min-width:0, auto scrollbar
- Fix apropos page grid placement: force content-section into column 2
  so contacts and credits stay in the content area, not the sidebar

Also includes accumulated WIP changes:
- Header gradient: hardcoded purple-to-green (replaces CSS variables)
- Search placeholder font
- Duration field: replace minutes/sec/heures with h:m:s time inputs
- TFE file optional for formats 1,4,6 with client-side JS toggle
- Licence form: em-dash to hyphen, details/summary classes
- Pill search: block Enter key form submission when no results
- Draft autosave: remove CSRF rotation (broke concurrent FilePond uploads)
- Language pill: clear hints for excluded main languages
- Search results: gradient placeholder cards for items without covers
- TFE display: format durée values as XhYm instead of decimal
2026-06-19 19:40:05 +02:00

1343 lines
31 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ============================================================
FORM — TFE submission form (base styles)
Shared between admin add/edit pages and the student partage form.
Admin-only extensions live in form-admin.css.
Variables loaded via style.css (colors.css + typography.css).
============================================================ */
/* ── Field rows & layout ────────────────────────────────────────────────── */
.admin-form {
display: flex;
flex-direction: column;
gap: 0;
}
.admin-form > div:not(.admin-form-footer):not(.student-help-block) {
display: grid;
grid-template-columns: 260px 1fr;
align-items: start;
border-top: 1px solid var(--border-primary);
padding: var(--space-xs) 0;
gap: var(--space-s);
}
.admin-form > div:not(.admin-form-footer):last-of-type {
border-bottom: 1px solid var(--border-primary);
}
.admin-form > div:not(.admin-form-footer) > label,
.admin-form > div:not(.admin-form-footer) > span.admin-row-label {
font-size: var(--step--1);
padding-top: var(--space-2xs);
font-weight: 400;
}
/* ── Inputs, selects, textareas ──────────────────────────────────────────── */
.admin-form
input:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not(
[type="hidden"]
):not([type="submit"]),
.admin-form select,
.admin-form textarea,
.admin-inline-form input[type="text"],
.admin-inline-form input[type="number"],
.admin-inline-form select {
width: 100%;
}
.admin-form textarea {
min-height: 100px;
}
/* ── Required-field indicators ──────────────────────────────────────────── */
.admin-form
input:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not(
[type="hidden"]
):not([type="submit"]):required,
.admin-form select:required,
.admin-form textarea:required {
border-style: dashed;
}
.admin-form
div:has(
input:required:not([type="checkbox"]):not([type="radio"]):not(
[type="file"]
):not([type="hidden"])
)
> label,
.admin-form div:has(select:required) > label,
.admin-form div:has(textarea:required) > label {
font-weight: 400;
}
/* Asterisk on required field labels */
.asterisk {
color: var(--error, #c00);
}
/* "* Champs obligatoires" note */
.required-note {
font-size: var(--step--2);
color: var(--text-secondary);
margin-bottom: var(--space-xs);
}
.required-note .asterisk {
color: var(--error, #c00);
}
/* ── File inputs ────────────────────────────────────────────────────────── */
.admin-file-input {
display: flex;
flex-direction: column;
gap: var(--space-3xs);
}
.admin-file-input input[type="file"] {
font-size: var(--step--1);
background: transparent;
border: 1px dashed var(--border-primary);
padding: var(--space-3xs) var(--space-2xs);
border-radius: var(--radius);
cursor: pointer;
font-family: inherit;
}
.admin-file-input input[type="file"]:hover {
border-color: var(--accent-primary);
}
.admin-file-hint {
display: block;
margin-top: var(--space-2xs);
}
/* small base styles live in components/forms.css */
/* ── Checkbox groups (languages, formats) ───────────────────────────────── */
.admin-body fieldset.admin-checkbox-group,
.student-body fieldset.admin-checkbox-group {
border: none;
padding: 0;
margin: 0;
background: transparent;
border-radius: 0;
}
.admin-body fieldset.admin-checkbox-group > ul,
.student-body fieldset.admin-checkbox-group > ul {
list-style: none;
margin: 0;
padding-top: var(--space-3xs);
display: flex;
flex-direction: column;
gap: var(--space-3xs);
}
.admin-body fieldset.admin-checkbox-group > ul > li,
.student-body fieldset.admin-checkbox-group > ul > li {
display: contents;
}
.admin-checkbox-label {
display: flex;
align-items: center;
gap: var(--space-2xs);
font-size: var(--step--1);
cursor: pointer;
}
/* ── Fieldsets & legends ────────────────────────────────────────────────── */
/* Base fieldset/legend styles live in components/forms.css */
.admin-body fieldset,
.student-body fieldset {
margin: var(--space-2xs) 0 var(--space-s);
}
/* ── Form group (checkbox inline inside .admin-form) ────────────────────── */
.admin-form-group {
display: flex;
flex-direction: column;
gap: var(--space-3xs);
}
.admin-form-group--inline {
flex-direction: row;
align-items: end;
gap: var(--space-xs);
flex-wrap: wrap;
}
.admin-form-group--inline > div {
display: flex;
flex-direction: column;
gap: var(--space-3xs);
}
/* ── Jury fieldset ──────────────────────────────────────────────────────── */
/* ── Website-URL inline fieldset (shown/hidden via HTMX) ────────────────── */
/* The fieldset is shown/hidden via outerHTML swap — no CSS needed */
/* ── Jury fieldset (continued) ──────────────────────────────────────────── */
.admin-body fieldset fieldset.admin-jury-lecteurs,
.student-body fieldset fieldset.admin-jury-lecteurs {
border: none;
padding: 0;
margin: var(--space-xs) 0 0;
background: transparent;
}
.admin-body fieldset fieldset.admin-jury-lecteurs > legend,
.student-body fieldset fieldset.admin-jury-lecteurs > legend {
font-size: var(--step--2);
font-weight: 400;
letter-spacing: 0.03em;
text-transform: uppercase;
color: var(--text-tertiary);
padding: 0;
margin-bottom: var(--space-2xs);
}
.admin-jury-row {
display: flex;
gap: var(--space-xs);
flex-wrap: wrap;
}
.admin-jury-list {
display: flex;
flex-direction: column;
gap: var(--space-2xs);
}
.admin-jury-entry {
display: flex;
align-items: center;
gap: var(--space-xs);
}
.admin-jury-ext {
white-space: nowrap;
}
.admin-btn-remove {
/* deprecated alias for .btn--sm .btn--ghost; kept for backward-compat */
}
.admin-btn-remove:hover {
border-color: var(--error);
color: var(--error);
}
/* ── Add / edit page header ─────────────────────────────────────────────── */
.thesis-add-header {
display: grid;
grid-template-columns: 1fr auto;
align-items: baseline;
gap: var(--space-2xs) var(--space-m);
margin-bottom: var(--space-xs);
padding-bottom: var(--space-xs);
}
.thesis-add-header h1 {
margin: 0;
}
.thesis-add-subtitle {
grid-column: 1 / -1;
margin: 0;
font-family: var(--font-body);
font-size: var(--step--1);
color: var(--text-secondary);
}
.thesis-add-subtitle a {
font-family: var(--font-display);
color: var(--accent-primary);
}
.mode-toggle {
font-size: var(--step--1);
color: var(--text-secondary);
text-decoration: none;
white-space: nowrap;
border: 1px solid var(--border-primary);
border-radius: var(--radius);
padding: var(--space-3xs) var(--space-xs);
transition: color 0.15s, border-color 0.15s;
}
.mode-toggle:hover {
color: var(--accent-primary);
border-color: var(--accent-primary);
}
.mode-toggle--back {
color: var(--accent-blue);
border-color: var(--blue-muted-border, var(--border-primary));
}
/* ── Submit / form footer ───────────────────────────────────────────────── */
.form-footer {
margin-top: var(--space-l);
margin-bottom: var(--space-l);
display: flex;
gap: var(--space-s);
align-items: center;
}
.form-footer button {
/* deprecated alias for .btn--primary; kept for backward-compat */
}
/* ── Flash messages ─────────────────────────────────────────────────────── */
.flash-error,
.flash-warning,
.flash-success {
padding: var(--space-xs) var(--space-s);
border-radius: var(--radius);
font-size: var(--step--1);
margin-bottom: var(--space-s);
border-left: 3px solid;
}
.flash-error {
background: var(--accent-muted);
border-color: var(--error);
color: var(--text-primary);
}
.flash-success {
background: var(--success-muted-bg);
border-color: var(--success);
color: var(--text-primary);
}
.flash-warning {
background: var(--warning-muted-bg, rgba(251, 202, 81, 0.12));
border-color: var(--warning-muted-border, rgba(251, 202, 81, 0.35));
color: var(--text-primary);
white-space: pre-line;
}
/* ── Share link badge ───────────────────────────────────────────────────── */
.share-badge {
display: inline-block;
padding: var(--space-3xs) var(--space-xs);
background: var(--blue-muted-bg);
border: 1px solid var(--blue-muted-border, var(--border-primary));
border-radius: var(--radius);
font-size: var(--step--2);
margin-bottom: var(--space-xs);
}
/* ── Licence / degrees-of-openness block ────────────────────────────────── */
.licence-explanation {
background: var(--bg-secondary);
border-left: 4px solid var(--border-secondary, var(--border-primary));
/* padding: var(--space-m); */
margin: 0;
}
.licence-info h3 {
margin-top: var(--space-m);
}
.licence-degree {
margin: var(--space-s) 0;
padding: var(--space-s);
background: var(--bg-primary);
border: 1px solid var(--border-primary);
border-radius: var(--radius);
}
.duration-time-inputs {
display: flex;
align-items: flex-end;
gap: var(--space-xs);
}
.duration-time-fields {
display: inline-flex;
align-items: center;
gap: var(--space-3xs);
}
.duration-time-fields span {
font-size: var(--step--1);
color: var(--text-secondary);
}
.licence-details {
display: inline-flex;
}
.licence-summary {
display: inline-flex;
align-items: center;
gap: var(--space-3xs);
cursor: pointer;
}
.licence-degree h4 {
margin: 0 0 var(--space-2xs);
font-weight: 600;
}
.licence-note {
color: var(--text-secondary);
font-size: var(--step--2);
margin-top: var(--space-2xs);
}
.licence-generalites {
margin-top: var(--space-m);
}
.licence-generalites h3 {
margin-bottom: var(--space-xs);
}
/* ── Student-mode layout ────────────────────────────────────────────────── */
/* Standalone page (no admin header/footer): restore scrollability that
base.css removes via overflow:hidden on html,body. */
.student-body {
display: flex;
flex-direction: column;
min-height: 100%;
overflow-y: auto;
}
.student-body main {
padding: var(--space-l) var(--space-l) var(--space-2xl);
width: 100%;
position: relative;
}
/* Fixed top gradient, mirror of body's bottom gradient */
.student-body main::before {
content: "";
position: fixed;
top: 0;
left: 0;
right: 0;
height: 8vh;
background: linear-gradient(
180deg,
rgba(149, 87, 181, 1) 0%,
rgba(0, 0, 0, 0) 100%
);
pointer-events: none;
z-index: 1;
}
/* ── Share-link error page ──────────────────────────────────────────────── */
.share-error {
max-width: 500px;
margin: 5rem auto;
padding: var(--space-xl);
text-align: center;
background: var(--bg-primary);
border: 2px solid var(--error);
border-radius: var(--radius);
}
.share-error h1 {
color: var(--error);
margin-bottom: var(--space-s);
}
.share-error p {
font-size: var(--step-0);
color: var(--text-secondary);
margin-bottom: var(--space-m);
}
.share-error a {
display: inline-block;
padding: var(--space-2xs) var(--space-m);
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 {
color: var(--accent-primary);
opacity: 1;
}
/* ── Password gate page ─────────────────────────────────────────────────── */
.password-gate {
max-width: 400px;
margin: 4rem auto;
padding: var(--space-l);
text-align: center;
}
.password-gate h1 {
margin-bottom: var(--space-m);
}
.password-gate input[type="password"] {
width: 100%;
margin: var(--space-2xs) 0 var(--space-s);
}
.password-gate button {
/* deprecated alias for .btn--primary; kept for backward-compat */
}
.password-error {
color: var(--error);
margin-bottom: var(--space-s);
font-size: var(--step--1);
}
/* ── Live file-input preview (.file-preview-list) ──────────────────────── */
.file-preview-list {
display: flex;
flex-wrap: wrap;
gap: var(--space-xs);
margin-top: var(--space-2xs);
}
.file-preview-list:empty {
display: none;
}
.fp-item {
display: flex;
align-items: center;
gap: var(--space-2xs);
padding: var(--space-3xs) var(--space-xs);
background: var(--bg-secondary);
border: 1px solid var(--border-primary);
border-radius: var(--radius);
min-width: 0;
max-width: 260px;
}
.fp-thumb {
width: 48px;
height: 48px;
object-fit: cover;
border-radius: var(--radius);
flex-shrink: 0;
}
.fp-icon {
font-size: 1.6rem;
line-height: 1;
flex-shrink: 0;
width: 48px;
text-align: center;
}
.fp-meta {
display: flex;
flex-direction: column;
gap: 2px;
min-width: 0;
}
.fp-name {
font-size: var(--step--2);
font-weight: 500;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 180px;
display: block;
}
.fp-size {
font-size: var(--step--2);
color: var(--text-tertiary);
}
/* ── Inline file validation messages (HTMX) ──────────────────────────────── */
.file-validation-msg {
margin-top: var(--space-3xs);
font-size: var(--step--2);
line-height: 1.5;
}
.fv-ok {
color: var(--success, #2d6a4f);
}
.fv-error {
color: var(--danger, #c1121f);
}
/* ── TFE file upload (FilePond) ────────────────────────────────────────── */
.admin-files-fieldgroup {
display: flex;
flex-direction: column;
gap: var(--space-3xs);
}
/* FilePond overrides to match xamxam theme */
.filepond--root {
font-family: var(--font-body, inherit);
margin-bottom: 0;
}
/* Drop area panel */
.filepond--panel-root {
background: var(--bg-secondary);
border: 2px dashed var(--border-primary);
border-radius: var(--radius);
}
/* Drop label text */
.filepond--drop-label {
color: var(--text-secondary);
font-size: var(--step--1);
}
/* "Browse" link */
.filepond--label-action {
color: var(--accent-primary);
text-decoration-color: var(--accent-primary);
}
/* File item — keep white for contrast against drop area */
.filepond--item-panel {
background-color: var(--bg-primary);
border: 1px solid var(--border-primary);
border-radius: var(--radius);
}
/* File item text — dark on white */
.filepond--file {
color: var(--text-primary);
background-color: var(--bg-tertiary);
border: 1px solid var(--accent-green);
}
.filepond--file .filepond--file-status {
color: var(--text-secondary);
}
.filepond--file-info-main {
color: var(--text-primary);
}
.filepond--file-info-sub {
color: var(--text-tertiary);
}
/* Action buttons — dark background, white icons */
.filepond--file-action-button {
cursor: pointer;
color: #ffffff;
background-color: rgba(0, 0, 0, 0.45);
}
.filepond--file-action-button:hover,
.filepond--file-action-button:focus {
color: #ffffff;
background-color: rgba(0, 0, 0, 0.65);
box-shadow: 0 0 0 0.125em rgba(0, 0, 0, 0.2);
}
/* Progress indicator */
.filepond--progress-indicator {
color: #ffffff;
}
/* Drag-over highlight */
.filepond--hopper[data-hopper-state="drag-over"] .filepond--panel-root {
border-color: var(--accent-primary);
background: var(--accent-muted);
}
/* Error state */
[data-filepond-item-state*="error"] .filepond--item-panel,
[data-filepond-item-state*="invalid"] .filepond--item-panel {
background-color: var(--error-muted-bg);
border-color: var(--error);
}
/* Processing complete */
[data-filepond-item-state="processing-complete"] .filepond--item-panel {
background-color: var(--bg-primary);
border-color: var(--accent-green);
}
[data-filepond-item-state="processing-complete"] .filepond--file {
border-color: var(--accent-green);
}
/* FilePond image preview: use site light colors instead of dark defaults */
.filepond--image-preview {
background: var(--bg-secondary);
}
.filepond--image-preview-overlay-idle {
color: var(--text-secondary);
}
.filepond--image-preview-overlay-success {
color: var(--accent-green);
}
.filepond--image-preview-overlay-failure {
color: var(--error);
}
/* ── Partage recap page ─────────────────────────────────────────────────── */
.partage-recap {
display: flex;
flex-direction: column;
align-items: center;
gap: var(--space-l);
padding-bottom: var(--space-3xl);
margin-bottom: var(--space-2xl);
}
.partage-recap .thanks-success {
text-align: center;
}
.recap-validate-notice {
text-align: center;
font-size: var(--step--1);
color: var(--text-secondary);
background: color-mix(in srgb, var(--accent-primary) 8%, transparent);
border: 1px solid color-mix(in srgb, var(--accent-primary) 20%, transparent);
border-radius: 8px;
padding: var(--space-s) var(--space-m);
max-width: 560px;
}
.recap-validate-notice p {
margin: 0;
}
.recap-validate-notice a {
color: var(--accent-primary);
font-weight: 600;
}
.recap-section {
border-top: 1px solid var(--border-primary);
padding-top: var(--space-m);
width: 100%;
max-width: 620px;
/* margin-bottom: var(--space-l); */
padding-bottom: var(--space-xl);
}
.recap-section h2 {
font-weight: 600;
margin: 0 0 var(--space-s);
letter-spacing: 0.04em;
text-transform: uppercase;
color: var(--text-secondary);
}
.recap-dl {
display: grid;
grid-template-columns: 180px 1fr;
gap: var(--space-2xs) var(--space-s);
margin: 0;
}
.recap-dl dt {
font-size: var(--step--1);
font-weight: 600;
color: var(--text-secondary);
padding-top: 2px;
}
.recap-dl dd {
font-size: var(--step--1);
margin: 0;
color: var(--text-primary);
}
/* ── Thanks page ────────────────────────────────────────────────────────── */
.thanks-student-page {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 60vh;
text-align: center;
}
.thanks-success,
.thanks-error {
display: flex;
flex-direction: column;
align-items: center;
gap: var(--space-m);
max-width: 520px;
}
.thanks-success h1,
.thanks-error h1 {
margin: 0;
letter-spacing: 0.06em;
}
.thanks-message {
font-size: var(--step-0);
color: var(--text-primary);
margin: 0;
line-height: 1.6;
}
.thanks-error p {
font-size: var(--step-0);
color: var(--text-secondary);
margin: 0;
}
.btn-new-form {
/* deprecated alias for .btn--primary .btn--lg; kept for backward-compat */
}
/* ── Form help blocks ────────────────────────────────────────────────────── */
.student-help-block {
background: color-mix(in srgb, var(--accent-primary) 8%, transparent);
border-left: 3px solid var(--accent-primary);
border-radius: 0 6px 6px 0;
padding: var(--space-m);
margin: var(--space-s) 0;
font-size: var(--step--1);
color: var(--text-primary);
line-height: 1.6;
}
.student-help-block > *:first-child {
margin-top: 0;
}
.student-help-block > *:last-child {
margin-bottom: 0;
}
.student-help-block p {
margin: 0 0 var(--space-xs);
}
.student-help-block ul,
.student-help-block ol {
margin: 0 0 var(--space-xs);
padding-left: var(--space-m);
}
.student-help-block li {
margin-bottom: var(--space-3xs);
}
.student-help-block a {
color: var(--accent-primary);
}
/* ── E-mail retry page ───────────────────────────────────────────────────── */
.partage-retry-email {
display: flex;
flex-direction: column;
gap: var(--space-l);
max-width: 600px;
margin: 0 auto;
}
.retry-email-section {
border-top: 1px solid var(--border-primary);
padding-top: var(--space-m);
display: flex;
flex-direction: column;
gap: var(--space-m);
}
.retry-email-section h2 {
font-weight: 600;
margin: 0;
letter-spacing: 0.04em;
text-transform: uppercase;
color: var(--text-secondary);
}
.retry-smtp-detail {
display: block;
margin-top: var(--space-2xs);
font-size: var(--step--2);
color: var(--text-secondary);
word-break: break-all;
}
.retry-email-form {
display: flex;
flex-direction: column;
gap: var(--space-m);
}
.retry-email-form .field-wrap {
display: flex;
flex-direction: column;
gap: var(--space-2xs);
}
.retry-email-form label {
font-size: var(--step--1);
font-weight: 400;
}
.retry-email-form input[type="email"] {
font-size: var(--step-0);
width: 100%;
}
.retry-email-form input.input-error {
border-color: var(--error, #c00);
}
.retry-email-actions {
display: flex;
gap: var(--space-s);
flex-wrap: wrap;
}
.btn-primary {
/* deprecated alias for .btn--primary; kept for backward-compat */
}
.btn-secondary {
/* deprecated alias for .btn--secondary; kept for backward-compat */
}
/* ── Tag search (mots-clés interactive component) ──────────────────────── */
/* The outer container may be placed inside a fieldset or as a direct child
of .admin-form. Use a generic vertical layout that works in both contexts. */
[id$="-search-container"] {
display: flex;
flex-direction: column;
gap: var(--space-2xs);
}
[id$="-search-container"] > .admin-row-label {
font-size: var(--step--1);
padding-top: 0;
font-weight: 400;
}
.tag-search-wrapper {
display: flex;
flex-direction: column;
gap: var(--space-2xs);
position: relative;
}
/* Hint text above input */
.tag-search-hint {
display: block;
font-size: var(--step--2);
color: var(--text-secondary);
margin-bottom: var(--space-3xs);
}
/* Counter (e.g. "3/10") */
.tag-search-counter {
display: flex;
align-items: center;
gap: var(--space-2xs);
font-size: var(--step--2);
}
.tag-search-count {
font-weight: 600;
color: var(--accent-primary);
background: var(--accent-muted, rgba(149, 87, 181, 0.1));
padding: 1px var(--space-2xs);
border-radius: var(--radius);
}
.tag-search-max-msg {
color: var(--text-tertiary);
font-style: italic;
}
/* Pill row — spacing around selected tags area */
.tag-search-pills {
display: flex;
flex-wrap: wrap;
gap: var(--space-2xs);
min-height: 0;
padding: var(--space-2xs) 0;
}
.tag-search-pills:empty {
padding: 0;
display: none;
}
/* Individual pill */
.tag-pill {
display: inline-flex;
align-items: center;
gap: var(--space-3xs);
padding: 2px 2px 2px var(--space-2xs);
background: var(--bg-secondary);
border: 1px solid var(--border-primary);
border-radius: 999px;
font-size: var(--step--1);
line-height: 1.4;
white-space: nowrap;
transition: border-color 0.15s;
}
.tag-pill:hover {
border-color: var(--accent-primary);
}
.tag-pill-name {
color: var(--text-primary);
}
/* Round remove button */
.tag-pill-remove {
display: inline-flex;
align-items: center;
justify-content: center;
width: 22px;
height: 22px;
padding: 0;
border: none;
border-radius: 50%;
background: transparent;
color: var(--text-tertiary);
cursor: pointer;
flex-shrink: 0;
transition: background 0.15s, color 0.15s;
}
.tag-pill-remove:hover {
background: var(--error);
color: #fff;
}
.tag-pill-remove svg {
width: 14px;
height: 14px;
}
/* Search input */
.tag-search-input-wrap {
display: flex;
}
.tag-search-input {
width: 100%;
font-size: var(--step--1);
font-family: inherit;
}
/* Suggestions dropdown — absolute positioned to hover above content */
.tag-search-suggestions {
position: absolute;
top: 100%;
left: 0;
right: 0;
z-index: 100;
background: var(--bg-primary);
border: 1px solid var(--border-primary);
border-radius: var(--radius);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
max-height: 220px;
overflow-y: auto;
display: none;
margin-top: 2px;
}
.tag-search-suggestions:not(:empty) {
display: block;
}
.tag-search-empty {
padding: var(--space-2xs) var(--space-xs);
font-size: var(--step--2);
color: var(--text-tertiary);
pointer-events: none;
}
/* ── Jury autocomplete dropdown (positioned within .admin-jury-lecteurs) ──── */
.admin-jury-lecteurs[data-jury-autocomplete] {
position: relative;
}
.admin-jury-lecteurs .jury-suggestions {
position: absolute;
top: auto;
left: 0;
right: 0;
margin-top: 2px;
}
/* Individual suggestion item */
.tag-search-item {
display: flex;
align-items: center;
gap: var(--space-2xs);
width: 100%;
padding: var(--space-2xs) var(--space-xs);
background: transparent;
border: none;
border-bottom: 1px solid var(--border-primary);
font-family: inherit;
font-size: var(--step--1);
cursor: pointer;
text-align: left;
color: var(--text-primary);
transition: background 0.1s;
}
.tag-search-item:last-child {
border-bottom: none;
}
.tag-search-item:hover,
.tag-search-item:focus,
.tag-search-item--highlight {
background: var(--bg-secondary);
outline: none;
}
.tag-search-item--highlight {
background: var(--accent-muted, rgba(149, 87, 181, 0.1));
}
.tag-search-item-name {
flex: 1;
min-width: 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.tag-search-item-count {
font-size: var(--step--2);
color: var(--text-tertiary);
flex-shrink: 0;
}
.tag-search-item--create {
color: var(--accent-primary);
font-weight: 500;
border-bottom-style: dashed;
}
.tag-search-item--create:hover,
.tag-search-item--create.tag-search-item--highlight {
background: var(--accent-muted, rgba(149, 87, 181, 0.08));
}
/* ── File preview list (couverture, note d'intention, annexes) ───────────── */
.file-preview-list {
list-style: none;
margin: var(--space-3xs) 0 0;
padding: 0;
display: flex;
flex-direction: column;
gap: var(--space-3xs);
}
.fp-item {
display: flex;
align-items: center;
gap: var(--space-xs);
padding: var(--space-3xs) var(--space-xs);
background: var(--bg-secondary);
border: 1px solid var(--border-primary);
border-radius: var(--radius);
min-width: 0;
max-width: 100%;
}
.fp-thumb {
width: 48px;
height: 36px;
object-fit: cover;
border-radius: 3px;
flex-shrink: 0;
}
.fp-icon {
font-size: 1.3rem;
line-height: 1;
flex-shrink: 0;
width: 2rem;
text-align: center;
}
.fp-meta {
display: flex;
flex-direction: column;
gap: 2px;
flex: 1;
min-width: 0;
}
.fp-name {
font-size: var(--step--1);
font-weight: 500;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.fp-size {
font-size: var(--step--2);
color: var(--text-tertiary);
}
/* ── Sticky formats fieldset ──────────────────────────────── */
#fieldset-formats {
position: sticky;
top: var(--space-s);
z-index: 10;
/* background: var(--bg-primary); */
border-radius: var(--radius);
}
legend {
text-shadow: var(--bg-primary) 0px 0px 2px;
}
/* Stickiness is scoped to the parent container */
#format-fichiers-block {
container-type: inline-size;
}
/* ── Licence choice or-separator ─────────────────────────── */
.licence-or-separator {
display: flex;
align-items: center;
gap: var(--space-xs);
margin: var(--space-xs) 0;
color: var(--text-tertiary);
font-size: var(--step--1);
}
.licence-or-separator::before,
.licence-or-separator::after {
content: '';
flex: 1;
height: 1px;
background: var(--accent-muted);
}
/* ── Nested licence fieldset ─────────────────────────────── */
.licence-options-fieldset {
border: 1px solid var(--accent-muted);
border-radius: var(--radius);
padding: var(--space-s);
margin-top: var(--space-xs);
}
.licence-options-fieldset legend {
font-weight: 400;
font-size: var(--step--1);
color: var(--text-secondary);
padding: 0 var(--space-2xs);
}
/* ── Mobile-responsive layout ──────────────────────────────────────────── */
/* Below 600px: labels stack above inputs, single-column form layout.
Touch targets meet WCAG 2.5.5 minimum (44×44px). */
@media (max-width: 600px) {
/* ── Form rows: stack label above input ── */
.admin-form > div:not(.admin-form-footer):not(.student-help-block) {
grid-template-columns: 1fr;
gap: var(--space-3xs);
}
.admin-form > div:not(.admin-form-footer) > label,
.admin-form > div:not(.admin-form-footer) > span.admin-row-label {
padding-top: 0;
font-weight: 400;
}
/* Labels inside fieldsets (checkbox/radio groups) */
.admin-form-group > label.admin-checkbox-label {
padding: var(--space-2xs) 0;
}
/* ── Touch targets: WCAG 2.5.5 minimum 44×44px ── */
.admin-form input[type="checkbox"],
.admin-form input[type="radio"] {
min-width: 44px;
min-height: 44px;
}
.admin-form select,
.admin-form textarea,
.admin-form input:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not([type="hidden"]):not([type="submit"]) {
min-height: 44px;
}
.btn {
min-height: 44px;
padding: var(--space-2xs-xs);
}
.btn--sm {
min-height: 44px;
}
/* ── FilePond: ensure drop area is spacious ── */
.filepond--root {
min-height: 44px;
}
/* ── Thesis-add header: stack on narrow screens ── */
.thesis-add-header {
grid-template-columns: 1fr;
gap: var(--space-2xs);
}
/* ── Recapitulatif dl: single column ── */
.recap-dl {
grid-template-columns: 1fr;
}
.recap-dl dt {
padding-top: var(--space-2xs);
}
/* ── Form footer: stack buttons ── */
.form-footer {
flex-direction: column;
align-items: stretch;
}
.form-footer button,
.form-footer .btn {
width: 100%;
}
/* ── Fieldset margin tightening ── */
.admin-body fieldset,
.student-body fieldset {
margin: var(--space-2xs) 0 var(--space-xs);
}
/* ── sticky formats fieldset: unstick on mobile ── */
#fieldset-formats {
position: static;
}
}