diff --git a/src/components/NavigationBar.tsx b/src/components/NavigationBar.tsx index eabf9fe..a72cbcb 100644 --- a/src/components/NavigationBar.tsx +++ b/src/components/NavigationBar.tsx @@ -101,9 +101,14 @@ export default function NavigationBar({ currentPath }: NavigationBarProps) { return (
  • - -
    + +
    + {item.name}
  • diff --git a/src/components/PostCard.astro b/src/components/PostCard.astro index 6a04fec..9be3872 100644 --- a/src/components/PostCard.astro +++ b/src/components/PostCard.astro @@ -11,7 +11,7 @@ const { slug } = post; ---
    -
    +

    {title}

    diff --git a/src/components/ProjectCard.astro b/src/components/ProjectCard.astro index 2c1d688..174777e 100644 --- a/src/components/ProjectCard.astro +++ b/src/components/ProjectCard.astro @@ -10,7 +10,7 @@ const { project } = Astro.props; ---
    -
    +

    {project.name}

    diff --git a/src/components/ResumeSkills.tsx b/src/components/ResumeSkills.tsx index aceff33..fd5ca09 100644 --- a/src/components/ResumeSkills.tsx +++ b/src/components/ResumeSkills.tsx @@ -21,7 +21,6 @@ export default function ResumeSkills({ skills }: ResumeSkillsProps) { entries.forEach((entry) => { if (entry.isIntersecting && !hasAnimated.value) { hasAnimated.value = true; - // Start animation for all skills skills.forEach((skill) => { animateSkill(skill.id, skill.level); }); @@ -67,19 +66,23 @@ export default function ResumeSkills({ skills }: ResumeSkillsProps) {
    {skills.map((skill) => { const currentLevel = animatedLevels.value[skill.id] || 0; - const progressValue = currentLevel * 20; // Convert 1-5 scale to 0-100 + const progressValue = currentLevel * 20; return (
    -
    ); diff --git a/src/components/ScrollUpButton.tsx b/src/components/ScrollUpButton.tsx index 2e2dc2c..0c11b39 100644 --- a/src/components/ScrollUpButton.tsx +++ b/src/components/ScrollUpButton.tsx @@ -31,7 +31,7 @@ export default function ScrollUpButton() { type="button" onClick={scrollToTop} class={`fixed bottom-20 right-4 z-20 bg-secondary hover:bg-primary - p-3 rounded-full shadow-lg transition-all duration-300 + p-3 rounded-full shadow-lg transition-all duration-300 min-h-[44px] min-w-[44px] inline-flex items-center justify-center ${ isVisible.value ? "opacity-70 translate-y-0" diff --git a/src/components/TalkCard.astro b/src/components/TalkCard.astro index 7abe4c0..0a2a648 100644 --- a/src/components/TalkCard.astro +++ b/src/components/TalkCard.astro @@ -12,7 +12,7 @@ const { talk } = Astro.props;
    -
    +

    diff --git a/src/components/Terminal.tsx b/src/components/Terminal.tsx index 25d7f63..7c11c0d 100644 --- a/src/components/Terminal.tsx +++ b/src/components/Terminal.tsx @@ -36,12 +36,6 @@ const Terminal = () => { } }, [commandHistory]); - useEffect(() => { - if (inputRef.current) { - inputRef.current.focus(); - } - }, []); - // Load command history from localStorage useEffect(() => { const history = loadCommandHistory(); @@ -219,7 +213,6 @@ __/ =| o |=-O=====O=====O=====O \\ ____Y___________|__|_________________________ } onKeyDown={handleKeyDown} className="flex-1 bg-transparent border-none outline-none text-accent ml-1" - autoFocus spellcheck={false} /> diff --git a/src/config/data.ts b/src/config/data.ts index a8dbfd0..4bf4b08 100644 --- a/src/config/data.ts +++ b/src/config/data.ts @@ -289,7 +289,7 @@ export const navigationItems: NavigationItem[] = [ path: "/resume", tooltip: "Resume", icon: BriefcaseBusiness, - enabled: true + enabled: !!(resumeConfig.jsonFile && resumeConfig.jsonFile.trim()) }, { id: "projects", diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro index 669473f..fff2517 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/Layout.astro @@ -29,7 +29,7 @@ const pageDescription = description || siteConfig.meta.description; {pageTitle} - +
    diff --git a/src/pages/index.astro b/src/pages/index.astro index 64d743d..f9e8ce9 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -12,6 +12,7 @@ import { personalInfo, homepageSections } from "../config/data"; alt={personalInfo.profileImage.alt} height={personalInfo.profileImage.height} width={personalInfo.profileImage.width} + loading="eager" />

    -
    -

    - Error loading resume data. -

    -

    {fetchError || "Please try refreshing the page."}

    + +
    +

    + {data.basics.name} +

    + + + + {resumeConfig.pdfFile?.path && ( + - - ) -} + )} -{ - data && !fetchError && ( - -
    -

    - {data.basics.name} -

    - -
    - {data.basics.email && ( - - {data.basics.email} - - )} - {data.sections.profiles.items.find( - (p) => p.network === "GitHub", - ) && ( - p.network === "GitHub", - )!.url.href - } - target="_blank" - rel="noopener noreferrer" - class="link link-hover inline-flex items-center gap-1 text-sm sm:text-base" - > - GitHub - - )} - {data.sections.profiles.items.find( - (p) => p.network === "linkedin", - ) && ( - p.network === "linkedin", - )!.url.href - } - target="_blank" - rel="noopener noreferrer" - class="link link-hover inline-flex items-center gap-1 text-sm sm:text-base" - > - LinkedIn - - )} + {data.sections.summary && resumeConfig.sections.summary?.enabled && ( +
    +
    +

    + {resumeConfig.sections.summary.title || data.sections.summary.name || "Summary"} +

    +
    +
    + )} - + {data.sections.profiles && + data.sections.profiles.items && + data.sections.profiles.items.length > 0 && + resumeConfig.sections.profiles?.enabled && ( +
    +
    +

    + {resumeConfig.sections.profiles.title || data.sections.profiles.name || "Profiles"} +

    +
    + {data.sections.profiles.items.map( + (profile) => { + let iconName = "mdi:web"; + const networkLower = + profile.network.toLowerCase(); + if (networkLower === "github") { + iconName = "simple-icons:github"; + } else if ( + networkLower === "linkedin" + ) { + iconName = + "simple-icons:linkedin"; + } else if ( + networkLower === "twitter" + ) { + iconName = "simple-icons:x"; + } else if ( + networkLower === "youtube" + ) { + iconName = + "simple-icons:youtube"; + } - {data.sections.summary && resumeConfig.sections.summary?.enabled && ( -
    -
    -

    - {resumeConfig.sections.summary.title || data.sections.summary.name || "Summary"} -

    -
    + return ( + + + {profile.network} + + ); + }, + )}
    - )} +
    + )} - {data.sections.profiles && - data.sections.profiles.items && - data.sections.profiles.items.length > 0 && - resumeConfig.sections.profiles?.enabled && ( -
    -
    -

    - {resumeConfig.sections.profiles.title || data.sections.profiles.name || "Profiles"} -

    -
    - {data.sections.profiles.items.map( - (profile) => { - let iconName = "mdi:web"; - const networkLower = - profile.network.toLowerCase(); - if (networkLower === "github") { - iconName = "simple-icons:github"; - } else if ( - networkLower === "linkedin" - ) { - iconName = - "simple-icons:linkedin"; - } else if ( - networkLower === "twitter" - ) { - iconName = "simple-icons:x"; - } else if ( - networkLower === "youtube" - ) { - iconName = - "simple-icons:youtube"; - } + {data.sections.skills && + data.sections.skills.items && + data.sections.skills.items.length > 0 && + resumeConfig.sections.skills?.enabled && ( +
    +
    +

    + {resumeConfig.sections.skills.title || data.sections.skills.name || "Skills"} +

    + +
    +
    + )} - return ( - - - {profile.network} - - ); - }, - )} -
    -
    + {data.sections.experience && + data.sections.experience.items && + data.sections.experience.items.length > 0 && + resumeConfig.sections.experience?.enabled && ( +
    +
    +

    + {resumeConfig.sections.experience.title || data.sections.experience.name || "Experience"} +

    +
    + {data.sections.experience.items.map( + (experience) => ( +
    +

    + {experience.position} +

    +
    + + {experience.company} + + {experience.date} + + {experience.location} + +
    +
    + {experience.url && experience.url.href && ( + + + Company Website + + )} +
    + ), + )}
    - )} +
    +
    + )} - {data.sections.skills && - data.sections.skills.items && - data.sections.skills.items.length > 0 && - resumeConfig.sections.skills?.enabled && ( -
    -
    -

    - {resumeConfig.sections.skills.title || data.sections.skills.name || "Skills"} -

    - -
    + {data.sections.education && + data.sections.education.items && + data.sections.education.items.length > 0 && + resumeConfig.sections.education?.enabled && ( +
    +
    +

    + {resumeConfig.sections.education.title || data.sections.education.name || "Education"} +

    +
    + {data.sections.education.items.map( + (education) => ( +
    +

    + {education.institution} +

    +
    + + {education.studyType} in{" "} + {education.area} + + + {education.date} + +
    + {education.summary && ( +
    + )} +
    + ), + )}
    - )} +
    +
    + )} - {data.sections.experience && - data.sections.experience.items && - data.sections.experience.items.length > 0 && - resumeConfig.sections.experience?.enabled && ( -
    -
    -

    - {resumeConfig.sections.experience.title || data.sections.experience.name || "Experience"} -

    -
    - {data.sections.experience.items.map( - (experience) => ( -
    -

    - {experience.position} -

    -
    - - {experience.company} - - {experience.date} - - {experience.location} - -
    -
    - {experience.url && experience.url.href && ( - - - Company Website - - )} -
    - ), - )} -
    -
    + {data.sections.volunteer && + data.sections.volunteer.items && + data.sections.volunteer.items.length > 0 && + resumeConfig.sections.volunteer?.enabled && ( +
    +
    +

    + {resumeConfig.sections.volunteer.title || data.sections.volunteer.name || "Volunteer Work"} +

    +
    + {data.sections.volunteer.items.map( + (volunteer) => ( +
    +

    + {volunteer.organization} +

    +
    + + {volunteer.position} + + + {volunteer.date} + +
    +
    + ), + )}
    - )} - - {data.sections.education && - data.sections.education.items && - data.sections.education.items.length > 0 && - resumeConfig.sections.education?.enabled && ( -
    -
    -

    - {resumeConfig.sections.education.title || data.sections.education.name || "Education"} -

    -
    - {data.sections.education.items.map( - (education) => ( -
    -

    - {education.institution} -

    -
    - - {education.studyType} in{" "} - {education.area} - - - {education.date} - -
    - {education.summary && ( -
    - )} -
    - ), - )} -
    -
    -
    - )} - - {data.sections.volunteer && - data.sections.volunteer.items && - data.sections.volunteer.items.length > 0 && - resumeConfig.sections.volunteer?.enabled && ( -
    -
    -

    - {resumeConfig.sections.volunteer.title || data.sections.volunteer.name || "Volunteer Work"} -

    -
    - {data.sections.volunteer.items.map( - (volunteer) => ( -
    -

    - {volunteer.organization} -

    -
    - - {volunteer.position} - - - {volunteer.date} - -
    -
    - ), - )} -
    -
    -
    - )} -
    - - ) -} +
    +
    + )} +
    + diff --git a/src/styles/global.css b/src/styles/global.css index ba3a12c..b58fbef 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -34,52 +34,4 @@ --border: 1px; --depth: 1; --noise: 1; -} - -/* Ensure better text scaling and overflow handling */ -* { - /* Allow text to scale with user preferences */ - text-size-adjust: 100%; -} - -/* Prevent horizontal overflow on smaller screens or when zoomed */ -body { - overflow-x: hidden; -} - -/* Ensure links and buttons remain accessible at all zoom levels */ -a, button { - min-height: 44px; - min-width: 44px; - display: inline-flex; - align-items: center; - justify-content: center; -} - -/* Make sure card content doesn't overflow */ -.card-body { - overflow-wrap: break-word; - word-break: break-word; -} - -/* Ensure progress bars scale properly */ -.progress { - min-height: 0.5rem; -} - -/* Responsive navigation improvements */ -@media (max-width: 640px) { - .menu-horizontal .menu li { - margin: 0 0.125rem; - } -} - -/* Better tooltip positioning for mobile */ -@media (max-width: 768px) { - .tooltip:before, - .tooltip:after { - transform: translateX(-50%) translateY(-100%); - top: auto; - bottom: 100%; - } -} \ No newline at end of file +} \ No newline at end of file