diff --git a/apps/chat/apps/web/package.json b/apps/chat/apps/web/package.json index f9eab5ce6..c9cc9d27b 100644 --- a/apps/chat/apps/web/package.json +++ b/apps/chat/apps/web/package.json @@ -34,6 +34,7 @@ "dependencies": { "@chat/types": "workspace:*", "@manacore/shared-api-client": "workspace:*", + "@manacore/shared-app-onboarding": "workspace:*", "@manacore/shared-auth": "workspace:*", "@manacore/shared-auth-ui": "workspace:*", "@manacore/shared-branding": "workspace:*", diff --git a/apps/chat/apps/web/src/lib/stores/app-onboarding.svelte.ts b/apps/chat/apps/web/src/lib/stores/app-onboarding.svelte.ts new file mode 100644 index 000000000..891f13ed3 --- /dev/null +++ b/apps/chat/apps/web/src/lib/stores/app-onboarding.svelte.ts @@ -0,0 +1,61 @@ +import { createAppOnboardingStore, type AppOnboardingStep } from '@manacore/shared-app-onboarding'; +import { userSettings } from './user-settings.svelte'; + +/** + * Chat-specific onboarding steps + */ +const chatOnboardingSteps: AppOnboardingStep[] = [ + { + id: 'defaultModel', + type: 'select', + question: 'Welches Modell bevorzugst du?', + emoji: '💬', + gradient: { from: 'blue-500', to: 'blue-700' }, + options: [ + { + id: 'local', + label: 'Lokale Modelle', + description: 'Kostenlos, läuft auf eigenem Server', + emoji: '🏠', + }, + { + id: 'cloud', + label: 'Cloud-Modelle', + description: 'Höhere Qualität, kostenpflichtig', + emoji: '☁️', + }, + { + id: 'auto', + label: 'Automatisch', + description: 'Bestes Modell je nach Aufgabe (Empfohlen)', + emoji: '🤖', + }, + ], + defaultValue: 'auto', + }, + { + id: 'welcome', + type: 'info', + question: 'Dein Chat ist bereit!', + description: 'Hier sind einige Tipps:', + emoji: '🎉', + gradient: { from: 'primary', to: 'primary/70' }, + bullets: [ + 'Wähle verschiedene KI-Modelle je nach Aufgabe', + 'Nutze Konversationen, um Chatverläufe zu organisieren', + 'Lokale Modelle sind kostenlos und datenschutzfreundlich', + 'Cloud-Modelle bieten höhere Qualität für komplexe Aufgaben', + ], + }, +]; + +/** + * Chat app onboarding store + */ +export const chatOnboarding = createAppOnboardingStore({ + appId: 'chat', + steps: chatOnboardingSteps, + userSettings, + onComplete: async () => {}, + onSkip: async () => {}, +}); diff --git a/apps/chat/apps/web/src/routes/(protected)/+layout.svelte b/apps/chat/apps/web/src/routes/(protected)/+layout.svelte index 96a3cd4e0..5cb638b61 100644 --- a/apps/chat/apps/web/src/routes/(protected)/+layout.svelte +++ b/apps/chat/apps/web/src/routes/(protected)/+layout.svelte @@ -22,6 +22,8 @@ import { getLanguageDropdownItems, getCurrentLanguageLabel } from '@manacore/shared-i18n'; import { setLocale, supportedLocales } from '$lib/i18n'; import type { LayoutData } from './$types'; + import { chatOnboarding } from '$lib/stores/app-onboarding.svelte'; + import { MiniOnboardingModal } from '@manacore/shared-app-onboarding'; // App switcher items const appItems = getPillAppItems('chat'); @@ -235,6 +237,11 @@ {/if} + + + {#if chatOnboarding.shouldShow} + + {/if} {/if} diff --git a/apps/clock/apps/web/package.json b/apps/clock/apps/web/package.json index f96489bf3..61d10b1d5 100644 --- a/apps/clock/apps/web/package.json +++ b/apps/clock/apps/web/package.json @@ -37,6 +37,7 @@ "dependencies": { "@clock/shared": "workspace:*", "@manacore/shared-api-client": "workspace:*", + "@manacore/shared-app-onboarding": "workspace:*", "@manacore/shared-auth": "workspace:*", "@manacore/shared-auth-ui": "workspace:*", "@manacore/shared-branding": "workspace:*", diff --git a/apps/clock/apps/web/src/lib/stores/app-onboarding.svelte.ts b/apps/clock/apps/web/src/lib/stores/app-onboarding.svelte.ts new file mode 100644 index 000000000..7abf0417e --- /dev/null +++ b/apps/clock/apps/web/src/lib/stores/app-onboarding.svelte.ts @@ -0,0 +1,68 @@ +import { createAppOnboardingStore, type AppOnboardingStep } from '@manacore/shared-app-onboarding'; +import { userSettings } from './user-settings.svelte'; + +/** + * Clock-specific onboarding steps + */ +const clockOnboardingSteps: AppOnboardingStep[] = [ + { + id: 'defaultTimer', + type: 'select', + question: 'Welche Timer-Dauer nutzt du am häufigsten?', + description: 'Du kannst Timer jederzeit individuell einstellen.', + emoji: '⏱️', + gradient: { from: 'blue-500', to: 'blue-700' }, + options: [ + { + id: '5', + label: '5 Minuten', + description: 'Für kurze Pausen', + emoji: '⚡', + }, + { + id: '15', + label: '15 Minuten', + description: 'Für konzentrierte Einheiten', + emoji: '🎯', + }, + { + id: '25', + label: '25 Minuten', + description: 'Pomodoro-Technik (Empfohlen)', + emoji: '🍅', + }, + { + id: '45', + label: '45 Minuten', + description: 'Für längere Arbeitsphasen', + emoji: '🧘', + }, + ], + defaultValue: '25', + }, + { + id: 'welcome', + type: 'info', + question: 'Deine Uhr ist bereit!', + description: 'Hier sind einige Tipps:', + emoji: '🎉', + gradient: { from: 'primary', to: 'primary/70' }, + bullets: [ + 'Nutze die Stoppuhr für freie Zeitmessung', + 'Stelle Wecker für wichtige Erinnerungen', + 'Die Weltuhr zeigt mehrere Zeitzonen gleichzeitig', + 'Drücke Cmd/Ctrl+K für die Schnellsuche', + ], + }, +]; + +/** + * Clock app onboarding store + */ +export const clockOnboarding = createAppOnboardingStore({ + appId: 'clock', + steps: clockOnboardingSteps, + userSettings, + onComplete: async () => {}, + onSkip: async () => {}, +}); diff --git a/apps/clock/apps/web/src/routes/(app)/+layout.svelte b/apps/clock/apps/web/src/routes/(app)/+layout.svelte index 6f1397101..63b32a2c0 100644 --- a/apps/clock/apps/web/src/routes/(app)/+layout.svelte +++ b/apps/clock/apps/web/src/routes/(app)/+layout.svelte @@ -30,6 +30,8 @@ import { setLocale, supportedLocales } from '$lib/i18n'; import { alarmsApi } from '$lib/api/alarms'; import { timersApi } from '$lib/api/timers'; + import { clockOnboarding } from '$lib/stores/app-onboarding.svelte'; + import { MiniOnboardingModal } from '@manacore/shared-app-onboarding'; // App switcher items const appItems = getPillAppItems('clock'); @@ -314,6 +316,11 @@ emptyText="Keine Ergebnisse" searchingText="Suche..." /> + + + {#if clockOnboarding.shouldShow} + + {/if}