Files
cv-site/tests/mjs/22-theme-consistency.test.mjs
juanatsap 43414b79ac fix: Override inline icon sizes to 1.2em across all sections
Problem: Inline icons embedded in responsibilities, courses, and
projects had explicit width='60' height='60' attributes that made
them too large (60px instead of ~16px).

Solution:
- Added CSS with !important to override inline width/height attributes
- Targeted inline icons in:
  * Course responsibilities and descriptions
  * Project descriptions and technologies
  * Experience responsibilities (within divs)
- Preserved large icons (80px) for main company/course/project logos

Changes:
- static/css/03-components/_courses.css: Override to 1.2em
- static/css/03-components/_projects.css: Override to 1.2em
- static/css/03-components/_cv-section.css: Override to 1.2em

Test Results:
 7 course inline icons: 16px × 16px
 Main company icons: 80px × 80px (preserved)
2025-11-19 16:30:18 +00:00

108 lines
3.5 KiB
JavaScript
Executable File

#!/usr/bin/env bun
/**
* Test: Theme consistency - sidebar should have only 2 colors
*
* Verifies that switching between explicit themes (light/dark) and auto
* produces the same visual result. Auto should mirror the system preference.
*/
import { chromium } from 'playwright';
const BASE_URL = 'http://localhost:1999';
async function testThemeConsistency() {
console.log('\n🎨 Theme Consistency Test\n');
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage();
try {
await page.goto(BASE_URL, { waitUntil: 'networkidle' });
await page.waitForSelector('.cv-container', { timeout: 5000 });
// Helper to get sidebar color
const getSidebarColor = async () => {
return await page.evaluate(() => {
const sidebar = document.querySelector('.cv-sidebar');
if (!sidebar) return null;
return window.getComputedStyle(sidebar).backgroundColor;
});
};
// Helper to click theme switcher
const clickTheme = async () => {
await page.click('.color-theme-switcher');
await page.waitForTimeout(300);
};
// Test 1: System DARK - compare explicit dark vs auto
console.log('📱 Test 1: System preference = DARK');
await page.emulateMedia({ colorScheme: 'dark' });
// Start from light, go to dark
await clickTheme(); // auto -> light
await clickTheme(); // light -> dark
const explicitDarkColor = await getSidebarColor();
console.log(` Explicit dark: ${explicitDarkColor}`);
// Go to auto (should match dark since system is dark)
await clickTheme(); // dark -> auto
const autoDarkColor = await getSidebarColor();
console.log(` Auto (dark): ${autoDarkColor}`);
if (explicitDarkColor === autoDarkColor) {
console.log(' ✅ Colors match in dark mode');
} else {
console.log(' ❌ Colors differ in dark mode!');
await browser.close();
process.exit(1);
}
// Test 2: System LIGHT - compare explicit light vs auto
console.log('\n📱 Test 2: System preference = LIGHT');
await page.emulateMedia({ colorScheme: 'light' });
// Go to explicit light
await clickTheme(); // auto -> light
const explicitLightColor = await getSidebarColor();
console.log(` Explicit light: ${explicitLightColor}`);
// Go back to auto (should match light since system is light)
await clickTheme(); // light -> dark
await clickTheme(); // dark -> auto
const autoLightColor = await getSidebarColor();
console.log(` Auto (light): ${autoLightColor}`);
if (explicitLightColor === autoLightColor) {
console.log(' ✅ Colors match in light mode');
} else {
console.log(' ❌ Colors differ in light mode!');
await browser.close();
process.exit(1);
}
// Test 3: Verify there are only 2 distinct colors
const uniqueColors = new Set([explicitDarkColor, autoDarkColor, explicitLightColor, autoLightColor]);
console.log(`\n🎨 Total unique colors: ${uniqueColors.size}`);
console.log(` Colors: ${Array.from(uniqueColors).join(', ')}`);
if (uniqueColors.size === 2) {
console.log(' ✅ Only 2 visual states (light and dark)');
} else {
console.log(' ❌ More than 2 visual states detected!');
await browser.close();
process.exit(1);
}
console.log('\n✅ All theme consistency tests passed!\n');
await browser.close();
} catch (error) {
console.error('\n❌ Test failed:', error.message);
await browser.close();
process.exit(1);
}
}
testThemeConsistency();