Dieses Dokument definiert die strikten Design-Vorgaben fuer alle Desktop-Anwendungen im gregFramework-Ökosystem, die auf Avalonia UI basieren. Es erweitert und konkretisiert die Architekturregeln aus AGENTS.md fuer alle visuellen und interaktiven Aspekte.
- Terminal Core: Die UI soll sich anmaessig, praegnant und informationsdicht anfuehlen — nicht verspielt.
- Funktion vor Form: Jedes Element muss einen Zweck erfuellen. Dekoration ohne Nutzen wird entfernt.
- Konsistenz ueber Customizing: Alle greg-Apps teilen dieselben Tokens, Abstaende und Interaktionsmuster.
- Cross-Platform Paritaet: Windows und Linux muessen visuell identisch rendern (Pixel-Shift-Tests bei jedem Release).
Alle Farbwerte sind absolut und duerfen nicht interpoliert oder veraendert werden.
| Token | Hex | Verwendung |
|---|---|---|
SurfaceBase |
#051424 |
Haupt-Hintergrund aller Fenster und Seiten |
SurfaceElevated |
#0A1E2E |
Karten, Panels, Modale, Flyouts |
SurfaceOverlay |
#122131 |
Hover-States, Trennlinien, Subtle Hervorhebungen |
Primary |
#8AEBFF |
Aktive Aktionen, Links, Fokus-Ringe, Ladeindikatoren |
Secondary |
#4DE082 |
Erfolgszustaende, positive Badges, gespeicherte Indikatoren |
OnSurface |
#D4E4FA |
Primaerer Text, Icons im Normalzustand |
OnSurfaceMuted |
#8A9DB3 |
Sekundaerer Text, Placeholder, Disabled-Labels |
Danger |
#FF5370 |
Fehler, Destruktive Aktionen, Rate-Limit-Timer |
Warning |
#FFD166 |
Warnungen, ungespeicherte Aenderungen |
BorderSubtle |
#122131 |
Trennlinien, Rahmen von Eingabefeldern |
BorderActive |
#8AEBFF |
Fokussierte Eingabefelder, aktive Tabs |
Regeln:
- Keine transparenten Overlays (
Opacity < 1.0) fuer Hintergruende. - Keine Verlaeufe (Gradients).
- Keine Schlagschatten (Drop Shadows).
- Kontrastverhaeltnisse muessen mindestens WCAG AA fuer Text erfuellen (Primary auf SurfaceBase: 10.8:1).
| Rolle | Schriftart | Groesse | Gewicht | Zeilenabstand |
|---|---|---|---|---|
| Display | Space Grotesk | 24 px | 700 | 32 px |
| Headline | Space Grotesk | 18 px | 600 | 24 px |
| Title | Inter | 14 px | 600 | 20 px |
| Body | Inter | 13 px | 400 | 18 px |
| Caption | Inter | 11 px | 400 | 14 px |
| Mono (Status, Metadaten) | JetBrains Mono | 12 px | 400 | 16 px |
Regeln:
Interist die Standard-UI-Schrift;Space Grotesknur fuer Ueberschriften und Marken-Elemente.JetBrains Monoist verpflichtend fuer: Dateipfade, IDs, Versionsnummern, Dateigroessen, Zeitstempel, SHA256-Hashes, Steam-AppIDs.- Text-Transform: Nie
uppercasefuer Labels oder Buttons. Nur fuer kleine statische Badges erlaubt. - Text-Trimming:
TextTrimming=CharacterEllipsisbei Pfaden und langen Titeln; Tooltip mit Volltext bei Hover.
- Basis-Einheit: 8 px.
- Seitenraender: 24 px (Desktop), 16 px (kompakte Fenster < 900 px Breite).
- Panel-Padding: 16 px.
- Karten-Padding: 16 px.
- Element-Abstand: 8 px, 16 px, 24 px (Vielfache von 8).
- Trennlinien: 1 px, Farbe
BorderSubtle, horizontal oder vertikal.
Regeln:
- Keine halben Einheiten (z.B. 4 px nur fuer Hairlines/Trennlinien erlaubt).
- Kein zentrierter Fliesstext; Linksbuendig ausgerichtet.
- Listen und Tabellen nutzen volle verfuegbare Breite; letzte Spalte expandiert.
| Komponente | Radius |
|---|---|
| Fenster (root) | 0 px (scharfe Kanten) |
| Karten / Panels | 4 px |
| Buttons | 4 px |
| Eingabefelder | 4 px |
| Dropdowns / ContextMenus | 4 px |
| Modale / Dialoge | 8 px |
| Avatare / Thumbnails | 0 px (quadratisch) |
| Tabs | 4 px (oben) |
| Badges | 2 px |
Regeln:
- Keine abgerundeten "Bubble"-UIs.
- Keine vollstaendig runden Buttons (Pill-Shape).
- Bilder und Thumbnails sind immer quadratisch mit 0 px Radius.
SystemDecorations="None"ist verpflichtend fuer alle greg-Apps.- Kein
ExtendClientAreaToDecorationsHint="True", wenn es das Ziehen des Fensters beeintraechtigt. - Titelleiste ist ein
Bordermit HintergrundSurfaceElevated, Hoehe 40 px. - Titelleiste reagiert auf
PointerPressed+BeginMoveDragfuer Fenster-Verschieben. - Fenster-Controls (Minimieren, Maximieren, Schliessen) sind custom Buttons rechts oben.
- Schliessen-Button zeigt
Danger-Farbe nur bei Hover.
| Variante | Hintergrund | Rahmen | Text |
|---|---|---|---|
| Primary | Primary |
none | SurfaceBase |
| Secondary | SurfaceElevated |
BorderSubtle |
OnSurface |
| Danger | Danger |
none | SurfaceBase |
| Ghost | transparent | none | OnSurfaceMuted |
- Padding: 8 px vertikal, 16 px horizontal.
- Hover: Helligkeit um 10 % erhoehen (durch feste Farbe, nicht Opacity).
- Disabled:
OnSurfaceMutedText, kein Rahmen, keine Aktion. - Focus-Ring: 2 px
Primarymit 2 px Offset (innerer RingSurfaceBase).
- Hintergrund:
SurfaceBase. - Rahmen: 1 px
BorderSubtle; bei Fokus 1 pxBorderActive. - Padding: 8 px.
- Placeholder:
OnSurfaceMuted. - Disabled: Rahmen
BorderSubtle, TextOnSurfaceMuted. - Keine animierten Underlines oder schwebende Labels.
- Dropdown-Panel:
SurfaceElevated, Radius 4 px, 1 px RahmenBorderSubtle. - Ausgewaehltes Item: Hintergrund
SurfaceOverlay. - Hover-Item: Hintergrund
SurfaceOverlay.
- Zeilen-Hoehe: 40 px.
- Abwechselnde Zeilenfarben: Nein. Stattdessen Trennlinien zwischen Zeilen.
- Hover-Zeile: Hintergrund
SurfaceOverlay. - Ausgewaehlte Zeile: Hintergrund
SurfaceOverlay+ linker 3 px RandPrimary. - Header:
JetBrains Mono, 11 px,OnSurfaceMuted, HintergrundSurfaceElevated.
- Hintergrund:
SurfaceElevated. - Rahmen: 1 px
BorderSubtle. - Radius: 4 px.
- Padding: 16 px.
- Kein Schatten.
- Hintergrund:
SurfaceOverlay. - Text:
JetBrains Mono, 11 px. - Padding: 2 px 8 px.
- Radius: 2 px.
- Hintergrund:
SurfaceElevated. - Rahmen: 1 px
BorderSubtle. - Text:
Caption. - Verzoegerung: 400 ms.
- Nie native
MessageBoxverwenden. - Pflicht:
IDialogServicemitWindow.ShowDialog. - Dialog-Hintergrund: halbtransparentes
SurfaceBase(nur hier ist leichte Transparenz erlaubt:#051424E6). - Dialog-Panel:
SurfaceElevated, Radius 8 px, max. Breite 560 px. - Trennung von Titel, Inhalt und Aktionen durch Hairlines.
- Primaere Aktion immer rechts unten; destruktive Aktion links davon als Ghost-Button.
- Dialoge muessen scrollbar sein, wenn Inhalt > 70 % der Fensterhoehe.
- Linearer Fortschrittsbalken, Hoehe 4 px, Radius 2 px.
- Track:
SurfaceOverlay; Fill:Primary. - Keine prozentuale Animation in der Breite (nur bei Wert-Aenderung).
- Spinner: 16 px, 2 px Strichstaerke, Farbe
Primary. - Skelett-Loading nur fuer Listen erlaubt (rechteckige Bloecke in
SurfaceOverlay).
- Expliziter Cooldown-Timer in Sekunden, Mono-Schrift.
- Farbe:
Danger, solange blockiert;Secondary, sobald verfuegbar. - Sichtbarkeit: Banner oberhalb der primaeren Aktion, nicht als Toast.
- Stil: Strichstaerke 1.5 px, scharfe Enden, keine ausgefuellten Flaechen.
- Groesse: 16 px (Standard), 20 px (Toolbar), 24 px (leere Zustaende).
- Farbe:
OnSurface(Standard),Primary(aktiv),OnSurfaceMuted(disabled). - Keine Emojis als Icon-Ersatz.
- Alle UI-Strings muessen ueber
GregModmanager.Localization.S.Get("Key")oderS.Format("Key", args)aufgeloest werden. - Keine hardcodierten Strings in XAML oder Code-Behind.
- Neue Keys muessen zuerst in
AppStrings.resxundAppStrings.de.resxeingetragen werden. - Textlaengen-Unterschiede (z.B. Deutsch +30 %) muessen getestet werden; UI darf nicht brechen.
AvaloniaResourcefuer alle UI-Assets (Styles, Icons, Bilder).Contentnur fuer Assets, die zur Laufzeit ersetzt werden muessen (z.B.SubDirectoryFixer.dll).- Bilder: PNG mit Alpha; keine JPEGs fuer UI-Elemente.
- Thumbnails fuer Workshop-Items: 256x256 px, quadratisch, zentriertes Resize.
- Max. Dauer: 150 ms fuer UI-Transitions (Fade, Slide).
- Easing:
CubicEaseOut. - Keine Animationen fuer DataGrid-Row-Updates (Performance).
- Keine parallaxen oder physikbasierten Animationen.
- Modale: Fade-In 100 ms; Fade-Out 75 ms.
- Minimale Fenstergroesse: 1024 x 640 px.
- Bei < 1024 px Breite: Seitenpanel kollabiert zu Icons-only.
- Bei < 800 px Breite: Zweispaltiges Layout wird einspaltig.
- Keine mobile Ansicht; Desktop-Only.
| Muster | Ersetzen durch |
|---|---|
Native MessageBox |
IDialogService Modale |
ExtendClientAreaToDecorationsHint |
Custom Chrome mit SystemDecorations="None" |
ReflectionBindingExtension |
CompiledBindings oder {Binding} mit Typpruefung |
| Opacity-Animationen | Direkte Farbwechsel |
| Runde / Pill-Buttons | Rechtecke mit 4 px Radius |
| Schlagschatten | Hairlines oder kontrastierende Rahmen |
| Verlaeufe | Flaechenfarben |
| Emojis | Vektor-Icons |
| Halbe Pixel-Werte (4 px ausser Trennlinien) | 8 px Grid |
CompiledBindingsverwenden, wo moeglich; reduziert Reflektion und Trimming-Warnungen.Design.DataContextnur fuer Design-Time; keine Logik darin.UserControlnur fuer wiederverwendbare Komponenten; fuer SeitenContentControlmit ViewModel-Switch.Stylesin separaten.axaml-Dateien unterStyles/; keine Inline-Styles in Views.ThemeVariantnicht dynamisch aendern; greg-Apps unterstuetzen nur den dunklen Modus.
Bevor ein PR gemerged wird, muss geprueft werden:
- Alle neuen UI-Strings sind in
AppStrings.resx+AppStrings.de.resx. - Keine hardcodierten Farben ausser den definierten Tokens.
- Keine
MessageBox-Aufrufe. -
CompiledBindingsaktiv, wo Typ statisch bekannt. - Fenster ist bei 1024x640 px und bei 1920x1080 px bedienbar.
- Keine Avalonia-Warnungen bezueglich nicht erreichbarer XAML-Ressourcen (AVLN3001).
- Screenshot-Diff bei visuellen Aenderungen (manuell oder via CI).