/* assets/styles/tikom-app.css — Design system Tikom (espace connecté + auth).
 *
 * Appliqué via <body class="tk-app"> dans base.html.twig.
 * N'est PAS chargé sur la landing (qui extend base_clean.html.twig).
 *
 * IMPORTANT — Cascade volontaire : plusieurs des variables CSS définies ici
 * (--tk-bg, --tk-surface, --tk-ink, --tk-line, --tk-hover) portent le même
 * nom que des variables déjà définies par assets/styles/bootstrap-custom.css
 * (qui pose la palette dark/light historique sur :root et :root[data-theme=light]).
 *
 * Comme .tk-app vit sur <body>, plus profond dans l'arbre que :root, ses
 * valeurs gagnent la cascade pour tous les descendants. C'est intentionnel :
 * la V2 (cf. spec 2026-06-02-espace-animateur-v2-design.md) rebrand TOUT
 * le site connecté avec cette palette claire, à l'exception de la landing.
 *
 * Conséquence : le thème sombre historique de bootstrap-custom.css ne
 * s'applique plus aux pages authentifiées. Si on veut conserver un dark
 * mode V2, il faudra ajouter un sélecteur dédié (ex. .tk-app[data-theme=dark]).
 */

@font-face {
    font-family: 'Plus Jakarta Sans';
    src: url("../fonts/Plus_Jakarta_Sans/PlusJakartaSans-VariableFont_wght-DMZAve_.ttf") format('truetype');
    font-weight: 200 800;
    font-style: normal;
    font-display: swap;
}

