Overview
The About component displays professional certifications, education timeline, and work experience timeline. It features vertical timeline visualizations with animated positioning and interactive certification cards.
Source Location
/src/components/About.astro
Features
Azure certification cards with verification links
Dual timeline layout (Education & Experience)
Dynamic timeline line positioning with JavaScript
Reveal animations with staggered delays
Hover effects on cards
Fully internationalized
Props
No props required. The component is self-contained and uses:
Internal certifications array with Azure certification data
Translation keys for education and experience content
Auto-detected language from URL
Data Structures
Certifications Array
const certifications = [
{
name: 'AZ-104' ,
title: 'Azure Administrator' ,
color: 'from-blue-500 to-blue-700' ,
url: 'https://learn.microsoft.com/...'
},
{ name: 'AZ-700' , title: 'Azure Network Engineer' , ... },
{ name: 'AZ-900' , title: 'Azure Fundamentals' , ... },
{ name: 'DP-900' , title: 'Azure Data Fundamentals' , ... },
];
Certification code (e.g., “AZ-104”)
Tailwind gradient classes for the badge
Microsoft Learn verification URL
Code Example
import About from '../components/About.astro';
< About />
Translation Keys
General
about.title - Section title
about.description - Section description
about.certifications - Certifications heading
about.education - Education heading
about.experience - Experience heading
Education Entries
UADE (Current)
IFTS (Completed)
edu . uade . title // Degree title
edu . uade . institution // University name
edu . uade . period // Date range
edu . uade . status // "In Progress"
edu . uade . description // Program description
Experience Entries
Azure Cloud Engineer
Cloud Engineer
exp . azure . title
exp . azure . company
exp . azure . period
exp . azure . location
exp . azure . type // "Full-time"
exp . azure . description // Paragraphs (newline-separated)
Component Structure
1. Certifications Grid
4-column responsive grid (2 columns on mobile):
< div class = "grid grid-cols-2 md:grid-cols-4 gap-4" >
{ certifications . map (( cert ) => (
< a href = { cert . url } target = "_blank" rel = "noopener noreferrer" >
<!-- Certification card -->
</ a >
)) }
</ div >
2. Timeline Layout
Two-column grid on desktop, stacked on mobile:
< div class = "grid md:grid-cols-2 gap-8" >
<!-- Education Timeline -->
< div class = "edu-timeline relative pl-10" >
< div class = "edu-timeline-line absolute" ></ div >
<!-- Timeline items -->
</ div >
<!-- Experience Timeline -->
< div class = "exp-timeline relative pl-10" >
< div class = "exp-timeline-line absolute" ></ div >
<!-- Timeline items -->
</ div >
</ div >
Timeline Positioning Script
The component includes JavaScript to dynamically position timeline lines:
function positionTimelineLines () {
const timelines = [
{ container: '.edu-timeline' , line: '.edu-timeline-line' , dots: '.edu-dot' },
{ container: '.exp-timeline' , line: '.exp-timeline-line' , dots: '.exp-dot' },
];
// Phase 1: Batch ALL reads (prevent layout thrashing)
const measurements = [];
// ... measure positions
// Phase 2: Batch ALL writes
for ( const { lineEl , top , height } of measurements ) {
lineEl . style . top = ` ${ top } px` ;
lineEl . style . height = ` ${ height } px` ;
}
}
The timeline positioning uses a read-then-write batching pattern to prevent layout thrashing and ensure smooth performance.
Styling Patterns
Certification Cards
< div class = "group relative p-[1px] rounded-2xl bg-gradient-to-br from-primary-400/50 to-accent-400/50 hover:from-primary-400 hover:to-accent-400" >
< div class = "bg-white/90 dark:bg-slate-800/90 backdrop-blur-sm rounded-2xl p-5" >
< div class = { `bg-gradient-to-br ${ cert . color } text-white` } >
<!-- Badge icon -->
</ div >
< p class = "font-bold text-primary-600" > { cert . name } </ p >
</ div >
</ div >
Timeline Dots
< div class = "edu-dot absolute -left-10 w-6 h-6 rounded-full bg-primary-500 border-[3px] border-white dark:border-slate-900 shadow-[0_0_0_3px_rgba(59,130,246,0.15)]" style = "top: 1.15rem;" ></ div >
Timeline Cards
Gradient border on hover
Glass morphism background
Lift effect: hover:-translate-y-2
Status badges with color coding (blue for in-progress, green for completed)
The About section uses content-visibility: auto with contain-intrinsic-size: auto 800px for better scroll performance.
Debounced resize handler (150ms)
requestAnimationFrame for timeline positioning
Font loading detection with document.fonts.ready
Passive event listeners on resize
Accessibility
External certification links have rel="noopener noreferrer"
Semantic HTML structure with proper headings
Color contrast meets WCAG standards
Keyboard-accessible certification links
Customization
Adding Certifications
Add new entries to the certifications array:
const certifications = [
// existing...
{
name : 'AZ-305' ,
title : 'Azure Solutions Architect' ,
color : 'from-indigo-500 to-purple-700' ,
url : 'https://...'
} ,
];
Timeline Colors
Education uses primary colors, experience uses accent:
<!-- Education -->
< div class = "bg-gradient-to-b from-primary-400 to-primary-300" ></ div >
< div class = "bg-primary-500" ></ div >
<!-- Experience -->
< div class = "bg-gradient-to-b from-accent-500 to-primary-400" ></ div >
< div class = "bg-accent-500" ></ div >
Skills - Complements education with skill showcase
Projects - Shows practical application of education