feat(storage, chat, picture): add shared help pages

Add help pages to the remaining high-maturity production apps:

- Storage (84/100): FAQ (upload, sharing, versioning, trash, privacy),
  features (cloud storage, sharing, versioning, search), shortcuts
- Chat (82/100): FAQ (AI models, spaces, templates, comparison, privacy),
  features (multi-model, spaces, comparison, templates), shortcuts
- Picture (81/100): FAQ (generation, credits, moodboards, explore, privacy),
  features (AI generation, gallery, moodboards, explore), shortcuts

All 6 production web apps now have standardized help pages using the
shared help system.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-03-25 09:19:06 +01:00
parent 979103b962
commit f0233b8d31
10 changed files with 1009 additions and 0 deletions

View file

@ -42,6 +42,8 @@
"@manacore/shared-feedback-service": "workspace:*",
"@manacore/shared-feedback-ui": "workspace:*",
"@manacore/shared-i18n": "workspace:*",
"@manacore/shared-help-types": "workspace:*",
"@manacore/shared-help-ui": "workspace:*",
"@manacore/shared-icons": "workspace:*",
"@manacore/shared-profile-ui": "workspace:*",
"@manacore/shared-stores": "workspace:*",

View file

@ -0,0 +1,166 @@
/**
* Help content for Chat app
*/
import type { HelpContent } from '@manacore/shared-help-types';
export function getChatHelpContent(locale: string): HelpContent {
const isDE = locale === 'de';
return {
faq: [
{
id: 'faq-models',
question: isDE
? 'Welche KI-Modelle stehen zur Verfügung?'
: 'Which AI models are available?',
answer: isDE
? '<p>Es gibt zwei Kategorien von Modellen:</p><ul><li><strong>Lokale Modelle</strong> (kostenlos): Laufen auf unserem Server — z.B. Gemma 3, Qwen2.5 Coder, LLaVA Vision</li><li><strong>Cloud-Modelle</strong> (Credits): Leistungsstärkere Modelle — z.B. Claude, GPT-4o, DeepSeek, Llama</li></ul><p>Lokale Modelle sind ideal für alltägliche Aufgaben. Cloud-Modelle bieten höhere Qualität für komplexe Anfragen.</p>'
: '<p>There are two categories of models:</p><ul><li><strong>Local models</strong> (free): Run on our server — e.g. Gemma 3, Qwen2.5 Coder, LLaVA Vision</li><li><strong>Cloud models</strong> (credits): More powerful models — e.g. Claude, GPT-4o, DeepSeek, Llama</li></ul><p>Local models are ideal for everyday tasks. Cloud models offer higher quality for complex requests.</p>',
category: 'features',
order: 1,
language: isDE ? 'de' : 'en',
featured: true,
tags: isDE ? ['modelle', 'ki', 'lokal', 'cloud'] : ['models', 'ai', 'local', 'cloud'],
},
{
id: 'faq-spaces',
question: isDE ? 'Was sind Spaces?' : 'What are Spaces?',
answer: isDE
? '<p>Spaces sind Bereiche, um deine Chats thematisch zu organisieren:</p><ul><li>Erstelle Spaces für verschiedene Projekte oder Themen</li><li>Jeder Space enthält eigene Unterhaltungen</li><li>Wechsle schnell zwischen Kontexten</li></ul>'
: '<p>Spaces are areas to organize your chats by topic:</p><ul><li>Create spaces for different projects or topics</li><li>Each space contains its own conversations</li><li>Switch quickly between contexts</li></ul>',
category: 'features',
order: 2,
language: isDE ? 'de' : 'en',
tags: isDE ? ['spaces', 'organisation', 'bereiche'] : ['spaces', 'organize', 'areas'],
},
{
id: 'faq-templates',
question: isDE ? 'Wie nutze ich Templates?' : 'How do I use templates?',
answer: isDE
? '<p>Templates sind vordefinierte Prompt-Vorlagen:</p><ul><li>Wähle ein Template aus der Vorlagenbibliothek</li><li>Das Template füllt automatisch den Chat mit einem optimierten Prompt</li><li>Ideal für wiederkehrende Aufgaben wie Texterstellung, Übersetzung oder Code-Analyse</li></ul>'
: '<p>Templates are predefined prompt presets:</p><ul><li>Select a template from the template library</li><li>The template automatically fills the chat with an optimized prompt</li><li>Ideal for recurring tasks like writing, translation, or code analysis</li></ul>',
category: 'features',
order: 3,
language: isDE ? 'de' : 'en',
tags: isDE ? ['templates', 'vorlagen', 'prompts'] : ['templates', 'presets', 'prompts'],
},
{
id: 'faq-compare',
question: isDE ? 'Was ist der Modellvergleich?' : 'What is model comparison?',
answer: isDE
? '<p>Mit dem Modellvergleich kannst du denselben Prompt an mehrere Modelle gleichzeitig senden und die Antworten nebeneinander vergleichen. So findest du das beste Modell für deine Aufgabe.</p>'
: '<p>Model comparison lets you send the same prompt to multiple models simultaneously and compare responses side by side. This helps you find the best model for your task.</p>',
category: 'features',
order: 4,
language: isDE ? 'de' : 'en',
tags: isDE ? ['vergleich', 'modelle', 'test'] : ['compare', 'models', 'test'],
},
{
id: 'faq-privacy',
question: isDE ? 'Wie werden meine Chats geschützt?' : 'How are my chats protected?',
answer: isDE
? '<p>Deine Unterhaltungen sind sicher:</p><ul><li><strong>Verschlüsselung</strong>: Alle Daten werden bei der Übertragung (TLS) verschlüsselt</li><li><strong>Privat</strong>: Nur du hast Zugriff auf deine Chats</li><li><strong>Lokale Modelle</strong>: Bei lokalen Modellen verlassen deine Daten nie unseren Server</li><li><strong>DSGVO-konform</strong>: Wir halten uns an die EU-Datenschutzverordnung</li></ul>'
: '<p>Your conversations are secure:</p><ul><li><strong>Encryption</strong>: All data is encrypted in transit (TLS)</li><li><strong>Private</strong>: Only you have access to your chats</li><li><strong>Local models</strong>: With local models, your data never leaves our server</li><li><strong>GDPR Compliant</strong>: We follow EU data protection regulations</li></ul>',
category: 'privacy',
order: 5,
language: isDE ? 'de' : 'en',
featured: true,
tags: isDE ? ['datenschutz', 'sicherheit', 'dsgvo'] : ['privacy', 'security', 'gdpr'],
},
],
features: [
{
id: 'feature-models',
title: isDE ? 'Mehrere KI-Modelle' : 'Multiple AI Models',
description: isDE
? 'Lokale und Cloud-Modelle für jede Aufgabe'
: 'Local and cloud models for every task',
icon: '🤖',
category: 'core',
highlights: isDE
? ['7+ lokale Modelle (kostenlos)', 'Cloud-Modelle (Claude, GPT)', 'Vision-Modelle']
: ['7+ local models (free)', 'Cloud models (Claude, GPT)', 'Vision models'],
content: '',
order: 1,
language: isDE ? 'de' : 'en',
},
{
id: 'feature-spaces',
title: 'Spaces',
description: isDE
? 'Organisiere Chats nach Themen und Projekten'
: 'Organize chats by topics and projects',
icon: '📂',
category: 'core',
highlights: isDE
? ['Thematische Gruppierung', 'Schneller Kontextwechsel', 'Eigene Unterhaltungen']
: ['Topic grouping', 'Quick context switch', 'Separate conversations'],
content: '',
order: 2,
language: isDE ? 'de' : 'en',
},
{
id: 'feature-compare',
title: isDE ? 'Modellvergleich' : 'Model Comparison',
description: isDE
? 'Vergleiche Antworten mehrerer Modelle nebeneinander'
: 'Compare responses from multiple models side by side',
icon: '⚖️',
category: 'advanced',
highlights: isDE
? ['Parallele Anfragen', 'Qualitätsvergleich', 'Beste Modellwahl']
: ['Parallel requests', 'Quality comparison', 'Best model selection'],
content: '',
order: 3,
language: isDE ? 'de' : 'en',
},
{
id: 'feature-templates',
title: 'Templates',
description: isDE
? 'Optimierte Prompts für wiederkehrende Aufgaben'
: 'Optimized prompts for recurring tasks',
icon: '📋',
category: 'core',
highlights: isDE
? ['Prompt-Vorlagen', 'Ein-Klick-Start', 'Verschiedene Kategorien']
: ['Prompt presets', 'One-click start', 'Various categories'],
content: '',
order: 4,
language: isDE ? 'de' : 'en',
},
],
shortcuts: [
{
id: 'shortcuts-nav',
category: 'navigation',
title: 'Navigation',
language: isDE ? 'de' : 'en',
order: 1,
shortcuts: [
{ shortcut: 'Cmd/Ctrl + 1', action: 'Chat' },
{ shortcut: 'Cmd/Ctrl + 2', action: isDE ? 'Vergleich' : 'Compare' },
{ shortcut: 'Cmd/Ctrl + 3', action: 'Templates' },
{ shortcut: 'Cmd/Ctrl + 4', action: 'Spaces' },
{ shortcut: 'Cmd/Ctrl + 5', action: isDE ? 'Dokumente' : 'Documents' },
{ shortcut: 'Cmd/Ctrl + 6', action: isDE ? 'Archiv' : 'Archive' },
],
},
],
gettingStarted: [],
changelog: [],
contact: {
id: 'contact-support',
title: isDE ? 'Support kontaktieren' : 'Contact Support',
content: isDE
? '<p>Unser Support-Team hilft dir bei allen Fragen rund um Chat.</p>'
: '<p>Our support team is here to help you with any chat-related questions.</p>',
language: isDE ? 'de' : 'en',
order: 1,
supportEmail: 'support@mana.how',
documentationUrl: 'https://mana.how/docs',
responseTime: isDE ? 'Normalerweise innerhalb von 24 Stunden' : 'Usually within 24 hours',
},
};
}

