/* Halvor — couche de design « Néon violet » (Prism / Jarvis). S'ajoute à halvor.css, ne change aucune logique.
   - Navigation : dock flottant en bas (plus de colonne à gauche), pour TOUS les thèmes.
   - Thèmes « neon » (sombre) et « neonclair » : verre transparent SANS flou, nuances violettes mouvantes, fond d'écran personnalisable.
   - Les autres thèmes gardent leurs couleurs d'origine ; les calques de fond ne s'affichent que sur les thèmes néon.
   Aucune ressource externe : Halvor marche sans internet. Inspiration de style : Prism Dashboard (MIT). */

/* ---------- jetons de couleur ---------- */
:root[data-theme=neon]{color-scheme:dark;--bg:#07051a;--panel:rgba(30,18,68,.50);--panel2:rgba(44,26,94,.50);--line:rgba(195,150,255,.30);--txt:#f4edff;--mut:#bfaee8;
  --acc:#b98cff;--acc2:#ff5ad8;--on-acc:#14062b;--ok:#5ef2c1;--warn:#ffd36b;--bad:#ff7a8a;--r:22px;
  --shadow:0 22px 50px rgba(0,0,0,.35),inset 0 1px 0 rgba(235,215,255,.24);--glow:none;
  --glass:rgba(190,160,255,.03);--solid:rgba(20,11,48,.93);--dockbg:rgba(24,14,56,.78)}
:root[data-theme=neonclair]{color-scheme:light;--bg:#efe8fb;--panel:rgba(255,255,255,.55);--panel2:rgba(255,255,255,.65);--line:rgba(110,60,170,.24);--txt:#1d1238;--mut:#6a5a92;
  --acc:#7a3df0;--acc2:#d02ab0;--on-acc:#fff;--ok:#0c9c78;--warn:#b57a00;--bad:#c4392b;--r:22px;
  --shadow:0 18px 40px rgba(110,60,170,.16),inset 0 1px 0 rgba(255,255,255,.9);--glow:none;
  --glass:rgba(255,255,255,.22);--solid:rgba(255,255,255,.96);--dockbg:rgba(255,255,255,.82)}

/* ---------- navigation : dock flottant (tous les thèmes) ---------- */
body{display:block}
main{position:fixed;inset:0}
.wrap{padding-bottom:150px}
iframe{inset:0 0 94px 0;height:auto}
#maison,#jeux{height:calc(100% - 148px)}#maison.full{height:calc(100% - 94px)}   /* les règles #id de halvor.css (hauteur 100 %) passaient sous la barre flottante */
nav{position:fixed;left:50%;bottom:16px;transform:translateX(-50%);width:auto;max-width:calc(100vw - 16px);flex-direction:row;align-items:center;gap:6px;
  padding:9px 12px;border:1px solid var(--line);border-radius:32px;background:var(--dockbg,color-mix(in srgb,var(--panel) 85%,transparent));backdrop-filter:none;
  box-shadow:var(--shadow,0 18px 40px rgba(0,0,0,.35));z-index:30;overflow:visible}
nav .brand{margin:0 4px 0 0;font-size:0;gap:0}
nav button{font-size:0;gap:0;padding:0;width:52px;height:52px;justify-content:center;border-radius:18px;text-align:center;transition:transform .18s cubic-bezier(.2,.8,.2,1),background .2s,color .2s;transform-origin:bottom center}
nav button svg{width:26px;height:26px}
nav button kbd{display:none}
nav .srch{margin:0;border:0;background:none}
nav .sm,nav .srch{padding:0;font-size:0}
nav .sp{flex:none;width:1px;height:34px;background:var(--line);margin:0 4px}
nav .usr{width:52px;margin:0;padding:0;border:0;background:none}
nav .usr #uname,nav .usr .chev{display:none}
nav .usr .av{width:38px;height:38px;font-size:16px}
nav button.on{box-shadow:inset 4px 4px 12px rgba(0,0,0,.28),inset -3px -3px 9px rgba(255,235,255,.06)}
nav button.on::before{left:50%;top:auto;bottom:-7px;width:6px;height:6px;border-radius:50%;transform:translateX(-50%);background:var(--acc);box-shadow:0 0 10px var(--acc)}
nav [data-label]::after{content:attr(data-label);position:absolute;bottom:68px;left:50%;transform:translateX(-50%) translateY(6px);padding:5px 12px;border-radius:99px;
  background:var(--solid,var(--panel));border:1px solid var(--line);color:var(--txt);font-size:12.5px;font-weight:600;white-space:nowrap;opacity:0;pointer-events:none;transition:.18s}
