Die Fachlogik war bereits plattformneutral — paths.js loeste ~/.config schon auf, jsonl.js liest ueber os.homedir(). Zu tun waren Autostart, Build-Targets und drei Linux-Eigenheiten der Oberflaeche. XWayland erzwingen: Ab Electron 36 waehlt Chromium in einer Wayland-Sitzung von sich aus Wayland. Dort darf sich ein Fenster weder selbst positionieren noch dauerhaft in den Vordergrund legen — beides ist der Kern dieses Widgets. Der Schalter muss auf der Kommandozeile stehen, weil Ozone die Plattform vor dem Main-Skript festlegt; appendSwitch() und ELECTRON_OZONE_PLATFORM_HINT kommen beide zu spaet. Bleibt ein einmaliger Neustart mit --ozone-platform=x11, der sich am Argument selbst als Abbruchbedingung erkennt. Im AppImage muss dabei execPath auf APPIMAGE zeigen, sonst laeuft der Nachfolger in den /tmp-Einhaengepunkt, den der Vorgaenger beim Beenden wegraeumt. Autostart: app.setLoginItemSettings() gibt es unter Linux nicht. Das neue Modul autostart.js kapselt die Weiche und schreibt bzw. loescht dort ~/.config/autostart/claude-live-dashboard.desktop. Der Startbefehl kommt aus APPIMAGE, falls gesetzt. Ausserdem: enable-transparent-visuals fuer echte Transparenz, das 32-px-Tray-Symbol in der GNOME-Leiste, plattformabhaengige Beschriftungen in Tray-Menue und Einstellungsdialog, AppImage- und deb-Targets, icon.png auf 512 px (electron-builder rechnet daraus die Linux-Groessen herunter) und start.sh als Gegenstueck zu start.cmd. Getestet unter GNOME/Wayland: Fenster auf X11 an erwarteter Position, gemerkte Position wird wiederhergestellt, Tray registriert sich auf DBus, dump liest die Transkripte, beide Pakete bauen und das AppImage startet ohne Schalter. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
158 lines
5.9 KiB
HTML
158 lines
5.9 KiB
HTML
<!doctype html>
|
|
<html lang="de">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src 'self'; script-src 'self';" />
|
|
<title>Einstellungen</title>
|
|
<link rel="stylesheet" href="styles.css" />
|
|
</head>
|
|
<body>
|
|
<header class="titlebar">
|
|
<span class="title">Einstellungen</span>
|
|
<span class="spacer"></span>
|
|
<button class="icon-btn" id="btn-close" title="Schließen" aria-label="Schließen">✕</button>
|
|
</header>
|
|
|
|
<main class="content">
|
|
<p class="path" id="config-path">—</p>
|
|
|
|
<section class="group">
|
|
<h2>Anzeige</h2>
|
|
|
|
<div class="row">
|
|
<label for="opacity">Deckkraft</label>
|
|
<div class="control">
|
|
<input type="range" id="opacity" min="30" max="100" step="5" />
|
|
<output id="opacity-out">100 %</output>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<label for="clickThrough">Klicks durchlassen</label>
|
|
<div class="control">
|
|
<input type="checkbox" id="clickThrough" />
|
|
<span class="hint">Das Widget fängt keine Mausklicks mehr ab.</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<label for="autostart" id="autostart-label">Automatisch starten</label>
|
|
<div class="control">
|
|
<input type="checkbox" id="autostart" />
|
|
<span class="hint">Wird sofort übernommen, unabhängig vom Speichern.</span>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="group">
|
|
<h2>Datenquelle</h2>
|
|
|
|
<div class="row">
|
|
<label for="oauthEnabled">Serverabfrage</label>
|
|
<div class="control">
|
|
<input type="checkbox" id="oauthEnabled" />
|
|
<span class="hint">
|
|
Liefert exakte Prozentwerte und Reset-Zeiten. Abgeschaltet rechnet
|
|
das Dashboard nur lokal — dann sind alle Werte Näherungen.
|
|
</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<label for="oauthEndpoint">Endpunkt</label>
|
|
<div class="control">
|
|
<input type="text" id="oauthEndpoint" placeholder="Standard verwenden" spellcheck="false" />
|
|
<span class="hint">Nur ausfüllen, um den Standard zu überschreiben.</span>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="group">
|
|
<h2>Bezugsgrößen <span class="tag">Rückfallebene</span></h2>
|
|
<p class="note">
|
|
Werden nur benutzt, wenn die Serverabfrage ausfällt. Ermitteln mit
|
|
<code>npm run calibrate</code>. Leer lassen für Auto-Kalibrierung.
|
|
</p>
|
|
|
|
<div class="row">
|
|
<label for="limitWeek">Woche</label>
|
|
<div class="control">
|
|
<input type="number" id="limitWeek" min="0" step="1000000" placeholder="automatisch" />
|
|
<span class="hint">gewichtete Tokens für 100 %</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<label for="limitBlock">5-Stunden-Fenster</label>
|
|
<div class="control">
|
|
<input type="number" id="limitBlock" min="0" step="1000000" placeholder="automatisch" />
|
|
<span class="hint">gewichtete Tokens für 100 %</span>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="group">
|
|
<h2>Gewichtung</h2>
|
|
<p class="note">
|
|
Wie stark Token-Arten und Modelle ins Kontingent zählen. Beeinflusst
|
|
die lokale Rechnung und die Hochrechnung „reicht noch …“, nicht die
|
|
Serverwerte.
|
|
</p>
|
|
|
|
<div class="grid" id="weights">
|
|
<label for="wInput">Eingabe</label><input type="number" id="wInput" min="0" step="0.05" />
|
|
<label for="wOutput">Ausgabe</label><input type="number" id="wOutput" min="0" step="0.05" />
|
|
<label for="wCacheCreate">Cache anlegen</label><input type="number" id="wCacheCreate" min="0" step="0.05" />
|
|
<label for="wCacheRead">Cache lesen</label><input type="number" id="wCacheRead" min="0" step="0.05" />
|
|
<label for="mOpus">Opus</label><input type="number" id="mOpus" min="0" step="0.1" />
|
|
<label for="mSonnet">Sonnet</label><input type="number" id="mSonnet" min="0" step="0.1" />
|
|
<label for="mHaiku">Haiku</label><input type="number" id="mHaiku" min="0" step="0.1" />
|
|
</div>
|
|
</section>
|
|
|
|
<section class="group">
|
|
<h2>Wochenfenster <span class="tag">Rückfallebene</span></h2>
|
|
<p class="note">
|
|
Bei aktiver Serverabfrage wird der echte Reset-Zeitpunkt verwendet und
|
|
diese Angaben bleiben ungenutzt.
|
|
</p>
|
|
|
|
<div class="row">
|
|
<label for="weekday">Reset-Tag</label>
|
|
<div class="control">
|
|
<select id="weekday">
|
|
<option value="">rollierende 7 Tage</option>
|
|
<option value="0">Sonntag</option>
|
|
<option value="1">Montag</option>
|
|
<option value="2">Dienstag</option>
|
|
<option value="3">Mittwoch</option>
|
|
<option value="4">Donnerstag</option>
|
|
<option value="5">Freitag</option>
|
|
<option value="6">Samstag</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<label for="resetHour">Uhrzeit</label>
|
|
<div class="control inline">
|
|
<input type="number" id="resetHour" min="0" max="23" step="1" />
|
|
<span class="colon">:</span>
|
|
<input type="number" id="resetMinute" min="0" max="59" step="1" />
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</main>
|
|
|
|
<footer class="actions">
|
|
<button class="btn ghost" id="btn-open-file">Datei öffnen</button>
|
|
<span class="spacer"></span>
|
|
<span class="feedback" id="feedback" hidden></span>
|
|
<button class="btn ghost" id="btn-revert">Verwerfen</button>
|
|
<button class="btn primary" id="btn-save">Speichern</button>
|
|
</footer>
|
|
|
|
<script src="app.js"></script>
|
|
</body>
|
|
</html>
|