# Hoard – Style Guide

## Zielbild
Hoard soll wirken wie eine **moderne, produktive Dateiverwaltung im Browser** – ruhig, klar und mit hoher visueller Sorgfalt. Die Grundphilosophie bleibt dateiorientiert: Inhalte, Dateinamen, Pfade und Aktionen stehen im Vordergrund, nicht UI-Effekte. Gleichzeitig darf sich Hoard hochwertig und präzise anfühlen – „polished" statt „fancy", näher an einer modernen Linear-/Vercel-/Notion-Sidebar als an einer alten Admin-UI.

Die Gestaltung folgt drei Prinzipien:

1. **Dateien zuerst** – Inhalte, Namen, Strukturen und Aktionen sind optisch dominant, nicht die Chrome.
2. **Ruhe mit Charakter** – viel Weißraum, klare Flächen, ausgewählte Akzente. Wenig Elemente, aber jedes mit Sorgfalt.
3. **Grün als Identität, nicht als Dauerfeuer** – die Markenfarbe wird gezielt für Auswahl, Primäraktionen, Status und Branding eingesetzt – nicht flächendeckend.

## Modernisierungs-Direktive
Beim Redesign gilt zusätzlich:

- **Hochwertige App-Shell:** Sidebar und Topbar dürfen sich „premium" anfühlen (klare Hierarchie, animierter Active-Indicator, gradient-tinged Brand-Bereich).
- **Layered Surfaces:** Statt einer einzigen Surface-Farbe gibt es eine kleine Surface-Hierarchie (`surface`, `surface-alt`, `surface-elevated`) mit subtil gestaffelten Schatten.
- **Microinteractions:** kurze, präzise Hover-/Active-/Focus-Animationen (160–240 ms). Keine wabernden, dauerhaften Bewegungen.
- **Ambient Gradients:** Hero-/Brand-Bereiche dürfen sehr weiche, breit gestreute Verläufe in Markenfarbe haben. Arbeitsflächen bleiben funktional und ruhig.
- **Typografische Präzision:** klare Größen-Hierarchie, ruhige Headlines, viel `letter-spacing` Disziplin, keine dekorativen Schriften.
- **Konsistente Iconographie:** ausschließlich MDI Outline-Icons mit gleicher Größe und Farbverhalten.
- **Light- und Dark-Mode gleichwertig:** alle neuen Stile müssen in beiden Modi funktional und ästhetisch tragen, ausschließlich über Tokens (`color-mix`, CSS-Variablen) gelöst.

**Was weiterhin tabu ist:**
- kein Glassmorphism (echte Backdrop-Blur-Karten),
- kein Neon-/Gaming-Look,
- keine harten, durchgängigen Kontraste,
- keine Mehrfarbigkeit aus dem Akzent-Setup,
- keine dauerhaften Animationen oder Parallax-Spielereien.

## Visuelle Identität
Markenwirkung basiert auf neutralen, leicht warmen Flächen mit kontrolliertem Grün. Das Grün stammt aus dem Logo (Stapel-/Ordner-Idee) und steht für Ablage, Struktur und „self-hosted tool" statt „Social App". Akzent-Lime nur als gezielter Akzent-Glow im Branding und in Marketing-Sektionen.

Die App ist **light-first**, Dark-Mode ist gleichwertig zu pflegen. Neue Komponenten beziehen Farben aus Design-Tokens.

## Farbpalette

### Primärfarben (Light)
- **Primary 800:** `#10421E` – tiefster Markenton, Texte auf Light-Surface.
- **Primary 700:** `#1C652F` – Primärbuttons, aktive Icons, Fokusrahmen.
- **Primary 600:** `#2E7D32` – Hover-Zustände, aktive Navigation.
- **Primary 500:** `#3C8F42` – ausgewählte Einträge, Badges, bestätigende States.
- **Primary 300:** `#A8D5A2` – weiche Hintergründe für Auswahlflächen.
- **Primary 100:** `#EAF5E8` – sehr subtile Hervorhebungen, Tints.
- **Primary 050:** `#F4FAF1` – fast unsichtbare Pflasterfläche für Hero-Glows.

