merge: Gateway 최근 턴 일반 글꼴 복원을 반영

This commit is contained in:
2026-08-24 15:43:22 +00:00
3 changed files with 52 additions and 2 deletions
@@ -115,6 +115,13 @@ for (const viewport of [
await expect(lines.nth(1)).toContainText('<span class="name" onclick=');
expect(await page.evaluate(() => (globalThis as Record<string, unknown>).__legacyLogXss)).toBeUndefined();
const pageFontFamily = await page.locator('body').evaluate((element) => getComputedStyle(element).fontFamily);
const historyFontFamily = await page
.locator('.status-history')
.evaluate((element) => getComputedStyle(element).fontFamily);
expect(historyFontFamily).toBe(pageFontFamily);
expect(historyFontFamily).toContain('Pretendard');
const geometry = await lines.evaluateAll((elements) =>
elements.map((element) => {
const rect = element.getBoundingClientRect();
@@ -144,7 +151,7 @@ for (const viewport of [
const name = `legacy-log-gateway-${viewport.name}`;
await writeFile(
resolve(artifactRoot, `${name}.json`),
`${JSON.stringify({ viewport, geometry }, null, 2)}\n`,
`${JSON.stringify({ viewport, pageFontFamily, historyFontFamily, geometry }, null, 2)}\n`,
'utf8'
);
await page.screenshot({ path: resolve(artifactRoot, `${name}.png`), fullPage: true });
+1 -1
View File
@@ -362,7 +362,7 @@ const handlePasswordReset = async (): Promise<void> => {
border-top: 1px solid #444;
padding: 8px 12px;
color: #ddd;
font-family: 'Times New Roman', serif;
font-family: inherit;
font-size: 14px;
line-height: 1.35;
}
@@ -0,0 +1,43 @@
import assert from 'node:assert/strict';
import { readFile, readdir } from 'node:fs/promises';
import path from 'node:path';
import { describe, it } from 'node:test';
const sourceRoot = path.resolve(import.meta.dirname, '../src');
const fontFamilyDeclaration = /font-family\s*:\s*([^;]+);/g;
const fontShorthandDeclaration = /(?:^|[\s{])font\s*:\s*([^;]+);/gm;
const forcedSerifFamily = /Times New Roman|(?<![\w-])serif(?![\w-])/i;
const listStyleSources = async () => {
const entries = await readdir(sourceRoot, { recursive: true, withFileTypes: true });
return entries
.filter((entry) => entry.isFile() && (entry.name.endsWith('.css') || entry.name.endsWith('.vue')))
.map((entry) => path.join(entry.parentPath, entry.name))
.sort();
};
describe('gateway content font contract', () => {
it('does not force Times New Roman or a generic serif family', async () => {
const violations = [];
for (const file of await listStyleSources()) {
const source = await readFile(file, 'utf8');
for (const match of source.matchAll(fontFamilyDeclaration)) {
const value = match[1]?.trim() ?? '';
if (forcedSerifFamily.test(value)) {
violations.push(`${path.relative(sourceRoot, file)}: font-family: ${value}`);
}
}
for (const match of source.matchAll(fontShorthandDeclaration)) {
const value = match[1]?.trim() ?? '';
if (forcedSerifFamily.test(value)) {
violations.push(`${path.relative(sourceRoot, file)}: font: ${value}`);
}
}
}
assert.deepEqual(violations, []);
});
});