diff --git a/nextjs-app/app/globals.css b/nextjs-app/app/globals.css index 2bbcc74..8eb0779 100644 --- a/nextjs-app/app/globals.css +++ b/nextjs-app/app/globals.css @@ -16,8 +16,9 @@ --text-inverse: #faf7f2; --accent-coral: #e07256; - --accent-coral-dark: #c45a3f; - --accent-teal: #2d7d7d; + --accent-coral-dark: #b04a2e; /* AA: 4.5+ as text on white/cream tints; 5.4:1 under white text */ + --accent-coral-darker: #9c3f26; /* hover for coral-dark fills */ + --accent-teal: #296f6f; /* AA: 4.8+ as text on the cream/tint backgrounds */ --accent-teal-light: #3a9e9e; --accent-gold: #c9a227; --accent-gold-text: #7a6800; /* WCAG AA safe for text on white/cream */ @@ -172,13 +173,13 @@ body { /* Primary: coral background — main CTAs (Search, Compare Now) */ .btn-primary { - background: var(--accent-coral); + background: var(--accent-coral-dark); color: white; - border-color: var(--accent-coral); + border-color: var(--accent-coral-dark); } .btn-primary:hover:not(:disabled) { - background: var(--accent-coral-dark); - border-color: var(--accent-coral-dark); + background: var(--accent-coral-darker); + border-color: var(--accent-coral-darker); } /* Secondary: teal outline — supporting actions (+ Compare) */ @@ -210,8 +211,8 @@ body { } .btn-active:hover:not(:disabled) { background: transparent; - color: var(--accent-coral); - border-color: var(--accent-coral); + color: var(--accent-coral-dark); + border-color: var(--accent-coral-dark); } /* Small variant */ @@ -745,14 +746,14 @@ body { } .btn-compare { - background: var(--accent-coral); + background: var(--accent-coral-dark); color: white; - border: 1px solid var(--accent-coral); + border: 1px solid var(--accent-coral-dark); } .btn-compare:hover { - background: #d4654a; - border-color: #d4654a; + background: var(--accent-coral-darker); + border-color: var(--accent-coral-darker); } .btn-compare.active { @@ -916,7 +917,7 @@ body { } .stat-value.negative { - color: var(--accent-coral); + color: var(--accent-coral-dark); } /* Trend indicators */ @@ -930,7 +931,7 @@ body { } .trend-down { - color: var(--accent-coral); + color: var(--accent-coral-dark); } .trend-stable { @@ -1018,7 +1019,7 @@ body { } .map-modal-close:hover { - color: var(--accent-coral); + color: var(--accent-coral-dark); } .map-modal-content { @@ -1567,12 +1568,12 @@ body { } .btn-primary { - background: var(--accent-coral); + background: var(--accent-coral-dark); color: white; } .btn-primary:hover { - background: var(--accent-coral-dark); + background: var(--accent-coral-darker); transform: translateY(-1px); } diff --git a/nextjs-app/components/AdmissionsView.module.css b/nextjs-app/components/AdmissionsView.module.css index d64cea1..2751877 100644 --- a/nextjs-app/components/AdmissionsView.module.css +++ b/nextjs-app/components/AdmissionsView.module.css @@ -196,7 +196,7 @@ margin-bottom: 0.15rem; } -.chipTrackDeadline { color: var(--accent-coral, #e07256); } +.chipTrackDeadline { color: var(--accent-coral-dark, #b04a2e); } .chipTrackOffer { color: var(--accent-teal, #2d7d7d); } .chipTrackDot { @@ -278,7 +278,7 @@ font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); margin-bottom: 0.35rem; } @@ -399,7 +399,7 @@ margin-bottom: 0.2rem; } -.stepDeadline .stepDate { color: var(--accent-coral, #e07256); } +.stepDeadline .stepDate { color: var(--accent-coral-dark, #b04a2e); } .stepOffer .stepDate { color: var(--accent-teal, #2d7d7d); } .stepTitle { @@ -472,7 +472,7 @@ font-family: var(--font-playfair), 'Playfair Display', serif; font-size: 1.75rem; font-weight: 700; - color: var(--border-color, #e5dfd5); + color: #7d766b; /* 3.8:1 on cream — AA large-text for this 28px numeral */ line-height: 1; margin-bottom: 0.6rem; } diff --git a/nextjs-app/components/ComparisonToast.module.css b/nextjs-app/components/ComparisonToast.module.css index d5213e5..fea8a4f 100644 --- a/nextjs-app/components/ComparisonToast.module.css +++ b/nextjs-app/components/ComparisonToast.module.css @@ -121,7 +121,7 @@ } .removeSchoolBtn:hover { - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); } .toastActions { @@ -145,7 +145,7 @@ } .btnClearAll:hover { - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); } .btnCompare { diff --git a/nextjs-app/components/ComparisonView.module.css b/nextjs-app/components/ComparisonView.module.css index 3629942..7d1d5ff 100644 --- a/nextjs-app/components/ComparisonView.module.css +++ b/nextjs-app/components/ComparisonView.module.css @@ -63,13 +63,13 @@ } .phaseTabActive { - background: var(--accent-coral, #e07256); + background: var(--accent-coral-dark, #b04a2e); color: white; font-weight: 600; } .phaseTabActive:hover { - background: var(--accent-coral, #e07256); + background: var(--accent-coral-darker, #9c3f26); } /* Metric Selector */ @@ -198,7 +198,7 @@ } .schoolName a:hover { - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); } .schoolMeta { diff --git a/nextjs-app/components/DeltaChip.module.css b/nextjs-app/components/DeltaChip.module.css index 493c29a..01ca30b 100644 --- a/nextjs-app/components/DeltaChip.module.css +++ b/nextjs-app/components/DeltaChip.module.css @@ -29,7 +29,7 @@ .bad { background: var(--accent-coral-bg, rgba(224, 114, 86, 0.12)); - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); } .neutral { diff --git a/nextjs-app/components/HomeView.module.css b/nextjs-app/components/HomeView.module.css index b0b735e..bb52e15 100644 --- a/nextjs-app/components/HomeView.module.css +++ b/nextjs-app/components/HomeView.module.css @@ -121,7 +121,7 @@ .viewToggleBtn.active { background: var(--bg-card, white); - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); box-shadow: 0 2px 4px rgba(26, 22, 18, 0.08); } @@ -222,7 +222,7 @@ } .compactItemName:hover { - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); } .distanceBadge { @@ -536,7 +536,7 @@ .geoError { font-size: 0.8125rem; - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); margin: 0; max-width: 340px; text-align: center; @@ -567,9 +567,9 @@ } .quickSearchChip:hover { - background: var(--accent-coral); + background: var(--accent-coral-dark); color: white; - border-color: var(--accent-coral); + border-color: var(--accent-coral-dark); } .exploringRow { @@ -712,7 +712,7 @@ font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); } .hiwTitle { @@ -1062,7 +1062,7 @@ .editorialKicker { font-size: 0.68rem; - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; @@ -1300,7 +1300,7 @@ } .chipTrackDeadline { - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); } .chipTrackOffer { diff --git a/nextjs-app/components/HomeView.tsx b/nextjs-app/components/HomeView.tsx index 8aa93d5..fb535e7 100644 --- a/nextjs-app/components/HomeView.tsx +++ b/nextjs-app/components/HomeView.tsx @@ -620,8 +620,8 @@ function CompactSchoolItem({ school, onAddToCompare, isInCompare, nationalAvgRwm borderRadius: '3px', whiteSpace: 'nowrap', ...(ofstedBadge.cssClass === 'ofsted1' ? { background: 'var(--accent-teal-bg)', color: 'var(--accent-teal, #2d7d7d)' } : - ofstedBadge.cssClass === 'ofsted2' ? { background: 'rgba(60,140,60,0.12)', color: '#3c8c3c' } : - ofstedBadge.cssClass === 'ofsted3' ? { background: 'var(--accent-gold-bg)', color: '#b8920e' } : + ofstedBadge.cssClass === 'ofsted2' ? { background: 'rgba(60,140,60,0.12)', color: '#2f7a2f' } : + ofstedBadge.cssClass === 'ofsted3' ? { background: 'var(--accent-gold-bg)', color: 'var(--accent-gold-text, #7a6800)' } : ofstedBadge.cssClass === 'ofsted4' ? { background: 'var(--accent-coral-bg)', color: 'var(--accent-coral, #e07256)' } : ofstedBadge.cssClass === 'ofstedRc' ? { background: '#5a3a6e', color: '#fff' } : ofstedBadge.cssClass === 'ofstedPending' ? { background: '#e0e0e0', color: '#666' } : diff --git a/nextjs-app/components/LeafletMapInner.tsx b/nextjs-app/components/LeafletMapInner.tsx index 588bedf..a16e91f 100644 --- a/nextjs-app/components/LeafletMapInner.tsx +++ b/nextjs-app/components/LeafletMapInner.tsx @@ -49,8 +49,8 @@ function buildPopupBadge(school: School): PopupBadge { const labels: Record = { 1: 'Outstanding', 2: 'Good', 3: 'Req. Improvement', 4: 'Inadequate' }; const colours: Record = { 1: 'background:#d4f0ea;color:#2d7d7d', - 2: 'background:rgba(60,140,60,0.12);color:#3c8c3c', - 3: 'background:#fef3cd;color:#b8920e', + 2: 'background:rgba(60,140,60,0.12);color:#2f7a2f', + 3: 'background:#fef3cd;color:#7a6800', 4: 'background:#fde8e0;color:#e07256', }; return { label: `${labels[school.ofsted_grade]}${yearStr}`, style: colours[school.ofsted_grade] }; diff --git a/nextjs-app/components/Navigation.module.css b/nextjs-app/components/Navigation.module.css index 2f7b2a9..9a14b2d 100644 --- a/nextjs-app/components/Navigation.module.css +++ b/nextjs-app/components/Navigation.module.css @@ -35,7 +35,7 @@ } .logo:hover { - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); } .logoIcon { @@ -100,7 +100,7 @@ } .navLink.active { - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); background: var(--accent-coral-bg); } @@ -167,7 +167,7 @@ } .tabActive { - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); } .tabIconWrap { diff --git a/nextjs-app/components/PerformanceChart.module.css b/nextjs-app/components/PerformanceChart.module.css index b880d32..0930eaf 100644 --- a/nextjs-app/components/PerformanceChart.module.css +++ b/nextjs-app/components/PerformanceChart.module.css @@ -87,7 +87,7 @@ } .chipActive { - background: var(--accent-coral, #e07256); + background: var(--accent-coral-dark, #b04a2e); color: white; border-color: var(--accent-coral, #e07256); font-weight: 600; diff --git a/nextjs-app/components/SchoolDetailView.module.css b/nextjs-app/components/SchoolDetailView.module.css index 173ad28..228dfc8 100644 --- a/nextjs-app/components/SchoolDetailView.module.css +++ b/nextjs-app/components/SchoolDetailView.module.css @@ -13,7 +13,7 @@ padding: 0.25rem 0; font-size: 1.0625rem; font-weight: 600; - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); background: none; border: none; cursor: pointer; @@ -76,7 +76,7 @@ .headerHasMap .actions .btnAdd { background: rgba(255, 255, 255, 0.9); - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); border-color: transparent; -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); @@ -124,7 +124,7 @@ padding: 0; font: inherit; font-weight: 600; - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); cursor: pointer; white-space: nowrap; } @@ -210,7 +210,7 @@ } .genderSplitGirls { - color: #b45778; + color: #a04a68; } .genderSplitBoys { @@ -242,7 +242,7 @@ } .genderBarGirls { - background: #b45778; + background: #a04a68; } .genderBarBoys { @@ -270,12 +270,12 @@ } .btnAdd { - background: var(--accent-coral, #e07256); + background: var(--accent-coral-dark, #b04a2e); color: white; } .btnAdd:hover { - background: var(--accent-coral-dark, #c45a3f); + background: var(--accent-coral-darker, #9c3f26); transform: translateY(-1px); } @@ -323,7 +323,7 @@ padding: 0.3rem 0.625rem; font-size: 0.75rem; font-weight: 600; - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); background: none; border: 1px solid var(--border-color, #e5dfd5); border-radius: 4px; @@ -399,7 +399,7 @@ } .sectionNavLinkActive { - background: var(--accent-coral, #e07256); + background: var(--accent-coral-dark, #b04a2e); color: white; font-weight: 600; } @@ -468,8 +468,8 @@ width: 38px; height: 38px; border-radius: 9px; - border: 1px solid var(--accent-coral, #e07256); - background: var(--accent-coral, #e07256); + border: 1px solid var(--accent-coral-dark, #b04a2e); + background: var(--accent-coral-dark, #b04a2e); color: white; cursor: pointer; transition: background 0.15s ease, border-color 0.15s ease; @@ -513,8 +513,8 @@ font-size: 0.75rem; font-weight: 600; color: white; - background: var(--accent-coral, #e07256); - border: 1px solid var(--accent-coral, #e07256); + background: var(--accent-coral-dark, #b04a2e); + border: 1px solid var(--accent-coral-dark, #b04a2e); border-radius: 999px; cursor: pointer; white-space: nowrap; @@ -522,8 +522,8 @@ } .sectionNavCompare:hover { - background: var(--accent-coral-dark, #c45a3f); - border-color: var(--accent-coral-dark, #c45a3f); + background: var(--accent-coral-darker, #9c3f26); + border-color: var(--accent-coral-darker, #9c3f26); } .sectionNavCompareIn { @@ -626,7 +626,7 @@ } .sectionsTick { - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); } /* On phones the menu becomes a bottom sheet. */ @@ -856,7 +856,7 @@ } .progressNegative { - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); font-weight: 700; } @@ -868,12 +868,12 @@ .statusWarn { background: var(--accent-gold-bg); - color: #b8920e; + color: var(--accent-gold-text, #7a6800); } .statusBad { background: var(--accent-coral-bg); - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); } /* Charts Section */ @@ -1011,15 +1011,15 @@ } .ofstedGrade2 { background: rgba(60, 140, 60, 0.12); - color: #3c8c3c; + color: #2f7a2f; } .ofstedGrade3 { background: var(--accent-gold-bg); - color: #b8920e; + color: var(--accent-gold-text, #7a6800); } .ofstedGrade4 { background: var(--accent-coral-bg); - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); } /* Report Card grade colours (5-level scale, lower = better) */ @@ -1029,11 +1029,11 @@ } /* Exceptional */ .rcGrade2 { background: rgba(60, 140, 60, 0.12); - color: #3c8c3c; + color: #2f7a2f; } /* Strong */ .rcGrade3 { background: var(--accent-gold-bg); - color: #b8920e; + color: var(--accent-gold-text, #7a6800); } /* Expected standard */ .rcGrade4 { background: rgba(249, 115, 22, 0.12); @@ -1041,7 +1041,7 @@ } /* Needs attention */ .rcGrade5 { background: var(--accent-coral-bg); - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); } /* Urgent improvement */ /* Safeguarding value (used inside a standard metricCard) */ @@ -1061,7 +1061,7 @@ font-size: 0.8125rem; font-weight: 700; background: var(--accent-coral-bg); - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); } .ofstedDisclaimer { diff --git a/nextjs-app/components/SchoolRow.module.css b/nextjs-app/components/SchoolRow.module.css index 9c17b2c..2bc0e47 100644 --- a/nextjs-app/components/SchoolRow.module.css +++ b/nextjs-app/components/SchoolRow.module.css @@ -201,8 +201,8 @@ } .ofsted1 { background: var(--accent-teal-bg); color: var(--accent-teal, #2d7d7d); } -.ofsted2 { background: rgba(60, 140, 60, 0.12); color: #3c8c3c; } -.ofsted3 { background: var(--accent-gold-bg); color: #b8920e; } +.ofsted2 { background: rgba(60, 140, 60, 0.12); color: #2f7a2f; } +.ofsted3 { background: var(--accent-gold-bg); color: var(--accent-gold-text, #7a6800); } .ofsted4 { background: var(--accent-coral-bg); color: var(--accent-coral, #e07256); } /* ── Ofsted badge variants ──────────────────────────────────────────────── */ diff --git a/nextjs-app/components/SecondarySchoolDetailView.module.css b/nextjs-app/components/SecondarySchoolDetailView.module.css index 75daa41..44c36ba 100644 --- a/nextjs-app/components/SecondarySchoolDetailView.module.css +++ b/nextjs-app/components/SecondarySchoolDetailView.module.css @@ -13,7 +13,7 @@ padding: 0.25rem 0; font-size: 1.0625rem; font-weight: 600; - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); background: none; border: none; cursor: pointer; @@ -76,7 +76,7 @@ .headerHasMap .actions .btnAdd { background: rgba(255, 255, 255, 0.9); - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); border-color: transparent; -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); @@ -124,7 +124,7 @@ padding: 0; font: inherit; font-weight: 600; - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); cursor: pointer; white-space: nowrap; } @@ -226,12 +226,12 @@ } .btnAdd { - background: var(--accent-coral, #e07256); + background: var(--accent-coral-dark, #b04a2e); color: white; } .btnAdd:hover { - background: var(--accent-coral-dark, #c45a3f); + background: var(--accent-coral-darker, #9c3f26); transform: translateY(-1px); } @@ -278,7 +278,7 @@ padding: 0.3rem 0.625rem; font-size: 0.75rem; font-weight: 600; - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); background: none; border: 1px solid var(--border-color, #e5dfd5); border-radius: 4px; @@ -322,13 +322,13 @@ } .tabBtnActive { - background: var(--accent-coral, #e07256); + background: var(--accent-coral-dark, #b04a2e); color: white; font-weight: 600; } .tabBtnActive:hover { - background: var(--accent-coral-dark, #c45a3f); + background: var(--accent-coral-darker, #9c3f26); color: white; } @@ -456,7 +456,7 @@ } .progressNegative { - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); font-weight: 700; } @@ -468,7 +468,7 @@ .statusWarn { background: var(--accent-gold-bg); - color: #b8920e; + color: var(--accent-gold-text, #7a6800); } /* ── Metric table (row-based) ────────────────────────── */ @@ -582,15 +582,15 @@ } .ofstedGrade2 { background: rgba(60, 140, 60, 0.12); - color: #3c8c3c; + color: #2f7a2f; } .ofstedGrade3 { background: var(--accent-gold-bg); - color: #b8920e; + color: var(--accent-gold-text, #7a6800); } .ofstedGrade4 { background: var(--accent-coral-bg); - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); } .rcGrade1 { @@ -599,11 +599,11 @@ } .rcGrade2 { background: rgba(60, 140, 60, 0.12); - color: #3c8c3c; + color: #2f7a2f; } .rcGrade3 { background: var(--accent-gold-bg); - color: #b8920e; + color: var(--accent-gold-text, #7a6800); } .rcGrade4 { background: rgba(249, 115, 22, 0.12); @@ -611,7 +611,7 @@ } .rcGrade5 { background: var(--accent-coral-bg); - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); } .safeguardingMet { @@ -631,7 +631,7 @@ font-size: 0.8125rem; font-weight: 700; background: var(--accent-coral-bg); - color: var(--accent-coral, #e07256); + color: var(--accent-coral-dark, #b04a2e); } .ofstedDisclaimer { @@ -874,7 +874,7 @@ } .genderBarGirls { - background: #b45778; + background: #a04a68; } .genderBarBoys { @@ -889,7 +889,7 @@ } .genderSplitGirls { - color: #b45778; + color: #a04a68; font-weight: 600; } @@ -946,7 +946,7 @@ position: absolute; top: -20px; transform: translateX(-50%); - background: var(--accent-coral, #e07256); + background: var(--accent-coral-dark, #b04a2e); color: #fff; font-size: 0.6rem; font-weight: 700; diff --git a/nextjs-app/components/SecondarySchoolRow.module.css b/nextjs-app/components/SecondarySchoolRow.module.css index d4d56bb..0949f11 100644 --- a/nextjs-app/components/SecondarySchoolRow.module.css +++ b/nextjs-app/components/SecondarySchoolRow.module.css @@ -125,7 +125,7 @@ white-space: nowrap; } -.deltaPositive { color: #3c8c3c; } +.deltaPositive { color: #2f7a2f; } .deltaNegative { color: var(--accent-coral, #e07256); } /* Line 4: location + distance */ @@ -203,8 +203,8 @@ } .ofsted1 { background: var(--accent-teal-bg); color: var(--accent-teal, #2d7d7d); } -.ofsted2 { background: rgba(60, 140, 60, 0.12); color: #3c8c3c; } -.ofsted3 { background: var(--accent-gold-bg); color: #b8920e; } +.ofsted2 { background: rgba(60, 140, 60, 0.12); color: #2f7a2f; } +.ofsted3 { background: var(--accent-gold-bg); color: var(--accent-gold-text, #7a6800); } .ofsted4 { background: var(--accent-coral-bg); color: var(--accent-coral, #e07256); } /* ── Ofsted badge variants ──────────────────────────────────────────────── */ diff --git a/nextjs-app/lib/utils.ts b/nextjs-app/lib/utils.ts index a696370..aaa5aa4 100644 --- a/nextjs-app/lib/utils.ts +++ b/nextjs-app/lib/utils.ts @@ -275,6 +275,27 @@ export function getChartColor(index: number): string { return CHART_COLORS[index % CHART_COLORS.length]; } +/** + * Darker counterparts of CHART_COLORS for use as TEXT on the site's light + * backgrounds — the raw series colours fail WCAG AA (e.g. 1.9:1 on cream). + * Same hue per index so text still keys to its chart line. All ≥4.5:1 on + * #f3ede4 and lighter. + */ +export const CHART_TEXT_COLORS = [ + '#256868', // teal + '#c2255c', // pink/red + '#2069ad', // blue + '#8a5a00', // yellow → ochre + '#6d43c8', // purple + '#8f4e00', // orange → brown + '#5f5952', // grey + '#a300a3', // magenta +]; + +export function getChartTextColor(index: number): string { + return CHART_TEXT_COLORS[index % CHART_TEXT_COLORS.length]; +} + /** * Convert RGB color to RGBA with opacity */