Improve UI styling and AI company matching

- Enhance text contrast (darker grey #2d2b27)
- Soften footer with warmer dark (#3a3833)
- Use warmer primary blue (#3d5a80)
- Add subtle background gradient for depth
- Strengthen table header styling
- Increase logo size to 95px for better visibility
- Fix AI matcher to handle acronyms in parentheses (e.g., NHP)
- Improve matching rules for CIC/LLP legal suffixes

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-21 01:27:53 +01:00
parent 71efbcfc48
commit b2887dfe38
3 changed files with 28 additions and 17 deletions

View File

@@ -40,11 +40,13 @@ public sealed class AICompanyNameMatcherService : ICompanyNameMatcherService
Rules: Rules:
1. A match requires the companies to be the SAME organisation, not just similar names 1. A match requires the companies to be the SAME organisation, not just similar names
2. "Families First CiC" is NOT the same as "FAMILIES AGAINST CONFORMITY LTD" - these are different organisations 2. "Families First CiC" is NOT the same as "FAMILIES AGAINST CONFORMITY LTD" - different words = different companies
3. "North Halifax Partnership" is NOT the same as "NORTH LIMITED" - completely different companies 3. Trading names should match their registered entity (e.g., "Tesco" matches "TESCO PLC")
4. Trading names should match their registered entity (e.g., "Tesco" matches "TESCO PLC") 4. Subsidiaries can match if clearly the same organisation (e.g., "ASDA" could match "ASDA STORES LIMITED")
5. Subsidiaries can match if clearly the same organisation (e.g., "ASDA" could match "ASDA STORES LIMITED") 5. Acronyms in parentheses are abbreviations of the full name (e.g., "North Halifax Partnership (NHP)" = "NORTH HALIFAX PARTNERSHIP")
6. If NO candidate is clearly the same company, return "NONE" as the best match 6. CiC/CIC = Community Interest Company, LLP = Limited Liability Partnership - these are legal suffixes
7. If the CV name contains all the key words of a candidate (ignoring Ltd/Limited/CIC/etc.), it's likely a match
8. If NO candidate is clearly the same company, return "NONE" as the best match
Respond with this exact JSON structure: Respond with this exact JSON structure:
{ {

View File

@@ -4,7 +4,7 @@
<nav class="navbar navbar-expand-lg navbar-light shadow-sm" style="background-color: var(--truecv-bg-surface);"> <nav class="navbar navbar-expand-lg navbar-light shadow-sm" style="background-color: var(--truecv-bg-surface);">
<div class="container"> <div class="container">
<a class="navbar-brand fw-bold" href="/"> <a class="navbar-brand fw-bold" href="/">
<img src="images/TrueCV_Logo.png" alt="TrueCV" style="height: 50px;" /> <img src="images/TrueCV_Logo.png" alt="TrueCV" style="height: 95px;" />
</a> </a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
@@ -77,7 +77,7 @@
@Body @Body
</main> </main>
<footer class="bg-dark text-light py-4 mt-auto"> <footer class="text-light py-4 mt-auto" style="background-color: var(--truecv-footer-bg);">
<div class="container text-center"> <div class="container text-center">
<p class="mb-0">&copy; @DateTime.Now.Year TrueCV. All rights reserved.</p> <p class="mb-0">&copy; @DateTime.Now.Year TrueCV. All rights reserved.</p>
</div> </div>

View File

@@ -1,10 +1,10 @@
/* TrueCV Custom Design System */ /* TrueCV Custom Design System */
:root { :root {
/* Primary brand colors - slightly softer */ /* Primary brand colors - warmer blue */
--truecv-primary: #3b6fd4; --truecv-primary: #3d5a80;
--truecv-primary-dark: #2c5bb5; --truecv-primary-dark: #2c4a6e;
--truecv-primary-light: #5889e0; --truecv-primary-light: #5a7a9a;
/* Semantic colors for verification states */ /* Semantic colors for verification states */
--truecv-verified: #059669; --truecv-verified: #059669;
@@ -14,25 +14,30 @@
--truecv-danger: #dc2626; --truecv-danger: #dc2626;
--truecv-danger-light: #fde8e8; --truecv-danger-light: #fde8e8;
/* Eye-friendly neutral palette - warmer tones */ /* Eye-friendly neutral palette - warmer tones with better contrast */
--truecv-gray-50: #faf9f7; --truecv-gray-50: #faf9f7;
--truecv-gray-100: #f0ede8; --truecv-gray-100: #f0ede8;
--truecv-gray-200: #e5e2dc; --truecv-gray-200: #e5e2dc;
--truecv-gray-300: #d6d2cb; --truecv-gray-300: #d6d2cb;
--truecv-gray-500: #6b7280; --truecv-gray-500: #5a5751;
--truecv-gray-700: #3a3833; --truecv-gray-700: #2d2b27;
--truecv-gray-900: #1a1917; --truecv-gray-900: #1a1917;
/* Surface colours for eye comfort */ /* Surface colours for eye comfort */
--truecv-bg-page: #f5f3f0; --truecv-bg-page: #f5f3f0;
--truecv-bg-surface: #faf9f7; --truecv-bg-surface: #faf9f7;
--truecv-bg-muted: #f0ede8; --truecv-bg-muted: #f0ede8;
/* Footer */
--truecv-footer-bg: #3a3833;
} }
html, body { html, body {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
color: var(--truecv-gray-700); color: var(--truecv-gray-700);
background-color: var(--truecv-bg-page); background: linear-gradient(180deg, var(--truecv-bg-page) 0%, #ebe8e3 100%);
background-attachment: fixed;
min-height: 100vh;
} }
/* Typography scale */ /* Typography scale */
@@ -120,8 +125,12 @@ a:hover {
padding: 1rem 0.75rem; padding: 1rem 0.75rem;
} }
.table thead th.text-muted {
color: var(--truecv-gray-500) !important;
}
.table-hover > tbody > tr:hover { .table-hover > tbody > tr:hover {
background-color: rgba(37, 99, 235, 0.04); background-color: rgba(61, 90, 128, 0.04);
} }
/* Badges */ /* Badges */
@@ -136,7 +145,7 @@ a:hover {
} }
.bg-primary-subtle { .bg-primary-subtle {
background-color: #e3ecf7 !important; background-color: #e1e8ef !important;
} }
.bg-secondary-subtle { .bg-secondary-subtle {