View file

@ -0,0 +1,157 @@
<script lang="ts">
import { goto } from '$app/navigation';
import { locale } from 'svelte-i18n';
import { HelpPage } from '@manacore/shared-help-ui';
import type { HelpPageTranslations } from '@manacore/shared-help-ui';
import { getChatHelpContent } from '$lib/content/help/index.js';
const content = $derived(getChatHelpContent($locale ?? 'de'));
const translations: HelpPageTranslations = $derived(
$locale === 'de'
? {
title: 'Hilfe & Support',
subtitle: 'Finde Antworten und lerne Chat kennen',
searchPlaceholder: 'Hilfe durchsuchen...',
sections: {
faq: 'FAQ',
features: 'Features',
shortcuts: 'Tastenkürzel',
gettingStarted: 'Erste Schritte',
changelog: 'Änderungen',
contact: 'Kontakt',
},
search: {
noResults: 'Keine Ergebnisse für "{query}"',
resultsCount: '{count} Ergebnisse',
searching: 'Suche...',
},
faq: {
noItems: 'Keine häufigen Fragen verfügbar.',
allCategories: 'Alle',
categories: {
general: 'Allgemein',
account: 'Konto',
billing: 'Abrechnung',
features: 'Funktionen',
technical: 'Technisch',
privacy: 'Datenschutz',
},
},
features: {
noItems: 'Keine Features verfügbar.',
comingSoon: 'Demnächst',
learnMore: 'Mehr erfahren',
},
shortcuts: {
noItems: 'Keine Tastenkürzel verfügbar.',
columns: { shortcut: 'Kürzel', action: 'Aktion', description: 'Beschreibung' },
},
gettingStarted: {
noItems: 'Keine Anleitungen verfügbar.',
estimatedTime: 'Geschätzte Zeit',
difficulty: {
beginner: 'Einsteiger',
intermediate: 'Fortgeschritten',
advanced: 'Experte',
},
},
changelog: {
noItems: 'Keine Änderungen verfügbar.',
showAll: 'Alle Versionen anzeigen',
types: { major: 'Hauptversion', minor: 'Nebenversion', patch: 'Patch', beta: 'Beta' },
labels: {
features: 'Neue Funktionen',
improvements: 'Verbesserungen',
bugFixes: 'Fehlerbehebungen',
},
},
contact: {
noInfo: 'Keine Kontaktinformationen verfügbar.',
email: 'E-Mail senden',
responseTime: 'Antwortzeit',
},
common: { back: 'Zurück', showMore: 'Mehr anzeigen', showLess: 'Weniger anzeigen' },
}
: {
title: 'Help & Support',
subtitle: 'Find answers and learn how to use Chat',
searchPlaceholder: 'Search help...',
sections: {
faq: 'FAQ',
features: 'Features',
shortcuts: 'Shortcuts',
gettingStarted: 'Getting Started',
changelog: 'Changelog',
contact: 'Contact',
},
search: {
noResults: 'No results for "{query}"',
resultsCount: '{count} results',
searching: 'Searching...',
},
faq: {
noItems: 'No FAQs available.',
allCategories: 'All',
categories: {
general: 'General',
account: 'Account',
billing: 'Billing',
features: 'Features',
technical: 'Technical',
privacy: 'Privacy',
},
},
features: {
noItems: 'No features available.',
comingSoon: 'Coming Soon',
learnMore: 'Learn More',
},
shortcuts: {
noItems: 'No shortcuts available.',
columns: { shortcut: 'Shortcut', action: 'Action', description: 'Description' },
},
gettingStarted: {
noItems: 'No guides available.',
estimatedTime: 'Estimated time',
difficulty: {
beginner: 'Beginner',
intermediate: 'Intermediate',
advanced: 'Advanced',
},
},
changelog: {
noItems: 'No changelog available.',
showAll: 'Show all releases',
types: { major: 'Major', minor: 'Minor', patch: 'Patch', beta: 'Beta' },
labels: {
features: 'New Features',
improvements: 'Improvements',
bugFixes: 'Bug Fixes',
},
},
contact: {
noInfo: 'No contact info available.',
email: 'Send email',
responseTime: 'Response time',
},
common: { back: 'Back', showMore: 'Show more', showLess: 'Show less' },
}
);
</script>
<svelte:head>
<title>{translations.title} | Chat</title>
</svelte:head>
<HelpPage
{content}
appName="Chat"
appId="chat"
{translations}
showBackButton
onBack={() => goto('/chat')}
showGettingStarted={false}
showChangelog={false}
defaultSection="faq"
/>

