/* ===========================================================================
   DailyCare MU — socle accessible mobile-first (WCAG) :
   texte >= 16 px, cibles tactiles >= 44 px, focus visibles, reduced motion.
   Les couleurs viennent de dailycare-tokens.css.
   =========================================================================== */

html {
    font-size: 16px;
    /* R2.1 — filet global anti-débordement horizontal (retour PO mobile) : plus
       AUCUNE page ne peut défiler latéralement vers du vide. « clip » (et non
       « hidden ») n'établit pas de conteneur de défilement et NE piège PAS le
       position:fixed des modales (leur bloc conteneur reste le viewport).
       R4.2 — position:relative + min-height:100% RETIRÉS : ils ne servaient qu'au
       footer position:absolute, remplacé par le sticky footer en flux ci-dessous. */
    overflow-x: clip;
}

body {
    font-size: 1rem; /* >= 16 px partout */
    line-height: 1.45;
    background-color: var(--dc-surface);
    /* R4.2 — sticky footer PROPRE (retour PO « Mon compte ») : colonne flex haute
       d'au moins un écran ; le footer (.footer, margin-top:auto) est poussé en bas
       EN FLUX. Remplace l'ancien footer position:absolute + le margin-bottom:60px
       magique du body qui laissait le pied chevaucher le contenu dès qu'il approchait
       la hauteur du viewport. Vaut pour les DEUX layouts (MVC _Layout et Blazor
       App.razor partagent ce body/ce .footer). */
    min-height: 100dvh;
    display: flex;
    flex-direction: column;
    overflow-x: clip;
    /* Coupe les longs mots/URLs insécables plutôt que d'élargir la page. */
    overflow-wrap: break-word;
}

/* --- Cibles tactiles >= 44x44 px : boutons, liens de nav, champs --- */
.btn,
.navbar-nav .nav-link,
.navbar-brand,
.form-control,
.form-select {
    min-height: var(--dc-touch);
}

.btn {
    min-width: var(--dc-touch);
    display: inline-flex;
    align-items: center;
    justify-content: center;
}

.navbar-nav .nav-link {
    display: inline-flex;
    align-items: center;
}

/* --- Focus visible : 3 px, jamais supprimé --- */
:focus-visible {
    outline: 3px solid var(--dc-primary);
    outline-offset: 2px;
}

.btn:focus-visible,
.form-control:focus,
.form-select:focus {
    outline: 3px solid var(--dc-primary);
    outline-offset: 2px;
    box-shadow: none;
}

/* --- Bouton pilule DailyCare --- */
.dc-btn {
    border-radius: var(--dc-radius-pill);
    padding-left: 1.25rem;
    padding-right: 1.25rem;
}

.btn-primary {
    background-color: var(--dc-primary);
    border-color: var(--dc-primary);
    color: var(--dc-on-primary);
}

.btn-primary:hover,
.btn-primary:focus,
.btn-primary:active {
    background-color: #4F378B;
    border-color: #4F378B;
    color: var(--dc-on-primary);
}

/* --- Cartes --- */
.dc-card {
    border-radius: var(--dc-radius-card);
    border-color: var(--dc-outline);
    background-color: var(--dc-surface-container);
}

/* ===========================================================================
   COQUILLE DE NAVIGATION (R6) — topbar fine + BARRE LATÉRALE rétractable.
   Remplace la navbar horizontale R5.2 (retiré : .dc-navbar, .navbar-collapse
   flottant R4.1). Un SEUL mécanisme de bascule (JS : site.js / dc-nav.js) pilote
   l'état par une classe posée sur <html> (survit à la navigation améliorée Blazor).
   Fond FONCÉ expressif réutilisé (--dc-navbar-bg #40316A + blanc = 11,26:1 AAA,
   ratios dans dailycare-tokens.css). Le bandeau support et le pied de page gardent
   leurs couleurs propres (hors coquille).
   =========================================================================== */

/* --- Topbar fine : bouton bascule + marque à gauche, cloche + compte à droite --- */
.dc-topbar {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    min-height: var(--dc-topbar-h);
    padding: 0.25rem 0.75rem;
    background-color: var(--dc-navbar-bg);
}

.dc-topbar-groupe {
    display: flex;
    align-items: center;
    gap: 0.25rem;
}

/* Boutons ICÔNE de la topbar (bascule sidebar + hamburger compte) : transparents,
   icône BLANCHE via currentColor, cible ≥ 44 px, pastille au survol. */
.dc-topbar-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: var(--dc-touch);
    min-height: var(--dc-touch);
    padding: 0;
    border: none;
    background-color: transparent;
    color: var(--dc-navbar-on);
    border-radius: var(--dc-radius-pill);
    cursor: pointer;
    transition: background-color 0.15s ease;
}

.dc-topbar-btn:hover,
.dc-topbar-btn:focus {
    background-color: var(--dc-navbar-hover);
    color: var(--dc-navbar-on);
}

/* L'icône SVG hérite la couleur (currentColor = blanc). Pas de style inline. */
.dc-topbar-btn svg {
    width: 26px;
    height: 26px;
}

/* Chevron de bascule de la sidebar (distinct du hamburger COMPTE, évite la
   confusion des deux icônes identiques). Le polyline de base pointe à GAUCHE :
   à GAUCHE quand la sidebar est DÉPLOYÉE, à DROITE quand elle est RÉTRACTÉE.
   L'état « basculée » (classe sur <html>) inverse son sens entre desktop
   (= repli) et mobile (= tiroir ouvert) → la rotation vit dans les blocs média
   de la coquille, plus bas. prefers-reduced-motion neutralise la transition
   (bloc global) — la direction reste correcte, sans animation. */
.dc-sidebar-chevron {
    transition: transform 0.15s ease;
}

/* Marque : logo + « DailyCare » en blanc, lisible sur le fond foncé (11,26:1). */
.dc-brand {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    min-height: var(--dc-touch);
    padding: 0 0.35rem;
    color: var(--dc-navbar-on);
    font-weight: 700;
    font-size: 1.15rem;
    text-decoration: none;
}

.dc-brand:hover,
.dc-brand:focus {
    color: var(--dc-navbar-on);
}

/* La cloche de notifications vit dans la topbar FONCÉE (parité R5.2) : icône/texte
   en blanc ; son badge garde son anneau clair (règle .dc-cloche-badge). */
.dc-topbar .dc-cloche,
.dc-topbar .dc-cloche:hover,
.dc-topbar .dc-cloche:focus {
    color: var(--dc-navbar-on);
}

/* Focus visible DANS la topbar/sidebar : anneau BLANC (le focus global violet
   disparaîtrait sur le fond foncé). Accessibilité conservée (WCAG 2.4.7). */
