Skip to content

Commit b260635

Browse files
Redesign work page: combine skills/services into toolkit, bordered project cards
- Merge skills and services into single "my toolkit" section with flex-wrap tags - Redesign projects as bordered card boxes (flex-wrap, not full-width) - Whole project card is clickable via stretched link pattern - Fix nested <a> issue (Hamsa link inside project card) - Standardise font sizes: offering tags at --text-body, project role at --text-small - Update type scale comment to reflect current usage Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent ce895a0 commit b260635

6 files changed

Lines changed: 213 additions & 237 deletions

File tree

build.py

Lines changed: 15 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -307,8 +307,8 @@ def render_projects(md):
307307
for p in projects:
308308
desc = parse_inline(p['desc'])
309309
proj_parts.append(
310-
' <div class="project">\n'
311-
f' <a class="project-header" href="{p["url"]}" target="_blank" rel="noopener">\n'
310+
f' <div class="project">\n'
311+
f' <a class="project-top" href="{p["url"]}" target="_blank" rel="noopener">\n'
312312
f' <span class="project-name">{p["name"]}</span>\n'
313313
' <span class="project-arrow"><span class="material-symbols-sharp">arrow_outward</span></span>\n'
314314
' </a>\n'
@@ -321,7 +321,7 @@ def render_projects(md):
321321

322322
return (
323323
' <!-- PROJECTS -->\n'
324-
' <section class="projects-section">\n'
324+
' <section>\n'
325325
' <h2 class="section-title">\n'
326326
f' {title}\n'
327327
' </h2>\n'
@@ -411,46 +411,26 @@ def render_footer(footer_md):
411411

412412

413413
def render_work_section(md):
414-
"""Parse work.md into skills grid + services grid HTML."""
414+
"""Parse work.md into a single toolkit section."""
415415
lines = md.strip().split('\n')
416-
current_section = None
417-
skills = []
418-
services = []
416+
items = []
419417

420418
for line in lines:
421419
stripped = line.strip()
422-
if stripped.startswith('# '):
423-
current_section = stripped[2:].strip().lower()
424-
elif stripped.startswith('- ') and current_section:
425-
value = stripped[2:].strip()
426-
if current_section == 'skills':
427-
skills.append(value)
428-
elif current_section == 'services':
429-
services.append(value)
430-
431-
skill_boxes = '\n'.join(
432-
f' <div class="skill-box">{s}</div>'
433-
for s in skills
434-
)
435-
service_boxes = '\n'.join(
436-
f' <div class="service-box">{s}</div>'
437-
for s in services
420+
if stripped.startswith('- '):
421+
items.append(stripped[2:].strip())
422+
423+
boxes = '\n'.join(
424+
f' <span class="offering-tag">{s}</span>'
425+
for s in items
438426
)
439427

440428
return (
441-
' <!-- SKILLS -->\n'
442-
' <section>\n'
443-
' <h2 class="section-title"><span class="highlight">skills</span></h2>\n'
444-
' <div class="skills-grid">\n'
445-
f'{skill_boxes}\n'
446-
' </div>\n'
447-
' </section>\n'
448-
'\n'
449-
' <!-- SERVICES -->\n'
429+
' <!-- OFFERINGS -->\n'
450430
' <section>\n'
451-
' <h2 class="section-title"><span class="highlight">services</span></h2>\n'
452-
' <div class="services-grid">\n'
453-
f'{service_boxes}\n'
431+
' <h2 class="section-title">my <span class="highlight">toolkit</span></h2>\n'
432+
' <div class="offerings">\n'
433+
f'{boxes}\n'
454434
' </div>\n'
455435
' </section>'
456436
)

content/work.md

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
1-
# skills
2-
- data visualisation
3-
- statistical analysis
4-
- product strategy
1+
#offerings
2+
- data visualisations
53
- data storytelling
6-
- audience research
7-
- workshop facilitation
8-
9-
# services
10-
- data communication strategy
11-
- dashboard & report design
12-
- data storytelling workshops
13-
- product analytics consulting
4+
- product strategy
5+
- data systems strategy
6+
- user research
7+
- data viz workshops
8+
- data capacity trainings
9+
- statistical analysis

dist/index.html

Lines changed: 42 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -330,74 +330,77 @@
330330
.about-text p + p {
331331
margin-top: var(--space-md);
332332
}
333+
.offerings {
334+
display: flex;
335+
flex-wrap: wrap;
336+
gap: var(--box-gap);
337+
}
338+
.offering-tag {
339+
border: 1px solid var(--black);
340+
padding: var(--box-pad);
341+
font-size: var(--text-body);
342+
}
333343
.projects {
334344
display: flex;
335-
flex-direction: column;
336-
gap: var(--space-md);
345+
flex-wrap: wrap;
346+
gap: var(--box-gap);
337347
}
338348
.project {
349+
border: 1px solid var(--black);
350+
padding: var(--box-pad);
339351
display: flex;
340352
flex-direction: column;
341-
padding: var(--space-md) 0;
353+
gap: 8px;
354+
color: inherit;
355+
min-width: 0;
356+
flex: 1 1 280px;
357+
max-width: 100%;
358+
overflow: hidden;
359+
position: relative;
342360
}
343-
.project-header {
361+
@media (hover: hover) {
362+
.project:hover {
363+
color: var(--accent);
364+
}
365+
}
366+
.project-top {
344367
display: flex;
345368
align-items: center;
346369
justify-content: space-between;
347-
margin-bottom: 8px;
348370
text-decoration: none;
349371
color: inherit;
350372
}
351-
@media (hover: hover) {
352-
.project-header:hover {
353-
color: var(--accent);
354-
}
373+
.project-top::after {
374+
content: '';
375+
position: absolute;
376+
inset: 0;
355377
}
356378
.project-name {
357-
font-size: var(--text-heading);
379+
font-size: var(--text-body);
380+
font-weight: 700;
358381
}
359382
.project-role {
360383
font-size: var(--text-small);
361-
letter-spacing: 0.5px;
362-
margin-bottom: 16px;
384+
color: var(--accent);
363385
}
364386
.project-desc {
365-
font-size: var(--text-body);
387+
font-size: var(--text-small);
366388
line-height: 1.5;
389+
overflow-wrap: break-word;
390+
word-break: break-word;
367391
}
368392
.project-desc a {
369393
color: var(--accent);
370394
text-decoration: none;
371-
}
372-
.project-desc a:hover {
373-
text-decoration: underline;
395+
position: relative;
396+
z-index: 1;
374397
}
375398
.project-arrow {
376399
color: var(--accent);
377400
}
378401
.project-arrow .material-symbols-sharp {
379-
font-size: 24px;
380-
font-variation-settings: 'FILL' 0, 'wght' 500, 'GRAD' 0, 'opsz' 24;
381-
}
382-
.skills-grid {
383-
display: flex;
384-
flex-wrap: wrap;
385-
gap: var(--box-gap);
386-
}
387-
.skill-box {
388-
border: 1px solid var(--black);
389-
padding: var(--box-pad);
390-
font-size: var(--text-small);
391-
}
392-
.services-grid {
393-
display: flex;
394-
flex-wrap: wrap;
395-
gap: var(--box-gap);
396-
}
397-
.service-box {
398-
border: 1px solid var(--black);
399-
padding: var(--box-pad);
400-
font-size: var(--text-small);
402+
font-size: 18px;
403+
font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 18;
401404
}
402405
.lately-list {
403406
display: flex;
@@ -524,7 +527,7 @@
524527
gap: var(--space-md);
525528
}
526529
.project-arrow .material-symbols-sharp {
527-
font-size: 20px;
530+
font-size: 18px;
528531
}
529532
.lately-list {
530533
align-items: stretch;

dist/play/index.html

Lines changed: 42 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -330,74 +330,77 @@
330330
.about-text p + p {
331331
margin-top: var(--space-md);
332332
}
333+
.offerings {
334+
display: flex;
335+
flex-wrap: wrap;
336+
gap: var(--box-gap);
337+
}
338+
.offering-tag {
339+
border: 1px solid var(--black);
340+
padding: var(--box-pad);
341+
font-size: var(--text-body);
342+
}
333343
.projects {
334344
display: flex;
335-
flex-direction: column;
336-
gap: var(--space-md);
345+
flex-wrap: wrap;
346+
gap: var(--box-gap);
337347
}
338348
.project {
349+
border: 1px solid var(--black);
350+
padding: var(--box-pad);
339351
display: flex;
340352
flex-direction: column;
341-
padding: var(--space-md) 0;
353+
gap: 8px;
354+
color: inherit;
355+
min-width: 0;
356+
flex: 1 1 280px;
357+
max-width: 100%;
358+
overflow: hidden;
359+
position: relative;
342360
}
343-
.project-header {
361+
@media (hover: hover) {
362+
.project:hover {
363+
color: var(--accent);
364+
}
365+
}
366+
.project-top {
344367
display: flex;
345368
align-items: center;
346369
justify-content: space-between;
347-
margin-bottom: 8px;
348370
text-decoration: none;
349371
color: inherit;
350372
}
351-
@media (hover: hover) {
352-
.project-header:hover {
353-
color: var(--accent);
354-
}
373+
.project-top::after {
374+
content: '';
375+
position: absolute;
376+
inset: 0;
355377
}
356378
.project-name {
357-
font-size: var(--text-heading);
379+
font-size: var(--text-body);
380+
font-weight: 700;
358381
}
359382
.project-role {
360383
font-size: var(--text-small);
361-
letter-spacing: 0.5px;
362-
margin-bottom: 16px;
384+
color: var(--accent);
363385
}
364386
.project-desc {
365-
font-size: var(--text-body);
387+
font-size: var(--text-small);
366388
line-height: 1.5;
389+
overflow-wrap: break-word;
390+
word-break: break-word;
367391
}
368392
.project-desc a {
369393
color: var(--accent);
370394
text-decoration: none;
371-
}
372-
.project-desc a:hover {
373-
text-decoration: underline;
395+
position: relative;
396+
z-index: 1;
374397
}
375398
.project-arrow {
376399
color: var(--accent);
377400
}
378401
.project-arrow .material-symbols-sharp {
379-
font-size: 24px;
380-
font-variation-settings: 'FILL' 0, 'wght' 500, 'GRAD' 0, 'opsz' 24;
381-
}
382-
.skills-grid {
383-
display: flex;
384-
flex-wrap: wrap;
385-
gap: var(--box-gap);
386-
}
387-
.skill-box {
388-
border: 1px solid var(--black);
389-
padding: var(--box-pad);
390-
font-size: var(--text-small);
391-
}
392-
.services-grid {
393-
display: flex;
394-
flex-wrap: wrap;
395-
gap: var(--box-gap);
396-
}
397-
.service-box {
398-
border: 1px solid var(--black);
399-
padding: var(--box-pad);
400-
font-size: var(--text-small);
402+
font-size: 18px;
403+
font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 18;
401404
}
402405
.lately-list {
403406
display: flex;
@@ -524,7 +527,7 @@
524527
gap: var(--space-md);
525528
}
526529
.project-arrow .material-symbols-sharp {
527-
font-size: 20px;
530+
font-size: 18px;
528531
}
529532
.lately-list {
530533
align-items: stretch;

0 commit comments

Comments
 (0)