### Akzent
- **Accent Lime:** `#B7E36B` – sparsam: Logo-Glow, kleine Highlights, Upload-Fortschritt.

### Neutrale (Light)
- **Background:** `#F5F8F2`
- **Background Tint:** `#EEF3EA` – ambient Hintergrund-Verlauf.
- **Surface:** `#FFFFFF` – Karten, Panels, Dialoge.
- **Surface Alt:** `#F1F4EE` – Toolbar, Tabellenkopf, Sekundärflächen.
- **Surface Elevated:** `#FBFCF8` – höhere Layer (Drawer-Inhalt, Dropdowns).
- **Border:** `#DCE3D6`
- **Border Strong:** `#C5CFBE`
- **Border Subtle:** `#E8EDE2` – innere Trennlinien.

### Text (Light)
- **Text Primary:** `#1A2A1E`
- **Text Secondary:** `#5A6A5E`
- **Text Muted:** `#7B897F`
- **Text On Primary:** `#FFFFFF`

### Dark Mode
Dark-Mode wird vollständig über Tokens gespiegelt. Eckwerte:
- Background: `#0E1115`
- Surface: `#161A20`
- Surface Alt: `#1B2028`
- Surface Elevated: `#1F252E`
- Border: `#2A323D`
- Border Strong: `#3A4452`
- Text Primary: `#E9EFF3`
- Text Secondary: `#B6BEC8`
- Primary 700 (dark): `#5FB968`
- Primary 600 (dark): `#4EA758`
- Primary 100 (dark): `#1F2922`

### Status
- **Success:** `#2E7D32`
- **Warning:** `#B7791F`
- **Danger:** `#C0392B`
- **Info:** `#2F6FB3`

## Typografie
Neutral, gut lesbar, unauffällig modern – keine dekorativen Schriften.

**Stack:** `Inter, "Segoe UI", Roboto, system-ui, sans-serif`

**Skala (rem-orientiert, fixe px-Breakpoints, keine viewport-Skalierung):**
- `--font-size-2xs`: 11px – Status-Labels, Mini-Meta.
- `--font-size-xs`: 12px – Tabellenmeta, Helper-Text.
- `--font-size-sm`: 13px – sekundärer UI-Text.
- `--font-size-md`: 14px – Standard-UI-Text, Listen.
- `--font-size-lg`: 16px – akzentuierte UI-Hervorhebung.
- `--font-size-xl`: 20px – Bereichsüberschriften.
- `--font-size-2xl`: 26px – Seitenüberschriften.
- `--font-size-3xl`: 32px – Display-Headlines (Hero).
- `--font-size-display`: 44px – sehr seltene Marketing-Display-Texte.

**Gewichte:**
- 400 für Fließtext.
- 500 für UI-Text und Labels.
- 600 für Titel, Kicker, aktive Items.
- 700 nur sehr gezielt (Display-Headlines, Logo-Wortmarke).

**Letter-Spacing-Disziplin:**
- Display-Headlines: leicht negatives Tracking (`-0.01em` bis `-0.02em`).
- Kicker/Labels (uppercase): `0.05em` bis `0.08em`.
- Standard: `0`.

## Spacing
Modulare Skala in 4er-Schritten:

```
--space-1: 4px
--space-2: 8px
--space-3: 12px
--space-4: 16px
--space-5: 20px
--space-6: 24px
--space-7: 28px
--space-8: 32px
--space-10: 40px
--space-12: 48px
--space-16: 64px
```

Hauptseiten: `--hoard-page-width` 1120–1200px, Padding orientiert sich an `--space-6`/`--space-8`.

## Formensprache (Border-Radien)
- `--radius-xs`: 6px – kleine Pills, Status-Badges.
- `--radius-sm`: 10px – Buttons, kleine Controls.
- `--radius-md`: 14px – Inputs, Dropdowns, Listzeilen.
- `--radius-lg`: 18px – Cards, Panels.
- `--radius-xl`: 22px – Hero-Shells, Modals.
- `--radius-full`: 999px – nur für Avatar/Tag-Pills.