View file

@ -25,6 +25,8 @@
"@manacore/shared-feedback-service": "workspace:*",
"@manacore/shared-feedback-ui": "workspace:*",
"@manacore/shared-i18n": "workspace:*",
"@manacore/shared-help-types": "workspace:*",
"@manacore/shared-help-ui": "workspace:*",
"@manacore/shared-icons": "workspace:*",
"@manacore/shared-profile-ui": "workspace:*",
"@manacore/shared-subscription-types": "workspace:*",

View file

@ -0,0 +1,184 @@
/**
* Help content for Picture app
*/
import type { HelpContent } from '@manacore/shared-help-types';
export function getPictureHelpContent(locale: string): HelpContent {
const isDE = locale === 'de';
return {
faq: [
{
id: 'faq-generate',
question: isDE ? 'Wie generiere ich ein Bild?' : 'How do I generate an image?',
answer: isDE
? '<p>So erstellst du ein KI-Bild:</p><ol><li>Gehe zu <strong>Generieren</strong> (Taste <kbd>N</kbd>)</li><li>Wähle ein Modell aus</li><li>Beschreibe dein gewünschtes Bild im Prompt-Feld</li><li>Klicke auf <strong>Generieren</strong></li></ol><p>Tipp: Je detaillierter dein Prompt, desto besser das Ergebnis.</p>'
: '<p>To create an AI image:</p><ol><li>Go to <strong>Generate</strong> (key <kbd>N</kbd>)</li><li>Select a model</li><li>Describe your desired image in the prompt field</li><li>Click <strong>Generate</strong></li></ol><p>Tip: The more detailed your prompt, the better the result.</p>',
category: 'features',
order: 1,
language: isDE ? 'de' : 'en',
featured: true,
tags: isDE
? ['generieren', 'bild', 'erstellen', 'prompt']
: ['generate', 'image', 'create', 'prompt'],
},
{
id: 'faq-credits',
question: isDE ? 'Wie funktioniert das Credit-System?' : 'How does the credit system work?',
answer: isDE
? '<p>Picture nutzt ein Freemium-Modell:</p><ul><li><strong>3 kostenlose Generierungen</strong> für neue Nutzer</li><li>Danach werden <strong>10 Credits pro Generierung</strong> berechnet</li><li>Credits können über die Einstellungen erworben werden</li><li>Dein verbleibendes Kontingent wird in der App angezeigt</li></ul>'
: '<p>Picture uses a freemium model:</p><ul><li><strong>3 free generations</strong> for new users</li><li>After that, <strong>10 credits per generation</strong> are charged</li><li>Credits can be purchased via settings</li><li>Your remaining balance is displayed in the app</li></ul>',
category: 'billing',
order: 2,
language: isDE ? 'de' : 'en',
tags: isDE ? ['credits', 'kosten', 'freemium'] : ['credits', 'cost', 'freemium'],
},
{
id: 'faq-boards',
question: isDE ? 'Was sind Moodboards?' : 'What are Moodboards?',
answer: isDE
? '<p>Moodboards sind Sammlungen, um deine Bilder zu organisieren:</p><ul><li>Erstelle Boards für verschiedene Projekte oder Stile</li><li>Füge Bilder per Drag & Drop zu Boards hinzu</li><li>Teile Boards mit anderen</li></ul><p>Gehe zu <strong>Boards</strong> (Taste <kbd>M</kbd>) um loszulegen.</p>'
: '<p>Moodboards are collections to organize your images:</p><ul><li>Create boards for different projects or styles</li><li>Add images to boards via drag & drop</li><li>Share boards with others</li></ul><p>Go to <strong>Boards</strong> (key <kbd>M</kbd>) to get started.</p>',
category: 'features',
order: 3,
language: isDE ? 'de' : 'en',
tags: isDE
? ['moodboard', 'sammlung', 'organisieren']
: ['moodboard', 'collection', 'organize'],
},
{
id: 'faq-explore',
question: isDE ? 'Was ist der Explore-Bereich?' : 'What is the Explore section?',
answer: isDE
? '<p>Im Explore-Bereich kannst du Bilder anderer Nutzer entdecken, dich inspirieren lassen und Prompts als Vorlage verwenden.</p>'
: '<p>In the Explore section you can discover images from other users, get inspired, and use prompts as templates.</p>',
category: 'features',
order: 4,
language: isDE ? 'de' : 'en',
tags: isDE
? ['explore', 'entdecken', 'inspiration']
: ['explore', 'discover', 'inspiration'],
},
{
id: 'faq-privacy',
question: isDE ? 'Wie werden meine Bilder geschützt?' : 'How are my images protected?',
answer: isDE
? '<p>Deine Bilder sind sicher:</p><ul><li><strong>Privat</strong>: Generierte Bilder sind standardmäßig nur für dich sichtbar</li><li><strong>Verschlüsselung</strong>: Alle Daten werden bei der Übertragung (TLS) verschlüsselt</li><li><strong>DSGVO-konform</strong>: Wir halten uns an die EU-Datenschutzverordnung</li><li><strong>Löschung</strong>: Du kannst Bilder jederzeit dauerhaft löschen</li></ul>'
: '<p>Your images are secure:</p><ul><li><strong>Private</strong>: Generated images are only visible to you by default</li><li><strong>Encryption</strong>: All data is encrypted in transit (TLS)</li><li><strong>GDPR Compliant</strong>: We follow EU data protection regulations</li><li><strong>Deletion</strong>: You can permanently delete images at any time</li></ul>',
category: 'privacy',
order: 5,
language: isDE ? 'de' : 'en',
featured: true,
tags: isDE ? ['datenschutz', 'sicherheit', 'dsgvo'] : ['privacy', 'security', 'gdpr'],
},
],
features: [
{
id: 'feature-generate',
title: isDE ? 'KI-Bildgenerierung' : 'AI Image Generation',
description: isDE
? 'Erstelle Bilder mit modernsten KI-Modellen'
: 'Create images with state-of-the-art AI models',
icon: '🎨',
category: 'core',
highlights: isDE
? ['Replicate AI-Modelle', 'Prompt-basiert', '3 kostenlose Generierungen']
: ['Replicate AI models', 'Prompt-based', '3 free generations'],
content: '',
order: 1,
language: isDE ? 'de' : 'en',
},
{
id: 'feature-gallery',
title: isDE ? 'Galerie' : 'Gallery',
description: isDE
? 'Verwalte und organisiere deine generierten Bilder'
: 'Manage and organize your generated images',
icon: '🖼️',
category: 'core',
highlights: isDE
? ['Raster- & Listenansicht', 'Tags & Favoriten', 'Archiv']
: ['Grid & list view', 'Tags & favorites', 'Archive'],
content: '',
order: 2,
language: isDE ? 'de' : 'en',
},
{
id: 'feature-boards',
title: 'Moodboards',
description: isDE
? 'Sammle und organisiere Bilder in thematischen Boards'
: 'Collect and organize images in themed boards',
icon: '📌',
category: 'core',
highlights: isDE
? ['Drag & Drop', 'Boards teilen', 'Thematisch sortieren']
: ['Drag & drop', 'Share boards', 'Sort by theme'],
content: '',
order: 3,
language: isDE ? 'de' : 'en',
},
{
id: 'feature-explore',
title: 'Explore',
description: isDE
? 'Entdecke Bilder und Prompts der Community'
: 'Discover images and prompts from the community',
icon: '🔍',
category: 'core',
highlights: isDE
? ['Community-Feed', 'Prompt-Vorlagen', 'Inspiration']
: ['Community feed', 'Prompt templates', 'Inspiration'],
content: '',
order: 4,
language: isDE ? 'de' : 'en',
},
],
shortcuts: [
{
id: 'shortcuts-nav',
category: 'navigation',
title: 'Navigation',
language: isDE ? 'de' : 'en',
order: 1,
shortcuts: [
{ shortcut: 'G', action: isDE ? 'Galerie' : 'Gallery' },
{ shortcut: 'M', action: 'Moodboards' },
{ shortcut: 'E', action: 'Explore' },
{ shortcut: 'N', action: isDE ? 'Generieren' : 'Generate' },
{ shortcut: 'U', action: 'Upload' },
{ shortcut: 'A', action: isDE ? 'Archiv' : 'Archive' },
],
},
{
id: 'shortcuts-view',
category: 'general',
title: isDE ? 'Ansicht' : 'View',
language: isDE ? 'de' : 'en',
order: 2,
shortcuts: [
{ shortcut: '1', action: isDE ? 'Listen-Ansicht' : 'List view' },
{ shortcut: '2', action: isDE ? 'Raster 3×3' : 'Grid 3×3' },
{ shortcut: '3', action: isDE ? 'Raster 5×5' : 'Grid 5×5' },
{ shortcut: 'Tab', action: isDE ? 'UI ein-/ausblenden' : 'Toggle UI' },
{ shortcut: '?', action: isDE ? 'Tastenkürzel anzeigen' : 'Show shortcuts' },
],
},
],
gettingStarted: [],
changelog: [],
contact: {
id: 'contact-support',
title: isDE ? 'Support kontaktieren' : 'Contact Support',
content: isDE
? '<p>Unser Support-Team hilft dir bei allen Fragen rund um Picture.</p>'
: '<p>Our support team is here to help you with any picture-related questions.</p>',
language: isDE ? 'de' : 'en',
order: 1,
supportEmail: 'support@mana.how',
documentationUrl: 'https://mana.how/docs',
responseTime: isDE ? 'Normalerweise innerhalb von 24 Stunden' : 'Usually within 24 hours',
},
};
}

