Add Deck and Athena Classic themes

This commit is contained in:
Mikei386
2026-09-29 22:43:16 +02:00
parent c2fcd5c509
commit e63a8aa76f
10 changed files with 157 additions and 34 deletions
+16
View File
@@ -0,0 +1,16 @@
# Farbschemata
Unter **Einstellungen → Darstellung** stehen zwei Schemas zur Auswahl:
- **Deck Standard**: das bisherige Anthrazit- und Salbeigrün-Schema.
- **Athena Classic**: Dunkelblau, Cyan und Mint aus dem alten Athena-Dashboard.
Die Auswahl wird sofort auf die gesamte Deck-Oberfläche einschließlich des
Dashboards angewandt. Sie wird ausschließlich im `localStorage` dieses Browsers
gespeichert; sie ist keine Serverkonfiguration und beeinflusst weder API noch
Modelle. Ein anderer Browser verwendet zunächst Deck Standard.
`style.css` und `dashboard.css` verwenden `--deck-tone-*`-Farbvariablen mit den
bisherigen Deck-Farben als Fallback. `themes.css` definiert die zweite Palette.
Für weitere Schemas kann ein neuer `data-theme`-Wert samt Farbvariablen ergänzt
werden. Die Vorschaukarten in `app.js` zeigen die Auswahl.
+17
View File
@@ -7,10 +7,27 @@ async function api(path,method='GET'){const r=await fetch('/api/v1/'+path,{metho
const metric=(title,value)=>`<div><small>${title}</small><strong>${value}</strong></div>`;
const bar=v=>v==null?'':`<progress max="100" value="${Number(v)}" aria-label="Auslastung"></progress>`;
const placeholders={chat:['Sprachmodelle / Chat','Modellprofile, Laufzeit und Chat','Hier werden später Modellprofile und native llama.cpp-Prozesse verwaltet.'],image:['Bildgenerierung','Worker und Aufträge','Hier entsteht später die Übersicht für Bild-Worker und deren Zustand.'],audio:['Audio','Spracheingabe und Sprachausgabe','Hier werden später getrennte Worker für Erkennung und Ausgabe eingebunden.'],services:['Weitere Dienste','Erweiterbare Dienste','Hier finden später zusätzliche Worker und ihre Schnittstellen Platz.']};
const DECK_THEME_KEY='athena-deck-theme';
const DECK_THEMES=new Set(['deck','athena-classic']);
function applyDeckTheme(theme){
const selected=DECK_THEMES.has(theme)?theme:'deck';
document.documentElement.dataset.theme=selected;
try{localStorage.setItem(DECK_THEME_KEY,selected)}catch(_){}
return selected;
}
try{applyDeckTheme(localStorage.getItem(DECK_THEME_KEY))}catch(_){applyDeckTheme('deck')}
function appearancePage(){
if(view.querySelector('#appearance-page'))return;
view.innerHTML=`<div id="appearance-page"><div class="kicker">EINSTELLUNGEN / DARSTELLUNG</div><h1>Darstellung</h1><p>Wähle die Farben für Athena Deck. Die Auswahl gilt in diesem Browser und wird sofort angewendet.</p><div class="theme-options" role="group" aria-label="Farbschema"><button type="button" class="theme-choice" data-theme-choice="deck" aria-pressed="false"><span class="theme-preview deck-preview"><i></i><i></i><i></i></span><strong>Deck Standard</strong><small>Anthrazit, Salbeigrün und helle Akzente</small></button><button type="button" class="theme-choice" data-theme-choice="athena-classic" aria-pressed="false"><span class="theme-preview classic-preview"><i></i><i></i><i></i></span><strong>Athena Classic</strong><small>Dunkelblau, Cyan und Mint wie im alten Dashboard</small></button></div></div>`;
const sync=()=>view.querySelectorAll('[data-theme-choice]').forEach(b=>b.setAttribute('aria-pressed',String(b.dataset.themeChoice===document.documentElement.dataset.theme)));
view.querySelectorAll('[data-theme-choice]').forEach(b=>b.addEventListener('click',()=>{applyDeckTheme(b.dataset.themeChoice);sync()}));
sync();
}
async function refresh(){if(refreshing)return;refreshing=true;const page=location.hash.slice(1)||'dashboard';document.querySelectorAll('nav a').forEach(a=>a.classList.toggle('active',a.hash==='#'+page));try{error.textContent='';let html;
if(['video','video-runtime'].includes(page)){VideoUI.runtime();return;}
if(['chat','image','audio','stt','music','voice','video','runtime','runtimes','image-runtime','stt-runtime','tts-runtime','docker-runtime','services'].includes(page)){Studio.render(page);return;}
if(page==='access'){await accessPage();return;}
if(page==='appearance'){appearancePage();return;}
if(page==='network'){await networkPage();return;}
if(page==='dashboard'){DashboardUI.render();return;}
if(page==='home'||page==='endpoint'){await EndpointUI.render(page==='endpoint');return;
+2 -1
View File
@@ -9,6 +9,7 @@ const imagePhaseLabel=p=>({'running':'Bildauftrag läuft','loading':'Bildmodell
function cleanup(){for(const timer of timers)clearInterval(timer);timers=[];controller?.abort();controller=null;host=null;root=null}
function gpuCard(g){let total=g.memory_total_mib||0,used=g.memory_used_mib||0,p=total&&g.memory_used_mib!=null?used/total*100:0,load=Math.max(0,Math.min(100,g.gpu_percent||0)),memoryText=total&&g.memory_used_mib!=null?`${(used/1024).toFixed(1)} / ${(total/1024).toFixed(1)} GiB`:'–';return `<article class="card span6"><div class="gpu-title"><div><div class="label">GPU ${esc(g.index)}</div><div class="value">${esc(g.name)}</div></div><span class="badge">${esc(g.pstate)}</span></div><div class="metrics"><div class="metric"><b>${pct(g.gpu_percent)}</b><span>GPU-Kern</span></div><div class="metric"><b>${memoryText}</b><span>VRAM</span></div><div class="metric"><b>${esc(g.temperature_c)} °C</b><span>Temperatur</span></div><div class="metric"><b>${esc(g.power_w)} / ${esc(g.power_limit_w)} W</b><span>Leistung</span></div><div class="metric"><b>${esc(g.memory_controller_percent)} %</b><span>Speichercontroller</span></div><div class="metric"><b>${esc(g.graphics_clock_mhz)} MHz</b><span>GPU-Takt</span></div><div class="metric"><b>${esc(g.memory_clock_mhz)} MHz</b><span>Speichertakt</span></div><div class="metric"><b>${esc(g.fan_percent)} %</b><span>Lüfter</span></div></div><div class="bar-label"><span>GPU-Auslastung</span><span>${pct(load)}</span></div><div class="bar"><div class="fill gpu-load" style="width:${load}%"></div></div><div class="bar-label"><span>VRAM</span><span>${pct(p)}</span></div><div class="bar"><div class="fill" style="width:${p}%"></div></div></article>`}
function mount(){
historyColors=document.documentElement.dataset.theme==='athena-classic'?['#45d7ff','#ffc65c','#66e3a4','#bda7ff']:['#c5edaf','#ffb454','#7fc8b6','#c39bff'];
controller=new AbortController();
root=host;
root.innerHTML=`<div class="dashboard-root"><div class="top"><div><div class="kicker">ATHENA / TELEMETRIE</div><h1>Dashboard</h1><p>System, Inferenz und Verlauf auf einen Blick.</p></div><div class="live"><span class="dot" id="dot"></span><span id="updated">verbinde …</span></div></div><section class="grid"> <article class="card span3"><div class="label">Aktives Profil</div><div class="value" id="profile">–</div><div class="sub" id="profileSub">Deck wird abgefragt</div></article>
@@ -122,7 +123,7 @@ refreshFull();timers.push(setInterval(()=>{if(host?.isConnected)refreshFull();el
let historyRange='24h',usageMode='total',lastProfileUsage=[];
const historyColors=['#c5edaf','#ffb454','#7fc8b6','#c39bff'];
let historyColors=['#c5edaf','#ffb454','#7fc8b6','#c39bff'];
const hiddenHistorySeries=new Set();let lastHistoryPoints=[];
const hiddenSlotSeries=new Set();let lastSlotPoints=[];
function drawHistory(points){
+19 -19
View File
@@ -1,60 +1,60 @@
/* Native Deck dashboard: one DOM, one typography and surface system. */
#deck-dashboard-host{--db-line:#303a37;--db-muted:#97a79e;--db-accent:#c5edaf;--db-danger:#e9aaa0;min-width:0;color:#e9edea}
#deck-dashboard-host{--db-line:var(--deck-tone-303a37, #303a37);--db-muted:var(--deck-tone-97a79e, #97a79e);--db-accent:var(--deck-tone-c5edaf, #c5edaf);--db-danger:var(--deck-tone-e9aaa0, #e9aaa0);min-width:0;color:var(--deck-tone-e9edea, #e9edea)}
#deck-dashboard-host *{box-sizing:border-box}
#deck-dashboard-host .top{display:flex;align-items:end;justify-content:space-between;gap:22px;margin-bottom:28px}
#deck-dashboard-host .top h1{margin:12px 0 6px}
#deck-dashboard-host .top p{margin:0}
#deck-dashboard-host .live{display:flex;align-items:center;gap:9px;color:var(--db-muted);font-size:12px;white-space:nowrap}
#deck-dashboard-host .dot{width:8px;height:8px;border-radius:50%;background:#bdeba4;box-shadow:0 0 0 4px #bdeba41c}
#deck-dashboard-host .dot{width:8px;height:8px;border-radius:50%;background:var(--deck-tone-bdeba4, #bdeba4);box-shadow:0 0 0 4px #bdeba41c}
#deck-dashboard-host .grid{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:18px;margin:0}
#deck-dashboard-host .card{background:#181f21;border:1px solid var(--db-line);border-radius:13px;padding:24px;min-width:0}
#deck-dashboard-host .card{background:var(--deck-tone-181f21, #181f21);border:1px solid var(--db-line);border-radius:13px;padding:24px;min-width:0}
#deck-dashboard-host .span3{grid-column:span 3}#deck-dashboard-host .span4{grid-column:span 4}#deck-dashboard-host .span6{grid-column:span 6}#deck-dashboard-host .span12{grid-column:span 12}
#deck-dashboard-host .label{color:#95a69b;font-size:11px;letter-spacing:1px;text-transform:uppercase}
#deck-dashboard-host .value{font-size:27px;font-weight:550;letter-spacing:-.7px;margin:14px 0 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#e4f1de}
#deck-dashboard-host .label{color:var(--deck-tone-95a69b, #95a69b);font-size:11px;letter-spacing:1px;text-transform:uppercase}
#deck-dashboard-host .value{font-size:27px;font-weight:550;letter-spacing:-.7px;margin:14px 0 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--deck-tone-e4f1de, #e4f1de)}
#deck-dashboard-host .sub{font-size:12px;line-height:1.55;color:var(--db-muted);margin-top:5px}
#deck-dashboard-host .section-title{grid-column:1/-1;color:#c5edaf;font-size:11px;letter-spacing:2px;text-transform:uppercase;margin:20px 0 -4px;padding-bottom:12px;border-bottom:1px solid var(--db-line)}
#deck-dashboard-host .section-title{grid-column:1/-1;color:var(--deck-tone-c5edaf, #c5edaf);font-size:11px;letter-spacing:2px;text-transform:uppercase;margin:20px 0 -4px;padding-bottom:12px;border-bottom:1px solid var(--db-line)}
#deck-dashboard-host .bar-label{display:flex;justify-content:space-between;gap:10px;color:var(--db-muted);font-size:11px;margin-top:15px}
#deck-dashboard-host .bar{height:7px;background:#101718;border-radius:20px;overflow:hidden;margin-top:7px}
#deck-dashboard-host .fill{height:100%;width:0;background:#bdeba4;transition:width .45s}
#deck-dashboard-host .fill.gpu-load{background:#7fc8b6}
#deck-dashboard-host .bar{height:7px;background:var(--deck-tone-101718, #101718);border-radius:20px;overflow:hidden;margin-top:7px}
#deck-dashboard-host .fill{height:100%;width:0;background:var(--deck-tone-bdeba4, #bdeba4);transition:width .45s}
#deck-dashboard-host .fill.gpu-load{background:var(--deck-tone-7fc8b6, #7fc8b6)}
#deck-dashboard-host .gpu-title,#deck-dashboard-host .row,#deck-dashboard-host .slot-head{display:flex;align-items:center;justify-content:space-between;gap:16px}
#deck-dashboard-host .gpu-title .value{font-size:19px;white-space:normal;line-height:1.35}
#deck-dashboard-host .badge{border:1px solid #3a493f;border-radius:20px;padding:5px 9px;color:#c5edaf;font-size:11px;white-space:nowrap}
#deck-dashboard-host .badge{border:1px solid var(--deck-tone-3a493f, #3a493f);border-radius:20px;padding:5px 9px;color:var(--deck-tone-c5edaf, #c5edaf);font-size:11px;white-space:nowrap}
#deck-dashboard-host .metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;margin-top:20px}
#deck-dashboard-host .metric{min-width:0}
#deck-dashboard-host .metric b{display:block;font-size:17px;font-weight:550;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#deck-dashboard-host .metric span{display:block;color:var(--db-muted);font-size:11px;line-height:1.45;margin-top:4px}
#deck-dashboard-host .span4 .metrics{grid-template-columns:repeat(2,minmax(0,1fr))}
#deck-dashboard-host .status{color:#bdeba4}#deck-dashboard-host .status.bad,#deck-dashboard-host .error{color:var(--db-danger)}
#deck-dashboard-host .status{color:var(--deck-tone-bdeba4, #bdeba4)}#deck-dashboard-host .status.bad,#deck-dashboard-host .error{color:var(--db-danger)}
#deck-dashboard-host table{border-collapse:collapse;width:100%;margin-top:15px;font-size:12px}
#deck-dashboard-host th,#deck-dashboard-host td{text-align:left;padding:11px 8px;border-bottom:1px solid var(--db-line);vertical-align:top}
#deck-dashboard-host th{font-weight:500;color:var(--db-muted)}
#deck-dashboard-host .scroll{max-height:330px;overflow:auto}
#deck-dashboard-host .scroll th{position:sticky;top:0;background:#181f21}
#deck-dashboard-host .scroll th{position:sticky;top:0;background:var(--deck-tone-181f21, #181f21)}
#deck-dashboard-host .slot-list,#deck-dashboard-host .usage-list{display:grid;gap:12px;margin-top:17px}
#deck-dashboard-host .slot,#deck-dashboard-host .profile-item{background:#151b1c;border:1px solid var(--db-line);border-radius:10px;padding:16px}
#deck-dashboard-host .slot,#deck-dashboard-host .profile-item{background:var(--deck-tone-151b1c, #151b1c);border:1px solid var(--db-line);border-radius:10px;padding:16px}
#deck-dashboard-host .slot-head b,#deck-dashboard-host .usage-head b{font-size:14px;font-weight:550}
#deck-dashboard-host .profiles{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-top:15px}
#deck-dashboard-host .profile-item.active{border-color:#9acb88}
#deck-dashboard-host .profile-item.active{border-color:var(--deck-tone-9acb88, #9acb88)}
#deck-dashboard-host .profile-item b{display:block;font-weight:550}
#deck-dashboard-host .profile-item span{color:var(--db-muted);font-size:11px}
#deck-dashboard-host .event{padding:10px 0;border-bottom:1px solid var(--db-line)}
#deck-dashboard-host .event:last-child{border:0}
#deck-dashboard-host .event time{color:var(--db-muted);font-size:11px;margin-right:8px}
#deck-dashboard-host .history-controls{display:flex;flex-wrap:wrap;gap:6px;margin:0}
#deck-dashboard-host .history-controls button,#deck-dashboard-host .chart-legend button{border:1px solid #3a493f;background:#151b1c;color:#c5d2c9;border-radius:7px;padding:7px 11px;font:inherit;font-size:11px;cursor:pointer}
#deck-dashboard-host .history-controls button:hover,#deck-dashboard-host .chart-legend button:hover{background:#253229}
#deck-dashboard-host .history-controls button.active{background:#28362b;color:#d3efc5;border-color:#668659}
#deck-dashboard-host .history-controls button,#deck-dashboard-host .chart-legend button{border:1px solid var(--deck-tone-3a493f, #3a493f);background:var(--deck-tone-151b1c, #151b1c);color:var(--deck-tone-c5d2c9, #c5d2c9);border-radius:7px;padding:7px 11px;font:inherit;font-size:11px;cursor:pointer}
#deck-dashboard-host .history-controls button:hover,#deck-dashboard-host .chart-legend button:hover{background:var(--deck-tone-253229, #253229)}
#deck-dashboard-host .history-controls button.active{background:var(--deck-tone-28362b, #28362b);color:var(--deck-tone-d3efc5, #d3efc5);border-color:var(--deck-tone-668659, #668659)}
#deck-dashboard-host .chart-legend{display:flex;flex-wrap:wrap;gap:7px;margin:17px 0 6px}
#deck-dashboard-host .chart-legend button::before{content:'';display:inline-block;width:10px;height:3px;background:var(--series);margin:0 7px 3px 0}
#deck-dashboard-host .chart-legend button.off{opacity:.45}
#deck-dashboard-host .chart{display:block;width:100%;height:250px}
#deck-dashboard-host .token-total{font-size:25px;font-weight:550;color:#e4f1de;margin-top:12px}
#deck-dashboard-host .token-total{font-size:25px;font-weight:550;color:var(--deck-tone-e4f1de, #e4f1de);margin-top:12px}
#deck-dashboard-host .history-note{font-size:11px;color:var(--db-muted);margin-top:9px}
#deck-dashboard-host .usage-head,#deck-dashboard-host .usage-meta{display:flex;align-items:baseline;justify-content:space-between;gap:14px}
#deck-dashboard-host .usage-head span,#deck-dashboard-host .usage-meta{color:var(--db-muted)}
#deck-dashboard-host .usage-meta{font-size:11px;margin-top:7px}
#deck-dashboard-host .download{display:inline-block;border:1px solid #668659;color:#c5edaf;border-radius:7px;padding:6px 10px;text-decoration:none}
#deck-dashboard-host .download{display:inline-block;border:1px solid var(--deck-tone-668659, #668659);color:var(--deck-tone-c5edaf, #c5edaf);border-radius:7px;padding:6px 10px;text-decoration:none}
#deck-dashboard-host .hash{font:11px ui-monospace,SFMono-Regular,monospace;color:var(--db-muted);word-break:break-all}
#deck-dashboard-host .footer{font-size:11px;color:var(--db-muted);margin-top:22px;text-align:right}
#deck-dashboard-host .error{white-space:pre-wrap}
+1 -1
View File
@@ -15,7 +15,7 @@ WORKDIR /app
COPY deploy/image-requirements.lock /app/deploy/image-requirements.lock
COPY deploy/tts-requirements.lock /app/deploy/tts-requirements.lock
COPY audio_policy.py prompt_enhancer.py prompt_enhancer_worker.py api_compat.py stt.py execution_setup.py tts_runtime.py tts_test.py tts_worker.py auto_test.py chat_test.py endpoint.py inference.py docker_support.py image_encoder_node.py image_runtime.py image_test.py image_upload.py profiles.py capacity.py server.py runtime.py video.py video_proxy.py catalog.py hub_auth.py auth.py collect_hardware.py dashboard_data.py dashboard_history.py /app/
COPY video-ui.js stt-ui.js tts-ui.js auto-test-ui.js chat-test-ui.js endpoint-ui.js docker-ui.js image-test-ui.js profiles-ui.js dashboard-ui.js index.html app.js studio.js runtime-ui.js catalog-ui.js style.css dashboard.css login.html login.js access-ui.js network-ui.js /app/
COPY video-ui.js stt-ui.js tts-ui.js auto-test-ui.js chat-test-ui.js endpoint-ui.js docker-ui.js image-test-ui.js profiles-ui.js dashboard-ui.js index.html app.js studio.js runtime-ui.js catalog-ui.js style.css dashboard.css themes.css login.html login.js access-ui.js network-ui.js /app/
COPY network/__init__.py network/client.py network/config.py network/rpc.py /app/network/
ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1 HOME=/tmp \
DECK_BIND_HOST=0.0.0.0 DECK_STATE_DIR=/var/lib/deck \
+1 -1
View File
@@ -14,7 +14,7 @@ import urllib.request
ROOT = Path(__file__).resolve().parent.parent
LABEL = 'de.casaderoll.athena-deck.standalone'
FILES = ['prompt_enhancer.py','prompt_enhancer_worker.py','image_upload.py','audio_policy.py','deploy/tts-requirements.lock','stt.py','stt-ui.js','api_compat.py','execution_setup.py','tts_runtime.py','tts_test.py','tts_worker.py','tts-ui.js','auto_test.py','auto-test-ui.js','chat_test.py','chat-test-ui.js','endpoint.py','inference.py','endpoint-ui.js','docker_support.py','docker-ui.js','deploy/docker_helper.py','deploy/setup_docker_helper.py','image_encoder_node.py','image_runtime.py','image_test.py','image-test-ui.js','profiles.py','profiles-ui.js','capacity.py','runtime.py','runtime-ui.js','video.py','video_proxy.py','video-ui.js','catalog.py','hub_auth.py','catalog-ui.js','server.py','auth.py','collect_hardware.py','dashboard_data.py','dashboard_history.py','dashboard-ui.js','dashboard.css','deploy/import_dashboard_history.py','index.html','app.js','studio.js','style.css','login.html','login.js','access-ui.js','network-ui.js','network/__init__.py','network/client.py','network/config.py','network/rpc.py','deploy/Dockerfile','deploy/image-requirements.lock']
FILES = ['prompt_enhancer.py','prompt_enhancer_worker.py','image_upload.py','audio_policy.py','deploy/tts-requirements.lock','stt.py','stt-ui.js','api_compat.py','execution_setup.py','tts_runtime.py','tts_test.py','tts_worker.py','tts-ui.js','auto_test.py','auto-test-ui.js','chat_test.py','chat-test-ui.js','endpoint.py','inference.py','endpoint-ui.js','docker_support.py','docker-ui.js','deploy/docker_helper.py','deploy/setup_docker_helper.py','image_encoder_node.py','image_runtime.py','image_test.py','image-test-ui.js','profiles.py','profiles-ui.js','capacity.py','runtime.py','runtime-ui.js','video.py','video_proxy.py','video-ui.js','catalog.py','hub_auth.py','catalog-ui.js','server.py','auth.py','collect_hardware.py','dashboard_data.py','dashboard_history.py','dashboard-ui.js','dashboard.css','themes.css','deploy/import_dashboard_history.py','index.html','app.js','studio.js','style.css','login.html','login.js','access-ui.js','network-ui.js','network/__init__.py','network/client.py','network/config.py','network/rpc.py','deploy/Dockerfile','deploy/image-requirements.lock']
def run(*args, check=True, interactive=False):
+1 -1
View File
@@ -1 +1 @@
<!doctype html><html lang="de"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Athena Deck</title><link rel="stylesheet" href="/style.css"><link rel="stylesheet" href="/dashboard.css"><script src="/network-ui.js" defer></script><script src="/access-ui.js" defer></script><script src="/catalog-ui.js" defer></script><script src="/runtime-ui.js" defer></script><script src="/profiles-ui.js" defer></script><script src="/auto-test-ui.js" defer></script><script src="/chat-test-ui.js" defer></script><script src="/image-test-ui.js" defer></script><script src="/docker-ui.js" defer></script><script src="/stt-ui.js" defer></script><script src="/tts-ui.js" defer></script><script src="/studio.js" defer></script><script src="/video-ui.js" defer></script><script src="/endpoint-ui.js" defer></script><script src="/dashboard-ui.js" defer></script><script src="/app.js" defer></script></head><body><aside><a class="brand" href="#dashboard"><span>Α</span> ATHENA <b>DECK</b></a><p class="eyebrow">WORKSPACE / ATHENA</p><nav aria-label="Hauptnavigation"><a href="#dashboard">Dashboard <span>01</span></a><a href="#home">Übersicht <span>02</span></a><a href="#chat">Sprachmodelle / Chat <span>02</span></a><a href="#image">Bildgenerierung <span>03</span></a><p class="nav-heading">AUDIO</p><a class="nav-sub" href="#audio">Text-to-Speech (TTS)</a><a class="nav-sub" href="#stt">Spracherkennung (STT)</a><a class="nav-sub" href="#music">Musik</a><a class="nav-sub" href="#voice">Stimme / Voice</a><a href="#video">Video <span>05</span></a><a href="#services">Weitere Dienste <span>06</span></a><p class="nav-heading">EINSTELLUNGEN</p><a href="#runtimes">Laufzeiten <span>↗</span></a><a class="nav-sub" href="#runtime">llama.cpp</a><a class="nav-sub" href="#image-runtime">Bildgenerierung</a><a class="nav-sub" href="#stt-runtime">Spracherkennung</a><a class="nav-sub" href="#tts-runtime">Text-to-Speech</a><a class="nav-sub" href="#docker-runtime">Docker</a><a href="#endpoint">Endpunkt &amp; Profile <span>↗</span></a><a href="#network">Netzwerk <span>↗</span></a><a href="#access">Zugang &amp; API <span>↗</span></a></nav><footer><i></i> Isolierte Entwicklungsumgebung<p>Eigener Modell-Router<br>Hardware · nur lesend</p></footer></aside><main><header><span>ATHENA CONTROL SURFACE</span><span class="pill">v0.7 · Router</span></header><div id="view"></div><p id="error" role="alert"></p></main></body></html>
<!doctype html><html lang="de"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Athena Deck</title><link rel="stylesheet" href="/style.css"><link rel="stylesheet" href="/dashboard.css"><link rel="stylesheet" href="/themes.css"><script src="/network-ui.js" defer></script><script src="/access-ui.js" defer></script><script src="/catalog-ui.js" defer></script><script src="/runtime-ui.js" defer></script><script src="/profiles-ui.js" defer></script><script src="/auto-test-ui.js" defer></script><script src="/chat-test-ui.js" defer></script><script src="/image-test-ui.js" defer></script><script src="/docker-ui.js" defer></script><script src="/stt-ui.js" defer></script><script src="/tts-ui.js" defer></script><script src="/studio.js" defer></script><script src="/video-ui.js" defer></script><script src="/endpoint-ui.js" defer></script><script src="/dashboard-ui.js" defer></script><script src="/app.js" defer></script></head><body><aside><a class="brand" href="#dashboard"><span>Α</span> ATHENA <b>DECK</b></a><p class="eyebrow">WORKSPACE / ATHENA</p><nav aria-label="Hauptnavigation"><a href="#dashboard">Dashboard <span>01</span></a><a href="#home">Übersicht <span>02</span></a><a href="#chat">Sprachmodelle / Chat <span>02</span></a><a href="#image">Bildgenerierung <span>03</span></a><p class="nav-heading">AUDIO</p><a class="nav-sub" href="#audio">Text-to-Speech (TTS)</a><a class="nav-sub" href="#stt">Spracherkennung (STT)</a><a class="nav-sub" href="#music">Musik</a><a class="nav-sub" href="#voice">Stimme / Voice</a><a href="#video">Video <span>05</span></a><a href="#services">Weitere Dienste <span>06</span></a><p class="nav-heading">EINSTELLUNGEN</p><a href="#appearance">Darstellung <span>↗</span></a><a href="#runtimes">Laufzeiten <span>↗</span></a><a class="nav-sub" href="#runtime">llama.cpp</a><a class="nav-sub" href="#image-runtime">Bildgenerierung</a><a class="nav-sub" href="#stt-runtime">Spracherkennung</a><a class="nav-sub" href="#tts-runtime">Text-to-Speech</a><a class="nav-sub" href="#docker-runtime">Docker</a><a href="#endpoint">Endpunkt &amp; Profile <span>↗</span></a><a href="#network">Netzwerk <span>↗</span></a><a href="#access">Zugang &amp; API <span>↗</span></a></nav><footer><i></i> Isolierte Entwicklungsumgebung<p>Eigener Modell-Router<br>Hardware · nur lesend</p></footer></aside><main><header><span>ATHENA CONTROL SURFACE</span><span class="pill">v0.7 · Router</span></header><div id="view"></div><p id="error" role="alert"></p></main></body></html>
+1 -1
View File
@@ -274,7 +274,7 @@ class Handler(BaseHTTPRequestHandler):
return self.respond({'error':'Anmeldung erforderlich.'},401)
if not self.authenticated() and self.path == '/':
return self.respond((ROOT/'login.html').read_bytes(), mime='text/html; charset=utf-8')
routes = {'/dashboard-ui.js':('dashboard-ui.js','text/javascript'),'/dashboard.css':('dashboard.css','text/css'),'/video-ui.js':('video-ui.js','text/javascript'),'/stt-ui.js':('stt-ui.js','text/javascript'),'/tts-ui.js':('tts-ui.js','text/javascript'),'/auto-test-ui.js':('auto-test-ui.js','text/javascript'),'/chat-test-ui.js':('chat-test-ui.js','text/javascript'),'/endpoint-ui.js':('endpoint-ui.js','text/javascript'),'/docker-ui.js': ('docker-ui.js','text/javascript'), '/': ('index.html', 'text/html; charset=utf-8'), '/app.js': ('app.js', 'text/javascript'), '/style.css': ('style.css', 'text/css'), '/network-ui.js': ('network-ui.js', 'text/javascript'), '/access-ui.js': ('access-ui.js', 'text/javascript'), '/studio.js': ('studio.js', 'text/javascript'), '/catalog-ui.js': ('catalog-ui.js','text/javascript'), '/runtime-ui.js': ('runtime-ui.js','text/javascript'), '/profiles-ui.js': ('profiles-ui.js','text/javascript'), '/image-test-ui.js': ('image-test-ui.js','text/javascript')}
routes = {'/dashboard-ui.js':('dashboard-ui.js','text/javascript'),'/dashboard.css':('dashboard.css','text/css'),'/themes.css':('themes.css','text/css'),'/video-ui.js':('video-ui.js','text/javascript'),'/stt-ui.js':('stt-ui.js','text/javascript'),'/tts-ui.js':('tts-ui.js','text/javascript'),'/auto-test-ui.js':('auto-test-ui.js','text/javascript'),'/chat-test-ui.js':('chat-test-ui.js','text/javascript'),'/endpoint-ui.js':('endpoint-ui.js','text/javascript'),'/docker-ui.js': ('docker-ui.js','text/javascript'), '/': ('index.html', 'text/html; charset=utf-8'), '/app.js': ('app.js', 'text/javascript'), '/style.css': ('style.css', 'text/css'), '/network-ui.js': ('network-ui.js', 'text/javascript'), '/access-ui.js': ('access-ui.js', 'text/javascript'), '/studio.js': ('studio.js', 'text/javascript'), '/catalog-ui.js': ('catalog-ui.js','text/javascript'), '/runtime-ui.js': ('runtime-ui.js','text/javascript'), '/profiles-ui.js': ('profiles-ui.js','text/javascript'), '/image-test-ui.js': ('image-test-ui.js','text/javascript')}
if self.path in routes:
name, mime = routes[self.path]
return self.respond((ROOT/name).read_bytes(), mime=mime)
+22 -10
View File
@@ -1,21 +1,21 @@
:root{color-scheme:dark;font-family:Inter,ui-sans-serif,system-ui,sans-serif;background:#101416;color:#e9edea}*{box-sizing:border-box}body{margin:0;display:flex;min-height:100vh}aside{width:270px;background:#141a1c;border-right:1px solid #2c3435;padding:36px 23px;display:flex;flex-direction:column;position:fixed;height:100vh}.brand{font-size:17px;letter-spacing:2px;text-decoration:none;color:inherit;display:flex;align-items:center;gap:8px}.brand span{background:#c5edaf;color:#172412;font-size:28px;border-radius:10px;padding:0 9px;margin-right:6px}.brand b{color:#a5adab;font-weight:400}.eyebrow{font-size:10px;letter-spacing:1.7px;color:#798783;margin-top:46px}nav{display:grid;gap:8px;margin-top:12px}nav a{color:#aeb9b5;text-decoration:none;padding:14px 12px;border-radius:7px;font-size:13px;display:flex;justify-content:space-between}nav a:hover{background:#20292a}nav a.active{background:#28362b;color:#d3efc5}nav span{opacity:.4;font-size:10px}footer{margin-top:auto;font-size:11px;color:#b6c2bc}footer p{line-height:1.8;color:#77857f}i{display:inline-block;width:7px;height:7px;background:#bdeba4;border-radius:50%;margin-right:7px}main{margin-left:270px;padding:30px 5vw 60px;width:calc(100% - 270px);max-width:1500px}header{display:flex;justify-content:space-between;align-items:center;font-size:10px;letter-spacing:2px;color:#7f9189;padding-bottom:40px}.pill{border:1px solid #35423b;padding:7px 11px;border-radius:20px;font-size:11px;letter-spacing:0;color:#c6d6ca}h1{font-size:40px;font-weight:500;letter-spacing:-1.5px;margin:12px 0}h2{font-weight:500;font-size:20px}p{color:#97a79e;line-height:1.65;font-size:14px}.kicker{color:#c5edaf;font-size:11px;letter-spacing:2px}.grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;margin-top:30px}.card{background:#181f21;border:1px solid #303a37;border-radius:13px;padding:26px}.wide{grid-column:1/-1}.label{font-size:11px;color:#95a69b;text-transform:uppercase;letter-spacing:1px}.value{font-size:30px;margin:16px 0;color:#e4f1de}.card-top{display:flex;justify-content:space-between;align-items:center;gap:10px}.tag{color:#bdeba4;font-size:12px}.muted{color:#8b9c91}.metrics{display:flex;gap:34px;flex-wrap:wrap;margin:24px 0}.metrics strong{display:block;font-size:24px;font-weight:500;margin:8px 0}.metrics small{color:#8e9c93}button{font:inherit;padding:11px 20px;border-radius:7px;border:1px solid #465348;background:#c5edaf;color:#1a2a18;cursor:pointer;margin-right:8px}button.secondary{background:transparent;color:#dce7da}button:disabled{opacity:.35;cursor:default}button:focus-visible,a:focus-visible{outline:2px solid #d9fac7;outline-offset:4px}.note{border-top:1px solid #303a37;margin-top:25px;padding-top:20px;font-size:12px}.empty{padding:46px 30px;margin-top:30px;border:1px dashed #3b4840;border-radius:12px}.empty .symbol{font-size:35px;color:#bdd4b2}#error{color:#ffc1a7}progress{width:100%;height:6px;accent-color:#bce4a6}progress::-webkit-progress-bar{background:#303a37;border-radius:10px}progress::-webkit-progress-value{background:#bce4a6;border-radius:10px}@media(max-width:850px){aside{position:static;width:100%;height:auto;padding:20px}body{display:block}nav{grid-template-columns:repeat(2,1fr)}footer{display:none}main{margin:0;width:100%;padding:28px 20px}.eyebrow{margin-top:22px}.grid{grid-template-columns:1fr}h1{font-size:32px}header{padding-bottom:20px}}
label{display:block;margin:18px 0 8px;font-size:13px;color:#c4d1c6}input,select{display:block;width:100%;max-width:560px;padding:12px;margin-bottom:16px;background:#101718;color:#e4eee5;border:1px solid #465348;border-radius:7px;font:inherit}input[type=file]{font-size:13px}button{margin-bottom:8px}.network-message{white-space:pre-wrap;color:#d1eabf}.warning{color:#f2c891}.login{margin:10vh auto;width:100%;max-width:640px}.network-status{display:flex;gap:30px;flex-wrap:wrap}.network-status strong{display:block;margin:8px 0}.link{color:#c5edaf}.network-card a{color:#c5edaf}.network-card button{font-size:13px}.network-card .note{overflow-wrap:anywhere}
:root{color-scheme:dark;font-family:Inter,ui-sans-serif,system-ui,sans-serif;background:var(--deck-tone-101416, #101416);color:var(--deck-tone-e9edea, #e9edea)}*{box-sizing:border-box}body{margin:0;display:flex;min-height:100vh}aside{width:270px;background:var(--deck-tone-141a1c, #141a1c);border-right:1px solid var(--deck-tone-2c3435, #2c3435);padding:36px 23px;display:flex;flex-direction:column;position:fixed;height:100vh}.brand{font-size:17px;letter-spacing:2px;text-decoration:none;color:inherit;display:flex;align-items:center;gap:8px}.brand span{background:var(--deck-tone-c5edaf, #c5edaf);color:var(--deck-tone-172412, #172412);font-size:28px;border-radius:10px;padding:0 9px;margin-right:6px}.brand b{color:var(--deck-tone-a5adab, #a5adab);font-weight:400}.eyebrow{font-size:10px;letter-spacing:1.7px;color:var(--deck-tone-798783, #798783);margin-top:46px}nav{display:grid;gap:8px;margin-top:12px}nav a{color:var(--deck-tone-aeb9b5, #aeb9b5);text-decoration:none;padding:14px 12px;border-radius:7px;font-size:13px;display:flex;justify-content:space-between}nav a:hover{background:var(--deck-tone-20292a, #20292a)}nav a.active{background:var(--deck-tone-28362b, #28362b);color:var(--deck-tone-d3efc5, #d3efc5)}nav span{opacity:.4;font-size:10px}footer{margin-top:auto;font-size:11px;color:var(--deck-tone-b6c2bc, #b6c2bc)}footer p{line-height:1.8;color:var(--deck-tone-77857f, #77857f)}i{display:inline-block;width:7px;height:7px;background:var(--deck-tone-bdeba4, #bdeba4);border-radius:50%;margin-right:7px}main{margin-left:270px;padding:30px 5vw 60px;width:calc(100% - 270px);max-width:1500px}header{display:flex;justify-content:space-between;align-items:center;font-size:10px;letter-spacing:2px;color:var(--deck-tone-7f9189, #7f9189);padding-bottom:40px}.pill{border:1px solid var(--deck-tone-35423b, #35423b);padding:7px 11px;border-radius:20px;font-size:11px;letter-spacing:0;color:var(--deck-tone-c6d6ca, #c6d6ca)}h1{font-size:40px;font-weight:500;letter-spacing:-1.5px;margin:12px 0}h2{font-weight:500;font-size:20px}p{color:var(--deck-tone-97a79e, #97a79e);line-height:1.65;font-size:14px}.kicker{color:var(--deck-tone-c5edaf, #c5edaf);font-size:11px;letter-spacing:2px}.grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;margin-top:30px}.card{background:var(--deck-tone-181f21, #181f21);border:1px solid var(--deck-tone-303a37, #303a37);border-radius:13px;padding:26px}.wide{grid-column:1/-1}.label{font-size:11px;color:var(--deck-tone-95a69b, #95a69b);text-transform:uppercase;letter-spacing:1px}.value{font-size:30px;margin:16px 0;color:var(--deck-tone-e4f1de, #e4f1de)}.card-top{display:flex;justify-content:space-between;align-items:center;gap:10px}.tag{color:var(--deck-tone-bdeba4, #bdeba4);font-size:12px}.muted{color:var(--deck-tone-8b9c91, #8b9c91)}.metrics{display:flex;gap:34px;flex-wrap:wrap;margin:24px 0}.metrics strong{display:block;font-size:24px;font-weight:500;margin:8px 0}.metrics small{color:var(--deck-tone-8e9c93, #8e9c93)}button{font:inherit;padding:11px 20px;border-radius:7px;border:1px solid var(--deck-tone-465348, #465348);background:var(--deck-tone-c5edaf, #c5edaf);color:var(--deck-tone-1a2a18, #1a2a18);cursor:pointer;margin-right:8px}button.secondary{background:transparent;color:var(--deck-tone-dce7da, #dce7da)}button:disabled{opacity:.35;cursor:default}button:focus-visible,a:focus-visible{outline:2px solid var(--deck-tone-d9fac7, #d9fac7);outline-offset:4px}.note{border-top:1px solid var(--deck-tone-303a37, #303a37);margin-top:25px;padding-top:20px;font-size:12px}.empty{padding:46px 30px;margin-top:30px;border:1px dashed var(--deck-tone-3b4840, #3b4840);border-radius:12px}.empty .symbol{font-size:35px;color:var(--deck-tone-bdd4b2, #bdd4b2)}#error{color:var(--deck-tone-ffc1a7, #ffc1a7)}progress{width:100%;height:6px;accent-color:var(--deck-tone-bce4a6, #bce4a6)}progress::-webkit-progress-bar{background:var(--deck-tone-303a37, #303a37);border-radius:10px}progress::-webkit-progress-value{background:var(--deck-tone-bce4a6, #bce4a6);border-radius:10px}@media(max-width:850px){aside{position:static;width:100%;height:auto;padding:20px}body{display:block}nav{grid-template-columns:repeat(2,1fr)}footer{display:none}main{margin:0;width:100%;padding:28px 20px}.eyebrow{margin-top:22px}.grid{grid-template-columns:1fr}h1{font-size:32px}header{padding-bottom:20px}}
label{display:block;margin:18px 0 8px;font-size:13px;color:var(--deck-tone-c4d1c6, #c4d1c6)}input,select{display:block;width:100%;max-width:560px;padding:12px;margin-bottom:16px;background:var(--deck-tone-101718, #101718);color:var(--deck-tone-e4eee5, #e4eee5);border:1px solid var(--deck-tone-465348, #465348);border-radius:7px;font:inherit}input[type=file]{font-size:13px}button{margin-bottom:8px}.network-message{white-space:pre-wrap;color:var(--deck-tone-d1eabf, #d1eabf)}.warning{color:var(--deck-tone-f2c891, #f2c891)}.login{margin:10vh auto;width:100%;max-width:640px}.network-status{display:flex;gap:30px;flex-wrap:wrap}.network-status strong{display:block;margin:8px 0}.link{color:var(--deck-tone-c5edaf, #c5edaf)}.network-card a{color:var(--deck-tone-c5edaf, #c5edaf)}.network-card button{font-size:13px}.network-card .note{overflow-wrap:anywhere}
#access-page .card{margin-top:20px}#access-message{color:#d1eabf;white-space:pre-wrap}
#access-page .card{margin-top:20px}#access-message{color:var(--deck-tone-d1eabf, #d1eabf);white-space:pre-wrap}
/* Model studio: all sample and draft states are explicit. */
aside{overflow-y:auto}nav{gap:3px}nav a{padding:11px 12px}.prototype-banner{display:flex;align-items:center;gap:14px;background:#202b23;border:1px solid #40503f;border-radius:9px;padding:15px 18px;margin:24px 0;color:#bdd0ba;font-size:12px}.studio-tabs{display:flex;gap:7px;border-bottom:1px solid #344038;padding-bottom:10px;margin:28px 0}.studio-tabs button{font-size:13px}.studio-tabs button span{margin-left:8px;opacity:.6}.model-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}.model-card h2{margin-bottom:8px}.model-icon{display:inline-flex;align-items:center;justify-content:center;width:42px;height:42px;background:#29372b;color:#d0e5c4;border-radius:10px;font-size:23px}.model-facts{font-size:12px;line-height:1.6}.model-facts>div{display:flex;justify-content:space-between;gap:15px;padding:10px 0;border-bottom:1px solid #2a3430}.model-facts dt{color:#819386}.model-facts dd{margin:0;text-align:right;color:#c9d3ca}.unknown-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:#a2aea5;margin-right:5px}.card-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:22px}.card-actions button{margin-right:0;font-size:12px}.studio-toolbar{display:grid;grid-template-columns:2fr 1fr;gap:18px}.studio-toolbar label{margin-top:0}.studio-toolbar input,.studio-toolbar select{max-width:none;margin-bottom:0}.small{font-size:12px}.section-heading{display:flex;justify-content:space-between;gap:20px;align-items:center;margin-bottom:20px}.section-heading h2{margin-bottom:3px}.section-heading p{margin-top:5px}.section-heading button{white-space:nowrap}.profile-list{display:grid;gap:12px}.profile-row{display:grid;grid-template-columns:1.5fr 1fr .5fr 1fr;gap:18px;align-items:center;padding:22px}.profile-row h2{font-size:18px;margin:9px 0 4px;overflow-wrap:anywhere}.profile-row p{font-size:12px;margin:0}.profile-row strong{display:block;margin-top:10px;font-size:14px;font-weight:500}.profile-actions{grid-column:1/-1;display:flex;border-top:1px solid #303a37;padding-top:14px}.profile-actions button{font-size:12px;margin-bottom:0}.endpoint-preview,.detail-card,.editor{margin-top:24px}pre{background:#101718;padding:20px;border-radius:8px;overflow:auto;font-size:12px;line-height:1.6;color:#bed4b8;max-height:280px}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 24px}.form-grid input,.form-grid select{max-width:none}.checkbox{display:flex;align-items:center;gap:10px}.checkbox input{width:16px;height:16px;margin:0;accent-color:#bfdda9}.editor details{border-top:1px solid #303a37;margin-top:22px;padding-top:18px}summary{cursor:pointer;color:#ccdbc7;font-size:14px}.danger{color:#e9aaa0!important}#studio-notice{color:#c7e4b6}#profile-error{color:#ffc1a7}.runtime-empty{text-align:center;padding:40px;margin-bottom:20px}.runtime-empty a{display:block;margin-top:16px;font-size:13px}.flow{list-style:none;counter-reset:steps;padding:0;display:grid;grid-template-columns:repeat(2,1fr);gap:20px;margin:28px 0}.flow li{counter-increment:steps;padding:0 0 0 35px;position:relative}.flow li:before{content:counter(steps,decimal-leading-zero);position:absolute;left:0;color:#b6d2a8;font-size:12px;top:2px}.flow b{font-size:13px;font-weight:500}.flow span{display:block;color:#82968a;font-size:12px;line-height:1.7;margin-top:7px}.runtime-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:15px;margin-bottom:22px}.runtime-stats .card{padding:22px}.runtime-stats h2{font-size:18px}.runtime-stats p{font-size:12px}#studio[data-page=runtime]>.card{margin-top:20px}.release-comparison{display:flex;gap:35px;align-items:center;margin:25px 0}.fit-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:22px}.fit-grid b{font-size:13px}.fit-grid p{font-size:12px}@media(max-width:1100px){.model-grid{grid-template-columns:1fr}.runtime-stats{grid-template-columns:1fr}.profile-row{grid-template-columns:1fr 1fr}.fit-grid{grid-template-columns:1fr}}@media(max-width:600px){.form-grid,.studio-toolbar,.flow{grid-template-columns:1fr}.prototype-banner,.section-heading{align-items:flex-start;flex-direction:column}.studio-tabs{flex-wrap:wrap}.studio-tabs button{padding:10px 12px}.profile-row{gap:18px}.card{padding:20px}.model-facts>div{flex-direction:column;gap:3px}.model-facts dd{text-align:left}}
aside{overflow-y:auto}nav{gap:3px}nav a{padding:11px 12px}.prototype-banner{display:flex;align-items:center;gap:14px;background:var(--deck-tone-202b23, #202b23);border:1px solid var(--deck-tone-40503f, #40503f);border-radius:9px;padding:15px 18px;margin:24px 0;color:var(--deck-tone-bdd0ba, #bdd0ba);font-size:12px}.studio-tabs{display:flex;gap:7px;border-bottom:1px solid var(--deck-tone-344038, #344038);padding-bottom:10px;margin:28px 0}.studio-tabs button{font-size:13px}.studio-tabs button span{margin-left:8px;opacity:.6}.model-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}.model-card h2{margin-bottom:8px}.model-icon{display:inline-flex;align-items:center;justify-content:center;width:42px;height:42px;background:var(--deck-tone-29372b, #29372b);color:var(--deck-tone-d0e5c4, #d0e5c4);border-radius:10px;font-size:23px}.model-facts{font-size:12px;line-height:1.6}.model-facts>div{display:flex;justify-content:space-between;gap:15px;padding:10px 0;border-bottom:1px solid var(--deck-tone-2a3430, #2a3430)}.model-facts dt{color:var(--deck-tone-819386, #819386)}.model-facts dd{margin:0;text-align:right;color:var(--deck-tone-c9d3ca, #c9d3ca)}.unknown-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--deck-tone-a2aea5, #a2aea5);margin-right:5px}.card-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:22px}.card-actions button{margin-right:0;font-size:12px}.studio-toolbar{display:grid;grid-template-columns:2fr 1fr;gap:18px}.studio-toolbar label{margin-top:0}.studio-toolbar input,.studio-toolbar select{max-width:none;margin-bottom:0}.small{font-size:12px}.section-heading{display:flex;justify-content:space-between;gap:20px;align-items:center;margin-bottom:20px}.section-heading h2{margin-bottom:3px}.section-heading p{margin-top:5px}.section-heading button{white-space:nowrap}.profile-list{display:grid;gap:12px}.profile-row{display:grid;grid-template-columns:1.5fr 1fr .5fr 1fr;gap:18px;align-items:center;padding:22px}.profile-row h2{font-size:18px;margin:9px 0 4px;overflow-wrap:anywhere}.profile-row p{font-size:12px;margin:0}.profile-row strong{display:block;margin-top:10px;font-size:14px;font-weight:500}.profile-actions{grid-column:1/-1;display:flex;border-top:1px solid var(--deck-tone-303a37, #303a37);padding-top:14px}.profile-actions button{font-size:12px;margin-bottom:0}.endpoint-preview,.detail-card,.editor{margin-top:24px}pre{background:var(--deck-tone-101718, #101718);padding:20px;border-radius:8px;overflow:auto;font-size:12px;line-height:1.6;color:var(--deck-tone-bed4b8, #bed4b8);max-height:280px}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 24px}.form-grid input,.form-grid select{max-width:none}.checkbox{display:flex;align-items:center;gap:10px}.checkbox input{width:16px;height:16px;margin:0;accent-color:var(--deck-tone-bfdda9, #bfdda9)}.editor details{border-top:1px solid var(--deck-tone-303a37, #303a37);margin-top:22px;padding-top:18px}summary{cursor:pointer;color:var(--deck-tone-ccdbc7, #ccdbc7);font-size:14px}.danger{color:var(--deck-tone-e9aaa0, #e9aaa0)!important}#studio-notice{color:var(--deck-tone-c7e4b6, #c7e4b6)}#profile-error{color:var(--deck-tone-ffc1a7, #ffc1a7)}.runtime-empty{text-align:center;padding:40px;margin-bottom:20px}.runtime-empty a{display:block;margin-top:16px;font-size:13px}.flow{list-style:none;counter-reset:steps;padding:0;display:grid;grid-template-columns:repeat(2,1fr);gap:20px;margin:28px 0}.flow li{counter-increment:steps;padding:0 0 0 35px;position:relative}.flow li:before{content:counter(steps,decimal-leading-zero);position:absolute;left:0;color:var(--deck-tone-b6d2a8, #b6d2a8);font-size:12px;top:2px}.flow b{font-size:13px;font-weight:500}.flow span{display:block;color:var(--deck-tone-82968a, #82968a);font-size:12px;line-height:1.7;margin-top:7px}.runtime-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:15px;margin-bottom:22px}.runtime-stats .card{padding:22px}.runtime-stats h2{font-size:18px}.runtime-stats p{font-size:12px}#studio[data-page=runtime]>.card{margin-top:20px}.release-comparison{display:flex;gap:35px;align-items:center;margin:25px 0}.fit-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:22px}.fit-grid b{font-size:13px}.fit-grid p{font-size:12px}@media(max-width:1100px){.model-grid{grid-template-columns:1fr}.runtime-stats{grid-template-columns:1fr}.profile-row{grid-template-columns:1fr 1fr}.fit-grid{grid-template-columns:1fr}}@media(max-width:600px){.form-grid,.studio-toolbar,.flow{grid-template-columns:1fr}.prototype-banner,.section-heading{align-items:flex-start;flex-direction:column}.studio-tabs{flex-wrap:wrap}.studio-tabs button{padding:10px 12px}.profile-row{gap:18px}.card{padding:20px}.model-facts>div{flex-direction:column;gap:3px}.model-facts dd{text-align:left}}
.nav-heading{font-size:10px;letter-spacing:1.5px;color:#75867b;margin:15px 12px 5px}
.nav-heading{font-size:10px;letter-spacing:1.5px;color:var(--deck-tone-75867b, #75867b);margin:15px 12px 5px}
/* Live model catalogue: browse, inspect a file, download, then library. */
.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}
.hub-search{display:flex;align-items:end;gap:12px;margin:24px 0}.hub-search label{flex:1;margin:0}.hub-search input{max-width:none;margin-bottom:0}.hub-search button{margin:0}
.hub-layout{display:grid;grid-template-columns:minmax(240px,.8fr) minmax(0,1.4fr);gap:24px;align-items:start}.hub-list-heading{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:12px}.hub-list-heading select{width:auto;max-width:160px;font-size:12px;margin:0;padding:8px}.hub-results{display:grid;gap:8px;max-height:850px;overflow-y:auto;padding:3px}.hub-model{display:grid;gap:9px;width:100%;margin:0;text-align:left;padding:18px;background:#181f21;color:#e4eee5;border:1px solid #303a37}.hub-model:hover{background:#222d27}.hub-model.selected{border-color:#bddda9;background:#26342b}.hub-model strong{font-size:14px;overflow-wrap:anywhere}.hub-author,.hub-model-meta{font-size:11px;color:#96a89c}.hub-detail{min-width:0}.hub-detail h2{font-size:22px}.hub-badges{display:flex;gap:8px;flex-wrap:wrap}.hub-fit{padding:16px;background:#202a25;border-radius:9px;font-size:13px;margin:22px 0}.hub-fit p{font-size:12px;margin-bottom:0}.hub-file-controls{display:grid;grid-template-columns:1.3fr 1fr;gap:12px}.hub-file-controls label{margin-top:0}.hub-file-controls input,.hub-file-controls select{font-size:12px;margin-bottom:0}.hub-variants{max-height:380px;overflow:auto;border-top:1px solid #303a37}.hub-variant{display:flex;align-items:center;gap:12px;padding:16px 8px;margin:0;border-bottom:1px solid #303a37;cursor:pointer}.hub-variant:has(input:checked){background:#28362b}.hub-variant input{width:16px;min-width:16px;margin:0;accent-color:#c5edaf}.hub-variant span{flex:1;min-width:0}.hub-variant strong{display:block;font-weight:500;font-size:12px;overflow-wrap:anywhere}.hub-variant small{display:block;margin-top:7px;font-size:10px;color:#95a69b}.hub-variant b{font-size:11px;white-space:nowrap}.hub-review{margin-top:22px}.hub-review button{width:100%;font-size:13px}.hub-filename{overflow-wrap:anywhere}.hub-operation{margin-top:20px;border-color:#647e58}.hub-operation h3{font-size:16px}.hub-operation p{margin:10px 0;font-size:12px}.hub-operation progress{height:9px}.hub-operation .card-top strong{font-size:20px}
.hub-layout{display:grid;grid-template-columns:minmax(240px,.8fr) minmax(0,1.4fr);gap:24px;align-items:start}.hub-list-heading{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:12px}.hub-list-heading select{width:auto;max-width:160px;font-size:12px;margin:0;padding:8px}.hub-results{display:grid;gap:8px;max-height:850px;overflow-y:auto;padding:3px}.hub-model{display:grid;gap:9px;width:100%;margin:0;text-align:left;padding:18px;background:var(--deck-tone-181f21, #181f21);color:var(--deck-tone-e4eee5, #e4eee5);border:1px solid var(--deck-tone-303a37, #303a37)}.hub-model:hover{background:var(--deck-tone-222d27, #222d27)}.hub-model.selected{border-color:var(--deck-tone-bddda9, #bddda9);background:var(--deck-tone-26342b, #26342b)}.hub-model strong{font-size:14px;overflow-wrap:anywhere}.hub-author,.hub-model-meta{font-size:11px;color:var(--deck-tone-96a89c, #96a89c)}.hub-detail{min-width:0}.hub-detail h2{font-size:22px}.hub-badges{display:flex;gap:8px;flex-wrap:wrap}.hub-fit{padding:16px;background:var(--deck-tone-202a25, #202a25);border-radius:9px;font-size:13px;margin:22px 0}.hub-fit p{font-size:12px;margin-bottom:0}.hub-file-controls{display:grid;grid-template-columns:1.3fr 1fr;gap:12px}.hub-file-controls label{margin-top:0}.hub-file-controls input,.hub-file-controls select{font-size:12px;margin-bottom:0}.hub-variants{max-height:380px;overflow:auto;border-top:1px solid var(--deck-tone-303a37, #303a37)}.hub-variant{display:flex;align-items:center;gap:12px;padding:16px 8px;margin:0;border-bottom:1px solid var(--deck-tone-303a37, #303a37);cursor:pointer}.hub-variant:has(input:checked){background:var(--deck-tone-28362b, #28362b)}.hub-variant input{width:16px;min-width:16px;margin:0;accent-color:var(--deck-tone-c5edaf, #c5edaf)}.hub-variant span{flex:1;min-width:0}.hub-variant strong{display:block;font-weight:500;font-size:12px;overflow-wrap:anywhere}.hub-variant small{display:block;margin-top:7px;font-size:10px;color:var(--deck-tone-95a69b, #95a69b)}.hub-variant b{font-size:11px;white-space:nowrap}.hub-review{margin-top:22px}.hub-review button{width:100%;font-size:13px}.hub-filename{overflow-wrap:anywhere}.hub-operation{margin-top:20px;border-color:var(--deck-tone-647e58, #647e58)}.hub-operation h3{font-size:16px}.hub-operation p{margin:10px 0;font-size:12px}.hub-operation progress{height:9px}.hub-operation .card-top strong{font-size:20px}
@media(max-width:1100px){.hub-layout{grid-template-columns:1fr}.hub-results{max-height:360px}.hub-file-controls{grid-template-columns:1fr 1fr}}@media(max-width:600px){.hub-search{align-items:stretch;flex-direction:column}.hub-file-controls{grid-template-columns:1fr}.hub-variant{gap:8px}}
nav a.nav-sub{padding-left:28px;font-size:12px;color:#a4bda8}.component-card{margin-top:16px}.component-card select{max-width:none}.component-card .hub-filename{font-size:12px}
nav a.nav-sub{padding-left:28px;font-size:12px;color:var(--deck-tone-a4bda8, #a4bda8)}.component-card{margin-top:16px}.component-card select{max-width:none}.component-card .hub-filename{font-size:12px}
#image-test textarea{width:100%;background:#101718;color:#e4eee5;border:1px solid #465348;border-radius:8px;padding:14px;font:inherit;resize:vertical;margin:10px 0 20px}.generated-image{max-width:100%;height:auto;display:block;border-radius:8px}#image-test-result figure{margin:20px 0}#image-test-state{margin-top:20px}
#image-test textarea{width:100%;background:var(--deck-tone-101718, #101718);color:var(--deck-tone-e4eee5, #e4eee5);border:1px solid var(--deck-tone-465348, #465348);border-radius:8px;padding:14px;font:inherit;resize:vertical;margin:10px 0 20px}.generated-image{max-width:100%;height:auto;display:block;border-radius:8px}#image-test-result figure{margin:20px 0}#image-test-state{margin-top:20px}
.hub-base-filter{display:flex;align-items:center;gap:.6rem;margin-top:1rem}.hub-base-filter input{width:auto;margin:0}
@@ -23,6 +23,18 @@ nav a.nav-sub{padding-left:28px;font-size:12px;color:#a4bda8}.component-card{mar
.endpoint-choice{display:flex;align-items:center;gap:.6rem}.endpoint-choice input{width:auto;margin:0}
.video-activity,.video-notice{padding:18px;border:1px solid #536a51;border-radius:10px;margin:16px 0;background:#202c25}.video-activity strong{display:block}.video-activity progress{display:block;width:100%;height:12px;margin:14px 0;accent-color:#c5edaf}.video-error{color:#ffd5bf;border-left:3px solid #d99b73;padding-left:14px}.video-test-fields{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:16px}#video-test textarea{width:100%;box-sizing:border-box;background:#101718;color:#e4eee5;border:1px solid #465348;border-radius:8px;padding:14px;font:inherit;resize:vertical}.generated-video{display:block;max-width:100%;margin:18px 0;border-radius:8px}
.video-activity,.video-notice{padding:18px;border:1px solid var(--deck-tone-536a51, #536a51);border-radius:10px;margin:16px 0;background:var(--deck-tone-202c25, #202c25)}.video-activity strong{display:block}.video-activity progress{display:block;width:100%;height:12px;margin:14px 0;accent-color:var(--deck-tone-c5edaf, #c5edaf)}.video-error{color:var(--deck-tone-ffd5bf, #ffd5bf);border-left:3px solid var(--deck-tone-d99b73, #d99b73);padding-left:14px}.video-test-fields{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:16px}#video-test textarea{width:100%;box-sizing:border-box;background:var(--deck-tone-101718, #101718);color:var(--deck-tone-e4eee5, #e4eee5);border:1px solid var(--deck-tone-465348, #465348);border-radius:8px;padding:14px;font:inherit;resize:vertical}.generated-video{display:block;max-width:100%;margin:18px 0;border-radius:8px}
.video-activity progress:indeterminate{background:linear-gradient(90deg,#303a37 0%,#c5edaf 50%,#303a37 100%);background-size:200% 100%;animation:video-progress 1.8s linear infinite;border:0;border-radius:8px}.video-activity progress:indeterminate::-webkit-progress-bar{background:transparent}@keyframes video-progress{from{background-position:200% 0}to{background-position:0 0}}@media(prefers-reduced-motion:reduce){.video-activity progress:indeterminate{animation:none}}
.video-activity progress:indeterminate{background:linear-gradient(90deg,var(--deck-tone-303a37, #303a37) 0%,var(--deck-tone-c5edaf, #c5edaf) 50%,var(--deck-tone-303a37, #303a37) 100%);background-size:200% 100%;animation:video-progress 1.8s linear infinite;border:0;border-radius:8px}.video-activity progress:indeterminate::-webkit-progress-bar{background:transparent}@keyframes video-progress{from{background-position:200% 0}to{background-position:0 0}}@media(prefers-reduced-motion:reduce){.video-activity progress:indeterminate{animation:none}}
/* Theme selection uses the same card language as other Deck settings. */
.theme-options{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18px;margin-top:28px}
.theme-choice{display:flex;flex-direction:column;align-items:stretch;gap:8px;text-align:left;background:var(--deck-tone-181f21,#181f21);border:1px solid var(--deck-tone-303a37,#303a37);border-radius:13px;padding:22px;color:inherit;cursor:pointer;font:inherit}
.theme-choice:hover{border-color:var(--deck-tone-c5edaf,#c5edaf)}
.theme-choice[aria-pressed=true]{border-color:var(--deck-tone-c5edaf,#c5edaf);box-shadow:inset 0 0 0 1px var(--deck-tone-c5edaf,#c5edaf)}
.theme-choice strong{font-size:17px;font-weight:550}.theme-choice small{color:var(--deck-tone-97a79e,#97a79e);font-size:12px}
.theme-preview{height:100px;display:flex;align-items:end;gap:10px;padding:15px;border-radius:9px;margin-bottom:8px}
.theme-preview i{display:block;height:50px;flex:1;border-radius:6px}.theme-preview i:nth-child(2){height:70px}.theme-preview i:nth-child(3){height:35px}
.deck-preview{background:#101416}.deck-preview i{background:#181f21;border:1px solid #303a37}.deck-preview i:nth-child(2){border-top:5px solid #c5edaf}
.classic-preview{background:radial-gradient(circle at 15% -10%,#183049,#070b11 70%)}.classic-preview i{background:#0d141e;border:1px solid #213044}.classic-preview i:nth-child(2){border-top:5px solid #45d7ff}
@media(max-width:700px){.theme-options{grid-template-columns:1fr}}
+77
View File
@@ -0,0 +1,77 @@
/* Alternate palette derived from the original Athena dashboard. */
:root[data-theme="athena-classic"]{
--deck-tone-101416: #070b11;
--deck-tone-101718: #070b11;
--deck-tone-141a1c: #0b111a;
--deck-tone-151b1c: #0b121d;
--deck-tone-172412: #0e141b;
--deck-tone-181f21: #0d141e;
--deck-tone-1a2a18: #121920;
--deck-tone-20292a: #161c22;
--deck-tone-202a25: #111b28;
--deck-tone-202b23: #161c23;
--deck-tone-202c25: #171c23;
--deck-tone-222d27: #171d25;
--deck-tone-253229: #142638;
--deck-tone-26342b: #1b222a;
--deck-tone-28362b: #15293a;
--deck-tone-29372b: #1c242d;
--deck-tone-2a3430: #1c232c;
--deck-tone-2c3435: #1b293a;
--deck-tone-303a37: #213044;
--deck-tone-344038: #222b36;
--deck-tone-35423b: #232c37;
--deck-tone-3a493f: #2d4760;
--deck-tone-3b4840: #27313d;
--deck-tone-40503f: #294050;
--deck-tone-465348: #344962;
--deck-tone-536a51: #365469;
--deck-tone-647e58: #3e6078;
--deck-tone-668659: #3b8cac;
--deck-tone-75867b: #49708d;
--deck-tone-77857f: #49718d;
--deck-tone-798783: #4a7290;
--deck-tone-7f9189: #6e89a2;
--deck-tone-7fc8b6: #45d7ff;
--deck-tone-819386: #708ba4;
--deck-tone-82968a: #738da5;
--deck-tone-8b9c91: #7c94ab;
--deck-tone-8e9c93: #7e96ac;
--deck-tone-95a69b: #8fa1b5;
--deck-tone-96a89c: #8aa0b4;
--deck-tone-97a79e: #8fa1b5;
--deck-tone-9acb88: #83c7d0;
--deck-tone-a2aea5: #95a9bb;
--deck-tone-a4bda8: #9fb1c2;
--deck-tone-a5adab: #96aabc;
--deck-tone-aeb9b5: #a3b4c4;
--deck-tone-b6c2bc: #adbdcb;
--deck-tone-b6d2a8: #9fd4db;
--deck-tone-bce4a6: #a6dde4;
--deck-tone-bdd0ba: #abd9df;
--deck-tone-bdd4b2: #a8d8de;
--deck-tone-bddda9: #a8d8de;
--deck-tone-bdeba4: #66e3a4;
--deck-tone-bed4b8: #acd9e0;
--deck-tone-bfdda9: #a8d8de;
--deck-tone-c4d1c6: #bfcbd6;
--deck-tone-c5d2c9: #c0ccd7;
--deck-tone-c5edaf: #45d7ff;
--deck-tone-c6d6ca: #c3ced9;
--deck-tone-c7e4b6: #b6dee4;
--deck-tone-c9d3ca: #c3ced9;
--deck-tone-ccdbc7: #bce1e6;
--deck-tone-d0e5c4: #c1e3e8;
--deck-tone-d1eabf: #bfe5ea;
--deck-tone-d3efc5: #d5f5ff;
--deck-tone-d99b73: #92a7ba;
--deck-tone-d9fac7: #c7f4fa;
--deck-tone-dce7da: #d3ebee;
--deck-tone-e4eee5: #e7eef7;
--deck-tone-e4f1de: #e7eef7;
--deck-tone-e9aaa0: #ff6b7a;
--deck-tone-e9edea: #e7eef7;
--deck-tone-f2c891: #b4c2cf;
--deck-tone-ffc1a7: #ff6b7a;
--deck-tone-ffd5bf: #d8dfe6;
}