Files
xamxam/app/public/assets/css/form-base.css
Pontoporeia d588ae004d Reintroduce TFE duration metadata: DB columns, form fields, controllers, views, and migration
Add 'unsafe-eval' to CSP script-src directives (htmx requires Function())
2026-06-15 15:56:52 +02:00

1315 lines
31 KiB
CSS
Raw 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);
}
.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;
}
}