feat(workbench): add inline module help — ? icon in PageShell header

Clicking the ? icon in a workbench panel header toggles an inline help
view that replaces the ListView content. Shows module description,
feature list, and usage tips. Help content for ~45 modules defined in
a central help-content.ts registry, auto-attached via registerApp().

- AppDescriptor gains optional `help` field (description, features, tips)
- PageShell gains onHelp/helpOpen props with highlighted active state
- AppPage renders help inline in the page-body, not as a popover
- help-content.ts: per-module descriptions, features, and tips (German)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-04-17 14:44:48 +02:00
parent 2bdb48bdd1
commit c642e1be78
6 changed files with 880 additions and 1 deletions

View file

@ -0,0 +1,749 @@
/**
* Per-module help content description, features, tips.
*
* Rendered inline in the page-body when the user clicks the help (?)
* icon in the PageShell header. Keyed by appId.
*/
export interface ModuleHelp {
description: string;
features?: string[];
tips?: string[];
}
export const MODULE_HELP: Record<string, ModuleHelp> = {
todo: {
description:
'Aufgaben verwalten mit Projekten, Prioritäten und Fälligkeitsdaten. Alles lokal gespeichert und Ende-zu-Ende verschlüsselt.',
features: [
'Projekte & Labels zur Organisation',
'Prioritäten (niedrig / mittel / hoch / dringend)',
'Fälligkeitsdaten mit Kalender-Integration',
'Board-Ansicht (Kanban) pro Projekt',
'Subtasks innerhalb einer Aufgabe',
'Drag & Drop: Aufgaben in Kalender oder Notizen ziehen',
'AI-Tools: Aufgaben erstellen, abhaken, auflisten',
],
tips: [
'Ziehe eine Aufgabe auf den Kalender um einen Zeitblock zu erstellen',
'Im Chat kannst du sagen "erstelle eine Aufgabe: Einkaufen morgen"',
'Klicke auf ein Projekt um nur dessen Aufgaben zu sehen',
],
},
calendar: {
description:
'Termine und Zeitblöcke planen. Verknüpft sich mit Aufgaben, Habits und sozialen Events.',
features: [
'Tages-, Wochen- und Monatsansicht',
'Wiederkehrende Termine',
'Zeitblöcke für fokussiertes Arbeiten',
'Verknüpfung mit Todo, Habits & Events',
'AI-Tools: Termine erstellen, heutige Termine abfragen',
],
tips: [
'Ziehe einen Kontakt auf den Kalender um ein Treffen zu planen',
'Zeitblöcke verbinden Kalender, Aufgaben und Habits',
],
},
contacts: {
description:
'Persönliches Adressbuch. Alle Felder (Name, Adresse, Telefon) sind verschlüsselt gespeichert.',
features: [
'Name, E-Mail, Telefon, Adresse, Social-Media',
'Geburtstage',
'Verknüpfung mit Events, Aufgaben & Notizen',
'Drag & Drop in andere Module',
'AI-Tools: Kontakte erstellen und durchsuchen',
],
tips: [
'Ziehe einen Kontakt auf Todo um eine "Kontaktieren"-Aufgabe zu erstellen',
'Kontakte tauchen als Verknüpfung in Events und Journal auf',
],
},
habits: {
description:
'Gewohnheiten aufbauen und tracken. Tägliche Streaks, farbige Kategorien und Kalender-Integration.',
features: [
'Tägliches Logging per Tap',
'Streak-Tracking mit Tageszielen',
'Zeitblock-Verknüpfung im Kalender',
'Farbige Kategorien',
'Archivieren statt Löschen',
'AI-Tools: Habits erstellen, loggen, Status abfragen',
],
tips: [
'Habits erscheinen als Zeitblöcke im Kalender wenn du sie loggst',
'Im Chat: "Logge Meditation für heute"',
],
},
notes: {
description:
'Notizen mit Rich-Text-Editor. Titel und Inhalt sind verschlüsselt, Tags helfen bei der Organisation.',
features: [
'Rich-Text-Editor mit Markdown-Support',
'Tags & Farbkodierung',
'Anheften, Archivieren, Favorisieren',
'Volltextsuche',
'AI-Tools: Notizen erstellen, bearbeiten, taggen, durchsuchen',
],
tips: [
'Ziehe eine Aufgabe auf Notizen um eine verknüpfte Notiz zu erstellen',
'Im Chat: "Erstelle eine Notiz zu meinem Meeting"',
'Farbige Notizen helfen bei der visuellen Organisation',
],
},
journal: {
description: 'Tagebuch für tägliche Reflexionen. Stimmung, freier Text — alles verschlüsselt.',
features: [
'Tägliche Einträge mit Stimmungswahl',
'Anheften & Favorisieren',
'Verschlüsselter Inhalt',
'AI-Tool: Journal-Einträge erstellen',
],
tips: [
'Im Chat: "Schreibe einen Journal-Eintrag über meinen Tag"',
'Nutze Anheften für besonders wichtige Einträge',
],
},
dreams: {
description:
'Traumtagebuch mit Symbolen, Stimmungen und AI-Interpretation. Finde Muster in deinen Träumen.',
features: [
'Traumdatum, Stimmung & Klarheitsgrad',
'Luzides Träumen markieren',
'Traumsymbole sammeln & zählen',
'Tags & Volltextsuche',
'AI-Interpretation (optional)',
],
tips: [
'Schreibe Träume direkt nach dem Aufwachen auf — die Details verblassen schnell',
'Wiederkehrende Symbole können auf Muster hinweisen',
],
},
period: {
description:
'Zyklustracking mit Tagesprotokoll, Symptomen und Vorhersagen. Gesundheitsdaten sind besonders geschützt (DSGVO Art. 9).',
features: [
'Zykluslänge berechnen & nächsten Zyklus vorhersagen',
'Tägliches Protokoll (Stärke, Stimmung, Symptome)',
'Symptom-Kategorien mit Häufigkeiten über die Zeit',
'Zyklen archivieren & vergleichen',
'DSGVO Art. 9 — besonders verschlüsselt als Gesundheitsdaten',
],
tips: ['Je regelmäßiger du einträgst, desto genauer werden die Vorhersagen'],
},
finance: {
description: 'Einnahmen & Ausgaben tracken. Kategorien, Budgets und Monatsübersicht.',
features: [
'Einnahmen & Ausgaben mit Betrag und Datum',
'Eigene Kategorien erstellen',
'Monatsbudgets pro Kategorie',
'Typ-Filter (Einnahme/Ausgabe)',
'AI-Tools: Transaktionen abfragen',
],
tips: [
'Budgets zeigen dir wie viel du pro Kategorie noch übrig hast',
'Beschreibung und Notizen sind verschlüsselt, Beträge bleiben für Statistiken im Klartext',
],
},
places: {
description:
'Lieblingsorte, Restaurants, Cafés — speichern, kategorisieren und Besuche loggen.',
features: [
'Orte mit Adresse, Kategorie & Koordinaten',
'Favoriten markieren',
'Besuche loggen mit Zeitstempel',
'Standort-Verlauf',
'AI-Tools: Orte erstellen, besuchen, durchsuchen',
],
tips: [
'Im Chat: "Speichere das Restaurant Sushi Samba als Favorit"',
'Standort-Logs laufen im Hintergrund (wenn aktiviert)',
],
},
chat: {
description:
'Unterhaltungen mit AI-Assistenten. Verschiedene Modelle, Systemkontexte und Vorlagen.',
features: [
'Mehrere parallele Konversationen',
'System-Prompts & Vorlagen',
'Verschlüsselte Nachrichten',
'Modellauswahl',
],
tips: [
'Der Chat hat Zugriff auf alle Modul-Tools — frage einfach was du brauchst',
'Nutze Vorlagen für wiederkehrende Aufgaben',
],
},
kontext: {
description: 'Persönliches Markdown-Dokument das der AI als Hintergrundwissen mitgegeben wird.',
features: [
'Freitext-Markdown',
'Wird automatisch in AI-Missionen als Kontext injiziert',
'Pro Agent individuell konfigurierbar',
],
tips: [
'Schreibe hier Dinge die die AI über dich wissen sollte: Vorlieben, Arbeitsweise, Projekte',
'Jeder Agent kann ein eigenes Kontext-Dokument haben',
],
},
context: {
description:
'Strukturiertes Profil — Interessen, Tagesablauf, Ziele, Ernährung. Hilft der AI dich besser zu verstehen.',
features: [
'Geführtes Interview mit Fragen',
'Strukturierte Sektionen (Über mich, Interessen, Routine, ...)',
'Freitext-Ergänzung für alles andere',
'Wird automatisch als AI-Kontext genutzt',
],
tips: [
'Du musst nicht alles ausfüllen — jedes Detail hilft der AI',
'Das Interview kann jederzeit fortgesetzt werden',
],
},
times: {
description: 'Zeiterfassung — tracke wie viel Zeit du womit verbringst.',
features: [
'Start/Stop Timer',
'Manuelle Zeiteinträge',
'Projekt-Zuordnung',
'Tages- und Wochenübersicht',
],
tips: ['Zeiteinträge erscheinen als Zeitblöcke im Kalender'],
},
quotes: {
description:
'Zitate sammeln, entdecken und wiederfinden. Eigene und aus einer kuratierten Datenbank.',
features: [
'Eigene Zitate mit Autor & Quelle erstellen',
'Kuratierte Zitat-Datenbank zum Stöbern',
'Kategorien & Zuordnung',
'Verschlüsselte Inhalte',
],
tips: ['Speichere Zitate aus Büchern, Podcasts oder Gesprächen — sie gehen sonst verloren'],
},
cards: {
description: 'Karteikarten zum Lernen. Decks erstellen, Karten durchgehen und Wissen festigen.',
features: [
'Decks mit beliebig vielen Karten',
'Vorderseite / Rückseite',
'Lernmodus mit Selbstbewertung',
'Verschlüsselter Inhalt',
],
tips: ['Nutze kurze, präzise Fragen auf der Vorderseite für besseren Lerneffekt'],
},
picture: {
description: 'AI-Bildgenerierung — erstelle Bilder mit Textprompts auf deinem GPU-Server.',
features: [
'Text-zu-Bild Generierung',
'Prompt & Negativ-Prompt',
'Bildgalerie mit Verlauf',
'Verschiedene Modelle & Stile',
],
tips: ['Detaillierte Prompts mit Stil-Angaben liefern bessere Ergebnisse'],
},
music: {
description:
'Musik-Sammlung und Playlists verwalten. Titel und Metadaten sind verschlüsselt gespeichert.',
features: [
'Songs mit Titel, Interpret & Metadaten',
'Playlists erstellen und sortieren',
'Verschlüsselte Titel & Beschreibungen',
'Durchsuchen und Filtern',
],
tips: ['Nutze Playlists um Musik nach Stimmung oder Anlass zu sortieren'],
},
photos: {
description:
'Fotoalben organisieren und durchsuchen. Bilder werden im persönlichen Cloud-Speicher abgelegt.',
features: [
'Alben erstellen und benennen',
'Fotos hochladen & organisieren',
'Bildvorschau & Vollbild-Ansicht',
'Gespeichert in deinem privaten MinIO-Speicher',
],
tips: ['Fotos werden in deinem persönlichen Speicher abgelegt — nicht bei Drittanbietern'],
},
storage: {
description:
'Persönlicher Cloud-Speicher — Dateien sicher ablegen, in Ordnern organisieren und per Link teilen.',
features: [
'Ordnerstruktur mit Verschachtelung',
'Drag & Drop Upload',
'Verschlüsselte Dateinamen',
'Teilen per Link',
'Gespeichert auf deinem eigenen Server (MinIO)',
],
tips: [
'Dateien liegen auf deinem eigenen Server — kein Drittanbieter-Cloud',
'Dateinamen sind verschlüsselt, auch im Speicher nicht im Klartext sichtbar',
],
},
food: {
description: 'Mahlzeiten tracken mit AI-Unterstützung. Nährwerte werden automatisch erkannt.',
features: [
'Mahlzeiten per Text beschreiben',
'Automatische Nährwertanalyse durch AI',
'Tagesübersicht mit Kalorien & Makros',
'AI-Tools: Mahlzeiten loggen, Tages-Zusammenfassung',
],
tips: [
'Beschreibe Mahlzeiten natürlich: "2 Scheiben Vollkornbrot mit Käse und Tomate"',
'Im Chat: "Was habe ich heute gegessen?"',
],
},
plants: {
description:
'Pflanzen katalogisieren — Pflege-Notizen, Standort, Bewässerung und Bodentyp. Ideal für Hobbygärtner.',
features: [
'Pflanzen mit Bild, Name & Beschreibung',
'Temperatur, Bodentyp & Lichtbedarf',
'Pflege-Notizen pro Pflanze',
'Verschlüsselte Notizen & Namen',
],
tips: [
'Halte Pflege-Notizen fest: wann gedüngt, umgetopft, geschnitten',
'Nutze die Temperatur-Angabe als Erinnerung wann Pflanzen reingeholt werden müssen',
],
},
presi: {
description:
'Präsentationen mit Folien erstellen. Markdown-basierter Inhalt, verschlüsselt gespeichert.',
features: [
'Folien mit Rich-Content erstellen',
'Markdown-Editor pro Folie',
'Reihenfolge per Drag & Drop ändern',
'Verschlüsselter Inhalt (Titel & Folien-Text)',
'Mehrere Decks verwalten',
],
tips: ['Nutze Markdown für schnelle Formatierung: **fett**, *kursiv*, Listen'],
},
inventory: {
description:
'Sammlungen verwalten — inventarisiere Besitz mit eigenen Feldern, Kategorien und Standorten.',
features: [
'Eigene Sammlungen mit Schema-Builder (Felder definieren)',
'Standorte & Kategorien hierarchisch',
'Kaufdaten, Fotos & Notizen',
'Status: besitzt / verliehen / eingelagert / zu verkaufen',
],
tips: [
'Nutze den Schema-Builder um eigene Felder pro Sammlung zu definieren',
'Standorte können verschachtelt sein (Zuhause → Büro → Schreibtisch)',
],
},
memoro: {
description:
'Sprachnotizen aufnehmen und automatisch transkribieren lassen. Durchsuchbar, zusammengefasst und verschlüsselt.',
features: [
'Aufnahme mit einem Tap',
'AI-Transkription (Whisper — läuft lokal im Browser)',
'Automatische Zusammenfassung & Intro',
'Durchsuchbare Memos im Volltext',
'Verschlüsselter Transkript-Text',
],
tips: [
'Die Transkription läuft direkt im Browser — deine Stimme verlässt nie dein Gerät',
'Nutze Memos als schnelle Gedankennotizen unterwegs',
],
},
questions: {
description:
'Fragen sammeln und Antworten festhalten — ein persönliches Q&A-Archiv für Dinge die du herausfinden möchtest.',
features: [
'Fragen mit Beschreibung & Kontext',
'Mehrere Antworten pro Frage sammeln',
'Verschlüsselter Inhalt',
'Durchsuchen und Filtern',
],
tips: ['Nutze Questions als persönliches Recherche-Archiv: Frage notieren, Antworten ergänzen'],
},
skilltree: {
description:
'Fähigkeiten visualisieren und Lernfortschritt tracken. Behalte den Überblick über dein Können.',
features: [
'Skill-Kategorien definieren (z.B. Sprachen, Technik, Kreativ)',
'Fortschritt pro Fähigkeit tracken',
'Fortschritts-Übersicht',
'Verschlüsselte Inhalte',
],
tips: ['Definiere Kategorien nach Lebensbereichen für eine gute Übersicht'],
},
moodlit: {
description:
'Stimmungslicht und Ambient-Szenen für Fokus und Entspannung. Verwandle deinen Bildschirm in eine Lichtquelle.',
features: [
'Verschiedene Licht-Szenen & Farbverläufe',
'Timer-Funktion für zeitlich begrenzte Sessions',
'Farbwechsel & Animationen',
'Vollbild-Modus',
],
tips: ['Kombiniere Moodlit mit Meditate für eine immersive Meditationssession'],
},
citycorners: {
description:
'Interessante Ecken in deiner Stadt entdecken und festhalten. Ein persönlicher Stadtführer.',
features: [
'Orte mit Fotos & Beschreibung',
'Kategorien (Café, Street Art, Architektur, ...)',
'Standort & Adresse',
'Entdeckungs-Feed',
],
tips: [
'Halte Orte fest wenn du sie entdeckst — später erinnerst du dich nicht mehr an die Adresse',
],
},
uload: {
description:
'Quick-Upload — Dateien schnell hochladen und teilbare Links erstellen. Ideal zum schnellen Teilen.',
features: [
'Drag & Drop Upload',
'Teilbare Download-Links generieren',
'Verschiedene Dateitypen unterstützt',
'Gespeichert auf deinem eigenen Server',
],
tips: ['Nutze uload für schnelles Teilen — drag die Datei rein, Link kopieren, fertig'],
},
calc: {
description:
'Taschenrechner mit Berechnungsverlauf. Ergebnisse bleiben gespeichert und sind jederzeit abrufbar.',
features: [
'Grundrechenarten & erweiterte Funktionen',
'Verlauf aller vergangenen Berechnungen',
'Ergebnisse kopieren & wiederverwenden',
'Kompakte Ansicht in der Workbench',
],
},
guides: {
description:
'Schritt-für-Schritt Anleitungen erstellen und durcharbeiten. Fortschritt wird pro Durchlauf gespeichert.',
features: [
'Sektionen mit einzelnen Schritten',
'Checklisten-Modus zum Abhaken',
'Fortschritt pro Durchlauf gespeichert',
'Schwierigkeitsgrade & Kategorien',
'Geschätzte Dauer pro Guide',
],
tips: [
'Nutze Guides für Onboarding-Prozesse, Checklisten oder wiederkehrende Abläufe',
'Mehrere Durchläufe zeigen deinen Fortschritt über die Zeit',
],
},
body: {
description:
'Fitness-Tracking — Übungen, Workouts, Körpermaße und Trainings-Phasen. Gesundheitsdaten sind besonders geschützt.',
features: [
'Übungsbibliothek nach Muskelgruppe & Equipment',
'Routinen zusammenstellen',
'Workout-Logging: Sets, Reps, Gewicht',
'Körpermaße mit Trend-Charts',
'Tägliche Check-ins (Energie, Schlaf, Muskelkater)',
'Trainings-Phasen (Aufbau / Diät / Erhaltung)',
'DSGVO Art. 9 — besonders verschlüsselt',
],
tips: [
'Starte ein Workout von einer Routine aus — die Übungen werden vorgeladen',
'Körpermaße-Charts zeigen den Trend über Wochen und Monate',
],
},
events: {
description: 'Soziale Events planen — Gästeliste, RSVP, Bring-Liste und teilbare Einladungen.',
features: [
'Gäste einladen (aus Kontakten oder manuell)',
'RSVP-Status pro Gast',
'Bring-Liste: wer bringt was?',
'Teilbare Einladungs-Links',
'Zeitblock-Integration im Kalender',
],
tips: [
'Teile den Einladungslink — Gäste können ohne Account zusagen',
'Bring-Listen-Items können von Gästen "reserviert" werden',
],
},
who: {
description:
'Rate-Spiel — erkenne Persönlichkeiten anhand von Hinweisen. Die AI gibt dir Schritt für Schritt mehr Informationen.',
features: [
'AI gibt dir Hinweise, du rätst die Person',
'Verschiedene Schwierigkeitsgrade',
'Spiel-Verlauf mit Statistiken',
'Chat-basierte Interaktion',
'Historische und aktuelle Persönlichkeiten',
],
tips: [
'Stelle gezielte Ja/Nein-Fragen um die Person schneller einzugrenzen',
'Schwierigere Modi geben weniger offensichtliche Hinweise',
],
},
firsts: {
description:
'Erste Male festhalten — eine Bucket-List für Dinge die du erleben möchtest, und ein Archiv erlebter Momente.',
features: [
'Träume (Bucket List) & erlebte Firsts',
'Kategorien: Kulinarisch, Abenteuer, Reise, Kreativ, ...',
'Priorität & Erwartung vs. Realität',
'Teilen: wer war dabei?',
],
tips: ['Nutze "Erwartung vs. Realität" um festzuhalten wie das Erlebnis wirklich war'],
},
drink: {
description:
'Trink-Tracker mit Tageszielen und schnellen Presets. Behalte deine Hydration im Blick.',
features: [
'Quick-Tap Presets (Wasser, Kaffee, Tee, ...)',
'Tägliches ml-Ziel mit Fortschrittsbalken',
'Verschiedene Getränketypen mit eigenen Icons',
'Eigene Presets erstellen',
'AI-Tools: Einträge loggen, Fortschritt abfragen, rückgängig machen',
],
tips: [
'Im Chat: "Logge ein Glas Wasser" oder "Wie viel habe ich heute getrunken?"',
'Erstelle Presets für deine häufigsten Getränke mit der richtigen ml-Menge',
],
},
recipes: {
description:
'Rezepte sammeln und organisieren — Zutaten, Zubereitungsschritte, Schwierigkeit und Portionsgrößen.',
features: [
'Zutaten-Liste mit Mengenangaben',
'Zubereitungsschritte einzeln dokumentieren',
'Schwierigkeit & geschätzter Zeitaufwand',
'Tags & Favoriten zum schnellen Wiederfinden',
'Verschlüsselte Inhalte',
],
tips: [
'Nutze Tags wie "schnell", "vegetarisch", "Gäste" zum Filtern',
'Favorisiere deine Lieblingsrezepte für schnellen Zugriff',
],
},
stretch: {
description: 'Stretching-Routinen mit Übungsbibliothek, Timer und Beweglichkeitstests.',
features: [
'Übungen nach Körperregion & Schwierigkeit',
'Routinen mit Timer zusammenstellen',
'Beweglichkeits-Assessments (Tests + Schmerzregionen)',
'Session-Verlauf mit Dauer',
'Erinnerungen konfigurieren',
],
tips: [
'Starte mit dem Assessment um deinen Ist-Zustand festzuhalten',
'Regelmäßige Sessions von 10-15 Min sind effektiver als seltene lange',
],
},
mail: {
description:
'E-Mail-Entwürfe lokal verfassen und verschlüsselt speichern. Sende sie später über deinen E-Mail-Server.',
features: [
'Entwürfe mit Empfänger, CC, Betreff & Text',
'HTML-Body Support für formatierte Mails',
'Antworten auf bestehende Nachrichten vorbereiten',
'Verschlüsselter Inhalt (Empfänger, Betreff, Text)',
],
tips: [
'Entwürfe werden lokal gespeichert — du brauchst keine Internetverbindung zum Schreiben',
],
},
meditate: {
description:
'Meditation, Atemübungen und Body Scans. Timer mit Presets und Reflexions-Notizen.',
features: [
'Geführte Presets: Atemübungen, Body Scan, freie Meditation',
'Frei wählbare Dauer',
'Stimmung vorher / nachher',
'Session-Verlauf mit Statistiken',
'Eigene Presets erstellen',
],
tips: [
'Starte mit kurzen Sessions (5 Min) und steigere langsam',
'Die Stimmungs-Bewertung hilft, den Effekt über die Zeit zu sehen',
],
},
mood: {
description:
'Stimmung mehrmals täglich tracken — Emotionen, Intensität, Kontext und Begleitpersonen.',
features: [
'Emotionen mit Intensitätsstufe',
'Aktivität & Begleitpersonen',
'Freitext-Notizen',
'Tagesverlauf-Ansicht',
],
tips: ['Regelmäßiges Tracken zeigt Muster — z.B. welche Aktivitäten deine Stimmung heben'],
},
sleep: {
description:
'Schlaf tracken — Qualität, Dauer, Unterbrechungen und eine Schlafhygiene-Checkliste.',
features: [
'Schlaf- und Aufwachzeit',
'Qualitätsbewertung',
'Unterbrechungen erfassen',
'Schlafhygiene-Checkliste (eigene Punkte)',
'DSGVO Art. 9 — besonders verschlüsselt',
],
tips: ['Die Hygiene-Checkliste hilft, gute Schlafgewohnheiten zu entwickeln'],
},
wishes: {
description:
'Wunschliste mit Preiszielen, Produkt-Links und Listen. Organisiere Wünsche nach Anlass.',
features: [
'Wünsche mit Zielpreis & Kategorie',
'Listen erstellen (Geburtstag, Weihnachten, Für mich, ...)',
'Produkt-URLs pro Wunsch hinterlegen',
'Preisverlauf-Tracking',
'Prioritäten & Status (offen / erfüllt / archiviert)',
'AI-Tools: Wünsche erstellen, auflisten, als erfüllt markieren',
],
tips: [
'Erstelle Listen für verschiedene Anlässe — so behältst du den Überblick',
'Im Chat: "Setze Sony WH-1000XM5 auf meine Wunschliste, Zielpreis 250€"',
],
},
wetter: {
description:
'Wetter für deine Standorte mit detaillierter Vorhersage und Vergleich verschiedener Wettermodelle.',
features: [
'Mehrere Standorte speichern & wechseln',
'Verschiedene Wettermodelle vergleichen (DWD, ECMWF, GFS, ...)',
'Stunden- und Tagesvorhersage',
'Temperatur, Wind, Niederschlag & mehr',
'Standard-Standort festlegen',
],
tips: [
'Vergleiche verschiedene Modelle — bei unsicherem Wetter weichen sie voneinander ab',
'Lege deinen Heimatort als Standard fest',
],
},
library: {
description:
'Medien-Log — Bücher, Filme, Serien und Comics tracken. Status, Fortschritt, Bewertung.',
features: [
'Bücher, Filme, Serien, Comics in einer Ansicht',
'Status: läuft / fertig / geplant / abgebrochen',
'Fortschritt tracken (Seiten, Episoden, Ausgaben)',
'Bewertung & Review-Text',
'Favoriten & Jahresrückblick',
],
tips: [
'Nutze "Geplant" als Merkliste für Empfehlungen',
'Der Jahresrückblick zeigt was du im laufenden Jahr geschafft hast',
],
},
'news-research': {
description:
'RSS-Feeds durchsuchen und Artikel für die News-App entdecken. Kann als Recherche-Tool in AI-Missionen eingebunden werden.',
features: [
'RSS-Feeds nach Thema oder URL suchen',
'Feed-Ergebnisse mit Titel, Datum & Vorschau',
'Artikel in die News-App speichern',
'AI-Missions nutzen News Research automatisch für Recherche-Aufträge',
],
tips: [
'Erstelle eine AI-Mission mit "recherchiere" im Ziel — sie nutzt dann automatisch RSS-Feeds',
],
},
myday: {
description:
'Tagesübersicht — alles Wichtige auf einen Blick: Termine, Aufgaben, Habits und Stimmung.',
features: [
'Heutige Termine & Aufgaben',
'Habit-Fortschritt des Tages',
'Schnellzugriff auf häufige Aktionen',
'AI-Zusammenfassung des Tages',
],
tips: ['Nutze MyDay als Startseite um morgens den Überblick zu bekommen'],
},
'ai-missions': {
description:
'Langlebige AI-Aufträge — definiere ein Ziel, verknüpfe Inputs, und lass den Agenten autonom arbeiten.',
features: [
'Ziel und Kontext definieren',
'Inputs aus anderen Modulen verknüpfen (Notizen, Aufgaben, ...)',
'Einmalig oder wiederkehrend (täglich, wöchentlich, ...)',
'Vorschläge prüfen und freigeben',
'Debug-Log mit vollem Prompt-Verlauf pro Iteration',
'Server-seitige Ausführung über mana-ai',
],
tips: [
'Starte mit einfachen Missionen: "Erstelle jeden Morgen 3 Aufgaben basierend auf meinen Zielen"',
'Verknüpfe dein Kontext-Dokument als Input für bessere Ergebnisse',
'Der Debug-Log hilft zu verstehen warum die AI bestimmte Entscheidungen trifft',
],
},
'ai-agents': {
description:
'Benannte AI-Personas mit eigenem System-Prompt, Policy und Gedächtnis. Jeder Agent kann eigene Missionen ausführen.',
features: [
'Eigene Agents mit Name, Rolle & Avatar',
'System-Prompt pro Agent',
'Policy pro Tool (automatisch / vorschlagen / verbieten)',
'Agent-Gedächtnis (persistiert über Sessions)',
'Vorlagen: Recherche-Agent, Kontext-Agent, Today-Agent',
],
tips: [
'Der Standard-Agent "Mana" ist für allgemeine Aufgaben gedacht',
'Erstelle spezialisierte Agents: z.B. einen "Fitness-Coach" mit entsprechendem Prompt',
'Die Policy bestimmt ob der Agent eigenständig handelt oder erst fragt',
],
},
'ai-workbench': {
description:
'Timeline aller AI-Aktionen. Filtere nach Agent, Modul oder Mission — und mache Aktionen rückgängig.',
features: [
'Chronologische Event-Timeline',
'Filter: nach Agent, Modul, Mission',
'Iterationen einzeln rückgängig machen',
'Datenzugriff-Audit (welche Daten hat die AI gelesen?)',
],
tips: [
'Nutze den Revert-Button um eine ganze AI-Iteration rückgängig zu machen',
'Der Datenzugriff-Tab zeigt genau welche verschlüsselten Daten entschlüsselt wurden',
],
},
goals: {
description:
'Ziele setzen und Fortschritt verfolgen. Verknüpft sich mit AI-Missionen und dem Kontext-Profil.',
features: [
'Ziele mit Status definieren (offen / in Arbeit / erreicht)',
'Modulübergreifende Verknüpfung mit Aufgaben & Habits',
'AI-Tools: Ziele abfragen und in Missionen referenzieren',
'Ziele als Input für AI-Missionen nutzen',
],
tips: [
'Verknüpfe Ziele mit AI-Missionen — der Agent kann dann Aufgaben daraus ableiten',
'Formuliere Ziele konkret und messbar für bessere AI-Unterstützung',
],
},
playground: {
description:
'LLM-Spielwiese — verschiedene Modelle und System-Prompts ausprobieren. Perfekt zum Experimentieren.',
features: [
'Freie Konversationen',
'System-Prompt-Snippets speichern & wiederverwenden',
'Modellauswahl (verschiedene AI-Modelle)',
'Verschlüsselter Verlauf',
],
},
quiz: {
description:
'Eigene Quizze bauen und spielen. Single-Choice, Multiple-Choice, Wahr/Falsch oder Freitext.',
features: [
'Verschiedene Fragetypen',
'Erklärungen pro Frage',
'Spiel-Versuche mit Score & Verlauf',
'Verschlüsselte Fragen & Antworten',
],
tips: ['Nutze Erklärungen um den Lerneffekt zu maximieren'],
},
automations: {
description:
'Wenn-Dann Regeln zwischen Modulen — automatisiere wiederkehrende Abläufe ohne Code.',
features: [
'Trigger aus einem Modul wählen (z.B. neue Aufgabe erstellt)',
'Aktion in einem anderen Modul definieren (z.B. Notiz erstellen)',
'Aktivieren / Deaktivieren per Toggle',
'Quell- und Ziel-Modul frei kombinieren',
],
tips: [
'Starte einfach: z.B. "Wenn ein neuer Kontakt erstellt wird, erstelle eine Aufgabe zum Kennenlernen"',
],
},
};