View file

@ -0,0 +1,157 @@
<script lang="ts">
import { goto } from '$app/navigation';
import { locale } from 'svelte-i18n';
import { HelpPage } from '@manacore/shared-help-ui';
import type { HelpPageTranslations } from '@manacore/shared-help-ui';
import { getPictureHelpContent } from '$lib/content/help/index.js';
const content = $derived(getPictureHelpContent($locale ?? 'de'));
const translations: HelpPageTranslations = $derived(
$locale === 'de'
? {
title: 'Hilfe & Support',
subtitle: 'Finde Antworten und lerne Picture kennen',
searchPlaceholder: 'Hilfe durchsuchen...',
sections: {
faq: 'FAQ',
features: 'Features',
shortcuts: 'Tastenkürzel',
gettingStarted: 'Erste Schritte',
changelog: 'Änderungen',
contact: 'Kontakt',
},
search: {
noResults: 'Keine Ergebnisse für "{query}"',
resultsCount: '{count} Ergebnisse',
searching: 'Suche...',
},
faq: {
noItems: 'Keine häufigen Fragen verfügbar.',
allCategories: 'Alle',
categories: {
general: 'Allgemein',
account: 'Konto',
billing: 'Abrechnung',
features: 'Funktionen',
technical: 'Technisch',
privacy: 'Datenschutz',
},
},
features: {
noItems: 'Keine Features verfügbar.',
comingSoon: 'Demnächst',
learnMore: 'Mehr erfahren',
},
shortcuts: {
noItems: 'Keine Tastenkürzel verfügbar.',
columns: { shortcut: 'Kürzel', action: 'Aktion', description: 'Beschreibung' },
},
gettingStarted: {
noItems: 'Keine Anleitungen verfügbar.',
estimatedTime: 'Geschätzte Zeit',
difficulty: {
beginner: 'Einsteiger',
intermediate: 'Fortgeschritten',
advanced: 'Experte',
},
},
changelog: {
noItems: 'Keine Änderungen verfügbar.',
showAll: 'Alle Versionen anzeigen',
types: { major: 'Hauptversion', minor: 'Nebenversion', patch: 'Patch', beta: 'Beta' },
labels: {
features: 'Neue Funktionen',
improvements: 'Verbesserungen',
bugFixes: 'Fehlerbehebungen',
},
},
contact: {
noInfo: 'Keine Kontaktinformationen verfügbar.',
email: 'E-Mail senden',
responseTime: 'Antwortzeit',
},
common: { back: 'Zurück', showMore: 'Mehr anzeigen', showLess: 'Weniger anzeigen' },
}
: {
title: 'Help & Support',
subtitle: 'Find answers and learn how to use Picture',
searchPlaceholder: 'Search help...',
sections: {
faq: 'FAQ',
features: 'Features',
shortcuts: 'Shortcuts',
gettingStarted: 'Getting Started',
changelog: 'Changelog',
contact: 'Contact',
},
search: {
noResults: 'No results for "{query}"',
resultsCount: '{count} results',
searching: 'Searching...',
},
faq: {
noItems: 'No FAQs available.',
allCategories: 'All',
categories: {
general: 'General',
account: 'Account',
billing: 'Billing',
features: 'Features',
technical: 'Technical',
privacy: 'Privacy',
},
},
features: {
noItems: 'No features available.',
comingSoon: 'Coming Soon',
learnMore: 'Learn More',
},
shortcuts: {
noItems: 'No shortcuts available.',
columns: { shortcut: 'Shortcut', action: 'Action', description: 'Description' },
},
gettingStarted: {
noItems: 'No guides available.',
estimatedTime: 'Estimated time',
difficulty: {
beginner: 'Beginner',
intermediate: 'Intermediate',
advanced: 'Advanced',
},
},
changelog: {
noItems: 'No changelog available.',
showAll: 'Show all releases',
types: { major: 'Major', minor: 'Minor', patch: 'Patch', beta: 'Beta' },
labels: {
features: 'New Features',
improvements: 'Improvements',
bugFixes: 'Bug Fixes',
},
},
contact: {
noInfo: 'No contact info available.',
email: 'Send email',
responseTime: 'Response time',
},
common: { back: 'Back', showMore: 'Show more', showLess: 'Show less' },
}
);
</script>
<svelte:head>
<title>{translations.title} | Picture</title>
</svelte:head>
<HelpPage
{content}
appName="Picture"
appId="picture"
{translations}
showBackButton
onBack={() => goto('/app/gallery')}
showGettingStarted={false}
showChangelog={false}
defaultSection="faq"
/>

