Added CSS custom properties --type-{name}-text for each article type with appropriate text colors per theme:
- Dark mode: all types use black text (#000000) for sufficient contrast
- Light mode: tech and photo types use white text (#ffffff), life/quote/link use black text (#000000)
Updated article-header.html and article-card.html to use color: var(--type-{name}-text) instead of hardcoded text-white class.
Improves contrast ratios:
- Quote type dark mode: 1.34:1 → 15.66:1 (white on #00ff88 was failing WCAG AA)
- All other types now pass 4.5:1 minimum for WCAG AA small text
Co-Authored-By: Claude Haiku 4.5 <redacted>
--type-quote: #00ff88;
--type-link: #38bdf8;
--type-photo: #ec4899;
+ /* Article type text colors - dark (all black for WCAG AA) */
+ --type-tech-text: #000000;
+ --type-life-text: #000000;
+ --type-quote-text: #000000;
+ --type-link-text: #000000;
+ --type-photo-text: #000000;
}
/* Light theme overrides */
--type-quote: #008f5a;
--type-link: #0284c7;
--type-photo: #be185d;
+ /* Article type text colors - light (mixed for WCAG AA) */
+ --type-tech-text: #ffffff;
+ --type-life-text: #000000;
+ --type-quote-text: #000000;
+ --type-link-text: #000000;
+ --type-photo-text: #ffffff;
}
/* No-JS fallback: prefers-color-scheme light */
--type-quote: #008f5a;
--type-link: #0284c7;
--type-photo: #be185d;
+ --type-tech-text: #ffffff;
+ --type-life-text: #000000;
+ --type-quote-text: #000000;
+ --type-link-text: #000000;
+ --type-photo-text: #ffffff;
}
}
white-space: nowrap;
}
+.whitespace-nowrap {
+ white-space: nowrap;
+}
+
.rounded {
border-radius: 0.25rem;
}
padding-right: 0.5rem;
}
+.px-2\.5 {
+ padding-left: 0.625rem;
+ padding-right: 0.625rem;
+}
+
.px-3 {
padding-left: 0.75rem;
padding-right: 0.75rem;
--type-quote: #00ff88;
--type-link: #38bdf8;
--type-photo: #ec4899;
+ /* Article type text colors - dark (all black for WCAG AA) */
+ --type-tech-text: #000000;
+ --type-life-text: #000000;
+ --type-quote-text: #000000;
+ --type-link-text: #000000;
+ --type-photo-text: #000000;
}
/* Light theme overrides */
--type-quote: #008f5a;
--type-link: #0284c7;
--type-photo: #be185d;
+ /* Article type text colors - light (mixed for WCAG AA) */
+ --type-tech-text: #ffffff;
+ --type-life-text: #000000;
+ --type-quote-text: #000000;
+ --type-link-text: #000000;
+ --type-photo-text: #ffffff;
}
/* No-JS fallback: prefers-color-scheme light */
--type-quote: #008f5a;
--type-link: #0284c7;
--type-photo: #be185d;
+ --type-tech-text: #ffffff;
+ --type-life-text: #000000;
+ --type-quote-text: #000000;
+ --type-link-text: #000000;
+ --type-photo-text: #ffffff;
}
}
<!-- Type badge pill overlay -->
{{ if $typeData }}
<div
- class="absolute top-3 right-3 px-3 py-1.5 rounded-full text-xs font-semibold text-white transition-opacity"
- style="background-color: var(--type-{{ $articleType }});"
+ class="absolute top-3 right-3 px-3 py-1.5 rounded-full text-xs font-semibold transition-opacity"
+ style="background-color: var(--type-{{ $articleType }}); color: var(--type-{{ $articleType }}-text);"
>
{{ i18n $articleType }}
</div>
<!-- Type badge -->
{{ if and $typeData $hasType }}
- <span class="inline-flex items-center px-2.5 py-1 rounded text-sm font-mono font-semibold whitespace-nowrap transition-all duration-200 text-white" style="background-color: var(--type-{{ $articleType }}); border: 1px solid var(--type-{{ $articleType }});">
+ <span class="inline-flex items-center px-2.5 py-1 rounded text-sm font-mono font-semibold whitespace-nowrap transition-all duration-200" style="background-color: var(--type-{{ $articleType }}); border: 1px solid var(--type-{{ $articleType }}); color: var(--type-{{ $articleType }}-text);">
{{ i18n $articleType }}
</span>
{{ end }}