diff --git a/apps/calendar/apps/web/src/routes/settings/+page.svelte b/apps/calendar/apps/web/src/routes/settings/+page.svelte
index fe7fafea7..cb1b7436b 100644
--- a/apps/calendar/apps/web/src/routes/settings/+page.svelte
+++ b/apps/calendar/apps/web/src/routes/settings/+page.svelte
@@ -4,20 +4,23 @@
import { _ } from 'svelte-i18n';
import { authStore } from '$lib/stores/auth.svelte';
import { theme } from '$lib/stores/theme';
- import { settingsStore, type WeekStartDay, type TimeFormat } from '$lib/stores/settings.svelte';
+ import { userSettings } from '$lib/stores/user-settings.svelte';
+ import { settingsStore, type WeekStartDay, type TimeFormat, type AllDayDisplayMode } from '$lib/stores/settings.svelte';
import { setLocale, supportedLocales, type SupportedLocale } from '$lib/i18n';
import { THEME_DEFINITIONS } from '@manacore/shared-theme';
+ import { GlobalSettingsSection } from '@manacore/shared-ui';
import type { CalendarViewType } from '@calendar/shared';
// Get current locale from svelte-i18n
import { locale } from 'svelte-i18n';
- onMount(() => {
+ onMount(async () => {
if (!authStore.isAuthenticated) {
goto('/login');
return;
}
settingsStore.initialize();
+ await userSettings.load();
});
function handleThemeChange(mode: 'light' | 'dark' | 'system') {
@@ -275,6 +278,85 @@
+
+
+
+
+
+ {#if settingsStore.filterHoursEnabled}
+
+
+ Sichtbare Stunden
+ Zeitbereich der in der Kalenderansicht angezeigt wird
+
+
+
+ {/if}
+
+
+
+ Ganztägige Termine
+ Wie sollen ganztägige Termine angezeigt werden?
+
+
+
+
+
+
@@ -316,6 +398,11 @@
+
+
+
Konto
@@ -577,4 +664,38 @@
.text-destructive {
color: hsl(var(--color-error));
}
+
+ /* Hour range settings */
+ .hour-range-setting {
+ padding-left: 2rem;
+ border-left: 2px solid hsl(var(--color-primary) / 0.3);
+ margin-left: 0.5rem;
+ }
+
+ .hour-range-inputs {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ }
+
+ .hour-input-group {
+ display: flex;
+ flex-direction: column;
+ gap: 0.25rem;
+ }
+
+ .hour-input-group label {
+ font-size: 0.75rem;
+ color: hsl(var(--color-muted-foreground));
+ }
+
+ .hour-select {
+ width: 100px;
+ }
+
+ .hour-separator {
+ font-size: 1.25rem;
+ color: hsl(var(--color-muted-foreground));
+ margin-top: 1.25rem;
+ }
diff --git a/apps/chat/apps/web/src/routes/(protected)/settings/+page.svelte b/apps/chat/apps/web/src/routes/(protected)/settings/+page.svelte
index 0fca90888..62076d9cf 100644
--- a/apps/chat/apps/web/src/routes/(protected)/settings/+page.svelte
+++ b/apps/chat/apps/web/src/routes/(protected)/settings/+page.svelte
@@ -1,5 +1,7 @@
@@ -208,6 +215,9 @@
+
+
+
{#snippet icon()}
diff --git a/apps/contacts/apps/web/src/app.css b/apps/contacts/apps/web/src/app.css
index c796da693..0a4c926fc 100644
--- a/apps/contacts/apps/web/src/app.css
+++ b/apps/contacts/apps/web/src/app.css
@@ -124,24 +124,9 @@
}
}
-/* Legacy color variable compatibility */
+/* Shadow variables */
@layer base {
:root {
- --color-primary: var(--primary);
- --color-background: var(--background);
- --color-surface: var(--card);
- --color-surface-elevated: var(--card);
- --color-text-primary: var(--foreground);
- --color-text-secondary: var(--muted-foreground);
- --color-text-tertiary: var(--muted-foreground);
- --color-border: var(--border);
- --color-border-hover: var(--border);
- --color-success: 142 76% 36%;
- --color-warning: 38 92% 50%;
- --color-error: 0 84% 60%;
- --color-info: 217 91% 60%;
-
- /* Shadows */
--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
diff --git a/apps/contacts/apps/web/src/routes/(app)/mana/+page.svelte b/apps/contacts/apps/web/src/routes/(app)/mana/+page.svelte
index 63b883afb..a3e5f7e91 100644
--- a/apps/contacts/apps/web/src/routes/(app)/mana/+page.svelte
+++ b/apps/contacts/apps/web/src/routes/(app)/mana/+page.svelte
@@ -1,14 +1,15 @@
@@ -34,6 +35,6 @@
min-height: 100%;
width: 100%;
overflow-x: hidden;
- background-color: hsl(var(--color-background));
+ background-color: hsl(var(--background));
}
diff --git a/apps/contacts/apps/web/src/routes/(app)/settings/+page.svelte b/apps/contacts/apps/web/src/routes/(app)/settings/+page.svelte
new file mode 100644
index 000000000..102620d86
--- /dev/null
+++ b/apps/contacts/apps/web/src/routes/(app)/settings/+page.svelte
@@ -0,0 +1,100 @@
+
+
+
+ Einstellungen - Kontakte
+
+
+
+
+
+ {#snippet icon()}
+
+ {/snippet}
+
+
+
+
Farbmodus
+
+ Wähle zwischen Hell, Dunkel oder System
+
+
+ {#each ['light', 'dark', 'system'] as mode}
+
+ {/each}
+
+
+
+
+
Theme
+
Wähle eine Farbpalette
+
+ {#each theme.variants as variant}
+
+ {/each}
+
+
+
+
+
+
+
+
+
+
+ {#snippet icon()}
+
+ {/snippet}
+
+
+
+ 1.0.0
+
+
+
+
diff --git a/apps/manadeck/apps/web/src/routes/(app)/settings/+page.svelte b/apps/manadeck/apps/web/src/routes/(app)/settings/+page.svelte
new file mode 100644
index 000000000..ca62de2a0
--- /dev/null
+++ b/apps/manadeck/apps/web/src/routes/(app)/settings/+page.svelte
@@ -0,0 +1,100 @@
+
+
+
+ Einstellungen - ManaDeck
+
+
+
+
+
+ {#snippet icon()}
+
+ {/snippet}
+
+
+
+
Farbmodus
+
+ Wähle zwischen Hell, Dunkel oder System
+
+
+ {#each ['light', 'dark', 'system'] as mode}
+
+ {/each}
+
+
+
+
+
Theme
+
Wähle eine Farbpalette
+
+ {#each theme.variants as variant}
+
+ {/each}
+
+
+
+
+
+
+
+
+
+
+ {#snippet icon()}
+
+ {/snippet}
+
+
+
+ 1.0.0
+
+
+
+
diff --git a/apps/picture/apps/web/src/routes/app/settings/+page.svelte b/apps/picture/apps/web/src/routes/app/settings/+page.svelte
new file mode 100644
index 000000000..6afe08b2b
--- /dev/null
+++ b/apps/picture/apps/web/src/routes/app/settings/+page.svelte
@@ -0,0 +1,100 @@
+
+
+
+ Einstellungen - Picture
+
+
+
+
+
+ {#snippet icon()}
+
+ {/snippet}
+
+
+
+
Farbmodus
+
+ Wähle zwischen Hell, Dunkel oder System
+
+
+ {#each ['light', 'dark', 'system'] as mode}
+
+ {/each}
+
+
+
+
+
Theme
+
Wähle eine Farbpalette
+
+ {#each theme.variants as variant}
+
+ {/each}
+
+
+
+
+
+
+
+
+
+
+ {#snippet icon()}
+
+ {/snippet}
+
+
+
+ 1.0.0
+
+
+
+
diff --git a/apps/presi/apps/web/src/routes/settings/+page.svelte b/apps/presi/apps/web/src/routes/settings/+page.svelte
index da88bc280..a5a0444fa 100644
--- a/apps/presi/apps/web/src/routes/settings/+page.svelte
+++ b/apps/presi/apps/web/src/routes/settings/+page.svelte
@@ -1,7 +1,9 @@
@@ -160,6 +167,9 @@
+
+
+
- import { Settings } from 'lucide-svelte';
+ import { onMount } from 'svelte';
import { theme } from '$lib/stores/theme.svelte';
+ import { userSettings } from '$lib/stores/user-settings.svelte';
import { THEME_DEFINITIONS } from '@manacore/shared-theme';
+ import {
+ SettingsPage,
+ SettingsSection,
+ SettingsCard,
+ SettingsRow,
+ GlobalSettingsSection,
+ } from '@manacore/shared-ui';
+
+ onMount(async () => {
+ await userSettings.load();
+ });
Einstellungen - Storage
-
-
+
+
+
+ {#snippet icon()}
+
+ {/snippet}
-
-
Darstellung
-
-
-
- Farbmodus
- Wähle zwischen Hell, Dunkel oder System
-
-
-
-
-
-
-
-
- Theme
- Wähle eine Farbpalette
-
-
-
-
-
-
Speicher
-
-
-
-
Speicherplatz
-
Dein genutzter Speicherplatz
+
+
Theme
+
Wähle eine Farbpalette
+
+ {#each theme.variants as variant}
+
+ {/each}
+
-
-
+
+
+
+
+
+ {#snippet icon()}
+
+ {/snippet}
+
+
+
+
Speicherplatz
+
Dein genutzter Speicherplatz
+
+
2.5 GB von 10 GB verwendet
- 2.5 GB von 10 GB verwendet
-
-
+
+
-
-
Über
+
+
-
-
- Version
- Storage App v1.0.0
-
-
-
-
+
+
+ {#snippet icon()}
+
+ {/snippet}
-
+
+
+ 1.0.0
+
+
+
+
diff --git a/apps/zitare/apps/web/src/routes/settings/+page.svelte b/apps/zitare/apps/web/src/routes/settings/+page.svelte
index 19b8efc19..07bb9eade 100644
--- a/apps/zitare/apps/web/src/routes/settings/+page.svelte
+++ b/apps/zitare/apps/web/src/routes/settings/+page.svelte
@@ -2,6 +2,7 @@
import { onMount } from 'svelte';
import { goto } from '$app/navigation';
import { theme } from '$lib/stores/theme';
+ import { userSettings } from '$lib/stores/user-settings.svelte';
import { THEME_DEFINITIONS } from '@manacore/shared-theme';
import { ThemeColorPreview } from '@manacore/shared-theme-ui';
import {
@@ -12,6 +13,7 @@
SettingsToggle,
SettingsDangerZone,
SettingsDangerButton,
+ GlobalSettingsSection,
} from '@manacore/shared-ui';
// Settings state
@@ -19,12 +21,15 @@
let userName = $state('');
// Load settings from localStorage on mount
- onMount(() => {
+ onMount(async () => {
const savedLanguage = localStorage.getItem('language');
const savedUserName = localStorage.getItem('userName');
if (savedLanguage) language = savedLanguage as 'de' | 'en';
if (savedUserName) userName = savedUserName;
+
+ // Load user settings from server
+ await userSettings.load();
});
// Save settings to localStorage
@@ -227,6 +232,9 @@
+
+
+
+ import type { UserSettingsStore, NavPosition, ThemeMode } from '@manacore/shared-theme';
+ import SettingsSection from './SettingsSection.svelte';
+ import SettingsCard from './SettingsCard.svelte';
+
+ interface Props {
+ /** User settings store instance */
+ userSettings: UserSettingsStore;
+ /** Whether to show navigation settings */
+ showNavigation?: boolean;
+ /** Whether to show theme settings */
+ showTheme?: boolean;
+ /** Whether to show language settings */
+ showLanguage?: boolean;
+ /** Section title */
+ title?: string;
+ /** Section description */
+ description?: string;
+ }
+
+ let {
+ userSettings,
+ showNavigation = true,
+ showTheme = true,
+ showLanguage = true,
+ title = 'App-Einstellungen',
+ description = 'Diese Einstellungen gelten für alle Mana Apps',
+ }: Props = $props();
+
+ // Navigation position handler
+ async function handleNavPositionChange(position: NavPosition) {
+ await userSettings.updateGlobal({
+ nav: { ...userSettings.globalSettings.nav, desktopPosition: position },
+ });
+ }
+
+ // Sidebar collapsed handler
+ async function handleSidebarChange(collapsed: boolean) {
+ await userSettings.updateGlobal({
+ nav: { ...userSettings.globalSettings.nav, sidebarCollapsed: collapsed },
+ });
+ }
+
+ // Theme mode handler
+ async function handleThemeModeChange(mode: ThemeMode) {
+ await userSettings.updateGlobal({
+ theme: { ...userSettings.globalSettings.theme, mode },
+ });
+ }
+
+ // Color scheme handler
+ async function handleColorSchemeChange(colorScheme: string) {
+ await userSettings.updateGlobal({
+ theme: { ...userSettings.globalSettings.theme, colorScheme },
+ });
+ }
+
+ // Locale handler
+ async function handleLocaleChange(locale: string) {
+ await userSettings.updateGlobal({ locale });
+ }
+
+ const colorSchemes = [
+ { id: 'ocean', label: 'Ozean', color: 'bg-blue-500' },
+ { id: 'nature', label: 'Natur', color: 'bg-green-500' },
+ { id: 'lume', label: 'Lume', color: 'bg-amber-500' },
+ { id: 'stone', label: 'Stein', color: 'bg-slate-500' },
+ ];
+
+ const languages = [
+ { id: 'de', label: 'DE' },
+ { id: 'en', label: 'EN' },
+ { id: 'fr', label: 'FR' },
+ { id: 'es', label: 'ES' },
+ { id: 'it', label: 'IT' },
+ ];
+
+
+
+ {#snippet icon()}
+
+ {/snippet}
+
+
+
+
{description}
+
+
+ {#if showNavigation}
+
+
+
+ Navigation
+
+
+
+
+
Position (Desktop)
+
+ Position der Navigation auf großen Bildschirmen
+
+
+
+
+
+
+
+
+
+
+
Sidebar eingeklappt
+
Standard-Zustand der Sidebar
+
+
+
+
+ {/if}
+
+ {#if showTheme}
+
+
+
+ Erscheinungsbild
+
+
+
+
+
Farbmodus
+
Hell, Dunkel oder automatisch
+
+
+ {#each ['light', 'dark', 'system'] as mode}
+
+ {/each}
+
+
+
+
+
+
Farbschema
+
Akzentfarbe der Benutzeroberfläche
+
+
+ {#each colorSchemes as scheme}
+
+ {/each}
+
+
+
+ {/if}
+
+ {#if showLanguage}
+
+
+
+ Sprache
+
+
+
+
+
Anzeigesprache
+
Sprache der Benutzeroberfläche
+
+
+ {#each languages as lang}
+
+ {/each}
+
+
+
+ {/if}
+
+
+ {#if userSettings.syncing}
+
+ {/if}
+
+
+
diff --git a/packages/shared-ui/src/settings/index.ts b/packages/shared-ui/src/settings/index.ts
index 6e4d3f0db..1a6bb0e74 100644
--- a/packages/shared-ui/src/settings/index.ts
+++ b/packages/shared-ui/src/settings/index.ts
@@ -6,3 +6,4 @@ export { default as SettingsRow } from './SettingsRow.svelte';
export { default as SettingsToggle } from './SettingsToggle.svelte';
export { default as SettingsDangerZone } from './SettingsDangerZone.svelte';
export { default as SettingsDangerButton } from './SettingsDangerButton.svelte';
+export { default as GlobalSettingsSection } from './GlobalSettingsSection.svelte';