UI badge cleanup + /chart-of-accounts route + loop skills (#850)

Bundles three separable concerns:

- style(ui): badge audit + cleanup across 45 files — real-status chips use Badge variants (raw Tailwind colors dropped), non-status count/type/label chips demoted to muted text, clustered badges consolidated; 20 unused imports removed.
- feat(bookkeeping): Kontoplan moved to a dedicated /chart-of-accounts route (nav + command palette wired); /bookkeeping shows the journal list only.
- chore(skills): loop-* automation skills + design-scan workflow under .claude/.

fix(reports): restored the destructive count badge on blocking errors in the periodisk sammanställning (EC Sales List) — a genuine status cue the audit had wrongly flattened; flagged by the PR reviewer and Swedish compliance bot, now clean.

All CI green; compliance bots report no findings.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jakob Wennberg
2026-07-01 14:29:23 +02:00
committed by GitHub
co-authored by Claude Opus 4.8
parent d63d2aecf0
commit 2da9c71eb3
57 changed files with 613 additions and 315 deletions
+3 -3
View File
@@ -158,9 +158,9 @@ export function TaxTodoWidget({ deadlines, onStatusChange }: TaxTodoWidgetProps)
{formatDate(deadline.due_date)}
</span>
{deadline.tax_deadline_type && (
<Badge variant="outline" className="text-xs px-1.5 py-0 h-5">
{TAX_DEADLINE_TYPE_LABELS[deadline.tax_deadline_type]}
</Badge>
<span className="text-xs text-muted-foreground">
· {TAX_DEADLINE_TYPE_LABELS[deadline.tax_deadline_type]}
</span>
)}
</div>
</div>
@@ -142,17 +142,16 @@ export function UpcomingDeadlinesWidget({ deadlines, maxItems = 5, onStatusChang
)}
<div className="min-w-0 flex-1">
<p className="text-sm font-medium truncate">{deadline.title}</p>
<div className="flex items-center gap-2">
<p className="text-xs text-muted-foreground">
{formatDate(deadline.due_date)}
{deadline.due_time && ` ${t('time_prefix')} ${deadline.due_time.slice(0, 5)}`}
</p>
<p className="text-xs text-muted-foreground">
{formatDate(deadline.due_date)}
{deadline.due_time && ` ${t('time_prefix')} ${deadline.due_time.slice(0, 5)}`}
{deadline.tax_deadline_type && (
<Badge variant="outline" className="text-xs px-1 py-0">
{t('tax_badge')}
</Badge>
<>
{' '}
<span className="text-muted-foreground/30">·</span> {t('tax_badge')}
</>
)}
</div>
</p>
</div>
</div>