From 13b81bf849fa9edca603dd01d6c8a8e4c56497ab Mon Sep 17 00:00:00 2001 From: Peter Li Date: Fri, 17 Jul 2026 09:55:33 +0800 Subject: [PATCH] fix: harden callout contrast and code wrapping --- screenshot.png | Bin 22168 -> 22489 bytes scripts/contrast.mjs | 80 +++++++++++++++++++++++- src/components/_callouts.scss | 4 +- src/editor/_code.scss | 8 +++ src/foundations/_colors.scss | 4 ++ tests/components.test.mjs | 5 +- tests/editor-blocks.test.mjs | 15 +++++ tests/foundations.test.mjs | 113 +++++++++++++++++++++++++++++++++- tests/helpers/css.mjs | 1 + theme.css | 16 ++++- 10 files changed, 236 insertions(+), 10 deletions(-) diff --git a/screenshot.png b/screenshot.png index af454707c8af7a21ac2d633ecb2e758155c9f06a..82e5bbacf6e6b82ffa8da2831b5e7bd2bd8f04a8 100644 GIT binary patch literal 22489 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%0D%o^mmWsNnPU9@a2=N z%6G$iw@AFlj+vCJVyT0Hp+)WiHob^VJAT6g_luqCSNr{n7c;+LY3c>EQ|R=Z>*uHC zW=K*CuNICZe_N6{KIM-u5tX^kJGejem1#X_H9uy)6l(K}_Ea|j z6kPMQG9_tbGV^)VeEU=OBmqFL+zglIUPvat8DPDjdj*G8Cc)+KSysmtyVwfGMO$+@o;BC@-(oz98QYD|@G`MX!6q;#5WJ+-Psqt3;LONGaQG%zOrs_v1NyP^3{Z2IvS0~_9!;#?-(2S5nn~? zxsjp~&7z(WCK`VR>i05>J$*(TETv56Tf9cp;LdT|-lQG^^z<$#AF<7bn{P^cMOR}a zIEatppE(z%ShqkKecYpZhJ9?}H=KdVbeXx$`t+MaWkZs$;u{NT8F#5(+vEO#Gi>R@ z9WlY@cSDq)9G>8es8T6+y<+OGBYe7X6NRTRIH3Z*7OYkfUIF$D)1JtCDC%j9ygLqp zUprzBTS)j`e Hon!tDUyLi_ diff --git a/scripts/contrast.mjs b/scripts/contrast.mjs index ece5621..e7ea6a3 100644 --- a/scripts/contrast.mjs +++ b/scripts/contrast.mjs @@ -46,8 +46,86 @@ export function contrastRatio(foreground, background) { return (lighter + 0.05) / (darker + 0.05); } +function mixHex(foreground, background, foregroundWeight) { + const channels = rgbChannels(foreground).map((channel, index) => + Math.round( + channel * foregroundWeight + + rgbChannels(background)[index] * (1 - foregroundWeight), + ), + ); + + return `#${channels.map((channel) => channel.toString(16).padStart(2, "0")).join("")}`; +} + +const CALLOUT_TYPE_COLORS = { + light: { + note: "#086ddd", + warning: "#ec7500", + error: "#e93147", + example: "#7852ee", + quote: "#9e9e9e", + tip: "#00bfbc", + }, + dark: { + note: "#027aff", + warning: "#e9973f", + error: "#fb464c", + example: "#a882ff", + quote: "#9e9e9e", + tip: "#53dfdd", + }, +}; + +const CALLOUT_THEME_CONFIG = { + light: { + base: "#f8fafc", + normal: "#202936", + backgroundOpacity: 0.08, + titleWeight: 0.52, + bodyWeight: 0.5, + }, + dark: { + base: "#17191c", + normal: "#e7ebf0", + backgroundOpacity: 0.12, + titleWeight: 0.84, + bodyWeight: 0.72, + }, +}; + +export const CALLOUT_CONTRAST_PAIRS = Object.entries(CALLOUT_TYPE_COLORS) + .flatMap(([theme, types]) => { + const config = CALLOUT_THEME_CONFIG[theme]; + + return Object.entries(types).flatMap(([type, semantic]) => { + const background = mixHex( + semantic, + config.base, + config.backgroundOpacity, + ); + + return [ + [ + `${theme} callout ${type} title`, + mixHex(semantic, config.normal, config.titleWeight), + background, + ], + [ + `${theme} callout ${type} content`, + mixHex(semantic, config.normal, config.bodyWeight), + background, + ], + ]; + }); + }); + +export const ALL_CONTRAST_PAIRS = [ + ...CORE_CONTRAST_PAIRS, + ...CALLOUT_CONTRAST_PAIRS, +]; + export function runContrastCli( - pairs = CORE_CONTRAST_PAIRS, + pairs = ALL_CONTRAST_PAIRS, writeLine = (line) => console.log(line), ) { let failed = false; diff --git a/src/components/_callouts.scss b/src/components/_callouts.scss index a4808fc..ac824ce 100644 --- a/src/components/_callouts.scss +++ b/src/components/_callouts.scss @@ -17,7 +17,7 @@ body { ); color: color-mix( in srgb, - rgb(var(--callout-color)) 72%, + rgb(var(--callout-color)) var(--aera-callout-body-semantic-weight), var(--text-normal) ); border: 0; @@ -27,7 +27,7 @@ body { padding-inline-end: var(--size-4-12); color: color-mix( in srgb, - rgb(var(--callout-color)) 84%, + rgb(var(--callout-color)) var(--aera-callout-title-semantic-weight), var(--text-normal) ); } diff --git a/src/editor/_code.scss b/src/editor/_code.scss index 294bddf..bc9e03e 100644 --- a/src/editor/_code.scss +++ b/src/editor/_code.scss @@ -36,3 +36,11 @@ body { :where(.markdown-source-view.mod-cm6 .HyperMD-codeblock) { @include monokai-block; } + +.markdown-source-view.mod-cm6 :where(.HyperMD-codeblock) { + white-space: pre; + word-break: normal; + overflow-wrap: normal; + width: max-content; + min-width: 100%; +} diff --git a/src/foundations/_colors.scss b/src/foundations/_colors.scss index 11e7277..5a4a6d5 100644 --- a/src/foundations/_colors.scss +++ b/src/foundations/_colors.scss @@ -29,6 +29,8 @@ --aera-inline-code-background: #d9dee5; --aera-inline-code-color: #566273; --aera-callout-background-opacity: 0.08; + --aera-callout-title-semantic-weight: 52%; + --aera-callout-body-semantic-weight: 50%; --aera-quote-background: #f1f3f6; --aera-quote-fold: #d9dee5; } @@ -64,6 +66,8 @@ --aera-inline-code-background: #2a2f36; --aera-inline-code-color: #b8c0cc; --aera-callout-background-opacity: 0.12; + --aera-callout-title-semantic-weight: 84%; + --aera-callout-body-semantic-weight: 72%; --aera-quote-background: #22262c; --aera-quote-fold: #3a414a; } diff --git a/tests/components.test.mjs b/tests/components.test.mjs index 14336c1..f8154f7 100644 --- a/tests/components.test.mjs +++ b/tests/components.test.mjs @@ -24,6 +24,7 @@ const allowedSelectors = new Set([ ":where(.markdown-rendered pre:not(.frontmatter))", ":where(.markdown-rendered pre:not(.frontmatter)) code[class*=language-]", ":where(.markdown-source-view.mod-cm6 .HyperMD-codeblock)", + ".markdown-source-view.mod-cm6 :where(.HyperMD-codeblock)", ".markdown-rendered blockquote", ".markdown-rendered blockquote:not(blockquote blockquote)::before", ".markdown-rendered blockquote:not(blockquote blockquote)::after", @@ -123,7 +124,7 @@ test("uses a borderless semantic callout surface", () => { "background-color": "rgba(var(--callout-color), var(--aera-callout-background-opacity))", color: - "color-mix(in srgb, rgb(var(--callout-color)) 72%, var(--text-normal))", + "color-mix(in srgb, rgb(var(--callout-color)) var(--aera-callout-body-semantic-weight), var(--text-normal))", border: "0", }); }); @@ -136,7 +137,7 @@ test("keeps callout text clear of the watermark", () => { assert.deepEqual(Object.fromEntries(title), { "padding-inline-end": "var(--size-4-12)", color: - "color-mix(in srgb, rgb(var(--callout-color)) 84%, var(--text-normal))", + "color-mix(in srgb, rgb(var(--callout-color)) var(--aera-callout-title-semantic-weight), var(--text-normal))", }); assert.deepEqual(Object.fromEntries(content), { "padding-inline-end": "var(--size-4-12)", diff --git a/tests/editor-blocks.test.mjs b/tests/editor-blocks.test.mjs index aa79d29..61becc1 100644 --- a/tests/editor-blocks.test.mjs +++ b/tests/editor-blocks.test.mjs @@ -227,3 +227,18 @@ test("styles CM6 code block lines with direct Monokai declarations", () => { monokaiDeclarations, ); }); + +test("keeps CM6 fenced code lines on one horizontal line", () => { + assert.deepEqual( + directDeclarations( + ".markdown-source-view.mod-cm6 :where(.HyperMD-codeblock)", + ), + [ + ["white-space", "pre"], + ["word-break", "normal"], + ["overflow-wrap", "normal"], + ["width", "max-content"], + ["min-width", "100%"], + ], + ); +}); diff --git a/tests/foundations.test.mjs b/tests/foundations.test.mjs index f7cd3e7..2997672 100644 --- a/tests/foundations.test.mjs +++ b/tests/foundations.test.mjs @@ -8,6 +8,7 @@ import test from "node:test"; import { fileURLToPath } from "node:url"; import { + CALLOUT_CONTRAST_PAIRS, CORE_CONTRAST_PAIRS, contrastRatio, relativeLuminance, @@ -73,6 +74,8 @@ const expectedColors = { "--aera-inline-code-background": "#d9dee5", "--aera-inline-code-color": "#566273", "--aera-callout-background-opacity": "0.08", + "--aera-callout-title-semantic-weight": "52%", + "--aera-callout-body-semantic-weight": "50%", "--aera-quote-background": "#f1f3f6", "--aera-quote-fold": "#d9dee5", }, @@ -105,11 +108,79 @@ const expectedColors = { "--aera-inline-code-background": "#2a2f36", "--aera-inline-code-color": "#b8c0cc", "--aera-callout-background-opacity": "0.12", + "--aera-callout-title-semantic-weight": "84%", + "--aera-callout-body-semantic-weight": "72%", "--aera-quote-background": "#22262c", "--aera-quote-fold": "#3a414a", }, }; +const calloutTypeColors = { + ".theme-light": { + note: [8, 109, 221], + warning: [236, 117, 0], + error: [233, 49, 71], + example: [120, 82, 238], + quote: [158, 158, 158], + tip: [0, 191, 188], + }, + ".theme-dark": { + note: [2, 122, 255], + warning: [233, 151, 63], + error: [251, 70, 76], + example: [168, 130, 255], + quote: [158, 158, 158], + tip: [83, 223, 221], + }, +}; + +function hexChannels(hex) { + return [1, 3, 5].map((offset) => + Number.parseInt(hex.slice(offset, offset + 2), 16), + ); +} + +function mixChannels(foreground, background, foregroundWeight) { + return foreground.map( + (channel, index) => + channel * foregroundWeight + background[index] * (1 - foregroundWeight), + ); +} + +function channelLuminance(channel) { + const srgb = channel / 255; + return srgb <= 0.04045 + ? srgb / 12.92 + : ((srgb + 0.055) / 1.055) ** 2.4; +} + +function channelContrastRatio(foreground, background) { + const luminance = (channels) => { + const [red, green, blue] = channels.map(channelLuminance); + return 0.2126 * red + 0.7152 * green + 0.0722 * blue; + }; + const foregroundLuminance = luminance(foreground); + const backgroundLuminance = luminance(background); + + return ( + (Math.max(foregroundLuminance, backgroundLuminance) + 0.05) / + (Math.min(foregroundLuminance, backgroundLuminance) + 0.05) + ); +} + +function calloutSemanticWeight(colorDeclaration, themeDeclarations) { + const literal = colorDeclaration.match( + /rgb\(var\(--callout-color\)\) ([0-9.]+)%/, + ); + if (literal) return Number(literal[1]) / 100; + + const variable = colorDeclaration.match( + /rgb\(var\(--callout-color\)\) var\((--[^)]+)\)/, + ); + assert.ok(variable, colorDeclaration); + return Number.parseFloat(themeDeclarations.get(variable[1])) / 100; +} + for (const [selector, expected] of Object.entries(expectedColors)) { test(`${selector} defines the complete Aera color foundation`, () => { const declarations = declarationsFor(css, selector); @@ -120,6 +191,36 @@ for (const [selector, expected] of Object.entries(expectedColors)) { }); } +test("semantic callout titles and content meet WCAG AA in both themes", () => { + const roles = [ + ["title", declarationsFor(css, ".callout-title").get("color")], + ["content", declarationsFor(css, ".callout").get("color")], + ]; + + for (const [themeSelector, types] of Object.entries(calloutTypeColors)) { + const theme = declarationsFor(css, themeSelector); + const base = hexChannels(theme.get("--color-base-00")); + const normal = hexChannels(theme.get("--color-base-100")); + const backgroundOpacity = Number.parseFloat( + theme.get("--aera-callout-background-opacity"), + ); + + for (const [type, semantic] of Object.entries(types)) { + const background = mixChannels(semantic, base, backgroundOpacity); + + for (const [role, colorDeclaration] of roles) { + const weight = calloutSemanticWeight(colorDeclaration, theme); + const foreground = mixChannels(semantic, normal, weight); + const ratio = channelContrastRatio(foreground, background); + assert.ok( + ratio >= 4.5, + `${themeSelector} ${type} ${role} is ${ratio.toFixed(2)}:1`, + ); + } + } + } +}); + test("eleven core foreground/background pairs meet WCAG AA contrast", () => { assert.deepEqual(CORE_CONTRAST_PAIRS, [ ["light text", "#202936", "#f8fafc"], @@ -168,7 +269,12 @@ test("contrast calculation matches WCAG reference endpoints", () => { assert.equal(contrastRatio("#647184", "#647184"), 1); }); -test("contrast CLI prints all eleven pairs", () => { +test("contrast CLI prints the core and semantic callout pairs", () => { + assert.equal(CALLOUT_CONTRAST_PAIRS.length, 24); + const allPairs = [ + ...CORE_CONTRAST_PAIRS, + ...CALLOUT_CONTRAST_PAIRS, + ]; const result = spawnSync( process.execPath, [fileURLToPath(new URL("../scripts/contrast.mjs", import.meta.url))], @@ -177,8 +283,9 @@ test("contrast CLI prints all eleven pairs", () => { const lines = result.stdout.trim().split("\n"); assert.equal(result.status, 0, result.stderr); - assert.equal(lines.length, 11); - for (const [index, [name]] of CORE_CONTRAST_PAIRS.entries()) { + assert.equal(lines.length, 35); + for (const [index, [name, foreground, background]] of allPairs.entries()) { + assert.ok(contrastRatio(foreground, background) >= 4.5, name); assert.match(lines[index], new RegExp(`^PASS ${name}:`)); } }); diff --git a/tests/helpers/css.mjs b/tests/helpers/css.mjs index 3999cec..c533c38 100644 --- a/tests/helpers/css.mjs +++ b/tests/helpers/css.mjs @@ -14,6 +14,7 @@ const allowedThemeSelectors = new Set([ ":where(.markdown-rendered pre:not(.frontmatter))", ":where(.markdown-rendered pre:not(.frontmatter)) code[class*=language-]", ":where(.markdown-source-view.mod-cm6 .HyperMD-codeblock)", + ".markdown-source-view.mod-cm6 :where(.HyperMD-codeblock)", ".markdown-rendered blockquote", ".markdown-rendered blockquote:not(blockquote blockquote)::before", ".markdown-rendered blockquote:not(blockquote blockquote)::after", diff --git a/theme.css b/theme.css index b187a06..cfab98e 100644 --- a/theme.css +++ b/theme.css @@ -27,6 +27,8 @@ --aera-inline-code-background: #d9dee5; --aera-inline-code-color: #566273; --aera-callout-background-opacity: 0.08; + --aera-callout-title-semantic-weight: 52%; + --aera-callout-body-semantic-weight: 50%; --aera-quote-background: #f1f3f6; --aera-quote-fold: #d9dee5; } @@ -59,6 +61,8 @@ --aera-inline-code-background: #2a2f36; --aera-inline-code-color: #b8c0cc; --aera-callout-background-opacity: 0.12; + --aera-callout-title-semantic-weight: 84%; + --aera-callout-body-semantic-weight: 72%; --aera-quote-background: #22262c; --aera-quote-fold: #3a414a; } @@ -289,6 +293,14 @@ body { color: #f8f8f2; } +.markdown-source-view.mod-cm6 :where(.HyperMD-codeblock) { + white-space: pre; + word-break: normal; + overflow-wrap: normal; + width: max-content; + min-width: 100%; +} + body { --callout-border-width: 0px; --callout-border-opacity: 0; @@ -303,13 +315,13 @@ body { position: relative; overflow: hidden; background-color: rgba(var(--callout-color), var(--aera-callout-background-opacity)); - color: color-mix(in srgb, rgb(var(--callout-color)) 72%, var(--text-normal)); + color: color-mix(in srgb, rgb(var(--callout-color)) var(--aera-callout-body-semantic-weight), var(--text-normal)); border: 0; } .callout-title { padding-inline-end: var(--size-4-12); - color: color-mix(in srgb, rgb(var(--callout-color)) 84%, var(--text-normal)); + color: color-mix(in srgb, rgb(var(--callout-color)) var(--aera-callout-title-semantic-weight), var(--text-normal)); } .callout-content {