.dc-topbar-btn:focus-visible,
.dc-brand:focus-visible,
.dc-topbar .dc-cloche:focus-visible,
.dc-sidebar-lien:focus-visible {
    outline: 3px solid var(--dc-navbar-on);
    outline-offset: 2px;
}

/* --- Coquille : rangée [sidebar | contenu] occupant la hauteur restante --- */
.dc-shell {
    display: flex;
    flex: 1 1 auto;
    align-items: stretch;
    min-height: 0;
}

/* Colonne de contenu : le pied de page (sticky footer R-4, .footer margin-top:auto)
   vit ICI. min-width:0 empêche un tableau large de pousser la page (filet R-2). */
.dc-app-main {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-width: 0;
}

/* --- Barre latérale : liens de menu par rôle, texte en GRAS (R6.2) --- */
.dc-sidebar {
    flex: 0 0 var(--dc-sidebar-width);
    width: var(--dc-sidebar-width);
    background-color: var(--dc-navbar-bg);
    color: var(--dc-navbar-on);
    overflow-y: auto;
    /* La bascule desktop glisse la barre hors flux (marge négative animée). */
    transition: margin-inline-start 0.2s ease, transform 0.2s ease;
}

.dc-sidebar-liste {
    list-style: none;
    margin: 0;
    padding: 0.5rem;
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.dc-sidebar-lien {
    display: flex;
    align-items: center;
    gap: 0.7rem; /* espace pictogramme ↔ libellé */
    min-height: var(--dc-touch);
    padding: 0.5rem 0.85rem;
    border-radius: var(--dc-radius-pill);
    color: var(--dc-navbar-on);
    font-weight: 700; /* R6.2 — police des menus en GRAS */
    text-decoration: none;
    transition: background-color 0.15s ease;
}

/* Pictogramme préfixe (SidebarIcones) : taille fixe 20 px (jamais de style
   inline, CSP), ne rétrécit pas → libellés parfaitement alignés. Décoratif :
   la couleur suit currentColor du lien (blanc au repos, foncé si actif). */
.dc-sidebar-ico {
    flex: 0 0 auto;
}

.dc-sidebar-lien:hover,
.dc-sidebar-lien:focus {
    /* Survol : pastille éclaircie, texte blanc → 7,39:1 (AAA conservé). */
    background-color: var(--dc-navbar-hover);
    color: var(--dc-navbar-on);
}

/* R6.2 — page ACTIVE : pastille CLAIRE + texte foncé = repère net (13,28:1 AAA,
   documenté dans dailycare-tokens.css) + aria-current="page" côté markup. */
.dc-sidebar-lien.active,
.dc-sidebar-lien[aria-current="page"],
.dc-sidebar-lien.active:hover,
.dc-sidebar-lien.active:focus,
.dc-sidebar-lien[aria-current="page"]:hover,
.dc-sidebar-lien[aria-current="page"]:focus {
    background-color: var(--dc-primary-container);
    color: var(--dc-on-surface);
    /* Barre d'accent à gauche (non-texte : --dc-primary #6750A4 sur #EADDFF ≥ 3:1). */
    box-shadow: inset 4px 0 0 0 var(--dc-primary);
}

/* Fond assombri (scrim) du tiroir mobile — masqué par défaut, montré en mode tiroir. */
.dc-scrim {
    display: none;
}

/* --- Panneau COMPTE (R6.3) : ouvert par le hamburger DROITE de la topbar --- */
.dc-compte {
    position: relative;
}

.dc-compte-panneau {
    position: absolute;
    inset-block-start: calc(100% + 6px);
    inset-inline-end: 0;
    z-index: 1039; /* au-dessus du contenu, SOUS les modales (≥ 1050) */
    min-width: 15rem;
    max-width: min(20rem, calc(100vw - 1.5rem));
    display: flex;
    flex-direction: column;
    gap: 8px;
    padding: 12px;
    background-color: var(--dc-surface);
    color: var(--dc-on-surface);
    border: 1px solid var(--dc-outline);
    border-radius: var(--dc-radius-card);
    box-shadow: 0 8px 30px rgba(0, 0, 0, 0.25);
}

/* L'attribut [hidden] doit l'emporter sur le display:flex ci-dessus. */
.dc-compte-panneau[hidden] {
    display: none;
}

.dc-compte-nom {
    font-weight: 700;
    padding: 0 4px;
    /* Coupe un nom très long sans élargir le panneau. */
    overflow-wrap: break-word;
}

/* Lien « Mon compte » du panneau (surface CLAIRE) : teinte foncée #4F378B sur
   #FFFBFE = 9,09:1 (AAA), plus lisible que le primary #6750A4 (~6,4:1 < 7:1). */
.dc-compte-lien {
    display: flex;
    align-items: center;
    min-height: var(--dc-touch);
    padding: 0.35rem 0.5rem;
    border-radius: 12px;
    color: #4F378B;
    font-weight: 600;
    text-decoration: none;
}

.dc-compte-lien:hover,
.dc-compte-lien:focus {
    background-color: var(--dc-surface-container);
    color: #4F378B;
}

.dc-compte-panneau .dc-deconnexion {
    display: flex;
    margin: 0;
}

.dc-compte-panneau .dc-deconnexion .dc-btn {
    flex: 1 1 auto;
}

/* ---- Desktop (≥ 992 px) : sidebar VISIBLE par défaut, pousse le contenu ----
   La bascule (classe sur <html>) la glisse hors flux par une marge négative ; le
   contenu se réajuste en pleine largeur. Pas de scrim en mode desktop. */
@media (min-width: 992px) {
    html.dc-sidebar-basculee .dc-sidebar {
        margin-inline-start: calc(-1 * var(--dc-sidebar-width));
    }

    /* Chevron : sidebar déployée par défaut (gauche) ; basculée = rétractée → droite. */
    html.dc-sidebar-basculee .dc-sidebar-chevron {
        transform: rotate(180deg);
    }

    /* PC (retour PO) : coquille FIGÉE — topbar + barre latérale immobiles, seul le
       CONTENU défile. Le body devient un cadre de hauteur viewport (overflow caché,
       il ne défile plus) ; la colonne de contenu (.dc-app-main) défile en interne.
       La barre latérale a déjà overflow-y:auto (elle défile seule si le menu est
       long). overflow:hidden ne piège PAS le position:fixed (modales/toasts restent
       ancrés au viewport). Mobile inchangé : tiroir + défilement de page classique. */
    body {
        height: 100dvh;
        overflow: hidden;
    }

    .dc-app-main {
        overflow-y: auto;
        /* Le titre collant OPAQUE ne doit pas recouvrir un élément qui reçoit le
           focus clavier (WCAG 2.4.11 « Focus Not Obscured ») : on réserve sa
           hauteur en haut de la zone défilante pour que le focus s'arrête dessous. */
        scroll-padding-top: 4.5rem;
    }

    /* Titre de page ÉPINGLÉ en haut de la zone défilante (retour PO) : reste visible
       pendant que les indicateurs et les alertes défilent dessous. */
    .dc-page-titre {
        position: sticky;
        top: 0;
    }
}

/* ---- Mobile / tablette (< 992 px) : TIROIR off-canvas ----
   Masqué par défaut (hors écran), glisse par-dessus le contenu au clic de la
   bascule, avec fond assombri. z-index SOUS les modales (≥ 1050). Ferme au clic
   dehors + Échap (JS). Remplace le hamburger flottant R4.1 (un seul mécanisme). */
@media (max-width: 991.98px) {
    .dc-sidebar {
        position: fixed;
        inset-block: 0;
        inset-inline-start: 0;
        width: min(280px, 82vw);
        /* La topbar (opaque) reste au-dessus ; le contenu du tiroir démarre dessous. */
        padding-block-start: var(--dc-topbar-h);
        transform: translateX(-100%);
        z-index: 1046;
        box-shadow: 0 8px 30px rgba(0, 0, 0, 0.35);
    }

    html.dc-sidebar-basculee .dc-sidebar {
        transform: translateX(0);
    }

    /* Chevron : tiroir masqué par défaut (droite = 180°) ; basculé = ouvert → gauche (0°). */
    .dc-sidebar-chevron {
        transform: rotate(180deg);
    }

    html.dc-sidebar-basculee .dc-sidebar-chevron {
        transform: rotate(0deg);
    }

    html.dc-sidebar-basculee .dc-scrim {
        display: block;
        position: fixed;
        inset: 0;
        z-index: 1045;
        background-color: rgba(28, 27, 31, 0.5);
    }
}

/* --- Lien d'évitement (skip-link) --- */
.dc-skip-link {
    position: absolute;
    left: -9999px;
    top: 0;
    z-index: 1100;
    padding: 0.75rem 1.25rem;
    background-color: var(--dc-primary);
    color: var(--dc-on-primary);
    text-decoration: none;
}

.dc-skip-link:focus,
.dc-skip-link:focus-visible {
    left: 0;
}

/* --- Bandeau mode support (visible sur toutes les pages) --- */
.dc-support-banner {
    background-color: var(--dc-warn-bg);
    color: var(--dc-warn);
    border-bottom: 2px solid var(--dc-warn);
    font-size: 1rem;
}

/* --- Statuts (gabarit pour les modules : couleur + texte, jamais couleur seule) --- */
.dc-statut-a-faire {
    color: var(--dc-todo);
    background-color: var(--dc-todo-bg);
}

.dc-statut-fait {
    color: var(--dc-done);
    background-color: var(--dc-done-bg);
}

.dc-statut-attention {
    color: var(--dc-warn);
    background-color: var(--dc-warn-bg);
}

.dc-statut-incident {
    color: var(--dc-incident);
    background-color: var(--dc-incident-bg);
}

/* ===========================================================================
   Module Tâches quotidiennes — écran staff/superviseur (maquette
   docs/ui-reference/staff-mobile.html : MD3 + Accessible & Ethical).
   =========================================================================== */

/* En-tête « Bonjour » + compteurs */
.dc-taches-tete {
    background-color: var(--dc-surface-container);
}

.dc-taches-bonjour {
    color: var(--dc-todo);
    font-size: 0.9rem;
}

.dc-stats {
    display: flex;
    gap: 10px;
    flex-wrap: wrap;
}

.dc-stat {
    flex: 1;
    min-width: 90px;
    background-color: var(--dc-surface);
    border-radius: 16px;
    padding: 12px 10px;
    text-align: center;
}

.dc-stat b {
    display: block;
    font-size: 1.6rem;
    line-height: 1;
}

.dc-stat span {
    font-size: 0.85rem;
    color: var(--dc-todo);
}

.dc-stat .dc-stat-todo { color: var(--dc-todo); }
.dc-stat .dc-stat-done { color: var(--dc-done); }
.dc-stat .dc-stat-late { color: var(--dc-incident); }

/* Chips de filtre (défilement horizontal, cibles >= 44 px) */
.dc-chips {
    display: flex;
    gap: 8px;
    overflow-x: auto;
    padding: 4px 2px;
}

.dc-chip {
    flex: none;
    min-height: var(--dc-touch);
    padding: 0 16px;
    border-radius: var(--dc-radius-pill);
    border: 1px solid var(--dc-outline);
    background-color: var(--dc-surface);
    color: var(--dc-todo);
    font-size: 0.9rem;
    font-weight: 600;
    display: inline-flex;
    align-items: center;
}

.dc-chip[aria-pressed="true"] {
    background-color: var(--dc-primary-container);
    color: #21005D;
    border-color: transparent;
}

/* Carte pensionnaire */
.dc-carte-resident {
    background-color: var(--dc-surface-container);
    border-radius: var(--dc-radius-card);
    padding: 14px;
}

.dc-carte-retard {
    border: 2px solid var(--dc-warn);
}

.dc-avatar {
    width: 46px;
    height: 46px;
    border-radius: 50%;
    background-color: var(--dc-primary-container);
    color: #21005D;
    display: flex;
    align-items: center;
    justify-content: center;
    font-weight: 700;
    flex: none;
}

.dc-resident-nom {
    font-size: 1.06rem;
    font-weight: 700;
}

.dc-resident-chambre {
    font-size: 0.85rem;
    color: var(--dc-todo);
}

/* Ligne de tâche */
.dc-tache-ligne {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 10px 4px;
    border-top: 1px solid #CAC4D0;
    /* R2.1 — cette ligne est PARTAGÉE par /mes-taches (icône + libellé + « Fait »
       + « ⋯ ») ET /journee (icône + libellé + badge + « Corriger / Assigner /
       Remarque »). Sur /journee à 375 px, les trois boutons + le badge ne
       tenaient pas et poussaient la page au-delà du viewport. flex-wrap autorise
       le retour à la ligne des actions sur écran étroit ; sur large, rien ne change. */
    flex-wrap: wrap;
}

.dc-tache-ligne:first-of-type {
    border-top: none;
}

.dc-tache-ico {
    width: 40px;
    height: 40px;
    border-radius: 12px;
    background-color: var(--dc-surface);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.25rem;
    flex: none;
}

.dc-tache-corps {
    flex: 1;
    min-width: 0;
}

.dc-tache-nom {
    font-size: 1rem;
    font-weight: 600;
}

.dc-tache-meta {
    font-size: 0.82rem;
    color: var(--dc-todo);
}

.dc-badge {
    font-size: 0.78rem;
    font-weight: 700;
    padding: 4px 10px;
    border-radius: var(--dc-radius-pill);
    white-space: nowrap;
}

/* --- Cloche de notifications (nav interne, B17) : bouton d'ouverture du panneau --- */
.dc-cloche {
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: var(--dc-touch);
    min-height: var(--dc-touch);
    padding: 0;
    border: none;
    background-color: transparent;
    color: var(--dc-navbar-on);
    border-radius: var(--dc-radius-pill);
    cursor: pointer;
    transition: background-color 0.15s ease;
}

.dc-cloche:hover,
.dc-cloche:focus {
    background-color: var(--dc-navbar-hover);
}

.dc-cloche-icone {
    font-size: 1.35rem;
    line-height: 1;
}

.dc-cloche-badge {
    position: absolute;
    top: 2px;
    inset-inline-end: 2px;
    min-width: 20px;
    padding: 1px 5px;
    border-radius: var(--dc-radius-pill);
    background-color: var(--dc-incident);
    color: #fff;
    font-size: 0.72rem;
    font-weight: 700;
    line-height: 1.4;
    text-align: center;
    /* R5.2 — la cloche vit dans la barre FONCÉE : le badge incident #8C1D18 sur
       #40316A ne tranche pas (~1,1:1). Un anneau BLANC le détache nettement du fond
       (blanc vs barre = 11,26:1 ≥ 3:1, WCAG 1.4.11 non-text). Le texte blanc DANS le
       badge garde 9,1:1 sur le rouge. */
    box-shadow: 0 0 0 1.5px var(--dc-navbar-on);
}

/* --- Panneau flottant de la cloche (résumé notifications, retour PO) ---
   Même patron que le panneau COMPTE : ancré sous la cloche, fermé au clic EN DEHORS
   et à Échap (site.js MVC / dc-nav.js Blazor). Un clic DANS le panneau (item = lien)
   mène à /notifications. Largeur bornée au viewport → tient aussi sur mobile. */
.dc-cloche-zone {
    position: relative;
}

.dc-cloche-panneau {
    position: absolute;
    inset-block-start: calc(100% + 6px);
    inset-inline-end: 0;
    z-index: 1039; /* au-dessus du contenu, SOUS les modales (≥ 1050) */
    width: min(22rem, calc(100vw - 1.5rem));
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: 8px;
    background-color: var(--dc-surface);
    color: var(--dc-on-surface);
    border: 1px solid var(--dc-outline);
    border-radius: var(--dc-radius-card);
    box-shadow: 0 8px 30px rgba(0, 0, 0, 0.25);
}

/* [hidden] doit l'emporter sur le display:flex ci-dessus. */
.dc-cloche-panneau[hidden] {
    display: none;
}

.dc-cloche-panneau-tete {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    padding: 4px 8px 8px;
    border-bottom: 1px solid var(--dc-outline);
    margin-bottom: 4px;
}

/* Item de résumé = lien vers /notifications (clic dans le panneau → page). Cible 44 px. */
.dc-cloche-item {
    display: flex;
    flex-direction: column;
    gap: 2px;
    justify-content: center;
    min-height: var(--dc-touch);
    padding: 0.4rem 0.6rem;
    border-radius: 12px;
    color: var(--dc-on-surface);
    text-decoration: none;
}

.dc-cloche-item:hover,
.dc-cloche-item:focus {
    background-color: var(--dc-surface-container);
    color: var(--dc-on-surface);
}

/* Non-lue : gras + barre d'accent gauche (repère non-textuel, jamais la couleur seule). */
.dc-cloche-item-nouveau {
    font-weight: 700;
    box-shadow: inset 3px 0 0 0 var(--dc-primary);
}

.dc-cloche-item-titre {
    overflow-wrap: break-word;
}

.dc-cloche-item-date {
    font-size: 0.8rem;
    color: var(--dc-todo);
}

/* Pied du panneau : lien « Voir toutes les notifications ». Teinte foncée #4F378B sur
   surface claire = 9,09:1 (AAA), comme le lien « Mon compte ». */
.dc-cloche-voir-tout {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: var(--dc-touch);
    margin-top: 4px;
    padding: 0.4rem 0.6rem;
    border-top: 1px solid var(--dc-outline);
    color: #4F378B;
    font-weight: 600;
    text-decoration: none;
}

.dc-cloche-voir-tout:hover,
.dc-cloche-voir-tout:focus {
    background-color: var(--dc-surface-container);
    color: #4F378B;
}

/* --- Notifications internes (liste, B17) --- */
.dc-notification-titre {
    font-weight: 700;
}

.dc-notification-meta {
    color: var(--dc-todo);
    font-size: 0.9rem;
}

.dc-notification-lue {
    opacity: 0.75;
}

/* Bouton « Fait » : exigence produit n° 1 (>= 48 px, 1 clic) */
.dc-btn-fait {
    min-height: 48px;
    min-width: 76px;
    padding: 0 18px;
    border: none;
    border-radius: var(--dc-radius-pill);
    background-color: var(--dc-primary);
    color: var(--dc-on-primary);
    font-size: 0.95rem;
    font-weight: 700;
}

.dc-btn-fait:hover,
.dc-btn-fait:focus {
    background-color: #4F378B;
    color: var(--dc-on-primary);
}

/* Menu « ⋯ » (autres statuts) */
.dc-btn-menu {
    min-height: 48px;
    min-width: 48px;
    border-radius: var(--dc-radius-pill);
    border: 1px solid var(--dc-outline);
    background-color: var(--dc-surface);
    color: var(--dc-todo);
    font-size: 1.2rem;
    font-weight: 700;
}

/* Multi-sélection des pensionnaires (affectation d'un modèle de tâche, T4/B11) :
   cases à cocher tactiles (>= 44 px) plutôt qu'un <select multiple> pénible au
   doigt ; liste défilable si le centre a beaucoup de pensionnaires. */
.dc-liste-pensionnaires {
    max-height: 20rem;
    overflow-y: auto;
    margin: 0;
    padding: 4px;
    border: 1px solid var(--dc-outline, #79747E);
    border-radius: 12px;
}

.dc-case-pensionnaire {
    display: flex;
    align-items: center;
    gap: 10px;
    min-height: var(--dc-touch);
    padding: 6px 8px;
    margin: 0;
}

.dc-case-pensionnaire .form-check-input {
    width: 1.35rem;
    height: 1.35rem;
    margin: 0;
    flex-shrink: 0;
}

.dc-case-pensionnaire .form-check-label {
    margin: 0;
}

/* Panneau inline (remarque, correction, assignation) */
.dc-panneau-inline {
    background-color: var(--dc-surface);
    border: 1px solid #CAC4D0;
    border-radius: 12px;
    padding: 12px;
    margin: 4px 0 10px;
}

/* ===========================================================================
   Lot R-1 — Filtres unifiés (dropdowns « pilule » MD3), panneau de filtres
   rétractable (replié par défaut sur mobile), et modale de confirmation
   accessible. Aucun style inline (CSP style-src 'self').
   =========================================================================== */

/* Groupe de filtres : listes déroulantes stylées comme des pilules (R1.1). */
.dc-filtres-groupe {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
}

.dc-filtre-champ {
    display: flex;
    flex-direction: column;
    gap: 4px;
    min-width: 0;
    flex: 1 1 160px;
}

.dc-filtre-champ .form-label {
    font-size: 0.85rem;
    font-weight: 600;
    color: var(--dc-todo);
    margin-bottom: 0;
}

/* Un <select> déguisé en pilule MD3 (même apparence que les anciennes chips). */
.dc-filtre-pill {
    min-height: var(--dc-touch);
    border-radius: var(--dc-radius-pill);
    border: 1px solid var(--dc-outline);
    background-color: var(--dc-surface);
    color: var(--dc-todo);
    font-weight: 600;
    padding-inline: 16px;
}

/* Panneau de filtres rétractable (R1.4) : bouton « Filtres » + chevron + badge.
   Replié par défaut sur petit écran, déplié d'office sur desktop. */
.dc-filtres-bascule {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    min-height: var(--dc-touch);
    padding: 0 16px;
    border-radius: var(--dc-radius-pill);
    border: 1px solid var(--dc-outline);
    background-color: var(--dc-surface);
    color: var(--dc-todo);
    font-weight: 600;
}

.dc-filtres-badge {
    min-width: 22px;
    padding: 1px 7px;
    border-radius: var(--dc-radius-pill);
    background-color: var(--dc-primary-container);
    color: #21005D;
    font-size: 0.78rem;
    font-weight: 700;
    text-align: center;
}

.dc-chevron {
    display: inline-block;
    transition: transform 0.15s ease;
    font-size: 0.8rem;
}

.dc-filtres-bascule[aria-expanded="true"] .dc-chevron {
    transform: rotate(180deg);
}

/* Le corps est masqué par défaut (mobile) ; il s'ouvre quand le conteneur
   porte la classe d'état, et reste toujours visible sur desktop. */
.dc-filtres-corps {
    display: none;
    margin-top: 10px;
}

.dc-filtres.dc-filtres--ouvert > .dc-filtres-corps {
    display: block;
}

@media (min-width: 576px) {
    .dc-filtres-bascule {
        display: none;
    }

    .dc-filtres > .dc-filtres-corps {
        display: block;
    }
}

/* Modale de confirmation accessible (R1.3b, écran staff Blazor). Overlay + boîte
   centrée, cibles >= 44 px, focus initial géré côté composant, Échap ferme. */
.dc-modale-fond {
    position: fixed;
    inset: 0;
    z-index: 1080;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 16px;
    background-color: rgba(28, 27, 31, 0.5);
    /* R2.1 — arrière-plan calé sur le VIEWPORT (position:fixed + inset:0), jamais
       sur la largeur réelle du document : la boîte reste centrée à l'écran même si
       une page débordait. Défilement de l'arrière-plan si la boîte est très haute. */
    overflow-y: auto;
}

.dc-modale {
    background-color: var(--dc-surface);
    border-radius: var(--dc-radius-card);
    padding: 20px;
    width: 100%;
    /* R2.1 — la boîte ne dépasse JAMAIS le viewport visible : bornée à la largeur
       de l'écran moins une marge, et à sa hauteur (avec défilement interne). Corrige
       le bug PO « la modale suit la largeur de l'app et déborde » à 375 px comme à 1280 px. */
    max-width: min(560px, calc(100vw - 2rem));
    max-height: calc(100dvh - 2rem);
    overflow-y: auto;
    box-shadow: 0 8px 30px rgba(0, 0, 0, 0.25);
}

.dc-modale-titre {
    font-size: 1.15rem;
    font-weight: 700;
    margin-bottom: 10px;
}

.dc-modale-message {
    font-size: 1rem;
    margin-bottom: 14px;
}

.dc-modale-actions {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    justify-content: flex-end;
}

.dc-modale-actions .dc-btn {
    min-height: var(--dc-touch);
}

/* Option « ne plus demander » + avertissement préalable (R1.3b). */
.dc-modale-skip {
    margin-top: 6px;
    padding-top: 12px;
    border-top: 1px solid #CAC4D0;
}

.dc-modale-avert {
    color: var(--dc-warn);
    background-color: var(--dc-warn-bg);
    border-radius: 12px;
    padding: 10px 12px;
    margin-bottom: 10px;
    font-size: 0.92rem;
}

/* Bandeau « confirmations désactivées pour ce service » (skip actif). */
.dc-skip-actif {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 10px;
    background-color: var(--dc-warn-bg);
    color: var(--dc-warn);
    border-radius: 12px;
    padding: 10px 14px;
}

/* ===========================================================================
   Lot R-2 — Retours PO n° 2 (revue mobile) :
   R2.1 modales/débordement (voir html/body, .footer, .dc-tache-ligne, .dc-modale) ;
   R2.2 messages de résultat en overlay fixe centré + champs invalides (bordure rouge) ;
   R2.3 panneau de filtres refermé au clic extérieur (mobile) ;
   R2.4 bandeau « confirmations désactivées » compacté.
   Aucun style inline (CSP style-src 'self').
   =========================================================================== */

/* R2.1 — la modale de confirmation Bootstrap PARTAGÉE (rendue en fin de <body>,
   hors de tout conteneur transformé) : sa boîte ne dépasse jamais le viewport. */
#dc-confirm-modale .modal-dialog {
    max-width: min(560px, calc(100vw - 1rem));
}

/* R3.1 — messages de RÉSULTAT d'action (succès/erreur TempData côté MVC, « annonce »
   côté Blazor) : TOASTS empilables ancrés en HAUT À DROITE (remplace l'overlay
   centré R2.2). La zone ne capture PAS les clics (pointer-events:none) — seules les
   cartes le font — pour ne jamais bloquer un contrôle sous-jacent. Chaque toast
   disparaît tout seul au bout de 5 s en fondu (animation dc-toast-vie) ; le retrait
   du DOM est fait par site.js (MVC) / le timer du composant (Blazor). Fermeture
   manuelle possible avant via le bouton ×. */
.dc-flash-zone {
    position: fixed;
    top: 0;
    right: 0;
    left: auto;
    bottom: auto;
    z-index: 1090;
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    gap: 10px;
    padding: 16px;
    max-width: min(30rem, 100vw);
    pointer-events: none;
}

.dc-flash {
    pointer-events: auto;
    display: flex;
    align-items: flex-start;
    gap: 12px;
    width: 100%;
    max-width: min(30rem, calc(100vw - 2rem));
    border-radius: var(--dc-radius-card);
    padding: 14px 16px;
    box-shadow: 0 8px 30px rgba(0, 0, 0, 0.25);
    font-size: 1rem;
    /* R4.3 (arbitrage PO acté, cf. docs/FONDATIONS.md) — fondu automatique pour
       TOUTES les notifications, ERREURS COMPRISES : apparition, palier stable, puis
       disparition à ~5 s. animation-fill-mode forwards fige l'opacité finale (0)
       jusqu'au retrait DOM. Inverse le contrat différencié (erreurs persistantes)
       de la revue sécurité R-3 : l'override d'animation des erreurs + son keyframe
       d'entrée seule ont été RETIRÉS — les erreurs héritent désormais du même fondu
       que les succès. */
    animation: dc-toast-vie 5s ease forwards;
}

@keyframes dc-toast-vie {
    0% { opacity: 0; transform: translateY(-8px); }
    5% { opacity: 1; transform: translateY(0); }
    82% { opacity: 1; transform: translateY(0); }
    100% { opacity: 0; transform: translateY(-8px); }
}

/* prefers-reduced-motion : aucun fondu — le toast reste stable puis est retiré
   sèchement (site.js / timer Blazor) à 5 s. */
@media (prefers-reduced-motion: reduce) {
    .dc-flash {
        animation: none;
    }
}

.dc-flash--ok {
    background-color: var(--dc-done-bg);
    color: var(--dc-done);
    border: 1px solid var(--dc-done);
}

.dc-flash--erreur {
    background-color: var(--dc-incident-bg);
    color: var(--dc-incident);
    border: 1px solid var(--dc-incident);
}

.dc-flash-texte {
    flex: 1;
    min-width: 0;
}

.dc-flash-fermer {
    flex: none;
    min-width: var(--dc-touch);
    min-height: var(--dc-touch);
    border: none;
    background: transparent;
    color: inherit;
    font-size: 1.5rem;
    line-height: 1;
    border-radius: var(--dc-radius-pill);
}

/* R2.2 — champ de saisie invalide : bordure rouge visible. Couvre la validation
   ASP.NET non-obtrusive (.input-validation-error), Bootstrap (.is-invalid), Blazor
   EditForm (.invalid), notre marqueur Blazor (.dc-champ-invalide) et la validation
   native (:user-invalid — après interaction uniquement, jamais au chargement).
   L'outline de focus n'est JAMAIS supprimé : il devient rouge (accessibilité). */
.input-validation-error,
.is-invalid,
.form-control.invalid,
.form-select.invalid,
.dc-champ-invalide,
.form-control:user-invalid,
.form-select:user-invalid {
    border-color: var(--dc-incident);
    border-width: 2px;
}

.input-validation-error:focus,
.is-invalid:focus,
.form-control.invalid:focus,
.dc-champ-invalide:focus,
.form-control:user-invalid:focus,
.form-select:user-invalid:focus {
    outline: 3px solid var(--dc-incident);
    outline-offset: 2px;
    box-shadow: none;
}

/* R2.3 — panneau de filtres Blazor (mes-taches, journee) : capteur transparent
   plein écran rendu UNIQUEMENT quand le panneau est ouvert ; un tap « en dehors »
   le referme. Le panneau ouvert forme un contexte d'empilement remonté (z-index
   1036) au-dessus du contenu de page ; DANS ce contexte, le capteur est placé en
   z-index -1 pour rester SOUS les contrôles du panneau (bouton, listes) — sinon un
   descendant positionné positif peindrait par-dessus le contenu en flux et
   bloquerait les clics. Désactivé sur desktop (le panneau y est toujours déplié). */
.dc-filtres.dc-filtres--ouvert {
    position: relative;
    z-index: 1036;
}

.dc-filtres-scrim {
    position: fixed;
    inset: 0;
    z-index: -1;
}

@media (min-width: 576px) {
    .dc-filtres-scrim {
        display: none;
    }

    .dc-filtres.dc-filtres--ouvert {
        z-index: auto;
    }
}

/* ===========================================================================
   Lot R-3 — Retours PO n° 3 (2026-07-11) :
   R3.1 toasts haut-droite + fondu auto (voir .dc-flash-zone / dc-toast-vie) ;
   R3.4 alignement des filtres /pensionnaires ; R3.5 fiche pensionnaire en grille.
   Aucun style inline (CSP style-src 'self').
   =========================================================================== */

/* R3.4 — /pensionnaires : les deux filtres (recherche + statut) sur la MÊME ligne à
   toutes les largeurs. align-items-start (classe Bootstrap) est renforcé ici ; les
   labels partagent la même marge basse pour une ligne de base homogène — le texte
   d'aide sous « Rechercher » ne pousse plus le menu « Statut » vers le bas. */
.dc-filtres-ligne {
    align-items: flex-start;
}

.dc-filtres-ligne .form-label {
    margin-bottom: 0.25rem;
}

/* R3.5 — fiche pensionnaire : cartes en grille 2 colonnes (desktop/tablette),
   1 colonne sous 576 px. align-items:stretch (défaut grid) + height:100% sur chaque
   carte = HAUTEUR ÉGALE des cartes d'une même ligne malgré des contenus légers. */
.dc-fiche-grille {
    display: grid;
    grid-template-columns: 1fr;
    gap: 1.5rem;
    align-items: stretch;
    margin-bottom: 1.5rem;
}

.dc-fiche-grille > .card {
    height: 100%;
    margin-bottom: 0;
}

@media (min-width: 576px) {
    .dc-fiche-grille {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
}

/* R2.4 — bandeau « confirmations désactivées » compacté : un label ORANGE
   « Avertissement » (>= 44 px) ; au clic, un détail (message + « Réactiver »)
   s'ouvre en popover ; un clic « en dehors » (capteur transparent) le referme,
   le label restant visible. */
.dc-avert {
    display: inline-block;
    position: relative;
    max-width: 100%;
}

.dc-avert--ouvert {
    z-index: 1061;
}

.dc-avert-label {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    min-height: var(--dc-touch);
    padding: 0 16px;
    border-radius: var(--dc-radius-pill);
    border: 1px solid var(--dc-warn);
    background-color: var(--dc-warn-bg);
    color: var(--dc-warn);
    font-weight: 700;
}

.dc-avert-ico {
    width: 20px;
    height: 20px;
    flex: none;
}

.dc-avert-scrim {
    position: fixed;
    inset: 0;
    z-index: 1060;
}

.dc-avert-detail {
    position: absolute;
    inset-inline-start: 0;
    inset-block-start: calc(var(--dc-touch) + 6px);
    z-index: 1061;
    width: max-content;
    max-width: min(24rem, calc(100vw - 2rem));
    background-color: var(--dc-warn-bg);
    color: var(--dc-warn);
    border: 1px solid var(--dc-warn);
    border-radius: 12px;
    padding: 12px 14px;
    box-shadow: 0 8px 30px rgba(0, 0, 0, 0.25);
}

/* ===========================================================================
   Module Dashboard responsable — style « Executive Dashboard » (PRD §16.12) :
   KPI en un coup d'œil, grandes valeurs lisibles, couleur jamais seule
   (chaque badge porte aussi un texte).
   =========================================================================== */

.dc-kpi-grille {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
    gap: 10px;
}

.dc-kpi {
    background-color: var(--dc-surface-container);
    border-radius: var(--dc-radius-card);
    padding: 14px;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 6px;
    min-height: 150px; /* dimension UNIFORME des petits panneaux (retour PO) */
}

/* Teintes DOUCES et DIFFÉRENTES par petit panneau (retour PO) — pastels pâles
   (~L 93 %) : le texte reste AAA (valeur #1C1B1F ≥ 14:1 ; libellé #49454F ≥ 7:1).
   Aucune teinte verte (retour PO). Cyclées par position → mêmes couleurs, dans le
   même ordre, pour les deux catégories. */
.dc-kpi-grille .dc-kpi:nth-child(6n + 1) { background-color: #EDE7F6; }
.dc-kpi-grille .dc-kpi:nth-child(6n + 2) { background-color: #E4EEFB; }
.dc-kpi-grille .dc-kpi:nth-child(6n + 3) { background-color: #E9E9F8; }
.dc-kpi-grille .dc-kpi:nth-child(6n + 4) { background-color: #FAEAF1; }
.dc-kpi-grille .dc-kpi:nth-child(6n + 5) { background-color: #E6F1FB; }
.dc-kpi-grille .dc-kpi:nth-child(6n + 6) { background-color: #F7F0E5; }

.dc-kpi-valeur {
    font-size: 2rem;
    line-height: 1;
}

.dc-kpi-libelle {
    font-size: 0.9rem;
    color: var(--dc-todo);
}

/* Barre de titre de page : épinglée en haut du contenu défilant sur PC
   (position:sticky ajoutée dans le bloc desktop ≥ 992 px). Fond OPAQUE pour
   masquer le contenu qui défile dessous ; fine séparation ; au-dessus des
   cartes du contenu. Sur mobile : simple barre de titre en flux. */
.dc-page-titre {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    z-index: 20;
    background-color: var(--dc-surface);
    padding-block: 0.75rem;
    border-bottom: 1px solid var(--dc-outline);
    margin-block-end: 1rem;
}

/* ===========================================================================
   Indicateurs du jour en DIAPORAMA (retour PO : trop de cartes d'un coup).
   Deux CATÉGORIES de cartes (Statut des tâches / Vigilance & vie du centre)
   affichées ALTERNATIVEMENT, choisies par des points de navigation (pointillé).
   Fond animé DOUX (« aurore » dérivante) derrière chaque catégorie, teinté par
   thème. Neutralisé par prefers-reduced-motion (bloc global plus bas). Aucun
   style inline (CSP) : l'index actif est porté par une CLASSE sur la piste.
   =========================================================================== */
.dc-kpi-carrousel {
    margin-block-end: 1.5rem;
}

.dc-kpi-carrousel-tete {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    margin-block-end: 0.5rem;
}

.dc-kpi-points {
    display: flex;
    align-items: center;
    gap: 2px;
}

/* Point de navigation : la CIBLE reste 44×44 px (AAA) ; seul le point de 12 px
   est visible (via ::before). État actif = point primary agrandi. */
.dc-kpi-point {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: var(--dc-touch);
    min-height: var(--dc-touch);
    padding: 0;
    border: none;
    background-color: transparent;
    cursor: pointer;
}

.dc-kpi-point::before {
    content: "";
    width: 12px;
    height: 12px;
    border-radius: 50%;
    background-color: var(--dc-outline);
    transition: background-color 0.15s ease, transform 0.15s ease;
}

.dc-kpi-point:hover::before,
.dc-kpi-point:focus-visible::before {
    background-color: var(--dc-primary);
}

.dc-kpi-point.actif::before {
    background-color: var(--dc-primary);
    transform: scale(1.35);
}

/* Fenêtre : arrondi + masque du débordement (les deux volets restent dans le DOM). */
.dc-kpi-fenetre {
    overflow: hidden;
    border-radius: var(--dc-radius-card);
}

/* Piste : les deux volets se SUPERPOSENT dans une même cellule de grille et se croisent
   en FONDU (retour PO) — plus de glissement latéral. La fenêtre prend la hauteur du plus
   grand volet → pas de saut de hauteur au changement. */
.dc-kpi-piste {
    display: grid;
}

.dc-kpi-volet {
    grid-area: 1 / 1;
    position: relative;
    overflow: hidden;
    padding: 22px;
    /* FONDU de 2 s entre catégories (retour PO). Le volet inactif reste dans le DOM
       (opacité 0, sans capter de clic) ; l'actif est opaque. La transition est
       neutralisée par prefers-reduced-motion (bloc global → durée quasi nulle). */
    opacity: 0;
    pointer-events: none;
    transition: opacity 2s ease;
    /* Fond dégradé EN ÉVOLUTION CONTINUE (retour PO) : un grand dégradé multi-teintes
       qui flue en boucle via background-position animé (neutralisé par
       prefers-reduced-motion). Les cartes opaques (z-index 1) passent AU-DESSUS. */
    background-color: var(--dc-surface-container);
    background-size: 300% 300%;
    animation: dc-flux-degrade 16s ease infinite;
}

.dc-kpi-volet-actif {
    opacity: 1;
    pointer-events: auto;
}

/* Les cartes passent AU-DESSUS du fond animé. */
.dc-kpi-volet .dc-kpi-grille {
    position: relative;
    z-index: 1;
}

/* Catégorie 0 « Statut des tâches » — dégradé violet (thème primaire). */
.dc-kpi-volet-0 {
    background-image: linear-gradient(120deg, #6750A4, #9A7FE0, #C7B0FF, #E8DEF8, #B69DF8, #6750A4);
}

/* Catégorie 1 « Vigilance & vie du centre » — dégradé BLEU ÉLECTRIQUE LÉGER (retour PO :
   le vert/teal jurait avec la base violette de l'app ; le bleu, voisin du violet sur la
   roue, s'harmonise tout en distinguant nettement la catégorie). */
.dc-kpi-volet-1 {
    background-image: linear-gradient(120deg, #2F6BE0, #5B8DF5, #8FB4FF, #D3E2FF, #6E9BFF, #2F6BE0);
}

/* Défilement mis en pause (bouton lecture/pause — mécanisme WCAG 2.2.2) : gèle aussi
   le dégradé. prefers-reduced-motion le fige déjà pour qui le demande. */
.dc-kpi-fige .dc-kpi-volet {
    animation-play-state: paused;
}

@keyframes dc-flux-degrade {
    0% {
        background-position: 0% 50%;
    }

    50% {
        background-position: 100% 50%;
    }

    100% {
        background-position: 0% 50%;
    }
}

/* Commandes du carrousel : bouton lecture/pause + points de navigation. */
.dc-kpi-commandes {
    display: flex;
    align-items: center;
    gap: 0.25rem;
}

/* Bouton lecture/pause du défilement automatique (mécanisme WCAG 2.2.2). Cible 44 px. */
.dc-kpi-lecture {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: var(--dc-touch);
    min-height: var(--dc-touch);
    padding: 0;
    border: none;
    background-color: transparent;
    color: var(--dc-primary);
    border-radius: var(--dc-radius-pill);
    cursor: pointer;
    transition: background-color 0.15s ease;
}

.dc-kpi-lecture:hover,
.dc-kpi-lecture:focus-visible {
    background-color: var(--dc-surface-container);
}

/* Bandeau « journée validée / non validée » */
.dc-bandeau-etat {
    border-radius: var(--dc-radius-card);
    padding: 14px;
    border: 2px solid var(--dc-outline);
    background-color: var(--dc-surface-container);
}

.dc-bandeau-etat-valide {
    border-color: var(--dc-done);
    background-color: var(--dc-done-bg);
    color: var(--dc-done);
}

/* ===========================================================================
   Module Portail famille — style « Trust & Authority » + touches chaudes
   « Organic Biophilic » (CLAUDE.md) : tons chaleureux, gros texte, rassurant,
   jamais clinique. Public familial peu technique : cibles >= 44 px partout.
   =========================================================================== */

.dc-famille {
    font-size: 1.06rem;
    line-height: 1.55;
}

.dc-famille-intro {
    color: #5C5248;
    max-width: 46rem;
}

/* Carte chaleureuse (fond crème, bord doux, ombre discrète) */
.dc-famille-carte {
    display: block;
    background-color: #FDF9F1;
    border: 1px solid #E7DCC9;
    border-radius: var(--dc-radius-card);
    padding: 18px;
    color: inherit;
    text-decoration: none;
}

.dc-famille-grille {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
    gap: 12px;
}

.dc-famille-carte-proche {
    display: flex;
    gap: 14px;
    align-items: center;
    min-height: var(--dc-touch);
}

.dc-famille-carte-proche:hover,
.dc-famille-carte-proche:focus {
    border-color: #2F6B4F;
    background-color: #F7F3E8;
    color: inherit;
}

.dc-famille-avatar {
    width: 56px;
    height: 56px;
    background-color: #DDEBE2;
    color: #2F6B4F;
    font-size: 1.2rem;
}

.dc-famille-carte-corps {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
}

.dc-famille-nom {
    font-size: 1.15rem;
    font-weight: 700;
}

.dc-famille-meta {
    font-size: 0.92rem;
    color: #6B6155;
}

.dc-famille-lien {
    color: #2F6B4F;
    font-weight: 600;
}

/* État vide positif (« Journée en cours… ») */
.dc-famille-vide {
    color: #55684F;
    background-color: #EFF4EA;
    border-radius: 12px;
    padding: 10px 14px;
}

/* Bandeau notifications non lues */
.dc-famille-bandeau {
    background-color: #FCECC9;
    color: #7A4F01;
    border: 1px solid #E8C87A;
    border-radius: var(--dc-radius-card);
    padding: 14px 18px;
    text-decoration: none;
    min-height: var(--dc-touch);
}

.dc-famille-bandeau:hover,
.dc-famille-bandeau:focus {
    color: #7A4F01;
    background-color: #F9E2AE;
}

/* Fil de messages */
.dc-famille-fil {
    display: flex;
    flex-direction: column;
    gap: 10px;
}

.dc-famille-message {
    background-color: #F1EDE4;
    border-radius: 14px;
    padding: 10px 14px;
    max-width: 46rem;
}

.dc-famille-message-moi {
    background-color: #DDEBE2;
    margin-left: auto;
}

.dc-famille-notification-lue {
    opacity: 0.75;
}

/* --- Pied de page --- */
.footer {
    /* R4.2 — EN FLUX, poussé en bas de la colonne flex du body (sticky footer). Plus
       de position:absolute (qui l'arrachait du flux et le faisait chevaucher le
       contenu dès que la page approchait la hauteur du viewport — bug PO « Mon
       compte »). Sur page courte (login), margin-top:auto absorbe l'espace libre et
       colle le pied en bas ; sur page longue (listes), il suit simplement le contenu.
       align-items:stretch (défaut de la colonne flex) lui donne toute la largeur —
       plus besoin de width:100%. Le texte s'enroule (pas de nowrap) : filet R2.1
       anti-débordement horizontal conservé. */
    margin-top: auto;
}

/* --- Pied de page : bloc éditeur Pratik Solutions (R5.1) ---
   Logo + mention « © {année} Pratik Solutions Ltd » CENTRÉS et empilables proprement
   sur mobile (flex-wrap). Le container du footer porte .text-center pour les lignes
   de texte ; ce bloc centre l'ensemble logo + copyright. */
.dc-footer-editeur {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
}

.dc-footer-logo {
    max-height: 26px;
    width: auto;
}

/* --- Logo de marque (barre de titre) --- */
.dc-brand-logo {
    height: 28px;
    width: auto;
}

/* --- Splash d'ouverture (PWA installée UNIQUEMENT) ---
   Caché par défaut ; en mode standalone (app installée sur mobile), le logo
   apparaît progressivement puis l'écran s'efface tout seul. Retiré dès le
   deuxième chargement de la session par js/splash.js. Aucun style inline
   (CSP style-src 'self' + garde d'architecture). */
#dc-splash {
    display: none;
}

@media (display-mode: standalone) {
    #dc-splash {
        position: fixed;
        inset: 0;
        z-index: 2000;
        display: flex;
        align-items: center;
        justify-content: center;
        background-color: var(--dc-surface, #FFFBFE);
        pointer-events: none; /* ne bloque jamais un tap, même pendant l'animation */
        animation: dc-splash-sortie 0.4s ease-in 2s forwards;
    }

    #dc-splash img {
        width: min(60vw, 320px);
        height: auto;
        opacity: 0;
        animation: dc-splash-apparition 1.2s ease-out 0.15s forwards;
    }
}

@keyframes dc-splash-apparition {
    to { opacity: 1; }
}

@keyframes dc-splash-sortie {
    to {
        opacity: 0;
        visibility: hidden;
    }
}

/* --- Animations réduites si demandé par l'utilisateur --- */
@media (prefers-reduced-motion: reduce) {
    *,
    *::before,
    *::after {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
        scroll-behavior: auto !important;
    }

    /* Le splash repose sur des animations à délai : sans elles il resterait
       figé à l'écran — on le supprime entièrement en mouvement réduit. */
    #dc-splash {
        display: none;
    }
}