.tk-app {
    /* Force le rendu clair des contrôles natifs même si data-theme n'est pas posé (défensif, futur dark mode). */
    color-scheme: light;
    --tk-bg: #f3f4f6;
    --tk-surface: #ffffff;
    --tk-ink: #1b1d22;
    --tk-muted: #6a6f78;
    --tk-faint: #9aa0a8;
    --tk-line: #e6e8ec;
    --tk-line-strong: #d6d9df;
    --tk-hover: #f2f4f7;
    /* Accent de l'espace connecté : dérive de --tk-brand (défini sur :root par
       bootstrap-custom.css, hérité ici). Source unique partagée avec --tk-amber*. */
    --tk-accent: var(--tk-brand);
    --tk-accent-ink: #ffffff;
    --tk-accent-2: color-mix(in srgb, var(--tk-brand), #fff 16%);
    --tk-accent-soft: color-mix(in srgb, var(--tk-brand), #fff 90%);
    /* Orange fonctionnel — indépendant de l'accent (resté noir). Réservé au
       palier orange de la barre de score. */
    --tk-orange: #df8a0c;
    --tk-orange-2: #eaa53a;
    /* Bleu plein — état « disponible » des grilles de disponibilités (fiche + espace). */
    --tk-blue: #0071e3;
    --tk-ok: #1f9d63;
    --tk-ok-soft: #e7f5ee;
    --tk-alert: #e23a6b;
    --tk-alert-soft: #fdeaf0;
    /* Rouge agressif — alerte « profil non visible » (sidebar espace animateur). */
    --tk-danger: #dc2626;
    --tk-danger-rgb: 220, 38, 38;
    /* Info — encarts d'aide / d'information (ex. modale « Partager par mail »). */
    --tk-info: #2563eb;
    --tk-info-soft: #e8effd;
    --tk-ring: rgba(var(--tk-brand-rgb), .16);
    --tk-chip-bg: color-mix(in srgb, var(--tk-brand), #fff 88%);
    --tk-chip-ink: color-mix(in srgb, var(--tk-brand), #000 28%);
    --tk-chip-line: color-mix(in srgb, var(--tk-brand), #fff 74%);
    --tk-cell-off: #eef0f3;
    --tk-display: 'Plus Jakarta Sans', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
    /* Anciennement une pile monospace système. Aucune police mono n'étant
       chargée, le rendu retombait sur la mono de l'OS (Liberation Mono sous
       Linux), incohérent avec le reste du site. On aligne ces libellés sur
       Plus Jakarta Sans : le cachet « étiquette » vient du letter-spacing /
       uppercase, plus de la chasse fixe. */
    --tk-mono: var(--tk-display);
    --tk-shadow-pop: 0 14px 40px rgba(20, 24, 32, .16);
    /* Ombre douce des cards de contenu (panneaux espace marque / animateur). */
    --tk-shadow-card: 0 1px 2px rgba(20, 15, 10, .04), 0 20px 44px -28px rgba(20, 15, 10, .30);

    background: var(--tk-bg);
    color: var(--tk-ink);
    font-family: var(--tk-display);
    font-size: 16px;
    line-height: 1.5;
    -webkit-font-smoothing: antialiased;
    text-rendering: optimizeLegibility;
}

.tk-app * { box-sizing: border-box; }
.tk-app a { color: var(--tk-accent); text-decoration: none; }
.tk-app a:hover { text-decoration: underline; }
/* Les boutons-liens (<a class="btn">) doivent garder la couleur Bootstrap du bouton, pas l'orange des liens. */
.tk-app a.btn { color: var(--bs-btn-color); }
/* Boutons-liens (<a class="tk-btn …">) : ne pas hériter de la couleur/soulignement des liens. */
.tk-app a.tk-btn { text-decoration: none; }
.tk-app a.tk-btn:hover { text-decoration: none; }
.tk-app a.tk-btn-primary { color: var(--tk-btn-gradient-ink); }
.tk-app a.tk-btn-success { color: #fff; }
.tk-app a.tk-btn-danger { color: #fff; }
.tk-app a.tk-btn-ghost { color: var(--tk-muted); }
.tk-app h1, .tk-app h2, .tk-app h3 { margin: 0; letter-spacing: -0.01em; }
.tk-app input, .tk-app textarea, .tk-app select, .tk-app button { font-family: inherit; }

/* Cards génériques */
.tk-card {
    background: var(--tk-surface);
    border: 1px solid var(--tk-line);
    border-radius: 14px;
    padding: 26px;
}

/* Boutons */
.tk-btn {
    font-family: var(--tk-mono);
    font-size: 11px;
    letter-spacing: .04em;
    text-transform: uppercase;
    border: none;
    border-radius: 8px;
    padding: 8px 14px;
    cursor: pointer;
    font-weight: 600;
    transition: filter .15s, background .15s;
}
.tk-btn-primary {
    background: var(--tk-btn-gradient);
    color: var(--tk-btn-gradient-ink);
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.30),
                var(--tk-btn-gradient-shadow);
}
.tk-btn-primary:hover { filter: brightness(1.04); }
.tk-btn-primary:disabled {
    background: var(--tk-hover);
    color: var(--tk-faint);
    box-shadow: none;
    cursor: not-allowed;
    filter: none;
}
.tk-btn-ghost { background: transparent; color: var(--tk-muted); }
.tk-btn-ghost:hover { background: var(--tk-hover); }

/* Inputs */
.tk-input {
    width: 100%;
    background: var(--tk-surface);
    border: 1.5px solid var(--tk-line);
    border-radius: 10px;
    padding: 11px 13px;
    font-size: 15px;
    color: var(--tk-ink);
    outline: none;
    transition: border-color .15s, box-shadow .15s;
}
.tk-input:focus { border-color: var(--tk-accent); box-shadow: 0 0 0 4px var(--tk-ring); }
.tk-input::placeholder { color: var(--tk-faint); }
/* Champs dans les cartes du profil animateur : police réduite + textarea scrollable */
.tk-card .tk-input { font-size: 13px; }
.tk-card textarea.tk-input { max-height: 110px; overflow-y: auto; resize: none; }

/* Labels mono uppercase */
.tk-label {
    font-family: var(--tk-mono);
    font-size: 10.5px;
    letter-spacing: .1em;
    text-transform: uppercase;
    color: var(--tk-faint);
    display: block;
    margin-bottom: 7px;
}

/* Chips */
.tk-chip {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    border-radius: 999px;
    padding: 7px 13px;
    font-size: 13.5px;
    font-weight: 500;
    background: var(--tk-chip-bg);
    color: var(--tk-chip-ink);
    border: 1px solid var(--tk-chip-line);
}

/* Focus accessibility */
.tk-app *:focus-visible {
    outline: 2px solid var(--tk-accent);
    outline-offset: 2px;
}

/* ─── V2 Dashboard layout & cards ─────────────────────────────
 * Styles spécifiques au nouveau dashboard animateur V2 :
 * grille main + sidebar, cartes, identité, toggles, chips,
 * disponibilité, ville, TikTok et sidebar (visibilité/RDV/score).
 */

/* ─── Layout dashboard ───────────────────────────────────────── */
.tk-page { min-height: 100vh; background: var(--tk-bg); }
.tk-shell { max-width: none; margin: 0; padding: 0 40px; }
/* Modificateur : remet le contenu en container centré (page /espace/animateur) */
.tk-shell--contained { max-width: 1280px; margin-inline: auto; }
@media (max-width: 576px) {
    .tk-shell { padding: 0 15px; }
    .tk-topbar-inner { padding: 0 15px; }
}

/* Aperçu TikTok rendu sous le champ « Compte TikTok » du dashboard. */
.tk-tiktok-preview:not(:empty) { margin-top: 14px; }
.tk-tiktok-preview .tk-tiktok-embed { margin: 0; max-width: 100%; min-width: 0; }

/* ─── Stat chiffre (header espace marque) ───────────────────── */
.tk-stat {
    font-size: 36px; font-weight: 800; line-height: 1;
    letter-spacing: -0.03em; color: var(--tk-ink);
}

.tk-topbar {
    background: var(--tk-surface); border-bottom: 1px solid var(--tk-line);
    position: sticky; top: 0; z-index: 20;
}
.tk-topbar-inner {
    max-width: none; margin: 0; padding: 0 40px;
    height: 64px; display: flex; align-items: center; justify-content: space-between;
}
.tk-nav-logout { display: inline; margin: 0; }
.tk-nav form { display: inline; margin: 0; }
.tk-logo { font-weight: 800; font-size: 21px; letter-spacing: -0.02em; color: var(--tk-ink); }
.tk-logo span { color: var(--tk-accent); font-size: 14px; margin-left: 1px; }
.tk-nav { display: flex; align-items: center; gap: 20px; font-size: 14px; color: var(--tk-muted); }
.tk-nav a { color: inherit; text-decoration: none; }
.tk-nav a:hover { color: var(--tk-ink); }
.tk-nav-active { color: var(--tk-accent) !important; font-family: var(--tk-mono); font-size: 12px; letter-spacing: .04em; }

.tk-grid {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 340px;
    gap: 22px; padding: 26px 0 70px;
    align-items: start;
}
.tk-main { display: flex; flex-direction: column; gap: 18px; min-width: 0; }
.tk-aside { display: flex; flex-direction: column; gap: 16px; position: sticky; top: 84px; }

@media (max-width: 880px) {
    .tk-grid { grid-template-columns: 1fr; }
    .tk-aside { position: static; order: -1; }
}

/* ─── Bandeau de pré-ouverture (pleine largeur, haut de page) ─── */
.tk-preopening {
    display: flex; align-items: center; gap: 16px;
    margin-top: 26px; padding: 16px 20px; border-radius: 14px;
    border: 1px solid var(--tk-accent-2);
    background: linear-gradient(135deg, var(--tk-accent-soft), var(--tk-surface));
}
.tk-preopening-emoji { font-size: 30px; line-height: 1; flex-shrink: 0; }
.tk-preopening-title { margin: 0 0 4px; font-weight: 800; font-size: 15px; }
.tk-preopening-text { margin: 0; font-size: 13.5px; color: var(--tk-muted); line-height: 1.5; }

/* ─── Cards ─────────────────────────────────────────────────── */
.tk-card-muted { background: var(--tk-hover); }
.tk-group { padding-bottom: 22px; margin-bottom: 22px; border-bottom: 1px solid var(--tk-line); }
.tk-group:last-child { border-bottom: none; padding-bottom: 0; margin-bottom: 0; }
.tk-group-title { font-size: 16px; font-weight: 700; margin: 0 0 4px; }
.tk-group-hint { font-size: 13px; color: var(--tk-muted); margin: 0 0 14px; max-width: 560px; }

/* ─── Identité ──────────────────────────────────────────────── */
.tk-identity-row { display: flex; align-items: center; gap: 18px; }
.tk-avatar-wrap { position: relative; width: 84px; height: 84px; flex: 0 0 auto; }
/* Avatar cliquable (bouton) : un clic déclenche l'upload de photo. */
.tk-avatar {
    position: relative;
    width: 84px; height: 84px; border-radius: 50%; overflow: hidden;
    display: flex; align-items: center; justify-content: center;
    background: linear-gradient(140deg, #3a3d44, #1b1d22);
    color: #fff; font-weight: 700; font-size: 30px;
    border: 2px solid var(--tk-surface); box-shadow: 0 2px 10px rgba(0, 0, 0, 0.10);
    padding: 0; cursor: pointer; font-family: inherit;
    transition: border-color .15s, box-shadow .15s;
}
.tk-avatar:hover { border-color: var(--tk-accent); box-shadow: 0 2px 14px rgba(0, 0, 0, 0.16); }
.tk-avatar:focus-visible { outline: 2px solid var(--tk-accent); outline-offset: 2px; }
.tk-avatar img, .tk-avatar-img { width: 100%; height: 100%; object-fit: cover; }
/* Placeholder « + » quand aucune photo. */
.tk-avatar-add { font-size: 42px; font-weight: 300; line-height: 1; color: rgba(255, 255, 255, 0.9); }
/* Voile + icône au survol/focus d'une photo existante : signale que c'est cliquable. */
.tk-avatar-overlay {
    position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
    background: rgba(0, 0, 0, 0.42); font-size: 22px; opacity: 0; transition: opacity .15s;
}
.tk-avatar:hover .tk-avatar-overlay,
.tk-avatar:focus-visible .tk-avatar-overlay { opacity: 1; }
.tk-identity-name { font-size: 24px; font-weight: 800; letter-spacing: -0.02em; }
.tk-identity-sub { display: flex; gap: 14px; margin-top: 6px; color: var(--tk-muted); font-size: 13.5px; flex-wrap: wrap; }
.tk-dot { width: 3px; height: 3px; border-radius: 3px; background: var(--tk-faint); align-self: center; }

/* ─── Inline edit ───────────────────────────────────────────── */
/* Affordance : le champ ressemble à un input bordé avec un libellé « Modifier ✎ »
   (rendu en CSS) pour montrer qu'il est éditable. Le clic ouvre le vrai champ. */
.tk-editable {
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 10px;
    padding: 10px 12px;
    border: 1.5px solid var(--tk-line);
    border-radius: 10px;
    background: var(--tk-surface);
    transition: border-color .15s, background .15s;
    /* Anti-débordement : autorise le rétrécissement dans la grille et casse les
       valeurs longues insécables (e-mails) au lieu de pousser la largeur. */
    min-width: 0;
    overflow-wrap: anywhere;
}
.tk-editable:hover { background: var(--tk-hover); border-color: var(--tk-accent); }
.tk-editable [data-placeholder] { color: var(--tk-faint); font-style: italic; }
.tk-editable::after {
    content: "Modifier ✎";
    flex-shrink: 0;
    font-family: var(--tk-mono);
    font-size: 10.5px;
    letter-spacing: .04em;
    color: var(--tk-faint);
    background: var(--tk-hover);
    border-radius: 6px;
    padding: 3px 7px;
}
.tk-editable:hover::after { color: var(--tk-accent); }
/* Bio (multi-ligne) : le hint passe en haut à droite. En affichage (non focus),
   on borne la hauteur et on scrolle comme un textarea pour éviter un bloc géant. */
.tk-editable-block {
    display: block; white-space: pre-wrap; position: relative; padding-right: 88px;
    max-height: 110px; overflow-y: auto;
}
.tk-editable-block::after { position: absolute; top: 8px; right: 8px; }
/* En édition : le vrai champ occupe toute la largeur, on retire la bordure
   factice et le libellé « Modifier ». */
.tk-editable:has(input.tk-input),
.tk-editable:has(textarea.tk-input) { display: block; padding: 0; border: none; background: transparent; }
.tk-editable:has(input.tk-input)::after,
.tk-editable:has(textarea.tk-input)::after { content: none; }
.tk-input-error { border-color: var(--tk-alert); }
.tk-field-error { margin: 6px 0 0; font-family: var(--tk-mono); font-size: 11px; color: var(--tk-alert); }
.tk-siret-status { margin: 6px 0 0; }
.tk-siret-ok { font-family: var(--tk-mono); font-size: 12.5px; color: var(--tk-ok); font-weight: 600; }

/* ─── Toggle card grid ──────────────────────────────────────── */
.tk-toggle-grid { display: grid; gap: 10px; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); }
.tk-toggle-card {
    padding: 18px 12px; border-radius: 12px; border: 1.5px solid var(--tk-line);
    background: var(--tk-surface); cursor: pointer; display: flex; flex-direction: column;
    align-items: center; gap: 8px; transition: all .14s;
}
.tk-toggle-card:hover { border-color: var(--tk-accent-2); }
.tk-toggle-card.tk-card-on { border-color: var(--tk-accent); background: var(--tk-accent-soft); }
.tk-toggle-emoji { font-size: 28px; line-height: 1; }
.tk-toggle-label { font-size: 13.5px; font-weight: 500; }

/* ─── Rayon de déplacement (conditionnel : Sur site / Les deux) ── */
.tk-travel { margin-top: 14px; padding-top: 14px; border-top: 1px dashed var(--tk-line); display: flex; flex-direction: column; gap: 12px; }
.tk-travel[hidden] { display: none; }
.tk-travel-check { display: flex; align-items: center; gap: 9px; cursor: pointer; font-size: 14px; }
.tk-travel-check input { width: 17px; height: 17px; accent-color: var(--tk-accent); cursor: pointer; }
.tk-travel-radius[hidden] { display: none; }
.tk-input-affix { position: relative; max-width: 220px; }
.tk-input-affix .tk-input { padding-right: 44px; }
.tk-input-suffix {
    position: absolute; right: 13px; top: 50%; transform: translateY(-50%);
    color: var(--tk-faint); font-family: var(--tk-mono); font-size: 13px; pointer-events: none;
}

/* ─── Chips ─────────────────────────────────────────────────── */
.tk-chip-list { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 8px; }
.tk-chip-x { border: none; background: transparent; cursor: pointer; opacity: .55; font-size: 14px; }
.tk-chip-x:hover { opacity: 1; }
.tk-chip-add { background: transparent; border: 1px dashed var(--tk-line); color: var(--tk-muted);
    border-radius: 999px; padding: 7px 13px; cursor: pointer; font-size: 13px; }
.tk-chip-add:hover { border-color: var(--tk-accent); color: var(--tk-accent); }
.tk-pop {
    background: var(--tk-surface); border: 1px solid var(--tk-line); border-radius: 14px;
    box-shadow: var(--tk-shadow-pop); padding: 6px; max-height: 280px; overflow: auto; margin-top: 6px;
}
.tk-pop-opt { display: block; width: 100%; padding: 10px 12px; border-radius: 10px;
    background: transparent; border: none; cursor: pointer; font-size: 14px; text-align: left; }
.tk-pop-opt:hover { background: var(--tk-hover); }
.tk-pop-empty { padding: 10px 12px; color: var(--tk-faint); font-size: 13px; }

/* ─── Availability ──────────────────────────────────────────── */
.tk-availability-grid {
    display: grid; grid-template-columns: 80px repeat(7, 1fr); gap: 6px; align-items: center;
}
.tk-availability-day, .tk-availability-slot {
    text-align: center; font-family: var(--tk-mono); font-size: 10.5px;
    color: var(--tk-muted); text-transform: uppercase;
}
.tk-cell {
    height: 34px; border-radius: 9px; cursor: pointer; user-select: none;
    border: 1px solid var(--tk-line); background: var(--tk-cell-off);
    transition: background .14s, transform .1s;
}
.tk-cell:active { transform: scale(.94); }
.tk-cell.tk-cell-on { background: var(--tk-blue); border-color: var(--tk-blue); }
.tk-availability-counter { margin-top: 12px; font-family: var(--tk-mono); font-size: 11px; color: var(--tk-muted); }

/* Variante lecture seule (fiche admin) : grille non interactive. */
.tk-availability-ro .tk-cell { cursor: default; pointer-events: none; }

/* Scroll horizontal si la grille déborde (petit écran < ~480px). */
.tk-availability-card { overflow-x: auto; -webkit-overflow-scrolling: touch; }
.tk-availability-grid { min-width: 340px; }

/* ─── Personal (privé) ──────────────────────────────────────── */
.tk-personal-head { display: flex; justify-content: space-between; align-items: center; gap: 12px; margin-bottom: 16px; flex-wrap: wrap; }
.tk-badge-private {
    font-family: var(--tk-mono); font-size: 10.5px; letter-spacing: .06em; text-transform: uppercase;
    color: var(--tk-muted); background: var(--tk-surface); border: 1px solid var(--tk-line);
    border-radius: 999px; padding: 5px 11px;
}
.tk-personal-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 20px; }
@media (max-width: 560px) { .tk-personal-grid { grid-template-columns: minmax(0, 1fr); } }

/* ─── City picker ───────────────────────────────────────────── */
.tk-city-search {
    display: flex; align-items: center; gap: 10px; border: 1.5px solid var(--tk-line);
    border-radius: 10px; padding: 11px 13px; background: var(--tk-surface); margin-bottom: 12px;
}
.tk-city-search:focus-within { border-color: var(--tk-accent); box-shadow: 0 0 0 4px var(--tk-ring); }
.tk-input-naked { border: none; padding: 0; background: transparent; flex: 1; }
.tk-input-naked:focus { box-shadow: none; }
/* Un peu d'air entre l'icône 📍 et le texte saisi (sinon collé à gauche). */
.tk-city-search .tk-input-naked { padding-left: 4px; }
.tk-suggest {
    list-style: none; padding: 6px; margin: 0; background: var(--tk-surface);
    border: 1px solid var(--tk-line); border-radius: 14px; box-shadow: var(--tk-shadow-pop);
    max-height: 280px; overflow: auto;
}
.tk-suggest li { padding: 10px 12px; border-radius: 10px; cursor: pointer; }
.tk-suggest li:hover { background: var(--tk-hover); }
.tk-map { height: 220px; border-radius: 12px; overflow: hidden; border: 1px solid var(--tk-line); }
.tk-attr { font-family: var(--tk-mono); font-size: 9.5px; color: var(--tk-faint); margin-top: 6px; }
.tk-faint { color: var(--tk-faint); }
.tk-hint { font-family: var(--tk-mono); font-size: 10.5px; color: var(--tk-faint); text-transform: uppercase; }

/* ─── TikTok videos ─────────────────────────────────────────── */
/* Barre bordée (icône 🔗 + champ + bouton) pour que l'input se lise comme un champ. */
.tk-tiktok-input {
    display: flex; align-items: center; gap: 8px; margin-bottom: 16px;
    border: 1.5px solid var(--tk-line); border-radius: 10px;
    padding: 6px 6px 6px 13px; background: var(--tk-surface);
}
.tk-tiktok-input:focus-within { border-color: var(--tk-accent); box-shadow: 0 0 0 4px var(--tk-ring); }
.tk-tiktok-input > span { color: var(--tk-faint); }
.tk-tiktok-input .tk-btn { flex-shrink: 0; }
.tk-tiktok-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 14px; }
.tk-tiktok-card { position: relative; border-radius: 12px; overflow: hidden; border: 1px solid var(--tk-line); background: #000; aspect-ratio: 9 / 16; }
.tk-tiktok-card iframe { width: 100%; height: 100%; border: none; }
.tk-tiktok-remove {
    position: absolute; top: 8px; right: 8px; width: 28px; height: 28px; border-radius: 8px;
    border: none; cursor: pointer; background: rgba(20, 20, 24, .62); color: #fff;
}

/* ─── Video preview / empty ─────────────────────────────────── */
.tk-video-preview { border-radius: 12px; overflow: hidden; }
.tk-video-preview video { width: 100%; display: block; }
.tk-video-empty {
    border: 1.5px dashed var(--tk-line); border-radius: 12px; padding: 26px;
    text-align: center; color: var(--tk-muted); font-size: 13.5px;
}

/* ─── Carte identité : lien « Voir mon profil » (aperçu public) ──── */
/* Lien discret en haut à droite de la carte. Sélecteur à deux classes pour
   battre `.tk-app a` (sinon la couleur d'accent l'emporterait). */
.tk-identity-preview {
    margin-left: auto; align-self: flex-start;
    display: inline-flex; align-items: center; gap: 7px;
    font-size: 13px; font-weight: 600; white-space: nowrap;
}
.tk-app a.tk-identity-preview { color: var(--tk-muted); }
.tk-app a.tk-identity-preview:hover { color: var(--tk-ink); }
.tk-identity-preview i { font-size: 15px; }

/* ─── Identité : layout mobile ──────────────────────────────── */
@media (max-width: 640px) {
    .tk-identity-row {
        flex-direction: column;
        align-items: center;
        text-align: center;
        gap: 10px;
    }
    .tk-identity-preview {
        order: -1;
        margin-left: 0;
        align-self: center;
    }
    .tk-identity-meta { text-align: center; }
    .tk-identity-sub { justify-content: center; }
}

/* ─── Sidebar : visibilité ──────────────────────────────────── */
/* État « non visible » : rouge agressif (bordure épaisse + halo pulsé) pour
   pousser à compléter le profil. La variante .is-on (vert) reste prête pour un
   éventuel signal positif « profil visible ». */
.tk-visibility { border-radius: 14px; overflow: hidden; border: 2px solid var(--tk-danger); box-shadow: 0 0 0 4px rgba(var(--tk-danger-rgb), .12); }
.tk-visibility.is-on { border-color: var(--tk-ok); box-shadow: none; }
.tk-visibility-head { display: flex; align-items: center; gap: 8px; background: var(--tk-danger); color: #fff; padding: 14px 18px; font-weight: 800; font-size: 14px; letter-spacing: .01em; }
.tk-visibility.is-on .tk-visibility-head { background: var(--tk-ok); font-weight: 700; }
.tk-visibility-body { background: var(--tk-surface); padding: 13px 18px; font-size: 13px; color: var(--tk-muted); }
@media (prefers-reduced-motion: no-preference) {
    .tk-visibility:not(.is-on) { animation: tk-visibility-pulse 1.8s ease-in-out infinite; }
    @keyframes tk-visibility-pulse {
        0%, 100% { box-shadow: 0 0 0 0 rgba(var(--tk-danger-rgb), .30); }
        50%      { box-shadow: 0 0 0 7px rgba(var(--tk-danger-rgb), 0); }
    }
}

/* ─── Sidebar : RDV ─────────────────────────────────────────── */
.tk-rdv.is-unlocked { border-color: var(--tk-ok); background: var(--tk-ok-soft); }
.tk-rdv header { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; font-weight: 700; font-size: 14.5px; }
.tk-rdv-hint { font-size: 13.5px; color: var(--tk-muted); margin: 0 0 14px; }
.tk-rdv .tk-btn { width: 100%; padding: 13px; border-radius: 10px; font-size: 14px; }
/* Mobile : barre inline compacte — icône + titre | bouton sur une ligne. */
@media (max-width: 880px) {
    .tk-rdv {
        position: fixed; left: 0; right: 0; bottom: 0; z-index: 30;
        margin: 0; border-radius: 14px 14px 0 0;
        box-shadow: 0 -6px 24px rgba(0, 0, 0, .12);
        display: flex; align-items: center; gap: 12px; padding: 12px 16px;
    }
    .tk-rdv header { display: none; }
    .tk-rdv-hint { display: none; }
    .tk-rdv .tk-btn { width: 100%; padding: 10px 14px; font-size: 13px; }
    .tk-page { padding-bottom: 72px; }
}

/* ─── Sidebar : score ───────────────────────────────────────── */
.tk-score-head { display: flex; justify-content: space-between; margin-bottom: 12px; font-weight: 700; }
.tk-score-pct { font-family: var(--tk-mono); }
.tk-score-bar { height: 8px; border-radius: 5px; background: var(--tk-line); overflow: hidden; margin-bottom: 16px; }
.tk-score-bar > div { height: 100%; transition: width .9s cubic-bezier(.2,.8,.2,1); }
.tk-score-list { list-style: none; padding: 0; margin: 0; }
.tk-score-list li { display: flex; align-items: center; gap: 10px; padding: 9px 0; border-top: 1px solid var(--tk-line); font-size: 14px; }
.tk-score-list li:first-child { border-top: none; }
.tk-score-list li.is-done .tk-score-label { color: var(--tk-faint); text-decoration: line-through; }
.tk-score-tick { width: 18px; height: 18px; border-radius: 50%; border: 1px solid var(--tk-line); display: inline-flex; align-items: center; justify-content: center; font-size: 11px; }
.tk-score-list li.is-done .tk-score-tick { background: var(--tk-ok); color: #fff; border-color: var(--tk-ok); }
.tk-score-summary {
    list-style: none; cursor: pointer; font-size: 13.5px; font-weight: 600;
    color: var(--tk-accent); padding: 6px 0;
}
.tk-score-summary::-webkit-details-marker { display: none; }
.tk-score-summary::after { content: " ▾"; }
.tk-score-details[open] .tk-score-summary::after { content: " ▴"; }
@media (min-width: 881px) {
    .tk-score-summary { display: none; }
}

/* ─── Footer V2 ─────────────────────────────────────────────── */
.tk-footer-v2 { border-top: 1px solid var(--tk-line); background: var(--tk-surface); margin-top: 40px; }
.tk-footer-v2 .tk-footer-brand { font-family: var(--tk-mono); font-size: 11px; letter-spacing: .06em; text-transform: uppercase; color: var(--tk-muted); }

/* ─── Logo topbar (image) ───────────────────────────────────── */
.tk-logo-img { height: 40px; width: auto; display: block; }
@media (max-width: 640px) { .tk-logo-img { height: 30px; } }

/* ─── Bouton succès (vert) ──────────────────────────────────── */
.tk-btn-success { background: var(--tk-ok); color: #fff; }
.tk-btn-success:hover { filter: brightness(1.06); }

/* ─── Bouton danger (rouge) + variante petite (listes admin) ─── */
.tk-btn-danger { background: var(--tk-danger); color: #fff; }
.tk-btn-danger:hover { filter: brightness(1.06); }
.tk-btn-sm { padding: 6px 10px; font-size: 11px; }

/* ─── Badges de statut affiliation (campagnes) ──────────────────
 * Correspondance : CampaignStatus::cssClass() → .tk-aff-status-{value}
 * - live     = vert (en cours)
 * - upcoming = orange/ambre (à venir)
 * - past     = gris (passée)
 */
.tk-aff-status {
    display: inline-flex;
    align-items: center;
    border-radius: 999px;
    padding: 3px 10px;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
}
.tk-aff-status-live     { background: var(--tk-ok-soft);   color: var(--tk-success); }
.tk-aff-status-upcoming { background: #fff3e0;              color: var(--tk-warning); }
.tk-aff-status-past     { background: var(--tk-hover);      color: var(--tk-muted); }

/* ─── Lignes de collection produits (formulaire campagne) ──────── */
.tk-aff-collrow { align-items: flex-end; flex-wrap: wrap; }

/* ─── Sidebar : visibilité masquée quand vide (profil à 100 %) ── */
#tk-visibility:empty { display: none; }

/* ─── Légende animateurs du planning (filtre cliquable) ─────── */
.tk-cal-legend {
    display: flex;
    flex-wrap: nowrap;
    gap: 8px;
    align-items: center;
    margin-bottom: 12px;
    min-height: 34px;          /* espace reserve : le calendrier ne saute plus */
    overflow-x: auto;          /* beaucoup de marques -> scroll horizontal */
    overflow-y: hidden;
    scrollbar-width: thin;
}
.tk-cal-legend-empty { color: var(--tk-ink-mute); font-size: 0.85rem; align-self: center; }
.tk-cal-legend-chip {
    flex: 0 0 auto;            /* pas de compression : les chips defilent */
    display: inline-flex; align-items: center; gap: 8px;
    padding: 7px 14px; border: 1.5px solid var(--tk-line); border-radius: 999px;
    background: var(--tk-surface); color: var(--tk-ink);
    font-size: 14px; font-weight: 600; line-height: 1.2; cursor: pointer;
    transition: opacity .12s ease, border-color .12s ease;
    white-space: nowrap;
}
.tk-cal-legend-chip:hover { border-color: var(--tk-line-strong); }
.tk-cal-legend-chip.is-off { opacity: .4; }
.tk-cal-legend-chip.is-off .tk-cal-legend-dot { background: var(--tk-faint) !important; }
.tk-cal-legend-dot { width: 12px; height: 12px; border-radius: 4px; flex: 0 0 auto; }

/* ─── FullCalendar : boutons lisibles ────────────────────────── */
/* Sélecteur COMPOSÉ (sans espace) : .fc est sur #brand-calendar lui-même.
   On surcharge les variables CSS FC à la source pour couvrir tous les états. */
#brand-calendar.fc {
    --fc-button-bg-color:          var(--tk-ink);
    --fc-button-border-color:      var(--tk-ink);
    --fc-button-text-color:        #fff;
    --fc-button-hover-bg-color:    #000;
    --fc-button-hover-border-color:#000;
    --fc-button-active-bg-color:   #000;
    --fc-button-active-border-color:#000;
    --fc-button-active-text-color: #fff;
}

/* ─── Sélecteur produits dans la modale de création de live ─── */
.tk-prod-picker { display: flex; flex-direction: column; gap: 4px; }
.tk-prod-pick-item {
    display: flex; align-items: center; gap: 10px;
    padding: 8px 12px; border: 1px solid var(--tk-line); border-radius: 9px;
    cursor: pointer; font-size: 13.5px; user-select: none;
    transition: background .1s ease, border-color .1s ease;
}
.tk-prod-pick-item:hover { background: var(--tk-hover); }
.tk-prod-pick-item:has(.tk-prod-pick-cb:checked) {
    background: color-mix(in srgb, var(--tk-accent) 8%, transparent);
    border-color: var(--tk-accent);
}
.tk-prod-pick-cb { flex: 0 0 auto; width: 16px; height: 16px; cursor: pointer; accent-color: var(--tk-accent); }
.tk-prod-pick-name { flex: 1; font-weight: 600; color: var(--tk-ink); }
.tk-prod-pick-tag {
    background: var(--tk-brand); color: #fff; border-radius: 999px;
    padding: 1px 8px; font-size: 9.5px; font-weight: 800; letter-spacing: .08em; text-transform: uppercase;
}
.tk-prod-pick-price { font-size: 12.5px; color: var(--tk-muted); font-variant-numeric: tabular-nums; }

/* ─── Modal V2 (dialog) ─────────────────────────────────────── */
.tk-dlg {
    border: none; border-radius: 16px; padding: 0; width: 100%;
    max-width: min(92vw, 460px); background: var(--tk-surface); color: var(--tk-ink);
    box-shadow: var(--tk-shadow-pop);
}
/* Garde indispensable : une <dialog> fermée doit rester masquée. Sans cela,
   la règle auteur .tk-dlg-wide { display:flex } écrase le display:none du UA
   (dialog:not([open])) et la modale reste affichée en permanence. */
dialog.tk-dlg:not([open]) { display: none; }
/* Deux variantes hautes : corps défilant et hauteur bornée. Le garde
   `dialog.tk-dlg:not([open])` ci-dessus les couvre toutes les deux (spécificité
   supérieure), la modale fermée reste donc masquée. */
.tk-dlg-wide, .tk-dlg-xxl { display: flex; flex-direction: column; max-height: 92vh; }
.tk-dlg-wide .tk-dlg-body, .tk-dlg-xxl .tk-dlg-body { overflow: auto; flex: 1 1 auto; min-height: 0; }
/* Les modales dont le formulaire enveloppe corps et pied (planning) : sans ceci,
   le <form> deviendrait l'unique element flex du dialogue et les proprietes
   flex de .tk-dlg-body ci-dessus seraient inertes, supprimant le defilement. */
.tk-dlg-wide > form, .tk-dlg-xxl > form { display: contents; }
.tk-dlg-wide { max-width: min(96vw, 520px); }
/* Formulaire produit : bénéfices et caractéristiques sont des collections de
   phrases entières, elles ont besoin de largeur. */
.tk-dlg-xxl { max-width: min(96vw, 1140px); }
.tk-dlg::backdrop { background: rgba(12, 14, 18, .5); backdrop-filter: blur(3px); }
.tk-dlg-hd { display: flex; align-items: center; justify-content: space-between; padding: 16px 20px; border-bottom: 1px solid var(--tk-line); }
.tk-dlg-ft { display: flex; justify-content: flex-end; gap: 10px; padding: 14px 20px; border-top: 1px solid var(--tk-line); }
.tk-dlg-title { font-size: 16px; font-weight: 700; margin: 0; }
.tk-dlg-close { background: none; border: none; cursor: pointer; font-size: 18px; line-height: 1; color: var(--tk-muted); padding: 4px 9px; border-radius: 8px; }
.tk-dlg-close:hover { background: var(--tk-hover); color: var(--tk-ink); }
.tk-dlg-body { padding: 20px; }
.tk-dlg-intro { font-size: 13.5px; color: var(--tk-muted); margin: 0 0 16px; }
.tk-dlg-note { font-size: 12.5px; color: var(--tk-accent); font-style: italic; margin: 0 0 12px; }
.tk-dlg-btn { width: 100%; padding: 13px; border-radius: 10px; font-size: 14px; }
/* Modale vidéo : message d'erreur, aperçu de la vidéo existante, sélecteur de fichier. */
.tk-dlg-error { font-size: 13px; color: var(--tk-danger); margin: 0 0 16px; padding: 10px 12px; border: 1px solid var(--tk-danger); border-radius: 9px; }
.tk-dlg-current { margin-bottom: 16px; }
.tk-dlg-current-video { width: 100%; aspect-ratio: 16 / 9; display: block; border-radius: 10px; background: #000; }
.tk-dlg-current-label { display: block; margin-top: 8px; font-size: 12.5px; color: var(--tk-muted); }
.tk-dlg-hint { display: block; font-size: 12.5px; color: var(--tk-muted); margin: 0 0 10px; }
.tk-dlg-file { width: 100%; font-size: 13px; color: var(--tk-muted); padding: 12px; border: 1px dashed var(--tk-line); border-radius: 10px; background: var(--tk-hover); cursor: pointer; }
.tk-dlg-file::file-selector-button { font-family: var(--tk-mono); font-size: 11px; letter-spacing: .04em; text-transform: uppercase; font-weight: 600; margin-right: 12px; padding: 8px 14px; border: 1px solid var(--tk-line); border-radius: 8px; background: var(--tk-surface); color: var(--tk-ink); cursor: pointer; }
.tk-dlg-file::file-selector-button:hover { background: var(--tk-hover); }
.tk-dlg-progress { width: 100%; height: 8px; margin: 0 0 14px; border: 0; border-radius: 6px; overflow: hidden; appearance: none; -webkit-appearance: none; }
.tk-dlg-progress::-webkit-progress-bar { background: var(--tk-cell-off); border-radius: 6px; }
.tk-dlg-progress::-webkit-progress-value { background: var(--tk-accent); border-radius: 6px; transition: width .15s; }
.tk-dlg-progress::-moz-progress-bar { background: var(--tk-accent); border-radius: 6px; }
.tk-calendly { min-width: 300px; height: 700px; min-height: 700px; }
@media (max-width: 680px) {
    .tk-dlg-wide, .tk-dlg-xxl { width: 100vw; max-width: 100vw; height: 100dvh; max-height: 100dvh; border-radius: 0; }
    /* Corps en colonne flex : le calendrier Calendly remplit la hauteur restante
       sous l'intro. L'iframe Calendly est en height:100% → il lui faut un parent à
       hauteur DÉFINIE (fournie ici par le flex). height:auto + min-height seul ne
       résout pas le pourcentage → l'iframe s'effondrait (calendrier minuscule).
       min-width:0 évite un débordement horizontal sur les petits écrans. */
    .tk-dlg-wide .tk-dlg-body { display: flex; flex-direction: column; }
    .tk-calendly { flex: 1 1 auto; min-height: 0; min-width: 0; height: auto; }
}

/* ─── Cibles tactiles : CTA principaux ≥ 44px sur mobile ───────── */
/* .btn-primary (Bootstrap) et .tk-btn-primary (système custom) coexistent sur les mêmes pages. */
@media (max-width: 640px) {
    .btn-primary,
    .tk-btn-primary { min-height: 44px; }
    .tk-btn-sm, .tk-btn-ghost, .tk-btn-danger { min-height: 44px; display: inline-flex; align-items: center; }
}

/* ─── Dashboard admin (KPI) ───────────────────────────────────── */
.tk-kpi-label { font-size: 13.5px; font-weight: 600; color: var(--tk-muted); }
.tk-kpi-value { font-size: 30px; font-weight: 800; color: var(--tk-ink); line-height: 1.1; margin-top: 2px; }
.tk-kpi-unit  { font-size: 14px; font-weight: 600; color: var(--tk-faint); }
.tk-kpi-sub   { font-size: 12.5px; font-weight: 600; color: var(--tk-faint); }
.tk-kpi-accent { box-shadow: 0 0 0 2px var(--tk-ring); }
.tk-kpi-accent .tk-kpi-label { color: var(--tk-chip-ink); }
.tk-onboard-row { padding: 10px 12px; background: var(--tk-hover); border-radius: 9px; }
/* --tk-ink-dim hérite de bootstrap-custom.css (:root[data-theme=light]) — pas redéfini dans .tk-app. */
.tk-sector-line { font-size: 13px; font-weight: 600; color: var(--tk-ink-dim); }
.tk-link-accent { font-size: 13px; font-weight: 600; color: var(--tk-accent); text-decoration: none; }
.tk-link-accent:hover { text-decoration: underline; }

/* ─── Catalogue V2 : layout 3 colonnes sidebar/grille/carte ────── */
.tk-catalog-layout { display: grid; grid-template-columns: minmax(210px,1fr) minmax(0,3fr) minmax(0,2fr); gap: 20px; align-items: start; }
/* Colonne sidebar (gauche) */
.tk-catalog-side { background: var(--tk-surface); border: 1px solid var(--tk-line); border-radius: 16px; padding: 18px; position: sticky; top: 24px; max-height: calc(100vh - 48px); overflow: auto; }
/* Barre de recherche dans la sidebar */
.tk-side-search { display: flex; align-items: center; gap: 9px; background: var(--tk-hover); border-radius: 10px; padding: 10px 12px; }
.tk-side-search input { border: 0; background: none; outline: none; font: inherit; font-size: 13.5px; width: 100%; color: var(--tk-ink); }
.tk-side-search i { color: var(--tk-muted); }
/* Indicateur « filtrage automatique » */
.tk-side-auto { display: flex; align-items: center; gap: 7px; font-size: 11px; font-weight: 600; color: var(--tk-ok); margin: 10px 2px 2px; }
.tk-side-auto span { width: 6px; height: 6px; border-radius: 50%; background: var(--tk-ok); box-shadow: 0 0 0 3px var(--tk-ok-soft); }
/* Groupes de filtres */
.tk-fgroup { border-top: 1px solid var(--tk-line); padding: 14px 0 4px; }
.tk-flabel { font-size: 11px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; color: var(--tk-faint); margin-bottom: 9px; }
/* Option case à cocher */
.tk-opt { display: flex; align-items: center; gap: 10px; padding: 5px 0; cursor: pointer; font-size: 13.5px; color: var(--tk-ink); }
.tk-opt.is-on { font-weight: 600; }
.tk-opt input { width: 16px; height: 16px; accent-color: var(--tk-ink); flex: none; cursor: pointer; }
/* Lien « Tout effacer » */
.tk-side-clear { display: inline-block; margin-top: 14px; font-size: 12.5px; font-weight: 600; color: var(--tk-muted); text-decoration: underline; text-underline-offset: 3px; }
/* Colonne carte (droite) */
.tk-catalog-map-col { position: sticky; top: 24px; }
.tk-catalog-map-wrap { position: relative; border: 1px solid var(--tk-line); border-radius: 14px; overflow: hidden; }
.tk-catalog-map { height: 72vh; min-height: 460px; }
/* Overlay « Autour de » sur la carte.
   z-index élevé : Leaflet empile ses panes/contrôles jusqu'à 1000, l'overlay doit passer au-dessus. */
.tk-map-search { position: absolute; z-index: 1100; top: 12px; left: 12px; right: 12px; display: flex; align-items: stretch; gap: 8px; }
.tk-map-near { flex: 1; min-width: 0; position: relative; display: flex; align-items: center; gap: 8px; background: var(--tk-surface); border: 1px solid var(--tk-line); border-radius: 10px; padding: 9px 12px; box-shadow: 0 2px 8px rgba(0,0,0,.08); }
.tk-map-near i { color: var(--tk-muted); flex: none; }
.tk-map-near input { border: 0; background: none; outline: none; font: inherit; font-size: 13px; width: 100%; }
.tk-map-radius { flex: none; border: 1px solid var(--tk-line); border-radius: 10px; padding: 0 10px; font: inherit; font-size: 12.5px; font-weight: 600; color: var(--tk-ink); background: var(--tk-surface); box-shadow: 0 2px 8px rgba(0,0,0,.08); cursor: pointer; }
/* Pin de carte */
.tk-map-pin span {
    display: block; width: 16px; height: 16px; border-radius: 50%;
    background: var(--tk-accent); border: 2px solid #fff; box-shadow: 0 1px 4px rgba(0, 0, 0, .4);
}
/* ─── Mobile : 1 colonne, sidebar non-sticky, carte visible empilée ─ */
@media (max-width: 991.98px) {
    .tk-catalog-layout { grid-template-columns: 1fr; }
    .tk-catalog-side { position: static; max-height: none; }
    .tk-catalog-map-col { position: static; }
    .tk-catalog-map-wrap { display: block; }
    .tk-catalog-map { height: 50vh; }
}

/* Filtres actifs (chips) — rangée à défilement horizontal sous le compteur */
.tk-active-filters {
    display: flex; flex-wrap: nowrap; align-items: center; gap: 8px;
    overflow-x: auto; overscroll-behavior-x: contain;
    margin-bottom: 16px; padding-bottom: 4px;
    scrollbar-width: thin; -webkit-overflow-scrolling: touch;
}
.tk-chip {
    flex: none; display: inline-flex; align-items: center; gap: 6px;
    background: var(--tk-hover); border: 1px solid var(--tk-line);
    border-radius: 999px; padding: 5px 6px 5px 12px;
    font-size: 12.5px; font-weight: 600; color: var(--tk-ink);
    white-space: nowrap; cursor: pointer; transition: border-color .15s, background .15s;
}
.tk-chip:hover { border-color: #c9ccd2; background: var(--tk-surface); }
.tk-chip i {
    font-size: 14px; line-height: 1; color: var(--tk-muted);
    display: inline-flex; align-items: center; justify-content: center;
    width: 18px; height: 18px; border-radius: 50%; transition: background .15s, color .15s;
}
.tk-chip:hover i { color: var(--tk-ink); background: rgba(0, 0, 0, .06); }
.tk-chip-clear {
    flex: none; background: none; border: 0; padding: 5px 8px;
    font-size: 12.5px; font-weight: 600; color: var(--tk-muted);
    text-decoration: underline; text-underline-offset: 3px; white-space: nowrap; cursor: pointer;
}
.tk-chip-clear:hover { color: var(--tk-ink); }

/* Carte catalogue — format C (avatar carré + entête + infos empilées) */
.tk-catalog-card { background: var(--tk-surface); border: 1px solid var(--tk-line); border-radius: 16px; padding: 15px; position: relative; cursor: pointer; transition: border-color .18s, box-shadow .18s; display: flex; gap: 14px; align-items: stretch; }
/* Colonne texte : moitié gauche de la carte. min-width:0 → l'ellipsis des
   langues/ville fonctionne quand la vidéo occupe l'autre moitié. */
.tk-catalog-main { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; }
/* Vidéo de présentation : colonne droite de la carte à largeur FIXE en 9:16.
   preload=metadata → la première image (fast preview) se charge vite grâce au
   faststart sans télécharger toute la vidéo. position/z-index au-dessus du
   stretched-link du nom → contrôles cliquables.
   flex:none + width fixe → la colonne texte prend tout l'espace restant ;
   aspect-ratio:9/16 → toujours portrait, jamais étiré à la hauteur de la carte. */
.tk-catalog-video { flex: none; width: 180px; aspect-ratio: 2 / 3; align-self: flex-start; position: relative; z-index: 2; border-radius: 12px; overflow: hidden; background: #0d0e10; }
.tk-catalog-video video { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block; }
.tk-catalog-card:hover { border-color: #d6d9df; box-shadow: 0 6px 20px rgba(20,24,32,.07); }
.tk-catalog-card:focus-within { outline: 2px solid var(--tk-accent); outline-offset: 2px; }
.tk-catalog-head { display: flex; gap: 13px; align-items: flex-start; margin-bottom: 13px; }
.tk-catalog-avatar { width: 64px; height: 64px; flex: none; border-radius: 15px; overflow: hidden; background: var(--tk-hover); }
.tk-catalog-avatar img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* Placeholder partagé avec la fiche (qui surcharge taille/rayon en inline). */
.tk-catalog-photo-placeholder { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; font-size: 1.5rem; font-weight: 800; color: var(--tk-faint); }
.tk-catalog-headtext { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 7px; }
.tk-catalog-name { display: flex; align-items: center; gap: 6px; margin: 0; font-size: 16px; font-weight: 700; letter-spacing: -.01em; color: var(--tk-ink); line-height: 1.2; }
.tk-catalog-name a { color: inherit; text-decoration: none; }
.tk-catalog-status { align-self: flex-start; font-size: 11px; font-weight: 700; letter-spacing: .02em; text-transform: uppercase; padding: 3px 9px; border-radius: 999px; background: var(--tk-grey-bg, #eef0f3); color: var(--tk-muted); }
.tk-status-selected { background: var(--tk-ok-soft); color: var(--tk-ok); }
.tk-status-contacted { background: #fbf2e1; color: #c47d12; }
.tk-status-new { background: #e8effd; color: #2563eb; }
.tk-status-rejected { background: #fdeaf0; color: var(--tk-alert); }
.tk-catalog-meta-list { list-style: none; margin: 0; padding: 0; font-size: 13px; color: var(--tk-ink-dim); display: flex; flex-direction: column; gap: 6px; }
.tk-catalog-meta-list li { display: flex; align-items: center; gap: 9px; min-width: 0; }
.tk-catalog-meta-list li i { width: 15px; flex: none; text-align: center; color: var(--tk-muted); font-size: 13px; }
.tk-catalog-meta-list li > span { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tk-meta-empty { color: var(--tk-faint); }

/* Facettes de statut (réutilise les teintes des anciens statuts) */
.tk-facet-inscrit { background: #e8effd; color: #2563eb; }
.tk-facet-to_onboard { background: #efe9fd; color: #6d28d9; }
.tk-facet-contacted { background: #fbf2e1; color: #c47d12; }
.tk-facet-validated { background: var(--tk-ok-soft); color: var(--tk-ok); }
.tk-facet-rejected { background: #fdeaf0; color: var(--tk-alert); }

/* Barre de complétion sur la carte (collée en bas de la colonne gauche) */
.tk-catalog-completion { margin-top: auto; padding-top: 12px; }
.tk-catalog-completion-head { display: flex; justify-content: space-between; align-items: baseline; font-size: 12px; color: var(--tk-ink-dim); margin-bottom: 5px; }
.tk-catalog-completion-pct { font-weight: 600; color: var(--tk-ink); }
.tk-catalog-completion-bar { height: 6px; border-radius: 99px; background: var(--tk-hover); overflow: hidden; }
.tk-catalog-completion-bar > div { height: 100%; border-radius: 99px; transition: width .3s ease; }

/* Hauteur de carte uniforme : la vidéo (stretch) et les cartes sans vidéo s'alignent.
   Valeur à ajuster visuellement (head + 6 lignes meta + barre de complétion). */
.tk-catalog-card { min-height: 224px; }

/* Vidéo « gif » muette : tout le bloc vidéo laisse passer le clic vers le stretched-link
   (ouverture fiche). pointer-events sur le wrapper — pas seulement sur <video> — sinon son
   z-index:2 intercepte le clic au-dessus du stretched-link::after (z-index:1). */
.tk-catalog-video { pointer-events: none; }

/* Mobile (≤480px) : la carte passe en colonne, la vidéo repasse pleine largeur
   SOUS le texte. Sinon la vidéo fixe (180px) + z-index:2 écrase la colonne méta
   (nowrap) et se superpose au texte sur les petits écrans (régression du partage). */
@media (max-width: 480px) {
    .tk-catalog-card { flex-direction: column; align-items: stretch; }
    .tk-catalog-video { width: 100%; aspect-ratio: 16 / 10; align-self: stretch; }
}

/* ─── Pills de filtre (onglet Propositions : En attente / Favoris / Refusés) ─── */
.tk-pfilter { display: inline-flex; align-items: center; gap: 8px; padding: 8px 14px; border-radius: 999px; background: var(--tk-surface); border: 1px solid var(--tk-line-strong); font-size: 13px; font-weight: 600; color: var(--tk-ink); cursor: pointer; transition: background .15s, color .15s, border-color .15s; }
.tk-pfilter:hover { border-color: var(--tk-ink-mute); }
.tk-pfilter.is-active { background: var(--tk-ink); border-color: var(--tk-ink); color: #fff; }
.tk-pfilter-cnt { display: inline-flex; align-items: center; justify-content: center; min-width: 20px; height: 20px; padding: 0 6px; border-radius: 999px; background: var(--tk-hover); color: var(--tk-muted); font-size: 11.5px; font-weight: 700; }
.tk-pfilter.is-active .tk-pfilter-cnt { background: rgba(255, 255, 255, .22); color: #fff; }
/* Cœur favori en surcouche de la card proposition (le <form> parent porte le
   position:absolute haut-droite ; ce bouton n'a que l'apparence circulaire). */
.tk-fav-btn { display: inline-flex; align-items: center; justify-content: center; width: 34px; height: 34px; border-radius: 50%; background: var(--tk-surface); border: 1px solid var(--tk-line-strong); color: var(--tk-muted); cursor: pointer; box-shadow: 0 2px 6px rgba(0, 0, 0, .12); transition: color .15s, border-color .15s; }
.tk-fav-btn:hover { color: #b91c1c; border-color: #fca5a5; }
.tk-fav-btn.is-on { color: #dc2626; border-color: #fca5a5; background: #fef2f2; }
/* Grille des propositions : auto-fill avec une largeur minimale de card (~380px).
   Le grid réduit le nombre de colonnes automatiquement plutôt que de comprimer la card
   en dessous du seuil lisible (180px vidéo + 14px gap interne + ~160px texte + 30px padding). */
.tk-prop-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(380px, 100%), 1fr)); gap: 18px; }

/* ─── Onglet « Animateurs » (espace marque) : cards orientées stats ──────────
   Pas de vidéo/gif : on met en avant la performance (Lives / Heures / GMV). */
.tk-team-count { display: inline-flex; align-items: center; justify-content: center; min-width: 24px; height: 24px; padding: 0 7px; border-radius: 999px; background: var(--tk-ink); color: #fff; font-size: 12px; font-weight: 800; }
.tk-team-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 18px; }
.tk-host-card { display: flex; flex-direction: column; gap: 16px; background: var(--tk-surface); border: 1px solid var(--tk-line); border-radius: 16px; padding: 20px; box-shadow: var(--tk-shadow-card); }
.tk-host-stats { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; padding: 14px 0; border-top: 1px solid var(--tk-line); border-bottom: 1px solid var(--tk-line); }
.tk-host-stat { text-align: center; }
.tk-host-stat--mid { border-left: 1px solid var(--tk-line); border-right: 1px solid var(--tk-line); }
.tk-host-stat-val { font-size: 19px; font-weight: 800; color: var(--tk-ink); font-variant-numeric: tabular-nums; }
.tk-host-stat-unit { font-size: 13px; font-weight: 800; margin-left: 1px; }
.tk-host-stat-lbl { margin-top: 2px; font-size: 10.5px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--tk-faint); }

/* ─── Onglet Produits (espace marque) : catalogue produits, cf. maquette ──────── */
/* tk-prod-toolbar, tk-prod-search, tk-prod-toolbar-right, tk-prod-count et tk-prod-emptystate sont partagées avec l'onglet « Affiliés LIVE » (_partials/brand_affiliates_table.html.twig) : un restyling ici les affecte tous les deux. */
.tk-prod-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; margin-bottom: 20px; }
.tk-prod-search { position: relative; flex: 1; min-width: 240px; max-width: 420px; }
.tk-prod-search i { position: absolute; left: 14px; top: 50%; transform: translateY(-50%); color: var(--tk-faint); font-size: 14px; pointer-events: none; }
.tk-prod-search input { width: 100%; border: 1px solid var(--tk-line); background: var(--tk-surface); border-radius: 11px; padding: 11px 14px 11px 40px; font-family: inherit; font-size: 14px; color: var(--tk-ink); outline: none; }
.tk-prod-search input:focus { border-color: var(--tk-line-strong); }
.tk-prod-toolbar-right { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
.tk-prod-count { font-size: 13px; color: var(--tk-muted); }
.tk-prod-count b { color: var(--tk-ink); }

/* Bouton scindé « action principale + flèche d'options » (onglet Produits :
   Ajouter un produit / Ajouter un pack). On n'utilise volontairement PAS le
   .btn-group de Bootstrap : bootstrap-custom.css le détourne en chips de filtre
   (border-radius 999px !important, police mono 11.5px en capitales,
   margin-right 6px), ce qui transformerait le bouton principal en pilule de
   filtre et détacherait la flèche. Ici les deux moitiés forment un seul bloc :
   le bouton garde l'apparence standard du reste de l'espace marque, la flèche
   s'y greffe derrière un filet de séparation. */
.tk-split-btn { display: inline-flex; }
.tk-split-btn > .btn:first-child { border-top-right-radius: 0; border-bottom-right-radius: 0; }
.tk-split-btn > .btn.dropdown-toggle-split {
    position: relative;
    border-top-left-radius: 0; border-bottom-left-radius: 0;
}
.tk-split-btn > .btn.dropdown-toggle-split::before {
    content: ''; position: absolute; left: 0; top: 7px; bottom: 7px;
    width: 1px; background: rgba(255, 255, 255, 0.32);
}
/* Le survol d'une moitié doit soulever les DEUX, sinon le bloc se disloque : on
   rejoue l'effet de .btn-primary:hover depuis le conteneur (spécificité
   supérieure) sur les deux moitiés à la fois. L'effet reste porté par les
   boutons, jamais par le conteneur : un transform sur le conteneur créerait un
   contexte d'empilement qui piégerait le z-index du menu derrière les cards. */
.tk-split-btn:hover > .btn-primary:not(:disabled) {
    transform: translateY(-1px);
    filter: brightness(1.04);
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.35),
                0 6px 20px rgba(var(--tk-grad-1-rgb), 0.34);
}

/* Chips de type de l'onglet Produits (Produits / Packs), cumulables avec la recherche. */
.tk-prod-typechips { display: inline-flex; gap: 6px; }
.tk-prod-typechips button {
    border: 1px solid var(--tk-line); background: var(--tk-surface); color: var(--tk-muted);
    border-radius: 999px; padding: 6px 14px; font-family: inherit; font-size: 12.5px; font-weight: 600;
    cursor: pointer; transition: border-color .15s, color .15s, background .15s;
}
.tk-prod-typechips button:hover { border-color: var(--tk-line-strong); }
.tk-prod-typechips button.on { background: var(--tk-brand); border-color: var(--tk-brand); color: #fff; }

/* Badge et composition d'une card de pack. */
.tk-prod-pack-tag {
    align-self: flex-start; display: inline-flex; align-items: center; gap: 5px;
    background: var(--tk-brand); color: #fff; border-radius: 999px;
    padding: 3px 10px; font-size: 10.5px; font-weight: 800; letter-spacing: .08em; text-transform: uppercase;
    margin-bottom: 6px;
}
.tk-prod-pack-count { font-size: 13px; color: var(--tk-ink); font-weight: 600; }

.tk-prod-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(290px, 1fr)); gap: 18px; grid-auto-rows: 1fr; }
.tk-prod-card { display: flex; flex-direction: column; height: 100%; background: var(--tk-surface); border: 1px solid var(--tk-line); border-radius: 16px; overflow: hidden; box-shadow: var(--tk-shadow-card); }

.tk-prod-photo { position: relative; height: 148px; flex: none; display: flex; align-items: center; justify-content: center; background: linear-gradient(135deg, #f3f1ee, #e7e3dd); }
.tk-prod-photo > i { font-size: 30px; color: #c3bdb4; }
/* contain (et non cover) : la photo produit reste visible en entier, quitte à
   réduire sa taille et laisser un liseré du fond autour. padding + border-box
   pour ne pas coller aux bords. */
.tk-prod-photo img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; padding: 12px; box-sizing: border-box; }
.tk-prod-photo-label { position: absolute; left: 12px; bottom: 12px; font-size: 10px; letter-spacing: .06em; text-transform: uppercase; color: #a99f92; font-weight: 700; }
.tk-prod-price { position: absolute; right: 12px; top: 12px; background: var(--tk-ink); color: #fff; font-size: 14px; font-weight: 800; padding: 5px 11px; border-radius: 999px; font-variant-numeric: tabular-nums; }
.tk-prod-del { position: absolute; left: 12px; top: 12px; width: 30px; height: 30px; flex: none; border-radius: 8px; border: 1px solid var(--tk-line); background: var(--tk-surface); color: var(--tk-danger); cursor: pointer; display: inline-flex; align-items: center; justify-content: center; font-size: 13px; }
.tk-prod-del.is-locked { color: var(--tk-faint); cursor: default; }

.tk-prod-body { display: flex; flex-direction: column; gap: 14px; flex: 1; padding: 18px; }
.tk-prod-name { margin: 0; font-size: 16px; font-weight: 800; letter-spacing: -.01em; color: var(--tk-ink); }
.tk-prod-section-lbl { font-size: 10.5px; letter-spacing: .1em; text-transform: uppercase; color: var(--tk-faint); font-weight: 700; margin-bottom: 8px; }
/* Rangée de puces, gabarit commun aux bénéfices et aux caractéristiques : deux
   lignes, jamais plus, quelle que soit la longueur des libellés. La 1re puce
   occupe sa ligne entière (flex-basis 100%), la 2e prend toute la largeur
   restante de la 2e ligne et la partage avec la pastille « +N ». Chaque puce
   ellipse son texte et porte le libellé complet en title.
   Auparavant les puces étaient dimensionnées sur leur contenu : les longues
   caractéristiques se comprimaient les unes contre les autres sur une seule
   ligne (jusqu'à 3 ou 4 caractères visibles chacune), et la hauteur de la
   section variait d'une fiche à l'autre selon la longueur des libellés.
   Les sélecteurs ciblent les classes de puces (et non `> :nth-child(2)`) pour
   ne jamais happer la pastille « +N », qui doit rester à sa taille de contenu. */
.tk-prod-tags { display: flex; flex-wrap: wrap; gap: 7px; }
.tk-prod-tags > .tk-prod-benefit:first-child,
.tk-prod-tags > .tk-prod-spec:first-child { flex: 1 1 100%; }
.tk-prod-tags > .tk-prod-benefit:nth-child(2),
.tk-prod-tags > .tk-prod-spec:nth-child(2) { flex: 1 1 0; min-width: 0; }
.tk-prod-benefit { display: inline-flex; align-items: center; gap: 6px; background: var(--tk-ok-soft); color: var(--tk-ok); font-size: 12px; font-weight: 600; padding: 5px 11px; border-radius: 999px; max-width: 100%; min-width: 0; overflow: hidden; }
.tk-prod-benefit > i { flex: 0 0 auto; }
/* Un bénéfice est souvent une phrase entière : une ligne + ellipse, texte complet
   en title. Le span interne porte l'ellipse (text-overflow ne s'applique pas au
   texte nu d'un conteneur flex) et la chip garde sa forme de pastille. */
.tk-prod-benefit-txt { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Chip caractéristique : même gabarit qu'un bénéfice (une ligne pleine largeur +
   ellipse), sans le vert ni l'icône. Pas de max-width : la largeur vient des
   règles de .tk-prod-tags ci-dessus, l'ellipse fait le reste. Le texte complet
   est porté par l'attribut title (survol). */
.tk-prod-spec { background: var(--tk-chip-bg); color: var(--tk-chip-ink); border: 1px solid var(--tk-chip-line); font-size: 12px; font-weight: 500; padding: 5px 11px; border-radius: 999px; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Compteur de surplus : jamais compressé ni rogné, c'est le seul signal qu'il
   reste des éléments repliés. */
.tk-prod-more { background: var(--tk-chip-bg); color: var(--tk-muted); font-size: 12px; font-weight: 700; padding: 5px 11px; border-radius: 999px; flex: 0 0 auto; white-space: nowrap; }
.tk-prod-brief { background: linear-gradient(135deg, #fff7e9, #fffdf8); border: 1px solid #f0e0bd; border-radius: 12px; padding: 12px 14px; }
.tk-prod-brief-lbl { display: flex; align-items: center; gap: 7px; margin-bottom: 6px; font-size: 10.5px; letter-spacing: .08em; text-transform: uppercase; color: #c47d12; font-weight: 800; }
.tk-prod-brief-lbl i { color: #df8a0c; font-size: 12px; }
.tk-prod-brief-txt { margin: 0; font-size: 13px; color: #7a5a1e; line-height: 1.5; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; overflow: hidden; }
.tk-prod-edit { margin-top: auto; display: inline-flex; align-items: center; justify-content: center; gap: 8px; background: var(--tk-surface); border: 1px solid var(--tk-line-strong); border-radius: 10px; padding: 11px; font-family: inherit; font-size: 12px; font-weight: 700; letter-spacing: .03em; text-transform: uppercase; color: var(--tk-ink); cursor: pointer; text-decoration: none; }
.tk-prod-edit:hover { background: var(--tk-hover); }

.tk-prod-empty { padding: 40px 20px; text-align: center; color: var(--tk-faint); font-size: 14px; background: var(--tk-surface); border: 1px dashed var(--tk-line-strong); border-radius: 16px; margin-bottom: 18px; }
.tk-prod-emptystate { display: flex; flex-direction: column; align-items: center; gap: 12px; padding: 60px 20px; text-align: center; color: var(--tk-faint); background: var(--tk-surface); border: 1px dashed var(--tk-line-strong); border-radius: 16px; }
.tk-prod-emptystate i { font-size: 30px; }
.tk-prod-emptystate p { margin: 0; font-size: 14px; }

/* ─── Fiche V2 : lecteur vidéo + galerie TikTok ────────────────── */
.tk-section-eyebrow { font-size: 11px; letter-spacing: 0.10em; text-transform: uppercase; color: var(--tk-ink-mute); margin-bottom: 10px; }
.tk-video-player { aspect-ratio: 16 / 9; background: #000; border-radius: var(--tk-radius); overflow: hidden; }
.tk-video-player video { width: 100%; height: 100%; object-fit: contain; display: block; }
.tk-tiktok-gallery { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 10px; }
.tk-tiktok-cell { aspect-ratio: 9 / 16; border: 1px solid var(--tk-line); border-radius: 10px; overflow: hidden; background: var(--tk-hover); }
.tk-tiktok-cell iframe { width: 100%; height: 100%; border: 0; }
/* Embed TikTok (fiche admin) : largeur recommandée par TikTok hors mode partage. */
.tk-tiktok-embed { max-width: 780px; min-width: 288px; }
/* Mode partage : on masque l'aside Admin (confidentiel) et tout élément interne
   (badge de statut) quel que soit le viewport. Masquage CSS (et non JS) →
   aucun flash d'info confidentielle à la navigation. */
.tk-share-on .tk-admin-aside { display: none; }
.tk-share-on .tk-share-hide { display: none; }

/* ════════════════════════════════════════════════════════════════
   Fiche animateur V3 — mise en page « profil » (container centré)
   Objectifs : la personne en tête, vidéo + TikTok alignés, sections
   pleine largeur (zéro vide à droite), admin en bande séparée en bas.
   ════════════════════════════════════════════════════════════════ */
.tk-fiche { max-width: 1120px; margin: 0 auto; padding: 24px 24px 64px; }

.tk-fiche-back {
    display: inline-flex; align-items: center; gap: 7px; margin-bottom: 14px;
    font-family: var(--tk-mono); font-size: 11.5px; letter-spacing: .05em;
    text-transform: uppercase; color: var(--tk-muted); text-decoration: none;
}
.tk-fiche-back:hover { color: var(--tk-ink); }

/* Aperçu public (côté animateur) : bandeau d'information au-dessus de la fiche. */
.tk-fiche-pubnote {
    display: flex; align-items: center; gap: 9px; margin-bottom: 16px;
    padding: 11px 15px; border-radius: 12px; font-size: 13.5px;
    color: var(--tk-muted); background: var(--tk-hover); border: 1px solid var(--tk-line);
}
.tk-fiche-pubnote i { color: var(--tk-accent); }

/* ── Hero ── */
/* .tk-fiche-hero porte aussi .card → on assume la colonne : rangée haute
   (photo/identité/actions) puis rangée « À propos + carte ». */
.tk-fiche-hero { display: flex; flex-direction: column; gap: 18px; padding: 20px 22px; }
/* Rangée haute : disposition horizontale d'origine. */
.tk-fiche-hero-top { display: flex; flex-direction: row; gap: 22px; align-items: center; }
/* Seconde rangée : À propos (gauche, extensible) + carte carrée (droite, fixe). */
.tk-fiche-hero-about { display: flex; gap: 20px; align-items: stretch; padding-top: 18px; border-top: 1px solid var(--tk-line); }
.tk-fiche-about-text { flex: 1 1 auto; min-width: 0; }
/* align-self: flex-start → la carte garde sa taille carrée intrinsèque même si
   la bio est plus haute (sinon align-items:stretch l'étirerait en rectangle). */
.tk-fiche-map-square { flex: 0 0 auto; align-self: flex-start; width: 240px; height: 240px; }
.tk-fiche-map-square .tk-fiche-map { height: 100%; min-height: 0; }
.tk-fiche-photo {
    position: relative;
    flex: 0 0 auto; width: 124px; height: 150px; border-radius: 18px; overflow: hidden;
    background: var(--tk-hover); box-shadow: 0 5px 16px -9px rgba(20, 24, 32, .5);
}
.tk-fiche-photo img { width: 100%; height: 100%; object-fit: cover; display: block; }
.tk-fiche-photo .tk-catalog-photo-placeholder { font-size: 2.4rem; }
.tk-fiche-id { flex: 1; min-width: 0; }
.tk-fiche-eyebrow {
    display: inline-flex; align-items: center; gap: 8px; margin-bottom: 8px;
    font-family: var(--tk-mono); font-size: 11px; letter-spacing: .14em;
    text-transform: uppercase; color: var(--tk-faint); font-weight: 600;
}
.tk-fiche-eyebrow .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--tk-ink); }
.tk-fiche-name {
    display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin: 0;
    font-size: clamp(26px, 3.4vw, 38px); font-weight: 800; letter-spacing: -.028em;
    line-height: 1.05; color: var(--tk-ink);
}
/* Aligner le badge de statut sur la même ligne médiane que le nom
   (.tk-catalog-status hérite align-self:flex-start du catalogue → décalé). */
.tk-fiche-name .tk-catalog-status { align-self: center; }
.tk-fiche-facts { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 14px; }
.tk-fiche-fact {
    display: inline-flex; align-items: center; gap: 7px; font-size: 13px;
    color: var(--tk-muted); background: var(--tk-hover); border: 1px solid var(--tk-line);
    padding: 6px 12px; border-radius: 999px;
}
.tk-fiche-fact b { color: var(--tk-ink); font-weight: 600; }
.tk-fiche-fact i { color: var(--tk-muted); }
.tk-fiche-actions { flex: 0 0 auto; align-self: flex-start; }

.tk-fiche-card-pad { padding: 18px; }
/* Un peu plus d'air sous les titres de section (À PROPOS, COMPÉTENCES…). */
.tk-fiche .tk-section-eyebrow { margin-bottom: 16px; }

/* ── Présentation : vidéo verticale (1/3) + TikTok (2/3) ── */
/* align-items: stretch → la vidéo (et le placeholder) s'étirent à la hauteur réelle
   du widget TikTok rendu à côté. min-height = plancher quand la vidéo est seule. */
.tk-fiche-pres { display: grid; grid-template-columns: 1fr 2fr; gap: 16px; margin-top: 16px; align-items: stretch; }
/* Un seul média présent → il occupe toute la largeur. */
.tk-fiche-pres > .card:only-child { grid-column: 1 / -1; }
.tk-fiche-pres-video { padding: 0; overflow: hidden; position: relative; min-height: 440px; }
/* Pas de vidéo : on réserve le même gabarit (s'étire à la hauteur du TikTok) avec un message. */
.tk-fiche-pres-video--empty {
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: 10px; text-align: center; color: var(--tk-faint);
    background: var(--tk-hover); border: 1px dashed var(--tk-line);
}
.tk-fiche-pres-video--empty i { font-size: 30px; }
.tk-fiche-pres-video--empty span { font-size: 13px; font-weight: 600; }
/* Cadre vertical (format live shopping). object-fit cover → remplit, fini les bandes noires. */
.tk-fiche-vframe { position: absolute; inset: 0; background: #0d0e10; }
.tk-fiche-vframe video { width: 100%; height: 100%; object-fit: cover; display: block; }
/* Boutons de modération admin sur les médias de la fiche (masqués en mode partage via .tk-share-hide). */
.tk-media-reject { position: absolute; top: 8px; right: 8px; z-index: 4; margin: 0; }
.tk-media-reject .btn { box-shadow: 0 2px 8px -2px rgba(13, 14, 16, .55); }
.tk-fiche-vlabel { position: absolute; top: 11px; left: 12px; z-index: 2; font-family: var(--tk-mono); font-size: 9.5px; letter-spacing: .06em; text-transform: uppercase; color: #fff; background: rgba(0,0,0,.5); padding: 3px 8px; border-radius: 7px; display: inline-flex; align-items: center; gap: 5px; }

.tk-fiche-pres-tiktok { padding: 0; overflow: hidden; }
.tk-fiche-pres-tiktok .tk-tiktok-embed { width: 100%; max-width: 100%; min-width: 0; margin: 0; }

.tk-fiche-map-card { padding: 0; overflow: hidden; position: relative; min-height: 240px; }
.tk-fiche-map { width: 100%; height: 100%; min-height: 240px; }
.tk-fiche-map .leaflet-container { height: 100%; width: 100%; background: var(--tk-hover); }
.tk-fiche-map-loc { position: absolute; left: 12px; bottom: 12px; z-index: 650; font-family: var(--tk-mono); font-size: 11px; font-weight: 600; color: var(--tk-ink); background: rgba(255,255,255,.92); border: 1px solid var(--tk-line); padding: 5px 10px; border-radius: 8px; display: inline-flex; align-items: center; gap: 6px; }

/* ── À propos ── */
.tk-fiche-bio {
    margin: 0; font-size: 15px; line-height: 1.55; color: var(--tk-ink);
    font-style: italic; border-left: 3px solid var(--tk-ink); padding-left: 14px;
}

/* ── Grille milieu (compétences | disponibilités) ── */
/* align-items: stretch → les deux cartes ont la même hauteur (la plus haute fait foi). */
.tk-fiche-mid { display: grid; grid-template-columns: 1.15fr 1fr; gap: 16px; margin-top: 16px; align-items: stretch; }

/* ── Tags (secteurs / équipement) ── */
.tk-fiche-tags { display: flex; flex-wrap: wrap; gap: 6px; }
.tk-fiche-tag {
    font-size: 12px; font-weight: 500; padding: 4px 10px; border-radius: 8px;
    background: var(--tk-chip-bg); color: var(--tk-chip-ink); border: 1px solid var(--tk-chip-line);
}

/* ── Bande admin (confidentiel) ── */
.tk-fiche-admin { margin-top: 18px; padding: 0; overflow: hidden; border: 1.5px solid var(--tk-chip-line); }
.tk-fiche-admin-head {
    display: flex; align-items: center; gap: 9px; padding: 13px 20px;
    border-bottom: 1px solid var(--tk-line); background: var(--tk-hover);
}
.tk-fiche-admin-head .t {
    font-family: var(--tk-mono); font-size: 10.5px; letter-spacing: .1em;
    text-transform: uppercase; color: var(--tk-chip-ink); font-weight: 700;
}
.tk-fiche-admin-head .note {
    margin-left: auto; font-family: var(--tk-mono); font-size: 9.5px;
    letter-spacing: .03em; color: var(--tk-faint);
}
.tk-fiche-admin-grid { display: grid; grid-template-columns: 1.3fr 1fr; }
.tk-fiche-admin-grid > div { padding: 18px 20px; }
.tk-fiche-admin-info { border-right: 1px solid var(--tk-line); }
.tk-fiche-status-form {
    display: flex; gap: 8px; flex-wrap: wrap; margin-top: 14px;
    padding-top: 14px; border-top: 1px solid var(--tk-line);
}

/* ── Responsive ── */
@media (max-width: 900px) {
    .tk-fiche { padding: 18px 14px 56px; }
    .tk-fiche-mid, .tk-fiche-admin-grid { grid-template-columns: 1fr; }
    .tk-fiche-admin-info { border-right: none; border-bottom: 1px solid var(--tk-line); }
    /* Présentation : vidéo puis TikTok empilés pleine largeur. */
    .tk-fiche-pres { grid-template-columns: 1fr; }
    /* Hero : À propos puis carte empilés pleine largeur. */
    .tk-fiche-hero-about { flex-direction: column; }
    .tk-fiche-map-square { width: 100%; height: 220px; }
    .tk-fiche-vframe { max-height: 70vh; }
}
@media (max-width: 600px) {
    .tk-fiche-hero { flex-wrap: wrap; }
    .tk-fiche-actions { order: 3; width: 100%; }
    .tk-fiche-actions .btn { width: 100%; }
    /* Hero-top : photo seule au-dessus, identité centrée en dessous. */
    .tk-fiche-hero-top { flex-direction: column; align-items: center; text-align: center; gap: 12px; }
    .tk-fiche-id { text-align: center; }
    .tk-fiche-name { justify-content: center; }
    .tk-fiche-eyebrow { justify-content: center; }
    .tk-fiche-facts { justify-content: center; }
}

/* ─── Back-office : taille des contrôles compacts et sous-titres ──── */
.tk-app .form-control-sm, .tk-app .form-select-sm { font-size: 0.92rem; }
.tk-app .btn-sm { font-size: 0.86rem; }
.tk-page-subtitle { font-size: 15px; }

/* Champs obligatoires : Symfony ajoute la classe `required` au label des champs
   requis (theme Bootstrap 5) sans marqueur visuel. On rend un asterisque rouge. */
.tk-app label.required::after { content: " *"; color: var(--tk-danger); font-weight: 700; }

/* ─── Menu burger (mobile nav) ──────────────────────────────────── */
.tk-topbar-inner { position: relative; }
.tk-burger { display: none; flex-direction: column; gap: 4px; background: none; border: none; cursor: pointer; padding: 8px; }
.tk-burger span { display: block; width: 22px; height: 2px; background: var(--tk-ink); border-radius: 2px; transition: opacity .15s; }
@media (max-width: 768px) {
    .tk-burger { display: flex; }
    .tk-nav {
        display: none; position: absolute; top: 64px; right: 0; left: 0;
        flex-direction: column; align-items: stretch; gap: 0;
        background: var(--tk-surface); border-bottom: 1px solid var(--tk-line);
        padding: 8px 18px 16px; box-shadow: var(--tk-shadow); z-index: 30;
    }
    .tk-topbar.tk-nav-open .tk-nav { display: flex; }
    .tk-nav a, .tk-nav .tk-nav-logout, .tk-nav form { width: 100%; }
    .tk-nav a { padding: 11px 4px; }
    .tk-nav .tk-btn-ghost { width: 100%; text-align: left; padding: 11px 4px; }
}

/* ─── Pages légales (mentions légales, etc.) ──────────────────── */
.tk-legal section { margin-bottom: 26px; }
.tk-legal section:last-of-type { margin-bottom: 0; }
.tk-legal h2 {
    font-size: 1.05rem;
    color: var(--tk-ink);
    margin: 0 0 10px;
    letter-spacing: -0.01em;
}
.tk-legal p {
    color: var(--tk-ink-dim);
    font-size: 15px;
    line-height: 1.65;
    margin: 0 0 10px;
}
.tk-legal p:last-child { margin-bottom: 0; }
.tk-legal-updated {
    margin-top: 28px;
    padding-top: 18px;
    border-top: 1px solid var(--tk-line);
    font-family: var(--tk-mono);
    font-size: 12px;
    letter-spacing: 0.04em;
    color: var(--tk-faint);
}

/* ─── Mission affiliation — onglet nav (badge non-vues + verrou) ─ */
.tk-nav-badge { display: inline-flex; align-items: center; justify-content: center; min-width: 18px; height: 18px; padding: 0 5px; border-radius: 99px; background: var(--tk-danger); color: #fff; font-size: 11px; font-weight: 700; margin-left: 6px; }

/* ════════════════════════════════════════════════════════════════
   Catalogue affiliation animateur (espace/affiliation)
   Préfixe : tk-aff- (toutes les classes ci-dessous)
   ════════════════════════════════════════════════════════════════ */

/* ─── Barre de filtres ──────────────────────────────────────────── */
.tk-aff-filters {
    display: flex;
    align-items: center;
    gap: 12px;
    flex-wrap: wrap;
    margin-bottom: 24px;
}

/* Toggle Toutes / Mes inscriptions */
.tk-aff-seg {
    display: inline-flex;
    background: var(--tk-surface);
    border: 1px solid var(--tk-line);
    border-radius: 999px;
    padding: 4px;
}
.tk-aff-seg-btn {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    border: none;
    background: transparent;
    padding: 7px 16px;
    border-radius: 999px;
    font-size: 13px;
    font-weight: 600;
    color: var(--tk-muted);
    cursor: pointer;
    transition: all .18s;
    user-select: none;
}
.tk-aff-seg-btn:has(input:checked) {
    background: var(--tk-ink);
    color: #fff;
}

/* Modale de confirmation (contrôleur Stimulus `confirm`) */
.tk-confirm {
    border: 1px solid var(--tk-line);
    border-radius: 14px;
    padding: 22px 24px;
    max-width: 420px;
    width: calc(100% - 32px);
    background: var(--tk-surface);
    color: var(--tk-ink);
    box-shadow: 0 18px 48px rgba(0, 0, 0, .22);
}
.tk-confirm::backdrop { background: rgba(0, 0, 0, .45); }
.tk-confirm-msg { margin: 0 0 18px; font-size: 15px; line-height: 1.5; }
.tk-confirm-actions { display: flex; justify-content: flex-end; gap: 10px; }
.tk-confirm-check { display: flex; align-items: flex-start; gap: 8px; margin: 10px 0 4px; font-size: 13.5px; }
.tk-confirm-check a { text-decoration: underline; }

/* Formulaires admin affiliation en pleine largeur : infos sur 2 colonnes. */
.tk-aff-form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.tk-aff-form-grid > .tk-aff-form-full { grid-column: 1 / -1; }
@media (max-width: 720px) { .tk-aff-form-grid { grid-template-columns: 1fr; } }

/* Panneau « secteur ciblé » du formulaire de campagne (cible des relances affiliation). */
.tk-aff-target {
    padding: 10px 14px;
    background: var(--tk-surface);
    border: 1px solid var(--tk-line);
    border-radius: 8px;
    font-size: 13.5px;
    color: var(--tk-muted);
    line-height: 1.5;
}
.tk-aff-target-warn { color: var(--tk-orange); font-weight: 600; }

/* Ligne d'un CollectionType (bénéfice/caractéristique/produit) : champ + bouton retirer alignés. */
.tk-aff-collrow { display: flex !important; flex-wrap: nowrap; gap: 8px; align-items: center; margin-bottom: 8px; }
.tk-aff-collrow > * { flex: 1 1 0; min-width: 0; margin-bottom: 0 !important; }
.tk-aff-collrow > .tk-btn, .tk-aff-collrow > button { flex: 0 0 auto; }

/* Select secteur */
.tk-aff-sector-select {
    min-width: 200px;
    max-width: 280px;
}

/* Galerie de selection de produits (formulaire campagne) */
.tk-prodpick-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 12px; margin-top: 8px; }
/* Cellule de grille : porte la card (button) + le champ commission en sibling,
   jamais a l'interieur du button (pas de controle interactif dans un <button>). */
.tk-prodpick-cell { display: flex; flex-direction: column; gap: 6px; }
.tk-prodpick-card {
    display: flex; flex-direction: column; align-items: center; gap: 6px;
    width: 100%; padding: 12px; text-align: center; cursor: pointer;
    background: var(--tk-surface); border: 1px solid var(--tk-line); border-radius: 12px;
    transition: border-color .15s, box-shadow .15s, transform .15s;
}
.tk-prodpick-card:hover { transform: translateY(-2px); box-shadow: var(--tk-shadow-sm, 0 4px 14px rgba(20,24,32,.08)); }
.tk-prodpick-card.is-selected { border-color: var(--tk-brand); box-shadow: 0 0 0 2px var(--tk-brand) inset; }
.tk-prodpick-photo { width: 84px; height: 84px; border-radius: 999px; overflow: hidden; display: grid; place-items: center; background: var(--tk-hover); }
.tk-prodpick-photo img { width: 100%; height: 100%; object-fit: cover; }
/* Nom sur 2 lignes fixes : toutes les cards ont la meme hauteur, donc les
   bordures ET les champs commission (en sibling sous la card) restent alignes,
   quelle que soit la longueur du nom. Nom complet au survol (title). */
.tk-prodpick-name {
    font-weight: 600; font-size: 13.5px; line-height: 1.2;
    display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2;
    overflow: hidden; min-height: 2.4em;
}
.tk-prodpick-price { font-size: 12.5px; color: var(--tk-muted); }
.tk-prodpick-state::after { content: 'Sélectionner'; font-size: 11px; font-weight: 700; color: var(--tk-muted); text-transform: uppercase; letter-spacing: .05em; }
.tk-prodpick-card.is-selected .tk-prodpick-state::after { content: '✓ Sélectionné'; color: var(--tk-brand); }
.tk-prodpick-commfield { display: flex; flex-direction: column; gap: 3px; width: 100%; }
.tk-prodpick-commlbl { font-size: 10px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--tk-faint); }
.tk-prodpick-comm { text-align: center; }
.tk-prodpick-counter { font-size: 12.5px; color: var(--tk-muted); margin-top: 8px; }
/* Ligne compteur + coche « tout sélectionner » (formulaire campagne). */
.tk-prodpick-bar { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.tk-prodpick-bar .tk-prodpick-counter { margin-bottom: 0; }
.tk-prodpick-all { display: inline-flex; align-items: center; gap: 6px; margin: 8px 0 0; cursor: pointer; font-size: 12.5px; color: var(--tk-muted); }
.tk-prodpick-all input { margin: 0; cursor: pointer; }

/* Recherche interne du selecteur de membres de pack (modale pack). */
.tk-prodpick-search { position: relative; margin: 8px 0; }
.tk-prodpick-search i { position: absolute; left: 12px; top: 50%; transform: translateY(-50%); color: var(--tk-faint); font-size: 13px; pointer-events: none; }
.tk-prodpick-search input { width: 100%; border: 1px solid var(--tk-line); background: var(--tk-surface); border-radius: 10px; padding: 9px 12px 9px 34px; font-family: inherit; font-size: 13.5px; color: var(--tk-ink); outline: none; }
.tk-prodpick-search input:focus { border-color: var(--tk-line-strong); }

/* Card de pack dans la galerie de selection (formulaire campagne). */
.tk-prodpick-card.is-pack { border-color: var(--tk-line-strong); }
.tk-prodpick-tag {
    align-self: flex-start; background: var(--tk-brand); color: #fff; border-radius: 999px;
    padding: 2px 9px; font-size: 9.5px; font-weight: 800; letter-spacing: .08em; text-transform: uppercase;
}
.tk-prodpick-members { font-size: 11.5px; color: var(--tk-muted); }

/* ─── Sections (En cours / À venir / Passées) ───────────────────── */
.tk-aff-section { margin-top: 28px; }
.tk-aff-section:first-child { margin-top: 0; }

.tk-aff-section-head {
    display: flex;
    align-items: center;
    gap: 10px;
    margin-bottom: 14px;
}

/* Pastille de couleur avant le titre */
.tk-aff-section-dot {
    width: 9px;
    height: 9px;
    border-radius: 999px;
    flex: none;
}
.tk-aff-section-dot--live     { background: var(--tk-ok); box-shadow: 0 0 0 3px var(--tk-ok-soft); }
.tk-aff-section-dot--upcoming { background: var(--tk-orange); box-shadow: 0 0 0 3px color-mix(in srgb, var(--tk-orange), transparent 82%); }
.tk-aff-section-dot--past     { background: var(--tk-faint); }

.tk-aff-section-count {
    font-size: 11px;
    font-weight: 700;
    color: var(--tk-muted);
    background: var(--tk-hover);
    border: 1px solid var(--tk-line);
    border-radius: 999px;
    padding: 2px 8px;
}
.tk-aff-section-hint {
    font-size: 12px;
    color: var(--tk-faint);
    margin-left: 4px;
}

/* En-tête de page affiliation : titre + bouton d'aide alignés. */
.tk-aff-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 18px; flex-wrap: wrap; }
.tk-aff-help-btn {
    display: inline-flex; align-items: center; gap: 6px;
    background: transparent; border: 1px solid var(--tk-line); color: var(--tk-muted);
    border-radius: 999px; padding: 7px 14px; font-size: 13.5px; font-weight: 600; cursor: pointer;
    transition: border-color .15s, color .15s;
}
.tk-aff-help-btn:hover { border-color: var(--tk-brand); color: var(--tk-brand); }

/* Groupe gauche (titre + revoir la vidéo) et bloc stats à droite du header. */
.tk-aff-head-left { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.tk-aff-headstats { display: flex; gap: 28px; }
.tk-aff-headstat { display: flex; flex-direction: column; align-items: flex-end; line-height: 1.15; }
.tk-aff-headstat-val { font-size: 22px; font-weight: 800; letter-spacing: -.02em; color: var(--tk-ink); }
.tk-aff-headstat-lbl {
    font-family: var(--tk-mono); font-size: 10px; letter-spacing: .08em;
    text-transform: uppercase; color: var(--tk-faint);
}
@media (max-width: 576px) {
    .tk-aff-headstats { gap: 18px; width: 100%; justify-content: space-between; }
    .tk-aff-headstat { align-items: flex-start; }
}

/* Modal vidéo de bienvenue. */
.tk-welcome {
    border: none; border-radius: 16px; padding: 0; width: min(880px, 92vw);
    background: var(--tk-surface); box-shadow: 0 20px 60px rgba(0,0,0,.3); overflow: hidden;
}
.tk-welcome::backdrop { background: rgba(10, 6, 7, .6); }
.tk-welcome-close {
    position: absolute; top: 10px; right: 10px; z-index: 2;
    width: 36px; height: 36px; border-radius: 999px; border: none; cursor: pointer;
    background: rgba(0,0,0,.55); color: #fff; display: flex; align-items: center; justify-content: center;
}
.tk-welcome-frame { position: relative; width: 100%; aspect-ratio: 16 / 9; background: #000; }
.tk-welcome-frame iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }

/* ─── Grille de cartes ──────────────────────────────────────────── */
/* 2 cartes par ligne ; 1 sur mobile (<=760px). */
.tk-aff-grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 18px;
}

/* ─── Carte campagne ────────────────────────────────────────────── */
.tk-aff-card {
    position: relative;
    background: var(--tk-surface);
    border: 1px solid var(--tk-line);
    border-radius: 16px;
    overflow: hidden;
    box-shadow: 0 1px 4px rgba(20, 24, 32, .06);
    transition: transform .2s, box-shadow .2s, border-color .2s;
    display: flex;
    flex-direction: column;
}
.tk-aff-card:hover {
    transform: translateY(-2px);
    box-shadow: 0 6px 20px rgba(20, 24, 32, .10);
    border-color: color-mix(in srgb, var(--tk-line), var(--tk-ink) 20%);
}
.tk-aff-card--past { opacity: .72; }
.tk-aff-card--past:hover { opacity: 1; }

/* Barre dorée « Nouveau » en haut */
.tk-aff-card--new { border-color: var(--tk-orange); }
.tk-aff-new-bar {
    position: absolute;
    top: 0; left: 0; right: 0;
    height: 3px;
    background: linear-gradient(90deg, var(--tk-orange), var(--tk-orange-2));
    z-index: 2;
}

.tk-aff-card-inner {
    padding: 16px 18px 14px;
    display: flex;
    flex-direction: column;
    gap: 14px;
    flex: 1;
}

/* ─── Bannière vidéo ────────────────────────────────────────────── */
.tk-aff-cover {
    position: relative;
    display: block;
    width: 100%;
    height: 148px;
    border: none;
    background-color: #0a0607;
    background-size: cover;
    background-position: center;
    cursor: pointer;
    overflow: hidden;
    font-family: inherit;
    border-bottom: 1px solid var(--tk-line);
    padding: 0;
}
.tk-aff-cover-img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
}
/* Aperçu vidéo (embed) quand aucune bannière : non interactif, le clic ouvre la modale. */
.tk-aff-cover-frame {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    border: 0;
    pointer-events: none;
}
.tk-aff-cover-scrim {
    position: absolute;
    inset: 0;
    background: linear-gradient(to bottom,
        rgba(10,6,7,.1) 0%,
        rgba(10,6,7,0) 30%,
        rgba(10,6,7,.65) 100%);
    transition: background .2s;
}
.tk-aff-cover:hover .tk-aff-cover-scrim {
    background: linear-gradient(to bottom,
        rgba(10,6,7,.25) 0%,
        rgba(10,6,7,.1) 40%,
        rgba(10,6,7,.75) 100%);
}
.tk-aff-cover-play {
    position: absolute;
    top: 50%; left: 50%;
    transform: translate(-50%, -60%);
    display: flex;
    align-items: center;
    justify-content: center;
    width: 50px; height: 50px;
    border-radius: 999px;
    background: rgba(10,6,7,.45);
    border: 1.5px solid rgba(255,255,255,.55);
    color: #fff;
    font-size: 24px;
    padding-left: 3px;
    backdrop-filter: blur(2px);
    transition: background .18s, transform .18s;
}
.tk-aff-cover:hover .tk-aff-cover-play {
    background: var(--tk-orange);
    border-color: var(--tk-orange);
    transform: translate(-50%, -60%) scale(1.08);
}
.tk-aff-cover-bar {
    position: absolute;
    left: 0; right: 0; bottom: 0;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    padding: 8px 12px;
}
.tk-aff-cover-label {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-size: 12px;
    font-weight: 600;
    color: #fff;
    text-shadow: 0 1px 3px rgba(0,0,0,.5);
}
.tk-aff-cover-expand {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    font-size: 10px;
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: #fff;
    background: rgba(10,6,7,.45);
    border: 1px solid rgba(255,255,255,.18);
    padding: 3px 9px;
    border-radius: 999px;
    backdrop-filter: blur(2px);
    transition: background .15s, border-color .15s;
}
.tk-aff-cover:hover .tk-aff-cover-expand {
    background: var(--tk-orange);
    border-color: var(--tk-orange);
    color: #1b1208;
}

/* ─── En-tête de carte : logo + meta + badges ───────────────────── */
.tk-aff-card-head {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 10px;
}
.tk-aff-brand {
    display: flex;
    gap: 12px;
    align-items: flex-start;
    min-width: 0;
}
.tk-aff-brand-logo {
    flex: none;
    width: 54px; height: 54px;
    border-radius: 12px;
    background: #fff;
    border: 1px solid var(--tk-line);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 7px;
    overflow: hidden;
}
.tk-aff-brand-logo img {
    max-width: 100%; max-height: 100%;
    object-fit: contain;
}
.tk-aff-brand-initials {
    font-size: 18px;
    font-weight: 800;
    color: var(--tk-faint);
}
.tk-aff-brand-meta { min-width: 0; }
.tk-aff-sector {
    font-size: 10px;
    font-weight: 700;
    letter-spacing: .1em;
    text-transform: uppercase;
    color: var(--tk-faint);
    display: block;
    margin-bottom: 2px;
}
.tk-aff-card-title {
    font-size: 15.5px;
    font-weight: 700;
    letter-spacing: -0.01em;
    margin: 0;
    line-height: 1.25;
}
.tk-aff-sectors { display: flex; align-items: center; gap: 6px; margin-top: 4px; }
.tk-aff-card-desc { margin: 6px 0 0; font-size: 12.5px; line-height: 1.4; color: var(--tk-muted); }
.tk-aff-infobtns { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; }
.tk-aff-card-tags {
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    gap: 6px;
    flex: none;
}

/* ─── Badge statut (surcharge pour le dot animé « live ») ──────── */
.tk-aff-livedot {
    width: 6px; height: 6px;
    border-radius: 999px;
    background: var(--tk-ok);
    animation: tk-aff-pulse 1.6s ease infinite;
    flex: none;
}
@keyframes tk-aff-pulse {
    0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--tk-ok), transparent 40%); }
    50%       { box-shadow: 0 0 0 5px color-mix(in srgb, var(--tk-ok), transparent 100%); }
}

/* ─── Badge « Nouveau » ─────────────────────────────────────────── */
.tk-aff-new {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    font-size: 10px;
    font-weight: 700;
    letter-spacing: .07em;
    text-transform: uppercase;
    color: var(--tk-orange);
    background: color-mix(in srgb, var(--tk-orange), #fff 88%);
    padding: 3px 8px;
    border-radius: 999px;
}
.tk-aff-new-dot {
    width: 5px; height: 5px;
    border-radius: 999px;
    background: var(--tk-orange);
    flex: none;
}

/* ─── Pastilles produits ────────────────────────────────────────── */
.tk-aff-prodrow {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 10px;
}
.tk-aff-thumbs { display: flex; gap: 6px; overflow-x: auto; padding-bottom: 4px; scrollbar-width: thin; }
.tk-aff-thumbs::-webkit-scrollbar { height: 6px; }
.tk-aff-thumbs::-webkit-scrollbar-thumb { background: var(--tk-line); border-radius: 999px; }
.tk-aff-thumb {
    width: 46px; height: 46px;
    border-radius: 999px;
    overflow: hidden;
    background: var(--tk-hover);
    border: 2px solid var(--tk-surface);
    box-shadow: 0 1px 3px rgba(20,15,10,.1);
    flex: none;
}
.tk-aff-thumb img {
    width: 100%; height: 100%;
    object-fit: cover;
    object-position: center;
}
.tk-prodtable { width: 100%; border-collapse: collapse; font-size: 13.5px; }
.tk-prodtable th {
    text-align: left; font-family: var(--tk-mono); font-size: 10px; letter-spacing: .06em;
    text-transform: uppercase; color: var(--tk-faint); font-weight: 600;
    padding: 6px 10px; border-bottom: 1px solid var(--tk-line);
}
.tk-prodtable th:not(:first-child), .tk-prodtable td:not(:first-child) { text-align: right; white-space: nowrap; }
.tk-prodtable td { padding: 9px 10px; border-bottom: 1px solid var(--tk-line); color: var(--tk-ink); }
.tk-prodtable tr:last-child td { border-bottom: none; }
.tk-prodtable-gain { font-weight: 700; color: var(--tk-brand); }

/* ─── 4 stats ───────────────────────────────────────────────────── */
.tk-aff-stats {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    background: var(--tk-hover);
    border: 1px solid var(--tk-line);
    border-radius: 12px;
    overflow: hidden;
}
.tk-aff-statcell {
    padding: 10px 12px;
    display: flex;
    flex-direction: column;
    gap: 3px;
    border-left: 1px solid var(--tk-line);
    min-width: 0;
}
.tk-aff-statcell:first-child { border-left: none; }
.tk-aff-statlbl {
    font-size: 9px;
    font-weight: 700;
    letter-spacing: .1em;
    text-transform: uppercase;
    color: var(--tk-faint);
    /* Libellés affichés en entier : on autorise le retour à la ligne et on
       réserve 2 lignes pour que les valeurs restent alignées entre colonnes
       (sinon « Commission moy. » / « Gain moy./vente » sont coupés en 2 par ligne). */
    line-height: 1.2;
    min-height: 2.4em;
}
.tk-aff-statval {
    font-size: 13px;
    font-weight: 600;
    color: var(--tk-ink);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.tk-aff-statval--gain { color: var(--tk-ok); }

/* ─── Pied de carte (CTA) ───────────────────────────────────────── */
.tk-aff-card-foot {
    display: flex;
    align-items: center;
    gap: 10px;
    margin-top: auto;
    flex-wrap: wrap;
}
.tk-aff-cta-hint {
    font-size: 11px;
    color: var(--tk-faint);
    font-style: italic;
}
.tk-aff-cta-form { display: inline-flex; margin: 0; }
.tk-aff-cta-pill {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 7px 14px;
    border-radius: 999px;
    font-size: 0.82rem;
    font-weight: 600;
    line-height: 1;
}
.tk-aff-cta-pill--ok   { background: color-mix(in srgb, var(--tk-success) 14%, transparent); color: var(--tk-success); }
.tk-aff-cta-pill--ko   { background: color-mix(in srgb, var(--tk-danger) 12%, transparent);  color: var(--tk-danger); }
.tk-aff-cta-pill--wait { background: var(--tk-hover); color: var(--tk-muted); }
/* Surlignage « nouvel inscrit » (admin, campagne En cours) */
.tk-aff-reg--new > td { background: color-mix(in srgb, var(--tk-orange) 9%, transparent); }

/* ─── Overlay vidéo (modal lecteur) ─────────────────────────────── */
.tk-aff-video-overlay {
    position: fixed;
    inset: 0;
    background: rgba(12, 14, 18, .55);
    backdrop-filter: blur(4px);
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 1050;
    padding: 20px;
    opacity: 0;
    transition: opacity .22s;
}
.tk-aff-video-overlay.is-open { opacity: 1; }

.tk-aff-video-modal {
    background: var(--tk-surface);
    border-radius: 18px;
    width: 100%;
    max-width: min(94vw, 880px);
    padding: 20px 24px 24px;
    box-shadow: 0 30px 80px rgba(10,8,6,.4);
    display: flex;
    flex-direction: column;
    gap: 14px;
    transform: translateY(10px) scale(.98);
    opacity: 0;
    transition: transform .26s, opacity .26s;
}
.tk-aff-video-overlay.is-open .tk-aff-video-modal {
    transform: translateY(0) scale(1);
    opacity: 1;
}

.tk-aff-video-modal-head {
    display: flex;
    justify-content: flex-end;
}
.tk-aff-video-modal-close {
    width: 36px; height: 36px;
    border-radius: 999px;
    border: 1px solid var(--tk-line);
    background: var(--tk-hover);
    color: var(--tk-muted);
    font-size: 15px;
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    transition: all .15s;
}
.tk-aff-video-modal-close:hover {
    border-color: var(--tk-danger);
    color: var(--tk-danger);
}

/* Wrapper iframe 16:9 */
.tk-aff-video-frame {
    position: relative;
    width: 100%;
    padding-bottom: 56.25%;
    border-radius: 12px;
    overflow: hidden;
    background: #0a0607;
}
.tk-aff-video-frame iframe {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    border: 0;
}

/* ─── Responsive ────────────────────────────────────────────────── */
@media (max-width: 760px) {
    .tk-aff-grid { grid-template-columns: 1fr; }
    .tk-aff-stats { grid-template-columns: repeat(2, 1fr); }
    .tk-aff-statcell:nth-child(3) { border-left: none; }
    .tk-aff-cover { height: 120px; }
}
@media (max-width: 480px) {
    .tk-aff-filters { flex-direction: column; align-items: stretch; }
    .tk-aff-sector-select { max-width: 100%; }
}
.tk-nav-aff.is-locked { opacity: .5; cursor: not-allowed; }

/* ═══════════════════════════════════════════════════════════════════
   Vue Live affiliation (Phase 3) — thème sombre « studio » scopé .tk-live
   ═══════════════════════════════════════════════════════════════════ */
.tk-live {
    /* La page Live étend base_clean (pas de classe .tk-app sur <body>) : on
       redéfinit ici les tokens fonctionnels consommés par le thème studio,
       sinon ils ne résolvent pas (ils vivent dans le bloc .tk-app). Valeurs
       alignées sur .tk-app ; thème volontairement autonome (spec Phase 3). */
    --tk-orange: #df8a0c;
    --tk-orange-2: #eaa53a;
    --tk-ok: #1f9d63;
    --tk-alert: #e23a6b;
    --tk-mono: 'Plus Jakarta Sans', ui-sans-serif, system-ui, sans-serif;
    --live-accent: var(--tk-orange);
    --live-gold-grad: linear-gradient(180deg, #fbbf24 0%, #df8a0c 100%);
    --live-card: rgba(255, 224, 200, .045);
    --live-line: rgba(255, 220, 200, .12);
    --live-muted: #c9bdb6;
    --live-faint: #8a7c75;
    --live-chip: rgba(255, 220, 200, .07);
    font-family: 'Plus Jakarta Sans', ui-sans-serif, system-ui, sans-serif;
    position: fixed;
    inset: 0;
    z-index: 50;
    height: 100dvh;
    overflow: hidden;
    display: flex;
    flex-direction: column;
    background: radial-gradient(120% 80% at 50% -10%, #1a1012 0%, #0a0607 60%);
    color: #f5efe8;
}
/* max-width généreux : la vue Live occupe tout l'espace sur grand écran
   (plafond 2200px sur ultra-wide). Jamais plus étroit qu'avant sur écran normal. */
.live-shell { max-width: 2200px; width: 100%; margin: 0 auto; padding: 16px clamp(26px, 2.5vw, 56px) 20px; flex: 1; min-height: 0; display: flex; flex-direction: column; }
.live-header { flex-shrink: 0; }
.live-header-row { display: flex; align-items: center; gap: 20px; }
.live-back { display: inline-flex; align-items: center; gap: 8px; background: var(--live-card); border: 1px solid var(--live-line); color: inherit; text-decoration: none; padding: 9px 15px; border-radius: 999px; font-size: 13.5px; font-weight: 600; flex-shrink: 0; transition: all .15s; }
.live-back:hover { border-color: var(--live-accent); color: var(--tk-orange-2); }
.live-brand { display: flex; align-items: center; gap: 16px; min-width: 0; flex: 1; }
.live-brand-logo { flex-shrink: 0; width: 60px; height: 60px; border-radius: 14px; background: #fff; display: flex; align-items: center; justify-content: center; padding: 8px; overflow: hidden; }
.live-brand-logo img { max-width: 100%; max-height: 100%; object-fit: contain; }
.live-brand-initials { color: #1b1208; font-weight: 800; font-size: 24px; }
.live-brand-line { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.live-sector { font-family: var(--tk-mono); font-size: 11px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: var(--live-faint); }
.live-dates { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; color: var(--live-muted); }
.live-title { font-size: clamp(27px, 1.9vw, 40px); font-weight: 800; letter-spacing: -0.025em; margin: 5px 0 0; line-height: 1.05; color: #fff; }
/* Badge de statut réutilisé dans l'en-tête : ses couleurs reposent sur des tokens
   .tk-app (absents ici) → on les surcharge pour le thème sombre studio. */
.tk-live .tk-aff-status { background: var(--live-chip); color: var(--live-muted); border: 1px solid var(--live-line); }
.tk-live .tk-aff-status-live { background: color-mix(in srgb, var(--tk-ok) 20%, transparent); color: #6fe0a6; border-color: transparent; }
.tk-live .tk-aff-status-upcoming { background: color-mix(in srgb, var(--tk-orange) 20%, transparent); color: var(--tk-orange-2); border-color: transparent; }
.tk-live .tk-aff-status-past { background: var(--live-chip); color: var(--live-faint); }

/* Onglets */
.live-tabs { display: flex; gap: 4px; margin-top: 16px; border-bottom: 1px solid var(--live-line); }
.live-tabs button { display: inline-flex; align-items: center; gap: 9px; background: none; border: none; color: var(--live-muted); padding: 11px 20px; font-size: 15px; font-weight: 600; cursor: pointer; position: relative; border-radius: 10px 10px 0 0; transition: color .15s; }
.live-tabs button:hover { color: #fff; }
.live-tabs button.on { color: #fff; }
.live-tabs button.on::after { content: ''; position: absolute; left: 12px; right: 12px; bottom: -1px; height: 3px; border-radius: 3px; background: var(--live-gold-grad); }
.live-tabs button em { font-style: normal; font-family: var(--tk-mono); font-size: 11px; background: var(--live-chip); padding: 2px 8px; border-radius: 999px; color: var(--live-muted); }
/* Recherche de la barre d'onglets LIVE. Poussée à droite : les onglets restent
   à gauche, à leur place habituelle. */
.live-search { margin-left: auto; display: flex; align-items: center; gap: 7px; background: var(--live-card); border: 1px solid var(--live-line); border-radius: 999px; padding: 5px 13px; margin-bottom: 6px; color: var(--live-muted); }
.live-search input { background: none; border: none; color: #fff; font-size: 13.5px; width: 150px; outline: none; }
.live-search input::placeholder { color: var(--live-muted); }
.live-search:focus-within { border-color: var(--live-accent); }
.live-grid-empty { grid-column: 1 / -1; align-self: center; text-align: center; color: var(--live-muted); font-size: 14px; margin: 0; }
.live-grid-empty[hidden] { display: none; }

/* Minuteur de session */
.live-session { display: flex; align-items: stretch; flex-wrap: wrap; margin-top: 12px; padding: 3px 6px; border: 1px solid var(--live-line); border-radius: 14px; background: var(--live-card); transition: background .3s, border-color .3s; }
.live-session-timer { flex: 1 1 380px; display: flex; align-items: center; gap: 10px; min-width: 0; padding: 4px 10px; }
.live-session-timer > .live-session-btn { margin-left: auto; }
.live-session-divider { width: 1px; align-self: stretch; background: var(--live-line); margin: 5px 0; flex-shrink: 0; }
.live-session-sound { flex: 1 1 360px; display: flex; align-items: center; gap: 10px; min-width: 0; padding: 4px 10px; }
.live-dur-chips { display: flex; gap: 6px; flex-wrap: wrap; }
.live-dur-chips button { border: 1px solid var(--live-line); background: transparent; color: var(--live-muted); padding: 6px 11px; border-radius: 999px; font-size: 12.5px; font-weight: 600; cursor: pointer; transition: all .15s; }
.live-dur-chips button:hover { color: #fff; border-color: var(--live-accent); }
.live-dur-chips button.on { background: var(--live-accent); color: #1b1208; border-color: transparent; }
.live-free-input { width: 72px; background: rgba(255,255,255,.08); border: 1.5px solid var(--live-line); border-radius: 999px; color: #fff; font-size: 12.5px; font-weight: 700; padding: 6px 10px; text-align: center; }
.live-free-input:focus { outline: 2px solid var(--live-accent); outline-offset: 1px; border-color: var(--live-accent); }
.live-session-btn { display: inline-flex; align-items: center; gap: 8px; border: none; border-radius: 10px; padding: 10px 15px; font-size: 13px; font-weight: 700; cursor: pointer; white-space: nowrap; flex-shrink: 0; transition: transform .15s, filter .15s; }
.live-session-btn:hover { transform: translateY(-1px); }
.live-session-btn.start { background: var(--tk-ok); color: #fff; }
.live-session-btn.start:hover { filter: brightness(1.08); }
.live-session-btn.stop { background: transparent; color: var(--live-muted); border: 1.5px solid var(--live-line); }
.live-session-btn.stop:hover { border-color: var(--tk-alert); color: var(--tk-alert); }
.live-timer-block { display: flex; flex-direction: column; gap: 1px; }
.live-timer { font-size: clamp(22px, 1.5vw, 32px); font-weight: 800; letter-spacing: -0.01em; line-height: 1; font-variant-numeric: tabular-nums; color: #fff; }
.live-timer-sub { font-size: 12px; color: var(--live-muted); }
.live-session.alert { background: color-mix(in srgb, var(--tk-alert) 12%, transparent); border-color: color-mix(in srgb, var(--tk-alert) 50%, transparent); animation: liveSessionPulse 1.5s ease infinite; }
.live-session.alert .live-timer, .live-session.alert .live-timer-sub { color: var(--tk-alert); font-weight: 700; }
@keyframes liveSessionPulse { 0%,100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--tk-alert) 0%, transparent); } 50% { box-shadow: 0 0 0 4px color-mix(in srgb, var(--tk-alert) 18%, transparent); } }

/* Son promo (rouge) */
.live-sound { display: flex; align-items: center; gap: 10px; }
.live-sound-btn { display: inline-flex; align-items: center; gap: 8px; border: none; border-radius: 999px; padding: 10px 17px; font-size: 13.5px; font-weight: 700; color: #fff; cursor: pointer; white-space: nowrap; background: linear-gradient(180deg, #f1463f 0%, #d61f1f 100%); box-shadow: inset 0 1px 0 rgba(255,255,255,.3), 0 4px 16px rgba(214,31,31,.42); transition: transform .14s, filter .14s; }
.live-sound-btn:hover { transform: translateY(-1px); filter: brightness(1.06); }
.live-sound-btn.armed { animation: liveSoundPulse 1.5s ease infinite; }
@keyframes liveSoundPulse { 0%,100% { box-shadow: inset 0 1px 0 rgba(255,255,255,.3), 0 4px 16px rgba(214,31,31,.42); } 50% { box-shadow: inset 0 1px 0 rgba(255,255,255,.3), 0 4px 26px rgba(214,31,31,.75); } }
.live-sound-live { display: inline-flex; align-items: center; gap: 5px; font-family: var(--tk-mono); font-size: 10px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; background: rgba(255,255,255,.22); padding: 2px 7px; border-radius: 999px; }
.live-sound-livedot { width: 5px; height: 5px; border-radius: 999px; background: #fff; animation: liveDot 1.4s ease infinite; }
@keyframes liveDot { 0%,100% { opacity: 1; } 50% { opacity: .3; } }
.live-sound-chips { display: flex; gap: 4px; }
.live-sound-chips button { border: 1px solid var(--live-line); background: transparent; color: var(--live-muted); padding: 5px 10px; border-radius: 999px; font-size: 12px; font-weight: 600; cursor: pointer; transition: all .14s; }
.live-sound-chips button.on { background: #d61f1f; color: #fff; border-color: transparent; }

/* Contenu + grille produits */
.live-content { flex: 1; min-height: 0; display: flex; flex-direction: column; overflow: auto; }
.live-grid { --live-card-w: calc((100% - 28px) / 3); display: grid; gap: 14px; margin-top: 16px; justify-content: center; align-content: center; flex: 1; min-height: 0; grid-template-columns: repeat(auto-fit, var(--live-card-w)); grid-auto-rows: var(--live-card-h, 1fr); }
/* Gabarit de card partagé par les produits et les packs. Une card de pack ne
   porte jamais .live-prod (cf. _packs_grid.html.twig), le partage se fait donc
   par liste de sélecteurs. */
.live-prod, .live-pack { background: var(--live-card); border: 1px solid var(--live-line); border-radius: 18px; overflow: hidden; cursor: pointer; position: relative; display: flex; flex-direction: column; height: 100%; min-height: 0; transition: transform .2s, border-color .2s, box-shadow .2s; }
.live-prod:hover, .live-prod:focus-visible, .live-pack:hover, .live-pack:focus-visible { transform: translateY(-3px); border-color: color-mix(in srgb, var(--live-accent) 50%, var(--live-line)); box-shadow: 0 10px 30px rgba(0,0,0,.4); outline: none; }
.live-prod-num { position: absolute; top: 10px; left: 12px; font-family: var(--tk-mono); font-size: 13px; font-weight: 800; color: var(--live-accent); z-index: 2; }
.live-prod-zoom { position: absolute; top: 10px; right: 12px; color: var(--live-faint); font-size: 14px; opacity: 0; transition: opacity .2s; }
.live-prod:hover .live-prod-zoom, .live-pack:hover .live-prod-zoom { opacity: 1; }
.live-prod-photo { flex: none; height: 40%; display: grid; place-items: center; padding: 12px 14px 0; }
.live-circle { height: 100%; aspect-ratio: 1; max-width: 100%; border-radius: 999px; overflow: hidden; background: radial-gradient(circle at 50% 38%, #fbf9f6, #e8e1d7); box-shadow: 0 10px 34px rgba(0,0,0,.45), inset 0 0 0 1px rgba(255,255,255,.06); display: flex; align-items: center; justify-content: center; }
.live-circle img { width: 100%; height: 100%; object-fit: cover; }
.live-circle-ph { color: #b9a89c; font-size: 40px; }
.live-prod-body { padding: 6px 16px 16px; display: flex; flex-direction: column; gap: 8px; min-height: 0; overflow: hidden; }
.live-prod-titlerow { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; }
.live-prod-name { font-size: clamp(16px, 1.05vw, 22px); font-weight: 700; margin: 0; color: #fff; line-height: 1.15; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; }
.live-prod-pricewrap { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; flex-shrink: 0; }
.live-prod-price { font-weight: 800; font-size: clamp(15px, 1vw, 20px); color: #fff; white-space: nowrap; }
.live-prod-comm { display: inline-flex; align-items: center; gap: 2px; font-family: var(--tk-mono); font-size: 11px; font-weight: 700; color: var(--tk-orange-2); white-space: nowrap; }
/* Tag d'appartenance à un pack, sur la card d'un produit membre. Il occupe la
   place de .live-prod-comm : un membre n'a pas de commission propre. Volontairement
   neutre (pas d'or) pour ne pas se confondre avec une valeur monétaire. */
.live-prod-packtag { display: inline-flex; align-items: center; gap: 5px; font-size: 10.5px; font-weight: 700; letter-spacing: .02em; color: var(--live-muted); background: var(--live-chip); border: 1px solid var(--live-line); border-radius: 999px; padding: 2px 8px; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.live-benefits { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }
.live-benefits li { display: flex; align-items: baseline; gap: 7px; font-size: clamp(13px, 0.9vw, 16px); color: var(--live-muted); }
.live-benefits li .bi { color: var(--tk-ok); font-size: 12px; }
.live-benefits-more { color: var(--tk-orange-2); font-size: clamp(12px, 0.85vw, 15px); font-weight: 600; }
.live-caracs { display: flex; flex-wrap: wrap; gap: 5px; margin-top: auto; }
.live-carac { font-family: var(--tk-mono); font-size: 10.5px; font-weight: 600; letter-spacing: .03em; color: var(--live-muted); background: var(--live-chip); border: 1px solid var(--live-line); padding: 3px 8px; border-radius: 999px; }
.live-carac.more { color: var(--tk-orange-2); border-color: color-mix(in srgb, var(--live-accent) 40%, transparent); }

/* Card de pack : même gabarit que la card produit (sélecteurs partagés
   plus haut), moins les caractéristiques, plus un badge et la composition.
   Elle ne porte JAMAIS la classe .live-prod, voir le commentaire du partial
   _packs_grid.html.twig. Le margin-top: auto de .live-pack-count reproduit
   celui de .live-caracs : la sonde de hauteur de measure() en dépend. */
.live-pack-tag { display: inline-flex; align-items: center; gap: 5px; align-self: flex-start; font-size: 9.5px; font-weight: 800; text-transform: uppercase; letter-spacing: .08em; color: #fff; background: var(--live-gold-grad); border-radius: 999px; padding: 3px 9px; margin-bottom: 6px; }
.live-pack-count { margin-top: auto; font-size: 12px; color: var(--live-muted); border-top: 1px solid var(--live-line); padding-top: 8px; }

/* Onglet Brief */
.live-brief-panel { display: grid; grid-template-columns: 1fr 280px; gap: 20px; margin-top: 18px; }
.live-brief-card { background: var(--live-card); border: 1px solid var(--live-line); border-radius: 18px; padding: 24px; }
.live-col-label { display: inline-flex; align-items: center; gap: 8px; font-family: var(--tk-mono); font-size: 11px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--live-faint); margin-bottom: 12px; }
.live-brief-text { font-size: clamp(16px, 1vw, 21px); line-height: 1.6; color: #ece3da; margin: 0; white-space: pre-line; }
.live-brief-aside { display: flex; flex-direction: column; gap: 14px; }
.live-brief-meta { display: flex; flex-direction: column; gap: 2px; padding-bottom: 12px; border-bottom: 1px solid var(--live-line); }
.live-bm-label { font-family: var(--tk-mono); font-size: 10px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: var(--live-faint); }
.live-bm-val { font-size: 15px; font-weight: 600; color: #fff; }
.live-bm-val.accent { color: var(--tk-orange-2); }

/* Focus plein écran */
.live-focus { position: fixed; inset: 0; z-index: 300; background: radial-gradient(120% 90% at 50% -10%, #1c1113 0%, #070405 65%); display: flex; flex-direction: column; padding: 22px 30px 26px; }
.live-focus[hidden] { display: none; }
.live-focus-top { display: flex; align-items: center; justify-content: space-between; }
.live-focus-count { font-family: var(--tk-mono); font-size: 13px; color: var(--live-muted); letter-spacing: .04em; }
.live-focus-close { display: inline-flex; align-items: center; gap: 7px; background: var(--live-card); border: 1px solid var(--live-line); color: #fff; padding: 9px 15px; border-radius: 999px; font-size: 13.5px; font-weight: 600; cursor: pointer; }
.live-focus-close:hover { border-color: var(--tk-alert); color: var(--tk-alert); }
.live-focus-brief { margin-top: 14px; background: color-mix(in srgb, var(--live-accent) 10%, transparent); border: 1px solid color-mix(in srgb, var(--live-accent) 30%, transparent); border-radius: 14px; padding: 14px 18px; }
.live-focus-brief[hidden] { display: none; }
.live-brief-kicker { display: inline-flex; align-items: center; gap: 7px; font-family: var(--tk-mono); font-size: 11px; font-weight: 700; letter-spacing: .07em; text-transform: uppercase; color: var(--tk-orange-2); }
/* Brief produit du focus plein écran : respecte les retours à la ligne saisis
   (le JS injecte le texte via textContent, les \n sont déjà dans le DOM) et
   *fige* la hauteur à 6 lignes, brief court ou long : l'image et les colonnes
   gardent ainsi la même position quand on passe d'un produit à l'autre.
   Le min(20vh, ...) protège les petits écrans. Partagée par les 4 pages LIVE. */
.live-focus-brief p {
    margin: 6px 0 0;
    font-size: 17px;
    line-height: 1.4;
    color: #fff;
    white-space: pre-wrap;
    height: min(20vh, 8.4em);
    overflow-y: auto;
    overscroll-behavior: contain;
}
/* Texte de repli quand le produit n'a pas de brief (classe posée par le JS). */
.live-focus-brief p.is-empty { color: rgba(255, 255, 255, .45); font-style: italic; }
/* Bandeau de pack du focus. Hauteur figée : elle ne doit pas varier entre la
   vue du pack et celle d'un membre, sinon l'image et les colonnes sautent au
   premier clic sur la flèche. Même parti pris que .live-focus-brief. */
.live-focus-band { display: flex; align-items: center; gap: 10px; min-height: 44px; margin-top: 12px; background: var(--live-card); border: 1px solid color-mix(in srgb, var(--live-accent) 35%, transparent); border-radius: 12px; padding: 8px 14px; }
.live-focus-band[hidden] { display: none; }
.live-focus-band-tag { display: inline-flex; align-items: center; gap: 5px; flex-shrink: 0; font-size: 9.5px; font-weight: 800; text-transform: uppercase; letter-spacing: .08em; color: var(--live-muted); background: var(--live-chip); border: 1px solid var(--live-line); border-radius: 999px; padding: 2px 8px; }
.live-focus-band-name { font-size: 14px; font-weight: 800; flex-shrink: 0; }
.live-focus-band-label { flex: 1; min-width: 0; font-size: 12px; color: var(--live-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.live-focus-band-price { flex-shrink: 0; font-size: 14px; font-weight: 800; background: var(--live-gold-grad); -webkit-background-clip: text; background-clip: text; color: transparent; }
.live-focus-body { flex: 1; min-height: 0; display: grid; grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr); align-items: center; gap: clamp(24px, 4vw, 60px); margin-top: 14px; position: relative; cursor: pointer; }
.live-nav { position: absolute; top: 50%; transform: translateY(-50%); z-index: 2; width: 52px; height: 52px; border-radius: 999px; background: var(--live-card); border: 1px solid var(--live-line); color: #fff; font-size: 22px; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all .15s; }
.live-nav:hover { background: var(--live-accent); color: #1b1208; border-color: transparent; transform: translateY(-50%) scale(1.06); }
.live-nav.prev { left: -8px; }
.live-nav.next { right: -8px; }
/* min-height: 0 + max-height: 100% : sans ça l'image impose au rang de grille sa
   propre hauteur, le corps du focus ne peut plus se réduire et la colonne de
   droite repasse par-dessus les points de pagination sur les écrans peu hauts. */
.live-focus-media { height: 100%; max-height: 100%; min-height: 0; display: flex; align-items: center; justify-content: center; }
.live-focus-media img { max-width: 100%; max-height: 100%; object-fit: contain; border-radius: 20px; filter: drop-shadow(0 30px 60px rgba(0,0,0,.35)); }
/* La colonne de droite ne doit jamais dépasser la hauteur du corps du focus,
   sinon elle recouvre les points de pagination. On la borne à la rangée de
   grille (hauteur définie) et on laisse les deux listes scroller à l'intérieur. */
.live-focus-info { min-width: 0; max-height: 100%; min-height: 0; display: flex; flex-direction: column; }
.live-focus-dots { display: flex; gap: 9px; justify-content: center; margin-top: 16px; }
.live-focus-dots button { width: 9px; height: 9px; border-radius: 999px; border: none; background: var(--live-line); cursor: pointer; padding: 0; transition: all .15s; }
.live-focus-dots button.on { background: var(--live-accent); width: 26px; }
/* Le premier point de pagination représente le pack, pas un produit. */
.live-focus-dots button.is-pack { border: 1px solid var(--live-accent); }
.live-focus-titlerow { display: flex; align-items: flex-start; justify-content: space-between; gap: 18px; flex-wrap: wrap; }
.live-focus-info h2 { font-size: clamp(30px, 2.1vw, 46px); font-weight: 800; margin: 0; color: #fff; letter-spacing: -0.02em; }
.live-focus-pricewrap { display: flex; flex-direction: column; align-items: flex-end; gap: 5px; }
.live-focus-price { font-size: clamp(24px, 1.6vw, 34px); font-weight: 800; color: #fff; }
.live-focus-comm { font-family: var(--tk-mono); font-size: 13px; font-weight: 700; color: var(--tk-orange-2); }
.live-focus-gain { display: inline-flex; align-items: center; gap: 6px; font-size: 14px; font-weight: 700; color: var(--tk-ok); }
.live-focus-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 26px; margin-top: 22px; flex: 1; min-height: 0; }
/* Vue d'un pack : sans caractéristiques, les bénéfices prennent toute la place. */
.live-focus-cols:has(> [data-live-target="focusCaracsCol"][hidden]) { grid-template-columns: 1fr; }
/* Chaque colonne garde son intitulé fixe en haut et confie le débordement à sa
   liste : deux zones de scroll indépendantes (bénéfices / caractéristiques). */
.live-focus-col { display: flex; flex-direction: column; min-height: 0; }
.live-focus-benefits, .live-focus-caracs { list-style: none; margin: 0; padding: 0 6px 0 0; display: flex; flex-direction: column; gap: 9px; flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior: contain; }
.live-focus-benefits li { display: flex; align-items: baseline; gap: 9px; font-size: clamp(16px, 1vw, 21px); color: #ece3da; }
.live-focus-benefits li .bi { color: var(--tk-ok); }
.live-focus-caracs li { font-size: clamp(15px, 0.95vw, 19px); color: var(--live-muted); padding-left: 14px; position: relative; }
.live-focus-caracs li::before { content: '—'; position: absolute; left: 0; color: var(--live-faint); }

/* Feu plein écran */
.live-fire { position: fixed; inset: 0; z-index: 400; pointer-events: none; overflow: hidden; }
.live-fire-glyph { position: absolute; color: #ff5722; filter: drop-shadow(0 0 30px rgba(255,90,20,.85)) drop-shadow(0 0 8px rgba(255,180,40,.9)); opacity: 0; will-change: transform, opacity; }
.live-fire-glyph.a { top: 32%; font-size: 30vh; animation: liveFireFly 1.5s cubic-bezier(0.4,0,0.2,1) both; }
.live-fire-glyph.b { top: 12%; font-size: 17vh; color: #ff8a1f; animation: liveFireFly 1.7s cubic-bezier(0.4,0,0.2,1) .12s both; }
.live-fire-glyph.c { top: 58%; font-size: 22vh; color: #ff3b1f; animation: liveFireFly 1.6s cubic-bezier(0.4,0,0.2,1) .22s both; }
@keyframes liveFireFly { 0% { transform: translateX(115vw) scale(.6) rotate(8deg); opacity: 0; } 18% { opacity: 1; } 82% { opacity: 1; } 100% { transform: translateX(-130vw) scale(1.05) rotate(-8deg); opacity: 0; } }

/* Modal de fin de live (retour d'expérience) — thème studio sombre. */
.tk-live-feedback {
    border: none; border-radius: 18px; padding: 26px 28px; width: min(520px, 92vw);
    color: #f5efe8; background: radial-gradient(120% 90% at 50% -10%, #1c1214 0%, #120c0d 70%);
    box-shadow: 0 24px 70px rgba(0,0,0,.55); border: 1px solid var(--live-line, rgba(255,220,200,.12));
}
.tk-live-feedback::backdrop { background: rgba(5, 3, 4, .72); }
.tklf-title { font-size: 22px; font-weight: 800; margin: 0 0 4px; color: #fff; }
.tklf-sub { font-size: 14px; color: var(--live-muted, #c9bdb6); margin: 0 0 18px; }
.tklf-label { display: block; font-size: 13px; font-weight: 600; color: var(--live-muted, #c9bdb6); margin: 14px 0 6px; }
.tklf-input, .tklf-textarea {
    width: 100%; background: rgba(255,255,255,.06); border: 1px solid var(--live-line, rgba(255,220,200,.12));
    border-radius: 10px; padding: 11px 14px; color: #fff; font-size: 16px; font-family: inherit;
}
.tklf-input:focus, .tklf-textarea:focus { outline: 2px solid var(--tk-orange, #df8a0c); outline-offset: 1px; }
.tklf-emojis { display: flex; gap: 10px; }
.tklf-emoji {
    flex: 1; display: flex; flex-direction: column; align-items: center; gap: 10px;
    background: rgba(255,255,255,.05); border: 1.5px solid var(--live-line, rgba(255,220,200,.12));
    border-radius: 12px; padding: 12px 6px; font-size: 26px; cursor: pointer; color: var(--live-muted, #c9bdb6);
    transition: border-color .15s, background .15s;
}
.tklf-emoji span { font-size: 12px; font-weight: 600; }
.tklf-emoji:hover { border-color: var(--tk-orange, #df8a0c); }
.tklf-emoji.on { border-color: var(--tk-orange, #df8a0c); background: color-mix(in srgb, var(--tk-orange, #df8a0c) 18%, transparent); color: #fff; }
.tklf-error { color: #ff6a6a; font-size: 13px; font-weight: 600; min-height: 18px; margin: 10px 0 0; }
.tklf-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 18px; }
.tklf-btn { border: none; border-radius: 10px; padding: 11px 18px; font-size: 14px; font-weight: 700; cursor: pointer; }
.tklf-btn.ghost { background: transparent; color: var(--live-muted, #c9bdb6); border: 1.5px solid var(--live-line, rgba(255,220,200,.12)); }
.tklf-btn.primary { background: var(--tk-ok, #1f9d63); color: #fff; }
.tklf-btn.primary:hover { filter: brightness(1.08); }
.tklf-thanks { text-align: center; padding: 20px 0 8px; color: #fff; }
.tklf-thanks .bi { font-size: 40px; color: var(--tk-ok, #1f9d63); }
.tklf-thanks p { margin: 10px 0 0; font-size: 16px; font-weight: 600; }
.tklf-agency-notice { display: flex; align-items: flex-start; gap: 10px; background: rgba(255,210,0,.10); border: 1.5px solid rgba(255,210,0,.32); border-radius: 10px; padding: 12px 14px; margin-bottom: 18px; color: #ffd966; font-size: 13px; font-weight: 600; line-height: 1.45; }
.tklf-agency-notice .bi { font-size: 18px; flex-shrink: 0; margin-top: 1px; }
.tklf-confirm-step { text-align: center; padding: 8px 0; color: #fff; }
.tklf-confirm-step .bi { font-size: 38px; color: #ffd966; }
.tklf-confirm-title { font-size: 18px; font-weight: 800; margin: 12px 0 8px; color: #fff; }
.tklf-confirm-text { font-size: 14px; color: var(--live-muted, #c9bdb6); margin: 0 0 4px; line-height: 1.55; }

/* Bouton « Accéder au LIVE » sur la carte catalogue */
/* Bouton « Accéder au LIVE » : outline rouge + icône rouge, plus visible (retour 5.2). */
.tk-aff-live-link {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    background: transparent;
    border: 1.5px solid var(--tk-danger);
    color: var(--tk-danger);
}
.tk-aff-live-link i { color: var(--tk-danger); }
.tk-aff-live-link:hover { background: var(--tk-danger); color: #fff; }
.tk-aff-live-link:hover i { color: #fff; }
.tk-aff-live-link.disabled { opacity: .4; cursor: not-allowed; pointer-events: none; }
.live-session-not-active { display: flex; align-items: center; gap: 8px; color: var(--live-muted, #c9bdb6); font-size: 13px; font-weight: 600; margin: 4px 0 8px; }

/* Responsive : mobile → 1 colonne, scroll naturel */
@media (max-width: 860px), (max-height: 520px) {
    .tk-live { position: static; height: auto; min-height: 100dvh; overflow: visible; }
    .live-content { overflow: visible; }
    .live-grid { grid-template-columns: 1fr !important; grid-auto-rows: auto !important; align-content: start; }
    /* Le champ passe sous les onglets : côte à côte, plus rien n'est lisible. */
    .live-tabs { flex-wrap: wrap; }
    .live-search { margin-left: 0; width: 100%; }
    .live-search input { width: 100%; }
    .live-prod, .live-pack { height: auto; min-height: 0; }
    .live-prod-photo { height: 230px; }
    .live-focus-body { grid-template-columns: 1fr; align-items: start; gap: 14px; overflow: auto; }
    .live-focus-media { max-height: 38vh; }
    .live-focus-cols { grid-template-columns: 1fr; }
    /* En 1 colonne, c'est le corps du focus qui scrolle : on rend la main aux
       listes pour ne pas empiler deux niveaux de scroll sur un petit écran. */
    .live-focus-info { max-height: none; }
    .live-focus-benefits, .live-focus-caracs { flex: none; overflow: visible; }
    .live-brief-panel { grid-template-columns: 1fr; }
}
@keyframes liveFireFade { 0% { opacity: 0; transform: none; } 30% { opacity: 1; transform: none; } 100% { opacity: 0; transform: none; } }
@media (prefers-reduced-motion: reduce) {
    /* Le feu : fondu statique sans balayage horizontal (pas de gros mouvement). */
    .live-fire-glyph { animation: liveFireFade .8s ease both !important; }
    /* Coupe toutes les pulsations infinies du thème studio. */
    .live-session.alert, .live-sound-btn.armed,
    .live-sound-livedot, .tk-live .tk-aff-livedot { animation: none !important; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   ESPACE MARQUE — brand space
   ═══════════════════════════════════════════════════════════════════════════ */

/* Page wrapper */
.container-fluid.py-3 { max-width: 1140px; margin: 0 auto; }

/* ── Header marque ──────────────────────────────────────────────────────── */
.bspace-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 24px;
    padding: 24px 28px;
    flex-wrap: wrap;
}

.bspace-header-identity {
    display: flex;
    align-items: center;
    gap: 16px;
}

.bspace-avatar {
    width: 52px;
    height: 52px;
    border-radius: 12px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 22px;
    font-weight: 700;
    color: #fff;
    flex-shrink: 0;
    letter-spacing: -0.5px;
}

.bspace-identity-top {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
}

.bspace-brand-name {
    font-size: 1.375rem;
    font-weight: 700;
    margin: 0;
    line-height: 1.2;
    color: var(--tk-ink);
}

.bspace-badge-active {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 3px 9px;
    border-radius: 999px;
    font-size: 0.625rem;
    font-weight: 700;
    letter-spacing: 0.06em;
    color: var(--tk-ok);
    background: var(--tk-ok-soft);
    border: 1px solid color-mix(in srgb, var(--tk-ok), #fff 60%);
    white-space: nowrap;
}

.bspace-badge-dot {
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: var(--tk-ok);
    flex-shrink: 0;
}

.bspace-brand-sub {
    margin: 4px 0 0;
    font-size: 0.8125rem;
    color: var(--tk-muted);
}

/* KPIs */
.bspace-kpis {
    display: flex;
    align-items: center;
    gap: 0;
}

.bspace-kpi {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    padding: 0 28px;
}
.bspace-kpi:first-child { padding-left: 0; }

.bspace-kpi-sep {
    width: 1px;
    height: 48px;
    background: var(--tk-line);
}

.bspace-kpi-label {
    font-size: 0.625rem;
    font-weight: 700;
    letter-spacing: 0.08em;
    color: var(--tk-muted);
    text-transform: uppercase;
    margin-bottom: 2px;
}

.bspace-kpi-value {
    font-size: 1.75rem;
    font-weight: 800;
    color: var(--tk-ink);
    line-height: 1;
    letter-spacing: -0.03em;
}

.bspace-kpi-unit {
    font-size: 1rem;
    font-weight: 600;
}

.bspace-kpi-sub {
    font-size: 0.75rem;
    color: var(--tk-muted);
    margin-top: 3px;
}

/* ── Onglets ────────────────────────────────────────────────────────────── */
.bspace-tabs {
    display: flex;
    gap: 0;
    border-bottom: 1px solid var(--tk-line);
    margin-bottom: 24px;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
}
.bspace-tabs::-webkit-scrollbar { display: none; }

.bspace-tab {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 11px 18px;
    font-size: 0.875rem;
    font-weight: 500;
    color: var(--tk-muted);
    text-decoration: none;
    border-bottom: 2px solid transparent;
    margin-bottom: -1px;
    white-space: nowrap;
    transition: color 0.15s, border-color 0.15s;
}
.bspace-tab:hover { color: var(--tk-ink); }
.bspace-tab.is-active {
    color: var(--tk-ink);
    border-bottom-color: var(--tk-ink);
    font-weight: 600;
}

.bspace-tab-badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 20px;
    height: 20px;
    padding: 0 5px;
    border-radius: 999px;
    font-size: 0.6875rem;
    font-weight: 700;
    background: var(--tk-hover);
    color: var(--tk-muted);
}
.bspace-tab-badge--alert {
    background: #fdeaf0;
    color: #c81e4e;
}
.bspace-tab.is-active .bspace-tab-badge { background: var(--tk-ink); color: #fff; }
.bspace-tab.is-active .bspace-tab-badge--alert { background: #c81e4e; color: #fff; }

/* ── Dashboard layout ───────────────────────────────────────────────────── */
.bspace-dashboard {
    display: grid;
    grid-template-columns: 1fr 340px;
    gap: 20px;
    align-items: start;
}

.bspace-section { padding: 20px 24px; }

.bspace-section-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: 16px;
    gap: 8px;
}

.bspace-section-title {
    font-size: 0.9375rem;
    font-weight: 700;
    margin: 0;
    color: var(--tk-ink);
}

.bspace-section-sub {
    font-size: 0.75rem;
    color: var(--tk-muted);
}

.bspace-section-link {
    font-size: 0.8125rem;
    font-weight: 500;
    color: var(--tk-muted);
    text-decoration: none;
    white-space: nowrap;
    display: inline-flex;
    align-items: center;
    gap: 4px;
}
.bspace-section-link:hover { color: var(--tk-ink); }

/* Upcoming lives list */
.bspace-lives-list { display: flex; flex-direction: column; gap: 4px; }

.bspace-live-row {
    display: flex;
    align-items: center;
    gap: 14px;
    padding: 12px 14px;
    border: 1px solid var(--tk-line);
    border-radius: 10px;
    cursor: pointer;
    transition: background 0.12s;
    text-decoration: none;
    color: inherit;
}
.bspace-live-row:hover { background: var(--tk-hover); }

.bspace-live-bar {
    width: 4px;
    height: 38px;
    border-radius: 3px;
    flex-shrink: 0;
}

.bspace-live-date {
    display: flex;
    flex-direction: column;
    align-items: center;
    width: 34px;
    flex-shrink: 0;
}

.bspace-live-day-name {
    font-size: 0.625rem;
    font-weight: 700;
    letter-spacing: 0.06em;
    color: var(--tk-muted);
    text-transform: uppercase;
}

.bspace-live-day-num {
    font-size: 1.25rem;
    font-weight: 800;
    color: var(--tk-ink);
    line-height: 1.1;
    letter-spacing: -0.02em;
}

.bspace-live-info {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.bspace-live-title {
    font-size: 0.875rem;
    font-weight: 600;
    color: var(--tk-ink);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.bspace-live-meta {
    font-size: 0.75rem;
    color: var(--tk-muted);
}

.bspace-live-chevron {
    color: var(--tk-faint);
    font-size: 0.875rem;
    flex-shrink: 0;
}

/* Empty state */
.bspace-empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: 24px 16px;
    gap: 8px;
}
.bspace-empty-icon { font-size: 1.75rem; color: var(--tk-faint); }
.bspace-empty-text { font-size: 0.8125rem; color: var(--tk-muted); margin: 0; text-align: center; }

/* Quick access tools */
.bspace-tools-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 10px;
}

.bspace-tool-card {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 14px 16px;
    border: 1px solid var(--tk-line);
    border-radius: 10px;
    text-decoration: none;
    color: var(--tk-ink);
    transition: background 0.12s, border-color 0.12s;
}
.bspace-tool-card:hover { background: var(--tk-hover); border-color: var(--tk-ink); color: var(--tk-ink); }

.bspace-tool-icon {
    font-size: 1.125rem;
    color: var(--tk-muted);
    flex-shrink: 0;
}

.bspace-tool-name {
    display: block;
    font-size: 0.8125rem;
    font-weight: 600;
    color: var(--tk-ink);
}

.bspace-tool-sub {
    display: block;
    font-size: 0.7rem;
    color: var(--tk-muted);
}

.bspace-tool-ext {
    margin-left: auto;
    font-size: 0.7rem;
    color: var(--tk-faint);
    flex-shrink: 0;
}

/* ── Sidebar ────────────────────────────────────────────────────────────── */

/* Propositions card */
.bspace-card-proposals {
    background: #fef9ec;
    border: 1px solid #f5d87b;
    border-radius: 12px;
    padding: 18px 20px;
    margin-bottom: 16px;
}

.bspace-proposals-head {
    display: flex;
    align-items: center;
    gap: 8px;
    margin-bottom: 8px;
}

.bspace-proposals-icon {
    color: #b27a08;
    font-size: 1rem;
}

.bspace-proposals-title {
    font-size: 0.875rem;
    font-weight: 700;
    margin: 0;
    color: #6b4900;
}

.bspace-proposals-text {
    font-size: 0.8125rem;
    color: #7a5500;
    margin-bottom: 14px;
    line-height: 1.5;
}

.bspace-proposals-cta {
    display: block;
    width: 100%;
    padding: 11px 16px;
    background: #1b1d22;
    color: #fff;
    text-align: center;
    border-radius: 8px;
    font-size: 0.75rem;
    font-weight: 700;
    letter-spacing: 0.06em;
    text-decoration: none;
    transition: background 0.12s;
}
.bspace-proposals-cta:hover { background: #000; color: #fff; }
/* `.tk-app a` (couleur d'accent globale) a une spécificité supérieure (0,1,1) et
   repeindrait le libellé du CTA en sombre sur fond sombre : on rétablit le blanc
   avec une spécificité qui l'emporte. */
.tk-app a.bspace-proposals-cta,
.tk-app a.bspace-proposals-cta:hover { color: #fff; }

/* Animateurs list */
.bspace-hosts-count {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 22px;
    height: 22px;
    padding: 0 6px;
    border-radius: 999px;
    font-size: 0.6875rem;
    font-weight: 700;
    background: var(--tk-hover);
    color: var(--tk-muted);
}

.bspace-hosts-list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.bspace-host-row {
    display: flex;
    align-items: center;
    gap: 11px;
    padding: 9px 6px;
    border-radius: 8px;
    transition: background 0.12s;
    text-decoration: none;
    color: inherit;
}
.bspace-host-row:hover { background: var(--tk-hover); }

.bspace-host-avatar {
    width: 40px;
    height: 40px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 0.9rem;
    font-weight: 700;
    color: #fff;
    flex-shrink: 0;
    object-fit: cover;
}

.bspace-host-name {
    font-size: 0.8125rem;
    font-weight: 500;
    color: var(--tk-ink);
    flex: 1;
    min-width: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.bspace-host-meta {
    display: flex;
    align-items: center;
    gap: 6px;
    font-size: 0.75rem;
    color: var(--tk-muted);
    white-space: nowrap;
}

.bspace-host-cal { font-size: 0.8rem; }

/* ── Responsive ─────────────────────────────────────────────────────────── */
@media (max-width: 900px) {
    .bspace-dashboard { grid-template-columns: 1fr; }
    .bspace-sidebar { order: -1; }
    .bspace-kpis { flex-wrap: wrap; gap: 16px; }
    .bspace-kpi-sep { display: none; }
    .bspace-kpi { padding: 0; }
    .bspace-header { flex-direction: column; align-items: flex-start; }
}

@media (max-width: 600px) {
    .bspace-header { padding: 18px 16px; }
    .bspace-tools-grid { grid-template-columns: 1fr; }
}

/* ───────────── Planning espace marque ───────────── */

/* Toggle Semaine / Liste */
.tk-cal-viewtoggle { display:inline-flex; background:var(--tk-surface-2,#f1f1f5); border-radius:10px; padding:3px; gap:2px; }
.tk-cal-viewtoggle button { border:0; background:transparent; font:inherit; font-size:.85rem; font-weight:600;
  color:var(--tk-muted,#6a6a73); padding:6px 12px; border-radius:8px; cursor:pointer; display:inline-flex; align-items:center; gap:5px; }
.tk-cal-viewtoggle button.is-on { background:#fff; color:var(--tk-ink,#23232a); box-shadow:0 1px 3px rgba(0,0,0,.1); }

/* Carte d'événement (vue semaine) — neutralise le fond FullCalendar par défaut */
.fc-timegrid-event, .fc-timegrid-event .fc-event-main { background:transparent !important; border:0 !important; box-shadow:none !important; padding:0 !important; }
.fc-timegrid-event .fc-event-main-frame { height:100%; }
.tk-cal-ev { --evc:var(--tk-muted,#6a6a73); display:flex; height:100%; overflow:hidden; border-radius:8px;
  background:color-mix(in srgb, var(--evc), #fff 89%);
  border:1px solid color-mix(in srgb, var(--evc), #fff 52%);
  color:color-mix(in srgb, var(--evc), #000 45%); }
.tk-cal-ev.is-live { background:color-mix(in srgb, var(--evc), #fff 82%); }
.tk-cal-ev-stripe { width:4px; flex:none; background:var(--evc); }
.tk-cal-ev-b { padding:4px 7px; min-width:0; overflow:hidden; }
.tk-cal-ev-time { font-size:11.5px; font-weight:700; line-height:1.25; }
.tk-cal-ev-host { display:flex; align-items:center; gap:5px; font-size:12.5px; font-weight:600; line-height:1.25; margin-top:1px; min-width:0; }
.tk-cal-ev-hostname { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.tk-cal-ev-meta { display:flex; align-items:center; gap:4px; font-size:10.5px; font-weight:600; opacity:.85; margin-top:2px; white-space:nowrap; }
.tk-cal-ev-loc { display:inline-flex; align-items:center; }
.tk-cal-ev-loc svg { display:block; }
/* Terminé : classe ajoutée nativement par FullCalendar */
.fc-event-past .tk-cal-ev { background:var(--tk-surface-2,#f1f1f5); border-color:var(--tk-line,#e6e6ea); color:var(--tk-muted,#6a6f78); }
.fc-event-past .tk-cal-ev-stripe { background:var(--tk-line-strong,#c8c8d0); }
/* Live d'un autre animateur (planning animateur) : il sert à se répartir les
   créneaux, il reste donc en retrait des siens — fond neutre, contour pointillé. */
.tk-cal-other-host .tk-cal-ev { background:var(--tk-surface,#fff); border-style:dashed; }
.tk-cal-other-host .tk-cal-ev-stripe { opacity:.5; }

/* État de déclaration de fin de live (planning animateur) */
.tk-cal-ev-warn { color:var(--tk-danger); flex:none; }
.tk-cal-ev-gmv { font-weight:700; opacity:1; }
.tk-cal-ev-nothed { font-style:italic; }
.tk-report-state { margin-top:12px; padding:8px 12px; border-radius:var(--tk-radius-sm); background:var(--tk-hover); font-size:13.5px; font-weight:600; }
.tk-report-state-todo { color:var(--tk-danger); }

/* Modale de déclaration de secours : variantes claires (l'espace connecté est clair) */
.tk-lr-emojis { display:flex; gap:10px; }
.tk-lr-emoji {
    flex:1; display:flex; flex-direction:column; align-items:center; gap:8px;
    background:var(--tk-surface); border:1.5px solid var(--tk-line,#e6e6ea);
    border-radius:12px; padding:12px 6px; font-size:26px; cursor:pointer; color:var(--tk-muted);
    transition:border-color .15s, background .15s;
}
.tk-lr-emoji span { font-size:12px; font-weight:600; }
.tk-lr-emoji:hover { border-color:var(--tk-brand); }
.tk-lr-emoji.on { border-color:var(--tk-brand); background:var(--tk-hover); color:var(--tk-ink); }
.tk-lr-error { color:var(--tk-danger); font-size:13px; font-weight:600; min-height:18px; margin:10px 0 0; }
.tk-lr-confirm, .tk-lr-thanks { text-align:center; padding:8px 0; }
.tk-lr-confirm .bi { font-size:38px; color:var(--tk-danger); }
.tk-lr-confirm-title { font-size:18px; font-weight:800; margin:12px 0 8px; }
.tk-lr-confirm-text { font-size:14px; color:var(--tk-muted); margin:0; line-height:1.55; }
.tk-lr-thanks .bi { font-size:40px; color:var(--tk-ok,#1f9d63); }
.tk-lr-thanks p { margin:10px 0 0; font-size:16px; font-weight:600; }

/* Flèches prev/next : la police d'icônes embarquée de FullCalendar (data: URI
   « fcicons ») est bloquée par la CSP (font-src 'self'). On rend les chevrons
   via Bootstrap Icons (déjà servi en 'self'), cohérent avec le reste de l'UI. */
.tk-app .fc-icon-chevron-left::before,
.tk-app .fc-icon-chevron-right::before { font-family:"bootstrap-icons" !important; font-size:1rem; line-height:1; vertical-align:-.05em; }
.tk-app .fc-icon-chevron-left::before { content:"\f284"; }
.tk-app .fc-icon-chevron-right::before { content:"\f285"; }

/* Vue liste par statut */
.tk-cal-list { display:flex; flex-direction:column; gap:18px; }
.tk-cal-list-grp-h { display:flex; align-items:center; gap:8px; margin-bottom:8px; }
.tk-cal-list-grp-h .ttl { font-size:.95rem; font-weight:700; color:var(--tk-ink,#23232a); }
.tk-cal-list-grp-h .cnt { font-size:.72rem; font-weight:600; color:var(--tk-muted,#6a6a73);
  background:var(--tk-surface,#fff); border:1px solid var(--tk-line,#e6e6ea); border-radius:999px; padding:1px 8px; }
.tk-cal-list-card { display:flex; background:#fff; border:1px solid var(--tk-line,#e6e6ea); border-radius:10px;
  overflow:hidden; cursor:pointer; transition:box-shadow .15s; }
.tk-cal-list-card:hover { box-shadow:0 3px 12px rgba(0,0,0,.08); }
.tk-cal-list-card + .tk-cal-list-card { margin-top:6px; }
.tk-cal-list-card .bar { width:4px; flex:none; background:var(--evc,#c8c8d0); }
.tk-cal-list-card.is-past .bar { background:var(--tk-line-strong,#c8c8d0); }
.tk-cal-list-card.is-past .tk-cal-av,
.tk-cal-list-card.is-past .tk-cal-thumb { filter:grayscale(1); opacity:.8; }
.tk-cal-list-card.is-past .tk-cal-list-when,
.tk-cal-list-card.is-past .tk-cal-list-name { color:var(--tk-muted,#6a6f78); }
.tk-cal-list-cb { padding:9px 12px; flex:1; min-width:0; }
.tk-cal-list-top { display:flex; align-items:center; justify-content:space-between; gap:8px; }
.tk-cal-list-when { font-size:.8rem; font-weight:600; color:var(--tk-ink,#23232a); text-transform:capitalize; }
.tk-cal-list-mid { display:flex; align-items:center; gap:10px; margin-top:7px; }
.tk-cal-av { width:30px; height:30px; border-radius:50%; flex:none; object-fit:cover; color:#fff;
  font-size:11px; font-weight:700; display:flex; align-items:center; justify-content:center; background:var(--evc,#6a6a73); }
.tk-cal-list-name { font-size:.85rem; font-weight:600; color:var(--tk-ink,#23232a); }
.tk-cal-list-sub { font-size:.75rem; color:var(--tk-muted,#6a6a73); display:flex; align-items:center; gap:5px; flex-wrap:wrap; }
.tk-cal-list-thumbs { margin-left:auto; display:flex; gap:3px; }
.tk-cal-thumb { width:28px; height:28px; border-radius:5px; object-fit:cover; background:var(--tk-surface-2,#ececf1); border:1px solid rgba(0,0,0,.05); }
.tk-cal-pill { font-size:.62rem; font-weight:700; text-transform:uppercase; letter-spacing:.03em; padding:2px 8px; border-radius:999px; flex:none; }
.tk-cal-pill.is-live { background:#fde7ee; color:#c01f4f; }
.tk-cal-pill.is-upcoming { background:#e7f0fd; color:#1b54a8; }
.tk-cal-pill.is-past { background:#eee; color:#666; }

/* Détail enrichi (modale) */
.tk-live-detail .row-prod { display:flex; align-items:center; gap:10px; padding:7px 0; border-top:1px solid var(--tk-line,#f1f1f3); }
.tk-live-detail .row-prod:first-child { border-top:0; }
.tk-live-detail .row-prod .nm { flex:1; font-weight:600; font-size:.85rem; }
.tk-live-detail .row-prod .pr { font-weight:700; font-size:.8rem; color:var(--tk-muted,#6a6a73); }
/* Commission par produit (lives affiliation / perso). Petit badge discret a droite,
   distinct du prix. Absente des lives marque (pas de cle commission -> pas d'element). */
.tk-live-detail .row-prod .comm { flex:none; font-size:.72rem; font-weight:600; white-space:nowrap;
  color:var(--tk-muted,#6a6a73); padding:2px 8px; border-radius:999px;
  background:var(--tk-surface-2,#f7f7fa); border:1px solid var(--tk-line,#e6e6ea); }
.tk-live-detail .lbl { font-size:.72rem; font-weight:700; text-transform:uppercase; letter-spacing:.03em; color:var(--tk-muted,#9a9aa2); margin:0 0 8px; display:flex; align-items:center; gap:6px; }
.tk-live-detail .host-line { display:flex; align-items:center; gap:11px; margin-bottom:16px; }
/* Avatar cliquable (meme destination que le nom) : le lien ne doit rien ajouter a la
   mise en page, juste rendre la cible evidente au survol. */
.tk-live-detail .host-line .tk-host-avatar-link { display:inline-flex; flex:none; border-radius:50%; transition:opacity .15s; }
.tk-live-detail .host-line .tk-host-avatar-link:hover { opacity:.85; }
/* Avatar de l'animateur : anneau rouge qui pulse lentement, code visuel du direct
   (facon LIVE TikTok). Reserve aux creneaux en cours (`is-live`, pose par
   buildHostSection) : un live passe ou a venir ne clignote pas. Purement decoratif :
   l'information reste portee par la pastille de statut et le texte.
   L'anneau passe par box-shadow et non par une bordure, qui rognerait l'image
   (box-sizing:border-box global) et decalerait la ligne. */
.tk-live-detail .host-line.is-live .tk-cal-av { animation:tk-live-ring 2.4s ease-in-out infinite; }
@keyframes tk-live-ring {
  0%, 100% { box-shadow:0 0 0 2px var(--tk-surface,#fff), 0 0 0 4px var(--tk-danger),
             0 0 0 4px color-mix(in srgb, var(--tk-danger) 40%, transparent); }
  50% { box-shadow:0 0 0 2px var(--tk-surface,#fff), 0 0 0 4px color-mix(in srgb, var(--tk-danger) 30%, transparent),
        0 0 0 9px color-mix(in srgb, var(--tk-danger) 0%, transparent); }
}
/* Mouvement reduit : l'anneau reste, il cesse de clignoter. */
@media (prefers-reduced-motion: reduce) {
  .tk-live-detail .host-line.is-live .tk-cal-av { animation:none; box-shadow:0 0 0 2px var(--tk-surface,#fff), 0 0 0 4px var(--tk-danger); }
}
.tk-live-detail .host-sub { font-size:.78rem; color:var(--tk-muted,#7a7a82); }
/* Nom de l'animateur cliquable (planning admin et marque) : il doit se lire comme
   un lien sans casser la graisse de la ligne. L'icone signale le nouvel onglet. */
.tk-live-detail .tk-host-profile-link { color:var(--tk-brand,#000); text-decoration:underline; text-underline-offset:2px; }
.tk-live-detail .tk-host-profile-link:hover,
.tk-live-detail .tk-host-profile-link:focus-visible { color:var(--tk-brand,#000); text-decoration-thickness:2px; }
.tk-live-detail .tk-host-profile-link .bi { font-size:.72em; vertical-align:baseline; color:var(--tk-muted,#7a7a82); }
/* Lien secondaire vers la fiche interne (admin uniquement) : posé à côté du nom, il
   doit rester lisible sans lui disputer la vedette. */
.tk-live-detail .tk-host-sheet-link { margin-left:8px; font-size:.75rem; font-weight:600; white-space:nowrap;
  color:var(--tk-muted,#7a7a82); text-decoration:none; }
.tk-live-detail .tk-host-sheet-link:hover,
.tk-live-detail .tk-host-sheet-link:focus-visible { color:var(--tk-brand,#000); text-decoration:underline; text-underline-offset:2px; }
.tk-live-detail .tk-host-sheet-link .bi { font-size:.9em; vertical-align:baseline; }
.tk-live-detail .loc-badge { display:inline-flex; align-items:center; gap:5px; font-size:.72rem; font-weight:600;
  padding:2px 9px; border-radius:999px; background:var(--tk-surface-2,#f7f7fa); border:1px solid var(--tk-line,#e6e6ea); margin-top:4px; }
.tk-live-detail .brief { font-size:.82rem; color:#55555d; line-height:1.5; background:var(--tk-surface-2,#f7f7fa); border-radius:9px; padding:10px 12px; white-space:pre-line; }
.tk-live-detail .objective { display:flex; align-items:center; gap:10px; background:#fff5e8; border:1px solid #f6dcb6; border-radius:10px; padding:10px 12px; margin-bottom:16px; }
.tk-live-detail .objective .num { font-size:1.1rem; font-weight:800; color:#b45309; }

/* ---- Pages légales --------------------------------------------------------
   Carte de contenu centrée (la classe utilitaire .tk-shell est en margin:0 ;
   on la combine avec --contained qui re-centre, et on plafonne la largeur). */
.tk-shell.tk-legal-shell {
    max-width: 880px;
    padding-top: 36px;
    padding-bottom: 56px;
}
/* Lien « Retour » discret (override de la couleur d'accent par défaut des <a>). */
.tk-app a.tk-legal-back {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    margin-bottom: 18px;
    font-size: 14px;
    color: var(--tk-muted);
    text-decoration: none;
}
.tk-app a.tk-legal-back:hover {
    color: var(--tk-ink);
    text-decoration: none;
}

/* ---- Footer applicatif collant -------------------------------------------
   body.tk-app devient une colonne flex pleine hauteur : <main> pousse le footer
   en bas même sur les pages courtes. Le fond tk-bg du body couvre l'espace. */
body.tk-app {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}
.tk-app > main.tk-fg { flex: 1 0 auto; }
.tk-app > .tk-footer-v2 { flex-shrink: 0; }
.tk-app > .tk-topbar { flex-shrink: 0; }
/* Avec le footer collant, .tk-page n'a plus besoin de forcer 100vh (sinon double
   hauteur → scroll superflu). Restreint aux pages applicatives (.tk-app). */
.tk-app .tk-page { min-height: 0; }

/* Liens légaux du footer applicatif. */
.tk-app .tk-footer-inner {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
}
.tk-app .tk-footer-links {
    display: flex;
    flex-wrap: wrap;
    gap: 16px;
}
.tk-app .tk-footer-links a {
    color: var(--tk-muted);
    font-size: 13px;
    text-decoration: none;
}
.tk-app .tk-footer-links a:hover {
    color: var(--tk-ink);
    text-decoration: none;
}

/* ============================================================
   Tom Select : harmonisation charte Tikom (remplace le theme
   par defaut "bleu"). Accent = noir de marque (--tk-brand).
   Consomme les tokens ; s'applique partout (recherche async du
   planning + selects [data-tom-select] des formulaires).
   Charge apres tom-select.default.min.css (cf. app.js) -> gagne.
   ============================================================ */
.tk-app .ts-wrapper { background: transparent; background-image: none; min-width: 0; }
.tk-app .ts-control {
    background: rgba(var(--tk-tint-rgb), 0.04);   /* = .form-control */
    background-image: none;
    border: 1px solid var(--tk-line-strong, var(--tk-line));
    border-radius: var(--tk-radius-sm);           /* = .form-control */
    min-height: 44px;
    padding: 7px 12px;
    color: var(--tk-ink);
    font-size: 0.95rem;
    box-shadow: none;
    gap: 6px;
    align-items: center;
    transition: border-color .15s ease, box-shadow .15s ease, background .15s ease;
}
.tk-app .ts-control > input { color: var(--tk-ink); }
.tk-app .ts-control > input::placeholder { color: var(--tk-ink-mute); opacity: 1; }

/* Focus : anneau noir, pas de bleu */
.tk-app .ts-wrapper.focus .ts-control {
    border-color: var(--tk-brand);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--tk-brand), transparent 82%);
    outline: none;
}
.tk-app .ts-wrapper.disabled .ts-control { opacity: .6; }

/* Puces des valeurs selectionnees (multi) : noir de marque + croix */
.tk-app .ts-control .item {
    background: var(--tk-brand);
    color: #fff;
    border: none;
    border-radius: 999px;
    padding: 3px 4px 3px 12px;
    font-size: 0.85rem;
    line-height: 1.3;
    display: inline-flex;
    align-items: center;
    gap: 4px;
}
.tk-app .ts-control .item .remove {
    border: none;
    color: rgba(255, 255, 255, 0.7);
    padding: 0 6px;
    font-size: 1rem;
    line-height: 1;
    border-radius: 999px;
    text-decoration: none;
    transition: background .12s ease, color .12s ease;
}
.tk-app .ts-control .item .remove:hover {
    background: rgba(255, 255, 255, 0.18);
    color: #fff;
}
/* Valeur unique (single) : pas de puce noire, juste le texte */
.tk-app .ts-wrapper.single .ts-control .item {
    background: transparent;
    color: var(--tk-ink);
    padding: 0;
    border-radius: 0;
}

/* Puces multi : force le noir de marque. Le theme par defaut colore les puces
   via .ts-wrapper.multi .ts-control [data-value] (0,4,0, gradient background-image)
   et > div (0,3,1) ; ce selecteur (0,5,0) les bat et neutralise le gradient. */
.tk-app .ts-wrapper.multi .ts-control > .item {
    background: var(--tk-brand);
    background-image: none;
    color: #fff;
    border: none;
    border-radius: 999px;
}

/* Bouton "tout effacer" (single, clear_button) : croix discrete */
.tk-app .ts-wrapper .clear-button {
    color: var(--tk-ink-mute);
    opacity: 1;
    background: transparent;
    transition: color .15s ease;
}
.tk-app .ts-wrapper .clear-button:hover { color: var(--tk-ink); }

/* Menu deroulant */
.tk-app .ts-dropdown {
    background: var(--tk-surface);
    border: 1px solid var(--tk-line-strong, var(--tk-line));
    border-radius: var(--tk-radius);
    box-shadow: var(--tk-shadow);
    margin-top: 4px;
    padding: 4px;
    color: var(--tk-ink);
    overflow: hidden;
}
.tk-app .ts-dropdown .option {
    padding: 9px 12px;
    color: var(--tk-ink);
    border-radius: var(--tk-radius-sm);
}
.tk-app .ts-dropdown .option:hover,
.tk-app .ts-dropdown .active {
    background: color-mix(in srgb, var(--tk-brand), transparent 92%);
    color: var(--tk-ink);
}
.tk-app .ts-dropdown .no-results,
.tk-app .ts-dropdown .optgroup-header {
    color: var(--tk-ink-mute);
    padding: 8px 12px;
}

/* Filtres du planning : largeur confortable (placeholder entier visible) */
.tk-cal-filters .ts-wrapper { min-width: 240px; }

/* ---- Filtre par type : pills (remplace les cases a cocher brutes) ---- */
.tk-typefilter {
    border: 0;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 6px;
    min-width: 0;
}
.tk-typefilter-legend {
    font-size: 0.8rem;
    font-weight: 600;
    color: var(--tk-ink-dim);
    margin: 0;
    padding: 0;
    float: none;
    width: auto;
}
.tk-typefilter-list { display: flex; flex-wrap: wrap; gap: 8px; }
.tk-typefilter-pill {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    padding: 7px 14px;
    margin: 0;
    border: 1px solid var(--tk-line-strong, var(--tk-line));
    border-radius: 999px;
    font-size: 0.88rem;
    color: var(--tk-ink-dim);
    background: var(--tk-surface);
    cursor: pointer;
    user-select: none;
    transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.tk-typefilter-pill input {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
    border: 0;
}
.tk-typefilter-pill::before {
    content: "";
    width: 8px;
    height: 8px;
    border-radius: 999px;
    border: 1.5px solid currentColor;
    opacity: .5;
    transition: background .15s ease, opacity .15s ease, border-color .15s ease;
}
.tk-typefilter-pill:hover { border-color: var(--tk-brand); }
.tk-typefilter-pill:has(input:checked) {
    background: var(--tk-brand);
    border-color: var(--tk-brand);
    color: #fff;
}
.tk-typefilter-pill:has(input:checked)::before {
    background: #fff;
    border-color: #fff;
    opacity: 1;
}
.tk-typefilter-pill:has(input:focus-visible) {
    outline: 2px solid var(--tk-brand);
    outline-offset: 2px;
}

/* ============================================================
   Pill-menu de filtre (planning) : declencheur pill + panneau
   flottant contenant un Tom Select. Meme langage visuel que
   .tk-typefilter-pill. Actif = fond noir de marque.
   ============================================================ */
.tk-filter-chip { position: relative; display: inline-block; }
.tk-filter-chip__pill {
    display: inline-flex;
    align-items: center;
    border: 1px solid var(--tk-line-strong, var(--tk-line));
    border-radius: 999px;
    background: var(--tk-surface);
    color: var(--tk-ink-dim);
    transition: background .15s ease, border-color .15s ease, color .15s ease;
}
.tk-filter-chip__pill:hover { border-color: var(--tk-brand); }
.tk-filter-chip.is-active .tk-filter-chip__pill {
    background: var(--tk-brand);
    border-color: var(--tk-brand);
    color: #fff;
}
.tk-filter-chip__trigger {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    padding: 7px 14px;
    background: transparent;
    border: 0;
    color: inherit;
    font-size: 0.88rem;
    line-height: 1.2;
    cursor: pointer;
    border-radius: 999px;
}
.tk-filter-chip__trigger:focus-visible { outline: 2px solid var(--tk-brand); outline-offset: 2px; }
.tk-filter-chip.is-active .tk-filter-chip__trigger:focus-visible { outline-color: #fff; }
.tk-filter-chip__caret { font-size: 0.72rem; opacity: .6; }
.tk-filter-chip.is-active .tk-filter-chip__caret { display: none; }
.tk-filter-chip__count { font-variant-numeric: tabular-nums; }
.tk-filter-chip__clear {
    display: inline-flex;
    align-items: center;
    padding: 7px 12px 7px 2px;
    background: transparent;
    border: 0;
    color: inherit;
    font-size: 0.78rem;
    cursor: pointer;
    border-radius: 999px;
}
.tk-filter-chip__clear:hover { opacity: .8; }
.tk-filter-chip__clear:focus-visible { outline: 2px solid #fff; outline-offset: 1px; }

/* Panneau flottant */
.tk-filter-chip__panel {
    position: absolute;
    top: calc(100% + 6px);
    left: 0;
    z-index: 30;
    width: 280px;
    max-width: min(320px, 92vw);
    padding: 10px;
    background: var(--tk-surface);
    border: 1px solid var(--tk-line-strong, var(--tk-line));
    border-radius: var(--tk-radius);
    box-shadow: var(--tk-shadow);
}
/* Le Tom Select remplit toute la largeur du panneau (independant de la mesure
   d'init faite alors que le panneau etait masque). */
.tk-filter-chip__panel .ts-wrapper { width: 100%; min-width: 0; }

/* Panneau de filtre : le Tom Select embarque doit lire comme un champ de
   recherche integre, pas comme une boite bordee dans une autre boite. */
.tk-app .tk-filter-chip__panel .ts-control {
    border: 0;
    border-bottom: 1px solid var(--tk-line);
    border-radius: 0;
    background: transparent;
    padding-left: 2px;
    padding-right: 2px;
    min-height: 38px;
}
.tk-app .tk-filter-chip__panel .ts-wrapper.focus .ts-control {
    box-shadow: none;
    border-bottom-color: var(--tk-brand);
}
.tk-app .tk-filter-chip__panel .ts-dropdown {
    border: 0;
    box-shadow: none;
    margin-top: 6px;
}

/* Planning : sur mobile, garder une largeur lisible et scroller horizontalement
   plutot que de tasser la grille semaine. */
.tk-cal-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; }
@media (max-width: 767.98px) {
    .tk-cal-scroll #planning-calendar { min-width: 720px; }
}

/* Anti-zoom iOS Safari : au focus, iOS zoome tout champ dont la police calculee
   est < 16px. Sur mobile (borne md Bootstrap 767.98px) on force 16px sur les
   champs de saisie, sans toucher la densite desktop (13px dans les cartes profil,
   15px ailleurs) et sans jamais desactiver le zoom utilisateur (WCAG 1.4.4/1.4.10).
   Les selecteurs .tk-card .tk-input et .tk-app .form-control-sm/.form-select-sm
   sont explicites pour battre leur specificite (0,0,2,0). */
@media (max-width: 767.98px) {
    input,
    select,
    textarea,
    .form-control,
    .form-select,
    .form-control-sm,
    .form-select-sm,
    .tk-input,
    .tk-card .tk-input,
    .tk-app .form-control-sm,
    .tk-app .form-select-sm {
        font-size: 16px;
    }
}

/* ─────────────────────────────────────────────────────────────────────────
   AIDE ANIMATEUR (T7) : grille de vidéos tutos (style YouTube) + lecteur modale.
   Bloc contigu et autonome : ne dépend d'aucune autre règle du fichier.
   ───────────────────────────────────────────────────────────────────────── */
.tk-help-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
    gap: 20px;
    margin-bottom: 12px;
}

.tk-help-card {
    display: flex;
    flex-direction: column;
    gap: 10px;
    padding: 0;
    border: 0;
    background: transparent;
    color: inherit;
    font: inherit;
    text-align: left;
    cursor: pointer;
    border-radius: var(--tk-radius);
}

.tk-help-card:focus-visible {
    outline: 2px solid var(--tk-brand);
    outline-offset: 3px;
}

.tk-help-thumb {
    position: relative;
    display: block;
    width: 100%;
    aspect-ratio: 16 / 9;
    border-radius: 12px;
    overflow: hidden;
    background: var(--tk-hover);
    border: 1px solid var(--tk-line);
}

/* Aperçu live de l'embed dans la card (non interactif : le clic ouvre la modale). */
.tk-help-preview {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    border: 0;
    display: block;
    pointer-events: none;
}

/* Voile pour lisser le contraste sous le bouton lecture. */
.tk-help-scrim {
    position: absolute;
    inset: 0;
    background: linear-gradient(to bottom,
        rgba(10, 6, 7, .12) 0%,
        rgba(10, 6, 7, 0) 35%,
        rgba(10, 6, 7, .45) 100%);
    transition: background .2s ease;
}

.tk-help-card:hover .tk-help-scrim,
.tk-help-card:focus-visible .tk-help-scrim {
    background: linear-gradient(to bottom,
        rgba(10, 6, 7, .2) 0%,
        rgba(10, 6, 7, .05) 35%,
        rgba(10, 6, 7, .55) 100%);
}

/* Aperçu compact dans le tableau d'administration (onglet Réglages > Aide). */
.tk-help-admin-preview {
    position: relative;
    display: block;
    width: 96px;
    height: 54px;
    border-radius: 6px;
    overflow: hidden;
    border: 1px solid var(--tk-line);
    background: var(--tk-surface);
}

.tk-help-admin-preview iframe {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    border: 0;
    display: block;
    pointer-events: none;
}

.tk-help-play {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 2.6rem;
    color: #fff;
    text-shadow: 0 1px 6px rgba(0, 0, 0, .45);
    opacity: .9;
    transition: opacity .15s ease, transform .15s ease;
}

.tk-help-card:hover .tk-help-play,
.tk-help-card:focus-visible .tk-help-play {
    opacity: 1;
    transform: scale(1.06);
}

.tk-help-title {
    font-weight: 600;
    line-height: 1.3;
}

/* Modale de lecture : plus large que tk-dlg-wide (vidéo 16:9 confortable). */
.tk-dlg-wide.tk-help-dlg {
    max-width: min(96vw, 900px);
}

.tk-help-player {
    position: relative;
    width: 100%;
    aspect-ratio: 16 / 9;
    background: #000;
    border-radius: 10px;
    overflow: hidden;
}

.tk-help-player iframe {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    border: 0;
    display: block;
}

/* ── Onglet « Affiliés LIVE » des espaces marque ─────────────────────────────
   La cellule campagnes garde une hauteur constante quel que soit le nombre de
   campagnes (jusqu'à ~10) : rangée en nowrap, chips ellipsées, surplus replié
   dans une pastille « +N » qui porte la liste en title.
   La pastille « +N » est un frère du conteneur des chips affichées, pas un
   enfant de plus dans la même rangée rognable : seul .tk-aff-tab-chips-shown
   porte le rognage (flex 1 1 auto + min-width 0 + overflow hidden). En flexbox,
   la taille minimale automatique d'un item retombe à 0 dès qu'il a un overflow
   différent de visible. Si la pastille restait un simple enfant de plus de
   .tk-aff-tab-chips (comme les chips elles-mêmes), sa propre contribution à la
   largeur minimale de la colonne du <table> tomberait donc aussi à 0, et une
   colonne trop étroite pouvait la faire disparaître entièrement, sans aucun
   signal pour l'utilisateur. En la sortant du conteneur rognable et en lui
   laissant overflow: visible, sa taille de contenu reste comptée dans le
   calcul de largeur minimale de la colonne : elle ne peut plus jamais
   disparaître, seules les chips placées avant elle se rognent.
   Sous 768px, ce filet de sécurité ne suffit plus : forcer la place de la
   pastille élargit le <table> au-delà du viewport (plusieurs chips + pastille
   ne tiennent plus), ce qui rend la pastille atteignable seulement via un
   défilement horizontal du tableau, donc pas réellement visible au chargement.
   Sous ce seuil, .tk-aff-tab-chips est masquée au profit de
   .tk-aff-tab-count-badge : un badge unique « N campagnes », toujours court,
   jamais rogné.
   La pastille « +N » et le badge mobile sont des <button> qui ouvrent la même
   modale : la liste intégrale des campagnes de l'animateur y est lisible, ce
   que ni une ellipse ni un title ne permettent (le title n'existe pas au
   tactile). La colonne campagnes prend toute la largeur restante (voir
   .tk-aff-tab-tbl ci-dessous) pour que les chips ellipsent le plus tard
   possible. */
.tk-aff-tab-filters { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin: 0; }
.tk-aff-tab-select { max-width: 260px; }
/* table-layout: fixed est ici le seul moyen sûr de garder le tableau dans son
   conteneur. En table-layout auto, les colonnes sont dimensionnées sur le
   min-content de leur contenu ; or une rangée de chips en nowrap a un
   min-content égal à la somme des largeurs des chips (le `min-width: 0` d'un
   item flex borne son rétrécissement, pas sa contribution au calcul intrinsèque,
   et `overflow: hidden` ne l'annule pas non plus). Le <table> devenait donc plus
   large que .table-responsive, qui se mettait à défiler horizontalement en
   emportant la pastille « +N » hors de l'écran, quelle que soit la largeur du
   viewport. Avec une largeur fixée pour la colonne Animateur, la colonne
   campagnes reçoit exactement le reste et ce sont les chips qui se compriment. */
.tk-aff-tab-tbl { table-layout: fixed; }
.tk-aff-tab-tbl > thead > tr > th:first-child,
.tk-aff-tab-tbl > tbody > tr > td:first-child { width: 200px; }
.tk-aff-tab-chips { display: flex; align-items: center; gap: 6px; flex-wrap: nowrap; }
.tk-aff-tab-chips-shown { display: flex; align-items: center; gap: 6px; flex: 1 1 auto; min-width: 0; overflow: hidden; }
/* Les chips affichées se compriment (flex-shrink 1) au lieu d'être tranchées par
   l'overflow du conteneur : chacune garde sa forme de pastille et ellipse son
   propre texte. L'overflow: hidden de .tk-aff-tab-chips-shown ne sert plus que
   de filet de sécurité (colonne extrêmement étroite). */
.tk-aff-tab-chip {
    flex: 0 1 auto;
    min-width: 0;
    max-width: 280px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    background: var(--tk-chip-bg);
    color: var(--tk-chip-ink);
    border: 1px solid var(--tk-chip-line);
    font-family: inherit;
    font-size: 12px;
    font-weight: 500;
    line-height: inherit;
    padding: 5px 11px;
    border-radius: 999px;
}
/* Reste toujours visible (voir commentaire de bloc) : ni rognée, ni rétrécie.
   Encre atténuée et sans bordure, alignée sur .tk-prod-more (même affordance
   « +N » dans la famille Produits), mais cliquable ici. */
.tk-aff-tab-chip--more { flex: 0 0 auto; overflow: visible; max-width: none; font-weight: 700; cursor: pointer; color: var(--tk-muted); border: none; }
.tk-aff-tab-chip--more:hover { background: var(--tk-hover); color: var(--tk-ink); }
/* Badge de repli mobile : masqué par défaut, affiché uniquement sous 768px
   (voir commentaire de bloc). Même habillage visuel qu'un chip. */
.tk-aff-tab-count-badge {
    display: none;
    background: var(--tk-chip-bg);
    color: var(--tk-chip-ink);
    border: 1px solid var(--tk-chip-line);
    font-family: inherit;
    font-size: 12px;
    font-weight: 500;
    line-height: inherit;
    padding: 5px 11px;
    border-radius: 999px;
    white-space: nowrap;
    cursor: pointer;
}
@media (max-width: 767.98px) {
    .tk-aff-tab-chips { display: none; }
    .tk-aff-tab-count-badge { display: inline-block; }
}
/* Modale « Campagnes de … » : liste intégrale, une campagne par ligne. */
.tk-aff-camp-list { margin: 0; padding-left: 20px; display: flex; flex-direction: column; gap: 10px; }
.tk-aff-camp-title { font-size: 13.5px; font-weight: 600; color: var(--tk-ink); }
.tk-aff-camp-date { display: block; font-size: 12.5px; color: var(--tk-muted); }

/* ─── Puces de raccourci de formulaire (contrôleur `field-presets`) ───────────
 * Boutons discrets sous un champ (date, durée) qui y écrivent une valeur
 * courante. Volontairement plus légers qu'un `btn` : ce sont des accélérateurs,
 * pas des actions du formulaire, et ils ne doivent pas concurrencer
 * visuellement le bouton « Enregistrer ». */
.tk-presets {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    margin-top: 6px;
}
.tk-preset {
    background: var(--tk-chip-bg);
    color: var(--tk-chip-ink);
    border: 1px solid var(--tk-chip-line);
    border-radius: 999px;
    padding: 3px 10px;
    font-family: inherit;
    font-size: 12px;
    font-weight: 500;
    line-height: 1.6;
    white-space: nowrap;
    cursor: pointer;
}
.tk-preset:hover {
    background: color-mix(in srgb, var(--tk-chip-bg), var(--tk-brand) 12%);
}
