h1:focus {
    outline: none;
}

.valid.modified:not([type=checkbox]) {
    outline: 1px solid #26b050;
}

.invalid {
    outline: 1px solid #e50000;
}

.validation-message {
    color: #e50000;
}

.blazor-error-boundary {
    background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121;
    padding: 1rem 1rem 1rem 3.7rem;
    color: white;
}

    .blazor-error-boundary::after {
        content: "An error has occurred."
    }

.text-danger {
    color: var(--rz-danger, #f44336);
}

/* Harmonisation des pastilles de statut (RadzenBadge) dans toute l'application (ex : colonne
   "Statut" de Celebrations.razor, badge "Modèle" de Parametrage.razor, statuts de
   Components\Pages\Admin\Utilisateurs.razor) : par défaut Radzen leur donne un padding interne
   minuscule (0.125rem/0.25rem, voir --rz-badge-padding) et AUCUNE marge extérieure, ce qui les
   colle à leurs voisins immédiats dans une cellule de tableau - notamment quand plusieurs badges/
   lignes s'enchaînent. Règle globale, non scopée à un composant, pour que tout badge de statut
   actuel ou futur en bénéficie sans dupliquer ce style à chaque endroit.
   - Les variables --rz-badge-padding/--rz-badge-pill-padding sont surchargées au niveau :root
     (plutôt que le padding directement sur .rz-badge) car ce sont elles que le composant Radzen
     applique en interne - les redéfinir ici agrandit la pastille en largeur ET en hauteur sans
     rien connaître de sa mise en page interne.
   - margin donne un espacement identique haut/bas/gauche/droite (4 valeurs explicites plutôt que
     le raccourci "haut/bas gauche/droite", pour lever toute ambiguïté).
   - vertical-align:middle (au lieu de "top" par défaut) garde le badge centré sur la ligne de
     texte environnante quand une cellule est sur plusieurs lignes. */
:root {
    --rz-badge-padding: 0.4rem 0.9rem;
    --rz-badge-pill-padding: 0.4rem 1.1rem;
}

.rz-badge {
    margin-top: 6px;
    margin-bottom: 6px;
    margin-left: 8px;
    margin-right: 8px;
    font-size: 0.8rem;
    vertical-align: middle;
}

/* Colonnes "Statut" à base de pastilles (Celebrations.razor, Admin\Utilisateurs.razor) : par
   défaut, une cellule RadzenDataGrid tronque son contenu sur une seule ligne
   (.rz-cell-data{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}), ce qui coupait le
   texte ("RÉDACTION TERMIN…") ou masquait des pastilles entières dès que la pastille agrandie
   ci-dessus ne tenait plus sur une ligne. CssClass="lx-statut-cell" sur la colonne (voir ces deux
   fichiers) autorise le retour à la ligne pour que plusieurs pastilles s'empilent proprement au
   lieu d'être coupées. */
.lx-statut-cell .rz-cell-data {
    /* !important nécessaire : Radzen définit .rz-grid-table td .rz-cell-data (2 classes + 1
       élément, plus spécifique que .lx-statut-cell .rz-cell-data seul) - sans lui, cette règle
       ne l'emportait jamais malgré une classe dédiée sur la colonne (constaté en test : la
       colonne restait tronquée sur une ligne). */
    white-space: normal !important;
    overflow: visible !important;
    text-overflow: unset !important;
}

/* Bandeau "An unhandled error has occurred" (élément standard généré par le template Blazor Server) :
   ParoisseLayout.razor et AdminLayout.razor déclarent chacun leur propre copie de ce <div
   id="blazor-error-ui">, en plus de celle de MainLayout.razor - seule cette dernière est masquée par
   défaut (règle scopée dans MainLayout.razor.css, qui ne s'applique donc PAS aux deux autres
   copies). Résultat constaté : sur toutes les pages utilisant ParoisseLayout ou AdminLayout, le
   bandeau restait affiché en permanence dès le chargement, sans qu'aucune erreur ne se soit
   produite (texte affiché "en dur", faute de display:none par défaut). Règle globale et non scopée
   ici : s'applique aux trois copies quel que soit le layout, blazor.server.js reste seul à
   basculer display:block lors d'une véritable erreur de circuit. */
#blazor-error-ui {
    color-scheme: light only;
    background: lightyellow;
    bottom: 0;
    box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
    box-sizing: border-box;
    display: none;
    left: 0;
    padding: 0.6rem 1.25rem 0.7rem 1.25rem;
    position: fixed;
    width: 100%;
    z-index: 1000;
}

    #blazor-error-ui .dismiss {
        cursor: pointer;
        position: absolute;
        right: 0.75rem;
        top: 0.5rem;
    }

/* Impression des aperçus PDF (Celebrations.razor.js) : les pages sont rendues en canvas dans un
   conteneur global #pdf-print-root, hors écran, et démasquées uniquement par ce média print - le
   reste de l'application (mise en page Radzen, splitter, etc.) est masqué pour ne laisser que
   les pages du PDF sur le papier. */
#pdf-print-root {
    position: fixed;
    top: -100000px;
    left: -100000px;
}

@media print {
    body > :not(#pdf-print-root) {
        display: none !important;
    }

    #pdf-print-root {
        position: static;
        display: block;
    }

    #pdf-print-root canvas {
        display: block;
        width: 100%;
        page-break-after: always;
    }

    #pdf-print-root canvas:last-child {
        page-break-after: auto;
    }
}
