/*
 * [cbtp_realisations_portfolio] — pages Réalisations des sous-sites
 * Grille filtrable (spécialisation, multi-sélection) + pagination "Voir plus".
 * Système indépendant du slider Home Groupe (cbtp-group-realisations.css).
 */

.cbtp-portfolio {
    --cbtp-portfolio-gap: 24px;
    --cbtp-portfolio-radius: 16px;
    /* Couleur neutre par défaut : écrasée par les classes d'entité ci-dessous. */
    --cbtp-portfolio-color: #FF4B0B;
    --cbtp-portfolio-rgb: 255, 75, 11;
    width: 100%;
}


/* Couleurs par entité — seule source de vérité, pas de duplication de règles. */

.cbtp-portfolio-maconnerie {
    --cbtp-portfolio-color: #FF4B0B;
    --cbtp-portfolio-rgb: 255, 75, 11;
}

.cbtp-portfolio-signalisation {
    --cbtp-portfolio-color: #F2A000;
    --cbtp-portfolio-rgb: 242, 160, 0;
}

.cbtp-portfolio-impression {
    --cbtp-portfolio-color: #E91E4D;
    --cbtp-portfolio-rgb: 233, 30, 77;
}


/* ------------------------------------------------------------------ */


/* Filtres                                                             */


/* ------------------------------------------------------------------ */

.cbtp-portfolio-filters {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin: 0 0 28px;
    align-items: center;
    justify-content: center;
}

