Finalize framework: Fix submodules and clean artifacts
This commit is contained in:
132
.gitignore
vendored
Normal file
132
.gitignore
vendored
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
# Hugo build folder
|
||||||
|
public/
|
||||||
|
# Hugo resource cache
|
||||||
|
resources/_gen/
|
||||||
|
# Build locks and temporary files
|
||||||
|
.hugo_build.lock
|
||||||
|
.DS_Store
|
||||||
|
# Temporary system files
|
||||||
|
Thumbs.db
|
||||||
|
# Hugo generated search/taxonomy files (if they are in the root)
|
||||||
|
index.json
|
||||||
|
index.xml
|
||||||
|
sitemap.xml
|
||||||
|
# If you have specific node_modules or temp files
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||||
|
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||||
|
|
||||||
|
# Runtime data
|
||||||
|
pids
|
||||||
|
*.pid
|
||||||
|
*.seed
|
||||||
|
*.pid.lock
|
||||||
|
|
||||||
|
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||||
|
lib-cov
|
||||||
|
|
||||||
|
# Coverage directory used by tools like istanbul
|
||||||
|
coverage
|
||||||
|
*.lcov
|
||||||
|
|
||||||
|
# nyc test coverage
|
||||||
|
.nyc_output
|
||||||
|
|
||||||
|
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||||
|
.grunt
|
||||||
|
|
||||||
|
# Bower dependency directory (https://bower.io/)
|
||||||
|
bower_components
|
||||||
|
|
||||||
|
# node-waf configuration
|
||||||
|
.lock-wscript
|
||||||
|
|
||||||
|
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||||
|
build/Release
|
||||||
|
|
||||||
|
# Dependency directories
|
||||||
|
node_modules/
|
||||||
|
jspm_packages/
|
||||||
|
|
||||||
|
# TypeScript v1 declaration files
|
||||||
|
typings/
|
||||||
|
|
||||||
|
# TypeScript cache
|
||||||
|
*.tsbuildinfo
|
||||||
|
|
||||||
|
# Optional npm cache directory
|
||||||
|
.npm
|
||||||
|
|
||||||
|
# Optional eslint cache
|
||||||
|
.eslintcache
|
||||||
|
|
||||||
|
# Microbundle cache
|
||||||
|
.rpt2_cache/
|
||||||
|
.rts2_cache_cjs/
|
||||||
|
.rts2_cache_es/
|
||||||
|
.rts2_cache_umd/
|
||||||
|
|
||||||
|
# Optional REPL history
|
||||||
|
.node_repl_history
|
||||||
|
|
||||||
|
# Output of 'npm pack'
|
||||||
|
*.tgz
|
||||||
|
|
||||||
|
# Yarn Integrity file
|
||||||
|
.yarn-integrity
|
||||||
|
|
||||||
|
# dotenv environment variables file
|
||||||
|
.env
|
||||||
|
.env.test
|
||||||
|
|
||||||
|
# parcel-bundler cache (https://parceljs.org/)
|
||||||
|
.cache
|
||||||
|
|
||||||
|
# Next.js build output
|
||||||
|
.next
|
||||||
|
|
||||||
|
# Nuxt.js build / generate output
|
||||||
|
.nuxt
|
||||||
|
dist
|
||||||
|
|
||||||
|
# Gatsby files
|
||||||
|
.cache/
|
||||||
|
# Comment in the public line in if your project uses Gatsby and *not* Next.js
|
||||||
|
# https://nextjs.org/blog/next-9-1#public-directory-support
|
||||||
|
# public
|
||||||
|
|
||||||
|
# vuepress build output
|
||||||
|
.vuepress/dist
|
||||||
|
|
||||||
|
# Serverless directories
|
||||||
|
.serverless/
|
||||||
|
|
||||||
|
# FuseBox cache
|
||||||
|
.fusebox/
|
||||||
|
|
||||||
|
# DynamoDB Local files
|
||||||
|
.dynamodb/
|
||||||
|
|
||||||
|
# TernJS port file
|
||||||
|
.tern-port
|
||||||
|
|
||||||
|
# --- Added to exclude Hugo build artifacts ---
|
||||||
|
/index.html
|
||||||
|
/404.html
|
||||||
|
/css/
|
||||||
|
/js/
|
||||||
|
/img/
|
||||||
|
/lib/
|
||||||
|
/series/
|
||||||
|
/tags/
|
||||||
|
/update.sh
|
||||||
|
/layouts/partials/head_temp_overide.html
|
||||||
7
.gitmodules
vendored
Normal file
7
.gitmodules
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
[submodule "themes/blowfish"]
|
||||||
|
path = themes/blowfish
|
||||||
|
url = https://github.com/nunocoracao/blowfish.git
|
||||||
|
branch = main
|
||||||
|
[submodule "themes/hugo-admonitions"]
|
||||||
|
path = themes/hugo-admonitions
|
||||||
|
url = https://github.com/KKKZOZ/hugo-admonitions.git
|
||||||
2
FUNDING.YML
Normal file
2
FUNDING.YML
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
github: [nunocoracao]
|
||||||
|
custom: ["https://www.paypal.me/nunocoracao", "https://www.buymeacoffee.com/nunocoracao"]
|
||||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2022 Nuno Coração
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
102
README.md
Normal file
102
README.md
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
# Project: Self-Hosted CI/CD and Static Hosting (Blowfish)
|
||||||
|
|
||||||
|
This project manages a centralized self-hosted environment using **Gitea** for version control and automation, **Caddy** as a lightweight web server, and **Nginx Proxy Manager** for SSL termination. The system relies on a shared host volume to move static files from the Gitea Runner to the web server directory.
|
||||||
|
|
||||||
|
## 🏗️ Architecture Split
|
||||||
|
|
||||||
|
To allow for seamless Dev vs. Prod workflows, the architecture is split into two repositories:
|
||||||
|
|
||||||
|
1. **Framework (`/srv/dev/hugo/wiki`)**: This repository (`hugo-framework`). Contains the Hugo engine, themes (Blowfish), layouts, and configuration.
|
||||||
|
2. **Content (`/srv/docs/public`)**: A separate repository (`docs-public`). Contains only the Markdown files and static assets.
|
||||||
|
|
||||||
|
**Local Dev "Live Link":**
|
||||||
|
In this `hugo-framework` repository, `content/` and `static/` are **symbolic links** pointing to `/srv/docs/public`. This allows for real-time local previews of your notes when running `hugo server`.
|
||||||
|
|
||||||
|
## 🚀 CI/CD Pipeline
|
||||||
|
|
||||||
|
Deployment is fully automated through Gitea Actions.
|
||||||
|
|
||||||
|
1. **Trigger:** Push a commit to the `main` branch of the `docs-public` repository.
|
||||||
|
2. **Runner Execution:** The Gitea Runner mounts the `hugo-framework` directory and executes the build steps.
|
||||||
|
3. **Sync:** The Runner uses a volume mount (`/srv/caddy/sites:/deploy`) to copy the generated `public/` folder directly to the host's web server directory.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💻 Local Development
|
||||||
|
|
||||||
|
1. **Work in the Docs folder**: Edit your markdown files in `/srv/docs/public/`.
|
||||||
|
2. **Asset Management:** Place any files for download (PDFs, images) in the `/srv/docs/public/static/` directory.
|
||||||
|
3. **Preview changes (Code-Server)**:
|
||||||
|
```bash
|
||||||
|
cd /srv/dev/hugo/wiki
|
||||||
|
alias hugo-rebuild='rm -rf public/ && hugo server --bind 0.0.0.0 --appendPort=false --baseURL="/" --ignoreCache'
|
||||||
|
hugo-rebuild
|
||||||
|
```
|
||||||
|
4. **Deploy**:
|
||||||
|
```bash
|
||||||
|
cd /srv/docs/public
|
||||||
|
git add .
|
||||||
|
git commit -m "Your note update"
|
||||||
|
git push origin main
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🛠️ Hugo Fresh Installation Notes
|
||||||
|
|
||||||
|
To rebuild this environment—especially for a project like **Blowfish**—you need more than just the binary; you need the extended capabilities for CSS processing.
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
|
||||||
|
- **Hugo (Extended Version)**: Required for SCSS/PostCSS processing.
|
||||||
|
- **Node.js** & **npm**: Required for managing the theme's dependencies.
|
||||||
|
- **npx**: Comes with npm; used to run build-time tools for Blowfish.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install nvm script and updating bashrc
|
||||||
|
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1. Installation (The "Extended" Way)
|
||||||
|
|
||||||
|
* **Linux/Ubuntu:** Use the `.deb` package from the [Hugo GitHub releases](https://github.com/gohugoio/hugo/releases).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wget https://github.com/gohugoio/hugo/releases/download/v0.140.0/hugo_extended_0.140.0_linux-amd64.deb
|
||||||
|
sudo dpkg -i hugo_extended_0.140.0_linux-amd64.deb
|
||||||
|
```
|
||||||
|
* **Verify:** Ensure you have the extended version: `hugo version` (it should explicitly say `+extended`).
|
||||||
|
|
||||||
|
### 2. Initialize the Framework
|
||||||
|
|
||||||
|
If you are cloning this `hugo-framework` repository fresh:
|
||||||
|
|
||||||
|
1. **Clone the Repo**:
|
||||||
|
```bash
|
||||||
|
git clone https://git.wompmacho.com/wompmacho/hugo-framework.git my-wiki
|
||||||
|
cd my-wiki
|
||||||
|
```
|
||||||
|
2. **Pull Submodules** (The Blowfish theme):
|
||||||
|
```bash
|
||||||
|
git submodule update --init --recursive
|
||||||
|
```
|
||||||
|
3. **Install Node Dependencies**:
|
||||||
|
```bash
|
||||||
|
npm install
|
||||||
|
```
|
||||||
|
4. **Establish Symlinks** (Point to your content repo):
|
||||||
|
```bash
|
||||||
|
rm -rf content static
|
||||||
|
ln -s /path/to/docs-public/content ./content
|
||||||
|
ln -s /path/to/docs-public/static ./static
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Critical Blowfish Configuration Note
|
||||||
|
|
||||||
|
To prevent common theme breakage during a fresh setup, you must initialize the configuration files correctly:
|
||||||
|
|
||||||
|
- Copy the config directory from `themes/blowfish/config/_default/` to your project's `config/` directory.
|
||||||
|
- Ensure your `hugo.toml` (or `config.toml`) correctly references the Blowfish theme.
|
||||||
|
- If the site is blank, run `npx postcss` or ensure your `package.json` has the correct scripts to compile SCSS, as Hugo cannot process Blowfish's advanced CSS/JS requirements without these tools.
|
||||||
|
|
||||||
|
For full theme documentation, visit: https://blowfish.page/docs/
|
||||||
10
archetypes/default.md
Normal file
10
archetypes/default.md
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
title: "{{ replace .Name "-" " " | title }}"
|
||||||
|
description: "{{ replace .Name "-" " " | title }}"
|
||||||
|
summary: ""
|
||||||
|
date: {{ .Date }}
|
||||||
|
lastmod: {{ .Date }}
|
||||||
|
author: wompmacho
|
||||||
|
draft: true
|
||||||
|
---
|
||||||
|
|
||||||
89
assets/css/custom.css
Normal file
89
assets/css/custom.css
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
/* --- 1. Global Prose Rules --- */
|
||||||
|
.article-content.prose {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 65ch;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --- 2. Absolute Isolation Layout --- */
|
||||||
|
.single-post-wrapper {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column; /* On mobile, they stack normally */
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 1280px) {
|
||||||
|
.single-post-wrapper {
|
||||||
|
display: block; /* Turns off Flexbox completely */
|
||||||
|
}
|
||||||
|
|
||||||
|
#main-content {
|
||||||
|
/* Standard block behavior: automatically centers prose within wrapper */
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar-toc {
|
||||||
|
/* Removes the TOC from document flow entirely */
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
|
||||||
|
/* Math: Center of wrapper (50%) + half the prose width (32.5ch) + 2rem gap */
|
||||||
|
left: calc(50% + 32.5ch + 2rem);
|
||||||
|
|
||||||
|
/* The aside needs to be exactly 100% height of the wrapper for sticky to work */
|
||||||
|
height: 100%;
|
||||||
|
width: 256px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --- 3. Sticky TOC Logic --- */
|
||||||
|
#sidebar-toc .toc {
|
||||||
|
position: sticky;
|
||||||
|
top: 6rem;
|
||||||
|
max-height: calc(100vh - 8rem);
|
||||||
|
overflow-y: auto;
|
||||||
|
padding-right: 1rem;
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --- 4. Projects Page (Isolated) --- */
|
||||||
|
.projects-list {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
|
||||||
|
gap: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --- Base Styles --- */
|
||||||
|
#resume-table p { padding: .5em }
|
||||||
|
.iframe-wrapper { position: relative; padding-bottom: 56.25%; padding-top: 25px; height: 0; }
|
||||||
|
.iframe-wrapper iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
|
||||||
|
#resume-table { border-collapse: collapse }
|
||||||
|
#resume-table .statements td { font-style: italic; padding: 1em; text-align: center }
|
||||||
|
#resume-table .header { padding-top: 1em; padding-left: 1em; font-weight: 700; text-transform: uppercase; text-align: left }
|
||||||
|
.google-blue { color: #4285f4; font-weight: bolder; }
|
||||||
|
.google-red { color: #ea4335; font-weight: bolder; }
|
||||||
|
.google-yellow { color: #fbbc04; font-weight: bolder; }
|
||||||
|
.google-green { color: #34a853; font-weight: bolder; }
|
||||||
|
.header-google-blue { border-bottom: 4px solid #4285f4 }
|
||||||
|
.header-google-red { border-bottom: 4px solid #ea4335 }
|
||||||
|
.header-google-yellow { border-bottom: 4px solid #fbbc04 }
|
||||||
|
.header-google-green { border-bottom: 4px solid #34a853 }
|
||||||
|
#resume-table td, #resume-table tr { border-width: 0 }
|
||||||
|
#resume-table ul { margin-top: 0; margin-bottom: 0 }
|
||||||
|
#resume-table .section-header td { padding-top: .66em; font-weight: 700 }
|
||||||
|
#resume-table .role { padding: .66em; text-align: left }
|
||||||
|
#resume-table .dates { text-align: right; padding-right: 1em }
|
||||||
|
#resume-table .quote { text-align: center }
|
||||||
|
#resume-table .twitter-blue { color: #1da1f2; font-weight: bolder }
|
||||||
|
.center { text-align: center; padding: .5em }
|
||||||
|
img[src$='#center']{ display: block; margin: 0.7rem auto; }
|
||||||
|
img[src$='#floatleft']{ float:left; margin: 0.7rem; }
|
||||||
|
img[src$='#floatright']{ float:right; margin: 0.7rem; }
|
||||||
|
.homepage .content { text-align: left; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Hide any TOC link that points to an element with the 'no-toc' class */
|
||||||
|
.toc-right a.no-toc-link,
|
||||||
|
.toc-inside a.no-toc-link {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
BIN
assets/devops-lifecycle.png
Normal file
BIN
assets/devops-lifecycle.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 163 KiB |
BIN
assets/devops_diagram.png
Normal file
BIN
assets/devops_diagram.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 163 KiB |
57
assets/icons/SE_home_page_logo.svg
Normal file
57
assets/icons/SE_home_page_logo.svg
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
<svg width="537" height="156" viewBox="0 0 537 156" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M132.816 86.9339C136.531 90.3333 141.168 92.1849 145.035 92.1849C149.263 92.1849 151.79 90.5897 151.79 87.8075C151.79 79.7742 132.303 84.2561 132.303 71.4276C132.303 65.246 137.614 61.3813 145.453 61.3813C150.147 61.3813 154.736 62.8721 158.08 65.0941L155.553 70.4496C151.638 68.0757 147.714 67.0977 144.987 67.0977C141.434 67.0977 139.115 68.4365 139.115 70.8579C139.115 78.7392 158.603 74.5137 158.546 87.4941C158.546 93.9321 152.874 97.9013 144.94 97.9013C139.267 97.9013 133.908 95.5843 130.193 92.1849L132.825 86.9339H132.816Z" fill="white"/>
|
||||||
|
<path d="M162.679 67.5535L168.551 63.8027V71.3232H176.647V75.7576H168.551V88.8995C168.551 91.7292 169.635 92.6122 171.487 92.6122C172.723 92.6122 174.015 92.2039 175.611 91.4253L177.103 95.9547C174.936 97.2461 172.666 97.9677 170.347 97.9677C166.224 97.9677 162.67 95.5939 162.67 89.982V67.5535H162.679Z" fill="white"/>
|
||||||
|
<path d="M180.562 70.2978H186.491V75.7577C188.343 72.045 191.65 70.0889 195.973 70.0889V75.7577C190.462 75.4444 186.956 78.6918 186.491 83.3826V97.7019H180.562V70.2978Z" fill="white"/>
|
||||||
|
<path d="M210.453 70.0889C220.097 70.0889 224.012 76.3749 223.29 86.2693H202.567C203.498 90.4948 206.738 93.1251 211.071 93.1251C214.064 93.1251 216.791 91.9951 218.805 89.9346L221.95 93.2865C219.271 96.2206 215.356 97.9203 210.605 97.9203C202.149 97.9203 196.581 92.3085 196.581 84.0663C196.581 75.8242 202.301 70.1553 210.444 70.1079L210.453 70.0889ZM218.131 81.9393C217.922 77.5049 214.986 74.8272 210.501 74.8272C206.016 74.8272 203.128 77.5619 202.463 81.9393H218.131Z" fill="white"/>
|
||||||
|
<path d="M235.832 81.2179H244.136V80.3918C244.136 76.9354 241.923 74.8748 237.59 74.8748C234.958 74.8748 232.231 75.8054 229.494 77.657L227.072 73.536C230.882 71.2665 233.666 70.0796 238.873 70.0796C245.932 70.0796 249.904 73.6879 249.961 79.7176L250.008 97.6927H244.184V94.3407C242.227 96.7621 239.082 97.949 235.11 97.949C229.181 97.949 225.466 94.2933 225.466 89.4505C225.466 84.6078 229.228 81.2559 235.823 81.2084L235.832 81.2179ZM236.355 93.2677C240.583 93.2677 243.832 91.0553 244.136 88.0642V85.5383H236.716C232.849 85.5383 231.043 86.5639 231.043 89.1941C231.043 91.663 233.058 93.2677 236.355 93.2677Z" fill="white"/>
|
||||||
|
<path d="M255.87 70.2978H261.742V75.6058C263.652 71.7411 267.158 70.0889 271.69 70.0889C276.584 70.0889 279.938 72.5102 281.23 76.6788C282.978 72.0924 286.646 70.0889 291.643 70.0889C297.934 70.0889 301.696 74.1055 301.696 80.6479V97.7019H295.767V82.3001C295.767 78.1316 293.297 75.6058 289.268 75.6058C284.574 75.7577 281.743 79.366 281.743 84.1613V97.7114H275.814V82.3096C275.814 78.1411 273.391 75.6153 269.372 75.6153C264.631 75.7672 261.742 79.3755 261.742 84.1708V97.7209H255.87V70.3168V70.2978Z" fill="white"/>
|
||||||
|
<path d="M491.861 67.5535L497.733 63.8027V71.3232H505.828V75.7576H497.733V88.8995C497.733 91.7292 498.816 92.6122 500.669 92.6122C501.904 92.6122 503.196 92.2039 504.793 91.4253L506.284 95.9547C504.118 97.2461 501.847 97.9677 499.529 97.9677C495.405 97.9677 491.852 95.5939 491.852 89.982V67.5535H491.861Z" fill="white"/>
|
||||||
|
<path d="M308.157 61.6374H333.935V67.0974H314.238V76.8303H331.864V82.2903H314.238V92.2321H334.553V97.692H308.157V61.6279V61.6374Z" fill="white"/>
|
||||||
|
<path d="M339.237 61.6382H345.166V97.7023H339.237V61.6382Z" fill="white"/>
|
||||||
|
<path d="M363.418 70.0889C373.062 70.0889 376.977 76.3749 376.255 86.2693H355.532C356.463 90.4948 359.703 93.1251 364.036 93.1251C367.029 93.1251 369.756 91.9951 371.77 89.9346L374.915 93.2865C372.236 96.2206 368.321 97.9203 363.57 97.9203C355.114 97.9203 349.546 92.3085 349.546 84.0663C349.546 75.8242 355.266 70.1553 363.409 70.1079L363.418 70.0889ZM371.095 81.9393C370.886 77.5049 367.95 74.8272 363.466 74.8272C358.981 74.8272 356.092 77.5619 355.427 81.9393H371.095Z" fill="white"/>
|
||||||
|
<path d="M380.578 70.2978H386.45V75.6058C388.36 71.7411 391.866 70.0889 396.398 70.0889C401.292 70.0889 404.646 72.5102 405.938 76.6788C407.686 72.0924 411.354 70.0889 416.351 70.0889C422.642 70.0889 426.404 74.1055 426.404 80.6479V97.7019H420.475V82.3001C420.475 78.1316 418.005 75.6058 413.976 75.6058C409.282 75.7577 406.451 79.366 406.451 84.1613V97.7114H400.522V82.3096C400.522 78.1411 398.099 75.6153 394.08 75.6153C389.339 75.7672 386.45 79.3755 386.45 84.1708V97.7209H380.578V70.3168V70.2978Z" fill="white"/>
|
||||||
|
<path d="M444.097 70.0889C453.741 70.0889 457.656 76.3749 456.933 86.2693H436.211C437.142 90.4948 440.382 93.1251 444.714 93.1251C447.707 93.1251 450.434 91.9951 452.449 89.9346L455.594 93.2865C452.914 96.2206 449 97.9203 444.249 97.9203C435.793 97.9203 430.225 92.3085 430.225 84.0663C430.225 75.8242 435.945 70.1553 444.087 70.1079L444.097 70.0889ZM451.774 81.9393C451.565 77.5049 448.629 74.8272 444.144 74.8272C439.66 74.8272 436.771 77.5619 436.106 81.9393H451.774Z" fill="white"/>
|
||||||
|
<path d="M461.256 70.2978H467.185V75.5488C469.142 71.7411 472.648 70.0889 477.285 70.0889C483.68 70.0889 487.49 74.1055 487.49 80.6479V97.7019H481.561V82.3002C481.561 78.1791 479.09 75.6533 474.967 75.6533C470.434 75.7007 467.593 78.8438 467.185 83.1263V97.7019H461.256V70.2978Z" fill="white"/>
|
||||||
|
<path d="M509.742 89.8677C512.117 91.9757 515.927 93.2671 518.92 93.2671C521.448 93.2671 523.405 92.3936 523.405 90.333C523.405 84.7211 508.972 87.8642 509.02 77.9698C509.02 72.4054 513.866 70.041 519.12 70.041C522.569 70.041 526.237 71.0665 528.707 72.8232L526.541 77.2007C524.118 75.7099 521.077 74.7793 518.654 74.7793C516.231 74.7793 514.635 75.5484 514.635 77.5045C514.635 82.5562 529.22 79.8214 529.173 89.7633C529.173 95.3752 524.175 97.901 518.654 97.901C514.635 97.901 510.359 96.5621 507.623 94.0933L509.732 89.8677H509.742Z" fill="white"/>
|
||||||
|
<path d="M68.4035 36.1133L70.9784 41.1174C88.0432 47.2326 99.7681 63.6979 99.7681 81.9293C99.7681 105.839 80.309 125.286 56.384 125.286C32.4591 125.286 13.0094 105.839 13.0094 81.9293C13.0094 63.6884 24.7343 47.2326 41.7991 41.1174L44.3741 36.1228C23.7082 41.5257 8.99976 60.3364 8.99976 81.9293C8.99976 108.042 30.2642 129.293 56.3935 129.293C82.5228 129.293 103.787 108.042 103.787 81.9293C103.787 60.3364 89.0789 41.5163 68.4035 36.1133Z" fill="url(#paint0_linear_131_34)"/>
|
||||||
|
<mask id="mask0_131_34" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="15" y="41" width="82" height="82">
|
||||||
|
<path d="M56.3919 122.296C78.7622 122.296 96.897 104.172 96.897 81.816C96.897 59.4597 78.7622 41.3364 56.3919 41.3364C34.0215 41.3364 15.8867 59.4597 15.8867 81.816C15.8867 104.172 34.0215 122.296 56.3919 122.296Z" fill="white"/>
|
||||||
|
</mask>
|
||||||
|
<g mask="url(#mask0_131_34)">
|
||||||
|
<path d="M96.9739 80.8568C96.7459 83.9334 91.9856 96.7239 86.1326 96.7239C83.7572 96.7239 83.2252 93.2485 82.8356 90.6658C81.7809 94.7868 74.5122 103.694 69.1248 103.694C59.3287 103.694 57.0484 83.0408 56.3832 80.2871C55.7181 83.0313 53.4378 103.694 43.6417 103.694C38.2543 103.694 30.9856 94.7963 29.9309 90.6658C29.5413 93.2485 29.0188 96.7239 26.6339 96.7239C20.7809 96.7239 16.0206 83.9334 15.7926 80.8568C14.5384 82.7085 14.5574 90.191 16.4197 94.9862C22.6337 110.986 38.1973 122.352 56.3737 122.352C74.5502 122.352 90.1138 110.986 96.3278 94.9862C98.1901 90.191 98.2091 82.718 96.9549 80.8568H96.9739Z" fill="url(#paint1_linear_131_34)"/>
|
||||||
|
<path d="M56.3922 103.751C58.0075 106.713 61.523 111.148 67.547 111.148C73.571 111.148 78.2553 104.938 79.823 102.317C79.3195 104.159 78.3028 108.1 81.5808 108.1C89.0966 108.1 94.5315 96.2207 94.5315 96.2207C88.6025 111.49 73.742 122.343 56.3922 122.343C39.0423 122.343 24.1819 111.49 18.2529 96.2207C18.2529 96.2207 23.6878 108.1 31.2036 108.1C34.4911 108.1 33.4649 104.149 32.9613 102.317C34.5291 104.938 39.0613 111.148 45.2374 111.148C51.2613 111.148 54.7674 106.704 56.3922 103.751Z" fill="url(#paint2_linear_131_34)"/>
|
||||||
|
<path d="M65.9417 117.073C62.2456 117.073 59.3666 115.924 56.3927 114.073C53.4187 115.915 50.5397 117.073 46.8436 117.073C41.2092 117.073 39.4989 115.411 37.4561 113.892C37.5131 115.829 39.4894 118.564 41.5322 119.551C46.0645 121.546 51.1573 122.343 56.3927 122.343C61.628 122.343 66.7209 121.536 71.2531 119.551C73.2959 118.554 75.2628 115.829 75.3293 113.892C73.2864 115.411 71.5762 117.073 65.9417 117.073Z" fill="url(#paint3_linear_131_34)"/>
|
||||||
|
</g>
|
||||||
|
<path d="M50.9209 62.1599L45.1059 74.4756C44.8684 74.9789 44.7829 75.5486 44.8779 76.1089L46.7212 87.2376C46.7782 87.5985 47.3103 87.5985 47.3673 87.2376L48.365 81.17C48.7735 78.6537 50.1132 76.3747 52.1181 74.789L50.9209 62.1504V62.1599Z" fill="#FF4800"/>
|
||||||
|
<path d="M61.8671 62.1599L67.6821 74.4756C67.9196 74.9789 68.0051 75.5486 67.9101 76.1089L66.0668 87.2471C66.0098 87.608 65.4872 87.608 65.4207 87.2471L64.423 81.17C64.0145 78.6537 62.6748 76.3747 60.6699 74.789L61.8671 62.1504V62.1599Z" fill="#FF4800"/>
|
||||||
|
<path d="M64.9825 42.8362L57.0107 27.3774C56.7542 26.8742 56.0416 26.8742 55.7755 27.3774L47.8037 42.8267C47.4712 43.4629 47.3477 44.1941 47.4522 44.8967L51.4713 73.1365L50.8727 75.7763L52.9916 81.5876C53.0391 81.7205 53.1626 81.806 53.2956 81.806H59.4621C59.5952 81.806 59.7187 81.7205 59.7662 81.5876L61.885 75.7763L61.2864 73.1365L65.3056 44.8967C65.4101 44.1846 65.2866 43.4629 64.954 42.8267L64.9825 42.8362Z" fill="url(#paint4_linear_131_34)"/>
|
||||||
|
<path d="M56.1181 68.4835L53.2866 75.4817C52.8496 76.5642 52.764 77.7607 53.0491 78.8906L56.0706 90.988C56.1561 91.3203 56.6312 91.3203 56.7072 90.988L59.7287 78.8906C60.0137 77.7607 59.9282 76.5642 59.4911 75.4817L56.6597 68.4835C56.5552 68.2366 56.2036 68.2366 56.1086 68.4835H56.1181Z" fill="#FF4800"/>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="paint0_linear_131_34" x1="56.3935" y1="9.19338" x2="56.3935" y2="159.451" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0.3" stop-color="#00ADFF"/>
|
||||||
|
<stop offset="1" stop-color="#1542FF"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint1_linear_131_34" x1="56.3927" y1="82.0248" x2="56.3927" y2="136.026" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#FCE3AD"/>
|
||||||
|
<stop offset="0.07" stop-color="#FCE2A4"/>
|
||||||
|
<stop offset="0.19" stop-color="#FCE08B"/>
|
||||||
|
<stop offset="0.33" stop-color="#FCDD64"/>
|
||||||
|
<stop offset="0.48" stop-color="#FCDA32"/>
|
||||||
|
<stop offset="0.66" stop-color="#F9BC22"/>
|
||||||
|
<stop offset="1" stop-color="#F57700"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint2_linear_131_34" x1="56.3922" y1="95.8409" x2="56.3922" y2="126.531" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#FCD619"/>
|
||||||
|
<stop offset="0.35" stop-color="#F9B811"/>
|
||||||
|
<stop offset="1" stop-color="#F57700"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint3_linear_131_34" x1="56.3927" y1="111.186" x2="56.3927" y2="125.334" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#F57700"/>
|
||||||
|
<stop offset="1" stop-color="#FF4800"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint4_linear_131_34" x1="56.3931" y1="27.0071" x2="56.3931" y2="98.3757" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#E4E4E4"/>
|
||||||
|
<stop offset="0.88" stop-color="#B6B8B8"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 10 KiB |
BIN
assets/me/me_stream_doom.PNG
Normal file
BIN
assets/me/me_stream_doom.PNG
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 756 KiB |
BIN
assets/me/wampyDance.gif
Normal file
BIN
assets/me/wampyDance.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.2 MiB |
432
authors/index.html
Normal file
432
authors/index.html
Normal file
@@ -0,0 +1,432 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html
|
||||||
|
lang="en"
|
||||||
|
dir="ltr"
|
||||||
|
class="scroll-smooth"
|
||||||
|
data-default-appearance="light"
|
||||||
|
data-auto-appearance="true"><head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
|
||||||
|
<meta http-equiv="content-language" content="en">
|
||||||
|
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||||
|
<meta name="theme-color">
|
||||||
|
|
||||||
|
|
||||||
|
<title>Authors · Blowfish</title>
|
||||||
|
<meta name="title" content="Authors · Blowfish">
|
||||||
|
|
||||||
|
|
||||||
|
<meta name="description" content="My awesome website">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="canonical" href="/authors/">
|
||||||
|
|
||||||
|
<link rel="alternate" type="application/rss+xml" href="/authors/index.xml" title="Blowfish" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link
|
||||||
|
type="text/css"
|
||||||
|
rel="stylesheet"
|
||||||
|
href="/css/main.bundle.min.d7672814413dccdcf76c504d9b0ebb8d0f964dbe6b30a3d4b25b15809a94c2eb732d99898aded2009aacdd1fa8b17cea1369fd81560790cd355aee00bbd142fd.css"
|
||||||
|
integrity="sha512-12coFEE9zNz3bFBNmw67jQ+WTb5rMKPUslsVgJqUwutzLZmJit7SAJqs3R+osXzqE2n9gVYHkM01Wu4Au9FC/Q==">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script
|
||||||
|
type="text/javascript"
|
||||||
|
src="/js/appearance.min.516a16745bea5a9bd011138d254cc0fd3973cd55ce6e15f3dec763e7c7c2c7448f8fe7b54cca811cb821b0c7e12cd161caace1dd794ac3d34d40937cbcc9ee12.js"
|
||||||
|
integrity="sha512-UWoWdFvqWpvQERONJUzA/TlzzVXObhXz3sdj58fCx0SPj+e1TMqBHLghsMfhLNFhyqzh3XlKw9NNQJN8vMnuEg=="></script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script
|
||||||
|
defer
|
||||||
|
type="text/javascript"
|
||||||
|
id="script-bundle"
|
||||||
|
src="/js/main.bundle.min.98bb8ce8f123e03c4d2171eeec151dd404b5c476beb5ef1068d0e8b1a2afb923065e6552fc14b2d867c85ee4bd8529a43193f729f874d3908517ba03b5d1cc57.js"
|
||||||
|
integrity="sha512-mLuM6PEj4DxNIXHu7BUd1AS1xHa+te8QaNDosaKvuSMGXmVS/BSy2GfIXuS9hSmkMZP3Kfh005CFF7oDtdHMVw=="
|
||||||
|
data-copy="Copy"
|
||||||
|
data-copied="Copied"></script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script src="/lib/zoom/zoom.min.umd.a527109b68c082a70f3697716dd72a9d5aa8b545cf800cecbbc7399f2ca6f6e0ce3e431f2062b48bbfa47c9ea42822714060bef309be073f49b9c0e30d318d7b.js" integrity="sha512-pScQm2jAgqcPNpdxbdcqnVqotUXPgAzsu8c5nyym9uDOPkMfIGK0i7+kfJ6kKCJxQGC+8wm+Bz9JucDjDTGNew=="></script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
|
||||||
|
<link rel="manifest" href="/site.webmanifest">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:url" content="/authors/">
|
||||||
|
<meta property="og:site_name" content="Blowfish">
|
||||||
|
<meta property="og:title" content="Authors">
|
||||||
|
<meta property="og:description" content="My awesome website">
|
||||||
|
<meta property="og:locale" content="en">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="Authors">
|
||||||
|
<meta name="twitter:description" content="My awesome website">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<meta name="author" content="Your name here">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script src="/lib/jquery/jquery.slim.min.b0dca576e87d7eaa5850ae4e61759c065786cdb6489d68fcc82240539eebd5da522bdb4fda085ffd245808c8fe2acb2516408eb774ef26b5f6015fc6737c0ea8.js" integrity="sha512-sNylduh9fqpYUK5OYXWcBleGzbZInWj8yCJAU57r1dpSK9tP2ghf/SRYCMj+KsslFkCOt3TvJrX2AV/Gc3wOqA=="></script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body
|
||||||
|
class="flex flex-col h-screen px-6 m-auto text-lg leading-7 max-w-7xl bg-neutral text-neutral-900 dark:bg-neutral-800 dark:text-neutral sm:px-14 md:px-24 lg:px-32 scrollbar-thin scrollbar-track-neutral-200 scrollbar-thumb-neutral-400 dark:scrollbar-track-neutral-800 dark:scrollbar-thumb-neutral-600">
|
||||||
|
<div id="the-top" class="absolute flex self-center">
|
||||||
|
<a
|
||||||
|
class="px-3 py-1 text-sm -translate-y-8 rounded-b-lg bg-primary-200 focus:translate-y-0 dark:bg-neutral-600"
|
||||||
|
href="#main-content">
|
||||||
|
<span class="font-bold text-primary-600 ltr:pr-2 rtl:pl-2 dark:text-primary-400">↓</span>
|
||||||
|
Skip to main content
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div
|
||||||
|
class="main-menu flex items-center justify-between px-4 py-6 sm:px-6 md:justify-start gap-x-3 pt-[2px] pr-0 pb-[3px] pl-0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="flex flex-1 items-center justify-between">
|
||||||
|
<nav class="flex space-x-3">
|
||||||
|
|
||||||
|
<a href="/" class="text-base font-medium text-gray-500 hover:text-gray-900">
|
||||||
|
Blowfish
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<nav class="hidden md:flex items-center gap-x-5 md:ml-12 h-12">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<button
|
||||||
|
id="search-button"
|
||||||
|
aria-label="Search"
|
||||||
|
class="text-base hover:text-primary-600 dark:hover:text-primary-400"
|
||||||
|
title="Search (/)">
|
||||||
|
<span class="relative block icon"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class=" flex items-center">
|
||||||
|
<button
|
||||||
|
id="appearance-switcher"
|
||||||
|
aria-label="Dark mode switcher"
|
||||||
|
type="button"
|
||||||
|
class="text-base hover:text-primary-600 dark:hover:text-primary-400">
|
||||||
|
<div class="flex items-center justify-center dark:hidden">
|
||||||
|
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M32 256c0-123.8 100.3-224 223.8-224c11.36 0 29.7 1.668 40.9 3.746c9.616 1.777 11.75 14.63 3.279 19.44C245 86.5 211.2 144.6 211.2 207.8c0 109.7 99.71 193 208.3 172.3c9.561-1.805 16.28 9.324 10.11 16.95C387.9 448.6 324.8 480 255.8 480C132.1 480 32 379.6 32 256z"/></svg>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="items-center justify-center hidden dark:flex">
|
||||||
|
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 159.1c-53.02 0-95.1 42.98-95.1 95.1S202.1 351.1 256 351.1s95.1-42.98 95.1-95.1S309 159.1 256 159.1zM509.3 347L446.1 255.1l63.15-91.01c6.332-9.125 1.104-21.74-9.826-23.72l-109-19.7l-19.7-109c-1.975-10.93-14.59-16.16-23.72-9.824L256 65.89L164.1 2.736c-9.125-6.332-21.74-1.107-23.72 9.824L121.6 121.6L12.56 141.3C1.633 143.2-3.596 155.9 2.736 164.1L65.89 256l-63.15 91.01c-6.332 9.125-1.105 21.74 9.824 23.72l109 19.7l19.7 109c1.975 10.93 14.59 16.16 23.72 9.824L256 446.1l91.01 63.15c9.127 6.334 21.75 1.107 23.72-9.822l19.7-109l109-19.7C510.4 368.8 515.6 356.1 509.3 347zM256 383.1c-70.69 0-127.1-57.31-127.1-127.1c0-70.69 57.31-127.1 127.1-127.1s127.1 57.3 127.1 127.1C383.1 326.7 326.7 383.1 256 383.1z"/></svg>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="flex md:hidden items-center gap-x-5 md:ml-12 h-12">
|
||||||
|
<span></span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<button
|
||||||
|
id="search-button-mobile"
|
||||||
|
aria-label="Search"
|
||||||
|
class="text-base hover:text-primary-600 dark:hover:text-primary-400"
|
||||||
|
title="Search (/)">
|
||||||
|
<span class="relative block icon"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<button
|
||||||
|
id="appearance-switcher-mobile"
|
||||||
|
aria-label="Dark mode switcher"
|
||||||
|
type="button"
|
||||||
|
class="text-base hover:text-primary-600 dark:hover:text-primary-400 ltr:mr-1 rtl:ml-1">
|
||||||
|
<div class="flex items-center justify-center dark:hidden">
|
||||||
|
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M32 256c0-123.8 100.3-224 223.8-224c11.36 0 29.7 1.668 40.9 3.746c9.616 1.777 11.75 14.63 3.279 19.44C245 86.5 211.2 144.6 211.2 207.8c0 109.7 99.71 193 208.3 172.3c9.561-1.805 16.28 9.324 10.11 16.95C387.9 448.6 324.8 480 255.8 480C132.1 480 32 379.6 32 256z"/></svg>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="items-center justify-center hidden dark:flex">
|
||||||
|
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 159.1c-53.02 0-95.1 42.98-95.1 95.1S202.1 351.1 256 351.1s95.1-42.98 95.1-95.1S309 159.1 256 159.1zM509.3 347L446.1 255.1l63.15-91.01c6.332-9.125 1.104-21.74-9.826-23.72l-109-19.7l-19.7-109c-1.975-10.93-14.59-16.16-23.72-9.824L256 65.89L164.1 2.736c-9.125-6.332-21.74-1.107-23.72 9.824L121.6 121.6L12.56 141.3C1.633 143.2-3.596 155.9 2.736 164.1L65.89 256l-63.15 91.01c-6.332 9.125-1.105 21.74 9.824 23.72l109 19.7l19.7 109c1.975 10.93 14.59 16.16 23.72 9.824L256 446.1l91.01 63.15c9.127 6.334 21.75 1.107 23.72-9.822l19.7-109l109-19.7C510.4 368.8 515.6 356.1 509.3 347zM256 383.1c-70.69 0-127.1-57.31-127.1-127.1c0-70.69 57.31-127.1 127.1-127.1s127.1 57.3 127.1 127.1C383.1 326.7 326.7 383.1 256 383.1z"/></svg>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="-my-2 md:hidden">
|
||||||
|
<div id="menu-button" class="block">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="relative flex flex-col grow">
|
||||||
|
<main id="main-content" class="grow">
|
||||||
|
|
||||||
|
|
||||||
|
<header>
|
||||||
|
|
||||||
|
<h1 class="mt-5 text-4xl font-extrabold text-neutral-900 dark:text-neutral">Authors</h1>
|
||||||
|
<div class="mt-1 mb-2 text-base text-neutral-500 dark:text-neutral-400 print:hidden">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="flex flex-row flex-wrap items-center">
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<section class="flex flex-wrap max-w-prose -mx-2 overflow-hidden">
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</main><footer id="site-footer" class="py-10 print:hidden">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="flex items-center justify-between">
|
||||||
|
|
||||||
|
|
||||||
|
<p class="text-sm text-neutral-500 dark:text-neutral-400">
|
||||||
|
©
|
||||||
|
2025
|
||||||
|
Your name here
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<p class="text-xs text-neutral-500 dark:text-neutral-400">
|
||||||
|
|
||||||
|
|
||||||
|
Powered by <a class="hover:underline hover:decoration-primary-400 hover:text-primary-500"
|
||||||
|
href="https://gohugo.io/" target="_blank" rel="noopener noreferrer">Hugo</a> & <a class="hover:underline hover:decoration-primary-400 hover:text-primary-500"
|
||||||
|
href="https://blowfish.page/" target="_blank" rel="noopener noreferrer">Blowfish</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
mediumZoom(document.querySelectorAll("img:not(.nozoom)"), {
|
||||||
|
margin: 24,
|
||||||
|
background: "rgba(0,0,0,0.5)",
|
||||||
|
scrollOffset: 0,
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script
|
||||||
|
type="text/javascript"
|
||||||
|
src="/js/process.min.ee03488f19c93c2efb199e2e3014ea5f3cb2ce7d45154adb3399a158cac27ca52831db249ede5bb602700ef87eb02434139de0858af1818ab0fb4182472204a4.js"
|
||||||
|
integrity="sha512-7gNIjxnJPC77GZ4uMBTqXzyyzn1FFUrbM5mhWMrCfKUoMdsknt5btgJwDvh+sCQ0E53ghYrxgYqw+0GCRyIEpA=="></script>
|
||||||
|
|
||||||
|
|
||||||
|
</footer>
|
||||||
|
<div
|
||||||
|
id="search-wrapper"
|
||||||
|
class="invisible fixed inset-0 flex h-screen w-screen cursor-default flex-col bg-neutral-500/50 p-4 backdrop-blur-sm dark:bg-neutral-900/50 sm:p-6 md:p-[10vh] lg:p-[12vh] z-500"
|
||||||
|
data-url="/">
|
||||||
|
<div
|
||||||
|
id="search-modal"
|
||||||
|
class="flex flex-col w-full max-w-3xl min-h-0 mx-auto border rounded-md shadow-lg top-20 border-neutral-200 bg-neutral dark:border-neutral-700 dark:bg-neutral-800">
|
||||||
|
<header class="relative z-10 flex items-center justify-between flex-none px-2">
|
||||||
|
<form class="flex items-center flex-auto min-w-0">
|
||||||
|
<div class="flex items-center justify-center w-8 h-8 text-neutral-400">
|
||||||
|
<span class="relative block icon"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<input
|
||||||
|
type="search"
|
||||||
|
id="search-query"
|
||||||
|
class="flex flex-auto h-12 mx-1 bg-transparent appearance-none focus:outline-dotted focus:outline-2 focus:outline-transparent"
|
||||||
|
placeholder="Search"
|
||||||
|
tabindex="0">
|
||||||
|
</form>
|
||||||
|
<button
|
||||||
|
id="close-search-button"
|
||||||
|
class="flex items-center justify-center w-8 h-8 text-neutral-700 hover:text-primary-600 dark:text-neutral dark:hover:text-primary-400"
|
||||||
|
title="Close (Esc)">
|
||||||
|
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path fill="currentColor" d="M310.6 361.4c12.5 12.5 12.5 32.75 0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3L54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75 0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-105.4 105.4L310.6 361.4z"/></svg>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
</header>
|
||||||
|
<section class="flex-auto px-2 overflow-auto">
|
||||||
|
<ul id="search-results">
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
432
categories/index.html
Normal file
432
categories/index.html
Normal file
@@ -0,0 +1,432 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html
|
||||||
|
lang="en"
|
||||||
|
dir="ltr"
|
||||||
|
class="scroll-smooth"
|
||||||
|
data-default-appearance="light"
|
||||||
|
data-auto-appearance="true"><head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
|
||||||
|
<meta http-equiv="content-language" content="en">
|
||||||
|
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||||
|
<meta name="theme-color">
|
||||||
|
|
||||||
|
|
||||||
|
<title>Categories · Blowfish</title>
|
||||||
|
<meta name="title" content="Categories · Blowfish">
|
||||||
|
|
||||||
|
|
||||||
|
<meta name="description" content="My awesome website">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="canonical" href="/categories/">
|
||||||
|
|
||||||
|
<link rel="alternate" type="application/rss+xml" href="/categories/index.xml" title="Blowfish" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link
|
||||||
|
type="text/css"
|
||||||
|
rel="stylesheet"
|
||||||
|
href="/css/main.bundle.min.d7672814413dccdcf76c504d9b0ebb8d0f964dbe6b30a3d4b25b15809a94c2eb732d99898aded2009aacdd1fa8b17cea1369fd81560790cd355aee00bbd142fd.css"
|
||||||
|
integrity="sha512-12coFEE9zNz3bFBNmw67jQ+WTb5rMKPUslsVgJqUwutzLZmJit7SAJqs3R+osXzqE2n9gVYHkM01Wu4Au9FC/Q==">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script
|
||||||
|
type="text/javascript"
|
||||||
|
src="/js/appearance.min.516a16745bea5a9bd011138d254cc0fd3973cd55ce6e15f3dec763e7c7c2c7448f8fe7b54cca811cb821b0c7e12cd161caace1dd794ac3d34d40937cbcc9ee12.js"
|
||||||
|
integrity="sha512-UWoWdFvqWpvQERONJUzA/TlzzVXObhXz3sdj58fCx0SPj+e1TMqBHLghsMfhLNFhyqzh3XlKw9NNQJN8vMnuEg=="></script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script
|
||||||
|
defer
|
||||||
|
type="text/javascript"
|
||||||
|
id="script-bundle"
|
||||||
|
src="/js/main.bundle.min.98bb8ce8f123e03c4d2171eeec151dd404b5c476beb5ef1068d0e8b1a2afb923065e6552fc14b2d867c85ee4bd8529a43193f729f874d3908517ba03b5d1cc57.js"
|
||||||
|
integrity="sha512-mLuM6PEj4DxNIXHu7BUd1AS1xHa+te8QaNDosaKvuSMGXmVS/BSy2GfIXuS9hSmkMZP3Kfh005CFF7oDtdHMVw=="
|
||||||
|
data-copy="Copy"
|
||||||
|
data-copied="Copied"></script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script src="/lib/zoom/zoom.min.umd.a527109b68c082a70f3697716dd72a9d5aa8b545cf800cecbbc7399f2ca6f6e0ce3e431f2062b48bbfa47c9ea42822714060bef309be073f49b9c0e30d318d7b.js" integrity="sha512-pScQm2jAgqcPNpdxbdcqnVqotUXPgAzsu8c5nyym9uDOPkMfIGK0i7+kfJ6kKCJxQGC+8wm+Bz9JucDjDTGNew=="></script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
|
||||||
|
<link rel="manifest" href="/site.webmanifest">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:url" content="/categories/">
|
||||||
|
<meta property="og:site_name" content="Blowfish">
|
||||||
|
<meta property="og:title" content="Categories">
|
||||||
|
<meta property="og:description" content="My awesome website">
|
||||||
|
<meta property="og:locale" content="en">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="Categories">
|
||||||
|
<meta name="twitter:description" content="My awesome website">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<meta name="author" content="Your name here">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script src="/lib/jquery/jquery.slim.min.b0dca576e87d7eaa5850ae4e61759c065786cdb6489d68fcc82240539eebd5da522bdb4fda085ffd245808c8fe2acb2516408eb774ef26b5f6015fc6737c0ea8.js" integrity="sha512-sNylduh9fqpYUK5OYXWcBleGzbZInWj8yCJAU57r1dpSK9tP2ghf/SRYCMj+KsslFkCOt3TvJrX2AV/Gc3wOqA=="></script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body
|
||||||
|
class="flex flex-col h-screen px-6 m-auto text-lg leading-7 max-w-7xl bg-neutral text-neutral-900 dark:bg-neutral-800 dark:text-neutral sm:px-14 md:px-24 lg:px-32 scrollbar-thin scrollbar-track-neutral-200 scrollbar-thumb-neutral-400 dark:scrollbar-track-neutral-800 dark:scrollbar-thumb-neutral-600">
|
||||||
|
<div id="the-top" class="absolute flex self-center">
|
||||||
|
<a
|
||||||
|
class="px-3 py-1 text-sm -translate-y-8 rounded-b-lg bg-primary-200 focus:translate-y-0 dark:bg-neutral-600"
|
||||||
|
href="#main-content">
|
||||||
|
<span class="font-bold text-primary-600 ltr:pr-2 rtl:pl-2 dark:text-primary-400">↓</span>
|
||||||
|
Skip to main content
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div
|
||||||
|
class="main-menu flex items-center justify-between px-4 py-6 sm:px-6 md:justify-start gap-x-3 pt-[2px] pr-0 pb-[3px] pl-0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="flex flex-1 items-center justify-between">
|
||||||
|
<nav class="flex space-x-3">
|
||||||
|
|
||||||
|
<a href="/" class="text-base font-medium text-gray-500 hover:text-gray-900">
|
||||||
|
Blowfish
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<nav class="hidden md:flex items-center gap-x-5 md:ml-12 h-12">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<button
|
||||||
|
id="search-button"
|
||||||
|
aria-label="Search"
|
||||||
|
class="text-base hover:text-primary-600 dark:hover:text-primary-400"
|
||||||
|
title="Search (/)">
|
||||||
|
<span class="relative block icon"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class=" flex items-center">
|
||||||
|
<button
|
||||||
|
id="appearance-switcher"
|
||||||
|
aria-label="Dark mode switcher"
|
||||||
|
type="button"
|
||||||
|
class="text-base hover:text-primary-600 dark:hover:text-primary-400">
|
||||||
|
<div class="flex items-center justify-center dark:hidden">
|
||||||
|
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M32 256c0-123.8 100.3-224 223.8-224c11.36 0 29.7 1.668 40.9 3.746c9.616 1.777 11.75 14.63 3.279 19.44C245 86.5 211.2 144.6 211.2 207.8c0 109.7 99.71 193 208.3 172.3c9.561-1.805 16.28 9.324 10.11 16.95C387.9 448.6 324.8 480 255.8 480C132.1 480 32 379.6 32 256z"/></svg>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="items-center justify-center hidden dark:flex">
|
||||||
|
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 159.1c-53.02 0-95.1 42.98-95.1 95.1S202.1 351.1 256 351.1s95.1-42.98 95.1-95.1S309 159.1 256 159.1zM509.3 347L446.1 255.1l63.15-91.01c6.332-9.125 1.104-21.74-9.826-23.72l-109-19.7l-19.7-109c-1.975-10.93-14.59-16.16-23.72-9.824L256 65.89L164.1 2.736c-9.125-6.332-21.74-1.107-23.72 9.824L121.6 121.6L12.56 141.3C1.633 143.2-3.596 155.9 2.736 164.1L65.89 256l-63.15 91.01c-6.332 9.125-1.105 21.74 9.824 23.72l109 19.7l19.7 109c1.975 10.93 14.59 16.16 23.72 9.824L256 446.1l91.01 63.15c9.127 6.334 21.75 1.107 23.72-9.822l19.7-109l109-19.7C510.4 368.8 515.6 356.1 509.3 347zM256 383.1c-70.69 0-127.1-57.31-127.1-127.1c0-70.69 57.31-127.1 127.1-127.1s127.1 57.3 127.1 127.1C383.1 326.7 326.7 383.1 256 383.1z"/></svg>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="flex md:hidden items-center gap-x-5 md:ml-12 h-12">
|
||||||
|
<span></span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<button
|
||||||
|
id="search-button-mobile"
|
||||||
|
aria-label="Search"
|
||||||
|
class="text-base hover:text-primary-600 dark:hover:text-primary-400"
|
||||||
|
title="Search (/)">
|
||||||
|
<span class="relative block icon"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<button
|
||||||
|
id="appearance-switcher-mobile"
|
||||||
|
aria-label="Dark mode switcher"
|
||||||
|
type="button"
|
||||||
|
class="text-base hover:text-primary-600 dark:hover:text-primary-400 ltr:mr-1 rtl:ml-1">
|
||||||
|
<div class="flex items-center justify-center dark:hidden">
|
||||||
|
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M32 256c0-123.8 100.3-224 223.8-224c11.36 0 29.7 1.668 40.9 3.746c9.616 1.777 11.75 14.63 3.279 19.44C245 86.5 211.2 144.6 211.2 207.8c0 109.7 99.71 193 208.3 172.3c9.561-1.805 16.28 9.324 10.11 16.95C387.9 448.6 324.8 480 255.8 480C132.1 480 32 379.6 32 256z"/></svg>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="items-center justify-center hidden dark:flex">
|
||||||
|
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 159.1c-53.02 0-95.1 42.98-95.1 95.1S202.1 351.1 256 351.1s95.1-42.98 95.1-95.1S309 159.1 256 159.1zM509.3 347L446.1 255.1l63.15-91.01c6.332-9.125 1.104-21.74-9.826-23.72l-109-19.7l-19.7-109c-1.975-10.93-14.59-16.16-23.72-9.824L256 65.89L164.1 2.736c-9.125-6.332-21.74-1.107-23.72 9.824L121.6 121.6L12.56 141.3C1.633 143.2-3.596 155.9 2.736 164.1L65.89 256l-63.15 91.01c-6.332 9.125-1.105 21.74 9.824 23.72l109 19.7l19.7 109c1.975 10.93 14.59 16.16 23.72 9.824L256 446.1l91.01 63.15c9.127 6.334 21.75 1.107 23.72-9.822l19.7-109l109-19.7C510.4 368.8 515.6 356.1 509.3 347zM256 383.1c-70.69 0-127.1-57.31-127.1-127.1c0-70.69 57.31-127.1 127.1-127.1s127.1 57.3 127.1 127.1C383.1 326.7 326.7 383.1 256 383.1z"/></svg>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="-my-2 md:hidden">
|
||||||
|
<div id="menu-button" class="block">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="relative flex flex-col grow">
|
||||||
|
<main id="main-content" class="grow">
|
||||||
|
|
||||||
|
|
||||||
|
<header>
|
||||||
|
|
||||||
|
<h1 class="mt-5 text-4xl font-extrabold text-neutral-900 dark:text-neutral">Categories</h1>
|
||||||
|
<div class="mt-1 mb-2 text-base text-neutral-500 dark:text-neutral-400 print:hidden">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="flex flex-row flex-wrap items-center">
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<section class="flex flex-wrap max-w-prose -mx-2 overflow-hidden">
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</main><footer id="site-footer" class="py-10 print:hidden">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="flex items-center justify-between">
|
||||||
|
|
||||||
|
|
||||||
|
<p class="text-sm text-neutral-500 dark:text-neutral-400">
|
||||||
|
©
|
||||||
|
2025
|
||||||
|
Your name here
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<p class="text-xs text-neutral-500 dark:text-neutral-400">
|
||||||
|
|
||||||
|
|
||||||
|
Powered by <a class="hover:underline hover:decoration-primary-400 hover:text-primary-500"
|
||||||
|
href="https://gohugo.io/" target="_blank" rel="noopener noreferrer">Hugo</a> & <a class="hover:underline hover:decoration-primary-400 hover:text-primary-500"
|
||||||
|
href="https://blowfish.page/" target="_blank" rel="noopener noreferrer">Blowfish</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
mediumZoom(document.querySelectorAll("img:not(.nozoom)"), {
|
||||||
|
margin: 24,
|
||||||
|
background: "rgba(0,0,0,0.5)",
|
||||||
|
scrollOffset: 0,
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script
|
||||||
|
type="text/javascript"
|
||||||
|
src="/js/process.min.ee03488f19c93c2efb199e2e3014ea5f3cb2ce7d45154adb3399a158cac27ca52831db249ede5bb602700ef87eb02434139de0858af1818ab0fb4182472204a4.js"
|
||||||
|
integrity="sha512-7gNIjxnJPC77GZ4uMBTqXzyyzn1FFUrbM5mhWMrCfKUoMdsknt5btgJwDvh+sCQ0E53ghYrxgYqw+0GCRyIEpA=="></script>
|
||||||
|
|
||||||
|
|
||||||
|
</footer>
|
||||||
|
<div
|
||||||
|
id="search-wrapper"
|
||||||
|
class="invisible fixed inset-0 flex h-screen w-screen cursor-default flex-col bg-neutral-500/50 p-4 backdrop-blur-sm dark:bg-neutral-900/50 sm:p-6 md:p-[10vh] lg:p-[12vh] z-500"
|
||||||
|
data-url="/">
|
||||||
|
<div
|
||||||
|
id="search-modal"
|
||||||
|
class="flex flex-col w-full max-w-3xl min-h-0 mx-auto border rounded-md shadow-lg top-20 border-neutral-200 bg-neutral dark:border-neutral-700 dark:bg-neutral-800">
|
||||||
|
<header class="relative z-10 flex items-center justify-between flex-none px-2">
|
||||||
|
<form class="flex items-center flex-auto min-w-0">
|
||||||
|
<div class="flex items-center justify-center w-8 h-8 text-neutral-400">
|
||||||
|
<span class="relative block icon"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<input
|
||||||
|
type="search"
|
||||||
|
id="search-query"
|
||||||
|
class="flex flex-auto h-12 mx-1 bg-transparent appearance-none focus:outline-dotted focus:outline-2 focus:outline-transparent"
|
||||||
|
placeholder="Search"
|
||||||
|
tabindex="0">
|
||||||
|
</form>
|
||||||
|
<button
|
||||||
|
id="close-search-button"
|
||||||
|
class="flex items-center justify-center w-8 h-8 text-neutral-700 hover:text-primary-600 dark:text-neutral dark:hover:text-primary-400"
|
||||||
|
title="Close (Esc)">
|
||||||
|
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path fill="currentColor" d="M310.6 361.4c12.5 12.5 12.5 32.75 0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3L54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75 0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-105.4 105.4L310.6 361.4z"/></svg>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
</header>
|
||||||
|
<section class="flex-auto px-2 overflow-auto">
|
||||||
|
<ul id="search-results">
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
44
config/_default/hugo.toml
Normal file
44
config/_default/hugo.toml
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
# -- Site Configuration --
|
||||||
|
# Refer to the theme docs for more details about each of these parameters.
|
||||||
|
# https://nunocoracao.github.io/blowfish/docs/getting-started/
|
||||||
|
|
||||||
|
theme = ["hugo-admonitions", "blowfish"]
|
||||||
|
baseURL = "https://wiki.wompmacho.com/"
|
||||||
|
defaultContentLanguage = "en"
|
||||||
|
relativeURLs = true
|
||||||
|
|
||||||
|
enableRobotsTXT = true
|
||||||
|
summaryLength = 5
|
||||||
|
|
||||||
|
buildDrafts = true
|
||||||
|
buildFuture = true
|
||||||
|
enableEmoji = true
|
||||||
|
|
||||||
|
# googleAnalytics = "G-XXXXXXXXX"
|
||||||
|
|
||||||
|
[taxonomies]
|
||||||
|
tag = "tags"
|
||||||
|
category = "categories"
|
||||||
|
author = "authors"
|
||||||
|
series = "series"
|
||||||
|
|
||||||
|
[sitemap]
|
||||||
|
changefreq = 'daily'
|
||||||
|
filename = 'sitemap.xml'
|
||||||
|
priority = 0.5
|
||||||
|
|
||||||
|
[outputs]
|
||||||
|
home = ["HTML", "RSS", "JSON"]
|
||||||
|
|
||||||
|
[frontmatter]
|
||||||
|
# Hugo will check for 'lastmod' in the file first,
|
||||||
|
# then the Git commit date, then the 'date' field.
|
||||||
|
lastmod = ["lastmod", ":git", "date"]
|
||||||
|
|
||||||
|
# Required if you want to use the Git commit date automatically
|
||||||
|
enableGitInfo = true
|
||||||
|
|
||||||
|
[markup.tableOfContents]
|
||||||
|
endLevel = 3
|
||||||
|
ordered = false
|
||||||
|
startLevel = 2
|
||||||
27
config/_default/languages.en.toml
Normal file
27
config/_default/languages.en.toml
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
languageCode = "en"
|
||||||
|
languageName = "English"
|
||||||
|
weight = 1
|
||||||
|
title = "wiki.wompmacho.com"
|
||||||
|
|
||||||
|
[params]
|
||||||
|
displayName = "EN"
|
||||||
|
isoCode = "en"
|
||||||
|
rtl = false
|
||||||
|
description = "my personal wiki"
|
||||||
|
dateFormat = "2 January 2006"
|
||||||
|
|
||||||
|
[params.author]
|
||||||
|
name = "Michael"
|
||||||
|
image = "me/wampyDance.gif"
|
||||||
|
headline = "aka `Mitch` / aka `WompMacho`"
|
||||||
|
bio = "some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow"
|
||||||
|
|
||||||
|
[params.author.social]
|
||||||
|
gitlab = "https://git.wompmacho.com/wompmacho"
|
||||||
|
email = "michael@wompmacho.com"
|
||||||
|
streamelements = "https://streamelements.com/wompmacho/tip"
|
||||||
|
discord = "https://discord.com/invite/P5aZU7jHbD"
|
||||||
|
twitch = "https://www.twitch.tv/wompmacho"
|
||||||
|
youtube = "https://www.youtube.com/wompmacho?sub_confirmation=1"
|
||||||
|
|
||||||
|
|
||||||
19
config/_default/markup.toml
Normal file
19
config/_default/markup.toml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# -- Markup --
|
||||||
|
# These settings are required for the theme to function.
|
||||||
|
|
||||||
|
[goldmark]
|
||||||
|
[goldmark.renderer]
|
||||||
|
unsafe = true
|
||||||
|
|
||||||
|
[markup]
|
||||||
|
[markup.tableOfContents]
|
||||||
|
startLevel = 2
|
||||||
|
endLevel = 4
|
||||||
|
ordered = false
|
||||||
|
|
||||||
|
[highlight]
|
||||||
|
noClasses = false
|
||||||
|
|
||||||
|
[markup.goldmark.parser.attribute]
|
||||||
|
block = true
|
||||||
|
title = true
|
||||||
57
config/_default/menus.en.toml
Normal file
57
config/_default/menus.en.toml
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
# -- Main Menu --
|
||||||
|
# The main menu is displayed in the header at the top of the page.
|
||||||
|
# Acceptable parameters are name, pageRef, page, url, title, weight.
|
||||||
|
#
|
||||||
|
# The simplest menu configuration is to provide:
|
||||||
|
# name = The name to be displayed for this menu link
|
||||||
|
# pageRef = The identifier of the page or section to link to
|
||||||
|
#
|
||||||
|
# By default the menu is ordered alphabetically. This can be
|
||||||
|
# overridden by providing a weight value. The menu will then be
|
||||||
|
# ordered by weight from lowest to highest.
|
||||||
|
|
||||||
|
[[main]]
|
||||||
|
name = "projects"
|
||||||
|
pageRef = "projects"
|
||||||
|
weight = 10
|
||||||
|
|
||||||
|
[[main]]
|
||||||
|
name = "posts"
|
||||||
|
pageRef = "posts"
|
||||||
|
weight = 20
|
||||||
|
|
||||||
|
[[main]]
|
||||||
|
name = "stream"
|
||||||
|
pageRef = "stream"
|
||||||
|
weight = 30
|
||||||
|
|
||||||
|
[[subnavigation]]
|
||||||
|
name = "lab"
|
||||||
|
pageRef = "lab_setup"
|
||||||
|
weight = 10
|
||||||
|
|
||||||
|
[[subnavigation]]
|
||||||
|
name = "resume"
|
||||||
|
pageRef = "resume"
|
||||||
|
weight = 20
|
||||||
|
|
||||||
|
# [[subnavigation]]
|
||||||
|
# name = "My Awesome Category"
|
||||||
|
# pageRef = "categories/awesome"
|
||||||
|
# weight = 20
|
||||||
|
|
||||||
|
# -- Footer Menu --
|
||||||
|
# The footer menu is displayed at the bottom of the page, just before
|
||||||
|
# the copyright notice. Configure as per the main menu above.
|
||||||
|
|
||||||
|
# config/_default/menus.toml
|
||||||
|
|
||||||
|
# [[footer]]
|
||||||
|
# name = "Tags"
|
||||||
|
# pageRef = "tags"
|
||||||
|
# weight = 10
|
||||||
|
|
||||||
|
# [[footer]]
|
||||||
|
# name = "Categories"
|
||||||
|
# pageRef = "categories"
|
||||||
|
# weight = 20
|
||||||
3
config/_default/module.toml
Normal file
3
config/_default/module.toml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
[hugoVersion]
|
||||||
|
extended = false
|
||||||
|
min = "0.87.0"
|
||||||
114
config/_default/params.toml
Normal file
114
config/_default/params.toml
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
# -- Theme Options --
|
||||||
|
# These options control how the theme functions and allow you to
|
||||||
|
# customise the display of your website.
|
||||||
|
#
|
||||||
|
# Refer to the theme docs for more details about each of these parameters.
|
||||||
|
# https://nunocoracao.github.io/blowfish/docs/configuration/#theme-parameters
|
||||||
|
|
||||||
|
colorScheme = "github"
|
||||||
|
defaultAppearance = "light" # valid options: light or dark
|
||||||
|
autoSwitchAppearance = true
|
||||||
|
|
||||||
|
enableSearch = true
|
||||||
|
enableCodeCopy = true
|
||||||
|
customCSS = true
|
||||||
|
|
||||||
|
# mainSections = ["section1", "section2"]
|
||||||
|
# robots = ""
|
||||||
|
|
||||||
|
[header]
|
||||||
|
layout = "fixed" # valid options: basic, fixed
|
||||||
|
|
||||||
|
[footer]
|
||||||
|
# showMenu = true
|
||||||
|
showCopyright = true
|
||||||
|
showThemeAttribution = true
|
||||||
|
showAppearanceSwitcher = true
|
||||||
|
showScrollToTop = true
|
||||||
|
|
||||||
|
[homepage]
|
||||||
|
layout = "background" # valid options: page, profile, hero, card, background, custom
|
||||||
|
homepageImage = "me/me_stream_doom.PNG" # used in: hero, and card
|
||||||
|
showRecent = false
|
||||||
|
showRecentItems = 5
|
||||||
|
showMoreLink = false
|
||||||
|
showMoreLinkDest = "/posts"
|
||||||
|
cardView = false
|
||||||
|
cardViewScreenWidth = false
|
||||||
|
layoutBackgroundBlur = false # only used when layout equals background
|
||||||
|
|
||||||
|
[search]
|
||||||
|
enable = true
|
||||||
|
type = "fuse"
|
||||||
|
showPercent = true
|
||||||
|
showWidth = true
|
||||||
|
|
||||||
|
[article] # https://blowfish.page/docs/configuration/
|
||||||
|
showDate = true
|
||||||
|
showViews = false
|
||||||
|
showLikes = false
|
||||||
|
showDateUpdated = true
|
||||||
|
showHero = true
|
||||||
|
heroStyle = "basic" # valid options: basic, big, background
|
||||||
|
showBreadcrumbs = true
|
||||||
|
showDraftLabel = true
|
||||||
|
seriesOpened = true
|
||||||
|
showHeadingAnchors = true
|
||||||
|
showPagination = true
|
||||||
|
invertPagination = false
|
||||||
|
showReadingTime = true
|
||||||
|
showTableOfContents = true
|
||||||
|
showTaxonomies = true
|
||||||
|
showWordCount = true
|
||||||
|
showSummary = true
|
||||||
|
sharingLinks = [ "linkedin", "twitter", "whatsapp", "pinterest", "reddit", "facebook", "email"]
|
||||||
|
showAuthor = true
|
||||||
|
showAuthorsBadges = true # This helps style the author profile
|
||||||
|
showEdit = true
|
||||||
|
showEditURL = true
|
||||||
|
editURL = "https://git.wompmacho.com/wompmacho/wiki/src/branch/main/content"
|
||||||
|
editAppendPath = true
|
||||||
|
showZenMode = false
|
||||||
|
smartTOC = true
|
||||||
|
|
||||||
|
[list]
|
||||||
|
showBreadcrumbs = true
|
||||||
|
showSummary = true
|
||||||
|
showTableOfContents = true
|
||||||
|
showCards = true
|
||||||
|
groupByYear = true
|
||||||
|
cardView = true
|
||||||
|
cardViewScreenWidth = false
|
||||||
|
columnCount = 3
|
||||||
|
showReadMore = true
|
||||||
|
|
||||||
|
[sitemap]
|
||||||
|
excludedKinds = []
|
||||||
|
|
||||||
|
[taxonomy]
|
||||||
|
showTermCount = true
|
||||||
|
|
||||||
|
[firebase]
|
||||||
|
# apiKey = "XXXXXX"
|
||||||
|
# authDomain = "XXXXXX"
|
||||||
|
# projectId = "XXXXXX"
|
||||||
|
# storageBucket = "XXXXXX"
|
||||||
|
# messagingSenderId = "XXXXXX"
|
||||||
|
# appId = "XXXXXX"
|
||||||
|
# measurementId = "XXXXXX"
|
||||||
|
|
||||||
|
[fathomAnalytics]
|
||||||
|
# site = "ABC12345"
|
||||||
|
# domain = "llama.yoursite.com"
|
||||||
|
|
||||||
|
[verification]
|
||||||
|
# google = ""
|
||||||
|
# bing = ""
|
||||||
|
# pinterest = ""
|
||||||
|
# yandex = ""
|
||||||
|
|
||||||
|
[app]
|
||||||
|
# Some versions of Blowfish look for 'mainIcon' or 'themeIcon'
|
||||||
|
# Try both if one fails.
|
||||||
|
mainIcon = "icons/icon.svg"
|
||||||
|
themeIcon = "icons/icon.svg"
|
||||||
138
layouts/_default/list.html
Normal file
138
layouts/_default/list.html
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
{{ define "main" }}
|
||||||
|
{{ .Scratch.Set "scope" "list" }}
|
||||||
|
{{ $enableToc := .Params.showTableOfContents | default (site.Params.list.showTableOfContents | default false) }}
|
||||||
|
{{ $showToc := and $enableToc (in .TableOfContents "<ul") }}
|
||||||
|
|
||||||
|
{{/* Hero */}}
|
||||||
|
{{ if site.Params.list.showHero | default false }}
|
||||||
|
{{ $heroStyle := print "hero/" site.Params.list.heroStyle ".html" }}
|
||||||
|
{{ if templates.Exists ( printf "partials/%s" $heroStyle ) }}
|
||||||
|
{{ partial $heroStyle . }}
|
||||||
|
{{ else }}
|
||||||
|
{{ partial "hero/basic.html" . }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{/* Header */}}
|
||||||
|
<header>
|
||||||
|
{{ if .Params.showBreadcrumbs | default (site.Params.list.showBreadcrumbs | default false) }}
|
||||||
|
{{ partial "breadcrumbs.html" . }}
|
||||||
|
{{ end }}
|
||||||
|
<h1 class="mt-5 text-4xl font-extrabold text-neutral-900 dark:text-neutral">{{ .Title }}</h1>
|
||||||
|
<div class="mt-1 mb-2 text-base text-neutral-500 dark:text-neutral-400 print:hidden">
|
||||||
|
{{ partial "article-meta/list.html" (dict "context" . "scope" "single") }}
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
{{/* Description (markdown content) */}}
|
||||||
|
{{ $tocMargin := cond $showToc "mt-12" "mt-0" }}
|
||||||
|
{{ $topClass := cond (hasPrefix site.Params.header.layout "fixed") "lg:top-[140px]" "lg:top-10" }}
|
||||||
|
<section class="{{ $tocMargin }} prose flex max-w-full flex-col dark:prose-invert lg:flex-row">
|
||||||
|
{{ if $showToc }}
|
||||||
|
<div class="order-first px-0 lg:order-last lg:max-w-xs lg:ps-8">
|
||||||
|
<div class="toc ps-5 lg:sticky {{ $topClass }}">
|
||||||
|
{{ if $showToc }}
|
||||||
|
{{ partial "toc.html" . }}
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
<div class="min-w-0 min-h-0 max-w-prose w-full">
|
||||||
|
{{ .Content }}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{{/* Article Grid */}}
|
||||||
|
{{ if gt .Pages 0 }}
|
||||||
|
{{ $cardView := .Params.cardView | default (site.Params.list.cardView | default false) }}
|
||||||
|
{{ $cardViewScreenWidth := .Params.cardViewScreenWidth | default (site.Params.list.cardViewScreenWidth | default false) }}
|
||||||
|
{{ $groupByYear := .Params.groupByYear | default (site.Params.list.groupByYear | default false) }}
|
||||||
|
{{ $orderByWeight := .Params.orderByWeight | default (site.Params.list.orderByWeight | default false) }}
|
||||||
|
{{ $groupByYear := and (not $orderByWeight) $groupByYear }}
|
||||||
|
|
||||||
|
{{ if not $cardView }}
|
||||||
|
<section class="space-y-10 w-full">
|
||||||
|
{{ if not $orderByWeight }}
|
||||||
|
{{ range (.Pages.GroupByDate "2006") }}
|
||||||
|
{{ if $groupByYear }}
|
||||||
|
<h2 class="mt-12 text-2xl font-bold text-neutral-700 first:mt-8 dark:text-neutral-300">
|
||||||
|
{{ .Key }}
|
||||||
|
</h2>
|
||||||
|
{{ end }}
|
||||||
|
{{ range .Pages }}
|
||||||
|
{{ partial "article-link/simple.html" . }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ else }}
|
||||||
|
{{ range .Pages.ByWeight }}
|
||||||
|
{{ partial "article-link/simple.html" . }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
</section>
|
||||||
|
{{ else }}
|
||||||
|
{{ if $groupByYear }}
|
||||||
|
{{ range (.Pages.GroupByDate "2006") }}
|
||||||
|
{{ if $cardViewScreenWidth }}
|
||||||
|
<div class="relative w-screen max-w-[1600px] px-[30px] start-[calc(max(-50vw,-800px)+50%)]">
|
||||||
|
<h2 class="mt-12 mb-3 text-2xl font-bold text-neutral-700 first:mt-8 dark:text-neutral-300">
|
||||||
|
{{ .Key }}
|
||||||
|
</h2>
|
||||||
|
<section class="w-full grid gap-4 sm:grid-cols-2 md:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-5">
|
||||||
|
{{ range .Pages }}
|
||||||
|
{{ partial "article-link/card.html" . }}
|
||||||
|
{{ end }}
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
{{ else }}
|
||||||
|
<h2 class="mt-12 mb-3 text-2xl font-bold text-neutral-700 first:mt-8 dark:text-neutral-300">
|
||||||
|
{{ .Key }}
|
||||||
|
</h2>
|
||||||
|
<section class="w-full grid gap-4 sm:grid-cols-2 md:grid-cols-3">
|
||||||
|
{{ range .Pages }}
|
||||||
|
{{ partial "article-link/card.html" . }}
|
||||||
|
{{ end }}
|
||||||
|
</section>
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ else }}
|
||||||
|
{{ if $cardViewScreenWidth }}
|
||||||
|
<div class="relative w-screen max-w-[1600px] px-[30px] start-[calc(max(-50vw,-800px)+50%)]">
|
||||||
|
<section class="w-full grid gap-4 sm:grid-cols-2 md:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-5">
|
||||||
|
{{ if not $orderByWeight }}
|
||||||
|
{{ range (.Pages.GroupByDate "2006") }}
|
||||||
|
{{ range .Pages }}
|
||||||
|
{{ partial "article-link/card.html" . }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ else }}
|
||||||
|
{{ range .Pages.ByWeight }}
|
||||||
|
{{ partial "article-link/card.html" . }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
{{ else }}
|
||||||
|
<section class="w-full grid gap-4 sm:grid-cols-2 md:grid-cols-3">
|
||||||
|
{{ if not $orderByWeight }}
|
||||||
|
{{ range (.Pages.GroupByDate "2006") }}
|
||||||
|
{{ range .Pages }}
|
||||||
|
{{ partial "article-link/card.html" . }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ else }}
|
||||||
|
{{ range .Pages.ByWeight }}
|
||||||
|
{{ partial "article-link/card.html" . }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
</section>
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ else }}
|
||||||
|
<section class="mt-10 prose dark:prose-invert">
|
||||||
|
<p class="py-8 border-t">
|
||||||
|
<em>{{ i18n "list.no_articles" | emojify }}</em>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
82
layouts/_default/single.html
Normal file
82
layouts/_default/single.html
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
{{ define "main" }}
|
||||||
|
{{ .Scratch.Set "scope" "single" }}
|
||||||
|
|
||||||
|
<article class="w-full py-8">
|
||||||
|
{{ if .Params.showHero | default (site.Params.article.showHero | default false) }}
|
||||||
|
{{ partial (printf "hero/%s.html" (.Params.heroStyle | default site.Params.article.heroStyle)) . }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<header id="single_header" class="mt-5 max-w-prose mx-auto px-4">
|
||||||
|
<h1 class="mt-0 text-4xl font-extrabold text-neutral-900 dark:text-neutral">{{ .Title | emojify }}</h1>
|
||||||
|
<div class="mt-1 mb-6 text-base text-neutral-500 dark:text-neutral-400 print:hidden">
|
||||||
|
{{ partial "article-meta/basic.html" (dict "context" . "scope" "single") }}
|
||||||
|
</div>
|
||||||
|
{{ if not (.Params.showAuthorBottom | default (site.Params.article.showAuthorBottom | default false)) }}
|
||||||
|
{{ template "SingleAuthor" . }}
|
||||||
|
{{ end }}
|
||||||
|
</header>
|
||||||
|
|
||||||
|
{{/* The Relative Wrapper: Acts as an anchor for the absolute TOC */}}
|
||||||
|
<div class="single-post-wrapper relative mt-8 w-full max-w-7xl mx-auto px-4">
|
||||||
|
|
||||||
|
{{/* Sidebar TOC: Mobile flow (Top), Desktop absolute (Right) */}}
|
||||||
|
{{ if .Params.showTableOfContents | default site.Params.article.showTableOfContents }}
|
||||||
|
<aside id="sidebar-toc" class="w-full mb-8 xl:mb-0">
|
||||||
|
<div class="toc sticky top-24">
|
||||||
|
{{ partial "toc.html" . }}
|
||||||
|
</div>
|
||||||
|
</aside>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{/* Main Content: Dead center, uninfluenced by anything */}}
|
||||||
|
<section id="main-content" class="w-full">
|
||||||
|
<div class="article-content prose dark:prose-invert mx-auto">
|
||||||
|
{{ partial "series/series.html" . }}
|
||||||
|
{{ .Content }}
|
||||||
|
|
||||||
|
{{ if .Params.replyByEmail | default site.Params.replyByEmail }}
|
||||||
|
<strong class="block mt-8">
|
||||||
|
<a target="_blank" href="mailto:{{ site.Params.Author.email }}">Reply by Email</a>
|
||||||
|
</strong>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<div class="mt-10">
|
||||||
|
{{ if (.Params.showAuthorBottom | default (site.Params.article.showAuthorBottom | default false)) }}
|
||||||
|
{{ template "SingleAuthor" . }}
|
||||||
|
{{ end }}
|
||||||
|
{{ partial "series/series-closed.html" . }}
|
||||||
|
{{ partial "sharing-links.html" . }}
|
||||||
|
{{ partial "related.html" . }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<footer class="pt-8 mt-12 border-t border-neutral-200 dark:border-neutral-800 max-w-prose mx-auto px-4">
|
||||||
|
{{ partial "article-pagination.html" . }}
|
||||||
|
</footer>
|
||||||
|
</article>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ define "SingleAuthor" }}
|
||||||
|
<div class="max-w-prose">
|
||||||
|
{{ $authorsData := site.Data.authors }}
|
||||||
|
{{ $baseURL := site.BaseURL }}
|
||||||
|
{{ $isAuthorBottom := (.Params.showAuthorBottom | default ( site.Params.article.showAuthorBottom | default false)) }}
|
||||||
|
{{ if not (strings.HasSuffix $baseURL "/") }}{{ $baseURL = delimit (slice $baseURL "/") "" }}{{ end }}
|
||||||
|
|
||||||
|
{{ if .Params.showAuthor | default (site.Params.article.showAuthor | default true) }}
|
||||||
|
{{ partial "author.html" . }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ range $author := .Page.Params.authors }}
|
||||||
|
{{ $authorData := index $authorsData $author }}
|
||||||
|
{{ if $authorData }}
|
||||||
|
{{ $link := printf "%sauthors/%s/" $baseURL $author }}
|
||||||
|
{{ partial "author-extra.html" (dict "context" . "data" $authorData "link" $link) }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
<div class="{{ cond $isAuthorBottom "mb-10" "mb-5" }}"></div>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
8
layouts/index.html
Normal file
8
layouts/index.html
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{{ define "main" }}
|
||||||
|
{{ $partial := print "home/" .Site.Params.homepage.layout ".html" }}
|
||||||
|
{{ if templates.Exists ( printf "partials/%s" $partial ) }}
|
||||||
|
{{ partial $partial . }}
|
||||||
|
{{ else }}
|
||||||
|
{{ partial "home/profile.html" . }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
102
layouts/partials/article-link/card.html
Normal file
102
layouts/partials/article-link/card.html
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
{{/* Used by
|
||||||
|
1. list.html and term.html (when the cardView option is enabled)
|
||||||
|
2. Recent articles template (when the cardView option is enabled)
|
||||||
|
3. Shortcode list.html
|
||||||
|
*/}}
|
||||||
|
{{ $disableImageOptimization := site.Store.Get "disableImageOptimization" }}
|
||||||
|
|
||||||
|
{{ $page := .Page }}
|
||||||
|
{{ $featured := "" }}
|
||||||
|
{{ $featuredURL := "" }}
|
||||||
|
{{ if not .Params.hideFeatureImage }}
|
||||||
|
{{/* frontmatter and resources logic remains the same */}}
|
||||||
|
{{ with $page }}
|
||||||
|
{{ with .Params.featureimage }}
|
||||||
|
{{ if or (strings.HasPrefix . "http:") (strings.HasPrefix . "https:") }}
|
||||||
|
{{ if site.Params.hotlinkFeatureImage }}
|
||||||
|
{{ $featuredURL = . }}
|
||||||
|
{{ else }}
|
||||||
|
{{ $featured = resources.GetRemote . }}
|
||||||
|
{{ end }}
|
||||||
|
{{ else }}
|
||||||
|
{{ $featured = resources.Get . }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ if not (or $featured $featuredURL) }}
|
||||||
|
{{ $images := .Resources.ByType "image" }}
|
||||||
|
{{ range slice "*feature*" "*cover*" "*thumbnail*" }}
|
||||||
|
{{ if not $featured }}{{ $featured = $images.GetMatch . }}{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ if not (or $featured $featuredURL) }}
|
||||||
|
{{ $default := site.Store.Get "defaultFeaturedImage" }}
|
||||||
|
{{ if $default.url }}
|
||||||
|
{{ $featuredURL = $default.url }}
|
||||||
|
{{ else if $default.obj }}
|
||||||
|
{{ $featured = $default.obj }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ if not $featuredURL }}
|
||||||
|
{{ with $featured }}
|
||||||
|
{{ $featuredURL = .RelPermalink }}
|
||||||
|
{{ if not (or $disableImageOptimization (eq .MediaType.SubType "svg")) }}
|
||||||
|
{{ $featuredURL = (.Resize "600x").RelPermalink }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<article
|
||||||
|
class="relative flex flex-col h-full overflow-hidden rounded-lg border border-neutral-300 dark:border-neutral-600">
|
||||||
|
{{ with $featuredURL }}
|
||||||
|
<div class="flex-none relative overflow-hidden thumbnail_card h-40">
|
||||||
|
<img
|
||||||
|
src="{{ . }}"
|
||||||
|
role="presentation"
|
||||||
|
loading="lazy"
|
||||||
|
decoding="async"
|
||||||
|
class="not-prose absolute inset-0 w-full h-full object-cover">
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
{{ if and .Draft .Site.Params.article.showDraftLabel }}
|
||||||
|
<span class="absolute top-0 right-0 m-2">
|
||||||
|
{{ partial "badge.html" (i18n "article.draft" | emojify) }}
|
||||||
|
</span>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{/* Main Content Wrapper - Added flex-grow to push footer down */}}
|
||||||
|
<div class="p-4 flex flex-col flex-grow">
|
||||||
|
<header>
|
||||||
|
<a
|
||||||
|
{{ with $page.Params.externalUrl }}
|
||||||
|
href="{{ . }}" target="_blank" rel="external"
|
||||||
|
{{ else }}
|
||||||
|
href="{{ $page.RelPermalink }}"
|
||||||
|
{{ end }}
|
||||||
|
class="not-prose before:absolute before:inset-0 decoration-primary-500 dark:text-neutral text-xl font-bold text-neutral-800 hover:underline hover:underline-offset-2">
|
||||||
|
<h2>
|
||||||
|
{{ .Title | emojify }}
|
||||||
|
{{ if .Params.externalUrl }}
|
||||||
|
<span class="cursor-default align-top text-xs text-neutral-400 dark:text-neutral-500">
|
||||||
|
<span class="rtl:hidden">↗</span>
|
||||||
|
<span class="ltr:hidden">↖</span>
|
||||||
|
</span>
|
||||||
|
{{ end }}
|
||||||
|
</h2>
|
||||||
|
</a>
|
||||||
|
</header>
|
||||||
|
<div class="text-sm text-neutral-500 dark:text-neutral-400 mb-2">
|
||||||
|
{{ partial "article-meta/basic.html" . }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{ if .Params.showSummary | default (.Site.Params.list.showSummary | default false) }}
|
||||||
|
{{/* Added line-clamp-3 and flex-grow here */}}
|
||||||
|
<div class="prose dark:prose-invert py-1 line-clamp-3 flex-grow text-sm">
|
||||||
|
{{ .Summary | plainify }}
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="px-6 pt-4 pb-2"></div>
|
||||||
|
</article>
|
||||||
2
layouts/partials/favicons.html
Normal file
2
layouts/partials/favicons.html
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
<link rel="icon" type="image/svg+xml" href="{{ "/icons/icon.svg" | relURL }}">
|
||||||
|
<link rel="apple-touch-icon" href="{{ "/icons/icon.svg" | relURL }}">
|
||||||
71
layouts/partials/footer.html
Normal file
71
layouts/partials/footer.html
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
<footer id="site-footer" class="py-10 print:hidden">
|
||||||
|
{{/* Footer menu */}}
|
||||||
|
{{ if .Site.Params.footer.showMenu | default true }}
|
||||||
|
{{ if .Site.Menus.footer }}
|
||||||
|
{{ $onlyIcon := true }}
|
||||||
|
{{ range .Site.Menus.footer }}
|
||||||
|
{{ if .Name }}
|
||||||
|
{{ $onlyIcon = false }}
|
||||||
|
{{ break }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ $navClass := printf "flex flex-row pb-4 text-base font-medium text-neutral-500 dark:text-neutral-400 %s" (cond $onlyIcon "overflow-x-auto py-2" "") }}
|
||||||
|
{{ $ulClass := printf "flex list-none %s" (cond $onlyIcon "flex-row" "flex-col sm:flex-row") }}
|
||||||
|
{{ $liClass := printf "flex mb-1 text-end sm:mb-0 sm:me-7 sm:last:me-0 %s" (cond $onlyIcon "me-4" "") }}
|
||||||
|
<nav class="{{ $navClass }}">
|
||||||
|
<ul class="{{ $ulClass }}">
|
||||||
|
{{ range .Site.Menus.footer }}
|
||||||
|
<li class=" {{ $liClass }}">
|
||||||
|
<a
|
||||||
|
class="decoration-primary-500 hover:underline hover:decoration-2 hover:underline-offset-2 flex items-center"
|
||||||
|
href="{{ .URL }}"
|
||||||
|
title="{{ .Title }}">
|
||||||
|
{{ if .Pre }}
|
||||||
|
<span {{ if and .Pre .Name }}class="mr-1"{{ end }}>
|
||||||
|
{{ partial "icon.html" .Pre }}
|
||||||
|
</span>
|
||||||
|
{{ end }}
|
||||||
|
{{ .Name | markdownify }}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{{ end }}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
<div class="flex items-center justify-between">
|
||||||
|
{{/* Copyright */}}
|
||||||
|
{{ if .Site.Params.footer.showCopyright | default true }}
|
||||||
|
<p class="text-sm text-neutral-500 dark:text-neutral-400">
|
||||||
|
{{- with replace .Site.Params.copyright "{ year }" now.Year }}
|
||||||
|
{{ . | markdownify }}
|
||||||
|
{{- else }}
|
||||||
|
©
|
||||||
|
{{ now.Format "2006" }}
|
||||||
|
{{ .Site.Params.Author.name | markdownify }}
|
||||||
|
{{- end }}
|
||||||
|
</p>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{/* Theme attribution */}}
|
||||||
|
{{ if .Site.Params.footer.showThemeAttribution | default true }}
|
||||||
|
<p class="text-xs text-neutral-500 dark:text-neutral-400">
|
||||||
|
Powered by <a class="hover:underline hover:decoration-primary-400 hover:text-primary-500"
|
||||||
|
href="https://gohugo.io/" target="_blank" rel="noopener noreferrer">Your Mom</a>
|
||||||
|
</p>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
{{ if not .Site.Params.disableImageZoom | default true }}
|
||||||
|
<script>
|
||||||
|
mediumZoom(document.querySelectorAll("img:not(.nozoom)"), {
|
||||||
|
margin: 24,
|
||||||
|
background: "rgba(0,0,0,0.5)",
|
||||||
|
scrollOffset: 0,
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{{ end }}
|
||||||
|
{{/* Extend footer - eg. for extra scripts, etc. */}}
|
||||||
|
{{ if templates.Exists "partials/extend-footer.html" }}
|
||||||
|
{{ partialCached "extend-footer.html" . }}
|
||||||
|
{{ end }}
|
||||||
|
</footer>
|
||||||
126
layouts/partials/home/background.html
Normal file
126
layouts/partials/home/background.html
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
{{ $disableImageOptimization := .Site.Params.disableImageOptimization | default false }}
|
||||||
|
<article class="prose dark:prose-invert max-w-full">
|
||||||
|
<div class="relative">
|
||||||
|
<div class="absolute inset-x-0 bottom-0 h-1/2"></div>
|
||||||
|
<div class="mx-auto max-w-7xl p-0">
|
||||||
|
<div class="relative sm:overflow-hidden">
|
||||||
|
<div class="fixed inset-x-0 top-0 -z-10">
|
||||||
|
{{ $useDefault := true }}
|
||||||
|
{{ $homepageImage := "" }}
|
||||||
|
{{ with .Site.Params.defaultBackgroundImage }}
|
||||||
|
{{ if or (strings.HasPrefix . "http:") (strings.HasPrefix . "https:") }}
|
||||||
|
{{ $homepageImage = resources.GetRemote . }}
|
||||||
|
{{ else }}
|
||||||
|
{{ $homepageImage = resources.Get . }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ with .Site.Params.homepage.homepageImage }}
|
||||||
|
{{ if or (strings.HasPrefix . "http:") (strings.HasPrefix . "https:") }}
|
||||||
|
{{ $homepageImage = resources.GetRemote . }}
|
||||||
|
{{ $useDefault = false }}
|
||||||
|
{{ else }}
|
||||||
|
{{ $homepageImage = resources.Get . }}
|
||||||
|
{{ $useDefault = false }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ if $homepageImage }}
|
||||||
|
{{ $style := "" }}
|
||||||
|
{{ $defaultPosition := cond $useDefault site.Params.imagePosition false }}
|
||||||
|
{{ with $.Params.imagePosition | default $defaultPosition }}
|
||||||
|
{{ $style = printf "object-position: %s;" . }}
|
||||||
|
{{ end }}
|
||||||
|
<img
|
||||||
|
id="background-image"
|
||||||
|
class="nozoom mt-0 mr-0 mb-0 ml-0 h-[1000px] w-full object-cover"
|
||||||
|
src="{{ $homepageImage.RelPermalink }}"
|
||||||
|
role="presentation"
|
||||||
|
{{ if $style }}style="{{ $style | safeCSS }}"{{ end }}>
|
||||||
|
<div
|
||||||
|
class="from-neutral absolute inset-0 h-[1000px] bg-gradient-to-t to-transparent mix-blend-normal dark:from-neutral-800"></div>
|
||||||
|
<div
|
||||||
|
class="from-neutral absolute inset-0 h-[1000px] bg-gradient-to-t to-neutral-100 opacity-60 mix-blend-normal dark:from-neutral-800 dark:to-neutral-800"></div>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="relative flex flex-col items-center justify-center px-1 py-1 text-center">
|
||||||
|
{{ with .Site.Params.Author.image }}
|
||||||
|
{{ $authorImage := "" }}
|
||||||
|
{{ if or (strings.HasPrefix . "http:") (strings.HasPrefix . "https:") }}
|
||||||
|
{{ $authorImage = resources.GetRemote . }}
|
||||||
|
{{ else }}
|
||||||
|
{{ $authorImage = resources.Get . }}
|
||||||
|
{{ end }}
|
||||||
|
{{ if $authorImage }}
|
||||||
|
{{ $final := $authorImage }}
|
||||||
|
{{ $squareImage := $authorImage }}
|
||||||
|
{{ if not (or $disableImageOptimization (eq $authorImage.MediaType.SubType "svg")) }}
|
||||||
|
{{ $final = $authorImage.Fill (print "288x288 q" ( $.Site.Params.Author.imagequality | default "96" )) }}
|
||||||
|
{{ $shortSide := int (math.Min $authorImage.Width $authorImage.Height) }}
|
||||||
|
{{ $squareImage = $authorImage.Crop (printf "%dx%d" $shortSide $shortSide ) }}
|
||||||
|
{{ end }}
|
||||||
|
<img
|
||||||
|
class="mb-2 h-36 w-36 rounded-full"
|
||||||
|
width="144"
|
||||||
|
height="144"
|
||||||
|
alt="{{ $.Site.Params.Author.name | default `Author` }}"
|
||||||
|
src="{{ $final.RelPermalink }}"
|
||||||
|
data-zoom-src="{{ $squareImage.RelPermalink }}">
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
<h1 class="mb-2 text-4xl font-extrabold text-neutral-800 dark:text-neutral-200">
|
||||||
|
{{ .Site.Params.Author.name | default .Site.Title }}
|
||||||
|
</h1>
|
||||||
|
{{ with .Site.Params.Author.headline }}
|
||||||
|
<h2 class="mt-0 mb-0 text-xl text-neutral-800 dark:text-neutral-300">
|
||||||
|
{{ . | markdownify }}
|
||||||
|
</h2>
|
||||||
|
{{ end }}
|
||||||
|
<div class="mt-3 mb-10 text-2xl">
|
||||||
|
{{ with .Site.Params.Author.links }}
|
||||||
|
<div class="flex flex-wrap">
|
||||||
|
{{ range $links := . }}
|
||||||
|
{{ range $name, $url := $links }}
|
||||||
|
<a
|
||||||
|
class="hover:text-primary-400 text-primary-800 dark:text-primary-200 px-1"
|
||||||
|
href="{{ $url }}"
|
||||||
|
target="_blank"
|
||||||
|
aria-label="{{ $name | title }}"
|
||||||
|
title="{{ $name | title }}"
|
||||||
|
rel="me noopener noreferrer">
|
||||||
|
{{ partial "icon.html" $name }}
|
||||||
|
</a>
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="relative flex flex-col w-full px-1 py-1 text-left">
|
||||||
|
<section class="prose dark:prose-invert mx-auto w-full">
|
||||||
|
{{ .Content }}
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
{{ partial "recent-articles/main.html" . }}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{{ if .Site.Params.homepage.layoutBackgroundBlur | default false }}
|
||||||
|
<div
|
||||||
|
id="background-blur"
|
||||||
|
class="fixed opacity-0 inset-x-0 top-0 h-full single_hero_background nozoom backdrop-blur-xl bg-neutral-100/75 dark:bg-neutral-800/60"></div>
|
||||||
|
{{ $backgroundBlur := resources.Get "js/background-blur.js" }}
|
||||||
|
{{ $backgroundBlur = $backgroundBlur | resources.Minify | resources.Fingerprint (.Site.Params.fingerprintAlgorithm | default "sha512") }}
|
||||||
|
<script
|
||||||
|
type="text/javascript"
|
||||||
|
src="{{ $backgroundBlur.RelPermalink }}"
|
||||||
|
integrity="{{ $backgroundBlur.Data.Integrity }}"
|
||||||
|
data-blur-id="background-blur"
|
||||||
|
data-image-id="background-image"
|
||||||
|
{{ if $homepageImage }}data-image-url="{{ $homepageImage.RelPermalink }}"{{ end }}></script>
|
||||||
|
{{ end }}
|
||||||
143
layouts/partials/toc.html
Normal file
143
layouts/partials/toc.html
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
<details
|
||||||
|
open
|
||||||
|
id="TOCView"
|
||||||
|
class="toc-right mt-0 overflow-y-auto overscroll-contain bf-scrollbar rounded-lg -ms-5 ps-5 pe-2 block lg:block">
|
||||||
|
<summary
|
||||||
|
class="block py-1 text-lg font-semibold cursor-pointer bg-neutral-100 text-neutral-800 -ms-5 ps-5 dark:bg-neutral-700 dark:text-neutral-100 lg:hidden">
|
||||||
|
{{ i18n "article.table_of_contents" }}
|
||||||
|
</summary>
|
||||||
|
<div
|
||||||
|
id="TableOfContents"
|
||||||
|
class="min-w-[220px] py-2 border-dotted border-s-1 -ms-5 ps-5 dark:border-neutral-600">
|
||||||
|
{{/* We use Hugo's native TOC generator so it never disappears */}}
|
||||||
|
{{ .TableOfContents | safeHTML }}
|
||||||
|
</div>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details class="toc-inside mt-0 overflow-hidden rounded-lg -ms-5 ps-5 lg:hidden">
|
||||||
|
<summary
|
||||||
|
class="py-1 text-lg font-semibold cursor-pointer bg-neutral-100 text-neutral-800 -ms-5 ps-5 dark:bg-neutral-700 dark:text-neutral-100 lg:hidden">
|
||||||
|
{{ i18n "article.table_of_contents" }}
|
||||||
|
</summary>
|
||||||
|
<div
|
||||||
|
class="py-2 border-dotted border-neutral-300 border-s-1 -ms-5 ps-5 dark:border-neutral-600">
|
||||||
|
{{ .TableOfContents | safeHTML }}
|
||||||
|
</div>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
{{ if .Site.Params.smartTOC }}
|
||||||
|
<script>
|
||||||
|
(function () {
|
||||||
|
'use strict'
|
||||||
|
const SCROLL_OFFSET_RATIO = 0.33
|
||||||
|
const TOC_SELECTOR = '#TableOfContents'
|
||||||
|
const ANCHOR_SELECTOR = '.anchor'
|
||||||
|
const TOC_LINK_SELECTOR = 'a[href^="#"]'
|
||||||
|
const NESTED_LIST_SELECTOR = 'li ul'
|
||||||
|
const ACTIVE_CLASS = 'active'
|
||||||
|
let isJumpingToAnchor = false
|
||||||
|
|
||||||
|
// --- NEW LOGIC: Prune .no-toc items before initializing SmartTOC ---
|
||||||
|
function pruneHiddenTOCItems() {
|
||||||
|
// Find all headers on the page with the 'no-toc' class
|
||||||
|
const ignoredHeaders = document.querySelectorAll('h1.no-toc, h2.no-toc, h3.no-toc, h4.no-toc, h5.no-toc, h6.no-toc');
|
||||||
|
|
||||||
|
ignoredHeaders.forEach(header => {
|
||||||
|
if (!header.id) return;
|
||||||
|
|
||||||
|
// Find matching links in both desktop and mobile TOCs
|
||||||
|
const linksToRemove = document.querySelectorAll(`.toc-right a[href="#${header.id}"], .toc-inside a[href="#${header.id}"]`);
|
||||||
|
|
||||||
|
linksToRemove.forEach(link => {
|
||||||
|
const li = link.closest('li');
|
||||||
|
if (li) {
|
||||||
|
const parentUl = li.parentElement;
|
||||||
|
li.remove(); // Remove the item from the TOC
|
||||||
|
|
||||||
|
// If removing this item leaves an empty list, remove the ul too
|
||||||
|
if (parentUl && parentUl.children.length === 0) {
|
||||||
|
parentUl.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getActiveAnchorId(anchors, offsetRatio) {
|
||||||
|
const threshold = window.scrollY + window.innerHeight * offsetRatio
|
||||||
|
const tocLinks = [...document.querySelectorAll('#TableOfContents a[href^="#"]')]
|
||||||
|
const tocIds = new Set(tocLinks.map(link => link.getAttribute('href').substring(1)))
|
||||||
|
|
||||||
|
if (isJumpingToAnchor) {
|
||||||
|
for (let i = 0; i < anchors.length; i++) {
|
||||||
|
const anchor = anchors[i]
|
||||||
|
if (!tocIds.has(anchor.id)) continue
|
||||||
|
const top = anchor.getBoundingClientRect().top + window.scrollY
|
||||||
|
if (Math.abs(window.scrollY - top) < 100) {
|
||||||
|
return anchor.id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = anchors.length - 1; i >= 0; i--) {
|
||||||
|
const top = anchors[i].getBoundingClientRect().top + window.scrollY
|
||||||
|
if (top <= threshold && tocIds.has(anchors[i].id)) {
|
||||||
|
return anchors[i].id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return anchors.find(anchor => tocIds.has(anchor.id))?.id || ''
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateTOC({ toc, anchors, links, scrollOffset, collapseInactive }) {
|
||||||
|
const activeId = getActiveAnchorId(anchors, scrollOffset)
|
||||||
|
if (!activeId) return
|
||||||
|
|
||||||
|
links.forEach(link => {
|
||||||
|
const isActive = link.getAttribute('href') === `#${activeId}`
|
||||||
|
link.classList.toggle(ACTIVE_CLASS, isActive)
|
||||||
|
if (collapseInactive) {
|
||||||
|
const ul = link.closest('li')?.querySelector('ul')
|
||||||
|
if (ul) ul.style.display = isActive ? '' : 'none'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (collapseInactive) {
|
||||||
|
const activeLink = toc.querySelector(`a[href="#${CSS.escape(activeId)}"]`)
|
||||||
|
let el = activeLink
|
||||||
|
while (el && el !== toc) {
|
||||||
|
if (el.tagName === 'UL') el.style.display = ''
|
||||||
|
if (el.tagName === 'LI') el.querySelector('ul')?.style.setProperty('display', '')
|
||||||
|
el = el.parentElement
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function initTOC() {
|
||||||
|
// 1. Remove the hidden items first
|
||||||
|
pruneHiddenTOCItems();
|
||||||
|
|
||||||
|
const toc = document.querySelector(TOC_SELECTOR)
|
||||||
|
if (!toc) return
|
||||||
|
const collapseInactive = {{ if site.Params.smartTOCHideUnfocusedChildren }}true{{ else }}false{{ end }}
|
||||||
|
|
||||||
|
// 2. Query the anchors, explicitly ignoring .no-toc headers so scroll-spy ignores them
|
||||||
|
const anchors = [...document.querySelectorAll('h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]')].filter(a => !a.classList.contains('no-toc'))
|
||||||
|
const links = [...toc.querySelectorAll(TOC_LINK_SELECTOR)]
|
||||||
|
|
||||||
|
if (collapseInactive) {
|
||||||
|
toc.querySelectorAll(NESTED_LIST_SELECTOR).forEach(ul => ul.style.display = 'none')
|
||||||
|
}
|
||||||
|
|
||||||
|
links.forEach(link => {
|
||||||
|
link.addEventListener('click', () => { isJumpingToAnchor = true })
|
||||||
|
})
|
||||||
|
|
||||||
|
const config = { toc, anchors, links, scrollOffset: SCROLL_OFFSET_RATIO, collapseInactive }
|
||||||
|
window.addEventListener('scroll', () => updateTOC(config), { passive: true })
|
||||||
|
window.addEventListener('hashchange', () => updateTOC(config), { passive: true })
|
||||||
|
updateTOC(config)
|
||||||
|
}
|
||||||
|
document.readyState === 'loading' ? document.addEventListener('DOMContentLoaded', initTOC) : initTOC()
|
||||||
|
})()
|
||||||
|
</script>
|
||||||
|
{{ end }}
|
||||||
1
layouts/shortcodes/rawhtml.html
Normal file
1
layouts/shortcodes/rawhtml.html
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{{ .Inner }}
|
||||||
4
layouts/shortcodes/video.html
Normal file
4
layouts/shortcodes/video.html
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<video width="100%" controls preload="metadata">
|
||||||
|
<source src="{{ .Get "src" }}" type="video/mp4">
|
||||||
|
Your browser does not support the video tag.
|
||||||
|
</video>
|
||||||
20
package.json
Normal file
20
package.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"name": "blowfish_template",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Blowfish Template",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "hugo server --minify -D -E -F"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/nunocoracao/blowfish_template.git"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/nunocoracao/blowfish_template/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/nunocoracao/blowfish_template#readme"
|
||||||
|
}
|
||||||
3
robots.txt
Normal file
3
robots.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
User-agent: *
|
||||||
|
Allow: /
|
||||||
|
Sitemap: /sitemap.xml
|
||||||
1
site.webmanifest
Normal file
1
site.webmanifest
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
|
||||||
Reference in New Issue
Block a user