<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title>Christian Kopač’s Articles</title><id>https://kopac.ch/made/</id><updated>2024-12-15T00:00:00Z</updated><link rel="self" type="application/atom+xml" href="https://kopac.ch/made/atom.xml"/><link rel="alternate" type="text/html" href="https://kopac.ch/made/"/><subtitle>Posts and long-form notes — what I've put down.</subtitle><generator uri="https://gohugo.io/" version="0.161.0">Hugo</generator><entry><title>Apacible Theme: Complete Features Guide</title><link rel="alternate" type="text/html" href="https://kopac.ch/made/theme-features/"/><id>https://kopac.ch/made/theme-features/</id><updated>2024-12-15T00:00:00Z</updated><published>2024-12-15T00:00:00Z</published><author><name>CK</name></author><summary>Comprehensive guide to all features and capabilities of the Apacible Hugo theme</summary><content type="html"><![CDATA[<p>This comprehensive guide demonstrates all features and capabilities of the <strong>Apacible</strong> Hugo theme. From basic markdown to advanced shortcodes, image processing, and technical content—everything you need to know is here.</p>
<h2 id="introduction">Introduction</h2>
<p>The Apacible theme is a minimalist Hugo theme prioritizing accessibility and smolweb principles, with unique dithered image support. This guide covers every feature with practical examples.</p>
<hr>
<h2 id="markdown-features">Markdown Features</h2>
<p>The theme supports all standard Markdown features with beautiful styling.</p>
<h3 id="headings">Headings</h3>
<p>Headings create clear hierarchy in your content:</p>
<h2 id="heading-level-2">Heading Level 2</h2>
<h3 id="heading-level-3">Heading Level 3</h3>
<h4 id="heading-level-4">Heading Level 4</h4>
<h3 id="emphasis">Emphasis</h3>
<p>Normal text, <strong>bold text</strong>, <em>italic text</em>, <em><strong>bold and italic text</strong></em>, and <del>strikethrough text</del>.</p>
<h3 id="lists">Lists</h3>
<p><strong>Unordered lists:</strong></p>
<ul>
<li>First item</li>
<li>Second item</li>
<li>Third item</li>
</ul>
<p><strong>Ordered lists:</strong></p>
<ol>
<li>First item
<ol>
<li>Indented item</li>
<li>Indented item</li>
</ol>
</li>
<li>Second item</li>
<li>Third item</li>
</ol>
<h3 id="links">Links</h3>
<p>There is a <a href="https://example.com">link</a> and <a href="https://example.com">another link to example.com</a>.</p>
<h3 id="tables">Tables</h3>
<p>Basic table:</p>
<table>
  <thead>
      <tr>
          <th>Syntax</th>
          <th>Description</th>
          <th>Test Text</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Header</td>
          <td>Title</td>
          <td>Here&rsquo;s this</td>
      </tr>
      <tr>
          <td>Paragraph</td>
          <td>Text</td>
          <td>And more</td>
      </tr>
  </tbody>
</table>
<p>With alignment:</p>
<table>
  <thead>
      <tr>
          <th style="text-align: left">Syntax</th>
          <th style="text-align: center">Description</th>
          <th style="text-align: right">Test Text</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: left">Left</td>
          <td style="text-align: center">Center</td>
          <td style="text-align: right">Right</td>
      </tr>
      <tr>
          <td style="text-align: left">Paragraph</td>
          <td style="text-align: center">Text</td>
          <td style="text-align: right">And more</td>
      </tr>
  </tbody>
</table>
<h3 id="blockquotes">Blockquotes</h3>
<blockquote>
<p>Lorem ipsum dolor sit, amet consectetur adipisicing elit. Praesentium, nisi saepe dolor unde iusto dolore nam, vero optio consequuntur repudiandae et! Atque libero expedita laudantium cupiditate, sit explicabo sequi ipsa!</p>
</blockquote>
<blockquote>
<p>Lorem ipsum dolor sit, amet consectetur adipisicing elit.</p>
<blockquote>
<p>Nested blockquote: Praesentium, nisi saepe dolor unde iusto dolore nam, vero optio consequuntur repudiandae et! Atque libero expedita laudantium cupiditate, sit explicabo sequi ipsa!</p>
</blockquote>
</blockquote>
<h3 id="footnotes">Footnotes</h3>
<p>Lorem ipsum dolor sit, amet<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> words consectetur<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> adipisicing elit.</p>
<h3 id="horizontal-rule">Horizontal Rule</h3>
<hr>
<hr>
<h2 id="shortcodes">Shortcodes</h2>
<p>Shortcodes extend Markdown with powerful custom functionality.</p>
<h3 id="callouts">Callouts</h3>
<p>Callouts are useful for highlighting important information.</p>















<div class="callout callout-note">
  <div class="callout-header">
    <span class="callout-icon">ᛁ</span>
    <span class="callout-title">Note</span>
  </div>
  <div class="callout-content">
    This is a note callout. Perfect for general information or reminders.
  </div>
</div>





<div class="callout callout-tip">
  <div class="callout-header">
    <span class="callout-icon">ᛏ</span>
    <span class="callout-title">Tip</span>
  </div>
  <div class="callout-content">
    This is a tip callout. Great for sharing helpful hints or best practices.
  </div>
</div>





<div class="callout callout-important">
  <div class="callout-header">
    <span class="callout-icon">ᚨ</span>
    <span class="callout-title">Important</span>
  </div>
  <div class="callout-content">
    This is an important callout. Use it to highlight critical information that readers must know.
  </div>
</div>





<div class="callout callout-warning">
  <div class="callout-header">
    <span class="callout-icon">ᚹ</span>
    <span class="callout-title">Warning</span>
  </div>
  <div class="callout-content">
    This is a warning callout. Use it to alert users about potential issues or problems.
  </div>
</div>





<div class="callout callout-caution">
  <div class="callout-header">
    <span class="callout-icon">ᚢ</span>
    <span class="callout-title">Caution</span>
  </div>
  <div class="callout-content">
    This is a caution callout. Use it to warn about dangerous or risky actions.
  </div>
</div>


<h3 id="quotes">Quotes</h3>
<p>Beautifully styled quotes for highlighting important statements.</p>