nav [data-label]:hover::after{opacity:1;transform:translateX(-50%)}
#upop{background:var(--solid,var(--panel))}
@media(max-width:760px){nav{padding:7px 8px;gap:2px;overflow-x:auto;max-width:calc(100vw - 10px)}nav button{width:44px;height:46px}nav button svg{width:23px;height:23px}nav .usr{width:44px}
  nav [data-label]::after{display:none}.wrap{padding-bottom:130px}}

/* ---------- calques de fond (thèmes néon seulement) ---------- */
#wall,#blobs,#veil,#dust{display:none;position:fixed;inset:0;pointer-events:none}
:root[data-theme^=neon] #wall,:root[data-theme^=neon] #blobs,:root[data-theme^=neon] #veil,:root[data-theme^=neon] #dust{display:block}
#wall{z-index:-4;transition:background .8s,transform .25s ease-out;transform:scale(1.07);background-size:cover;background-position:center}
#blobs{z-index:-3;overflow:hidden}
#blobs i{position:absolute;border-radius:50%;filter:blur(80px);opacity:.38;mix-blend-mode:screen}
#blobs i:nth-child(1){width:46vw;height:46vw;left:-10vw;top:-12vw;background:#8a4dff;animation:nb1 13s ease-in-out infinite alternate}
#blobs i:nth-child(2){width:38vw;height:38vw;right:-8vw;top:18vh;background:#ff4fd8;animation:nb2 17s ease-in-out infinite alternate}
#blobs i:nth-child(3){width:34vw;height:34vw;left:30vw;bottom:-14vw;background:#4f7bff;opacity:.3;animation:nb3 21s ease-in-out infinite alternate}
@keyframes nb1{to{transform:translate(18vw,14vh) scale(1.2)}}@keyframes nb2{to{transform:translate(-20vw,-10vh) scale(.85)}}@keyframes nb3{to{transform:translate(-18vw,-12vh) scale(1.25)}}
:root[data-theme=neonclair] #blobs i{mix-blend-mode:multiply;opacity:.22}
#veil{z-index:-2;background:radial-gradient(120% 90% at 50% 0%,rgba(8,4,24,.04),rgba(8,4,24,.42))}
:root[data-theme=neonclair] #veil{background:radial-gradient(120% 90% at 50% 0%,rgba(244,236,255,0),rgba(236,224,252,.30))}
#dust{z-index:-1}
.streak{position:fixed;height:2px;width:240px;left:-260px;border-radius:2px;background:linear-gradient(90deg,transparent,rgba(235,170,255,.9),transparent);box-shadow:0 0 14px rgba(200,120,255,.9);z-index:-1;pointer-events:none;animation:streak 7s linear infinite;opacity:0;display:none}
:root[data-theme^=neon] .streak{display:block}
.streak:nth-of-type(1){top:22%;animation-delay:1s}.streak:nth-of-type(2){top:58%;animation-delay:3.4s;animation-duration:9s}.streak:nth-of-type(3){top:80%;animation-delay:5.2s;animation-duration:6s}
@keyframes streak{0%{left:-260px;opacity:0}10%{opacity:1}60%{opacity:.9}100%{left:105vw;opacity:0}}

