Skip to content

Commit 3eb4dd1

Browse files
committed
Update About page content and stylings
1 parent 0e12e30 commit 3eb4dd1

6 files changed

Lines changed: 154 additions & 127 deletions

File tree

‎_TODO.md‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,3 +321,7 @@ We can add a path like `/articles/pdf` or `/articles/deep-dive` for the long-for
321321
- Social shares - module CSS doesn't appear correct with nested button hover classes, not sure how network name is generated or styled but it needs improvement. Should be rendered inside article content column, not across both content and TOC columns.
322322

323323
- Add a Social Share on some compelling text in each article
324+
325+
## Instructions for revamps
326+
327+
All changes should look good on both light and dark theme, use our tailwind theme colors, and look good on mobile.

‎src/components/CallToAction/Contact/index.astro‎

Lines changed: 20 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -37,68 +37,55 @@ export interface Props {
3737
}
3838
3939
const {
40-
id = 'contact-cta',
40+
id,
4141
title = 'Ready to Start Your Project?',
4242
description = "Let's discuss your goals and create something amazing together.",
4343
primaryLink = { href: '/contact', text: 'Get In Touch' },
4444
secondaryLink = { href: '/services', text: 'View Services' },
4545
} = Astro.props
4646
47-
const titleId = `${id}-title`
48-
const descriptionId = `${id}-description`
47+
const descriptionId = id ? `${id}-description` : undefined
4948
---
5049

5150
<section
52-
class="cta py-6 md:py-12 bg-linear-to-br from-(--color-primary) to-(--color-accent) relative overflow-hidden"
53-
aria-labelledby={titleId}
54-
aria-describedby={descriptionId}
51+
class="cta rounded-lg overflow-hidden relative"
52+
{...(id ? { 'aria-labelledby': id } : {})}
53+
{...(id ? { 'aria-describedby': descriptionId } : {})}
5554
>
56-
<!-- Decorative background elements -->
57-
<div class="absolute inset-0 opacity-10">
58-
<div
59-
class="absolute top-0 left-0 w-96 h-96 bg-white rounded-full blur-3xl -translate-x-1/2 -translate-y-1/2"
60-
>
61-
</div>
62-
<div
63-
class="absolute bottom-0 right-0 w-96 h-96 bg-white rounded-full blur-3xl translate-x-1/2 translate-y-1/2"
64-
>
65-
</div>
66-
</div>
67-
68-
<div class="container mx-auto px-4 sm:px-6 lg:px-8 relative z-(--z-raised)">
69-
<div
70-
class="max-w-5xl mx-auto grid gap-10 md:grid-cols-[minmax(0,1fr)_max-content] md:items-center"
71-
>
72-
<div class="min-w-0 text-center md:text-left">
55+
<div class="grid md:grid-cols-[1fr_auto]">
56+
{/* Text panel */}
57+
<div class="bg-linear-to-br from-(--color-primary) to-(--color-primary-offset) py-6 md:py-12 px-4 sm:px-6 lg:px-8">
58+
<div class="max-w-2xl mx-auto md:mx-0 text-center md:text-left">
7359
<h2
74-
id={titleId}
75-
class="text-xl md:text-4xl font-bold text-white mb-6 leading-tight"
60+
id={id}
61+
class="text-xl md:text-4xl font-bold text-primary-inverse mb-6 leading-tight"
7662
>
7763
{title}
7864
</h2>
7965
<p
8066
id={descriptionId}
81-
class="text-lg md:text-xl text-white/90 leading-relaxed"
67+
class="text-lg md:text-xl text-content-inverse/80 leading-relaxed"
8268
>
8369
{description}
8470
</p>
8571
</div>
72+
</div>
8673

87-
<div
88-
class="w-fit flex flex-col sm:flex-row gap-4 justify-center md:justify-start items-center md:items-start"
89-
>
74+
{/* Action panel */}
75+
<div class="bg-(--color-secondary) py-6 md:py-12 px-4 sm:px-8 flex items-center justify-center">
76+
<div class="flex flex-col gap-4 w-full sm:w-auto">
9077
<a
9178
href={primaryLink.href}
92-
class="inline-flex items-center justify-center p-4 bg-white text-primary font-semibold rounded-xl hover:bg-white/90 transition-all duration-200 hover:shadow-xl hover:-translate-y-0.5 text-center no-underline"
79+
class="relative inline-flex items-center justify-center p-4 bg-secondary-inverse text-secondary font-semibold rounded-xl hover:bg-secondary-inverse/90 transition-all duration-200 hover:shadow-xl hover:-translate-y-0.5 text-center no-underline 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"
9380
>
94-
{primaryLink.text}
95-
<Icon icon="exit-right-thin" size={5} color="primary" />
81+
<span class="mr-1">{primaryLink.text}</span>
82+
<Icon icon="exit-right-thin" size={5} color="secondary" />
9683
</a>
9784
{
9885
secondaryLink && (
9986
<a
10087
href={secondaryLink.href}
101-
class="inline-flex items-center justify-center p-4 bg-transparent border-2 border-white text-white text-center font-semibold no-underline rounded-xl duration-200 hover:bg-white hover:text-primary transition-all hover:shadow-xl hover:-translate-y-0.5"
88+
class="relative inline-flex items-center justify-center p-4 bg-transparent border-2 border-secondary-inverse/50 text-secondary-inverse text-center font-semibold no-underline rounded-xl duration-200 hover:border-secondary-inverse hover:bg-secondary-inverse/10 transition-all hover:shadow-xl hover:-translate-y-0.5 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"
10289
>
10390
{secondaryLink.text}
10491
</a>

‎src/components/Layout/SubHeader/index.astro‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const { title, description, icon, subtitle } = Astro.props
1818
size={11}
1919
/>
2020
</div>
21-
<h1 class="text-4xl md:text-5xl font-bold text-page-inverse mb-4">{title}</h1>
21+
<h1 class="text-4xl md:text-5xl font-bold leading-tight text-page-inverse mb-4">{title}</h1>
2222
{description && (
2323
<p class="text-lg text-content-offset leading-relaxed mb-4">
2424
{description}

‎src/components/Pages/About/index.astro‎

Lines changed: 102 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -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
5555
const { 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

Comments
 (0)