diff --git a/.envrc b/.envrc index 7b61624..f773b0e 100644 --- a/.envrc +++ b/.envrc @@ -1,2 +1,4 @@ -use nix +use flake layout node +mkdir -p "${HOME}/Library/Application Support/SourceGit" +echo "${PATH}" > "${HOME}/Library/Application Support/SourceGit/PATH" diff --git a/.github/workflows/hugo.yml b/.github/workflows/hugo.yml deleted file mode 100644 index cd6ae84..0000000 --- a/.github/workflows/hugo.yml +++ /dev/null @@ -1,90 +0,0 @@ -# Sample workflow for building and deploying a Hugo site to GitHub Pages -name: Deploy Hugo site to Pages - -on: - # Runs on pushes targeting the default branch - push: - branches: ["master"] - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages -permissions: - contents: read - pages: write - id-token: write - -# Allow one concurrent deployment -concurrency: - group: "pages" - cancel-in-progress: true - -# Default to bash -defaults: - run: - shell: bash - -jobs: - # Build job - build: - runs-on: ubuntu-latest - env: - HUGO_VERSION: 0.111.3 - NODE_VERSION: 18.14.2 - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - submodules: recursive - fetch-depth: 0 - - name: Install git-crypt - run: | - sudo apt-get install git-crypt -y - - name: Decrypt repository - run: | - echo "${{ secrets.GIT_CRYPT_KEY }}" \ - | base64 --decode \ - > ~/millironx.github.io.key - git-crypt unlock ~/millironx.github.io.key - - name: Install Node.js - uses: actions/setup-node@v3 - with: - node-version: "${{ env.NODE_VERSION }}" - - name: Install Hugo CLI - uses: peaceiris/actions-hugo@v2 - with: - hugo-version: "${{ env.HUGO_VERSION }}" - extended: true - - name: Setup Pages - id: pages - uses: actions/configure-pages@v2 - - name: Install postcss cli - run: npm install -g postcss-cli - - name: Install Node.js dependencies - run: npm ci - - name: Build with Hugo - env: - # For maximum backward compatibility with Hugo modules - HUGO_ENVIRONMENT: production - HUGO_ENV: production - run: | - hugo \ - --minify \ - --baseURL "${{ steps.pages.outputs.base_url }}/" - - name: Upload artifact - uses: actions/upload-pages-artifact@v1 - with: - path: ./public - - # Deployment job - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - needs: build - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v1 diff --git a/.gitignore b/.gitignore index 51c7109..c4bb138 100644 --- a/.gitignore +++ b/.gitignore @@ -155,3 +155,37 @@ dist ### FontAwesome gitignore ### fontawesome-pro-6.3.0-web + +### direnv gitignore ### +.direnv + +### Nix Flake gitignore ### +result + +### MacOS gitignore ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk diff --git a/.gitpod.yml b/.gitpod.yml deleted file mode 100644 index 6e15b28..0000000 --- a/.gitpod.yml +++ /dev/null @@ -1,10 +0,0 @@ -# List the start up tasks. Learn more https://www.gitpod.io/docs/config-start-tasks/ -tasks: - - name: Install Hugo dependencies - before: brew install hugo - init: echo "Your version of Hugo is `hugo version`" - command: npm ci && hugo server -D -F --baseUrl $(gp url 1313) --liveReloadPort=443 --appendPort=false --bind=0.0.0.0 -# List the ports to expose. Learn more https://www.gitpod.io/docs/config-ports/ -ports: - - port: 1313 - onOpen: open-preview diff --git a/.prettierignore b/.prettierignore index aad4421..1fea400 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,2 +1 @@ -node_modules -themes +layouts/_default/index.manifest.json diff --git a/.prettierrc b/.prettierrc index 7c5268b..672b6f3 100644 --- a/.prettierrc +++ b/.prettierrc @@ -4,3 +4,6 @@ overrides: - files: "*.html" options: parser: "go-template" + - files: "*.gotmpl" + options: + parser: "go-template" diff --git a/.woodpecker.yml b/.woodpecker.yml new file mode 100644 index 0000000..881a8fd --- /dev/null +++ b/.woodpecker.yml @@ -0,0 +1,18 @@ +when: + branch: master + event: + - push + - cron + cron: "weekly-build" + +steps: + - name: Build site + image: hugomods/hugo:std-base-non-root-0.141.0 + commands: + - hugo --minify + - name: Deploy to pages + image: codeberg.org/xfix/plugin-codeberg-pages-deploy:1 + settings: + folder: public + ssh_key: + from_secret: ssh_key diff --git a/.woodpecker/build-site.yml b/.woodpecker/build-site.yml deleted file mode 100644 index a9d9090..0000000 --- a/.woodpecker/build-site.yml +++ /dev/null @@ -1,21 +0,0 @@ -when: - branch: "master" - -steps: - - name: Install Node packages - image: node:18.14.2-slim - commands: - - npm ci - - name: Build Hugo site - image: peaceiris/hugo:v0.111.3-full - environment: - HUGO_ENV: production - HUGO_ENVIRONMENT: production - commands: - - hugo --minify - - name: Deploy to pages - image: codeberg.org/xfix/plugin-codeberg-pages-deploy:1 - settings: - folder: public - ssh_key: - from_secret: ssh_key diff --git a/.zed/settings.json b/.zed/settings.json new file mode 100644 index 0000000..eb5924a --- /dev/null +++ b/.zed/settings.json @@ -0,0 +1,13 @@ +{ + "languages": { + "HTML": { + "formatter": { + "external": { + "command": "prettier", + "arguments": ["--stdin-filepath", "{buffer_path}"] + } + } + } + }, + "file_types": { "HTML": ["gotmpl"] } +} diff --git a/README.md b/README.md index ca73784..165340a 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,42 @@ -# millironx.github.io +# pages -My personal website. Now hosted over at https://millironx.com +[![status-badge](https://woodpecker.millironx.com/api/badges/30/status.svg?branch=master)](https://woodpecker.millironx.com/repos/30/branches/master) + +My personal website. Hosted over at + +## Notes to self + +### Nix dev shell + +All developer dependencies are now bundled as a Nix Flake. The only trouble with +this is that npm packages don't play well with Nix (and especially Flakes), so +npm packages are specified twice: once in `package{-lock}.json` and then again +in `node*.nix`. + +Compounding this, there are formatters and commit hooks that require npm to be +functional. So, to develop right now requires allowing direnv to setup the Nix +development shell, then immediately installing npm packages via `npm ci`. VSCode +(with extensions) and Zed are smart enough to figure out how to use direnv, and +direnv will pass the PATH to SourceGit for Mac, but other programs aren't that +smart, so you'll need to launch those programs from inside a direnv shell to +make sure they have Prettier, Husky, and all that jazz to execute the hooks. + +Last compounding factors: if `node_modules` is present in the root directory, +then node2nix won't create a correct derivation, so `node_modules` will need to +be temporarily deleted after modifying any npm packages, then as soon as +node2nix is happy, then immediately run `npm ci` to get the commit hooks working +again. Oh, and also, I renamed the `default.nix` file generated by node2nix to +node.nix to avoid giving direnv any wrong impressions about what derivation to +run. + +Yes, hopefully I can get completely away from npm here soon, but this is a minor +inconvenience considering how (not) often I install new packages into this site, +and really discourages me from contributing to the website obesity crisis. + +### Nix building + +Nix building will not work because Hugo reaches out to the internet via content +adapters, and that (by intention) is not perfectly reproducable. As such, +_development_ tools are installed in a Nix shell, but building has been removed +from the Flake. Thankfully, hugomods provides "canonical" Docker images for hugo +now. diff --git a/assets/characters/README.md b/assets/characters/README.md new file mode 100644 index 0000000..3b2d851 --- /dev/null +++ b/assets/characters/README.md @@ -0,0 +1,30 @@ +# Characters + +Imaginary friends that help me inject personality into my articles. These are +anthropomorphized versions of animals that I have known in real life. I tried to +draw them roughly in the style of Chris Pasquini, but failed myself, then tried +using Perplexity's image generation. The style isn't quite the same, but I like +it for these animals. Also, Perplexity does a horrible job of labeling images, +so ignore the ref sheet emotion labels. + +## Spawn of Satan (aka Spawn aka SOS) + +![Spawn ref sheet](spawn/_ref-body-perplexity.png) + +Spawn of Satan is the name Travis gave to the cannulated cow, and it stuck. +Spawn is old and cynical after having every professor with a new idea experiment +on her. After being in academia for so long, she knows her way around +mathematics and the scientific method reasonably well, even if she's never +formally taken a college course in the sciences. She is the realist to any blog +post's optimist. + +## Whelen + +![Whelen ref sheet](whelen/_ref-body-perplexity.png) + +Whelen is a happy-go-lucky German Shepherd/Husky mix puppy. He's been to school +once - and that was just to get neutered - so his knowledge of math and science, +heck, even of the humanities, isn't very good. He is very naive and thinks +everyone is nice and wants to be his friend, but he is also friendly to everyone +and is very vocal when he feels left out. He will step in when any blog post is +getting too technical and demand an explanation for real people (dogs?). diff --git a/assets/characters/spawn/_ref-blueeye-perplexity.png b/assets/characters/spawn/_ref-blueeye-perplexity.png new file mode 100644 index 0000000..b8bef00 Binary files /dev/null and b/assets/characters/spawn/_ref-blueeye-perplexity.png differ diff --git a/assets/characters/spawn/_ref-body-perplexity.png b/assets/characters/spawn/_ref-body-perplexity.png new file mode 100644 index 0000000..04f95a6 Binary files /dev/null and b/assets/characters/spawn/_ref-body-perplexity.png differ diff --git a/assets/characters/spawn/_ref-bodysmirk-perplexity.png b/assets/characters/spawn/_ref-bodysmirk-perplexity.png new file mode 100644 index 0000000..afb9ba2 Binary files /dev/null and b/assets/characters/spawn/_ref-bodysmirk-perplexity.png differ diff --git a/assets/characters/spawn/_ref-face-perplexity.png b/assets/characters/spawn/_ref-face-perplexity.png new file mode 100644 index 0000000..de286db Binary files /dev/null and b/assets/characters/spawn/_ref-face-perplexity.png differ diff --git a/assets/characters/spawn/body-anger.png b/assets/characters/spawn/body-anger.png new file mode 100644 index 0000000..0f9fd87 Binary files /dev/null and b/assets/characters/spawn/body-anger.png differ diff --git a/assets/characters/spawn/body-lazy.png b/assets/characters/spawn/body-lazy.png new file mode 100644 index 0000000..530eb46 Binary files /dev/null and b/assets/characters/spawn/body-lazy.png differ diff --git a/assets/characters/spawn/body-skeptic.png b/assets/characters/spawn/body-skeptic.png new file mode 100644 index 0000000..8e110dc Binary files /dev/null and b/assets/characters/spawn/body-skeptic.png differ diff --git a/assets/characters/spawn/body-snark.png b/assets/characters/spawn/body-snark.png new file mode 100644 index 0000000..e2be9e1 Binary files /dev/null and b/assets/characters/spawn/body-snark.png differ diff --git a/assets/characters/spawn/body-tired.png b/assets/characters/spawn/body-tired.png new file mode 100644 index 0000000..3d84c4d Binary files /dev/null and b/assets/characters/spawn/body-tired.png differ diff --git a/assets/characters/spawn/face-confusion.png b/assets/characters/spawn/face-confusion.png new file mode 100644 index 0000000..6a70166 Binary files /dev/null and b/assets/characters/spawn/face-confusion.png differ diff --git a/assets/characters/spawn/face-happy.png b/assets/characters/spawn/face-happy.png new file mode 100644 index 0000000..445dcef Binary files /dev/null and b/assets/characters/spawn/face-happy.png differ diff --git a/assets/characters/spawn/face-neutral.png b/assets/characters/spawn/face-neutral.png new file mode 100644 index 0000000..44b5522 Binary files /dev/null and b/assets/characters/spawn/face-neutral.png differ diff --git a/assets/characters/spawn/face-sad.png b/assets/characters/spawn/face-sad.png new file mode 100644 index 0000000..15fdb4e Binary files /dev/null and b/assets/characters/spawn/face-sad.png differ diff --git a/assets/characters/spawn/face-toldyouso.png b/assets/characters/spawn/face-toldyouso.png new file mode 100644 index 0000000..9a908bb Binary files /dev/null and b/assets/characters/spawn/face-toldyouso.png differ diff --git a/assets/characters/whelen/_ref-body-perplexity.png b/assets/characters/whelen/_ref-body-perplexity.png new file mode 100644 index 0000000..e5d4103 Binary files /dev/null and b/assets/characters/whelen/_ref-body-perplexity.png differ diff --git a/assets/characters/whelen/_ref-face-perplexity.png b/assets/characters/whelen/_ref-face-perplexity.png new file mode 100644 index 0000000..107709c Binary files /dev/null and b/assets/characters/whelen/_ref-face-perplexity.png differ diff --git a/assets/characters/whelen/body-determined.png b/assets/characters/whelen/body-determined.png new file mode 100644 index 0000000..2c37c46 Binary files /dev/null and b/assets/characters/whelen/body-determined.png differ diff --git a/assets/characters/whelen/body-happy.png b/assets/characters/whelen/body-happy.png new file mode 100644 index 0000000..ef40187 Binary files /dev/null and b/assets/characters/whelen/body-happy.png differ diff --git a/assets/characters/whelen/body-neutral.png b/assets/characters/whelen/body-neutral.png new file mode 100644 index 0000000..9737ccc Binary files /dev/null and b/assets/characters/whelen/body-neutral.png differ diff --git a/assets/characters/whelen/body-sad.png b/assets/characters/whelen/body-sad.png new file mode 100644 index 0000000..2056f02 Binary files /dev/null and b/assets/characters/whelen/body-sad.png differ diff --git a/assets/characters/whelen/body-tired.png b/assets/characters/whelen/body-tired.png new file mode 100644 index 0000000..855a49d Binary files /dev/null and b/assets/characters/whelen/body-tired.png differ diff --git a/assets/characters/whelen/body-worry.png b/assets/characters/whelen/body-worry.png new file mode 100644 index 0000000..2dd85e2 Binary files /dev/null and b/assets/characters/whelen/body-worry.png differ diff --git a/assets/characters/whelen/face-anticipation.png b/assets/characters/whelen/face-anticipation.png new file mode 100644 index 0000000..0be27d0 Binary files /dev/null and b/assets/characters/whelen/face-anticipation.png differ diff --git a/assets/characters/whelen/face-bored.png b/assets/characters/whelen/face-bored.png new file mode 100644 index 0000000..d376b4d Binary files /dev/null and b/assets/characters/whelen/face-bored.png differ diff --git a/assets/characters/whelen/face-happy.png b/assets/characters/whelen/face-happy.png new file mode 100644 index 0000000..af35cae Binary files /dev/null and b/assets/characters/whelen/face-happy.png differ diff --git a/assets/characters/whelen/face-neutral.png b/assets/characters/whelen/face-neutral.png new file mode 100644 index 0000000..1a93432 Binary files /dev/null and b/assets/characters/whelen/face-neutral.png differ diff --git a/assets/characters/whelen/face-skeptic.png b/assets/characters/whelen/face-skeptic.png new file mode 100644 index 0000000..33cc063 Binary files /dev/null and b/assets/characters/whelen/face-skeptic.png differ diff --git a/assets/characters/whelen/face-tired.png b/assets/characters/whelen/face-tired.png new file mode 100644 index 0000000..f395166 Binary files /dev/null and b/assets/characters/whelen/face-tired.png differ diff --git a/assets/characters/whelen/face-worry.png b/assets/characters/whelen/face-worry.png new file mode 100644 index 0000000..563b68e Binary files /dev/null and b/assets/characters/whelen/face-worry.png differ diff --git a/assets/graphics/fa/bitcoin.svg b/assets/graphics/fa/bitcoin.svg new file mode 100644 index 0000000..8815bce --- /dev/null +++ b/assets/graphics/fa/bitcoin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/block-quote.svg b/assets/graphics/fa/block-quote.svg new file mode 100644 index 0000000..faa51e9 --- /dev/null +++ b/assets/graphics/fa/block-quote.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/candy-bar.svg b/assets/graphics/fa/candy-bar.svg new file mode 100644 index 0000000..3c0bdfa --- /dev/null +++ b/assets/graphics/fa/candy-bar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/chevrons-down.svg b/assets/graphics/fa/chevrons-down.svg new file mode 100644 index 0000000..0fab552 --- /dev/null +++ b/assets/graphics/fa/chevrons-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/circle-info.svg b/assets/graphics/fa/circle-info.svg new file mode 100644 index 0000000..025e8d0 --- /dev/null +++ b/assets/graphics/fa/circle-info.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/circle-quarters.svg b/assets/graphics/fa/circle-quarters.svg new file mode 100644 index 0000000..31f53d2 --- /dev/null +++ b/assets/graphics/fa/circle-quarters.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/code.svg b/assets/graphics/fa/code.svg new file mode 100644 index 0000000..c43b6d1 --- /dev/null +++ b/assets/graphics/fa/code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/codeberg.svg b/assets/graphics/fa/codeberg.svg new file mode 100644 index 0000000..d5fdd1a --- /dev/null +++ b/assets/graphics/fa/codeberg.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/graphics/fa/ebay.svg b/assets/graphics/fa/ebay.svg new file mode 100644 index 0000000..cc19ef6 --- /dev/null +++ b/assets/graphics/fa/ebay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/ethereum.svg b/assets/graphics/fa/ethereum.svg new file mode 100644 index 0000000..b200fd2 --- /dev/null +++ b/assets/graphics/fa/ethereum.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/google-scholar.svg b/assets/graphics/fa/google-scholar.svg new file mode 100644 index 0000000..e2b6347 --- /dev/null +++ b/assets/graphics/fa/google-scholar.svg @@ -0,0 +1 @@ + diff --git a/assets/graphics/fa/hacker-news.svg b/assets/graphics/fa/hacker-news.svg new file mode 100644 index 0000000..1d402c1 --- /dev/null +++ b/assets/graphics/fa/hacker-news.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/lightning.svg b/assets/graphics/fa/lightning.svg new file mode 100644 index 0000000..e8cc00c --- /dev/null +++ b/assets/graphics/fa/lightning.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/link.svg b/assets/graphics/fa/link.svg new file mode 100644 index 0000000..9ace2c7 --- /dev/null +++ b/assets/graphics/fa/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/lutris.svg b/assets/graphics/fa/lutris.svg new file mode 100644 index 0000000..fd6d2aa --- /dev/null +++ b/assets/graphics/fa/lutris.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + diff --git a/assets/graphics/fa/matrix.svg b/assets/graphics/fa/matrix.svg new file mode 100644 index 0000000..a178912 --- /dev/null +++ b/assets/graphics/fa/matrix.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/graphics/fa/monero.svg b/assets/graphics/fa/monero.svg new file mode 100644 index 0000000..2a1a5dc --- /dev/null +++ b/assets/graphics/fa/monero.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/p.svg b/assets/graphics/fa/p.svg new file mode 100644 index 0000000..8082e1d --- /dev/null +++ b/assets/graphics/fa/p.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/right-to-bracket.svg b/assets/graphics/fa/right-to-bracket.svg new file mode 100644 index 0000000..0d86ac3 --- /dev/null +++ b/assets/graphics/fa/right-to-bracket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/rss.svg b/assets/graphics/fa/rss.svg new file mode 100644 index 0000000..ce2e0d4 --- /dev/null +++ b/assets/graphics/fa/rss.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/scroll.svg b/assets/graphics/fa/scroll.svg new file mode 100644 index 0000000..2d5e7a8 --- /dev/null +++ b/assets/graphics/fa/scroll.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/spotify.svg b/assets/graphics/fa/spotify.svg new file mode 100644 index 0000000..cb99987 --- /dev/null +++ b/assets/graphics/fa/spotify.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/zcash.svg b/assets/graphics/fa/zcash.svg new file mode 100644 index 0000000..2a9c9d7 --- /dev/null +++ b/assets/graphics/fa/zcash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/graphics/fa/zotero.svg b/assets/graphics/fa/zotero.svg new file mode 100644 index 0000000..2948c62 --- /dev/null +++ b/assets/graphics/fa/zotero.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/graphics/millironx-icon.png b/assets/graphics/millironx-icon.png new file mode 100644 index 0000000..1c4913f Binary files /dev/null and b/assets/graphics/millironx-icon.png differ diff --git a/assets/graphics/millironx-icon.svg b/assets/graphics/millironx-icon.svg new file mode 100644 index 0000000..42b2777 --- /dev/null +++ b/assets/graphics/millironx-icon.svg @@ -0,0 +1,51 @@ + + + + + + + + + + diff --git a/assets/graphics/millironx.svg b/assets/graphics/millironx.svg index c0e4bd1..2e1c756 100644 --- a/assets/graphics/millironx.svg +++ b/assets/graphics/millironx.svg @@ -1,43 +1,42 @@ - + - - - - - - - - + path { + stroke: black; + fill: none; + fill-rule: evenodd; + stroke-dasharray: none; + stroke-linecap: round; + stroke-linejoin: round; + stroke-miterlimit: 4; + stroke-opacity: 1; + stroke-width: 6; + } + + @media (prefers-color-scheme: dark) { + path { + stroke: white; + } + } + + + + + + diff --git a/assets/scripts/phone-masking.js b/assets/scripts/phone-masking.js index 1edbd77..fd2d427 100644 --- a/assets/scripts/phone-masking.js +++ b/assets/scripts/phone-masking.js @@ -1 +1,15 @@ -$("#phone").mask("(000) 000-0000"); +// Built by perplexity.ai +function maskPhoneNumber(input) { + input.addEventListener("input", function (e) { + var x = e.target.value + .replace(/\D/g, "") + .match(/(\d{0,3})(\d{0,3})(\d{0,4})/); + e.target.value = !x[2] + ? x[1] + : "(" + x[1] + ") " + x[2] + (x[3] ? "-" + x[3] : ""); + }); +} + +// Usage +var phoneInput = document.getElementById("phone"); +maskPhoneNumber(phoneInput); diff --git a/assets/styles/millironx.css b/assets/styles/millironx.css index fb47932..00ad31e 100644 --- a/assets/styles/millironx.css +++ b/assets/styles/millironx.css @@ -3,21 +3,180 @@ Color schemes */ color-scheme: light dark; - --prickly-pear-yellow: #735f02; - --eclipse-gray: #3a3a3a; - --pumpkin-olive: #59521c; - --manhattan-steel-blue: #224553; - --pine-green: #36581d; - --brown-swiss-calf-brown: #543c21; - --ear-tag-red: #67160e; - --flaming-gorge-blue: #1b3e5a; - --hayyard-green: #355322; - --coeurdalene-purple: #1b245a; - --brown-swiss-cow-brown: #563c1f; - --buffalo-blue: #0b496a; - --saddle-blue: #104165; - --brown-swiss-gray: #eaddca; - --lavender-purple: #d9c1f6; + + --ear-tag-red-1: oklch(97.5% 0.016 35.7); + --ear-tag-red-2: oklch(95.9% 0.027 37.7); + --ear-tag-red-3: oklch(91.8% 0.055 33.4); + --ear-tag-red-4: oklch(84% 0.092 29.8); + --ear-tag-red-5: oklch(80% 0.123 29.8); + --ear-tag-red-6: oklch(71% 0.146 29.8); + --ear-tag-red-7: oklch(66% 0.154 29.8); + --ear-tag-red-8: oklch(58% 0.162 29.8); + --ear-tag-red-9: oklch(53% 0.154 29.8); + --ear-tag-red-10: oklch(49% 0.146 29.8); + --ear-tag-red-11: oklch(42% 0.131 29.8); + --ear-tag-red-12: oklch(35% 0.115 29.8); + --ear-tag-red-13: oklch(27% 0.092 29.8); + --ear-tag-red-14: oklch(20% 0.07 29.8); + --ear-tag-red-15: oklch(16% 0.054 29.8); + --ear-tag-red-16: oklch(10% 0.039 29.8); + --ear-tag-red: var(--ear-tag-red-12); + + --swiss-brown-1: oklch(98% 0.011 67.7); + --swiss-brown-2: oklch(97% 0.023 67.7); + --swiss-brown-3: oklch(93% 0.039 67.7); + --swiss-brown-4: oklch(84% 0.046 67.7); + --swiss-brown-5: oklch(80% 0.061 67.7); + --swiss-brown-6: oklch(71% 0.072 67.7); + --swiss-brown-7: oklch(66% 0.076 67.7); + --swiss-brown-8: oklch(58% 0.08 67.7); + --swiss-brown-9: oklch(53% 0.076 67.7); + --swiss-brown-10: oklch(49% 0.072 67.7); + --swiss-brown-11: oklch(42% 0.065 67.7); + --swiss-brown-12: oklch(35% 0.057 67.7); + --swiss-brown-13: oklch(27% 0.046 67.7); + --swiss-brown-14: oklch(20% 0.035 67.7); + --swiss-brown-15: oklch(16% 0.027 67.7); + --swiss-brown-16: oklch(10% 0.019 67.7); + --swiss-brown: var(--swiss-brown-12); + + --prickly-pear-yellow-1: oklch(98% 0.017 94.5); + --prickly-pear-yellow-2: oklch(97% 0.035 94.5); + --prickly-pear-yellow-3: oklch(93% 0.059 94.5); + --prickly-pear-yellow-4: oklch(84% 0.07 94.5); + --prickly-pear-yellow-5: oklch(80% 0.093 94.5); + --prickly-pear-yellow-6: oklch(71% 0.11 94.5); + --prickly-pear-yellow-7: oklch(66% 0.116 94.5); + --prickly-pear-yellow-8: oklch(58% 0.122 94.5); + --prickly-pear-yellow-9: oklch(53% 0.116 94.5); + --prickly-pear-yellow-10: oklch(49% 0.11 94.5); + --prickly-pear-yellow-11: oklch(42% 0.099 94.5); + --prickly-pear-yellow-12: oklch(35% 0.083 93.6); + --prickly-pear-yellow-13: oklch(27.1% 0.064 92.8); + --prickly-pear-yellow-14: oklch(20% 0.047 92.4); + --prickly-pear-yellow-15: oklch(16% 0.038 93.3); + --prickly-pear-yellow-16: oklch(10% 0.024 89.7); + --prickly-pear-yellow: var(--prickly-pear-yellow-7); + + --hayyard-green-1: oklch(98% 0.014 135); + --hayyard-green-2: oklch(97% 0.03 135); + --hayyard-green-3: oklch(93% 0.049 135); + --hayyard-green-4: oklch(84% 0.058 135); + --hayyard-green-5: oklch(80% 0.078 135); + --hayyard-green-6: oklch(71% 0.092 135); + --hayyard-green-7: oklch(66% 0.097 135); + --hayyard-green-8: oklch(58% 0.103 135); + --hayyard-green-9: oklch(53% 0.097 135); + --hayyard-green-10: oklch(49% 0.092 135); + --hayyard-green-11: oklch(42% 0.083 135); + --hayyard-green-12: oklch(35% 0.073 135); + --hayyard-green-13: oklch(27% 0.058 135); + --hayyard-green-14: oklch(20% 0.044 135); + --hayyard-green-15: oklch(16% 0.034 135); + --hayyard-green-16: oklch(10% 0.025 135); + --hayyard-green: var(--hayyard-green-11); + + --flaming-gorge-blue-1: oklch(98% 0.012 241); + --flaming-gorge-blue-2: oklch(96.8% 0.021 230); + --flaming-gorge-blue-3: oklch(92.9% 0.041 242); + --flaming-gorge-blue-4: oklch(84% 0.051 245); + --flaming-gorge-blue-5: oklch(80% 0.069 245); + --flaming-gorge-blue-6: oklch(71% 0.081 245); + --flaming-gorge-blue-7: oklch(66% 0.086 245); + --flaming-gorge-blue-8: oklch(58% 0.09 245); + --flaming-gorge-blue-9: oklch(53% 0.086 245); + --flaming-gorge-blue-10: oklch(49% 0.081 245); + --flaming-gorge-blue-11: oklch(42% 0.073 245); + --flaming-gorge-blue-12: oklch(35% 0.064 245); + --flaming-gorge-blue-13: oklch(27% 0.051 245); + --flaming-gorge-blue-14: oklch(20% 0.039 245); + --flaming-gorge-blue-15: oklch(16% 0.03 245); + --flaming-gorge-blue-16: oklch(10% 0.022 245); + --flaming-gorge-blue: var(--flaming-gorge-blue-12); + + --coeurdalene-purple-1: oklch(97.8% 0.016 311); + --coeurdalene-purple-2: oklch(96.5% 0.026 314); + --coeurdalene-purple-3: oklch(92.5% 0.052 308); + --coeurdalene-purple-4: oklch(84% 0.097 302); + --coeurdalene-purple-5: oklch(80% 0.129 302); + --coeurdalene-purple-6: oklch(71% 0.153 302); + --coeurdalene-purple-7: oklch(66% 0.162 302); + --coeurdalene-purple-8: oklch(58% 0.17 302); + --coeurdalene-purple-9: oklch(53% 0.162 302); + --coeurdalene-purple-10: oklch(49% 0.153 302); + --coeurdalene-purple-11: oklch(42% 0.138 302); + --coeurdalene-purple-12: oklch(35% 0.121 302); + --coeurdalene-purple-13: oklch(27% 0.097 302); + --coeurdalene-purple-14: oklch(20% 0.073 302); + --coeurdalene-purple-15: oklch(16% 0.056 302); + --coeurdalene-purple-16: oklch(10% 0.041 302); + --coeurdalene-purple: var(--coeurdalene-purple-13); + + --eclipse-1: oklch(98% 0 0); + --eclipse-2: oklch(97% 0 0); + --eclipse-3: oklch(93% 0 0); + --eclipse-4: oklch(84% 0 0); + --eclipse-5: oklch(80% 0 0); + --eclipse-6: oklch(71% 0 0); + --eclipse-7: oklch(66% 0 0); + --eclipse-8: oklch(58% 0 0); + --eclipse-9: oklch(53% 0 0); + --eclipse-10: oklch(49% 0 0); + --eclipse-11: oklch(42% 0 0); + --eclipse-12: oklch(35% 0 0); + --eclipse-13: oklch(27% 0 0); + --eclipse-14: oklch(20% 0 0); + --eclipse-15: oklch(16% 0 0); + --eclipse-16: oklch(10% 0 0); + --eclipse: var(--eclipse-12); + + --cowhide-1: oklch(98% 0.009 77.5); + --cowhide-2: oklch(97% 0.018 77.5); + --cowhide-3: oklch(93% 0.029 77.5); + --cowhide-4: oklch(84% 0.034 77.5); + --cowhide-5: oklch(80% 0.046 77.5); + --cowhide-6: oklch(71% 0.054 77.5); + --cowhide-7: oklch(66% 0.057 77.5); + --cowhide-8: oklch(58% 0.06 77.5); + --cowhide-9: oklch(53% 0.057 77.5); + --cowhide-10: oklch(49% 0.054 77.5); + --cowhide-11: oklch(42% 0.049 77.5); + --cowhide-12: oklch(35% 0.043 77.5); + --cowhide-13: oklch(27% 0.034 77.5); + --cowhide-14: oklch(20% 0.026 77.5); + --cowhide-15: oklch(16% 0.02 77.5); + --cowhide-16: oklch(10% 0.015 77.5); + --cowhide: var(--cowhide-3); + + --body-background: light-dark(var(--cowhide-3), var(--eclipse-11)); + --link-color: light-dark( + var(--flaming-gorge-blue), + var(--coeurdalene-purple-4) + ); + --nav-button-text: light-dark(var(--eclipse-2), var(--cowhide-12)); + --nav-button-background: light-dark(var(--eclipse-11), var(--cowhide-2)); + --nav-button-background-hover: light-dark( + var(--eclipse-13), + var(--cowhide-4) + ); + --nav-button-background-active: light-dark( + var(--eclipse-14), + var(--cowhide-5) + ); + --container-border: light-dark(var(--swiss-brown-6), var(--eclipse-16)); + --container-background: light-dark(var(--swiss-brown-4), var(--eclipse-12)); + --container-border-alt: light-dark(var(--eclipse-16), var(--swiss-brown-6)); + --container-background-alt: light-dark( + var(--eclipse-12), + var(--swiss-brown-4) + ); + --motto-background: rgba(0, 0, 0, 0.66); + --page-button-text: var(--prickly-pear-yellow-1); + --page-button-background: var(--prickly-pear-yellow-8); + --page-button-background-hover: var(--prickly-pear-yellow-10); + --page-button-background-active: var(--prickly-pear-yellow-12); + --page-button-background-disabled: var(--prickly-pear-yellow-6); + --page-button-text-disabled: var(--eclipse-7); /* Fonts @@ -26,7 +185,10 @@ "URW Bookman L", "Georgia Pro", Georgia, serif; --font-family-slab-serif: Rockwell, "Rockwell Nova", "Roboto Slab", "DejaVu Serif", "Sitka Small", serif; + --font-family-transitional: Charter, "Bitstream Charter", "Sitka Text", + Cambria, serif; --font-family-system-ui: system-ui, sans-serif; + --font-family-monospace: "Nimbus Mono PS", "Courier New", monospace; } /* @@ -34,12 +196,32 @@ */ html { - background-color: light-dark(var(--brown-swiss-gray), var(--eclipse-gray)); + background-color: var(--body-background); font-family: var(--font-family-slab-serif); } +body { + display: flex; + flex-direction: column; + min-height: 98vh; + margin: 0 8px; + align-items: center; +} + +.container { + max-width: min(60rem, 100vw - 2rem); +} + +.footer-inner { + width: min(60rem, 100vw - 2rem); + display: flex; + justify-content: space-between; + align-items: center; + flex-shrink: 0; +} + a { - color: light-dark(var(--saddle-blue), var(--lavender-purple)); + color: var(--link-color); } header { @@ -58,18 +240,12 @@ nav { } nav a { - color: light-dark(var(--brown-swiss-gray), var(--manhattan-steel-blue)); - background-color: light-dark( - var(--manhattan-steel-blue), - var(--brown-swiss-gray) - ); + color: var(--nav-button-text); + background-color: var(--nav-button-background); border-radius: 0.05rem; border-style: outset; border-width: 0.2rem; - border-color: light-dark( - var(--manhattan-steel-blue), - var(--brown-swiss-gray) - ); + border-color: var(--nav-button-background); min-width: 7.5rem; max-width: 7.5rem; display: flex; @@ -81,54 +257,95 @@ nav a { font-family: var(--font-family-system-ui); } +nav a.active { + background-color: var(--nav-button-background-active); +} + nav a:active { border-style: inset; } nav a:hover { - background-color: light-dark( - var(--buffalo-blue), - color-mix(in srgb, var(--prickly-pear-yellow), var(--brown-swiss-gray) 75%) - ); + background-color: var(--nav-button-background-hover); +} + +main { + display: flex; + flex-direction: column; +} + +article p, +.character-dialog-text, +article li { + font-family: var(--font-family-transitional); + font-size: 1.15rem; + text-justify: inter-word; + text-align: justify; + hyphens: auto; +} + +article > p { + text-indent: 2ch; + line-height: 1.5em; +} + +article h1 + p, +article h2 + p, +article h3 + p, +article h4 + p, +article h5 + p, +article h6 + p { + text-indent: 0; +} + +.footnotes p { + font-size: smaller; } figure { - border-color: light-dark(var(--eclipse-gray), var(--brown-swiss-gray)); + border-color: var(--container-border); border-width: 1.5pt; border-style: inset; + border-radius: 2.5pt; + background-color: var(--container-background); padding: 1.25pt; } -blockquote { +figure:has(blockquote) { background: linear-gradient( to right, - light-dark(lightgray, dimgray), - color-mix( - in srgb, - light-dark(var(--brown-swiss-gray), var(--eclipse-gray)), - white 25% - ) + var(--container-border), + var(--container-background) ); - border-left: 5px solid black; - padding-left: 6px; + border: none; + border-radius: 0; + border-left: 6px solid black; + padding: 0.25em 1em; } -blockquote small::before { +figure:has(blockquote) > blockquote { + margin: 0; +} + +figure:has(blockquote) > figcaption::before { content: "\2014 \00A0"; } -blockquote small { +figure:has(blockquote) > figcaption { + margin-top: -1em; + margin-bottom: 1em; font-size: 80%; } footer { - background-color: light-dark(lightgray, dimgray); + display: flex; + flex-direction: column; + align-items: center; + background-color: var(--container-background); margin: 0 0 -1em -1em; width: calc(100% - 1em); padding: 0.25em 1.25em; - display: flex; - justify-content: space-between; - align-items: center; + font-size: smaller; } form { @@ -153,6 +370,25 @@ textarea:invalid { border-bottom-color: var(--ear-tag-red); } +code { + font-family: var(--font-family-monospace); +} + +/* + abbr element "tooltip" for mobile + heavily modified from https://bitsofco.de/making-abbr-work-for-touchscreen-keyboard-mouse/ +*/ +abbr[title]:focus::after { + content: attr(title); + background-color: #1e1e1e; + color: #fff; + border-radius: 0.125em; + box-shadow: 1px 1px 5px 0 rgba(0, 0, 0, 0.4); + font-size: smaller; + padding: 0.5em; + display: block; +} + /* Container-type helper classes */ @@ -162,6 +398,12 @@ textarea:invalid { width: 100%; } +.motto-wrapper { + display: block; + flex: 1 0 30vh; + margin-bottom: 1em; +} + .motto { position: relative; display: grid; @@ -171,8 +413,10 @@ textarea:invalid { font-weight: 600; text-shadow: 0 0 10px rgba(0, 0, 0, 0.33); width: 100%; + height: 100%; padding: 0 0 0.5em 0; border-radius: 0.25rem; + z-index: 10; } .motto::before { @@ -196,32 +440,36 @@ textarea:invalid { } .motto .motto-inside h1 { - background-color: rgba(0.33, 0.33, 0.33, 0.33); - -webkit-text-stroke: 0.3px lightgray; - line-height: 1; + background-color: var(--motto-background); + padding: 0.5rem; } .card { - background-color: color-mix( - in srgb, - light-dark(var(--brown-swiss-gray), var(--eclipse-gray)), - white 10% - ); - border-color: light-dark( - var(--manhattan-steel-blue), - var(--brown-swiss-gray) - ); + background-color: var(--container-background); + border-color: var(--container-border); border-width: 1.5pt; border-radius: 0.1rem; border-style: outset; margin: 1rem 0; padding: 0.5rem; padding-top: 0; - position: relative; display: flex; flex-direction: column; } +.card-content { + display: flex; + flex-direction: column; + flex-grow: 1; +} + +.card-header { + display: flex; + flex-direction: row; + justify-content: space-between; + flex-grow: 1; +} + .card-link { white-space: nowrap; display: inline-flex; @@ -229,22 +477,26 @@ textarea:invalid { align-items: center; text-underline-offset: 0.25em; backface-visibility: hidden; - margin: 0 0.5em; + margin: 0.1em 0.25em; + padding: 0.33em; + padding-right: 0.45em; +} + +.card-body { + margin-top: 0.33em; } .category-button { - position: absolute; - top: 1em; - right: 1em; display: grid; + align-items: center; + justify-items: center; color: white; background-color: var(--ear-tag-red); border-radius: 0.5em; padding: 1em; -} - -.card-title { - margin-right: 3em; + margin: 1em; + height: 2em; + aspect-ratio: 1 / 1; } .card-title > a { @@ -287,6 +539,118 @@ textarea:invalid { fill: currentColor; } +.account-bucket { + display: grid; + grid-template-columns: 3em 1em 1fr; + background-color: var(--container-background-alt); + padding: 1em 0; + border-radius: 0.5em; + border-color: var(--container-border-alt); + border-style: solid; + color: light-dark(white, black); + margin: 1em 0; + align-items: center; +} + +.account-bucket h3 { + align-self: center; + writing-mode: sideways-lr; +} + +.account-bucket details { + grid-column: 3; +} + +.account-bucket .crypto-list { + grid-column: 3; + max-width: 100%; +} + +.account-list { + display: flex; + justify-content: space-between; + flex-wrap: wrap; + width: calc(100% - 1.5em); +} + +.account-bucket .account-list { + grid-column: 3; +} + +.account-list a { + font-size: xx-large; + text-decoration: none; + color: inherit; + padding: 0.5em; +} + +.account-list a:hover { + background-color: var(--container-background); + border-color: var(--container-border); + border-width: 2.5px; + border-radius: 0.5em; + border-style: solid; + padding: calc(0.5em - 2.5px); +} + +figcaption .mono { + color: light-dark(black, white); + overflow-wrap: anywhere; +} + +.crypto-list details { + max-width: 100%; +} + +.character-dialog { + display: grid; + width: calc(100% - 1rem); + grid-template-columns: 5rem 1fr; + grid-template-rows: auto auto; + gap: 1em; + margin: 0.5rem; +} + +.character-avatar { + display: grid; + max-width: 100%; + grid-row: 1 / span 2; + grid-column: 1; + align-self: start; + align-items: center; + justify-items: center; + min-width: 5rem; + min-height: 5rem; + border-radius: 5rem; + align-items: center; + border-style: solid; + border-color: var(--nav-button-background-hover); + background-color: var(--cowhide-2); +} + +.character-avatar > img { + max-width: 4rem; + max-height: 4rem; +} + +.character-dialog-bubble { + display: grid; + grid-template-rows: auto auto; + align-self: start; + border-radius: 0.5em; + border-width: 0.2rem; + border-color: var(--nav-button-background); + border-style: outset; + row-gap: 0.5rem; + padding: 0.5rem; + background-color: var(--container-border); + min-height: 5rem; +} + +.character-dialog-title { + font-weight: bolder; +} + /* Helper classes */ @@ -297,6 +661,9 @@ textarea:invalid { .img-fluid { max-width: 100%; height: auto; + display: grid; + align-items: center; + justify-items: center; } .float-left { @@ -309,21 +676,66 @@ textarea:invalid { max-width: 100%; } -/* - Application-state helper classes -*/ -@media (prefers-color-scheme: light) { - .active { - background-color: var(--coeurdalene-purple); - } +.pagination { + display: flex; + justify-content: center; + gap: 0.5em; + padding-left: 0; } -@media (prefers-color-scheme: dark) { - .active { - color: color-mix(in srgb, var(--manhattan-steel-blue), white 75%); - background-color: color-mix(in srgb, var(--brown-swiss-gray), black 75%); - border-color: color-mix(in srgb, var(--brown-swiss-gray), black 50%); - } +.pagination li { + list-style-type: none; + color: var(--nav-button-text); +} + +.pagination li a { + color: var(--page-button-text); + background-color: var(--page-button-background); + border-radius: 0.05rem; + border-style: outset; + border-width: 0.2rem; + border-color: var(--page-button-background); + width: 2rem; + max-width: 1.8vw; + aspect-ratio: 1 / 1; + display: flex; + justify-content: center; + align-items: center; + margin: 0.2rem; + text-decoration: none; + padding: 0 0.2rem; + font-family: var(--font-family-system-ui); +} + +.pagination li a:hover { + background-color: var(--page-button-background-hover); +} + +.pagination li.active a { + background-color: var(--page-button-background-active); +} + +.pagination li.disabled a { + cursor: not-allowed; + background-color: var(--page-button-background-disabled); + color: var(--page-button-text-disabled); + border-style: solid; +} + +.mono { + font-family: var(--font-family-monospace); + font-weight: 600; +} + +.bolder { + font-weight: bolder; + background-color: rgba(0, 0, 0, 0.33); + border-radius: 0.25em; +} + +/* Specific elements */ +#content { + flex: 1 0 max-content; } /* @@ -363,6 +775,15 @@ textarea:invalid { flex-direction: row; } + .person-profile { + position: sticky; + top: 0; + width: 300px; + min-width: 20vw; + max-width: 30vw; + margin-bottom: 5vh; + } + /* Helper classes */ @@ -384,20 +805,19 @@ textarea:invalid { margin-right: 1rem; } - .card-header { + .card-thumbnail { width: 20vw; flex-shrink: 0; } - .card-body { - margin-left: 1rem; + .card-thumbnail:not( + :has(~ .card-content > .card-header > .card-title > .dt-published) + ) { + width: 10vw; } - .bolder { - font-weight: bolder; - background-color: rgba(0, 0, 0, 0.33); - border-radius: 0.25em; - padding: 0.25em 0.75em 0.5em 0.33em; + .card-content { + margin-left: 1rem; } /* @@ -408,7 +828,8 @@ textarea:invalid { h3::before, h4::before, h5::before, - h6::before { + h6::before, + blockquote::before { content: " "; /* Older browser do not support empty content */ visibility: hidden; display: block; @@ -416,77 +837,3 @@ textarea:invalid { clear: both; } } /* end @media */ - -@supports (animation-timeline: scroll()) and (animation-range: 0 50vh) { - @keyframes sticky-header { - from { - height: 50vh; - top: 6rem; - } - - to { - height: 10vh; - top: -1rem; - } - } - - @keyframes blurry-header { - from { - filter: blur(0); - } - - to { - filter: blur(2px); - } - } - - @keyframes transparent-text-bg { - from { - background-color: rgba(0.33, 0.33, 0.33, 0.33); - } - to { - background-color: rgba(0.33, 0.33, 0.33, 0); - } - } - - main, - footer { - position: relative; - top: 55vh; - } - - .motto { - position: fixed; - top: 12rem; - - animation: sticky-header linear forwards; - animation-timeline: scroll(); - animation-range: 0.001vh 50vh; - } - - .motto::before { - filter: blur(12px); - - top: 2rem; - - animation: blurry-header linear forwards; - animation-timeline: scroll(); - animation-range: 0.001vh 50vh; - } - - .motto-inside h1 { - animation: transparent-text-bg linear forwards; - animation-timeline: scroll(); - animation-range: 0.001vh 40vh; - } - - @media (min-width: 768px) { - .motto { - width: calc(100% - 8rem); - } - - .motto::before { - top: 0; - } - } -} /* end @supports */ diff --git a/assets/styles/scrolling-header.css b/assets/styles/scrolling-header.css new file mode 100644 index 0000000..acc8a4b --- /dev/null +++ b/assets/styles/scrolling-header.css @@ -0,0 +1,68 @@ +@media (prefers-reduced-motion: no-preference) { + @supports (animation-timeline: scroll()) and (animation-range: 0 50vh) { + @keyframes sticky-header { + from { + flex-basis: 30vh; + } + + to { + flex-basis: 0; + } + } + + .motto-wrapper { + position: sticky; + top: 0; + z-index: 100; + + animation: sticky-header linear forwards; + animation-timeline: scroll(); + animation-range: 0 30vh; + + contain: content; + } + + @keyframes blurry-header { + from { + filter: blur(0); + } + + to { + filter: blur(3.5px); + } + } + + .motto::before { + animation: blurry-header linear forwards; + animation-timeline: scroll(); + animation-range: 0 30vh; + } + + @keyframes transparent-text-bg { + from { + background-color: var(--motto-background); + text-shadow: 0 0 10px rgba(0, 0, 0, 0.33); + } + to { + background-color: rgba(0, 0, 0, 0); + text-shadow: 0 0 10px rgba(0, 0, 0, 1); + } + } + .motto-inside h1 { + animation: transparent-text-bg linear forwards; + animation-timeline: scroll(); + animation-range: 0 30vh; + } + + .motto-inside h1 small { + display: block; + font-size: calc(1vh + 1vw); + line-height: calc(1vh + 1vw); + } + + main section { + margin: 0 0.25em; + contain: content; + } + } /* end @supports */ +} /* end @media */ diff --git a/config.toml b/config.toml index 89a2f66..8a730b3 100644 --- a/config.toml +++ b/config.toml @@ -1,7 +1,9 @@ baseURL = "https://millironx.com" languageCode = "en-us" -title = "MillironX" -paginate = 5 +title = "Milliron X" + +[pagination] +pagerSize = 5 [build] writeStats = true @@ -9,74 +11,47 @@ writeStats = true [Params] cardImage = "saddles" motto = "" +images = ["saddles.jpg"] +categories = [] [taxonomies] people = "people" tag = "tags" category = "categories" -[module] +[mediaTypes] -[[module.mounts]] -source = "static" -target = "static" +[mediaTypes."application/atom+xml"] +suffixes = ["xml"] -[[module.mounts]] -source = "assets/graphics" -target = "assets/graphics" +[outputs] +home = ["atom", "html", "manifest"] +page = ["html"] +section = ["html", "atom"] +term = ["html", "atom"] -[[module.mounts]] -source = "assets/images" -target = "assets/images" +[outputFormats] -[[module.mounts]] -source = "assets/scripts" -target = "assets/scripts" +[outputFormats.atom] +mediaType = "application/atom+xml" +baseName = "feed" -[[module.mounts]] -source = "assets/styles" -target = "assets/styles" +[outputFormats.manifest] +name = "manifest" +baseName = "manifest" +mediaType = "application/json" +notAlternative = "true" -[[modules.mounts]] -source = "assets/scripts/custom" -target = "assets/scripts/custom" +[markup] -[[module.mounts]] -source = "./node_modules/@fortawesome/fontawesome-pro/js" -target = "assets/scripts/fontawesome" +[markup.goldmark] -[[module.mounts]] -source = "./node_modules/@popperjs/core/dist/umd" -target = "assets/scripts/popper" +[markup.goldmark.parser] -[[module.mounts]] -source = "./node_modules/bootstrap/scss" -target = "assets/styles/bootstrap" +[markup.goldmark.parser.attribute] +block = true -[[module.mounts]] -source = "./node_modules/bootswatch/dist/" -target = "assets/styles/bootswatch" +[markup.goldmark.renderHooks] -[[module.mounts]] -source = "./node_modules/@openfonts/nunito-sans_all" -target = "static/fonts/nunito-sans" - -[[module.mounts]] -source = "./node_modules/bootstrap/dist/js" -target = "assets/scripts/bootstrap" - -[[module.mounts]] -source = "./node_modules/fittext.js" -target = "assets/scripts/fittext" - -[[module.mounts]] -source = "./node_modules/jquery/dist" -target = "assets/scripts/jquery" - -[[module.mounts]] -source = "./node_modules/jquery-mask-plugin/dist" -target = "assets/scripts/jquery-mask-plugin" - -[[module.mounts]] -source = "./node_modules/masonry-layout/dist" -target = "assets/scripts/masonry" +[markup.goldmark.renderHooks.link] +enableDefault = true diff --git a/content/_index.md b/content/_index.md index b7cd16c..1cfe790 100644 --- a/content/_index.md +++ b/content/_index.md @@ -1,12 +1,11 @@ --- -title: Home cardImage: charolette cardImageDescription: She almost looks like she's in her native country again. motto: My name is Thomas Christensen
I am Milliron X description: The homepage of Thomas A. Christensen II -layout: _default/list menu: main: + name: Home params: icon: home weight: -1000 @@ -17,72 +16,15 @@ menu: It's a [cattle brand](https://en.wikipedia.org/wiki/Livestock_branding), of course! My cattle brand! -The milliron is the bar with a bend in the middle. It does not -represent anything physical or textual _per se_, and is therefore a rather -unique element in cattle brands. Millirons are difficult to modify into another -brand, and provide a guarantee of authentic ownership. +The {{< dfn >}}milliron{{< /dfn >}} is the bar with a bend in the middle. It +does not represent anything physical or textual _per se_, and is therefore a +rather unique element in cattle brands. Millirons are difficult to modify into +another brand, and provide a guarantee of authentic ownership. -X is the letter of mystery and mystique. For nerds, it's the unknown -in any algebra problem. Ranchers and cowboys will associate it with big names -like the "Bar X" and the "Double X." In either case, it lends itself to a sense -of withholding, prestige, and power. +{{< dfn >}}X{{< /dfn >}} is the letter of mystery and mystique. For nerds, it's +the unknown in any algebra problem. Ranchers and cowboys will associate it with +big names like the "Bar X" and the "Double X." In either case, it lends itself +to a sense of withholding, prestige, and power. Together, these two symbols represent the qualities I strive for in each of my works: authenticity, originality, power, depth, and prestige. - -## Who am I? - -{{< imgproc me-and-lady Resize "768x" "float-right" >}} Image courtesy -[Guy McCutcheon Photography](https://www.guymccutcheon.com/) {{< /imgproc >}} - -I am - -- 🧬 A bioinformatician (by profession) -- 📐 An engineer (by education) -- 🐂 A rancher (by lifestyle) -- 🖥️ A techie (self-taught) -- 🎥 And a filmmaker (at heart) - -I've got a soft spot for Brown Swiss dairy cows (just in case you couldn't tell -by the pictures), and am sometimes called "one of those crazy, Wyoming dairy cow -people." I love anything to do with cattle or technology, but especially -anything to do with both of them. - -_Christian, American, Convervative, Pro-gun, Heterosexual - any questions?_ - -## Where am I? - -{{< imgproc wy-in-ks Resize "768x" "float-left" / >}} - -I am a Wyomingite sojurning in Kansas. That ought to lead to some interesting -stories. - -Around the web you can find me at (in order of subjective importance) - -- {{< fa github >}} GitHub: [@MillironX](https://github.com/MillironX) -- {{< fa orcid >}} ORDiD: - [0000-0003-1219-9320](https://orcid.org/0000-0003-1219-9320) -- {{< fa gitlab >}} GitLab: [@MillironX](https://gitlab.com/MillironX) -- {{< fa vimeo >}} Vimeo: - [Thomas Christensen II](https://vimeo.com/tchristensenii) -- {{< fa stack-overflow >}} StackExchange: - [Milliron X](https://stackexchange.com/users/4863541/milliron-x) -- {{< fa steam >}} Steam: [MillironX](https://steamcommunity.com/id/millironx) - -This list is intended to verify my identity on other sites. Please do _not_ use -it as fodder to try and "follow" me on each of these platforms. I stand with -RMS: - -{{< blockquote "Richard Stallman _in_ [If you feel your organization needs a 'presence' in Facebook](https://stallman.org/facebook-presence.html)" >}} -Facebook is a bad place for a person to be. When people find us on Facebook, we -lead them away from Facebook and then talk with them elsewhere. -{{< /blockquote >}} - -I typically don't respond to inquiries made on these platforms. Please use -[my contact form](/contact), instead. - - - diff --git a/content/academia/_index.md b/content/academia/_index.md index 10e4083..ea2eb55 100644 --- a/content/academia/_index.md +++ b/content/academia/_index.md @@ -14,13 +14,15 @@ menu: fa-thumbnail: university --- -> I have spent too long in school and not enough time in the middle of nowhere -> -> -- Baxter Black, DVM - During my time in academia, I have amassed a few notable accomplishments. Of course, as the old saying goes, "if it isn't published, then it never happened," -so here is a list of everything that actually happened. Several of these -articles are also available on -[my Google Scholar page](https://scholar.google.com/citations?user=gbP4RDgAAAAJ), -but this is the complete list. +so here is a list of everything that actually happened. + +Academia is not the be-all and end-all of life (contrary to what your professor +might have told you). I've found the side-effects to be similar to this guy's: + + +> I have spent too long in school and not enough time in the middle of nowhere, +> and it has inhibited my ability to learn the simple things. +{author="Baxter Black, DVM"} + diff --git a/content/academia/bpv-genetics.md b/content/academia/bpv-genetics.md new file mode 100644 index 0000000..edd678f --- /dev/null +++ b/content/academia/bpv-genetics.md @@ -0,0 +1,42 @@ +--- +title: "Genetic analysis of bovine papillomas" +date: 2024-09-19 +categories: + - poster +people: + - Thomas A. Christensen II + - Rachel Palinski + - Bob Gentry +journal: + "National Association of Animal Breeders Technical Conference Student Poster + session" +location: "Middleton, Wisconsin" +--- + +Bovine papillomavirus (BPV) is a major cause of reproductive failure in cattle. +In bulls, penile papillomas caused by BPV may cause reluctance to breed, and is +always a cause to fail an animal on a breeding soundness exam. Historically, it +has been thought that BPV was transmitted via direct contact and could be +controlled by managing clinically presenting animals in the herd, but more +recent evidence suggests alternative modes of transmission. BPV has been found +repeatably in clinically healthy animals, and in non-cutaneous secretions +including milk, blood, urine and semen. Currently, no commercially available BPV +vaccine uses isolated viral particles and naturally occurring virus does not +produce cross-protective immunity. In order to develop a proper vaccine for +penile papillomas further studies are required to understand the epidemiology of +BPV in herds. While vulvar, cutaneous, and mammary papillomas have been +genotyped in recent years, this information is not available for penile +papillomas. In this study there were 31 submissions, collected from 7 states, +NE, KS, NY, TX, AL, MO and SD (14 different cattle operations) Samples were +collected between August of 2022 and April 2024. Twenty-two submissions were +penile papillomas and with pooling of samples represented over 50 penile +papillomas. Samples were metagenomically sequenced at the Kansas State +Veterinary Diagnostic Lab, and the genotype of each sample was determined using +the phylogenetic analysis. The clade of each sample was determined by aligning +consensus sequences of the L1 gene (used for both for phylogeny and as a vaccine +target) using MAFFT and a maximum-likelihood phylogeny generated in Mega X. +Analysis found that all penile papilloma submissions were composed of BPV type +2, with one sample showing co-infection with BPV type 1. Conversely, cutaneous +and teat papillomas had BPV genotypes that were more variable with genotypes of +1,2,7,12,14,29 and 40. These results indicate that BPV type 2 and type 1 provide +a unified target for bovine penile papilloma vaccine development. diff --git a/content/academia/got-warts-naab.md b/content/academia/got-warts-naab.md new file mode 100644 index 0000000..adea3d8 --- /dev/null +++ b/content/academia/got-warts-naab.md @@ -0,0 +1,14 @@ +--- +title: + "Got Warts? Bovine Papillomavirus Pathogenesis, Transmission, and Vaccination" +date: 2024-09-19 +featured: false +categories: + - presentation +people: + - Bob Gentry + - Thomas A. Christensen II +journal: + "National Association of Animal Breeders Technical Conference Sponsor session" +location: "Middleton, Wisconsin" +--- diff --git a/content/academia/metagenomics/thumbnail.jpg b/content/academia/metagenomics/thumbnail.jpg new file mode 100644 index 0000000..b952da2 Binary files /dev/null and b/content/academia/metagenomics/thumbnail.jpg differ diff --git a/content/academia/pva-aiche/thumbnail.jpg b/content/academia/pva-aiche/thumbnail.jpg new file mode 100644 index 0000000..80f1c8e Binary files /dev/null and b/content/academia/pva-aiche/thumbnail.jpg differ diff --git a/content/academia/taxprofiler.md b/content/academia/taxprofiler.md index 88c62e4..b629a8a 100644 --- a/content/academia/taxprofiler.md +++ b/content/academia/taxprofiler.md @@ -1,6 +1,7 @@ --- title: - "nf-core/taxprofiler: highly parallelised and flexible pipeline for metagenomic taxonomic classification and profiling" + "nf-core/taxprofiler: highly parallelised and flexible pipeline for + metagenomic taxonomic classification and profiling" date: 2023-10-23 featured: true tags: @@ -16,9 +17,25 @@ people: - Maxime Borry - Mahwash Jamy - nf-core community - - James A. Fellows Yate + - James A. Fellows Yates link: https://doi.org/10.1101/2023.10.20.563221 journal: bioRxiv --- -Metagenomic classification tackles the problem of characterising the taxonomic source of all DNA sequencing reads in a sample. A common approach to address the differences and biases between the many different taxonomic classification tools is to run metagenomic data through multiple classification tools and databases. This, however, is a very time-consuming task when performed manually - particularly when combined with the appropriate preprocessing of sequencing reads before the classification. Here we present nf-core/taxprofiler, a highly parallelised read-processing and taxonomic classification pipeline. It is designed for the automated and simultaneous classification and/or profiling of both short- and long-read metagenomic sequencing libraries against a 11 taxonomic classifiers and profilers as well as databases within a single pipeline run. Implemented in Nextflow and as part of the nf-core initiative, the pipeline benefits from high levels of scalability and portability, accommodating from small to extremely large projects on a wide range of computing infrastructure. It has been developed following best-practise software development practises and community support to ensure longevity and adaptability of the pipeline, to help keep it up to date with the field of metagenomics. +Metagenomic classification tackles the problem of characterising the taxonomic +source of all DNA sequencing reads in a sample. A common approach to address the +differences and biases between the many different taxonomic classification tools +is to run metagenomic data through multiple classification tools and databases. +This, however, is a very time-consuming task when performed manually - +particularly when combined with the appropriate preprocessing of sequencing +reads before the classification. Here we present nf-core/taxprofiler, a highly +parallelised read-processing and taxonomic classification pipeline. It is +designed for the automated and simultaneous classification and/or profiling of +both short- and long-read metagenomic sequencing libraries against a 11 +taxonomic classifiers and profilers as well as databases within a single +pipeline run. Implemented in Nextflow and as part of the nf-core initiative, the +pipeline benefits from high levels of scalability and portability, accommodating +from small to extremely large projects on a wide range of computing +infrastructure. It has been developed following best-practise software +development practises and community support to ensure longevity and adaptability +of the pipeline, to help keep it up to date with the field of metagenomics. diff --git a/assets/images/library.jpg b/content/academia/thumbnail.jpg similarity index 100% rename from assets/images/library.jpg rename to content/academia/thumbnail.jpg diff --git a/content/academia/yavsap/index.md b/content/academia/yavsap/index.md new file mode 100644 index 0000000..3ffc79c --- /dev/null +++ b/content/academia/yavsap/index.md @@ -0,0 +1,54 @@ +--- +title: "YAVSAP: versatile viral quasispecies analysis for veterinary samples" +date: 2024-03-05 +featured: false +categories: + - presentation +people: + - Thomas A. Christensen II + - Steven Stancic + - Andrea Lu + - Dana Mitzel + - William Wilson + - Rachel Palinski +journal: "Phi Zeta Research Day" +location: "Manhattan, Kansas" +tags: + - virus + - quasispecies + - next-generation sequencing + - pipeline +awards: + - "2nd Place Large Animal Applied Research Presentation" +link: "/academia/yavsap/yavsap.pdf" +--- + +Viral populations within an infected host are composed of viral particles with a +spectrum of genetic mutations rather than a unified genome. This phenomenon is +referred to as viral "quasispecies," and has been useful for the understanding +of viral transmission and early detection of new viral variants. Next generation +sequencing (NGS) has enabled the study of these quasispecies for many viral +species, notably Influenza A and B, Human Immunodeficiency Virus (HIV), Foot and +Mouth Disease Virus (FMDV), and Severe Acute Respiratory Syndrome Coronavirus 2 +(SARS CoV2), and established protocols and computer analysis tools have been +developed for these species. Some of the most important viruses, such as +emerging and exotic disease agents, however, do not have replicatable protocols +or software tools capable of producing valid output from their sequence data. +Here, we present Yet Another Viral Subspecies Analysis Pipeline (YAVSAP). YAVSAP +is a fully automated bioinformatic pipeline built from the ground up to identify +and analyze viral quasispecies of any arbitrary virus in human and veterinary +samples. YAVSAP provides reference-based genome mapping of both long- and +short-read sequencing reads to any reference genome that the user chooses, +identifies subconsensus variants and haplotypes, and assesses the phylogenies of +all viral sequences found within a sample. YAVSAP is written in Nextflow and +conforms to the nf-core initiative's standards, which allows it to run on +low-end computers, high performance computing (HPC) clusters, or anything in +between with zero configuration. YAVSAP has been tested on viruses of interest +to veterinary medicine and public health, including Japanese Encephalitis Virus +(JEV), Influenza D Virus (IDV), Bovine Coronavirus (BCoV), SARS CoV2, and Rift +Valley Fever Virus (RVFV), and can correctly identify consensus genomes and +quasispecies within samples containing each of these viruses. This tool provides +a means for biologists with little bioinformatic experience to analyze deep +sequence data while correcting for many of the pitfalls associated with previous +and current analysis platforms. YAVSAP is open source software and is publicly +available at https://github.com/ksumngs/yavsap. diff --git a/content/academia/yavsap/yavsap.pdf b/content/academia/yavsap/yavsap.pdf new file mode 100644 index 0000000..14462c7 Binary files /dev/null and b/content/academia/yavsap/yavsap.pdf differ diff --git a/content/blogroll/_index.md b/content/blogroll/_index.md index 2a17fb5..307a619 100644 --- a/content/blogroll/_index.md +++ b/content/blogroll/_index.md @@ -1,5 +1,15 @@ --- -draft: true +title: "Blogroll" +menu: + main: + name: Blogroll + params: + icon: scroll + weight: -800 +cardImage: eclipse +cardImageDescription: | + Randall Monroe was right. Eclipses are way cooler than they sound. +suppressRss: true --- ## Stuff I like on the internet @@ -7,39 +17,4 @@ draft: true This section of a website used to be called a "blogroll." I don't know what it's called now. In order to be on this list, I must have been subscribed or otherwise follow it for over a year. It's amazing how little stuff on the -internet can't make that cut. - -### [Thru the Bible](https://ttb.org/) - -I'm convinced that the word of God is timeless, and we need less commentary and -cherry-picking of favorite verses, and more study of the complete Bible. Dr. -McGee does just that. - -### [Enoch the Cow Vet](https://youtube.com/channel/UC6PPmHUbcdOSzX5tLB3uXdw) - -A veterinarian/agricultural channel that doesn't make me cringe. "God built -these things for cows for vets ... [there are] so many aspects of the cow that -are just designed for vets." Amen, Enoch. Amen. - -### [Proglogion](https://blog.drwile.com/) - -The blog of my high school science teacher (of sorts). It is refreshing to find -a creationist who can still think critically. I love his "bad sermon -illustrations" posts. - -### [The Milk Check](https://www.jacoby.com/learning-center/podcasts-overview/) - -A pragmatic inside look at dairy marketing. I only understand half of what -they're talking about, but I learn something new every episode. - -### [Brian Harry's Blog](https://devblogs.microsoft.com/bharry/) - -Where else are you going to find a blog about cows _and_ version control? The -blog is basically dead now, but it's still fun to go back and read the farm -stories. - -### [Car Talk](https://cartalk.com/) - -The antics of these guys are enough to make anyone have to pull over to the side -of the road from laughing too much. I dread the day when NPR fully axes the only -good program to cross their airwaves. +internet can make that cut. diff --git a/content/blogroll/brian-harry/index.md b/content/blogroll/brian-harry/index.md new file mode 100644 index 0000000..a75e0bd --- /dev/null +++ b/content/blogroll/brian-harry/index.md @@ -0,0 +1,8 @@ +--- +title: Brian Harry's blog +link: https://devblogs.microsoft.com/bharry/ +--- + +Where else are you going to find a blog about cows _and_ version control? The +blog is basically dead now, but it's still fun to go back and read the farm +stories. diff --git a/content/blogroll/brian-harry/thumbnail.png b/content/blogroll/brian-harry/thumbnail.png new file mode 100644 index 0000000..98cd5b5 Binary files /dev/null and b/content/blogroll/brian-harry/thumbnail.png differ diff --git a/content/blogroll/car-talk/index.md b/content/blogroll/car-talk/index.md new file mode 100644 index 0000000..ee66c77 --- /dev/null +++ b/content/blogroll/car-talk/index.md @@ -0,0 +1,8 @@ +--- +title: Car Talk +link: https://cartalk.com +--- + +The antics of these guys are enough to make anyone have to pull over to the side +of the road from laughing too much. I dread the day when NPR fully axes the only +good program to cross their airwaves. diff --git a/content/blogroll/car-talk/thumbnail.jpg b/content/blogroll/car-talk/thumbnail.jpg new file mode 100644 index 0000000..d09dcaf Binary files /dev/null and b/content/blogroll/car-talk/thumbnail.jpg differ diff --git a/content/blogroll/enoch-the-cow-vet/index.md b/content/blogroll/enoch-the-cow-vet/index.md new file mode 100644 index 0000000..0e3f074 --- /dev/null +++ b/content/blogroll/enoch-the-cow-vet/index.md @@ -0,0 +1,8 @@ +--- +title: Enoch the Cow Vet +link: https://youtube.com/channel/UC6PPmHUbcdOSzX5tLB3uXdw +--- + +A veterinarian/agricultural channel that doesn't make me cringe. "God built +these things for cows for vets ... [there are] so many aspects of the cow that +are just designed for vets." Amen, Enoch. Amen. diff --git a/content/blogroll/enoch-the-cow-vet/thumbnail.jpg b/content/blogroll/enoch-the-cow-vet/thumbnail.jpg new file mode 100644 index 0000000..3e99c2f Binary files /dev/null and b/content/blogroll/enoch-the-cow-vet/thumbnail.jpg differ diff --git a/content/blogroll/proslogion/index.md b/content/blogroll/proslogion/index.md new file mode 100644 index 0000000..f73002f --- /dev/null +++ b/content/blogroll/proslogion/index.md @@ -0,0 +1,8 @@ +--- +title: Proslogion +link: https://blog.drwile.com +--- + +The blog of my high school science teacher (of sorts). It is refreshing to find +a creationist who can still think critically. I love his "bad sermon +illustrations" posts. diff --git a/content/blogroll/proslogion/thumbnail.jpg b/content/blogroll/proslogion/thumbnail.jpg new file mode 100644 index 0000000..2369d6c Binary files /dev/null and b/content/blogroll/proslogion/thumbnail.jpg differ diff --git a/content/blogroll/thru-the-bible/index.md b/content/blogroll/thru-the-bible/index.md new file mode 100644 index 0000000..9863380 --- /dev/null +++ b/content/blogroll/thru-the-bible/index.md @@ -0,0 +1,8 @@ +--- +title: Thru the Bible +link: https://ttb.org +--- + +I'm convinced that the word of God is timeless, and we need less commentary and +cherry-picking of favorite verses, and more study of the complete Bible. Dr. +McGee does just that. diff --git a/content/blogroll/thru-the-bible/thumbnail.jpg b/content/blogroll/thru-the-bible/thumbnail.jpg new file mode 100644 index 0000000..87c7d57 Binary files /dev/null and b/content/blogroll/thru-the-bible/thumbnail.jpg differ diff --git a/assets/images/eclipse.jpg b/content/blogroll/thumbnail.jpg similarity index 100% rename from assets/images/eclipse.jpg rename to content/blogroll/thumbnail.jpg diff --git a/content/code/_content.gotmpl b/content/code/_content.gotmpl new file mode 100644 index 0000000..2992e8b --- /dev/null +++ b/content/code/_content.gotmpl @@ -0,0 +1,75 @@ +{{ $data := dict }} +{{ $url := "https://code.millironx.com/api/v1/users/millironx/repos" }} +{{ with try (resources.GetRemote $url) }} + {{ with .Err }} + {{ errorf "Unable to get remote resource %s: %s" $url . }} + {{ else with .Value }} + {{ $data = . | transform.Unmarshal }} + {{ end }} +{{ else }} + {{ errorf "Unable to get remote resource %s" $url }} +{{ end }} + +{{ range $data }} + {{/* Get tags of this repository. To quote Steve Edstrom, "If it doesn't have a + tag, it doesn't count." + */}} + {{ $tagUrl := print "https://code.millironx.com/api/v1/repos/millironx/" .name "/tags" }} + {{ $tagData := dict }} + {{ with try (resources.GetRemote $tagUrl) }} + {{ with .Err }} + {{ errorf "Unable to get remote resource %s: %s" $tagUrl . }} + {{ else with .Value }} + {{ $tagData = . | transform.Unmarshal }} + {{ end }} + {{ else }} + {{ errorf "Unable to get remote resource %s" $tagUrl }} + {{ end }} + + {{ $firstTag := index $tagData 0 }} + + {{ if $firstTag }} + {{ $dates := dict "date" (time.AsTime $firstTag.commit.created) }} + + {{ $content := dict "mediaType" "text/markdown" "value" .description }} + {{ $categories := slice "code" }} + {{ $people := slice "Thomas A. Christensen II" }} + {{ $link := .html_url }} + {{ $featured := (gt .stars_count 0) }} + {{ $tags := .topics }} + {{ $params := dict + "categories" $categories + "people" $people + "link" $link + "featured" $featured + "tags" $tags + }} + {{ $page := dict + "content" $content + "dates" $dates + "title" .name + "path" .name + "params" $params + }} + {{ $.AddPage $page }} + + {{ $item := . }} + {{ with $url := $item.avatar_url }} + {{ with resources.GetRemote $url }} + {{ with .Err }} + {{ errorf "Unable to get remote resource %s: %s" $url . }} + {{ else }} + {{ $content := dict "mediaType" .MediaType.Type "value" .Content }} + {{ $resource := dict + "content" $content + "path" (print $item.name "/thumbnail." .MediaType.SubType) + }} + {{ $.AddResource $resource }} + {{ end }} + {{ else }} + {{ errorf "Unable to get remote resource %s" $url }} + {{ end }} + {{ end }} + {{ end }} + +{{ end }} diff --git a/content/code/_index.md b/content/code/_index.md new file mode 100644 index 0000000..c7c7df5 --- /dev/null +++ b/content/code/_index.md @@ -0,0 +1,14 @@ +--- +title: Coding projects +menu: + main: + name: Code + params: + icon: code + link: https://code.millironx.com + weight: 50 +fa-thumbnail: code +link: https://code.millironx.com +--- + +A Forgejo instance dedicated to cows and technology diff --git a/content/contact/_index.html b/content/contact/_index.html index 79d864c..3d73f4f 100644 --- a/content/contact/_index.html +++ b/content/contact/_index.html @@ -15,12 +15,21 @@ menu: weight: 1 fa-thumbnail: file-signature validation: true +suppressRss: true --- + +
Contact Me - + + + +
+