/* ---------- verre : cartes transparentes, SANS flou, nuances violettes mouvantes ---------- */
:root[data-theme^=neon]{background:var(--bg)}
:root[data-theme^=neon] body{background:transparent!important}
:root[data-theme^=neon] .card,:root[data-theme^=neon] .tile,:root[data-theme^=neon] .mc,:root[data-theme^=neon] .mod,:root[data-theme^=neon] .hero,
:root[data-theme^=neon] .alert{
  --rx:0deg;--ry:0deg;border:1px solid var(--line)!important;box-shadow:var(--shadow)!important;backdrop-filter:none!important;
  background-color:var(--glass)!important;
  background-image:linear-gradient(var(--acc),var(--acc)),linear-gradient(var(--acc),var(--acc)),linear-gradient(var(--acc),var(--acc)),linear-gradient(var(--acc),var(--acc)),
    linear-gradient(var(--acc),var(--acc)),linear-gradient(var(--acc),var(--acc)),linear-gradient(var(--acc),var(--acc)),linear-gradient(var(--acc),var(--acc)),
    linear-gradient(115deg,rgba(150,70,255,.15) 0%,rgba(255,70,215,.09) 28%,rgba(70,110,255,.13) 55%,rgba(190,90,255,.11) 78%,rgba(150,70,255,.15) 100%)!important;
  background-size:14px 1.5px,1.5px 14px,14px 1.5px,1.5px 14px,14px 1.5px,1.5px 14px,14px 1.5px,1.5px 14px,320% 320%!important;
  background-position:12px 11px,12px 11px,calc(100% - 12px) 11px,calc(100% - 12px) 11px,12px calc(100% - 11px),12px calc(100% - 11px),calc(100% - 12px) calc(100% - 11px),calc(100% - 12px) calc(100% - 11px),0% 40%!important;
  background-repeat:no-repeat!important;
  transform:perspective(900px) rotateX(var(--rx)) rotateY(var(--ry));transition:transform .25s ease-out,border-color .2s;text-shadow:0 1px 8px rgba(0,0,0,.30);
  animation:up .5s cubic-bezier(.2,.7,.2,1) backwards,nt 10s ease-in-out infinite,nbob 7s ease-in-out infinite!important}
:root[data-theme=neonclair] .card,:root[data-theme=neonclair] .tile,:root[data-theme=neonclair] .mc,:root[data-theme=neonclair] .mod,:root[data-theme=neonclair] .hero,:root[data-theme=neonclair] .alert{text-shadow:none}
:root[data-theme^=neon] .mod:hover,:root[data-theme^=neon] button.card:hover{border-color:var(--acc)!important;box-shadow:0 18px 44px color-mix(in srgb,var(--acc) 30%,transparent)!important}
/* le texte reste net : pas de flottement (translate fractionnaire = texte flou/net) sur les cartes de texte */
:root[data-theme^=neon] .card,:root[data-theme^=neon] .alert{animation:up .5s cubic-bezier(.2,.7,.2,1) backwards,nt 10s ease-in-out infinite!important}
@keyframes nt{0%{background-position:12px 11px,12px 11px,calc(100% - 12px) 11px,calc(100% - 12px) 11px,12px calc(100% - 11px),12px calc(100% - 11px),calc(100% - 12px) calc(100% - 11px),calc(100% - 12px) calc(100% - 11px),0% 40%}
  50%{background-position:12px 11px,12px 11px,calc(100% - 12px) 11px,calc(100% - 12px) 11px,12px calc(100% - 11px),12px calc(100% - 11px),calc(100% - 12px) calc(100% - 11px),calc(100% - 12px) calc(100% - 11px),100% 60%}
  100%{background-position:12px 11px,12px 11px,calc(100% - 12px) 11px,calc(100% - 12px) 11px,12px calc(100% - 11px),12px calc(100% - 11px),calc(100% - 12px) calc(100% - 11px),calc(100% - 12px) calc(100% - 11px),0% 40%}}
