More font tweaks

This commit is contained in:
Ian Keane 2026-08-27 12:55:55 -04:00
parent 230bc5a002
commit 6e8d7bc106
4 changed files with 83 additions and 50 deletions

View file

@ -18,8 +18,8 @@
;; ─── Individual cards (all become flat children of .columns) ────────────────── ;; ─── Individual cards (all become flat children of .columns) ──────────────────
;; Project card — detail bullets revealed on hover (desktop) or click (mobile) ;; Work-experience project card — bullet summary + hover-reveal detail bullets
(define (render-project proj) (define (render-work-project proj)
`(div (@ (class "project-card") `(div (@ (class "project-card")
(onclick "this.classList.toggle('open')")) (onclick "this.classList.toggle('open')"))
(div (@ (class "project-header")) (div (@ (class "project-header"))
@ -31,6 +31,27 @@
,(bullets (field proj 'detail-bullets))) ,(bullets (field proj 'detail-bullets)))
,(tech-list (field proj 'technologies)))) ,(tech-list (field proj 'technologies))))
;; Hobby/personal project card — sentence summary + hover-reveal links
(define (render-project proj)
(let* ((links (field proj 'detail-links))
(has-links (and (pair? links) (> (length links) 0))))
`(div (@ (class "project-card")
,@(if has-links '((onclick "this.classList.toggle('open')")) '()))
(div (@ (class "project-header"))
(span (@ (class "project-name")) ,(field proj 'name))
,(date-range (field proj 'date-start) (field proj 'date-end)))
(p (@ (class "project-summary")) ,(field proj 'summary))
,(if has-links
`(div (@ (class "project-details"))
(ul ,@(map (lambda (link)
`(li (a (@ (href ,(cdr link))
(target "_blank")
(rel "noopener"))
,(car link))))
links)))
'(span))
,(tech-list (field proj 'technologies)))))
;; Title card: blurb only, no projects nested inside. ;; Title card: blurb only, no projects nested inside.
;; Projects are emitted as siblings after the title card. ;; Projects are emitted as siblings after the title card.
(define (render-title-card tc) (define (render-title-card tc)
@ -43,11 +64,11 @@
(p (@ (class "title-blurb")) (p (@ (class "title-blurb"))
,(string-join (field tc 'blurb) " ")))) ,(string-join (field tc 'blurb) " "))))
;; Emit a title card followed by its project cards as a flat list of siblings ;; Emit a title card followed by its work-project cards as a flat list of siblings
(define (render-title-flat tc) (define (render-title-flat tc)
(append (append
(list (render-title-card tc)) (list (render-title-card tc))
(map render-project (field tc 'projects)))) (map render-work-project (field tc 'projects))))
(define (render-education edu) (define (render-education edu)
`(div (@ (class "education-card") `(div (@ (class "education-card")

File diff suppressed because one or more lines are too long

View file

@ -8,15 +8,25 @@
(cons 'email email) (cons 'email email)
(cons 'location location))) (cons 'location location)))
(define (make-project name date-start date-end summary-bullets detail-bullets technologies . rest) ;; Work-experience project: bullet summary + hover-reveal detail bullets
(list 'project (define (make-work-project name date-start date-end summary-bullets detail-bullets technologies)
(list 'work-project
(cons 'name name) (cons 'name name)
(cons 'date-start date-start) (cons 'date-start date-start)
(cons 'date-end date-end) (cons 'date-end date-end)
(cons 'summary-bullets summary-bullets) (cons 'summary-bullets summary-bullets)
(cons 'detail-bullets detail-bullets) (cons 'detail-bullets detail-bullets)
(cons 'technologies technologies) (cons 'technologies technologies)))
(cons 'url (if (null? rest) #f (car rest)))))
;; Hobby/personal project: sentence summary + hover-reveal (label . url) links
(define (make-project name date-start date-end summary detail-links technologies)
(list 'project
(cons 'name name)
(cons 'date-start date-start)
(cons 'date-end date-end)
(cons 'summary summary)
(cons 'detail-links detail-links)
(cons 'technologies technologies)))
;; Title card: lives inside a job card ;; Title card: lives inside a job card
;; blurb responsibility bullets ;; blurb responsibility bullets
@ -93,37 +103,34 @@
"Senior Software Engineer" "Acme Corp" "Remote" "Jun 2022" "Present" "Senior Software Engineer" "Acme Corp" "Remote" "Jun 2022" "Present"
'("Led a team of 4 engineers on the core platform, driving adoption of internal developer tooling and mentoring junior engineers through architecture proposals and code review.") '("Led a team of 4 engineers on the core platform, driving adoption of internal developer tooling and mentoring junior engineers through architecture proposals and code review.")
(list (list
(make-project (make-work-project
"Distributed Config Service" "Mar 2023" "Present" "Distributed Config Service" "Mar 2023" "Present"
'("Built a Raft-based distributed config store used by 40+ services.") '("Raft-based distributed config store serving 40+ services with <500 ms p99 propagation.")
'("Designed the consensus layer using a custom Raft implementation in Go." '("Designed consensus layer with custom Raft in Go."
"Added multi-region replication with conflict-free merge semantics." "Added multi-region replication with conflict-free merge semantics."
"Reduced config propagation time from ~30 s to <500 ms p99.") "Reduced config propagation from ~30 s to <500 ms p99.")
'("Go" "Raft" "gRPC" "Kubernetes" "Prometheus")) '("Go" "Raft" "gRPC" "Kubernetes" "Prometheus"))
(make-project (make-work-project
"Developer Portal" "Jun 2022" "Feb 2023" "Developer Portal" "Jun 2022" "Feb 2023"
'("Unified internal service catalogue and runbook search into one portal.") '("Unified internal service catalogue and runbook search; cut time-to-runbook from 8 min to <30 s.")
'("Indexed 300+ services via OpenAPI scraping and custom metadata YAML." '("Indexed 300+ services via OpenAPI scraping."
"Built a fuzzy-search backend in Go backed by Bleve." "Built fuzzy-search backend in Go with Bleve.")
"Reduced mean time-to-runbook from ~8 min to <30 s.")
'("Go" "Bleve" "React" "OpenAPI")))) '("Go" "Bleve" "React" "OpenAPI"))))
(make-title (make-title
"Software Engineer II" "Acme Corp" "Remote" "Jan 2020" "May 2022" "Software Engineer II" "Acme Corp" "Remote" "Jan 2020" "May 2022"
'("Owned the authentication service end-to-end, reducing API latency by 35% through targeted caching improvements.") '("Owned the authentication service end-to-end, reducing API latency by 35% through targeted caching improvements.")
(list (list
(make-project (make-work-project
"Auth Service Rewrite" "Jan 2020" "Dec 2020" "Auth Service Rewrite" "Jan 2020" "Dec 2020"
'("Rewrote legacy PHP auth service in Go; cut p99 latency from 800 ms to 40 ms.") '("Rewrote legacy PHP auth service in Go; cut p99 latency 800 ms → 40 ms.")
'("Migrated 12 M users with zero downtime using a dual-write/dark-read strategy." '("Migrated 12 M users with zero downtime via dual-write/dark-read."
"Introduced PKCE OAuth 2.0 flow replacing home-grown session tokens." "Introduced PKCE OAuth 2.0 replacing home-grown session tokens.")
"Added comprehensive integration test suite with 92% coverage.")
'("Go" "PostgreSQL" "Redis" "OAuth2" "Docker")) '("Go" "PostgreSQL" "Redis" "OAuth2" "Docker"))
(make-project (make-work-project
"Rate Limiting Layer" "Feb 2021" "May 2022" "Rate Limiting Layer" "Feb 2021" "May 2022"
'("Implemented token-bucket rate limiting across all public API endpoints.") '("Token-bucket rate limiting across all public API endpoints; reduced abusive traffic by 80%.")
'("Built as a gRPC interceptor; config hot-reloaded from the config service." '("Built as a gRPC interceptor with hot-reloaded config."
"Reduced abusive traffic incidents by 80% in the first quarter after launch." "Added per-tenant override rules via internal admin UI.")
"Added per-tenant override rules managed via an internal admin UI.")
'("Go" "gRPC" "Redis" "React"))))))) '("Go" "gRPC" "Redis" "React")))))))
(define job-startup (define job-startup
@ -134,12 +141,11 @@
"Full-Stack Engineer" "Startup XYZ" "Athens, GA" "Jul 2017" "Dec 2019" "Full-Stack Engineer" "Startup XYZ" "Athens, GA" "Jul 2017" "Dec 2019"
'("Built product features across the React frontend and Node.js backend, maintained CI/CD pipelines and AWS infrastructure, and collaborated directly with design and product teams.") '("Built product features across the React frontend and Node.js backend, maintained CI/CD pipelines and AWS infrastructure, and collaborated directly with design and product teams.")
(list (list
(make-project (make-work-project
"Real-Time Dashboard" "Feb 2019" "Dec 2019" "Real-Time Dashboard" "Feb 2019" "Dec 2019"
'("Delivered a live analytics dashboard processing 50k events/s.") '("Live analytics dashboard processing 50k events/s via WebSocket fan-out.")
'("Replaced polling with WebSocket fan-out, cutting server load by 60%." '("Replaced polling, cutting server load by 60%."
"Implemented client-side time-series aggregation using D3.js." "User-configurable alert thresholds stored in IndexedDB.")
"Added user-configurable alert thresholds stored in IndexedDB.")
'("React" "Node.js" "WebSockets" "D3.js" "AWS"))))))) '("React" "Node.js" "WebSockets" "D3.js" "AWS")))))))
(define my-education (define my-education
@ -159,19 +165,14 @@
(list (list
(make-project (make-project
"schemeresume" "Aug 2026" "Present" "schemeresume" "Aug 2026" "Present"
'("A resume generator written in Scheme that produces HTML via SXML.") "Resume generator written in Scheme; data as S-expressions, rendered to HTML via SXML."
'("Defined a small DSL for resume data in resume.scm." '(("GitHub" . "https://github.com/janedoe/schemeresume"))
"generate.scm walks the data and emits SXML serialised to HTML." '("Scheme" "SXML" "HTML" "CSS"))
"CSS handles all layout including the two-column split.")
'("Scheme" "SXML" "HTML" "CSS")
"https://github.com/janedoe/schemeresume")
(make-project (make-project
"Tiny Lisp Interpreter" "Jan 2025" "Mar 2025" "Tiny Lisp Interpreter" "Jan 2025" "Mar 2025"
'("A 600-line Lisp interpreter in Python supporting tail-call optimisation.") "600-line Lisp interpreter in Python with tail-call optimisation, closures, and a macro expander."
'("Implemented environments as linked frames, closures, and a macro expander." '(("GitHub" . "https://github.com/janedoe/tinylisp"))
"Added a REPL with readline history and pretty-printing.") '("Python" "Lisp")))))
'("Python" "Lisp")
"https://github.com/janedoe/tinylisp"))))
(define my-interests (define my-interests
(make-interests (make-interests

View file

@ -166,13 +166,19 @@ p.title-blurb {
.project-name { font-size: 0.72rem; } .project-name { font-size: 0.72rem; }
.project-summary ul { padding-left: 12px; margin-top: 2px; } p.project-summary {
.project-summary li { font-size: 0.68rem;
line-height: 1.5;
color: rgba(255,255,255,0.85);
margin-top: 2px;
}
div.project-summary ul { list-style: disc; padding-left: 14px; margin-top: 2px; }
div.project-summary li {
font-size: 0.68rem; font-size: 0.68rem;
line-height: 1.5; line-height: 1.5;
color: rgba(255,255,255,0.85); color: rgba(255,255,255,0.85);
} }
.project-summary li::before { content: "• "; color: var(--muted); }
.project-details { .project-details {
max-height: 0; max-height: 0;
@ -198,14 +204,19 @@ p.title-blurb {
.education-card:hover .edu-extras { max-height: 0; opacity: 0; margin-top: 0; } .education-card:hover .edu-extras { max-height: 0; opacity: 0; margin-top: 0; }
.education-card.open .edu-extras { max-height: 400px; opacity: 1; margin-top: 4px; } .education-card.open .edu-extras { max-height: 400px; opacity: 1; margin-top: 4px; }
} }
.project-details ul { padding-left: 12px; margin-top: 4px; } .project-details ul { list-style: disc; padding-left: 14px; margin-top: 4px; }
.project-details li { .project-details li {
font-size: 0.68rem; font-size: 0.68rem;
color: var(--muted); color: var(--muted);
line-height: 1.5; line-height: 1.5;
margin-bottom: 1px; margin-bottom: 2px;
} }
.project-details li::before { content: "• "; } .project-details li a {
color: var(--accent);
text-decoration: underline;
text-underline-offset: 2px;
}
.project-details li a:hover { opacity: 0.8; }
.tech-list { .tech-list {
display: flex; display: flex;