From 21a95a38f5b027e36d8df94615bea29159298af5 Mon Sep 17 00:00:00 2001 From: Peter Foster Date: Wed, 21 Jan 2026 11:30:47 +0000 Subject: [PATCH] Improve text readability and fix duplicate company scoring MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Increase font sizes from 11px to 12px for employment headers and notes - Improve color contrast (gray-500 to gray-600) for WCAG AA compliance - Increase opacity for white text on dark backgrounds (0.6/0.8 to 0.8/0.9) - Fix duplicate company penalty display to only apply for sequential entries - Non-sequential entries of same company now each show their own penalty 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- src/TrueCV.Web/Components/Pages/Report.razor | 42 ++++++++++++++------ src/TrueCV.Web/wwwroot/app.css | 22 +++++----- 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/src/TrueCV.Web/Components/Pages/Report.razor b/src/TrueCV.Web/Components/Pages/Report.razor index b7e2a0b..f6d3779 100644 --- a/src/TrueCV.Web/Components/Pages/Report.razor +++ b/src/TrueCV.Web/Components/Pages/Report.razor @@ -266,6 +266,10 @@ { @companyPoints } + else if (!verification.IsVerified && !_firstOccurrenceIndices.Contains(index)) + { + — + } else { 0 @@ -592,7 +596,7 @@ } .stat-label { - color: rgba(255, 255, 255, 0.85); + color: rgba(255, 255, 255, 0.95); font-size: 0.875rem; } @@ -626,7 +630,7 @@ } .flag-description { - color: #6b7280; + color: #4b5563; font-size: 0.875rem; margin: 0.5rem 0 0 0; } @@ -650,9 +654,9 @@ padding: 0.5rem 0.75rem; background-color: #f8fafc; border-bottom: 1px solid #e5e7eb; - font-size: 0.6875rem; + font-size: 0.75rem; font-weight: 600; - color: #64748b; + color: #475569; text-transform: uppercase; letter-spacing: 0.025em; align-items: center; @@ -713,17 +717,17 @@ } .employment-note-inline { - font-size: 0.6875rem; - color: #6b7280; - line-height: 1.2; + font-size: 0.75rem; + color: #4b5563; + line-height: 1.4; } .employment-dates { display: flex; align-items: center; justify-content: center; - font-size: 0.75rem; - color: #6b7280; + font-size: 0.8125rem; + color: #4b5563; white-space: nowrap; text-align: center; } @@ -968,7 +972,7 @@ }; } - // Lookup for first occurrence of each company (pre-computed when report loads) + // Lookup for first occurrence of each sequential group of the same company (pre-computed when report loads) private HashSet _firstOccurrenceIndices = new(); private void ComputeFirstOccurrences() @@ -976,14 +980,26 @@ _firstOccurrenceIndices.Clear(); if (_report?.EmploymentVerifications is null) return; - var seenCompanies = new HashSet(StringComparer.OrdinalIgnoreCase); + // Only mark as duplicate if the PREVIOUS entry (sequential) is the same company + // Non-sequential entries of the same company should each count separately for (int i = 0; i < _report.EmploymentVerifications.Count; i++) { - var company = _report.EmploymentVerifications[i].ClaimedCompany; - if (seenCompanies.Add(company)) + var currentCompany = _report.EmploymentVerifications[i].ClaimedCompany; + + if (i == 0) { + // First entry is always a first occurrence _firstOccurrenceIndices.Add(i); } + else + { + var previousCompany = _report.EmploymentVerifications[i - 1].ClaimedCompany; + // Only skip if same company as immediately preceding entry + if (!string.Equals(currentCompany, previousCompany, StringComparison.OrdinalIgnoreCase)) + { + _firstOccurrenceIndices.Add(i); + } + } } } diff --git a/src/TrueCV.Web/wwwroot/app.css b/src/TrueCV.Web/wwwroot/app.css index 766279d..cfd4720 100644 --- a/src/TrueCV.Web/wwwroot/app.css +++ b/src/TrueCV.Web/wwwroot/app.css @@ -329,7 +329,7 @@ a:hover { .stat-card .stat-label { font-size: 0.875rem; - color: var(--truecv-gray-500); + color: var(--truecv-gray-600); font-weight: 500; } @@ -396,7 +396,7 @@ a:hover { font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.05em; - color: var(--truecv-gray-500); + color: var(--truecv-gray-600); border-bottom: 2px solid var(--truecv-gray-200); background-color: var(--truecv-bg-muted); } @@ -860,7 +860,7 @@ h1:focus { } .text-muted { - color: var(--truecv-gray-500) !important; + color: var(--truecv-gray-600) !important; } /* Row selection highlight */ @@ -964,7 +964,7 @@ h1:focus { } .breadcrumb-item a { - color: var(--truecv-gray-500); + color: var(--truecv-gray-600); text-decoration: none; } @@ -973,7 +973,7 @@ h1:focus { } .breadcrumb-item.active { - color: var(--truecv-gray-400); + color: var(--truecv-gray-600); } /* Security badge for upload */ @@ -982,7 +982,7 @@ h1:focus { align-items: center; gap: 0.375rem; font-size: 0.8125rem; - color: var(--truecv-gray-500); + color: var(--truecv-gray-600); margin-top: 1rem; } @@ -1058,7 +1058,7 @@ h1:focus { } .auth-subtitle { - color: var(--truecv-gray-500); + color: var(--truecv-gray-600); margin-bottom: 2rem; } @@ -1086,7 +1086,7 @@ h1:focus { .auth-brand-text { font-size: 1.125rem; - color: rgba(255, 255, 255, 0.8); + color: rgba(255, 255, 255, 0.9); line-height: 1.6; margin-bottom: 2rem; } @@ -1111,7 +1111,7 @@ h1:focus { .auth-stat-label { font-size: 0.875rem; - color: rgba(255, 255, 255, 0.6); + color: rgba(255, 255, 255, 0.8); margin-top: 0.25rem; } @@ -1132,7 +1132,7 @@ h1:focus { .auth-testimonial cite { font-size: 0.875rem; - color: rgba(255, 255, 255, 0.6); + color: rgba(255, 255, 255, 0.8); font-style: normal; } @@ -1174,7 +1174,7 @@ h1:focus { position: relative; background: var(--truecv-bg-surface); padding: 0 1rem; - color: var(--truecv-gray-500); + color: var(--truecv-gray-600); font-size: 0.875rem; }