/* =========================================================
   Le précieux — portail des applications.
   Habillage sombre et cinématographique : les rendus 3D portent la
   couleur, l'interface se tient en retrait. Aucun fichier externe :
   ni police distante, ni image de fond autre que nos propres rendus.
   ========================================================= */
:root{
  --bg:#0a0a0c;
  --bg2:#111116;
  --ink:#f6f4f1;
  --muted:rgba(246,244,241,.60);
  --muted2:rgba(246,244,241,.40);
  --line:rgba(255,255,255,.13);
  --line2:rgba(255,255,255,.22);
  --glass:rgba(255,255,255,.055);
  --rausch:#ff385c;
  --amber:#ff8a4c;
  --blueprint:#5b8def;
  --r-pill:999px;
  --r-xl:26px;
  --r-lg:18px;
  --r-md:12px;
  font-size:16px;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  min-height:100vh;min-height:100dvh;
  background:var(--bg);color:var(--ink);
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
}
a{color:inherit;text-decoration:none}
button{font:inherit;color:inherit;border:0;background:none;cursor:pointer}

/* ---------------------------------------------------------
   Fond : deux halos qui dérivent lentement + un grain fin.
   Le grain casse le dégradé (banding) et donne de la matière.
   --------------------------------------------------------- */
.bg{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden;background:var(--bg)}
.bg::before,.bg::after{
  content:'';position:absolute;width:78vmax;height:78vmax;border-radius:50%;
  filter:blur(90px);opacity:.32;will-change:transform;
}
.bg::before{
  left:-24vmax;top:-30vmax;
  background:radial-gradient(circle at 50% 50%,var(--rausch),transparent 62%);
  animation:drift1 38s ease-in-out infinite alternate;
}
.bg::after{
  right:-28vmax;bottom:-34vmax;
  background:radial-gradient(circle at 50% 50%,var(--blueprint),transparent 62%);
  animation:drift2 46s ease-in-out infinite alternate;
}
@keyframes drift1{to{transform:translate3d(12vmax,8vmax,0) scale(1.16)}}
@keyframes drift2{to{transform:translate3d(-10vmax,-9vmax,0) scale(1.12)}}
.grain{
  position:fixed;inset:-50%;z-index:1;pointer-events:none;opacity:.05;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)'/%3E%3C/svg%3E");
}

