feat(calendar, todo): add shared help pages

Add help pages to Calendar and Todo web apps using the shared help system:

- Calendar: FAQ (events, recurring, sharing, sync, privacy), features,
  shortcuts, contact — with DE/EN/FR/IT/ES content support
- Todo: FAQ (quick add syntax, projects, kanban, recurring, privacy),
  features, shortcuts, contact — with DE/EN content

Both apps follow the Contacts reference implementation pattern.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-03-25 08:47:12 +01:00
parent 37b061f7e6
commit dd5c0d502f
7 changed files with 1261 additions and 486 deletions

View file

@ -52,6 +52,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-splitscreen": "workspace:*",

View file

@ -0,0 +1,225 @@
/**
* Help content for Calendar app
*/
import type { HelpContent } from '@manacore/shared-help-types';
export function getCalendarHelpContent(locale: string): HelpContent {
const isDE = locale === 'de';
const isFR = locale === 'fr';
const isIT = locale === 'it';
const isES = locale === 'es';
function t(de: string, en: string, fr?: string, it?: string, es?: string): string {
if (isDE) return de;
if (isFR) return fr ?? en;
if (isIT) return it ?? en;
if (isES) return es ?? en;
return en;
}
return {
faq: [
{
id: 'faq-create-event',
question: t(
'Wie erstelle ich einen Termin?',
'How do I create an event?',
'Comment créer un événement ?',
'Come creo un evento?',
'¿Cómo creo un evento?'
),
answer: t(
'<p>Du kannst Termine auf verschiedene Arten erstellen:</p><ul><li><strong>Schnelleingabe</strong>: Nutze die Eingabeleiste oben — tippe z.B. "Meeting morgen 14-16 Uhr @Arbeit"</li><li><strong>Klick & Ziehen</strong>: Klicke und ziehe in der Wochenansicht, um einen Zeitraum auszuwählen</li><li><strong>Neuer Termin</strong>: Klicke auf das + Symbol für das vollständige Formular</li></ul>',
'<p>You can create events in several ways:</p><ul><li><strong>Quick input</strong>: Use the input bar at the top — type e.g. "Meeting tomorrow 2-4pm @Work"</li><li><strong>Click & drag</strong>: Click and drag in the week view to select a time range</li><li><strong>New event</strong>: Click the + icon for the full form</li></ul>'
),
category: 'features',
order: 1,
language: isDE ? 'de' : isFR ? 'fr' : isIT ? 'it' : isES ? 'es' : 'en',
tags: isDE ? ['termin', 'erstellen', 'neu'] : ['event', 'create', 'new'],
},
{
id: 'faq-recurring',
question: t(
'Wie erstelle ich wiederkehrende Termine?',
'How do I create recurring events?'
),
answer: t(
'<p>Öffne einen Termin und setze die <strong>Wiederholung</strong>. Unterstützte Optionen:</p><ul><li>Täglich, wöchentlich, monatlich, jährlich</li><li>Bestimmte Wochentage (z.B. Mo, Mi, Fr)</li><li>Alle X Wochen/Monate</li><li>Enddatum oder Anzahl der Wiederholungen</li></ul><p>In der Schnelleingabe kannst du auch "wöchentlich", "täglich" oder "jeden Montag" eingeben.</p>',
'<p>Open an event and set the <strong>recurrence</strong>. Supported options:</p><ul><li>Daily, weekly, monthly, yearly</li><li>Specific weekdays (e.g. Mon, Wed, Fri)</li><li>Every X weeks/months</li><li>End date or number of occurrences</li></ul><p>In the quick input, you can also type "weekly", "daily", or "every Monday".</p>'
),
category: 'features',
order: 2,
language: isDE ? 'de' : 'en',
tags: isDE ? ['wiederkehrend', 'wiederholung', 'serie'] : ['recurring', 'repeat', 'series'],
},
{
id: 'faq-share-calendar',
question: t(
'Wie teile ich einen Kalender mit anderen?',
'How do I share a calendar with others?'
),
answer: t(
'<p>Gehe zu <strong>Einstellungen > Freigabe</strong> und wähle den Kalender aus. Du kannst:</p><ul><li><strong>Per E-Mail</strong> einladen (Lese- oder Schreibzugriff)</li><li><strong>Per Link</strong> teilen (mit optionalem Ablaufdatum)</li><li>Berechtigungen nachträglich ändern oder entziehen</li></ul>',
'<p>Go to <strong>Settings > Sharing</strong> and select the calendar. You can:</p><ul><li><strong>Invite by email</strong> (read or write access)</li><li><strong>Share by link</strong> (with optional expiration)</li><li>Change or revoke permissions later</li></ul>'
),
category: 'features',
order: 3,
language: isDE ? 'de' : 'en',
tags: isDE ? ['teilen', 'freigabe', 'einladen'] : ['share', 'invite', 'permissions'],
},
{
id: 'faq-sync',
question: t('Kann ich externe Kalender synchronisieren?', 'Can I sync external calendars?'),
answer: t(
'<p>Ja! Gehe zu <strong>Einstellungen > Sync</strong>. Unterstützte Quellen:</p><ul><li><strong>CalDAV</strong>: Nextcloud, Radicale, etc.</li><li><strong>iCal URL</strong>: Jeder öffentliche Kalender-Feed</li><li><strong>Google Kalender</strong> (über CalDAV)</li><li><strong>Apple Kalender</strong> (über CalDAV)</li></ul><p>Die Synchronisation erfolgt automatisch im eingestellten Intervall.</p>',
'<p>Yes! Go to <strong>Settings > Sync</strong>. Supported sources:</p><ul><li><strong>CalDAV</strong>: Nextcloud, Radicale, etc.</li><li><strong>iCal URL</strong>: Any public calendar feed</li><li><strong>Google Calendar</strong> (via CalDAV)</li><li><strong>Apple Calendar</strong> (via CalDAV)</li></ul><p>Synchronization happens automatically at the configured interval.</p>'
),
category: 'technical',
order: 4,
language: isDE ? 'de' : 'en',
tags: isDE
? ['sync', 'caldav', 'google', 'apple', 'extern']
: ['sync', 'caldav', 'google', 'apple', 'external'],
},
{
id: 'faq-privacy',
question: t('Wie werden meine Daten geschützt?', 'How is my data protected?'),
answer: t(
'<p>Deine Daten sind sicher:</p><ul><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>Kein Datenverkauf</strong>: Deine Kalender-Daten werden nie an Dritte verkauft</li><li><strong>Export</strong>: Du kannst jederzeit alle Kalender als iCal exportieren</li></ul>',
'<p>Your data is secure:</p><ul><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>No Data Selling</strong>: Your calendar data is never sold to third parties</li><li><strong>Export</strong>: You can export all calendars as iCal anytime</li></ul>'
),
category: 'privacy',
order: 5,
language: isDE ? 'de' : 'en',
featured: true,
tags: isDE ? ['datenschutz', 'dsgvo', 'sicherheit'] : ['privacy', 'gdpr', 'security'],
},
],
features: [
{
id: 'feature-calendars',
title: t('Mehrere Kalender', 'Multiple Calendars'),
description: t(
'Erstelle farbcodierte Kalender für Arbeit, Privat und mehr',
'Create color-coded calendars for work, personal, and more'
),
icon: '📅',
category: 'core',
highlights: t(
'Farbcodierung,Ein-/Ausblenden,Standard-Kalender',
'Color coding,Show/hide,Default calendar'
).split(','),
content: '',
order: 1,
language: isDE ? 'de' : 'en',
},
{
id: 'feature-views',
title: t('Flexible Ansichten', 'Flexible Views'),
description: t(
'Wechsle zwischen Tag-, Wochen-, Monats- und Agenda-Ansicht',
'Switch between day, week, month, and agenda views'
),
icon: '👁️',
category: 'core',
highlights: t(
'Wochenansicht,Monatsansicht,Agenda-Liste,Tagesansicht',
'Week view,Month view,Agenda list,Day view'
).split(','),
content: '',
order: 2,
language: isDE ? 'de' : 'en',
},
{
id: 'feature-recurring',
title: t('Wiederkehrende Termine', 'Recurring Events'),
description: t(
'Erstelle Serien mit flexiblen Wiederholungsregeln',
'Create series with flexible recurrence rules'
),
icon: '🔄',
category: 'advanced',
highlights: t(
'RFC 5545 RRULE,Ausnahmen,Enddatum oder Anzahl',
'RFC 5545 RRULE,Exceptions,End date or count'
).split(','),
content: '',
order: 3,
language: isDE ? 'de' : 'en',
},
{
id: 'feature-sharing',
title: t('Kalender teilen', 'Calendar Sharing'),
description: t(
'Teile Kalender mit Lese- oder Schreibzugriff',
'Share calendars with read or write access'
),
icon: '🤝',
category: 'advanced',
highlights: t(
'E-Mail-Einladung,Link-Freigabe,Berechtigungen',
'Email invitation,Link sharing,Permissions'
).split(','),
content: '',
order: 4,
language: isDE ? 'de' : 'en',
},
],
shortcuts: [
{
id: 'shortcuts-navigation',
category: 'navigation',
title: 'Navigation',
language: isDE ? 'de' : 'en',
order: 1,
shortcuts: [
{
shortcut: 'Cmd/Ctrl + 1',
action: t('Kalender öffnen', 'Open Calendar'),
},
{
shortcut: 'Cmd/Ctrl + 2',
action: t('Aufgaben öffnen', 'Open Tasks'),
},
{
shortcut: 'Cmd/Ctrl + 3',
action: t('Einstellungen öffnen', 'Open Settings'),
},
],
},
{
id: 'shortcuts-calendar',
category: 'app-specific',
title: t('Kalender', 'Calendar'),
language: isDE ? 'de' : 'en',
order: 2,
shortcuts: [
{
shortcut: 'Enter / Space',
action: t('Event/Task öffnen', 'Open event/task'),
},
{
shortcut: 'Esc',
action: t('Drag/Resize abbrechen', 'Cancel drag/resize'),
},
],
},
],
gettingStarted: [],
changelog: [],
contact: {
id: 'contact-support',
title: t('Support kontaktieren', 'Contact Support'),
content: t(
'<p>Unser Support-Team hilft dir bei allen Fragen rund um den Kalender.</p>',
'<p>Our support team is here to help you with any calendar-related questions.</p>'
),
language: isDE ? 'de' : 'en',
order: 1,
supportEmail: 'support@mana.how',
documentationUrl: 'https://mana.how/docs',
responseTime: t('Normalerweise innerhalb von 24 Stunden', 'Usually within 24 hours'),
},
};
}

