feat: P2.1 extended signatures — multiple per identity + TipTap editor

- New stores/signature-store.ts: Zustand persist with CRUD, default/reply
  signature IDs, per-identity signature mapping
- New signature-settings.tsx: list management with add/edit/delete/duplicate
- New signature-editor-modal.tsx: TipTap rich text editor for signatures
- email-composer.tsx: auto-insert signature based on mode (compose/reply)
  + signature selector dropdown in toolbar
- identity-form.tsx: per-identity default/reply signature dropdowns
- settings/page.tsx: Signatures tab in Mail settings group
This commit is contained in:
Bernd Rodler
2026-08-07 12:55:14 +02:00
parent f34537adcf
commit 67f61f18d0
6 changed files with 975 additions and 3 deletions
+7
View File
@@ -46,6 +46,7 @@ import { LayoutSettings } from '@/components/settings/layout-settings';
import { LanguageSettings } from '@/components/settings/language-settings';
import { ReadingSettings } from '@/components/settings/reading-settings';
import { ComposingSettings } from '@/components/settings/composing-settings';
import { SignatureSettings } from '@/components/settings/signature-settings';
import { ContentSendersSettings } from '@/components/settings/content-senders-settings';
import { AccountSettings } from '@/components/settings/account-settings';
import { IdentitySettings } from '@/components/settings/identity-settings';
@@ -98,6 +99,7 @@ type Tab =
| 'composing'
| 'downloads'
| 'identities'
| 'signatures'
| 'vacation'
| 'filters'
| 'templates'
@@ -141,6 +143,7 @@ const tabIcons: Record<Tab, LucideIcon> = {
composing: PenLine,
downloads: Download,
identities: UserPen,
signatures: PenLine,
vacation: PalmtreeIcon,
filters: Filter,
templates: FileText,
@@ -219,6 +222,7 @@ const tabSearchPaths: Record<Tab, string[]> = {
],
downloads: ['settings.downloads'],
identities: ['settings.identities'],
signatures: ['signatures'],
vacation: ['settings.vacation'],
filters: ['settings.filters'],
templates: ['settings.templates'],
@@ -254,6 +258,7 @@ const tabKeywords: Record<Tab, string> = {
composing: 'editor signature plain text reply forward draft compose',
downloads: 'download filename template eml attachment save export',
identities: 'from address signature email',
signatures: 'signature rich text html editor',
vacation: 'auto reply away out of office holiday responder',
filters: 'sieve rules block junk forward',
templates: 'snippet quick reply',
@@ -631,6 +636,7 @@ export default function SettingsPage() {
{ id: 'composing', label: t('tabs.composing'), icon: tabIcons.composing, group: 'mail' },
{ id: 'downloads', label: t('tabs.downloads'), icon: tabIcons.downloads, group: 'mail' },
{ id: 'identities', label: t('tabs.identities'), icon: tabIcons.identities, group: 'mail' },
{ id: 'signatures', label: t('tabs.signatures'), icon: tabIcons.signatures, group: 'mail' },
...(supportsVacation ? [{ id: 'vacation' as Tab, label: t('tabs.vacation'), icon: tabIcons.vacation, group: 'mail' as TabGroup }] : []),
...(supportsSieve ? [{ id: 'filters' as Tab, label: t('tabs.filters'), icon: tabIcons.filters, group: 'mail' as TabGroup }] : []),
...(isFeatureEnabled('templatesEnabled') ? [{ id: 'templates' as Tab, label: t('tabs.templates'), icon: tabIcons.templates, group: 'mail' as TabGroup }] : []),
@@ -761,6 +767,7 @@ export default function SettingsPage() {
{effectiveActiveTab === 'composing' && <ComposingSettings />}
{effectiveActiveTab === 'downloads' && <DownloadsSettings />}
{effectiveActiveTab === 'identities' && <IdentitySettings />}
{effectiveActiveTab === 'signatures' && <SignatureSettings />}
{effectiveActiveTab === 'vacation' && <VacationSettings />}
{effectiveActiveTab === 'filters' && <FilterSettings />}
{effectiveActiveTab === 'templates' && <TemplateSettings />}