@@ -9,13 +9,15 @@ export type Props = {
99 itemlist: {
1010 title: string
1111 description: string
12+ icon: string
1213 }[]
1314 }
1415 expertise: {
1516 header: string
1617 itemlist: {
1718 title: string
1819 description: string
20+ icon? : string
1921 }[]
2022 }
2123 proficiencies: {
@@ -36,8 +38,6 @@ export type Props = {
3638 name: string
3739 text: string
3840 icon: string
39- color: string
40- bgColor: string
4141 }[]
4242 }
4343 cta: {
@@ -53,64 +53,111 @@ export type Props = {
5353}
5454
5555const { content } = Astro .props
56+
57+ /** Icons per expertise card, matched by index to content.expertise.itemlist */
58+ const expertiseIcons = [' cloud' , ' document' , ' gear' , ' globe' , ' wrench' , ' chart' ]
5659---
5760
58- <div class =" max-w-6xl mx-auto px-4 sm:px-6 lg:px-8 py-12 space-y-16" >
59- <section class =" space-y-8" aria-labelledby =" about-journey-title" >
60- <h2 class =" text-3xl md:text-4xl font-bold text-center" id =" about-journey-title" >
61- My Journey
61+ <div class =" max-w-6xl mx-auto px-4 sm:px-6 lg:px-8 pb-12 space-y-12 md:space-y-24" >
62+
63+ { /* ── Journey ── */ }
64+ <section class =" space-y-10" aria-labelledby =" about-journey-title" >
65+ <h2 class =" text-page-inverse text-center" id =" about-journey-title" >
66+ { content .journey .header }
6267 </h2 >
63- <div class =" max-w-4xl mx-auto space-y-8" >
64- { content .journey .itemlist .map ((item , index ) => (
65- <div class = " flex flex-col md:flex-row items-start space-y-4 md:space-y-0 md:space-x-6" >
66- <div class = " shrink-0 w-6 h-6 bg-spotlight rounded-full mt-1" ></div >
67- <div class = " flex-1 space-y-2" >
68- <h3 class = " text-xl font-semibold text-primary" >{ item .title } </h3 >
69- <p class = " text-content-active leading-relaxed" >{ item .description } </p >
70- { index === 0 && <a href = " https://webstackdev.github.io/" >Resume</a >}
68+
69+ <div class =" relative max-w-3xl mx-auto" >
70+ { /* Vertical timeline line */ }
71+ <div
72+ class =" absolute left-5 md:left-6 top-4 bottom-0 w-px bg-trim-offset/50"
73+ aria-hidden =" true"
74+ />
75+
76+ <div class =" space-y-10" >
77+ { content .journey .itemlist .map ((item , index ) => (
78+ <div class = " relative flex items-start gap-5 md:gap-6" >
79+ { /* Timeline node */ }
80+ <div class = " relative z-(--z-raised) shrink-0 flex items-center justify-center w-10 h-10 md:w-12 md:h-12 rounded-full bg-page-inverse text-content shadow-md mt-4" >
81+ <Icon icon = { item .icon } color = " content-inverse" size = { 5 } />
82+ </div >
83+
84+ { /* Card */ }
85+ <div class = " flex-1 rounded-lg border border-trim-offset/40 bg-page-offset/40 p-5 md:p-6 shadow-sm" >
86+ <h3 class = " text-page-inverse mb-2" >{ item .title } </h3 >
87+ <p class = " text-content leading-relaxed" >{ item .description } </p >
88+ { index === 0 && (
89+ <a
90+ href = " https://webstackdev.github.io/"
91+ class = " mt-3 inline-flex items-center gap-1 text-sm font-medium text-(--color-secondary) hover:text-(--color-secondary-offset) transition-colors"
92+ >
93+ View Resume
94+ <Icon icon = " exit-right-thin" size = { 4 } color = " inherit" />
95+ </a >
96+ )}
97+ </div >
7198 </div >
72- </ div >
73- )) }
99+ )) }
100+ </ div >
74101 </div >
75102 </section >
76103
77- <section class =" space-y-8" aria-labelledby =" about-expertise-title" >
78- <h2 class =" text-3xl md:text-4xl font-bold text-center" id =" about-expertise-title" >
104+ { /* ── Expertise ── */ }
105+ <section class =" space-y-10" aria-labelledby =" about-expertise-title" >
106+ <h2 class =" text-page-inverse text-center" id =" about-expertise-title" >
79107 { content .expertise .header }
80108 </h2 >
81- <div class =" grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8 " >
82- { content .expertise .itemlist .map ((item ) => (
109+ <div class =" grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 " >
110+ { content .expertise .itemlist .map ((item , index ) => (
83111 <div
84- class = " bg-content-inverse rounded-lg shadow-lg hover:shadow-xl transition-shadow duration-300 p-6 border border-trim "
112+ class = " group relative rounded-lg border border-trim-offset/40 bg-page-offset/30 p-6 transition-all duration-300 hover:border-secondary/40 hover:shadow-lg "
85113 >
86- <h3 class = " text-xl font-semibold text-primary mb-4" >
87- { item .title }
88- </h3 >
89- <p class = " text-content-active leading-relaxed" >
114+ { /* Accent top border on hover */ }
115+ <div
116+ class = " absolute inset-x-0 top-0 h-0.5 rounded-t-lg bg-(--color-secondary) opacity-0 transition-opacity duration-300 group-hover:opacity-100"
117+ aria-hidden = " true"
118+ />
119+ <div class = " flex" >
120+ <div class = " mb-4 flex h-10 w-10 items-center justify-center rounded-lg bg-page-inverse" >
121+ <Icon icon = { expertiseIcons [index ] ?? ' gear' } color = " content-inverse" size = { 5 } />
122+ </div >
123+ <h3 class = " text-lg font-semibold text-page-inverse ml-5 mt-1 mb-3" >
124+ { item .title }
125+ </h3 >
126+ </div >
127+ <p class = " text-content leading-relaxed text-sm" >
90128 { item .description }
91129 </p >
92130 </div >
93131 ))}
94132 </div >
95133 </section >
96134
97- <section class =" space-y-8" aria-labelledby =" about-proficiency-title" >
98- <h2
99- class =" text-3xl md:text-4xl font-bold text-center"
100- id =" about-proficiency-title"
101- >
135+ { /* ── Proficiencies ── */ }
136+ <section class =" space-y-10" aria-labelledby =" about-proficiency-title" >
137+ <h2 class =" text-page-inverse text-center" id =" about-proficiency-title" >
102138 { content .proficiencies .header }
103139 </h2 >
104- <div class =" grid grid-cols-1 md:grid-cols-3 gap-8 max-w-4xl mx-auto" >
140+ <div class =" grid grid-cols-1 md:grid-cols-3 gap-6 max-w-4xl mx-auto" >
105141 { content .proficiencies .cards .map ((card ) => (
106- <div class :list = { [" rounded-lg p-6 border border-trim" , card .backgroundColor ]} >
107- <h3 class :list = { [" text-xl font-semibold mb-4 text-center" , card .headerColor ]} >
142+ <div class :list = { [
143+ " rounded-lg p-6 border border-trim-offset/40" ,
144+ card .backgroundColor || " bg-page-offset/30" ,
145+ ]} >
146+ <h3 class :list = { [
147+ " text-lg font-semibold mb-5 text-center" ,
148+ card .headerColor || " text-page-inverse" ,
149+ ]} >
108150 { card .subheader }
109151 </h3 >
110152 <ul class = " space-y-2" >
111153 { card .itemlist .map ((item ) => (
112- <li class = " flex items-center justify-center py-2 px-4 bg-content-inverse rounded-lg shadow-sm font-medium" >
113- <a href = { item .link } >{ item .title } </a >
154+ <li >
155+ <a
156+ href = { item .link }
157+ class = " relative flex items-center justify-center py-2.5 px-4 rounded-lg font-medium text-content-active no-underline transition-all duration-200 hover:bg-secondary/10 hover:text-(--color-secondary) focus-visible:outline-none after:pointer-events-none after:absolute after:content-[''] after:inset-0 after:rounded-none after:border-2 after:border-transparent after:opacity-0 after:transition-opacity after:duration-150 after:ease-out focus-visible:after:opacity-100 focus-visible:after:-inset-1 focus-visible:after:border-spotlight"
158+ >
159+ { item .title }
160+ </a >
114161 </li >
115162 ))}
116163 </ul >
@@ -119,53 +166,44 @@ const { content } = Astro.props
119166 </div >
120167 </section >
121168
122- <section class =" space-y-8" aria-labelledby =" about-philosophy-title" >
123- <h2
124- class =" text-3xl md:text-4xl font-bold text-gray-900 dark:text-white text-center"
125- id =" about-philosophy-title"
126- >
169+ { /* ── Philosophy ── */ }
170+ <section class =" space-y-10" aria-labelledby =" about-philosophy-title" >
171+ <h2 class =" text-page-inverse text-center" id =" about-philosophy-title" >
127172 { content .proficiencies .philosophy .subheader }
128173 </h2 >
129174 <blockquote
130- class =" text-xl md:text-2xl italic text-center max-w-4xl mx-auto p-8 bg-linear-to-r from-blue-50 to-indigo-50 dark:from-gray-800 dark:to-gray-700 rounded-lg border-l-4 border-blue-500 text-gray-800 dark: text-gray-200 leading-relaxed"
175+ class =" text-md md:text-lg italic text-center max-w-4xl mx-auto p-8 rounded-lg border-l-4 border-(--color-secondary) bg-page-offset/40 text-content leading-relaxed"
131176 >
132177 { content .proficiencies .philosophy .description }
133178 </blockquote >
134- <div class =" grid grid-cols-1 md:grid-cols-3 gap-8 max-w-5xl mx-auto" >
179+ <div class =" grid grid-cols-1 md:grid-cols-3 gap-6 max-w-5xl mx-auto" >
135180 { content .proficiencies .philosophy .itemlist .map ((item ) => (
136- <div class = " text-center space-y-4 p-6" >
137- <div
138- class :list = { [" w-16 h-16 rounded-full flex items-center justify-center mx-auto" , item .bgColor ]}
139- >
181+ <div class = " text-center space-y-4 rounded-lg border border-trim-offset/40 bg-page-offset/30 p-6 transition-all duration-300 hover:shadow-lg" >
182+ <div class = " flex items-center justify-center mx-auto mb-4 h-12 w-12 rounded-full bg-page-inverse" >
140183 <Icon
141184 icon = { item .icon }
142- color = { item .color }
143- inverseColor = { item .bgColor }
144- size = { 8 }
185+ color = " content-inverse"
186+ size = { 6 }
145187 />
146188 </div >
147- <h3 class = " text-xl font-semibold text-blue-600 dark:text-blue-400 " >
189+ <h3 class = " text-lg font-semibold text-page-inverse " >
148190 { item .name }
149191 </h3 >
150- <p class = " text-gray-700 dark: text-gray-300 leading-relaxed" >
192+ <p class = " text-sm text-content leading-relaxed" >
151193 { item .text }
152194 </p >
153195 </div >
154196 ))}
155197 </div >
156198 </section >
157199
158- <section
159- class =" text-center space-y-6 bg-linear-to-r from-blue-600 to-indigo-700 rounded-2xl p-12 text-white"
160- aria-labelledby =" about-cta-title"
161- >
162- <Contact
163- title ={ content .proficiencies .cta .title }
164- description ={ content .proficiencies .cta .description }
165- primaryLink ={ {
166- href: content .proficiencies .cta .primaryLink .href ,
167- text: content .proficiencies .cta .primaryLink .text ,
168- }}
169- />
170- </section >
200+ <Contact
201+ id =" about-cta-title"
202+ title ={ content .proficiencies .cta .title }
203+ description ={ content .proficiencies .cta .description }
204+ primaryLink ={ {
205+ href: content .proficiencies .cta .primaryLink .href ,
206+ text: content .proficiencies .cta .primaryLink .text ,
207+ }}
208+ />
171209</div >
0 commit comments