From 87019379d721a520203a201f66eaee1098ea0c6c Mon Sep 17 00:00:00 2001 From: Errilaz Date: Tue, 19 May 2026 22:33:32 +0200 Subject: [PATCH] feat: cv --- bun.lock | 21 +++- compose.yml | 6 + cv.pdf | Bin 0 -> 100883 bytes package.json | 40 ++++--- scripts/build-cv.sh | 10 ++ scripts/build-cv.ts | 41 +++++++ src/routes/cv.html.ts | 1 + src/ui/CV/CV.ts | 192 ++++++++++++++++++++++++++++++++ src/ui/CV/index.ts | 1 + src/ui/Experience/Experience.ts | 6 +- src/ui/Experience/experience.md | 6 +- src/ui/Home/Home.ts | 21 +++- src/ui/Home/about.md | 29 ----- src/ui/Home/details.md | 5 + src/ui/Home/interests.md | 4 + src/ui/Home/intro.md | 1 + src/ui/Home/skills.md | 8 ++ src/ui/Layout/Theme.ts | 13 +-- src/ui/Tech/Sections.ts | 78 +++++++++++++ src/ui/Tech/Tech.ts | 119 ++++---------------- src/ui/shared/Markdown.ts | 2 +- tsconfig.config.json | 3 +- 22 files changed, 441 insertions(+), 166 deletions(-) create mode 100644 compose.yml create mode 100644 cv.pdf create mode 100755 scripts/build-cv.sh create mode 100644 scripts/build-cv.ts create mode 100644 src/routes/cv.html.ts create mode 100644 src/ui/CV/CV.ts create mode 100644 src/ui/CV/index.ts delete mode 100644 src/ui/Home/about.md create mode 100644 src/ui/Home/details.md create mode 100644 src/ui/Home/interests.md create mode 100644 src/ui/Home/intro.md create mode 100644 src/ui/Home/skills.md create mode 100644 src/ui/Tech/Sections.ts diff --git a/bun.lock b/bun.lock index 9e023f6..a08ed2e 100644 --- a/bun.lock +++ b/bun.lock @@ -5,8 +5,9 @@ "": { "name": "dan", "dependencies": { - "98se.css": "../98se.css", + "98se.css": "/err/98se.css", "@danielx/civet": "^0.11.7", + "@fontsource/roboto-condensed": "^5.2.8", "@hypeup/client": "workspace:*", "@hypeup/lexicon": "workspace:*", "@hypeup/runtime": "workspace:*", @@ -19,6 +20,7 @@ "hypeup": "workspace:*", "oxfmt": "^0.47.0", "oxlint": "^1.62.0", + "playwright": "^1.54.1", }, }, "../../sig/hypeup/packages/babel": { @@ -92,7 +94,6 @@ "@webref/elements": "^2.7.1", "css-tree": "^3.2.1", "html-tags": "^5.1.0", - "known-css-properties": "^0.37.0", }, "devDependencies": { "@types/bun": "^1.3.13", @@ -158,7 +159,7 @@ }, }, "packages": { - "98se.css": ["98.css@file:../98se.css", { "devDependencies": { "chokidar": "^3.3.1", "cssnano": "^5.0.1", "dedent": "^0.7.0", "ejs": "^3.0.2", "gh-pages": "^2.2.0", "glob": "^7.1.6", "highlight.js": "^10.4.1", "live-server": "^1.2.1", "mkdirp": "^1.0.4", "postcss": "^8.2.12", "postcss-calc": "^7.0.2", "postcss-copy": "^7.1.0", "postcss-css-variables": "^0.14.0", "postcss-inline": "^1.2.0", "postcss-inline-svg": "^4.1.0" } }], + "98se.css": ["98.css@file:../../err/98se.css", { "devDependencies": { "chokidar": "^3.3.1", "cssnano": "^5.0.1", "dedent": "^0.7.0", "ejs": "^3.0.2", "gh-pages": "^2.2.0", "glob": "^7.1.6", "highlight.js": "^10.4.1", "live-server": "^1.2.1", "mkdirp": "^1.0.4", "postcss": "^8.2.12", "postcss-calc": "^7.0.2", "postcss-copy": "^7.1.0", "postcss-css-variables": "^0.14.0", "postcss-inline": "^1.2.0", "postcss-inline-svg": "^4.1.0" } }], "@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], @@ -226,6 +227,8 @@ "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], + "@fontsource/roboto-condensed": ["@fontsource/roboto-condensed@5.2.8", "", {}, "sha512-M2OxXXGJQeif+LhxHjWiCEX3BHIYeZf64CcUTeh9AQFGp7DXo2UAXZiZUUOalVdOiuUtQSIi2CDHLDWFiyoECQ=="], + "@hypeup/babel": ["@hypeup/babel@workspace:../../sig/hypeup/packages/babel"], "@hypeup/client": ["@hypeup/client@workspace:../../sig/hypeup/packages/client"], @@ -610,7 +613,7 @@ "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], - "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], @@ -706,8 +709,6 @@ "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], - "known-css-properties": ["known-css-properties@0.37.0", "", {}, "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ=="], - "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="], @@ -832,6 +833,10 @@ "pinkie-promise": ["pinkie-promise@2.0.1", "", { "dependencies": { "pinkie": "^2.0.0" } }, "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw=="], + "playwright": ["playwright@1.60.0", "", { "dependencies": { "playwright-core": "1.60.0" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA=="], + + "playwright-core": ["playwright-core@1.60.0", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA=="], + "posix-character-classes": ["posix-character-classes@0.1.1", "", {}, "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg=="], "postcss": ["postcss@8.5.14", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg=="], @@ -1070,6 +1075,8 @@ "base/define-property": ["define-property@1.0.0", "", { "dependencies": { "is-descriptor": "^1.0.0" } }, "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA=="], + "chokidar/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "class-utils/define-property": ["define-property@0.2.5", "", { "dependencies": { "is-descriptor": "^0.1.0" } }, "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA=="], "connect/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], @@ -1174,6 +1181,8 @@ "unset-value/has-value": ["has-value@0.3.1", "", { "dependencies": { "get-value": "^2.0.3", "has-values": "^0.1.4", "isobject": "^2.0.0" } }, "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q=="], + "vite/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "accepts/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], "class-utils/define-property/is-descriptor": ["is-descriptor@0.1.8", "", { "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" } }, "sha512-SceYGWXvdqlWa/OnQ5FQuV+NxvNmMRhMw/w9AHkH71hTzveND4BTYgvp16g+oITK47qbOl/3D0bl0iygehWAWQ=="], diff --git a/compose.yml b/compose.yml new file mode 100644 index 0000000..5b38bc3 --- /dev/null +++ b/compose.yml @@ -0,0 +1,6 @@ +name: da.nfin.ch +services: + printer: + image: gotenberg/gotenberg:8 + ports: + - "3000:3000" diff --git a/cv.pdf b/cv.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8a65280526eff3f3aa74bfd558c7f0b5a4017e0c GIT binary patch literal 100883 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

