Files
second-brain/docs/dashboard-ui-ux-design.md

9.0 KiB
Raw Permalink Blame History

Second-Brain Dashboard UI/UX Design Plan (mobile-first)

Basis: second-brain/templates/dashboard.html, second-brain/static/style.css (aktueller Stand) + neue Graph-Controls aus /tmp/second-brain-staging/.

1) Konkreter Design-Plan

Ziele (UX)

  • Schnelles Triaging unterwegs: Pending/Errors sofort sichtbar, 1-Hand-Bedienung.
  • Konsistentes Design-System: einheitliche Buttons/Inputs/Panels statt Einzellösungen.
  • Graph als Diagnose-Tool: klare Controls, Legende, nachvollziehbares Feedback (Loading/Empty/Errors).

Farbschema (Dark, high-contrast, "indigo + emerald")

  • Background: sehr dunkel (nahe #0f1117) für weniger Blendung.
  • Surface (Cards/Panels): abgestufte Flächen (Surface-1, Surface-2) für Hierarchie.
  • Primary: Indigo/Blue für interaktive Elemente und Highlights (bisher #6c8af5 bleibt als Basis).
  • Success: Emerald für Confirm/OK (bisher #3a7d3a → etwas heller/satter).
  • Danger: Red für Errors/Reject.
  • Warning: Amber für Pending/Match/Attention.
  • Text: fast-weiß, sekundär gedimmt.

Typografie

  • Systemfont-Stack (schnell, gut lesbar): ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial.
  • Skala (mobile-first):
    • text-xs 12px (Labels, Meta)
    • text-sm 1314px (secondary)
    • text-md 1516px (Body)
    • text-lg 1820px (Titles)
  • Ziffern: optional font-variant-numeric: tabular-nums; für Stats.

Spacing/Rhythm

  • 4px Grid; Standard-Gaps: 8/12/16.
  • Container-Padding: 12px (mobile), 1620px (>=768px).
  • Border-radius: 1216px (Cards/Modals), 10px (Inputs/Buttons), 999px (Pills).

Komponenten (konkret)

A) Tabs

  • Tabs bleiben als 3 Buttons, aber:
    • Active State deutlicher (background + border + subtle glow).
    • Touch target min. 44px Höhe.
    • Sticky bleibt, aber mit leichter Backdrop-Blurring (wenn möglich) oder solid surface.
  • Search-Row wird als kompakte Toolbar gestaltet:
    • Input + Filter in einer Zeile.
    • Optional Quick-Chips darunter: All / Pending / Confirmed / Errors (klickbar) als Alternative zum Select.
  • Clear-Button (×) im Input (per CSS ::-webkit-search-cancel-button oder eigener Button) für Mobile.

C) Cards

  • Karte als 3 Zonen: Header (badges/tags/date), Body (content), Footer (actions).
  • Status wird stärker codiert:
    • left-border + kleine Status-Pill (OK/Pending/Error) mit eindeutiger Farbe.
  • Body: bessere Lesbarkeit via line-height: 1.55 und max-height/clamp optional.

D) Modal

  • Modal als Bottom Sheet auf Mobile (>=50vh) + klassisches Center-Modal auf Desktop.
  • Close-Button größer + Tap-Area.
  • Inhalt in Tabs/Sections (History/Meta/Content) optional später.

E) Graph + Controls (aus Staging)

  • Controls als Control Bar oberhalb Canvas:
    • Primary: Physics toggle.
    • Secondary: Fit, Reset, Reload.
    • Text labels kurz (z.B. Physics statt Physics: off, state als Badge).
  • Canvas passt sich an Viewport an:
    • width: min(100%, 560px); Height: min(65vh, 560px) (CSS statt fester HTML Attribute, wenn möglich).
  • Legende als einklappbares Panel (Details/summary) oder leichtes Panel unter Canvas.

F) Status Panels

  • Status-View nutzt vorhandene .panel/.kv-*:
    • Gruppen: System, Storage, Jobs, Insights, Pending Queue.
    • Jede Gruppe als Panel mit klarer Title Row.
  • Kritische Werte (Errors/Pending/Queue) farblich markieren.

2) CSS-Variablen (Theme-Tokens) + Mapping

Token-Vorschlag (:root)

:root {
  /* typography */
  --font-sans: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;

  /* colors */
  --bg: #0f1117;
  --surface-1: #14151d;
  --surface-2: #1a1b26;
  --border: #2a2d3a;

  --text: #e8e8ee;
  --text-muted: #8b90a3;
  --text-dim: #5c6276;

  --primary: #6c8af5;      /* existing */
  --primary-2: #8aa1ff;
  --success: #2fbf71;
  --danger: #ef4444;
  --warning: #f7d154;      /* existing-ish */

  /* shadows */
  --shadow-1: 0 1px 0 rgba(0,0,0,.25), 0 8px 24px rgba(0,0,0,.35);

  /* radius */
  --r-sm: 10px;
  --r-md: 14px;
  --r-lg: 16px;

  /* spacing */
  --s-1: 4px;
  --s-2: 8px;
  --s-3: 12px;
  --s-4: 16px;
  --s-5: 20px;

  /* control sizes */
  --tap: 44px;
}

