Files
oikos/docs/designs/2026-05-04-settings-sidebar-demo.html
T
Ulas Kalayci 6cdef0102c feat(settings): add dedicated Sync tab with CardDAV contacts integration
- Rename Calendar tab to Synchronization with two sections:
  * Calendar Sync (Google, Apple, CalDAV, ICS)
  * Contact Sync (CardDAV) - NEW
- Add visual tab grouping with CSS separators between sections
- Implement CardDAV account management UI:
  * Add/delete accounts
  * Enable/disable addressbooks
  * Manual sync trigger
  * Connection testing
- Add UX improvements:
  * Status badges (success/error/syncing)
  * Empty states with onboarding
  * Inline help tooltips (prepared)
  * Breadcrumb navigation (prepared)
- Update i18n keys in all 14 locales
- All 109 tests passing

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 21:50:59 +02:00

350 lines
9.9 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Settings Sidebar Navigation - Demo</title>
<style>
:root {
--color-bg: #ffffff;
--color-surface: #fafafa;
--color-surface-2: #f5f5f5;
--color-border: #e5e5e5;
--color-text-primary: #171717;
--color-text-secondary: #737373;
--color-text-tertiary: #a3a3a3;
--color-accent: #4F46E5;
--space-1: 4px;
--space-2: 8px;
--space-3: 12px;
--space-4: 16px;
--space-6: 24px;
--space-8: 32px;
--radius-sm: 4px;
--radius-md: 8px;
--radius-lg: 12px;
--radius-full: 9999px;
--text-xs: 11px;
--text-sm: 13px;
--text-base: 14px;
--text-lg: 16px;
--text-2xl: 24px;
--font-weight-medium: 500;
--font-weight-semibold: 600;
--font-weight-bold: 700;
--target-base: 36px;
--transition-fast: 0.15s ease;
}
@media (prefers-color-scheme: dark) {
:root {
--color-bg: #18181b;
--color-surface: #27272a;
--color-surface-2: #3f3f46;
--color-border: #3f3f46;
--color-text-primary: #fafafa;
--color-text-secondary: #a1a1aa;
--color-text-tertiary: #71717a;
}
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: var(--color-bg);
color: var(--color-text-primary);
}
/* Layout */
.settings-layout {
display: grid;
grid-template-columns: 240px 1fr;
min-height: 100vh;
}
/* Sidebar */
.settings-sidebar {
background: var(--color-surface);
border-right: 1px solid var(--color-border);
padding: var(--space-6) 0;
overflow-y: auto;
}
.settings-sidebar-section {
margin-bottom: var(--space-6);
}
.settings-sidebar-section__header {
display: flex;
align-items: center;
gap: var(--space-2);
padding: 0 var(--space-4);
margin-bottom: var(--space-2);
color: var(--color-text-tertiary);
font-size: var(--text-xs);
font-weight: var(--font-weight-semibold);
text-transform: uppercase;
letter-spacing: 0.05em;
}
.settings-sidebar-section--active .settings-sidebar-section__header {
color: var(--color-accent);
}
.settings-sidebar-pages {
display: flex;
flex-direction: column;
gap: var(--space-1);
}
.settings-sidebar-page {
display: flex;
align-items: center;
gap: var(--space-2);
padding: var(--space-2) var(--space-4);
margin: 0 var(--space-2);
border: none;
border-radius: var(--radius-md);
background: transparent;
color: var(--color-text-secondary);
font-family: inherit;
font-size: var(--text-sm);
font-weight: var(--font-weight-medium);
text-align: left;
cursor: pointer;
transition: background-color var(--transition-fast), color var(--transition-fast);
min-height: var(--target-base);
}
.settings-sidebar-page:hover {
background: var(--color-surface-2);
color: var(--color-text-primary);
}
.settings-sidebar-page--active {
background: color-mix(in srgb, var(--color-accent) 12%, transparent);
color: var(--color-accent);
font-weight: var(--font-weight-semibold);
}
/* Content */
.settings-content {
padding: var(--space-6);
max-width: 900px;
}
.settings-breadcrumb {
margin-bottom: var(--space-6);
padding-bottom: var(--space-4);
border-bottom: 1px solid var(--color-border);
font-size: var(--text-sm);
color: var(--color-text-secondary);
}
.settings-breadcrumb__current {
color: var(--color-text-primary);
font-weight: var(--font-weight-semibold);
}
.settings-page-header__title {
font-size: var(--text-2xl);
font-weight: var(--font-weight-bold);
margin-bottom: var(--space-2);
}
.settings-page-header__description {
font-size: var(--text-base);
color: var(--color-text-secondary);
line-height: 1.6;
margin-bottom: var(--space-6);
}
.settings-card {
background: var(--color-surface);
border-radius: var(--radius-lg);
padding: var(--space-4);
margin-bottom: var(--space-4);
border: 1px solid var(--color-border);
}
.settings-empty-state {
display: flex;
flex-direction: column;
align-items: center;
padding: var(--space-8);
text-align: center;
border: 2px dashed var(--color-border);
border-radius: var(--radius-lg);
background: var(--color-surface-2);
}
.settings-empty-state__title {
font-size: var(--text-lg);
font-weight: var(--font-weight-semibold);
margin: var(--space-4) 0 var(--space-2);
}
.settings-empty-state__description {
color: var(--color-text-secondary);
margin-bottom: var(--space-4);
}
.btn {
padding: var(--space-2) var(--space-4);
border-radius: var(--radius-md);
border: none;
background: var(--color-accent);
color: white;
font-weight: var(--font-weight-medium);
cursor: pointer;
}
.btn:hover {
opacity: 0.9;
}
</style>
</head>
<body>
<div class="settings-layout">
<!-- Sidebar -->
<nav class="settings-sidebar">
<!-- Persönlich -->
<div class="settings-sidebar-section">
<div class="settings-sidebar-section__header">
<span>👤</span>
<span>Persönlich</span>
</div>
<div class="settings-sidebar-pages">
<button class="settings-sidebar-page">
<span>🔐</span>
<span>Konto</span>
</button>
</div>
</div>
<!-- Module -->
<div class="settings-sidebar-section">
<div class="settings-sidebar-section__header">
<span>🧩</span>
<span>Module</span>
</div>
<div class="settings-sidebar-pages">
<button class="settings-sidebar-page settings-sidebar-page--active">
<span>⚙️</span>
<span>Allgemein</span>
</button>
<button class="settings-sidebar-page">
<span>🍽️</span>
<span>Mahlzeiten</span>
</button>
<button class="settings-sidebar-page">
<span>💰</span>
<span>Budget</span>
</button>
<button class="settings-sidebar-page">
<span>🛒</span>
<span>Einkauf</span>
</button>
</div>
</div>
<!-- Synchronisation -->
<div class="settings-sidebar-section settings-sidebar-section--active">
<div class="settings-sidebar-section__header">
<span>🔄</span>
<span>Synchronisation</span>
</div>
<div class="settings-sidebar-pages">
<button class="settings-sidebar-page">
<span>📅</span>
<span>Kalender</span>
</button>
<button class="settings-sidebar-page">
<span>👥</span>
<span>Kontakte</span>
</button>
</div>
</div>
<!-- Administration -->
<div class="settings-sidebar-section">
<div class="settings-sidebar-section__header">
<span>🛡️</span>
<span>Administration</span>
</div>
<div class="settings-sidebar-pages">
<button class="settings-sidebar-page">
<span>👨‍👩‍👧‍👦</span>
<span>Familie</span>
</button>
<button class="settings-sidebar-page">
<span>🔑</span>
<span>API-Tokens</span>
</button>
<button class="settings-sidebar-page">
<span>💾</span>
<span>Backup</span>
</button>
</div>
</div>
</nav>
<!-- Content -->
<main class="settings-content">
<nav class="settings-breadcrumb">
Einstellungen Module <span class="settings-breadcrumb__current">Allgemein</span>
</nav>
<header class="settings-page-header">
<h1 class="settings-page-header__title">Allgemein</h1>
<p class="settings-page-header__description">
Grundlegende Einstellungen für Design, Sprache und Module.
</p>
</header>
<div class="settings-card">
<h3 style="margin-bottom: 12px;">Design</h3>
<p style="color: var(--color-text-secondary); font-size: var(--text-sm);">
Wähle zwischen hellem, dunklem oder System-Modus.
</p>
</div>
<div class="settings-card">
<h3 style="margin-bottom: 12px;">Sprache</h3>
<p style="color: var(--color-text-secondary); font-size: var(--text-sm);">
Ändere die Anzeigesprache der Anwendung.
</p>
</div>
<!-- Demo: Kontakte-Sync Page -->
<div style="display: none;">
<nav class="settings-breadcrumb">
Einstellungen Synchronisation <span class="settings-breadcrumb__current">Kontakte</span>
</nav>
<header class="settings-page-header">
<h1 class="settings-page-header__title">Kontakte-Synchronisation</h1>
<p class="settings-page-header__description">
Verbinde mehrere CardDAV-Konten und synchronisiere deine Kontakte mit iCloud, Nextcloud und anderen Diensten.
</p>
</header>
<div class="settings-empty-state">
<span style="font-size: 48px;">📇</span>
<h3 class="settings-empty-state__title">Noch keine CardDAV-Konten</h3>
<p class="settings-empty-state__description">
Füge dein erstes CardDAV-Konto hinzu, um Kontakte zu synchronisieren.
</p>
<button class="btn">+ CardDAV-Konto hinzufügen</button>
</div>
</div>
</main>
</div>
</body>
</html>