Ol+pV?+E1o0&m983T0(XsJ!=BXi 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 bM}RmwnL9W!;y(Z(8Y6M6U$3gE#__)ZCe8sm literal 0 HcmV?d00001 diff --git a/package.json b/package.json index dbe1664..7758486 100644 --- a/package.json +++ b/package.json @@ -2,13 +2,6 @@ "name": "da.nfin.ch", "private": true, "type": "module", - "devDependencies": { - "@types/bun": "^1.3.13", - "@typescript/native-preview": "beta", - "oxfmt": "^0.47.0", - "oxlint": "^1.62.0", - "hypeup": "workspace:*" - }, "license": "MIT", "author": { "name": "Sigitex", @@ -18,31 +11,42 @@ "type": "git", "url": "git+https://github.com/sigitex/da.nfin.ch.git" }, + "files": [ + "src" + ], "scripts": { "check": "tsgo --build", "test": "bun test --pass-with-no-tests --tsconfig-override tsconfig.test.json", "lint": "oxlint", "start": "hypeup generate --watch", - "build": "hypeup generate", - "publish:main": "rsync -avz --delete dist/ da.nfin.ch:~/da.nfin.ch", + "build": "bun run build:site && bun run build:cv", + "build:site": "hypeup generate", + "build:cv": "bun scripts/build-cv.ts", + "publish:site": "rsync -avz --delete dist/ da.nfin.ch:~/da.nfin.ch", "publish:errilaz": "rsync -avz --delete errilaz.org/ da.nfin.ch:~/errilaz.org", - "publish": "bun run publish:main && bun run publish:errilaz" - }, - "files": [ - "src" - ], - "workspaces": { - "packages": [ - "/sig/hypeup/packages/*" - ] + "publish": "bun run publish:site && bun run publish:errilaz" }, "dependencies": { "98se.css": "/err/98se.css", "@danielx/civet": "^0.11.7", + "@fontsource/roboto-condensed": "^5.2.8", "@hypeup/client": "workspace:*", "@hypeup/lexicon": "workspace:*", "@hypeup/runtime": "workspace:*", "marked": "^18.0.3", "marked-gfm-heading-id": "^4.1.4" + }, + "devDependencies": { + "@types/bun": "^1.3.13", + "@typescript/native-preview": "beta", + "oxfmt": "^0.47.0", + "oxlint": "^1.62.0", + "hypeup": "workspace:*", + "playwright": "^1.54.1" + }, + "workspaces": { + "packages": [ + "/sig/hypeup/packages/*" + ] } } diff --git a/scripts/build-cv.sh b/scripts/build-cv.sh new file mode 100755 index 0000000..722196e --- /dev/null +++ b/scripts/build-cv.sh @@ -0,0 +1,10 @@ +#!/bin/bash +mkdir -p dist +thorium-browser \ + --headless=new \ + --no-sandbox \ + --disable-gpu \ + --virtual-time-budget=5000 \ + --align-pdf-default-print-settings-with-html \ + --print-to-pdf="dist/cv.pdf" \ + "http://localhost:5173/cv" diff --git a/scripts/build-cv.ts b/scripts/build-cv.ts new file mode 100644 index 0000000..32d8cdf --- /dev/null +++ b/scripts/build-cv.ts @@ -0,0 +1,41 @@ +#!/usr/bin/env bun +import { mkdir } from "node:fs/promises" +import { dirname } from "node:path" +import { chromium } from "playwright" + +const url = "file:///finch/da.nfin.ch/dist/cv.html" +const output = "dist/cv.pdf" + +await mkdir(dirname(output), { recursive: true }) + +const executablePath = + process.env.CHROMIUM_PATH ?? + Bun.which("thorium-browser") ?? + Bun.which("chromium") ?? + Bun.which("chromium-browser") ?? + Bun.which("google-chrome") ?? + undefined + +const browser = await chromium.launch({ + executablePath, + headless: true, + args: ["--no-sandbox", "--disable-gpu"], +}) + +try { + const page = await browser.newPage() + + await page.goto(url, { + waitUntil: "networkidle", + timeout: 30_000, + }) + + await page.pdf({ + path: output, + printBackground: true, + displayHeaderFooter: false, + preferCSSPageSize: true, + }) +} finally { + await browser.close() +} diff --git a/src/routes/cv.html.ts b/src/routes/cv.html.ts new file mode 100644 index 0000000..6584b06 --- /dev/null +++ b/src/routes/cv.html.ts @@ -0,0 +1 @@ +export { default } from "ui/CV" diff --git a/src/ui/CV/CV.ts b/src/ui/CV/CV.ts new file mode 100644 index 0000000..655165a --- /dev/null +++ b/src/ui/CV/CV.ts @@ -0,0 +1,192 @@ +import Reset from "ui/Layout/Reset" +import Markdown from "ui/shared/Markdown" +import intro from "ui/Home/intro.md?raw" +import details from "ui/Home/details.md?raw" +import skills from "ui/Home/skills.md?raw" +import experience from "ui/Experience/experience.md?raw" +import Sections from "ui/Tech/Sections" +import roboto from "@fontsource/roboto-condensed?url" + +const Color = { + backdrop: "#f0f0f0", + edge: "#808080", +} as const + +export default function CV() { + return [ + doctype.html5, + html( + head( + link({ rel: "stylesheet", href: roboto }), + style( + Reset(), + rule.pdf( + display.flex, + width("50px"), + height("50px"), + borderRadius("12px"), + backgroundColor("#345c42"), + color.white, + position.fixed, + top("25px"), + right("25px"), + justifyContent.center, + alignItems.center, + fontWeight.bold, + textDecoration.none, + ), + $page( + prop("size", "auto"), + margin("0 0 0 0"), + padding("0.5in"), + ), + rule(body, [ + fontFamily("Roboto Condensed"), + fontSize("12pt"), + display.flex, + justifyContent.center, + backgroundColor(Color.backdrop), + ]), + $media("print", [ + rule(body, backgroundColor.white), + rule.noprint(display.none), + ]), + rule(main, [ + backgroundColor.white, + width("8.5in"), + display.flex, + justifyContent.center, + paddingBottom("32pt"), + ]), + rule(article, [width("7.0in")]), + rule(header, [ + marginTop("0.5in"), + display.flex, + justifyContent.spaceBetween, + alignItems.flexEnd, + paddingBottom("8pt"), + ]), + rule(h1, fontSize("28pt")), + rule.links( + fontSize("11pt"), + width("2.75in"), + display.flex, + justifyContent.spaceBetween, + alignItems.center, + rule(">div", [ + display.flex, + flexDirection.column, + gap("2pt"), + ]), + ), + rule.contact( + alignItems.flexEnd, + fontSize("12pt"), + ), + rule(section, [ + borderTop(`double 3px ${Color.edge}`), + paddingTop("16pt"), + paddingBottom("16pt"), + ]), + rule(h2, [marginBottom("12pt")]), + rule(p, [marginTop("12pt")]), + rule(ul, [marginTop("12pt")]), + rule(hr, [ + margin("12pt 0"), + borderColor("#f0f0f0"), + ]), + rule(".experience .content h2", [ + fontSize("14pt"), + ]), + rule.expertise( + pageBreakInside.avoid, + rule(ul, marginBottom("12pt")), + rule.blocks(columns(3)), + rule.block( + flex(1), + minWidth("3in"), + breakInside.avoid, + ), + ), + ), + ), + body( + main( + article( + Header(), + About(), + Skills(), + Experience(), + Expertise(), + ), + ), + a.pdf.noprint({ href: "cv.pdf" }, "PDF"), + ), + ), + ] +} + +function Header() { + return header( + h1("Dan Finch"), + div.links( + div.www( + a({ href: "https://da.nfin.ch" }, "Website"), + a( + { href: "https://www.sigitex.com" }, + "Open Source", + ), + a( + { + href: "https://www.linkedin.com/in/danfinch", + }, + "LinkedIn", + ), + ), + div.contact( + a( + { href: "mailto:danfinch@outlook.com" }, + "danfinch@outlook.com", + ), + a({ href: "tel:+436645047583" }, "+43 664 5047583"), + ), + ), + ) +} + +function About() { + return section.about( + h2("About Me"), + Markdown(intro), + Markdown(details), + ) +} + +function Skills() { + return section.skills(h2("Skills"), Markdown(skills)) +} + +function Experience() { + return section.experience( + h2("Experience"), + Markdown(experience), + ) +} + +function Expertise() { + return section.expertise( + h2("Expertise"), + div.blocks( + Skillset("Languages", Sections.languages), + Skillset("Platforms", Sections.platforms), + Skillset("Data", Sections.data), + Skillset("Frontend", Sections.frontend), + Skillset("Backend", Sections.backend), + Skillset("Concepts", Sections.concepts), + ), + ) +} + +function Skillset(name: string, content: string) { + return div.block(h3(name), Markdown(content)) +} diff --git a/src/ui/CV/index.ts b/src/ui/CV/index.ts new file mode 100644 index 0000000..b57d548 --- /dev/null +++ b/src/ui/CV/index.ts @@ -0,0 +1 @@ +export { default } from "./CV" \ No newline at end of file diff --git a/src/ui/Experience/Experience.ts b/src/ui/Experience/Experience.ts index 16ebc81..032fe65 100644 --- a/src/ui/Experience/Experience.ts +++ b/src/ui/Experience/Experience.ts @@ -14,7 +14,11 @@ export default function Experience() { { title }, div( padding("16px"), - Markdown(experience), + div.content( + h1("My Experience"), + hr(), + Markdown(experience), + ), ), ), ), diff --git a/src/ui/Experience/experience.md b/src/ui/Experience/experience.md index 7dd493c..1656738 100644 --- a/src/ui/Experience/experience.md +++ b/src/ui/Experience/experience.md @@ -1,7 +1,3 @@ -# My Experience - ---- - ## Dynatrace - Senior Software Engineer > July 2023 - Present (Graz, Austria - Hybrid) @@ -80,7 +76,7 @@ operations, testing, maintenance, and security. - Created complex e-commerce website featuring retail and affiliate marketing management. Owner of dozens of projects within the company. - Configured and managed production web servers including Microsoft IIS and LAMP stack. - Worked closely with DBA on data-driven applications powered by SQL Server 2008 and ADO.NET. -- Analyzed and selected supporting software and services, including early adoption of technologies such as ASP.NET MVC, jQuery, F#, Amazon Web Services, and distributed source control. +- Analyzed and selected supporting software and services, including early adoption of technologies such as ASP.NET MVC, jQuery, F#, AWS, and distributed source control. - Developed solutions using Service Oriented Architecture (SOA), WCF, and Windows services. Integrated software with various cloud data and web service providers, including AWS, Authorize.NET, and Zencoder. - Studied and implemented e-commerce best practices, web security standards, and PCI compliance. diff --git a/src/ui/Home/Home.ts b/src/ui/Home/Home.ts index 80d9042..13eb093 100644 --- a/src/ui/Home/Home.ts +++ b/src/ui/Home/Home.ts @@ -1,6 +1,9 @@ import Layout from "ui/Layout" import Markdown from "ui/shared/Markdown" -import about from "./about.md?raw" +import intro from "./intro.md?raw" +import details from "./details.md?raw" +import skills from "./skills.md?raw" +import interests from "./interests.md?raw" import Window from "ui/Layout/Window" const title = "Dan Finch - About Me" @@ -8,6 +11,20 @@ const title = "Dan Finch - About Me" export default function Home() { return Layout( { title, url: "/" }, - Window({ title }, div(padding("8px"), Markdown(about))), + Window( + { title }, + div.content(padding("8px"), [ + h1("About Me"), + Markdown(intro), + aside.fieldBorderDisabled( + img({ src: "/pfp.jpg", width: "200" }), + ), + Markdown(details), + h2("Skills"), + Markdown(skills), + h2("Interests"), + Markdown(interests), + ]), + ), ) } diff --git a/src/ui/Home/about.md b/src/ui/Home/about.md deleted file mode 100644 index f4427a9..0000000 --- a/src/ui/Home/about.md +++ /dev/null @@ -1,29 +0,0 @@ -# About Me - -I own software end-to-end: building or renewing stacks and evaluating the tools and techniques that will serve the product well. I assist my teams in creating frameworks, automation, standards, and guidance that clear the path to delivering good software and user experiences. I am comfortable working hands-on across code, architecture, UX, and product. - -

- -My first principle is **user experience**. Software is interesting because of what it can do for people, and we all put up with mediocre software every day. This dissatisfaction drives me to set a high standard for our work. - -As a programmer, I've learned to make code **small, simple, and readable**. My aim is prolific and expeditious code output while maintaining quality. I make loosely-coupled components, understandable abstractions, and low-ceremony frameworks. - -As a teammate and leader, I am devoted to **friendliness** and **respect**. I am a good communicator, love sharing my knowledge, and learning from others. I've given talks at local user groups and mentored at work and in my free time. - -## Skills - -- Consciousness of mainstream & emerging technology and trends. -- Quickly vetting and adapting to new technologies - building and improving stacks. -- High standards for great user and developer experiences. -- Interacting directly and empathetically with stakeholders and end users. -- Managing work through all phases of a development cycle. -- Eliminating friction in processes through automation. -- Understanding all the areas of a codebase and recognizing where waste can be reduced. -- Coordinating large, complex upgrades and refactors. - -## Interests - -- Compilers, interpreters & parsers. -- Metaprogramming, language-oriented programming. -- Developer tools - hacking on build tools and bundlers. -- Automating self-hosted cloud tech. diff --git a/src/ui/Home/details.md b/src/ui/Home/details.md new file mode 100644 index 0000000..a6c1cbb --- /dev/null +++ b/src/ui/Home/details.md @@ -0,0 +1,5 @@ +My first principle is **user experience**. Software is interesting because of what it can do for people, and we all put up with mediocre software every day. This dissatisfaction drives me to set a high standard for our work. + +As a programmer, I've learned to make code **small, simple, and readable**. My aim is prolific and expeditious code output while maintaining quality. I make loosely-coupled components, understandable abstractions, and low-ceremony frameworks. + +As a teammate and leader, I am devoted to **friendliness** and **respect**. I am a good communicator, love sharing my knowledge, and learning from others. I've given talks at local user groups and mentored at work and in my free time. \ No newline at end of file diff --git a/src/ui/Home/interests.md b/src/ui/Home/interests.md new file mode 100644 index 0000000..48e4788 --- /dev/null +++ b/src/ui/Home/interests.md @@ -0,0 +1,4 @@ +- Compilers, interpreters & parsers. +- Metaprogramming, language-oriented programming. +- Developer tools - hacking on build tools and bundlers. +- Automating self-hosted cloud tech. \ No newline at end of file diff --git a/src/ui/Home/intro.md b/src/ui/Home/intro.md new file mode 100644 index 0000000..521eb75 --- /dev/null +++ b/src/ui/Home/intro.md @@ -0,0 +1 @@ +I own software end-to-end: building or renewing stacks and evaluating the tools and techniques that will serve the product well. I assist my teams in creating frameworks, automation, standards, and guidance that clear the path to delivering good software and user experiences. I am comfortable working hands-on across code, architecture, UX, and product. \ No newline at end of file diff --git a/src/ui/Home/skills.md b/src/ui/Home/skills.md new file mode 100644 index 0000000..4f83182 --- /dev/null +++ b/src/ui/Home/skills.md @@ -0,0 +1,8 @@ +- Consciousness of mainstream & emerging technology and trends. +- Quickly vetting and adapting to new technologies - building and improving stacks. +- High standards for great user and developer experiences. +- Interacting directly and empathetically with stakeholders and end users. +- Managing work through all phases of a development cycle. +- Eliminating friction in processes through automation. +- Understanding all the areas of a codebase and recognizing where waste can be reduced. +- Coordinating large, complex upgrades and refactors. \ No newline at end of file diff --git a/src/ui/Layout/Theme.ts b/src/ui/Layout/Theme.ts index d4dfc99..b2be678 100644 --- a/src/ui/Layout/Theme.ts +++ b/src/ui/Layout/Theme.ts @@ -17,16 +17,15 @@ export default function Theme() { display.flex, alignItems.center, ]), - rule("h1", fontSize("20px")), - rule("h2", fontSize("16px")), - rule("ul", paddingInlineStart("30px")), - rule( - ".markdown", + rule(h1, fontSize("20px")), + rule(h2, fontSize("16px")), + rule(ul, paddingInlineStart("30px")), + rule.content( textAlign.justify, fontFamily("Arial"), fontSize("14px"), - rule("h1", fontSize("28px")), - rule("h2", fontSize("20px")), + rule(h1, fontSize("28px")), + rule(h2, fontSize("20px")), rule(aside, float.right, marginLeft("20px"), diff --git a/src/ui/Tech/Sections.ts b/src/ui/Tech/Sections.ts new file mode 100644 index 0000000..58f7ec2 --- /dev/null +++ b/src/ui/Tech/Sections.ts @@ -0,0 +1,78 @@ +export default { + languages: ` +- TypeScript +- JavaScript +- C# +- F# +- SQL +`, + platforms: ` +- Node.js +- Deno +- Bun +- HTML + CSS +- Linux +- Electron +- Browser Extensions +- React Native +- .NET Core +- .NET Framework +`, + frontend: ` +- React +- Vite +- Zustand +- Immer +- Webpack +- Parcel +- Emotion +- Styled Components +- Mithril +- Redux +- React Router +- React Query +- Vanilla Extract +- CSS Modules +- SCSS, Stylus, Less +`, + backend: ` +- Express +- Koa +- ASP.NET +- Fastify +- Hapi +- NestJS +- Docker +- Cloudflare +- Firebase +- Supabase +- AWS +- GitHub Actions +`, + data: ` +- Postgres +- Redis +- Sqlite +- MongoDB +- MySQL +- ElasticSearch +- SQL Server +`, + concepts: ` +- Domain-driven design (DDD) +- TDD & BDD +- Unit testing +- E2E testing +- Object-Oriented Programming (OOP) +- Functional Programming (FP) +- SOLID Principles +- REST & Microservices +- CI/CD, Infrastructure as Code +- RDBMS +- NoSQL +- Agile & Scrum +- Unix philosophy +- Responsive design +- IoC & Dependency Injection +`, +} diff --git a/src/ui/Tech/Tech.ts b/src/ui/Tech/Tech.ts index 0ad1b02..f864394 100644 --- a/src/ui/Tech/Tech.ts +++ b/src/ui/Tech/Tech.ts @@ -1,6 +1,7 @@ import Layout from "ui/Layout" import Window from "ui/Layout/Window" import Markdown from "ui/shared/Markdown" +import Sections from "./Sections" const title = "Dan Finch - Tech" @@ -10,18 +11,22 @@ export default function Tech() { Window( { title, flat: true }, div( - display.flex, - flexWrap.wrap, - marginRight("8px"), - paddingBottom("16px"), - gap("8px"), - Skillset("Languages", languages), - Skillset("Platforms", platforms), - Skillset("Frontend", frontend), - Skillset("Backend", backend), - Skillset("Data", data), - Skillset("Cloud / Infra / DevOps", cloud), - Skillset("Methodologies & Concepts", concepts), + [ + display.flex, + flexWrap.wrap, + marginRight("8px"), + paddingBottom("16px"), + gap("8px"), + ], + Skillset("Languages", Sections.languages), + Skillset("Platforms", Sections.platforms), + Skillset("Frontend", Sections.frontend), + Skillset("Backend", Sections.backend), + Skillset("Data", Sections.data), + Skillset( + "Methodologies & Concepts", + Sections.concepts, + ), ), ), ) @@ -29,91 +34,13 @@ export default function Tech() { function Skillset(title: string, markdown: Content) { return div( - flex(1), - minWidth("250px"), - display.flex, - flexDirection.column, + [ + flex(1), + minWidth("250px"), + display.flex, + flexDirection.column, + ], h2(title), div.fieldBorder(flex(1), Markdown(markdown)), ) } - -const languages = ` -- ⭐ TypeScript -- ⭐ JavaScript -- ⭐ C# -- F# -- SQL -` - -const platforms = ` -- ⭐ Node.js / Deno / Bun -- ⭐ HTML + CSS -- ⭐ .NET & .NET Core -- Linux -- Electron -- Browser Extensions -- React Native -- Cloudflare Workers -` - -const frontend = ` -- ⭐ React -- ⭐ Vite -- ⭐ Zustand -- ⭐ Immer -- ⭐ Webpack -- ⭐ Parcel -- ⭐ Emotion / Styled Components -- ⭐ Mithril -- Redux -- React Router -- TanStack Query, React Query -- Vanilla Extract -- SCSS, Stylus, Less, CSS Modules -- Lodash, Immer, RxJS, Kefir -` - -const backend = ` -- ⭐ Express -- ⭐ Koa -- ⭐ ASP.NET -- Fastify -- Hapi -- Nest -` - -const data = ` -- ⭐ Postgres -- ⭐ Redis -- Sqlite -- MongoDB -- MySQL -- ElasticSearch -- SQL Server -` - -const cloud = ` -- Docker -- Cloudflare -- Firebase -- Supabase -- AWS -- GitHub Actions -` - -const concepts = ` -- Domain-driven design (DDD) -- TDD & BDD, unit testing, & E2E testing -- Object-Oriented Programming (OOP) -- Functional Programming (FP) -- SOLID Principles -- REST & Microservices -- CI/CD, Infrastructure as Code -- RDBMS -- NoSQL -- Agile & Scrum -- Unix philosophy -- Responsive design -- IoC & Dependency Injection -` diff --git a/src/ui/shared/Markdown.ts b/src/ui/shared/Markdown.ts index 645de60..d4ac340 100644 --- a/src/ui/shared/Markdown.ts +++ b/src/ui/shared/Markdown.ts @@ -2,7 +2,7 @@ import { Marked } from "marked" import { gfmHeadingId } from "marked-gfm-heading-id" export default function Markdown(md: string) { - return div.markdown(raw(marked.parse(md))) + return div.content(raw(marked.parse(md))) } const marked = new Marked({ gfm: true }) diff --git a/tsconfig.config.json b/tsconfig.config.json index f58033a..eed6a13 100644 --- a/tsconfig.config.json +++ b/tsconfig.config.json @@ -8,7 +8,8 @@ }, "include": [ "*.config.ts", - "*.config.cjs" + "*.config.cjs", + "scripts/*.ts" ], "files": [] }