Files
cv-site/tests/mjs/25-inline-icons-comprehensive.test.mjs
T
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

204 lines
6.4 KiB
JavaScript
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bun
/**
* Test: Comprehensive inline icon sizing across all sections
*
* Verifies:
* 1. Inline icons in responsibilities are small (not 60px)
* 2. Inline icons in course descriptions are small
* 3. Inline icons in project descriptions are small
* 4. Main section/company icons remain properly sized (60-80px)
*/
import { chromium } from 'playwright';
const BASE_URL = 'http://localhost:1999';
async function testInlineIcons() {
console.log('\n🔍 Comprehensive Inline Icons 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 });
// Test 1: Check inline icons in responsibilities
console.log('📱 Test 1: Inline icons in responsibilities');
const respIconSizes = await page.evaluate(() => {
const results = [];
// Find all iconify icons within responsibility divs
const icons = document.querySelectorAll('.responsibilities li div iconify-icon');
icons.forEach((icon, index) => {
const styles = window.getComputedStyle(icon);
const width = parseFloat(styles.width);
const height = parseFloat(styles.height);
results.push({
index,
width,
height,
isSmall: width < 30 && height < 30, // Should be ~16-20px
});
});
return results;
});
if (respIconSizes.length === 0) {
console.log(' ⚠️ No inline icons found in responsibilities');
} else {
console.log(` Found ${respIconSizes.length} inline icons in responsibilities`);
const allSmall = respIconSizes.every(icon => icon.isSmall);
respIconSizes.forEach(icon => {
const status = icon.isSmall ? '✅' : '❌';
console.log(` ${status} Icon ${icon.index}: ${icon.width.toFixed(1)}px × ${icon.height.toFixed(1)}px`);
});
if (!allSmall) {
console.log(' ❌ Some inline icons in responsibilities are too large!');
await browser.close();
process.exit(1);
}
}
// Test 2: Check inline icons in course sections
console.log('\n📱 Test 2: Inline icons in courses');
const courseIconSizes = await page.evaluate(() => {
const results = [];
// Find inline icons in course descriptions and responsibilities
const icons = document.querySelectorAll('.course-item .responsibilities li iconify-icon, .course-desc iconify-icon');
icons.forEach((icon, index) => {
const styles = window.getComputedStyle(icon);
const width = parseFloat(styles.width);
const height = parseFloat(styles.height);
results.push({
index,
width,
height,
isSmall: width < 30 && height < 30,
});
});
return results;
});
if (courseIconSizes.length === 0) {
console.log(' ⚠️ No inline icons found in courses');
} else {
console.log(` Found ${courseIconSizes.length} inline icons in courses`);
const allSmall = courseIconSizes.every(icon => icon.isSmall);
courseIconSizes.forEach(icon => {
const status = icon.isSmall ? '✅' : '❌';
console.log(` ${status} Icon ${icon.index}: ${icon.width.toFixed(1)}px × ${icon.height.toFixed(1)}px`);
});
if (!allSmall) {
console.log(' ❌ Some inline icons in courses are too large!');
await browser.close();
process.exit(1);
}
}
// Test 3: Check inline icons in project sections
console.log('\n📱 Test 3: Inline icons in projects');
const projectIconSizes = await page.evaluate(() => {
const results = [];
// Find inline icons in project descriptions
const icons = document.querySelectorAll('.project-desc iconify-icon, .project-technologies iconify-icon');
icons.forEach((icon, index) => {
const styles = window.getComputedStyle(icon);
const width = parseFloat(styles.width);
const height = parseFloat(styles.height);
results.push({
index,
width,
height,
isSmall: width < 30 && height < 30,
});
});
return results;
});
if (projectIconSizes.length === 0) {
console.log(' ⚠️ No inline icons found in projects');
} else {
console.log(` Found ${projectIconSizes.length} inline icons in projects`);
const allSmall = projectIconSizes.every(icon => icon.isSmall);
projectIconSizes.forEach(icon => {
const status = icon.isSmall ? '✅' : '❌';
console.log(` ${status} Icon ${icon.index}: ${icon.width.toFixed(1)}px × ${icon.height.toFixed(1)}px`);
});
if (!allSmall) {
console.log(' ❌ Some inline icons in projects are too large!');
await browser.close();
process.exit(1);
}
}
// Test 4: Verify main icons are still properly sized
console.log('\n📱 Test 4: Main section/company icons (should remain large)');
const mainIconSizes = await page.evaluate(() => {
const results = [];
// Check main company/course/project icons
const companyIcons = document.querySelectorAll('.company-logo img, .course-icon img, .project-icon img');
companyIcons.forEach((icon, index) => {
const styles = window.getComputedStyle(icon);
const width = parseFloat(styles.width);
const height = parseFloat(styles.height);
results.push({
type: icon.closest('.company-logo') ? 'company' :
icon.closest('.course-icon') ? 'course' : 'project',
width,
height,
isProperSize: width >= 40 && height >= 40, // Should be 80px desktop, 40px mobile
});
});
return results.slice(0, 3); // Just check first 3
});
if (mainIconSizes.length > 0) {
console.log(` Found ${mainIconSizes.length} main icons`);
mainIconSizes.forEach((icon, index) => {
const status = icon.isProperSize ? '✅' : '⚠️';
console.log(` ${status} ${icon.type} icon: ${icon.width.toFixed(1)}px × ${icon.height.toFixed(1)}px`);
});
}
console.log('\n✅ All inline icon tests passed!\n');
await browser.close();
} catch (error) {
console.error('\n❌ Test failed:', error.message);
await browser.close();
process.exit(1);
}
}
testInlineIcons();