View file

@ -0,0 +1,177 @@
<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 { getCalendarHelpContent } from '$lib/content/help/index.js';
const content = $derived(getCalendarHelpContent($locale ?? 'de'));
const translations: HelpPageTranslations = $derived(
$locale === 'de'
? {
title: 'Hilfe & Support',
subtitle: 'Finde Antworten und lerne den Kalender 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 Calendar',
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 frequently asked questions 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 keyboard 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 information available.',
email: 'Send email',
responseTime: 'Response time',
},
common: {
back: 'Back',
showMore: 'Show more',
showLess: 'Show less',
},
}
);
function handleBack() {
goto('/');
}
</script>
<svelte:head>
<title>{translations.title} | Kalender</title>
</svelte:head>
<HelpPage
{content}
appName="Kalender"
appId="calendar"
{translations}
showBackButton
onBack={handleBack}
showGettingStarted={false}
showChangelog={false}
defaultSection="faq"
/>

View file

@ -48,6 +48,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-splitscreen": "workspace:*",

View file

@ -0,0 +1,189 @@
/**
* Help content for Todo app
*/
import type { HelpContent } from '@manacore/shared-help-types';
export function getTodoHelpContent(locale: string): HelpContent {
const isDE = locale === 'de';
return {
faq: [
{
id: 'faq-quick-add',
question: isDE ? 'Wie funktioniert die Schnelleingabe?' : 'How does quick add work?',
answer: isDE
? '<p>Die Schnelleingabe erkennt automatisch verschiedene Muster:</p><ul><li><strong>Priorität</strong>: <code>!!!</code> (dringend), <code>!!</code> (hoch), <code>!</code> (mittel)</li><li><strong>Projekt</strong>: <code>@Projektname</code></li><li><strong>Labels</strong>: <code>#label1 #label2</code></li><li><strong>Datum</strong>: heute, morgen, nächsten Montag, 15.12.</li><li><strong>Wiederholung</strong>: täglich, wöchentlich, monatlich</li><li><strong>Unteraufgaben</strong>: <code>Titel: Item1, Item2, Item3</code></li></ul><p>Beispiel: <code>Einkaufen: Milch, Brot morgen !! @Privat #wichtig</code></p>'
: '<p>Quick add automatically recognizes various patterns:</p><ul><li><strong>Priority</strong>: <code>!!!</code> (urgent), <code>!!</code> (high), <code>!</code> (medium)</li><li><strong>Project</strong>: <code>@ProjectName</code></li><li><strong>Labels</strong>: <code>#label1 #label2</code></li><li><strong>Date</strong>: today, tomorrow, next Monday</li><li><strong>Recurrence</strong>: daily, weekly, monthly</li><li><strong>Subtasks</strong>: <code>Title: Item1, Item2, Item3</code></li></ul><p>Example: <code>Shopping: Milk, Bread tomorrow !! @Personal #important</code></p>',
category: 'features',
order: 1,
language: isDE ? 'de' : 'en',
featured: true,
tags: isDE ? ['schnelleingabe', 'erstellen', 'syntax'] : ['quick-add', 'create', 'syntax'],
},
{
id: 'faq-projects',
question: isDE
? 'Wie organisiere ich Aufgaben in Projekten?'
: 'How do I organize tasks in projects?',
answer: isDE
? '<p>Projekte helfen dir, Aufgaben thematisch zu gruppieren:</p><ul><li>Erstelle Projekte über das <strong>+</strong> Symbol in der Seitenleiste</li><li>Weise jeder Aufgabe ein Projekt zu (oder lasse sie im Posteingang)</li><li>Jedes Projekt hat eine eigene Farbe zur visuellen Unterscheidung</li><li>Ziehe Aufgaben per Drag & Drop zwischen Projekten</li></ul>'
: '<p>Projects help you group tasks by topic:</p><ul><li>Create projects via the <strong>+</strong> icon in the sidebar</li><li>Assign tasks to a project (or leave them in the inbox)</li><li>Each project has its own color for visual distinction</li><li>Drag and drop tasks between projects</li></ul>',
category: 'features',
order: 2,
language: isDE ? 'de' : 'en',
tags: isDE
? ['projekte', 'organisation', 'sortierung']
: ['projects', 'organize', 'sorting'],
},
{
id: 'faq-kanban',
question: isDE ? 'Was ist die Kanban-Ansicht?' : 'What is the Kanban view?',
answer: isDE
? '<p>Die Kanban-Ansicht zeigt deine Aufgaben als Karten in Spalten an. Du kannst:</p><ul><li>Aufgaben per Drag & Drop zwischen Spalten verschieben</li><li>Den Fortschritt visuell verfolgen</li><li>Spalten nach Priorität oder Status organisieren</li></ul><p>Wechsle mit <kbd>Ctrl+2</kbd> zur Kanban-Ansicht.</p>'
: '<p>The Kanban view shows your tasks as cards in columns. You can:</p><ul><li>Drag and drop tasks between columns</li><li>Track progress visually</li><li>Organize columns by priority or status</li></ul><p>Switch to Kanban view with <kbd>Ctrl+2</kbd>.</p>',
category: 'features',
order: 3,
language: isDE ? 'de' : 'en',
tags: isDE ? ['kanban', 'board', 'ansicht'] : ['kanban', 'board', 'view'],
},
{
id: 'faq-recurring',
question: isDE
? 'Wie erstelle ich wiederkehrende Aufgaben?'
: 'How do I create recurring tasks?',
answer: isDE
? '<p>Du kannst Wiederholungen auf zwei Arten setzen:</p><ul><li><strong>Schnelleingabe</strong>: Tippe "täglich", "wöchentlich", "jeden Montag" oder "monatlich"</li><li><strong>Aufgaben-Detail</strong>: Öffne die Aufgabe und wähle eine Wiederholungsregel</li></ul><p>Wenn du eine wiederkehrende Aufgabe abhakst, wird automatisch die nächste Instanz erstellt.</p>'
: '<p>You can set recurrence in two ways:</p><ul><li><strong>Quick add</strong>: Type "daily", "weekly", "every Monday", or "monthly"</li><li><strong>Task detail</strong>: Open the task and select a recurrence rule</li></ul><p>When you complete a recurring task, the next instance is automatically created.</p>',
category: 'features',
order: 4,
language: isDE ? 'de' : 'en',
tags: isDE ? ['wiederkehrend', 'wiederholung', 'serie'] : ['recurring', 'repeat', 'series'],
},
{
id: 'faq-privacy',
question: isDE ? 'Wie werden meine Daten geschützt?' : 'How is my data protected?',
answer: isDE
? '<p>Deine Daten sind sicher:</p><ul><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>Kein Datenverkauf</strong>: Deine Aufgaben werden nie an Dritte verkauft</li><li><strong>Datenexport</strong>: Du kannst jederzeit alle Daten exportieren</li></ul>'
: '<p>Your data is secure:</p><ul><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>No Data Selling</strong>: Your tasks are never sold to third parties</li><li><strong>Data Export</strong>: You can export all your data anytime</li></ul>',
category: 'privacy',
order: 5,
language: isDE ? 'de' : 'en',
featured: true,
tags: isDE ? ['datenschutz', 'dsgvo', 'sicherheit'] : ['privacy', 'gdpr', 'security'],
},
],
features: [
{
id: 'feature-quick-add',
title: isDE ? 'Schnelleingabe' : 'Quick Add',
description: isDE
? 'Erstelle Aufgaben in natürlicher Sprache'
: 'Create tasks using natural language',
icon: '⚡',
category: 'core',
highlights: isDE
? ['Automatische Erkennung', 'Datum & Priorität', 'Projekte & Labels']
: ['Auto-detection', 'Date & priority', 'Projects & labels'],
content: '',
order: 1,
language: isDE ? 'de' : 'en',
},
{
id: 'feature-kanban',
title: 'Kanban Board',
description: isDE
? 'Visualisiere deine Aufgaben als Kanban-Board'
: 'Visualize your tasks as a Kanban board',
icon: '📋',
category: 'core',
highlights: isDE
? ['Drag & Drop', 'Spalten nach Priorität', 'Visueller Fortschritt']
: ['Drag & drop', 'Columns by priority', 'Visual progress'],
content: '',
order: 2,
language: isDE ? 'de' : 'en',
},
{
id: 'feature-projects',
title: isDE ? 'Projekte' : 'Projects',
description: isDE
? 'Organisiere Aufgaben in farbcodierten Projekten'
: 'Organize tasks in color-coded projects',
icon: '📁',
category: 'core',
highlights: isDE
? ['Farbcodierung', 'Drag & Drop', 'Archivierung']
: ['Color coding', 'Drag & drop', 'Archiving'],
content: '',
order: 3,
language: isDE ? 'de' : 'en',
},
{
id: 'feature-recurring',
title: isDE ? 'Wiederkehrende Aufgaben' : 'Recurring Tasks',
description: isDE
? 'Automatische Wiederholung mit flexiblen Regeln'
: 'Automatic recurrence with flexible rules',
icon: '🔄',
category: 'advanced',
highlights: isDE
? ['Täglich/Wöchentlich/Monatlich', 'Bestimmte Wochentage', 'Auto-Erstellung']
: ['Daily/Weekly/Monthly', 'Specific weekdays', 'Auto-creation'],
content: '',
order: 4,
language: isDE ? 'de' : 'en',
},
],
shortcuts: [
{
id: 'shortcuts-navigation',
category: 'navigation',
title: 'Navigation',
language: isDE ? 'de' : 'en',
order: 1,
shortcuts: [
{
shortcut: 'Ctrl + 1',
action: isDE ? 'Listen-Ansicht' : 'List view',
},
{
shortcut: 'Ctrl + 2',
action: isDE ? 'Kanban-Ansicht' : 'Kanban view',
},
{
shortcut: 'Ctrl + 3',
action: isDE ? 'Tags-Ansicht' : 'Tags view',
},
],
},
{
id: 'shortcuts-general',
category: 'general',
title: isDE ? 'Allgemein' : 'General',
language: isDE ? 'de' : 'en',
order: 2,
shortcuts: [
{
shortcut: 'F',
action: isDE ? 'Immersive-Modus umschalten' : 'Toggle immersive mode',
},
],
},
],
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 Todo.</p>'
: '<p>Our support team is here to help you with any task management 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,177 @@
<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 { getTodoHelpContent } from '$lib/content/help/index.js';
const content = $derived(getTodoHelpContent($locale ?? 'de'));
const translations: HelpPageTranslations = $derived(
$locale === 'de'
? {
title: 'Hilfe & Support',
subtitle: 'Finde Antworten und lerne Todo 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 Todo',
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 frequently asked questions 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 keyboard 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 information available.',
email: 'Send email',
responseTime: 'Response time',
},
common: {
back: 'Back',
showMore: 'Show more',
showLess: 'Show less',
},
}
);
function handleBack() {
goto('/');
}
</script>
<svelte:head>
<title>{translations.title} | Todo</title>
</svelte:head>
<HelpPage
{content}
appName="Todo"
appId="todo"
{translations}
showBackButton
onBack={handleBack}
showGettingStarted={false}
showChangelog={false}
defaultSection="faq"
/>

975
pnpm-lock.yaml generated

File diff suppressed because it is too large Load diff