fix(web): text on a tint of its own hue uses the house -fg tokens (#3150)
release / web (push) Successful in 1m22s
release / govulncheck (push) Successful in 38s
release / go (push) Successful in 1m48s
release / integration (push) Successful in 5m1s
release / android (push) Successful in 5m41s
release / Build signed APK (releases and dev) (push) Successful in 5m11s
release / Attach APK to the Release (tag releases only) (push) Skipped
release / Build + push container image (push) Successful in 1m17s
release / Verify release artifacts (tag releases only) (push) Skipped
release / web (push) Successful in 1m22s
release / govulncheck (push) Successful in 38s
release / go (push) Successful in 1m48s
release / integration (push) Successful in 5m1s
release / android (push) Successful in 5m41s
release / Build signed APK (releases and dev) (push) Successful in 5m11s
release / Attach APK to the Release (tag releases only) (push) Skipped
release / Build + push container image (push) Successful in 1m17s
release / Verify release artifacts (tag releases only) (push) Skipped
A hue painted as text on a color-mix tint of itself sits close to the surface under it. On Minstrel's surfaces the raw accent on its 15% tint measures 1.97:1 at worst (dark mode, hover surface), against AA's 4.5. - tokens.json gains colors.fg: the five FabledSword -fg formulas (accent 45%, success 45%, warning, error and info 50%), each mixed toward parchment so one declaration serves both modes. Success is Minstrel's moss. tokens-to-css emits them in :root. - Tailwind exposes them as text-accent-fg, text-warning-fg, text-error-fg and text-info-fg. - 23 sites swapped: 14 Tailwind class strings (PlayerBar and the admin count pills) and 9 CSS rules (StatusPill's four tones and five accent chips). Worst case after: accent-fg 5.03, error-fg 4.75, warning-fg 4.92, success-fg 4.85. - scripts/check-tint-contrast.js finds the pair in either spelling. Its test scans src in the web Vitest lane and fails on any new site, with fixture cases showing it can fail. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -5,7 +5,8 @@ const sample = {
|
||||
colors: {
|
||||
dark: { obsidian: '#000', parchment: '#FFF' },
|
||||
light: { obsidian: '#FFF', parchment: '#000' },
|
||||
flat: { accent: '#4A6B5C', 'on-action': '#E8E4D8' }
|
||||
flat: { accent: '#4A6B5C', 'on-action': '#E8E4D8' },
|
||||
fg: { 'accent-fg': 'color-mix(in srgb, var(--fs-accent) 45%, var(--fs-parchment))' }
|
||||
},
|
||||
radii: { sm: '4px' },
|
||||
fontStacks: {
|
||||
@@ -40,4 +41,13 @@ describe('tokens-to-css emit()', () => {
|
||||
expect(css).toContain('--fs-radius-sm: 4px;');
|
||||
expect(css).toContain("--fs-font-display: 'Fraunces', serif;");
|
||||
});
|
||||
|
||||
test('emits the -fg tokens in :root, not the light block', () => {
|
||||
const css = emit(sample);
|
||||
const root = css.match(/:root \{([\s\S]*?)\}/);
|
||||
expect(root).not.toBeNull();
|
||||
expect(root[1]).toContain('--fs-accent-fg: color-mix(in srgb, var(--fs-accent) 45%, var(--fs-parchment));');
|
||||
const light = css.match(/\[data-theme="light"\] \{([\s\S]*?)\}/);
|
||||
expect(light[1]).not.toContain('-fg');
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user