Overview
The skills section displays the developer’s technical skills in an organized grid layout. Each skill is represented by a card with an icon and label, featuring hover effects for interactivity.
Key Features
Responsive grid using CSS Grid with auto-fit
Interactive hover effects (background color inversion)
Adaptive display (shows different numbers of cards based on screen size)
Square aspect ratio cards
Icon and label for each skill
HTML Structure
The skills section uses a grid container with individual skill cards:
< section class = "skills" id = "skills" >
< div class = "section-container" >
< h2 class = "skills__title section-title" >
My < strong > Skills </ strong >
</ h2 >
< div class = "skills__grid" >
< div class = "skill-card" >
< div class = "skill-card__icon" >
< img src = "assets/ts.svg" alt = "TypeScript" />
</ div >
< p class = "skill-card__label" > TypeScript </ p >
</ div >
< div class = "skill-card" >
< div class = "skill-card__icon" >
< img src = "assets/next.svg" alt = "Next" />
</ div >
< p class = "skill-card__label" > Next </ p >
</ div >
< div class = "skill-card" >
< div class = "skill-card__icon" >
< img src = "assets/js.svg" alt = "JavaScript" />
</ div >
< p class = "skill-card__label" > JavaScript </ p >
</ div >
< div class = "skill-card" >
< div class = "skill-card__icon" >
< img src = "assets/react.svg" alt = "React" />
</ div >
< p class = "skill-card__label" > React </ p >
</ div >
< div class = "skill-card" >
< div class = "skill-card__icon" >
< img src = "assets/git.svg" alt = "Git" />
</ div >
< p class = "skill-card__label" > Git </ p >
</ div >
< div class = "skill-card" >
< div class = "skill-card__icon" >
< img src = "assets/node.svg" alt = "Node.js" />
</ div >
< p class = "skill-card__label" > Node.js </ p >
</ div >
<!-- More skill cards... -->
</ div >
</ div >
</ section >
CSS Classes
Grid Container
Uses CSS Grid with auto-fit for responsive layout: .skills__grid {
display : grid ;
grid-template-columns : repeat ( auto-fit , minmax ( 160 px , 1 fr ));
gap : var ( --spacing-20 );
}
@media ( min-width : 768 px ) {
.skills__grid {
gap : var ( --spacing-32 );
}
}
@media ( min-width : 1024 px ) {
.skills__grid {
grid-template-columns : repeat ( 5 , 1 fr );
}
}
Skill Card
Individual skill card with square aspect ratio: .skill-card {
display : flex ;
flex-direction : column ;
align-items : center ;
justify-content : space-evenly ;
aspect-ratio : 1 / 1 ;
padding : var ( --spacing-24 );
border-radius : 4 px ;
background : var ( --primary-white );
border : 2 px solid var ( --primary-black );
transition : transform 0.15 s ease ;
}
.skill-card:hover {
background : var ( --primary-black );
color : var ( --primary-white );
transform : translateY ( -2 px );
}
.skill-card:hover .skill-card__icon img {
filter : invert ( 1 );
}
.skill-card:hover .skill-card__label {
color : var ( --primary-white );
}
Icon Styling
Responsive icon sizing: .skill-card__icon img {
width : clamp ( 3 rem , 4 vw , 5 rem );
height : auto ;
margin-bottom : var ( --spacing-16 );
}
Label
Skill name typography: .skill-card__label {
font-size : clamp ( 1 rem , 2 vw , 1.25 rem );
font-weight : 700 ;
color : var ( --primary-black );
}
Responsive Behavior
Mobile (< 768px)
Tablet (768px - 1023px)
Desktop (>= 1024px)
Shows 6 skill cards
2-column grid (auto-fit with 160px minimum)
Smaller gap between cards
.skill-card:nth-child ( n + 7 ) {
display : none ;
}
Shows 8 skill cards
Flexible grid (auto-fit)
Larger gap between cards
@media ( min-width : 768 px ) {
.skills__grid {
gap : var ( --spacing-32 );
}
.skill-card:nth-child ( n + 7 ) {
display : flex ;
}
.skill-card:nth-child ( n + 9 ) {
display : none ;
}
}
Shows all 10 skill cards
Fixed 5-column grid
Maximum spacing
@media ( min-width : 1024 px ) {
.skills__grid {
grid-template-columns : repeat ( 5 , 1 fr );
}
.skill-card:nth-child ( n + 9 ) {
display : flex ;
}
}
Hover Effects
The skill cards feature a complete color inversion on hover:
Background changes from white to black
Text color inverts to white
Icon inverts colors using CSS filter
Card lifts slightly with transform
.skill-card:hover {
background : var ( --primary-black );
color : var ( --primary-white );
transform : translateY ( -2 px );
}
Grid Layout Strategy
The component uses a progressive enhancement approach:
Base Grid
Uses repeat(auto-fit, minmax(160px, 1fr)) to create a flexible grid that automatically determines columns based on available space.
Tablet Enhancement
Increases gap spacing and reveals more skill cards.
Desktop Enhancement
Switches to a fixed 5-column layout for consistent appearance on large screens.
Implementation Notes
The skills section is located at lines 91-167 in index.html, with styles at lines 206-307 in global.css.
The aspect-ratio property ensures all skill cards maintain perfect squares regardless of content, creating a clean, uniform grid.