feat: open-source under AGPL-3.0, redesign UI to grayscale palette, add uncategorize API, fix VAT account names

Add LICENSE (AGPL-3.0-or-later), CONTRIBUTING.md, SECURITY.md, DCO, and NOTICE files.
Rewrite README for open-source audience with self-hosting instructions.
Redesign color palette to grayscale chrome theme across all components.
Add transaction uncategorize API route with tests.
Fix VAT account name mismatches in migration 052.
Improve import page with SIE file support and loading skeleton.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Jakob Wennberg
2026-03-05 18:18:11 +01:00
co-authored by Claude Opus 4.6
parent 29240738fa
commit f3ec634a46
58 changed files with 1662 additions and 218 deletions
@@ -33,8 +33,8 @@ export default function ConfirmDeleteDialog({
<DialogContent className="max-w-sm">
<DialogHeader>
<div className="flex items-center gap-3">
<div className="flex h-10 w-10 items-center justify-center rounded-full bg-red-100 dark:bg-red-950/30">
<AlertTriangle className="h-5 w-5 text-red-600 dark:text-red-400" />
<div className="flex h-10 w-10 items-center justify-center rounded-full bg-destructive/10">
<AlertTriangle className="h-5 w-5 text-destructive" />
</div>
<div>
<DialogTitle>{title}</DialogTitle>
@@ -213,8 +213,8 @@ export default function CsvImportWizard({
{step === 3 && (
<div className="text-center py-4">
<div className="inline-flex items-center justify-center w-12 h-12 rounded-full bg-green-100 mb-3">
<Check className="h-6 w-6 text-green-600" />
<div className="inline-flex items-center justify-center w-12 h-12 rounded-full bg-success/10 mb-3">
<Check className="h-6 w-6 text-success" />
</div>
<p className="font-medium">{importCount} rader importerades</p>
<p className="text-sm text-muted-foreground mt-1">
+1 -1
View File
@@ -23,7 +23,7 @@ export default function KPICard({ label, value, suffix, trend, className }: KPIC
{trend && (
<p className={cn(
'text-xs mt-1',
trend.value > 0 ? 'text-green-600' : trend.value < 0 ? 'text-red-600' : 'text-muted-foreground'
trend.value > 0 ? 'text-success' : trend.value < 0 ? 'text-destructive' : 'text-muted-foreground'
)}>
{trend.value > 0 ? '+' : ''}{trend.value}% {trend.label}
</p>
@@ -377,7 +377,7 @@ export default function MockDataImportDialog<T>({
<span>{fileName}</span>
</div>
<div className="flex items-center gap-2 p-3 rounded-md bg-green-50 dark:bg-green-950/30 text-green-700 dark:text-green-400 text-sm">
<div className="flex items-center gap-2 p-3 rounded-md bg-success/10 text-success text-sm">
<Check className="h-4 w-4 shrink-0" />
<span>Giltig JSON — {jsonSummary}</span>
</div>