Dashboard: Claude API Status-Bar

- Zeigt Anthropic API Status aus status.claude.com an
- Nur sichtbar bei aktiven Incidents (minor/major/critical)
- Farbcodierte Indikatoren (gelb=warning, rot=danger)
- Stille Fehlerbehandlung bei nicht erreichbarem Status-Endpoint
This commit is contained in:
Meleki committed 2026-03-03 05:53:39 +01:00
1 parent 5d132585d5
commit 81714b1f4c
3 files changed
+76

No files matched your search

+46
View File
@@ -1,3 +1,49 @@
/* Status Bar */
.status-bar {
display: flex;
align-items: center;
gap: var(--badge-spacing);
padding: var(--box-padding);
margin-block: var(--badge-spacing) var(--box-spacing);
border-radius: var(--border-radius);
}
.status-bar[hidden] {
display: none;
}
.status-indicator {
width: 0.5em;
height: 0.5em;
border-radius: 50%;
flex-shrink: 0;
}
.status-bar.status-none .status-indicator {
background: var(--secondary);
}
.status-bar.status-minor .status-indicator {
background: var(--warning);
}
.status-bar.status-major .status-indicator,
.status-bar.status-critical .status-indicator {
background: var(--dangerous);
}
.status-bar.status-minor,
.status-bar.status-major,
.status-bar.status-critical {
background: rgb(from var(--warning) r g b / .1);
}
.status-bar.status-major,
.status-bar.status-critical {
background: rgb(from var(--dangerous) r g b / .1);
}
.dashboard .page-content {
padding: var(--page-padding);
}
+4
View File
@@ -45,6 +45,10 @@
<template id="tpl-dashboard">
<div class="page dashboard">
<div id="claudeStatusBar" class="status-bar" hidden>
<span class="status-indicator"></span>
<span class="status-text"></span>
</div>
<header>
<button class="back-btn icon-btn" disabled></button>
<h1 class="dashboard-title">// gott</h1>
+26
View File
@@ -2,6 +2,9 @@
registerPage('dashboard', {
async init() {
// Claude Status laden
loadClaudeStatus();
// Einstellungen-Link
document.getElementById('dashboardSettingsLink').addEventListener('click', (e) => {
e.preventDefault();
@@ -209,6 +212,29 @@ registerPage('dashboard', {
}
});
async function loadClaudeStatus() {
const statusBar = document.getElementById('claudeStatusBar');
if (!statusBar) return;
try {
const res = await fetch('https://status.claude.com/api/v2/status.json');
if (!res.ok) return;
const data = await res.json();
const indicator = data.status?.indicator || 'none';
const description = data.status?.description || '';
// Nur anzeigen wenn es kein "none" ist (alles OK)
if (indicator === 'none') return;
statusBar.classList.add(`status-${indicator}`);
statusBar.querySelector('.status-text').textContent = description;
statusBar.hidden = false;
} catch {
// Status-Abruf fehlgeschlagen – still ignorieren
}
}
function closeAllCardMenus() {
document.querySelectorAll('.card-menu-dropdown').forEach(d => d.hidden = true);
}