Keine pillenförmigen Vollflächen als Grundstil.

## Schatten & Tiefe
Mehrstufiges, sehr ruhiges Schatten-System:

```
--shadow-xs: 0 1px 1px rgba(20, 30, 22, 0.04);
--shadow-sm: 0 2px 6px rgba(20, 30, 22, 0.06);
--shadow-md: 0 8px 22px rgba(20, 30, 22, 0.08);
--shadow-lg: 0 18px 44px rgba(20, 30, 22, 0.12);
--shadow-glow: 0 12px 36px rgba(28, 101, 47, 0.18);
```

Regeln:
- Panels: `--shadow-sm`.
- Hover-Lift max. 2 px, nur bei klar interaktiven Elementen.
- Dropdowns/Modals: `--shadow-md` bis `--shadow-lg`.
- `--shadow-glow` ausschließlich für Brand-Bereiche (Login-Hero, Welcome-Hero).
- Keine farbigen Schatten in Arbeitsflächen.

## Motion
- Standard-Easing: `cubic-bezier(0.2, 0, 0, 1)`.
- `--transition-fast`: 160 ms (Hover, Buttons, Listzeilen).
- `--transition-medium`: 220 ms (Route-Wechsel, Banner).
- `--transition-slow`: 320 ms (Hero-Enter, Drawer).
- Globale Page-Enter-Animation: weicher Y-Slide + Fade (≤ 8 px).
- `prefers-reduced-motion`: alle Transitions auf 1 ms reduzieren, keine Translates.

## App-Shell

