Skip to content

Commit 749036e

Browse files
committed
consolidate earlier recommendations
1 parent d1c5b48 commit 749036e

8 files changed

Lines changed: 106 additions & 41 deletions

File tree

app/earlier-work/layout.jsx

Lines changed: 0 additions & 8 deletions
This file was deleted.

app/earlier-work/page.mdx

Lines changed: 0 additions & 29 deletions
This file was deleted.

app/recommendations/page.mdx

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,35 @@ Perspectives from colleagues and engineering leaders I have worked with internat
2525
))}
2626
</div>
2727

28-
For earlier employer letters, freelancer testimonials, and beginner certificates, see the [Earlier Work archive](/earlier-work). It is retained for context and is not intended as a privacy boundary.
28+
<details id="earlier-recommendations" className="earlier-recommendations">
29+
<summary>
30+
<span>View earlier recommendations</span>
31+
<span>Early freelance feedback and an employer reference</span>
32+
</summary>
33+
34+
<div className="earlier-recommendations-content">
35+
<p>
36+
These references are from earlier work and are retained as supporting
37+
context alongside the senior-level recommendations above.
38+
</p>
39+
<div className="recommendation-grid">
40+
{profile.earlierRecommendations.map((item) => (
41+
<article className="recommendation-card" key={item.name}>
42+
<p>“{item.excerpt}”</p>
43+
<footer>
44+
<strong>{item.name}</strong>
45+
<span>{item.role}</span>
46+
</footer>
47+
</article>
48+
))}
49+
</div>
50+
<a
51+
className="text-link earlier-reference-link"
52+
href={profile.earlierRecommendationLetter.href}
53+
>
54+
{profile.earlierRecommendationLetter.label}
55+
</a>
56+
</div>
57+
</details>
2958

3059
</main>

data/profile.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,28 @@ export const profile = {
184184
'Mohsin is a great person, a passionate developer and a hard working team member. He is not afraid of taking responsibility in difficult situations and always tries to raise the bar for himself.'
185185
}
186186
],
187+
earlierRecommendations: [
188+
{
189+
name: 'Georgia Hampton',
190+
role: 'Client feedback · Fiverr',
191+
excerpt: 'I can’t tell you how much I LOVE my new website!'
192+
},
193+
{
194+
name: 'Vibhav Mishra',
195+
role: 'Client feedback · Upwork',
196+
excerpt: 'Mohsin’s biggest strength is his availability and his patience.'
197+
},
198+
{
199+
name: 'Bizsavvy',
200+
role: 'Client feedback · Fiverr',
201+
excerpt:
202+
'Communication was great and he responded in a professional and timely manner.'
203+
}
204+
],
205+
earlierRecommendationLetter: {
206+
label: 'Read the Rocketbots employer recommendation letter (PDF)',
207+
href: '/downloads/Letter%20of%20Recommendation%20-%20Mohsin.pdf'
208+
},
187209
education:
188210
'Bachelor of Science in Computer Science, National University of Computer and Emerging Sciences (FAST-NUCES), Lahore, Pakistan (2016–2020).',
189211
achievements: [

e2e/portfolio.spec.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,15 +67,15 @@ test('navigation, feed discovery, and internal routes work', async ({
6767
test('utility endpoints and redirects have expected search behavior', async ({
6868
request
6969
}) => {
70-
const [robots, sitemap, feed, llms, full, earlier, redirect, missing] =
70+
const [robots, sitemap, feed, llms, full, redirect, earlier, missing] =
7171
await Promise.all([
7272
request.get('/robots.txt'),
7373
request.get('/sitemap.xml'),
7474
request.get('/feed.xml'),
7575
request.get('/llms.txt'),
7676
request.get('/llms-full.txt'),
77-
request.get('/earlier-work'),
7877
request.get('/llm.txt', { maxRedirects: 0 }),
78+
request.get('/earlier-work', { maxRedirects: 0 }),
7979
request.get('/not-a-public-page')
8080
])
8181
await expect(robots).toBeOK()
@@ -90,8 +90,11 @@ test('utility endpoints and redirects have expected search behavior', async ({
9090
expect(await feed.text()).toContain('xmlns:atom')
9191
expect(await llms.text()).toContain('# Mohsin Hayat')
9292
expect(await full.text()).toContain('Last updated:')
93-
expect(await earlier.text()).toContain('Earlier Work')
9493
expect(redirect.status()).toBe(308)
9594
expect(redirect.headers().location).toBe('/llms.txt')
95+
expect(earlier.status()).toBe(308)
96+
expect(earlier.headers().location).toBe(
97+
'/recommendations#earlier-recommendations'
98+
)
9699
expect(missing.status()).toBe(404)
97100
})

next.config.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ export default withNextra({
3737
async redirects() {
3838
return [
3939
{ source: '/more', destination: '/recommendations', permanent: true },
40+
{
41+
source: '/earlier-work',
42+
destination: '/recommendations#earlier-recommendations',
43+
permanent: true
44+
},
4045
{ source: '/llm.txt', destination: '/llms.txt', permanent: true },
4146
{
4247
source: '/www/:path*',

styles/main.css

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,40 @@ li {
262262
margin-top: 0.55rem;
263263
font-size: 0.9rem;
264264
}
265+
.earlier-recommendations {
266+
margin-top: 2.5rem;
267+
border-top: 1px solid var(--border);
268+
border-bottom: 1px solid var(--border);
269+
}
270+
.earlier-recommendations summary {
271+
display: flex;
272+
align-items: baseline;
273+
justify-content: space-between;
274+
gap: 1rem;
275+
padding: 1.15rem 0;
276+
color: var(--link);
277+
cursor: pointer;
278+
font-weight: 700;
279+
}
280+
.earlier-recommendations summary:hover {
281+
color: #c7e3ff;
282+
}
283+
.earlier-recommendations summary span:last-child {
284+
color: var(--muted);
285+
font-size: 0.85rem;
286+
font-weight: 500;
287+
}
288+
.earlier-recommendations-content {
289+
padding: 0 0 1.5rem;
290+
}
291+
.earlier-recommendations-content > p {
292+
max-width: 44rem;
293+
margin-top: 0;
294+
color: var(--muted);
295+
}
296+
.earlier-reference-link {
297+
margin-top: 1.5rem;
298+
}
265299
.featured-work {
266300
grid-template-columns: repeat(2, minmax(0, 1fr));
267301
}
@@ -416,6 +450,10 @@ li {
416450
align-items: flex-start;
417451
flex-direction: column;
418452
}
453+
.earlier-recommendations summary {
454+
align-items: flex-start;
455+
flex-direction: column;
456+
}
419457
}
420458
@media (max-width: 560px) {
421459
.portfolio-home,

tests/next-config.test.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,10 @@ describe('production configuration', () => {
4040
destination: '/recommendations',
4141
permanent: true
4242
})
43+
expect(redirects).toContainEqual({
44+
source: '/earlier-work',
45+
destination: '/recommendations#earlier-recommendations',
46+
permanent: true
47+
})
4348
})
4449
})

0 commit comments

Comments
 (0)