/* ==========================================================================
   LUDIS v2 — components.css
   3 primitives (.btn .card .badge) + signature « couture » + 5 micro-interactions
   + kit app-feel (barre basse 5 onglets, bottom sheets, overlay recherche,
   barre de progression, sticky bar, skeleton). Zero couleur en dur : tokens only.
   ========================================================================== */

/* --------------------------------------------------------------------------
   PRIMITIVE 1 — .btn : 4 variantes x 3 tailles, radius 8, focus clavier visible
   -------------------------------------------------------------------------- */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;
  font-family:var(--serif);font-weight:600;text-transform:uppercase;letter-spacing:.03em;
  border:1px solid transparent;border-radius:var(--r-s);cursor:pointer;text-align:center;
  padding:11px 20px;font-size:14px;line-height:1.2;transition:background .15s,color .15s,border-color .15s,transform .1s}
.btn-sm{padding:8px 14px;font-size:12.5px}
.btn-lg{padding:14px 26px;font-size:16px}
.btn-ink{background:rgb(var(--ink));color:rgb(var(--on-ink));border-color:rgb(var(--ink))}
.btn-ink:hover{background:rgb(var(--ink-soft));color:rgb(var(--on-ink))}
.btn-accent{background:rgb(var(--accent-solid));color:rgb(var(--on-accent));border-color:rgb(var(--accent-solid))}
.btn-accent:hover{background:rgb(var(--accent-solid-2));color:rgb(var(--on-accent));border-color:rgb(var(--accent-solid-2))}
.btn-outline{background:none;color:rgb(var(--ink));border-color:rgb(var(--ink))}
.btn-outline:hover{background:rgb(var(--ink));color:rgb(var(--on-ink))}
.btn-ghost{background:none;color:rgb(var(--ink-soft));border-color:transparent}
.btn-ghost:hover{background:rgb(var(--cream));color:rgb(var(--ink))}
.btn:disabled{opacity:.5;cursor:not-allowed}

/* --------------------------------------------------------------------------
   PRIMITIVE 2 — .card : thumb 3:2, eyebrow, titre Oswald, excerpt 2 lignes
   -------------------------------------------------------------------------- */