Mapping auf existierende Selektoren

  • body/.app
    • background: var(--bg) statt #141419
    • font-family: var(--font-sans)
    • color: var(--text)
  • .stats-bar, .tabs-bar, .search-box
    • background: var(--surface-1) (Stats ggf. Gradient bleibt, aber auf Tokens)
    • border-bottom: 1px solid var(--border)
  • .panel, .card, .modal-content, .graph-legend
    • background: var(--surface-2)
    • border: 1px solid var(--border)
    • border-radius: var(--r-md)
  • .stat-num, #pageNum, .tab-btn.active, #searchInput:focus
    • color/border-color: var(--primary)
  • .muted, .stat-label, .kv-key, .date
    • color: var(--text-muted) bzw. var(--text-dim)
  • Buttons
    • vereinheitlichen über .btn + Modifier: .btn.primary, .btn.danger, .btn.success, .btn.ghost
    • min-height: var(--tap) für Touch

3) 510 priorisierte UI-Änderungen (mit Begründung)

  1. Design Tokens (CSS vars) einführen → reduziert Farbmix, erleichtert spätere Themes/Anpassungen.
  2. Einheitliche Button-Komponente (.btn) (inkl. :active, :disabled, min-height) → bessere Touch-UX, konsistente Interaktion.
  3. Graph-Controls + Legende aus Staging in den Main-Template-Stand ziehen → Graph wird tatsächlich bedienbar/selbsterklärend.
  4. Responsive Graph-Canvas (CSS gesteuert) statt fixer width/height → bessere Nutzung auf Phones, weniger Scroll.
  5. Search als Toolbar + Clear-Action → schnelleres Filtern unterwegs, weniger Friktion.
  6. Modal als Bottom-Sheet auf Mobile → angenehmer für längeren Content + History, weniger „winziges Fenster“.
  7. Status/Health Werte farblich akzentuieren (pending/errors/warn) → schnelleres Erkennen von Problemen.
  8. Cards: Status-Pill + typografische Lesbarkeit (line-height, spacing) → weniger „Textblock“, bessere Scanbarkeit.
  9. Accessibility-Basics: Focus-Rings, Kontrast, prefers-reduced-motion → weniger „invisible focus“ und bessere Bedienbarkeit.
  10. Top-level Layout Max-Width für Desktop (z.B. 560720px) → verhindert „zu breite“ Zeilen.

4) Optionale Patch-Vorschläge (Diff-Snippets, NICHT anwenden)

Hinweis: Snippets sind bewusst klein gehalten. Gesamt < 120 Zeilen.

Snippet A — Tokens + Button-System (style.css)

--- a/second-brain/static/style.css
+++ b/second-brain/static/style.css
@@
+:root {
+  --font-sans: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;
+  --bg:#0f1117; --surface-1:#14151d; --surface-2:#1a1b26; --border:#2a2d3a;
+  --text:#e8e8ee; --text-muted:#8b90a3; --text-dim:#5c6276;
+  --primary:#6c8af5; --success:#2fbf71; --danger:#ef4444; --warning:#f7d154;
+  --r-sm:10px; --r-md:14px; --r-lg:16px;
+  --s-2:8px; --s-3:12px; --s-4:16px;
+  --tap:44px;
+}
+
+body { font-family: var(--font-sans); background: var(--bg); color: var(--text); }
+
+.btn{
+  min-height: var(--tap);
+  background: #1e1e28;
+  border: 1px solid var(--border);
+  border-radius: var(--r-sm);
+  padding: 8px 12px;
+  color: #cfd3ff;
+  font-weight: 700;
+}
+.btn.primary{ border-color: var(--primary); box-shadow: 0 0 0 1px rgba(108,138,245,0.18) inset; }
+.btn.success{ background: rgba(47,191,113,.18); border-color: rgba(47,191,113,.35); }
+.btn.danger{ background: rgba(239,68,68,.16); border-color: rgba(239,68,68,.35); }
+.btn:active{ transform: scale(.98); }
+.btn:disabled{ opacity: .45; }

Snippet B — Graph Controls + Legend übernehmen (dashboard.html)

--- a/second-brain/templates/dashboard.html
+++ b/second-brain/templates/dashboard.html
@@
-        <div class="graph" id="graph" style="display:none;">
-            <canvas id="graphCanvas" width="440" height="520"></canvas>
-            <div class="muted small" id="graphHint">Lade Graph…</div>
-        </div>
+        <div class="graph" id="graph" style="display:none;">
+            <div class="graph-controls">
+                <button class="btn primary" id="btnGraphPhysics" onclick="toggleGraphPhysics()">Physics</button>
+                <button class="btn" onclick="resetGraphView()">Reset</button>
+                <button class="btn" onclick="fitGraphView()">Fit</button>
+                <button class="btn" onclick="reloadGraph()">Reload</button>
+            </div>
+            <canvas id="graphCanvas" width="440" height="520"></canvas>
+            <div class="graph-hint muted small" id="graphHint">Lade Graph…</div>
+            <div class="graph-legend">
+                <div><strong>Graph</strong>: Zoom (Wheel/Pinch), Pan (Drag). Klick auf Engram öffnet Details, Klick auf Tag setzt Suche.</div>
+                <div class="legend-row"><span class="legend-dot engram"></span> Engram</div>
+                <div class="legend-row"><span class="legend-dot tag"></span> Tag</div>
+                <div class="legend-row"><span class="legend-dot match"></span> Match</div>
+            </div>
+        </div>