");
<<<<<<< HEAD
sb.AppendLine($"
{T["report.section.storage_by_file_type"]} ({totalFiles:N0} {T["report.text.files_unit"]}, {FormatSize(totalSize)})
");
=======
<<<<<<< HEAD
sb.AppendLine($"
{T["report.section.storage_by_file_type"]} ({totalFiles:N0} {T["report.text.files_unit"]}, {FormatSize(totalSize)})
");
=======
<<<<<<< HEAD
sb.AppendLine($"
{T["report.section.storage_by_file_type"]} ({totalFiles:N0} {T["report.text.files_unit"]}, {FormatSize(totalSize)})
");
=======
sb.AppendLine($"
{T["report.section.storage_by_file_type"]} ({totalFiles:N0} files, {FormatSize(totalSize)})
");
>>>>>>> f4cc81bb71b935c6f6f050288c9e283dcca5cfa8
>>>>>>> b8c09655ac1a3cf1e116d5b5178ec293659c1a72
>>>>>>> efb3d2ad116b4b30c81d70c27e38a8e65a5d95f8
var colors = new[] { "#0078d4", "#2b88d8", "#106ebe", "#005a9e", "#004578",
"#00bcf2", "#009e49", "#8cbd18", "#ffb900", "#d83b01" };
int idx = 0;
foreach (var m in fileTypeMetrics.Take(15))
{
double pct = maxSize > 0 ? m.TotalSizeBytes * 100.0 / maxSize : 0;
string color = colors[idx % colors.Length];
string label = string.IsNullOrEmpty(m.Extension) ? T["report.text.no_ext"] : m.Extension;
sb.AppendLine($"""
{HtmlEncode(label)}
{FormatSize(m.TotalSizeBytes)} · {m.FileCount:N0} {T["report.text.files_unit"]}
""");
idx++;
}
sb.AppendLine("
");
}
// ── Storage table ──
sb.AppendLine($"