]> danix's work - danix.xyz-2.git/commitdiff
fix: implement proper language-specific 404 layouts
authorDanilo M. <redacted>
Fri, 17 Apr 2026 10:49:46 +0000 (12:49 +0200)
committerDanilo M. <redacted>
Fri, 17 Apr 2026 10:49:46 +0000 (12:49 +0200)
Created 404.en.html and 404.it.html in themes/danix-xyz-hacker/layouts/
following Hugo's standard pattern for language-specific templates. Each
layout uses i18n for translations and links to the correct language-specific
sections. Hugo automatically selects the correct template based on request
language.

Co-Authored-By: Claude Haiku 4.5 <redacted>
content/en/404.md [deleted file]
content/it/404.md [deleted file]
themes/danix-xyz-hacker/layouts/404.en.html [moved from themes/danix-xyz-hacker/layouts/_default/404.html with 92% similarity]
themes/danix-xyz-hacker/layouts/404.it.html [new file with mode: 0644]

diff --git a/content/en/404.md b/content/en/404.md
deleted file mode 100644 (file)
index 70d89ca..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: "404"
-url: /404.html
-outputs:
-  - html
----
diff --git a/content/it/404.md b/content/it/404.md
deleted file mode 100644 (file)
index 0ef9769..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: "404"
-url: "404.html"
-outputs:
-  - html
----
similarity index 92%
rename from themes/danix-xyz-hacker/layouts/_default/404.html
rename to themes/danix-xyz-hacker/layouts/404.en.html
index 4b313cd57f1f4197c3e840bd14f5b8351532ea1a..6ed4892387f9ccf9716be409beb81f20ef12685e 100644 (file)
@@ -77,17 +77,13 @@ window.articlesData = [
 
     <!-- Navigation Links -->
     <div class="space-y-4 flex flex-col items-center mb-12">
-      {{ $homeLink := "/" }}
-      {{ if eq .Lang "it" }}
-        {{ $homeLink = "/it/" }}
-      {{ end }}
-      <a href="{{ $homeLink }}" class="btn btn-primary">
+      <a href="/" class="btn btn-primary">
         {{ i18n "goHome" }}
       </a>
-      <a href="{{ if eq .Lang "it" }}/it{{ end }}/articles/" class="btn btn-secondary">
+      <a href="/articles/" class="btn btn-secondary">
         {{ i18n "browseArticles" }}
       </a>
-      <a href="{{ if eq .Lang "it" }}/it{{ end }}/is/here/" class="btn btn-outline">
+      <a href="/is/here/" class="btn btn-outline">
         {{ i18n "contactSupport" }}
       </a>
     </div>
@@ -123,7 +119,7 @@ window.articlesData = [
           <div class="space-y-4">
             <button
               type="button"
-              @click="showEasterEgg = false; window.location.href = '{{ .Site.BaseURL }}{{ if eq .Lang "it" }}it/{{ end }}'"
+              @click="showEasterEgg = false; window.location.href = '{{ .Site.BaseURL }}'"
               class="w-full btn btn-primary"
             >
               💊 {{ i18n "bluePill" }}
diff --git a/themes/danix-xyz-hacker/layouts/404.it.html b/themes/danix-xyz-hacker/layouts/404.it.html
new file mode 100644 (file)
index 0000000..805b19a
--- /dev/null
@@ -0,0 +1,151 @@
+{{ define "main" }}
+
+<!-- Pass articles data to JavaScript for Alpine.js -->
+<script>
+window.articlesData = [
+  {{ range (where .Site.RegularPages "Section" "articles") }}
+  {
+    title: '{{ .Title | safeJS }}',
+    url: '{{ .Permalink }}',
+    date: '{{ .Date.Format "Jan 02, 2006" }}',
+    content: '{{ (.Summary | plainify | safeJS) }}'
+  },
+  {{ end }}
+];
+</script>
+
+<main class="min-h-screen px-4 py-12">
+  <div class="mx-auto px-4 py-12 max-w-4xl border border-border glow-accent rounded-lg bg-bg p-8" x-data="notFoundPage()">
+    <div class="text-center">
+    <!-- 404 Heading -->
+    <h1 class="text-7xl md:text-8xl font-bold text-accent mb-4 animate-fade-in">
+      404
+    </h1>
+
+    <!-- Error Message -->
+    <h2 class="text-3xl md:text-4xl font-bold mb-6">
+      {{ i18n "notFound" }}
+    </h2>
+
+    <p class="text-lg text-text-dim mb-8">
+      {{ i18n "notFoundMessage" }}
+    </p>
+
+    <!-- Search Box -->
+    <div class="mb-12">
+      <form id="search-form" class="flex flex-col gap-4">
+        <label for="search-input" class="sr-only">{{ i18n "searchPlaceholder" }}</label>
+        <input
+          id="search-input"
+          type="text"
+          placeholder="{{ (i18n "searchPlaceholder") }}"
+          class="px-4 py-3 border-2 border-border rounded focus:outline-none focus:ring-2 focus:ring-accent focus:border-transparent bg-bg text-text"
+          @input="filterArticles($el.value)"
+        />
+      </form>
+      <div id="search-results" class="mt-4 text-left space-y-3" x-show="filteredArticles.length > 0">
+        <template x-for="article in filteredArticles" :key="article.title">
+          <div class="p-4 border-l-4 border-accent bg-bg/50 hover:bg-bg/70 transition-colors">
+            <a :href="article.url" class="block text-left">
+              <h4 class="font-bold text-accent hover:underline" x-text="article.title"></h4>
+              <p class="text-sm text-text-dim mt-1" x-text="article.date"></p>
+            </a>
+          </div>
+        </template>
+      </div>
+      <div x-show="searchQuery && filteredArticles.length === 0" class="mt-4 text-text-dim">
+        {{ i18n "noSearchResults" }}
+      </div>
+    </div>
+
+    <!-- Recent Articles Section -->
+    <div class="mb-12">
+      <h3 class="text-2xl font-bold mb-6">{{ i18n "recentArticles" }}</h3>
+      <div class="space-y-4">
+        {{ range first 5 (where .Site.RegularPages "Section" "articles") }}
+        <div class="p-4 border-l-4 border-accent bg-bg/50 hover:bg-bg/70 transition-colors">
+          <a href="{{ .Permalink }}" class="block text-left">
+            <h4 class="font-bold text-accent hover:underline">{{ .Title }}</h4>
+            <p class="text-sm text-text-dim mt-1">
+              {{ .Date.Format "Jan 02, 2006" }}
+            </p>
+          </a>
+        </div>
+        {{ end }}
+      </div>
+    </div>
+
+    <!-- Navigation Links -->
+    <div class="space-y-4 flex flex-col items-center mb-12">
+      <a href="/it/" class="btn btn-primary">
+        {{ i18n "goHome" }}
+      </a>
+      <a href="/it/articles/" class="btn btn-secondary">
+        {{ i18n "browseArticles" }}
+      </a>
+      <a href="/it/is/here/" class="btn btn-outline">
+        {{ i18n "contactSupport" }}
+      </a>
+    </div>
+
+    <!-- Easter Egg Trigger -->
+    <div class="mt-12 pt-8 border-t border-border">
+      <button
+        type="button"
+        @click="toggleEasterEgg()"
+        class="text-sm text-text-dim hover:text-accent transition-colors underline"
+      >
+        {{ i18n "followWhiteRabbit" }}
+      </button>
+    </div>
+
+      <!-- Easter Egg Modal (Hidden by default) -->
+      <div
+        class="fixed inset-0 z-50"
+        :class="{ 'flex items-center justify-center': showEasterEgg, 'hidden': !showEasterEgg }"
+        x-show="showEasterEgg"
+        x-cloak
+      >
+        <!-- Overlay -->
+        <div
+          class="absolute inset-0 bg-black/50"
+          @click="showEasterEgg = false"
+        ></div>
+
+        <!-- Modal Content -->
+        <div class="relative bg-bg border-2 border-accent p-8 rounded-lg shadow-xl max-w-md mx-4">
+          <h2 class="text-2xl font-bold mb-6 text-accent">{{ i18n "easterEggTitle" }}</h2>
+
+          <div class="space-y-4">
+            <button
+              type="button"
+              @click="showEasterEgg = false; window.location.href = '{{ .Site.BaseURL }}it/'"
+              class="w-full btn btn-primary"
+            >
+              💊 {{ i18n "bluePill" }}
+            </button>
+
+            <button
+              type="button"
+              @click="goToRandomArticle()"
+              class="w-full btn btn-secondary"
+            >
+              🐰 {{ i18n "redPill" }}
+            </button>
+          </div>
+
+          <button
+            type="button"
+            @click="showEasterEgg = false"
+            class="absolute top-4 right-4 text-text-dim hover:text-text dark:hover:text-text transition-colors"
+            aria-label="Close modal"
+          >
+            ✕
+          </button>
+        </div>
+      </div>
+    </div>
+  </div>
+</main>
+
+{{ end }}