Files
pta/assets/style.css
PTA 3cdbd43c13 Guide d'utilisation accessible depuis toute la navigation
Les écrans expliquaient chacun leur propre action, mais rien ne racontait
l'enchaînement : un nouvel utilisateur ne pouvait pas deviner qu'un lieu
doit exister avant un agent, ni qu'un planning se saisit en brouillon
avant d'être validé. La page « faq » déroule ce parcours complet, du
paramétrage des lieux au suivi annuel, et répond aux questions qui
reviennent (chevauchements, quota dépassé, planning validé à corriger).

Son bouton d'accès est ancré à droite de la barre de navigation plutôt
que rangé dans un groupe d'intention : le guide n'est pas une étape du
travail, c'est un secours permanent. Il est donc volontairement absent de
$navigation — c'est aussi ce qui l'empêche d'être repêché par le filet
« Autres » et d'apparaître deux fois. La barre défilant horizontalement
quand les onglets débordent, le bloc est en position sticky pour rester
atteignable.

La page reste soumise à la règle V7.8 : le droit vient de
acces_role_page, ouvert aux trois rôles. Sans la migration, ni bouton ni
page.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 16:16:45 +02:00

3019 lines
67 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.
:root {
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
color: #17202a;
background: #f4f6f8;
font-synthesis: none;
}
* { box-sizing: border-box; }
body {
margin: 0;
min-height: 100vh;
background: #f4f6f8;
}
button, input, select { font: inherit; }
.app-shell {
width: min(1440px, calc(100% - 32px));
margin: 0 auto;
padding: 32px 0 48px;
}
.page-header,
.section-heading,
.actions-bar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 24px;
}
.page-header { margin-bottom: 24px; }
.eyebrow {
margin: 0 0 4px;
font-size: 0.8rem;
font-weight: 800;
letter-spacing: 0.14em;
text-transform: uppercase;
color: #546e7a;
}
h1, h2, p { margin-top: 0; }
h1 { margin-bottom: 6px; font-size: clamp(1.8rem, 4vw, 2.6rem); }
h2 { margin-bottom: 18px; font-size: 1.15rem; }
.subtitle, .section-subtitle, .hint { color: #66737d; }
.subtitle, .section-subtitle { margin-bottom: 0; }
.hint { margin: 14px 0 0; font-size: 0.88rem; }
.card {
background: #fff;
border: 1px solid #e4e8eb;
border-radius: 16px;
padding: 22px;
margin-bottom: 20px;
box-shadow: 0 6px 24px rgba(23, 32, 42, 0.05);
}
.selection-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 18px;
}
.entry-grid {
display: grid;
grid-template-columns: 1.5fr 1.5fr 1fr 1fr auto;
align-items: end;
gap: 14px;
}
.field {
display: flex;
flex-direction: column;
gap: 7px;
font-weight: 700;
font-size: 0.9rem;
}
.field strong { color: #c62828; }
select, input {
width: 100%;
min-height: 44px;
padding: 10px 12px;
border: 1px solid #cfd8dc;
border-radius: 10px;
background: #fff;
color: inherit;
outline: none;
}
select:focus, input:focus {
border-color: #607d8b;
box-shadow: 0 0 0 3px rgba(96, 125, 139, 0.14);
}
select:disabled, input:disabled {
background: #f3f5f6;
color: #9aa4aa;
cursor: not-allowed;
}
.button {
border: 0;
border-radius: 10px;
min-height: 44px;
padding: 10px 18px;
font-weight: 800;
cursor: pointer;
transition: transform 0.1s ease, opacity 0.15s ease;
}
.button:not(:disabled):active { transform: translateY(1px); }
.button:disabled { opacity: 0.45; cursor: not-allowed; }
.button-primary { background: #263238; color: #fff; }
.button-secondary { background: #e8ecef; color: #263238; }
.button-success { background: #256d3b; color: #fff; }
.button-warning { background: #b06a00; color: #fff; }
.button-add { white-space: nowrap; }
.status-badge {
padding: 8px 12px;
border-radius: 999px;
font-size: 0.86rem;
font-weight: 800;
white-space: nowrap;
}
.status-neutral { background: #e9eef1; color: #52616b; }
.status-draft { background: #fff4d6; color: #7d5c00; }
.status-valid { background: #dff3e5; color: #256d3b; }
.totals {
min-width: 150px;
padding: 12px 16px;
border-radius: 12px;
background: #f4f7f8;
text-align: right;
}
.totals span { display: block; color: #65737b; font-size: 0.78rem; }
.totals strong { font-size: 1.15rem; }
.planning-board {
display: grid;
grid-template-columns: repeat(5, minmax(150px, 1fr));
gap: 12px;
overflow-x: auto;
padding-bottom: 4px;
}
.day-column {
min-width: 150px;
border: 1px solid #e1e6e9;
border-radius: 12px;
overflow: hidden;
background: #fafbfb;
}
.day-header {
display: flex;
justify-content: space-between;
gap: 8px;
padding: 11px 12px;
background: #eef2f4;
border-bottom: 1px solid #e1e6e9;
}
.day-header span { color: #68757d; font-size: 0.8rem; }
.day-entries { padding: 10px; }
.day-empty { margin: 8px 0; color: #98a1a7; font-size: 0.83rem; text-align: center; }
.planning-entry {
display: flex;
gap: 8px;
justify-content: space-between;
align-items: flex-start;
padding: 10px;
margin-bottom: 8px;
background: #fff;
border: 1px solid #dde3e6;
border-radius: 10px;
}
.planning-entry:last-child { margin-bottom: 0; }
.entry-content { display: flex; flex-direction: column; gap: 2px; }
.entry-motif { font-size: 0.77rem; font-weight: 800; color: #546e7a; }
.entry-content strong { font-size: 0.9rem; }
.entry-content small { color: #7b878e; }
.remove-entry {
width: 26px;
height: 26px;
border: 0;
border-radius: 50%;
background: #f1f3f4;
color: #7f1d1d;
font-size: 1.1rem;
cursor: pointer;
}
.empty-state {
padding: 36px 18px;
border: 1px dashed #cfd8dc;
border-radius: 12px;
text-align: center;
color: #7b878e;
}
.actions-bar {
position: sticky;
bottom: 12px;
padding: 16px 18px;
background: rgba(255, 255, 255, 0.96);
border: 1px solid #dfe5e8;
border-radius: 14px;
box-shadow: 0 10px 34px rgba(23, 32, 42, 0.13);
backdrop-filter: blur(8px);
}
.action-buttons { display: flex; gap: 10px; }
.message { flex: 1; white-space: pre-line; font-size: 0.9rem; }
.message-success { color: #256d3b; }
.message-warning { color: #8a6100; }
.message-error { color: #b3261e; }
@media (max-width: 980px) {
.selection-grid { grid-template-columns: 1fr; }
.entry-grid { grid-template-columns: repeat(2, 1fr); }
.button-add { grid-column: 1 / -1; }
}
@media (max-width: 640px) {
.app-shell { width: min(100% - 20px, 1440px); padding-top: 18px; }
.page-header, .section-heading, .actions-bar { align-items: stretch; flex-direction: column; }
.entry-grid { grid-template-columns: 1fr; }
.action-buttons { display: grid; grid-template-columns: 1fr; }
.status-badge { align-self: flex-start; }
.totals { text-align: left; }
}
/* ============================================================
V4 - Navigation, quota et vues d'ensemble
============================================================ */
.view-tabs {
display: flex;
gap: 0.65rem;
margin: 0 0 1.25rem;
padding: 0.35rem;
border: 1px solid #dbe3ee;
border-radius: 14px;
background: #f8fafc;
overflow-x: auto;
}
.view-tab {
border: 0;
border-radius: 10px;
padding: 0.8rem 1rem;
background: transparent;
color: #4b5563;
font: inherit;
font-weight: 700;
cursor: pointer;
white-space: nowrap;
}
.view-tab.is-active {
background: #ffffff;
color: #172033;
box-shadow: 0 4px 18px rgba(15, 23, 42, 0.08);
}
.app-view[hidden] {
display: none !important;
}
.quota-strip {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 1rem;
margin-bottom: 1rem;
}
.quota-card {
display: flex;
min-height: 100px;
flex-direction: column;
justify-content: center;
gap: 0.3rem;
padding: 1rem 1.15rem;
border: 1px solid #dbe3ee;
border-radius: 14px;
background: #ffffff;
}
.quota-card span,
.quota-card small {
color: #6b7280;
}
.quota-card strong {
color: #172033;
font-size: 1.35rem;
}
.quota-card-emphasis {
border-color: #b9c7ff;
background: #f4f6ff;
}
.quota-negative {
color: #b42318 !important;
}
.overview-filters {
align-items: end;
}
.filter-button {
min-height: 46px;
}
.overview-card {
min-height: 280px;
}
.overview-title-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
margin-bottom: 1.25rem;
}
.overview-title-row h3 {
margin: 0;
font-size: 1.35rem;
}
.overview-title-row p {
margin: 0.25rem 0 0;
color: #6b7280;
}
.overview-count {
display: inline-flex;
padding: 0.45rem 0.75rem;
border-radius: 999px;
background: #eef2ff;
color: #3730a3;
font-weight: 700;
}
.table-scroll {
overflow-x: auto;
border: 1px solid #e5e7eb;
border-radius: 14px;
}
.planning-table {
width: 100%;
min-width: 1280px;
border-collapse: collapse;
background: #ffffff;
}
.planning-table th,
.planning-table td {
padding: 0.75rem;
border-right: 1px solid #edf0f4;
border-bottom: 1px solid #edf0f4;
vertical-align: top;
text-align: left;
}
.planning-table thead th {
position: sticky;
top: 0;
z-index: 1;
background: #f8fafc;
color: #334155;
font-size: 0.82rem;
}
.planning-table thead th span {
display: block;
margin-top: 0.15rem;
color: #94a3b8;
font-weight: 500;
}
.agent-cell {
min-width: 155px;
background: #fcfcfd;
}
.agent-cell strong,
.agent-cell span,
.quota-cell strong,
.quota-cell span,
.quota-cell small {
display: block;
}
.agent-cell span,
.quota-cell span,
.quota-cell small {
margin-top: 0.2rem;
color: #6b7280;
font-size: 0.78rem;
}
.quota-cell {
min-width: 135px;
}
.overview-entry {
display: flex;
flex-direction: column;
gap: 0.12rem;
min-width: 112px;
margin-bottom: 0.45rem;
padding: 0.55rem 0.6rem;
border-left: 4px solid #64748b;
border-radius: 8px;
background: #f8fafc;
font-size: 0.78rem;
}
.overview-entry strong {
font-size: 0.8rem;
}
.overview-entry span,
.overview-entry small {
color: #475569;
}
.overview-entry em {
margin-top: 0.15rem;
color: #92400e;
font-size: 0.7rem;
font-style: normal;
font-weight: 700;
}
.motif-travail { border-left-color: #2563eb; }
.motif-formation { border-left-color: #7c3aed; }
.motif-conge { border-left-color: #059669; }
.motif-maladie { border-left-color: #dc2626; }
.motif-autre { border-left-color: #64748b; }
.cell-empty {
color: #cbd5e1;
}
.agent-week-grid {
display: grid;
grid-template-columns: repeat(7, minmax(150px, 1fr));
gap: 0.75rem;
overflow-x: auto;
padding-bottom: 0.25rem;
}
.agent-day-card {
min-width: 150px;
border: 1px solid #e5e7eb;
border-radius: 12px;
background: #ffffff;
overflow: hidden;
}
.agent-day-card > header {
display: flex;
justify-content: space-between;
gap: 0.5rem;
padding: 0.7rem;
background: #f8fafc;
border-bottom: 1px solid #e5e7eb;
}
.agent-day-card > header span {
color: #6b7280;
font-size: 0.8rem;
}
.agent-day-body {
padding: 0.65rem;
}
.overview-quota-strip {
margin-bottom: 1.25rem;
}
@media (max-width: 900px) {
.quota-strip {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
@media (max-width: 560px) {
.quota-strip {
grid-template-columns: 1fr;
}
.view-tabs {
width: 100%;
}
}
/* ============================================================
V4.2 - Saisie hebdomadaire des affectations du lundi au vendredi
============================================================ */
.weekly-entry-toolbar {
display: flex;
align-items: end;
gap: 24px;
margin-bottom: 18px;
}
.weekly-motif-field {
width: min(420px, 100%);
flex: 0 0 min(420px, 100%);
}
.weekly-entry-help {
margin: 0 0 4px;
color: #66737d;
font-size: 0.9rem;
line-height: 1.45;
}
.weekly-entry-scroll {
overflow-x: auto;
border: 1px solid #e1e6e9;
border-radius: 12px;
}
.weekly-entry-table {
width: 100%;
min-width: 860px;
border-collapse: collapse;
background: #fff;
}
.weekly-entry-table th,
.weekly-entry-table td {
padding: 11px 12px;
border-right: 1px solid #e7ebed;
border-bottom: 1px solid #e7ebed;
text-align: center;
vertical-align: middle;
}
.weekly-entry-table tr:last-child th,
.weekly-entry-table tr:last-child td {
border-bottom: 0;
}
.weekly-entry-table th:last-child,
.weekly-entry-table td:last-child {
border-right: 0;
}
.weekly-entry-table thead th {
background: #eef2f4;
color: #42515a;
font-size: 0.84rem;
}
.weekly-entry-table thead tr:first-child th {
padding-bottom: 7px;
font-size: 0.9rem;
}
.weekly-entry-subhead th {
padding-top: 7px !important;
font-weight: 700;
color: #6b7780 !important;
}
.weekly-day-cell {
width: 150px;
min-width: 150px;
background: #fafbfb;
text-align: left !important;
}
.weekly-day-cell strong,
.weekly-day-cell span {
display: block;
}
.weekly-day-cell span {
margin-top: 2px;
color: #7b878e;
font-size: 0.8rem;
font-weight: 500;
}
.weekly-entry-table input[type="time"] {
min-width: 116px;
min-height: 40px;
padding: 8px 9px;
}
.weekly-motif-select {
min-width: 190px;
min-height: 40px;
padding: 8px 10px;
}
.weekly-entry-placeholder {
padding: 30px 18px !important;
color: #7b878e;
}
.weekly-entry-actions {
display: flex;
justify-content: flex-end;
margin-top: 16px;
}
/* Le planning affiché couvre désormais uniquement les cinq jours ouvrés. */
.planning-board {
grid-template-columns: repeat(5, minmax(170px, 1fr));
}
@media (max-width: 760px) {
.weekly-entry-toolbar {
align-items: stretch;
flex-direction: column;
gap: 10px;
}
.weekly-motif-field {
width: 100%;
flex-basis: auto;
}
.weekly-entry-actions .button {
width: 100%;
}
}
/* ============================================================
V4.4 - Planning global agent et contrôle inter-structures
============================================================ */
.agent-week-grid {
grid-template-columns: repeat(5, minmax(170px, 1fr));
}
.entry-location {
display: block;
margin-top: 3px;
color: #334155;
font-size: 0.78rem;
font-weight: 700;
}
.planning-entry-external {
background: #f8fafc;
border-style: dashed;
}
.entry-locked {
display: inline-flex;
align-items: center;
min-height: 24px;
padding: 3px 7px;
border-radius: 999px;
background: #e2e8f0;
color: #475569;
font-size: 0.68rem;
font-weight: 800;
white-space: nowrap;
}
.message-info { color: #1d4ed8; }
/* ============================================================
V4.5 - Association unique agent / structure
============================================================ */
.assignment-table .agent-structure-select {
min-width: 260px;
width: 100%;
}
.assignment-table td:last-child {
width: 150px;
text-align: right;
}
#assignment-message:not(:empty) {
margin-bottom: 1rem;
}
/* ============================================================
V4.8 - Administration des structures et des agents
============================================================ */
.admin-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 20px;
margin-bottom: 20px;
}
.admin-card {
min-width: 0;
}
.admin-form-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 16px;
}
.admin-field-wide {
grid-column: 1 / -1;
}
.admin-form-actions {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
margin-top: 18px;
}
.admin-form-actions .message {
flex: 1;
margin: 0;
}
.input-suffix {
display: flex;
align-items: stretch;
}
.input-suffix input {
flex: 1;
min-width: 0;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
.input-suffix span {
display: inline-flex;
align-items: center;
padding: 0 12px;
border: 1px solid #cbd5e1;
border-left: 0;
border-radius: 0 8px 8px 0;
background: #f8fafc;
font-weight: 700;
color: #475569;
}
@media (max-width: 900px) {
.admin-grid {
grid-template-columns: 1fr;
}
}
@media (max-width: 620px) {
.admin-form-grid {
grid-template-columns: 1fr;
}
.admin-field-wide {
grid-column: auto;
}
.admin-form-actions {
align-items: stretch;
flex-direction: column;
}
.admin-form-actions .button {
width: 100%;
}
}
/* ============================================================
V4.9 - Lieux d’affectation et plages horaires dynamiques
============================================================ */
.weekly-ranges-cell {
min-width: 720px;
text-align: left !important;
}
.weekly-time-ranges {
display: flex;
flex-wrap: wrap;
align-items: flex-end;
gap: 8px;
}
.weekly-time-range {
display: grid;
flex: 0 0 auto;
grid-template-columns: minmax(190px, 240px) 120px auto 120px 38px;
align-items: end;
gap: 8px;
padding: 8px;
border: 1px solid #e5e7eb;
border-radius: 10px;
background: #f8fafc;
}
.weekly-time-range label {
display: grid;
gap: 4px;
}
.weekly-range-motif {
min-width: 190px;
min-height: 40px;
padding: 8px 10px;
}
.weekly-time-range label span {
color: #64748b;
font-size: 0.72rem;
font-weight: 700;
}
.weekly-time-separator {
padding-bottom: 10px;
color: #64748b;
font-weight: 800;
}
.add-time-range {
margin-top: 8px;
}
.remove-time-range {
min-width: 36px;
min-height: 40px;
padding: 0;
font-size: 1.2rem;
}
.assignment-table .agent-type-select {
min-width: 180px;
width: 100%;
}
@media (max-width: 760px) {
.weekly-time-range {
grid-template-columns: 1fr 1fr 1fr 38px;
}
.weekly-time-separator {
display: none;
}
}
.weekly-mixed-motif-warning {
display: block;
margin-top: 0.5rem;
font-size: 0.8rem;
line-height: 1.35;
}
/* ---------------------------------------------------------
Édition directe d'un créneau depuis la vue agent
--------------------------------------------------------- */
.modal-backdrop {
position: fixed;
inset: 0;
z-index: 1000;
display: grid;
place-items: center;
padding: 24px;
background: rgba(15, 23, 42, 0.55);
overflow-y: auto;
}
.modal-backdrop[hidden] {
display: none;
}
.modal-card {
width: min(760px, 100%);
max-height: calc(100vh - 48px);
overflow-y: auto;
background: #fff;
border-radius: 18px;
box-shadow: 0 24px 70px rgba(15, 23, 42, 0.28);
padding: 24px;
}
.modal-heading {
align-items: flex-start;
}
.modal-close {
min-width: 42px;
min-height: 42px;
padding: 6px 12px;
font-size: 1.5rem;
line-height: 1;
}
.edit-time-range-field {
align-self: end;
}
.edit-time-range {
display: flex;
align-items: center;
gap: 10px;
}
.edit-time-range input {
min-width: 0;
flex: 1;
}
.modal-actions {
justify-content: flex-end;
gap: 10px;
}
.overview-entry-actions {
display: flex;
justify-content: flex-end;
margin-top: 8px;
}
.overview-entry-edit {
padding: 5px 9px;
font-size: 0.78rem;
}
body.modal-open {
overflow: hidden;
}
@media (max-width: 640px) {
.modal-backdrop {
padding: 12px;
align-items: end;
}
.modal-card {
max-height: 92vh;
border-radius: 18px 18px 0 0;
padding: 18px;
}
.edit-time-range {
flex-wrap: wrap;
}
}
/* ============================================================
V5.3 - Actions d'export PDF
============================================================ */
.planning-summary-actions {
display: flex;
align-items: center;
gap: 0.75rem;
flex-wrap: wrap;
justify-content: flex-end;
}
.button-pdf {
white-space: nowrap;
}
.overview-filter-actions {
display: flex;
align-items: stretch;
gap: 0.6rem;
}
.overview-filter-actions .button {
flex: 1;
}
@media (max-width: 640px) {
.planning-summary-actions,
.overview-filter-actions {
width: 100%;
flex-direction: column;
align-items: stretch;
}
}
/* ============================================================
V5.6 - Contrat horaire PDF depuis la vue agent
============================================================ */
.agent-overview-actions {
display: flex;
align-items: center;
gap: 0.75rem;
flex-shrink: 0;
}
@media (max-width: 760px) {
.overview-title-row {
align-items: stretch;
flex-direction: column;
}
.agent-overview-actions,
.agent-overview-actions .button {
width: 100%;
}
}
/* ============================================================
V5.8 - Déplacement / duplication des créneaux par glisser-déposer
============================================================ */
.planning-entry-interactive {
position: relative;
cursor: grab;
user-select: none;
transition: transform 0.15s ease, box-shadow 0.15s ease, opacity 0.15s ease;
}
.planning-entry-interactive:hover,
.planning-entry-interactive:focus-visible {
transform: translateY(-1px);
box-shadow: 0 8px 20px rgba(15, 23, 42, 0.12);
outline: none;
}
.planning-entry-interactive:active {
cursor: grabbing;
}
.planning-entry-interactive.is-dragging {
opacity: 0.45;
transform: scale(0.98);
}
.entry-drag-hint {
flex: 0 0 auto;
align-self: center;
color: #94a3b8;
font-size: 1rem;
font-weight: 900;
letter-spacing: -0.25rem;
writing-mode: vertical-rl;
pointer-events: none;
}
.day-column.is-drop-target {
outline: 3px solid #2563eb;
outline-offset: 2px;
background: #eff6ff;
}
.day-column.is-copy-target {
outline-style: dashed;
background: #f5f3ff;
}
.day-column.is-drop-target .day-header::after {
content: 'Déplacer ici';
margin-left: auto;
color: #1d4ed8;
font-size: 0.68rem;
font-weight: 800;
}
.day-column.is-copy-target .day-header::after {
content: 'Dupliquer ici';
color: #6d28d9;
}
.planning-entry-action-card {
width: min(620px, 100%);
}
.entry-action-mode {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 12px;
margin: 0 0 18px;
padding: 0;
border: 0;
}
.entry-action-mode legend {
grid-column: 1 / -1;
margin-bottom: 4px;
color: #475569;
font-size: 0.85rem;
font-weight: 800;
}
.entry-action-option {
display: flex;
align-items: flex-start;
gap: 10px;
padding: 12px;
border: 1px solid #dbe3e8;
border-radius: 12px;
background: #f8fafc;
cursor: pointer;
}
.entry-action-option:has(input:checked) {
border-color: #2563eb;
background: #eff6ff;
}
.entry-action-option input {
margin-top: 3px;
}
.entry-action-option span,
.entry-action-option strong,
.entry-action-option small {
display: block;
}
.entry-action-option small {
margin-top: 3px;
color: #64748b;
}
@media (max-width: 640px) {
.entry-action-mode {
grid-template-columns: 1fr;
}
}
/* ============================================================
V5.9 - Semaines types par agent
============================================================ */
.week-template-modal-card {
width: min(720px, 100%);
}
.week-template-context,
.week-template-details {
display: grid;
gap: 6px;
padding: 12px 14px;
border: 1px solid #dbe3e8;
border-radius: 12px;
background: #f8fafc;
}
.week-template-context strong,
.week-template-context span,
.week-template-detail-card strong,
.week-template-detail-card span {
display: block;
}
.week-template-context span,
.week-template-detail-card span {
margin-top: 3px;
color: #64748b;
font-size: 0.85rem;
}
.week-template-mode {
margin-top: 4px;
}
.week-template-danger {
padding: 12px 14px;
border: 1px solid #fecaca;
border-radius: 12px;
background: #fef2f2;
color: #991b1b;
font-size: 0.88rem;
font-weight: 700;
}
.week-template-modal-actions {
align-items: center;
}
.modal-action-spacer {
flex: 1;
}
.button-danger {
border-color: #dc2626;
background: #fff;
color: #b91c1c;
}
.button-danger:hover:not(:disabled) {
background: #fef2f2;
}
@media (max-width: 760px) {
.week-template-modal-actions {
flex-direction: column;
align-items: stretch;
}
.modal-action-spacer {
display: none;
}
}
/* ============================================================
V5.11 - Vue agent mensuelle, glisser-déposer inter-semaines
============================================================ */
.agent-month-title-row {
align-items: flex-start;
}
.agent-month-planner {
display: grid;
gap: 1rem;
margin-top: 1rem;
}
.agent-month-help {
margin: 0.9rem 0 0;
color: #64748b;
font-size: 0.84rem;
}
.agent-month-week {
border: 1px solid #dbe3ec;
border-radius: 14px;
overflow: hidden;
background: #fff;
}
.agent-month-week-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
padding: 0.7rem 0.85rem;
background: #f8fafc;
border-bottom: 1px solid #e2e8f0;
}
.agent-month-week-header > div {
display: flex;
flex-direction: column;
gap: 0.1rem;
}
.agent-month-week-header span {
color: #64748b;
font-size: 0.78rem;
}
.agent-month-week-grid {
display: grid;
grid-template-columns: repeat(5, minmax(165px, 1fr));
min-width: 825px;
}
.agent-month-week {
overflow-x: auto;
}
.agent-month-day-card {
min-height: 150px;
border-right: 1px solid #e2e8f0;
background: #fff;
transition: background 0.15s ease, outline 0.15s ease;
}
.agent-month-day-card:last-child {
border-right: 0;
}
.agent-month-day-card.is-outside-month {
background: #f8fafc;
}
.agent-month-day-card.is-outside-month .agent-month-day-header {
opacity: 0.65;
}
.agent-month-day-header {
display: flex;
justify-content: space-between;
gap: 0.5rem;
padding: 0.55rem 0.65rem;
border-bottom: 1px solid #edf2f7;
background: rgba(248, 250, 252, 0.85);
}
.agent-month-day-header span {
color: #64748b;
font-size: 0.78rem;
}
.agent-month-day-body {
display: grid;
align-content: start;
gap: 0.5rem;
padding: 0.55rem;
min-height: 105px;
}
.agent-month-entry {
display: grid;
grid-template-columns: auto minmax(0, 1fr);
gap: 0.45rem;
padding: 0.5rem 0.55rem;
border-left-width: 4px;
}
.agent-month-entry .overview-entry-edit {
grid-column: 1 / -1;
justify-self: end;
}
.agent-month-entry-content {
display: flex;
flex-direction: column;
gap: 0.12rem;
min-width: 0;
}
.agent-month-entry-content small {
overflow-wrap: anywhere;
}
.agent-month-day-card.is-drop-target {
outline: 3px solid #2563eb;
outline-offset: -3px;
background: #eff6ff;
}
.agent-month-day-card.is-copy-target {
outline-style: dashed;
outline-color: #7c3aed;
background: #f5f3ff;
}
.agent-month-day-card.is-drop-target .agent-month-day-header::after {
content: 'Déplacer ici';
margin-left: auto;
color: #1d4ed8;
font-size: 0.66rem;
font-weight: 800;
}
.agent-month-day-card.is-copy-target .agent-month-day-header::after {
content: 'Dupliquer ici';
color: #6d28d9;
}
@media (max-width: 900px) {
.agent-month-week-header {
align-items: flex-start;
flex-direction: column;
}
.agent-month-week-header .button {
width: 100%;
}
}
/* ============================================================
V5.12 - File de validation des plannings
============================================================ */
.pending-validation-tab {
display: inline-flex;
align-items: center;
gap: 0.55rem;
}
.validation-tab-badge {
display: inline-grid;
min-width: 1.55rem;
height: 1.55rem;
place-items: center;
padding: 0 0.4rem;
border-radius: 999px;
background: #b42318;
color: #fff;
font-size: 0.75rem;
font-weight: 900;
line-height: 1;
}
.pending-validation-summary {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 1rem;
margin-top: 1.25rem;
}
.pending-summary-card {
padding: 1rem 1.1rem;
border: 1px solid #dbe3ee;
border-radius: 14px;
background: #f8fafc;
}
.pending-summary-card span,
.pending-summary-card small {
display: block;
color: #6b7280;
}
.pending-summary-card strong {
display: block;
margin: 0.15rem 0;
color: #172033;
font-size: 1.45rem;
}
.pending-validation-table-wrap {
overflow-x: auto;
}
.pending-validation-table {
width: 100%;
min-width: 1040px;
border-collapse: collapse;
}
.pending-validation-table th,
.pending-validation-table td {
padding: 0.9rem 0.8rem;
border-bottom: 1px solid #e5e7eb;
text-align: left;
vertical-align: middle;
}
.pending-validation-table th {
background: #f8fafc;
color: #4b5563;
font-size: 0.78rem;
text-transform: uppercase;
letter-spacing: 0.03em;
}
.pending-validation-table td strong,
.pending-validation-table td small {
display: block;
}
.pending-validation-table td small {
margin-top: 0.2rem;
color: #6b7280;
}
.pending-validation-row {
cursor: pointer;
transition: background 0.15s ease, box-shadow 0.15s ease;
}
.pending-validation-row:hover,
.pending-validation-row:focus {
background: #fffaf0;
outline: none;
box-shadow: inset 4px 0 0 #b06a00;
}
.pending-count-chip {
display: inline-grid;
min-width: 2rem;
height: 2rem;
place-items: center;
padding: 0 0.45rem;
border-radius: 999px;
background: #fff4d6;
color: #7d5c00;
font-weight: 900;
}
.pending-validation-action-cell {
text-align: right !important;
}
.pending-validation-action-cell .button {
white-space: nowrap;
}
@media (max-width: 760px) {
.pending-validation-summary {
grid-template-columns: 1fr;
}
}
/* ============================================================
V5.13 - Contrôle de couverture des lieux
============================================================ */
.coverage-tab {
display: inline-flex;
align-items: center;
gap: 0.55rem;
}
.coverage-tab-badge {
background: #b42318;
}
.coverage-summary {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 1rem;
margin-top: 1.25rem;
}
.coverage-summary-card {
padding: 1rem 1.1rem;
border: 1px solid #dbe3ee;
border-radius: 14px;
background: #f8fafc;
}
.coverage-summary-card span,
.coverage-summary-card small {
display: block;
color: #6b7280;
}
.coverage-summary-card strong {
display: block;
margin: 0.15rem 0;
color: #172033;
font-size: 1.45rem;
}
.coverage-summary-danger {
border-color: #fecaca;
background: #fff7f7;
}
.coverage-summary-danger strong {
color: #b42318;
}
.coverage-table-wrap {
overflow-x: auto;
}
.coverage-table {
width: 100%;
min-width: 1050px;
border-collapse: collapse;
}
.coverage-table th,
.coverage-table td {
padding: 0.9rem 0.8rem;
border-bottom: 1px solid #e5e7eb;
text-align: left;
vertical-align: middle;
}
.coverage-table th {
background: #f8fafc;
color: #4b5563;
font-size: 0.78rem;
text-transform: uppercase;
letter-spacing: 0.03em;
}
.coverage-table td strong,
.coverage-table td small {
display: block;
}
.coverage-table td small {
margin-top: 0.2rem;
color: #6b7280;
}
.coverage-alert-row {
background: #fffafa;
}
.coverage-missing-chip {
display: inline-flex;
padding: 0.35rem 0.65rem;
border-radius: 999px;
background: #fee2e2;
color: #991b1b;
font-weight: 800;
}
.coverage-action-cell {
text-align: right !important;
}
.coverage-unconfigured {
margin-top: 1rem;
padding: 0.9rem 1rem;
border: 1px solid #f6d58b;
border-radius: 12px;
background: #fffbeb;
color: #7c5b00;
}
.coverage-unconfigured strong,
.coverage-unconfigured p {
display: block;
margin: 0;
}
.coverage-unconfigured p {
margin-top: 0.35rem;
font-size: 0.88rem;
}
.coverage-inline-notice {
margin-bottom: 1rem;
padding: 0.85rem 1rem;
border: 1px solid;
border-radius: 12px;
}
.coverage-inline-notice strong,
.coverage-inline-notice span {
display: block;
}
.coverage-inline-notice span {
margin-top: 0.25rem;
font-size: 0.88rem;
}
.coverage-inline-notice ul {
margin: 0.55rem 0 0 1.1rem;
padding: 0;
}
.coverage-inline-info {
border-color: #bfdbfe;
background: #eff6ff;
color: #1e40af;
}
.coverage-inline-success {
border-color: #bbf7d0;
background: #f0fdf4;
color: #166534;
}
.coverage-inline-danger {
border-color: #fecaca;
background: #fef2f2;
color: #991b1b;
}
.coverage-rules-editor {
display: grid;
gap: 0.85rem;
margin-top: 1rem;
}
.coverage-rule-day {
border: 1px solid #dbe3ee;
border-radius: 14px;
overflow: hidden;
background: #fff;
}
.coverage-rule-day-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
padding: 0.75rem 0.9rem;
border-bottom: 1px solid #e5e7eb;
background: #f8fafc;
}
.coverage-rule-day-ranges {
display: grid;
gap: 0.7rem;
padding: 0.85rem;
}
.coverage-rule-row {
display: grid;
grid-template-columns: minmax(130px, 1fr) minmax(130px, 1fr) minmax(110px, 0.7fr) auto;
gap: 0.7rem;
align-items: end;
}
.coverage-rule-empty {
margin: 0;
color: #7b8794;
font-size: 0.88rem;
}
.coverage-rules-actions {
display: flex;
justify-content: flex-end;
margin-top: 1rem;
}
@media (max-width: 900px) {
.coverage-summary {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.coverage-rule-row {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
@media (max-width: 640px) {
.coverage-summary,
.coverage-rule-row {
grid-template-columns: 1fr;
}
.coverage-rule-day-header {
align-items: stretch;
flex-direction: column;
}
}
/* V5.14 - actions directes sur les créneaux de la vue par agent */
.agent-month-entry-actions {
display: flex;
flex-wrap: wrap;
gap: 0.4rem;
align-items: center;
justify-content: flex-end;
}
.agent-month-entry-actions .button {
padding: 0.45rem 0.65rem;
font-size: 0.78rem;
}
/* V5.15 - suppression déplacée dans la modale de modification de la vue agent */
.agent-entry-modal-actions {
align-items: center;
}
@media (max-width: 760px) {
.agent-entry-modal-actions {
flex-direction: column;
align-items: stretch;
}
.agent-entry-modal-actions .modal-action-spacer {
display: none;
}
}
/* ============================================================
V5.16 - Informations complémentaires des agents
============================================================ */
button, input, select, textarea { font: inherit; }
textarea {
width: 100%;
padding: 10px 12px;
border: 1px solid #cfd8dc;
border-radius: 10px;
background: #fff;
color: inherit;
outline: none;
resize: vertical;
}
textarea:focus {
border-color: #607d8b;
box-shadow: 0 0 0 3px rgba(96, 125, 139, 0.14);
}
textarea:disabled {
background: #f3f5f6;
color: #9aa4aa;
cursor: not-allowed;
}
.agent-information-table .agent-row-qualification,
.agent-information-table .agent-row-phone,
.agent-information-table .agent-row-structure {
min-width: 150px;
}
.agent-information-table td:last-child {
width: 120px;
text-align: right;
}
/* PTA V5.17 - Calendrier des vacances scolaires */
.vacation-api-note {
margin: 0 0 1rem;
padding: .9rem 1rem;
border: 1px solid var(--border, #d9dee7);
border-radius: 10px;
background: #f7f9fc;
line-height: 1.5;
}
.vacation-filters {
align-items: end;
}
.vacation-preview-panel {
margin-top: 1rem;
}
.compact-heading {
gap: 1rem;
align-items: center;
}
.vacation-select-all {
display: inline-flex;
gap: .5rem;
align-items: center;
white-space: nowrap;
font-weight: 600;
}
.vacation-table input[type="text"],
.vacation-table input[type="date"] {
min-width: 150px;
width: 100%;
}
.vacation-table td small {
display: block;
margin-top: .3rem;
color: #667085;
}
.vacation-source-badge,
.weekly-period-badge {
display: inline-flex;
align-items: center;
width: fit-content;
border-radius: 999px;
padding: .2rem .55rem;
font-size: .74rem;
font-weight: 700;
line-height: 1.2;
}
.vacation-source-badge {
background: #eef2f7;
color: #344054;
}
.weekly-period-badge.is-peri {
background: #e8f1ff;
color: #174ea6;
}
.weekly-period-badge.is-extra {
background: #fff1dc;
color: #9a4d00;
}
.weekly-period-detail {
display: block;
max-width: 150px;
color: #667085;
font-size: .72rem;
line-height: 1.25;
}
.button-danger {
border-color: #d92d20;
color: #b42318;
background: #fff;
}
.button-danger:hover {
background: #fff1f0;
}
@media (max-width: 760px) {
.compact-heading {
align-items: flex-start;
flex-direction: column;
}
}
/* ============================================================
V5.19 - Application d'une semaine type sur une période
============================================================ */
.week-template-period-modal-card {
width: min(1080px, calc(100vw - 2rem));
max-height: calc(100vh - 2rem);
overflow: auto;
}
.week-template-period-grid {
display: grid;
grid-template-columns: minmax(240px, 1.5fr) repeat(2, minmax(170px, 0.8fr));
gap: 1rem;
}
.week-template-period-rule-note {
padding: 0.9rem 1rem;
border: 1px solid #cbd5e1;
border-radius: 12px;
background: #f8fafc;
color: #334155;
line-height: 1.5;
}
.week-template-period-preview-actions {
display: flex;
justify-content: flex-start;
}
.week-template-period-preview {
display: grid;
gap: 1rem;
padding-top: 0.25rem;
}
.week-template-period-summary {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 0.75rem;
}
.week-template-period-summary article {
display: grid;
gap: 0.25rem;
padding: 0.8rem 0.9rem;
border: 1px solid #e2e8f0;
border-radius: 12px;
background: #fff;
}
.week-template-period-summary span {
color: #64748b;
font-size: 0.78rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.02em;
}
.week-template-period-summary strong {
font-size: 1.25rem;
}
.week-template-period-vacations,
.week-template-period-alert {
padding: 0.85rem 1rem;
border-radius: 12px;
border: 1px solid #dbe4ee;
background: #f8fafc;
}
.week-template-period-vacations ul {
margin: 0.55rem 0 0;
padding-left: 1.2rem;
}
.week-template-period-alert.is-success {
border-color: #a7d7b7;
background: #effaf2;
color: #166534;
}
.week-template-period-alert.is-warning {
border-color: #f2d38a;
background: #fff9e8;
color: #854d0e;
}
.week-template-period-alert.is-error {
border-color: #f0a8a8;
background: #fff1f1;
color: #991b1b;
}
.week-template-period-table-wrap {
max-height: 360px;
overflow: auto;
border: 1px solid #e2e8f0;
border-radius: 12px;
}
.week-template-period-table {
margin: 0;
}
.week-template-period-table th {
position: sticky;
top: 0;
z-index: 1;
background: #f8fafc;
}
@media (max-width: 820px) {
.week-template-period-grid,
.week-template-period-summary {
grid-template-columns: 1fr;
}
}
/* ============================================================
V6 - Navigation multipage
============================================================ */
.view-tab {
display: inline-flex;
align-items: center;
text-decoration: none;
}
.page-content {
display: block;
}
.page-content > .card:first-child {
margin-top: 0;
}
/* PTA V7 — synthèse annuelle et équipes */
.view-tabs { overflow-x: auto; flex-wrap: nowrap; }
.summary-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: 12px; }
.summary-card { padding: 14px; border: 1px solid var(--border-color, #d8dee8); border-radius: 12px; background: #fff; display: grid; gap: 6px; }
.summary-card span { font-size: .82rem; color: #5f6b7a; }
.summary-card strong { font-size: 1.15rem; }
.summary-card small { color: #6b7280; }
.compact-summary { margin: 14px 0; grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); }
.control-list { display: grid; gap: 9px; }
.control-item { display: flex; gap: 12px; align-items: flex-start; padding: 11px 13px; border-radius: 10px; border-left: 5px solid #64748b; background: #f8fafc; }
.control-item strong { min-width: 68px; font-size: .78rem; }
.control-erreur { border-left-color: #b91c1c; background: #fef2f2; }
.control-alerte { border-left-color: #d97706; background: #fffbeb; }
.control-info { border-left-color: #2563eb; background: #eff6ff; }
.stack-list { display: grid; gap: 10px; margin-top: 16px; }
.stack-item { display: flex; justify-content: space-between; gap: 14px; align-items: center; border: 1px solid #dbe3ed; border-radius: 10px; padding: 12px; background: #fff; }
.stack-item p { margin: 4px 0 0; color: #64748b; }
.button-group { display: flex; gap: 8px; flex-wrap: wrap; }
.button-danger { background: #fff; color: #b91c1c; border: 1px solid #fecaca; }
.button-danger:hover { background: #fef2f2; }
.check-field { display: flex; align-items: center; gap: 8px; padding-top: 26px; }
.team-list { display: grid; gap: 18px; margin-top: 16px; }
.team-card { border: 1px solid #cbd5e1; }
.inline-form { display: grid; grid-template-columns: minmax(220px, 2fr) minmax(170px, 1fr) minmax(180px, 2fr) auto; align-items: end; gap: 10px; margin: 16px 0; padding: 12px; background: #f8fafc; border-radius: 10px; }
@media (max-width: 900px) { .inline-form { grid-template-columns: 1fr; } .stack-item { align-items: flex-start; flex-direction: column; } }
/* ============================================================
V7.2 - Vue annuelle de contrôle type tableau d'annualisation
============================================================ */
.annual-overview-page {
--annual-border: #aab2b8;
--annual-month: #f3c623;
--annual-blue: #dcecf8;
--annual-grey: #d5d5d5;
--annual-dark-blue: #164a78;
}
.annual-filters {
grid-template-columns: minmax(280px, 1.8fr) minmax(150px, 0.6fr) auto;
align-items: end;
}
.annual-filter-actions {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.annual-sheet {
margin-bottom: 24px;
border: 1px solid #b9c1c7;
background: #fff;
box-shadow: 0 8px 28px rgba(23, 32, 42, 0.09);
}
.annual-sheet:fullscreen {
overflow: auto;
padding: 14px;
background: #fff;
}
.annual-sheet-header {
border-bottom: 1px solid var(--annual-border);
background: #fff;
}
.annual-title-row {
display: grid;
grid-template-columns: 1fr auto 1fr;
align-items: center;
min-height: 70px;
padding: 10px 18px;
border-bottom: 1px solid var(--annual-border);
}
.annual-title-row h2 {
margin: 0;
font-family: Georgia, "Times New Roman", serif;
font-size: clamp(1.3rem, 2.5vw, 2rem);
letter-spacing: 0.04em;
text-align: center;
}
.annual-direction,
.annual-updated {
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
font-size: 0.82rem;
}
.annual-updated { text-align: right; }
.annual-identity-grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
border-bottom: 1px solid var(--annual-border);
}
.annual-identity-grid > div {
min-height: 56px;
padding: 8px 12px;
border-right: 1px solid #d7dcdf;
border-bottom: 1px solid #d7dcdf;
}
.annual-identity-grid > div:nth-child(4n) { border-right: 0; }
.annual-identity-grid > div:nth-last-child(-n + 4) { border-bottom: 0; }
.annual-identity-grid span { display: block; margin-bottom: 4px; color: #5e6a71; font-size: 0.72rem; }
.annual-identity-grid strong { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.88rem; }
.annual-quota-periods {
display: flex;
gap: 8px;
overflow-x: auto;
padding: 10px 14px;
background: #f6f8f9;
border-bottom: 1px solid var(--annual-border);
}
.annual-quota-chip {
min-width: 245px;
padding: 8px 10px;
border: 1px solid #cfd6da;
border-radius: 8px;
background: #fff;
}
.annual-quota-chip span,
.annual-quota-chip small { display: block; color: #647178; font-size: 0.7rem; }
.annual-quota-chip strong { display: block; margin: 3px 0; font-size: 0.76rem; }
.annual-toolbar {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 14px;
}
.annual-toolbar p { margin: 0 0 0 auto; color: #66737d; font-size: 0.78rem; }
.annual-summary-strip {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
border-bottom: 1px solid var(--annual-border);
background: #f5f7f8;
}
.annual-summary-strip article { padding: 10px 14px; border-right: 1px solid #d7dcdf; }
.annual-summary-strip article:last-child { border-right: 0; }
.annual-summary-strip span { display: block; color: #65737b; font-size: 0.7rem; }
.annual-summary-strip strong { font-size: 0.9rem; }
.annual-grid-scroll {
width: 100%;
overflow-x: auto;
overflow-y: hidden;
background: #fff;
scrollbar-color: #71808a #e9edef;
scrollbar-width: auto;
}
.annual-months {
display: flex;
align-items: flex-start;
width: max-content;
min-width: 100%;
}
.annual-month {
width: 280px;
flex: 0 0 280px;
border-right: 2px solid #7f8a91;
}
.annual-month:last-child { border-right: 0; }
.annual-month table {
width: 100%;
border-collapse: collapse;
table-layout: fixed;
font-family: Arial, Helvetica, sans-serif;
font-size: 10px;
}
.annual-month th,
.annual-month td {
height: 24px;
padding: 2px 3px;
border: 1px solid var(--annual-border);
text-align: center;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.annual-month-title {
position: sticky;
top: 0;
z-index: 3;
height: 30px !important;
background: var(--annual-month);
color: #111;
font-weight: 900;
text-transform: uppercase;
letter-spacing: 0.03em;
}
.annual-column-headings th {
position: sticky;
top: 30px;
z-index: 2;
background: #f8fafb;
font-weight: 900;
}
.annual-column-headings th:first-child { width: 37px; }
.annual-column-headings th:nth-child(2) { width: 26px; }
.annual-day-cell {
width: 37px;
background: #fff;
font-weight: 800;
cursor: pointer;
}
.annual-day-cell span { margin-right: 3px; color: #78848b; font-size: 8px; }
.annual-week-cell {
width: 26px;
background: #3d7fb9;
color: #fff;
font-weight: 800;
}
.annual-data-cell {
cursor: pointer;
font-weight: 700;
transition: outline 0.1s ease, filter 0.1s ease;
}
.annual-month tbody tr:hover .annual-data-cell,
.annual-month tbody tr:hover .annual-day-cell { outline: 2px solid rgba(22, 74, 120, 0.35); outline-offset: -2px; }
.annual-month tbody tr:hover .annual-data-cell { filter: brightness(0.97); }
.annual-weekend td,
.annual-weekend .annual-day-cell { background: var(--annual-grey); color: #6a7175; }
.annual-vacation-row .annual-day-cell { background: #c9e3f7; }
.annual-vacation-row .annual-data-cell { background: #e8f4fc; }
.annual-work { background: #e8f4fc !important; color: #123c5d; }
.annual-extra { background: #cfe5f6 !important; color: #123c5d; }
.annual-preparation { background: #fff0a8 !important; color: #5b4b00; }
.annual-training { background: #dcc8f5 !important; color: #4d2675; }
.annual-leave { background: #cfe9c8 !important; color: #29552a; }
.annual-absence { background: #f6c4c4 !important; color: #8b1919; }
.annual-other-absence { background: #cfd5da !important; color: #37434b; }
.annual-jnt { background: #f7d7dc !important; color: #b11f35; }
.annual-fraction { background: #d52020 !important; color: #fff; }
.annual-cell-draft { box-shadow: inset 0 0 0 2px #f09b24; }
.annual-month tfoot th,
.annual-month tfoot td {
height: 30px;
background: #f7c8d3;
font-weight: 900;
}
.annual-sheet-footer {
padding: 12px 16px 16px;
border-top: 1px solid var(--annual-border);
background: #f8fafb;
}
.annual-legend {
display: flex;
flex-wrap: wrap;
gap: 8px 14px;
margin-bottom: 10px;
}
.annual-legend-item { display: inline-flex; align-items: center; gap: 5px; font-size: 0.72rem; }
.annual-legend-item i { width: 15px; height: 15px; border: 1px solid #9ba5aa; border-radius: 3px; }
.annual-abbreviations { display: flex; flex-wrap: wrap; gap: 8px 16px; color: #59666e; font-size: 0.72rem; }
@media (max-width: 900px) {
.annual-filters { grid-template-columns: 1fr; }
.annual-identity-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.annual-identity-grid > div:nth-child(4n) { border-right: 1px solid #d7dcdf; }
.annual-identity-grid > div:nth-child(2n) { border-right: 0; }
.annual-summary-strip { grid-template-columns: repeat(2, 1fr); }
.annual-title-row { grid-template-columns: 1fr; text-align: center; }
.annual-updated { text-align: center; }
.annual-toolbar { align-items: stretch; flex-direction: column; }
.annual-toolbar p { margin-left: 0; }
}
@media print {
@page { size: A3 landscape; margin: 7mm; }
body { background: #fff; }
.app-shell { width: 100%; max-width: none; margin: 0; padding: 0; }
.page-header, .view-tabs, .no-print { display: none !important; }
.annual-sheet { border: 0; box-shadow: none; margin: 0; }
.annual-grid-scroll { overflow: visible; }
.annual-months { display: grid; grid-template-columns: repeat(6, 1fr); width: 100%; }
.annual-month { width: auto; min-width: 0; border-right: 1px solid #555; break-inside: avoid; }
.annual-month:nth-child(6n) { border-right: 0; }
.annual-month table { font-size: 6.8px; }
.annual-month th, .annual-month td { height: 14px; padding: 0 1px; }
.annual-month-title, .annual-column-headings th { position: static; }
.annual-month-title { height: 18px !important; }
.annual-sheet-footer { padding: 5px 8px; }
.annual-legend-item, .annual-abbreviations { font-size: 6.5px; }
}
/* ============================================================
PTA V7.4 - Choix de rôle et contexte d'accès
============================================================ */
.header-actions {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 10px;
flex-wrap: wrap;
}
.access-profile-badge {
display: grid;
gap: 1px;
min-width: 190px;
padding: 9px 12px;
border: 1px solid #d8e0e5;
border-radius: 12px;
background: #f7fafb;
line-height: 1.2;
}
.access-profile-badge span {
color: #607079;
font-size: 0.7rem;
font-weight: 800;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.access-profile-badge strong { color: #17384e; font-size: 0.88rem; }
.access-profile-badge small { color: #66767f; font-size: 0.72rem; }
.switch-role-link { white-space: nowrap; }
.nav-count-badge {
display: inline-flex;
min-width: 19px;
height: 19px;
align-items: center;
justify-content: center;
margin-left: 5px;
padding: 0 5px;
border-radius: 999px;
background: #c72f3f;
color: #fff;
font-size: 0.68rem;
font-weight: 900;
line-height: 1;
}
.role-access-warning,
.role-page-notice { margin: 0 0 16px; }
.entry-locked {
display: inline-flex;
align-items: center;
padding: 4px 7px;
border-radius: 999px;
background: #edf1f3;
color: #69777e;
font-size: 0.68rem;
font-weight: 800;
}
.role-page-body {
min-height: 100vh;
margin: 0;
padding: 28px 16px;
background:
radial-gradient(circle at 15% 15%, rgba(40, 121, 167, 0.15), transparent 34%),
radial-gradient(circle at 85% 85%, rgba(62, 143, 103, 0.12), transparent 30%),
#eef3f5;
color: #1f303a;
}
.role-page-shell {
width: min(980px, 100%);
margin: 0 auto;
padding: 30px;
border: 1px solid #d7e0e5;
border-radius: 22px;
background: rgba(255, 255, 255, 0.98);
box-shadow: 0 18px 55px rgba(27, 58, 76, 0.13);
}
.role-intro { margin-bottom: 22px; text-align: center; }
.role-intro h1 { margin: 3px 0 8px; font-size: clamp(1.75rem, 4vw, 2.45rem); }
.role-intro > p:not(.eyebrow) { margin: 0 auto; max-width: 650px; color: #61717a; }
.role-current-profile {
display: inline-flex;
flex-wrap: wrap;
justify-content: center;
gap: 4px;
margin-top: 14px;
padding: 8px 12px;
border-radius: 999px;
background: #edf5f8;
color: #31556a;
font-size: 0.82rem;
}
.role-selection-form { display: grid; gap: 18px; }
.role-choice-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 14px;
}
.role-choice-card { position: relative; cursor: pointer; }
.role-choice-card input {
position: absolute;
width: 1px;
height: 1px;
opacity: 0;
pointer-events: none;
}
.role-choice-content {
display: grid;
align-content: start;
min-height: 150px;
padding: 20px;
border: 2px solid #dce4e8;
border-radius: 16px;
background: #fff;
box-shadow: 0 5px 15px rgba(25, 54, 69, 0.05);
transition: border-color 0.15s ease, box-shadow 0.15s ease, transform 0.15s ease, background 0.15s ease;
}
.role-choice-card:hover .role-choice-content {
transform: translateY(-2px);
border-color: #9cbccd;
box-shadow: 0 10px 24px rgba(25, 54, 69, 0.1);
}
.role-choice-card input:focus-visible + .role-choice-content {
outline: 3px solid rgba(25, 113, 164, 0.25);
outline-offset: 3px;
}
.role-choice-card input:checked + .role-choice-content {
border-color: #1971a4;
background: #f0f8fc;
box-shadow: 0 0 0 4px rgba(25, 113, 164, 0.1);
}
.role-choice-content strong { margin-bottom: 9px; color: #163d55; font-size: 1.03rem; }
.role-choice-content small { color: #5e6f79; font-size: 0.82rem; line-height: 1.5; }
.role-context-card {
padding: 18px;
border: 1px solid #d8e2e7;
border-radius: 14px;
background: #f8fafb;
}
.role-context-card[hidden] { display: none; }
.role-form-actions { display: flex; justify-content: center; }
.role-form-actions .button { min-width: 210px; }
.role-security-note {
margin-top: 20px;
padding: 13px 15px;
border-left: 4px solid #d9911e;
border-radius: 8px;
background: #fff8e8;
color: #664d21;
font-size: 0.79rem;
line-height: 1.5;
}
@media (max-width: 850px) {
.page-header { align-items: flex-start; }
.header-actions { justify-content: flex-start; width: 100%; }
.access-profile-badge { flex: 1 1 220px; }
.role-choice-grid { grid-template-columns: 1fr; }
.role-choice-content { min-height: 0; }
}
@media (max-width: 560px) {
.role-page-body { padding: 12px 8px; }
.role-page-shell { padding: 20px 14px; border-radius: 16px; }
.header-actions { align-items: stretch; }
.header-actions > * { width: 100%; }
.switch-role-link { justify-content: center; }
}
/* PTA V7.7 - Validation annuelle depuis la vue de contrôle */
.annual-validation-card {
margin: 18px 12px 12px;
padding: 18px;
border: 1px solid #d7dde1;
border-radius: 12px;
background: #fff;
}
.annual-validation-heading {
display: flex;
align-items: center;
justify-content: space-between;
gap: 18px;
}
.annual-validation-heading h3 { margin: 2px 0 4px; }
.annual-validation-heading p { margin: 0; }
.annual-validation-note {
margin: 12px 0 0;
font-size: .88rem;
color: #56616a;
}
.annual-validation-result { margin-top: 14px; }
.annual-validation-summary {
padding: 12px 14px;
border-radius: 9px;
background: #f4f7f8;
border: 1px solid #d9e0e4;
}
.annual-validation-summary.is-error { background: #fff3f2; border-color: #e7b7b2; }
.annual-validation-summary.is-success { background: #f0f8f2; border-color: #b9d8bf; }
.annual-validation-summary.is-warning { background: #fff8e8; border-color: #e5cf96; }
.annual-validation-issues {
display: grid;
gap: 10px;
margin-top: 12px;
}
.annual-validation-issue {
padding: 12px;
border: 1px solid #e0c0bc;
border-radius: 9px;
background: #fff;
}
.annual-validation-issue header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
margin-bottom: 8px;
}
.annual-validation-issue h4 { margin: 0; font-size: .98rem; }
.annual-validation-issue ul { margin: 6px 0 10px 20px; padding: 0; }
.annual-validation-issue li { margin: 4px 0; }
.annual-validation-open-link::after { content: ' ↗'; }
@media (max-width: 760px) {
.annual-validation-heading,
.annual-validation-issue header { align-items: stretch; flex-direction: column; }
}
@media print {
.annual-validation-card { display: none !important; }
}
/* ============================================================
PTA V7.9 - Navigation regroupée et tableau de bord
============================================================ */
/* --- Barre de navigation par intention --------------------- */
.view-tabs-grouped {
align-items: stretch;
gap: 0;
padding: 0.45rem 0.35rem 0.4rem;
}
.view-tab-group {
display: flex;
flex-direction: column;
gap: 0.3rem;
padding: 0 0.6rem;
}
.view-tabs-grouped .view-tab-group + .view-tab-group {
border-left: 1px solid #e2e8f0;
}
.view-tab-group-label {
padding-left: 0.35rem;
color: #7b8794;
font-size: 0.64rem;
font-weight: 800;
letter-spacing: 0.12em;
text-transform: uppercase;
white-space: nowrap;
}
.view-tab-group-items {
display: flex;
gap: 0.35rem;
}
.view-tabs-grouped .view-tab {
padding: 0.55rem 0.8rem;
font-size: 0.94rem;
}
/* Sans titres de groupe, la barre retrouve son alignement d'origine. */
.view-tabs:not(.view-tabs-grouped) .view-tab-group,
.view-tabs:not(.view-tabs-grouped) .view-tab-group-items {
display: contents;
}
.page-header-identity { min-width: 0; }
.page-header-identity .subtitle { max-width: 68ch; }
/* --- Tuiles d'action --------------------------------------- */
.dashboard-context-card .section-heading { align-items: flex-end; }
.dashboard-context-actions {
display: flex;
align-items: flex-end;
gap: 12px;
}
.dashboard-week-field { min-width: 190px; }
.dashboard-context-note {
margin: 14px 0 0;
padding: 10px 13px;
border-radius: 10px;
border-left: 5px solid #2563eb;
background: #eff6ff;
color: #1e3a5f;
font-size: 0.9rem;
}
.dashboard-tiles {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(215px, 1fr));
gap: 16px;
margin-bottom: 20px;
}
.dashboard-tile {
display: grid;
gap: 5px;
padding: 18px 20px;
border: 1px solid #e4e8eb;
border-left: 6px solid #cbd5e1;
border-radius: 16px;
background: #fff;
box-shadow: 0 6px 24px rgba(23, 32, 42, 0.05);
color: inherit;
text-decoration: none;
transition: transform 0.12s ease, box-shadow 0.15s ease;
}
.dashboard-tile:hover,
.dashboard-tile:focus-visible {
transform: translateY(-2px);
box-shadow: 0 12px 28px rgba(23, 32, 42, 0.11);
}
.dashboard-tile-label {
color: #5f6b7a;
font-size: 0.78rem;
font-weight: 800;
letter-spacing: 0.06em;
text-transform: uppercase;
}
.dashboard-tile-value { font-size: 2.1rem; line-height: 1.1; }
.dashboard-tile-detail { color: #66737d; font-size: 0.84rem; }
.dashboard-tile-cta {
margin-top: 6px;
color: #1f4c73;
font-size: 0.82rem;
font-weight: 800;
}
.dashboard-tile-cta::after { content: ' →'; }
.dashboard-tile.is-alert { border-left-color: #c72f3f; }
.dashboard-tile.is-alert .dashboard-tile-value { color: #a3212f; }
.dashboard-tile.is-clear { border-left-color: #2f855a; }
.dashboard-tile.is-clear .dashboard-tile-value { color: #256d3b; }
/* --- Listes « à traiter » ---------------------------------- */
.dashboard-columns {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(380px, 1fr));
gap: 20px;
}
.dashboard-columns > .card { margin-bottom: 0; }
.dashboard-list-card { display: flex; flex-direction: column; }
.dashboard-list {
display: grid;
gap: 9px;
margin: 0;
padding: 0;
list-style: none;
}
.dashboard-list-item {
display: flex;
align-items: center;
gap: 14px;
padding: 11px 13px;
border: 1px solid #e6ebee;
border-radius: 11px;
background: #f9fbfc;
}
.dashboard-list-main { flex: 1 1 auto; min-width: 0; }
.dashboard-list-main strong { display: block; }
.dashboard-list-main small { color: #66737d; font-size: 0.82rem; }
.dashboard-list-meta {
display: grid;
gap: 2px;
text-align: right;
white-space: nowrap;
}
.dashboard-list-meta span { color: #66737d; font-size: 0.78rem; }
.dashboard-list-action {
display: inline-flex;
flex: 0 0 auto;
align-items: center;
min-height: 38px;
padding: 8px 14px;
font-size: 0.86rem;
text-decoration: none;
}
.dashboard-gap-count { color: #a3212f; }
.dashboard-inline-note {
margin-top: 14px;
padding: 11px 13px;
border-radius: 10px;
border-left: 5px solid #d97706;
background: #fffbeb;
color: #7d5c00;
font-size: 0.86rem;
}
/* --- Suivi des quotas -------------------------------------- */
.dashboard-quota-summary {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
gap: 12px;
margin-bottom: 18px;
}
.dashboard-quota-table-wrap { overflow-x: auto; }
.dashboard-quota-table {
width: 100%;
border-collapse: collapse;
font-size: 0.9rem;
}
.dashboard-quota-table th,
.dashboard-quota-table td {
padding: 10px 12px;
border-bottom: 1px solid #eceff1;
text-align: left;
vertical-align: middle;
}
.dashboard-quota-table th {
color: #5f6b7a;
font-size: 0.76rem;
letter-spacing: 0.05em;
text-transform: uppercase;
}
.dashboard-quota-table td small { display: block; color: #66737d; font-size: 0.78rem; }
.dashboard-quota-table tr.is-over-quota { background: #fef4f4; }
.dashboard-quota-action-cell { text-align: right; }
.dashboard-quota-action-cell .button {
display: inline-flex;
align-items: center;
min-height: 36px;
padding: 7px 13px;
font-size: 0.84rem;
text-decoration: none;
}
.dashboard-quota-gauge-cell {
display: flex;
align-items: center;
gap: 10px;
white-space: nowrap;
}
/* Jauge native : la CSP interdit l'attribut style, la largeur ne peut donc pas
être calculée en JavaScript sur une simple div. */
.dashboard-quota-gauge {
width: 110px;
height: 9px;
border: 0;
border-radius: 999px;
background: #e4e9ec;
appearance: none;
}
.dashboard-quota-gauge::-webkit-progress-bar { background: #e4e9ec; border-radius: 999px; }
.dashboard-quota-gauge::-webkit-progress-value { background: #2f6f9f; border-radius: 999px; }
.dashboard-quota-gauge::-moz-progress-bar { background: #2f6f9f; border-radius: 999px; }
.dashboard-quota-gauge.is-over::-webkit-progress-value { background: #c72f3f; }
.dashboard-quota-gauge.is-over::-moz-progress-bar { background: #c72f3f; }
/* --- Raccourcis -------------------------------------------- */
.dashboard-shortcuts {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(215px, 1fr));
gap: 12px;
}
.dashboard-shortcut {
display: grid;
gap: 3px;
padding: 14px 16px;
border: 1px solid #e4e8eb;
border-radius: 12px;
background: #f9fbfc;
color: inherit;
text-decoration: none;
}
.dashboard-shortcut:hover,
.dashboard-shortcut:focus-visible { border-color: #b9c6cf; background: #fff; }
.dashboard-shortcut small { color: #66737d; font-size: 0.82rem; }
@media (max-width: 900px) {
.view-tabs-grouped { flex-direction: column; align-items: flex-start; gap: 0.6rem; }
.view-tabs-grouped .view-tab-group + .view-tab-group { border-left: 0; }
.view-tab-group { width: 100%; padding: 0; }
.view-tab-group-items { flex-wrap: wrap; }
.dashboard-context-card .section-heading { align-items: stretch; }
.dashboard-context-actions { flex-wrap: wrap; }
}
@media (max-width: 620px) {
.dashboard-list-item { flex-wrap: wrap; }
.dashboard-list-meta { text-align: left; }
.dashboard-list-action { width: 100%; justify-content: center; }
}
/* ============================================================
PTA V7.10 - Guide d'utilisation (FAQ)
============================================================ */
/* --- Bouton d'accès ancré à droite de la navigation --------- */
/* La barre défile horizontalement quand les onglets débordent ;
`position: sticky` garde le guide visible quoi qu'il arrive. */
.view-tab-help {
display: flex;
position: sticky;
right: 0;
align-items: center;
margin-left: auto;
padding-left: 0.55rem;
background: #f8fafc;
box-shadow: -14px 0 12px -10px rgba(15, 23, 42, 0.16);
}
.view-tabs-grouped .view-tab-help { border-left: 1px solid #e2e8f0; }
.view-tab-faq {
display: inline-flex;
align-items: center;
gap: 0.4rem;
color: #263238;
text-decoration: none;
}
.view-tab-faq-mark {
display: inline-flex;
align-items: center;
justify-content: center;
width: 1.35rem;
height: 1.35rem;
border-radius: 50%;
background: #263238;
color: #fff;
font-size: 0.78rem;
line-height: 1;
}
.view-tab-faq:hover,
.view-tab-faq:focus-visible { background: #fff; }
/* --- Mise en page du guide --------------------------------- */
.faq-layout {
display: grid;
grid-template-columns: minmax(220px, 280px) minmax(0, 1fr);
align-items: start;
gap: 20px;
}
.faq-summary {
position: sticky;
top: 18px;
padding: 18px 20px;
}
.faq-summary-title {
margin: 0 0 10px;
color: #7b8794;
font-size: 0.7rem;
font-weight: 800;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.faq-summary-list {
margin: 0;
padding-left: 1.1rem;
color: #66737d;
font-size: 0.9rem;
}
.faq-summary-list li { margin-bottom: 7px; }
.faq-summary-list a { color: #263238; text-decoration: none; }
.faq-summary-list a:hover,
.faq-summary-list a:focus-visible { text-decoration: underline; }
.faq-summary-note {
margin: 14px 0 0;
padding-top: 12px;
border-top: 1px solid #eceff1;
color: #66737d;
font-size: 0.8rem;
}
.faq-section { scroll-margin-top: 18px; }
.faq-section h3 { margin: 22px 0 8px; font-size: 1rem; }
.faq-section p { line-height: 1.55; }
.faq-section code {
padding: 1px 5px;
border-radius: 5px;
background: #eef1f4;
font-size: 0.86rem;
}
.faq-section kbd {
padding: 1px 6px;
border: 1px solid #cfd8dc;
border-bottom-width: 2px;
border-radius: 5px;
background: #f8fafc;
font-size: 0.82rem;
}
/* --- Le parcours en huit étapes ---------------------------- */
.faq-flow {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 12px;
margin: 0;
padding: 0;
list-style: none;
}
.faq-flow li {
display: grid;
gap: 3px;
padding: 13px 15px;
border: 1px solid #e4e8eb;
border-radius: 12px;
background: #f9fbfc;
}
.faq-flow-step {
display: inline-flex;
align-items: center;
justify-content: center;
width: 1.6rem;
height: 1.6rem;
border-radius: 50%;
background: #263238;
color: #fff;
font-size: 0.8rem;
font-weight: 700;
}
.faq-flow li small { color: #66737d; font-size: 0.82rem; line-height: 1.4; }
/* --- Étapes numérotées et listes --------------------------- */
.faq-steps { margin: 0; padding-left: 1.3rem; }
.faq-steps li { margin-bottom: 9px; line-height: 1.55; }
.faq-list { margin: 0 0 4px; padding-left: 1.3rem; }
.faq-list li { margin-bottom: 7px; line-height: 1.55; }
.faq-callout { margin: 16px 0 0; }
.faq-table th,
.faq-table td { vertical-align: top; line-height: 1.5; }
.faq-table tr.faq-row-current { background: #f2f7f4; }
.faq-level {
display: inline-block;
padding: 2px 8px;
border-radius: 999px;
font-size: 0.74rem;
font-weight: 800;
letter-spacing: 0.03em;
text-transform: uppercase;
white-space: nowrap;
}
.faq-level-error { background: #fdecec; color: #a3212f; }
.faq-level-warning { background: #fffbeb; color: #7d5c00; }
.faq-level-info { background: #eef2f7; color: #37474f; }
/* --- Questions / réponses ---------------------------------- */
.faq-qa { margin: 0; }
.faq-qa dt {
margin-top: 16px;
font-weight: 700;
}
.faq-qa dt:first-child { margin-top: 0; }
.faq-qa dd {
margin: 5px 0 0;
padding-left: 13px;
border-left: 3px solid #e4e8eb;
color: #4b5563;
line-height: 1.55;
}
@media (max-width: 1000px) {
.faq-layout { grid-template-columns: minmax(0, 1fr); }
.faq-summary { position: static; }
}
@media (max-width: 900px) {
.view-tab-help {
position: static;
width: 100%;
margin-left: 0;
padding-left: 0;
box-shadow: none;
}
.view-tabs-grouped .view-tab-help { border-left: 0; }
}