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)
204 lines
6.4 KiB
JavaScript
Executable File
204 lines
6.4 KiB
JavaScript
Executable File
#!/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();
|