<figure class="quote-block">
  <blockquote class="quote-text">
    <em>Imagination is more important than knowledge. Knowledge is limited. Imagination encircles the world.</em>
  </blockquote>
  
  <figcaption class="quote-cite">
    Albert Einstein
  </figcaption>
  
</figure>






<figure class="quote-block">
  <blockquote class="quote-text">
    <em>The best way to predict the future is to invent it.</em>
  </blockquote>
  
</figure>


<h3 id="detailexpandable-content">Detail/Expandable Content</h3>




<details class="detail">
  <summary class="detail-header">
    <span class="detail-icon">▶</span>
    <span class="detail-title">Click to expand: Lorem ipsum dolor sit, amet consectetur adipisicing elit.</span>
  </summary>
  <div class="detail-content">
    <p>Lorem ipsum dolor sit, amet consectetur adipisicing elit. Praesentium, nisi saepe dolor unde iusto dolore nam, vero optio consequuntur repudiandae et! Atque libero expedita laudantium cupiditate, sit explicabo sequi ipsa!</p>
<p>Lorem ipsum dolor sit, amet consectetur adipisicing elit. Praesentium, nisi saepe dolor unde iusto dolore nam, vero optio consequuntur repudiandae et! Atque libero expedita laudantium cupiditate, sit explicabo sequi ipsa!</p>

  </div>
</details>


<h3 id="collection-shortcode">Collection Shortcode</h3>
<p>The <code>collection</code> shortcode displays structured data from TOML/YAML/JSON files in various styles. Perfect for showcasing projects, books, movies, music, or any structured content.</p>
<p><strong>Usage:</strong></p>
<p>Create a data file in <code>data/projects.toml</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">collection</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"><span class="nx">title</span> <span class="p">=</span> <span class="s2">&#34;Project Name&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">subtitle</span> <span class="p">=</span> <span class="s2">&#34;Project subtitle&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">content</span> <span class="p">=</span> <span class="s2">&#34;Project description&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">link</span> <span class="p">=</span> <span class="s2">&#34;https://example.com&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">image</span> <span class="p">=</span> <span class="s2">&#34;/assets/project.jpg&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">year</span> <span class="p">=</span> <span class="s2">&#34;2024&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">tags</span> <span class="p">=</span> <span class="p">[</span><span class="s2">&#34;web&#34;</span><span class="p">,</span> <span class="s2">&#34;design&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">rating</span> <span class="p">=</span> <span class="mi">5</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">collection</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"><span class="nx">title</span> <span class="p">=</span> <span class="s2">&#34;Another Project&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c"># ... more fields</span>
</span></span></code></pre></div><p>Then use the shortcode:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">{{&lt; collection file=&#34;projects.toml&#34; style=&#34;card&#34; filter=&#34;year&#34; &gt;}}
</span></span></code></pre></div><p><strong>Styles:</strong></p>
<ul>
<li><code>card</code>: Full card with image, title, description, and metadata</li>
<li><code>simple-card</code>: Simplified card with just title and brief info</li>
<li><code>list</code>: Minimal list style with optional icons</li>
<li><code>card-grid</code>: Grid of cards with images</li>
<li><code>card-grid-compact</code>: Compact grid layout</li>
<li><code>card-horizontal</code>: Horizontal card layout</li>
<li><code>horizontal</code>: Horizontal layout variant</li>
<li><code>inline</code>: Inline list layout</li>
<li><code>poster-grid</code>: Grid of poster images only</li>
</ul>
<p><strong>Parameters:</strong></p>
<ul>
<li><code>file</code>: Path to TOML/YAML/JSON file with collection data (in <code>data/</code> directory)</li>
<li><code>style</code>: Display style (optional, default: &ldquo;card&rdquo;)</li>
<li><code>filter</code>: Enable filtering - &ldquo;year&rdquo; or &ldquo;date&rdquo; (optional)</li>
<li><code>category_filter</code>: Enable category-based filtering (optional)</li>
</ul>
<p><strong>Collection Item Fields:</strong></p>
<ul>
<li><code>title</code>: Item title (required)</li>
<li><code>subtitle</code>: Optional subtitle</li>
<li><code>content</code> or <code>description</code>: Item description</li>
<li><code>link</code> or <code>url</code>: Link to item</li>
<li><code>image</code> or <code>img</code>: Image URL</li>
<li><code>year</code>: Year field for filtering</li>
<li><code>date</code> or <code>date_read</code>: Date field for filtering</li>
<li><code>category</code>: Category for category filtering</li>
<li><code>tags</code>: Array of tags</li>
<li><code>rating</code>: Numeric rating (1-5, displayed as stars)</li>
<li><code>director</code>: Director name (for movies)</li>
<li><code>author</code>: Author name (for books)</li>
<li><code>artist</code>: Artist name (for music)</li>
<li><code>label</code>: Label/studio/publisher</li>
<li><code>role</code>: Role/position</li>
<li><code>icon</code>: Icon URL (for list style)</li>
<li><code>footer</code>: Footer text</li>
<li><code>draft</code>: Set to <code>true</code> to hide item</li>
<li><code>type</code>: Set to <code>&quot;br&quot;</code> to create a separator/break</li>
</ul>
<p><strong>Filtering:</strong></p>
<p>When <code>filter=&quot;year&quot;</code> is enabled, buttons appear to filter items by year. When <code>filter=&quot;date&quot;</code> is enabled, filtering works by the year extracted from <code>date_read</code> fields. Category filtering works similarly with <code>category_filter</code> enabled.</p>
<p><strong>Example with Filtering:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">{{&lt; collection file=&#34;books.toml&#34; style=&#34;card&#34; filter=&#34;date&#34; &gt;}}
</span></span></code></pre></div><p>This will display books with year-based filtering buttons, allowing readers to filter by the year they were read.</p>
<h3 id="last-modified-date-shortcode">Last Modified Date Shortcode</h3>
<p>The <code>lastmod</code> shortcode displays the last modified date of the current page inline. Useful for indicating content freshness.</p>
<p><strong>Usage:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">This page was last updated on {{&lt; lastmod &gt;}}.
</span></span></code></pre></div><p>Or with custom format:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">Last modified: {{&lt; lastmod format=&#34;January 2, 2006&#34; &gt;}}
</span></span></code></pre></div><p><strong>Parameters:</strong></p>
<ul>
<li><code>format</code>: Date format string (optional, defaults to site&rsquo;s <code>date_format</code> or &ldquo;January 2006&rdquo;)</li>
</ul>
<p><strong>Features:</strong></p>
<ul>
<li>Automatically detects last modified date from:
<ul>
<li>Page&rsquo;s <code>Lastmod</code> field</li>
<li>Git commit information (if enabled)</li>
<li>Page&rsquo;s <code>Date</code> field (fallback)</li>
<li>Current date (if none available)</li>
</ul>
</li>
<li>Respects site&rsquo;s date format configuration</li>
<li>Inline display for flexible placement</li>
</ul>
<h3 id="combining-shortcodes">Combining Shortcodes</h3>
<p>You can combine shortcodes for rich content:</p>