@keyframes nbob{50%{translate:0 -4px}}
:root[data-theme^=neon] .bento>*:nth-child(odd),:root[data-theme^=neon] .tiles>*:nth-child(odd){animation-delay:0s,-2s,-1s!important}
:root[data-theme^=neon] .bento>*:nth-child(even),:root[data-theme^=neon] .tiles>*:nth-child(even){animation-delay:.05s,-4.5s,-3s!important}
:root[data-theme^=neon] .mc small,:root[data-theme^=neon] h3.sec{font-family:ui-monospace,"Cascadia Mono",Consolas,monospace;letter-spacing:2px}
/* fenêtres, listes et fenêtres de saisie : plus opaques pour rester lisibles sur n'importe quel fond */
:root[data-theme^=neon] .box,:root[data-theme^=neon] #upop,:root[data-theme^=neon] #pal .pbox,:root[data-theme^=neon] #gbar,:root[data-theme^=neon] #mbar{background:var(--solid)!important;backdrop-filter:none!important}
:root[data-theme^=neon] #login,:root[data-theme^=neon] #modal,:root[data-theme^=neon] #pwmodal{backdrop-filter:none}

/* ---------- accueil « Jarvis » ---------- */
.hero{position:relative}
.hero .reactor{position:relative;width:132px;height:132px;flex:none;display:none;place-items:center;margin-right:8px}
:root[data-theme^=neon] .hero .reactor{display:grid}
.hero .reactor i{position:absolute;border-radius:50%;border:2px solid transparent}
.hero .reactor i:nth-child(1){inset:0;border-top-color:var(--acc);border-bottom-color:var(--acc);animation:nspin 9s linear infinite;filter:drop-shadow(0 0 8px var(--acc))}
.hero .reactor i:nth-child(2){inset:13px;border:2px dashed color-mix(in srgb,var(--acc) 70%,transparent);animation:nspin 14s linear infinite reverse}
.hero .reactor i:nth-child(3){inset:27px;border-left-color:var(--acc2);border-right-color:var(--acc2);animation:nspin 5s linear infinite;filter:drop-shadow(0 0 6px var(--acc2))}
.hero .reactor i:nth-child(4){inset:41px;border:0;background:radial-gradient(circle,#fff0fc 0%,var(--acc) 38%,rgba(255,80,220,.16) 70%);box-shadow:0 0 30px var(--acc),0 0 64px rgba(255,80,220,.5)}
@keyframes nspin{to{transform:rotate(360deg)}}
.hero .hello{flex:1;min-width:0}
:root[data-theme^=neon] .hero .hi{font-family:ui-monospace,"Cascadia Mono",Consolas,monospace;letter-spacing:3px}
.hero .hello h2 b{color:var(--acc);font-weight:700;text-shadow:0 0 22px color-mix(in srgb,var(--acc) 70%,transparent)}
.hero .htxt{margin:10px 0 0;font-family:ui-monospace,"Cascadia Mono",Consolas,monospace;font-size:13.5px;color:var(--mut);min-height:3.1em;max-width:640px}
:root[data-theme^=neon] .hero::before{content:"";position:absolute;left:0;right:0;height:70px;top:-70px;background:linear-gradient(180deg,transparent,rgba(190,140,255,.18),transparent);animation:nscan 5.5s linear infinite;pointer-events:none}
@keyframes nscan{to{top:110%}}
:root[data-theme^=neon] .hero .clock{font-weight:200;letter-spacing:3px;text-shadow:0 0 20px color-mix(in srgb,var(--acc) 55%,transparent)}
@media(max-width:820px){.hero .reactor{width:96px;height:96px}.hero .reactor i:nth-child(3){inset:20px}.hero .reactor i:nth-child(4){inset:30px}}

/* ---------- panneau « Fond d'écran » ---------- */
#wppanel{position:fixed;right:18px;bottom:96px;width:min(360px,calc(100vw - 24px));padding:18px;border-radius:24px;background:var(--solid,var(--panel));border:1px solid var(--line);box-shadow:0 24px 60px rgba(0,0,0,.45);z-index:70;display:none;flex-direction:column;gap:12px}
#wppanel.on{display:flex}
#wppanel h4{margin:0;font-size:16px}
#wppanel .seg{display:flex;gap:6px}#wppanel .seg button{flex:1;padding:8px 6px;font-size:13px}
#wppanel .swg{display:grid;grid-template-columns:repeat(3,1fr);gap:9px}
#wppanel .swg div{height:60px;border-radius:14px;cursor:pointer;border:2px solid transparent;display:flex;align-items:flex-end;padding:5px 7px;font-size:11px;color:#fff;text-shadow:0 1px 3px #000;background-size:cover;background-position:center;transition:.2s}
#wppanel .swg div:hover{transform:scale(1.05)}#wppanel .swg div.on{border-color:var(--acc)}
#wppanel small{color:var(--mut);font-size:12px;line-height:1.4}

/* ---------- grille pleine page (Base v1 M3.2, T2) : le texte courant garde une largeur lisible, les grilles occupent toute la largeur ---------- */
.wrap p,.wrap .sub,.wrap .hint{max-width:min(100%,900px)}
.tiles{grid-template-columns:repeat(auto-fill,minmax(190px,1fr))}
@media(min-width:1500px){.bento{gap:20px}.b3{grid-column:span 2}.b4{grid-column:span 3}}

/* ---------- mobile allégé (Base v1 M3.3, T3) : téléphone = aucun flou, aucune animation de fond, cartes simples ---------- */
@media(max-width:760px),(pointer:coarse) and (max-width:1024px){
  #blobs,#dust,.streak{display:none!important}
  :root[data-theme^=neon] .card,:root[data-theme^=neon] .tile,:root[data-theme^=neon] .mc,:root[data-theme^=neon] .mod,:root[data-theme^=neon] .hero,:root[data-theme^=neon] .alert{
    background-image:none!important;animation:none!important;transition:border-color .2s;text-shadow:none;box-shadow:none!important;background-color:var(--panel)!important}
  :root[data-theme^=neon] .hero::before,.hero .reactor i{animation:none!important}
  #wall{transform:none;transition:none}
  *{backdrop-filter:none!important}
  .hero{flex-direction:column;align-items:stretch;padding:18px!important}
  .hero .reactor{display:none!important}
  .hero .hello{width:100%}
}

/* ---------- effets : réduits / aucun ---------- */
html.fx-low #dust,html.fx-low .streak,html.fx-off #dust,html.fx-off .streak{display:none!important}
html.fx-low *,html.fx-off *{animation-duration:0s!important;animation-iteration-count:1!important}
html.fx-low .hero .reactor i{animation:nspin 14s linear infinite!important}
html.fx-low #blobs i{animation:none!important}
html.fx-off *{animation:none!important;transition:none!important}
@media(prefers-reduced-motion:reduce){#dust,.streak{display:none!important}:root[data-theme^=neon] .card,:root[data-theme^=neon] .tile,:root[data-theme^=neon] .mc,:root[data-theme^=neon] .mod,:root[data-theme^=neon] .hero{animation:none!important}}

/* ---------- accueil modulaire (home.js) ---------- */
#home .wrap{display:flex;flex-direction:column}
#home .wrap>*{flex:none}
.hm-off{display:none!important}
#hcfoot{display:flex;justify-content:center;margin-top:18px}
#hcust{position:fixed;right:18px;bottom:96px;width:min(380px,calc(100vw - 24px));max-height:70vh;overflow:auto;padding:18px;border-radius:24px;background:var(--solid,var(--panel));border:1px solid var(--line);box-shadow:0 24px 60px rgba(0,0,0,.45);z-index:70;display:none;flex-direction:column;gap:8px}
#hcust.on{display:flex}
#hcust h4{margin:0 0 2px;font-size:16px}#hcust small{color:var(--mut);font-size:12px;line-height:1.4;margin-bottom:6px}
.hrow{display:flex;align-items:center;gap:10px;padding:7px 4px;border-radius:10px;cursor:pointer;font-size:14px}
.hrow:hover{background:color-mix(in srgb,var(--acc) 10%,transparent)}
.hrow input{width:17px;height:17px;flex:none}.hrow>span:first-of-type{flex:1}
.hrow.hsub{padding-left:30px;font-size:13px;color:var(--mut)}
.hmv{display:flex;gap:4px}.hmv button{background:none;border:1px solid var(--line);color:var(--mut);border-radius:8px;width:26px;height:24px;font-size:11px;cursor:pointer;padding:0}
.hmv button:hover:not(:disabled){color:var(--txt);border-color:var(--acc)}.hmv button:disabled{opacity:.3;cursor:default}
.hbtns{display:flex;gap:8px;justify-content:flex-end;margin-top:8px}
nav .brand{position:relative}
nav .brand:hover .logo{transform:scale(1.06);transition:transform .15s}

/* cartes de texte : aucune transformation 3D (même à l'arrêt, un calque 3D rend le texte flou) */
:root[data-theme^=neon] .card,:root[data-theme^=neon] .alert{transform:none!important}

/* message d'alerte : au-dessus du dock, jamais par-dessus */
:root[data-theme^=neon] #toast{bottom:92px;z-index:60}

/* écran de connexion / première connexion : ni barre de navigation, ni bulle, ni recherche derrière (il n'y a encore rien à ouvrir) */
body:has(#login[style*="flex"]) nav,body:has(#login[style*="flex"]) #orb,body:has(#login[style*="flex"]) #gbar{display:none!important}
/* hologramme = logo H (holo.js) : petit dans la barre latérale ; page « Machine » = grande vue avec profondeur */
nav .logo.holo-on{width:48px;height:48px;background:none;box-shadow:none;border-radius:50%;display:block;position:relative}
nav .logo.holo-on .holo-mini{width:100%;height:100%;display:block}
#holo{background:radial-gradient(ellipse at 50% 45%,#2a1259 0%,#120a2e 45%,#050210 100%)}
#holo .wrap{max-width:none;padding:0;height:100%;position:relative}
#holo canvas{position:absolute;inset:0;width:100%;height:100%;display:block;cursor:grab;touch-action:none;filter:drop-shadow(0 0 14px rgba(170,110,255,.45))}
#holo .holo-t{position:absolute;top:16px;left:0;right:0;text-align:center;letter-spacing:.3em;font-size:13px;color:#b9a4f0;pointer-events:none;text-shadow:0 0 12px #a56bff}
#holo .holo-b{position:absolute;left:50%;bottom:100px;transform:translateX(-50%);display:flex;gap:8px;flex-wrap:wrap;justify-content:center;padding:10px 14px;border-radius:18px;background:#150b2ecc;backdrop-filter:blur(10px);border:1px solid #ffffff2a}
#holo .holo-b button{background:#2a1659;color:#ece6ff;border:1px solid #ffffff2a;border-radius:12px;padding:7px 13px;font-size:13px;cursor:pointer}
#holo .holo-b button.on{background:linear-gradient(135deg,#c06bff,#ff5fd0);color:#14052b;font-weight:700;border-color:transparent}

/* recherche : bouton rond flottant, hors de la barre du bas (bas à gauche ; en haut à droite sur petit écran) */
.fabsearch{position:fixed;left:22px;bottom:26px;z-index:31;width:52px;height:52px;border-radius:50%;border:1px solid var(--line);background:var(--dockbg,var(--panel));color:var(--txt);display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:var(--shadow,0 12px 30px rgba(0,0,0,.35));padding:0}
.fabsearch svg{width:24px;height:24px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.fabsearch:hover{color:var(--acc)}
@media(max-width:1150px){.fabsearch{left:auto;right:12px;top:12px;bottom:auto;width:44px;height:44px}}
/* Avant la première connexion (écrans d'installation, « Halvor est prêt », compte, domaine) : ni recherche ni bulle de l'assistant (retour de Saad, 2026-10-09) */
body:not(.shell) #sbtn,body:not(.shell) #orb,body:not(.shell) #orbmenu{display:none!important}