/* --------------------------------------------------------- En-tête */
.shell{position:relative;z-index:2;display:flex;flex-direction:column;min-height:100vh;min-height:100dvh}
.top{
  display:flex;align-items:center;gap:14px;
  padding:20px clamp(18px,4vw,54px);
  max-width:1500px;width:100%;margin:0 auto;
}
.mark{display:flex;align-items:center;gap:11px;flex:none;min-width:0}
.mark-glyph{
  width:38px;height:38px;border-radius:12px;flex:none;
  display:grid;place-items:center;
  background:linear-gradient(140deg,var(--rausch),#ff7a5c);
  box-shadow:0 6px 20px rgba(255,56,92,.34);
}
.mark-glyph svg{display:block}
.mark-name{display:flex;flex-direction:column;line-height:1.1}
.mark-name b{font-size:15px;font-weight:650;letter-spacing:.2px}
.mark-name span{font-size:11.5px;color:var(--muted2);letter-spacing:.09em;text-transform:uppercase}
.top-spacer{flex:1}

.account{
  display:flex;align-items:center;gap:9px;flex:none;
  padding:5px 6px 5px 14px;border-radius:var(--r-pill);
  border:1px solid var(--line);background:var(--glass);
  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
  transition:border-color .2s,background .2s;
}
.account:hover{border-color:var(--line2);background:rgba(255,255,255,.09)}
.account-mail{font-size:12.5px;color:var(--muted);max-width:30vw;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Téléphone : l'adresse mangerait toute la largeur — avatar et sortie suffisent. */
@media (max-width:720px){
  .account{padding:5px}
  .account-mail{display:none}
}
.account-av{
  width:30px;height:30px;border-radius:50%;flex:none;object-fit:cover;
  background:linear-gradient(140deg,#3a3a44,#22222a);
  display:grid;place-items:center;font-size:12.5px;font-weight:650;color:var(--ink);
}
.logout{
  margin-left:2px;width:30px;height:30px;border-radius:50%;flex:none;
  display:grid;place-items:center;color:var(--muted);
  transition:color .18s,background .18s;
}
.logout:hover{color:var(--ink);background:rgba(255,255,255,.10)}

/* --------------------------------------------------------- Titre */
.head{padding:clamp(10px,3vh,34px) clamp(18px,4vw,54px) clamp(16px,2.6vh,26px);max-width:1500px;width:100%;margin:0 auto}
.eyebrow{
  margin:0 0 10px;font-size:12.5px;letter-spacing:.11em;text-transform:uppercase;
  color:var(--muted2);display:flex;align-items:center;gap:9px;
}
.eyebrow::before{content:'';width:26px;height:1px;background:var(--line2)}
.head h1{
  margin:0;font-size:clamp(30px,5.4vw,54px);line-height:1.04;
  font-weight:680;letter-spacing:-.028em;
}
.head p{margin:12px 0 0;font-size:clamp(14px,1.6vw,16.5px);color:var(--muted);max-width:56ch;line-height:1.5}

/* --------------------------------------------------------- Tuiles */
.tiles{
  flex:1;display:grid;gap:clamp(12px,1.5vw,20px);
  padding:0 clamp(18px,4vw,54px) clamp(24px,5vh,56px);
  max-width:1500px;width:100%;margin:0 auto;
  grid-template-columns:1fr;
  align-content:start;
}
@media (min-width:960px){
  .tiles{
    grid-template-columns:1.5fr 1fr;
    grid-template-rows:repeat(2,minmax(215px,30vh));
  }
  .tile--feature{grid-row:span 2}
}

.tile{
  position:relative;display:block;overflow:hidden;isolation:isolate;
  border-radius:var(--r-xl);min-height:215px;
  border:1px solid var(--line);
  background:#141418;
  opacity:0;transform:translateY(26px);
  animation:rise .8s cubic-bezier(.2,.8,.25,1) forwards;
  transition:border-color .35s, box-shadow .5s, transform .5s cubic-bezier(.2,.8,.25,1);
  transform-style:preserve-3d;
}
.tile:nth-child(1){animation-delay:.05s}
.tile:nth-child(2){animation-delay:.15s}
.tile:nth-child(3){animation-delay:.25s}
@keyframes rise{to{opacity:1;transform:translateY(0)}}

.tile-media{
  position:absolute;inset:0;z-index:0;
  background-size:cover;background-position:center;
  transform:scale(1.02);
  transition:transform 1.15s cubic-bezier(.16,.84,.24,1), filter .6s;
  filter:saturate(1.02) contrast(1.02);
}
/* Voile : sombre en bas pour le texte, transparent en haut pour l'image. */
.tile-scrim{
  position:absolute;inset:0;z-index:1;
  background:
    linear-gradient(to top,rgba(6,6,9,.94) 0%,rgba(6,6,9,.80) 26%,rgba(6,6,9,.44) 50%,
                           rgba(6,6,9,.10) 74%,rgba(6,6,9,.34) 100%);
  transition:opacity .5s;
}
/* Halo qui suit le pointeur — donne du relief à la bordure. */
.tile-glow{
  position:absolute;inset:0;z-index:2;opacity:0;transition:opacity .45s;
  background:radial-gradient(320px circle at var(--mx,50%) var(--my,50%),
             color-mix(in srgb,var(--tint) 26%,transparent),transparent 68%);
}
/* Reflet qui balaie la tuile au survol. */
.tile-sheen{
  position:absolute;inset:0;z-index:3;pointer-events:none;
  background:linear-gradient(105deg,transparent 38%,rgba(255,255,255,.14) 50%,transparent 62%);
  transform:translateX(-110%);
}
.tile-body{
  position:relative;z-index:4;height:100%;
  display:flex;flex-direction:column;justify-content:flex-end;
  padding:clamp(18px,2.4vw,30px);gap:9px;
}
.tile-icon{
  width:44px;height:44px;border-radius:14px;display:grid;place-items:center;
  background:color-mix(in srgb,var(--tint) 20%,rgba(10,10,12,.5));
  border:1px solid color-mix(in srgb,var(--tint) 42%,transparent);
  color:#fff;margin-bottom:2px;
  backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
  transition:transform .5s cubic-bezier(.2,.8,.25,1),background .4s;
}
.tile h2{
  margin:0;font-size:clamp(22px,2.7vw,32px);line-height:1.06;
  font-weight:660;letter-spacing:-.022em;
  text-shadow:0 2px 18px rgba(0,0,0,.5);
}
.tile p{
  margin:0;font-size:14px;line-height:1.5;color:rgba(255,255,255,.76);
  max-width:44ch;text-shadow:0 1px 10px rgba(0,0,0,.55);
}
.tile--feature p{font-size:15px;max-width:48ch}

.tile-cta{
  display:inline-flex;align-items:center;gap:7px;margin-top:6px;
  font-size:13.5px;font-weight:600;color:#fff;
  width:max-content;
}
.tile-cta svg{transition:transform .35s cubic-bezier(.2,.8,.25,1)}
.tile-cta::after{
  content:'';position:absolute;left:clamp(18px,2.4vw,30px);bottom:calc(clamp(18px,2.4vw,30px) - 2px);
  height:1.5px;width:0;background:var(--tint);transition:width .45s cubic-bezier(.2,.8,.25,1);
}

.tile-badge{
  position:absolute;top:clamp(16px,2vw,22px);right:clamp(16px,2vw,22px);z-index:5;
  padding:5px 11px;border-radius:var(--r-pill);
  font-size:11px;font-weight:650;letter-spacing:.06em;text-transform:uppercase;
  background:rgba(10,10,12,.55);border:1px solid var(--line2);
  backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  color:rgba(255,255,255,.9);
}
.tile-badge--live{
  background:color-mix(in srgb,var(--tint) 88%,#000);
  border-color:transparent;color:#fff;
  box-shadow:0 4px 18px color-mix(in srgb,var(--tint) 45%,transparent);
}
.tile-badge--live::before{
  content:'';display:inline-block;width:6px;height:6px;border-radius:50%;
  background:#fff;margin-right:6px;vertical-align:1px;
  animation:pulse 2.4s ease-in-out infinite;
}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.35}}

/* --- survol --- */
@media (hover:hover){
  .tile:hover{border-color:color-mix(in srgb,var(--tint) 55%,transparent)}
  .tile:hover{box-shadow:0 26px 70px rgba(0,0,0,.55),
                        0 0 0 1px color-mix(in srgb,var(--tint) 30%,transparent)}
  .tile:hover .tile-media{transform:scale(1.09);filter:saturate(1.12) contrast(1.05)}
  .tile:hover .tile-glow{opacity:1}
  .tile:hover .tile-sheen{animation:sweep 1.1s cubic-bezier(.3,.7,.3,1)}
  .tile:hover .tile-icon{transform:translateY(-3px) scale(1.05);
    background:color-mix(in srgb,var(--tint) 34%,rgba(10,10,12,.4))}
  .tile:hover .tile-cta::after{width:clamp(84px,9vw,120px)}
  .tile:hover .tile-cta svg{transform:translateX(4px)}
}
.tile:focus-visible{outline:2px solid var(--tint);outline-offset:3px}

/* En colonne unique (téléphone, tablette), la tuile doit rester une image
   avant d'être un bloc de texte : on lui rend de la hauteur. */
@media (max-width:959px){
  .tile{min-height:clamp(262px,64vw,352px)}
}

.tile--soon{cursor:pointer}
.tile--soon .tile-media{filter:saturate(.72) contrast(1.04) brightness(.86)}
@media (hover:hover){.tile--soon:hover .tile-media{filter:saturate(1) contrast(1.05) brightness(.96)}}

/* Élévation d'architecte : c'est un dessin sur fond clair. On l'inverse —
   traits pâles sur fond sombre — pour retrouver le bleu du plan de chantier
   et le faire tenir dans une interface sombre. */
.tile--blueprint .tile-media,
.soon-hero--blueprint .soon-hero-img{
  filter:invert(1) hue-rotate(180deg) saturate(1.6) contrast(1.06) brightness(.92);
}
@media (hover:hover){
  .tile--blueprint:hover .tile-media{
    filter:invert(1) hue-rotate(180deg) saturate(1.9) contrast(1.1) brightness(1.02);
  }
}
/* Le voile sombre n'a plus lieu d'être sur un fond déjà sombre. */
.tile--blueprint .tile-scrim{
  background:linear-gradient(to top,rgba(6,6,9,.90) 0%,rgba(6,6,9,.58) 32%,rgba(6,6,9,.04) 70%);
}

@media (prefers-reduced-motion:reduce){
  .tile,.tile-media,.tile-icon,.tile-cta svg,.tile-cta::after{transition:none!important;animation:none!important}
  .tile{opacity:1;transform:none}
  .bg::before,.bg::after{animation:none}
  .tile-badge--live::before{animation:none}
}
@keyframes sweep{from{transform:translateX(-110%)}to{transform:translateX(110%)}}

/* --------------------------------------------------------- Pied */
.foot{
  padding:0 clamp(18px,4vw,54px) 26px;max-width:1500px;width:100%;margin:0 auto;
  font-size:12px;color:var(--muted2);display:flex;gap:16px;flex-wrap:wrap;align-items:center;
}
.foot a:hover{color:var(--muted)}

/* =========================================================
   Connexion
   ========================================================= */
body.login .shell{justify-content:center;align-items:center;padding:24px}
.login-bg{
  position:fixed;inset:0;z-index:0;
  background-size:cover;background-position:center;
  filter:blur(26px) saturate(1.1) brightness(.42);transform:scale(1.12);
}
.card{
  position:relative;z-index:2;width:min(430px,100%);
  padding:clamp(26px,4vw,40px);border-radius:var(--r-xl);
  background:rgba(18,18,22,.72);border:1px solid var(--line);
  backdrop-filter:blur(26px) saturate(1.3);-webkit-backdrop-filter:blur(26px) saturate(1.3);
  box-shadow:0 34px 90px rgba(0,0,0,.6);
  animation:rise .7s cubic-bezier(.2,.8,.25,1) both;
  text-align:center;
}
.card .mark{justify-content:center;margin-bottom:22px}
.card h1{margin:0 0 8px;font-size:26px;font-weight:660;letter-spacing:-.02em}
.card .sub{margin:0 0 24px;font-size:14px;color:var(--muted);line-height:1.55}
.gbtn-wrap{display:flex;justify-content:center;min-height:44px}
.card .fine{
  margin:22px 0 0;padding-top:18px;border-top:1px solid var(--line);
  font-size:12px;color:var(--muted2);line-height:1.6;text-align:left;
}
.alert{
  margin:0 0 18px;padding:12px 14px;border-radius:var(--r-md);
  font-size:13px;line-height:1.5;text-align:left;
  background:rgba(255,56,92,.13);border:1px solid rgba(255,56,92,.34);color:#ffc9d3;
}
.alert b{color:#fff}
.setup{
  margin:0;padding:16px;border-radius:var(--r-md);text-align:left;
  background:rgba(255,255,255,.05);border:1px solid var(--line);
  font-size:12.5px;line-height:1.65;color:var(--muted);
}
.setup h3{margin:0 0 8px;font-size:13px;color:var(--ink);font-weight:640}
.setup ol{margin:0;padding-left:18px}
.setup code{
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;
  background:rgba(255,255,255,.09);padding:1px 5px;border-radius:5px;color:var(--ink);
  overflow-wrap:anywhere;
}
.spin{
  width:20px;height:20px;border-radius:50%;margin:8px auto;
  border:2px solid var(--line2);border-top-color:var(--ink);
  animation:spin .8s linear infinite;
}
@keyframes spin{to{transform:rotate(360deg)}}

/* =========================================================
   Pages « bientôt »
   ========================================================= */
body.soon .shell{justify-content:center}
.soon-wrap{
  position:relative;z-index:2;max-width:760px;width:100%;
  margin:0 auto;padding:clamp(24px,5vw,48px);text-align:center;
}
.soon-hero{
  width:min(460px,100%);aspect-ratio:16/10;margin:0 auto 26px;
  border-radius:var(--r-xl);overflow:hidden;position:relative;
  border:1px solid var(--line);box-shadow:0 30px 80px rgba(0,0,0,.55);
  animation:rise .8s cubic-bezier(.2,.8,.25,1) both;
}
.soon-hero-img{position:absolute;inset:0;background-size:cover;background-position:center;
  filter:saturate(.75) brightness(.86)}
.soon-hero::after{content:'';position:absolute;inset:0;
  background:linear-gradient(to top,rgba(6,6,9,.75),transparent 60%)}
.soon-wrap .tile-icon{margin:0 auto 18px}
.soon-wrap h1{margin:0 0 12px;font-size:clamp(28px,5vw,44px);font-weight:670;letter-spacing:-.026em}
.soon-wrap .lead{margin:0 auto 26px;max-width:52ch;font-size:16px;line-height:1.6;color:var(--muted)}
.soon-list{
  display:grid;gap:10px;max-width:480px;margin:0 auto 30px;text-align:left;
}
.soon-list li{
  list-style:none;display:flex;gap:11px;align-items:flex-start;
  padding:13px 15px;border-radius:var(--r-md);
  background:var(--glass);border:1px solid var(--line);
  font-size:13.5px;line-height:1.5;color:rgba(255,255,255,.82);
}
.soon-list svg{flex:none;margin-top:1px;color:var(--tint)}
.btn-back{
  display:inline-flex;align-items:center;gap:8px;
  padding:12px 22px;border-radius:var(--r-pill);
  background:rgba(255,255,255,.09);border:1px solid var(--line2);
  font-size:14px;font-weight:600;transition:background .2s,transform .2s;
}
.btn-back:hover{background:rgba(255,255,255,.16);transform:translateY(-1px)}

/* Le lien du jeudi, en pied de page : discret sans être invisible.
   Le trait souligne le mot, mais la zone touchable fait 44 px de haut —
   mesuré à 16 px sans ça, c'est-à-dire une cible qu'un pouce rate. */
.foot-lien{display:inline-flex;align-items:center;min-height:44px;color:var(--muted);text-decoration:none}
.foot-lien span{border-bottom:1px solid var(--line2);padding-bottom:1px}
.foot-lien:hover{color:var(--ink)}
.foot-lien:hover span{border-bottom-color:var(--ink)}