.card{position:relative;transition:transform .15s,box-shadow .15s}
.card .thumb{aspect-ratio:3/2;overflow:hidden;background:rgb(var(--cream));border-radius:var(--r-m);margin-bottom:12px}
.card .thumb img{width:100%;height:100%;object-fit:cover;transition:transform .6s}
.card .thumb .ph{width:100%;height:100%;background:rgb(var(--cream))}
.eyebrow{font-size:12px;letter-spacing:.1em;text-transform:uppercase;color:rgb(var(--accent));font-weight:600}
.card h3{font-size:20px;margin:7px 0 6px;line-height:1.2}
.card .excerpt{font-size:14.5px;color:rgb(var(--grey));line-height:1.55;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.card-lead .thumb{aspect-ratio:16/10}
.card-lead h2{font-size:clamp(24px,3.4vw,34px);margin:14px 0 8px;line-height:1.12}
.card-lead .excerpt{color:rgb(var(--ink-soft));font-size:16px;-webkit-line-clamp:3}
.side-list .mini{display:grid;grid-template-columns:96px 1fr;gap:14px;align-items:center}
.side-list .mini .thumb{aspect-ratio:1/1;border-radius:var(--r-m);overflow:hidden;background:rgb(var(--cream));margin:0}
.side-list .mini img{width:100%;height:100%;object-fit:cover}
.side-list .mini h4{font-size:15.5px;margin:2px 0;line-height:1.25}
.card-rel .thumb{aspect-ratio:3/2}
.card-rel h3{font-size:17px}

/* --------------------------------------------------------------------------
   PRIMITIVE 3 — .badge : recette alpha universelle (marche clair ET sombre)
   -------------------------------------------------------------------------- */
.badge{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border-radius:999px;
  font-family:var(--sans);font-size:11px;font-weight:600;letter-spacing:.07em;text-transform:uppercase;
  background:rgb(var(--accent)/.12);color:rgb(var(--accent-read));border:1px solid rgb(var(--accent)/.3)}
.badge-neutral{background:rgb(var(--ink)/.08);color:rgb(var(--ink-soft));border-color:rgb(var(--ink)/.14)}
.badge-live{background:rgb(var(--accent)/.12);color:rgb(var(--accent-read));border-color:rgb(var(--accent)/.3)}

/* --------------------------------------------------------------------------
   SIGNATURE MAISON — « la couture » (surjet rouge pointillé)
   3 emplacements MAX : .section-title / CTA Club / badge sponsorisé-vedette
   -------------------------------------------------------------------------- */
.stitch{position:relative;padding-bottom:6px}
.stitch::after{content:"";position:absolute;left:0;bottom:0;height:2px;width:44px;
  background:repeating-linear-gradient(90deg,rgb(var(--accent)) 0 6px,transparent 6px 10px)}
.stitch-full::after{width:100%;opacity:.35}
a.stitch-link:hover::after{width:100%;transition:width .3s}

/* --------------------------------------------------------------------------
   5 MICRO-INTERACTIONS (liste FERMÉE — aucune librairie)
   -------------------------------------------------------------------------- */
.card:active,.btn:active,.tab:active,.sheet-item:active,.method-card:active,.persona:active{transform:scale(.98)}
.card:hover,.method-card:hover,.persona:hover{transform:translateY(-2px);box-shadow:0 8px 22px rgb(var(--shadow)/.08)}
.card:hover .thumb img{transform:scale(1.05)}
.skel{position:relative;overflow:hidden;background:rgb(var(--cream));border-radius:var(--r-m)}
.skel::after{content:"";position:absolute;inset:0;transform:translateX(-100%);
  background:linear-gradient(90deg,transparent,rgb(var(--paper)/.65),transparent);animation:shimmer 1.5s infinite}
@keyframes shimmer{100%{transform:translateX(100%)}}

/* --------------------------------------------------------------------------
   BARRE DE PROGRESSION DE LECTURE (3 px)
   -------------------------------------------------------------------------- */
.readbar{position:fixed;top:0;left:0;height:3px;width:0;z-index:70;
  background:linear-gradient(90deg,rgb(var(--accent)),rgb(var(--accent-dark)));transition:width .1s linear}

/* --------------------------------------------------------------------------
   BARRE BASSE 5 ONGLETS (mobile uniquement)
   -------------------------------------------------------------------------- */
.tabbar{display:none}
@media(max-width:900px){
  body{padding-bottom:calc(var(--bar-h) + env(safe-area-inset-bottom))}
  .tabbar{display:grid;grid-template-columns:repeat(5,1fr);position:fixed;left:0;right:0;bottom:0;z-index:60;
    background:rgb(var(--paper)/.92);backdrop-filter:saturate(180%) blur(14px);-webkit-backdrop-filter:saturate(180%) blur(14px);
    border-top:1px solid rgb(var(--ink)/.22);padding-bottom:env(safe-area-inset-bottom)}
  .tab{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;
    height:var(--bar-h);border:0;background:none;cursor:pointer;color:rgb(var(--grey));
    font-family:var(--sans);font-size:10.5px;font-weight:600;letter-spacing:.02em;
    -webkit-tap-highlight-color:transparent;touch-action:manipulation;transition:color .15s,transform .1s}
  .tab svg{width:21px;height:21px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
  .tab[aria-current]{color:rgb(var(--accent))}
  .tab-club{color:rgb(var(--on-accent));background:linear-gradient(135deg,rgb(var(--accent-solid)),rgb(var(--accent-solid-2)));
    margin:6px 8px;height:calc(var(--bar-h) - 12px);border-radius:var(--r-m)}
  .tab-club:hover,.tab-club[aria-current]{color:rgb(var(--on-accent))}
  .dark .tabbar{border-top-color:rgb(var(--ink)/.30)}   /* 1,43:1 en sombre avant */
}

/* --------------------------------------------------------------------------
   BOTTOM SHEETS (radius 24, 0,3 s cubic-bezier(.32,.72,0,1), poignée)
   -------------------------------------------------------------------------- */
.scrim{position:fixed;inset:0;background:rgb(var(--shadow)/.6);opacity:0;visibility:hidden;z-index:80;
  transition:opacity .3s,visibility .3s}
.scrim.on{opacity:1;visibility:visible}
/* visibility:hidden est OBLIGATOIRE : sans elle, un sheet ferme n'est que translate hors
   ecran et ses 25 controles restent dans l'ordre de tabulation (WCAG 4.1.2). La transition
   sur visibility est discrete : visible des l'ouverture, maintenue pendant la fermeture,
   donc l'animation de translation reste intacte dans les deux sens. */
.sheet{position:fixed;left:0;right:0;bottom:0;z-index:90;background:rgb(var(--elev));
  border-top:1px solid rgb(var(--line));
  border-radius:var(--r-xl) var(--r-xl) 0 0;box-shadow:0 -10px 40px rgb(var(--shadow)/.22);
  transform:translateY(100%);visibility:hidden;
  transition:transform .3s cubic-bezier(.32,.72,0,1),visibility .3s;
  max-height:86vh;overflow-y:auto;overscroll-behavior:contain;
  padding:10px 20px calc(24px + env(safe-area-inset-bottom))}
.sheet.on{transform:translateY(0);visibility:visible}
/* sombre : sheet noir sur page noire + ombre noire = separation 1,00:1. Le bord porte la separation. */
.dark .sheet{border-top-color:rgb(var(--ink)/.30)}
.sheet-grab{width:40px;height:4px;border-radius:999px;background:rgb(var(--line));margin:0 auto 14px}
.sheet h2{font-size:22px;margin:0 0 4px}
.sheet>p.sheet-sub{color:rgb(var(--grey));font-size:14px;margin:0 0 16px}
.sheet-close{position:absolute;top:12px;right:14px;width:32px;height:32px;border:0;border-radius:50%;
  background:rgb(var(--cream));color:rgb(var(--ink));cursor:pointer;font-size:18px;line-height:1}
.sheet-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px}
.sheet-item{display:flex;align-items:center;gap:12px;width:100%;padding:14px 12px;border:0;border-radius:var(--r-m);
  background:none;color:rgb(var(--ink));font:inherit;font-size:15.5px;text-align:left;cursor:pointer;
  transition:background .15s,transform .1s}
.sheet-item:hover{background:rgb(var(--cream))}
.sheet-item svg{width:20px;height:20px;flex:none;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;color:rgb(var(--accent))}
.sheet-item .si-sub{display:block;font-size:12.5px;color:rgb(var(--grey))}
.sheet-sep{border:0;border-top:1px solid rgb(var(--line));margin:14px 0}
.sheet-cats{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.sheet-cats a{display:flex;align-items:flex-end;min-height:74px;padding:14px;border-radius:var(--r-m);
  background:rgb(var(--cream));font-family:var(--serif);font-size:16px;font-weight:600;line-height:1.15;
  color:rgb(var(--ink));transition:transform .1s,background .15s}
.sheet-cats a:hover{background:rgb(var(--accent)/.12);color:rgb(var(--accent))}
.sheet-cats a:active{transform:scale(.98)}
/* interrupteur clair/sombre */
.switch{margin-left:auto;width:46px;height:26px;border-radius:999px;background:rgb(var(--ink)/.50);
  position:relative;flex:none;transition:background .2s}
.switch::after{content:"";position:absolute;top:3px;left:3px;width:20px;height:20px;border-radius:50%;
  background:rgb(var(--paper));box-shadow:0 1px 3px rgb(var(--shadow)/.3);transition:transform .2s}
.dark .switch{background:rgb(var(--accent))}
.dark .switch::after{transform:translateX(20px)}

/* --------------------------------------------------------------------------
   OVERLAY RECHERCHE
   -------------------------------------------------------------------------- */
.searchlay{position:fixed;inset:0;z-index:95;background:rgb(var(--paper));display:none;
  padding:calc(18px + env(safe-area-inset-top)) 20px 20px;overflow-y:auto}
.searchlay.on{display:block}
.searchlay form{display:flex;gap:8px;max-width:var(--readw);margin:0 auto}
.searchlay input{flex:1;padding:14px 16px;border:1px solid rgb(var(--line));border-radius:var(--r-s);
  font:inherit;font-size:16px;background:rgb(var(--cream));color:rgb(var(--ink))}
.searchlay .sl-head{display:flex;justify-content:space-between;align-items:center;max-width:var(--readw);margin:0 auto 14px}
.searchlay .sl-head strong{font-family:var(--serif);font-size:20px}
.searchlay .sl-cats{max-width:var(--readw);margin:22px auto 0}
.searchlay .sl-cats p{font-family:var(--sans);font-size:11.5px;letter-spacing:.12em;text-transform:uppercase;color:rgb(var(--grey));margin:0 0 10px;font-weight:600}
.searchlay .sl-chips{display:flex;flex-wrap:wrap;gap:8px}
.searchlay .sl-chips a{padding:8px 14px;border-radius:999px;background:rgb(var(--cream));font-size:13.5px;color:rgb(var(--ink-soft))}
.searchlay .sl-chips a:hover{background:rgb(var(--accent)/.14);color:rgb(var(--accent))}

/* --------------------------------------------------------------------------
   STICKY BAR ARTICLE (mobile, à 20 % de scroll)
   -------------------------------------------------------------------------- */
.stickybar{display:none}
@media(max-width:900px){
  .stickybar{display:flex;align-items:center;gap:10px;position:fixed;left:8px;right:8px;
    bottom:calc(var(--bar-h) + env(safe-area-inset-bottom) + 8px);z-index:58;
    background:rgb(var(--elev));border:1px solid rgb(var(--line));border-radius:var(--r-m);
    padding:9px 10px 9px 13px;box-shadow:0 8px 26px rgb(var(--shadow)/.14);
    transform:translateY(140%);transition:transform .3s cubic-bezier(.32,.72,0,1);visibility:hidden}
  .stickybar.on{transform:translateY(0);visibility:visible}
  .stickybar p{margin:0;font-size:12.5px;line-height:1.3;color:rgb(var(--ink-soft));flex:1;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
  .stickybar .sb-x{width:28px;height:28px;border:0;border-radius:50%;background:rgb(var(--cream));
    color:rgb(var(--grey));cursor:pointer;font-size:15px;line-height:1;flex:none}
}

/* --------------------------------------------------------------------------
   « MA LISTE » (page + sheet)
   -------------------------------------------------------------------------- */
.mylist{list-style:none;margin:0;padding:0}
.mylist li{border-bottom:1px solid rgb(var(--line));padding:14px 0;display:flex;gap:12px;align-items:flex-start}
.mylist a{font-family:var(--serif);font-size:18px;font-weight:500;line-height:1.25;flex:1}
.mylist button{border:0;background:none;color:rgb(var(--grey));cursor:pointer;font-size:13px;padding:2px 6px}
.mylist button:hover{color:rgb(var(--accent))}
.mylist-empty{color:rgb(var(--grey));font-size:15px;margin:20px 0}

/* --------------------------------------------------------------------------
   BLOCS CHAPEAU (page tendances) + encart transparence
   -------------------------------------------------------------------------- */
.lead-note{background:rgb(var(--cream));border-left:3px solid rgb(var(--accent));border-radius:0 var(--r-m) var(--r-m) 0;
  padding:16px 20px;margin:0 0 30px;font-size:15.5px;color:rgb(var(--ink-soft))}
.lead-note strong{color:rgb(var(--ink))}
.updated{font-family:var(--sans);font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:rgb(var(--grey));font-weight:600}