<div class="callout callout-note">
  <div class="callout-header">
    <span class="callout-icon">ᛁ</span>
    <span class="callout-title">Math in Callouts</span>
  </div>
  <div class="callout-content">
    You can include math in callouts: $f(x) = x^2 + 2x + 1$
  </div>
</div>






<figure class="quote-block">
  <blockquote class="quote-text">
    <em>Mathematics is the language with which God has written the universe.</em>
  </blockquote>
  
  <figcaption class="quote-cite">
    Mathematician
  </figcaption>
  
</figure>


<hr>
<h2 id="dithered-images">Dithered Images</h2>
<p>The theme includes unique dithered image functionality. Images are shown in their dithered form by default, which reduces file size while maintaining a unique aesthetic. Click &ldquo;<strong>→ show original</strong>&rdquo; link below each image to toggle between dithered and original versions.</p>
<h3 id="single-dithered-image">Single Dithered Image</h3>

















  


  
  



  <p><em>Image not found: example-dithered-images/trees.jpg</em></p>


<p>The dithering effect reduces the image to a limited color palette, creating a distinctive retro aesthetic while significantly reducing file size—perfect for the smolweb philosophy. The <code>dithered</code> shortcode automatically creates the dithered version using Hugo&rsquo;s native image processing—no pre-processing required!</p>
<h3 id="side-by-side-comparison">Side-by-Side Comparison</h3>
<p>For direct comparison, here&rsquo;s the same image shown in both forms:</p>

















  


  



  <p><em>Image not found: </em></p>