View file

@ -46,6 +46,8 @@
"@manacore/shared-feedback-service": "workspace:*",
"@manacore/shared-feedback-ui": "workspace:*",
"@manacore/shared-i18n": "workspace:*",
"@manacore/shared-help-types": "workspace:*",
"@manacore/shared-help-ui": "workspace:*",
"@manacore/shared-icons": "workspace:*",
"@manacore/shared-profile-ui": "workspace:*",
"@manacore/shared-stores": "workspace:*",

View file

@ -0,0 +1,160 @@
/**
* Help content for Storage app
*/
import type { HelpContent } from '@manacore/shared-help-types';
export function getStorageHelpContent(locale: string): HelpContent {
const isDE = locale === 'de';
return {
faq: [
{
id: 'faq-upload',
question: isDE ? 'Wie lade ich Dateien hoch?' : 'How do I upload files?',
answer: isDE
? '<p>Du kannst Dateien auf verschiedene Arten hochladen:</p><ul><li><strong>Drag & Drop</strong>: Ziehe Dateien direkt in den Browser</li><li><strong>Upload-Button</strong>: Klicke auf das Upload-Symbol in der Toolbar</li><li>Es können bis zu 10 Dateien gleichzeitig hochgeladen werden (max. 100 MB pro Datei)</li></ul>'
: '<p>You can upload files in several ways:</p><ul><li><strong>Drag & drop</strong>: Drag files directly into the browser</li><li><strong>Upload button</strong>: Click the upload icon in the toolbar</li><li>Up to 10 files can be uploaded simultaneously (max 100 MB per file)</li></ul>',
category: 'features',
order: 1,
language: isDE ? 'de' : 'en',
tags: isDE ? ['hochladen', 'upload', 'dateien'] : ['upload', 'files', 'drag-drop'],
},
{
id: 'faq-share',
question: isDE ? 'Wie teile ich Dateien mit anderen?' : 'How do I share files?',
answer: isDE
? '<p>Um eine Datei oder einen Ordner zu teilen:</p><ul><li>Rechtsklick auf die Datei und wähle <strong>Teilen</strong></li><li>Ein Share-Link wird erstellt, den du kopieren kannst</li><li>Optional: Setze ein <strong>Passwort</strong>, ein <strong>Ablaufdatum</strong> oder ein <strong>Download-Limit</strong></li><li>Geteilte Links können jederzeit widerrufen werden</li></ul>'
: '<p>To share a file or folder:</p><ul><li>Right-click the file and select <strong>Share</strong></li><li>A share link will be created that you can copy</li><li>Optional: Set a <strong>password</strong>, <strong>expiration date</strong>, or <strong>download limit</strong></li><li>Shared links can be revoked at any time</li></ul>',
category: 'features',
order: 2,
language: isDE ? 'de' : 'en',
tags: isDE ? ['teilen', 'link', 'freigabe'] : ['share', 'link', 'access'],
},
{
id: 'faq-versions',
question: isDE ? 'Wie funktioniert die Versionierung?' : 'How does versioning work?',
answer: isDE
? '<p>Jede Datei unterstützt automatische Versionierung:</p><ul><li>Lade eine neue Version hoch, um die Datei zu aktualisieren</li><li>Alle vorherigen Versionen bleiben erhalten</li><li>Du kannst jederzeit ältere Versionen herunterladen</li><li>Jede Version zeigt Größe, Datum und optionalen Kommentar</li></ul>'
: '<p>Every file supports automatic versioning:</p><ul><li>Upload a new version to update the file</li><li>All previous versions are preserved</li><li>You can download older versions at any time</li><li>Each version shows size, date, and optional comment</li></ul>',
category: 'features',
order: 3,
language: isDE ? 'de' : 'en',
tags: isDE ? ['version', 'historie', 'aktualisieren'] : ['version', 'history', 'update'],
},
{
id: 'faq-trash',
question: isDE ? 'Wie funktioniert der Papierkorb?' : 'How does the trash work?',
answer: isDE
? '<p>Gelöschte Dateien landen zunächst im Papierkorb:</p><ul><li>Im Papierkorb können Dateien <strong>wiederhergestellt</strong> werden</li><li>Einzelne Dateien oder der gesamte Papierkorb können <strong>endgültig gelöscht</strong> werden</li><li>Endgültig gelöschte Dateien können nicht wiederhergestellt werden</li></ul>'
: '<p>Deleted files are moved to the trash first:</p><ul><li>Files in trash can be <strong>restored</strong></li><li>Individual files or the entire trash can be <strong>permanently deleted</strong></li><li>Permanently deleted files cannot be recovered</li></ul>',
category: 'features',
order: 4,
language: isDE ? 'de' : 'en',
tags: isDE ? ['papierkorb', 'löschen', 'wiederherstellen'] : ['trash', 'delete', 'restore'],
},
{
id: 'faq-privacy',
question: isDE ? 'Wie werden meine Dateien geschützt?' : 'How are my files protected?',
answer: isDE
? '<p>Deine Dateien sind sicher:</p><ul><li><strong>Verschlüsselung</strong>: Alle Daten werden bei der Übertragung (TLS) verschlüsselt</li><li><strong>Privat</strong>: Nur du hast Zugriff auf deine Dateien</li><li><strong>DSGVO-konform</strong>: Wir halten uns an die EU-Datenschutzverordnung</li><li><strong>Share-Kontrolle</strong>: Du bestimmst, wer Zugriff hat (Passwort, Ablauf, Limit)</li></ul>'
: '<p>Your files are secure:</p><ul><li><strong>Encryption</strong>: All data is encrypted in transit (TLS)</li><li><strong>Private</strong>: Only you have access to your files</li><li><strong>GDPR Compliant</strong>: We follow EU data protection regulations</li><li><strong>Share control</strong>: You decide who has access (password, expiry, limits)</li></ul>',
category: 'privacy',
order: 5,
language: isDE ? 'de' : 'en',
featured: true,
tags: isDE ? ['datenschutz', 'sicherheit', 'dsgvo'] : ['privacy', 'security', 'gdpr'],
},
],
features: [
{
id: 'feature-storage',
title: isDE ? 'Cloud-Speicher' : 'Cloud Storage',
description: isDE
? 'Sichere Dateiablage mit Ordnerstruktur'
: 'Secure file storage with folder structure',
icon: '☁️',
category: 'core',
highlights: isDE
? ['Drag & Drop Upload', 'Ordner-Hierarchie', 'Datei-Tags']
: ['Drag & drop upload', 'Folder hierarchy', 'File tags'],
content: '',
order: 1,
language: isDE ? 'de' : 'en',
},
{
id: 'feature-sharing',
title: isDE ? 'Dateien teilen' : 'File Sharing',
description: isDE ? 'Teile Dateien sicher per Link' : 'Share files securely via link',
icon: '🔗',
category: 'core',
highlights: isDE
? ['Passwortschutz', 'Ablaufdatum', 'Download-Limit']
: ['Password protection', 'Expiration date', 'Download limit'],
content: '',
order: 2,
language: isDE ? 'de' : 'en',
},
{
id: 'feature-versioning',
title: isDE ? 'Versionierung' : 'Versioning',
description: isDE
? 'Automatische Versionskontrolle für alle Dateien'
: 'Automatic version control for all files',
icon: '📝',
category: 'advanced',
highlights: isDE
? ['Versions-Historie', 'Kommentare', 'Ältere Versionen laden']
: ['Version history', 'Comments', 'Download older versions'],
content: '',
order: 3,
language: isDE ? 'de' : 'en',
},
{
id: 'feature-search',
title: isDE ? 'Suche' : 'Search',
description: isDE
? 'Finde Dateien und Ordner blitzschnell'
: 'Find files and folders instantly',
icon: '🔍',
category: 'core',
highlights: isDE
? ['Volltextsuche', 'Tag-Filter', 'Favoriten']
: ['Full-text search', 'Tag filters', 'Favorites'],
content: '',
order: 4,
language: isDE ? 'de' : 'en',
},
],
shortcuts: [
{
id: 'shortcuts-nav',
category: 'navigation',
title: 'Navigation',
language: isDE ? 'de' : 'en',
order: 1,
shortcuts: [
{ shortcut: 'Cmd/Ctrl + K', action: isDE ? 'Suche öffnen' : 'Open search' },
{ shortcut: 'Cmd/Ctrl + 1', action: isDE ? 'Dateien' : 'Files' },
{ shortcut: 'Cmd/Ctrl + 2', action: isDE ? 'Geteilt' : 'Shared' },
{ shortcut: 'Cmd/Ctrl + 3', action: isDE ? 'Favoriten' : 'Favorites' },
{ shortcut: 'Cmd/Ctrl + 4', action: isDE ? 'Papierkorb' : 'Trash' },
],
},
],
gettingStarted: [],
changelog: [],
contact: {
id: 'contact-support',
title: isDE ? 'Support kontaktieren' : 'Contact Support',
content: isDE
? '<p>Unser Support-Team hilft dir bei allen Fragen rund um Storage.</p>'
: '<p>Our support team is here to help you with any storage-related questions.</p>',
language: isDE ? 'de' : 'en',
order: 1,
supportEmail: 'support@mana.how',
documentationUrl: 'https://mana.how/docs',
responseTime: isDE ? 'Normalerweise innerhalb von 24 Stunden' : 'Usually within 24 hours',
},
};
}

