: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; } }