diff --git a/app/(dashboard)/articles/[id]/page.tsx b/app/(dashboard)/articles/[id]/page.tsx
index e0389f86..15cef32e 100644
--- a/app/(dashboard)/articles/[id]/page.tsx
+++ b/app/(dashboard)/articles/[id]/page.tsx
@@ -242,9 +242,13 @@ export default function ArticleDetailPage({
{article.name}
-
- {article.active ? t('status_active') : t('status_inactive')}
-
+ {article.active ? (
+ {t('status_active')}
+ ) : (
+
+ {t('status_inactive')}
+
+ )}
{t(ARTICLE_TYPE_KEY[article.type])}
{article.article_number ? ` · #${article.article_number}` : ''}
diff --git a/app/(dashboard)/extensions/[sector]/[extension]/page.tsx b/app/(dashboard)/extensions/[sector]/[extension]/page.tsx
index dee52627..e256fe59 100644
--- a/app/(dashboard)/extensions/[sector]/[extension]/page.tsx
+++ b/app/(dashboard)/extensions/[sector]/[extension]/page.tsx
@@ -76,7 +76,7 @@ export default async function ExtensionDetailPage({
-
{extensionName}
+
{extensionName}
{extensionDescription}
diff --git a/app/(dashboard)/extensions/[sector]/page.tsx b/app/(dashboard)/extensions/[sector]/page.tsx
index db683142..ef339fab 100644
--- a/app/(dashboard)/extensions/[sector]/page.tsx
+++ b/app/(dashboard)/extensions/[sector]/page.tsx
@@ -44,7 +44,7 @@ export default async function SectorExtensionsPage({
-
{sectorName}
+
{sectorName}
{sectorDescription}
diff --git a/app/(dashboard)/extensions/page.tsx b/app/(dashboard)/extensions/page.tsx
index 3d43646a..93357d68 100644
--- a/app/(dashboard)/extensions/page.tsx
+++ b/app/(dashboard)/extensions/page.tsx
@@ -18,7 +18,7 @@ export default async function ExtensionsPage() {
return (
-
{t('page_title')}
+
{t('page_title')}
{t('page_description')}
diff --git a/app/(dashboard)/help/page.tsx b/app/(dashboard)/help/page.tsx
index 95267788..4a1b9410 100644
--- a/app/(dashboard)/help/page.tsx
+++ b/app/(dashboard)/help/page.tsx
@@ -350,10 +350,10 @@ export default function HelpPage() {
diff --git a/app/(dashboard)/supplier-invoices/[id]/page.tsx b/app/(dashboard)/supplier-invoices/[id]/page.tsx
index b685de19..bff93c5e 100644
--- a/app/(dashboard)/supplier-invoices/[id]/page.tsx
+++ b/app/(dashboard)/supplier-invoices/[id]/page.tsx
@@ -588,7 +588,7 @@ export default function SupplierInvoiceDetailPage() {
- {t('invoice_info_title')}
+ {t('invoice_info_title')}
@@ -629,7 +629,7 @@ export default function SupplierInvoiceDetailPage() {
- {t('amounts_title')}
+ {t('amounts_title')}
@@ -666,7 +666,7 @@ export default function SupplierInvoiceDetailPage() {
{invoice.supplier && (
- {t('supplier_section_title')}
+ {t('supplier_section_title')}
@@ -683,7 +683,7 @@ export default function SupplierInvoiceDetailPage() {
{/* Line items */}
- {t('rows_title')}
+ {t('rows_title')}
{/* Desktop table */}
@@ -766,7 +766,7 @@ export default function SupplierInvoiceDetailPage() {
{payments.length > 0 && (
- {t('payment_history_title')}
+ {t('payment_history_title')}
{/* Desktop table */}
@@ -824,7 +824,7 @@ export default function SupplierInvoiceDetailPage() {
{invoice.document_id && (
- {t('document_title')}
+ {t('document_title')}
@@ -844,7 +844,7 @@ export default function SupplierInvoiceDetailPage() {
{/* Journal entries (sambandskrav) */}
- {t('vouchers_title')}
+ {t('vouchers_title')}
{invoice.registration_journal_entry_id ? (
@@ -895,7 +895,7 @@ export default function SupplierInvoiceDetailPage() {
{invoice.notes && (
- {t('notes_title')}
+ {t('notes_title')}
{invoice.notes}
diff --git a/app/(dashboard)/suppliers/[id]/page.tsx b/app/(dashboard)/suppliers/[id]/page.tsx
index 21bbed32..4823e491 100644
--- a/app/(dashboard)/suppliers/[id]/page.tsx
+++ b/app/(dashboard)/suppliers/[id]/page.tsx
@@ -126,9 +126,7 @@ export default function SupplierDetailPage() {
return (
-
-
-
+
)
}
@@ -240,7 +238,7 @@ export default function SupplierDetailPage() {
- {t('contact_section_title')}
+ {t('contact_section_title')}
{supplier.email && {t('email_inline', { email: supplier.email })}
}
@@ -252,7 +250,7 @@ export default function SupplierDetailPage() {
- {t('payment_section_title')}
+ {t('payment_section_title')}
{supplier.bankgiro && {t('bankgiro_inline', { value: supplier.bankgiro })}
}
@@ -269,7 +267,7 @@ export default function SupplierDetailPage() {
{/* Invoices */}
- {t('invoices_section_title')}
+ {t('invoices_section_title')}
)
diff --git a/components/extensions/general/CalendarWorkspace.tsx b/components/extensions/general/CalendarWorkspace.tsx
index b9002c7c..a5a482b1 100644
--- a/components/extensions/general/CalendarWorkspace.tsx
+++ b/components/extensions/general/CalendarWorkspace.tsx
@@ -7,6 +7,7 @@ import { PaymentCalendar } from '@/extensions/general/calendar/components/Paymen
import type { DeadlineFormValues } from '@/components/deadlines/DeadlineForm'
import type { WorkspaceComponentProps } from '@/lib/extensions/workspace-registry'
import type { Invoice, Deadline } from '@/types'
+import { Skeleton } from '@/components/ui/skeleton'
export default function CalendarWorkspace({ userId }: WorkspaceComponentProps) {
const [invoices, setInvoices] = useState([])
@@ -107,9 +108,9 @@ export default function CalendarWorkspace({ userId }: WorkspaceComponentProps) {
if (isLoading) {
return (
-
-
-
+
+
+
)
}
diff --git a/components/reports/BankReconciliationView.tsx b/components/reports/BankReconciliationView.tsx
index 73e1d286..28b0ae14 100644
--- a/components/reports/BankReconciliationView.tsx
+++ b/components/reports/BankReconciliationView.tsx
@@ -1019,7 +1019,7 @@ export function BankReconciliationView({ periodId, periodBounds }: BankReconcili
{dryRunResults && dryRunResults.length > 0 && (
-
+
Förhandsgranskning: {dryRunResults.length}{' '}
{dryRunResults.length === 1 ? 'matchning hittad' : 'matchningar hittade'}
@@ -1280,7 +1280,7 @@ export function BankReconciliationView({ periodId, periodBounds }: BankReconcili
{unmatchedGlLines.length > 0 && (
-
+
Omatchade verifikationer på ({unmatchedGlLines.length})
@@ -1362,7 +1362,7 @@ export function BankReconciliationView({ periodId, periodBounds }: BankReconcili
) : (
)}
-
+
Ignorerade transaktioner ({ignoredTx.length})
@@ -1427,7 +1427,7 @@ export function BankReconciliationView({ periodId, periodBounds }: BankReconcili
) : (
)}
-
+
Matchade transaktioner ({matchedTx.length})
diff --git a/components/reports/views/index.tsx b/components/reports/views/index.tsx
index 4e90ca83..f2ee3b07 100644
--- a/components/reports/views/index.tsx
+++ b/components/reports/views/index.tsx
@@ -510,7 +510,7 @@ export function IncomeStatementView({ periodId, dateRange, dimensionFilter = nul
{/* Revenue */}
- Rörelseintäkter
+ Rörelseintäkter
@@ -524,7 +524,7 @@ export function IncomeStatementView({ periodId, dateRange, dimensionFilter = nul
{/* Expenses */}
- Rörelsekostnader
+ Rörelsekostnader
@@ -551,7 +551,7 @@ export function IncomeStatementView({ periodId, dateRange, dimensionFilter = nul
{data.financial_sections.length > 0 && (
- Finansiella poster
+ Finansiella poster
@@ -648,7 +648,7 @@ export function BalanceSheetView({ periodId, dateRange, onNavigateToAccount }: {
{/* Assets */}
- Tillgångar
+ Tillgångar
@@ -662,7 +662,7 @@ export function BalanceSheetView({ periodId, dateRange, onNavigateToAccount }: {
{/* Equity and liabilities */}
- Eget kapital och skulder
+ Eget kapital och skulder
diff --git a/components/salary/SalaryCalendar.tsx b/components/salary/SalaryCalendar.tsx
index e5b75273..6dd53bf8 100644
--- a/components/salary/SalaryCalendar.tsx
+++ b/components/salary/SalaryCalendar.tsx
@@ -81,15 +81,27 @@ interface AbsenceTypeMeta {
pillClass: string
}
+// Absence tone comes from the semantic scale, never the raw Tailwind palette.
+// Every value is alpha-over-token, which is why none of these need a `dark:`
+// variant: the same class reads correctly on both grounds (the approach
+// components/ui/badge.tsx already takes). The eight types share four tones, so
+// fill carries a second axis: filled vs outlined separates the two types
+// inside a tone whose Lucide icon is identical (Heart is parental, pregnancy
+// and care_relative; Activity is study and other_leave).
+//
+// terracotta = sick (karens, employer cost)
+// ochre = caring for someone else (vab, närstående)
+// sage = parental and pregnancy leave
+// neutral = the rest (study, unpaid, other)
const TYPE_META: Record = {
- sick: { labelKey: 'type_sick', shortLabelKey: 'type_sick_short', icon: HeartPulse, pillClass: 'bg-red-100 text-red-800' },
- vab: { labelKey: 'type_vab', shortLabelKey: 'type_vab_short', icon: Baby, pillClass: 'bg-amber-100 text-amber-800' },
- parental: { labelKey: 'type_parental', shortLabelKey: 'type_parental_short', icon: Heart, pillClass: 'bg-emerald-100 text-emerald-800' },
- pregnancy: { labelKey: 'type_pregnancy', shortLabelKey: 'type_pregnancy_short', icon: Heart, pillClass: 'bg-pink-100 text-pink-800' },
- care_relative: { labelKey: 'type_care_relative', shortLabelKey: 'type_care_relative_short', icon: Heart, pillClass: 'bg-blue-100 text-blue-800' },
- study: { labelKey: 'type_study', shortLabelKey: 'type_study_short', icon: Activity, pillClass: 'bg-indigo-100 text-indigo-800' },
- unpaid_leave: { labelKey: 'type_unpaid_leave', shortLabelKey: 'type_unpaid_leave_short', icon: MinusCircle, pillClass: 'bg-slate-100 text-slate-800' },
- other_leave: { labelKey: 'type_other_leave', shortLabelKey: 'type_other_leave_short', icon: Activity, pillClass: 'bg-zinc-100 text-zinc-800' },
+ sick: { labelKey: 'type_sick', shortLabelKey: 'type_sick_short', icon: HeartPulse, pillClass: 'bg-destructive/10 text-destructive' },
+ vab: { labelKey: 'type_vab', shortLabelKey: 'type_vab_short', icon: Baby, pillClass: 'bg-warning/15 text-warning-foreground' },
+ care_relative: { labelKey: 'type_care_relative', shortLabelKey: 'type_care_relative_short', icon: Heart, pillClass: 'border border-warning/40 text-warning-foreground' },
+ parental: { labelKey: 'type_parental', shortLabelKey: 'type_parental_short', icon: Heart, pillClass: 'bg-success/10 text-success' },
+ pregnancy: { labelKey: 'type_pregnancy', shortLabelKey: 'type_pregnancy_short', icon: Heart, pillClass: 'border border-success/40 text-success' },
+ study: { labelKey: 'type_study', shortLabelKey: 'type_study_short', icon: Activity, pillClass: 'bg-secondary text-secondary-foreground' },
+ unpaid_leave: { labelKey: 'type_unpaid_leave', shortLabelKey: 'type_unpaid_leave_short', icon: MinusCircle, pillClass: 'bg-muted text-muted-foreground' },
+ other_leave: { labelKey: 'type_other_leave', shortLabelKey: 'type_other_leave_short', icon: Activity, pillClass: 'border border-border text-muted-foreground' },
}
const TYPE_ORDER: AbsenceType[] = ['sick', 'vab', 'parental', 'pregnancy', 'care_relative', 'study', 'unpaid_leave', 'other_leave']
@@ -422,7 +434,7 @@ export function SalaryCalendar({
{w && (
-
+
{w.hours}h
@@ -472,8 +484,8 @@ export function SalaryCalendar({
{isHourly && (
-
-
+
+
{t('worked_time')}
@@ -713,11 +725,11 @@ function BulkWorkedDialog({
{conflicts.length > 0 && (
-
-
+
+
{t('conflicts_worked', { count: conflicts.length })}
-
+
{conflicts.map(c => - {c.date}
)}
@@ -866,11 +878,11 @@ function BulkAbsenceDialog({
{conflicts.length > 0 && (
-
-
+
+
{t('conflicts_absence', { count: conflicts.length })}
-
+
{conflicts.map(c => - {c.date}
)}
@@ -981,9 +993,9 @@ function DayInspectorDialog({
{isHourly && worked && (
-
+
-
+
{t('worked_time')}
{t('hours_count', { hours: String(worked.hours) })}
diff --git a/components/supplier-invoices/NewSupplierInvoiceForm.tsx b/components/supplier-invoices/NewSupplierInvoiceForm.tsx
index 8f7a7aee..314c1976 100644
--- a/components/supplier-invoices/NewSupplierInvoiceForm.tsx
+++ b/components/supplier-invoices/NewSupplierInvoiceForm.tsx
@@ -1552,7 +1552,7 @@ export default function NewSupplierInvoiceForm({
{/* Section 1: Faktura */}
- {t('section_invoice')}
+ {t('section_invoice')}
{/* Eget utlägg-toggle. När den är på bokas verifikatet direkt mot
@@ -1718,7 +1718,7 @@ export default function NewSupplierInvoiceForm({
{/* Section 2: Kontering */}
- {t('section_accounting')}
+ {t('section_accounting')}
diff --git a/components/transactions/BankSyncStatusChip.tsx b/components/transactions/BankSyncStatusChip.tsx
index 05563cdc..e383faff 100644
--- a/components/transactions/BankSyncStatusChip.tsx
+++ b/components/transactions/BankSyncStatusChip.tsx
@@ -10,7 +10,6 @@ import { useCompany } from '@/contexts/CompanyContext'
import {
Tooltip,
TooltipContent,
- TooltipProvider,
TooltipTrigger,
} from '@/components/ui/info-tooltip'
@@ -140,7 +139,6 @@ export default function BankSyncStatusChip() {
// healthy
return (
-
@@ -160,6 +158,5 @@ export default function BankSyncStatusChip() {
{t('bank_sync_latency_hint')}
-
)
}
diff --git a/components/ui/account-number.tsx b/components/ui/account-number.tsx
index 3614bfa2..385254aa 100644
--- a/components/ui/account-number.tsx
+++ b/components/ui/account-number.tsx
@@ -5,7 +5,6 @@ import {
Tooltip,
TooltipTrigger,
TooltipContent,
- TooltipProvider,
} from '@/components/ui/info-tooltip'
import { cn } from '@/lib/utils'
@@ -69,7 +68,6 @@ export function AccountNumber({
}
return (
-
-
)
}
diff --git a/components/ui/dropdown-menu.tsx b/components/ui/dropdown-menu.tsx
index 8012e675..3a471958 100644
--- a/components/ui/dropdown-menu.tsx
+++ b/components/ui/dropdown-menu.tsx
@@ -19,7 +19,7 @@ const DropdownMenuContent = React.forwardRef<
ref={ref}
sideOffset={sideOffset}
className={cn(
- "z-50 min-w-[10rem] overflow-hidden rounded-lg border border-border bg-popover p-1 text-popover-foreground shadow-[var(--shadow-md)] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
+ "z-50 min-w-[10rem] origin-[var(--radix-dropdown-menu-content-transform-origin)] overflow-hidden rounded-lg border border-border bg-popover p-1 text-popover-foreground shadow-[var(--shadow-md)] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
className
)}
{...props}
diff --git a/components/ui/info-tooltip.tsx b/components/ui/info-tooltip.tsx
index 0c785697..4cfdb783 100644
--- a/components/ui/info-tooltip.tsx
+++ b/components/ui/info-tooltip.tsx
@@ -67,7 +67,6 @@ function InfoTooltip({
const Icon = variant === 'help' ? HelpCircle : Info
return (
-
{children ? (
@@ -102,7 +101,6 @@ function InfoTooltip({
{content}
-
)
}
diff --git a/components/ui/progress.tsx b/components/ui/progress.tsx
index 5aeda881..931e99e2 100644
--- a/components/ui/progress.tsx
+++ b/components/ui/progress.tsx
@@ -17,7 +17,7 @@ const Progress = React.forwardRef<
{...props}
>
diff --git a/components/ui/select.tsx b/components/ui/select.tsx
index 750f5863..b8777d45 100644
--- a/components/ui/select.tsx
+++ b/components/ui/select.tsx
@@ -74,7 +74,7 @@ const SelectContent = React.forwardRef<
+ {children}
+
+ )
+}