43414b79ac
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)
108 lines
3.5 KiB
JavaScript
Executable File
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();
|