.cbtp-portfolio-filters .cbtp-portfolio-filter {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    border: 1px solid rgba(0, 0, 0, 0.12);
    background: #ffffff;
    border-radius: 999px;
    padding: 10px 16px;
    font-size: 14px;
    line-height: 1.2;
    color: var(--e-global-color-text, #0B2545);
    cursor: pointer;
    transition: background-color .2s ease, border-color .2s ease, color .2s ease, transform .2s ease;
}

.cbtp-portfolio-filters .cbtp-portfolio-filter:hover {
    border-color: var(--cbtp-portfolio-color);
}

.cbtp-portfolio-filters .cbtp-portfolio-filter:focus-visible {
    outline: 2px solid var(--cbtp-portfolio-color);
    outline-offset: 2px;
}


/* Couleur entité UNIQUEMENT sur le filtre réellement actif — aria-pressed="true"
 * est la seule source de vérité (jamais .is-active), jamais appliquée par
 * défaut aux autres filtres. */

.cbtp-portfolio-filters .cbtp-portfolio-filter[aria-pressed="true"] {
    background: var(--cbtp-portfolio-color);
    border-color: var(--cbtp-portfolio-color);
    color: #ffffff;
}

.cbtp-portfolio-filters .cbtp-portfolio-filter-count {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 22px;
    height: 22px;
    padding: 0 6px;
    border-radius: 999px;
    font-size: 12px;
    font-weight: 600;
    color: #ffffff;
    background: var(--cbtp-portfolio-color);
    transition: background-color .2s ease, color .2s ease, transform .2s ease;
}

.cbtp-portfolio-filters .cbtp-portfolio-filter[aria-pressed="true"] .cbtp-portfolio-filter-count {
    color: var(--cbtp-portfolio-color);
    background: #ffffff;
}


/* ------------------------------------------------------------------ */


/* Statut (chargement / résultats) — accessible, discret               */


/* ------------------------------------------------------------------ */

.cbtp-portfolio-status {
    min-height: 20px;
    margin-bottom: 12px;
    font-size: 13px;
    color: #6b6b6b;
}

.cbtp-portfolio-empty {
    padding: 40px 0;
    text-align: center;
    color: #6b6b6b;
}


/* ------------------------------------------------------------------ */


/* Grille — empilement vertical de groupes de 3 réalisations           */


/* ------------------------------------------------------------------ */

.cbtp-portfolio-grid {
    display: flex;
    flex-direction: column;
    gap: var(--cbtp-portfolio-gap);
}

.cbtp-portfolio-card {
    position: relative;
    border-radius: var(--cbtp-portfolio-radius);
    overflow: hidden;
}


/*
 * Un groupe = 1 grande card verticale à gauche + 2 petites cards empilées
 * à droite. La hauteur de la grande card (min-height) doit correspondre à
 * 2 x hauteur des petites cards + le gap entre elles, pour que la grande
 * card et le stack s'alignent visuellement.
 */

.cbtp-portfolio-group {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 14px;
    width: 100%;
}

.cbtp-card-large {
    height: 100%;
    min-height: 560px;
}


/* La grande card doit être entièrement couverte par son image (pas de zone
 * grise résiduelle sous l'image) tout en gardant la hauteur du stack. */

.cbtp-card-large,
.cbtp-card-large .cbtp-portfolio-media {
    height: 100%;
}

.cbtp-card-large .cbtp-portfolio-image {
    width: 100%;
    height: 100% !important;
    object-fit: cover;
}

.cbtp-portfolio-small-stack {
    display: grid;
    grid-template-rows: 1fr 1fr;
    gap: 14px;
}

.cbtp-card-small {
    min-height: 273px;
}


/* Dernier groupe incomplet (fin de liste / après filtre) : layout propre
 * plutôt qu'une case vide dans le stack. */

.cbtp-portfolio-group--solo {
    grid-template-columns: 1fr;
}

.cbtp-portfolio-group--pair .cbtp-portfolio-small-stack {
    grid-template-rows: 1fr;
}

.cbtp-portfolio-media {
    position: relative;
    width: 100%;
    height: 100%;
    border-radius: var(--cbtp-portfolio-radius);
    overflow: hidden;
    background: #eaeaea;
}

.cbtp-portfolio-image {
    display: block;
    width: 100%;
    height: 100% !important;
    object-fit: cover;
}


/* ------------------------------------------------------------------ */


/* Badges spécialisation / tags — état normal, en bas de l'image       */


/* ------------------------------------------------------------------ */

.cbtp-portfolio-normal-meta {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 2;
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 8px;
    padding: 14px;
    background: linear-gradient(to top, rgba(0, 0, 0, 0.45), rgba(0, 0, 0, 0));
    pointer-events: none;
    transition: opacity .3s ease, visibility .3s ease;
}


/* Masquage du meta normal quand l'overlay prend le relais (hover souris ou
 * tap tactile) : voir la section dédiée après .cbtp-portfolio-overlay-meta. */

.cbtp-portfolio-specialisation {
    display: inline-flex;
    align-items: center;
    width: fit-content;
    background: #ffffff;
    color: var(--e-global-color-text, #0B2545);
    border-radius: 999px;
    padding: 6px 12px;
    font-size: 12px;
    font-weight: 600;
    line-height: 1.2;
    white-space: nowrap;
}

.cbtp-portfolio-tags {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: flex-end;
    gap: 6px;
}

.cbtp-portfolio-tags span {
    display: inline-flex;
    align-items: center;
    width: fit-content;
    background: #ffffff;
    color: var(--cbtp-portfolio-color);
    border-radius: 999px;
    padding: 5px 10px;
    font-size: 11px;
    line-height: 1.2;
    white-space: nowrap;
}


/* ------------------------------------------------------------------ */


/* Overlay — couleur de l'entité courante (contenu ouvert)              */


/* ------------------------------------------------------------------ */

.cbtp-portfolio-overlay {
    position: absolute;
    inset: 0;
    z-index: 3;
    display: flex;
    flex-direction: column;
    justify-content: flex-end;
    gap: 12px;
    padding: 14px;
    background: rgba(var(--cbtp-portfolio-rgb), .82);
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transition: opacity .3s ease;
}

.cbtp-portfolio-overlay-description {
    margin: 0;
    color: #ffffff;
    font-size: clamp(13px, 1.1vw, 16px);
    line-height: 1.5;
    overflow: hidden;
    display: -webkit-box;
    -webkit-line-clamp: 5;
    -webkit-box-orient: vertical;
}

.cbtp-portfolio-overlay-description p {
    margin: 0;
}

.cbtp-portfolio-overlay-meta {
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 8px;
}


/* Tags dans l'overlay : rendu différent de l'état normal — pas de pastille
 * blanche, texte blanc directement sur le fond couleur entité. La
 * spécialisation, elle, reste blanc/bleu foncé identique à l'état normal
 * (voir .cbtp-portfolio-specialisation ci-dessus, pas de règle dupliquée ici). */

.cbtp-portfolio-overlay-meta .cbtp-portfolio-tags span {
    background: transparent;
    color: #ffffff;
    border: 0;
    padding: 2px 0;
}


/* ------------------------------------------------------------------ */


/* Révélation de l'overlay — hover souris (desktop) vs tap tactile.
 * Les deux modes sont strictement isolés par media query : un appareil
 * tactile ne peut jamais déclencher l'overlay via :hover/:focus-within,
 * seule la classe .is-open (posée au tap par le JS) le peut. */


/* ------------------------------------------------------------------ */

@media (hover: hover) and (pointer: fine) {
    .cbtp-portfolio-card:hover .cbtp-portfolio-overlay,
    .cbtp-portfolio-card:focus-within .cbtp-portfolio-overlay {
        opacity: 1;
        visibility: visible;
    }

    .cbtp-portfolio-card:hover .cbtp-portfolio-normal-meta,
    .cbtp-portfolio-card:focus-within .cbtp-portfolio-normal-meta {
        opacity: 0;
        visibility: hidden;
    }
}

@media (hover: none), (pointer: coarse) {
    .cbtp-portfolio-card .cbtp-portfolio-overlay {
        opacity: 0;
        visibility: hidden;
        pointer-events: none;
    }

    .cbtp-portfolio-card.is-open .cbtp-portfolio-overlay {
        opacity: 1;
        visibility: visible;
        pointer-events: auto;
    }

    .cbtp-portfolio-card.is-open .cbtp-portfolio-normal-meta {
        opacity: 0;
        visibility: hidden;
    }
}


/* Description sous l'image : n'existe plus visuellement, la description
 * ne vit désormais que dans l'overlay (hover souris ou tap tactile). */

.cbtp-portfolio-mobile-description {
    display: none !important;
}


/* ------------------------------------------------------------------ */


/* Bouton Voir plus                                                     */


/* ------------------------------------------------------------------ */

.cbtp-portfolio-actions {
    display: flex;
    justify-content: center;
    margin-top: 32px;
}

.cbtp-portfolio-load-more {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
    border: 1px solid var(--cbtp-portfolio-color);
    background: transparent;
    color: var(--cbtp-portfolio-color);
    border-radius: 999px;
    padding: 12px 28px;
    font-size: 14px;
    font-weight: 600;
    cursor: pointer;
    transition: background-color .2s ease, color .2s ease;
}

.cbtp-portfolio-load-more:hover {
    background: var(--cbtp-portfolio-color);
    color: #ffffff;
}

.cbtp-portfolio-load-more:focus-visible {
    outline: 2px solid var(--cbtp-portfolio-color);
    outline-offset: 3px;
}

.cbtp-portfolio-load-more:disabled {
    opacity: .6;
    cursor: not-allowed;
}

.cbtp-portfolio-load-more-icon {
    flex: 0 0 auto;
}

.cbtp-portfolio-load-more.is-hidden,
.cbtp-portfolio-load-more[hidden] {
    display: none;
}


/* ------------------------------------------------------------------ */


/* Responsive                                                           */


/* ------------------------------------------------------------------ */


/* > 767px : layout desktop/tablette large inchangé (1 grande card + 2
 * petites empilées) — seules les hauteurs sont réduites sous 1024px. */

@media screen and (max-width: 1024px) {
    .cbtp-card-large {
        min-height: 420px;
    }
    .cbtp-card-small {
        min-height: 203px;
    }
}


/* 568px à 767px : 2 cards par ligne. Les 3 cards d'un groupe participent à
 * la même grille — le stack est "aplati" via display:contents, plus de
 * grande card verticale artificielle sur ces breakpoints. */

@media screen and (max-width: 767px) {
    .cbtp-portfolio {
        --cbtp-portfolio-gap: 16px;
    }

    /* Filtres : jamais forcés sur plusieurs lignes sur petit écran — une
     * seule ligne qui défile horizontalement (scrollbar masquée, scroll
     * natif conservé). */
    .cbtp-portfolio-filters {
       /* flex-wrap: nowrap;
        overflow-x: auto;
        justify-content: flex-start;
        -webkit-overflow-scrolling: touch;
        scrollbar-width: none;
        -ms-overflow-style: none;*/
    }

    .cbtp-portfolio-filters::-webkit-scrollbar {
        /*display: none;
        height: 0;*/
    }

    .cbtp-portfolio-filters .cbtp-portfolio-filter {
        flex: 0 0 auto;
        width: max-content;
    }

    .cbtp-portfolio-group,
    .cbtp-portfolio-group--solo,
    .cbtp-portfolio-group--pair {
        display: grid;
        /*grid-template-columns: repeat(2, minmax(0, 1fr));*/
        gap: 12px;
    }

    .cbtp-portfolio-small-stack {
        display: contents;
    }

    .cbtp-card-large,
    .cbtp-card-small {
        min-height: 0;
        height: auto;
    }

    /* width/height/object-fit de l'image sont déjà garantis en toutes
     * circonstances par la règle .cbtp-portfolio-image de base — seul
     * l'aspect-ratio change ici pour des cards carrées et identiques. */
    .cbtp-portfolio-media {
        width: 100%;
        aspect-ratio: 1 / 1;
        height: auto;
    }

    /* Cards plus petites en grille 2 colonnes : on adapte uniquement la
     * typo/le padding de l'overlay, jamais sa logique ni ses couleurs. */
    .cbtp-portfolio-overlay {
        padding: 10px;
        gap: 7px;
    }

    .cbtp-portfolio-overlay-description {
        font-size: clamp(10px, 2.8vw, 13px);
        line-height: 1.25;
        -webkit-line-clamp: 4;
    }

    .cbtp-portfolio-specialisation {
        font-size: 9px;
        padding: 4px 7px;
    }

    .cbtp-portfolio-tags {
        gap: 4px;
    }

    .cbtp-portfolio-tags span {
        font-size: 8px;
        padding: 3px 5px;
    }
}


/* <= 567px : 1 card par ligne, pleine largeur. Hérite de tous les réglages
 * du palier 568-767px ci-dessus (gap, aspect-ratio, overlay) — seule la
 * grille passe à 1 colonne. */

@media screen and (max-width: 567px) {
    .cbtp-portfolio-group,
    .cbtp-portfolio-group--solo,
    .cbtp-portfolio-group--pair {
        grid-template-columns: 1fr;
    }
}

/* =========================================================
   Animation changement de filtres — sortie / entrée avec spring léger
   ========================================================= */

/* Sortie : l'ancienne grille s'efface (~220ms), indépendamment de la durée
   de la requête réseau qui tourne en parallèle. */
.cbtp-portfolio-grid.is-filter-exiting {
    animation: cbtpFilterOut .22s cubic-bezier(.4, 0, 1, 1) both;
}

/* Entrée : chaque nouveau groupe apparaît avec un léger effet ressort.
   Le décalage entre groupes (stagger) est fourni par le JS via
   --cbtp-enter-delay ; le fill-mode "both" garde le groupe invisible
   pendant ce délai, avant que l'animation ne démarre réellement. */
.cbtp-portfolio-group.is-filter-entering {
    animation: cbtpFilterIn .62s cubic-bezier(.22, 1, .36, 1) both;
    animation-delay: var(--cbtp-enter-delay, 0ms);
}

@keyframes cbtpFilterOut {
    0% {
        opacity: 1;
        transform: translateY(0) scale(1);
    }

    100% {
        opacity: 0;
        transform: translateY(-14px) scale(.975);
    }
}

@keyframes cbtpFilterIn {
    0% {
        opacity: 0;
        transform: translateY(26px) scale(.96);
    }

    60% {
        opacity: 1;
        transform: translateY(-4px) scale(1.01);
    }

    82% {
        transform: translateY(2px) scale(.997);
    }

    100% {
        opacity: 1;
        transform: translateY(0) scale(1);
    }
}


/* Accessibilité : pas d'animation complexe, contenu remplacé immédiatement,
   aucune transformation résiduelle. */
@media (prefers-reduced-motion: reduce) {

    .cbtp-portfolio-grid.is-filter-exiting,
    .cbtp-portfolio-group.is-filter-entering {
        animation: none !important;
        opacity: 1 !important;
        transform: none !important;
    }
}


/* Jusqu'à 566px : garder le layout desktop/tablette */
@media screen and (min-width: 566px) {
    .cbtp-portfolio-group {
        grid-template-columns: 1fr 1fr;
    }

    .cbtp-portfolio-small-stack {
        display: grid;
        grid-template-rows: 1fr 1fr;
    }
}

/* Mobile réel */
@media screen and (max-width: 565px) {
    .cbtp-portfolio-group {
        grid-template-columns: 1fr;
        gap: 14px;
    }

    .cbtp-portfolio-small-stack {
        display: grid;
        grid-template-rows: none;
        gap: 14px;
    }

    .cbtp-card-large,
    .cbtp-card-small {
        min-height: 0;
        height: auto;
    }

    .cbtp-portfolio-media {
        aspect-ratio: 4 / 3;
        height: auto;
    }
}