Add themed widgets, calendar, and Open WebUI chat to the dashboard

- Apply GTK-like color scheme (dark greys, #f76b2f accent) across
  cards, buttons, glows and category colors
- Service cards use the official logo icons; Netbird card shows live
  reachability + latency instead of a separate top widget
- Top widgets: Today (calendar events with in-progress highlighting),
  Git activity (3 rows visible, scrollable), GPU with live ROCm stats
  and loaded Ollama models incl. GPU/CPU split
- Open WebUI card: inline prompt line with model selection
- Calendar section grouping events by day below the services
- data.json fetch with boot retry; GPU/Ollama poll every 5 s
- Today entries wrap long titles; README documents widgets,
  environment variables and the .env secrets pattern
This commit is contained in:
2026-09-04 14:07:22 +02:00
parent 55e871bd4f
commit e766fcd95c
4 changed files with 1158 additions and 46 deletions
+50
View File
@@ -51,10 +51,60 @@
</div>
</header>
<section class="widgets" id="widgets" aria-label="Live widgets">
<article class="widget widget-calendar" id="widget-calendar">
<div class="widget-head">
<div class="widget-icon" aria-hidden="true">📅</div>
<span class="widget-title">Today</span>
</div>
<div class="widget-body" id="today-events">
<p class="widget-loading">Loading…</p>
</div>
</article>
<article class="widget widget-git" id="widget-git">
<div class="widget-head">
<div class="widget-icon" aria-hidden="true">🐙</div>
<span class="widget-title">Git activity</span>
</div>
<div class="widget-body" id="git-stats">
<p class="widget-loading">Loading…</p>
</div>
</article>
<article class="widget widget-gpu" id="widget-gpu">
<div class="widget-head">
<div class="widget-icon" aria-hidden="true">🖥️</div>
<span class="widget-title">GPU</span>
</div>
<div class="widget-body">
<div id="gpu-stats">
<p class="widget-loading">Loading…</p>
</div>
<div class="ollama-block">
<div class="ollama-label">Ollama</div>
<div id="ollama-stats">
<p class="widget-loading">Loading…</p>
</div>
</div>
</div>
</article>
</section>
<main id="app">
<!-- sections rendered by script.js -->
</main>
<section class="calendar-section" aria-labelledby="calendar-title">
<h2 id="calendar-title" class="section-title">
Calendar
<span class="count" id="calendar-count">0</span>
</h2>
<div id="calendar" class="calendar">
<p class="calendar-loading">Loading calendar…</p>
</div>
</section>
<footer class="footer">
<span id="stats"></span>
</footer>