### Topbar
- Höhe ca. 64 px, opaker `surface`-Hintergrund, dünne Bottom-Border.
- Branding links: Icon + Wortmarke + dezenter Subtext („Self-hosted Workspace").
- Page-Kontext (Name + Beschreibung) als sekundäre Info, nur ab `>1180px`.
- Rechts: Theme-Toggle, Account-Menü oder Login-Button.
- Subtile bottom shadow (`--shadow-xs`).

### Sidebar
- Breite 268–284 px, Hintergrund `surface-alt`, leicht abgesetzt.
- Active-Indicator: linker, animierter, vertikaler Strich (`--color-primary-600`) + grüne Tint-Fläche + dunklerer Text.
- Hover: leichte Tint-Fläche, kein Scaling.
- Sektionen mit Kicker-Labels (`Navigation`, `Admin`).
- Mindesthöhe pro Item: 44 px (Desktop), 48 px (Mobile).
- Mobile = Bottom-Sheet-Drawer mit abgerundeten Top-Ecken.

### Footer
- Sehr ruhig, kompakt, `surface` mit dünner oberer Border.
- Links nur auf rechtlich/strukturell wichtige Routen (Impressum etc.).
- Mobile: in Grid mit Tap-Größen ≥ 44 px.

## Komponenten

### Cards / Panels
- Hintergrund: `surface` mit subtilem 180°-Verlauf zu `surface-alt`.
- Border: `--color-border`.
- Radius: `--radius-lg`.
- Padding: `--space-6` (Standard), kleinere Inhalte `--space-4`.
- Hover (nur klar interaktive Cards): Border in Primary-300-Mix, `--shadow-md`, 2 px Y-Lift.

### Buttons
- **Primary:** grüner Hintergrund (`--color-primary-700`), weiße Schrift, `--shadow-xs`. Hover: `--color-primary-600` + leichter Glow. Active: ohne Lift.
- **Outlined:** transparenter Hintergrund, `--color-border-strong`, dunkler Text. Hover: leichte Primary-Tint-Fläche, Border zu Primary-Mix.
- **Text/Tertiary:** für Zeilenaktionen, Toolbar, Nav. Hover: Surface-Tint.
- **Icon-Buttons:** mind. 40×40 (Desktop), 44×44 (Mobile).
- Letter-Spacing 0, kein Uppercase.
- Pro Bereich genau **eine Primäraktion**.

### Inputs
- Outline-Variante, `surface` Hintergrund.
- Border `--color-border-strong`, Focus-Ring 3 px Primary-300-Tint + Primary-600-Border.
- Labels oberhalb (Vuetify-Outlined-Label), keine reinen Placeholder.
- Mind. 44 px Höhe auf Mobile.

### Listen / Tabellen
- Tabelle: `surface` Hintergrund, abgesetzter Tabellen-Header (`surface-alt`).
- Hover: sehr subtile Primary-Tint-Tönung.
- Selected Row: Primary-100 Hintergrund, `--color-primary-700` Text.
- Border-Bottom in `--color-border-subtle`.
- `hoard-list-row` (Datei-/Item-Zeilen): luftiges Padding, klare Spalten, `transform: translateX(2px)` beim Hover.

### Status-Pills (`hoard-status`)
- Kompakt, `--radius-xs`, mit dezentem Text/Background-Tint pro Status (Success/Info/Warning/Danger/Neutral).
- Optional kleines Punktindikator-Dot vor dem Text.

### Banner-Stack
- Position: fixiert unten rechts (Desktop), unten zentriert (Mobile).
- Stapelbar, einzeln dismissable.
- Opake Hintergründe, `--shadow-md`, sauber lesbar auf jedem Inhalt.
- Enter/Leave: 180 ms Fade + 10 px Y.

## Hero-/Marketing-Bereiche
- Erlauben einen **ambient Verlauf** (`hoard-panel-gradient` + Variablen).
- Optional dezenter „Spotlight"-Glow (radialer Verlauf, `--color-primary-300` mit niedriger Opazität, blur).
- Inhaltsbreite max ~64ch.
- Display-Headlines mit `--font-size-3xl` oder `--font-size-display` (nur Hero).
- Hero-Tags (`hoard-chip`/`hoard-tag`) als kompakte, dezent gerahmte Pills.

## Vorschau-Bereich (Files)
- **PDF-Vorschau:** neutraler Hintergrund, weiße „Papier"-Fläche mit `--shadow-md`, genug Rand. Controls minimal.
- **Bildvorschau:** dunklerer neutraler Viewer-Hintergrund nur, wenn das Bild dadurch besser wirkt; UI-Chrome konsistent.
- **Markdown-Editor/Reader:** wirkt wie ein Arbeitsdokument, nicht wie Blogpost. Lesbreite ~70ch, klare Heading-Hierarchie, sehr ruhige Codeblöcke.

## Empty-/Loading-States
- Empty: kleines Outline-Icon in Primary-Tint, kurzer Titel, ein Satz Begründung, eine klare CTA.
- Loading: Skeletons (graue Pulslinien) bevorzugt, ansonsten ein kleiner zentraler Spinner mit beschreibendem Text. Keine flackernden Spinner-Felder.

## Responsive Verhalten
Desktop ist Hauptfokus, Mobile muss aber sauber funktionieren.

### Breakpoints
- `@media (width <= 1180px)` – Topbar-Kontextleiste verkürzen.
- `@media (width <= 960px)` – Sidebar wird Bottom-Drawer; Karten-/Grid-Bereiche werden einspaltig; Spacing wird reduziert.
- `@media (width <= 600px)` – CTAs full-width; Schriften minimal kompakter; Footer als Grid; Status-Pills behalten Lesbarkeit.

### Pflicht
- Desktop-Baseregeln nicht anfassen, nur Mobile-Overrides per Media Query.
- Touch-Größen: Buttons ≥ 44 px, Icon-Buttons ≥ 44×44, Nav-Items ≥ 48 px.
- Safe-Areas via `env(safe-area-inset-*)` (Topbar-Padding, Footer/Drawer Bottom).
- Banner-Stack respektiert Safe-Area Bottom.
- Pflicht-Viewports im QA: `360x800`, `390x844`, `768x1024`, `1024x768`, `>=1280` – jeweils Light + Dark.

## Interaktionsprinzipien
- Primäraktionen klar sichtbar.
- Destruktives nie direkt neben Standardaktion.
- Dateizeilen sind klickbar, dürfen aber nicht wie Buttons aussehen.
- Hover, Active und Selected klar unterscheidbar (unterschiedliche Tints/Outlines).
- Fokus für Tastaturbedienung immer sichtbar (`outline: 2px solid var(--color-primary-500); outline-offset: 2px`).

## Designregeln für die Umsetzung

### Immer
- Tokens nutzen (Farben, Spacing, Radius, Shadow).
- Patterns wiederverwenden (`hoard-panel`, `hoard-page`, `hoard-action-row`, `hoard-kicker`, `hoard-status`, `hoard-chip`, `hoard-spotlight`).
- Light- und Dark-Mode gleichwertig prüfen.
- Animationen kurz halten und `prefers-reduced-motion` respektieren.

### Vermeiden
- zu viele Karten ohne Funktion,
- zu viele Akzentfarben gleichzeitig,
- harte 1:1-Kontraste,
- echte Glasflächen / Backdrop-Blur,
- dauernde Bewegungen,
- Schriftgrößen, die mit der Viewport-Breite skalieren.

## Beispiel: Design-Tokens

```css
:root {
  /* Surfaces */
  --color-bg: #f5f8f2;
  --color-bg-tint: #eef3ea;
  --color-surface: #ffffff;
  --color-surface-alt: #f1f4ee;
  --color-surface-elevated: #fbfcf8;

  --color-border: #dce3d6;
  --color-border-strong: #c5cfbe;
  --color-border-subtle: #e8ede2;

  /* Text */
  --color-text: #1a2a1e;
  --color-text-secondary: #5a6a5e;
  --color-text-muted: #7b897f;
  --color-text-on-primary: #ffffff;

  /* Brand */
  --color-primary-800: #10421e;
  --color-primary-700: #1c652f;
  --color-primary-600: #2e7d32;
  --color-primary-500: #3c8f42;
  --color-primary-300: #a8d5a2;
  --color-primary-100: #eaf5e8;
  --color-primary-050: #f4faf1;
  --color-accent-lime: #b7e36b;

  /* Status */
  --color-success: #2e7d32;
  --color-warning: #b7791f;
  --color-danger: #c0392b;
  --color-info: #2f6fb3;

  /* Radius */
  --radius-xs: 6px;
  --radius-sm: 10px;
  --radius-md: 14px;
  --radius-lg: 18px;
  --radius-xl: 22px;
  --radius-full: 999px;

  /* Shadows */
  --shadow-xs: 0 1px 1px rgba(20, 30, 22, 0.04);
  --shadow-sm: 0 2px 6px rgba(20, 30, 22, 0.06);
  --shadow-md: 0 8px 22px rgba(20, 30, 22, 0.08);
  --shadow-lg: 0 18px 44px rgba(20, 30, 22, 0.12);
  --shadow-glow: 0 12px 36px rgba(28, 101, 47, 0.18);

  /* Spacing */
  --space-1: 4px;
  --space-2: 8px;
  --space-3: 12px;
  --space-4: 16px;
  --space-5: 20px;
  --space-6: 24px;
  --space-7: 28px;
  --space-8: 32px;
  --space-10: 40px;
  --space-12: 48px;
  --space-16: 64px;

  /* Motion */
  --transition-fast: 160ms cubic-bezier(0.2, 0, 0, 1);
  --transition-medium: 220ms cubic-bezier(0.2, 0, 0, 1);
  --transition-slow: 320ms cubic-bezier(0.2, 0, 0, 1);
}
```

## Kurzfassung als Design-Leitlinie
Wenn du bei einer UI-Entscheidung unsicher bist:

**Lieber präzise als spektakulär. Lieber ruhige Flächen mit Charakter als visuelle Effekte. Grün ist Identität, nicht Dekoration. Jedes Element muss eine Funktion haben – sonst fliegt es raus.**
