feat: UI polish — responsive, loading/empty/error states, German fixes (Phase 3Q)

- Responsive sidebar: collapses on mobile with hamburger menu, slide-in animation
- Skeleton loaders: dashboard cards, case table, case detail page
- Empty states: friendly messages with icons for cases, deadlines, parties, documents
- Error states: retry button on dashboard, proper error message on case not found
- Form validation: inline error messages on case creation form
- German language: fix all missing umlauts (Zurück, wählen, Anhängig, Verfügung, etc.)
- Status labels: display German translations instead of raw status values
- Transitions: fade-in animations on page load, hover/transition-colors on all interactive elements
- Focus states: focus-visible ring for keyboard accessibility
- Mobile layout: stacking for filters, forms, tabs; horizontal scroll for tables
- Extraction results: card layout on mobile, table on desktop
- Missing types: add DashboardData, DeadlineSummary, CaseSummary, ExtractedDeadline etc.
- Fix QuickActions links to use correct routes (/cases/new, /ai/extract)
- Consistent input focus styles across all forms
This commit is contained in:
m
2026-03-25 14:16:30 +01:00
parent 2cf01073a3
commit f81a2492c6
23 changed files with 834 additions and 288 deletions

View File

@@ -90,14 +90,14 @@ export default function AIExtractPage() {
await Promise.all(promises);
toast.success(
`${deadlines.length} Frist(en) erfolgreich uebernommen.`,
`${deadlines.length} Frist(en) erfolgreich übernommen.`,
);
router.push(`/akten/${selectedCaseId}`);
router.push(`/cases/${selectedCaseId}`);
} catch (err: unknown) {
const message =
err && typeof err === "object" && "error" in err
? (err as { error: string }).error
: "Uebernahme fehlgeschlagen";
: "Übernahme fehlgeschlagen";
toast.error(message);
} finally {
setIsAdopting(false);
@@ -105,7 +105,7 @@ export default function AIExtractPage() {
}
return (
<div className="mx-auto max-w-4xl">
<div className="animate-fade-in mx-auto max-w-4xl">
<div className="mb-6 flex items-center gap-3">
<Brain className="h-5 w-5 text-neutral-500" />
<div>
@@ -118,7 +118,7 @@ export default function AIExtractPage() {
</div>
</div>
<div className="rounded-lg border border-neutral-200 bg-white p-6">
<div className="rounded-lg border border-neutral-200 bg-white p-4 sm:p-6">
<ExtractionForm
cases={cases}
selectedCaseId={selectedCaseId}
@@ -129,7 +129,7 @@ export default function AIExtractPage() {
</div>
{results !== null && (
<div className="mt-6 rounded-lg border border-neutral-200 bg-white p-6">
<div className="animate-fade-in mt-6 rounded-lg border border-neutral-200 bg-white p-4 sm:p-6">
<ExtractionResults
deadlines={results}
onAdopt={handleAdopt}