From ca3aa9527637f10092ff7994a5e215fd9915c2d1 Mon Sep 17 00:00:00 2001 From: Karn Date: Sat, 2 May 2026 01:47:58 +0530 Subject: [PATCH 1/9] chore: ignore .worktrees/ --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 15214f2..fe2fd97 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ dist .env.local src/generated/ public/templates.json +.worktrees/ From 5701b4acf141407c96bfea02b52599bacdc76293 Mon Sep 17 00:00:00 2001 From: Karn Date: Sat, 2 May 2026 01:51:32 +0530 Subject: [PATCH 2/9] =?UTF-8?q?docs(spec):=20100-templates=20design=20(20?= =?UTF-8?q?=20DNAs=20=C3=97=205=20variants)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../specs/2026-05-02-100-templates-design.md | 264 ++++++++++++++++++ 1 file changed, 264 insertions(+) create mode 100644 docs/superpowers/specs/2026-05-02-100-templates-design.md diff --git a/docs/superpowers/specs/2026-05-02-100-templates-design.md b/docs/superpowers/specs/2026-05-02-100-templates-design.md new file mode 100644 index 0000000..17ef90d --- /dev/null +++ b/docs/superpowers/specs/2026-05-02-100-templates-design.md @@ -0,0 +1,264 @@ +# 100 templates - design spec + +Date: 2026-05-02 +Branch: `feat/100-templates` + +## Goal + +Ship 100 new high-quality resume templates in a single PR. Each template is a folder under `templates//` with `index.tsx` + `styles.css` + `meta.ts`, conforming to the contract in `docs/TEMPLATE_GUIDE.md` and `.claude/skills/designing-templates/SKILL.md`. + +The 3 existing templates (`_starter`, `emerald-twocol`, `minimal-mono`) are not modified. + +## Approach + +**20 design DNAs × 5 variants each = 100 templates.** + +A "DNA" is a coherent design language (Swiss Grid, Editorial Serif, Brutalist, Terminal CLI, Newspaper, etc). A "variant" is a sibling within that DNA that meaningfully differs along ≥2 of these axes: + +- Palette (default / cobalt / amber / rose / graphite / cream / etc) +- Layout topology (single-col / sidebar-L / sidebar-R / banner-top / asymmetric) +- Density (loose / standard / tight) +- Typography pairing (sans body, serif body, mono body, mixed) +- Accent placement (rules, bullets, name, eyebrows, none) + +Variants are NOT recolors. Each variant is a deliberately different visual choice within the family. Two variants with the same DNA should still be obviously different at a glance. + +## Why this approach (vs alternatives) + +- **100 unique unrelated designs**: realistically 30k+ lines of bespoke CSS. Quality drifts in the long tail and the last 30 unintentionally repeat the first 70. +- **Combinatorial axis matrix**: produces "generated"-looking results, not designed ones. +- **20 DNAs × 5 variants** (this spec): each DNA gets careful design attention; variants give meaningful breadth without dilution. + +## Constraints (recap) + +Every template MUST: + +1. Render through ``. No exceptions. +2. Be a no-prop default-exported React component. +3. Use scoped CSS in `styles.css` (root class `.resume-` or a stable prefix). No Tailwind utility classes inside the component. +4. Use `--page-pad-top` / `--page-pad-bot` CSS variables in the root padding declaration. +5. NOT set `max-width: 210mm` or `margin: 0 auto` on the root. +6. NOT redeclare `@page` (lives in `src/styles/print-base.css`). +7. Add `print-color-adjust: exact` to the root if it uses any non-grayscale element. +8. Wrap entry containers with `data-print-entry="true"` (or use `page-break-inside: avoid` in `@media print`). +9. Pass `pnpm typecheck`. +10. Render at `/preview/` without errors. + +## Placeholder content (consistent across all 100) + +Use the same fictional persona as existing templates: + +- **Name:** Avery Park +- **Title:** senior software engineer · platform +- **Email:** avery@example.com +- **Location:** New York, NY +- **Site:** averypark.dev +- **GitHub:** github.com/averypark +- **LinkedIn:** in/averypark + +**Summary:** "I build resilient backend systems and the platforms that run them. I prefer small, reversible changes and clear interfaces. Software should be boring in production and useful to its users." + +**Experience entries** (use these companies/titles; tweak bullet phrasing per template's voice): +- **Coral Labs** — Senior Software Engineer (Mar 2024 – Present, NYC); Software Engineer 2 (Aug 2022 – Mar 2024, NYC) +- **Acme Inc** — Software Engineer (Jan 2020 – Jul 2022, Remote) +- **Bytework** — Software Engineer Intern (May 2018 – Aug 2018, Remote) + +**Education:** B.S. Computer Science · Northern State University · 2014 – 2018 + +**Projects:** Loomroute (URL routing lib, Go), Tinytrace (distributed tracing, Rust) + +**Skills (group):** Languages: Go, TypeScript, Python, Rust · Backend: Postgres, Redis, Kafka, gRPC · Frontend: React, Next.js, Tailwind, Vite · Platform: AWS, Kubernetes, Docker, Terraform + +Reuse content but rephrase / restructure to match each template's voice and density. Some templates (academic, dossier, magazine) may invent additional structured fields like Publications, Awards, Pull Quote, Edition Number, etc. + +## The 20 DNAs + +Each DNA below specifies: aesthetic, key typography, layout, palette tendency, signature elements, and 5 variant slugs. + +### 1. swiss — Swiss / International Style +Akzidenz-Grotesk feel (Helvetica fallback). Strict baseline grid. All-caps tracked-out section labels. Single-color block accent. Generous left-aligned whitespace. Math-precise. +- `swiss` — cool gray + cobalt block accent +- `swiss-rose` — rose accent +- `swiss-graphite` — pure grayscale, no chromatic accent +- `swiss-airy` — looser line-height + larger margins +- `swiss-mirror` — accent block on the right rather than left + +### 2. editorial — Magazine editorial +Large serif headlines (Playfair / Domaine fallback to system serif). Italic meta. Body in transitional sans (Inter) or smaller serif. Drop-cap on summary. Multi-column experience block. +- `editorial` — Playfair-feel + Inter body, no color +- `editorial-noir` — black/cream, double-rule under name +- `editorial-vogue` — oversized name, all-caps section heads +- `editorial-condensed` — condensed display serif headlines +- `editorial-pull` — sidebar pull-quote panel with summary + +### 3. brutalist — Brutalist +Off-grid. Mixed mono + geometric sans. Hard 2-3px borders. Asymmetric layout. Tight letter-spacing. Raw. +- `brutalist` — mono + sans mix, harsh black rules +- `brutalist-redbar` — red block accent over name +- `brutalist-grid` — overlaid grid lines +- `brutalist-stamp` — date/role rendered as mono caps stamps +- `brutalist-strip` — vertical strip of mono-coded contact info on right edge + +### 4. terminal — CLI / terminal +Full mono (JetBrains Mono / IBM Plex Mono / Menlo fallback). Prompt-style sections (`$ cat experience.md`). Syntax-highlight color accents. +- `terminal` — cyan accents on white +- `terminal-amber` — amber accents (CRT amber) +- `terminal-green` — green accents (CRT green phosphor) +- `terminal-prompt` — `>` prompt prefix on every line +- `terminal-tabular` — tabular two-column with mono columns + +### 5. newspaper — Old-style newspaper +Old-style masthead with rule + date. Condensed serif headlines. Small-caps section labels. Body in old-style serif. Narrow gutters. +- `newspaper` — masthead + multi-column experience +- `newspaper-tribune` — tabloid-style oversize headline +- `newspaper-times` — Times-feel narrow columns +- `newspaper-broadsheet` — full-width single column with kicker +- `newspaper-gazette` — gazette-style with running header + +### 6. architect — Technical drawing +Dimension lines. Monospaced labels. Schedule-style entries (`01 / 02 / 03`). Thin precise rules. Engineering-drawing aesthetic. +- `architect` — base, blueprint white +- `architect-blueprint` — pale blue accent rule +- `architect-section` — section-cut markings (chevrons) +- `architect-tabular` — entries in technical schedule grid +- `architect-elevation` — vertical timeline with level markers + +### 7. banker — Conservative / financial +Caslon-feel serif (Garamond/Times fallback). Centered name. Tabular figures. Hairline rules. Restrained. +- `banker` — deep navy headings +- `banker-burgundy` — burgundy accent +- `banker-monogram` — monogram-style initials at top +- `banker-twocol` — two-column variant with classical aesthetic +- `banker-letterhead` — top letterhead bar with name centered + +### 8. academic — Academic CV +LaTeX-CV aesthetic. Dense. Italic journal references. Hanging indents. Tight typesetting. +- `academic` — base, generic LaTeX feel +- `academic-tight` — tighter spacing for publication-heavy CVs +- `academic-twocol` — two-col with sidebar for affiliations +- `academic-lmr` — Latin-Modern-feel typography +- `academic-cv` — emphasized publications section, hanging indents + +### 9. magazine — Magazine cover +Cover-treatment oversized name. Kicker eyebrow. Pull-quote sidebar. Mixed type sizes for editorial energy. +- `magazine` — base +- `magazine-kicker` — large kicker above name +- `magazine-quote` — large pull-quote in sidebar +- `magazine-issue` — "Issue #07" treatment in masthead +- `magazine-cover` — color-block masthead (no actual image) + +### 10. display — Display contrast +Heavy display-sans contrast (Druk/Untitled-Sans-Black feel; fall back to Inter Black 900). Thin body. Bold-light tension. +- `display` — black/thin contrast, base +- `display-cobalt` — cobalt on cream +- `display-noir` — noir variant (cream paper, black ink) +- `display-stack` — stacked-name treatment (one word per line) +- `display-shout` — full-width name banner, edge-to-edge + +### 11. saas — Modern tech SaaS +Inter + JetBrains Mono. Soft rounded chips. Single brand accent. Clean modern sans. (Distinct from `emerald-twocol` because `saas-*` are single-column or banner, not two-column.) +- `saas` — base, indigo accent +- `saas-teal` — teal accent +- `saas-violet` — violet accent +- `saas-mono` — mono body variant +- `saas-banner` — colored banner header + +### 12. letterpress — Classical correspondence +Centered name. Italic transitions. Hairline rules. Generous air. Classical serif (Caslon/Garamond fallback). +- `letterpress` — base +- `letterpress-cream` — cream paper feel +- `letterpress-italics` — italics-heavy variant +- `letterpress-monogram` — initial monogram block +- `letterpress-correspondence` — letterhead + signature block + +### 13. dossier — Field report / classified +Header bar with classification banner ("CONFIDENTIAL — SUBJECT FILE"). Serial numbers. Mono labels. Slate palette. +- `dossier` — base, slate +- `dossier-redact` — redaction-style highlight bars +- `dossier-stamped` — "APPROVED" stamp aesthetic +- `dossier-archive` — archive-folder tab marker +- `dossier-field` — field-report numbered entries + +### 14. specsheet — Product spec sheet +Key/value grid. "REV / DATE / OWNER" header. Technical aesthetic. +- `specsheet` — base +- `specsheet-rev` — REV-A / REV-B markings +- `specsheet-grid` — strict spec-grid layout +- `specsheet-callout` — callout boxes per role +- `specsheet-tab` — tabbed sections + +### 15. executive — Boardroom executive +Wordmark name. Single accent. Sober corporate restraint. Lots of air. Single-page, calm. +- `executive` — base +- `executive-monogram` — monogram crest +- `executive-graphite` — pure graphite +- `executive-deepblue` — deep blue accent +- `executive-rule` — bold horizontal rule under name + +### 16. traditional — Two-column, sidebar L +Practical two-col, sidebar-left (skills/contact/edu), main right (experience). No flair, balanced. +- `traditional` — base +- `traditional-mono` — mono accents on labels +- `traditional-warm` — warm gray palette +- `traditional-tight` — denser +- `traditional-divider` — strong divider rule between cols + +### 17. mirror — Two-column, sidebar R +Same role as `traditional` but sidebar on the **right**. Eye-flow differs, body width differs — distinct template. +- `mirror` — base +- `mirror-bold` — bold sidebar header +- `mirror-quiet` — quiet (low contrast) +- `mirror-stack` — sidebar stacks education + skills + interests +- `mirror-block` — sidebar block at top, vertical rules (no photo) + +### 18. manuscript — Manuscript / classical +Hand-numbered sections in Roman numerals. Italic dates. Classical sans (Optima/Avenir fallback to Georgia/serif). +- `manuscript` — base +- `manuscript-roman` — Roman numerals on sections +- `manuscript-folio` — folio-page-number style +- `manuscript-ornament` — small typographic ornaments between sections +- `manuscript-script` — subtle script flourishes (avoid heavy script) + +### 19. periodical — Periodical +Running header bar with edition number. Date floated to margin. "Vol. / Issue" markings. +- `periodical` — base +- `periodical-volume` — Vol/Issue header +- `periodical-folios` — page-folios in margins +- `periodical-running` — running header per section +- `periodical-byline` — byline-style attribution + +### 20. indexcard — Library / index card +Library-card aesthetic. Rule grid (notebook-line feel). Tab markers. Monospaced numerals. +- `indexcard` — base +- `indexcard-ruled` — ruled-line aesthetic +- `indexcard-tab` — tab markers on left +- `indexcard-stamp` — date-stamped +- `indexcard-classified` — Dewey-style classifier numbers + +## Implementation strategy + +- One agent per DNA. Agent receives: this spec excerpt for its DNA, paths to read (`docs/TEMPLATE_GUIDE.md`, `.claude/skills/designing-templates/SKILL.md`, all 3 existing templates), and an output contract. +- Agents run in parallel where practical (~5–10 concurrent). +- Each agent produces 5 folders under `templates//` with `index.tsx`, `styles.css`, `meta.ts`. +- Each agent self-verifies by ensuring the file structure matches the contract; cross-template typecheck is run by the orchestrator at the end. +- After all agents complete, orchestrator runs `pnpm typecheck` and `pnpm format`, then spot-checks `/preview/` for ~10 templates in dev server. + +## Verification gates + +- `pnpm typecheck` passes — sync plugin auto-discovers, registry regenerates, types check. +- All 100 templates show up in `templates/` folder + auto-detected by `scripts/sync-templates.mjs`. +- Spot-check ~10 templates render at `/preview/` without console errors. +- Spot-check 1-2 print to PDF cleanly (Cmd+P). +- `pnpm format` runs cleanly. + +## Out of scope (explicit follow-ups) + +- **Gallery UX at scale.** With 103 total templates, the `/templates` page rendering 100+ iframes will overwhelm the browser. Needs pagination / virtualization / featured-set in a separate task. +- **Bundle size investigation.** All 100 CSS files are bundled together. Probably fine but unmeasured here. +- **README revamp.** Already queued separately. + +## Risks / known limitations + +- 100 templates produced via parallel agents will have some quality variance. Acceptable trade-off for ship velocity. Worst offenders can be iterated post-merge. +- Some DNAs (academic, dossier, magazine) invent extra placeholder fields. Those fields aren't part of the canonical Avery Park persona but are needed to demonstrate the template's structure. +- Many templates use ambitious fonts (Playfair, Druk, Caslon). They're declared as families with system serif/sans fallbacks; we don't ship webfonts, so the fallback is what users actually see. Templates should look intentional even with the fallback. From 327df7a8902efb704f4d076be1968435f7cfc3e0 Mon Sep 17 00:00:00 2001 From: Karn Date: Sat, 2 May 2026 02:29:04 +0530 Subject: [PATCH 3/9] feat(templates): add 100 new templates across 20 design DNAs Each DNA contributes 5 variants (different palette / layout / density / type pairing). Every template lives in templates// with index.tsx + styles.css + meta.ts and conforms to the existing contract: wrap, scoped CSS, --page-pad-top/bot vars, data-print-entry on entries, print-color-adjust on chromatic templates, no @page redeclaration. Each template owns its density-tight + density-roomy overrides in its own styles.css (scoped to its root class) so the toolbar's density selector works without further plumbing - the centralized stage.css block remains for emerald-twocol and minimal-mono only. DNAs: swiss, editorial, brutalist, terminal, newspaper, architect, banker, academic, magazine, display, saas, letterpress, dossier, specsheet, executive, traditional, mirror, manuscript, periodical, indexcard. Spec: docs/superpowers/specs/2026-05-02-100-templates-design.md Skill update: density-support guidance added to designing-templates SKILL.md Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/skills/designing-templates/SKILL.md | 34 +- .../specs/2026-05-02-100-templates-design.md | 15 +- templates/academic-cv/index.tsx | 229 +++++++++ templates/academic-cv/meta.ts | 13 + templates/academic-cv/styles.css | 289 +++++++++++ templates/academic-lmr/index.tsx | 213 ++++++++ templates/academic-lmr/meta.ts | 13 + templates/academic-lmr/styles.css | 327 +++++++++++++ templates/academic-tight/index.tsx | 185 +++++++ templates/academic-tight/meta.ts | 13 + templates/academic-tight/styles.css | 294 +++++++++++ templates/academic-twocol/index.tsx | 216 ++++++++ templates/academic-twocol/meta.ts | 13 + templates/academic-twocol/styles.css | 332 +++++++++++++ templates/academic/index.tsx | 216 ++++++++ templates/academic/meta.ts | 13 + templates/academic/styles.css | 323 ++++++++++++ templates/architect-blueprint/index.tsx | 246 ++++++++++ templates/architect-blueprint/meta.ts | 13 + templates/architect-blueprint/styles.css | 371 ++++++++++++++ templates/architect-elevation/index.tsx | 257 ++++++++++ templates/architect-elevation/meta.ts | 13 + templates/architect-elevation/styles.css | 329 +++++++++++++ templates/architect-section/index.tsx | 262 ++++++++++ templates/architect-section/meta.ts | 13 + templates/architect-section/styles.css | 347 +++++++++++++ templates/architect-tabular/index.tsx | 293 +++++++++++ templates/architect-tabular/meta.ts | 13 + templates/architect-tabular/styles.css | 296 +++++++++++ templates/architect/index.tsx | 244 ++++++++++ templates/architect/meta.ts | 13 + templates/architect/styles.css | 372 ++++++++++++++ templates/banker-burgundy/index.tsx | 246 ++++++++++ templates/banker-burgundy/meta.ts | 9 + templates/banker-burgundy/styles.css | 329 +++++++++++++ templates/banker-letterhead/index.tsx | 251 ++++++++++ templates/banker-letterhead/meta.ts | 9 + templates/banker-letterhead/styles.css | 357 ++++++++++++++ templates/banker-monogram/index.tsx | 229 +++++++++ templates/banker-monogram/meta.ts | 9 + templates/banker-monogram/styles.css | 346 +++++++++++++ templates/banker-twocol/index.tsx | 203 ++++++++ templates/banker-twocol/meta.ts | 9 + templates/banker-twocol/styles.css | 349 +++++++++++++ templates/banker/index.tsx | 222 +++++++++ templates/banker/meta.ts | 9 + templates/banker/styles.css | 308 ++++++++++++ templates/brutalist-grid/index.tsx | 190 ++++++++ templates/brutalist-grid/meta.ts | 13 + templates/brutalist-grid/styles.css | 389 +++++++++++++++ templates/brutalist-redbar/index.tsx | 185 +++++++ templates/brutalist-redbar/meta.ts | 13 + templates/brutalist-redbar/styles.css | 347 +++++++++++++ templates/brutalist-stamp/index.tsx | 153 ++++++ templates/brutalist-stamp/meta.ts | 13 + templates/brutalist-stamp/styles.css | 355 ++++++++++++++ templates/brutalist-strip/index.tsx | 201 ++++++++ templates/brutalist-strip/meta.ts | 13 + templates/brutalist-strip/styles.css | 392 +++++++++++++++ templates/brutalist/index.tsx | 197 ++++++++ templates/brutalist/meta.ts | 13 + templates/brutalist/styles.css | 334 +++++++++++++ templates/display-cobalt/index.tsx | 135 +++++ templates/display-cobalt/meta.ts | 8 + templates/display-cobalt/styles.css | 268 ++++++++++ templates/display-noir/index.tsx | 164 +++++++ templates/display-noir/meta.ts | 8 + templates/display-noir/styles.css | 331 +++++++++++++ templates/display-shout/index.tsx | 151 ++++++ templates/display-shout/meta.ts | 8 + templates/display-shout/styles.css | 315 ++++++++++++ templates/display-stack/index.tsx | 146 ++++++ templates/display-stack/meta.ts | 8 + templates/display-stack/styles.css | 319 ++++++++++++ templates/display/index.tsx | 143 ++++++ templates/display/meta.ts | 8 + templates/display/styles.css | 274 +++++++++++ templates/dossier-archive/index.tsx | 255 ++++++++++ templates/dossier-archive/meta.ts | 13 + templates/dossier-archive/styles.css | 429 ++++++++++++++++ templates/dossier-field/index.tsx | 216 ++++++++ templates/dossier-field/meta.ts | 13 + templates/dossier-field/styles.css | 383 +++++++++++++++ templates/dossier-redact/index.tsx | 249 ++++++++++ templates/dossier-redact/meta.ts | 13 + templates/dossier-redact/styles.css | 401 +++++++++++++++ templates/dossier-stamped/index.tsx | 233 +++++++++ templates/dossier-stamped/meta.ts | 13 + templates/dossier-stamped/styles.css | 460 ++++++++++++++++++ templates/dossier/index.tsx | 240 +++++++++ templates/dossier/meta.ts | 13 + templates/dossier/styles.css | 383 +++++++++++++++ templates/editorial-condensed/index.tsx | 191 ++++++++ templates/editorial-condensed/meta.ts | 12 + templates/editorial-condensed/styles.css | 324 ++++++++++++ templates/editorial-noir/index.tsx | 187 +++++++ templates/editorial-noir/meta.ts | 13 + templates/editorial-noir/styles.css | 401 +++++++++++++++ templates/editorial-pull/index.tsx | 198 ++++++++ templates/editorial-pull/meta.ts | 13 + templates/editorial-pull/styles.css | 397 +++++++++++++++ templates/editorial-vogue/index.tsx | 203 ++++++++ templates/editorial-vogue/meta.ts | 13 + templates/editorial-vogue/styles.css | 380 +++++++++++++++ templates/editorial/index.tsx | 177 +++++++ templates/editorial/meta.ts | 13 + templates/editorial/styles.css | 320 ++++++++++++ templates/emerald-twocol/index.tsx | 8 +- templates/executive-deepblue/index.tsx | 144 ++++++ templates/executive-deepblue/meta.ts | 12 + templates/executive-deepblue/styles.css | 264 ++++++++++ templates/executive-graphite/index.tsx | 156 ++++++ templates/executive-graphite/meta.ts | 12 + templates/executive-graphite/styles.css | 247 ++++++++++ templates/executive-monogram/index.tsx | 143 ++++++ templates/executive-monogram/meta.ts | 12 + templates/executive-monogram/styles.css | 302 ++++++++++++ templates/executive-rule/index.tsx | 160 ++++++ templates/executive-rule/meta.ts | 12 + templates/executive-rule/styles.css | 264 ++++++++++ templates/executive/index.tsx | 156 ++++++ templates/executive/meta.ts | 12 + templates/executive/styles.css | 267 ++++++++++ templates/indexcard-classified/index.tsx | 216 ++++++++ templates/indexcard-classified/meta.ts | 13 + templates/indexcard-classified/styles.css | 359 ++++++++++++++ templates/indexcard-ruled/index.tsx | 183 +++++++ templates/indexcard-ruled/meta.ts | 13 + templates/indexcard-ruled/styles.css | 309 ++++++++++++ templates/indexcard-stamp/index.tsx | 200 ++++++++ templates/indexcard-stamp/meta.ts | 13 + templates/indexcard-stamp/styles.css | 341 +++++++++++++ templates/indexcard-tab/index.tsx | 208 ++++++++ templates/indexcard-tab/meta.ts | 13 + templates/indexcard-tab/styles.css | 330 +++++++++++++ templates/indexcard/index.tsx | 229 +++++++++ templates/indexcard/meta.ts | 13 + templates/indexcard/styles.css | 390 +++++++++++++++ .../letterpress-correspondence/index.tsx | 215 ++++++++ templates/letterpress-correspondence/meta.ts | 12 + .../letterpress-correspondence/styles.css | 351 +++++++++++++ templates/letterpress-cream/index.tsx | 206 ++++++++ templates/letterpress-cream/meta.ts | 12 + templates/letterpress-cream/styles.css | 304 ++++++++++++ templates/letterpress-italics/index.tsx | 192 ++++++++ templates/letterpress-italics/meta.ts | 12 + templates/letterpress-italics/styles.css | 290 +++++++++++ templates/letterpress-monogram/index.tsx | 201 ++++++++ templates/letterpress-monogram/meta.ts | 12 + templates/letterpress-monogram/styles.css | 339 +++++++++++++ templates/letterpress/index.tsx | 205 ++++++++ templates/letterpress/meta.ts | 12 + templates/letterpress/styles.css | 302 ++++++++++++ templates/magazine-cover/index.tsx | 202 ++++++++ templates/magazine-cover/meta.ts | 9 + templates/magazine-cover/styles.css | 383 +++++++++++++++ templates/magazine-issue/index.tsx | 191 ++++++++ templates/magazine-issue/meta.ts | 8 + templates/magazine-issue/styles.css | 382 +++++++++++++++ templates/magazine-kicker/index.tsx | 202 ++++++++ templates/magazine-kicker/meta.ts | 8 + templates/magazine-kicker/styles.css | 337 +++++++++++++ templates/magazine-quote/index.tsx | 199 ++++++++ templates/magazine-quote/meta.ts | 8 + templates/magazine-quote/styles.css | 364 ++++++++++++++ templates/magazine/index.tsx | 190 ++++++++ templates/magazine/meta.ts | 9 + templates/magazine/styles.css | 374 ++++++++++++++ templates/manuscript-folio/index.tsx | 231 +++++++++ templates/manuscript-folio/meta.ts | 12 + templates/manuscript-folio/styles.css | 365 ++++++++++++++ templates/manuscript-ornament/index.tsx | 251 ++++++++++ templates/manuscript-ornament/meta.ts | 12 + templates/manuscript-ornament/styles.css | 329 +++++++++++++ templates/manuscript-roman/index.tsx | 218 +++++++++ templates/manuscript-roman/meta.ts | 12 + templates/manuscript-roman/styles.css | 328 +++++++++++++ templates/manuscript-script/index.tsx | 212 ++++++++ templates/manuscript-script/meta.ts | 12 + templates/manuscript-script/styles.css | 346 +++++++++++++ templates/manuscript/index.tsx | 213 ++++++++ templates/manuscript/meta.ts | 12 + templates/manuscript/styles.css | 316 ++++++++++++ templates/mirror-block/index.tsx | 163 +++++++ templates/mirror-block/meta.ts | 9 + templates/mirror-block/styles.css | 339 +++++++++++++ templates/mirror-bold/index.tsx | 160 ++++++ templates/mirror-bold/meta.ts | 9 + templates/mirror-bold/styles.css | 358 ++++++++++++++ templates/mirror-quiet/index.tsx | 154 ++++++ templates/mirror-quiet/meta.ts | 9 + templates/mirror-quiet/styles.css | 273 +++++++++++ templates/mirror-stack/index.tsx | 187 +++++++ templates/mirror-stack/meta.ts | 9 + templates/mirror-stack/styles.css | 338 +++++++++++++ templates/mirror/index.tsx | 154 ++++++ templates/mirror/meta.ts | 9 + templates/mirror/styles.css | 300 ++++++++++++ templates/newspaper-broadsheet/index.tsx | 179 +++++++ templates/newspaper-broadsheet/meta.ts | 12 + templates/newspaper-broadsheet/styles.css | 307 ++++++++++++ templates/newspaper-gazette/index.tsx | 175 +++++++ templates/newspaper-gazette/meta.ts | 12 + templates/newspaper-gazette/styles.css | 330 +++++++++++++ templates/newspaper-times/index.tsx | 136 ++++++ templates/newspaper-times/meta.ts | 12 + templates/newspaper-times/styles.css | 265 ++++++++++ templates/newspaper-tribune/index.tsx | 163 +++++++ templates/newspaper-tribune/meta.ts | 12 + templates/newspaper-tribune/styles.css | 326 +++++++++++++ templates/newspaper/index.tsx | 144 ++++++ templates/newspaper/meta.ts | 12 + templates/newspaper/styles.css | 339 +++++++++++++ templates/periodical-byline/index.tsx | 226 +++++++++ templates/periodical-byline/meta.ts | 13 + templates/periodical-byline/styles.css | 367 ++++++++++++++ templates/periodical-folios/index.tsx | 213 ++++++++ templates/periodical-folios/meta.ts | 13 + templates/periodical-folios/styles.css | 412 ++++++++++++++++ templates/periodical-running/index.tsx | 216 ++++++++ templates/periodical-running/meta.ts | 13 + templates/periodical-running/styles.css | 311 ++++++++++++ templates/periodical-volume/index.tsx | 245 ++++++++++ templates/periodical-volume/meta.ts | 13 + templates/periodical-volume/styles.css | 395 +++++++++++++++ templates/periodical/index.tsx | 211 ++++++++ templates/periodical/meta.ts | 13 + templates/periodical/styles.css | 406 ++++++++++++++++ templates/saas-banner/index.tsx | 209 ++++++++ templates/saas-banner/meta.ts | 12 + templates/saas-banner/styles.css | 312 ++++++++++++ templates/saas-mono/index.tsx | 205 ++++++++ templates/saas-mono/meta.ts | 13 + templates/saas-mono/styles.css | 297 +++++++++++ templates/saas-teal/index.tsx | 205 ++++++++ templates/saas-teal/meta.ts | 12 + templates/saas-teal/styles.css | 299 ++++++++++++ templates/saas-violet/index.tsx | 205 ++++++++ templates/saas-violet/meta.ts | 12 + templates/saas-violet/styles.css | 302 ++++++++++++ templates/saas/index.tsx | 205 ++++++++ templates/saas/meta.ts | 12 + templates/saas/styles.css | 306 ++++++++++++ templates/specsheet-callout/index.tsx | 302 ++++++++++++ templates/specsheet-callout/meta.ts | 13 + templates/specsheet-callout/styles.css | 361 ++++++++++++++ templates/specsheet-grid/index.tsx | 312 ++++++++++++ templates/specsheet-grid/meta.ts | 13 + templates/specsheet-grid/styles.css | 275 +++++++++++ templates/specsheet-rev/index.tsx | 297 +++++++++++ templates/specsheet-rev/meta.ts | 13 + templates/specsheet-rev/styles.css | 430 ++++++++++++++++ templates/specsheet-tab/index.tsx | 248 ++++++++++ templates/specsheet-tab/meta.ts | 13 + templates/specsheet-tab/styles.css | 380 +++++++++++++++ templates/specsheet/index.tsx | 276 +++++++++++ templates/specsheet/meta.ts | 13 + templates/specsheet/styles.css | 274 +++++++++++ templates/swiss-airy/index.tsx | 176 +++++++ templates/swiss-airy/meta.ts | 12 + templates/swiss-airy/styles.css | 314 ++++++++++++ templates/swiss-graphite/index.tsx | 222 +++++++++ templates/swiss-graphite/meta.ts | 12 + templates/swiss-graphite/styles.css | 325 +++++++++++++ templates/swiss-mirror/index.tsx | 223 +++++++++ templates/swiss-mirror/meta.ts | 12 + templates/swiss-mirror/styles.css | 337 +++++++++++++ templates/swiss-rose/index.tsx | 228 +++++++++ templates/swiss-rose/meta.ts | 12 + templates/swiss-rose/styles.css | 350 +++++++++++++ templates/swiss/index.tsx | 224 +++++++++ templates/swiss/meta.ts | 12 + templates/swiss/styles.css | 321 ++++++++++++ templates/terminal-amber/index.tsx | 236 +++++++++ templates/terminal-amber/meta.ts | 11 + templates/terminal-amber/styles.css | 345 +++++++++++++ templates/terminal-green/index.tsx | 235 +++++++++ templates/terminal-green/meta.ts | 11 + templates/terminal-green/styles.css | 333 +++++++++++++ templates/terminal-prompt/index.tsx | 260 ++++++++++ templates/terminal-prompt/meta.ts | 12 + templates/terminal-prompt/styles.css | 304 ++++++++++++ templates/terminal-tabular/index.tsx | 287 +++++++++++ templates/terminal-tabular/meta.ts | 12 + templates/terminal-tabular/styles.css | 255 ++++++++++ templates/terminal/index.tsx | 234 +++++++++ templates/terminal/meta.ts | 12 + templates/terminal/styles.css | 333 +++++++++++++ templates/traditional-divider/index.tsx | 173 +++++++ templates/traditional-divider/meta.ts | 12 + templates/traditional-divider/styles.css | 326 +++++++++++++ templates/traditional-mono/index.tsx | 181 +++++++ templates/traditional-mono/meta.ts | 13 + templates/traditional-mono/styles.css | 344 +++++++++++++ templates/traditional-tight/index.tsx | 176 +++++++ templates/traditional-tight/meta.ts | 12 + templates/traditional-tight/styles.css | 334 +++++++++++++ templates/traditional-warm/index.tsx | 173 +++++++ templates/traditional-warm/meta.ts | 12 + templates/traditional-warm/styles.css | 323 ++++++++++++ templates/traditional/index.tsx | 173 +++++++ templates/traditional/meta.ts | 12 + templates/traditional/styles.css | 317 ++++++++++++ 303 files changed, 55374 insertions(+), 11 deletions(-) create mode 100644 templates/academic-cv/index.tsx create mode 100644 templates/academic-cv/meta.ts create mode 100644 templates/academic-cv/styles.css create mode 100644 templates/academic-lmr/index.tsx create mode 100644 templates/academic-lmr/meta.ts create mode 100644 templates/academic-lmr/styles.css create mode 100644 templates/academic-tight/index.tsx create mode 100644 templates/academic-tight/meta.ts create mode 100644 templates/academic-tight/styles.css create mode 100644 templates/academic-twocol/index.tsx create mode 100644 templates/academic-twocol/meta.ts create mode 100644 templates/academic-twocol/styles.css create mode 100644 templates/academic/index.tsx create mode 100644 templates/academic/meta.ts create mode 100644 templates/academic/styles.css create mode 100644 templates/architect-blueprint/index.tsx create mode 100644 templates/architect-blueprint/meta.ts create mode 100644 templates/architect-blueprint/styles.css create mode 100644 templates/architect-elevation/index.tsx create mode 100644 templates/architect-elevation/meta.ts create mode 100644 templates/architect-elevation/styles.css create mode 100644 templates/architect-section/index.tsx create mode 100644 templates/architect-section/meta.ts create mode 100644 templates/architect-section/styles.css create mode 100644 templates/architect-tabular/index.tsx create mode 100644 templates/architect-tabular/meta.ts create mode 100644 templates/architect-tabular/styles.css create mode 100644 templates/architect/index.tsx create mode 100644 templates/architect/meta.ts create mode 100644 templates/architect/styles.css create mode 100644 templates/banker-burgundy/index.tsx create mode 100644 templates/banker-burgundy/meta.ts create mode 100644 templates/banker-burgundy/styles.css create mode 100644 templates/banker-letterhead/index.tsx create mode 100644 templates/banker-letterhead/meta.ts create mode 100644 templates/banker-letterhead/styles.css create mode 100644 templates/banker-monogram/index.tsx create mode 100644 templates/banker-monogram/meta.ts create mode 100644 templates/banker-monogram/styles.css create mode 100644 templates/banker-twocol/index.tsx create mode 100644 templates/banker-twocol/meta.ts create mode 100644 templates/banker-twocol/styles.css create mode 100644 templates/banker/index.tsx create mode 100644 templates/banker/meta.ts create mode 100644 templates/banker/styles.css create mode 100644 templates/brutalist-grid/index.tsx create mode 100644 templates/brutalist-grid/meta.ts create mode 100644 templates/brutalist-grid/styles.css create mode 100644 templates/brutalist-redbar/index.tsx create mode 100644 templates/brutalist-redbar/meta.ts create mode 100644 templates/brutalist-redbar/styles.css create mode 100644 templates/brutalist-stamp/index.tsx create mode 100644 templates/brutalist-stamp/meta.ts create mode 100644 templates/brutalist-stamp/styles.css create mode 100644 templates/brutalist-strip/index.tsx create mode 100644 templates/brutalist-strip/meta.ts create mode 100644 templates/brutalist-strip/styles.css create mode 100644 templates/brutalist/index.tsx create mode 100644 templates/brutalist/meta.ts create mode 100644 templates/brutalist/styles.css create mode 100644 templates/display-cobalt/index.tsx create mode 100644 templates/display-cobalt/meta.ts create mode 100644 templates/display-cobalt/styles.css create mode 100644 templates/display-noir/index.tsx create mode 100644 templates/display-noir/meta.ts create mode 100644 templates/display-noir/styles.css create mode 100644 templates/display-shout/index.tsx create mode 100644 templates/display-shout/meta.ts create mode 100644 templates/display-shout/styles.css create mode 100644 templates/display-stack/index.tsx create mode 100644 templates/display-stack/meta.ts create mode 100644 templates/display-stack/styles.css create mode 100644 templates/display/index.tsx create mode 100644 templates/display/meta.ts create mode 100644 templates/display/styles.css create mode 100644 templates/dossier-archive/index.tsx create mode 100644 templates/dossier-archive/meta.ts create mode 100644 templates/dossier-archive/styles.css create mode 100644 templates/dossier-field/index.tsx create mode 100644 templates/dossier-field/meta.ts create mode 100644 templates/dossier-field/styles.css create mode 100644 templates/dossier-redact/index.tsx create mode 100644 templates/dossier-redact/meta.ts create mode 100644 templates/dossier-redact/styles.css create mode 100644 templates/dossier-stamped/index.tsx create mode 100644 templates/dossier-stamped/meta.ts create mode 100644 templates/dossier-stamped/styles.css create mode 100644 templates/dossier/index.tsx create mode 100644 templates/dossier/meta.ts create mode 100644 templates/dossier/styles.css create mode 100644 templates/editorial-condensed/index.tsx create mode 100644 templates/editorial-condensed/meta.ts create mode 100644 templates/editorial-condensed/styles.css create mode 100644 templates/editorial-noir/index.tsx create mode 100644 templates/editorial-noir/meta.ts create mode 100644 templates/editorial-noir/styles.css create mode 100644 templates/editorial-pull/index.tsx create mode 100644 templates/editorial-pull/meta.ts create mode 100644 templates/editorial-pull/styles.css create mode 100644 templates/editorial-vogue/index.tsx create mode 100644 templates/editorial-vogue/meta.ts create mode 100644 templates/editorial-vogue/styles.css create mode 100644 templates/editorial/index.tsx create mode 100644 templates/editorial/meta.ts create mode 100644 templates/editorial/styles.css create mode 100644 templates/executive-deepblue/index.tsx create mode 100644 templates/executive-deepblue/meta.ts create mode 100644 templates/executive-deepblue/styles.css create mode 100644 templates/executive-graphite/index.tsx create mode 100644 templates/executive-graphite/meta.ts create mode 100644 templates/executive-graphite/styles.css create mode 100644 templates/executive-monogram/index.tsx create mode 100644 templates/executive-monogram/meta.ts create mode 100644 templates/executive-monogram/styles.css create mode 100644 templates/executive-rule/index.tsx create mode 100644 templates/executive-rule/meta.ts create mode 100644 templates/executive-rule/styles.css create mode 100644 templates/executive/index.tsx create mode 100644 templates/executive/meta.ts create mode 100644 templates/executive/styles.css create mode 100644 templates/indexcard-classified/index.tsx create mode 100644 templates/indexcard-classified/meta.ts create mode 100644 templates/indexcard-classified/styles.css create mode 100644 templates/indexcard-ruled/index.tsx create mode 100644 templates/indexcard-ruled/meta.ts create mode 100644 templates/indexcard-ruled/styles.css create mode 100644 templates/indexcard-stamp/index.tsx create mode 100644 templates/indexcard-stamp/meta.ts create mode 100644 templates/indexcard-stamp/styles.css create mode 100644 templates/indexcard-tab/index.tsx create mode 100644 templates/indexcard-tab/meta.ts create mode 100644 templates/indexcard-tab/styles.css create mode 100644 templates/indexcard/index.tsx create mode 100644 templates/indexcard/meta.ts create mode 100644 templates/indexcard/styles.css create mode 100644 templates/letterpress-correspondence/index.tsx create mode 100644 templates/letterpress-correspondence/meta.ts create mode 100644 templates/letterpress-correspondence/styles.css create mode 100644 templates/letterpress-cream/index.tsx create mode 100644 templates/letterpress-cream/meta.ts create mode 100644 templates/letterpress-cream/styles.css create mode 100644 templates/letterpress-italics/index.tsx create mode 100644 templates/letterpress-italics/meta.ts create mode 100644 templates/letterpress-italics/styles.css create mode 100644 templates/letterpress-monogram/index.tsx create mode 100644 templates/letterpress-monogram/meta.ts create mode 100644 templates/letterpress-monogram/styles.css create mode 100644 templates/letterpress/index.tsx create mode 100644 templates/letterpress/meta.ts create mode 100644 templates/letterpress/styles.css create mode 100644 templates/magazine-cover/index.tsx create mode 100644 templates/magazine-cover/meta.ts create mode 100644 templates/magazine-cover/styles.css create mode 100644 templates/magazine-issue/index.tsx create mode 100644 templates/magazine-issue/meta.ts create mode 100644 templates/magazine-issue/styles.css create mode 100644 templates/magazine-kicker/index.tsx create mode 100644 templates/magazine-kicker/meta.ts create mode 100644 templates/magazine-kicker/styles.css create mode 100644 templates/magazine-quote/index.tsx create mode 100644 templates/magazine-quote/meta.ts create mode 100644 templates/magazine-quote/styles.css create mode 100644 templates/magazine/index.tsx create mode 100644 templates/magazine/meta.ts create mode 100644 templates/magazine/styles.css create mode 100644 templates/manuscript-folio/index.tsx create mode 100644 templates/manuscript-folio/meta.ts create mode 100644 templates/manuscript-folio/styles.css create mode 100644 templates/manuscript-ornament/index.tsx create mode 100644 templates/manuscript-ornament/meta.ts create mode 100644 templates/manuscript-ornament/styles.css create mode 100644 templates/manuscript-roman/index.tsx create mode 100644 templates/manuscript-roman/meta.ts create mode 100644 templates/manuscript-roman/styles.css create mode 100644 templates/manuscript-script/index.tsx create mode 100644 templates/manuscript-script/meta.ts create mode 100644 templates/manuscript-script/styles.css create mode 100644 templates/manuscript/index.tsx create mode 100644 templates/manuscript/meta.ts create mode 100644 templates/manuscript/styles.css create mode 100644 templates/mirror-block/index.tsx create mode 100644 templates/mirror-block/meta.ts create mode 100644 templates/mirror-block/styles.css create mode 100644 templates/mirror-bold/index.tsx create mode 100644 templates/mirror-bold/meta.ts create mode 100644 templates/mirror-bold/styles.css create mode 100644 templates/mirror-quiet/index.tsx create mode 100644 templates/mirror-quiet/meta.ts create mode 100644 templates/mirror-quiet/styles.css create mode 100644 templates/mirror-stack/index.tsx create mode 100644 templates/mirror-stack/meta.ts create mode 100644 templates/mirror-stack/styles.css create mode 100644 templates/mirror/index.tsx create mode 100644 templates/mirror/meta.ts create mode 100644 templates/mirror/styles.css create mode 100644 templates/newspaper-broadsheet/index.tsx create mode 100644 templates/newspaper-broadsheet/meta.ts create mode 100644 templates/newspaper-broadsheet/styles.css create mode 100644 templates/newspaper-gazette/index.tsx create mode 100644 templates/newspaper-gazette/meta.ts create mode 100644 templates/newspaper-gazette/styles.css create mode 100644 templates/newspaper-times/index.tsx create mode 100644 templates/newspaper-times/meta.ts create mode 100644 templates/newspaper-times/styles.css create mode 100644 templates/newspaper-tribune/index.tsx create mode 100644 templates/newspaper-tribune/meta.ts create mode 100644 templates/newspaper-tribune/styles.css create mode 100644 templates/newspaper/index.tsx create mode 100644 templates/newspaper/meta.ts create mode 100644 templates/newspaper/styles.css create mode 100644 templates/periodical-byline/index.tsx create mode 100644 templates/periodical-byline/meta.ts create mode 100644 templates/periodical-byline/styles.css create mode 100644 templates/periodical-folios/index.tsx create mode 100644 templates/periodical-folios/meta.ts create mode 100644 templates/periodical-folios/styles.css create mode 100644 templates/periodical-running/index.tsx create mode 100644 templates/periodical-running/meta.ts create mode 100644 templates/periodical-running/styles.css create mode 100644 templates/periodical-volume/index.tsx create mode 100644 templates/periodical-volume/meta.ts create mode 100644 templates/periodical-volume/styles.css create mode 100644 templates/periodical/index.tsx create mode 100644 templates/periodical/meta.ts create mode 100644 templates/periodical/styles.css create mode 100644 templates/saas-banner/index.tsx create mode 100644 templates/saas-banner/meta.ts create mode 100644 templates/saas-banner/styles.css create mode 100644 templates/saas-mono/index.tsx create mode 100644 templates/saas-mono/meta.ts create mode 100644 templates/saas-mono/styles.css create mode 100644 templates/saas-teal/index.tsx create mode 100644 templates/saas-teal/meta.ts create mode 100644 templates/saas-teal/styles.css create mode 100644 templates/saas-violet/index.tsx create mode 100644 templates/saas-violet/meta.ts create mode 100644 templates/saas-violet/styles.css create mode 100644 templates/saas/index.tsx create mode 100644 templates/saas/meta.ts create mode 100644 templates/saas/styles.css create mode 100644 templates/specsheet-callout/index.tsx create mode 100644 templates/specsheet-callout/meta.ts create mode 100644 templates/specsheet-callout/styles.css create mode 100644 templates/specsheet-grid/index.tsx create mode 100644 templates/specsheet-grid/meta.ts create mode 100644 templates/specsheet-grid/styles.css create mode 100644 templates/specsheet-rev/index.tsx create mode 100644 templates/specsheet-rev/meta.ts create mode 100644 templates/specsheet-rev/styles.css create mode 100644 templates/specsheet-tab/index.tsx create mode 100644 templates/specsheet-tab/meta.ts create mode 100644 templates/specsheet-tab/styles.css create mode 100644 templates/specsheet/index.tsx create mode 100644 templates/specsheet/meta.ts create mode 100644 templates/specsheet/styles.css create mode 100644 templates/swiss-airy/index.tsx create mode 100644 templates/swiss-airy/meta.ts create mode 100644 templates/swiss-airy/styles.css create mode 100644 templates/swiss-graphite/index.tsx create mode 100644 templates/swiss-graphite/meta.ts create mode 100644 templates/swiss-graphite/styles.css create mode 100644 templates/swiss-mirror/index.tsx create mode 100644 templates/swiss-mirror/meta.ts create mode 100644 templates/swiss-mirror/styles.css create mode 100644 templates/swiss-rose/index.tsx create mode 100644 templates/swiss-rose/meta.ts create mode 100644 templates/swiss-rose/styles.css create mode 100644 templates/swiss/index.tsx create mode 100644 templates/swiss/meta.ts create mode 100644 templates/swiss/styles.css create mode 100644 templates/terminal-amber/index.tsx create mode 100644 templates/terminal-amber/meta.ts create mode 100644 templates/terminal-amber/styles.css create mode 100644 templates/terminal-green/index.tsx create mode 100644 templates/terminal-green/meta.ts create mode 100644 templates/terminal-green/styles.css create mode 100644 templates/terminal-prompt/index.tsx create mode 100644 templates/terminal-prompt/meta.ts create mode 100644 templates/terminal-prompt/styles.css create mode 100644 templates/terminal-tabular/index.tsx create mode 100644 templates/terminal-tabular/meta.ts create mode 100644 templates/terminal-tabular/styles.css create mode 100644 templates/terminal/index.tsx create mode 100644 templates/terminal/meta.ts create mode 100644 templates/terminal/styles.css create mode 100644 templates/traditional-divider/index.tsx create mode 100644 templates/traditional-divider/meta.ts create mode 100644 templates/traditional-divider/styles.css create mode 100644 templates/traditional-mono/index.tsx create mode 100644 templates/traditional-mono/meta.ts create mode 100644 templates/traditional-mono/styles.css create mode 100644 templates/traditional-tight/index.tsx create mode 100644 templates/traditional-tight/meta.ts create mode 100644 templates/traditional-tight/styles.css create mode 100644 templates/traditional-warm/index.tsx create mode 100644 templates/traditional-warm/meta.ts create mode 100644 templates/traditional-warm/styles.css create mode 100644 templates/traditional/index.tsx create mode 100644 templates/traditional/meta.ts create mode 100644 templates/traditional/styles.css diff --git a/.claude/skills/designing-templates/SKILL.md b/.claude/skills/designing-templates/SKILL.md index 6b0b204..1569f06 100644 --- a/.claude/skills/designing-templates/SKILL.md +++ b/.claude/skills/designing-templates/SKILL.md @@ -68,7 +68,7 @@ A template that renders a plain `
` instead will appear to work, but: Pass the template's root class as `innerClassName`. The inner div is what `useFitToPage` measures and zooms. Don't add `max-width: 210mm` or `margin: 0 auto` to that class - PageFrame's inner div is dynamically sized to `${210 / scale}mm` and any clamp produces an asymmetric gap on the right. -Use the `--page-pad-top` / `--page-pad-bot` CSS variables for inner padding so the toolbar's density / padding sliders can override them: +Use the `--page-pad-top` / `--page-pad-bot` CSS variables for inner padding so the toolbar's padding sliders can override them: ```css .resume-my-template { @@ -76,6 +76,38 @@ Use the `--page-pad-top` / `--page-pad-bot` CSS variables for inner padding so t } ``` +### Density support (mandatory) + +The preview toolbar exposes a density selector with three modes: `tight`, `regular`, `roomy`. The active mode is applied as a class on the page wrapper (`.density-tight` or `.density-roomy`; `regular` is the unstyled default). + +Every template MUST own its density overrides in its **own** `styles.css`, scoped to its root class. Don't put new template overrides into `src/components/stage/stage.css` - that file's existing entries are kept for backward compatibility but new templates own their own behavior so they scale independently. + +The pattern (model after `emerald-twocol` / `minimal-mono` blocks in `stage.css`): + +```css +/* tight - fits more content; reduces type and gaps */ +.density-tight .resume-my-template { + font-size: 9pt; + line-height: 1.45; +} +.density-tight .resume-my-template .entry { margin-bottom: 0.55em; } +.density-tight .resume-my-template ul { margin-top: 0.3em; } +.density-tight .resume-my-template section { margin-top: 0.85em; } +/* …other tight overrides… */ + +/* roomy - opens it up; useful when you have less content */ +.density-roomy .resume-my-template { + font-size: 10pt; + line-height: 1.65; +} +.density-roomy .resume-my-template .entry { margin-bottom: 1.05em; } +.density-roomy .resume-my-template ul { margin-top: 0.5em; } +.density-roomy .resume-my-template section { margin-top: 1.45em; } +/* …other roomy overrides… */ +``` + +Three knobs, in order of leverage: (1) body type size + line-height, (2) structural gaps between entries / groups / sections, (3) inner padding of major regions. You don't need to override every selector — just enough that tight visibly fits more and roomy visibly breathes. + ## Operations ### Create a new template diff --git a/docs/superpowers/specs/2026-05-02-100-templates-design.md b/docs/superpowers/specs/2026-05-02-100-templates-design.md index 17ef90d..9a569f4 100644 --- a/docs/superpowers/specs/2026-05-02-100-templates-design.md +++ b/docs/superpowers/specs/2026-05-02-100-templates-design.md @@ -36,13 +36,14 @@ Every template MUST: 1. Render through ``. No exceptions. 2. Be a no-prop default-exported React component. 3. Use scoped CSS in `styles.css` (root class `.resume-` or a stable prefix). No Tailwind utility classes inside the component. -4. Use `--page-pad-top` / `--page-pad-bot` CSS variables in the root padding declaration. -5. NOT set `max-width: 210mm` or `margin: 0 auto` on the root. -6. NOT redeclare `@page` (lives in `src/styles/print-base.css`). -7. Add `print-color-adjust: exact` to the root if it uses any non-grayscale element. -8. Wrap entry containers with `data-print-entry="true"` (or use `page-break-inside: avoid` in `@media print`). -9. Pass `pnpm typecheck`. -10. Render at `/preview/` without errors. +4. Use `--page-pad-top` / `--page-pad-bot` CSS variables in the root padding declaration so the toolbar's padding sliders work. +5. **Support density.** Each template's `styles.css` MUST include `.density-tight .resume- { ... }` and `.density-roomy .resume- { ... }` override blocks that scope to the template's own root class. Tight reduces type/gaps to fit more content; roomy opens it up. This is owned by the template (not centralized in `stage.css`) so each template scales independently. Override the body type size/line-height, structural gaps, and section paddings — see `src/components/stage/stage.css` for the existing emerald-twocol / minimal-mono examples to model after. +6. NOT set `max-width: 210mm` or `margin: 0 auto` on the root. +7. NOT redeclare `@page` (lives in `src/styles/print-base.css`). +8. Add `print-color-adjust: exact` to the root if it uses any non-grayscale element. +9. Wrap entry containers with `data-print-entry="true"` (or use `page-break-inside: avoid` in `@media print`). +10. Pass `pnpm typecheck`. +11. Render at `/preview/` without errors. ## Placeholder content (consistent across all 100) diff --git a/templates/academic-cv/index.tsx b/templates/academic-cv/index.tsx new file mode 100644 index 0000000..ccd506f --- /dev/null +++ b/templates/academic-cv/index.tsx @@ -0,0 +1,229 @@ +import './styles.css' +import { PageFrame } from '@/components/page-frame/PageFrame' + +export default function AcademicCV() { + return ( + +
+

+ Avery Park +

+
+ Senior Software Engineer, Platform · Coral Labs + + New York, NY · avery@example.com ·{' '} + averypark.dev + +
+
+ +
+

Statement

+

+ I build resilient backend systems and the platforms that run them. I prefer small, + reversible changes and clear interfaces. Software should be boring in production{' '} + and useful to its users. +

+
+ +
+

Appointments

+
+
+
2024–present
+
+
+ Senior Software Engineer, Platform. Coral Labs, New York. +
+
    +
  • + Migrated the events pipeline to a horizontally-sharded Kafka cluster; cut p99 + latency by a factor of three. +
  • +
  • + Owned platform on-call across two quarters; reduced page volume 60% via tighter + alerting and runbooks. +
  • +
  • Mentored four engineers through L4→L5 promotions.
  • +
+
+
+ +
+
2022–2024
+
+
+ Software Engineer II. Coral Labs, New York. +
+
    +
  • + Designed and shipped the billing pipeline (12M events/day on Kafka and Postgres) + from spec through production. +
  • +
  • + Built the internal feature-flag service used across forty-plus microservices. +
  • +
+
+
+ +
+
2020–2022
+
+
+ Software Engineer. Acme Inc., Remote. +
+
    +
  • + Shipped the company’s first public API with rate limiting, OAuth2, and SDKs + in three languages. +
  • +
  • + Migrated the legacy monolith’s auth module to a standalone identity service. +
  • +
  • Cut average build times from 11 min to 90 s.
  • +
+
+
+ +
+
Summer 2018
+
+
+ Software Engineer Intern. Bytework, Remote. +
+
    +
  • + Built an internal log aggregator in Go on top of Kafka. Earned a return offer. +
  • +
+
+
+
+
+ +
+

Education

+
+
+
2014–2018
+
+
+ B.S. in Computer Science. Northern State University. +
+
+ Thesis: “Bounded-staleness reads in geo-distributed key-value stores.” +
+
+
+
+
+ +
+

Publications

+
    +
  1. + 2024. + + Park, A. On the legibility of distributed traces.{' '} + Journal of Observability Studies, 12(4), 213–229. + +
  2. +
  3. + 2023. + + Park, A., & Liang, S. Bounded-staleness reads in sharded key-value stores. In{' '} + Proceedings of the Workshop on Practical Distributed Systems (PDSW ’23) + , 41–52. + +
  4. +
  5. + 2022. + + Park, A. A small note on idempotent retries. SIGOPS Operating Systems Review, + 56(2), 8–11. + +
  6. +
  7. + 2021. + + Park, A. Tinytrace: a minimal OTLP-compatible tracing library. In{' '} + Workshop on Open-Source Observability Tools, 88–94. + +
  8. +
+
+ +
+

Selected Projects

+
+
+
since 2024
+
+
+ Loomroute · Go, OSS. +
+
+ URL routing library used by ~200 small SaaS apps. loomroute.dev. +
+
+
+
+
since 2021
+
+
+ Tinytrace · Rust, OSS. +
+
+ Minimal distributed tracing library — span model, OTLP export, ~3k lines. +
+
+
+
+
+ +
+

Awards

+
+
+
2024
+
+
Coral Labs Engineering Excellence Award.
+
+
+
+
2018
+
+
+ Northern State Univ. Outstanding Thesis in Systems. +
+
+
+
+
+ +
+

Technical Skills

+
+
+
Languages
+
Go, TypeScript, Python, Rust.
+
+
+
Backend
+
Postgres, Redis, Kafka, gRPC.
+
+
+
Frontend
+
React, Next.js, Tailwind, Vite.
+
+
+
Platform
+
AWS, Kubernetes, Docker, Terraform.
+
+
+
+
+ ) +} diff --git a/templates/academic-cv/meta.ts b/templates/academic-cv/meta.ts new file mode 100644 index 0000000..c8626d6 --- /dev/null +++ b/templates/academic-cv/meta.ts @@ -0,0 +1,13 @@ +import type { ResumeTemplateMeta } from '@/lib/template-registry' + +export const meta: ResumeTemplateMeta = { + id: 'academic-cv', + name: 'Academic CV', + description: + 'Publications-forward LaTeX CV. Right-aligned date column, proper hanging-indent reference list, dense typesetting.', + tags: ['academic', 'serif', 'single-column', 'cv', 'publications', 'date-column'], + fonts: { + serif: + "'Computer Modern', 'CMU Serif', 'Latin Modern Roman', 'EB Garamond', Georgia, 'Times New Roman', serif", + }, +} diff --git a/templates/academic-cv/styles.css b/templates/academic-cv/styles.css new file mode 100644 index 0000000..afb0dd6 --- /dev/null +++ b/templates/academic-cv/styles.css @@ -0,0 +1,289 @@ +/* academic-cv — emphasized publications, right-aligned date column. + Each entry uses a left date column (right-aligned) and a body column + that supports a hanging-indent reference list. LaTeX-CV feel. + + Class prefix: .cv- for stable scoping. Root: .resume-academic-cv. */ + +.resume-academic-cv { + --cv-ink: #0f1012; + --cv-fg: #181a1d; + --cv-muted: #4a4d52; + --cv-faint: #8a8d92; + --cv-rule: #0f1012; + --cv-hair: #c9ccd1; + + font-family: + 'Computer Modern', 'CMU Serif', 'Latin Modern Roman', 'EB Garamond', Georgia, 'Times New Roman', + serif; + padding: var(--page-pad-top, 16mm) 18mm var(--page-pad-bot, 16mm); + font-size: 10pt; + line-height: 1.45; + color: var(--cv-fg); + background: white; + font-feature-settings: 'kern', 'liga', 'onum'; + font-variant-numeric: oldstyle-nums; + text-rendering: optimizeLegibility; +} + +.resume-academic-cv a { + color: inherit; + text-decoration: none; +} +.resume-academic-cv a:hover { + text-decoration: underline; +} +.resume-academic-cv em { + font-style: italic; +} +.resume-academic-cv strong { + font-weight: 700; +} + +/* HEAD ---------------------------------------------------------------- */ + +.resume-academic-cv .cv-head { + margin-bottom: 4mm; +} +.resume-academic-cv .cv-name { + margin: 0 0 1.5mm; + font-size: 24pt; + font-weight: 400; + letter-spacing: 0.005em; + line-height: 1.05; + color: var(--cv-ink); +} +.resume-academic-cv .cv-name .cv-last { + font-weight: 700; +} +.resume-academic-cv .cv-meta { + display: flex; + justify-content: space-between; + align-items: baseline; + gap: 1em; + font-size: 9.5pt; + color: var(--cv-muted); + flex-wrap: wrap; +} +.resume-academic-cv .cv-meta-r { + text-align: right; + font-variant-numeric: oldstyle-nums; +} +.resume-academic-cv .cv-headrule { + margin-top: 2.5mm; + border-top: 1px solid var(--cv-rule); + border-bottom: 0.25px solid var(--cv-rule); + height: 2pt; +} + +/* SECTIONS ------------------------------------------------------------ */ + +.resume-academic-cv .cv-section { + margin-top: 5mm; +} +.resume-academic-cv .cv-h2 { + margin: 0 0 2mm; + font-size: 9.5pt; + font-weight: 700; + letter-spacing: 0.18em; + text-transform: uppercase; + font-variant: small-caps; + color: var(--cv-ink); + border-bottom: 0.5px solid var(--cv-ink); + padding-bottom: 1pt; +} + +.resume-academic-cv .cv-prose { + margin: 0; + font-size: 10pt; + line-height: 1.5; + text-wrap: pretty; + text-align: justify; + hyphens: auto; + /* indent prose to match the row body for visual rhythm */ + padding-left: 28mm; +} + +/* ROW LIST (left date column / right body) ---------------------------- */ + +.resume-academic-cv .cv-rowlist { + display: flex; + flex-direction: column; + gap: 2.5mm; +} +.resume-academic-cv .cv-row { + display: grid; + grid-template-columns: 26mm 1fr; + column-gap: 2mm; + align-items: baseline; +} +.resume-academic-cv .cv-row-date { + text-align: right; + font-size: 9.25pt; + color: var(--cv-muted); + white-space: nowrap; + font-variant-numeric: tabular-nums oldstyle-nums; + font-style: italic; + padding-top: 0.5pt; +} +.resume-academic-cv .cv-row-body { + min-width: 0; +} +.resume-academic-cv .cv-row-title { + font-size: 10pt; + color: var(--cv-ink); + /* hanging indent within the body so wrapped role lines align under the role name */ + padding-left: 1.5em; + text-indent: -1.5em; + line-height: 1.42; +} +.resume-academic-cv .cv-sub { + font-size: 9.5pt; + color: var(--cv-fg); + margin-top: 0.5pt; + padding-left: 1.5em; + text-indent: -1.5em; +} + +/* BULLETS ------------------------------------------------------------- */ + +.resume-academic-cv .cv-bullets { + list-style: none; + margin: 1mm 0 0; + padding: 0; +} +.resume-academic-cv .cv-bullets li { + position: relative; + padding-left: 1.4em; + margin: 0.5pt 0; + font-size: 9.75pt; + line-height: 1.45; + text-wrap: pretty; + text-align: justify; + hyphens: auto; +} +.resume-academic-cv .cv-bullets li::before { + content: '\2022'; + position: absolute; + left: 0.4em; + top: 0; + color: var(--cv-fg); +} + +/* PUBLICATIONS — emphasized with proper hanging-indent + date column --- */ + +.resume-academic-cv .cv-section-pubs .cv-h2 { + /* slightly heavier rule to flag importance */ + border-bottom-width: 1.25px; +} + +.resume-academic-cv .cv-refs { + list-style: none; + margin: 0; + padding: 0; + counter-reset: ref; + font-size: 9.75pt; + line-height: 1.5; +} +.resume-academic-cv .cv-refs li { + display: grid; + grid-template-columns: 26mm 1fr; + column-gap: 2mm; + align-items: baseline; + margin: 1.25mm 0; + counter-increment: ref; +} +.resume-academic-cv .cv-ref-date { + text-align: right; + font-size: 9.25pt; + color: var(--cv-muted); + white-space: nowrap; + font-variant-numeric: tabular-nums oldstyle-nums; + font-style: italic; +} +.resume-academic-cv .cv-ref-body { + /* canonical hanging indent — wrapped lines align under the body text */ + text-indent: -1.5em; + padding-left: 1.5em; + text-wrap: pretty; + hyphens: auto; + position: relative; +} +.resume-academic-cv .cv-ref-body::before { + content: '[' counter(ref) ']\00a0'; + font-variant-numeric: tabular-nums; + color: var(--cv-fg); +} + +/* SKILLS -------------------------------------------------------------- */ + +.resume-academic-cv .cv-skills { + margin: 0; + display: flex; + flex-direction: column; + gap: 0.5mm; +} +.resume-academic-cv .cv-skills > div { + display: grid; + grid-template-columns: 26mm 1fr; + column-gap: 2mm; + font-size: 9.75pt; + line-height: 1.45; + align-items: baseline; +} +.resume-academic-cv .cv-skills dt { + text-align: right; + font-variant: small-caps; + font-weight: 700; + letter-spacing: 0.06em; + color: var(--cv-ink); +} +.resume-academic-cv .cv-skills dd { + margin: 0; + color: var(--cv-fg); +} + +/* PRINT --------------------------------------------------------------- */ + +@media print { + .resume-academic-cv .cv-section, + .resume-academic-cv .cv-row, + .resume-academic-cv [data-print-entry='true'] { + page-break-inside: avoid; + break-inside: avoid; + } +} + +/* density support */ +.density-tight .resume-academic-cv { + font-size: 9.25pt; + line-height: 1.36; +} +.density-tight .resume-academic-cv .cv-head { + margin-bottom: 2.8mm; +} +.density-tight .resume-academic-cv .cv-section { + margin-top: 3.5mm; +} +.density-tight .resume-academic-cv .cv-rowlist { + gap: 1.75mm; +} +.density-tight .resume-academic-cv .cv-refs li { + margin: 0.85mm 0; +} + +.density-roomy .resume-academic-cv { + font-size: 10.5pt; + line-height: 1.58; +} +.density-roomy .resume-academic-cv .cv-head { + margin-bottom: 6mm; +} +.density-roomy .resume-academic-cv .cv-section { + margin-top: 7.5mm; +} +.density-roomy .resume-academic-cv .cv-rowlist { + gap: 3.5mm; +} +.density-roomy .resume-academic-cv .cv-refs li { + margin: 1.8mm 0; +} diff --git a/templates/academic-lmr/index.tsx b/templates/academic-lmr/index.tsx new file mode 100644 index 0000000..7e2e798 --- /dev/null +++ b/templates/academic-lmr/index.tsx @@ -0,0 +1,213 @@ +import './styles.css' +import { PageFrame } from '@/components/page-frame/PageFrame' + +export default function AcademicLMR() { + return ( + +
+

Avery Park

+
+ Senior Software Engineer, Platform. Coral Labs, New York, NY. +
+ +
+ + i. Statement + + / + + ii. Appointments + + / + + iii. Education + + / + + iv. Publications + + / + + v. Talks + + / + + vi. Skills + +
+
+ +
+

+ i. Statement +

+

+ I build resilient backend systems and the platforms that run them. I prefer small, + reversible changes and clear interfaces. Software should be boring in production{' '} + and useful to its users. +

+
+ +
+

+ ii. Appointments +

+ +
+
+
+ Senior Software Engineer, Platform · Coral Labs +
+
2024–present
+
+
    +
  • + Migrated the events pipeline to a horizontally-sharded Kafka cluster; cut p99 latency + by a factor of three. +
  • +
  • + Owned platform on-call across two quarters; reduced page volume 60% via tighter + alerting and runbooks. +
  • +
  • Mentored four engineers through L4→L5 promotions.
  • +
+
+ +
+
+
+ Software Engineer II · Coral Labs +
+
2022–2024
+
+
    +
  • + Designed the billing pipeline (12M events/day on Kafka and Postgres) from spec through + production. +
  • +
  • Built the internal feature-flag service used across forty-plus microservices.
  • +
+
+ +
+
+
+ Software Engineer · Acme Inc. +
+
2020–2022
+
+
    +
  • + Shipped the company’s first public API with rate limiting, OAuth2, and SDKs in + three languages. +
  • +
  • + Migrated the legacy monolith’s auth module to a standalone identity service, + unblocking SSO. +
  • +
  • Cut average build times from 11 min to 90 s.
  • +
+
+ +
+
+
+ Software Engineer Intern · Bytework +
+
Summer 2018
+
+
    +
  • Built an internal log aggregator in Go on top of Kafka. Earned a return offer.
  • +
+
+
+ +
+

+ iii. Education +

+
+
+
+ B.S. in Computer Science · Northern State University +
+
2014–2018
+
+
+ Thesis: “Bounded-staleness reads in geo-distributed key-value stores.” +
+
+
+ +
+

+ iv. Publications +

+
    +
  1. + Park, A. (2024). On the legibility of distributed traces.{' '} + Journal of Observability Studies, 12(4), 213–229. +
  2. +
  3. + Park, A., & Liang, S. (2023). Bounded-staleness reads in sharded key-value stores. + In Proc. of the Workshop on Practical Distributed Systems (PDSW ’23), + 41–52. +
  4. +
  5. + Park, A. (2022). A small note on idempotent retries.{' '} + SIGOPS Operating Systems Review, 56(2), 8–11. +
  6. +
+
+ +
+

+ v. Invited Talks +

+
    +
  • + “Boring backends, useful platforms.” NYC Backend Engineering + Meetup. Oct 2024. +
  • +
  • + “Tracing the trace: lessons from Tinytrace.” RustConf observability + track. Sep 2023. +
  • +
+
+ +
+

+ vi. Technical Skills +

+
+
+
Languages
+
Go, TypeScript, Python, Rust.
+
+
+
Backend
+
Postgres, Redis, Kafka, gRPC.
+
+
+
Frontend
+
React, Next.js, Tailwind, Vite.
+
+
+
Platform
+
AWS, Kubernetes, Docker, Terraform.
+
+
+
+
+ ) +} diff --git a/templates/academic-lmr/meta.ts b/templates/academic-lmr/meta.ts new file mode 100644 index 0000000..0fcea91 --- /dev/null +++ b/templates/academic-lmr/meta.ts @@ -0,0 +1,13 @@ +import type { ResumeTemplateMeta } from '@/lib/template-registry' + +export const meta: ResumeTemplateMeta = { + id: 'academic-lmr', + name: 'Academic LMR', + description: + 'Latin-Modern-feel CV. Italic for emphasis, slightly different rhythm. Small Roman-numeraled section index at the top.', + tags: ['academic', 'serif', 'single-column', 'latin-modern', 'cv'], + fonts: { + serif: + "'Latin Modern Roman', 'CMU Serif', 'Computer Modern', 'EB Garamond', Georgia, 'Times New Roman', serif", + }, +} diff --git a/templates/academic-lmr/styles.css b/templates/academic-lmr/styles.css new file mode 100644 index 0000000..d6aea58 --- /dev/null +++ b/templates/academic-lmr/styles.css @@ -0,0 +1,327 @@ +/* academic-lmr — Latin Modern feel CV. + Italic for emphasis throughout. Slightly different rhythm from `academic`: + wider line-height, italic affiliation/role, small Roman-numeral section + index at the top, and Roman numerals on each section heading. + + Class prefix: .lmr- for stable scoping. Root: .resume-academic-lmr. */ + +.resume-academic-lmr { + --lmr-ink: #11131a; + --lmr-fg: #1a1d24; + --lmr-muted: #4d5159; + --lmr-faint: #8a8e96; + --lmr-rule: #11131a; + --lmr-hair: #c8ccd2; + + font-family: + 'Latin Modern Roman', 'CMU Serif', 'Computer Modern', 'EB Garamond', Georgia, 'Times New Roman', + serif; + padding: var(--page-pad-top, 16mm) 18mm var(--page-pad-bot, 16mm); + font-size: 10pt; + line-height: 1.5; + color: var(--lmr-fg); + background: white; + font-feature-settings: 'kern', 'liga', 'onum'; + font-variant-numeric: oldstyle-nums; + text-rendering: optimizeLegibility; +} + +.resume-academic-lmr a { + color: inherit; + text-decoration: none; +} +.resume-academic-lmr a:hover { + text-decoration: underline; +} +.resume-academic-lmr em, +.resume-academic-lmr i { + font-style: italic; +} +.resume-academic-lmr strong { + font-weight: 700; +} + +/* HEAD ---------------------------------------------------------------- */ + +.resume-academic-lmr .lmr-head { + text-align: center; + margin-bottom: 5mm; +} +.resume-academic-lmr .lmr-name { + margin: 0 0 1.5mm; + font-size: 24pt; + font-weight: 500; + letter-spacing: 0.005em; + line-height: 1.05; + color: var(--lmr-ink); +} +.resume-academic-lmr .lmr-affil { + font-size: 10.5pt; + color: var(--lmr-fg); + margin-bottom: 1.5mm; +} +.resume-academic-lmr .lmr-contact { + font-size: 9pt; + color: var(--lmr-muted); + margin-bottom: 3mm; +} +.resume-academic-lmr .lmr-sep { + margin: 0 5px; + color: var(--lmr-faint); +} + +.resume-academic-lmr .lmr-toc { + display: inline-flex; + flex-wrap: wrap; + justify-content: center; + align-items: baseline; + gap: 4px; + font-size: 8.5pt; + color: var(--lmr-muted); + font-style: italic; + padding: 1mm 4mm; + border: 0.5px solid var(--lmr-hair); + border-left: none; + border-right: none; + margin-bottom: 2mm; +} +.resume-academic-lmr .lmr-toc-item { + font-style: italic; +} +.resume-academic-lmr .lmr-toc .lmr-num { + font-style: italic; + font-weight: 500; + color: var(--lmr-ink); + margin-right: 2px; +} +.resume-academic-lmr .lmr-toc-sep { + color: var(--lmr-faint); + margin: 0 4px; + font-style: normal; +} +.resume-academic-lmr .lmr-headrule { + margin-top: 1mm; + border-top: 0.5px solid var(--lmr-rule); +} + +/* SECTIONS ------------------------------------------------------------ */ + +.resume-academic-lmr .lmr-section { + margin-top: 5mm; +} +.resume-academic-lmr .lmr-h2 { + margin: 0 0 2mm; + font-size: 11pt; + font-weight: 500; + font-style: italic; + letter-spacing: 0.005em; + color: var(--lmr-ink); + border-bottom: 0.5px solid var(--lmr-ink); + padding-bottom: 1pt; +} +.resume-academic-lmr .lmr-rom { + font-style: italic; + font-weight: 500; + color: var(--lmr-muted); + margin-right: 6px; + font-variant: small-caps; + letter-spacing: 0.04em; +} + +.resume-academic-lmr .lmr-prose { + margin: 0; + font-size: 10pt; + line-height: 1.55; + text-wrap: pretty; + text-align: justify; + hyphens: auto; +} + +/* ENTRIES ------------------------------------------------------------- */ + +.resume-academic-lmr .lmr-entry { + margin-top: 2.5mm; +} +.resume-academic-lmr .lmr-entry:first-of-type { + margin-top: 0; +} +.resume-academic-lmr .lmr-entry-head { + display: flex; + justify-content: space-between; + align-items: baseline; + gap: 1em; +} +.resume-academic-lmr .lmr-entry-title { + font-size: 10.25pt; + color: var(--lmr-ink); +} +.resume-academic-lmr .lmr-date { + font-size: 9.5pt; + color: var(--lmr-muted); + white-space: nowrap; + font-style: italic; + font-variant-numeric: oldstyle-nums; +} +.resume-academic-lmr .lmr-sub { + font-size: 9.75pt; + color: var(--lmr-fg); + margin-top: 0.5pt; + margin-bottom: 1.5mm; + padding-left: 1.5em; + text-indent: -1.5em; + font-style: italic; +} + +/* BULLETS ------------------------------------------------------------- */ + +.resume-academic-lmr .lmr-bullets { + list-style: none; + margin: 1mm 0 0; + padding: 0; +} +.resume-academic-lmr .lmr-bullets li { + position: relative; + padding-left: 1.5em; + margin: 0.5pt 0; + font-size: 9.75pt; + line-height: 1.5; + text-wrap: pretty; + text-align: justify; + hyphens: auto; +} +.resume-academic-lmr .lmr-bullets li::before { + content: '\2014'; + position: absolute; + left: 0; + top: 0; + color: var(--lmr-fg); +} + +/* PUBLICATIONS / REFERENCES ------------------------------------------- */ + +.resume-academic-lmr .lmr-refs { + list-style: none; + margin: 0; + padding: 0; + counter-reset: ref; + font-size: 9.75pt; + line-height: 1.5; +} +.resume-academic-lmr .lmr-refs li { + position: relative; + padding-left: 1.6em; + margin: 1mm 0; + text-wrap: pretty; + hyphens: auto; + counter-increment: ref; +} +.resume-academic-lmr .lmr-refs li::before { + content: counter(ref) '.'; + position: absolute; + left: 0; + width: 1.6em; + font-style: italic; + color: var(--lmr-fg); +} + +/* TALKS --------------------------------------------------------------- */ + +.resume-academic-lmr .lmr-talks { + list-style: none; + margin: 0; + padding: 0; + font-size: 9.75pt; + line-height: 1.5; +} +.resume-academic-lmr .lmr-talks li { + position: relative; + padding-left: 1.5em; + margin: 0.5mm 0; +} +.resume-academic-lmr .lmr-talks li::before { + content: '\00B6'; + position: absolute; + left: 0; + color: var(--lmr-muted); +} +.resume-academic-lmr .lmr-mute { + color: var(--lmr-muted); +} + +/* SKILLS -------------------------------------------------------------- */ + +.resume-academic-lmr .lmr-skills { + margin: 0; + display: flex; + flex-direction: column; + gap: 0.5mm; +} +.resume-academic-lmr .lmr-skills > div { + display: grid; + grid-template-columns: 26mm 1fr; + column-gap: 4mm; + font-size: 9.75pt; + line-height: 1.5; + align-items: baseline; +} +.resume-academic-lmr .lmr-skills dt { + font-style: italic; + font-weight: 500; + color: var(--lmr-ink); +} +.resume-academic-lmr .lmr-skills dd { + margin: 0; + color: var(--lmr-fg); +} + +/* PRINT --------------------------------------------------------------- */ + +@media print { + .resume-academic-lmr .lmr-section, + .resume-academic-lmr .lmr-entry, + .resume-academic-lmr [data-print-entry='true'] { + page-break-inside: avoid; + break-inside: avoid; + } +} + +/* density support */ +.density-tight .resume-academic-lmr { + font-size: 9.25pt; + line-height: 1.42; +} +.density-tight .resume-academic-lmr .lmr-head { + margin-bottom: 3.5mm; +} +.density-tight .resume-academic-lmr .lmr-section { + margin-top: 3.5mm; +} +.density-tight .resume-academic-lmr .lmr-entry { + margin-top: 1.75mm; +} +.density-tight .resume-academic-lmr .lmr-refs li { + margin: 0.6mm 0; +} +.density-tight .resume-academic-lmr .lmr-talks li { + margin: 0.3mm 0; +} + +.density-roomy .resume-academic-lmr { + font-size: 10.5pt; + line-height: 1.62; +} +.density-roomy .resume-academic-lmr .lmr-head { + margin-bottom: 7mm; +} +.density-roomy .resume-academic-lmr .lmr-section { + margin-top: 7.5mm; +} +.density-roomy .resume-academic-lmr .lmr-entry { + margin-top: 3.5mm; +} +.density-roomy .resume-academic-lmr .lmr-refs li { + margin: 1.6mm 0; +} +.density-roomy .resume-academic-lmr .lmr-talks li { + margin: 1mm 0; +} diff --git a/templates/academic-tight/index.tsx b/templates/academic-tight/index.tsx new file mode 100644 index 0000000..24dfd65 --- /dev/null +++ b/templates/academic-tight/index.tsx @@ -0,0 +1,185 @@ +import './styles.css' +import { PageFrame } from '@/components/page-frame/PageFrame' + +export default function AcademicTight() { + return ( + +
+
+
+

Avery Park

+
Senior Software Engineer, Platform · Coral Labs.
+
+
+
avery@example.com
+
New York, NY
+ + +
+
+
+ +
+

Summary

+

+ I build resilient backend systems and the platforms that run them. I prefer small, + reversible changes and clear interfaces. Software should be boring in production{' '} + and useful to its users. +

+
+ +
+

Appointments

+ +
+
+
+ Senior Software Engineer, Platform. Coral Labs, New York. +
+
2024–present
+
+
    +
  • + Led migration of the events pipeline to a sharded Kafka cluster; cut p99 latency 3x. +
  • +
  • Owned platform on-call; reduced pages 60% via tighter alerting and runbooks.
  • +
  • Mentored four engineers through L4→L5 promotions.
  • +
+
+ +
+
+
+ Software Engineer II. Coral Labs, New York. +
+
2022–2024
+
+
    +
  • Designed billing pipeline (12M events/day, Kafka + Postgres) from spec to prod.
  • +
  • Built feature-flag service used across 40+ microservices.
  • +
+
+ +
+
+
+ Software Engineer. Acme Inc., Remote. +
+
2020–2022
+
+
    +
  • Shipped first public API; rate limiting, OAuth2, SDKs in three languages.
  • +
  • Migrated monolith auth to a standalone identity service, unblocking SSO.
  • +
  • Cut average build times from 11 min to 90 s.
  • +
+
+ +
+
+
+ Software Engineer Intern. Bytework, Remote. +
+
2018
+
+
    +
  • Built an internal log aggregator in Go on top of Kafka. Earned a return offer.
  • +
+
+
+ +
+

Education

+
+
+
+ B.S. in Computer Science. Northern State University. +
+
2014–2018
+
+
+ Thesis: “Bounded-staleness reads in geo-distributed key-value stores.” +
+
+
+ +
+

Publications

+
    +
  1. + Park, A. (2024). On the legibility of distributed traces.{' '} + Journal of Observability Studies, 12(4), 213–229. +
  2. +
  3. + Park, A., & Liang, S. (2023). Bounded-staleness reads in sharded key-value stores. + In Proc. of the Workshop on Practical Distributed Systems (PDSW ’23), + 41–52. +
  4. +
  5. + Park, A. (2022). A small note on idempotent retries.{' '} + SIGOPS Operating Systems Review, 56(2), 8–11. +
  6. +
  7. + Park, A. (2021). Tinytrace: a minimal OTLP-compatible tracing library. In{' '} + Workshop on Open-Source Observability Tools, 88–94. +
  8. +
  9. + Park, A., & Reyes, M. (2020). Sharded counters for billing pipelines.{' '} + USENIX ;login:, 45(3), 12–15. +
  10. +
+
+ +
+

Selected Projects

+
+ Loomroute · Go, OSS. URL routing library used by ~200 + small SaaS apps. Live since 2024. loomroute.dev +
+
+ Tinytrace · Rust, OSS. Minimal distributed tracing + library — span model, OTLP export, ~3k lines.{' '} + github.com/averypark/tinytrace +
+
+ +
+

Awards & Honors

+
    +
  • + 2024. Coral Labs Engineering Excellence Award. +
  • +
  • + 2018. Northern State Univ. Outstanding Thesis in Systems. +
  • +
+
+ +
+

Technical Skills

+
+
+
Languages
+
Go, TypeScript, Python, Rust.
+
+
+
Backend
+
Postgres, Redis, Kafka, gRPC.
+
+
+
Frontend
+
React, Next.js, Tailwind, Vite.
+
+
+
Platform
+
AWS, Kubernetes, Docker, Terraform.
+
+
+
+
+ ) +} diff --git a/templates/academic-tight/meta.ts b/templates/academic-tight/meta.ts new file mode 100644 index 0000000..b2de856 --- /dev/null +++ b/templates/academic-tight/meta.ts @@ -0,0 +1,13 @@ +import type { ResumeTemplateMeta } from '@/lib/template-registry' + +export const meta: ResumeTemplateMeta = { + id: 'academic-tight', + name: 'Academic Tight', + description: + 'Publication-heavy LaTeX CV. Tighter spacing, 9.5pt body, reduced section gaps, hanging-indent reference list.', + tags: ['academic', 'serif', 'single-column', 'tight', 'cv', 'publications'], + fonts: { + serif: + "'Computer Modern', 'CMU Serif', 'Latin Modern Roman', 'EB Garamond', Georgia, 'Times New Roman', serif", + }, +} diff --git a/templates/academic-tight/styles.css b/templates/academic-tight/styles.css new file mode 100644 index 0000000..9391b3e --- /dev/null +++ b/templates/academic-tight/styles.css @@ -0,0 +1,294 @@ +/* academic-tight — publication-heavy LaTeX CV. + Tighter spacing, 9.5pt body, reduced section gaps. Hanging-indent + reference list. Same LaTeX-CM feel via fallback serif. + + Class prefix: .act- for stable scoping. Root: .resume-academic-tight. */ + +.resume-academic-tight { + --act-ink: #0f1012; + --act-fg: #181a1d; + --act-muted: #4a4d52; + --act-faint: #8a8d92; + --act-rule: #0f1012; + --act-hair: #c9ccd1; + + font-family: + 'Computer Modern', 'CMU Serif', 'Latin Modern Roman', 'EB Garamond', Georgia, 'Times New Roman', + serif; + padding: var(--page-pad-top, 14mm) 16mm var(--page-pad-bot, 14mm); + font-size: 9.5pt; + line-height: 1.36; + color: var(--act-fg); + background: white; + font-feature-settings: 'kern', 'liga', 'onum'; + font-variant-numeric: oldstyle-nums; + text-rendering: optimizeLegibility; +} + +.resume-academic-tight a { + color: inherit; + text-decoration: none; +} +.resume-academic-tight a:hover { + text-decoration: underline; +} +.resume-academic-tight em { + font-style: italic; +} +.resume-academic-tight strong { + font-weight: 700; +} + +/* HEAD ---------------------------------------------------------------- */ + +.resume-academic-tight .act-head { + margin-bottom: 3mm; +} +.resume-academic-tight .act-head-row { + display: grid; + grid-template-columns: 1fr auto; + gap: 6mm; + align-items: end; +} +.resume-academic-tight .act-name { + margin: 0 0 0.5mm; + font-size: 19pt; + font-weight: 700; + letter-spacing: 0; + line-height: 1.05; + color: var(--act-ink); +} +.resume-academic-tight .act-affil { + font-size: 9.5pt; + color: var(--act-fg); +} +.resume-academic-tight .act-head-r { + font-size: 8.5pt; + color: var(--act-muted); + text-align: right; + line-height: 1.4; + font-variant-numeric: tabular-nums oldstyle-nums; +} +.resume-academic-tight .act-rule { + margin-top: 2.5mm; + border-top: 0.5px solid var(--act-rule); +} + +/* SECTIONS ------------------------------------------------------------ */ + +.resume-academic-tight .act-section { + margin-top: 3mm; +} +.resume-academic-tight .act-h2 { + margin: 0 0 1.25mm; + font-size: 9pt; + font-weight: 700; + letter-spacing: 0.16em; + text-transform: uppercase; + font-variant: small-caps; + color: var(--act-ink); + border-bottom: 0.5px solid var(--act-ink); + padding-bottom: 0.5pt; +} + +.resume-academic-tight .act-prose { + margin: 0; + font-size: 9.5pt; + line-height: 1.42; + text-wrap: pretty; + text-align: justify; + hyphens: auto; +} + +/* ENTRIES ------------------------------------------------------------- */ + +.resume-academic-tight .act-entry { + margin-top: 1.25mm; +} +.resume-academic-tight .act-entry:first-of-type { + margin-top: 0; +} +.resume-academic-tight .act-entry-head { + display: flex; + justify-content: space-between; + align-items: baseline; + gap: 1em; + font-size: 9.5pt; +} +.resume-academic-tight .act-entry-head > div:first-child { + padding-left: 1.5em; + text-indent: -1.5em; +} +.resume-academic-tight .act-date { + font-size: 9pt; + color: var(--act-muted); + white-space: nowrap; + font-variant-numeric: tabular-nums oldstyle-nums; +} +.resume-academic-tight .act-sub { + font-size: 9.25pt; + color: var(--act-fg); + margin-top: 0.25mm; + padding-left: 1.5em; + text-indent: -1.5em; +} + +/* BULLETS ------------------------------------------------------------- */ + +.resume-academic-tight .act-bullets { + list-style: none; + margin: 0.5mm 0 0; + padding: 0; +} +.resume-academic-tight .act-bullets li { + position: relative; + padding-left: 1.4em; + margin: 0; + font-size: 9.25pt; + line-height: 1.4; + text-wrap: pretty; + text-align: justify; + hyphens: auto; +} +.resume-academic-tight .act-bullets li::before { + content: '\2022'; + position: absolute; + left: 0.4em; + top: 0; + color: var(--act-fg); +} + +/* PUBLICATIONS / REFERENCES ------------------------------------------- */ + +.resume-academic-tight .act-refs { + list-style: none; + margin: 0; + padding: 0; + counter-reset: ref; + font-size: 9.25pt; + line-height: 1.4; +} +.resume-academic-tight .act-refs li { + position: relative; + padding-left: 1.6em; + text-indent: 0; + margin: 0.5mm 0; + text-wrap: pretty; + hyphens: auto; + counter-increment: ref; +} +.resume-academic-tight .act-refs li::before { + content: '[' counter(ref) ']'; + position: absolute; + left: 0; + top: 0; + width: 1.6em; + font-variant-numeric: tabular-nums; + color: var(--act-fg); +} + +/* PROJECTS ------------------------------------------------------------ */ + +.resume-academic-tight .act-proj { + margin: 0.5mm 0; + font-size: 9.25pt; + line-height: 1.4; + padding-left: 1.5em; + text-indent: -1.5em; +} +.resume-academic-tight .act-proj-url { + color: var(--act-muted); +} + +/* AWARDS -------------------------------------------------------------- */ + +.resume-academic-tight .act-awards { + list-style: none; + margin: 0; + padding: 0; + font-size: 9.25pt; + line-height: 1.4; +} +.resume-academic-tight .act-awards li { + padding-left: 1.5em; + text-indent: -1.5em; + margin: 0.25mm 0; +} + +/* SKILLS -------------------------------------------------------------- */ + +.resume-academic-tight .act-skills { + margin: 0; + display: flex; + flex-direction: column; +} +.resume-academic-tight .act-skills > div { + display: grid; + grid-template-columns: 22mm 1fr; + column-gap: 3mm; + font-size: 9.25pt; + line-height: 1.4; + align-items: baseline; +} +.resume-academic-tight .act-skills dt { + font-variant: small-caps; + font-weight: 700; + letter-spacing: 0.06em; + color: var(--act-ink); +} +.resume-academic-tight .act-skills dd { + margin: 0; + color: var(--act-fg); +} + +/* PRINT --------------------------------------------------------------- */ + +@media print { + .resume-academic-tight .act-section, + .resume-academic-tight .act-entry, + .resume-academic-tight [data-print-entry='true'] { + page-break-inside: avoid; + break-inside: avoid; + } +} + +/* density support */ +.density-tight .resume-academic-tight { + font-size: 8.75pt; + line-height: 1.3; +} +.density-tight .resume-academic-tight .act-head { + margin-bottom: 2mm; +} +.density-tight .resume-academic-tight .act-section { + margin-top: 2mm; +} +.density-tight .resume-academic-tight .act-entry { + margin-top: 0.85mm; +} +.density-tight .resume-academic-tight .act-refs li { + margin: 0.3mm 0; +} +.density-tight .resume-academic-tight .act-awards li { + margin: 0.15mm 0; +} + +.density-roomy .resume-academic-tight { + font-size: 10pt; + line-height: 1.48; +} +.density-roomy .resume-academic-tight .act-head { + margin-bottom: 4mm; +} +.density-roomy .resume-academic-tight .act-section { + margin-top: 4.5mm; +} +.density-roomy .resume-academic-tight .act-entry { + margin-top: 1.85mm; +} +.density-roomy .resume-academic-tight .act-refs li { + margin: 0.85mm 0; +} +.density-roomy .resume-academic-tight .act-awards li { + margin: 0.4mm 0; +} diff --git a/templates/academic-twocol/index.tsx b/templates/academic-twocol/index.tsx new file mode 100644 index 0000000..fbf330b --- /dev/null +++ b/templates/academic-twocol/index.tsx @@ -0,0 +1,216 @@ +import './styles.css' +import { PageFrame } from '@/components/page-frame/PageFrame' + +export default function AcademicTwoCol() { + return ( + +
+
+

Avery Park

+
Senior Software Engineer, Platform · Coral Labs.
+
+ + + +
+
+

Research Statement

+

+ I build resilient backend systems and the platforms that run them. I prefer small, + reversible changes and clear interfaces. Software should be{' '} + boring in production and useful to its users. +

+
+ +
+

Appointments

+ +
+
+
+ Senior Software Engineer, Platform. +
+
2024–present
+
+
+ Coral Labs, New York, NY. +
+
    +
  • + Migrated the events pipeline to a horizontally-sharded Kafka cluster; cut p99 + latency 3x. +
  • +
  • + Owned platform on-call across two quarters; reduced page volume 60% via tighter + alerting and runbooks. +
  • +
  • Mentored four engineers through L4→L5 promotions.
  • +
+
+ +
+
+
+ Software Engineer II. +
+
2022–2024
+
+
+ Coral Labs, New York, NY. +
+
    +
  • + Designed and shipped the billing pipeline (12M events/day, Kafka + Postgres). +
  • +
  • Built the internal feature-flag service used across 40+ microservices.
  • +
+
+ +
+
+
+ Software Engineer. +
+
2020–2022
+
+
+ Acme Inc., Remote. +
+
    +
  • Shipped the company’s first public API with rate limiting and OAuth2.
  • +
  • Migrated the monolith’s auth module to a standalone identity service.
  • +
  • Cut average build times from 11 min to 90 s.
  • +
+
+ +
+
+
+ Software Engineer Intern. +
+
2018
+
+
+ Bytework, Remote. +
+
    +
  • + Built an internal log aggregator in Go on top of Kafka. Earned a return offer. +
  • +
+
+
+ +
+

Publications

+
    +
  1. + Park, A. (2024). On the legibility of distributed traces.{' '} + Journal of Observability Studies, 12(4), 213–229. +
  2. +
  3. + Park, A., & Liang, S. (2023). Bounded-staleness reads in sharded key-value + stores. In Proc. PDSW ’23, 41–52. +
  4. +
  5. + Park, A. (2022). A small note on idempotent retries.{' '} + SIGOPS Operating Systems Review, 56(2), 8–11. +
  6. +
+
+ +
+

Selected Projects

+
+ Loomroute · Go, OSS. URL routing library used by ~200 + small SaaS apps. Live since 2024. +
+
+ Tinytrace · Rust, OSS. Minimal distributed tracing + library — span model, OTLP export, ~3k lines. +
+
+
+
+
+ ) +} diff --git a/templates/academic-twocol/meta.ts b/templates/academic-twocol/meta.ts new file mode 100644 index 0000000..113b14a --- /dev/null +++ b/templates/academic-twocol/meta.ts @@ -0,0 +1,13 @@ +import type { ResumeTemplateMeta } from '@/lib/template-registry' + +export const meta: ResumeTemplateMeta = { + id: 'academic-twocol', + name: 'Academic Two-Column', + description: + 'Two-column LaTeX CV. ~30% sidebar for affiliations, contact, and skills; ~70% main with experience and publications.', + tags: ['academic', 'serif', 'two-column', 'sidebar', 'cv'], + fonts: { + serif: + "'Computer Modern', 'CMU Serif', 'Latin Modern Roman', 'EB Garamond', Georgia, 'Times New Roman', serif", + }, +} diff --git a/templates/academic-twocol/styles.css b/templates/academic-twocol/styles.css new file mode 100644 index 0000000..9b3d15c --- /dev/null +++ b/templates/academic-twocol/styles.css @@ -0,0 +1,332 @@ +/* academic-twocol — two-column LaTeX CV. + ~30% sidebar (affiliations, contact, skills, education, awards) and + ~70% main (research statement, appointments, publications, projects). + Still LaTeX-feel: serif body, small-caps section heads, italic refs. + + Class prefix: .atc- for stable scoping. Root: .resume-academic-twocol. */ + +.resume-academic-twocol { + --atc-ink: #111213; + --atc-fg: #1a1b1d; + --atc-muted: #4a4d52; + --atc-faint: #8a8d92; + --atc-rule: #111213; + --atc-hair: #c9ccd1; + + font-family: + 'Computer Modern', 'CMU Serif', 'Latin Modern Roman', 'EB Garamond', Georgia, 'Times New Roman', + serif; + padding: var(--page-pad-top, 15mm) 16mm var(--page-pad-bot, 15mm); + font-size: 9.75pt; + line-height: 1.42; + color: var(--atc-fg); + background: white; + font-feature-settings: 'kern', 'liga', 'onum'; + font-variant-numeric: oldstyle-nums; + text-rendering: optimizeLegibility; +} + +.resume-academic-twocol a { + color: inherit; + text-decoration: none; +} +.resume-academic-twocol a:hover { + text-decoration: underline; +} +.resume-academic-twocol em { + font-style: italic; +} +.resume-academic-twocol strong { + font-weight: 700; +} + +/* GRID ---------------------------------------------------------------- */ + +.resume-academic-twocol .atc-grid { + display: grid; + grid-template-columns: 30% 1fr; + grid-template-rows: auto 1fr; + grid-template-areas: + 'head head' + 'side main'; + column-gap: 8mm; + width: 100%; +} + +/* HEAD ---------------------------------------------------------------- */ + +.resume-academic-twocol .atc-head { + grid-area: head; + margin-bottom: 4mm; +} +.resume-academic-twocol .atc-name { + margin: 0 0 1mm; + font-size: 22pt; + font-weight: 700; + letter-spacing: 0; + line-height: 1.05; + color: var(--atc-ink); +} +.resume-academic-twocol .atc-affil { + font-size: 10pt; + color: var(--atc-fg); +} +.resume-academic-twocol .atc-headrule { + margin-top: 2.5mm; + border-top: 0.75px solid var(--atc-rule); + border-bottom: 0.5px solid var(--atc-rule); + height: 1.5pt; +} + +/* SIDEBAR ------------------------------------------------------------- */ + +.resume-academic-twocol .atc-side { + grid-area: side; + border-right: 0.5px solid var(--atc-hair); + padding-right: 6mm; + display: flex; + flex-direction: column; + gap: 3.5mm; +} +.resume-academic-twocol .atc-side-section { + font-size: 9pt; + line-height: 1.42; +} +.resume-academic-twocol .atc-h3 { + margin: 0 0 1mm; + font-size: 8.5pt; + font-weight: 700; + letter-spacing: 0.16em; + text-transform: uppercase; + font-variant: small-caps; + color: var(--atc-ink); + border-bottom: 0.5px solid var(--atc-hair); + padding-bottom: 0.5pt; +} + +.resume-academic-twocol .atc-kv { + list-style: none; + margin: 0; + padding: 0; + font-size: 8.75pt; + line-height: 1.5; +} +.resume-academic-twocol .atc-kv li { + display: grid; + grid-template-columns: 8pt 1fr; + column-gap: 4pt; + align-items: baseline; +} +.resume-academic-twocol .atc-k { + font-style: italic; + font-weight: 700; + color: var(--atc-muted); + text-transform: lowercase; +} + +.resume-academic-twocol .atc-list { + list-style: none; + margin: 0; + padding: 0; + font-size: 8.75pt; + line-height: 1.45; +} +.resume-academic-twocol .atc-list li { + margin: 0.5mm 0; + padding-left: 1em; + text-indent: -1em; +} +.resume-academic-twocol .atc-mute { + color: var(--atc-muted); +} + +.resume-academic-twocol .atc-edu { + font-size: 8.75pt; + line-height: 1.45; +} + +.resume-academic-twocol .atc-skills { + margin: 0; + font-size: 8.75pt; + line-height: 1.45; +} +.resume-academic-twocol .atc-skills dt { + font-variant: small-caps; + font-weight: 700; + letter-spacing: 0.06em; + color: var(--atc-ink); + margin-top: 0.5mm; +} +.resume-academic-twocol .atc-skills dd { + margin: 0; + color: var(--atc-fg); +} + +/* MAIN ---------------------------------------------------------------- */ + +.resume-academic-twocol .atc-main { + grid-area: main; + min-width: 0; +} +.resume-academic-twocol .atc-section { + margin-top: 4mm; +} +.resume-academic-twocol .atc-section:first-child { + margin-top: 0; +} +.resume-academic-twocol .atc-h2 { + margin: 0 0 1.5mm; + font-size: 9.5pt; + font-weight: 700; + letter-spacing: 0.18em; + text-transform: uppercase; + font-variant: small-caps; + color: var(--atc-ink); + border-bottom: 0.5px solid var(--atc-ink); + padding-bottom: 0.5pt; +} +.resume-academic-twocol .atc-prose { + margin: 0; + font-size: 9.75pt; + line-height: 1.5; + text-wrap: pretty; + text-align: justify; + hyphens: auto; +} + +.resume-academic-twocol .atc-entry { + margin-top: 2mm; +} +.resume-academic-twocol .atc-entry:first-of-type { + margin-top: 0; +} +.resume-academic-twocol .atc-entry-head { + display: flex; + justify-content: space-between; + align-items: baseline; + gap: 1em; + font-size: 9.75pt; +} +.resume-academic-twocol .atc-date { + font-size: 9pt; + color: var(--atc-muted); + white-space: nowrap; + font-variant-numeric: tabular-nums oldstyle-nums; +} +.resume-academic-twocol .atc-entry-sub { + font-size: 9.5pt; + color: var(--atc-fg); + margin-top: 0.25mm; + margin-bottom: 1mm; + padding-left: 1.5em; + text-indent: -1.5em; +} + +.resume-academic-twocol .atc-bullets { + list-style: none; + margin: 0; + padding: 0; +} +.resume-academic-twocol .atc-bullets li { + position: relative; + padding-left: 1.4em; + margin: 0.25mm 0; + font-size: 9.5pt; + line-height: 1.42; + text-wrap: pretty; + text-align: justify; + hyphens: auto; +} +.resume-academic-twocol .atc-bullets li::before { + content: '\2022'; + position: absolute; + left: 0.4em; + top: 0; + color: var(--atc-fg); +} + +.resume-academic-twocol .atc-refs { + list-style: none; + margin: 0; + padding: 0; + counter-reset: ref; + font-size: 9.5pt; + line-height: 1.42; +} +.resume-academic-twocol .atc-refs li { + position: relative; + padding-left: 1.6em; + margin: 0.5mm 0; + text-wrap: pretty; + hyphens: auto; + counter-increment: ref; +} +.resume-academic-twocol .atc-refs li::before { + content: '[' counter(ref) ']'; + position: absolute; + left: 0; + width: 1.6em; + font-variant-numeric: tabular-nums; + color: var(--atc-fg); +} + +.resume-academic-twocol .atc-proj { + margin: 0.5mm 0; + font-size: 9.5pt; + line-height: 1.42; + padding-left: 1.5em; + text-indent: -1.5em; +} + +/* PRINT --------------------------------------------------------------- */ + +@media print { + .resume-academic-twocol .atc-section, + .resume-academic-twocol .atc-side-section, + .resume-academic-twocol .atc-entry, + .resume-academic-twocol [data-print-entry='true'] { + page-break-inside: avoid; + break-inside: avoid; + } +} + +/* density support */ +.density-tight .resume-academic-twocol { + font-size: 9pt; + line-height: 1.34; +} +.density-tight .resume-academic-twocol .atc-head { + margin-bottom: 2.8mm; +} +.density-tight .resume-academic-twocol .atc-side { + gap: 2.5mm; +} +.density-tight .resume-academic-twocol .atc-section { + margin-top: 2.8mm; +} +.density-tight .resume-academic-twocol .atc-entry { + margin-top: 1.4mm; +} +.density-tight .resume-academic-twocol .atc-refs li { + margin: 0.3mm 0; +} + +.density-roomy .resume-academic-twocol { + font-size: 10.25pt; + line-height: 1.55; +} +.density-roomy .resume-academic-twocol .atc-head { + margin-bottom: 5.5mm; +} +.density-roomy .resume-academic-twocol .atc-side { + gap: 5mm; +} +.density-roomy .resume-academic-twocol .atc-section { + margin-top: 5.5mm; +} +.density-roomy .resume-academic-twocol .atc-entry { + margin-top: 2.8mm; +} +.density-roomy .resume-academic-twocol .atc-refs li { + margin: 0.85mm 0; +} diff --git a/templates/academic/index.tsx b/templates/academic/index.tsx new file mode 100644 index 0000000..25a955c --- /dev/null +++ b/templates/academic/index.tsx @@ -0,0 +1,216 @@ +import './styles.css' +import { PageFrame } from '@/components/page-frame/PageFrame' + +export default function Academic() { + return ( + +
+

Avery Park

+
+ Senior Software Engineer, Platform · Coral Labs · New York, NY +
+
+ avery@example.com + · + + averypark.dev + + · + + github.com/averypark + + · + + in/averypark + +
+
+ +
+

Research Statement

+

+ I build resilient backend systems and the platforms that run them. I prefer small, + reversible changes and clear interfaces. Software should be boring in production{' '} + and useful to its users. +

+
+ +
+

Appointments

+ +
+
+
+ Senior Software Engineer, Platform Team +
+
Mar 2024 – Present
+
+
+ Coral Labs, New York, NY. +
+
    +
  • + Migrated the events pipeline to a horizontally-sharded Kafka cluster; reduced p99 + latency by a factor of three. +
  • +
  • + Owned platform on-call across two quarters; reduced page volume by 60% via tighter + alerting and runbooks. +
  • +
  • Mentored four engineers through L4→L5 promotions.
  • +
+
+ +
+
+
+ Software Engineer II +
+
Aug 2022 – Mar 2024
+
+
+ Coral Labs, New York, NY. +
+
    +
  • + Designed and shipped the billing pipeline (12M events/day on Kafka and Postgres) from + spec through production. +
  • +
  • Built the internal feature-flag service used across forty-plus microservices.
  • +
+
+ +
+
+
+ Software Engineer +
+
Jan 2020 – Jul 2022
+
+
+ Acme Inc., Remote. +
+
    +
  • + Shipped the company’s first public API with rate limiting, OAuth2, and SDKs in + three languages. +
  • +
  • + Migrated the legacy monolith’s auth module to a standalone identity service, + unblocking SSO integrations. +
  • +
  • Cut average build times from 11 min to 90 s via parallelized test matrices.
  • +
+
+ +
+
+
+ Software Engineer Intern +
+
May 2018 – Aug 2018
+
+
+ Bytework, Remote. +
+
    +
  • Built an internal log aggregator in Go on top of Kafka. Earned a return offer.
  • +
+
+
+ +
+

Education

+
+
+
+ B.S. in Computer Science +
+
2014 – 2018
+
+
+ Northern State University. Thesis: “Bounded-staleness reads in + geo-distributed key-value stores.” +
+
+
+ +
+

Publications

+
    +
  1. + Park, A. (2024). On the legibility of distributed traces.{' '} + Journal of Observability Studies, 12(4), 213–229. +
  2. +
  3. + Park, A., & Liang, S. (2023). Bounded-staleness reads in sharded key-value stores. + In{' '} + Proceedings of the Workshop on Practical Distributed Systems (PDSW ’23), + pp. 41–52. +
  4. +
  5. + Park, A. (2022). A small note on idempotent retries.{' '} + SIGOPS Operating Systems Review, 56(2), 8–11. +
  6. +
+
+ +
+

Selected Projects

+
+
+ Loomroute · Go, OSS + loomroute.dev +
+

+ URL routing library used by ~200 small SaaS apps. Live since 2024. +

+
+
+
+ Tinytrace · Rust, OSS + github.com/averypark/tinytrace +
+

+ Minimal distributed tracing library — span model, OTLP export, ~3k lines. +

+
+
+ +
+

Awards

+
    +
  • + Coral Labs Engineering Excellence Award — 2024. +
  • +
  • + Northern State Univ. Outstanding Thesis in Systems — 2018. +
  • +
+
+ +
+

Technical Skills

+
+
+
Languages
+
Go, TypeScript, Python, Rust.
+
+
+
Backend
+
Postgres, Redis, Kafka, gRPC.
+
+
+
Frontend
+
React, Next.js, Tailwind, Vite.
+
+
+
Platform
+
AWS, Kubernetes, Docker, Terraform.
+
+
+
+
+ ) +} diff --git a/templates/academic/meta.ts b/templates/academic/meta.ts new file mode 100644 index 0000000..efb5701 --- /dev/null +++ b/templates/academic/meta.ts @@ -0,0 +1,13 @@ +import type { ResumeTemplateMeta } from '@/lib/template-registry' + +export const meta: ResumeTemplateMeta = { + id: 'academic', + name: 'Academic', + description: + 'LaTeX-CV aesthetic. Dense single column, small-caps section heads with ruled underline, italic journal references, hanging indents.', + tags: ['academic', 'serif', 'single-column', 'dense', 'cv'], + fonts: { + serif: + "'Computer Modern', 'CMU Serif', 'Latin Modern Roman', 'EB Garamond', Georgia, 'Times New Roman', serif", + }, +} diff --git a/templates/academic/styles.css b/templates/academic/styles.css new file mode 100644 index 0000000..a326295 --- /dev/null +++ b/templates/academic/styles.css @@ -0,0 +1,323 @@ +/* academic — base LaTeX-CV aesthetic. + Dense single column. Small-caps section heads with ruled underline. + Italic journal-style references. Hanging indents on multi-line entries. + No chromatic accent. Body in serif (Computer Modern feel via fallback). + + Class prefix: .ac- for stable scoping. Root: .resume-academic. */ + +.resume-academic { + --ac-ink: #111213; + --ac-fg: #1a1b1d; + --ac-muted: #4a4d52; + --ac-faint: #8a8d92; + --ac-rule: #111213; + --ac-hair: #c9ccd1; + + font-family: + 'Computer Modern', 'CMU Serif', 'Latin Modern Roman', 'EB Garamond', Georgia, 'Times New Roman', + serif; + padding: var(--page-pad-top, 16mm) 18mm var(--page-pad-bot, 16mm); + font-size: 10pt; + line-height: 1.42; + color: var(--ac-fg); + background: white; + font-feature-settings: 'kern', 'liga', 'onum'; + font-variant-numeric: oldstyle-nums; + text-rendering: optimizeLegibility; +} + +.resume-academic a { + color: inherit; + text-decoration: none; +} +.resume-academic a:hover { + text-decoration: underline; +} +.resume-academic em, +.resume-academic i { + font-style: italic; +} +.resume-academic strong, +.resume-academic b { + font-weight: 700; +} + +/* HEAD ---------------------------------------------------------------- */ + +.resume-academic .ac-head { + text-align: center; + margin-bottom: 5mm; +} +.resume-academic .ac-name { + margin: 0 0 1.5mm; + font-size: 22pt; + font-weight: 700; + letter-spacing: 0.005em; + line-height: 1.05; + color: var(--ac-ink); +} +.resume-academic .ac-affil { + font-size: 10pt; + color: var(--ac-fg); + margin-bottom: 1mm; +} +.resume-academic .ac-contact { + font-size: 9pt; + color: var(--ac-muted); + letter-spacing: 0.005em; +} +.resume-academic .ac-contact .ac-sep { + margin: 0 4px; + color: var(--ac-faint); +} +.resume-academic .ac-rule { + margin-top: 3.5mm; + border-top: 0.5px solid var(--ac-rule); + border-bottom: 0.5px solid var(--ac-rule); + height: 2.5pt; +} + +/* SECTIONS ------------------------------------------------------------ */ + +.resume-academic .ac-section { + margin-top: 4.5mm; +} +.resume-academic .ac-h2 { + margin: 0 0 2mm; + font-size: 9.5pt; + font-weight: 700; + letter-spacing: 0.18em; + text-transform: uppercase; + font-variant: small-caps; + color: var(--ac-ink); + border-bottom: 0.5px solid var(--ac-ink); + padding-bottom: 1pt; +} + +.resume-academic .ac-prose { + margin: 0; + font-size: 10pt; + line-height: 1.5; + text-wrap: pretty; + text-align: justify; + hyphens: auto; +} + +/* ENTRIES ------------------------------------------------------------- */ + +.resume-academic .ac-entry { + margin-top: 2.5mm; +} +.resume-academic .ac-entry:first-of-type { + margin-top: 0; +} +.resume-academic .ac-entry-head { + display: flex; + justify-content: space-between; + align-items: baseline; + gap: 1em; +} +.resume-academic .ac-entry-title { + font-size: 10pt; + color: var(--ac-ink); + /* hanging indent so wrapped lines align under the role text */ + text-indent: 0; +} +.resume-academic .ac-entry-date { + font-size: 9.5pt; + color: var(--ac-muted); + white-space: nowrap; + font-variant-numeric: tabular-nums oldstyle-nums; +} +.resume-academic .ac-entry-sub { + font-size: 9.75pt; + color: var(--ac-fg); + margin-top: 0.5pt; + margin-bottom: 1.5mm; + /* hanging indent */ + padding-left: 1.5em; + text-indent: -1.5em; +} + +/* BULLETS ------------------------------------------------------------- */ + +.resume-academic .ac-bullets { + list-style: none; + margin: 0; + padding: 0; +} +.resume-academic .ac-bullets li { + position: relative; + padding-left: 1.4em; + margin: 0.5pt 0; + font-size: 9.75pt; + line-height: 1.45; + text-wrap: pretty; + text-align: justify; + hyphens: auto; +} +.resume-academic .ac-bullets li::before { + content: '\2022'; + position: absolute; + left: 0.4em; + top: 0; + color: var(--ac-fg); +} + +/* PUBLICATIONS / REFERENCES ------------------------------------------- */ + +.resume-academic .ac-refs { + list-style: none; + margin: 0; + padding: 0; + counter-reset: ref; + font-size: 9.75pt; + line-height: 1.45; +} +.resume-academic .ac-refs li { + position: relative; + padding-left: 1.6em; + text-indent: 0; + margin: 1mm 0; + text-wrap: pretty; + hyphens: auto; + counter-increment: ref; +} +.resume-academic .ac-refs li::before { + content: '[' counter(ref) ']'; + position: absolute; + left: 0; + top: 0; + width: 1.6em; + font-variant-numeric: tabular-nums; + color: var(--ac-fg); +} + +/* PROJECTS ------------------------------------------------------------ */ + +.resume-academic .ac-proj { + margin-top: 2mm; +} +.resume-academic .ac-proj:first-of-type { + margin-top: 0; +} +.resume-academic .ac-proj-head { + font-size: 10pt; + color: var(--ac-ink); + display: flex; + align-items: baseline; + gap: 6px; +} +.resume-academic .ac-proj-meta { + margin-left: auto; + font-size: 9pt; + color: var(--ac-muted); + font-variant-numeric: tabular-nums; +} +.resume-academic .ac-proj p { + margin: 0.5pt 0 0; + padding-left: 1.5em; + text-indent: -1.5em; + font-size: 9.75pt; + line-height: 1.45; +} + +/* AWARDS -------------------------------------------------------------- */ + +.resume-academic .ac-awards { + list-style: none; + margin: 0; + padding: 0; + font-size: 9.75pt; + line-height: 1.45; +} +.resume-academic .ac-awards li { + position: relative; + padding-left: 1.4em; + margin: 0.5pt 0; +} +.resume-academic .ac-awards li::before { + content: '\2014'; + position: absolute; + left: 0; + color: var(--ac-fg); +} + +/* SKILLS -------------------------------------------------------------- */ + +.resume-academic .ac-skills { + margin: 0; + display: flex; + flex-direction: column; + gap: 0.5mm; +} +.resume-academic .ac-skills > div { + display: grid; + grid-template-columns: 26mm 1fr; + column-gap: 4mm; + font-size: 9.75pt; + line-height: 1.45; + align-items: baseline; +} +.resume-academic .ac-skills dt { + font-variant: small-caps; + font-weight: 700; + letter-spacing: 0.06em; + color: var(--ac-ink); +} +.resume-academic .ac-skills dd { + margin: 0; + color: var(--ac-fg); +} + +/* PRINT --------------------------------------------------------------- */ + +@media print { + .resume-academic .ac-section, + .resume-academic .ac-entry, + .resume-academic [data-print-entry='true'] { + page-break-inside: avoid; + break-inside: avoid; + } +} + +/* density support */ +.density-tight .resume-academic { + font-size: 9.25pt; + line-height: 1.34; +} +.density-tight .resume-academic .ac-head { + margin-bottom: 3.5mm; +} +.density-tight .resume-academic .ac-section { + margin-top: 3.2mm; +} +.density-tight .resume-academic .ac-entry { + margin-top: 1.75mm; +} +.density-tight .resume-academic .ac-refs li { + margin: 0.6mm 0; +} +.density-tight .resume-academic .ac-proj { + margin-top: 1.4mm; +} + +.density-roomy .resume-academic { + font-size: 10.5pt; + line-height: 1.55; +} +.density-roomy .resume-academic .ac-head { + margin-bottom: 7mm; +} +.density-roomy .resume-academic .ac-section { + margin-top: 6.5mm; +} +.density-roomy .resume-academic .ac-entry { + margin-top: 3.5mm; +} +.density-roomy .resume-academic .ac-refs li { + margin: 1.6mm 0; +} +.density-roomy .resume-academic .ac-proj { + margin-top: 3mm; +} diff --git a/templates/architect-blueprint/index.tsx b/templates/architect-blueprint/index.tsx new file mode 100644 index 0000000..8da09c2 --- /dev/null +++ b/templates/architect-blueprint/index.tsx @@ -0,0 +1,246 @@ +import './styles.css' +import { PageFrame } from '@/components/page-frame/PageFrame' + +export default function ArchitectBlueprint() { + return ( + +
+