View file

@ -6,10 +6,16 @@ import type { DragType } from '@mana/shared-ui/dnd';
import { linkMutations, buildCachedData } from '@mana/shared-links';
import { MANA_APPS, hasAppAccess, type AccessTier } from '@mana/shared-branding';
import type { AppDescriptor, DropResult } from './types';
import { MODULE_HELP } from './help-content';
const apps = new Map<string, AppDescriptor>();
export function registerApp(descriptor: AppDescriptor): void {
// Auto-attach help content from the central help-content map
// if the descriptor doesn't already have one.
if (!descriptor.help && MODULE_HELP[descriptor.id]) {
descriptor.help = MODULE_HELP[descriptor.id];
}
apps.set(descriptor.id, descriptor);
}

View file

@ -57,6 +57,12 @@ export interface AppDescriptor {
// -- Context Menu (optional) --
contextMenuActions?: AppContextMenuAction[];
// -- Help (optional) --
help?: {
description: string;
features?: string[];
};
}
export interface DropResult {

View file

@ -13,6 +13,7 @@
CaretLeft,
CaretRight,
ArrowsOutLineHorizontal,
Question,
} from '@mana/shared-icons';
import type { Snippet, Component } from 'svelte';
import { PAGE_WIDTH_PRESETS, nearestPresetIndex } from './width-presets';
@ -26,6 +27,8 @@
onResize?: (widthPx: number) => void;
onMoveLeft?: () => void;
onMoveRight?: () => void;
onHelp?: () => void;
helpOpen?: boolean;
// Default header
title?: string;
titleHref?: string;
@ -47,6 +50,8 @@
onResize,
onMoveLeft,
onMoveRight,
onHelp,
helpOpen = false,
onContextMenu,
title = '',
titleHref,
@ -124,6 +129,19 @@
{/if}
</div>
<div class="window-actions">
{#if onHelp}
<button
class="window-btn"
class:window-btn-active={helpOpen}
onclick={(e) => {
e.stopPropagation();
onHelp();
}}
title="Info"
>
<Question size={22} weight="bold" />
</button>
{/if}
{#if onMoveLeft}
<button
class="window-btn"
@ -403,6 +421,11 @@
width: 100%;
}
.window-btn-active {
background: hsl(var(--color-primary) / 0.12);
color: hsl(var(--color-primary));
}
/* Width picker */
.width-picker-wrapper {
position: relative;

View file

@ -1,3 +1,4 @@
export { default as PageShell } from './PageShell.svelte';
export { default as PageCarousel } from './PageCarousel.svelte';
export type { CarouselPage } from './types';

View file

@ -45,6 +45,10 @@
});
let appColor = $derived(app?.color ?? '#6B7280');
// ── Help ────────────────────────────────────────────────
let helpOpen = $state(false);
let helpData = $derived(app?.help);
// ── Cross-module drop target ────────────────────────────
let acceptedDropTypes = $derived(app?.acceptsDropFrom ?? []);
@ -305,8 +309,36 @@
{onMoveLeft}
{onMoveRight}
{onContextMenu}
onHelp={helpData ? () => (helpOpen = !helpOpen) : undefined}
{helpOpen}
>
{#if loadError}
{#if helpOpen && helpData}
<div class="help-view">
<p class="help-desc">{helpData.description}</p>
{#if helpData.features && helpData.features.length > 0}
<div class="help-section">
<h3 class="help-section-title">Features</h3>
<ul class="help-list">
{#each helpData.features as feature}
<li>{feature}</li>
{/each}
</ul>
</div>
{/if}
{#if helpData.tips && helpData.tips.length > 0}
<div class="help-section">
<h3 class="help-section-title">Tipps</h3>
<ul class="help-list help-list-tips">
{#each helpData.tips as tip}
<li>{tip}</li>
{/each}
</ul>
</div>
{/if}
</div>
{:else if loadError}
<div class="load-state">
<p>App konnte nicht geladen werden</p>
</div>
@ -387,6 +419,68 @@
outline-offset: -2px;
}
.help-view {
padding: 1rem 1.125rem 1.5rem;
animation: helpFadeIn 0.2s ease-out;
overflow-y: auto;
height: 100%;
}
.help-desc {
font-size: 0.8125rem;
line-height: 1.65;
color: hsl(var(--color-foreground));
margin: 0;
}
.help-section {
margin-top: 1rem;
}
.help-section-title {
font-size: 0.6875rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.04em;
color: hsl(var(--color-muted-foreground));
margin: 0 0 0.5rem;
}
.help-list {
margin: 0;
padding: 0;
list-style: none;
display: flex;
flex-direction: column;
gap: 0.375rem;
}
.help-list li {
font-size: 0.8125rem;
line-height: 1.55;
color: hsl(var(--color-foreground));
padding-left: 0.875rem;
position: relative;
}
.help-list li::before {
content: '';
position: absolute;
left: 0;
top: 0.5em;
width: 4px;
height: 4px;
border-radius: 50%;
background: hsl(var(--color-muted-foreground) / 0.4);
}
.help-list-tips li::before {
background: hsl(var(--color-primary) / 0.6);
}
@keyframes helpFadeIn {
from {
opacity: 0;
transform: translateY(4px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.load-state {
display: flex;
align-items: center;