:root{--bg:#02070a;--panel:rgba(5,20,26,.86);--line:rgba(70,224,255,.23);--text:#d8f8ff;--muted:#6ca6b4;--accent:#3ee8ff;--accent2:#9df7ff;--danger:#ff6e83;--ok:#71ffbf}*{box-sizing:border-box}html,body{margin:0;min-height:100%;background:radial-gradient(circle at 50% 0%,#0b2731 0,var(--bg) 50%);color:var(--text);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}body:before{content:"";position:fixed;inset:0;pointer-events:none;background-image:linear-gradient(rgba(62,232,255,.025) 1px,transparent 1px),linear-gradient(90deg,rgba(62,232,255,.025) 1px,transparent 1px);background-size:36px 36px}.scanline{position:fixed;inset:0;pointer-events:none;background:repeating-linear-gradient(to bottom,transparent 0 3px,rgba(255,255,255,.012) 4px)}.hidden{display:none!important}.panel{background:linear-gradient(180deg,rgba(7,28,35,.94),rgba(2,12,16,.92));border:1px solid var(--line);box-shadow:inset 0 0 36px rgba(62,232,255,.035),0 18px 70px rgba(0,0,0,.35);border-radius:12px;backdrop-filter:blur(12px)}.eyebrow,.panel-title{color:var(--accent);letter-spacing:.18em;font-size:.75rem}.login-view{min-height:100vh;display:grid;place-items:center;padding:20px}.login-card{width:min(430px,100%);padding:36px;display:flex;flex-direction:column;gap:14px;text-align:center}.login-card h1{font-size:2.2rem;letter-spacing:.2em;margin:0}.login-card p{color:var(--muted);margin:0 0 10px}.login-card input,.device-form input,.device-form select{border:1px solid var(--line);background:#031015;color:var(--text);padding:14px;border-radius:8px;font:inherit;outline:none}.login-card button,.device-form button{border:1px solid var(--line);background:rgba(62,232,255,.09);color:var(--accent2);padding:13px;border-radius:8px;font:inherit;cursor:pointer}.mini-orb{width:76px;height:76px;border:1px solid var(--accent);border-radius:50%;margin:10px auto;display:grid;place-items:center;box-shadow:0 0 30px rgba(62,232,255,.25)}.mini-orb i{width:32px;height:32px;border-radius:50%;background:var(--accent);box-shadow:0 0 28px var(--accent)}.error{min-height:18px;color:var(--danger);font-size:.8rem}.shell{width:min(1540px,96vw);margin:2vh auto;position:relative}.topbar{display:flex;align-items:center;justify-content:space-between;padding:18px 22px;margin-bottom:10px}h1{margin:.3rem 0 0;font-size:1.7rem;letter-spacing:.14em}h1 span{font-size:.72rem;color:var(--accent);border:1px solid var(--line);border-radius:999px;padding:5px 9px;vertical-align:middle}.top-actions{display:flex;align-items:center;gap:14px}.clock-wrap{text-align:right}#clock{font-size:1.35rem;color:var(--accent2)}#date{color:var(--muted);font-size:.78rem}.tabs{display:flex;gap:6px;padding:7px;margin-bottom:10px}.tab,.chip{background:rgba(62,232,255,.04);color:var(--muted);border:1px solid var(--line);border-radius:8px;padding:9px 13px;font:inherit;font-size:.72rem;cursor:pointer}.tab.active,.chip.active{color:var(--accent);background:rgba(62,232,255,.1)}.tabpage{display:none}.tabpage.active{display:block}.grid{display:grid;grid-template-columns:260px minmax(0,1fr) 260px;gap:14px;min-height:72vh}.leftcol,.rightcol{display:flex;flex-direction:column;gap:14px}.orb-card{min-height:290px;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center}.orb{width:150px;height:150px;border:0;background:transparent;position:relative;cursor:pointer;filter:drop-shadow(0 0 18px rgba(62,232,255,.35))}.orb-ring,.orb-core{position:absolute;border-radius:50%;inset:50%;transform:translate(-50%,-50%)}.orb-ring{border:1px solid var(--accent)}.r1{width:132px;height:132px;animation:spin 9s linear infinite;border-top-color:transparent;border-bottom-color:transparent}.r2{width:100px;height:100px;animation:spin 5s linear infinite reverse;border-left-color:transparent}.orb-core{width:62px;height:62px;background:radial-gradient(circle,#e8fdff 0 5%,#52ecff 10%,rgba(15,132,152,.45) 38%,rgba(0,0,0,.1) 70%);box-shadow:0 0 45px rgba(62,232,255,.9),inset 0 0 20px #fff}.orb.listening .orb-core{animation:pulse .65s ease-in-out infinite alternate}.voice-state{margin-top:16px;color:var(--accent);letter-spacing:.11em;font-size:.8rem}.orb-card small,.muted{color:var(--muted)}.status-card,.quick-card,.info-card{padding:17px}.metric{display:flex;justify-content:space-between;margin-top:18px;font-size:.8rem}.metric span{color:var(--muted)}.bar{height:5px;margin-top:6px;background:#07151a;overflow:hidden;border-radius:4px}.bar i{display:block;width:0;height:100%;background:linear-gradient(90deg,#177989,var(--accent));transition:width .5s}.hostname{margin-top:18px;color:var(--muted);font-size:.7rem;word-break:break-all}.console{display:flex;flex-direction:column;overflow:hidden;min-width:0}.console-head{display:flex;justify-content:space-between;align-items:center;padding:17px 19px;border-bottom:1px solid var(--line)}.subtitle{margin-top:4px;color:var(--muted);font-size:.72rem}.messages{flex:1;overflow:auto;padding:22px;min-height:420px}.msg{max-width:78%;margin-bottom:20px}.msg.user{margin-left:auto}.who{color:var(--accent);font-size:.67rem;letter-spacing:.14em;margin:0 0 6px 7px}.user .who{text-align:right;color:#9bcbd5;margin-right:7px}.bubble{padding:13px 15px;line-height:1.55;background:rgba(46,192,216,.08);border:1px solid var(--line);border-radius:4px 14px 14px 14px;white-space:pre-wrap}.user .bubble{background:rgba(255,255,255,.045);border-radius:14px 4px 14px 14px}.composer{padding:14px;display:flex;gap:10px;border-top:1px solid var(--line)}.composer input{flex:1;min-width:0;border:1px solid var(--line);background:#031015;color:var(--text);padding:14px 15px;border-radius:8px;outline:none;font:inherit}.composer button,.quick{border:1px solid var(--line);background:rgba(62,232,255,.07);color:var(--accent2);border-radius:8px;padding:0 18px;font:inherit;cursor:pointer}.quick{width:100%;text-align:left;padding:12px;margin-top:10px}.quick:hover,.composer button:hover{background:rgba(62,232,255,.13)}.module{margin-top:14px;color:#a9d6df;font-size:.8rem}.module i{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--accent);box-shadow:0 0 10px var(--accent);margin-right:8px}.page-panel{padding:22px;min-height:70vh}.page-head{display:flex;align-items:center;justify-content:space-between}.page-head h2{margin:8px 0 0;font-size:1.4rem}.device-form{display:grid;grid-template-columns:1.1fr 1.5fr .7fr auto;gap:10px;margin:24px 0}.card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px}.device-card,.memory-item{border:1px solid var(--line);background:rgba(62,232,255,.035);padding:15px;border-radius:10px}.device-top{display:flex;gap:9px;align-items:center}.device-top span:last-child{margin-left:auto;color:var(--muted);font-size:.7rem;text-transform:uppercase}.dot{width:9px;height:9px;border-radius:50%}.dot.ok{background:var(--ok);box-shadow:0 0 12px var(--ok)}.dot.bad{background:var(--danger);box-shadow:0 0 12px var(--danger)}.host{margin:10px 0;color:var(--accent2);word-break:break-all}.danger{margin-top:12px;border:1px solid rgba(255,110,131,.35);background:rgba(255,110,131,.06);color:var(--danger);padding:8px 10px;border-radius:7px;cursor:pointer}.memory-list{display:flex;flex-direction:column;gap:9px;margin-top:20px}.memory-item{display:flex;justify-content:space-between;gap:20px;align-items:center}.memory-item small{display:block;color:var(--muted);margin-top:6px}@keyframes spin{to{transform:translate(-50%,-50%) rotate(360deg)}}@keyframes pulse{from{transform:translate(-50%,-50%) scale(.9)}to{transform:translate(-50%,-50%) scale(1.12)}}@media(max-width:1000px){.grid{grid-template-columns:1fr}.leftcol,.rightcol{display:grid;grid-template-columns:1fr 1fr}.console{min-height:65vh}.device-form{grid-template-columns:1fr 1fr}}@media(max-width:650px){.shell{width:100%;margin:0}.panel,.topbar{border-radius:0}.topbar{padding:12px}.clock-wrap{display:none}.tabs{overflow:auto;border-radius:0}.grid{gap:8px}.leftcol,.rightcol{grid-template-columns:1fr;gap:8px}.orb-card{min-height:210px}.messages{padding:14px}.msg{max-width:94%}.composer{padding:8px}.composer button{padding:0 10px}.device-form{grid-template-columns:1fr}.page-panel{padding:14px}.memory-item{align-items:flex-start}.login-card{padding:24px}}
.security-note{margin:18px 0;padding:12px 14px;border:1px solid var(--line);border-radius:8px;font-size:.78rem}.security-note.oknote{color:var(--ok);background:rgba(113,255,191,.04)}.security-note.warn{color:#ffd27a;background:rgba(255,210,122,.05);border-color:rgba(255,210,122,.28)}.docker-actions{display:flex;gap:7px;margin-top:12px}.docker-actions button{border:1px solid var(--line);background:rgba(62,232,255,.06);color:var(--accent2);padding:7px 9px;border-radius:6px;cursor:pointer}.docker-actions .danger{margin-top:0;color:var(--danger);border-color:rgba(255,110,131,.35)}.allow-state{margin-top:12px;color:var(--muted);font-size:.7rem;text-transform:uppercase;letter-spacing:.08em}

/* JARVIS_FIXED_CHAT_WAKEWORD_V1 */
html,body{height:100%;overflow:hidden}
#appView.shell{height:100dvh;max-height:100dvh;margin:0 auto;padding:2vh 0;display:flex;flex-direction:column;overflow:hidden}
#appView>.topbar,#appView>.tabs{flex:0 0 auto}
#appView>.tabpage.active{display:block;flex:1 1 auto;min-height:0;overflow:auto}
#tab-dialog.tabpage.active{overflow:hidden}
#tab-dialog .grid{height:100%;min-height:0}
#tab-dialog .console{height:100%;min-height:0;position:relative}
#tab-dialog .console-head,#tab-dialog .composer{flex:0 0 auto}
#tab-dialog .messages{min-height:0;overflow-y:auto;overscroll-behavior:contain;scrollbar-gutter:stable;padding-bottom:26px}
#tab-dialog .leftcol,#tab-dialog .rightcol{min-height:0;overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin}
.messages::-webkit-scrollbar,#tab-dialog .leftcol::-webkit-scrollbar,#tab-dialog .rightcol::-webkit-scrollbar{width:8px}
.messages::-webkit-scrollbar-track,#tab-dialog .leftcol::-webkit-scrollbar-track,#tab-dialog .rightcol::-webkit-scrollbar-track{background:rgba(2,12,16,.35)}
.messages::-webkit-scrollbar-thumb,#tab-dialog .leftcol::-webkit-scrollbar-thumb,#tab-dialog .rightcol::-webkit-scrollbar-thumb{background:rgba(62,232,255,.24);border-radius:999px}
.scroll-latest{position:absolute;right:18px;bottom:78px;z-index:6;border:1px solid rgba(62,232,255,.42);background:rgba(3,16,21,.94);color:var(--accent2);box-shadow:0 8px 28px rgba(0,0,0,.42),0 0 18px rgba(62,232,255,.12);border-radius:999px;padding:9px 13px;font:inherit;font-size:.68rem;letter-spacing:.06em;cursor:pointer;backdrop-filter:blur(8px)}
.scroll-latest:hover{background:rgba(62,232,255,.14)}
.voice-transcript{min-height:18px;margin-top:7px;max-width:92%;padding:4px 8px;color:var(--muted);font-size:.68rem;line-height:1.35;text-align:center;word-break:break-word}
.voice-state.wake-ok{color:var(--ok);text-shadow:0 0 12px rgba(113,255,191,.28)}
.voice-state.wake-miss{color:#ffd27a;text-shadow:0 0 12px rgba(255,210,122,.18)}
.voice-state.wake-error{color:var(--danger)}
@media(max-width:1000px){#appView.shell{padding:1vh 0}#tab-dialog.tabpage.active{overflow:auto}#tab-dialog .grid{height:auto;min-height:100%}#tab-dialog .leftcol,#tab-dialog .rightcol{overflow:visible}#tab-dialog .console{min-height:65vh}.scroll-latest{bottom:72px}}
@media(max-width:650px){#appView.shell{padding:0}#appView>.tabpage.active{overflow:auto}.scroll-latest{right:10px;bottom:64px}.voice-transcript{font-size:.64rem}}

/* JARVIS_MOBILE_CHAT_V2
   Smartphone: Kopf + Tabs + kompakter Mikrofonstreifen bleiben stehen.
   Nur .messages scrollt; VisualViewport hält den Composer über der Bildschirmtastatur. */
.console-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}
.danger-chip{color:var(--danger);border-color:rgba(255,110,131,.36);background:rgba(255,110,131,.055)}
.danger-chip:hover{background:rgba(255,110,131,.12)}
.danger-chip:disabled{opacity:.55;cursor:wait}
.chat-empty{min-height:100%;display:grid;place-items:center;text-align:center;padding:24px;font-size:.75rem;letter-spacing:.05em}

@media(max-width:650px){
  html,body{width:100%;height:100%;max-height:100%;overflow:hidden!important;overscroll-behavior:none;touch-action:manipulation}
  body{position:fixed;inset:0;width:100%}
  #appView.shell{
    width:100%;height:var(--jarvis-app-height,100dvh)!important;min-height:0!important;max-height:var(--jarvis-app-height,100dvh)!important;
    margin:0;padding:0;display:flex;flex-direction:column;overflow:hidden!important
  }
  #appView>.topbar{flex:0 0 auto;margin:0;padding:8px 10px;min-height:58px}
  #appView>.topbar h1{font-size:1.25rem;margin:.15rem 0 0}
  #appView>.topbar .eyebrow{font-size:.58rem;letter-spacing:.1em}
  #appView>.topbar h1 span{font-size:.56rem;padding:3px 6px}
  #appView>.tabs{flex:0 0 auto;margin:0;padding:5px 6px;overflow-x:auto;overflow-y:hidden;white-space:nowrap;border-left:0;border-right:0}
  #appView>.tabs .tab{padding:8px 10px;flex:0 0 auto}
  #appView>.tabpage.active{flex:1 1 auto;min-height:0;overflow:hidden!important}
  #tab-dialog.tabpage.active{display:block;overflow:hidden!important}
  #tab-dialog .grid{
    height:100%!important;min-height:0!important;display:grid!important;
    grid-template-columns:minmax(0,1fr)!important;grid-template-rows:auto minmax(0,1fr)!important;
    gap:5px!important;overflow:hidden!important
  }

  /* Mikrofon bleibt sichtbar, braucht aber auf Mobile nur einen kompakten Streifen. */
  #tab-dialog .leftcol{display:block!important;min-height:0;overflow:visible!important}
  #tab-dialog .leftcol .status-card{display:none!important}
  #tab-dialog .orb-card{
    min-height:78px!important;height:78px;padding:6px 10px;border-radius:0;
    display:grid;grid-template-columns:64px minmax(0,1fr);grid-template-rows:1fr 1fr;
    align-items:center;justify-items:stretch;text-align:left;column-gap:8px
  }
  #tab-dialog .orb{width:60px;height:60px;grid-column:1;grid-row:1/3;justify-self:center}
  #tab-dialog .orb .r1{width:54px;height:54px}
  #tab-dialog .orb .r2{width:42px;height:42px}
  #tab-dialog .orb .orb-core{width:27px;height:27px}
  #tab-dialog .voice-state{grid-column:2;grid-row:1;margin:0;align-self:end;font-size:.66rem;letter-spacing:.06em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  #tab-dialog .voice-transcript{grid-column:2;grid-row:2;min-height:0;margin:2px 0 0;padding:0;max-width:100%;align-self:start;text-align:left;font-size:.61rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  #tab-dialog .orb-card small{display:none!important}
  #tab-dialog .rightcol{display:none!important}

  /* Das ist auf Smartphones der EINZIGE vertikale Scroller. */
  #tab-dialog .console{
    min-height:0!important;height:auto!important;overflow:hidden!important;border-radius:0;
    display:flex!important;flex-direction:column!important
  }
  #tab-dialog .console-head{flex:0 0 auto;padding:7px 9px;gap:8px;min-height:48px}
  #tab-dialog .console-head .subtitle{font-size:.61rem;max-width:125px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  #tab-dialog .console-actions{gap:5px;flex-wrap:nowrap}
  #tab-dialog .console-actions .chip{padding:7px 7px;font-size:.56rem;white-space:nowrap}
  #tab-dialog .messages{
    flex:1 1 auto!important;height:0!important;min-height:0!important;max-height:none!important;
    overflow-y:auto!important;overflow-x:hidden!important;-webkit-overflow-scrolling:touch;
    overscroll-behavior-y:contain;touch-action:pan-y;scrollbar-gutter:auto;
    padding:12px 10px 16px!important
  }
  #tab-dialog .msg{max-width:96%;margin-bottom:13px}
  #tab-dialog .bubble{padding:10px 11px;line-height:1.45;font-size:.84rem;overflow-wrap:anywhere}
  #tab-dialog .composer{
    flex:0 0 auto;padding:7px 7px calc(7px + env(safe-area-inset-bottom));gap:6px;
    background:rgba(2,12,16,.98);position:relative;z-index:8
  }
  #tab-dialog .composer input{font-size:16px!important;padding:11px 10px;min-height:44px}
  #tab-dialog .composer button{min-height:44px;padding:0 10px}
  #tab-dialog .scroll-latest{right:8px;bottom:calc(62px + env(safe-area-inset-bottom));padding:8px 10px;font-size:.6rem}
}
