Files
claude-live-dashboard/src/settings/index.html
T
swinksandClaude Opus 4.8 c1b899ec8b Linux-Fassung (Ubuntu) ergaenzen
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>
2026-07-22 21:52:08 +02:00

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>