<h3 id="how-it-works">How It Works</h3>
<p><strong>Processing</strong>: Images are dithered using Hugo&rsquo;s native <code>images.Dither</code> filter with Floyd-Steinberg algorithm:</p>
<ul>
<li><strong>Method</strong>: Floyd-Steinberg (smooth, high-quality dithering)</li>
<li><strong>Palette</strong>: 5-color grayscale (<code>#1a1a1a</code>, <code>#4d4d4d</code>, <code>#808080</code>, <code>#b3b3b3</code>, <code>#e6e6e6</code>)</li>
<li><strong>Strength</strong>: 0.9 (strong but not harsh)</li>
<li><strong>Serpentine</strong>: Enabled (alternating scan direction for better quality)</li>
</ul>
<p>The dithering is applied automatically during Hugo&rsquo;s build process—no external tools or pre-processing required!</p>
<p><strong>Toggle Mechanism</strong>: The shortcode generates HTML with both versions. A button in the caption toggles visibility between dithered and original versions. The toggle uses vanilla JavaScript for progressive enhancement.</p>
<p><strong>Benefits:</strong></p>
<ul>
<li><strong>Smaller Files</strong>: Dithered images are typically 40-60% smaller</li>
<li><strong>Faster Loading</strong>: Reduced bandwidth usage</li>
<li><strong>Progressive Enhancement</strong>: Original available on demand</li>
<li><strong>Unique Style</strong>: Distinctive visual identity</li>
<li><strong>Retro Appeal</strong>: Nostalgic 8-bit aesthetic</li>
<li><strong>High Contrast</strong>: Often more readable</li>
<li><strong>Smolweb Aligned</strong>: Minimal data transfer</li>
<li><strong>User Choice</strong>: Original available when needed</li>
<li><strong>Accessibility</strong>: High contrast improves readability</li>
</ul>
<p><strong>Usage:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">{{&lt; dithered 
</span></span><span class="line"><span class="cl">    src=&#34;assets/trees.jpg&#34; 
</span></span><span class="line"><span class="cl">    alt=&#34;A forest scene&#34; 
</span></span><span class="line"><span class="cl">    caption=&#34;A dithered forest scene&#34; 
</span></span><span class="line"><span class="cl">    width=&#34;800&#34; 
</span></span><span class="line"><span class="cl">&gt;}}
</span></span></code></pre></div><p><strong>Note</strong>: The <code>dithered</code> shortcode automatically generates the dithered version during build using Hugo&rsquo;s native image processing. No pre-dithered files or external scripts needed!</p>
<p><strong>Technical Details:</strong></p>
<ul>
<li><strong>Algorithm</strong>: Floyd-Steinberg dithering with 5-color grayscale palette</li>
<li><strong>Color Space</strong>: Grayscale conversion before dithering</li>
<li><strong>Format</strong>: Supports JPEG, PNG, WebP, AVIF</li>
<li><strong>Responsive</strong>: Hugo&rsquo;s image processing creates optimized sizes</li>
<li><strong>Automatic</strong>: Dithering applied during build—no pre-processing required</li>
</ul>
<h3 id="gallery-shortcode">Gallery Shortcode</h3>
<p>The <code>gallery</code> shortcode displays a grid of dithered thumbnails with a Lightense lightbox for full-size viewing. Perfect for showcasing multiple images in an organized grid layout.</p>
<p><strong>Usage:</strong></p>
<p>Create a data file in <code>data/gallery-data.toml</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">images</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"><span class="nx">src</span> <span class="p">=</span> <span class="s2">&#34;/assets/image1.jpg&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">alt</span> <span class="p">=</span> <span class="s2">&#34;Description 1&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">caption</span> <span class="p">=</span> <span class="s2">&#34;Optional caption 1&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">images</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"><span class="nx">src</span> <span class="p">=</span> <span class="s2">&#34;/assets/image2.jpg&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">alt</span> <span class="p">=</span> <span class="s2">&#34;Description 2&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">caption</span> <span class="p">=</span> <span class="s2">&#34;Optional caption 2&#34;</span>
</span></span></code></pre></div><p>Then use the shortcode:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">{{&lt; gallery file=&#34;gallery-data.toml&#34; columns=&#34;3&#34; &gt;}}
</span></span></code></pre></div><p><strong>Parameters:</strong></p>
<ul>
<li><code>file</code>: Path to TOML/YAML/JSON file with gallery data (in <code>data/</code> directory)</li>
<li><code>columns</code>: Number of columns (optional, default: 3)</li>
<li><code>thumb_width</code>: Width for thumbnails (optional, default: 300)</li>
<li><code>thumb_height</code>: Height for thumbnails (optional, default: 200)</li>
<li><code>full_width</code>: Width for full view (optional, default: 2400)</li>
<li><code>full_height</code>: Height for full view (optional, default: 1600)</li>
<li><code>thumb_quality</code>: Quality for thumbnails (optional, default: 75)</li>
<li><code>full_quality</code>: Quality for full-size images (optional, default: 95)</li>
</ul>
<p><strong>Features:</strong></p>
<ul>
<li>Dithered thumbnails by default</li>
<li>Click to view full-size original in lightbox</li>
<li>Responsive grid layout</li>
<li>Lazy loading for performance</li>
<li>Automatic image optimization</li>
</ul>
<h3 id="image-gallery-shortcode">Image Gallery Shortcode</h3>
<p>The <code>img_gallery</code> shortcode creates a simple grid of images with dithered/original toggle support. Use it when you want to embed multiple images directly in your content.</p>
<p><strong>Usage:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">{{&lt; img_gallery columns=&#34;3&#34; &gt;}}
</span></span><span class="line"><span class="cl">{{&lt; img src=&#34;assets/image1.jpg&#34; alt=&#34;Image 1&#34; caption=&#34;Caption 1&#34; &gt;}}
</span></span><span class="line"><span class="cl">{{&lt; img src=&#34;assets/image2.jpg&#34; alt=&#34;Image 2&#34; caption=&#34;Caption 2&#34; dithered=&#34;true&#34; &gt;}}
</span></span><span class="line"><span class="cl">{{&lt; img src=&#34;assets/image3.jpg&#34; alt=&#34;Image 3&#34; caption=&#34;Caption 3&#34; &gt;}}
</span></span><span class="line"><span class="cl">{{&lt; /img_gallery &gt;}}
</span></span></code></pre></div><p><strong>Parameters:</strong></p>
<ul>
<li><code>columns</code>: Number of columns (optional, default: 3)</li>
</ul>
<p>Each <code>img</code> shortcode inside supports all the same parameters as the standalone <code>img</code> shortcode, including <code>dithered</code>, <code>width</code>, <code>height</code>, etc.</p>
<p><strong>Features:</strong></p>
<ul>
<li>Flexible grid layout</li>
<li>Supports dithered/original toggle per image</li>
<li>Responsive design</li>
<li>Works with all image shortcode features</li>
</ul>
<h3 id="spoiler-gallery-shortcode">Spoiler Gallery Shortcode</h3>
<p>The <code>spoiler-gallery</code> shortcode displays a gallery that&rsquo;s hidden by default, perfect for spoiler-sensitive content like movie screenshots or plot-revealing images.</p>
<p><strong>Usage:</strong></p>
<p>Create a data file in <code>data/movie-screenshots.toml</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">images</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"><span class="nx">src</span> <span class="p">=</span> <span class="s2">&#34;/assets/screenshot1.jpg&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">alt</span> <span class="p">=</span> <span class="s2">&#34;Screenshot 1&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">caption</span> <span class="p">=</span> <span class="s2">&#34;Scene description&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">images</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"><span class="nx">src</span> <span class="p">=</span> <span class="s2">&#34;/assets/screenshot2.jpg&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">alt</span> <span class="p">=</span> <span class="s2">&#34;Screenshot 2&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">caption</span> <span class="p">=</span> <span class="s2">&#34;Another scene&#34;</span>
</span></span></code></pre></div><p>Then use the shortcode:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">{{&lt; spoiler-gallery file=&#34;movie-screenshots.toml&#34; columns=&#34;3&#34; label=&#34;Show Screenshots (Spoilers)&#34; &gt;}}
</span></span></code></pre></div><p><strong>Parameters:</strong></p>
<ul>
<li><code>file</code>: Path to TOML/YAML/JSON file with gallery data (in <code>data/</code> directory)</li>
<li><code>columns</code>: Number of columns (optional, default: 3)</li>
<li><code>label</code>: Button text to show gallery (optional, default: &ldquo;Show Screenshots (Spoilers)&rdquo;)</li>
<li><code>hide_label</code>: Button text to hide gallery (optional, default: &ldquo;Hide Screenshots&rdquo;)</li>
<li><code>thumb_width</code>: Width for thumbnails (optional, default: 300)</li>
<li><code>thumb_height</code>: Height for thumbnails (optional, default: 200)</li>
<li><code>full_width</code>: Width for full view (optional, default: 2400)</li>
<li><code>full_height</code>: Height for full view (optional, default: 1600)</li>
<li><code>thumb_quality</code>: Quality for thumbnails (optional, default: 75)</li>
<li><code>full_quality</code>: Quality for full-size images (optional, default: 95)</li>
</ul>
<p><strong>Features:</strong></p>
<ul>
<li>Hidden by default with toggle button</li>
<li>Accessible with ARIA attributes</li>
<li>Responsive grid layout</li>
<li>Perfect for spoiler-sensitive content</li>
</ul>
<hr>
<h2 id="code-blocks--syntax-highlighting">Code Blocks &amp; Syntax Highlighting</h2>
<p>The theme supports syntax highlighting for many programming languages.</p>
<h3 id="html">HTML</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="cp">&lt;!DOCTYPE html&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">html</span> <span class="na">lang</span><span class="o">=</span><span class="s">&#34;en&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">head</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">charset</span><span class="o">=</span><span class="s">&#34;UTF-8&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">name</span><span class="o">=</span><span class="s">&#34;viewport&#34;</span> <span class="na">content</span><span class="o">=</span><span class="s">&#34;width=device-width, initial-scale=1.0&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">title</span><span class="p">&gt;</span>Document<span class="p">&lt;/</span><span class="nt">title</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&#34;stylesheet&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;styles.css&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">head</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">body</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">main</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">h1</span><span class="p">&gt;</span>Hello World<span class="p">&lt;/</span><span class="nt">h1</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>Welcome to my site.<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">main</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;script.js&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">body</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">html</span><span class="p">&gt;</span>
</span></span></code></pre></div><h3 id="css">CSS</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">:</span><span class="nd">root</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nv">--primary-color</span><span class="p">:</span> <span class="mh">#3498db</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="nv">--secondary-color</span><span class="p">:</span> <span class="mh">#2ecc71</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="nv">--font-stack</span><span class="p">:</span> <span class="o">-</span><span class="n">apple-system</span><span class="p">,</span> <span class="n">BlinkMacSystemFont</span><span class="p">,</span> <span class="s1">&#39;Segoe UI&#39;</span><span class="p">,</span> <span class="kc">sans-serif</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">max-width</span><span class="p">:</span> <span class="mi">1200</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">margin</span><span class="p">:</span> <span class="mi">0</span> <span class="kc">auto</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">padding</span><span class="p">:</span> <span class="mi">2</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">@</span><span class="k">media</span> <span class="o">(</span><span class="nt">prefers-color-scheme</span><span class="o">:</span> <span class="nt">dark</span><span class="o">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="p">:</span><span class="nd">root</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nv">--primary-color</span><span class="p">:</span> <span class="mh">#5dade2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="nv">--secondary-color</span><span class="p">:</span> <span class="mh">#58d68d</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h3 id="python">Python</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">fastapi</span> <span class="kn">import</span> <span class="n">FastAPI</span><span class="p">,</span> <span class="n">HTTPException</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pydantic</span> <span class="kn">import</span> <span class="n">BaseModel</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">app</span> <span class="o">=</span> <span class="n">FastAPI</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Item</span><span class="p">(</span><span class="n">BaseModel</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="nb">id</span><span class="p">:</span> <span class="nb">int</span>
</span></span><span class="line"><span class="cl">    <span class="n">name</span><span class="p">:</span> <span class="nb">str</span>
</span></span><span class="line"><span class="cl">    <span class="n">description</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
</span></span><span class="line"><span class="cl">    <span class="n">price</span><span class="p">:</span> <span class="nb">float</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">items_db</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@app.get</span><span class="p">(</span><span class="s2">&#34;/items&#34;</span><span class="p">,</span> <span class="n">response_model</span><span class="o">=</span><span class="n">List</span><span class="p">[</span><span class="n">Item</span><span class="p">])</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">get_items</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">items_db</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@app.post</span><span class="p">(</span><span class="s2">&#34;/items&#34;</span><span class="p">,</span> <span class="n">response_model</span><span class="o">=</span><span class="n">Item</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">create_item</span><span class="p">(</span><span class="n">item</span><span class="p">:</span> <span class="n">Item</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">items_db</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">item</span>
</span></span></code></pre></div><h3 id="javascript">JavaScript</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">binarySearch</span><span class="p">(</span><span class="nx">arr</span><span class="p">,</span> <span class="nx">target</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nx">left</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nx">right</span> <span class="o">=</span> <span class="nx">arr</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  <span class="k">while</span> <span class="p">(</span><span class="nx">left</span> <span class="o">&lt;=</span> <span class="nx">right</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">mid</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">floor</span><span class="p">((</span><span class="nx">left</span> <span class="o">+</span> <span class="nx">right</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="nx">arr</span><span class="p">[</span><span class="nx">mid</span><span class="p">]</span> <span class="o">===</span> <span class="nx">target</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="nx">mid</span><span class="p">;</span> <span class="c1">// Found!
</span></span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">arr</span><span class="p">[</span><span class="nx">mid</span><span class="p">]</span> <span class="o">&lt;</span> <span class="nx">target</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">left</span> <span class="o">=</span> <span class="nx">mid</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">right</span> <span class="o">=</span> <span class="nx">mid</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="c1">// Not found
</span></span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h3 id="sql">SQL</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="c1">-- Create a users table
</span></span></span><span class="line"><span class="cl"><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">users</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">id</span><span class="w"> </span><span class="nb">SERIAL</span><span class="w"> </span><span class="k">PRIMARY</span><span class="w"> </span><span class="k">KEY</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">username</span><span class="w"> </span><span class="nb">VARCHAR</span><span class="p">(</span><span class="mi">50</span><span class="p">)</span><span class="w"> </span><span class="k">UNIQUE</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">email</span><span class="w"> </span><span class="nb">VARCHAR</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span><span class="w"> </span><span class="k">UNIQUE</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">created_at</span><span class="w"> </span><span class="k">TIMESTAMP</span><span class="w"> </span><span class="k">DEFAULT</span><span class="w"> </span><span class="k">CURRENT_TIMESTAMP</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">-- Query with joins
</span></span></span><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">u</span><span class="p">.</span><span class="n">username</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">u</span><span class="p">.</span><span class="n">email</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">COUNT</span><span class="p">(</span><span class="n">p</span><span class="p">.</span><span class="n">id</span><span class="p">)</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">post_count</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">FROM</span><span class="w"> </span><span class="n">users</span><span class="w"> </span><span class="n">u</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">LEFT</span><span class="w"> </span><span class="k">JOIN</span><span class="w"> </span><span class="n">posts</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="n">u</span><span class="p">.</span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">p</span><span class="p">.</span><span class="n">user_id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">u</span><span class="p">.</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="n">u</span><span class="p">.</span><span class="n">username</span><span class="p">,</span><span class="w"> </span><span class="n">u</span><span class="p">.</span><span class="n">email</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">HAVING</span><span class="w"> </span><span class="k">COUNT</span><span class="p">(</span><span class="n">p</span><span class="p">.</span><span class="n">id</span><span class="p">)</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">5</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">post_count</span><span class="w"> </span><span class="k">DESC</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><h3 id="bash">Bash</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="nb">set</span> -e
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Colors for output</span>
</span></span><span class="line"><span class="cl"><span class="nv">RED</span><span class="o">=</span><span class="s1">&#39;\033[0;31m&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nv">GREEN</span><span class="o">=</span><span class="s1">&#39;\033[0;32m&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nv">NC</span><span class="o">=</span><span class="s1">&#39;\033[0m&#39;</span> <span class="c1"># No Color</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -e <span class="s2">&#34;</span><span class="si">${</span><span class="nv">GREEN</span><span class="si">}</span><span class="s2">Starting deployment...</span><span class="si">${</span><span class="nv">NC</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Run tests</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> npm test<span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> -e <span class="s2">&#34;</span><span class="si">${</span><span class="nv">GREEN</span><span class="si">}</span><span class="s2">Tests passed!</span><span class="si">${</span><span class="nv">NC</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">else</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> -e <span class="s2">&#34;</span><span class="si">${</span><span class="nv">RED</span><span class="si">}</span><span class="s2">Tests failed!</span><span class="si">${</span><span class="nv">NC</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nb">exit</span> <span class="m">1</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span></code></pre></div><p>The theme supports many more languages including Go, Ruby, PHP, Java, C++, Rust, and more. All code is displayed with appropriate syntax highlighting based on the language identifier in the code fence.</p>
<hr>
<h2 id="mathematical-notation-katex">Mathematical Notation (KaTeX)</h2>
<p>Mathematical equations rendered beautifully with KaTeX.</p>
<h3 id="inline-math">Inline Math</h3>
<p>The quadratic formula is $x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}$ when $a \ne 0$.</p>
<p>Einstein&rsquo;s famous equation: $E = mc^2$</p>
<h3 id="block-math">Block Math</h3>
<p>The Fourier transform:</p>
$$
F(\omega) = \int_{-\infty}^{\infty} f(t) e^{-i\omega t} dt
$$<p>The Cauchy-Schwarz Inequality:</p>
$$\left( \sum_{k=1}^n a_k b_k \right)^2 \leq \left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right)$$<p>To enable math rendering, add <code>math = true</code> to your post frontmatter.</p>
<hr>
<h2 id="mermaid-diagrams">Mermaid Diagrams</h2>
<p><em>Powered by <a href="https://mermaid.js.org">Mermaid</a></em></p>
<p>Mermaid diagrams are great for visualizing processes, workflows, and relationships.</p>
<h3 id="sequence-diagram">Sequence Diagram</h3>
<div class="mermaid-container">
  <pre class="mermaid">sequenceDiagram
    participant web as Web Browser
    participant blog as Blog Service
    participant account as Account Service
    participant mail as Mail Service
    participant db as Storage

    Note over web,db: The user must be logged in to submit blog posts
    web-&gt;&gt;+account: Logs in using credentials
    account-&gt;&gt;db: Query stored accounts
    db-&gt;&gt;account: Respond with query result

    alt Credentials not found
        account-&gt;&gt;web: Invalid credentials
    else Credentials found
        account-&gt;&gt;-web: Successfully logged in

        Note over web,db: When the user is authenticated, they can now submit new posts
        web-&gt;&gt;+blog: Submit new post
        blog-&gt;&gt;db: Store post data

        par Notifications
            blog--)mail: Send mail to blog subscribers
            blog--)db: Store in-site notifications
        and Response
            blog--&gt;&gt;-web: Successfully posted
        end
    end
  </pre>
</div>


<h3 id="flowchart">Flowchart</h3>
<div class="mermaid-container">
  <pre class="mermaid">graph LR
    A[Square Rect] -- Link text --&gt; B((Circle))
    A --&gt; C(Round Rect)
    B --&gt; D{Rhombus}
    C --&gt; D
  </pre>
</div>


<h3 id="git-graph">Git Graph</h3>
<div class="mermaid-container">
  <pre class="mermaid">%%{init: { &#39;logLevel&#39;: &#39;debug&#39;, &#39;theme&#39;: &#39;base&#39;, &#39;gitGraph&#39;: {&#39;rotateCommitLabel&#39;: false}} }%%
gitGraph
  commit id: &#34;feat(api): ...&#34;
  commit id: &#34;a&#34;
  commit id: &#34;b&#34;
  commit id: &#34;fix(client): .extra long label..&#34;
  branch c2
  commit id: &#34;feat(modules): ...&#34;
  commit id: &#34;test(client): ...&#34;
  checkout main
  commit id: &#34;fix(api): ...&#34;
  commit id: &#34;ci: ...&#34;
  branch b1
  commit
  branch b2
  commit
  </pre>
</div>


<h3 id="quadrant-chart">Quadrant Chart</h3>
<div class="mermaid-container">
  <pre class="mermaid">quadrantChart
    title Reach and engagement of campaigns
    x-axis Low Reach --&gt; High Reach
    y-axis Low Engagement --&gt; High Engagement
    quadrant-1 We should expand
    quadrant-2 Need to promote
    quadrant-3 Re-evaluate
    quadrant-4 May be improved
    Campaign A: [0.3, 0.6]
    Campaign B: [0.45, 0.23]
    Campaign C: [0.57, 0.69]
    Campaign D: [0.78, 0.34]
    Campaign E: [0.40, 0.34]
    Campaign F: [0.35, 0.78]
  </pre>
</div>


<hr>
<h2 id="long-form-content--structure">Long-Form Content &amp; Structure</h2>
<p>Long-form content serves an important purpose in the digital age. While short, snappy content has its place, deeper exploration of topics requires space to breathe and develop ideas fully.</p>
<h3 id="table-of-contents">Table of Contents</h3>
<p>Enable automatic table of contents by adding <code>toc = true</code> to your frontmatter. This page has it enabled—check the sidebar!</p>
<h3 id="structure-and-organization">Structure and Organization</h3>
<p>Effective long-form content requires careful structure:</p>
<p><strong>Clear Hierarchy</strong>: Use headings and subheadings to create a clear outline. Readers should be able to scan the structure and understand the flow of ideas at a glance.</p>
<p><strong>Logical Progression</strong>: Ideas should build on each other. Each section should connect naturally to the next, creating a cohesive narrative or argument.</p>
<p><strong>Visual Breaks</strong>: Break up text with:</p>
<ul>
<li>Subheadings</li>
<li>Pull quotes</li>
<li>Lists</li>
<li>Images</li>
<li>Code blocks</li>
<li>Whitespace</li>
</ul>
<p><strong>Transitions</strong>: Good transitions between sections help readers follow your train of thought. They provide context and maintain momentum.</p>
<h3 id="writing-techniques">Writing Techniques</h3>
<p><strong>Storytelling</strong>: Even technical or educational content benefits from narrative elements. Stories make abstract concepts concrete and memorable.</p>
<p><strong>Varied Sentence Structure</strong>: Mix short, punchy sentences with longer, more complex ones. This creates rhythm and keeps readers engaged.</p>
<p>Short sentences emphasize points. They create impact. Longer sentences, on the other hand, allow you to develop more nuanced ideas and explore the relationships between concepts, creating a more sophisticated and layered understanding of the topic at hand.</p>
<p><strong>Active Voice</strong>: Active voice creates clearer, more direct writing. Instead of &ldquo;mistakes were made,&rdquo; say &ldquo;we made mistakes.&rdquo; It&rsquo;s more honest and easier to read.</p>
<p><strong>Concrete Examples</strong>: Abstract concepts become clearer with specific examples. Don&rsquo;t just tell readers something—show them with real-world cases, data, or scenarios.</p>
<hr>
<h2 id="outdated-content-alert">Outdated Content Alert</h2>
<p>The theme can automatically alert readers when content is outdated. Enable it by adding to your frontmatter:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="nx">outdate_alert</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"><span class="nx">outdate_alert_days</span> <span class="p">=</span> <span class="mi">90</span>
</span></span></code></pre></div><p>When a post is older than the specified number of days, an alert will be displayed at the top of the post. This helps maintain content quality and informs readers when information may be stale.</p>
<hr>
<h2 id="technical-examples">Technical Examples</h2>
<p>The theme excels at displaying technical content with proper formatting and syntax highlighting.</p>
<h3 id="algorithm-examples">Algorithm Examples</h3>
<p><strong>Quick Sort</strong> (Python):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">quicksort</span><span class="p">(</span><span class="n">arr</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    Quick sort algorithm implementation.
</span></span></span><span class="line"><span class="cl"><span class="s2">    Time complexity: O(n log n) average case
</span></span></span><span class="line"><span class="cl"><span class="s2">    Space complexity: O(log n)
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">arr</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="n">pivot</span> <span class="o">=</span> <span class="n">arr</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span> <span class="o">//</span> <span class="mi">2</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">left</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">arr</span> <span class="k">if</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">pivot</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">middle</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">arr</span> <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="n">pivot</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">right</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">arr</span> <span class="k">if</span> <span class="n">x</span> <span class="o">&gt;</span> <span class="n">pivot</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">quicksort</span><span class="p">(</span><span class="n">left</span><span class="p">)</span> <span class="o">+</span> <span class="n">middle</span> <span class="o">+</span> <span class="n">quicksort</span><span class="p">(</span><span class="n">right</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Example usage</span>
</span></span><span class="line"><span class="cl"><span class="n">numbers</span> <span class="o">=</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">sorted_numbers</span> <span class="o">=</span> <span class="n">quicksort</span><span class="p">(</span><span class="n">numbers</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Sorted: </span><span class="si">{</span><span class="n">sorted_numbers</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span></code></pre></div><h3 id="configuration-files">Configuration Files</h3>
<p><strong>TOML Configuration</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="nx">base_url</span> <span class="p">=</span> <span class="s2">&#34;https://example.com&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">title</span> <span class="p">=</span> <span class="s2">&#34;My Site&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">description</span> <span class="p">=</span> <span class="s2">&#34;A demo site&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">compile_sass</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"><span class="nx">minify_html</span> <span class="p">=</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">markdown</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">highlight_code</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"><span class="nx">highlight_theme</span> <span class="p">=</span> <span class="s2">&#34;base16-ocean-dark&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">render_emoji</span> <span class="p">=</span> <span class="kc">false</span>
</span></span></code></pre></div><p><strong>JSON Configuration</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;my-project&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;version&#34;</span><span class="p">:</span> <span class="s2">&#34;1.0.0&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;description&#34;</span><span class="p">:</span> <span class="s2">&#34;A sample project&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;main&#34;</span><span class="p">:</span> <span class="s2">&#34;index.js&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;scripts&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;start&#34;</span><span class="p">:</span> <span class="s2">&#34;node index.js&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;dev&#34;</span><span class="p">:</span> <span class="s2">&#34;nodemon index.js&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;test&#34;</span><span class="p">:</span> <span class="s2">&#34;jest&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;build&#34;</span><span class="p">:</span> <span class="s2">&#34;webpack --mode production&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;dependencies&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;express&#34;</span><span class="p">:</span> <span class="s2">&#34;^4.18.0&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;dotenv&#34;</span><span class="p">:</span> <span class="s2">&#34;^16.0.0&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><hr>
<h2 id="additional-features">Additional Features</h2>
<h3 id="dark-mode">Dark Mode</h3>
<p>The theme includes automatic dark mode with localStorage persistence. Users can toggle between light and dark themes, and their preference is saved.</p>
<h3 id="responsive-design">Responsive Design</h3>
<p>All features are fully responsive and work beautifully on mobile, tablet, and desktop devices.</p>
<h3 id="accessibility">Accessibility</h3>
<p>The theme prioritizes accessibility with:</p>
<ul>
<li>WCAG compliant color contrasts</li>
<li>Semantic HTML</li>
<li>Keyboard navigation support</li>
<li>Screen reader friendly markup</li>
</ul>
<h3 id="performance">Performance</h3>
<ul>
<li>Optimized image processing</li>
<li>Minimal JavaScript</li>
<li>Fast page loads</li>
<li>Smolweb philosophy</li>
</ul>
<hr>
<h2 id="advanced-features">Advanced Features</h2>
<p>The theme includes several advanced features for power users and specific use cases.</p>
<h3 id="gemini-protocol-support">Gemini Protocol Support</h3>
<p>The theme includes full Gemini protocol support with <code>.gmi</code> templates for all page types:</p>
<ul>
<li>Homepage with bio and navigation</li>
<li>Post listings and individual posts</li>
<li>Tag and category pages</li>
<li>Collections and consumed content</li>
<li>Automatic &ldquo;Web version&rdquo; links</li>
</ul>
<p>All Gemini templates use your site&rsquo;s <code>baseURL</code> configuration, making them portable across domains. When you build your site, Gemini versions are automatically generated alongside HTML versions.</p>
<p><strong>Usage:</strong></p>
<p>Simply build your site normally:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">hugo --minify
</span></span></code></pre></div><p>Gemini versions will be available at paths like:</p>
<ul>
<li><code>index.gmi</code> - Homepage</li>
<li><code>posts/post-name.gmi</code> - Individual posts</li>
<li><code>tags/tag-name.gmi</code> - Tag pages</li>
</ul>
<h3 id="newsletter-generation">Newsletter Generation</h3>
<p>Generate newsletter-ready HTML for email campaigns. The theme includes special templates that filter content by the current month and generate copy-paste ready HTML.</p>
<p><strong>Monthly Picks Newsletter:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">hugo --renderToMemory --renderStaticToDisk<span class="o">=</span><span class="nb">false</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  --baseURL<span class="o">=</span><span class="s2">&#34;http://localhost:1313&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  -d public
</span></span><span class="line"><span class="cl"><span class="c1"># Access: http://localhost:1313/picks/list.newsletter.html</span>
</span></span></code></pre></div><p><strong>New Posts Newsletter:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Access: http://localhost:1313/posts/list.newsletter.html</span>
</span></span></code></pre></div><p>The templates filter content by the current month and generate HTML optimized for email platforms like Substack or Buttondown.</p>
<h3 id="consumed-content-tracking">Consumed Content Tracking</h3>
<p>Track and display books, movies, and music you&rsquo;ve consumed with ratings and reviews.</p>
<p><strong>Setup:</strong></p>
<p>Create a <code>consumed</code> section in your content directory and add data files in <code>data/consumed.toml</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[[</span><span class="nx">collection</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl"><span class="nx">title</span> <span class="p">=</span> <span class="s2">&#34;Book Title&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">author</span> <span class="p">=</span> <span class="s2">&#34;Author Name&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">category</span> <span class="p">=</span> <span class="s2">&#34;books&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">year</span> <span class="p">=</span> <span class="s2">&#34;2024&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">rating</span> <span class="p">=</span> <span class="mi">4</span>
</span></span><span class="line"><span class="cl"><span class="nx">date_read</span> <span class="p">=</span> <span class="s2">&#34;2024-11&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">content</span> <span class="p">=</span> <span class="s2">&#34;Brief thoughts...&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">review</span> <span class="p">=</span> <span class="s2">&#34;Detailed review...&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">image</span> <span class="p">=</span> <span class="s2">&#34;/assets/book-cover.jpg&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">link</span> <span class="p">=</span> <span class="s2">&#34;https://example.com/book&#34;</span>
</span></span></code></pre></div><p><strong>Display:</strong></p>
<p>Use the collection shortcode in your consumed section:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">{{&lt; collection file=&#34;consumed.toml&#34; style=&#34;card&#34; filter=&#34;date&#34; &gt;}}
</span></span></code></pre></div><p><strong>Features:</strong></p>
<ul>
<li>Track books, movies, music, and more</li>
<li>Star ratings (1-5)</li>
<li>Date-based filtering</li>
<li>Category organization</li>
<li>Reviews and brief thoughts</li>
<li>Links to external resources</li>
</ul>
<h3 id="giscus-integration">Giscus Integration</h3>
<p>The theme includes custom-styled Giscus integration for comments. Giscus uses GitHub Discussions as a comment system.</p>
<p><strong>Configuration:</strong></p>
<p>Add to your <code>hugo.toml</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">params</span><span class="p">.</span><span class="nx">giscus</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">repo</span> <span class="p">=</span> <span class="s2">&#34;yourusername/yourrepo&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">repoId</span> <span class="p">=</span> <span class="s2">&#34;your-repo-id&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">category</span> <span class="p">=</span> <span class="s2">&#34;Announcements&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">categoryId</span> <span class="p">=</span> <span class="s2">&#34;your-category-id&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">mapping</span> <span class="p">=</span> <span class="s2">&#34;pathname&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">strict</span> <span class="p">=</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl"><span class="nx">reactionsEnabled</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"><span class="nx">emitMetadata</span> <span class="p">=</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl"><span class="nx">inputPosition</span> <span class="p">=</span> <span class="s2">&#34;bottom&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">theme</span> <span class="p">=</span> <span class="s2">&#34;preferred_color_scheme&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">lang</span> <span class="p">=</span> <span class="s2">&#34;en&#34;</span>
</span></span></code></pre></div><p>The theme automatically styles Giscus comments to match your site&rsquo;s design, including dark mode support.</p>
<h3 id="multilingual-support">Multilingual Support</h3>
<p>The theme includes i18n support with English and Spanish translations included. Additional languages can be added by creating translation files in the <code>i18n/</code> directory.</p>
<p><strong>Configuration:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="nx">defaultContentLanguage</span> <span class="p">=</span> <span class="s2">&#34;en&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">languages</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">languages</span><span class="p">.</span><span class="nx">en</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">languageName</span> <span class="p">=</span> <span class="s2">&#34;English&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">weight</span> <span class="p">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">languages</span><span class="p">.</span><span class="nx">es</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">languageName</span> <span class="p">=</span> <span class="s2">&#34;Español&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">weight</span> <span class="p">=</span> <span class="mi">2</span>
</span></span></code></pre></div><p><strong>Features:</strong></p>
<ul>
<li>Automatic language detection</li>
<li>Language switcher in navigation</li>
<li>Translated UI elements</li>
<li>Per-language content organization</li>
<li>RTL support ready</li>
</ul>
<hr>
<h2 id="conclusion">Conclusion</h2>
<p>The Apacible theme provides a comprehensive set of features for creating beautiful, accessible, and performant websites. From basic markdown to advanced technical content, everything is designed to work together seamlessly.</p>
<p>Whether you&rsquo;re writing blog posts, technical documentation, or long-form articles, the theme has the tools you need to create engaging, readable content.</p>
<p>For more information, see the <a href="https://git.sr.ht/~ckopac/apacible">theme README</a> or explore the source code.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>First footnote.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Here&rsquo;s the second footnote.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content></entry></feed>