init: scaffold OPENBUREAU site with shibui-derived theme

- Hugo site for openbureau.ch (Deutsch, i18n-ready for EN/IT)
- Theme themes/openbureau/ = local copy of shibui, customized via
  site-level layouts and assets to keep the theme reference clean
- Editorial typography stack: Newsreader serif body, Space Grotesk
  display, Inter for listings, IBM Plex Mono for technical meta
- Content structure: library/ (Theorie, Büroführung, Software) with
  manifest and colophon at root; software is a library category, not
  a separate top-level
- Three views over one source: Journal (chronological home),
  Library (atlas grouped by section + tag cloud), single articles

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-23 20:25:29 +02:00
commit 00c3343b1d
87 changed files with 2929 additions and 0 deletions
+98
View File
@@ -0,0 +1,98 @@
# Sample workflow for building and deploying a Hugo site to GitHub Pages
name: Deploy Hugo site to Pages
on:
# Runs on pushes targeting the default branch
push:
branches:
- master
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
contents: read
pages: write
id-token: write
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
group: "pages"
cancel-in-progress: false
# Default to bash
defaults:
run:
shell: bash
jobs:
# Build job
build:
runs-on: ubuntu-latest
env:
HUGO_VERSION: 0.147.2
HUGO_ENVIRONMENT: production
TZ: America/Los_Angeles
steps:
- name: Install Hugo CLI
run: |
wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \
&& sudo dpkg -i ${{ runner.temp }}/hugo.deb
- name: Install Dart Sass
run: sudo snap install dart-sass
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
- name: Setup Pages
id: pages
uses: actions/configure-pages@v5
- name: Install Node.js dependencies
run: "[[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true"
- name: Cache Restore
id: cache-restore
uses: actions/cache/restore@v4
with:
path: |
${{ runner.temp }}/hugo_cache
key: hugo-${{ github.run_id }}
restore-keys:
hugo-
- name: Configure Git
run: git config core.quotepath false
- name: Build with Hugo
working-directory: exampleSite
run: |
hugo \
--themesDir=../.. \
--gc \
--minify \
--baseURL "${{ steps.pages.outputs.base_url }}/" \
--cacheDir "${{ runner.temp }}/hugo_cache"
- name: Cache Save
id: cache-save
uses: actions/cache/save@v4
with:
path: |
${{ runner.temp }}/hugo_cache
key: ${{ steps.cache-restore.outputs.cache-primary-key }}
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: ./exampleSite/public
# Deployment job
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
+50
View File
@@ -0,0 +1,50 @@
### Hugo
# Generated files by hugo
/public/
/resources/_gen/
/assets/jsconfig.json
hugo_stats.json
# Executable may be added to repository
hugo.exe
hugo.darwin
hugo.linux
# Temporary lock file while building
/.hugo_build.lock
### VisualStudioCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/*.code-snippets
# Local History for Visual Studio Code
.history/
# Built Visual Studio Code Extensions
*.vsix
### Vim
# Swap
[._]*.s[a-v][a-z]
!*.svg # comment out if you don't need vector files
[._]*.sw[a-p]
[._]s[a-rt-v][a-z]
[._]ss[a-gi-z]
[._]sw[a-p]
# Session
Session.vim
Sessionx.vim
# Temporary
.netrwhist
*~
# Auto-generated tag files
tags
# Persistent undo
[._]*.un~
+39
View File
@@ -0,0 +1,39 @@
# Changelog
All notable changes to the Shibui theme will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Added
- Reading time estimation feature with `showreadingtime` parameter
- Last modified date display option with `showlastmod` parameter
- Theme configuration parameters documentation
- ARIA labels to navigation elements for improved accessibility
- Preconnect/DNS prefetch for external resources (mermaid CDN)
- Enhanced 404 page with additional navigation options
- CSS styling for reading time and lastmod indicators
### Changed
- Reorganized CSS loading to remove redundant custom.css import from main.css
- Improved semantic HTML structure with landmark roles
### Fixed
- None yet
## [0.1.0] - 2025-11-20
### Added
- Initial release of Shibui theme
- Minimalist design following Shibui (渋い) aesthetics
- Terminal-inspired navigation
- Clean typography with monospace font
- Automatic dark/light theme support via CSS variables
- Nested heading counters
- Zero JavaScript (pure CSS solutions)
- Table of contents support
- Tags and taxonomy support
- Responsive layout
- Print styles
+21
View File
@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2025 Kien Nguyen-Tuan
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.
+271
View File
@@ -0,0 +1,271 @@
<div align="center">
<img src="./static/favicon_io/apple-icon-180x180.png">
<h1>Shibui (渋い)</h1>
<p>A minimalist Hugo theme emphasizing simplicity and refinement</p>
<p>
<a href="https://github.com/ntk148v/shibui/blob/master/LICENSE">
<img alt="GitHub license" src="https://img.shields.io/github/license/ntk148v/shibui?style=for-the-badge">
</a>
<a href="https://github.com/ntk148v/shibui/stargazers">
<img alt="GitHub stars" src="https://img.shields.io/github/stars/ntk148v/shibui?style=for-the-badge">
</a>
<a href="https://gohugo.io">
<img alt="Hugo" src="https://img.shields.io/badge/hugo-0.93.0-blue.svg?style=for-the-badge">
</a>
</p>
</div>
Table of contents:
- [Features](#features)
- [Installation](#installation)
- [As a Git Submodule](#as-a-git-submodule)
- [Configuration](#configuration)
- [Page Configuration](#page-configuration)
- [Color Scheme](#color-scheme)
- [Customization](#customization)
- [CSS Variables](#css-variables)
- [Contributing](#contributing)
- [License](#license)
- [Demo](#demo)
- [Theme Structure](#theme-structure)
- [Template Organization](#template-organization)
- [Assets](#assets)
- [ExampleSite](#examplesite)
- [Updating](#updating)
- [Version Requirements](#version-requirements)
- [Credits](#credits)
| | |
| -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| <img src="https://raw.githubusercontent.com/ntk148v/shibui/refs/heads/master/images/1.png" alt="dark" style="border-radius:1%"/> | <img src="https://raw.githubusercontent.com/ntk148v/shibui/refs/heads/master/images/2.png" alt="dark" style="border-radius:1%"/> |
| <img src="https://raw.githubusercontent.com/ntk148v/shibui/refs/heads/master/images/3.png" alt="dark" style="border-radius:1%"/> | <img src="https://raw.githubusercontent.com/ntk148v/shibui/refs/heads/master/images/4.png" alt="dark" style="border-radius:1%"/> |
[Shibui](https://en.wikipedia.org/wiki/Shibui) (渋い) (adjective), shibumi (渋み) (subjective noun), or shibusa (渋さ) (objective noun) are Japanese words that refer to a particular aesthetic of simple, subtle, and unobtrusive beauty. Like other Japanese aesthetics terms, such as iki and wabi-sabi, shibui can apply to a wide variety of subjects, not just art or fashion.
## Features
- Minimalist design following Shibui (渋い) aesthetics
- Terminal-inspired navigation
- Clean typography with monospace font
- Semantic HTML with proper text styling (bold, italic, blockquotes)
- Paper-like color scheme
- Automatic dark/light theme support
- Nested heading counters
- Zero JavaScript (pure CSS solutions)
- Highly customizable through CSS variables
- Mobile-responsive layout
- Table of Contents support
- Tags support
- Customizable
## Installation
### As a Git Submodule
```bash
git submodule add https://github.com/ntk148v/shibui.git themes/shibui
git submodule update --init --recursive
```
### Configuration
Add the following to your `config.toml`:
```toml
baseURL = 'http://example.org/'
languageCode = 'en-us'
title = 'Your Site Title'
theme = "shibui"
[params]
author = "Your Name"
email = "your.email@example.com"
[menu]
[[menu.main]]
name = "Posts"
url = "/posts/"
weight = 1
[[menu.main]]
name = "About"
url = "/about/"
weight = 2
```
### Page Configuration
In the front matter of your content files:
```yaml
---
title: "Your Post Title"
date: 2023-06-13
tags: ["hugo", "theme"]
---
```
### Theme Parameters
You can configure theme behavior by adding parameters to your site's `config.toml`:
```toml
[params]
author = "Your Name"
email = "your.email@example.com"
# Enable/disable comments on posts (default: true)
comments = true
# Default table of contents visibility per page (default: true)
# Can be overridden per-page with `toc: false` in front matter
showtoc = true
# Show estimated reading time on posts (default: true)
showreadingtime = true
# Show last modified date on posts (default: false)
showlastmod = false
# Social links (optional)
twitterHandle = "username"
ogImage = "/images/og-image.jpg"
```
Supported front matter parameters for individual pages:
- `toc` (boolean): Show/hide table of contents (default: true)
- `comments` (boolean): Enable/disable comments for this page (default: site.Params.comments)
- `showreadingtime` (boolean): Override reading time display (default: site.Params.showreadingtime)
- `showlastmod` (boolean): Override last modified date display (default: site.Params.showlastmod)
## Color Scheme
The theme uses a paper-like color palette, use a background primary color as base and then derive the rest of theme colors by shifting lightness (or saturation/hue if needed) relative to that base, so we can easily generate multiple variants (light, dark, high-contrast, etc.). Therefore, you can adjust just base color and keep the same vibe, checkout [#4](https://github.com/ntk148v/shibui/pull/4) for preview.
```css
/* Base theme knobs */
--bg-h: 0;
--bg-s: 0%;
--bg-l: 99%;
/* Background colors */
--color-bg-primary: hsl(var(--bg-h) var(--bg-s) var(--bg-l));
--color-bg-secondary: hsl(var(--bg-h) var(--bg-s) calc(var(--bg-l) - 2%));
--color-border: hsl(var(--bg-h) var(--bg-s) calc(var(--bg-l) - 6%));
--color-selection-bg: hsl(var(--bg-h) var(--bg-s) calc(var(--bg-l) - 13%));
/* Text colors with WCAG-friendly contrast */
/* Primary: ensures near-black on light bg and near-white on dark bg */
--color-text-primary: hsl(
var(--bg-h) var(--bg-s) clamp(8%, calc(100% - var(--bg-l)), 92%)
);
/* Muted: softer but still >4.5:1 contrast */
--color-text-muted: hsl(
var(--bg-h) var(--bg-s) clamp(30%, calc(85% - var(--bg-l)), 75%)
);
/* Code text: slightly brighter than muted */
--color-text-code: hsl(
var(--bg-h) var(--bg-s) clamp(20%, calc(90% - var(--bg-l)), 85%)
);
```
## Customization
### CSS Variables
You can customize the theme by overriding CSS variables in your `assets/css/custom.css`:
For example, you want to create a dark theme, just adjust the base color.
```css
:root {
/* Base theme knobs */
--bg-h: 0;
--bg-s: 0%;
--bg-l: 12%;
}
```
## Contributing
Contributions are welcome! Primary goals are:
- Maintain minimalist design principles
- Keep it simple and efficient
- Avoid JavaScript when CSS can solve the problem
- Follow Shibui (渋い) aesthetics
## License
MIT
## Demo
Visit the [demo site](https://ntk148v.github.io/shibui) to see the theme in action.
## Theme Structure
```
shibui/
├── archetypes/ # Content template files
├── assets/
│ ├── css/ # Theme CSS files
│ └── js/ # Theme JavaScript files
├── layouts/ # Template files
│ ├── _default/ # Default templates
│ ├── _partials/ # Reusable template parts
│ └── index.html # Homepage template
├── static/ # Static assets
└── exampleSite/ # Example site for reference
```
### Template Organization
- `layouts/_default/baseof.html`: Base template with common layout
- `layouts/_default/single.html`: Template for individual pages
- `layouts/_default/list.html`: Template for section pages
- `layouts/_partials/`: Contains reusable components like header, footer
- `layouts/index.html`: Homepage template
### Assets
The theme uses a minimal set of assets:
- CSS: Single stylesheet with CSS variables for customization
- JS: Optional JavaScript for enhanced functionality
- Static: Basic favicon and other static assets
### ExampleSite
The `exampleSite` directory contains a complete example of a site using the theme. Use it as a reference for:
- Configuration setup
- Content organization
- Front matter examples
- Menu structure
## Updating
Since the theme is installed as a Git submodule, you can update it to the latest version with:
```bash
cd themes/shibui
git pull origin main
```
## Version Requirements
- Hugo Extended v0.93.0 or higher
- Go 1.18 or higher (for Hugo modules)
## Credits
This theme was inspired by various minimalist designs and the Japanese concept of Shibui (渋い). Special thanks to:
- [William Jansson](https://williamjansson.com)
- The Hugo community
- [Minimalist design principles](<https://en.wikipedia.org/wiki/Minimalism_(computing)>)
- Japanese aesthetics, particularly [Shibui](https://en.wikipedia.org/wiki/Shibui)
+5
View File
@@ -0,0 +1,5 @@
+++
date = '{{ .Date }}'
draft = true
title = '{{ replace .File.ContentBaseName "-" " " | title }}'
+++
+50
View File
@@ -0,0 +1,50 @@
/* Quadratisches Bild */
.list-image {
aspect-ratio: 9 / 5;
overflow: hidden;
}
.list-image img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
margin: 0;
}
/* Titel + Meta in einer Zeile */
.list-title-row {
display: flex;
justify-content: space-between;
align-items: baseline;
margin-top: 0.4rem;
}
.list-title {
margin: 0;
}
.list-meta {
display: flex;
gap: 8px;
}
/* Grayscale */
img {
filter: grayscale(100%);
transition: filter 0.4s ease;
}
img:hover {
filter: grayscale(0%);
}
.auto-carousel img {
filter: none !important;
}
body {
padding: var(--spacing-sm) 1.5rem;
gap: var(--spacing-sm);
}
img {
margin: 0;
}
+623
View File
@@ -0,0 +1,623 @@
:root {
/* Typography */
--spacing-base: 1.5em;
--font-family-mono: monospace;
--font-size-base: 1em;
--font-size-small: 0.9em;
--font-size-code: 0.95em;
/* Spacing */
--spacing-xs: calc(var(--spacing-base) * 0.25);
--spacing-sm: calc(var(--spacing-base) * 0.5);
--spacing-md: var(--spacing-base);
--spacing-lg: calc(var(--spacing-base) * 2);
/* Base theme knobs - fixed for light mode only */
--bg-h: 0;
--bg-s: 0%;
--bg-l: 99%;
/* Background colors */
--color-bg-primary: hsl(var(--bg-h) var(--bg-s) var(--bg-l));
--color-bg-secondary: hsl(var(--bg-h) var(--bg-s) calc(var(--bg-l) - 2%));
--color-border: hsl(var(--bg-h) var(--bg-s) calc(var(--bg-l) - 6%));
--color-selection-bg: hsl(var(--bg-h) var(--bg-s) calc(var(--bg-l) - 13%));
/* Text colors */
--color-text-primary: hsl(var(--bg-h) var(--bg-s) 8%);
--color-text-muted: hsl(var(--bg-h) var(--bg-s) 50%);
--color-text-code: hsl(var(--bg-h) var(--bg-s) 30%);
/* Layout */
--container-width: 60ch;
--pre-border-radius: 0.75rem;
--inline-border-radius: 0.375rem;
--gap-base: 1em;
--gap-small: 0.5rem;
/* Breakpoints */
--breakpoint-mobile: 600px;
color-scheme: light;
}
.no-scrollbar {
scrollbar-width: none; /* Firefox */
-ms-overflow-style: none; /* IE and Edge */
}
.no-scrollbar::-webkit-scrollbar {
display: none; /* Chrome, Safari, Opera */
}
.list-unstyled {
list-style: none;
margin-left: 0;
}
.text-muted {
color: var(--color-text-muted);
}
.no-underline {
text-decoration: none;
border-bottom: none;
}
::selection {
background: var(--color-selection-bg);
color: var(--color-text-primary);
}
/* Skip link for accessibility */
.skip-link {
position: absolute;
top: -100%;
left: 0;
padding: var(--spacing-sm) var(--spacing-md);
background: var(--color-bg-primary);
border: 1px solid var(--color-border);
z-index: 1000;
opacity: 0;
transition: opacity 0.2s ease-in-out;
}
.skip-link:focus {
position: fixed;
top: var(--spacing-sm);
left: var(--spacing-sm);
opacity: 1;
}
/* Focus styles for accessibility */
a:focus-visible,
button:focus-visible,
input:focus-visible,
textarea:focus-visible,
select:focus-visible {
outline: 2px solid var(--color-text-primary);
outline-offset: 2px;
}
* {
margin: 0;
padding: 0;
font: inherit;
color: var(--color-text-primary);
box-sizing: border-box;
}
ul {
list-style-type: disc;
margin-left: 1.5rem;
}
ol {
list-style-type: decimal;
margin-left: 1.5rem;
}
html {
margin: 0 0 0 calc(100vw - 100%);
-webkit-text-size-adjust: 100%;
height: 100%;
}
body {
font: var(--font-size-base) / var(--spacing-base) var(--font-family-mono);
background: var(--color-bg-primary);
min-height: 100%;
display: grid;
grid-template-rows: auto 1fr auto;
grid-template-columns: minmax(auto, var(--container-width));
justify-content: center;
padding: var(--spacing-lg);
gap: var(--spacing-lg);
}
a {
display: inline-block;
margin-left: -0.16666em;
text-decoration: none;
border-bottom: 1px dotted;
white-space: pre-wrap;
word-wrap: break-word;
}
a:hover {
border-bottom: 1px solid;
}
p,
pre {
margin: var(--spacing-base) 0;
}
h1,
h2,
h3,
h4,
h5 {
margin: var(--spacing-base) 0;
font-weight: bold;
}
h2 {
counter-increment: h2;
counter-reset: h3;
}
h3 {
counter-increment: h3;
counter-reset: h4;
}
h4 {
counter-increment: h4;
counter-reset: h5;
}
h5 {
counter-increment: h5;
}
/* nested counters */
h2::before {
content: counter(h2) ". ";
}
h3::before {
content: counter(h2) "." counter(h3) ". ";
}
h4::before {
content: counter(h2) "." counter(h3) "." counter(h4) ". ";
}
h5::before {
content: counter(h2) "." counter(h3) "." counter(h4) "." counter(h5) ". ";
}
time {
color: var(--color-text-muted);
}
footer {
padding: calc(var(--spacing-base) * 2) 0;
text-align: center;
}
footer p {
margin-bottom: 0;
}
pre {
border: 1px solid var(--color-border);
padding: var(--spacing-sm) var(--spacing-md);
border-radius: var(--pre-border-radius);
white-space: pre-wrap;
word-wrap: break-word;
font-family: var(--font-family-mono);
font-size: var(--font-size-code);
line-height: 1.6;
color: var(--color-text-code);
overflow-x: auto;
box-shadow: 0 1px 2px 0 var(--color-border);
}
pre code {
background: none;
border: none;
padding: 0;
font-size: inherit;
color: inherit;
}
p > code,
li > code,
h1 > code,
h2 > code,
h3 > code,
h4 > code,
h5 > code {
background: var(--color-bg-secondary);
border: 1px solid var(--color-border);
border-radius: var(--inline-border-radius);
padding: 0.2em 0.4em;
font-family: var(--font-family-mono);
font-size: var(--font-size-code);
color: var(--color-text-code);
white-space: pre-wrap;
word-wrap: break-word;
}
.terms-list {
padding-bottom: var(--spacing-base);
}
.terms-list ul {
list-style-type: none;
margin-left: 0;
}
.terms-list ul li {
display: inline-block;
font-style: italic;
font-size: var(--font-size-small);
color: var(--color-text-muted);
padding: 0 3px;
}
/* Path navigation styles */
.path-nav {
font-family: var(--font-family-mono);
padding: var(--spacing-base) 0;
white-space: nowrap;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
scrollbar-width: none; /* Firefox */
-ms-overflow-style: none; /* IE and Edge */
width: 100%;
}
.path-nav::-webkit-scrollbar {
display: none; /* Chrome, Safari, Opera */
}
.path-nav ol {
display: flex;
flex-wrap: nowrap;
list-style: none;
margin: 0;
padding: 0;
}
.path-nav li {
display: flex;
align-items: center;
color: var(--color-text-muted);
flex-shrink: 0;
max-width: 200px;
}
.path-nav li.current {
max-width: none;
}
.path-nav li a {
text-decoration: none;
border-bottom: none;
padding: 0 0.25em;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: var(--color-text-muted);
}
.path-nav li.current a {
color: var(--color-text-primary);
font-weight: bold;
overflow: visible;
text-overflow: clip;
white-space: normal;
}
.path-nav a:hover {
text-decoration: underline;
}
.back-nav {
margin-bottom: var(--spacing-base);
}
.back-link {
color: var(--color-text-muted);
border-bottom: none;
}
.back-link:hover {
color: var(--color-text-primary);
text-decoration: none;
}
/* Time list */
.time-list ul {
list-style: none;
margin-left: 0;
display: grid;
grid-template-columns: 1fr 1fr;
gap: 2rem;
padding: 0;
}
.time-list li {
display: flex;
flex-direction: column;
gap: 0;
padding: 0;
}
@media (max-width: 600px) {
.time-list ul {
grid-template-columns: 1fr;
}
.time-list time {
font-size: var(--font-size-small);
}
}
/* Archive styles */
.archive {
margin: var(--spacing-base) 0;
}
.archive-year {
margin: calc(var(--spacing-base) * 1.5) 0 var(--spacing-sm) 0;
font-size: 1.2em;
color: var(--color-text-primary);
}
.archive-month {
margin: var(--spacing-md) 0 var(--spacing-sm) 0;
font-size: 1.1em;
color: var(--color-text-muted);
}
.archive-item {
display: flex;
align-items: baseline;
gap: var(--gap-small);
margin: var(--spacing-sm) 0;
padding-left: 1em;
}
.archive-item time {
font-family: var(--font-family-mono);
font-size: var(--font-size-small);
color: var(--color-text-muted);
min-width: 2em;
}
.archive-item a {
font-size: var(--font-size-base);
}
/* Main menu navigation styles */
.terminal-nav {
font-family: var(--font-family-mono);
border-top: 1px solid var(--color-border);
margin-top: calc(var(--spacing-base) * 2);
padding-top: var(--spacing-base);
}
.terminal-nav nav ul {
list-style: none;
padding: 0;
margin: 0;
display: flex;
gap: 1em;
justify-content: center;
}
.terminal-nav nav ul li {
display: inline-block;
}
.terminal-nav nav ul li a,
.terminal-nav .back-link {
color: var(--color-text-muted);
border-bottom: none;
text-decoration: none;
}
.terminal-nav nav ul li a:hover,
.terminal-nav .back-link:hover {
color: var(--color-text-primary);
}
.terminal-nav nav ul li a.active {
color: var(--color-text-primary);
font-weight: bold;
}
.terminal-nav .back-nav {
margin: calc(var(--spacing-base) * 0.5) 0;
}
/* Image styles */
img {
display: block;
max-width: 100%;
height: auto;
margin: var(--spacing-base) auto;
}
figure {
margin: var(--spacing-base) 0;
text-align: center;
}
figure img {
margin: 0 auto;
}
figcaption {
color: var(--color-text-muted);
font-size: var(--font-size-small);
margin-top: calc(var(--spacing-base) / 2);
}
/* Table styles */
table {
width: 100%;
margin: var(--spacing-base) 0;
border-collapse: collapse;
}
thead th,
th {
font-weight: bold;
text-align: center;
border-bottom: 2px solid var(--color-border);
padding: var(--spacing-sm);
}
td {
padding: var(--spacing-sm);
border-bottom: 1px solid var(--color-border);
}
/* Typography emphasis */
strong {
font-weight: bold;
}
em {
font-style: italic;
}
/* Blockquote styles */
blockquote {
margin: var(--spacing-base) 0;
padding: var(--spacing-sm) var(--spacing-base);
border: 1px solid var(--color-border);
border-radius: var(--pre-border-radius);
background: var(--color-bg-secondary);
box-shadow: 0 1px 2px 0 var(--color-border);
font-style: italic;
}
blockquote > :first-child {
margin-top: 0;
}
blockquote > :last-child {
margin-bottom: 0;
}
/* Table of Contents */
.toc {
margin: var(--spacing-base) 0;
padding: var(--spacing-sm);
border: 1px solid var(--color-border);
background: var(--color-bg-secondary);
border-radius: var(--pre-border-radius);
box-shadow: 0 1px 2px 0 var(--color-border);
}
.toc .toc-content a {
text-decoration: none;
color: var(--color-text-primary);
font-size: var(--font-size-small);
}
.toc .toc-content ol li {
list-style-type: disc !important;
}
.time {
margin: var(--spacing-md) 0;
}
.reading-time,
.lastmod {
color: var(--color-text-muted);
font-size: var(--font-size-small);
}
@media (max-width: 600px) {
.path-nav li {
max-width: 100px;
}
.path-nav li:first-child {
max-width: none;
}
.path-nav li.current {
max-width: none;
}
}
@media (max-width: 600px) {
body {
padding-top: 2em;
}
pre {
max-width: calc(100vw - 4em);
}
}
/* Print styles */
@media print {
body {
background: white;
color: black;
padding: 0;
display: block;
}
header,
footer,
.terminal-nav,
.skip-link,
.toc,
.back-nav {
display: none !important;
}
main {
max-width: 100%;
}
a {
border-bottom: none;
color: black;
}
a[href]::after {
content: " (" attr(href) ")";
font-size: 0.8em;
color: gray;
}
a[href^="#"]::after,
a[href^="javascript:"]::after {
content: "";
}
pre,
blockquote,
img {
page-break-inside: avoid;
}
h1,
h2,
h3,
h4,
h5 {
page-break-after: avoid;
}
}
+60
View File
@@ -0,0 +1,60 @@
(function() {
if (!window.matchMedia('(pointer: fine)').matches) return;
const canvas = document.createElement('canvas');
canvas.style.cssText = 'position:fixed;pointer-events:none;z-index:9999;image-rendering:pixelated;left:-200px;top:-200px;';
document.body.appendChild(canvas);
const ctx = canvas.getContext('2d');
const P = 2;
const grid = [
'_BB_______',
'BRRB______',
'BRRRB_____',
'BRRRRB____',
'BRRRRRB___',
'BRRRRRRB__',
'BRRRRRRB__',
'BRRRRSB___',
'BRRSRRB___',
'_BBBRRB___',
'____BBB___',
];
const rows = grid.length;
const cols = Math.max(...grid.map(r => r.length));
canvas.width = cols * P;
canvas.height = rows * P;
canvas.style.width = cols * P + 'px';
canvas.style.height = rows * P + 'px';
grid.forEach((row, y) => {
for (let x = 0; x < row.length; x++) {
const c = row[x];
if (c === 'B') { ctx.fillStyle = '#1a1a1a'; ctx.fillRect(x*P, y*P, P, P); }
else if (c === 'R') { ctx.fillStyle = '#ffffff'; ctx.fillRect(x*P, y*P, P, P); }
else if (c === 'S') { ctx.fillStyle = '#b0b0b0'; ctx.fillRect(x*P, y*P, P, P); }
}
});
function setPos(x, y) {
canvas.style.left = x + 'px';
canvas.style.top = y + 'px';
}
try {
const saved = sessionStorage.getItem('cursorPos');
if (saved) {
const pos = JSON.parse(saved);
setPos(pos.x, pos.y);
}
} catch(e) {}
document.addEventListener('mousemove', e => {
setPos(e.clientX, e.clientY);
try {
sessionStorage.setItem('cursorPos', JSON.stringify({ x: e.clientX, y: e.clientY }));
} catch(e) {}
}, { passive: true });
})();
+25
View File
@@ -0,0 +1,25 @@
baseURL = 'https://example.org/'
languageCode = 'en-US'
title = 'My New Hugo Site'
[menus]
[[menus.main]]
name = 'Home'
pageRef = '/'
weight = 10
[[menus.main]]
name = 'Posts'
pageRef = '/posts'
weight = 20
[[menus.main]]
name = 'Tags'
pageRef = '/tags'
weight = 30
[module]
[module.hugoVersion]
extended = false
min = '0.93.0'
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

+24
View File
@@ -0,0 +1,24 @@
{{ define "main" }}
<h1>RESOURCE NOT FOUND</h1>
<p>the page you're looking for doesn't exist or has been moved.</p>
<nav aria-label="404 navigation">
<ul>
<li><a href="{{ "/" | relURL }}">← return to homepage</a></li>
{{ with site.Home }}
{{ with .GetPage "posts" }}
{{ if . }}
<li><a href="{{ .RelPermalink }}">browse posts</a></li>
{{ end }}
{{ end }}
{{ end }}
{{ with site.Home }}
{{ with .GetPage "about" }}
{{ if . }}
<li><a href="{{ .RelPermalink }}">about page</a></li>
{{ end }}
{{ end }}
{{ end }}
</ul>
</nav>
{{ end }}
@@ -0,0 +1,20 @@
{{- $alt := .Text -}} {{- $src := .Destination -}} {{- $title := .Title -}}
<figure>
<img
src="{{ $src }}"
alt="{{ $alt }}"
loading="lazy"
{{
with
$title
}}
title="{{ . }}"
{{
end
}}
/>
{{- with $alt }}
<figcaption>{{ . }}</figcaption>
{{ end -}}
</figure>
+30
View File
@@ -0,0 +1,30 @@
{{ define "main" }}
<h1>archive</h1>
<div class="archive">
{{- $.Scratch.Add "year" "" -}}
{{- $.Scratch.Add "month" "" -}}
{{- range where site.Pages "Section" "posts" -}}
{{- if and (not .Draft) .Date -}}
{{- $year := .Date.Format "2006" -}}
{{- $month := .Date.Format "January" -}}
{{- if ne $year ($.Scratch.Get "year") -}}
{{- $.Scratch.Set "year" $year -}}
{{- $.Scratch.Set "month" "" -}}
<h2 class="archive-year">{{ $year }}</h2>
{{- end -}}
{{- if ne $month ($.Scratch.Get "month") -}}
{{- $.Scratch.Set "month" $month -}}
<h3 class="archive-month">{{ $month }}</h3>
{{- end -}}
<article class="archive-item">
<time datetime="{{ .Date.Format "2006-01-02" }}">{{ .Date.Format "02" }}</time>
<a href="{{ .RelPermalink }}">{{ .Title }}</a>
</article>
{{- end -}}
{{- end -}}
</div>
{{ end }}
+18
View File
@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html
lang="{{ site.Language.LanguageCode }}"
dir="{{ or site.Language.LanguageDirection `ltr` }}"
>
<head>
<style>@media (pointer: fine) { * { cursor: none !important; } }</style>
{{ partial "head.html" . }}
</head>
<body>
<a href="#main-content" class="skip-link">Skip to content</a>
<header role="banner">{{ partial "header.html" . }}</header>
<main id="main-content" role="main">{{ block "main" . }}{{ end }}</main>
<footer role="contentinfo">{{ partial "footer.html" . }}</footer>
{{ with resources.Get "js/cursor.js" }}<script>{{ .Content | safeJS }}</script>{{ end }}
</body>
</html>
+24
View File
@@ -0,0 +1,24 @@
{{ define "main" }}
{{ .Content }}
<div class="time-list">
<ul>
{{ range .Pages }}
<li class="list-item">
{{ if .Params.image }}
<div class="list-image">
<img src="{{ .Params.image }}" alt="{{ .LinkTitle }}">
</div>
{{ end }}
<div class="list-title-row">
<div class="list-title">
<a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a>
</div>
<div class="list-meta">
{{ partial "date.html" .Date }}
</div>
</div>
</li>
{{ end }}
</ul>
</div>
{{ end }}
+55
View File
@@ -0,0 +1,55 @@
{{ define "main" }}
{{ partial "terms.html" (dict "taxonomy" "tags" "page" .) }}
{{/* Table of Contents */}}
{{ $hasToC := .Params.toc | default true }}
{{ $headers := findRE "<h[2-6]" .Content }}
{{ if and $hasToC (ge (len $headers) 1) }}
<nav class="toc">
<strong>TABLE OF CONTENTS</strong>
<div class="toc-content">
{{ .TableOfContents }}
</div>
</nav>
{{ end }}
<!-- Content -->
{{ partial "list-to-carousel.html" .Content }}
<!-- Carousel CSS & JS -->
<link rel="stylesheet" href="/css/auto-carousel.css">
<script type="text/javascript" src="/js/auto-carousel.js"></script>
<div class="time">
{{ partial "date.html" .Date }}
{{ $showReadingTime := .Params.showreadingtime | default site.Params.showreadingtime | default true }}
{{ if and $showReadingTime .ReadingTime }}
<span class="reading-time"> · {{ .ReadingTime }} min read</span>
{{ end }}
{{ $showLastMod := .Params.showlastmod | default site.Params.showlastmod | default false }}
{{ if and $showLastMod .Lastmod }}
{{ if ne .LastMod.Format "2006-01-02" .Date.Format "2006-01-02" }}
<span class="lastmod"> · Last updated: {{ .LastMod.Format "2006-01-02" }}</span>
{{ end }}
{{ end }}
</div>
<!-- Comments block -->
{{ if and .Content (default true (default .Site.Params.comments
.Params.comments))
}}
<div class="comments">{{- partial "comments" . -}}</div>
{{ end }}
{{ if not .IsHome }}
<div class="terminal-nav">
<div class="back-nav">
{{ with .Parent }}
<a href="{{ .RelPermalink }}" class="back-link">../</a>
{{ else }}
<a href="{{ "/" | relURL }}" class="back-link">../</a>
{{ end }}
</div>
</div>
{{ end }}
{{ end }}
+77
View File
@@ -0,0 +1,77 @@
<style>
* { cursor: none !important; }
body { min-height: 400px; display: flex; align-items: center; justify-content: center; flex-direction: column; gap: 2rem; font-family: monospace; }
#cursor {
position: fixed;
pointer-events: none;
z-index: 9999;
image-rendering: pixelated;
}
.demo-box {
padding: 1.5rem 2rem;
border: 0.5px solid var(--color-border-tertiary);
border-radius: 8px;
text-align: center;
font-size: 14px;
color: var(--color-text-secondary);
}
</style>
<h2 class="sr-only">8-bit cursor preview</h2>
<div class="demo-box">bewege die maus hier</div>
<canvas id="cursor"></canvas>
<script>
const canvas = document.getElementById('cursor');
const ctx = canvas.getContext('2d');
const P = 3;
// B=black, W=white, _=transparent
// Pixel-genaue Nachzeichnung des klassischen Windows-Cursors
const grid = [
'B_____________',
'BB____________',
'BWB___________',
'BWWB__________',
'BWWWB_________',
'BWWWWB________',
'BWWWWWB_______',
'BWWWWWWB______',
'BWWWWWWWB_____',
'BWWWWWWWWB____',
'BWWWWWWWWWB___',
'BWWWWWWBBB____',
'BWWWBWWB______',
'BWWB_BWWB_____',
'BWB___BWWB____',
'BB_____BWWB___',
'B_______BWB___',
'________BB____',
];
const rows = grid.length;
const cols = grid[0].length;
canvas.width = cols * P;
canvas.height = rows * P;
canvas.style.width = cols * P + 'px';
canvas.style.height = rows * P + 'px';
grid.forEach((row, y) => {
for (let x = 0; x < row.length; x++) {
const c = row[x];
if (c === 'B') {
ctx.fillStyle = '#000000';
ctx.fillRect(x * P, y * P, P, P);
} else if (c === 'W') {
ctx.fillStyle = '#ffffff';
ctx.fillRect(x * P, y * P, P, P);
}
}
});
document.addEventListener('mousemove', e => {
canvas.style.left = e.clientX + 'px';
canvas.style.top = e.clientY + 'px';
});
</script>
+2
View File
@@ -0,0 +1,2 @@
<!-- This partial can be replaced to support other commenting engines -->
{{ template "_internal/disqus.html" . }}
+1
View File
@@ -0,0 +1 @@
<time datetime="{{ . | time.Format "2006-01-02" }}">{{ . | time.Format "2006" }}&nbsp;</time>
+4
View File
@@ -0,0 +1,4 @@
<p>© {{ now.Year }} karimgabrielevarano.xyz</p>
<p><a href="/legal-notice/">legal notice</a></p>
<script src="/js/auto-carousel.js"></script>
<link rel="stylesheet" href="/css/auto-carousel.css">
+66
View File
@@ -0,0 +1,66 @@
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="color-scheme" content="light" />
<link rel="preconnect" href="https://cdn.jsdelivr.net">
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net">
<title>
{{ if .IsHome }}{{ site.Title }}{{ else }}{{ printf "%s | %s" .Title
site.Title }}{{ end }}
</title>
{{ with .Description | default .Site.Params.description }}<meta
name="description"
content="{{ . }}"
/>{{ end }} {{/* Canonical URL */}}
<link rel="canonical" href="{{ .Permalink }}" />
{{/* Open Graph */}}
<meta property="og:title" content="{{ .Title }}" />
{{ with .Description | default .Site.Params.description }}<meta
property="og:description"
content="{{ . }}"
/>{{ end }}
<meta
property="og:type"
content="{{ if .IsPage }}article{{ else }}website{{ end }}"
/>
<meta property="og:url" content="{{ .Permalink }}" />
{{ with .Site.Params.ogImage }}<meta
property="og:image"
content="{{ . | absURL }}"
/>{{ end }} {{/* Twitter Card */}}
<meta name="twitter:card" content="summary" />
<meta name="twitter:title" content="{{ .Title }}" />
{{ with .Description | default .Site.Params.description }}<meta
name="twitter:description"
content="{{ . }}"
/>{{ end }} {{ with .Site.Params.twitterHandle }}<meta
name="twitter:site"
content="@{{ . }}"
/>{{ end }} {{ with .Site.Params.ogImage }}<meta
name="twitter:image"
content="{{ . | absURL }}"
/>{{ end }} {{/* RSS Feed */}} {{ with .OutputFormats.Get "rss" -}} {{ printf
`<link rel="%s" type="%s" href="%s" title="%s" />` .Rel .MediaType.Type
.Permalink site.Title | safeHTML }} {{ end }} {{/* JSON-LD Structured Data for
Articles */}} {{ if .IsPage }}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "{{ .Title }}",
"url": "{{ .Permalink }}",
"datePublished": "{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}",
"dateModified": "{{ .Lastmod.Format "2006-01-02T15:04:05Z07:00" }}"
{{- with .Site.Params.author }},
"author": {
"@type": "Person",
"name": "{{ .name | default . }}"
}
{{- end }}
{{- with $.Description | default $.Site.Params.description }},
"description": "{{ . }}"
{{- end }}
}
</script>
{{ end }} {{ partialCached "head/favicon.html" . }} {{ partialCached
"head/css.html" . }}
+19
View File
@@ -0,0 +1,19 @@
{{- with resources.Get "css/main.css" }}
{{- if hugo.IsDevelopment }}
<link rel="stylesheet" href="{{ .RelPermalink }}">
{{- else }}
{{- with . | minify | fingerprint }}
<link rel="stylesheet" href="{{ .RelPermalink }}" integrity="{{ .Data.Integrity }}" crossorigin="anonymous">
{{- end }}
{{- end }}
{{- end }}
{{- with resources.Get "css/custom.css" }}
{{- if hugo.IsDevelopment }}
<link rel="stylesheet" href="{{ .RelPermalink }}">
{{- else }}
{{- with . | minify | fingerprint }}
<link rel="stylesheet" href="{{ .RelPermalink }}" integrity="{{ .Data.Integrity }}" crossorigin="anonymous">
{{- end }}
{{- end }}
{{- end }}
+17
View File
@@ -0,0 +1,17 @@
<link rel="apple-touch-icon" sizes="57x57" href="{{ "favicon_io/apple-icon-57x57.png" | relURL }}">
<link rel="apple-touch-icon" sizes="60x60" href="{{ "favicon_io/apple-icon-60x60.png" | relURL }}">
<link rel="apple-touch-icon" sizes="72x72" href="{{ "favicon_io/apple-icon-72x72.png" | relURL }}">
<link rel="apple-touch-icon" sizes="76x76" href="{{ "favicon_io/apple-icon-76x76.png" | relURL }}">
<link rel="apple-touch-icon" sizes="114x114" href="{{ "favicon_io/apple-icon-114x114.png" | relURL }}">
<link rel="apple-touch-icon" sizes="120x120" href="{{ "favicon_io/apple-icon-120x120.png" | relURL }}">
<link rel="apple-touch-icon" sizes="144x144" href="{{ "favicon_io/apple-icon-144x144.png" | relURL }}">
<link rel="apple-touch-icon" sizes="152x152" href="{{ "favicon_io/apple-icon-152x152.png" | relURL }}">
<link rel="apple-touch-icon" sizes="180x180" href="{{ "favicon_io/apple-icon-180x180.png" | relURL }}">
<link rel="icon" type="image/png" sizes="192x192" href="{{ "favicon_io/android-icon-192x192.png" | relURL }}">
<link rel="icon" type="image/png" sizes="32x32" href="{{ "favicon_io/favicon-32x32.png" | relURL }}">
<link rel="icon" type="image/png" sizes="96x96" href="{{ "favicon_io/favicon-96x96.png" | relURL }}">
<link rel="icon" type="image/png" sizes="16x16" href="{{ "favicon_io/favicon-16x16.png" | relURL }}">
<link rel="manifest" href="{{ "favicon_io/manifest.json" | relURL }}">
<meta name="msapplication-TileColor" content="#ffffff">
<meta name="msapplication-TileImage" content="{{ "favicon_io/ms-icon-144x144.png" | relURL }}">
<meta name="theme-color" content="#ffffff">
+19
View File
@@ -0,0 +1,19 @@
<nav class="path-nav" aria-label="Breadcrumb">
<ol>
{{ template "breadcrumbnav" (dict "p1" . "p2" .) }}
</ol>
</nav>
{{ define "breadcrumbnav" }}
{{ if .p1.Parent }}
{{ template "breadcrumbnav" (dict "p1" .p1.Parent "p2" .p2 ) }}
{{ else if not .p1.IsHome }}
{{ template "breadcrumbnav" (dict "p1" .p1.Site.Home "p2" .p2 ) }}
{{ end }}
<li{{ if eq .p1 .p2 }} class="current"{{ end }}>
{{ if .p1.IsHome }}/{{ end }}
<a href="{{ .p1.RelPermalink }}">{{ if .p1.IsHome }}{{ .p1.Site.Title }}{{ else }}{{ .p1.Title }}{{ end }}</a>
{{ if ne .p1 .p2 }}/{{ end }}
</li>
{{ end }}
+21
View File
@@ -0,0 +1,21 @@
{{- $duration := "7000" -}}
{{- $content := $ -}}
{{- $imageListPattern := `<ul>\s*(?:<li><figure>\s*<img[^>]*/?>\s*</figure>\s*</li>\s*)+</ul>` -}}
{{- $imageLists := findRE $imageListPattern $content -}}
{{- range $index,$il := $imageLists -}}
{{- $listItems := findRE `<li><figure>\s*<img[^>]*/?>\s*</figure>\s*</li>` $il -}}
{{- $items := `<ul>` -}}
{{- range $i,$li := $listItems -}}
{{- $img := index (findRE `<img[^>]*/?>` $li) 0 -}}
{{- $items = print $items `<li id="c` $index `_slide` $i `">` $img `</li>` -}}
{{- end -}}
{{- $items = print $items `</ul>` -}}
{{- $indicators := `<ol>` -}}
{{- range $i,$li := $listItems -}}
{{- $indicators = print $indicators `<li><a href="#c` $index `_slide` $i `"></a></li>` -}}
{{- end -}}
{{- $indicators = print $indicators `</ol>` -}}
{{- $replacement := print `<div id="carousel_` $index `" class="auto-carousel" duration="` $duration `">` $items $indicators `<div class="prev">&lsaquo;</div><div class="next">&rsaquo;</div></div>` -}}
{{- $content = replace $content $il $replacement -}}
{{- end -}}
{{- $content | safeHTML -}}
+51
View File
@@ -0,0 +1,51 @@
{{- /*
Renders a menu for the given menu ID.
@context {page} page The current page.
@context {string} menuID The menu ID.
@example: {{ partial "menu.html" (dict "menuID" "main" "page" .) }}
*/}}
{{- $page := .page }}
{{- $menuID := .menuID }}
{{- with index site.Menus $menuID }}
<nav aria-label="Main navigation">
<ul>
{{- partial "inline/menu/walk.html" (dict "page" $page "menuEntries" .) }}
</ul>
</nav>
{{- end }}
{{- define "_partials/inline/menu/walk.html" }}
{{- $page := .page }}
{{- range .menuEntries }}
{{- $attrs := dict "href" .URL }}
{{- if $page.IsMenuCurrent .Menu . }}
{{- $attrs = merge $attrs (dict "class" "active" "aria-current" "page") }}
{{- else if $page.HasMenuCurrent .Menu .}}
{{- $attrs = merge $attrs (dict "class" "ancestor" "aria-current" "true") }}
{{- end }}
{{- $name := .Name }}
{{- with .Identifier }}
{{- with T . }}
{{- $name = . }}
{{- end }}
{{- end }}
<li>
<a
{{- range $k, $v := $attrs }}
{{- with $v }}
{{- printf " %s=%q" $k $v | safeHTMLAttr }}
{{- end }}
{{- end -}}
>{{ $name }}</a>
{{- with .Children }}
<ul>
{{- partial "inline/menu/walk.html" (dict "page" $page "menuEntries" .) }}
</ul>
{{- end }}
</li>
{{- end }}
{{- end }}
+22
View File
@@ -0,0 +1,22 @@
{{- /*
For a given taxonomy, renders a list of terms assigned to the page.
@context {page} page The current page.
@context {string} taxonomy The taxonomy.
@example: {{ partial "terms.html" (dict "taxonomy" "tags" "page" .) }}
*/}}
{{- $page := .page }}
{{- $taxonomy := .taxonomy }}
{{- with $page.GetTerms $taxonomy }}
{{- $label := (index . 0).Parent.LinkTitle }}
<div class="terms-list">
<ul>
{{- range . }}
<li><a href="{{ .RelPermalink }}">#{{ .LinkTitle }}</a></li>
{{- end }}
</ul>
</div>
{{- end }}
+6
View File
@@ -0,0 +1,6 @@
{{ define "main" }}
{{ .Content }}
<div class="terminal-nav">
{{ partial "menu.html" (dict "menuID" "main" "page" .) }}
</div>
{{ end }}
+4
View File
@@ -0,0 +1,4 @@
User-agent: *
Allow: /
Sitemap: {{ "sitemap.xml" | absURL }}
+2
View File
@@ -0,0 +1,2 @@
<script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
<div class="mermaid" align="{{ if .Get "align" }}{{ .Get "align" }}{{ else }}center{{ end }}">{{ safeHTML .Inner }}</div>
Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

+2
View File
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig><msapplication><tile><square70x70logo src="/ms-icon-70x70.png"/><square150x150logo src="/ms-icon-150x150.png"/><square310x310logo src="/ms-icon-310x310.png"/><TileColor>#ffffff</TileColor></tile></msapplication></browserconfig>
Binary file not shown.

After

Width:  |  Height:  |  Size: 816 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

+41
View File
@@ -0,0 +1,41 @@
{
"name": "App",
"icons": [
{
"src": "\/android-icon-36x36.png",
"sizes": "36x36",
"type": "image\/png",
"density": "0.75"
},
{
"src": "\/android-icon-48x48.png",
"sizes": "48x48",
"type": "image\/png",
"density": "1.0"
},
{
"src": "\/android-icon-72x72.png",
"sizes": "72x72",
"type": "image\/png",
"density": "1.5"
},
{
"src": "\/android-icon-96x96.png",
"sizes": "96x96",
"type": "image\/png",
"density": "2.0"
},
{
"src": "\/android-icon-144x144.png",
"sizes": "144x144",
"type": "image\/png",
"density": "3.0"
},
{
"src": "\/android-icon-192x192.png",
"sizes": "192x192",
"type": "image\/png",
"density": "4.0"
}
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

+21
View File
@@ -0,0 +1,21 @@
# theme.toml template for a Hugo theme
# See https://github.com/gohugoio/hugoThemes#themetoml for an example
name = "Shibui (渋い)"
license = "MIT"
licenselink = "https://github.com/ntk148v/shibui/blob/main/LICENSE"
description = "Shibui is a yet another minimalistic Hugo theme"
homepage = "https://github.com/ntk148v/shibui"
demosite = "https://ntk148v.github.io/shibui"
tags = ["minimalist", "clean", "responsive", "blog", "simple"]
features = ["responsive"]
[author]
name = "ntk148v"
homepage = "https://github.com/ntk148v"
[module]
[module.hugoVersion]
extended = false
min = "0.93.0"