]> danix's work - danix2-hugo-theme.git/commitdiff
fix: resolve matrix rain opacity, menu styling, and featured articles
authorDanilo M. <redacted>
Sun, 5 Apr 2026 07:52:36 +0000 (09:52 +0200)
committerDanilo M. <redacted>
Sun, 5 Apr 2026 07:52:36 +0000 (09:52 +0200)
Issues fixed:
1. Added missing header.css and footer.css imports to main.css (fixes unstyled menu)
2. Increased matrix rain canvas opacity (0.13→0.25, 0.18→0.35) for better visibility
3. Updated home.html to display featured articles first, then latest 3
4. Removed invalid pseudo-element CSS rule on canvas element

The form on /is/here should now be visible, menu properly styled, and matrix rain more prominent.

Co-Authored-By: Claude Haiku 4.5 <redacted>
44 files changed:
.claude/settings.local.json [new file with mode: 0644]
.hugo_build.lock [new file with mode: 0644]
.superpowers/brainstorm/15080-1775367116/content/theme-approaches.html [new file with mode: 0644]
.superpowers/brainstorm/15080-1775367116/content/waiting.html [new file with mode: 0644]
.superpowers/brainstorm/15080-1775367116/state/server-stopped [new file with mode: 0644]
.superpowers/brainstorm/15080-1775367116/state/server.log [new file with mode: 0644]
.superpowers/brainstorm/15080-1775367116/state/server.pid [new file with mode: 0644]
assets/css/components/hero.css
assets/css/main.css
assets/jsconfig.json [new file with mode: 0644]
layouts/home.html
public/articles/index.html [new file with mode: 0644]
public/categories/index.html [new file with mode: 0644]
public/categories/index.xml [new file with mode: 0644]
public/css/main.30bbabcf0c588c3c13cbe24430d7aa6226315a94faf09d877dd441b3ebf03774.css [new file with mode: 0644]
public/css/main.3abe95debec71c071dca144ff88e0ce1f7c17e0c6cc9f1a0138ae45683de8c86.css [new file with mode: 0644]
public/css/main.5c9869e05d53e10d15258a314b452f5a95242f4e39dd052c90b7d7b5619c40c4.css [new file with mode: 0644]
public/css/main.8337d7f7e0fbf6083195dbb6bd8ad102187face3b194ff449dc78376ca12e014.css [new file with mode: 0644]
public/css/main.css [new file with mode: 0644]
public/css/main.css.map [new file with mode: 0644]
public/favicon.ico [new file with mode: 0644]
public/index.html [new file with mode: 0644]
public/index.xml [new file with mode: 0644]
public/is/here/index.html [new file with mode: 0644]
public/is/index.html [new file with mode: 0644]
public/js/filters.38212ecd54ff7f1fdebf2aebe32e8c248382e80f93dae0761ebbbd03ca28dc5b.js [new file with mode: 0644]
public/js/main.23cd0c7d837263b9eaeb96ee2d9ccfa2969daa3fa00fa1c1fe8701a9b87251a1.js [new file with mode: 0644]
public/js/main.55ed9b054bac537d7aab80112d090a8b88bbcaae5dec86c26009f393fd2d213d.js [new file with mode: 0644]
public/js/main.js [new file with mode: 0644]
public/js/main.js.map [new file with mode: 0644]
public/posts/index.html [new file with mode: 0644]
public/posts/post-1/index.html [new file with mode: 0644]
public/posts/post-2/index.html [new file with mode: 0644]
public/posts/post-3/bryce-canyon.jpg [new file with mode: 0644]
public/posts/post-3/index.html [new file with mode: 0644]
public/sitemap.xml [new file with mode: 0644]
public/tags/blue/index.html [new file with mode: 0644]
public/tags/blue/index.xml [new file with mode: 0644]
public/tags/green/index.html [new file with mode: 0644]
public/tags/green/index.xml [new file with mode: 0644]
public/tags/index.html [new file with mode: 0644]
public/tags/index.xml [new file with mode: 0644]
public/tags/red/index.html [new file with mode: 0644]
public/tags/red/index.xml [new file with mode: 0644]

