All checks were successful
Build AppImage / build (push) Successful in 8m8s
- 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>
282 lines
7.1 KiB
CSS
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; }
|