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} +
+
+ Synchronisiere... +
+ {/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';