.presence-hub{grid-column:1/-1}.presence-hub h2{margin:0 0 .8rem}.presence-list{display:flex;gap:1rem;flex-wrap:wrap}.presence-person{display:grid;justify-items:center;gap:.35rem;min-width:4rem}.presence-person small{max-width:6rem;text-align:center;overflow-wrap:anywhere}.presence-avatar{position:relative;display:inline-grid;place-items:center;width:3.2rem;height:3.2rem;border-radius:50%;padding:3px;isolation:isolate}.presence-avatar::before{content:'';position:absolute;inset:0;z-index:-1;border-radius:50%;background:conic-gradient(from 0deg,hsl(var(--aura-hue) 90% 66%),transparent 35%,hsl(var(--aura-hue) 90% 66%));animation:presence-rotate 3s linear infinite}.presence-avatar .viso,.presence-avatar .generic-avatar{width:100%;height:100%;border-radius:50%;overflow:hidden;background:#1a2346}.presence-avatar img{width:100%;height:100%;object-fit:cover}.presence-lobby{margin-top:1rem}.presence-lobby h3{margin:.3rem 0}.presence-candidate{display:flex;align-items:center;gap:.6rem;margin:.45rem 0}.presence-candidate .presence-avatar{width:2.5rem;height:2.5rem}.presence-candidate button{margin-left:auto}.presence-invite-toast{flex-wrap:wrap;justify-content:center;position:fixed;z-index:30;bottom:max(1rem,env(safe-area-inset-bottom));left:50%;transform:translateX(-50%);display:flex;align-items:center;gap:.7rem;max-width:calc(100vw - 1rem);padding:.75rem;border:1px solid #d6b36a;border-radius:1rem;background:#17203b;color:#fff;box-shadow:0 .5rem 2rem #0009}.presence-invite-toast>.presence-avatar{flex:none}.presence-invite-toast>span:not(.presence-avatar){display:grid;min-width:7rem}.presence-invite-toast small{font-size:.8rem}@keyframes presence-rotate{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.presence-avatar::before{animation:none}}
.presence-person{width:90px;gap:12px;padding-top:10px}
.presence-person>.presence-avatar{width:70px;height:70px;padding:0;animation:choice-wobble 4s ease-in-out infinite alternate-reverse}
.presence-person>.presence-avatar::before{inset:-16px;background:conic-gradient(from 0deg,hsl(var(--aura-hue) 95% 62%),#ffe27a,hsl(calc(var(--aura-hue) + 60) 95% 62%),#ff6fb1,hsl(var(--aura-hue) 95% 62%));filter:blur(9px) saturate(1.6) brightness(1.25);animation:presence-rotate 3s linear infinite,presence-breathe 1.6s ease-in-out infinite alternate}
.presence-person .viso,.presence-person .generic-avatar{border:3px solid #fff;box-shadow:0 0 14px 4px hsl(var(--aura-hue) 100% 70% / .9),0 0 30px 10px #ffe27a88;animation:presence-glow 1.6s ease-in-out infinite alternate}
.presence-person>.presence-avatar::after{content:'';position:absolute;inset:-4px;z-index:-1;border:3px solid hsl(var(--aura-hue) 95% 70%);border-radius:50%;opacity:0}
.presence-person.nuovo>.presence-avatar{animation:presence-enter .7s cubic-bezier(.2,1.7,.4,1) both,choice-wobble 4s ease-in-out .7s infinite alternate-reverse}
.presence-person.nuovo>.presence-avatar::after{animation:presence-wave 1.1s ease-out .3s 3}
.presence-person.nuovo small{animation:presence-name .5s ease .4s both}
/* scale separato da transform: presence-rotate gira l'alone, presence-breathe lo fa respirare (X 7955bee2 MEDIUM) */
@keyframes presence-breathe{from{opacity:.8;scale:.92}to{opacity:1;scale:1.12}}
@keyframes presence-glow{from{box-shadow:0 0 8px 2px hsl(var(--aura-hue) 100% 70% / .7),0 0 18px 6px #ffe27a55}to{box-shadow:0 0 18px 6px hsl(var(--aura-hue) 100% 72%),0 0 40px 14px #ffe27aaa}}
@keyframes presence-wave{0%{transform:scale(.9);opacity:1}100%{transform:scale(1.7);opacity:0}}
@keyframes presence-enter{from{transform:scale(0) rotate(-25deg);opacity:0}to{transform:none;opacity:1}}
@keyframes presence-name{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
@media(prefers-reduced-motion:reduce){.presence-person>.presence-avatar,.presence-person>.presence-avatar::before,.presence-person>.presence-avatar::after,.presence-person .viso,.presence-person .generic-avatar,.presence-person.nuovo>.presence-avatar,.presence-person.nuovo small{animation:none}}
.felt--inviti .dice-stage{display:none}.felt--inviti{display:flex;flex-direction:column}.felt--inviti .felt-lobby{flex:1 1 auto;min-height:0;overflow-y:auto}.felt--inviti .felt-lobby{position:relative;z-index:2;margin:0 0 6px;padding:4px 12px;border:2px solid var(--notte,#18213e);border-radius:12px;background:var(--carta,#fffdf7);color:var(--cream,#18213e);box-shadow:3px 4px 0 #18213e33}.felt--inviti .felt-lobby .presence-lobby{margin-top:0}.felt--inviti .felt-lobby h3{font-size:14px}.felt--inviti .presence-candidate{margin:.3rem 0}.felt--inviti .presence-candidate .presence-avatar{width:2.2rem;height:2.2rem}/* Daniele 13/10: su telefono, in attesa, chi ha aperto il tavolo vede inviti e «Inizia» subito sotto i giocatori, prima della scheda ancora vuota. */
@media(max-width:760px){.app-layout-active .room-grid--play:has(>.felt--inviti){grid-template-areas:"players" "felt" "score"!important;grid-template-rows:auto auto auto!important}}
