| export function miniSparkline(data: number[] | undefined, change: number | null, w = 50, h = 16): string { |
| if (!data || data.length < 2) return ''; |
| const min = Math.min(...data); |
| const max = Math.max(...data); |
| const range = max - min || 1; |
| const color = change != null && change >= 0 ? 'var(--green)' : 'var(--red)'; |
| const points = data.map((v, i) => { |
| const x = (i / (data.length - 1)) * w; |
| const y = h - ((v - min) / range) * (h - 2) - 1; |
| return `${x.toFixed(1)},${y.toFixed(1)}`; |
| }).join(' '); |
| return `<svg width="${w}" height="${h}" viewBox="0 0 ${w} ${h}" class="mini-sparkline"><polyline points="${points}" fill="none" stroke="${color}" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>`; |
| } |
|
|
| export function sparkline(data: number[], color: string, w: number, h: number, style = ''): string { |
| if (data.length < 2) return ''; |
| const min = Math.min(...data); |
| const max = Math.max(...data); |
| const range = max - min || 1; |
| const points = data.map((v, i) => { |
| const x = (i / (data.length - 1)) * w; |
| const y = h - ((v - min) / range) * (h - 2) - 1; |
| return `${x.toFixed(1)},${y.toFixed(1)}`; |
| }).join(' '); |
| return `<svg width="${w}" height="${h}" viewBox="0 0 ${w} ${h}"${style ? ` style="${style}"` : ''}><polyline points="${points}" fill="none" stroke="${color}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>`; |
| } |
|
|