'use client'
import * as React from 'react'
import { cn } from '@/lib/utils'
export interface ProgressSegment {
value: number
color: string
label?: string
}
interface SegmentedProgressProps {
segments: ProgressSegment[]
total: number
height?: string
className?: string
showLabels?: boolean
}
export function SegmentedProgress({
segments,
total,
height = 'h-2',
className,
showLabels = false,
}: SegmentedProgressProps) {
const percentages = segments.map((segment) => ({
...segment,
percentage: total > 0 ? (segment.value / total) * 100 : 0,
}))
return (
{percentages.map((segment, index) => (
))}
{showLabels && (
{percentages.map((segment, index) => (
{segment.label || `${segment.percentage.toFixed(0)}%`}
))}
)}
)
}
// Nordic color scheme for progress bars
export const PROGRESS_COLORS = {
success: 'hsl(150 30% 40%)', // Forest green
warning: 'hsl(38 70% 55%)', // Warm honey
destructive: 'hsl(0 45% 55%)', // Muted rose
primary: 'hsl(145 20% 36%)', // Sage
muted: 'hsl(30 8% 45%)', // Stone
// Tax display - Nordic palette
disponibelt: '#4d7c65', // Sage green
skatt: '#c17f59', // Terracotta
moms: '#b8956c', // Warm honey
}
interface TaxProgressProps {
disponibelt: number
skattReservation: number
momsReservation: number
className?: string
}
export function TaxProgress({
disponibelt,
skattReservation,
momsReservation,
className,
}: TaxProgressProps) {
const total = disponibelt + skattReservation + momsReservation
const segments: ProgressSegment[] = [
{
value: disponibelt,
color: PROGRESS_COLORS.disponibelt,
label: 'Disponibelt',
},
{
value: skattReservation,
color: PROGRESS_COLORS.skatt,
label: 'Skatt',
},
]
if (momsReservation > 0) {
segments.push({
value: momsReservation,
color: PROGRESS_COLORS.moms,
label: 'Moms',
})
}
return (
)
}