claude-desktop/src/app.css
Eddy fec8aea22c
All checks were successful
Build AppImage / build (push) Successful in 8m8s
feat: KB-Hints, Voice-Konversation, Chat-Darstellung, Cross-Session-Recall [appimage]
- Block A: KB-Hint-Pillen im Chat (💡) über Tool-Cards, Klick öffnet KB-Browser
- Block B: KB-Usage-Tracking (usage_count/last_used), Sortier-Boost für bewährte Einträge
- Block C: Cross-Session-Recall per SQLite-FTS5 (🕒 Pille "Schon mal beantwortet")
- Block D: Voice-Konversationsmodus (Langes Halten = Loop mit Barge-In-Unterbrechung)
- Block F: Select-Button im Audit-Log (appearance:none + SVG-Chevron, WebKitGTK-Fix)
- Block G: Chat-Darstellungseinstellungen (Schriftart, -größe, Zeilenhöhe, Code-Größe)
- WorkingIndicator: Deutsche Animationstexte beim Verarbeiten

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 16:54:58 +02:00

282 lines
7.1 KiB
CSS

/* Claude Desktop — Design-System (Phase 9)
*
* Single Source of Truth fuer Farben, Typografie, Spacing, Radius.
* Jede Komponente nutzt ausschliesslich diese Variablen — keine
* hardgecodeten Hex-Werte, keine Inline-Padding-Pixelwerte.
*
* Aufbau:
* 1. Farb-Palette (4 Graustufen + 1 Akzent + 4 Status)
* 2. Typografie (1 Sans + 1 Mono, 5 Schriftgroessen)
* 3. Spacing (4-Punkt-Grid, 6 Stufen)
* 4. Border-Radius (2 Stufen)
* 5. Schatten & Animationen
* 6. Reset + Basis
*/
:root {
/* === 1. Farben (Dark, Default) ============================== */
/* Grautoene */
--bg-primary: #1a1a1a; /* Editor / Hauptbereich */
--bg-secondary: #242424; /* Sidebar / Panels */
--bg-tertiary: #2d2d2d; /* Hover, Card-BG, Selected */
--bg-input: #1f1f1f; /* Input-Felder */
--bg-hover: #2a2a2a; /* dezenter Hover-State */
--bg-selected: #094771; /* aktive Auswahl in Listen */
/* Borders */
--border: #3e3e42; /* Standard-Trenner */
--border-strong: #525257; /* Aktive / Focus */
/* Text */
--text-primary: #e0e0e0;
--text-secondary: #9a9a9a;
--text-disabled: #5a5a5a;
--text-heading: #f0f0f0;
/* Akzent (1 Farbe) */
--accent: #007acc;
--accent-hover: #1177bb;
--accent-fg: #ffffff;
--focus: #007fd4;
--link: #3794ff;
/* Status (4 Farben) */
--status-success: #6a9955;
--status-warning: #f5a623;
--status-error: #f48771;
--status-info: #569cd6;
/* Diff-Farben (Code-Kontext) */
--diff-added-bg: rgba(106, 153, 85, 0.18);
--diff-removed-bg: rgba(244, 135, 113, 0.18);
--diff-added-fg: #6a9955;
--diff-removed-fg: #f48771;
/* Aliase fuer Altcode (deprecated, werden ueber Phase 9-12 entfernt) */
--success: var(--status-success);
--warning: var(--status-warning);
--error: var(--status-error);
/* === 2. Typografie ========================================= */
--font-sans: 'Inter', -apple-system, 'Segoe UI', 'Roboto', 'Noto Sans', system-ui, sans-serif;
--font-mono: 'JetBrains Mono', 'Hack', 'Fira Code', 'Consolas', monospace;
--fs-xs: 11px; /* Metadaten, Timestamps, Status-Bar */
--fs-sm: 12px; /* Sidebar, sekundaere UI */
--fs-md: 13px; /* Body, Chat, Code */
--fs-lg: 14px; /* UI-Header */
--fs-xl: 16px; /* Dialog-Titel */
--fw-normal: 400;
--fw-medium: 500;
--fw-semi: 600;
--lh-tight: 1.4;
--lh-normal: 1.5;
--lh-code: 1.6;
/* === 3. Spacing (4-Punkt-Grid) ============================= */
--sp-1: 4px;
--sp-2: 8px;
--sp-3: 12px;
--sp-4: 16px;
--sp-5: 24px;
--sp-6: 32px;
/* Legacy-Aliase (werden in Komponenten-Pass entfernt) */
--spacing-xs: var(--sp-1);
--spacing-sm: var(--sp-2);
--spacing-md: var(--sp-4);
--spacing-lg: var(--sp-5);
--spacing-xl: var(--sp-6);
/* === 4. Border-Radius (max. 2 Werte) ======================= */
--r-sm: 3px; /* Inputs, Buttons */
--r-md: 6px; /* Karten, Modals, Drawer */
/* Legacy-Aliase */
--radius-sm: var(--r-sm);
--radius-md: var(--r-md);
--radius-lg: var(--r-md);
/* === 5. Schatten & Animationen ============================= */
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
--shadow-md: 0 4px 8px rgba(0, 0, 0, 0.4);
--shadow-lg: 0 8px 16px rgba(0, 0, 0, 0.5);
--ease: cubic-bezier(0.4, 0, 0.2, 1);
--dur-fast: 120ms;
--dur-base: 200ms;
/* === Layout-Konstanten ===================================== */
--titlebar-height: 36px;
--statusbar-height: 22px;
--sidebar-width: 240px;
--sidebar-collapsed: 48px;
--drawer-width: 360px;
--tabbar-height: 32px;
}
/* === 6. Reset + Basis ========================================= */
*, *::before, *::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html, body {
height: 100%;
font-family: var(--font-sans);
font-size: var(--fs-md);
font-weight: var(--fw-normal);
line-height: var(--lh-normal);
background: var(--bg-primary);
color: var(--text-primary);
overflow: hidden;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
button {
font-family: inherit;
font-size: inherit;
cursor: pointer;
border: none;
background: none;
color: inherit;
}
input, textarea, select {
font-family: inherit;
font-size: var(--fs-md);
color: var(--text-primary);
background: var(--bg-input);
border: 1px solid var(--border);
border-radius: var(--r-sm);
padding: var(--sp-2) var(--sp-3);
transition: border-color var(--dur-fast) var(--ease);
}
/* WebKitGTK ignoriert haeufig CSS-Background bei nativen <select> und nimmt
stattdessen das System-Theme (oft weiss). appearance:none zwingt CSS durch.
Eigener Chevron als SVG-Background damit das Element nicht "nackt" wirkt. */
select {
appearance: none;
-webkit-appearance: none;
background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'><path fill='%23999' d='M0 0l5 6 5-6z'/></svg>");
background-repeat: no-repeat;
background-position: right 8px center;
padding-right: 24px;
cursor: pointer;
}
/* Option-Eintraege werden in vielen Engines vom OS-Theme gerendert —
color/background trotzdem setzen, manche Engines respektieren es. */
select option {
background: var(--bg-secondary, var(--bg-input));
color: var(--text-primary);
}
input:focus, textarea:focus, select:focus {
outline: none;
border-color: var(--focus);
}
code, pre {
font-family: var(--font-mono);
font-size: var(--fs-md);
}
code {
background: var(--bg-tertiary);
border-radius: var(--r-sm);
padding: 1px 4px;
}
pre {
background: var(--bg-input);
border: 1px solid var(--border);
border-radius: var(--r-sm);
padding: var(--sp-3);
overflow-x: auto;
line-height: var(--lh-code);
}
h1, h2, h3, h4 {
color: var(--text-heading);
font-weight: var(--fw-semi);
}
h1 { font-size: var(--fs-xl); }
h2 { font-size: var(--fs-lg); }
h3 { font-size: var(--fs-md); }
h4 { font-size: var(--fs-sm); }
a {
color: var(--link);
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
/* Scrollbars (subtil, VS-Code-Look) */
::-webkit-scrollbar {
width: 10px;
height: 10px;
}
::-webkit-scrollbar-track {
background: transparent;
}
::-webkit-scrollbar-thumb {
background: rgba(121, 121, 121, 0.4);
border-radius: 5px;
border: 2px solid transparent;
background-clip: content-box;
}
::-webkit-scrollbar-thumb:hover {
background: rgba(100, 100, 100, 0.7);
background-clip: content-box;
}
::selection {
background: var(--bg-selected);
color: var(--text-primary);
}
/* Animationen */
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
@keyframes fade-in {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes slide-in-right {
from { transform: translateX(100%); }
to { transform: translateX(0); }
}
.animate-pulse { animation: pulse 2s ease-in-out infinite; }
.animate-spin { animation: spin 1s linear infinite; }
.animate-fade-in { animation: fade-in var(--dur-base) var(--ease); }
/* Utility-Klassen (nur Selten genutzt — bevorzugt Komponenten) */
.text-secondary { color: var(--text-secondary); }
.text-mono { font-family: var(--font-mono); }
.tabular-nums { font-variant-numeric: tabular-nums; }