View file

@ -0,0 +1,157 @@
<script lang="ts">
import { goto } from '$app/navigation';
import { locale } from 'svelte-i18n';
import { HelpPage } from '@manacore/shared-help-ui';
import type { HelpPageTranslations } from '@manacore/shared-help-ui';
import { getStorageHelpContent } from '$lib/content/help/index.js';
const content = $derived(getStorageHelpContent($locale ?? 'de'));
const translations: HelpPageTranslations = $derived(
$locale === 'de'
? {
title: 'Hilfe & Support',
subtitle: 'Finde Antworten und lerne Storage kennen',
searchPlaceholder: 'Hilfe durchsuchen...',
sections: {
faq: 'FAQ',
features: 'Features',
shortcuts: 'Tastenkürzel',
gettingStarted: 'Erste Schritte',
changelog: 'Änderungen',
contact: 'Kontakt',
},
search: {
noResults: 'Keine Ergebnisse für "{query}"',
resultsCount: '{count} Ergebnisse',
searching: 'Suche...',
},
faq: {
noItems: 'Keine häufigen Fragen verfügbar.',
allCategories: 'Alle',
categories: {
general: 'Allgemein',
account: 'Konto',
billing: 'Abrechnung',
features: 'Funktionen',
technical: 'Technisch',
privacy: 'Datenschutz',
},
},
features: {
noItems: 'Keine Features verfügbar.',
comingSoon: 'Demnächst',
learnMore: 'Mehr erfahren',
},
shortcuts: {
noItems: 'Keine Tastenkürzel verfügbar.',
columns: { shortcut: 'Kürzel', action: 'Aktion', description: 'Beschreibung' },
},
gettingStarted: {
noItems: 'Keine Anleitungen verfügbar.',
estimatedTime: 'Geschätzte Zeit',
difficulty: {
beginner: 'Einsteiger',
intermediate: 'Fortgeschritten',
advanced: 'Experte',
},
},
changelog: {
noItems: 'Keine Änderungen verfügbar.',
showAll: 'Alle Versionen anzeigen',
types: { major: 'Hauptversion', minor: 'Nebenversion', patch: 'Patch', beta: 'Beta' },
labels: {
features: 'Neue Funktionen',
improvements: 'Verbesserungen',
bugFixes: 'Fehlerbehebungen',
},
},
contact: {
noInfo: 'Keine Kontaktinformationen verfügbar.',
email: 'E-Mail senden',
responseTime: 'Antwortzeit',
},
common: { back: 'Zurück', showMore: 'Mehr anzeigen', showLess: 'Weniger anzeigen' },
}
: {
title: 'Help & Support',
subtitle: 'Find answers and learn how to use Storage',
searchPlaceholder: 'Search help...',
sections: {
faq: 'FAQ',
features: 'Features',
shortcuts: 'Shortcuts',
gettingStarted: 'Getting Started',
changelog: 'Changelog',
contact: 'Contact',
},
search: {
noResults: 'No results for "{query}"',
resultsCount: '{count} results',
searching: 'Searching...',
},
faq: {
noItems: 'No FAQs available.',
allCategories: 'All',
categories: {
general: 'General',
account: 'Account',
billing: 'Billing',
features: 'Features',
technical: 'Technical',
privacy: 'Privacy',
},
},
features: {
noItems: 'No features available.',
comingSoon: 'Coming Soon',
learnMore: 'Learn More',
},
shortcuts: {
noItems: 'No shortcuts available.',
columns: { shortcut: 'Shortcut', action: 'Action', description: 'Description' },
},
gettingStarted: {
noItems: 'No guides available.',
estimatedTime: 'Estimated time',
difficulty: {
beginner: 'Beginner',
intermediate: 'Intermediate',
advanced: 'Advanced',
},
},
changelog: {
noItems: 'No changelog available.',
showAll: 'Show all releases',
types: { major: 'Major', minor: 'Minor', patch: 'Patch', beta: 'Beta' },
labels: {
features: 'New Features',
improvements: 'Improvements',
bugFixes: 'Bug Fixes',
},
},
contact: {
noInfo: 'No contact info available.',
email: 'Send email',
responseTime: 'Response time',
},
common: { back: 'Back', showMore: 'Show more', showLess: 'Show less' },
}
);
</script>
<svelte:head>
<title>{translations.title} | Storage</title>
</svelte:head>
<HelpPage
{content}
appName="Storage"
appId="storage"
{translations}
showBackButton
onBack={() => goto('/files')}
showGettingStarted={false}
showChangelog={false}
defaultSection="faq"
/>

