@@ -65,7 +65,7 @@ interface ProfileData {
6565 title: string ;
6666 location: string ;
6767 summary: string ;
68- bio: string ;
68+ bio: string | string [] ;
6969 contact: {
7070 linkedin: string ;
7171 };
@@ -74,6 +74,7 @@ interface ProfileData {
7474 certifications: Certification [];
7575 experience: Experience [];
7676 education: Education [];
77+ interests: string [];
7778 socials: Social [];
7879}
7980
@@ -112,10 +113,9 @@ const experiencesWithMeta = await Promise.all(
112113);
113114
114115const page_info = {
115- title: " About | Rishi Chawda" ,
116- description: " About Rishi Chawda - Senior Software Engineer" ,
117- keywords:
118- " Rishi Chawda, Software Engineer, Developer, About, Experience, Skills" ,
116+ title: ` Career | ${profile .name } ` ,
117+ description: ` Explore ${profile .name }'s professional journey as a ${profile .title }. Learn about work experience, skills, and career achievements. ` ,
118+ keywords: ` ${profile .name }, Career, Software Engineer, Experience, Skills, ${profile .skills .join (' , ' )} ` ,
119119};
120120
121121const siteUrl = new URL (
@@ -159,13 +159,13 @@ const siteUrl = new URL(
159159 >
160160 <div class =" flex flex-row justify-between items-center mb-12 sm:mb-16" >
161161 <h1
162- class =" text-3xl sm:text-4xl lg:text-[2.5rem] font-medium text-gray-900"
162+ class =" text-3xl sm:text-4xl lg:text-[2.5rem] font-medium text-gray-900 font-['Red_Hat_Display_Variable'] "
163163 >
164- About Me
164+ My Career Journey
165165 </h1 >
166166 <a
167167 href =" /"
168- class =" inline-flex items-center text-brand-800/90 hover:text-brand-950 group text-[15px] tracking-[0.2em] uppercase transition-colors duration-300"
168+ class =" inline-flex items-center text-brand-800/90 hover:text-brand-950 group text-[15px] tracking-[0.2em] uppercase transition-colors duration-300 font-['Montserrat_Variable'] "
169169 >
170170 <svg
171171 xmlns =" http://www.w3.org/2000/svg"
@@ -181,9 +181,10 @@ const siteUrl = new URL(
181181 d =" M10 19l-7-7m0 0l7-7m-7 7h18" ></path >
182182 </svg >
183183 Back to Home
184- </a > </div >
185- <div class =" mb-20 md:mb-24" >
186- <div class =" bg-[#F8F9FE] rounded-lg p-8 sm:p-10 lg:p-12" >
184+ </a >
185+ </div >
186+ <div class =" mb-20 md:mb-24 animate-on-scroll fade-in-up" >
187+ <div class =" bg-[#F8F9FE] rounded-lg p-8 sm:p-10 lg:p-12 shadow-sm" >
187188 <div class =" flex flex-col md:flex-row gap-10 md:gap-12" >
188189 <div class =" md:w-2/3" >
189190 <h2
@@ -194,11 +195,22 @@ const siteUrl = new URL(
194195 <p class =" text-gray-600 font-['Montserrat_Variable'] text-lg mb-5" >
195196 { profile .title }
196197 </p >
197- <p
198- class =" text-gray-700 font-['Montserrat_Variable'] mb-8 leading-relaxed"
199- >
200- { profile .bio }
201- </p >
198+
199+ { Array .isArray (profile .bio ) ? (
200+ <div class = " space-y-4 mb-8" >
201+ { profile .bio .map ((paragraph ) => (
202+ <p class = " text-gray-700 font-['Montserrat_Variable'] leading-relaxed" >
203+ { paragraph }
204+ </p >
205+ ))}
206+ </div >
207+ ) : (
208+ <p
209+ class = " text-gray-700 font-['Montserrat_Variable'] mb-8 leading-relaxed"
210+ >
211+ { profile .bio }
212+ </p >
213+ )}
202214
203215 <div class =" flex items-center mb-4 text-gray-600" >
204216 <svg
@@ -318,12 +330,29 @@ const siteUrl = new URL(
318330 </>
319331 )
320332 }
333+
334+ {
335+ profile .interests && profile .interests .length > 0 && (
336+ <>
337+ <h3 class = " text-xl font-['Red_Hat_Display_Variable'] font-semibold text-gray-900 mt-8 mb-5" >
338+ Interests & Hobbies
339+ </h3 >
340+ <div class = " flex flex-wrap gap-2" >
341+ { profile .interests .map ((interest ) => (
342+ <span class = " inline-block px-3 py-1.5 rounded-full bg-[#F0F2FC] text-[#6B7AB0] text-xs font-['Montserrat_Variable'] border border-[#6B7AB0]/20" >
343+ { interest }
344+ </span >
345+ ))}
346+ </div >
347+ </>
348+ )
349+ }
321350 </div >
322351 </div >
323352 </div >
324353 </div >
325354 </div >
326- <div class =" mb-20 md:mb-24" >
355+ <div class =" mb-20 md:mb-24 animate-on-scroll fade-in-up " >
327356 <h2
328357 class =" text-2xl sm:text-3xl font-['Red_Hat_Display_Variable'] font-semibold text-gray-900 mb-12"
329358 >
@@ -447,7 +476,7 @@ const siteUrl = new URL(
447476 </div >
448477 </div >
449478 </div >
450- <div class =" mb-20 md:mb-24" >
479+ <div class =" mb-20 md:mb-24 animate-on-scroll fade-in-up " >
451480 <h2
452481 class =" text-2xl sm:text-3xl font-['Red_Hat_Display_Variable'] font-semibold text-gray-900 mb-10"
453482 >
@@ -542,37 +571,56 @@ const siteUrl = new URL(
542571 }
543572 </div >
544573 </div >
545- <div class =" bg-gray-100 rounded-lg p-10 md:p-12 text-center" >
574+ <div class =" bg-gray-50 rounded-lg p-10 md:p-12 text-center" >
546575 <h2
547576 class =" text-2xl sm:text-3xl font-['Red_Hat_Display_Variable'] font-semibold text-gray-900 mb-5"
548577 >
549578 Let's Connect
550579 </h2 >
551580 <p
552- class =" text-gray-700 font-['Montserrat_Variable'] mb-8 max-w-2xl mx-auto text-lg"
581+ class =" text-gray-700 font-['Montserrat_Variable'] mb-8 max-w-2xl mx-auto text-lg leading-relaxed "
553582 >
554- Whether you're interested in working together or just want to say hello,
555- I'd love to hear from you!
583+ Interested in my work or have a project in mind? I'd love to discuss opportunities to collaborate and create something amazing together.
556584 </p >
557- <div class =" flex flex-wrap justify-center gap-4" >
585+ <div class =" flex flex-col sm:flex-row justify-center items-center gap-4 sm:gap-5 " >
558586 <a
559587 href =" /contact/"
560- class =" inline-flex items-center px-8 py-3 rounded-lg bg-[#6B7AB0 ] text-white hover:bg-[#5A6A9F] transition-colors text-base font-medium "
588+ class =" inline-flex items-center justify-center w-full sm:w-auto bg-brand-700 text-white px-8 py-3 rounded-lg font-semibold font-['Montserrat_Variable' ] text-base hover:bg-brand-800 transition-all duration-300 shadow-md hover:shadow-lg transform hover:-translate-y-0.5 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-brand-500 "
561589 >
562- <span class =" font-['Montserrat_Variable']" >Contact Me</span >
590+ <svg xmlns =" http://www.w3.org/2000/svg" class =" h-5 w-5 mr-2" fill =" none" viewBox =" 0 0 24 24" stroke =" currentColor" stroke-width =" 2" >
591+ <path stroke-linecap =" round" stroke-linejoin =" round" d =" M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
592+ </svg >
593+ Get in Touch
563594 </a >
564595 <a
565- href =" /articles /"
566- class =" inline-flex items-center px-8 py-3 rounded-lg bg-white text-[#6B7AB0] border border-[#6B7AB0] hover:bg-[#F0F2FC] transition-colors text-base font-medium "
596+ href =" /about /"
597+ class =" inline-flex items-center justify-center w-full sm:w-auto bg-white text-brand-700 border border-gray-300 px-8 py-3 rounded-lg font-semibold font-['Montserrat_Variable'] text-base hover:bg-gray-50 transition-colors duration-300 shadow-sm hover:shadow transform hover:-translate-y-0.5 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-brand-500 "
567598 >
568- <span class =" font-['Montserrat_Variable']" >Read My Articles</span >
599+ <svg xmlns =" http://www.w3.org/2000/svg" class =" h-5 w-5 mr-2" fill =" none" viewBox =" 0 0 24 24" stroke =" currentColor" stroke-width =" 2" >
600+ <path stroke-linecap =" round" stroke-linejoin =" round" d =" M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" />
601+ </svg >
602+ Learn More About Me
569603 </a >
570604 </div >
571605 </div >
572606 </main >
573607</BaseLayout >
574608
575609<style >
610+ /* Animation Classes */
611+ .fade-in-up {
612+ opacity: 0;
613+ transform: translateY(20px);
614+ transition: opacity 0.6s ease-out, transform 0.6s ease-out;
615+ will-change: opacity, transform;
616+ }
617+
618+ .visible.fade-in-up {
619+ opacity: 1;
620+ transform: translate(0, 0);
621+ will-change: auto;
622+ }
623+
576624 .timeline-dot {
577625 transition:
578626 transform 0.3s ease,
@@ -675,26 +723,81 @@ const siteUrl = new URL(
675723 overflow: hidden;
676724 text-overflow: ellipsis;
677725 }
726+
727+ /* Staggered animation delays */
728+ .animate-on-scroll:nth-child(odd) { transition-delay: 0.1s; }
729+ .animate-on-scroll:nth-child(even) { transition-delay: 0.2s; }
730+
731+ /* Respect reduced motion preferences */
732+ @media (prefers-reduced-motion: reduce) {
733+ .fade-in-up {
734+ opacity: 1 !important;
735+ transform: none !important;
736+ transition: none !important;
737+ animation: none !important;
738+ }
739+ .social-link,
740+ .timeline-item-container {
741+ transition: none !important;
742+ }
743+ .social-link:hover,
744+ .timeline-item-container:hover * {
745+ transform: none !important;
746+ }
747+ }
678748</style >
679749
680750<script >
681- document.addEventListener("DOMContentLoaded", () => {
682- const observer = new IntersectionObserver(
683- (entries) => {
684- entries.forEach(( entry) => {
751+ function scrollObserver() {
752+ try {
753+ const observer = new IntersectionObserver( (entries) => {
754+ entries.forEach(entry => {
685755 if (entry.isIntersecting) {
686- entry.target.classList.add("visible");
756+ entry.target.classList.add('visible');
757+ // Remove will-change after animation completes
758+ setTimeout(() => {
759+ (entry.target as HTMLElement).style.willChange = 'auto';
760+ }, 400);
687761 }
688762 });
689- },
690- {
691- threshold: 0.1,
692- rootMargin: "0px 0px -50px 0px",
693- },
694- );
763+ }, {
764+ threshold: 0.15,
765+ rootMargin: '0px 0px -30px 0px'
766+ });
767+
768+ // Use requestAnimationFrame to batch DOM operations
769+ requestAnimationFrame(() => {
770+ document.querySelectorAll('.animate-on-scroll').forEach(element => {
771+ element.classList.remove('visible');
772+ observer.observe(element);
773+ });
774+ });
775+ } catch (error) {
776+ console.error('Animation observer error:', error);
777+ // Fallback: show all content immediately
778+ requestAnimationFrame(() => {
779+ document.querySelectorAll('.animate-on-scroll').forEach(element => {
780+ element.classList.add('visible');
781+ (element as HTMLElement).style.willChange = 'auto';
782+ });
783+ });
784+ }
785+ }
786+
787+ function ensureContentVisibility() {
788+ setTimeout(() => {
789+ document.querySelectorAll('.animate-on-scroll').forEach(element => {
790+ if (!element.classList.contains('visible')) {
791+ element.classList.add('visible');
792+ }
793+ });
794+ }, 1500);
795+ }
695796
696- document.querySelectorAll(".animate-on-scroll").forEach((element) => {
697- observer.observe(element);
698- });
699- });
797+ // Use passive event listeners for better performance
798+ document.addEventListener('DOMContentLoaded', scrollObserver, { passive: true });
799+ document.addEventListener('astro:page-load', scrollObserver, { passive: true });
800+
801+ // Delay ensureContentVisibility to reduce initial load impact
802+ setTimeout(ensureContentVisibility, 100);
700803</script >
0 commit comments