From 597976b1b888d38c57a30f4dd6a5948af1b63b8a Mon Sep 17 00:00:00 2001 From: garrettmills Date: Thu, 5 Jun 2025 10:20:33 -0400 Subject: [PATCH] Implement logo & favicon generation --- TODO.md | 2 - eleventy.config.js | 1 + favicons.js | 33 +++++ logo.js | 42 ++++++ package.json | 5 +- pnpm-lock.yaml | 221 +++++++++++++++++++++++++++++ src/.gitignore | 2 + src/_includes/.gitignore | 2 + src/_includes/obsidian.pug | 1 + src/assets/logo/.gitignore | 3 + src/assets/logo/favicon/.gitignore | 3 + src/technical.md | 4 +- 12 files changed, 314 insertions(+), 5 deletions(-) create mode 100644 favicons.js create mode 100644 logo.js create mode 100644 src/.gitignore create mode 100644 src/_includes/.gitignore create mode 100644 src/assets/logo/.gitignore create mode 100644 src/assets/logo/favicon/.gitignore diff --git a/TODO.md b/TODO.md index c907746..75887c4 100644 --- a/TODO.md +++ b/TODO.md @@ -1,7 +1,5 @@ -- favicon - world plate blog (separate site) - snippets - blog comments - notes -- technical page content - markmark (+ bookmarks formatting) \ No newline at end of file diff --git a/eleventy.config.js b/eleventy.config.js index f124d09..a71b61e 100644 --- a/eleventy.config.js +++ b/eleventy.config.js @@ -31,6 +31,7 @@ export default function (eleventyConfig) { eleventyConfig.addPlugin(IdAttributePlugin); eleventyConfig.addPlugin(EleventyRenderPlugin); eleventyConfig.addPassthroughCopy("src/assets/**") + eleventyConfig.addPassthroughCopy("src/favicon.ico") eleventyConfig.amendLibrary("md", md => md.use(footnote)) eleventyConfig.addCollection("markmark", async api => { const response = await fetch(`${OUTLINE.url}/documents.info`, { diff --git a/favicons.js b/favicons.js new file mode 100644 index 0000000..728eec7 --- /dev/null +++ b/favicons.js @@ -0,0 +1,33 @@ +import { favicons } from 'favicons' +import fs from 'fs' + +const source = 'src/assets/logo/logo.png' + +const cfg = { + path: 'assets/logo/favicon', + appName: 'Garrett Mills', + appDescription: '', + background: '#111111', + theme_color: '#111111', +} + +// Generate the favicons and metadata: +const res = await favicons(source, cfg) + +// Write out the favicon images: +for ( const img of res.images ) { + fs.writeFileSync(`src/assets/logo/favicon/${img.name}`, img.contents) + + if ( img.name === 'favicon.ico' ) { + // Write the favicon to the root to support older browsers + fs.writeFileSync('src/favicon.ico', img.contents) + } +} + +// Filter out the WebManifest & friends from the HTML, since we're not using it currently: +const fileNames = res.files.map(x => x.name) +const htmlLines = res.html.filter(line => + fileNames.every(name => !line.includes(name))) + +// Write the favicon metadata to a file to be picked up by Eleventy +fs.writeFileSync('src/_includes/meta.html', htmlLines.join('\n')) diff --git a/logo.js b/logo.js new file mode 100644 index 0000000..3a4185c --- /dev/null +++ b/logo.js @@ -0,0 +1,42 @@ +import { createCanvas, registerFont } from 'canvas' +import fs from 'fs' + +const cfg = { + width: 400, + height: 400, + fontPath: 'src/assets/font/obsidian/Obsidian-Roman.otf', + fontName: 'Obsidian', + fontWeight: 'bold', + fontSize: '350pt', + color: '#fffbe3', + background: '#111111', + text: 'g.', + yOffset: 115, +} + +if ( cfg.fontPath ) { + registerFont(cfg.fontPath, { family: cfg.fontName }) +} + +const canvas = createCanvas(cfg.width, cfg.height) +const ctx = canvas.getContext('2d') + +// set the background +ctx.fillStyle = cfg.background +ctx.fillRect(0, 0, cfg.width, cfg.height) + +// set the font +ctx.font = `${cfg.fontWeight} ${cfg.fontSize} ${cfg.fontName}` +ctx.fillStyle = cfg.color +ctx.textAlign = 'center' +ctx.textBaseline = 'middle' + +// add the text to the canvas +ctx.fillText(cfg.text, cfg.width / 2, cfg.yOffset) + +// write out logo.png +const png = fs.createWriteStream('src/assets/logo/logo.png') +canvas.createPNGStream().pipe(png) + +const jpg = fs.createWriteStream('src/assets/logo/logo.jpg') +canvas.createJPEGStream().pipe(jpg) diff --git a/package.json b/package.json index 972ed9f..113453b 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "description": "", "main": "index.js", "scripts": { - "build": "eleventy --config eleventy.config.js" + "build": "pnpm run logos && eleventy --config eleventy.config.js", + "logos": "cd node_modules/canvas && pnpm run install && cd ../../ && node logo.js && node favicons.js" }, "keywords": [], "author": "", @@ -16,7 +17,9 @@ "@11ty/eleventy-plugin-pug": "^1.0.0", "@11ty/eleventy-plugin-rss": "^2.0.3", "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0", + "canvas": "^3.1.0", "eleventy-plugin-broken-links": "^2.2.1", + "favicons": "^7.2.0", "markdown-it-footnote": "^4.0.0", "node-fetch": "^3.3.2", "opml": "^0.5.7" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 120f05c..d643303 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,9 +23,15 @@ importers: '@11ty/eleventy-plugin-syntaxhighlight': specifier: ^5.0.0 version: 5.0.0 + canvas: + specifier: ^3.1.0 + version: 3.1.0 eleventy-plugin-broken-links: specifier: ^2.2.1 version: 2.2.1 + favicons: + specifier: ^7.2.0 + version: 7.2.0 markdown-it-footnote: specifier: ^4.0.0 version: 4.0.0 @@ -369,6 +375,9 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -386,6 +395,9 @@ packages: resolution: {integrity: sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==} engines: {node: '>= 10.16.0'} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -400,6 +412,10 @@ packages: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} + canvas@3.1.0: + resolution: {integrity: sha512-tTj3CqqukVJ9NgSahykNwtGda7V33VLObwrHfzT0vqJXu7J4d4C/7kQQW3fOEGDfZZoILPut5H00gOjyttPGyg==} + engines: {node: ^18.12.0 || >= 20.9.0} + caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -413,6 +429,9 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -487,6 +506,14 @@ packages: supports-color: optional: true + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -552,6 +579,9 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} @@ -613,6 +643,10 @@ packages: eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} @@ -637,6 +671,10 @@ packages: fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + favicons@7.2.0: + resolution: {integrity: sha512-k/2rVBRIRzOeom3wI9jBPaSEvoTSQEW4iM0EveBmBBKFxO8mSyyRWtDlfC3VnEfu0avmjrMzy8/ZFPSe6F71Hw==} + engines: {node: '>=14.0.0'} + fetch-blob@3.2.0: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} @@ -682,6 +720,9 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -704,6 +745,9 @@ packages: getpass@0.1.7: resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -785,6 +829,9 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -962,6 +1009,10 @@ packages: engines: {node: '>=10.0.0'} hasBin: true + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -980,6 +1031,9 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + mkdirp@3.0.1: resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} engines: {node: '>=10'} @@ -997,6 +1051,16 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + + node-abi@3.75.0: + resolution: {integrity: sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==} + engines: {node: '>=10'} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -1126,6 +1190,11 @@ packages: resolution: {integrity: sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==} engines: {node: '>=12.0.0'} + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} + hasBin: true + prismjs@1.30.0: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} @@ -1175,6 +1244,9 @@ packages: pug@3.0.3: resolution: {integrity: sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==} + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} @@ -1197,6 +1269,14 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -1271,6 +1351,12 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -1306,6 +1392,9 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1318,10 +1407,21 @@ packages: resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} engines: {node: '>=0.10.0'} + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + tar-fs@2.1.3: + resolution: {integrity: sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -1362,6 +1462,9 @@ packages: urlpattern-polyfill@10.0.0: resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + uuid@3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. @@ -1816,6 +1919,12 @@ snapshots: binary-extensions@2.3.0: {} + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + boolbase@1.0.0: {} brace-expansion@1.1.11: @@ -1835,6 +1944,11 @@ snapshots: dependencies: duplexer: 0.1.1 + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + buffer@6.0.3: dependencies: base64-js: 1.5.1 @@ -1855,6 +1969,11 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 + canvas@3.1.0: + dependencies: + node-addon-api: 7.1.1 + prebuild-install: 7.1.3 + caseless@0.12.0: {} character-parser@2.2.0: @@ -1875,6 +1994,8 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chownr@1.1.4: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -1942,6 +2063,12 @@ snapshots: dependencies: ms: 2.1.3 + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-extend@0.6.0: {} + delayed-stream@1.0.0: {} depd@2.0.0: {} @@ -2007,6 +2134,10 @@ snapshots: encodeurl@2.0.0: {} + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + entities@2.2.0: {} entities@3.0.1: {} @@ -2045,6 +2176,8 @@ snapshots: eventemitter3@4.0.7: {} + expand-template@2.0.3: {} + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 @@ -2069,6 +2202,12 @@ snapshots: dependencies: reusify: 1.1.0 + favicons@7.2.0: + dependencies: + escape-html: 1.0.3 + sharp: 0.33.5 + xml2js: 0.6.2 + fetch-blob@3.2.0: dependencies: node-domexception: 1.0.0 @@ -2125,6 +2264,8 @@ snapshots: fresh@0.5.2: {} + fs-constants@1.0.0: {} + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -2154,6 +2295,8 @@ snapshots: dependencies: assert-plus: 1.0.0 + github-from-package@0.0.0: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -2244,6 +2387,8 @@ snapshots: inherits@2.0.4: {} + ini@1.3.8: {} + is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -2403,6 +2548,8 @@ snapshots: mime@3.0.0: {} + mimic-response@3.1.0: {} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -2419,6 +2566,8 @@ snapshots: minipass@7.1.2: {} + mkdirp-classic@0.5.3: {} + mkdirp@3.0.1: {} moo@0.5.2: {} @@ -2429,6 +2578,14 @@ snapshots: ms@2.1.3: {} + napi-build-utils@2.0.0: {} + + node-abi@3.75.0: + dependencies: + semver: 7.7.1 + + node-addon-api@7.1.1: {} + node-domexception@1.0.0: {} node-fetch@2.7.0: @@ -2546,6 +2703,21 @@ snapshots: posthtml-parser: 0.11.0 posthtml-render: 3.0.0 + prebuild-install@7.1.3: + dependencies: + detect-libc: 2.0.3 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 2.0.0 + node-abi: 3.75.0 + pump: 3.0.2 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.3 + tunnel-agent: 0.6.0 + prismjs@1.30.0: {} promise@7.3.1: @@ -2625,6 +2797,11 @@ snapshots: pug-runtime: 3.0.1 pug-strip-comments: 2.0.0 + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + punycode.js@2.3.1: {} punycode@2.3.1: {} @@ -2639,6 +2816,19 @@ snapshots: range-parser@1.2.1: {} + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -2754,6 +2944,14 @@ snapshots: signal-exit@4.1.0: {} + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 @@ -2794,6 +2992,10 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -2804,8 +3006,25 @@ snapshots: strip-bom-string@1.0.0: {} + strip-json-comments@2.0.1: {} + supports-preserve-symlinks-flag@1.0.0: {} + tar-fs@2.1.3: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.2 + tar-stream: 2.2.0 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -2840,6 +3059,8 @@ snapshots: urlpattern-polyfill@10.0.0: {} + util-deprecate@1.0.2: {} + uuid@3.4.0: {} valid-url@1.0.9: {} diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 0000000..cc88dc0 --- /dev/null +++ b/src/.gitignore @@ -0,0 +1,2 @@ +# This file is generated by favicons.js at build-time: +favicon.ico \ No newline at end of file diff --git a/src/_includes/.gitignore b/src/_includes/.gitignore new file mode 100644 index 0000000..041f58f --- /dev/null +++ b/src/_includes/.gitignore @@ -0,0 +1,2 @@ +# This file is generated by favicons.js at build-time: +meta.html \ No newline at end of file diff --git a/src/_includes/obsidian.pug b/src/_includes/obsidian.pug index 0ea4b5f..4ed3964 100644 --- a/src/_includes/obsidian.pug +++ b/src/_includes/obsidian.pug @@ -38,6 +38,7 @@ html(lang="en") meta(name='author' content='Garrett Mills') meta(name='robots' content='index, follow') link(rel='author' href='/humans.txt') + include meta.html block title if title diff --git a/src/assets/logo/.gitignore b/src/assets/logo/.gitignore new file mode 100644 index 0000000..7b18047 --- /dev/null +++ b/src/assets/logo/.gitignore @@ -0,0 +1,3 @@ +# These files are generated by logo.js at build-time: +logo.png +logo.jpg \ No newline at end of file diff --git a/src/assets/logo/favicon/.gitignore b/src/assets/logo/favicon/.gitignore new file mode 100644 index 0000000..ed03193 --- /dev/null +++ b/src/assets/logo/favicon/.gitignore @@ -0,0 +1,3 @@ +# These files are generated by favicons.js at build-time: +*.png +*.ico \ No newline at end of file diff --git a/src/technical.md b/src/technical.md index b2cf29b..005e6cf 100644 --- a/src/technical.md +++ b/src/technical.md @@ -33,6 +33,6 @@ This website, its source code, and its contents are licensed under the terms of The source code for this site is available openly under the terms of the aforementioned license. You can view it [here](https://code.garrettmills.dev/garrettmills/www-ssg). -## Framework +## Tech -## Analytics +This site is built using the Eleventy (11ty) static site generator. I have found it to be quite excellent, especially w/ its ability to mix templating engines.