22
pnpm-lock.yaml generated
View file

@ -752,6 +752,12 @@ importers:
'@manacore/shared-feedback-ui':
specifier: workspace:*
version: link:../../../../packages/shared-feedback-ui
'@manacore/shared-help-types':
specifier: workspace:*
version: link:../../../../packages/shared-help-types
'@manacore/shared-help-ui':
specifier: workspace:*
version: link:../../../../packages/shared-help-ui
'@manacore/shared-i18n':
specifier: workspace:*
version: link:../../../../packages/shared-i18n
@ -4236,6 +4242,12 @@ importers:
'@manacore/shared-feedback-ui':
specifier: workspace:*
version: link:../../../../packages/shared-feedback-ui
'@manacore/shared-help-types':
specifier: workspace:*
version: link:../../../../packages/shared-help-types
'@manacore/shared-help-ui':
specifier: workspace:*
version: link:../../../../packages/shared-help-ui
'@manacore/shared-i18n':
specifier: workspace:*
version: link:../../../../packages/shared-i18n
@ -5477,6 +5489,12 @@ importers:
'@manacore/shared-feedback-ui':
specifier: workspace:*
version: link:../../../../packages/shared-feedback-ui
'@manacore/shared-help-types':
specifier: workspace:*
version: link:../../../../packages/shared-help-types
'@manacore/shared-help-ui':
specifier: workspace:*
version: link:../../../../packages/shared-help-ui
'@manacore/shared-i18n':
specifier: workspace:*
version: link:../../../../packages/shared-i18n
@ -6967,6 +6985,10 @@ importers:
version: 5.9.3
packages/shared-nestjs-auth:
dependencies:
jose:
specifier: ^5.0.0
version: 5.10.0
devDependencies:
'@nestjs/common':
specifier: ^10.0.0