Phase 0.2: migrate remaining SVGs to lucide-react icons

This commit is contained in:
Agent Zero
2026-07-23 03:21:05 +02:00
parent e9a5eee524
commit 4f8cda1566
41 changed files with 228 additions and 564 deletions
+4 -7
View File
@@ -4,6 +4,7 @@ import { ChatWindow } from '@/components/ai/ChatWindow';
import { ResizablePanel } from '@/components/ui/ResizablePanel';
import { usePluginToolbarStore } from '@/store/pluginToolbarStore';
import { fetchAgents, createSession, type AIAgent } from '@/api/ai';
import { ChevronLeft, Folder, Plus } from 'lucide-react';
export function AIAssistantPage() {
const [activeSessionId, setActiveSessionId] = useState<string | null>(null);
@@ -35,9 +36,7 @@ export function AIAssistantPage() {
type: 'button',
group: 'actions',
icon: (
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 4v16m8-8H4" />
</svg>
<Plus className="w-3.5 h-3.5" strokeWidth={2} />
),
onClick: async () => {
try {
@@ -57,9 +56,7 @@ export function AIAssistantPage() {
type: 'button',
group: 'actions',
icon: (
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z" />
</svg>
<Folder className="w-3.5 h-3.5" strokeWidth={2} />
),
onClick: () => {
const name = prompt('Ordnername:');
@@ -106,7 +103,7 @@ export function AIAssistantPage() {
<div className="flex-1 flex flex-col">
<div className="h-14 flex items-center gap-2 px-3 border-b border-secondary-200 bg-white">
<button onClick={() => setMobileView('list')} className="p-2 rounded-lg hover:bg-secondary-100" aria-label="Zurück">
<svg className="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 19l-7-7 7-7" /></svg>
<ChevronLeft className="w-5 h-5" strokeWidth={2} />
</button>
<span className="text-sm font-medium text-secondary-700 truncate">Chat</span>
</div>
+9 -24
View File
@@ -24,6 +24,7 @@ import { IcsControls } from '@/components/calendar/IcsControls';
import { SharingSettings } from '@/components/calendar/SharingSettings';
import { useCalendarStore, type CalendarViewMode } from '@/stores/calendarStore';
import { usePluginToolbarStore } from '@/store/pluginToolbarStore';
import { ChevronLeft, ChevronRight, Info, Plus } from 'lucide-react';
import {
fetchCalendars,
createCalendar,
@@ -314,9 +315,7 @@ export function CalendarPage() {
: viewMode === 'day' ? goToPrevDay
: () => {},
icon: (
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 19l-7-7 7-7" />
</svg>
<ChevronLeft className="w-3.5 h-3.5" strokeWidth={2} />
),
},
{
@@ -340,9 +339,7 @@ export function CalendarPage() {
? goToNextDay
: () => {},
icon: (
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
</svg>
<ChevronRight className="w-3.5 h-3.5" strokeWidth={2} />
),
},
// View mode group
@@ -374,9 +371,7 @@ export function CalendarPage() {
setModalOpen(true);
},
icon: (
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 4v16m8-8H4" />
</svg>
<Plus className="w-3.5 h-3.5" strokeWidth={2} />
),
},
{
@@ -402,9 +397,7 @@ export function CalendarPage() {
active: showDetails,
onClick: () => setShowDetails((v) => !v),
icon: (
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
<Info className="w-3.5 h-3.5" strokeWidth={2} />
),
},
];
@@ -606,9 +599,7 @@ export function CalendarPage() {
data-testid="mobile-go-to-calendar"
>
<span className="text-sm font-medium">{t('calendar.title')}</span>
<svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
</svg>
<ChevronRight className="w-4 h-4" aria-hidden="true" strokeWidth={2} />
</button>
</div>
<CalendarTree
@@ -633,9 +624,7 @@ export function CalendarPage() {
aria-label={t('common.back')}
data-testid="mobile-back-to-tree"
>
<svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 19l-7-7 7-7" />
</svg>
<ChevronLeft className="w-4 h-4" aria-hidden="true" strokeWidth={2} />
<span className="text-sm font-medium">{t('calendar.tree.title')}</span>
</button>
{showDetails && (
@@ -646,9 +635,7 @@ export function CalendarPage() {
data-testid="mobile-go-to-details"
>
<span className="text-sm font-medium">{t('calendar.detail.title')}</span>
<svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
</svg>
<ChevronRight className="w-4 h-4" aria-hidden="true" strokeWidth={2} />
</button>
)}
</div>
@@ -667,9 +654,7 @@ export function CalendarPage() {
aria-label={t('common.back')}
data-testid="mobile-back-to-calendar"
>
<svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 19l-7-7 7-7" />
</svg>
<ChevronLeft className="w-4 h-4" aria-hidden="true" strokeWidth={2} />
<span className="text-sm font-medium">{t('calendar.title')}</span>
</button>
</div>
+9 -24
View File
@@ -16,6 +16,7 @@ import { ContactFolderTree, type ContactFilter } from '@/components/contacts/Con
import { ContactList, type ContactViewMode } from '@/components/contacts/ContactList';
import { ContactDetail } from '@/components/contacts/ContactDetail';
import { ContactEditModal } from '@/components/contacts/ContactEditModal';
import { ArrowDownAZ, ArrowUpZA, ChevronLeft, LayoutGrid, List, Plus } from 'lucide-react';
import {
useUnifiedContacts,
useUnifiedContact,
@@ -180,9 +181,7 @@ export function ContactsListPage() {
label: t('contacts.create'),
group: 'actions',
icon: (
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 4v16m8-8H4" />
</svg>
<Plus className="w-3.5 h-3.5" strokeWidth={2} />
),
onClick: handleCreate,
},
@@ -259,9 +258,7 @@ export function ContactsListPage() {
aria-label={sortOrder === 'asc' ? t('common.sortDesc') : t('common.sortAsc')}
title={sortOrder === 'asc' ? 'Absteigend' : 'Aufsteigend'}
>
<svg className="w-3.5 h-3.5 text-secondary-600" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d={sortOrder === 'asc' ? 'M3 4h13M3 8h9M3 12h5m13 0l-4 4m4-4l-4-4m4 4v6' : 'M3 4h13M3 8h9M3 12h5m13-4v6m0 0l-4-4m4 4l-4 4'} />
</svg>
{sortOrder === 'asc' ? <ArrowDownAZ className="w-3.5 h-3.5 text-secondary-600" aria-hidden="true" strokeWidth={2} /> : <ArrowUpZA className="w-3.5 h-3.5 text-secondary-600" aria-hidden="true" strokeWidth={2} />}
</button>
</div>
@@ -283,19 +280,13 @@ export function ContactsListPage() {
aria-pressed={viewMode === opt.value}
>
{opt.value === 'list' && (
<svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 6h16M4 10h16M4 14h16M4 18h16" />
</svg>
<List className="w-4 h-4" aria-hidden="true" strokeWidth={2} />
)}
{opt.value === 'table' && (
<svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 4h4v4H4V4zm6 0h4v4h-4V4zm6 0h4v4h-4V4zM4 10h4v4H4v-4zm6 0h4v4h-4v-4zm6 0h4v4h-4v-4zM4 16h4v4H4v-4zm6 0h4v4h-4v-4zm6 0h4v4h-4v-4z" />
</svg>
<LayoutGrid className="w-4 h-4" aria-hidden="true" strokeWidth={2} />
)}
{opt.value === 'cards' && (
<svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 5h6v6H4V5zm10 0h6v6h-6V5zM4 13h6v6H4v-6zm10 0h6v6h-6v-6z" />
</svg>
<LayoutGrid className="w-4 h-4" aria-hidden="true" strokeWidth={2} />
)}
</button>
))}
@@ -309,9 +300,7 @@ export function ContactsListPage() {
title={t('contacts.create')}
data-testid="contacts-new-btn"
>
<svg className="w-4 h-4 text-primary-600" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 4v16m8-8H4" />
</svg>
<Plus className="w-4 h-4 text-primary-600" aria-hidden="true" strokeWidth={2} />
</button>
</div>
@@ -375,9 +364,7 @@ export function ContactsListPage() {
aria-label={t('common.back')}
data-testid="mobile-back-to-folders"
>
<svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 19l-7-7 7-7" />
</svg>
<ChevronLeft className="w-4 h-4" aria-hidden="true" strokeWidth={2} />
<span className="text-sm font-medium">{t('contacts.allContacts')}</span>
</button>
</div>
@@ -417,9 +404,7 @@ export function ContactsListPage() {
aria-label={t('common.back')}
data-testid="mobile-back-to-list"
>
<svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 19l-7-7 7-7" />
</svg>
<ChevronLeft className="w-4 h-4" aria-hidden="true" strokeWidth={2} />
<span className="text-sm font-medium">{t('common.back')}</span>
</button>
</div>
+9 -24
View File
@@ -21,6 +21,7 @@ import { FilePreviewModal } from '@/components/dms/FilePreviewModal';
import { ShareDialog } from '@/components/dms/ShareDialog';
import { BulkActions } from '@/components/dms/BulkActions';
import { usePluginToolbarStore } from '@/store/pluginToolbarStore';
import { ArrowRight, ChevronLeft, ChevronRight, Info, Plus, Trash2, Upload } from 'lucide-react';
import {
fetchFolders,
createFolder,
@@ -371,9 +372,7 @@ export function DmsPage() {
label: t('dms.newFolder'),
group: 'file-actions',
icon: (
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 4v16m8-8H4" />
</svg>
<Plus className="w-3.5 h-3.5" strokeWidth={2} />
),
onClick: () => setShowNewFolder((v) => !v),
},
@@ -383,9 +382,7 @@ export function DmsPage() {
label: t('dms.upload'),
group: 'file-actions',
icon: (
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12" />
</svg>
<Upload className="w-3.5 h-3.5" strokeWidth={2} />
),
onClick: () => setShowUpload((v) => !v),
},
@@ -426,9 +423,7 @@ export function DmsPage() {
group: 'details',
active: showDetails,
icon: (
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
<Info className="w-3.5 h-3.5" strokeWidth={2} />
),
onClick: () => setShowDetails((v) => !v),
},
@@ -443,9 +438,7 @@ export function DmsPage() {
label: t('dms.bulkMove'),
group: 'bulk-actions',
icon: (
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17 8l4 4m0 0l-4 4m4-4H3" />
</svg>
<ArrowRight className="w-3.5 h-3.5" strokeWidth={2} />
),
onClick: () => setShowBulkMove(true),
},
@@ -455,9 +448,7 @@ export function DmsPage() {
label: t('dms.bulkDelete'),
group: 'bulk-actions',
icon: (
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
</svg>
<Trash2 className="w-3.5 h-3.5" strokeWidth={2} />
),
onClick: handleBulkDelete,
},
@@ -610,9 +601,7 @@ export function DmsPage() {
aria-label={t('common.back')}
data-testid="mobile-back-to-tree"
>
<svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 19l-7-7 7-7" />
</svg>
<ChevronLeft className="w-4 h-4" aria-hidden="true" strokeWidth={2} />
<span className="text-sm font-medium">{t('dms.sources')}</span>
</button>
{showDetails && (
@@ -623,9 +612,7 @@ export function DmsPage() {
data-testid="mobile-go-to-details"
>
<span className="text-sm font-medium">{t('dms.details')}</span>
<svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
</svg>
<ChevronRight className="w-4 h-4" aria-hidden="true" strokeWidth={2} />
</button>
)}
</div>
@@ -659,9 +646,7 @@ export function DmsPage() {
aria-label={t('common.back')}
data-testid="mobile-back-to-files"
>
<svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 19l-7-7 7-7" />
</svg>
<ChevronLeft className="w-4 h-4" aria-hidden="true" strokeWidth={2} />
<span className="text-sm font-medium">{t('dms.files')}</span>
</button>
</div>
+2 -3
View File
@@ -13,6 +13,7 @@ import { EmptyState } from '@/components/ui/EmptyState';
import { Skeleton } from '@/components/ui/Skeleton';
import { useToast } from '@/components/ui/Toast';
import { restoreFile, type DmsFile } from '@/api/dms';
import { Trash2 } from 'lucide-react';
export function DmsTrashPage() {
const { t } = useTranslation();
@@ -134,9 +135,7 @@ export function DmsTrashPage() {
<EmptyState
title={t('dms.trashEmpty')}
icon={
<svg className="w-12 h-12" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={1.5} d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
</svg>
<Trash2 className="w-12 h-12" aria-hidden="true" strokeWidth={1.5} />
}
/>
</Card>
+14 -40
View File
@@ -17,6 +17,7 @@ import { MailList } from '@/components/mail/MailList';
import { MailDetail } from '@/components/mail/MailDetail';
import { ComposeModal, type ComposeMode } from '@/components/mail/ComposeModal';
import { usePluginToolbarStore } from '@/store/pluginToolbarStore';
import { ArrowRight, Check, ChevronLeft, Loader2, Plus, Redo2, Trash2, TrendingUp, Undo2 } from 'lucide-react';
import {
fetchAccounts,
fetchFolders,
@@ -536,9 +537,7 @@ export function MailPage() {
label: 'Verfassen',
group: 'compose',
icon: (
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 4v16m8-8H4" />
</svg>
<Plus className="w-3.5 h-3.5" strokeWidth={2} />
),
onClick: handleCompose,
},
@@ -549,9 +548,7 @@ export function MailPage() {
group: 'mail-actions',
disabled: !hasMail,
icon: (
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 10h10a8 8 0 018 8v2M3 10l6 6m-6-6l6-6" />
</svg>
<Undo2 className="w-3.5 h-3.5" strokeWidth={2} />
),
onClick: () => selectedMail && handleReply(selectedMail),
},
@@ -562,9 +559,7 @@ export function MailPage() {
group: 'mail-actions',
disabled: !hasMail,
icon: (
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M21 10H11a8 8 0 00-8 8v2m18-10l-6 6m6-6l-6-6" />
</svg>
<Redo2 className="w-3.5 h-3.5" strokeWidth={2} />
),
onClick: () => selectedMail && handleForward(selectedMail),
},
@@ -594,9 +589,7 @@ export function MailPage() {
group: 'mail-actions',
disabled: !hasMail,
icon: (
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
</svg>
<Trash2 className="w-3.5 h-3.5" strokeWidth={2} />
),
onClick: () => selectedMail && handleDeleteMail(selectedMail),
},
@@ -607,9 +600,7 @@ export function MailPage() {
group: 'mail-actions',
disabled: !hasMail,
icon: (
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17 8l4 4m0 0l-4 4m4-4H3" />
</svg>
<ArrowRight className="w-3.5 h-3.5" strokeWidth={2} />
),
onClick: () => setShowMoveDropdown((v) => !v),
},
@@ -620,9 +611,7 @@ export function MailPage() {
group: 'tools',
disabled: isSyncing || !selectedAccountId,
icon: (
<svg className={`w-3.5 h-3.5 ${isSyncing ? 'animate-spin' : ''}`} fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15" />
</svg>
<Loader2 className={`w-3.5 h-3.5 ${isSyncing ? 'animate-spin' : ''}`} strokeWidth={2} />
),
onClick: async () => {
if (!selectedAccountId) return;
@@ -652,9 +641,7 @@ export function MailPage() {
label: t('mail.markRead'),
group: 'bulk-actions',
icon: (
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" />
</svg>
<Check className="w-3.5 h-3.5" strokeWidth={2} />
),
onClick: handleBulkMarkRead,
},
@@ -664,9 +651,7 @@ export function MailPage() {
label: t('mail.markUnread'),
group: 'bulk-actions',
icon: (
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 19l6-6 4 4 8-8" />
</svg>
<TrendingUp className="w-3.5 h-3.5" strokeWidth={2} />
),
onClick: handleBulkMarkUnread,
},
@@ -676,9 +661,7 @@ export function MailPage() {
label: t('mail.bulkDelete'),
group: 'bulk-actions',
icon: (
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
</svg>
<Trash2 className="w-3.5 h-3.5" strokeWidth={2} />
),
onClick: handleBulkDelete,
},
@@ -688,9 +671,7 @@ export function MailPage() {
label: t('mail.bulkMove'),
group: 'bulk-actions',
icon: (
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17 8l4 4m0 0l-4 4m4-4H3" />
</svg>
<ArrowRight className="w-3.5 h-3.5" strokeWidth={2} />
),
onClick: () => setShowMoveDropdown((v) => !v),
},
@@ -703,10 +684,7 @@ export function MailPage() {
if (loadingAccounts) {
return (
<div className="flex items-center justify-center py-12" data-testid="mail-page-loading">
<svg className="animate-spin h-6 w-6 text-secondary-400" fill="none" viewBox="0 0 24 24" aria-hidden="true">
<circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4" />
<path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" />
</svg>
<Loader2 className="animate-spin h-6 w-6 text-secondary-400" aria-hidden="true" />
<span className="ml-2 text-secondary-500">{t('common.loading')}</span>
</div>
);
@@ -833,9 +811,7 @@ export function MailPage() {
aria-label="Zurück zu Ordnern"
data-testid="mobile-back-to-folders"
>
<svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 19l-7-7 7-7" />
</svg>
<ChevronLeft className="w-4 h-4" aria-hidden="true" strokeWidth={2} />
<span className="text-sm font-medium">Ordner</span>
</button>
</div>
@@ -872,9 +848,7 @@ export function MailPage() {
aria-label="Zurück zur Liste"
data-testid="mobile-back-to-list"
>
<svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 19l-7-7 7-7" />
</svg>
<ChevronLeft className="w-4 h-4" aria-hidden="true" strokeWidth={2} />
<span className="text-sm font-medium">Zurück</span>
</button>
</div>
+3 -7
View File
@@ -15,6 +15,7 @@ import { RuleEditor } from '@/components/mail/RuleEditor';
import { LabelManager } from '@/components/mail/LabelManager';
import { VacationResponder } from '@/components/mail/VacationResponder';
import { PgpSettings } from '@/components/mail/PgpSettings';
import { Loader2, Pencil } from 'lucide-react';
import {
fetchAccounts,
createAccount,
@@ -291,10 +292,7 @@ export function MailSettingsPage() {
{loading ? (
<div className="flex items-center justify-center py-8">
<svg className="animate-spin h-5 w-5 text-secondary-400" fill="none" viewBox="0 0 24 24" aria-hidden="true">
<circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4" />
<path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" />
</svg>
<Loader2 className="animate-spin h-5 w-5 text-secondary-400" aria-hidden="true" />
</div>
) : accounts.length === 0 ? (
<p className="text-sm text-secondary-500">{t('mail.noAccounts')}</p>
@@ -324,9 +322,7 @@ export function MailSettingsPage() {
aria-label={t('common.edit')}
data-testid={`edit-display-name-${acc.id}`}
>
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z" />
</svg>
<Pencil className="w-3.5 h-3.5" aria-hidden="true" strokeWidth={2} />
</button>
</div>
)}
+2 -3
View File
@@ -7,6 +7,7 @@ import { z } from 'zod';
import { usePasswordResetRequest } from '@/api/hooks';
import { Button } from '@/components/ui/Button';
import { Input } from '@/components/ui/Input';
import { Check } from 'lucide-react';
const resetRequestSchema = z.object({
email: z.string().email(),
@@ -43,9 +44,7 @@ export function PasswordResetRequestPage() {
<div className="w-full max-w-md">
<div className="bg-white rounded-lg shadow-md p-8 text-center">
<div className="mb-4 w-12 h-12 mx-auto rounded-full bg-success-100 flex items-center justify-center" aria-hidden="true">
<svg className="w-6 h-6 text-success-600" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" />
</svg>
<Check className="w-6 h-6 text-success-600" strokeWidth={2} />
</div>
<p className="text-secondary-700 mb-6">{t('auth.resetRequestSuccess')}</p>
<Link to="/login" className="text-sm text-primary-600 hover:text-primary-700">