diff --git a/.claude/settings.local.json b/.claude/settings.local.json
new file mode 100644 (file)
index 0000000..9abed36
--- /dev/null
@@ -0,0 +1,17 @@
+{
+  "permissions": {
+    "allow": [
+      "Read(//home/danix/Programming/AI/claude/danixme/**)",
+      "Read(//home/danix/Programming/AI/claude/danixme/themes/**)",
+      "Bash(/home/danix/.claude/plugins/cache/superpowers-marketplace/superpowers/5.0.6/skills/brainstorming/scripts/start-server.sh:*)",
+      "Bash(git add:*)",
+      "Bash(git commit -m ':*)",
+      "Bash(hugo)",
+      "Bash(git commit:*)",
+      "Bash(hugo server:*)",
+      "Bash(curl -s http://localhost:1313/js/main.js)",
+      "Bash(curl -s http://localhost:1313/)",
+      "Read(//tmp/**)"
+    ]
+  }
+}
diff --git a/.hugo_build.lock b/.hugo_build.lock
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/.superpowers/brainstorm/15080-1775367116/content/theme-approaches.html b/.superpowers/brainstorm/15080-1775367116/content/theme-approaches.html
new file mode 100644 (file)
index 0000000..fdb04cb
--- /dev/null
@@ -0,0 +1,358 @@
+<style>
+  @import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;600&family=JetBrains+Mono:ital,wght@0,300;0,400;0,500;0,700;1,300&family=Oxanium:wght@700;800&display=swap');
+
+  .approaches { display: flex; gap: 1.5rem; flex-wrap: wrap; margin-top: 1rem; }
+
+  .approach-card {
+    flex: 1;
+    min-width: 260px;
+    max-width: 340px;
+    border-radius: 12px;
+    overflow: hidden;
+    cursor: pointer;
+    border: 2px solid transparent;
+    transition: border-color 0.2s, box-shadow 0.2s;
+    position: relative;
+  }
+  .approach-card.selected { border-color: #a855f7; box-shadow: 0 0 24px rgba(168,85,247,0.4); }
+  .approach-card:hover { border-color: rgba(168,85,247,0.4); }
+
+  .approach-label {
+    font-family: 'JetBrains Mono', monospace;
+    font-size: 0.7rem;
+    letter-spacing: 0.15em;
+    text-transform: uppercase;
+    padding: 0.5rem 1rem;
+    font-weight: 600;
+  }
+
+  /* ── OPTION A: Hacker Terminal ── */
+  .preview-a {
+    background: #060b10;
+    padding: 1rem;
+    font-family: 'JetBrains Mono', monospace;
+    min-height: 340px;
+  }
+  .preview-a .nav-a {
+    display: flex; gap: 1rem; align-items: center; margin-bottom: 1rem;
+    border-bottom: 1px solid #182840; padding-bottom: 0.6rem;
+  }
+  .preview-a .logo-a { color: #a855f7; font-size: 0.75rem; font-weight: 700; letter-spacing: 0.1em; }
+  .preview-a .nav-link { color: #7a9bb8; font-size: 0.55rem; letter-spacing: 0.12em; text-transform: uppercase; }
+  .preview-a .hero-a {
+    background: #060b10;
+    border: 1px solid #182840;
+    padding: 0.8rem;
+    margin-bottom: 0.8rem;
+    position: relative;
+    overflow: hidden;
+  }
+  .preview-a .matrix-strip {
+    position: absolute; top: 0; right: 0; bottom: 0; width: 40%;
+    background: linear-gradient(to right, #060b10, transparent);
+    display: flex; align-items: center; justify-content: flex-end;
+    font-size: 0.4rem; color: rgba(0,255,136,0.2); letter-spacing: 0.05em;
+    padding-right: 0.3rem; overflow: hidden; line-height: 1.2;
+    font-weight: 300;
+  }
+  .preview-a .name-a { font-family: 'Oxanium', sans-serif; color: #a855f7; font-size: 1.1rem; font-weight: 800; }
+  .preview-a .role-a { color: #00ff88; font-size: 0.5rem; letter-spacing: 0.15em; text-transform: uppercase; margin: 0.2rem 0; }
+  .preview-a .bio-a { color: #7a9bb8; font-size: 0.45rem; line-height: 1.6; max-width: 55%; font-family: 'IBM Plex Sans', sans-serif; }
+  .preview-a .card-a {
+    background: #101e2d;
+    border: 1px solid #182840;
+    padding: 0.6rem;
+    margin-bottom: 0.5rem;
+    display: flex; gap: 0.5rem;
+  }
+  .preview-a .card-img-a {
+    width: 40px; height: 32px; background: #182840; flex-shrink: 0;
+    border: 1px solid #a855f7; position: relative; overflow: hidden;
+  }
+  .preview-a .card-img-a::after {
+    content: ''; position: absolute; inset: 0;
+    background: linear-gradient(135deg, rgba(168,85,247,0.3), transparent);
+  }
+  .preview-a .tag-a {
+    font-size: 0.38rem; color: #00ff88; letter-spacing: 0.1em; text-transform: uppercase; margin-bottom: 0.15rem;
+    border: 1px solid rgba(0,255,136,0.3); display: inline-block; padding: 0.05rem 0.2rem;
+  }
+  .preview-a .title-a { color: #c4d6e8; font-size: 0.5rem; font-weight: 600; line-height: 1.3; margin-bottom: 0.15rem; }
+  .preview-a .excerpt-a { color: #7a9bb8; font-size: 0.4rem; font-family: 'IBM Plex Sans', sans-serif; line-height: 1.5; }
+  .label-a { background: #060b10; color: #a855f7; }
+
+  /* ── OPTION B: Editorial Dark ── */
+  .preview-b {
+    background: #0a0f1a;
+    padding: 1rem;
+    min-height: 340px;
+    font-family: 'IBM Plex Sans', sans-serif;
+  }
+  .preview-b .nav-b {
+    display: flex; gap: 1rem; align-items: center; margin-bottom: 1.2rem;
+    padding-bottom: 0.6rem;
+  }
+  .preview-b .logo-b { font-family: 'Oxanium', sans-serif; color: #e8e8f0; font-size: 0.8rem; font-weight: 800; }
+  .preview-b .nav-link-b { color: #6a7fa0; font-size: 0.5rem; letter-spacing: 0.06em; font-family: 'JetBrains Mono', monospace; }
+  .preview-b .hero-b {
+    margin-bottom: 1rem;
+    padding-bottom: 0.8rem;
+    border-bottom: 1px solid #1e2840;
+    position: relative; overflow: hidden;
+  }
+  .preview-b .matrix-strip-b {
+    position: absolute; top: 0; right: 0; bottom: 0; width: 35%;
+    display: flex; align-items: center; justify-content: flex-end;
+    font-family: 'JetBrains Mono', monospace;
+    font-size: 0.38rem; color: rgba(0,255,136,0.1); letter-spacing: 0.05em;
+    padding-right: 0.3rem; overflow: hidden; line-height: 1.3;
+  }
+  .preview-b .eyebrow-b { font-family: 'JetBrains Mono', monospace; color: #a855f7; font-size: 0.42rem; letter-spacing: 0.15em; text-transform: uppercase; margin-bottom: 0.3rem; }
+  .preview-b .name-b { font-family: 'Oxanium', sans-serif; color: #e8e8f0; font-size: 1.4rem; font-weight: 800; line-height: 1.1; margin-bottom: 0.25rem; }
+  .preview-b .bio-b { color: #8899b8; font-size: 0.46rem; line-height: 1.8; max-width: 58%; }
+  .preview-b .section-label-b { font-family: 'JetBrains Mono', monospace; font-size: 0.42rem; color: #a855f7; letter-spacing: 0.15em; text-transform: uppercase; margin-bottom: 0.6rem; }
+  .preview-b .grid-b { display: grid; grid-template-columns: 1.4fr 1fr; gap: 0.5rem; }
+  .preview-b .card-b {
+    background: #111827;
+    border-radius: 6px;
+    overflow: hidden;
+  }
+  .preview-b .card-b.featured { grid-row: span 2; }
+  .preview-b .card-img-b {
+    height: 50px; background: linear-gradient(135deg, #1e2840 60%, #2d1f4a);
+    position: relative;
+  }
+  .preview-b .card-img-b.featured { height: 90px; }
+  .preview-b .card-img-b::after {
+    content: ''; position: absolute; bottom: 0; left: 0; right: 0; height: 50%;
+    background: linear-gradient(to top, #111827, transparent);
+  }
+  .preview-b .card-body-b { padding: 0.5rem; }
+  .preview-b .tag-b { font-family: 'JetBrains Mono', monospace; font-size: 0.35rem; color: #a855f7; letter-spacing: 0.08em; text-transform: uppercase; margin-bottom: 0.12rem; }
+  .preview-b .title-b { color: #d4e0f0; font-size: 0.48rem; font-weight: 600; line-height: 1.35; }
+  .label-b { background: #0a0f1a; color: #d4e0f0; font-family: 'IBM Plex Sans', sans-serif; }
+
+  /* ── OPTION C: Warm Personal ── */
+  .preview-c {
+    background: #0d0f14;
+    padding: 1rem;
+    min-height: 340px;
+    font-family: 'IBM Plex Sans', sans-serif;
+  }
+  .preview-c .nav-c {
+    display: flex; gap: 1rem; align-items: center; margin-bottom: 1rem;
+    padding-bottom: 0.6rem; border-bottom: 1px solid #1e2030;
+  }
+  .preview-c .logo-c { font-family: 'Oxanium', sans-serif; color: #c084fc; font-size: 0.75rem; font-weight: 800; }
+  .preview-c .nav-link-c { color: #6a7a90; font-size: 0.5rem; letter-spacing: 0.04em; font-family: 'IBM Plex Sans', sans-serif; }
+  .preview-c .hero-c {
+    display: flex; align-items: center; gap: 0.8rem;
+    margin-bottom: 0.8rem; padding-bottom: 0.8rem; border-bottom: 1px solid #1e2030;
+    position: relative; overflow: hidden;
+  }
+  .preview-c .matrix-strip-c {
+    position: absolute; top: 0; right: 0; bottom: 0; width: 30%;
+    font-family: 'JetBrains Mono', monospace;
+    font-size: 0.38rem; color: rgba(192,132,252,0.12); letter-spacing: 0.05em;
+    padding-right: 0.3rem; overflow: hidden; line-height: 1.3; display: flex; align-items: center;
+    justify-content: flex-end;
+  }
+  .preview-c .avatar-c {
+    width: 36px; height: 36px; border-radius: 50%; flex-shrink: 0;
+    background: linear-gradient(135deg, #a855f7, #00ff88);
+    display: flex; align-items: center; justify-content: center;
+    font-family: 'Oxanium', sans-serif; color: #fff; font-size: 0.65rem; font-weight: 800;
+  }
+  .preview-c .name-c { font-family: 'Oxanium', sans-serif; color: #dde8f8; font-size: 0.9rem; font-weight: 800; line-height: 1.1; }
+  .preview-c .role-c { font-family: 'JetBrains Mono', monospace; color: #c084fc; font-size: 0.38rem; letter-spacing: 0.1em; margin: 0.1rem 0; }
+  .preview-c .bio-c { color: #7a8fa8; font-size: 0.4rem; line-height: 1.7; max-width: 55%; }
+  .preview-c .filters-c { display: flex; gap: 0.3rem; margin-bottom: 0.6rem; flex-wrap: wrap; }
+  .preview-c .filter-c { font-family: 'JetBrains Mono', monospace; font-size: 0.38rem; padding: 0.1rem 0.35rem; border-radius: 20px; letter-spacing: 0.08em; text-transform: uppercase; cursor: pointer; }
+  .preview-c .filter-all { background: #a855f7; color: #fff; }
+  .preview-c .filter-inactive { background: rgba(168,85,247,0.1); color: #7a8fa8; border: 1px solid rgba(168,85,247,0.2); }
+
+  /* Mixed card types for feed */
+  .preview-c .feed-c { display: flex; flex-direction: column; gap: 0.4rem; }
+
+  /* Article card */
+  .preview-c .card-article {
+    background: #141820; border-radius: 6px; display: flex; gap: 0.5rem; overflow: hidden;
+    border-left: 2px solid #a855f7;
+  }
+  .preview-c .card-article-img { width: 48px; height: 40px; background: linear-gradient(135deg, #1e2840, #2d1f4a); flex-shrink: 0; }
+  .preview-c .card-article-body { padding: 0.4rem 0.4rem 0.4rem 0; }
+  .preview-c .card-type { font-family: 'JetBrains Mono', monospace; font-size: 0.35rem; letter-spacing: 0.1em; text-transform: uppercase; margin-bottom: 0.08rem; }
+  .preview-c .type-tech { color: #a855f7; }
+  .preview-c .type-life { color: #f59e0b; }
+  .preview-c .type-quote { color: #00ff88; }
+  .preview-c .type-link { color: #38bdf8; }
+  .preview-c .card-title-c { color: #ccd8ec; font-size: 0.48rem; font-weight: 600; line-height: 1.3; }
+
+  /* Quote card */
+  .preview-c .card-quote {
+    background: #0f1520; border-radius: 6px; padding: 0.5rem 0.6rem;
+    border-left: 3px solid #00ff88;
+  }
+  .preview-c .quote-text { color: #a0b8c8; font-size: 0.44rem; font-style: italic; line-height: 1.6; margin-bottom: 0.15rem; font-family: 'IBM Plex Sans', sans-serif; }
+  .preview-c .quote-attr { font-family: 'JetBrains Mono', monospace; font-size: 0.35rem; color: #00ff88; letter-spacing: 0.08em; }
+
+  /* Link card */
+  .preview-c .card-link {
+    background: #141820; border-radius: 6px; padding: 0.4rem 0.5rem;
+    display: flex; align-items: center; gap: 0.4rem;
+    border-left: 2px solid #38bdf8;
+  }
+  .preview-c .link-icon { font-size: 0.7rem; flex-shrink: 0; }
+  .preview-c .link-title { color: #ccd8ec; font-size: 0.45rem; font-weight: 600; }
+  .preview-c .link-domain { font-family: 'JetBrains Mono', monospace; font-size: 0.35rem; color: #38bdf8; }
+
+  .label-c { background: #0d0f14; color: #dde8f8; font-family: 'IBM Plex Sans', sans-serif; }
+
+  .approach-badge {
+    position: absolute; top: 0.5rem; right: 0.5rem;
+    font-family: 'JetBrains Mono', monospace; font-size: 0.55rem;
+    background: rgba(168,85,247,0.15); color: #a855f7;
+    border: 1px solid rgba(168,85,247,0.3); padding: 0.15rem 0.4rem;
+    letter-spacing: 0.1em; text-transform: uppercase;
+  }
+</style>
+
+<h2>Three theme directions for danix.xyz</h2>
+<p class="subtitle">Each preserves the fonts and colors from danixme — the difference is in personality and layout approach. Click to select.</p>
+
+<div class="approaches">
+
+  <!-- OPTION A -->
+  <div class="approach-card" data-choice="a" onclick="toggleSelect(this)">
+    <div class="approach-label label-a">A — Hacker Terminal</div>
+    <div class="preview-a">
+      <div class="approach-badge">A</div>
+      <div class="nav-a">
+        <span class="logo-a">danix</span>
+        <span class="nav-link">articles</span>
+        <span class="nav-link">contact</span>
+      </div>
+      <div class="hero-a">
+        <div class="matrix-strip">アイウ01カキABC<br>エオ234クケBCD<br>カキ567コサCDE<br>クケ890シスDEF</div>
+        <div class="name-a">danilo m.</div>
+        <div class="role-a">// engineer · writer · human</div>
+        <div class="bio-a">writing about the things I learn, the things I think, and the things that move me.</div>
+      </div>
+      <div class="card-a">
+        <div class="card-img-a"></div>
+        <div>
+          <div class="tag-a">tech</div>
+          <div class="title-a">Understanding Kubernetes networking from scratch</div>
+          <div class="excerpt-a">After years of cargo-culting configs...</div>
+        </div>
+      </div>
+      <div class="card-a">
+        <div class="card-img-a"></div>
+        <div>
+          <div class="tag-a" style="color:#f59e0b;border-color:rgba(245,158,11,0.3)">life</div>
+          <div class="title-a">On slowing down in a world that won't</div>
+          <div class="excerpt-a">There's a particular kind of exhaustion...</div>
+        </div>
+      </div>
+    </div>
+    <div class="approach-label label-a" style="font-size:0.6rem;padding:0.4rem 1rem;border-top:1px solid #182840">Sharp edges · terminal soul · max hacker</div>
+  </div>
+
+  <!-- OPTION B -->
+  <div class="approach-card" data-choice="b" onclick="toggleSelect(this)">
+    <div class="approach-label label-b">B — Editorial Dark</div>
+    <div class="preview-b">
+      <div class="approach-badge">B</div>
+      <div class="nav-b">
+        <span class="logo-b">danix</span>
+        <span class="nav-link-b">articles</span>
+        <span class="nav-link-b">contact</span>
+      </div>
+      <div class="hero-b">
+        <div class="matrix-strip-b">アイウ01カキABC<br>エオ234クケBCD<br>カキ567コサCDE</div>
+        <div class="eyebrow-b">// engineer · writer · human</div>
+        <div class="name-b">danilo m.</div>
+        <div class="bio-b">Writing about IT, life, and the things that matter. Honest takes, real learning.</div>
+      </div>
+      <div class="section-label-b">latest</div>
+      <div class="grid-b">
+        <div class="card-b featured">
+          <div class="card-img-b featured"></div>
+          <div class="card-body-b">
+            <div class="tag-b">tech</div>
+            <div class="title-b">Understanding Kubernetes networking from scratch</div>
+          </div>
+        </div>
+        <div class="card-b">
+          <div class="card-img-b"></div>
+          <div class="card-body-b">
+            <div class="tag-b" style="color:#f59e0b">life</div>
+            <div class="title-b">On slowing down</div>
+          </div>
+        </div>
+        <div class="card-b">
+          <div class="card-img-b"></div>
+          <div class="card-body-b">
+            <div class="tag-b" style="color:#00ff88">quote</div>
+            <div class="title-b">"The obstacle is the way"</div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="approach-label label-b" style="font-size:0.6rem;padding:0.4rem 1rem;border-top:1px solid #1e2840">Magazine grid · featured post · editorial rhythm</div>
+  </div>
+
+  <!-- OPTION C -->
+  <div class="approach-card" data-choice="c" onclick="toggleSelect(this)">
+    <div class="approach-label label-c">C — Warm Personal</div>
+    <div class="preview-c">
+      <div class="approach-badge">C</div>
+      <div class="nav-c">
+        <span class="logo-c">danix</span>
+        <span class="nav-link-c">articles</span>
+        <span class="nav-link-c">contact</span>
+      </div>
+      <div class="hero-c">
+        <div class="matrix-strip-c">アイウ01<br>エオ234<br>カキ567</div>
+        <div class="avatar-c">DM</div>
+        <div>
+          <div class="name-c">danilo m.</div>
+          <div class="role-c">// engineer · writer · human</div>
+          <div class="bio-c">Writing about the things I learn, think about, and find worth sharing.</div>
+        </div>
+      </div>
+      <div class="filters-c">
+        <span class="filter-c filter-all">all</span>
+        <span class="filter-c filter-inactive">tech</span>
+        <span class="filter-c filter-inactive">life</span>
+        <span class="filter-c filter-inactive">quotes</span>
+        <span class="filter-c filter-inactive">links</span>
+        <span class="filter-c filter-inactive">photos</span>
+      </div>
+      <div class="feed-c">
+        <div class="card-article">
+          <div class="card-article-img"></div>
+          <div class="card-article-body">
+            <div class="card-type type-tech">tech</div>
+            <div class="card-title-c">Understanding Kubernetes networking from scratch</div>
+          </div>
+        </div>
+        <div class="card-quote">
+          <div class="card-type type-quote">quote</div>
+          <div class="quote-text">"The obstacle is the way"</div>
+          <div class="quote-attr">— Marcus Aurelius</div>
+        </div>
+        <div class="card-link">
+          <div class="link-icon">🔗</div>
+          <div>
+            <div class="card-type type-link">link</div>
+            <div class="link-title">The future of Linux packaging</div>
+            <div class="link-domain">lwn.net</div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="approach-label label-c" style="font-size:0.6rem;padding:0.4rem 1rem;border-top:1px solid #1e2030">Feed-first · type-colored cards · human warmth</div>
+  </div>
+
+</div>
diff --git a/.superpowers/brainstorm/15080-1775367116/content/waiting.html b/.superpowers/brainstorm/15080-1775367116/content/waiting.html
new file mode 100644 (file)
index 0000000..f92c257
--- /dev/null
@@ -0,0 +1,3 @@
+<div style="display:flex;align-items:center;justify-content:center;min-height:60vh">
+  <p class="subtitle">Continuing in terminal...</p>
+</div>
\ No newline at end of file
diff --git a/.superpowers/brainstorm/15080-1775367116/state/server-stopped b/.superpowers/brainstorm/15080-1775367116/state/server-stopped
new file mode 100644 (file)
index 0000000..8f4a6c1
--- /dev/null
@@ -0,0 +1 @@
+{"reason":"idle timeout","timestamp":1775369816592}
diff --git a/.superpowers/brainstorm/15080-1775367116/state/server.log b/.superpowers/brainstorm/15080-1775367116/state/server.log
new file mode 100644 (file)
index 0000000..3b34699
--- /dev/null
@@ -0,0 +1,5 @@
+{"type":"server-started","port":54310,"host":"127.0.0.1","url_host":"localhost","url":"http://localhost:54310","screen_dir":"/home/danix/Programming/GIT/danix2-hugo-theme/.superpowers/brainstorm/15080-1775367116/content","state_dir":"/home/danix/Programming/GIT/danix2-hugo-theme/.superpowers/brainstorm/15080-1775367116/state"}
+{"type":"screen-added","file":"/home/danix/Programming/GIT/danix2-hugo-theme/.superpowers/brainstorm/15080-1775367116/content/theme-approaches.html"}
+{"source":"user-event","type":"click","text":"B — Editorial Dark\n    \n      B\n      \n        danix\n        articles\n        contact\n      \n      \n        アイウ01カキABCエオ234クケBCDカキ567コサCDE\n        // engineer · writer · human\n        danilo m.\n        Writing about IT, life, and the things that matter. Honest takes, real learning.\n      \n      latest\n      \n        \n          \n          \n            tech\n            Understanding Kubernetes networking from scratch\n          \n        \n        \n          \n          \n            life\n            On slowing down\n          \n        \n        \n          \n          \n            quote\n            \"The obstacle is the way\"\n          \n        \n      \n    \n    Magazine grid · featured post · editorial rhythm","choice":"b","id":null,"timestamp":1775367824598}
+{"type":"screen-added","file":"/home/danix/Programming/GIT/danix2-hugo-theme/.superpowers/brainstorm/15080-1775367116/content/waiting.html"}
+{"type":"server-stopped","reason":"idle timeout"}
diff --git a/.superpowers/brainstorm/15080-1775367116/state/server.pid b/.superpowers/brainstorm/15080-1775367116/state/server.pid
new file mode 100644 (file)
index 0000000..2902cb9
--- /dev/null
@@ -0,0 +1 @@
+15088
index a1f93fc3e5f59ae921da57fcc87def9be2c93b37..9672ffdbb09c3d67382587889e8716d68d8d243c 100644 (file)
 #matrix-canvas {
   position: absolute;
   inset: 0;
-  opacity: 0.13;
+  opacity: 0.25;
   pointer-events: none;
 }
 
 html.theme-light #matrix-canvas {
-  opacity: 0.18;
+  opacity: 0.35;
 }
 
 .hero-content {
@@ -77,20 +77,6 @@ html.theme-light #matrix-canvas {
   max-width: 400px;
 }
 
-/* Scanlines effect on canvas */
-#matrix-canvas::after {
-  content: '';
-  position: absolute;
-  inset: 0;
-  background: repeating-linear-gradient(
-    0deg,
-    rgba(0, 0, 0, 0.15),
-    rgba(0, 0, 0, 0.15) 1px,
-    transparent 1px,
-    transparent 2px
-  );
-  pointer-events: none;
-}
 
 /* Ambient glow behind hero */
 .hero::before {
index 3c12d228b2b6b72edd724e051b15dff2b9db98e7..518e7490c671a1589958cf620d1862381da8eef1 100644 (file)
@@ -1,6 +1,8 @@
 @import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;600&family=JetBrains+Mono:ital,wght@0,300;0,400;0,500;0,700;1,300&family=Oxanium:wght@700;800&display=swap');
 
 @import 'variables.css';
+@import 'components/header.css';
+@import 'components/footer.css';
 @import 'components/hero.css';
 @import 'components/card.css';
 @import 'components/feed.css';
diff --git a/assets/jsconfig.json b/assets/jsconfig.json
new file mode 100644 (file)
index 0000000..377218c
--- /dev/null
@@ -0,0 +1,10 @@
+{
+ "compilerOptions": {
+  "baseUrl": ".",
+  "paths": {
+   "*": [
+    "*"
+   ]
+  }
+ }
+}
\ No newline at end of file
index 4eed7ad45e75aba5af1377fdcf09069d2c6dab46..0beae1fbb0144fe4bbd449cd9e5d98a320824a1c 100644 (file)
@@ -2,16 +2,28 @@
   {{ partial "hero.html" . }}
 
   <div class="container feed-section">
-    <div class="feed-label">Latest</div>
-
     {{ $posts := where site.RegularPages "Type" "in" (slice "articles") }}
     {{ $posts := sort $posts "Params.date" "desc" }}
-    {{ $latest := first 3 $posts }}
+
+    {{ $featured := where $posts "Params.featured" true }}
+    {{ $notFeatured := where $posts "Params.featured" "!=" true }}
 
     <div class="feed-grid">
-      {{ range $latest }}
-        {{ $data := dict "title" .Title "type" .Params.type "description" .Summary "date" .Date "url" .RelPermalink "image" .Params.image "featured" .Params.featured }}
-        {{ partial "post-card.html" $data }}
+      {{ if $featured }}
+        <div class="feed-label">Featured</div>
+        {{ range first 1 $featured }}
+          {{ $data := dict "title" .Title "type" .Params.type "description" .Summary "date" .Date "url" .RelPermalink "image" .Params.image "featured" true }}
+          {{ partial "post-card.html" $data }}
+        {{ end }}
+      {{ end }}
+
+      {{ if or $featured $notFeatured }}
+        {{ if $featured }}<div class="feed-label" style="margin-top: 2rem;">Latest</div>{{ else }}<div class="feed-label">Latest</div>{{ end }}
+        {{ $latest := first 3 $notFeatured }}
+        {{ range $latest }}
+          {{ $data := dict "title" .Title "type" .Params.type "description" .Summary "date" .Date "url" .RelPermalink "image" .Params.image "featured" false }}
+          {{ partial "post-card.html" $data }}
+        {{ end }}
       {{ end }}
     </div>
 
diff --git a/public/articles/index.html b/public/articles/index.html
new file mode 100644 (file)
index 0000000..9d424dd
--- /dev/null
@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<html lang="en-US" dir="ltr">
+<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
+  <meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<meta name="description" content="Writing about IT, life, and the things that matter.">
+<meta name="theme-color" content="#060b10">
+<title>Articles | danilo m.</title>
+
+
+      <link rel="stylesheet" href="/css/main.css">
+
+
+      <script src="/js/main.js"></script>
+
+
+</head>
+<body>
+  <div class="reading-progress"></div>
+  <header><div class="header-container">
+  <a href="/" class="site-title">Danilo M.</a>
+  <div class="header-controls">
+    <nav>
+      <ul>
+        
+          <li>
+            <a href="/articles/" class="active">
+              articles
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/" >
+              about
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/here/" >
+              contact
+            </a>
+          </li>
+        
+      </ul>
+    </nav>
+    <button id="theme-toggle-btn" class="theme-toggle" aria-label="Toggle theme">🌙 dark</button>
+  </div>
+</div>
+</header>
+  <main>
+  <div class="container">
+    <h1>Articles</h1>
+
+    
+      <div class="filter-bar">
+        <button class="filter-btn active" data-filter="all">All</button>
+        <button class="filter-btn" data-filter="tech">Tech</button>
+        <button class="filter-btn" data-filter="life">Life</button>
+        <button class="filter-btn" data-filter="quote">Quote</button>
+        <button class="filter-btn" data-filter="link">Link</button>
+        <button class="filter-btn" data-filter="photo">Photo</button>
+      </div>
+
+      <div class="feed-list" id="articles-feed">
+        
+      </div>
+    
+  </div>
+
+  
+    
+    <script defer src="/js/filters.38212ecd54ff7f1fdebf2aebe32e8c248382e80f93dae0761ebbbd03ca28dc5b.js"></script>
+  
+</main>
+  <footer><div class="footer-container">
+  <div class="footer-content">
+    <div class="footer-copyright">
+      © 2026 Danilo M.. All rights reserved.
+    </div>
+    <nav>
+      <ul class="footer-nav">
+        
+          <li><a href="/articles/">articles</a></li>
+        
+          <li><a href="/is/">about</a></li>
+        
+          <li><a href="/is/here/">contact</a></li>
+        
+      </ul>
+    </nav>
+  </div>
+</div>
+</footer>
+</body>
+</html>
diff --git a/public/categories/index.html b/public/categories/index.html
new file mode 100644 (file)
index 0000000..fc9956a
--- /dev/null
@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<html lang="en-US" dir="ltr">
+<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
+  <meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<meta name="description" content="Writing about IT, life, and the things that matter.">
+<meta name="theme-color" content="#060b10">
+<title>Categories | danilo m.</title>
+
+
+      <link rel="stylesheet" href="/css/main.css">
+
+
+      <script src="/js/main.js"></script>
+
+
+</head>
+<body>
+  <div class="reading-progress"></div>
+  <header><div class="header-container">
+  <a href="/" class="site-title">Danilo M.</a>
+  <div class="header-controls">
+    <nav>
+      <ul>
+        
+          <li>
+            <a href="/articles/" >
+              articles
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/" >
+              about
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/here/" >
+              contact
+            </a>
+          </li>
+        
+      </ul>
+    </nav>
+    <button id="theme-toggle-btn" class="theme-toggle" aria-label="Toggle theme">🌙 dark</button>
+  </div>
+</div>
+</header>
+  <main>
+  <h1>Categories</h1>
+  
+  
+</main>
+  <footer><div class="footer-container">
+  <div class="footer-content">
+    <div class="footer-copyright">
+      © 2026 Danilo M.. All rights reserved.
+    </div>
+    <nav>
+      <ul class="footer-nav">
+        
+          <li><a href="/articles/">articles</a></li>
+        
+          <li><a href="/is/">about</a></li>
+        
+          <li><a href="/is/here/">contact</a></li>
+        
+      </ul>
+    </nav>
+  </div>
+</div>
+</footer>
+</body>
+</html>
diff --git a/public/categories/index.xml b/public/categories/index.xml
new file mode 100644 (file)
index 0000000..f36f245
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
+  <channel>
+    <title>Categories on danilo m.</title>
+    <link>http://localhost:1313/categories/</link>
+    <description>Recent content in Categories on danilo m.</description>
+    <generator>Hugo</generator>
+    <language>en-US</language>
+    <atom:link href="http://localhost:1313/categories/index.xml" rel="self" type="application/rss+xml" />
+  </channel>
+</rss>
diff --git a/public/css/main.30bbabcf0c588c3c13cbe24430d7aa6226315a94faf09d877dd441b3ebf03774.css b/public/css/main.30bbabcf0c588c3c13cbe24430d7aa6226315a94faf09d877dd441b3ebf03774.css
new file mode 100644 (file)
index 0000000..4d80946
--- /dev/null
@@ -0,0 +1 @@
+header{border-bottom:1px solid #222;margin-bottom:1rem}footer{border-top:1px solid #222;margin-top:1rem}body{color:#222;font-family:sans-serif;line-height:1.5;margin:1rem;max-width:768px}a{color:#00e;text-decoration:none}
diff --git a/public/css/main.3abe95debec71c071dca144ff88e0ce1f7c17e0c6cc9f1a0138ae45683de8c86.css b/public/css/main.3abe95debec71c071dca144ff88e0ce1f7c17e0c6cc9f1a0138ae45683de8c86.css
new file mode 100644 (file)
index 0000000..14496ee
--- /dev/null
@@ -0,0 +1 @@
+@import"https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;600&family=JetBrains+Mono:ital,wght@0,300;0,400;0,500;0,700;1,300&family=Oxanium:wght@700;800&display=swap";:root{--bg: #060b10;--bg2: #0c1520;--surface: #101e2d;--border: #182840;--accent: #a855f7;--accent2: #00ff88;--text: #c4d6e8;--text-dim: #7a9bb8;--muted: #304860;--color-tech: #a855f7;--color-life: #f59e0b;--color-quote: #00ff88;--color-link: #38bdf8;--color-photo: #ec4899;--font-body: "IBM Plex Sans", system-ui, sans-serif;--font-mono: "JetBrains Mono", "Courier New", monospace;--font-head: "Oxanium", sans-serif;--fs-body: .95rem;--fs-nav: .8rem;--fs-badge: .7rem;--fs-btn: .8rem;--fs-h3: 1.5rem;--fs-h2: clamp(1.7rem, 6vw, 3rem);--container-max: 1080px;--container-narrow: 768px;--gap-sm: .5rem;--gap-md: 1.5rem;--gap-lg: 2.5rem;--gap-xl: 4rem;--section-py-mobile: 4rem;--section-py-desktop: 6rem;--card-px-mobile: 1.5rem;--card-px-desktop: 2rem;--transition: all .2s ease;--transition-slow: all .75s cubic-bezier(.16,1,.3,1)}html.theme-light{--bg: #f0f4f8;--bg2: #e2eaf4;--surface: #d4dff0;--border: #a8bdd8;--accent: #7c3aed;--accent2: #008f5a;--text: #0d1b2a;--text-dim: #2e4a6a;--muted: #6888a8}@media(max-width:479px){:root{--bp: "mobile"}}@media(min-width:480px){:root{--bp: "sm"}}@media(min-width:768px){:root{--bp: "md"}}@media(min-width:1200px){:root{--bp: "lg"}}html{font-size:17px;scroll-behavior:smooth}*{margin:0;padding:0;box-sizing:border-box}body{background-color:var(--bg);color:var(--text);font-family:var(--font-body);font-size:var(--fs-body);line-height:1.95;transition:background-color .2s,color .2s}h1{font-family:var(--font-head);font-size:var(--fs-h2);font-weight:800;line-height:1.1;margin-bottom:.5rem}h2{font-family:var(--font-head);font-size:var(--fs-h2);font-weight:800;line-height:1.1;margin:2rem 0 1rem}h3{font-family:var(--font-head);font-size:var(--fs-h3);font-weight:800;line-height:1.2;margin:1.5rem 0 .75rem}h4,h5,h6{font-family:var(--font-head);font-weight:800;margin:1rem 0 .5rem}p{margin-bottom:1rem}a{color:var(--accent);text-decoration:none;transition:var(--transition)}a:hover{color:var(--accent2)}.container{max-width:var(--container-max);margin:0 auto;padding:0 1.5rem}.container-narrow{max-width:var(--container-narrow);margin:0 auto;padding:0 1.5rem}main{min-height:calc(100vh - 200px)}ul,ol{margin-left:1.5rem;margin-bottom:1rem}li{margin-bottom:.5rem}code{font-family:var(--font-mono);background:var(--surface);padding:.25rem .5rem;border-radius:4px;font-size:.9em}pre{margin-bottom:1rem;overflow-x:auto}pre code{padding:0;background:none;border-radius:0}:focus{outline:2px solid var(--accent);outline-offset:2px}button:focus,a:focus{outline:2px dashed var(--accent);outline-offset:4px}@media(prefers-reduced-motion:reduce){*{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}
diff --git a/public/css/main.5c9869e05d53e10d15258a314b452f5a95242f4e39dd052c90b7d7b5619c40c4.css b/public/css/main.5c9869e05d53e10d15258a314b452f5a95242f4e39dd052c90b7d7b5619c40c4.css
new file mode 100644 (file)
index 0000000..47a344e
--- /dev/null
@@ -0,0 +1 @@
+@import"https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;600&family=JetBrains+Mono:ital,wght@0,300;0,400;0,500;0,700;1,300&family=Oxanium:wght@700;800&display=swap";:root{--bg: #060b10;--bg2: #0c1520;--surface: #101e2d;--border: #182840;--accent: #a855f7;--accent2: #00ff88;--text: #c4d6e8;--text-dim: #7a9bb8;--muted: #304860;--color-tech: #a855f7;--color-life: #f59e0b;--color-quote: #00ff88;--color-link: #38bdf8;--color-photo: #ec4899;--font-body: "IBM Plex Sans", system-ui, sans-serif;--font-mono: "JetBrains Mono", "Courier New", monospace;--font-head: "Oxanium", sans-serif;--fs-body: .95rem;--fs-nav: .8rem;--fs-badge: .7rem;--fs-btn: .8rem;--fs-h3: 1.5rem;--fs-h2: clamp(1.7rem, 6vw, 3rem);--container-max: 1080px;--container-narrow: 768px;--gap-sm: .5rem;--gap-md: 1.5rem;--gap-lg: 2.5rem;--gap-xl: 4rem;--section-py-mobile: 4rem;--section-py-desktop: 6rem;--card-px-mobile: 1.5rem;--card-px-desktop: 2rem;--transition: all .2s ease;--transition-slow: all .75s cubic-bezier(.16,1,.3,1)}html.theme-light{--bg: #f0f4f8;--bg2: #e2eaf4;--surface: #d4dff0;--border: #a8bdd8;--accent: #7c3aed;--accent2: #008f5a;--text: #0d1b2a;--text-dim: #2e4a6a;--muted: #6888a8}@media(max-width:479px){:root{--bp: "mobile"}}@media(min-width:480px){:root{--bp: "sm"}}@media(min-width:768px){:root{--bp: "md"}}@media(min-width:1200px){:root{--bp: "lg"}}.hero{position:relative;overflow:hidden;padding:var(--section-py-mobile) 1.5rem;background:var(--bg);border-bottom:1px solid var(--border)}@media(min-width:768px){.hero{padding:var(--section-py-desktop) 1.5rem}}#matrix-canvas{position:absolute;inset:0;opacity:.13;pointer-events:none}html.theme-light #matrix-canvas{opacity:.18}.hero-content{position:relative;z-index:1;max-width:var(--container-max);margin:0 auto;display:flex;align-items:center;gap:var(--gap-lg)}.hero-avatar{width:64px;height:64px;border-radius:50%;flex-shrink:0;background:linear-gradient(135deg,var(--accent),var(--accent2));display:flex;align-items:center;justify-content:center;font-family:var(--font-head);font-size:1.4rem;font-weight:800;color:#fff}@media(min-width:768px){.hero-avatar{width:80px;height:80px;font-size:1.8rem}}.hero-text h1{margin-bottom:.25rem}.hero-role{font-family:var(--font-mono);font-size:.85rem;color:var(--accent);letter-spacing:.1em;text-transform:uppercase;margin-bottom:.75rem}.hero-bio{color:var(--text-dim);font-size:.95rem;line-height:1.8;max-width:400px}#matrix-canvas:after{content:"";position:absolute;inset:0;background:repeating-linear-gradient(0deg,rgba(0,0,0,.15),rgba(0,0,0,.15) 1px,transparent 1px,transparent 2px);pointer-events:none}.hero:before{content:"";position:absolute;top:50%;left:50%;width:600px;height:600px;background:radial-gradient(circle,rgba(168,85,247,.15) 0%,transparent 70%);transform:translate(-50%,-50%);pointer-events:none}@media(max-width:768px){.hero-content{flex-direction:column;text-align:center}.hero-bio{max-width:100%}}html{font-size:17px;scroll-behavior:smooth}*{margin:0;padding:0;box-sizing:border-box}body{background-color:var(--bg);color:var(--text);font-family:var(--font-body);font-size:var(--fs-body);line-height:1.95;transition:background-color .2s,color .2s}h1{font-family:var(--font-head);font-size:var(--fs-h2);font-weight:800;line-height:1.1;margin-bottom:.5rem}h2{font-family:var(--font-head);font-size:var(--fs-h2);font-weight:800;line-height:1.1;margin:2rem 0 1rem}h3{font-family:var(--font-head);font-size:var(--fs-h3);font-weight:800;line-height:1.2;margin:1.5rem 0 .75rem}h4,h5,h6{font-family:var(--font-head);font-weight:800;margin:1rem 0 .5rem}p{margin-bottom:1rem}a{color:var(--accent);text-decoration:none;transition:var(--transition)}a:hover{color:var(--accent2)}.container{max-width:var(--container-max);margin:0 auto;padding:0 1.5rem}.container-narrow{max-width:var(--container-narrow);margin:0 auto;padding:0 1.5rem}main{min-height:calc(100vh - 200px)}ul,ol{margin-left:1.5rem;margin-bottom:1rem}li{margin-bottom:.5rem}code{font-family:var(--font-mono);background:var(--surface);padding:.25rem .5rem;border-radius:4px;font-size:.9em}pre{margin-bottom:1rem;overflow-x:auto}pre code{padding:0;background:none;border-radius:0}:focus{outline:2px solid var(--accent);outline-offset:2px}button:focus,a:focus{outline:2px dashed var(--accent);outline-offset:4px}@media(prefers-reduced-motion:reduce){*{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}
diff --git a/public/css/main.8337d7f7e0fbf6083195dbb6bd8ad102187face3b194ff449dc78376ca12e014.css b/public/css/main.8337d7f7e0fbf6083195dbb6bd8ad102187face3b194ff449dc78376ca12e014.css
new file mode 100644 (file)
index 0000000..055b01b
--- /dev/null
@@ -0,0 +1 @@
+@import"https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;600&family=JetBrains+Mono:ital,wght@0,300;0,400;0,500;0,700;1,300&family=Oxanium:wght@700;800&display=swap";:root{--bg: #060b10;--bg2: #0c1520;--surface: #101e2d;--border: #182840;--accent: #a855f7;--accent2: #00ff88;--text: #c4d6e8;--text-dim: #7a9bb8;--muted: #304860;--color-tech: #a855f7;--color-life: #f59e0b;--color-quote: #00ff88;--color-link: #38bdf8;--color-photo: #ec4899;--font-body: "IBM Plex Sans", system-ui, sans-serif;--font-mono: "JetBrains Mono", "Courier New", monospace;--font-head: "Oxanium", sans-serif;--fs-body: .95rem;--fs-nav: .8rem;--fs-badge: .7rem;--fs-btn: .8rem;--fs-h3: 1.5rem;--fs-h2: clamp(1.7rem, 6vw, 3rem);--container-max: 1080px;--container-narrow: 768px;--gap-sm: .5rem;--gap-md: 1.5rem;--gap-lg: 2.5rem;--gap-xl: 4rem;--section-py-mobile: 4rem;--section-py-desktop: 6rem;--card-px-mobile: 1.5rem;--card-px-desktop: 2rem;--transition: all .2s ease;--transition-slow: all .75s cubic-bezier(.16,1,.3,1)}html.theme-light{--bg: #f0f4f8;--bg2: #e2eaf4;--surface: #d4dff0;--border: #a8bdd8;--accent: #7c3aed;--accent2: #008f5a;--text: #0d1b2a;--text-dim: #2e4a6a;--muted: #6888a8}@media(max-width:479px){:root{--bp: "mobile"}}@media(min-width:480px){:root{--bp: "sm"}}@media(min-width:768px){:root{--bp: "md"}}@media(min-width:1200px){:root{--bp: "lg"}}.hero{position:relative;overflow:hidden;padding:var(--section-py-mobile) 1.5rem;background:var(--bg);border-bottom:1px solid var(--border)}@media(min-width:768px){.hero{padding:var(--section-py-desktop) 1.5rem}}#matrix-canvas{position:absolute;inset:0;opacity:.13;pointer-events:none}html.theme-light #matrix-canvas{opacity:.18}.hero-content{position:relative;z-index:1;max-width:var(--container-max);margin:0 auto;display:flex;align-items:center;gap:var(--gap-lg)}.hero-avatar{width:64px;height:64px;border-radius:50%;flex-shrink:0;background:linear-gradient(135deg,var(--accent),var(--accent2));display:flex;align-items:center;justify-content:center;font-family:var(--font-head);font-size:1.4rem;font-weight:800;color:#fff}@media(min-width:768px){.hero-avatar{width:80px;height:80px;font-size:1.8rem}}.hero-text h1{margin-bottom:.25rem}.hero-role{font-family:var(--font-mono);font-size:.85rem;color:var(--accent);letter-spacing:.1em;text-transform:uppercase;margin-bottom:.75rem}.hero-bio{color:var(--text-dim);font-size:.95rem;line-height:1.8;max-width:400px}#matrix-canvas:after{content:"";position:absolute;inset:0;background:repeating-linear-gradient(0deg,rgba(0,0,0,.15),rgba(0,0,0,.15) 1px,transparent 1px,transparent 2px);pointer-events:none}.hero:before{content:"";position:absolute;top:50%;left:50%;width:600px;height:600px;background:radial-gradient(circle,rgba(168,85,247,.15) 0%,transparent 70%);transform:translate(-50%,-50%);pointer-events:none}@media(max-width:768px){.hero-content{flex-direction:column;text-align:center}.hero-bio{max-width:100%}}.post-card{background:var(--surface);border:1px solid var(--border);border-radius:8px;overflow:hidden;transition:var(--transition);display:flex;gap:var(--gap-md)}.post-card:hover{border-color:var(--accent);box-shadow:0 0 20px #a855f733}.post-card-image{width:120px;height:100px;flex-shrink:0;object-fit:cover;background:linear-gradient(135deg,var(--border),var(--bg2));border-right:1px solid var(--border)}@media(min-width:768px){.post-card-image{width:160px;height:120px}}.post-card-body{padding:var(--gap-md);display:flex;flex-direction:column;justify-content:center;flex-grow:1}.post-type-badge{display:inline-block;font-family:var(--font-mono);font-size:var(--fs-badge);font-weight:600;text-transform:uppercase;letter-spacing:.1em;padding:.35rem .7rem;border-radius:20px;margin-bottom:.5rem;width:fit-content}.post-type-badge.tech{background:color-mix(in srgb,var(--color-tech) 15%,transparent);border:1px solid color-mix(in srgb,var(--color-tech) 30%,transparent);color:var(--color-tech)}.post-type-badge.life{background:color-mix(in srgb,var(--color-life) 15%,transparent);border:1px solid color-mix(in srgb,var(--color-life) 30%,transparent);color:var(--color-life)}.post-type-badge.quote{background:color-mix(in srgb,var(--color-quote) 15%,transparent);border:1px solid color-mix(in srgb,var(--color-quote) 30%,transparent);color:var(--color-quote)}.post-type-badge.link{background:color-mix(in srgb,var(--color-link) 15%,transparent);border:1px solid color-mix(in srgb,var(--color-link) 30%,transparent);color:var(--color-link)}.post-type-badge.photo{background:color-mix(in srgb,var(--color-photo) 15%,transparent);border:1px solid color-mix(in srgb,var(--color-photo) 30%,transparent);color:var(--color-photo)}.post-card-title{font-family:var(--font-head);font-size:1.1rem;font-weight:700;line-height:1.3;margin-bottom:.5rem;color:var(--text)}.post-card-title a{color:var(--text);text-decoration:none}.post-card-title a:hover{color:var(--accent)}.post-card-excerpt{color:var(--text-dim);font-size:.9rem;line-height:1.6;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;margin-bottom:.5rem}.post-card-meta{display:flex;gap:1rem;font-family:var(--font-mono);font-size:.75rem;color:var(--muted);text-transform:uppercase;letter-spacing:.08em}.post-card.featured{grid-row:span 2}.post-card.featured .post-card-image{width:100%;height:180px;border-right:none;border-bottom:1px solid var(--border)}.post-card.featured .post-card-body{padding:var(--gap-lg)}@media(max-width:768px){.post-card{flex-direction:column}.post-card-image{width:100%;height:150px;border-right:none;border-bottom:1px solid var(--border)}.post-card.featured .post-card-image{height:150px}}.feed-section{padding:var(--section-py-mobile) 0}@media(min-width:768px){.feed-section{padding:var(--section-py-desktop) 0}}.feed-label{font-family:var(--font-mono);font-size:.75rem;letter-spacing:.15em;text-transform:uppercase;color:var(--accent);margin-bottom:1.5rem}.feed-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:var(--gap-md);margin-bottom:var(--gap-xl)}@media(min-width:768px){.feed-grid{grid-template-columns:repeat(2,1fr)}}@media(min-width:1200px){.feed-grid{grid-template-columns:repeat(3,1fr)}}.feed-list{display:flex;flex-direction:column;gap:var(--gap-md)}.feed-list .post-card{flex-direction:row}.filter-bar{display:flex;gap:var(--gap-sm);margin-bottom:var(--gap-lg);flex-wrap:wrap}.filter-btn{font-family:var(--font-mono);font-size:var(--fs-badge);padding:.4rem 1rem;border:1px solid var(--border);border-radius:20px;background:transparent;color:var(--text-dim);text-transform:uppercase;letter-spacing:.1em;cursor:pointer;transition:var(--transition)}.filter-btn:hover{border-color:var(--accent);color:var(--accent)}.filter-btn.active{background:var(--accent);color:#fff;border-color:var(--accent)}.feed-cta{display:inline-block;padding:.75rem 1.5rem;background:var(--accent);color:#fff;border-radius:4px;font-family:var(--font-mono);font-size:var(--fs-btn);text-transform:uppercase;letter-spacing:.1em;text-decoration:none;transition:var(--transition)}.feed-cta:hover{background:var(--accent2);color:var(--bg)}pre{background:var(--surface);border:1px solid var(--border);border-left:3px solid var(--accent);border-radius:6px;padding:1rem;overflow-x:auto;position:relative;margin:1.5rem 0}pre code{font-family:var(--font-mono);font-size:.9rem;line-height:1.6;color:var(--text)}.highlight{background:var(--surface);border:1px solid var(--border);border-left:3px solid var(--accent);border-radius:6px;padding:1rem;overflow-x:auto;margin:1.5rem 0;position:relative}.highlight code{background:none;padding:0;border-radius:0;color:inherit}.highlight .k,.highlight .kn,.highlight .kp,.highlight .kr{color:#f59e0b}.highlight .kt{color:#a855f7}.highlight .n{color:#c4d6e8}.highlight .na,.highlight .nb{color:#38bdf8}.highlight .nc{color:#a855f7}.highlight .no{color:#0f8}.highlight .nd{color:#f59e0b}.highlight .ni{color:#a855f7}.highlight .ne{color:#f59e0b}.highlight .nf{color:#38bdf8}.highlight .nl,.highlight .nn{color:#a855f7}.highlight .nt{color:#f59e0b}.highlight .nv{color:#c4d6e8}.highlight .s,.highlight .sa,.highlight .sb,.highlight .sc,.highlight .s1,.highlight .s2{color:#0f8}.highlight .se{color:#f59e0b}.highlight .sh{color:#0f8}.highlight .si{color:#f59e0b}.highlight .sx,.highlight .sr,.highlight .ss{color:#0f8}.highlight .m,.highlight .mb,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .il,.highlight .mo{color:#38bdf8}.highlight .o{color:#c4d6e8}.highlight .ow{color:#a855f7}.highlight .c,.highlight .c1,.highlight .ch,.highlight .cm{color:#7a9bb8}.highlight .cp,.highlight .cpf{color:#f59e0b}html.theme-light .highlight{background:var(--surface);border-left-color:var(--accent)}html.theme-light .highlight .c{color:#6a7fa0}.code-copy-btn{position:absolute;top:.75rem;right:.75rem;background:var(--accent);color:#fff;border:none;padding:.4rem .8rem;border-radius:4px;font-family:var(--font-mono);font-size:.75rem;cursor:pointer;opacity:0;transition:var(--transition);text-transform:uppercase;letter-spacing:.08em}.highlight:hover .code-copy-btn,pre:hover .code-copy-btn{opacity:1}.code-copy-btn:hover{background:var(--accent2);color:var(--bg)}.code-copy-btn.copied{background:var(--accent2)}code{font-family:var(--font-mono);background:var(--surface);padding:.25rem .5rem;border-radius:4px;font-size:.9em;color:var(--accent2)}p code{border:1px solid color-mix(in srgb,var(--accent) 20%,transparent)}.reading-progress{position:fixed;top:0;left:0;height:3px;background:linear-gradient(90deg,var(--accent),var(--accent2));width:0%;z-index:200;transition:width .1s ease-out}.article-page .reading-progress,.page-page .reading-progress{display:block}body:not(.scrollable) .reading-progress{display:none}html{font-size:17px;scroll-behavior:smooth}*{margin:0;padding:0;box-sizing:border-box}body{background-color:var(--bg);color:var(--text);font-family:var(--font-body);font-size:var(--fs-body);line-height:1.95;transition:background-color .2s,color .2s}h1{font-family:var(--font-head);font-size:var(--fs-h2);font-weight:800;line-height:1.1;margin-bottom:.5rem}h2{font-family:var(--font-head);font-size:var(--fs-h2);font-weight:800;line-height:1.1;margin:2rem 0 1rem}h3{font-family:var(--font-head);font-size:var(--fs-h3);font-weight:800;line-height:1.2;margin:1.5rem 0 .75rem}h4,h5,h6{font-family:var(--font-head);font-weight:800;margin:1rem 0 .5rem}p{margin-bottom:1rem}a{color:var(--accent);text-decoration:none;transition:var(--transition)}a:hover{color:var(--accent2)}.container{max-width:var(--container-max);margin:0 auto;padding:0 1.5rem}.container-narrow{max-width:var(--container-narrow);margin:0 auto;padding:0 1.5rem}main{min-height:calc(100vh - 200px)}ul,ol{margin-left:1.5rem;margin-bottom:1rem}li{margin-bottom:.5rem}code{font-family:var(--font-mono);background:var(--surface);padding:.25rem .5rem;border-radius:4px;font-size:.9em}pre{margin-bottom:1rem;overflow-x:auto}pre code{padding:0;background:none;border-radius:0}:focus{outline:2px solid var(--accent);outline-offset:2px}button:focus,a:focus{outline:2px dashed var(--accent);outline-offset:4px}@media(prefers-reduced-motion:reduce){*{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}
diff --git a/public/css/main.css b/public/css/main.css
new file mode 100644 (file)
index 0000000..62ed94d
--- /dev/null
@@ -0,0 +1,763 @@
+@import "https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;600&family=JetBrains+Mono:ital,wght@0,300;0,400;0,500;0,700;1,300&family=Oxanium:wght@700;800&display=swap";
+
+/* ns-hugo-imp:/home/danix/Programming/GIT/danix2-hugo-theme/assets/css/variables.css */
+:root {
+  --bg: #060b10;
+  --bg2: #0c1520;
+  --surface: #101e2d;
+  --border: #182840;
+  --accent: #a855f7;
+  --accent2: #00ff88;
+  --text: #c4d6e8;
+  --text-dim: #7a9bb8;
+  --muted: #304860;
+  --color-tech: #a855f7;
+  --color-life: #f59e0b;
+  --color-quote: #00ff88;
+  --color-link: #38bdf8;
+  --color-photo: #ec4899;
+  --font-body:
+    "IBM Plex Sans",
+    system-ui,
+    sans-serif;
+  --font-mono:
+    "JetBrains Mono",
+    "Courier New",
+    monospace;
+  --font-head: "Oxanium", sans-serif;
+  --fs-body: 0.95rem;
+  --fs-nav: 0.8rem;
+  --fs-badge: 0.7rem;
+  --fs-btn: 0.8rem;
+  --fs-h3: 1.5rem;
+  --fs-h2: clamp(1.7rem, 6vw, 3rem);
+  --container-max: 1080px;
+  --container-narrow: 768px;
+  --gap-sm: 0.5rem;
+  --gap-md: 1.5rem;
+  --gap-lg: 2.5rem;
+  --gap-xl: 4rem;
+  --section-py-mobile: 4rem;
+  --section-py-desktop: 6rem;
+  --card-px-mobile: 1.5rem;
+  --card-px-desktop: 2rem;
+  --transition: all 0.2s ease;
+  --transition-slow: all 0.75s cubic-bezier(0.16,1,0.3,1);
+}
+html.theme-light {
+  --bg: #f0f4f8;
+  --bg2: #e2eaf4;
+  --surface: #d4dff0;
+  --border: #a8bdd8;
+  --accent: #7c3aed;
+  --accent2: #008f5a;
+  --text: #0d1b2a;
+  --text-dim: #2e4a6a;
+  --muted: #6888a8;
+}
+@media (max-width: 479px) {
+  :root {
+    --bp: "mobile";
+  }
+}
+@media (min-width: 480px) {
+  :root {
+    --bp: "sm";
+  }
+}
+@media (min-width: 768px) {
+  :root {
+    --bp: "md";
+  }
+}
+@media (min-width: 1200px) {
+  :root {
+    --bp: "lg";
+  }
+}
+
+/* ns-hugo-imp:/home/danix/Programming/GIT/danix2-hugo-theme/assets/css/components/hero.css */
+.hero {
+  position: relative;
+  overflow: hidden;
+  padding: var(--section-py-mobile) 1.5rem;
+  background: var(--bg);
+  border-bottom: 1px solid var(--border);
+}
+@media (min-width: 768px) {
+  .hero {
+    padding: var(--section-py-desktop) 1.5rem;
+  }
+}
+#matrix-canvas {
+  position: absolute;
+  inset: 0;
+  opacity: 0.13;
+  pointer-events: none;
+}
+html.theme-light #matrix-canvas {
+  opacity: 0.18;
+}
+.hero-content {
+  position: relative;
+  z-index: 1;
+  max-width: var(--container-max);
+  margin: 0 auto;
+  display: flex;
+  align-items: center;
+  gap: var(--gap-lg);
+}
+.hero-avatar {
+  width: 64px;
+  height: 64px;
+  border-radius: 50%;
+  flex-shrink: 0;
+  background:
+    linear-gradient(
+      135deg,
+      var(--accent),
+      var(--accent2));
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-family: var(--font-head);
+  font-size: 1.4rem;
+  font-weight: 800;
+  color: #fff;
+}
+@media (min-width: 768px) {
+  .hero-avatar {
+    width: 80px;
+    height: 80px;
+    font-size: 1.8rem;
+  }
+}
+.hero-text h1 {
+  margin-bottom: 0.25rem;
+}
+.hero-role {
+  font-family: var(--font-mono);
+  font-size: 0.85rem;
+  color: var(--accent);
+  letter-spacing: 0.1em;
+  text-transform: uppercase;
+  margin-bottom: 0.75rem;
+}
+.hero-bio {
+  color: var(--text-dim);
+  font-size: 0.95rem;
+  line-height: 1.8;
+  max-width: 400px;
+}
+#matrix-canvas::after {
+  content: "";
+  position: absolute;
+  inset: 0;
+  background:
+    repeating-linear-gradient(
+      0deg,
+      rgba(0, 0, 0, 0.15),
+      rgba(0, 0, 0, 0.15) 1px,
+      transparent 1px,
+      transparent 2px);
+  pointer-events: none;
+}
+.hero::before {
+  content: "";
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 600px;
+  height: 600px;
+  background:
+    radial-gradient(
+      circle,
+      rgba(168, 85, 247, 0.15) 0%,
+      transparent 70%);
+  transform: translate(-50%, -50%);
+  pointer-events: none;
+}
+@media (max-width: 768px) {
+  .hero-content {
+    flex-direction: column;
+    text-align: center;
+  }
+  .hero-bio {
+    max-width: 100%;
+  }
+}
+
+/* ns-hugo-imp:/home/danix/Programming/GIT/danix2-hugo-theme/assets/css/components/card.css */
+.post-card {
+  background: var(--surface);
+  border: 1px solid var(--border);
+  border-radius: 8px;
+  overflow: hidden;
+  transition: var(--transition);
+  display: flex;
+  gap: var(--gap-md);
+}
+.post-card:hover {
+  border-color: var(--accent);
+  box-shadow: 0 0 20px rgba(168, 85, 247, 0.2);
+}
+.post-card-image {
+  width: 120px;
+  height: 100px;
+  flex-shrink: 0;
+  object-fit: cover;
+  background:
+    linear-gradient(
+      135deg,
+      var(--border),
+      var(--bg2));
+  border-right: 1px solid var(--border);
+}
+@media (min-width: 768px) {
+  .post-card-image {
+    width: 160px;
+    height: 120px;
+  }
+}
+.post-card-body {
+  padding: var(--gap-md);
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  flex-grow: 1;
+}
+.post-type-badge {
+  display: inline-block;
+  font-family: var(--font-mono);
+  font-size: var(--fs-badge);
+  font-weight: 600;
+  text-transform: uppercase;
+  letter-spacing: 0.1em;
+  padding: 0.35rem 0.7rem;
+  border-radius: 20px;
+  margin-bottom: 0.5rem;
+  width: fit-content;
+}
+.post-type-badge.tech {
+  background: color-mix(in srgb, var(--color-tech) 15%, transparent);
+  border: 1px solid color-mix(in srgb, var(--color-tech) 30%, transparent);
+  color: var(--color-tech);
+}
+.post-type-badge.life {
+  background: color-mix(in srgb, var(--color-life) 15%, transparent);
+  border: 1px solid color-mix(in srgb, var(--color-life) 30%, transparent);
+  color: var(--color-life);
+}
+.post-type-badge.quote {
+  background: color-mix(in srgb, var(--color-quote) 15%, transparent);
+  border: 1px solid color-mix(in srgb, var(--color-quote) 30%, transparent);
+  color: var(--color-quote);
+}
+.post-type-badge.link {
+  background: color-mix(in srgb, var(--color-link) 15%, transparent);
+  border: 1px solid color-mix(in srgb, var(--color-link) 30%, transparent);
+  color: var(--color-link);
+}
+.post-type-badge.photo {
+  background: color-mix(in srgb, var(--color-photo) 15%, transparent);
+  border: 1px solid color-mix(in srgb, var(--color-photo) 30%, transparent);
+  color: var(--color-photo);
+}
+.post-card-title {
+  font-family: var(--font-head);
+  font-size: 1.1rem;
+  font-weight: 700;
+  line-height: 1.3;
+  margin-bottom: 0.5rem;
+  color: var(--text);
+}
+.post-card-title a {
+  color: var(--text);
+  text-decoration: none;
+}
+.post-card-title a:hover {
+  color: var(--accent);
+}
+.post-card-excerpt {
+  color: var(--text-dim);
+  font-size: 0.9rem;
+  line-height: 1.6;
+  display: -webkit-box;
+  -webkit-line-clamp: 2;
+  -webkit-box-orient: vertical;
+  overflow: hidden;
+  margin-bottom: 0.5rem;
+}
+.post-card-meta {
+  display: flex;
+  gap: 1rem;
+  font-family: var(--font-mono);
+  font-size: 0.75rem;
+  color: var(--muted);
+  text-transform: uppercase;
+  letter-spacing: 0.08em;
+}
+.post-card.featured {
+  grid-row: span 2;
+}
+.post-card.featured .post-card-image {
+  width: 100%;
+  height: 180px;
+  border-right: none;
+  border-bottom: 1px solid var(--border);
+}
+.post-card.featured .post-card-body {
+  padding: var(--gap-lg);
+}
+@media (max-width: 768px) {
+  .post-card {
+    flex-direction: column;
+  }
+  .post-card-image {
+    width: 100%;
+    height: 150px;
+    border-right: none;
+    border-bottom: 1px solid var(--border);
+  }
+  .post-card.featured .post-card-image {
+    height: 150px;
+  }
+}
+
+/* ns-hugo-imp:/home/danix/Programming/GIT/danix2-hugo-theme/assets/css/components/feed.css */
+.feed-section {
+  padding: var(--section-py-mobile) 0;
+}
+@media (min-width: 768px) {
+  .feed-section {
+    padding: var(--section-py-desktop) 0;
+  }
+}
+.feed-label {
+  font-family: var(--font-mono);
+  font-size: 0.75rem;
+  letter-spacing: 0.15em;
+  text-transform: uppercase;
+  color: var(--accent);
+  margin-bottom: 1.5rem;
+}
+.feed-grid {
+  display: grid;
+  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
+  gap: var(--gap-md);
+  margin-bottom: var(--gap-xl);
+}
+@media (min-width: 768px) {
+  .feed-grid {
+    grid-template-columns: repeat(2, 1fr);
+  }
+}
+@media (min-width: 1200px) {
+  .feed-grid {
+    grid-template-columns: repeat(3, 1fr);
+  }
+}
+.feed-list {
+  display: flex;
+  flex-direction: column;
+  gap: var(--gap-md);
+}
+.feed-list .post-card {
+  flex-direction: row;
+}
+.filter-bar {
+  display: flex;
+  gap: var(--gap-sm);
+  margin-bottom: var(--gap-lg);
+  flex-wrap: wrap;
+}
+.filter-btn {
+  font-family: var(--font-mono);
+  font-size: var(--fs-badge);
+  padding: 0.4rem 1rem;
+  border: 1px solid var(--border);
+  border-radius: 20px;
+  background: transparent;
+  color: var(--text-dim);
+  text-transform: uppercase;
+  letter-spacing: 0.1em;
+  cursor: pointer;
+  transition: var(--transition);
+}
+.filter-btn:hover {
+  border-color: var(--accent);
+  color: var(--accent);
+}
+.filter-btn.active {
+  background: var(--accent);
+  color: #fff;
+  border-color: var(--accent);
+}
+.feed-cta {
+  display: inline-block;
+  padding: 0.75rem 1.5rem;
+  background: var(--accent);
+  color: #fff;
+  border-radius: 4px;
+  font-family: var(--font-mono);
+  font-size: var(--fs-btn);
+  text-transform: uppercase;
+  letter-spacing: 0.1em;
+  text-decoration: none;
+  transition: var(--transition);
+}
+.feed-cta:hover {
+  background: var(--accent2);
+  color: var(--bg);
+}
+
+/* ns-hugo-imp:/home/danix/Programming/GIT/danix2-hugo-theme/assets/css/components/code.css */
+pre {
+  background: var(--surface);
+  border: 1px solid var(--border);
+  border-left: 3px solid var(--accent);
+  border-radius: 6px;
+  padding: 1rem;
+  overflow-x: auto;
+  position: relative;
+  margin: 1.5rem 0;
+}
+pre code {
+  font-family: var(--font-mono);
+  font-size: 0.9rem;
+  line-height: 1.6;
+  color: var(--text);
+}
+.highlight {
+  background: var(--surface);
+  border: 1px solid var(--border);
+  border-left: 3px solid var(--accent);
+  border-radius: 6px;
+  padding: 1rem;
+  overflow-x: auto;
+  margin: 1.5rem 0;
+  position: relative;
+}
+.highlight code {
+  background: none;
+  padding: 0;
+  border-radius: 0;
+  color: inherit;
+}
+.highlight .k {
+  color: #f59e0b;
+}
+.highlight .kn {
+  color: #f59e0b;
+}
+.highlight .kp {
+  color: #f59e0b;
+}
+.highlight .kr {
+  color: #f59e0b;
+}
+.highlight .kt {
+  color: #a855f7;
+}
+.highlight .n {
+  color: #c4d6e8;
+}
+.highlight .na {
+  color: #38bdf8;
+}
+.highlight .nb {
+  color: #38bdf8;
+}
+.highlight .nc {
+  color: #a855f7;
+}
+.highlight .no {
+  color: #00ff88;
+}
+.highlight .nd {
+  color: #f59e0b;
+}
+.highlight .ni {
+  color: #a855f7;
+}
+.highlight .ne {
+  color: #f59e0b;
+}
+.highlight .nf {
+  color: #38bdf8;
+}
+.highlight .nl {
+  color: #a855f7;
+}
+.highlight .nn {
+  color: #a855f7;
+}
+.highlight .nt {
+  color: #f59e0b;
+}
+.highlight .nv {
+  color: #c4d6e8;
+}
+.highlight .s {
+  color: #00ff88;
+}
+.highlight .sa {
+  color: #00ff88;
+}
+.highlight .sb {
+  color: #00ff88;
+}
+.highlight .sc {
+  color: #00ff88;
+}
+.highlight .s1 {
+  color: #00ff88;
+}
+.highlight .s2 {
+  color: #00ff88;
+}
+.highlight .se {
+  color: #f59e0b;
+}
+.highlight .sh {
+  color: #00ff88;
+}
+.highlight .si {
+  color: #f59e0b;
+}
+.highlight .sx {
+  color: #00ff88;
+}
+.highlight .sr {
+  color: #00ff88;
+}
+.highlight .ss {
+  color: #00ff88;
+}
+.highlight .m {
+  color: #38bdf8;
+}
+.highlight .mb {
+  color: #38bdf8;
+}
+.highlight .mf {
+  color: #38bdf8;
+}
+.highlight .mh {
+  color: #38bdf8;
+}
+.highlight .mi {
+  color: #38bdf8;
+}
+.highlight .il {
+  color: #38bdf8;
+}
+.highlight .mo {
+  color: #38bdf8;
+}
+.highlight .o {
+  color: #c4d6e8;
+}
+.highlight .ow {
+  color: #a855f7;
+}
+.highlight .c {
+  color: #7a9bb8;
+}
+.highlight .c1 {
+  color: #7a9bb8;
+}
+.highlight .ch {
+  color: #7a9bb8;
+}
+.highlight .cm {
+  color: #7a9bb8;
+}
+.highlight .cp {
+  color: #f59e0b;
+}
+.highlight .cpf {
+  color: #f59e0b;
+}
+html.theme-light .highlight {
+  background: var(--surface);
+  border-left-color: var(--accent);
+}
+html.theme-light .highlight .c {
+  color: #6a7fa0;
+}
+.code-copy-btn {
+  position: absolute;
+  top: 0.75rem;
+  right: 0.75rem;
+  background: var(--accent);
+  color: #fff;
+  border: none;
+  padding: 0.4rem 0.8rem;
+  border-radius: 4px;
+  font-family: var(--font-mono);
+  font-size: 0.75rem;
+  cursor: pointer;
+  opacity: 0;
+  transition: var(--transition);
+  text-transform: uppercase;
+  letter-spacing: 0.08em;
+}
+.highlight:hover .code-copy-btn,
+pre:hover .code-copy-btn {
+  opacity: 1;
+}
+.code-copy-btn:hover {
+  background: var(--accent2);
+  color: var(--bg);
+}
+.code-copy-btn.copied {
+  background: var(--accent2);
+}
+code {
+  font-family: var(--font-mono);
+  background: var(--surface);
+  padding: 0.25rem 0.5rem;
+  border-radius: 4px;
+  font-size: 0.9em;
+  color: var(--accent2);
+}
+p code {
+  border: 1px solid color-mix(in srgb, var(--accent) 20%, transparent);
+}
+
+/* ns-hugo-imp:/home/danix/Programming/GIT/danix2-hugo-theme/assets/css/components/progress-bar.css */
+.reading-progress {
+  position: fixed;
+  top: 0;
+  left: 0;
+  height: 3px;
+  background:
+    linear-gradient(
+      90deg,
+      var(--accent),
+      var(--accent2));
+  width: 0%;
+  z-index: 200;
+  transition: width 0.1s ease-out;
+}
+.article-page .reading-progress,
+.page-page .reading-progress {
+  display: block;
+}
+body:not(.scrollable) .reading-progress {
+  display: none;
+}
+
+/* <stdin> */
+html {
+  font-size: 17px;
+  scroll-behavior: smooth;
+}
+* {
+  margin: 0;
+  padding: 0;
+  box-sizing: border-box;
+}
+body {
+  background-color: var(--bg);
+  color: var(--text);
+  font-family: var(--font-body);
+  font-size: var(--fs-body);
+  line-height: 1.95;
+  transition: background-color 0.2s, color 0.2s;
+}
+h1 {
+  font-family: var(--font-head);
+  font-size: var(--fs-h2);
+  font-weight: 800;
+  line-height: 1.1;
+  margin-bottom: 0.5rem;
+}
+h2 {
+  font-family: var(--font-head);
+  font-size: var(--fs-h2);
+  font-weight: 800;
+  line-height: 1.1;
+  margin: 2rem 0 1rem;
+}
+h3 {
+  font-family: var(--font-head);
+  font-size: var(--fs-h3);
+  font-weight: 800;
+  line-height: 1.2;
+  margin: 1.5rem 0 0.75rem;
+}
+h4,
+h5,
+h6 {
+  font-family: var(--font-head);
+  font-weight: 800;
+  margin: 1rem 0 0.5rem;
+}
+p {
+  margin-bottom: 1rem;
+}
+a {
+  color: var(--accent);
+  text-decoration: none;
+  transition: var(--transition);
+}
+a:hover {
+  color: var(--accent2);
+}
+.container {
+  max-width: var(--container-max);
+  margin: 0 auto;
+  padding: 0 1.5rem;
+}
+.container-narrow {
+  max-width: var(--container-narrow);
+  margin: 0 auto;
+  padding: 0 1.5rem;
+}
+main {
+  min-height: calc(100vh - 200px);
+}
+ul,
+ol {
+  margin-left: 1.5rem;
+  margin-bottom: 1rem;
+}
+li {
+  margin-bottom: 0.5rem;
+}
+code {
+  font-family: var(--font-mono);
+  background: var(--surface);
+  padding: 0.25rem 0.5rem;
+  border-radius: 4px;
+  font-size: 0.9em;
+}
+pre {
+  margin-bottom: 1rem;
+  overflow-x: auto;
+}
+pre code {
+  padding: 0;
+  background: none;
+  border-radius: 0;
+}
+:focus {
+  outline: 2px solid var(--accent);
+  outline-offset: 2px;
+}
+button:focus,
+a:focus {
+  outline: 2px dashed var(--accent);
+  outline-offset: 4px;
+}
+@media (prefers-reduced-motion: reduce) {
+  * {
+    animation-duration: 0.01ms !important;
+    animation-iteration-count: 1 !important;
+    transition-duration: 0.01ms !important;
+    scroll-behavior: auto !important;
+  }
+}
+/*# sourceMappingURL=main.css.map */
diff --git a/public/css/main.css.map b/public/css/main.css.map
new file mode 100644 (file)
index 0000000..3009431
--- /dev/null
@@ -0,0 +1 @@
+{"version":3,"sources":["file:///home/danix/Programming/GIT/danix2-hugo-theme/assets/css/variables.css","file:///home/danix/Programming/GIT/danix2-hugo-theme/assets/css/components/hero.css","file:///home/danix/Programming/GIT/danix2-hugo-theme/assets/css/components/card.css","file:///home/danix/Programming/GIT/danix2-hugo-theme/assets/css/components/feed.css","file:///home/danix/Programming/GIT/danix2-hugo-theme/assets/css/components/code.css","file:///home/danix/Programming/GIT/danix2-hugo-theme/assets/css/components/progress-bar.css","file:///home/danix/Programming/GIT/danix2-hugo-theme/assets/css/main.css"],"sourcesContent":["/* variables.css */\n\n:root {\n  /* Dark theme colors (default) */\n  --bg:          #060b10;\n  --bg2:         #0c1520;\n  --surface:     #101e2d;\n  --border:      #182840;\n  --accent:      #a855f7;\n  --accent2:     #00ff88;\n  --text:        #c4d6e8;\n  --text-dim:    #7a9bb8;\n  --muted:       #304860;\n\n  /* Type colors */\n  --color-tech:   #a855f7;  /* purple */\n  --color-life:   #f59e0b;  /* amber */\n  --color-quote:  #00ff88;  /* green */\n  --color-link:   #38bdf8;  /* cyan */\n  --color-photo:  #ec4899;  /* pink */\n\n  /* Typography */\n  --font-body:  'IBM Plex Sans', system-ui, sans-serif;\n  --font-mono:  'JetBrains Mono', 'Courier New', monospace;\n  --font-head:  'Oxanium', sans-serif;\n\n  /* Font sizes (base: 17px on html) */\n  --fs-body:    0.95rem;\n  --fs-nav:     0.8rem;\n  --fs-badge:   0.7rem;\n  --fs-btn:     0.8rem;\n  --fs-h3:      1.5rem;\n  --fs-h2:      clamp(1.7rem, 6vw, 3rem);\n\n  /* Layout */\n  --container-max: 1080px;\n  --container-narrow: 768px;\n  --gap-sm:     0.5rem;\n  --gap-md:     1.5rem;\n  --gap-lg:     2.5rem;\n  --gap-xl:     4rem;\n\n  /* Spacing */\n  --section-py-mobile:   4rem;\n  --section-py-desktop:  6rem;\n  --card-px-mobile:      1.5rem;\n  --card-px-desktop:     2rem;\n\n  /* Transitions */\n  --transition: all 0.2s ease;\n  --transition-slow: all 0.75s cubic-bezier(0.16,1,0.3,1);\n}\n\nhtml.theme-light {\n  /* Light theme */\n  --bg:          #f0f4f8;\n  --bg2:         #e2eaf4;\n  --surface:     #d4dff0;\n  --border:      #a8bdd8;\n  --accent:      #7c3aed;\n  --accent2:     #008f5a;\n  --text:        #0d1b2a;\n  --text-dim:    #2e4a6a;\n  --muted:       #6888a8;\n}\n\n/* Breakpoints as CSS variables for reference */\n@media (max-width: 479px) {\n  :root {\n    --bp: \"mobile\";\n  }\n}\n\n@media (min-width: 480px) {\n  :root {\n    --bp: \"sm\";\n  }\n}\n\n@media (min-width: 768px) {\n  :root {\n    --bp: \"md\";\n  }\n}\n\n@media (min-width: 1200px) {\n  :root {\n    --bp: \"lg\";\n  }\n}\n","/* hero.css */\n.hero {\n  position: relative;\n  overflow: hidden;\n  padding: var(--section-py-mobile) 1.5rem;\n  background: var(--bg);\n  border-bottom: 1px solid var(--border);\n}\n\n@media (min-width: 768px) {\n  .hero {\n    padding: var(--section-py-desktop) 1.5rem;\n  }\n}\n\n#matrix-canvas {\n  position: absolute;\n  inset: 0;\n  opacity: 0.13;\n  pointer-events: none;\n}\n\nhtml.theme-light #matrix-canvas {\n  opacity: 0.18;\n}\n\n.hero-content {\n  position: relative;\n  z-index: 1;\n  max-width: var(--container-max);\n  margin: 0 auto;\n  display: flex;\n  align-items: center;\n  gap: var(--gap-lg);\n}\n\n.hero-avatar {\n  width: 64px;\n  height: 64px;\n  border-radius: 50%;\n  flex-shrink: 0;\n  background: linear-gradient(135deg, var(--accent), var(--accent2));\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  font-family: var(--font-head);\n  font-size: 1.4rem;\n  font-weight: 800;\n  color: #fff;\n}\n\n@media (min-width: 768px) {\n  .hero-avatar {\n    width: 80px;\n    height: 80px;\n    font-size: 1.8rem;\n  }\n}\n\n.hero-text h1 {\n  margin-bottom: 0.25rem;\n}\n\n.hero-role {\n  font-family: var(--font-mono);\n  font-size: 0.85rem;\n  color: var(--accent);\n  letter-spacing: 0.1em;\n  text-transform: uppercase;\n  margin-bottom: 0.75rem;\n}\n\n.hero-bio {\n  color: var(--text-dim);\n  font-size: 0.95rem;\n  line-height: 1.8;\n  max-width: 400px;\n}\n\n/* Scanlines effect on canvas */\n#matrix-canvas::after {\n  content: '';\n  position: absolute;\n  inset: 0;\n  background: repeating-linear-gradient(\n    0deg,\n    rgba(0, 0, 0, 0.15),\n    rgba(0, 0, 0, 0.15) 1px,\n    transparent 1px,\n    transparent 2px\n  );\n  pointer-events: none;\n}\n\n/* Ambient glow behind hero */\n.hero::before {\n  content: '';\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  width: 600px;\n  height: 600px;\n  background: radial-gradient(circle, rgba(168, 85, 247, 0.15) 0%, transparent 70%);\n  transform: translate(-50%, -50%);\n  pointer-events: none;\n}\n\n@media (max-width: 768px) {\n  .hero-content {\n    flex-direction: column;\n    text-align: center;\n  }\n\n  .hero-bio {\n    max-width: 100%;\n  }\n}\n","/* card.css */\n.post-card {\n  background: var(--surface);\n  border: 1px solid var(--border);\n  border-radius: 8px;\n  overflow: hidden;\n  transition: var(--transition);\n  display: flex;\n  gap: var(--gap-md);\n}\n\n.post-card:hover {\n  border-color: var(--accent);\n  box-shadow: 0 0 20px rgba(168, 85, 247, 0.2);\n}\n\n.post-card-image {\n  width: 120px;\n  height: 100px;\n  flex-shrink: 0;\n  object-fit: cover;\n  background: linear-gradient(135deg, var(--border), var(--bg2));\n  border-right: 1px solid var(--border);\n}\n\n@media (min-width: 768px) {\n  .post-card-image {\n    width: 160px;\n    height: 120px;\n  }\n}\n\n.post-card-body {\n  padding: var(--gap-md);\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  flex-grow: 1;\n}\n\n.post-type-badge {\n  display: inline-block;\n  font-family: var(--font-mono);\n  font-size: var(--fs-badge);\n  font-weight: 600;\n  text-transform: uppercase;\n  letter-spacing: 0.1em;\n  padding: 0.35rem 0.7rem;\n  border-radius: 20px;\n  margin-bottom: 0.5rem;\n  width: fit-content;\n}\n\n/* Type-specific badge colors */\n.post-type-badge.tech {\n  background: color-mix(in srgb, var(--color-tech) 15%, transparent);\n  border: 1px solid color-mix(in srgb, var(--color-tech) 30%, transparent);\n  color: var(--color-tech);\n}\n\n.post-type-badge.life {\n  background: color-mix(in srgb, var(--color-life) 15%, transparent);\n  border: 1px solid color-mix(in srgb, var(--color-life) 30%, transparent);\n  color: var(--color-life);\n}\n\n.post-type-badge.quote {\n  background: color-mix(in srgb, var(--color-quote) 15%, transparent);\n  border: 1px solid color-mix(in srgb, var(--color-quote) 30%, transparent);\n  color: var(--color-quote);\n}\n\n.post-type-badge.link {\n  background: color-mix(in srgb, var(--color-link) 15%, transparent);\n  border: 1px solid color-mix(in srgb, var(--color-link) 30%, transparent);\n  color: var(--color-link);\n}\n\n.post-type-badge.photo {\n  background: color-mix(in srgb, var(--color-photo) 15%, transparent);\n  border: 1px solid color-mix(in srgb, var(--color-photo) 30%, transparent);\n  color: var(--color-photo);\n}\n\n.post-card-title {\n  font-family: var(--font-head);\n  font-size: 1.1rem;\n  font-weight: 700;\n  line-height: 1.3;\n  margin-bottom: 0.5rem;\n  color: var(--text);\n}\n\n.post-card-title a {\n  color: var(--text);\n  text-decoration: none;\n}\n\n.post-card-title a:hover {\n  color: var(--accent);\n}\n\n.post-card-excerpt {\n  color: var(--text-dim);\n  font-size: 0.9rem;\n  line-height: 1.6;\n  display: -webkit-box;\n  -webkit-line-clamp: 2;\n  -webkit-box-orient: vertical;\n  overflow: hidden;\n  margin-bottom: 0.5rem;\n}\n\n.post-card-meta {\n  display: flex;\n  gap: 1rem;\n  font-family: var(--font-mono);\n  font-size: 0.75rem;\n  color: var(--muted);\n  text-transform: uppercase;\n  letter-spacing: 0.08em;\n}\n\n/* Featured card in grid */\n.post-card.featured {\n  grid-row: span 2;\n}\n\n.post-card.featured .post-card-image {\n  width: 100%;\n  height: 180px;\n  border-right: none;\n  border-bottom: 1px solid var(--border);\n}\n\n.post-card.featured .post-card-body {\n  padding: var(--gap-lg);\n}\n\n@media (max-width: 768px) {\n  .post-card {\n    flex-direction: column;\n  }\n\n  .post-card-image {\n    width: 100%;\n    height: 150px;\n    border-right: none;\n    border-bottom: 1px solid var(--border);\n  }\n\n  .post-card.featured .post-card-image {\n    height: 150px;\n  }\n}\n","/* feed.css */\n.feed-section {\n  padding: var(--section-py-mobile) 0;\n}\n\n@media (min-width: 768px) {\n  .feed-section {\n    padding: var(--section-py-desktop) 0;\n  }\n}\n\n.feed-label {\n  font-family: var(--font-mono);\n  font-size: 0.75rem;\n  letter-spacing: 0.15em;\n  text-transform: uppercase;\n  color: var(--accent);\n  margin-bottom: 1.5rem;\n}\n\n.feed-grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n  gap: var(--gap-md);\n  margin-bottom: var(--gap-xl);\n}\n\n@media (min-width: 768px) {\n  .feed-grid {\n    grid-template-columns: repeat(2, 1fr);\n  }\n}\n\n@media (min-width: 1200px) {\n  .feed-grid {\n    grid-template-columns: repeat(3, 1fr);\n  }\n}\n\n.feed-list {\n  display: flex;\n  flex-direction: column;\n  gap: var(--gap-md);\n}\n\n.feed-list .post-card {\n  flex-direction: row;\n}\n\n/* Filter bar */\n.filter-bar {\n  display: flex;\n  gap: var(--gap-sm);\n  margin-bottom: var(--gap-lg);\n  flex-wrap: wrap;\n}\n\n.filter-btn {\n  font-family: var(--font-mono);\n  font-size: var(--fs-badge);\n  padding: 0.4rem 1rem;\n  border: 1px solid var(--border);\n  border-radius: 20px;\n  background: transparent;\n  color: var(--text-dim);\n  text-transform: uppercase;\n  letter-spacing: 0.1em;\n  cursor: pointer;\n  transition: var(--transition);\n}\n\n.filter-btn:hover {\n  border-color: var(--accent);\n  color: var(--accent);\n}\n\n.filter-btn.active {\n  background: var(--accent);\n  color: #fff;\n  border-color: var(--accent);\n}\n\n/* View all link */\n.feed-cta {\n  display: inline-block;\n  padding: 0.75rem 1.5rem;\n  background: var(--accent);\n  color: #fff;\n  border-radius: 4px;\n  font-family: var(--font-mono);\n  font-size: var(--fs-btn);\n  text-transform: uppercase;\n  letter-spacing: 0.1em;\n  text-decoration: none;\n  transition: var(--transition);\n}\n\n.feed-cta:hover {\n  background: var(--accent2);\n  color: var(--bg);\n}\n","/* code.css */\npre {\n  background: var(--surface);\n  border: 1px solid var(--border);\n  border-left: 3px solid var(--accent);\n  border-radius: 6px;\n  padding: 1rem;\n  overflow-x: auto;\n  position: relative;\n  margin: 1.5rem 0;\n}\n\npre code {\n  font-family: var(--font-mono);\n  font-size: 0.9rem;\n  line-height: 1.6;\n  color: var(--text);\n}\n\n/* Chroma syntax highlighting */\n.highlight {\n  background: var(--surface);\n  border: 1px solid var(--border);\n  border-left: 3px solid var(--accent);\n  border-radius: 6px;\n  padding: 1rem;\n  overflow-x: auto;\n  margin: 1.5rem 0;\n  position: relative;\n}\n\n.highlight code {\n  background: none;\n  padding: 0;\n  border-radius: 0;\n  color: inherit;\n}\n\n/* Chroma color overrides for dark theme */\n.highlight .k { color: #f59e0b; }\n.highlight .kn { color: #f59e0b; }\n.highlight .kp { color: #f59e0b; }\n.highlight .kr { color: #f59e0b; }\n.highlight .kt { color: #a855f7; }\n.highlight .n { color: #c4d6e8; }\n.highlight .na { color: #38bdf8; }\n.highlight .nb { color: #38bdf8; }\n.highlight .nc { color: #a855f7; }\n.highlight .no { color: #00ff88; }\n.highlight .nd { color: #f59e0b; }\n.highlight .ni { color: #a855f7; }\n.highlight .ne { color: #f59e0b; }\n.highlight .nf { color: #38bdf8; }\n.highlight .nl { color: #a855f7; }\n.highlight .nn { color: #a855f7; }\n.highlight .nt { color: #f59e0b; }\n.highlight .nv { color: #c4d6e8; }\n.highlight .s { color: #00ff88; }\n.highlight .sa { color: #00ff88; }\n.highlight .sb { color: #00ff88; }\n.highlight .sc { color: #00ff88; }\n.highlight .s1 { color: #00ff88; }\n.highlight .s2 { color: #00ff88; }\n.highlight .se { color: #f59e0b; }\n.highlight .sh { color: #00ff88; }\n.highlight .si { color: #f59e0b; }\n.highlight .sx { color: #00ff88; }\n.highlight .sr { color: #00ff88; }\n.highlight .ss { color: #00ff88; }\n.highlight .m { color: #38bdf8; }\n.highlight .mb { color: #38bdf8; }\n.highlight .mf { color: #38bdf8; }\n.highlight .mh { color: #38bdf8; }\n.highlight .mi { color: #38bdf8; }\n.highlight .il { color: #38bdf8; }\n.highlight .mo { color: #38bdf8; }\n.highlight .o { color: #c4d6e8; }\n.highlight .ow { color: #a855f7; }\n.highlight .c { color: #7a9bb8; }\n.highlight .c1 { color: #7a9bb8; }\n.highlight .ch { color: #7a9bb8; }\n.highlight .cm { color: #7a9bb8; }\n.highlight .cp { color: #f59e0b; }\n.highlight .cpf { color: #f59e0b; }\n\nhtml.theme-light .highlight {\n  background: var(--surface);\n  border-left-color: var(--accent);\n}\n\nhtml.theme-light .highlight .c { color: #6a7fa0; }\n\n/* Copy button for code blocks */\n.code-copy-btn {\n  position: absolute;\n  top: 0.75rem;\n  right: 0.75rem;\n  background: var(--accent);\n  color: #fff;\n  border: none;\n  padding: 0.4rem 0.8rem;\n  border-radius: 4px;\n  font-family: var(--font-mono);\n  font-size: 0.75rem;\n  cursor: pointer;\n  opacity: 0;\n  transition: var(--transition);\n  text-transform: uppercase;\n  letter-spacing: 0.08em;\n}\n\n.highlight:hover .code-copy-btn,\npre:hover .code-copy-btn {\n  opacity: 1;\n}\n\n.code-copy-btn:hover {\n  background: var(--accent2);\n  color: var(--bg);\n}\n\n.code-copy-btn.copied {\n  background: var(--accent2);\n}\n\n/* Inline code */\ncode {\n  font-family: var(--font-mono);\n  background: var(--surface);\n  padding: 0.25rem 0.5rem;\n  border-radius: 4px;\n  font-size: 0.9em;\n  color: var(--accent2);\n}\n\np code {\n  border: 1px solid color-mix(in srgb, var(--accent) 20%, transparent);\n}\n","/* progress-bar.css */\n.reading-progress {\n  position: fixed;\n  top: 0;\n  left: 0;\n  height: 3px;\n  background: linear-gradient(90deg, var(--accent), var(--accent2));\n  width: 0%;\n  z-index: 200;\n  transition: width 0.1s ease-out;\n}\n\n/* Only show on pages with sufficient content */\n.article-page .reading-progress,\n.page-page .reading-progress {\n  display: block;\n}\n\n/* Hide if no scrollable content */\nbody:not(.scrollable) .reading-progress {\n  display: none;\n}\n","@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;600\u0026family=JetBrains+Mono:ital,wght@0,300;0,400;0,500;0,700;1,300\u0026family=Oxanium:wght@700;800\u0026display=swap');\n\n@import 'variables.css';\n@import 'components/hero.css';\n@import 'components/card.css';\n@import 'components/feed.css';\n@import 'components/code.css';\n@import 'components/progress-bar.css';\n\n/* Base Styles */\nhtml {\n  font-size: 17px;\n  scroll-behavior: smooth;\n}\n\n* {\n  margin: 0;\n  padding: 0;\n  box-sizing: border-box;\n}\n\nbody {\n  background-color: var(--bg);\n  color: var(--text);\n  font-family: var(--font-body);\n  font-size: var(--fs-body);\n  line-height: 1.95;\n  transition: background-color 0.2s, color 0.2s;\n}\n\n/* Typography */\nh1 {\n  font-family: var(--font-head);\n  font-size: var(--fs-h2);\n  font-weight: 800;\n  line-height: 1.1;\n  margin-bottom: 0.5rem;\n}\n\nh2 {\n  font-family: var(--font-head);\n  font-size: var(--fs-h2);\n  font-weight: 800;\n  line-height: 1.1;\n  margin: 2rem 0 1rem;\n}\n\nh3 {\n  font-family: var(--font-head);\n  font-size: var(--fs-h3);\n  font-weight: 800;\n  line-height: 1.2;\n  margin: 1.5rem 0 0.75rem;\n}\n\nh4, h5, h6 {\n  font-family: var(--font-head);\n  font-weight: 800;\n  margin: 1rem 0 0.5rem;\n}\n\np {\n  margin-bottom: 1rem;\n}\n\na {\n  color: var(--accent);\n  text-decoration: none;\n  transition: var(--transition);\n}\n\na:hover {\n  color: var(--accent2);\n}\n\n/* Utilities */\n.container {\n  max-width: var(--container-max);\n  margin: 0 auto;\n  padding: 0 1.5rem;\n}\n\n.container-narrow {\n  max-width: var(--container-narrow);\n  margin: 0 auto;\n  padding: 0 1.5rem;\n}\n\nmain {\n  min-height: calc(100vh - 200px);\n}\n\n/* Lists */\nul, ol {\n  margin-left: 1.5rem;\n  margin-bottom: 1rem;\n}\n\nli {\n  margin-bottom: 0.5rem;\n}\n\ncode {\n  font-family: var(--font-mono);\n  background: var(--surface);\n  padding: 0.25rem 0.5rem;\n  border-radius: 4px;\n  font-size: 0.9em;\n}\n\npre {\n  margin-bottom: 1rem;\n  overflow-x: auto;\n}\n\npre code {\n  padding: 0;\n  background: none;\n  border-radius: 0;\n}\n\n/* Focus styles for accessibility */\n:focus {\n  outline: 2px solid var(--accent);\n  outline-offset: 2px;\n}\n\nbutton:focus,\na:focus {\n  outline: 2px dashed var(--accent);\n  outline-offset: 4px;\n}\n\n/* Reduced motion support */\n@media (prefers-reduced-motion: reduce) {\n  * {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}\n"],"mappings":"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","names":[]}
\ No newline at end of file
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644 (file)
index 0000000..67f8b77
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/index.html b/public/index.html
new file mode 100644 (file)
index 0000000..3a4a913
--- /dev/null
@@ -0,0 +1,100 @@
+<!DOCTYPE html>
+<html lang="en-US" dir="ltr">
+<head>
+       <meta name="generator" content="Hugo 0.159.2"><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
+  <meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<meta name="description" content="Writing about IT, life, and the things that matter.">
+<meta name="theme-color" content="#060b10">
+<title>danilo m.</title>
+
+
+      <link rel="stylesheet" href="/css/main.css">
+
+
+      <script src="/js/main.js"></script>
+
+
+</head>
+<body>
+  <div class="reading-progress"></div>
+  <header><div class="header-container">
+  <a href="/" class="site-title">Danilo M.</a>
+  <div class="header-controls">
+    <nav>
+      <ul>
+        
+          <li>
+            <a href="/articles/" >
+              articles
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/" >
+              about
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/here/" >
+              contact
+            </a>
+          </li>
+        
+      </ul>
+    </nav>
+    <button id="theme-toggle-btn" class="theme-toggle" aria-label="Toggle theme">🌙 dark</button>
+  </div>
+</div>
+</header>
+  <main>
+  <section class="hero">
+  <canvas id="matrix-canvas"></canvas>
+
+  <div class="hero-content">
+    <div class="hero-avatar">DM</div>
+    <div class="hero-text">
+      <h1>Danilo M.</h1>
+      <div class="hero-role">// engineer • writer • human</div>
+      <p class="hero-bio">Writing about IT, life, and the things that matter.</p>
+    </div>
+  </div>
+</section>
+
+
+  <div class="container feed-section">
+    <div class="feed-label">Latest</div>
+
+    
+    
+    
+
+    <div class="feed-grid">
+      
+    </div>
+
+    <a href="/articles/" class="feed-cta">View all articles</a>
+  </div>
+</main>
+  <footer><div class="footer-container">
+  <div class="footer-content">
+    <div class="footer-copyright">
+      © 2026 Danilo M.. All rights reserved.
+    </div>
+    <nav>
+      <ul class="footer-nav">
+        
+          <li><a href="/articles/">articles</a></li>
+        
+          <li><a href="/is/">about</a></li>
+        
+          <li><a href="/is/here/">contact</a></li>
+        
+      </ul>
+    </nav>
+  </div>
+</div>
+</footer>
+</body>
+</html>
diff --git a/public/index.xml b/public/index.xml
new file mode 100644 (file)
index 0000000..0eb3cb4
--- /dev/null
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
+  <channel>
+    <title>Home on danilo m.</title>
+    <link>http://localhost:1313/</link>
+    <description>Recent content in Home on danilo m.</description>
+    <generator>Hugo</generator>
+    <language>en-US</language>
+    <lastBuildDate>Thu, 01 Jan 2026 00:00:00 +0000</lastBuildDate>
+    <atom:link href="http://localhost:1313/index.xml" rel="self" type="application/rss+xml" />
+    <item>
+      <title>Contact</title>
+      <link>http://localhost:1313/is/here/</link>
+      <pubDate>Thu, 01 Jan 2026 00:00:00 +0000</pubDate>
+      <guid>http://localhost:1313/is/here/</guid>
+      <description>&lt;p&gt;Get in touch — send me a message and I&amp;rsquo;ll get back to you soon.&lt;/p&gt;&#xA;&lt;!-- raw HTML omitted --&gt;&#xA;&lt;!-- raw HTML omitted --&gt;&#xA;&lt;!-- raw HTML omitted --&gt;&#xA;&lt;!-- raw HTML omitted --&gt;&#xA;&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Send&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;&#xA;&lt;!-- raw HTML omitted --&gt;&#xA;&lt;!-- raw HTML omitted --&gt;&#xA;&lt;!-- raw HTML omitted --&gt;</description>
+    </item>
+    <item>
+      <title>Post 3</title>
+      <link>http://localhost:1313/posts/post-3/</link>
+      <pubDate>Wed, 15 Mar 2023 11:00:00 -0700</pubDate>
+      <guid>http://localhost:1313/posts/post-3/</guid>
+      <description>&lt;p&gt;Occaecat aliqua consequat laborum ut ex aute aliqua culpa quis irure esse magna dolore quis. Proident fugiat labore eu laboris officia Lorem enim. Ipsum occaecat cillum ut tempor id sint aliqua incididunt nisi incididunt reprehenderit. Voluptate ad minim sint est aute aliquip esse occaecat tempor officia qui sunt. Aute ex ipsum id ut in est velit est laborum incididunt. Aliqua qui id do esse sunt eiusmod id deserunt eu nostrud aute sit ipsum. Deserunt esse cillum Lorem non magna adipisicing mollit amet consequat.&lt;/p&gt;</description>
+    </item>
+    <item>
+      <title>Post 2</title>
+      <link>http://localhost:1313/posts/post-2/</link>
+      <pubDate>Wed, 15 Feb 2023 10:00:00 -0700</pubDate>
+      <guid>http://localhost:1313/posts/post-2/</guid>
+      <description>&lt;p&gt;Anim eiusmod irure incididunt sint cupidatat. Incididunt irure irure irure nisi ipsum do ut quis fugiat consectetur proident cupidatat incididunt cillum. Dolore voluptate occaecat qui mollit laborum ullamco et. Ipsum laboris officia anim laboris culpa eiusmod ex magna ex cupidatat anim ipsum aute. Mollit aliquip occaecat qui sunt velit ut cupidatat reprehenderit enim sunt laborum. Velit veniam in officia nulla adipisicing ut duis officia.&lt;/p&gt;&#xA;&lt;p&gt;Exercitation voluptate irure in irure tempor mollit Lorem nostrud ad officia. Velit id fugiat occaecat do tempor. Sit officia Lorem aliquip eu deserunt consectetur. Aute proident deserunt in nulla aliquip dolore ipsum Lorem ut cupidatat consectetur sit sint laborum. Esse cupidatat sit sint sunt tempor exercitation deserunt. Labore dolor duis laborum est do nisi ut veniam dolor et nostrud nostrud.&lt;/p&gt;</description>
+    </item>
+    <item>
+      <title>Post 1</title>
+      <link>http://localhost:1313/posts/post-1/</link>
+      <pubDate>Sun, 15 Jan 2023 09:00:00 -0700</pubDate>
+      <guid>http://localhost:1313/posts/post-1/</guid>
+      <description>&lt;p&gt;Tempor proident minim aliquip reprehenderit dolor et ad anim Lorem duis sint eiusmod. Labore ut ea duis dolor. Incididunt consectetur proident qui occaecat incididunt do nisi Lorem. Tempor do laborum elit laboris excepteur eiusmod do. Eiusmod nisi excepteur ut amet pariatur adipisicing Lorem.&lt;/p&gt;&#xA;&lt;p&gt;Occaecat nulla excepteur dolore excepteur duis eiusmod ullamco officia anim in voluptate ea occaecat officia. Cillum sint esse velit ea officia minim fugiat. Elit ea esse id aliquip pariatur cupidatat id duis minim incididunt ea ea. Anim ut duis sunt nisi. Culpa cillum sit voluptate voluptate eiusmod dolor. Enim nisi Lorem ipsum irure est excepteur voluptate eu in enim nisi. Nostrud ipsum Lorem anim sint labore consequat do.&lt;/p&gt;</description>
+    </item>
+  </channel>
+</rss>
diff --git a/public/is/here/index.html b/public/is/here/index.html
new file mode 100644 (file)
index 0000000..ca584a5
--- /dev/null
@@ -0,0 +1,114 @@
+<!DOCTYPE html>
+<html lang="en-US" dir="ltr">
+<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
+  <meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<meta name="description" content="Writing about IT, life, and the things that matter.">
+<meta name="theme-color" content="#060b10">
+<title>Contact | danilo m.</title>
+
+
+      <link rel="stylesheet" href="/css/main.css">
+
+
+      <script src="/js/main.js"></script>
+
+
+</head>
+<body>
+  <div class="reading-progress"></div>
+  <header><div class="header-container">
+  <a href="/" class="site-title">Danilo M.</a>
+  <div class="header-controls">
+    <nav>
+      <ul>
+        
+          <li>
+            <a href="/articles/" >
+              articles
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/" class="active">
+              about
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/here/" class="active">
+              contact
+            </a>
+          </li>
+        
+      </ul>
+    </nav>
+    <button id="theme-toggle-btn" class="theme-toggle" aria-label="Toggle theme">🌙 dark</button>
+  </div>
+</div>
+</header>
+  <main>
+  <article class="page-page">
+    <div class="container-narrow">
+      <h1>Contact</h1>
+      <div class="post-card-meta" style="margin-bottom: 2rem;">
+        <span>Jan 1, 2026</span>
+        
+      </div>
+
+      <div class="post-content">
+        <p>Get in touch — send me a message and I&rsquo;ll get back to you soon.</p>
+<!-- raw HTML omitted -->
+<!-- raw HTML omitted -->
+<!-- raw HTML omitted -->
+<!-- raw HTML omitted -->
+<p><!-- raw HTML omitted -->Send<!-- raw HTML omitted --></p>
+<!-- raw HTML omitted -->
+<!-- raw HTML omitted -->
+<!-- raw HTML omitted -->
+
+      </div>
+    </div>
+  </article>
+
+  
+    <div class="container-narrow" style="margin-top: 3rem; padding-top: 2rem; border-top: 1px solid var(--border);">
+      <nav class="page-nav">
+        <h3 style="margin-bottom: 1rem;">Other pages</h3>
+        <ul style="list-style: none; margin: 0;">
+          
+          
+            
+              <li style="margin-bottom: 0.5rem;">
+                <a href="/is/here/" class="active">
+                  Contact
+                </a>
+              </li>
+            
+          
+        </ul>
+      </nav>
+    </div>
+  
+</main>
+  <footer><div class="footer-container">
+  <div class="footer-content">
+    <div class="footer-copyright">
+      © 2026 Danilo M.. All rights reserved.
+    </div>
+    <nav>
+      <ul class="footer-nav">
+        
+          <li><a href="/articles/">articles</a></li>
+        
+          <li><a href="/is/">about</a></li>
+        
+          <li><a href="/is/here/">contact</a></li>
+        
+      </ul>
+    </nav>
+  </div>
+</div>
+</footer>
+</body>
+</html>
diff --git a/public/is/index.html b/public/is/index.html
new file mode 100644 (file)
index 0000000..00b5b13
--- /dev/null
@@ -0,0 +1,83 @@
+<!DOCTYPE html>
+<html lang="en-US" dir="ltr">
+<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
+  <meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<meta name="description" content="Writing about IT, life, and the things that matter.">
+<meta name="theme-color" content="#060b10">
+<title>About | danilo m.</title>
+
+
+      <link rel="stylesheet" href="/css/main.css">
+
+
+      <script src="/js/main.js"></script>
+
+
+</head>
+<body>
+  <div class="reading-progress"></div>
+  <header><div class="header-container">
+  <a href="/" class="site-title">Danilo M.</a>
+  <div class="header-controls">
+    <nav>
+      <ul>
+        
+          <li>
+            <a href="/articles/" >
+              articles
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/" class="active">
+              about
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/here/" >
+              contact
+            </a>
+          </li>
+        
+      </ul>
+    </nav>
+    <button id="theme-toggle-btn" class="theme-toggle" aria-label="Toggle theme">🌙 dark</button>
+  </div>
+</div>
+</header>
+  <main>
+  <div class="container">
+    <h1>About</h1>
+
+    
+      <p>Hi, I&rsquo;m Danilo. I write about tech, life, and the things that matter.</p>
+<p>This is your about page. Edit this to tell your story.</p>
+
+    
+  </div>
+
+  
+</main>
+  <footer><div class="footer-container">
+  <div class="footer-content">
+    <div class="footer-copyright">
+      © 2026 Danilo M.. All rights reserved.
+    </div>
+    <nav>
+      <ul class="footer-nav">
+        
+          <li><a href="/articles/">articles</a></li>
+        
+          <li><a href="/is/">about</a></li>
+        
+          <li><a href="/is/here/">contact</a></li>
+        
+      </ul>
+    </nav>
+  </div>
+</div>
+</footer>
+</body>
+</html>
diff --git a/public/js/filters.38212ecd54ff7f1fdebf2aebe32e8c248382e80f93dae0761ebbbd03ca28dc5b.js b/public/js/filters.38212ecd54ff7f1fdebf2aebe32e8c248382e80f93dae0761ebbbd03ca28dc5b.js
new file mode 100644 (file)
index 0000000..64d9c57
--- /dev/null
@@ -0,0 +1,28 @@
+// filters.js
+(function() {
+  const filterBtns = document.querySelectorAll('.filter-btn');
+  const feedList = document.getElementById('articles-feed');
+  const cards = feedList ? feedList.querySelectorAll('.post-card') : [];
+
+  if (!filterBtns.length || !cards.length) return;
+
+  filterBtns.forEach(btn => {
+    btn.addEventListener('click', function() {
+      const filter = this.dataset.filter;
+
+      // Update active button
+      filterBtns.forEach(b => b.classList.remove('active'));
+      this.classList.add('active');
+
+      // Filter cards
+      cards.forEach(card => {
+        const cardType = card.querySelector('.post-type-badge')?.classList[1];
+        const matches = filter === 'all' || cardType === filter;
+        card.style.display = matches ? '' : 'none';
+      });
+
+      // Scroll to top
+      window.scrollTo({ top: 0, behavior: 'smooth' });
+    });
+  });
+})();
diff --git a/public/js/main.23cd0c7d837263b9eaeb96ee2d9ccfa2969daa3fa00fa1c1fe8701a9b87251a1.js b/public/js/main.23cd0c7d837263b9eaeb96ee2d9ccfa2969daa3fa00fa1c1fe8701a9b87251a1.js
new file mode 100644 (file)
index 0000000..4e24393
--- /dev/null
@@ -0,0 +1 @@
+(()=>{console.log("This site was generated by Hugo.");})();
diff --git a/public/js/main.55ed9b054bac537d7aab80112d090a8b88bbcaae5dec86c26009f393fd2d213d.js b/public/js/main.55ed9b054bac537d7aab80112d090a8b88bbcaae5dec86c26009f393fd2d213d.js
new file mode 100644 (file)
index 0000000..0dadf45
--- /dev/null
@@ -0,0 +1 @@
+(()=>{(function(){let e="danix-theme",o="theme-dark",t="theme-light";function r(){let c=localStorage.getItem(e),n=window.matchMedia("(prefers-color-scheme: dark)").matches;a((c===null?n:c==="dark")?"dark":"light")}function a(c){let n=document.documentElement;n.classList.remove(o,t),c==="dark"?(n.classList.remove(t),localStorage.setItem(e,"dark")):(n.classList.add(t),localStorage.setItem(e,"light"))}function i(){return document.documentElement.classList.contains(t)?"light":"dark"}function d(){let n=i()==="dark"?"light":"dark";a(n),window.dispatchEvent(new CustomEvent("theme-changed",{detail:{theme:n}}))}function l(){let c=document.getElementById("theme-toggle-btn");c&&(c.addEventListener("click",d),s(),window.addEventListener("theme-changed",s))}function s(){let c=document.getElementById("theme-toggle-btn");if(c){let n=i();c.textContent=n==="dark"?"\u2600\uFE0F light":"\u{1F319} dark"}}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",function(){r(),l()}):(r(),l()),window.ThemeToggle={toggle:d,set:a,get:i}})();(function(){let e=document.getElementById("matrix-canvas");if(!e||window.matchMedia("(prefers-reduced-motion: reduce)").matches)return;let o=e.getContext("2d"),t="\u30A2\u30A4\u30A6\u30A8\u30AA\u30AB\u30AD\u30AF\u30B1\u30B3\u30B5\u30B7\u30B9\u30BB\u30BD\u30BF\u30C1\u30C4\u30C6\u30C8\u30CA\u30CB\u30CC\u30CD\u30CE\u30CF\u30D2\u30D5\u30D8\u30DB\u30DE\u30DF\u30E0\u30E1\u30E2\u30E4\u30E6\u30E8\u30E9\u30EA\u30EB\u30EC\u30ED\u30EF\u30F2\u30F30123456789ABCDEF<>/\\|{}[]$#@!",r=14,a,i,d;function l(){e.width=e.offsetWidth,e.height=e.offsetHeight,a=Math.floor(e.width/r)+1,i=Array.from({length:a},()=>Math.random()*-(e.height/r))}function s(){let c=document.documentElement.classList.contains("theme-light");o.fillStyle=c?"rgba(240,244,248,0.07)":"rgba(6,11,16,0.055)",o.fillRect(0,0,e.width,e.height),o.font=`${r}px "JetBrains Mono", monospace`;for(let n=0;n<a;n++){let m=t[Math.floor(Math.random()*t.length)];o.fillStyle=Math.random()>.96?c?"#008f5a":"#00ff88":c?"#7c3aed":"#a855f7",o.fillText(m,n*r,i[n]*r),i[n]*r>e.height&&Math.random()>.975&&(i[n]=Math.random()*-20),i[n]+=.5}d=requestAnimationFrame(s)}window.addEventListener("theme-changed",function(){},{passive:!0}),l(),window.addEventListener("resize",()=>{cancelAnimationFrame(d),l(),s()},{passive:!0}),document.addEventListener("visibilitychange",()=>{document.hidden?cancelAnimationFrame(d):s()}),s(),window.MatrixRain={init:l,tick:s}})();(function(){let e=document.querySelector(".reading-progress");if(!e)return;let o=document.querySelector("main");if(!o)return;function t(){let i=window.innerHeight,d=document.documentElement.scrollHeight-i,l=window.scrollY,s=d>0?l/d*100:0;e.style.width=s+"%"}o.offsetHeight>window.innerHeight*1.5&&document.body.classList.add("scrollable");let a=!1;window.addEventListener("scroll",function(){a||(requestAnimationFrame(t),a=!0,setTimeout(()=>{a=!1},100))},{passive:!0}),t()})();(function(){document.querySelectorAll("pre, .highlight").forEach(o=>{let t=document.createElement("button");t.className="code-copy-btn",t.textContent="copy",t.type="button",t.setAttribute("aria-label","Copy code");let r=o.querySelector("code"),a=r?r.textContent:o.textContent;t.addEventListener("click",async function(){try{await navigator.clipboard.writeText(a);let i=t.textContent;t.textContent="copied!",t.classList.add("copied"),setTimeout(()=>{t.textContent=i,t.classList.remove("copied")},2e3)}catch(i){console.error("Failed to copy:",i),t.textContent="error"}}),o.style.position="relative",o.appendChild(t)})})();})();
diff --git a/public/js/main.js b/public/js/main.js
new file mode 100644 (file)
index 0000000..c47a5b8
--- /dev/null
@@ -0,0 +1,175 @@
+(() => {
+  // ns-hugo-imp:/home/danix/Programming/GIT/danix2-hugo-theme/assets/js/theme-toggle.js
+  (function() {
+    const STORAGE_KEY = "danix-theme";
+    const DARK_CLASS = "theme-dark";
+    const LIGHT_CLASS = "theme-light";
+    function init() {
+      const saved = localStorage.getItem(STORAGE_KEY);
+      const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
+      const isDark = saved === null ? prefersDark : saved === "dark";
+      applyTheme(isDark ? "dark" : "light");
+    }
+    function applyTheme(theme) {
+      const html = document.documentElement;
+      html.classList.remove(DARK_CLASS, LIGHT_CLASS);
+      if (theme === "dark") {
+        html.classList.remove(LIGHT_CLASS);
+        localStorage.setItem(STORAGE_KEY, "dark");
+      } else {
+        html.classList.add(LIGHT_CLASS);
+        localStorage.setItem(STORAGE_KEY, "light");
+      }
+    }
+    function getCurrentTheme() {
+      return document.documentElement.classList.contains(LIGHT_CLASS) ? "light" : "dark";
+    }
+    function toggleTheme() {
+      const current = getCurrentTheme();
+      const next = current === "dark" ? "light" : "dark";
+      applyTheme(next);
+      window.dispatchEvent(new CustomEvent("theme-changed", { detail: { theme: next } }));
+    }
+    function setupToggleButton() {
+      const btn = document.getElementById("theme-toggle-btn");
+      if (btn) {
+        btn.addEventListener("click", toggleTheme);
+        updateToggleButtonLabel();
+        window.addEventListener("theme-changed", updateToggleButtonLabel);
+      }
+    }
+    function updateToggleButtonLabel() {
+      const btn = document.getElementById("theme-toggle-btn");
+      if (btn) {
+        const current = getCurrentTheme();
+        btn.textContent = current === "dark" ? "\u2600\uFE0F light" : "\u{1F319} dark";
+      }
+    }
+    if (document.readyState === "loading") {
+      document.addEventListener("DOMContentLoaded", function() {
+        init();
+        setupToggleButton();
+      });
+    } else {
+      init();
+      setupToggleButton();
+    }
+    window.ThemeToggle = {
+      toggle: toggleTheme,
+      set: applyTheme,
+      get: getCurrentTheme
+    };
+  })();
+
+  // ns-hugo-imp:/home/danix/Programming/GIT/danix2-hugo-theme/assets/js/matrix-rain.js
+  (function() {
+    const canvas = document.getElementById("matrix-canvas");
+    if (!canvas) return;
+    if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
+    const ctx = canvas.getContext("2d");
+    const CHARS = "\u30A2\u30A4\u30A6\u30A8\u30AA\u30AB\u30AD\u30AF\u30B1\u30B3\u30B5\u30B7\u30B9\u30BB\u30BD\u30BF\u30C1\u30C4\u30C6\u30C8\u30CA\u30CB\u30CC\u30CD\u30CE\u30CF\u30D2\u30D5\u30D8\u30DB\u30DE\u30DF\u30E0\u30E1\u30E2\u30E4\u30E6\u30E8\u30E9\u30EA\u30EB\u30EC\u30ED\u30EF\u30F2\u30F30123456789ABCDEF<>/\\|{}[]$#@!";
+    const FS = 14;
+    let cols, drops, raf;
+    function init() {
+      canvas.width = canvas.offsetWidth;
+      canvas.height = canvas.offsetHeight;
+      cols = Math.floor(canvas.width / FS) + 1;
+      drops = Array.from({ length: cols }, () => Math.random() * -(canvas.height / FS));
+    }
+    function tick() {
+      const light = document.documentElement.classList.contains("theme-light");
+      ctx.fillStyle = light ? "rgba(240,244,248,0.07)" : "rgba(6,11,16,0.055)";
+      ctx.fillRect(0, 0, canvas.width, canvas.height);
+      ctx.font = `${FS}px "JetBrains Mono", monospace`;
+      for (let i = 0; i < cols; i++) {
+        const char = CHARS[Math.floor(Math.random() * CHARS.length)];
+        ctx.fillStyle = Math.random() > 0.96 ? light ? "#008f5a" : "#00ff88" : light ? "#7c3aed" : "#a855f7";
+        ctx.fillText(char, i * FS, drops[i] * FS);
+        if (drops[i] * FS > canvas.height && Math.random() > 0.975) {
+          drops[i] = Math.random() * -20;
+        }
+        drops[i] += 0.5;
+      }
+      raf = requestAnimationFrame(tick);
+    }
+    window.addEventListener("theme-changed", function() {
+    }, { passive: true });
+    init();
+    window.addEventListener("resize", () => {
+      cancelAnimationFrame(raf);
+      init();
+      tick();
+    }, { passive: true });
+    document.addEventListener("visibilitychange", () => {
+      if (document.hidden) {
+        cancelAnimationFrame(raf);
+      } else {
+        tick();
+      }
+    });
+    tick();
+    window.MatrixRain = { init, tick };
+  })();
+
+  // ns-hugo-imp:/home/danix/Programming/GIT/danix2-hugo-theme/assets/js/progress-bar.js
+  (function() {
+    const progressBar = document.querySelector(".reading-progress");
+    if (!progressBar) return;
+    const mainContent = document.querySelector("main");
+    if (!mainContent) return;
+    function updateProgress() {
+      const windowHeight = window.innerHeight;
+      const docHeight = document.documentElement.scrollHeight - windowHeight;
+      const scrolled = window.scrollY;
+      const percent = docHeight > 0 ? scrolled / docHeight * 100 : 0;
+      progressBar.style.width = percent + "%";
+    }
+    const contentHeight = mainContent.offsetHeight;
+    if (contentHeight > window.innerHeight * 1.5) {
+      document.body.classList.add("scrollable");
+    }
+    let ticking = false;
+    window.addEventListener("scroll", function() {
+      if (!ticking) {
+        requestAnimationFrame(updateProgress);
+        ticking = true;
+        setTimeout(() => {
+          ticking = false;
+        }, 100);
+      }
+    }, { passive: true });
+    updateProgress();
+  })();
+
+  // ns-hugo-imp:/home/danix/Programming/GIT/danix2-hugo-theme/assets/js/copy-code.js
+  (function() {
+    const codeBlocks = document.querySelectorAll("pre, .highlight");
+    codeBlocks.forEach((block) => {
+      const btn = document.createElement("button");
+      btn.className = "code-copy-btn";
+      btn.textContent = "copy";
+      btn.type = "button";
+      btn.setAttribute("aria-label", "Copy code");
+      const code = block.querySelector("code");
+      const text = code ? code.textContent : block.textContent;
+      btn.addEventListener("click", async function() {
+        try {
+          await navigator.clipboard.writeText(text);
+          const originalText = btn.textContent;
+          btn.textContent = "copied!";
+          btn.classList.add("copied");
+          setTimeout(() => {
+            btn.textContent = originalText;
+            btn.classList.remove("copied");
+          }, 2e3);
+        } catch (err) {
+          console.error("Failed to copy:", err);
+          btn.textContent = "error";
+        }
+      });
+      block.style.position = "relative";
+      block.appendChild(btn);
+    });
+  })();
+})();
+//# sourceMappingURL=main.js.map
diff --git a/public/js/main.js.map b/public/js/main.js.map
new file mode 100644 (file)
index 0000000..5e4682a
--- /dev/null
@@ -0,0 +1 @@
+{"version":3,"sources":["file:///home/danix/Programming/GIT/danix2-hugo-theme/assets/js/theme-toggle.js","file:///home/danix/Programming/GIT/danix2-hugo-theme/assets/js/matrix-rain.js","file:///home/danix/Programming/GIT/danix2-hugo-theme/assets/js/progress-bar.js","file:///home/danix/Programming/GIT/danix2-hugo-theme/assets/js/copy-code.js"],"sourcesContent":["// theme-toggle.js\n(function() {\n  const STORAGE_KEY = 'danix-theme';\n  const DARK_CLASS = 'theme-dark';\n  const LIGHT_CLASS = 'theme-light';\n\n  // Initialize theme on page load\n  function init() {\n    const saved = localStorage.getItem(STORAGE_KEY);\n    const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n    const isDark = saved === null ? prefersDark : saved === 'dark';\n\n    applyTheme(isDark ? 'dark' : 'light');\n  }\n\n  // Apply theme to document\n  function applyTheme(theme) {\n    const html = document.documentElement;\n\n    html.classList.remove(DARK_CLASS, LIGHT_CLASS);\n\n    if (theme === 'dark') {\n      html.classList.remove(LIGHT_CLASS);\n      localStorage.setItem(STORAGE_KEY, 'dark');\n    } else {\n      html.classList.add(LIGHT_CLASS);\n      localStorage.setItem(STORAGE_KEY, 'light');\n    }\n  }\n\n  // Get current theme\n  function getCurrentTheme() {\n    return document.documentElement.classList.contains(LIGHT_CLASS) ? 'light' : 'dark';\n  }\n\n  // Toggle theme\n  function toggleTheme() {\n    const current = getCurrentTheme();\n    const next = current === 'dark' ? 'light' : 'dark';\n    applyTheme(next);\n\n    // Dispatch custom event for other scripts to listen\n    window.dispatchEvent(new CustomEvent('theme-changed', { detail: { theme: next } }));\n  }\n\n  // Setup toggle button\n  function setupToggleButton() {\n    const btn = document.getElementById('theme-toggle-btn');\n    if (btn) {\n      btn.addEventListener('click', toggleTheme);\n      updateToggleButtonLabel();\n\n      // Listen for theme changes to update button label\n      window.addEventListener('theme-changed', updateToggleButtonLabel);\n    }\n  }\n\n  function updateToggleButtonLabel() {\n    const btn = document.getElementById('theme-toggle-btn');\n    if (btn) {\n      const current = getCurrentTheme();\n      btn.textContent = current === 'dark' ? '☀️ light' : '🌙 dark';\n    }\n  }\n\n  // Initialize on DOMContentLoaded\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', function() {\n      init();\n      setupToggleButton();\n    });\n  } else {\n    init();\n    setupToggleButton();\n  }\n\n  // Expose to global scope for testing\n  window.ThemeToggle = {\n    toggle: toggleTheme,\n    set: applyTheme,\n    get: getCurrentTheme,\n  };\n})();\n","// matrix-rain.js\n(function () {\n  const canvas = document.getElementById('matrix-canvas');\n  if (!canvas) return;\n  if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;\n\n  const ctx   = canvas.getContext('2d');\n  const CHARS = 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン0123456789ABCDEF\u003c\u003e/\\\\|{}[]$#@!';\n  const FS    = 14;  // font size / column width in px\n  let cols, drops, raf;\n\n  function init() {\n    canvas.width  = canvas.offsetWidth;\n    canvas.height = canvas.offsetHeight;\n    cols  = Math.floor(canvas.width / FS) + 1;\n    drops = Array.from({ length: cols }, () =\u003e Math.random() * -(canvas.height / FS));\n  }\n\n  function tick() {\n    const light = document.documentElement.classList.contains('theme-light');\n    // Fade trail: near-transparent fill each frame\n    ctx.fillStyle = light ? 'rgba(240,244,248,0.07)' : 'rgba(6,11,16,0.055)';\n    ctx.fillRect(0, 0, canvas.width, canvas.height);\n    ctx.font = `${FS}px \"JetBrains Mono\", monospace`;\n\n    for (let i = 0; i \u003c cols; i++) {\n      const char = CHARS[Math.floor(Math.random() * CHARS.length)];\n      // 4% chance of bright \"head\" char, otherwise use accent color\n      ctx.fillStyle = Math.random() \u003e 0.96\n        ? (light ? '#008f5a' : '#00ff88')   // bright green head\n        : (light ? '#7c3aed' : '#a855f7');  // purple trail\n      ctx.fillText(char, i * FS, drops[i] * FS);\n\n      if (drops[i] * FS \u003e canvas.height \u0026\u0026 Math.random() \u003e 0.975) {\n        drops[i] = Math.random() * -20;  // reset column randomly\n      }\n      drops[i] += 0.5;  // slow fall speed\n    }\n    raf = requestAnimationFrame(tick);\n  }\n\n  // Listen for theme changes and reinit\n  window.addEventListener('theme-changed', function() {\n    // Matrix rain auto-colors based on theme-light class\n  }, { passive: true });\n\n  init();\n  window.addEventListener('resize', () =\u003e {\n    cancelAnimationFrame(raf);\n    init();\n    tick();\n  }, { passive: true });\n\n  document.addEventListener('visibilitychange', () =\u003e {\n    if (document.hidden) {\n      cancelAnimationFrame(raf);\n    } else {\n      tick();\n    }\n  });\n\n  tick();\n\n  window.MatrixRain = { init, tick };\n})();\n","// progress-bar.js\n(function() {\n  const progressBar = document.querySelector('.reading-progress');\n  if (!progressBar) return;\n\n  // Only enable on pages with substantial content\n  const mainContent = document.querySelector('main');\n  if (!mainContent) return;\n\n  function updateProgress() {\n    // Calculate scroll percentage\n    const windowHeight = window.innerHeight;\n    const docHeight = document.documentElement.scrollHeight - windowHeight;\n    const scrolled = window.scrollY;\n    const percent = docHeight \u003e 0 ? (scrolled / docHeight) * 100 : 0;\n\n    progressBar.style.width = percent + '%';\n  }\n\n  // Mark body as scrollable if there's significant content\n  const contentHeight = mainContent.offsetHeight;\n  if (contentHeight \u003e window.innerHeight * 1.5) {\n    document.body.classList.add('scrollable');\n  }\n\n  // Use requestAnimationFrame for smooth updates\n  let ticking = false;\n  window.addEventListener('scroll', function() {\n    if (!ticking) {\n      requestAnimationFrame(updateProgress);\n      ticking = true;\n      setTimeout(() =\u003e { ticking = false; }, 100);\n    }\n  }, { passive: true });\n\n  // Initial update\n  updateProgress();\n})();\n","// copy-code.js\n(function() {\n  // Add copy button to all code blocks\n  const codeBlocks = document.querySelectorAll('pre, .highlight');\n\n  codeBlocks.forEach(block =\u003e {\n    // Create copy button\n    const btn = document.createElement('button');\n    btn.className = 'code-copy-btn';\n    btn.textContent = 'copy';\n    btn.type = 'button';\n    btn.setAttribute('aria-label', 'Copy code');\n\n    // Get code text\n    const code = block.querySelector('code');\n    const text = code ? code.textContent : block.textContent;\n\n    // Copy on click\n    btn.addEventListener('click', async function() {\n      try {\n        await navigator.clipboard.writeText(text);\n\n        // Show feedback\n        const originalText = btn.textContent;\n        btn.textContent = 'copied!';\n        btn.classList.add('copied');\n\n        setTimeout(() =\u003e {\n          btn.textContent = originalText;\n          btn.classList.remove('copied');\n        }, 2000);\n      } catch (err) {\n        console.error('Failed to copy:', err);\n        btn.textContent = 'error';\n      }\n    });\n\n    // Add button to block\n    block.style.position = 'relative';\n    block.appendChild(btn);\n  });\n})();\n"],"mappings":"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","names":[]}
\ No newline at end of file
diff --git a/public/posts/index.html b/public/posts/index.html
new file mode 100644 (file)
index 0000000..47d0691
--- /dev/null
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<html lang="en-US" dir="ltr">
+<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
+  <meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<meta name="description" content="Writing about IT, life, and the things that matter.">
+<meta name="theme-color" content="#060b10">
+<title>Posts | danilo m.</title>
+
+
+      <link rel="stylesheet" href="/css/main.css">
+
+
+      <script src="/js/main.js"></script>
+
+
+</head>
+<body>
+  <div class="reading-progress"></div>
+  <header><div class="header-container">
+  <a href="/" class="site-title">Danilo M.</a>
+  <div class="header-controls">
+    <nav>
+      <ul>
+        
+          <li>
+            <a href="/articles/" >
+              articles
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/" >
+              about
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/here/" >
+              contact
+            </a>
+          </li>
+        
+      </ul>
+    </nav>
+    <button id="theme-toggle-btn" class="theme-toggle" aria-label="Toggle theme">🌙 dark</button>
+  </div>
+</div>
+</header>
+  <main>
+  <div class="container">
+    <h1>Posts</h1>
+
+    
+      <p>Tempor est exercitation ad qui pariatur quis adipisicing aliquip nisi ea consequat ipsum occaecat. Nostrud consequat ullamco laboris fugiat esse esse adipisicing velit laborum ipsum incididunt ut enim. Dolor pariatur nulla quis fugiat dolore excepteur. Aliquip ad quis aliqua enim do consequat.</p>
+
+    
+  </div>
+
+  
+</main>
+  <footer><div class="footer-container">
+  <div class="footer-content">
+    <div class="footer-copyright">
+      © 2026 Danilo M.. All rights reserved.
+    </div>
+    <nav>
+      <ul class="footer-nav">
+        
+          <li><a href="/articles/">articles</a></li>
+        
+          <li><a href="/is/">about</a></li>
+        
+          <li><a href="/is/here/">contact</a></li>
+        
+      </ul>
+    </nav>
+  </div>
+</div>
+</footer>
+</body>
+</html>
diff --git a/public/posts/post-1/index.html b/public/posts/post-1/index.html
new file mode 100644 (file)
index 0000000..129968f
--- /dev/null
@@ -0,0 +1,89 @@
+<!DOCTYPE html>
+<html lang="en-US" dir="ltr">
+<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
+  <meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<meta name="description" content="Writing about IT, life, and the things that matter.">
+<meta name="theme-color" content="#060b10">
+<title>Post 1 | danilo m.</title>
+
+
+      <link rel="stylesheet" href="/css/main.css">
+
+
+      <script src="/js/main.js"></script>
+
+
+</head>
+<body>
+  <div class="reading-progress"></div>
+  <header><div class="header-container">
+  <a href="/" class="site-title">Danilo M.</a>
+  <div class="header-controls">
+    <nav>
+      <ul>
+        
+          <li>
+            <a href="/articles/" >
+              articles
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/" >
+              about
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/here/" >
+              contact
+            </a>
+          </li>
+        
+      </ul>
+    </nav>
+    <button id="theme-toggle-btn" class="theme-toggle" aria-label="Toggle theme">🌙 dark</button>
+  </div>
+</div>
+</header>
+  <main>
+  <article class="page-page">
+    <div class="container-narrow">
+      <h1>Post 1</h1>
+      <div class="post-card-meta" style="margin-bottom: 2rem;">
+        <span>Jan 15, 2023</span>
+        
+      </div>
+
+      <div class="post-content">
+        <p>Tempor proident minim aliquip reprehenderit dolor et ad anim Lorem duis sint eiusmod. Labore ut ea duis dolor. Incididunt consectetur proident qui occaecat incididunt do nisi Lorem. Tempor do laborum elit laboris excepteur eiusmod do. Eiusmod nisi excepteur ut amet pariatur adipisicing Lorem.</p>
+<p>Occaecat nulla excepteur dolore excepteur duis eiusmod ullamco officia anim in voluptate ea occaecat officia. Cillum sint esse velit ea officia minim fugiat. Elit ea esse id aliquip pariatur cupidatat id duis minim incididunt ea ea. Anim ut duis sunt nisi. Culpa cillum sit voluptate voluptate eiusmod dolor. Enim nisi Lorem ipsum irure est excepteur voluptate eu in enim nisi. Nostrud ipsum Lorem anim sint labore consequat do.</p>
+
+      </div>
+    </div>
+  </article>
+
+  
+</main>
+  <footer><div class="footer-container">
+  <div class="footer-content">
+    <div class="footer-copyright">
+      © 2026 Danilo M.. All rights reserved.
+    </div>
+    <nav>
+      <ul class="footer-nav">
+        
+          <li><a href="/articles/">articles</a></li>
+        
+          <li><a href="/is/">about</a></li>
+        
+          <li><a href="/is/here/">contact</a></li>
+        
+      </ul>
+    </nav>
+  </div>
+</div>
+</footer>
+</body>
+</html>
diff --git a/public/posts/post-2/index.html b/public/posts/post-2/index.html
new file mode 100644 (file)
index 0000000..9a56e90
--- /dev/null
@@ -0,0 +1,89 @@
+<!DOCTYPE html>
+<html lang="en-US" dir="ltr">
+<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
+  <meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<meta name="description" content="Writing about IT, life, and the things that matter.">
+<meta name="theme-color" content="#060b10">
+<title>Post 2 | danilo m.</title>
+
+
+      <link rel="stylesheet" href="/css/main.css">
+
+
+      <script src="/js/main.js"></script>
+
+
+</head>
+<body>
+  <div class="reading-progress"></div>
+  <header><div class="header-container">
+  <a href="/" class="site-title">Danilo M.</a>
+  <div class="header-controls">
+    <nav>
+      <ul>
+        
+          <li>
+            <a href="/articles/" >
+              articles
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/" >
+              about
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/here/" >
+              contact
+            </a>
+          </li>
+        
+      </ul>
+    </nav>
+    <button id="theme-toggle-btn" class="theme-toggle" aria-label="Toggle theme">🌙 dark</button>
+  </div>
+</div>
+</header>
+  <main>
+  <article class="page-page">
+    <div class="container-narrow">
+      <h1>Post 2</h1>
+      <div class="post-card-meta" style="margin-bottom: 2rem;">
+        <span>Feb 15, 2023</span>
+        
+      </div>
+
+      <div class="post-content">
+        <p>Anim eiusmod irure incididunt sint cupidatat. Incididunt irure irure irure nisi ipsum do ut quis fugiat consectetur proident cupidatat incididunt cillum. Dolore voluptate occaecat qui mollit laborum ullamco et. Ipsum laboris officia anim laboris culpa eiusmod ex magna ex cupidatat anim ipsum aute. Mollit aliquip occaecat qui sunt velit ut cupidatat reprehenderit enim sunt laborum. Velit veniam in officia nulla adipisicing ut duis officia.</p>
+<p>Exercitation voluptate irure in irure tempor mollit Lorem nostrud ad officia. Velit id fugiat occaecat do tempor. Sit officia Lorem aliquip eu deserunt consectetur. Aute proident deserunt in nulla aliquip dolore ipsum Lorem ut cupidatat consectetur sit sint laborum. Esse cupidatat sit sint sunt tempor exercitation deserunt. Labore dolor duis laborum est do nisi ut veniam dolor et nostrud nostrud.</p>
+
+      </div>
+    </div>
+  </article>
+
+  
+</main>
+  <footer><div class="footer-container">
+  <div class="footer-content">
+    <div class="footer-copyright">
+      © 2026 Danilo M.. All rights reserved.
+    </div>
+    <nav>
+      <ul class="footer-nav">
+        
+          <li><a href="/articles/">articles</a></li>
+        
+          <li><a href="/is/">about</a></li>
+        
+          <li><a href="/is/here/">contact</a></li>
+        
+      </ul>
+    </nav>
+  </div>
+</div>
+</footer>
+</body>
+</html>
diff --git a/public/posts/post-3/bryce-canyon.jpg b/public/posts/post-3/bryce-canyon.jpg
new file mode 100644 (file)
index 0000000..9a923be
Binary files /dev/null and b/public/posts/post-3/bryce-canyon.jpg differ
diff --git a/public/posts/post-3/index.html b/public/posts/post-3/index.html
new file mode 100644 (file)
index 0000000..7322f06
--- /dev/null
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<html lang="en-US" dir="ltr">
+<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
+  <meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<meta name="description" content="Writing about IT, life, and the things that matter.">
+<meta name="theme-color" content="#060b10">
+<title>Post 3 | danilo m.</title>
+
+
+      <link rel="stylesheet" href="/css/main.css">
+
+
+      <script src="/js/main.js"></script>
+
+
+</head>
+<body>
+  <div class="reading-progress"></div>
+  <header><div class="header-container">
+  <a href="/" class="site-title">Danilo M.</a>
+  <div class="header-controls">
+    <nav>
+      <ul>
+        
+          <li>
+            <a href="/articles/" >
+              articles
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/" >
+              about
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/here/" >
+              contact
+            </a>
+          </li>
+        
+      </ul>
+    </nav>
+    <button id="theme-toggle-btn" class="theme-toggle" aria-label="Toggle theme">🌙 dark</button>
+  </div>
+</div>
+</header>
+  <main>
+  <article class="page-page">
+    <div class="container-narrow">
+      <h1>Post 3</h1>
+      <div class="post-card-meta" style="margin-bottom: 2rem;">
+        <span>Mar 15, 2023</span>
+        
+      </div>
+
+      <div class="post-content">
+        <p>Occaecat aliqua consequat laborum ut ex aute aliqua culpa quis irure esse magna dolore quis. Proident fugiat labore eu laboris officia Lorem enim. Ipsum occaecat cillum ut tempor id sint aliqua incididunt nisi incididunt reprehenderit. Voluptate ad minim sint est aute aliquip esse occaecat tempor officia qui sunt. Aute ex ipsum id ut in est velit est laborum incididunt. Aliqua qui id do esse sunt eiusmod id deserunt eu nostrud aute sit ipsum. Deserunt esse cillum Lorem non magna adipisicing mollit amet consequat.</p>
+<p><img src="bryce-canyon.jpg" alt="Bryce Canyon National Park"></p>
+<p>Sit excepteur do velit veniam mollit in nostrud laboris incididunt ea. Amet eu cillum ut reprehenderit culpa aliquip labore laborum amet sit sit duis. Laborum id proident nostrud dolore laborum reprehenderit quis mollit nulla amet veniam officia id id. Aliquip in deserunt qui magna duis qui pariatur officia sunt deserunt.</p>
+
+      </div>
+    </div>
+  </article>
+
+  
+</main>
+  <footer><div class="footer-container">
+  <div class="footer-content">
+    <div class="footer-copyright">
+      © 2026 Danilo M.. All rights reserved.
+    </div>
+    <nav>
+      <ul class="footer-nav">
+        
+          <li><a href="/articles/">articles</a></li>
+        
+          <li><a href="/is/">about</a></li>
+        
+          <li><a href="/is/here/">contact</a></li>
+        
+      </ul>
+    </nav>
+  </div>
+</div>
+</footer>
+</body>
+</html>
diff --git a/public/sitemap.xml b/public/sitemap.xml
new file mode 100644 (file)
index 0000000..a8f827f
--- /dev/null
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
+  xmlns:xhtml="http://www.w3.org/1999/xhtml">
+  <url>
+    <loc>http://localhost:1313/is/</loc>
+    <lastmod>2026-01-01T00:00:00+00:00</lastmod>
+  </url><url>
+    <loc>http://localhost:1313/articles/</loc>
+    <lastmod>2026-01-01T00:00:00+00:00</lastmod>
+  </url><url>
+    <loc>http://localhost:1313/is/here/</loc>
+    <lastmod>2026-01-01T00:00:00+00:00</lastmod>
+  </url><url>
+    <loc>http://localhost:1313/</loc>
+    <lastmod>2026-01-01T00:00:00+00:00</lastmod>
+  </url><url>
+    <loc>http://localhost:1313/tags/blue/</loc>
+    <lastmod>2023-03-15T11:00:00-07:00</lastmod>
+  </url><url>
+    <loc>http://localhost:1313/tags/green/</loc>
+    <lastmod>2023-03-15T11:00:00-07:00</lastmod>
+  </url><url>
+    <loc>http://localhost:1313/posts/post-3/</loc>
+    <lastmod>2023-03-15T11:00:00-07:00</lastmod>
+  </url><url>
+    <loc>http://localhost:1313/tags/red/</loc>
+    <lastmod>2023-03-15T11:00:00-07:00</lastmod>
+  </url><url>
+    <loc>http://localhost:1313/tags/</loc>
+    <lastmod>2023-03-15T11:00:00-07:00</lastmod>
+  </url><url>
+    <loc>http://localhost:1313/posts/post-2/</loc>
+    <lastmod>2023-02-15T10:00:00-07:00</lastmod>
+  </url><url>
+    <loc>http://localhost:1313/posts/post-1/</loc>
+    <lastmod>2023-01-15T09:00:00-07:00</lastmod>
+  </url><url>
+    <loc>http://localhost:1313/posts/</loc>
+    <lastmod>2023-01-01T08:30:00-07:00</lastmod>
+  </url><url>
+    <loc>http://localhost:1313/categories/</loc>
+  </url>
+</urlset>
diff --git a/public/tags/blue/index.html b/public/tags/blue/index.html
new file mode 100644 (file)
index 0000000..8ed343b
--- /dev/null
@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<html lang="en-US" dir="ltr">
+<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
+  <meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<meta name="description" content="Writing about IT, life, and the things that matter.">
+<meta name="theme-color" content="#060b10">
+<title>Blue | danilo m.</title>
+
+
+      <link rel="stylesheet" href="/css/main.css">
+
+
+      <script src="/js/main.js"></script>
+
+
+</head>
+<body>
+  <div class="reading-progress"></div>
+  <header><div class="header-container">
+  <a href="/" class="site-title">Danilo M.</a>
+  <div class="header-controls">
+    <nav>
+      <ul>
+        
+          <li>
+            <a href="/articles/" >
+              articles
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/" >
+              about
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/here/" >
+              contact
+            </a>
+          </li>
+        
+      </ul>
+    </nav>
+    <button id="theme-toggle-btn" class="theme-toggle" aria-label="Toggle theme">🌙 dark</button>
+  </div>
+</div>
+</header>
+  <main>
+  <h1>Blue</h1>
+  
+  
+    <h2><a href="/posts/post-3/">Post 3</a></h2>
+  
+</main>
+  <footer><div class="footer-container">
+  <div class="footer-content">
+    <div class="footer-copyright">
+      © 2026 Danilo M.. All rights reserved.
+    </div>
+    <nav>
+      <ul class="footer-nav">
+        
+          <li><a href="/articles/">articles</a></li>
+        
+          <li><a href="/is/">about</a></li>
+        
+          <li><a href="/is/here/">contact</a></li>
+        
+      </ul>
+    </nav>
+  </div>
+</div>
+</footer>
+</body>
+</html>
diff --git a/public/tags/blue/index.xml b/public/tags/blue/index.xml
new file mode 100644 (file)
index 0000000..aa9747f
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
+  <channel>
+    <title>Blue on danilo m.</title>
+    <link>http://localhost:1313/tags/blue/</link>
+    <description>Recent content in Blue on danilo m.</description>
+    <generator>Hugo</generator>
+    <language>en-US</language>
+    <lastBuildDate>Wed, 15 Mar 2023 11:00:00 -0700</lastBuildDate>
+    <atom:link href="http://localhost:1313/tags/blue/index.xml" rel="self" type="application/rss+xml" />
+    <item>
+      <title>Post 3</title>
+      <link>http://localhost:1313/posts/post-3/</link>
+      <pubDate>Wed, 15 Mar 2023 11:00:00 -0700</pubDate>
+      <guid>http://localhost:1313/posts/post-3/</guid>
+      <description>&lt;p&gt;Occaecat aliqua consequat laborum ut ex aute aliqua culpa quis irure esse magna dolore quis. Proident fugiat labore eu laboris officia Lorem enim. Ipsum occaecat cillum ut tempor id sint aliqua incididunt nisi incididunt reprehenderit. Voluptate ad minim sint est aute aliquip esse occaecat tempor officia qui sunt. Aute ex ipsum id ut in est velit est laborum incididunt. Aliqua qui id do esse sunt eiusmod id deserunt eu nostrud aute sit ipsum. Deserunt esse cillum Lorem non magna adipisicing mollit amet consequat.&lt;/p&gt;</description>
+    </item>
+  </channel>
+</rss>
diff --git a/public/tags/green/index.html b/public/tags/green/index.html
new file mode 100644 (file)
index 0000000..025cdee
--- /dev/null
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html lang="en-US" dir="ltr">
+<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
+  <meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<meta name="description" content="Writing about IT, life, and the things that matter.">
+<meta name="theme-color" content="#060b10">
+<title>Green | danilo m.</title>
+
+
+      <link rel="stylesheet" href="/css/main.css">
+
+
+      <script src="/js/main.js"></script>
+
+
+</head>
+<body>
+  <div class="reading-progress"></div>
+  <header><div class="header-container">
+  <a href="/" class="site-title">Danilo M.</a>
+  <div class="header-controls">
+    <nav>
+      <ul>
+        
+          <li>
+            <a href="/articles/" >
+              articles
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/" >
+              about
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/here/" >
+              contact
+            </a>
+          </li>
+        
+      </ul>
+    </nav>
+    <button id="theme-toggle-btn" class="theme-toggle" aria-label="Toggle theme">🌙 dark</button>
+  </div>
+</div>
+</header>
+  <main>
+  <h1>Green</h1>
+  
+  
+    <h2><a href="/posts/post-3/">Post 3</a></h2>
+  
+    <h2><a href="/posts/post-2/">Post 2</a></h2>
+  
+</main>
+  <footer><div class="footer-container">
+  <div class="footer-content">
+    <div class="footer-copyright">
+      © 2026 Danilo M.. All rights reserved.
+    </div>
+    <nav>
+      <ul class="footer-nav">
+        
+          <li><a href="/articles/">articles</a></li>
+        
+          <li><a href="/is/">about</a></li>
+        
+          <li><a href="/is/here/">contact</a></li>
+        
+      </ul>
+    </nav>
+  </div>
+</div>
+</footer>
+</body>
+</html>
diff --git a/public/tags/green/index.xml b/public/tags/green/index.xml
new file mode 100644 (file)
index 0000000..2f9098a
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
+  <channel>
+    <title>Green on danilo m.</title>
+    <link>http://localhost:1313/tags/green/</link>
+    <description>Recent content in Green on danilo m.</description>
+    <generator>Hugo</generator>
+    <language>en-US</language>
+    <lastBuildDate>Wed, 15 Mar 2023 11:00:00 -0700</lastBuildDate>
+    <atom:link href="http://localhost:1313/tags/green/index.xml" rel="self" type="application/rss+xml" />
+    <item>
+      <title>Post 3</title>
+      <link>http://localhost:1313/posts/post-3/</link>
+      <pubDate>Wed, 15 Mar 2023 11:00:00 -0700</pubDate>
+      <guid>http://localhost:1313/posts/post-3/</guid>
+      <description>&lt;p&gt;Occaecat aliqua consequat laborum ut ex aute aliqua culpa quis irure esse magna dolore quis. Proident fugiat labore eu laboris officia Lorem enim. Ipsum occaecat cillum ut tempor id sint aliqua incididunt nisi incididunt reprehenderit. Voluptate ad minim sint est aute aliquip esse occaecat tempor officia qui sunt. Aute ex ipsum id ut in est velit est laborum incididunt. Aliqua qui id do esse sunt eiusmod id deserunt eu nostrud aute sit ipsum. Deserunt esse cillum Lorem non magna adipisicing mollit amet consequat.&lt;/p&gt;</description>
+    </item>
+    <item>
+      <title>Post 2</title>
+      <link>http://localhost:1313/posts/post-2/</link>
+      <pubDate>Wed, 15 Feb 2023 10:00:00 -0700</pubDate>
+      <guid>http://localhost:1313/posts/post-2/</guid>
+      <description>&lt;p&gt;Anim eiusmod irure incididunt sint cupidatat. Incididunt irure irure irure nisi ipsum do ut quis fugiat consectetur proident cupidatat incididunt cillum. Dolore voluptate occaecat qui mollit laborum ullamco et. Ipsum laboris officia anim laboris culpa eiusmod ex magna ex cupidatat anim ipsum aute. Mollit aliquip occaecat qui sunt velit ut cupidatat reprehenderit enim sunt laborum. Velit veniam in officia nulla adipisicing ut duis officia.&lt;/p&gt;&#xA;&lt;p&gt;Exercitation voluptate irure in irure tempor mollit Lorem nostrud ad officia. Velit id fugiat occaecat do tempor. Sit officia Lorem aliquip eu deserunt consectetur. Aute proident deserunt in nulla aliquip dolore ipsum Lorem ut cupidatat consectetur sit sint laborum. Esse cupidatat sit sint sunt tempor exercitation deserunt. Labore dolor duis laborum est do nisi ut veniam dolor et nostrud nostrud.&lt;/p&gt;</description>
+    </item>
+  </channel>
+</rss>
diff --git a/public/tags/index.html b/public/tags/index.html
new file mode 100644 (file)
index 0000000..ce1a253
--- /dev/null
@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+<html lang="en-US" dir="ltr">
+<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
+  <meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<meta name="description" content="Writing about IT, life, and the things that matter.">
+<meta name="theme-color" content="#060b10">
+<title>Tags | danilo m.</title>
+
+
+      <link rel="stylesheet" href="/css/main.css">
+
+
+      <script src="/js/main.js"></script>
+
+
+</head>
+<body>
+  <div class="reading-progress"></div>
+  <header><div class="header-container">
+  <a href="/" class="site-title">Danilo M.</a>
+  <div class="header-controls">
+    <nav>
+      <ul>
+        
+          <li>
+            <a href="/articles/" >
+              articles
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/" >
+              about
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/here/" >
+              contact
+            </a>
+          </li>
+        
+      </ul>
+    </nav>
+    <button id="theme-toggle-btn" class="theme-toggle" aria-label="Toggle theme">🌙 dark</button>
+  </div>
+</div>
+</header>
+  <main>
+  <h1>Tags</h1>
+  
+  
+    <h2><a href="/tags/blue/">Blue</a></h2>
+  
+    <h2><a href="/tags/green/">Green</a></h2>
+  
+    <h2><a href="/tags/red/">Red</a></h2>
+  
+</main>
+  <footer><div class="footer-container">
+  <div class="footer-content">
+    <div class="footer-copyright">
+      © 2026 Danilo M.. All rights reserved.
+    </div>
+    <nav>
+      <ul class="footer-nav">
+        
+          <li><a href="/articles/">articles</a></li>
+        
+          <li><a href="/is/">about</a></li>
+        
+          <li><a href="/is/here/">contact</a></li>
+        
+      </ul>
+    </nav>
+  </div>
+</div>
+</footer>
+</body>
+</html>
diff --git a/public/tags/index.xml b/public/tags/index.xml
new file mode 100644 (file)
index 0000000..3a78b22
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
+  <channel>
+    <title>Tags on danilo m.</title>
+    <link>http://localhost:1313/tags/</link>
+    <description>Recent content in Tags on danilo m.</description>
+    <generator>Hugo</generator>
+    <language>en-US</language>
+    <lastBuildDate>Wed, 15 Mar 2023 11:00:00 -0700</lastBuildDate>
+    <atom:link href="http://localhost:1313/tags/index.xml" rel="self" type="application/rss+xml" />
+    <item>
+      <title>Blue</title>
+      <link>http://localhost:1313/tags/blue/</link>
+      <pubDate>Wed, 15 Mar 2023 11:00:00 -0700</pubDate>
+      <guid>http://localhost:1313/tags/blue/</guid>
+      <description></description>
+    </item>
+    <item>
+      <title>Green</title>
+      <link>http://localhost:1313/tags/green/</link>
+      <pubDate>Wed, 15 Mar 2023 11:00:00 -0700</pubDate>
+      <guid>http://localhost:1313/tags/green/</guid>
+      <description></description>
+    </item>
+    <item>
+      <title>Red</title>
+      <link>http://localhost:1313/tags/red/</link>
+      <pubDate>Wed, 15 Mar 2023 11:00:00 -0700</pubDate>
+      <guid>http://localhost:1313/tags/red/</guid>
+      <description></description>
+    </item>
+  </channel>
+</rss>
diff --git a/public/tags/red/index.html b/public/tags/red/index.html
new file mode 100644 (file)
index 0000000..7617dd6
--- /dev/null
@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+<html lang="en-US" dir="ltr">
+<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
+  <meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<meta name="description" content="Writing about IT, life, and the things that matter.">
+<meta name="theme-color" content="#060b10">
+<title>Red | danilo m.</title>
+
+
+      <link rel="stylesheet" href="/css/main.css">
+
+
+      <script src="/js/main.js"></script>
+
+
+</head>
+<body>
+  <div class="reading-progress"></div>
+  <header><div class="header-container">
+  <a href="/" class="site-title">Danilo M.</a>
+  <div class="header-controls">
+    <nav>
+      <ul>
+        
+          <li>
+            <a href="/articles/" >
+              articles
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/" >
+              about
+            </a>
+          </li>
+        
+          <li>
+            <a href="/is/here/" >
+              contact
+            </a>
+          </li>
+        
+      </ul>
+    </nav>
+    <button id="theme-toggle-btn" class="theme-toggle" aria-label="Toggle theme">🌙 dark</button>
+  </div>
+</div>
+</header>
+  <main>
+  <h1>Red</h1>
+  
+  
+    <h2><a href="/posts/post-3/">Post 3</a></h2>
+  
+    <h2><a href="/posts/post-2/">Post 2</a></h2>
+  
+    <h2><a href="/posts/post-1/">Post 1</a></h2>
+  
+</main>
+  <footer><div class="footer-container">
+  <div class="footer-content">
+    <div class="footer-copyright">
+      © 2026 Danilo M.. All rights reserved.
+    </div>
+    <nav>
+      <ul class="footer-nav">
+        
+          <li><a href="/articles/">articles</a></li>
+        
+          <li><a href="/is/">about</a></li>
+        
+          <li><a href="/is/here/">contact</a></li>
+        
+      </ul>
+    </nav>
+  </div>
+</div>
+</footer>
+</body>
+</html>
diff --git a/public/tags/red/index.xml b/public/tags/red/index.xml
new file mode 100644 (file)
index 0000000..84e6c56
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
+  <channel>
+    <title>Red on danilo m.</title>
+    <link>http://localhost:1313/tags/red/</link>
+    <description>Recent content in Red on danilo m.</description>
+    <generator>Hugo</generator>
+    <language>en-US</language>
+    <lastBuildDate>Wed, 15 Mar 2023 11:00:00 -0700</lastBuildDate>
+    <atom:link href="http://localhost:1313/tags/red/index.xml" rel="self" type="application/rss+xml" />
+    <item>
+      <title>Post 3</title>
+      <link>http://localhost:1313/posts/post-3/</link>
+      <pubDate>Wed, 15 Mar 2023 11:00:00 -0700</pubDate>
+      <guid>http://localhost:1313/posts/post-3/</guid>
+      <description>&lt;p&gt;Occaecat aliqua consequat laborum ut ex aute aliqua culpa quis irure esse magna dolore quis. Proident fugiat labore eu laboris officia Lorem enim. Ipsum occaecat cillum ut tempor id sint aliqua incididunt nisi incididunt reprehenderit. Voluptate ad minim sint est aute aliquip esse occaecat tempor officia qui sunt. Aute ex ipsum id ut in est velit est laborum incididunt. Aliqua qui id do esse sunt eiusmod id deserunt eu nostrud aute sit ipsum. Deserunt esse cillum Lorem non magna adipisicing mollit amet consequat.&lt;/p&gt;</description>
+    </item>
+    <item>
+      <title>Post 2</title>
+      <link>http://localhost:1313/posts/post-2/</link>
+      <pubDate>Wed, 15 Feb 2023 10:00:00 -0700</pubDate>
+      <guid>http://localhost:1313/posts/post-2/</guid>
+      <description>&lt;p&gt;Anim eiusmod irure incididunt sint cupidatat. Incididunt irure irure irure nisi ipsum do ut quis fugiat consectetur proident cupidatat incididunt cillum. Dolore voluptate occaecat qui mollit laborum ullamco et. Ipsum laboris officia anim laboris culpa eiusmod ex magna ex cupidatat anim ipsum aute. Mollit aliquip occaecat qui sunt velit ut cupidatat reprehenderit enim sunt laborum. Velit veniam in officia nulla adipisicing ut duis officia.&lt;/p&gt;&#xA;&lt;p&gt;Exercitation voluptate irure in irure tempor mollit Lorem nostrud ad officia. Velit id fugiat occaecat do tempor. Sit officia Lorem aliquip eu deserunt consectetur. Aute proident deserunt in nulla aliquip dolore ipsum Lorem ut cupidatat consectetur sit sint laborum. Esse cupidatat sit sint sunt tempor exercitation deserunt. Labore dolor duis laborum est do nisi ut veniam dolor et nostrud nostrud.&lt;/p&gt;</description>
+    </item>
+    <item>
+      <title>Post 1</title>
+      <link>http://localhost:1313/posts/post-1/</link>
+      <pubDate>Sun, 15 Jan 2023 09:00:00 -0700</pubDate>
+      <guid>http://localhost:1313/posts/post-1/</guid>
+      <description>&lt;p&gt;Tempor proident minim aliquip reprehenderit dolor et ad anim Lorem duis sint eiusmod. Labore ut ea duis dolor. Incididunt consectetur proident qui occaecat incididunt do nisi Lorem. Tempor do laborum elit laboris excepteur eiusmod do. Eiusmod nisi excepteur ut amet pariatur adipisicing Lorem.&lt;/p&gt;&#xA;&lt;p&gt;Occaecat nulla excepteur dolore excepteur duis eiusmod ullamco officia anim in voluptate ea occaecat officia. Cillum sint esse velit ea officia minim fugiat. Elit ea esse id aliquip pariatur cupidatat id duis minim incididunt ea ea. Anim ut duis sunt nisi. Culpa cillum sit voluptate voluptate eiusmod dolor. Enim nisi Lorem ipsum irure est excepteur voluptate eu in enim nisi. Nostrud ipsum Lorem anim sint labore consequat do.&lt;/p&gt;</description>
+    </item>
+  </channel>
+</rss>