add docker compose for instant publishing
This commit is contained in:
1 parent
62915618fa
commit
7b368bc958
21 files changed
+14
-5199
No files matched your search
@@ -1,508 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de" dir="ltr">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<link rel="icon" type="image/png" href="/avatar.png">
|
||||
<title></title>
|
||||
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
|
||||
<link rel="stylesheet" type='text/css' href="https://cdn.jsdelivr.net/gh/devicons/devicon@latest/devicon.min.css" />
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/css/all.min.css"
|
||||
integrity="sha512-2SwdPD6INVrV/lHTZbO2nodKhrnDdJK9/kg2XD1r9uGqPo1cUbujc+IYdlYdEErWNu69gVcYgdxlmVmzTWnetw=="
|
||||
crossorigin="anonymous" referrerpolicy="no-referrer" />
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=Ubuntu+Sans+Mono:ital,wght@0,400..700;1,400..700&display=swap');
|
||||
|
||||
.font-jersey {
|
||||
|
||||
font-family: "Ubuntu Sans Mono", monospace;
|
||||
font-optical-sizing: auto;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
|
||||
.md-content .katex-display {
|
||||
max-width: 100%;
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
padding-left: 0.25rem;
|
||||
padding-right: 0.25rem;
|
||||
}
|
||||
|
||||
.md-content .katex-display>.katex {
|
||||
display: inline-block;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.swup-transition-fade {
|
||||
opacity: 1;
|
||||
transition: 300ms ease-in-out;
|
||||
}
|
||||
|
||||
.is-animating .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.swup-transition-fade {
|
||||
opacity: 1;
|
||||
transition: opacity 300ms ease-in-out;
|
||||
}
|
||||
|
||||
html.is-animating .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
html.is-animating {
|
||||
cursor: progress;
|
||||
}
|
||||
|
||||
html.is-leaving .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script src="https://unpkg.com/swup@4"></script>
|
||||
<script src="https://unpkg.com/@swup/preload-plugin@3"></script>
|
||||
<script src="https://unpkg.com/@swup/progress-plugin@3"></script>
|
||||
<script>
|
||||
const swup = new Swup({
|
||||
containers: ['#swup'],
|
||||
animationSelector: '[class*="swup-transition-"]',
|
||||
cache: true,
|
||||
preload: true,
|
||||
animateHistoryBrowsing: true,
|
||||
|
||||
plugins: [
|
||||
new SwupPreloadPlugin(),
|
||||
new SwupProgressPlugin()
|
||||
]
|
||||
})
|
||||
window.swup = swup
|
||||
</script>
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.css" crossorigin="anonymous">
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.js" crossorigin="anonymous"></script>
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/contrib/auto-render.min.js"
|
||||
crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
|
||||
|
||||
|
||||
const KATEX_CONFIG = {
|
||||
delimiters: [
|
||||
{left: "$$", right: "$$", display: true},
|
||||
{left: "$", right: "$", display: false},
|
||||
{left: "\\[", right: "\\]", display: true},
|
||||
{left: "\\(", right: "\\)", display: false}
|
||||
],
|
||||
ignoredTags: ["script", "noscript", "style", "textarea", "pre", "code"],
|
||||
throwOnError: false
|
||||
};
|
||||
|
||||
|
||||
function renderKatex() {
|
||||
|
||||
if (typeof renderMathInElement !== "function") {
|
||||
console.log("⏳ Waiting for KaTeX to load...");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const contentArea = document.getElementById('swup') || document.body;
|
||||
|
||||
try {
|
||||
renderMathInElement(contentArea, KATEX_CONFIG);
|
||||
console.log("✅ KaTeX rendered successfully");
|
||||
} catch (error) {
|
||||
console.error("❌ KaTeX rendering error:", error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function renderKatexWithRetry(maxRetries = 10, delay = 100) {
|
||||
let attempts = 0;
|
||||
|
||||
const attempt = () => {
|
||||
if (typeof renderMathInElement === "function") {
|
||||
renderKatex();
|
||||
} else if (attempts < maxRetries) {
|
||||
attempts++;
|
||||
setTimeout(attempt, delay);
|
||||
} else {
|
||||
console.warn("⚠️ KaTeX auto-render not available after", maxRetries, "attempts");
|
||||
}
|
||||
};
|
||||
|
||||
attempt();
|
||||
}
|
||||
|
||||
|
||||
function setupSwupIntegration() {
|
||||
|
||||
if (window.swup) {
|
||||
window.swup.hooks.on('page:view', () => {
|
||||
console.log("🔄 Swup transition complete, re-rendering KaTeX...");
|
||||
|
||||
setTimeout(() => renderKatexWithRetry(3, 50), 50);
|
||||
});
|
||||
console.log("✅ KaTeX-Swup integration ready");
|
||||
} else {
|
||||
|
||||
setTimeout(setupSwupIntegration, 100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
console.log("🚀 Initializing KaTeX...");
|
||||
|
||||
|
||||
renderKatexWithRetry();
|
||||
|
||||
|
||||
setupSwupIntegration();
|
||||
});
|
||||
|
||||
|
||||
window.renderKatex = renderKatex;
|
||||
</script>
|
||||
|
||||
<script type="module">
|
||||
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
|
||||
|
||||
let initialized = false;
|
||||
|
||||
function renderMermaid() {
|
||||
const contentArea = document.getElementById('swup') || document.body;
|
||||
const mermaidBlocks = contentArea.querySelectorAll('.language-mermaid, .mermaid');
|
||||
|
||||
if (mermaidBlocks.length === 0) {
|
||||
console.log("ℹ️ No mermaid blocks found on this page");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!initialized) {
|
||||
mermaid.initialize({startOnLoad: false, theme: 'dark'});
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
mermaidBlocks.forEach(el => {
|
||||
if (el.dataset.processed === 'true') {
|
||||
const source = el.dataset.mermaidSource;
|
||||
if (source) {
|
||||
el.innerHTML = source;
|
||||
el.removeAttribute('data-processed');
|
||||
}
|
||||
} else {
|
||||
el.dataset.mermaidSource = el.textContent;
|
||||
}
|
||||
});
|
||||
|
||||
mermaid.run({nodes: mermaidBlocks})
|
||||
.then(() => console.log("✅ Mermaid rendered successfully"))
|
||||
.catch(err => console.error("❌ Mermaid rendering error:", err));
|
||||
}
|
||||
|
||||
function renderMermaidWithRetry(maxRetries = 10, delay = 100) {
|
||||
let attempts = 0;
|
||||
|
||||
const attempt = () => {
|
||||
if (typeof mermaid.initialize === "function") {
|
||||
renderMermaid();
|
||||
} else if (attempts < maxRetries) {
|
||||
attempts++;
|
||||
setTimeout(attempt, delay);
|
||||
} else {
|
||||
console.warn("⚠️ Mermaid auto-render not available after", maxRetries, "attempts");
|
||||
}
|
||||
};
|
||||
|
||||
attempt();
|
||||
}
|
||||
|
||||
|
||||
function setupSwupIntegration() {
|
||||
|
||||
if (window.swup) {
|
||||
window.swup.hooks.on('page:view', () => {
|
||||
console.log("🔄 Swup transition complete, re-rendering mermaid...");
|
||||
|
||||
setTimeout(() => renderMermaidWithRetry(3, 50), 50);
|
||||
});
|
||||
console.log("✅ Mermaid-Swup integration ready");
|
||||
} else {
|
||||
|
||||
setTimeout(setupSwupIntegration, 100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
console.log("🚀 Initializing KaTeX...");
|
||||
|
||||
|
||||
renderMermaidWithRetry();
|
||||
|
||||
|
||||
setupSwupIntegration();
|
||||
});
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
</head>
|
||||
|
||||
<body class="min-h-screen flex flex-col bg-black font-jersey text-white text-3xl">
|
||||
<header>
|
||||
<div class="sticky absolute top-0 z-50">
|
||||
<nav class="w-full border-b border-gray-800 bg-[#070709]/95 backdrop-blur-sm text-gray-100">
|
||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
||||
<div class="flex items-center justify-between h-16">
|
||||
|
||||
<div class="flex items-center gap-3">
|
||||
|
||||
<a href='https://thereisno.space/' class="flex items-center gap-3 group" aria-label="Homepage">
|
||||
|
||||
<img src='/avatar.jpg' alt="ThereIsNo.Space"
|
||||
class="w-10 h-10 rounded-sm border-2 border-gray-700 object-cover transition-transform duration-300 transform group-hover:scale-105"
|
||||
style="animation: border-breathe 4s ease-in-out infinite;" />
|
||||
<span class="text-white text-lg sm:text-xl md:text-2xl lg:text-3xl font-semibold tracking-wide">
|
||||
ThereIsNo.Space
|
||||
<span class="inline-block ml-2" style="animation: flicker 1.6s steps(2, end) infinite;">_</span>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex items-center gap-4">
|
||||
|
||||
<div class="hidden md:flex items-center">
|
||||
|
||||
|
||||
<nav aria-label="Primary" class="w-full">
|
||||
<ul
|
||||
class="flex flex-col md:flex-row md:items-center md:space-x-6 space-y-2 md:space-y-0 sm:text-lg md:text-xl lg:text-3xl"><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Projects</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/blog/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Blog</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Über uns</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div class="md:hidden">
|
||||
<button id="nav-toggle" aria-controls="mobile-menu" aria-expanded="false"
|
||||
class="inline-flex items-center justify-center p-2 rounded-md focus:outline-none focus:ring-2 focus:ring-indigo-400"
|
||||
aria-label="Open menu">
|
||||
<svg class="h-6 w-6 text-gray-200" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
|
||||
stroke="currentColor" aria-hidden="true">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="mobile-menu" class="md:hidden hidden pb-4">
|
||||
|
||||
|
||||
|
||||
<nav aria-label="Primary" class="w-full">
|
||||
<ul
|
||||
class="flex flex-col md:flex-row md:items-center md:space-x-6 space-y-2 md:space-y-0 sm:text-lg md:text-xl lg:text-3xl"><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Projects</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/blog/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Blog</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Über uns</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<style>
|
||||
@keyframes flicker {
|
||||
0% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
10% {
|
||||
opacity: 0.2;
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
20% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes border-breathe {
|
||||
0% {
|
||||
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.06);
|
||||
}
|
||||
|
||||
50% {
|
||||
box-shadow: 0 0 18px 6px rgba(99, 102, 241, 0.03);
|
||||
}
|
||||
|
||||
100% {
|
||||
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.06);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<script>
|
||||
(function () {
|
||||
const btn = document.getElementById('nav-toggle');
|
||||
const menu = document.getElementById('mobile-menu');
|
||||
if (!btn || !menu) return;
|
||||
btn.addEventListener('click', () => {
|
||||
const open = menu.classList.toggle('hidden') === false;
|
||||
btn.setAttribute('aria-expanded', open ? 'true' : 'false');
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</div>
|
||||
|
||||
</header>
|
||||
|
||||
<main class="flex-1 w-full">
|
||||
<div id="swup" class="swup-transition-fade">
|
||||
<div class="max-w-3xl lg:max-w-6xl xl:max-w-7xl mx-auto px-5 sm:px-8 lg:px-10 py-10 lg:py-16">
|
||||
|
||||
<h1></h1>
|
||||
|
||||
|
||||
|
||||
<time datetime="0001-01-01T00:00:00+00:00">1. Januar 1</time>
|
||||
|
||||
<h1 id="über-thereisnospace" class=" mt-8 mb-3 text-2xl sm:text-3xl text-white">
|
||||
<span class="relative inline-block">
|
||||
Über ThereIsNo.Space
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-px w-0 bg-indigo-400"></span>
|
||||
</span>
|
||||
</h1>
|
||||
<p>ThereIsNo.Space ist ein sich im aufbau befindlicher Hacker und Makerspace.</p>
|
||||
<h2 id="unsere-werte" class="mt-8 mb-3 text-xl sm:text-2xl text-white">
|
||||
<span class="relative inline-block">
|
||||
Unsere Werte
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-px w-0 bg-indigo-400"></span>
|
||||
</span>
|
||||
</h2>
|
||||
<ul>
|
||||
<li>Open Knowledge – Wissen teilen statt horten</li>
|
||||
<li>Hands-on – Lernen durch Ausprobieren</li>
|
||||
<li>Community – Alle sind willkommen, egal welches Skill-Level</li>
|
||||
</ul>
|
||||
<h2 id="kontakt" class="mt-8 mb-3 text-xl sm:text-2xl text-white">
|
||||
<span class="relative inline-block">
|
||||
Kontakt
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-px w-0 bg-indigo-400"></span>
|
||||
</span>
|
||||
</h2>
|
||||
<p>E-Mail: <a href="mailto:info@thereisno.space">info@thereisno.space</a>
|
||||
Matrix: #ThereIsNoSpace:wolffy.eu
|
||||
Oder Triff uns auf Events!</p>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<div class="border-t border-gray-800 bg-[#070709] text-gray-400">
|
||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
||||
<div class="flex flex-col md:flex-row items-center justify-between py-6 space-y-4 md:space-y-0">
|
||||
|
||||
|
||||
<div class="text-sm sm:text-base md:text-lg">
|
||||
<span class="relative inline-block">
|
||||
© 2026 ThereIsNo.Space. All rights reserved. <br>
|
||||
Made with <a href="https://gohugo.io" target="_blank">Hugo</a> | <a
|
||||
href="https://github.com/Enerhim/enervoid-theme" target="_blank">Enervoid</a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex items-center space-x-6 text-sm sm:text-base md:text-lg">
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</footer>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
BIN
Binary file not shown.
|
Before Width: | Height: | Size: 11 KiB |
-501
@@ -1,501 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de" dir="ltr">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<link rel="icon" type="image/png" href="/avatar.png">
|
||||
<title>Blog</title>
|
||||
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
|
||||
<link rel="stylesheet" type='text/css' href="https://cdn.jsdelivr.net/gh/devicons/devicon@latest/devicon.min.css" />
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/css/all.min.css"
|
||||
integrity="sha512-2SwdPD6INVrV/lHTZbO2nodKhrnDdJK9/kg2XD1r9uGqPo1cUbujc+IYdlYdEErWNu69gVcYgdxlmVmzTWnetw=="
|
||||
crossorigin="anonymous" referrerpolicy="no-referrer" />
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=Ubuntu+Sans+Mono:ital,wght@0,400..700;1,400..700&display=swap');
|
||||
|
||||
.font-jersey {
|
||||
|
||||
font-family: "Ubuntu Sans Mono", monospace;
|
||||
font-optical-sizing: auto;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
|
||||
.md-content .katex-display {
|
||||
max-width: 100%;
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
padding-left: 0.25rem;
|
||||
padding-right: 0.25rem;
|
||||
}
|
||||
|
||||
.md-content .katex-display>.katex {
|
||||
display: inline-block;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.swup-transition-fade {
|
||||
opacity: 1;
|
||||
transition: 300ms ease-in-out;
|
||||
}
|
||||
|
||||
.is-animating .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.swup-transition-fade {
|
||||
opacity: 1;
|
||||
transition: opacity 300ms ease-in-out;
|
||||
}
|
||||
|
||||
html.is-animating .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
html.is-animating {
|
||||
cursor: progress;
|
||||
}
|
||||
|
||||
html.is-leaving .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script src="https://unpkg.com/swup@4"></script>
|
||||
<script src="https://unpkg.com/@swup/preload-plugin@3"></script>
|
||||
<script src="https://unpkg.com/@swup/progress-plugin@3"></script>
|
||||
<script>
|
||||
const swup = new Swup({
|
||||
containers: ['#swup'],
|
||||
animationSelector: '[class*="swup-transition-"]',
|
||||
cache: true,
|
||||
preload: true,
|
||||
animateHistoryBrowsing: true,
|
||||
|
||||
plugins: [
|
||||
new SwupPreloadPlugin(),
|
||||
new SwupProgressPlugin()
|
||||
]
|
||||
})
|
||||
window.swup = swup
|
||||
</script>
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.css" crossorigin="anonymous">
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.js" crossorigin="anonymous"></script>
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/contrib/auto-render.min.js"
|
||||
crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
|
||||
|
||||
|
||||
const KATEX_CONFIG = {
|
||||
delimiters: [
|
||||
{left: "$$", right: "$$", display: true},
|
||||
{left: "$", right: "$", display: false},
|
||||
{left: "\\[", right: "\\]", display: true},
|
||||
{left: "\\(", right: "\\)", display: false}
|
||||
],
|
||||
ignoredTags: ["script", "noscript", "style", "textarea", "pre", "code"],
|
||||
throwOnError: false
|
||||
};
|
||||
|
||||
|
||||
function renderKatex() {
|
||||
|
||||
if (typeof renderMathInElement !== "function") {
|
||||
console.log("⏳ Waiting for KaTeX to load...");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const contentArea = document.getElementById('swup') || document.body;
|
||||
|
||||
try {
|
||||
renderMathInElement(contentArea, KATEX_CONFIG);
|
||||
console.log("✅ KaTeX rendered successfully");
|
||||
} catch (error) {
|
||||
console.error("❌ KaTeX rendering error:", error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function renderKatexWithRetry(maxRetries = 10, delay = 100) {
|
||||
let attempts = 0;
|
||||
|
||||
const attempt = () => {
|
||||
if (typeof renderMathInElement === "function") {
|
||||
renderKatex();
|
||||
} else if (attempts < maxRetries) {
|
||||
attempts++;
|
||||
setTimeout(attempt, delay);
|
||||
} else {
|
||||
console.warn("⚠️ KaTeX auto-render not available after", maxRetries, "attempts");
|
||||
}
|
||||
};
|
||||
|
||||
attempt();
|
||||
}
|
||||
|
||||
|
||||
function setupSwupIntegration() {
|
||||
|
||||
if (window.swup) {
|
||||
window.swup.hooks.on('page:view', () => {
|
||||
console.log("🔄 Swup transition complete, re-rendering KaTeX...");
|
||||
|
||||
setTimeout(() => renderKatexWithRetry(3, 50), 50);
|
||||
});
|
||||
console.log("✅ KaTeX-Swup integration ready");
|
||||
} else {
|
||||
|
||||
setTimeout(setupSwupIntegration, 100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
console.log("🚀 Initializing KaTeX...");
|
||||
|
||||
|
||||
renderKatexWithRetry();
|
||||
|
||||
|
||||
setupSwupIntegration();
|
||||
});
|
||||
|
||||
|
||||
window.renderKatex = renderKatex;
|
||||
</script>
|
||||
|
||||
<script type="module">
|
||||
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
|
||||
|
||||
let initialized = false;
|
||||
|
||||
function renderMermaid() {
|
||||
const contentArea = document.getElementById('swup') || document.body;
|
||||
const mermaidBlocks = contentArea.querySelectorAll('.language-mermaid, .mermaid');
|
||||
|
||||
if (mermaidBlocks.length === 0) {
|
||||
console.log("ℹ️ No mermaid blocks found on this page");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!initialized) {
|
||||
mermaid.initialize({startOnLoad: false, theme: 'dark'});
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
mermaidBlocks.forEach(el => {
|
||||
if (el.dataset.processed === 'true') {
|
||||
const source = el.dataset.mermaidSource;
|
||||
if (source) {
|
||||
el.innerHTML = source;
|
||||
el.removeAttribute('data-processed');
|
||||
}
|
||||
} else {
|
||||
el.dataset.mermaidSource = el.textContent;
|
||||
}
|
||||
});
|
||||
|
||||
mermaid.run({nodes: mermaidBlocks})
|
||||
.then(() => console.log("✅ Mermaid rendered successfully"))
|
||||
.catch(err => console.error("❌ Mermaid rendering error:", err));
|
||||
}
|
||||
|
||||
function renderMermaidWithRetry(maxRetries = 10, delay = 100) {
|
||||
let attempts = 0;
|
||||
|
||||
const attempt = () => {
|
||||
if (typeof mermaid.initialize === "function") {
|
||||
renderMermaid();
|
||||
} else if (attempts < maxRetries) {
|
||||
attempts++;
|
||||
setTimeout(attempt, delay);
|
||||
} else {
|
||||
console.warn("⚠️ Mermaid auto-render not available after", maxRetries, "attempts");
|
||||
}
|
||||
};
|
||||
|
||||
attempt();
|
||||
}
|
||||
|
||||
|
||||
function setupSwupIntegration() {
|
||||
|
||||
if (window.swup) {
|
||||
window.swup.hooks.on('page:view', () => {
|
||||
console.log("🔄 Swup transition complete, re-rendering mermaid...");
|
||||
|
||||
setTimeout(() => renderMermaidWithRetry(3, 50), 50);
|
||||
});
|
||||
console.log("✅ Mermaid-Swup integration ready");
|
||||
} else {
|
||||
|
||||
setTimeout(setupSwupIntegration, 100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
console.log("🚀 Initializing KaTeX...");
|
||||
|
||||
|
||||
renderMermaidWithRetry();
|
||||
|
||||
|
||||
setupSwupIntegration();
|
||||
});
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
</head>
|
||||
|
||||
<body class="min-h-screen flex flex-col bg-black font-jersey text-white text-3xl">
|
||||
<header>
|
||||
<div class="sticky absolute top-0 z-50">
|
||||
<nav class="w-full border-b border-gray-800 bg-[#070709]/95 backdrop-blur-sm text-gray-100">
|
||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
||||
<div class="flex items-center justify-between h-16">
|
||||
|
||||
<div class="flex items-center gap-3">
|
||||
|
||||
<a href='https://thereisno.space/' class="flex items-center gap-3 group" aria-label="Homepage">
|
||||
|
||||
<img src='/avatar.jpg' alt="ThereIsNo.Space"
|
||||
class="w-10 h-10 rounded-sm border-2 border-gray-700 object-cover transition-transform duration-300 transform group-hover:scale-105"
|
||||
style="animation: border-breathe 4s ease-in-out infinite;" />
|
||||
<span class="text-white text-lg sm:text-xl md:text-2xl lg:text-3xl font-semibold tracking-wide">
|
||||
ThereIsNo.Space
|
||||
<span class="inline-block ml-2" style="animation: flicker 1.6s steps(2, end) infinite;">_</span>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex items-center gap-4">
|
||||
|
||||
<div class="hidden md:flex items-center">
|
||||
|
||||
|
||||
<nav aria-label="Primary" class="w-full">
|
||||
<ul
|
||||
class="flex flex-col md:flex-row md:items-center md:space-x-6 space-y-2 md:space-y-0 sm:text-lg md:text-xl lg:text-3xl"><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Projects</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a aria-current="page" href="/blog/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Blog</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Über uns</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div class="md:hidden">
|
||||
<button id="nav-toggle" aria-controls="mobile-menu" aria-expanded="false"
|
||||
class="inline-flex items-center justify-center p-2 rounded-md focus:outline-none focus:ring-2 focus:ring-indigo-400"
|
||||
aria-label="Open menu">
|
||||
<svg class="h-6 w-6 text-gray-200" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
|
||||
stroke="currentColor" aria-hidden="true">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="mobile-menu" class="md:hidden hidden pb-4">
|
||||
|
||||
|
||||
|
||||
<nav aria-label="Primary" class="w-full">
|
||||
<ul
|
||||
class="flex flex-col md:flex-row md:items-center md:space-x-6 space-y-2 md:space-y-0 sm:text-lg md:text-xl lg:text-3xl"><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Projects</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a aria-current="page" href="/blog/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Blog</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Über uns</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<style>
|
||||
@keyframes flicker {
|
||||
0% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
10% {
|
||||
opacity: 0.2;
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
20% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes border-breathe {
|
||||
0% {
|
||||
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.06);
|
||||
}
|
||||
|
||||
50% {
|
||||
box-shadow: 0 0 18px 6px rgba(99, 102, 241, 0.03);
|
||||
}
|
||||
|
||||
100% {
|
||||
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.06);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<script>
|
||||
(function () {
|
||||
const btn = document.getElementById('nav-toggle');
|
||||
const menu = document.getElementById('mobile-menu');
|
||||
if (!btn || !menu) return;
|
||||
btn.addEventListener('click', () => {
|
||||
const open = menu.classList.toggle('hidden') === false;
|
||||
btn.setAttribute('aria-expanded', open ? 'true' : 'false');
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</div>
|
||||
|
||||
</header>
|
||||
|
||||
<main class="flex-1 w-full">
|
||||
<div id="swup" class="swup-transition-fade">
|
||||
<div class="max-w-3xl lg:max-w-6xl xl:max-w-7xl mx-auto px-5 sm:px-8 lg:px-10 py-10 lg:py-16">
|
||||
|
||||
<main class="max-w-6xl mx-auto px-4 sm:px-6 pt-24 pb-12 text-gray-100">
|
||||
<header class="mb-8">
|
||||
<h1 class="text-2xl sm:text-3xl md:text-4xl tracking-wide text-white">Blog</h1>
|
||||
<p class="mt-2 text-sm sm:text-base text-gray-400">
|
||||
1 items under this folder.
|
||||
</p>
|
||||
</header><div class="border border-gray-800/70 rounded-sm bg-[#070709] divide-y divide-gray-800/80 overflow-hidden"><a href="/blog/wilkommen/" class="group block px-4 sm:px-6 py-4 transition-colors duration-200 hover:bg-white/5">
|
||||
<div class="grid grid-cols-12 gap-4 items-start">
|
||||
<div class="col-span-12 md:col-span-8">
|
||||
<div class="text-xs sm:text-sm text-gray-500 font-mono">
|
||||
<span>Sep 14, 2026</span>
|
||||
<span class="mx-2 text-gray-700">•</span>
|
||||
<span>00:00</span>
|
||||
</div>
|
||||
|
||||
<div class="mt-1 text-lg sm:text-xl text-gray-100">
|
||||
<span class="relative inline-block">
|
||||
Willkommen im ThereIsNo.Space
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-px w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-span-12 md:col-span-4 flex md:justify-end flex-wrap gap-2"><span class="px-2 py-0.5 text-xs sm:text-sm rounded-sm border border-gray-700/70 text-gray-300 bg-black/30">
|
||||
#hackerspace
|
||||
</span><span class="px-2 py-0.5 text-xs sm:text-sm rounded-sm border border-gray-700/70 text-gray-300 bg-black/30">
|
||||
#makerspace
|
||||
</span></div>
|
||||
</div>
|
||||
</a></div>
|
||||
</main>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<div class="border-t border-gray-800 bg-[#070709] text-gray-400">
|
||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
||||
<div class="flex flex-col md:flex-row items-center justify-between py-6 space-y-4 md:space-y-0">
|
||||
|
||||
|
||||
<div class="text-sm sm:text-base md:text-lg">
|
||||
<span class="relative inline-block">
|
||||
© 2026 ThereIsNo.Space. All rights reserved. <br>
|
||||
Made with <a href="https://gohugo.io" target="_blank">Hugo</a> | <a
|
||||
href="https://github.com/Enerhim/enervoid-theme" target="_blank">Enervoid</a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex items-center space-x-6 text-sm sm:text-base md:text-lg">
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</footer>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,24 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Blog on ThereIsNo.Space</title>
|
||||
<link>https://thereisno.space/blog/</link>
|
||||
<description>Recent content in Blog on ThereIsNo.Space</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>de</language>
|
||||
|
||||
|
||||
|
||||
|
||||
<lastBuildDate>Mon, 14 Sep 2026 00:00:00 +0200</lastBuildDate>
|
||||
|
||||
<atom:link href="https://thereisno.space/blog/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Willkommen im ThereIsNo.Space</title>
|
||||
<link>https://thereisno.space/blog/wilkommen/</link>
|
||||
<pubDate>Mon, 14 Sep 2026 00:00:00 +0200</pubDate>
|
||||
<guid>https://thereisno.space/blog/wilkommen/</guid>
|
||||
<description><p>#Dies ist der erste Beitrag auf unserer neuen Seite.</p>
<p><strong>echo &ldquo;Hello, World!&rdquo; &gt; /dev/thereisno.space</strong>
Hier wird künftig über Projekte, Workshops und Events berichtet.
<strong>Stay tuned!</strong></p></description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
@@ -1,637 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de" dir="ltr">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<link rel="icon" type="image/png" href="/avatar.png">
|
||||
<title>Willkommen im ThereIsNo.Space</title>
|
||||
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
|
||||
<link rel="stylesheet" type='text/css' href="https://cdn.jsdelivr.net/gh/devicons/devicon@latest/devicon.min.css" />
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/css/all.min.css"
|
||||
integrity="sha512-2SwdPD6INVrV/lHTZbO2nodKhrnDdJK9/kg2XD1r9uGqPo1cUbujc+IYdlYdEErWNu69gVcYgdxlmVmzTWnetw=="
|
||||
crossorigin="anonymous" referrerpolicy="no-referrer" />
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=Ubuntu+Sans+Mono:ital,wght@0,400..700;1,400..700&display=swap');
|
||||
|
||||
.font-jersey {
|
||||
|
||||
font-family: "Ubuntu Sans Mono", monospace;
|
||||
font-optical-sizing: auto;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
|
||||
.md-content .katex-display {
|
||||
max-width: 100%;
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
padding-left: 0.25rem;
|
||||
padding-right: 0.25rem;
|
||||
}
|
||||
|
||||
.md-content .katex-display>.katex {
|
||||
display: inline-block;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.swup-transition-fade {
|
||||
opacity: 1;
|
||||
transition: 300ms ease-in-out;
|
||||
}
|
||||
|
||||
.is-animating .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.swup-transition-fade {
|
||||
opacity: 1;
|
||||
transition: opacity 300ms ease-in-out;
|
||||
}
|
||||
|
||||
html.is-animating .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
html.is-animating {
|
||||
cursor: progress;
|
||||
}
|
||||
|
||||
html.is-leaving .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script src="https://unpkg.com/swup@4"></script>
|
||||
<script src="https://unpkg.com/@swup/preload-plugin@3"></script>
|
||||
<script src="https://unpkg.com/@swup/progress-plugin@3"></script>
|
||||
<script>
|
||||
const swup = new Swup({
|
||||
containers: ['#swup'],
|
||||
animationSelector: '[class*="swup-transition-"]',
|
||||
cache: true,
|
||||
preload: true,
|
||||
animateHistoryBrowsing: true,
|
||||
|
||||
plugins: [
|
||||
new SwupPreloadPlugin(),
|
||||
new SwupProgressPlugin()
|
||||
]
|
||||
})
|
||||
window.swup = swup
|
||||
</script>
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.css" crossorigin="anonymous">
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.js" crossorigin="anonymous"></script>
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/contrib/auto-render.min.js"
|
||||
crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
|
||||
|
||||
|
||||
const KATEX_CONFIG = {
|
||||
delimiters: [
|
||||
{left: "$$", right: "$$", display: true},
|
||||
{left: "$", right: "$", display: false},
|
||||
{left: "\\[", right: "\\]", display: true},
|
||||
{left: "\\(", right: "\\)", display: false}
|
||||
],
|
||||
ignoredTags: ["script", "noscript", "style", "textarea", "pre", "code"],
|
||||
throwOnError: false
|
||||
};
|
||||
|
||||
|
||||
function renderKatex() {
|
||||
|
||||
if (typeof renderMathInElement !== "function") {
|
||||
console.log("⏳ Waiting for KaTeX to load...");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const contentArea = document.getElementById('swup') || document.body;
|
||||
|
||||
try {
|
||||
renderMathInElement(contentArea, KATEX_CONFIG);
|
||||
console.log("✅ KaTeX rendered successfully");
|
||||
} catch (error) {
|
||||
console.error("❌ KaTeX rendering error:", error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function renderKatexWithRetry(maxRetries = 10, delay = 100) {
|
||||
let attempts = 0;
|
||||
|
||||
const attempt = () => {
|
||||
if (typeof renderMathInElement === "function") {
|
||||
renderKatex();
|
||||
} else if (attempts < maxRetries) {
|
||||
attempts++;
|
||||
setTimeout(attempt, delay);
|
||||
} else {
|
||||
console.warn("⚠️ KaTeX auto-render not available after", maxRetries, "attempts");
|
||||
}
|
||||
};
|
||||
|
||||
attempt();
|
||||
}
|
||||
|
||||
|
||||
function setupSwupIntegration() {
|
||||
|
||||
if (window.swup) {
|
||||
window.swup.hooks.on('page:view', () => {
|
||||
console.log("🔄 Swup transition complete, re-rendering KaTeX...");
|
||||
|
||||
setTimeout(() => renderKatexWithRetry(3, 50), 50);
|
||||
});
|
||||
console.log("✅ KaTeX-Swup integration ready");
|
||||
} else {
|
||||
|
||||
setTimeout(setupSwupIntegration, 100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
console.log("🚀 Initializing KaTeX...");
|
||||
|
||||
|
||||
renderKatexWithRetry();
|
||||
|
||||
|
||||
setupSwupIntegration();
|
||||
});
|
||||
|
||||
|
||||
window.renderKatex = renderKatex;
|
||||
</script>
|
||||
|
||||
<script type="module">
|
||||
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
|
||||
|
||||
let initialized = false;
|
||||
|
||||
function renderMermaid() {
|
||||
const contentArea = document.getElementById('swup') || document.body;
|
||||
const mermaidBlocks = contentArea.querySelectorAll('.language-mermaid, .mermaid');
|
||||
|
||||
if (mermaidBlocks.length === 0) {
|
||||
console.log("ℹ️ No mermaid blocks found on this page");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!initialized) {
|
||||
mermaid.initialize({startOnLoad: false, theme: 'dark'});
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
mermaidBlocks.forEach(el => {
|
||||
if (el.dataset.processed === 'true') {
|
||||
const source = el.dataset.mermaidSource;
|
||||
if (source) {
|
||||
el.innerHTML = source;
|
||||
el.removeAttribute('data-processed');
|
||||
}
|
||||
} else {
|
||||
el.dataset.mermaidSource = el.textContent;
|
||||
}
|
||||
});
|
||||
|
||||
mermaid.run({nodes: mermaidBlocks})
|
||||
.then(() => console.log("✅ Mermaid rendered successfully"))
|
||||
.catch(err => console.error("❌ Mermaid rendering error:", err));
|
||||
}
|
||||
|
||||
function renderMermaidWithRetry(maxRetries = 10, delay = 100) {
|
||||
let attempts = 0;
|
||||
|
||||
const attempt = () => {
|
||||
if (typeof mermaid.initialize === "function") {
|
||||
renderMermaid();
|
||||
} else if (attempts < maxRetries) {
|
||||
attempts++;
|
||||
setTimeout(attempt, delay);
|
||||
} else {
|
||||
console.warn("⚠️ Mermaid auto-render not available after", maxRetries, "attempts");
|
||||
}
|
||||
};
|
||||
|
||||
attempt();
|
||||
}
|
||||
|
||||
|
||||
function setupSwupIntegration() {
|
||||
|
||||
if (window.swup) {
|
||||
window.swup.hooks.on('page:view', () => {
|
||||
console.log("🔄 Swup transition complete, re-rendering mermaid...");
|
||||
|
||||
setTimeout(() => renderMermaidWithRetry(3, 50), 50);
|
||||
});
|
||||
console.log("✅ Mermaid-Swup integration ready");
|
||||
} else {
|
||||
|
||||
setTimeout(setupSwupIntegration, 100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
console.log("🚀 Initializing KaTeX...");
|
||||
|
||||
|
||||
renderMermaidWithRetry();
|
||||
|
||||
|
||||
setupSwupIntegration();
|
||||
});
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
</head>
|
||||
|
||||
<body class="min-h-screen flex flex-col bg-black font-jersey text-white text-3xl">
|
||||
<header>
|
||||
<div class="sticky absolute top-0 z-50">
|
||||
<nav class="w-full border-b border-gray-800 bg-[#070709]/95 backdrop-blur-sm text-gray-100">
|
||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
||||
<div class="flex items-center justify-between h-16">
|
||||
|
||||
<div class="flex items-center gap-3">
|
||||
|
||||
<a href='https://thereisno.space/' class="flex items-center gap-3 group" aria-label="Homepage">
|
||||
|
||||
<img src='/avatar.jpg' alt="ThereIsNo.Space"
|
||||
class="w-10 h-10 rounded-sm border-2 border-gray-700 object-cover transition-transform duration-300 transform group-hover:scale-105"
|
||||
style="animation: border-breathe 4s ease-in-out infinite;" />
|
||||
<span class="text-white text-lg sm:text-xl md:text-2xl lg:text-3xl font-semibold tracking-wide">
|
||||
ThereIsNo.Space
|
||||
<span class="inline-block ml-2" style="animation: flicker 1.6s steps(2, end) infinite;">_</span>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex items-center gap-4">
|
||||
|
||||
<div class="hidden md:flex items-center">
|
||||
|
||||
|
||||
<nav aria-label="Primary" class="w-full">
|
||||
<ul
|
||||
class="flex flex-col md:flex-row md:items-center md:space-x-6 space-y-2 md:space-y-0 sm:text-lg md:text-xl lg:text-3xl"><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Projects</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a aria-current="true" href="/blog/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Blog</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Über uns</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div class="md:hidden">
|
||||
<button id="nav-toggle" aria-controls="mobile-menu" aria-expanded="false"
|
||||
class="inline-flex items-center justify-center p-2 rounded-md focus:outline-none focus:ring-2 focus:ring-indigo-400"
|
||||
aria-label="Open menu">
|
||||
<svg class="h-6 w-6 text-gray-200" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
|
||||
stroke="currentColor" aria-hidden="true">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="mobile-menu" class="md:hidden hidden pb-4">
|
||||
|
||||
|
||||
|
||||
<nav aria-label="Primary" class="w-full">
|
||||
<ul
|
||||
class="flex flex-col md:flex-row md:items-center md:space-x-6 space-y-2 md:space-y-0 sm:text-lg md:text-xl lg:text-3xl"><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Projects</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a aria-current="true" href="/blog/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Blog</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Über uns</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<style>
|
||||
@keyframes flicker {
|
||||
0% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
10% {
|
||||
opacity: 0.2;
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
20% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes border-breathe {
|
||||
0% {
|
||||
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.06);
|
||||
}
|
||||
|
||||
50% {
|
||||
box-shadow: 0 0 18px 6px rgba(99, 102, 241, 0.03);
|
||||
}
|
||||
|
||||
100% {
|
||||
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.06);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<script>
|
||||
(function () {
|
||||
const btn = document.getElementById('nav-toggle');
|
||||
const menu = document.getElementById('mobile-menu');
|
||||
if (!btn || !menu) return;
|
||||
btn.addEventListener('click', () => {
|
||||
const open = menu.classList.toggle('hidden') === false;
|
||||
btn.setAttribute('aria-expanded', open ? 'true' : 'false');
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</div>
|
||||
|
||||
</header>
|
||||
|
||||
<main class="flex-1 w-full">
|
||||
<div id="swup" class="swup-transition-fade">
|
||||
<div class="max-w-3xl lg:max-w-6xl xl:max-w-7xl mx-auto px-5 sm:px-8 lg:px-10 py-10 lg:py-16">
|
||||
|
||||
<div class="grid grid-cols-12 gap-8">
|
||||
|
||||
<aside class="hidden lg:block col-span-3">
|
||||
<div class="sticky top-24">
|
||||
<div class="mb-3 text-xs uppercase tracking-widest text-gray-500">Table of contents</div><nav class="toc border border-gray-800/70 bg-[#070709] rounded-sm p-4 text-base text-gray-300">
|
||||
<nav id="TableOfContents"></nav>
|
||||
</nav></div>
|
||||
</aside>
|
||||
|
||||
|
||||
<article class="col-span-12 lg:col-span-9">
|
||||
<header class="mb-6">
|
||||
<h1 class="text-2xl sm:text-3xl md:text-4xl tracking-wide text-white">
|
||||
Willkommen im ThereIsNo.Space
|
||||
</h1>
|
||||
|
||||
<div class="mt-2 flex flex-wrap items-center gap-x-3 gap-y-2 text-sm sm:text-base text-gray-400">
|
||||
<span class="font-mono">Sep 14, 2026 • 00:00</span>
|
||||
<span class="text-gray-700">/</span>
|
||||
<span class="font-mono">1 min read</span>
|
||||
</div><div class="mt-3 flex flex-wrap gap-2"><a href="/%20tags/hackerspace"
|
||||
class="px-2 py-0.5 text-xs sm:text-sm rounded-sm border border-gray-700/70 text-gray-300 bg-black/30 hover:text-white hover:border-indigo-400/40 transition-colors">
|
||||
#hackerspace
|
||||
</a><a href="/%20tags/makerspace"
|
||||
class="px-2 py-0.5 text-xs sm:text-sm rounded-sm border border-gray-700/70 text-gray-300 bg-black/30 hover:text-white hover:border-indigo-400/40 transition-colors">
|
||||
#makerspace
|
||||
</a></div></header>
|
||||
|
||||
|
||||
|
||||
<div class="lg:hidden mb-6">
|
||||
<details class="border border-gray-800/70 bg-[#070709] rounded-sm">
|
||||
<summary class="cursor-pointer select-none px-4 py-3 text-gray-200 hover:text-white transition-colors">
|
||||
Table of contents
|
||||
</summary>
|
||||
<div class="px-4 pb-4 toc text-base text-gray-300">
|
||||
<nav id="TableOfContents"></nav>
|
||||
</div>
|
||||
</details>
|
||||
</div>
|
||||
|
||||
<div class="border border-gray-800/70 bg-[#070709] rounded-sm p-5 sm:p-7">
|
||||
|
||||
<div class="md-content text-lg sm:text-xl leading-relaxed text-gray-200">
|
||||
<p>#Dies ist der erste Beitrag auf unserer neuen Seite.</p>
|
||||
<p><strong>echo “Hello, World!” > /dev/thereisno.space</strong>
|
||||
Hier wird künftig über Projekte, Workshops und Events berichtet.
|
||||
<strong>Stay tuned!</strong></p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.toc {
|
||||
font-size: 0.95rem;
|
||||
line-height: 1.35;
|
||||
}
|
||||
|
||||
.toc ul {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
.toc li {
|
||||
position: relative;
|
||||
margin: 0.35rem 0;
|
||||
padding-left: 1.25rem;
|
||||
|
||||
overflow-wrap: anywhere;
|
||||
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
.toc a {
|
||||
display: block;
|
||||
|
||||
padding: 0.15rem 0;
|
||||
color: rgba(209, 213, 219, 0.92);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.toc a:hover {
|
||||
color: #fff;
|
||||
text-decoration: underline;
|
||||
text-decoration-color: rgba(99, 102, 241, 0.85);
|
||||
text-underline-offset: 3px;
|
||||
}
|
||||
|
||||
|
||||
.toc ul ul {
|
||||
margin: 0.4rem 0 0.4rem 0.35rem;
|
||||
padding-left: 0.9rem;
|
||||
border-left: 1px solid rgba(55, 65, 81, 0.6);
|
||||
}
|
||||
|
||||
.toc ul ul>li {
|
||||
padding-left: 1.75rem;
|
||||
}
|
||||
|
||||
|
||||
.toc ul ul>li::before {
|
||||
content: "├";
|
||||
position: absolute;
|
||||
left: 0.35rem;
|
||||
top: 0.2rem;
|
||||
|
||||
color: rgba(99, 102, 241, 0.75);
|
||||
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
||||
}
|
||||
|
||||
.toc ul ul>li:last-child::before {
|
||||
content: "└";
|
||||
}
|
||||
|
||||
|
||||
@media (min-width: 1024px) {
|
||||
.toc {
|
||||
max-height: calc(100vh - 9rem);
|
||||
overflow: auto;
|
||||
padding-right: 0.25rem;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
.md-content ul,
|
||||
.md-content ol {
|
||||
margin: 1rem 0;
|
||||
padding-left: 1.35rem;
|
||||
}
|
||||
|
||||
.md-content ul {
|
||||
list-style: disc;
|
||||
}
|
||||
|
||||
.md-content ul ul {
|
||||
list-style: circle;
|
||||
}
|
||||
|
||||
.md-content ul ul ul {
|
||||
list-style: square;
|
||||
}
|
||||
|
||||
.md-content ol {
|
||||
list-style: decimal;
|
||||
}
|
||||
|
||||
.md-content ol ol {
|
||||
list-style: lower-roman;
|
||||
}
|
||||
|
||||
.md-content ol ol ol {
|
||||
list-style: lower-alpha;
|
||||
}
|
||||
|
||||
.md-content li {
|
||||
margin: 0.35rem 0;
|
||||
}
|
||||
|
||||
|
||||
.md-content pre,
|
||||
.md-content code {
|
||||
tab-size: 4;
|
||||
}
|
||||
</style>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<div class="border-t border-gray-800 bg-[#070709] text-gray-400">
|
||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
||||
<div class="flex flex-col md:flex-row items-center justify-between py-6 space-y-4 md:space-y-0">
|
||||
|
||||
|
||||
<div class="text-sm sm:text-base md:text-lg">
|
||||
<span class="relative inline-block">
|
||||
© 2026 ThereIsNo.Space. All rights reserved. <br>
|
||||
Made with <a href="https://gohugo.io" target="_blank">Hugo</a> | <a
|
||||
href="https://github.com/Enerhim/enervoid-theme" target="_blank">Enervoid</a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex items-center space-x-6 text-sm sm:text-base md:text-lg">
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</footer>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,472 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de" dir="ltr">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<link rel="icon" type="image/png" href="/avatar.png">
|
||||
<title>Categories</title>
|
||||
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
|
||||
<link rel="stylesheet" type='text/css' href="https://cdn.jsdelivr.net/gh/devicons/devicon@latest/devicon.min.css" />
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/css/all.min.css"
|
||||
integrity="sha512-2SwdPD6INVrV/lHTZbO2nodKhrnDdJK9/kg2XD1r9uGqPo1cUbujc+IYdlYdEErWNu69gVcYgdxlmVmzTWnetw=="
|
||||
crossorigin="anonymous" referrerpolicy="no-referrer" />
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=Ubuntu+Sans+Mono:ital,wght@0,400..700;1,400..700&display=swap');
|
||||
|
||||
.font-jersey {
|
||||
|
||||
font-family: "Ubuntu Sans Mono", monospace;
|
||||
font-optical-sizing: auto;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
|
||||
.md-content .katex-display {
|
||||
max-width: 100%;
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
padding-left: 0.25rem;
|
||||
padding-right: 0.25rem;
|
||||
}
|
||||
|
||||
.md-content .katex-display>.katex {
|
||||
display: inline-block;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.swup-transition-fade {
|
||||
opacity: 1;
|
||||
transition: 300ms ease-in-out;
|
||||
}
|
||||
|
||||
.is-animating .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.swup-transition-fade {
|
||||
opacity: 1;
|
||||
transition: opacity 300ms ease-in-out;
|
||||
}
|
||||
|
||||
html.is-animating .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
html.is-animating {
|
||||
cursor: progress;
|
||||
}
|
||||
|
||||
html.is-leaving .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script src="https://unpkg.com/swup@4"></script>
|
||||
<script src="https://unpkg.com/@swup/preload-plugin@3"></script>
|
||||
<script src="https://unpkg.com/@swup/progress-plugin@3"></script>
|
||||
<script>
|
||||
const swup = new Swup({
|
||||
containers: ['#swup'],
|
||||
animationSelector: '[class*="swup-transition-"]',
|
||||
cache: true,
|
||||
preload: true,
|
||||
animateHistoryBrowsing: true,
|
||||
|
||||
plugins: [
|
||||
new SwupPreloadPlugin(),
|
||||
new SwupProgressPlugin()
|
||||
]
|
||||
})
|
||||
window.swup = swup
|
||||
</script>
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.css" crossorigin="anonymous">
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.js" crossorigin="anonymous"></script>
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/contrib/auto-render.min.js"
|
||||
crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
|
||||
|
||||
|
||||
const KATEX_CONFIG = {
|
||||
delimiters: [
|
||||
{left: "$$", right: "$$", display: true},
|
||||
{left: "$", right: "$", display: false},
|
||||
{left: "\\[", right: "\\]", display: true},
|
||||
{left: "\\(", right: "\\)", display: false}
|
||||
],
|
||||
ignoredTags: ["script", "noscript", "style", "textarea", "pre", "code"],
|
||||
throwOnError: false
|
||||
};
|
||||
|
||||
|
||||
function renderKatex() {
|
||||
|
||||
if (typeof renderMathInElement !== "function") {
|
||||
console.log("⏳ Waiting for KaTeX to load...");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const contentArea = document.getElementById('swup') || document.body;
|
||||
|
||||
try {
|
||||
renderMathInElement(contentArea, KATEX_CONFIG);
|
||||
console.log("✅ KaTeX rendered successfully");
|
||||
} catch (error) {
|
||||
console.error("❌ KaTeX rendering error:", error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function renderKatexWithRetry(maxRetries = 10, delay = 100) {
|
||||
let attempts = 0;
|
||||
|
||||
const attempt = () => {
|
||||
if (typeof renderMathInElement === "function") {
|
||||
renderKatex();
|
||||
} else if (attempts < maxRetries) {
|
||||
attempts++;
|
||||
setTimeout(attempt, delay);
|
||||
} else {
|
||||
console.warn("⚠️ KaTeX auto-render not available after", maxRetries, "attempts");
|
||||
}
|
||||
};
|
||||
|
||||
attempt();
|
||||
}
|
||||
|
||||
|
||||
function setupSwupIntegration() {
|
||||
|
||||
if (window.swup) {
|
||||
window.swup.hooks.on('page:view', () => {
|
||||
console.log("🔄 Swup transition complete, re-rendering KaTeX...");
|
||||
|
||||
setTimeout(() => renderKatexWithRetry(3, 50), 50);
|
||||
});
|
||||
console.log("✅ KaTeX-Swup integration ready");
|
||||
} else {
|
||||
|
||||
setTimeout(setupSwupIntegration, 100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
console.log("🚀 Initializing KaTeX...");
|
||||
|
||||
|
||||
renderKatexWithRetry();
|
||||
|
||||
|
||||
setupSwupIntegration();
|
||||
});
|
||||
|
||||
|
||||
window.renderKatex = renderKatex;
|
||||
</script>
|
||||
|
||||
<script type="module">
|
||||
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
|
||||
|
||||
let initialized = false;
|
||||
|
||||
function renderMermaid() {
|
||||
const contentArea = document.getElementById('swup') || document.body;
|
||||
const mermaidBlocks = contentArea.querySelectorAll('.language-mermaid, .mermaid');
|
||||
|
||||
if (mermaidBlocks.length === 0) {
|
||||
console.log("ℹ️ No mermaid blocks found on this page");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!initialized) {
|
||||
mermaid.initialize({startOnLoad: false, theme: 'dark'});
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
mermaidBlocks.forEach(el => {
|
||||
if (el.dataset.processed === 'true') {
|
||||
const source = el.dataset.mermaidSource;
|
||||
if (source) {
|
||||
el.innerHTML = source;
|
||||
el.removeAttribute('data-processed');
|
||||
}
|
||||
} else {
|
||||
el.dataset.mermaidSource = el.textContent;
|
||||
}
|
||||
});
|
||||
|
||||
mermaid.run({nodes: mermaidBlocks})
|
||||
.then(() => console.log("✅ Mermaid rendered successfully"))
|
||||
.catch(err => console.error("❌ Mermaid rendering error:", err));
|
||||
}
|
||||
|
||||
function renderMermaidWithRetry(maxRetries = 10, delay = 100) {
|
||||
let attempts = 0;
|
||||
|
||||
const attempt = () => {
|
||||
if (typeof mermaid.initialize === "function") {
|
||||
renderMermaid();
|
||||
} else if (attempts < maxRetries) {
|
||||
attempts++;
|
||||
setTimeout(attempt, delay);
|
||||
} else {
|
||||
console.warn("⚠️ Mermaid auto-render not available after", maxRetries, "attempts");
|
||||
}
|
||||
};
|
||||
|
||||
attempt();
|
||||
}
|
||||
|
||||
|
||||
function setupSwupIntegration() {
|
||||
|
||||
if (window.swup) {
|
||||
window.swup.hooks.on('page:view', () => {
|
||||
console.log("🔄 Swup transition complete, re-rendering mermaid...");
|
||||
|
||||
setTimeout(() => renderMermaidWithRetry(3, 50), 50);
|
||||
});
|
||||
console.log("✅ Mermaid-Swup integration ready");
|
||||
} else {
|
||||
|
||||
setTimeout(setupSwupIntegration, 100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
console.log("🚀 Initializing KaTeX...");
|
||||
|
||||
|
||||
renderMermaidWithRetry();
|
||||
|
||||
|
||||
setupSwupIntegration();
|
||||
});
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
</head>
|
||||
|
||||
<body class="min-h-screen flex flex-col bg-black font-jersey text-white text-3xl">
|
||||
<header>
|
||||
<div class="sticky absolute top-0 z-50">
|
||||
<nav class="w-full border-b border-gray-800 bg-[#070709]/95 backdrop-blur-sm text-gray-100">
|
||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
||||
<div class="flex items-center justify-between h-16">
|
||||
|
||||
<div class="flex items-center gap-3">
|
||||
|
||||
<a href='https://thereisno.space/' class="flex items-center gap-3 group" aria-label="Homepage">
|
||||
|
||||
<img src='/avatar.jpg' alt="ThereIsNo.Space"
|
||||
class="w-10 h-10 rounded-sm border-2 border-gray-700 object-cover transition-transform duration-300 transform group-hover:scale-105"
|
||||
style="animation: border-breathe 4s ease-in-out infinite;" />
|
||||
<span class="text-white text-lg sm:text-xl md:text-2xl lg:text-3xl font-semibold tracking-wide">
|
||||
ThereIsNo.Space
|
||||
<span class="inline-block ml-2" style="animation: flicker 1.6s steps(2, end) infinite;">_</span>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex items-center gap-4">
|
||||
|
||||
<div class="hidden md:flex items-center">
|
||||
|
||||
|
||||
<nav aria-label="Primary" class="w-full">
|
||||
<ul
|
||||
class="flex flex-col md:flex-row md:items-center md:space-x-6 space-y-2 md:space-y-0 sm:text-lg md:text-xl lg:text-3xl"><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Projects</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/blog/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Blog</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Über uns</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div class="md:hidden">
|
||||
<button id="nav-toggle" aria-controls="mobile-menu" aria-expanded="false"
|
||||
class="inline-flex items-center justify-center p-2 rounded-md focus:outline-none focus:ring-2 focus:ring-indigo-400"
|
||||
aria-label="Open menu">
|
||||
<svg class="h-6 w-6 text-gray-200" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
|
||||
stroke="currentColor" aria-hidden="true">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="mobile-menu" class="md:hidden hidden pb-4">
|
||||
|
||||
|
||||
|
||||
<nav aria-label="Primary" class="w-full">
|
||||
<ul
|
||||
class="flex flex-col md:flex-row md:items-center md:space-x-6 space-y-2 md:space-y-0 sm:text-lg md:text-xl lg:text-3xl"><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Projects</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/blog/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Blog</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Über uns</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<style>
|
||||
@keyframes flicker {
|
||||
0% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
10% {
|
||||
opacity: 0.2;
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
20% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes border-breathe {
|
||||
0% {
|
||||
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.06);
|
||||
}
|
||||
|
||||
50% {
|
||||
box-shadow: 0 0 18px 6px rgba(99, 102, 241, 0.03);
|
||||
}
|
||||
|
||||
100% {
|
||||
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.06);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<script>
|
||||
(function () {
|
||||
const btn = document.getElementById('nav-toggle');
|
||||
const menu = document.getElementById('mobile-menu');
|
||||
if (!btn || !menu) return;
|
||||
btn.addEventListener('click', () => {
|
||||
const open = menu.classList.toggle('hidden') === false;
|
||||
btn.setAttribute('aria-expanded', open ? 'true' : 'false');
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</div>
|
||||
|
||||
</header>
|
||||
|
||||
<main class="flex-1 w-full">
|
||||
<div id="swup" class="swup-transition-fade">
|
||||
<div class="max-w-3xl lg:max-w-6xl xl:max-w-7xl mx-auto px-5 sm:px-8 lg:px-10 py-10 lg:py-16">
|
||||
|
||||
<h1>Categories</h1>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<div class="border-t border-gray-800 bg-[#070709] text-gray-400">
|
||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
||||
<div class="flex flex-col md:flex-row items-center justify-between py-6 space-y-4 md:space-y-0">
|
||||
|
||||
|
||||
<div class="text-sm sm:text-base md:text-lg">
|
||||
<span class="relative inline-block">
|
||||
© 2026 ThereIsNo.Space. All rights reserved. <br>
|
||||
Made with <a href="https://gohugo.io" target="_blank">Hugo</a> | <a
|
||||
href="https://github.com/Enerhim/enervoid-theme" target="_blank">Enervoid</a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex items-center space-x-6 text-sm sm:text-base md:text-lg">
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</footer>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,15 +0,0 @@
|
||||
<?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 ThereIsNo.Space</title>
|
||||
<link>https://thereisno.space/categories/</link>
|
||||
<description>Recent content in Categories on ThereIsNo.Space</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>de</language>
|
||||
|
||||
|
||||
|
||||
|
||||
<atom:link href="https://thereisno.space/categories/index.xml" rel="self" type="application/rss+xml" />
|
||||
</channel>
|
||||
</rss>
|
||||
@@ -0,0 +1,14 @@
|
||||
version: '3.3'
|
||||
|
||||
services:
|
||||
website:
|
||||
image: joseluisq/static-web-server:latest
|
||||
container_name: 'website'
|
||||
ports:
|
||||
- 1313:1313
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
# Note: those envs are customizable but also optional
|
||||
- SERVER_ROOT=/var/public
|
||||
volumes:
|
||||
- ./www:/var/public:ro
|
||||
BIN
Binary file not shown.
|
Before Width: | Height: | Size: 15 KiB |
-523
@@ -1,523 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de" dir="ltr">
|
||||
|
||||
<head>
|
||||
<meta name="generator" content="Hugo 0.165.0">
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<link rel="icon" type="image/png" href="/avatar.png">
|
||||
<title>ThereIsNo.Space</title>
|
||||
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
|
||||
<link rel="stylesheet" type='text/css' href="https://cdn.jsdelivr.net/gh/devicons/devicon@latest/devicon.min.css" />
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/css/all.min.css"
|
||||
integrity="sha512-2SwdPD6INVrV/lHTZbO2nodKhrnDdJK9/kg2XD1r9uGqPo1cUbujc+IYdlYdEErWNu69gVcYgdxlmVmzTWnetw=="
|
||||
crossorigin="anonymous" referrerpolicy="no-referrer" />
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=Ubuntu+Sans+Mono:ital,wght@0,400..700;1,400..700&display=swap');
|
||||
|
||||
.font-jersey {
|
||||
|
||||
font-family: "Ubuntu Sans Mono", monospace;
|
||||
font-optical-sizing: auto;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
|
||||
.md-content .katex-display {
|
||||
max-width: 100%;
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
padding-left: 0.25rem;
|
||||
padding-right: 0.25rem;
|
||||
}
|
||||
|
||||
.md-content .katex-display>.katex {
|
||||
display: inline-block;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.swup-transition-fade {
|
||||
opacity: 1;
|
||||
transition: 300ms ease-in-out;
|
||||
}
|
||||
|
||||
.is-animating .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.swup-transition-fade {
|
||||
opacity: 1;
|
||||
transition: opacity 300ms ease-in-out;
|
||||
}
|
||||
|
||||
html.is-animating .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
html.is-animating {
|
||||
cursor: progress;
|
||||
}
|
||||
|
||||
html.is-leaving .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script src="https://unpkg.com/swup@4"></script>
|
||||
<script src="https://unpkg.com/@swup/preload-plugin@3"></script>
|
||||
<script src="https://unpkg.com/@swup/progress-plugin@3"></script>
|
||||
<script>
|
||||
const swup = new Swup({
|
||||
containers: ['#swup'],
|
||||
animationSelector: '[class*="swup-transition-"]',
|
||||
cache: true,
|
||||
preload: true,
|
||||
animateHistoryBrowsing: true,
|
||||
|
||||
plugins: [
|
||||
new SwupPreloadPlugin(),
|
||||
new SwupProgressPlugin()
|
||||
]
|
||||
})
|
||||
window.swup = swup
|
||||
</script>
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.css" crossorigin="anonymous">
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.js" crossorigin="anonymous"></script>
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/contrib/auto-render.min.js"
|
||||
crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
|
||||
|
||||
|
||||
const KATEX_CONFIG = {
|
||||
delimiters: [
|
||||
{left: "$$", right: "$$", display: true},
|
||||
{left: "$", right: "$", display: false},
|
||||
{left: "\\[", right: "\\]", display: true},
|
||||
{left: "\\(", right: "\\)", display: false}
|
||||
],
|
||||
ignoredTags: ["script", "noscript", "style", "textarea", "pre", "code"],
|
||||
throwOnError: false
|
||||
};
|
||||
|
||||
|
||||
function renderKatex() {
|
||||
|
||||
if (typeof renderMathInElement !== "function") {
|
||||
console.log("⏳ Waiting for KaTeX to load...");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const contentArea = document.getElementById('swup') || document.body;
|
||||
|
||||
try {
|
||||
renderMathInElement(contentArea, KATEX_CONFIG);
|
||||
console.log("✅ KaTeX rendered successfully");
|
||||
} catch (error) {
|
||||
console.error("❌ KaTeX rendering error:", error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function renderKatexWithRetry(maxRetries = 10, delay = 100) {
|
||||
let attempts = 0;
|
||||
|
||||
const attempt = () => {
|
||||
if (typeof renderMathInElement === "function") {
|
||||
renderKatex();
|
||||
} else if (attempts < maxRetries) {
|
||||
attempts++;
|
||||
setTimeout(attempt, delay);
|
||||
} else {
|
||||
console.warn("⚠️ KaTeX auto-render not available after", maxRetries, "attempts");
|
||||
}
|
||||
};
|
||||
|
||||
attempt();
|
||||
}
|
||||
|
||||
|
||||
function setupSwupIntegration() {
|
||||
|
||||
if (window.swup) {
|
||||
window.swup.hooks.on('page:view', () => {
|
||||
console.log("🔄 Swup transition complete, re-rendering KaTeX...");
|
||||
|
||||
setTimeout(() => renderKatexWithRetry(3, 50), 50);
|
||||
});
|
||||
console.log("✅ KaTeX-Swup integration ready");
|
||||
} else {
|
||||
|
||||
setTimeout(setupSwupIntegration, 100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
console.log("🚀 Initializing KaTeX...");
|
||||
|
||||
|
||||
renderKatexWithRetry();
|
||||
|
||||
|
||||
setupSwupIntegration();
|
||||
});
|
||||
|
||||
|
||||
window.renderKatex = renderKatex;
|
||||
</script>
|
||||
|
||||
<script type="module">
|
||||
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
|
||||
|
||||
let initialized = false;
|
||||
|
||||
function renderMermaid() {
|
||||
const contentArea = document.getElementById('swup') || document.body;
|
||||
const mermaidBlocks = contentArea.querySelectorAll('.language-mermaid, .mermaid');
|
||||
|
||||
if (mermaidBlocks.length === 0) {
|
||||
console.log("ℹ️ No mermaid blocks found on this page");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!initialized) {
|
||||
mermaid.initialize({startOnLoad: false, theme: 'dark'});
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
mermaidBlocks.forEach(el => {
|
||||
if (el.dataset.processed === 'true') {
|
||||
const source = el.dataset.mermaidSource;
|
||||
if (source) {
|
||||
el.innerHTML = source;
|
||||
el.removeAttribute('data-processed');
|
||||
}
|
||||
} else {
|
||||
el.dataset.mermaidSource = el.textContent;
|
||||
}
|
||||
});
|
||||
|
||||
mermaid.run({nodes: mermaidBlocks})
|
||||
.then(() => console.log("✅ Mermaid rendered successfully"))
|
||||
.catch(err => console.error("❌ Mermaid rendering error:", err));
|
||||
}
|
||||
|
||||
function renderMermaidWithRetry(maxRetries = 10, delay = 100) {
|
||||
let attempts = 0;
|
||||
|
||||
const attempt = () => {
|
||||
if (typeof mermaid.initialize === "function") {
|
||||
renderMermaid();
|
||||
} else if (attempts < maxRetries) {
|
||||
attempts++;
|
||||
setTimeout(attempt, delay);
|
||||
} else {
|
||||
console.warn("⚠️ Mermaid auto-render not available after", maxRetries, "attempts");
|
||||
}
|
||||
};
|
||||
|
||||
attempt();
|
||||
}
|
||||
|
||||
|
||||
function setupSwupIntegration() {
|
||||
|
||||
if (window.swup) {
|
||||
window.swup.hooks.on('page:view', () => {
|
||||
console.log("🔄 Swup transition complete, re-rendering mermaid...");
|
||||
|
||||
setTimeout(() => renderMermaidWithRetry(3, 50), 50);
|
||||
});
|
||||
console.log("✅ Mermaid-Swup integration ready");
|
||||
} else {
|
||||
|
||||
setTimeout(setupSwupIntegration, 100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
console.log("🚀 Initializing KaTeX...");
|
||||
|
||||
|
||||
renderMermaidWithRetry();
|
||||
|
||||
|
||||
setupSwupIntegration();
|
||||
});
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
</head>
|
||||
|
||||
<body class="min-h-screen flex flex-col bg-black font-jersey text-white text-3xl">
|
||||
<header>
|
||||
<div class="sticky absolute top-0 z-50">
|
||||
<nav class="w-full border-b border-gray-800 bg-[#070709]/95 backdrop-blur-sm text-gray-100">
|
||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
||||
<div class="flex items-center justify-between h-16">
|
||||
|
||||
<div class="flex items-center gap-3">
|
||||
|
||||
<a href='https://thereisno.space/' class="flex items-center gap-3 group" aria-label="Homepage">
|
||||
|
||||
<img src='/avatar.jpg' alt="ThereIsNo.Space"
|
||||
class="w-10 h-10 rounded-sm border-2 border-gray-700 object-cover transition-transform duration-300 transform group-hover:scale-105"
|
||||
style="animation: border-breathe 4s ease-in-out infinite;" />
|
||||
<span class="text-white text-lg sm:text-xl md:text-2xl lg:text-3xl font-semibold tracking-wide">
|
||||
ThereIsNo.Space
|
||||
<span class="inline-block ml-2" style="animation: flicker 1.6s steps(2, end) infinite;">_</span>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex items-center gap-4">
|
||||
|
||||
<div class="hidden md:flex items-center">
|
||||
|
||||
|
||||
<nav aria-label="Primary" class="w-full">
|
||||
<ul
|
||||
class="flex flex-col md:flex-row md:items-center md:space-x-6 space-y-2 md:space-y-0 sm:text-lg md:text-xl lg:text-3xl"><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Projects</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/blog/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Blog</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a aria-current="page" href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Über uns</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div class="md:hidden">
|
||||
<button id="nav-toggle" aria-controls="mobile-menu" aria-expanded="false"
|
||||
class="inline-flex items-center justify-center p-2 rounded-md focus:outline-none focus:ring-2 focus:ring-indigo-400"
|
||||
aria-label="Open menu">
|
||||
<svg class="h-6 w-6 text-gray-200" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
|
||||
stroke="currentColor" aria-hidden="true">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="mobile-menu" class="md:hidden hidden pb-4">
|
||||
|
||||
|
||||
|
||||
<nav aria-label="Primary" class="w-full">
|
||||
<ul
|
||||
class="flex flex-col md:flex-row md:items-center md:space-x-6 space-y-2 md:space-y-0 sm:text-lg md:text-xl lg:text-3xl"><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Projects</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/blog/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Blog</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a aria-current="page" href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Über uns</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<style>
|
||||
@keyframes flicker {
|
||||
0% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
10% {
|
||||
opacity: 0.2;
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
20% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes border-breathe {
|
||||
0% {
|
||||
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.06);
|
||||
}
|
||||
|
||||
50% {
|
||||
box-shadow: 0 0 18px 6px rgba(99, 102, 241, 0.03);
|
||||
}
|
||||
|
||||
100% {
|
||||
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.06);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<script>
|
||||
(function () {
|
||||
const btn = document.getElementById('nav-toggle');
|
||||
const menu = document.getElementById('mobile-menu');
|
||||
if (!btn || !menu) return;
|
||||
btn.addEventListener('click', () => {
|
||||
const open = menu.classList.toggle('hidden') === false;
|
||||
btn.setAttribute('aria-expanded', open ? 'true' : 'false');
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</div>
|
||||
|
||||
</header>
|
||||
|
||||
<main class="flex-1 w-full">
|
||||
<div id="swup" class="swup-transition-fade">
|
||||
<div class="max-w-3xl lg:max-w-6xl xl:max-w-7xl mx-auto px-5 sm:px-8 lg:px-10 py-10 lg:py-16">
|
||||
|
||||
|
||||
<section class="relative border border-gray-200 bg-[#070709] rounded-sm p-8 md:p-12 text-gray-300">
|
||||
|
||||
|
||||
<h1 class="text-2xl sm:text-3xl md:text-4xl font-semibold text-blue-200 mb-6 tracking-wide">
|
||||
About Us
|
||||
|
||||
</h1>
|
||||
|
||||
|
||||
<div class="space-y-6 sm:text-lg md:text-xl lg:text-2xl leading-relaxed [&_a]:text-blue-200
|
||||
[&_a]:underline
|
||||
[&_a:hover]:text-blue-100
|
||||
[&_a]:transition-colors
|
||||
[&_a]:duration-200">
|
||||
|
||||
|
||||
<h1 id="über-thereisnospace" class=" mt-8 mb-3 text-2xl sm:text-3xl text-white">
|
||||
<span class="relative inline-block">
|
||||
Über ThereIsNo.Space
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-px w-0 bg-indigo-400"></span>
|
||||
</span>
|
||||
</h1>
|
||||
<p>ThereIsNo.Space ist ein sich im aufbau befindlicher Hacker und Makerspace.</p>
|
||||
<h2 id="unsere-werte" class="mt-8 mb-3 text-xl sm:text-2xl text-white">
|
||||
<span class="relative inline-block">
|
||||
Unsere Werte
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-px w-0 bg-indigo-400"></span>
|
||||
</span>
|
||||
</h2>
|
||||
<ul>
|
||||
<li>Open Knowledge – Wissen teilen statt horten</li>
|
||||
<li>Hands-on – Lernen durch Ausprobieren</li>
|
||||
<li>Community – Alle sind willkommen, egal welches Skill-Level</li>
|
||||
</ul>
|
||||
<h2 id="kontakt" class="mt-8 mb-3 text-xl sm:text-2xl text-white">
|
||||
<span class="relative inline-block">
|
||||
Kontakt
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-px w-0 bg-indigo-400"></span>
|
||||
</span>
|
||||
</h2>
|
||||
<p>E-Mail: <a href="mailto:info@thereisno.space">info@thereisno.space</a>
|
||||
Matrix: #ThereIsNoSpace:wolffy.eu
|
||||
Oder Triff uns auf Events!</p>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<div class="border-t border-gray-800 bg-[#070709] text-gray-400">
|
||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
||||
<div class="flex flex-col md:flex-row items-center justify-between py-6 space-y-4 md:space-y-0">
|
||||
|
||||
|
||||
<div class="text-sm sm:text-base md:text-lg">
|
||||
<span class="relative inline-block">
|
||||
© 2026 ThereIsNo.Space. All rights reserved. <br>
|
||||
Made with <a href="https://gohugo.io" target="_blank">Hugo</a> | <a
|
||||
href="https://github.com/Enerhim/enervoid-theme" target="_blank">Enervoid</a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex items-center space-x-6 text-sm sm:text-base md:text-lg">
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</footer>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,31 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>ThereIsNo.Space</title>
|
||||
<link>https://thereisno.space/</link>
|
||||
<description>Recent content on ThereIsNo.Space</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>de</language>
|
||||
|
||||
|
||||
|
||||
|
||||
<lastBuildDate>Mon, 14 Sep 2026 00:00:00 +0200</lastBuildDate>
|
||||
|
||||
<atom:link href="https://thereisno.space/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Willkommen im ThereIsNo.Space</title>
|
||||
<link>https://thereisno.space/blog/wilkommen/</link>
|
||||
<pubDate>Mon, 14 Sep 2026 00:00:00 +0200</pubDate>
|
||||
<guid>https://thereisno.space/blog/wilkommen/</guid>
|
||||
<description><p>#Dies ist der erste Beitrag auf unserer neuen Seite.</p>
<p><strong>echo &ldquo;Hello, World!&rdquo; &gt; /dev/thereisno.space</strong>
Hier wird künftig über Projekte, Workshops und Events berichtet.
<strong>Stay tuned!</strong></p></description>
|
||||
</item>
|
||||
<item>
|
||||
<title></title>
|
||||
<link>https://thereisno.space/about/</link>
|
||||
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
|
||||
<guid>https://thereisno.space/about/</guid>
|
||||
<description><h1 id="über-thereisnospace" class=" mt-8 mb-3 text-2xl sm:text-3xl text-white">
 <span class="relative inline-block">
 Über ThereIsNo.Space
 <span
 class="absolute left-0 -bottom-1 h-px w-0 bg-indigo-400"></span>
 </span>
</h1>
<p>ThereIsNo.Space ist ein sich im aufbau befindlicher Hacker und Makerspace.</p>
<h2 id="unsere-werte" class="mt-8 mb-3 text-xl sm:text-2xl text-white">
 <span class="relative inline-block">
 Unsere Werte
 <span
 class="absolute left-0 -bottom-1 h-px w-0 bg-indigo-400"></span>
 </span>
</h2>
<ul>
<li>Open Knowledge – Wissen teilen statt horten</li>
<li>Hands-on – Lernen durch Ausprobieren</li>
<li>Community – Alle sind willkommen, egal welches Skill-Level</li>
</ul>
<h2 id="kontakt" class="mt-8 mb-3 text-xl sm:text-2xl text-white">
 <span class="relative inline-block">
 Kontakt
 <span
 class="absolute left-0 -bottom-1 h-px w-0 bg-indigo-400"></span>
 </span>
</h2>
<p>E-Mail: <a href="mailto:info@thereisno.space">info@thereisno.space</a>
Matrix: #ThereIsNoSpace:wolffy.eu
Oder Triff uns auf Events!</p></description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
@@ -1,467 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de" dir="ltr">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<link rel="icon" type="image/png" href="/avatar.png">
|
||||
<title>Posts</title>
|
||||
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
|
||||
<link rel="stylesheet" type='text/css' href="https://cdn.jsdelivr.net/gh/devicons/devicon@latest/devicon.min.css" />
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/css/all.min.css"
|
||||
integrity="sha512-2SwdPD6INVrV/lHTZbO2nodKhrnDdJK9/kg2XD1r9uGqPo1cUbujc+IYdlYdEErWNu69gVcYgdxlmVmzTWnetw=="
|
||||
crossorigin="anonymous" referrerpolicy="no-referrer" />
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=Ubuntu+Sans+Mono:ital,wght@0,400..700;1,400..700&display=swap');
|
||||
|
||||
.font-jersey {
|
||||
|
||||
font-family: "Ubuntu Sans Mono", monospace;
|
||||
font-optical-sizing: auto;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
|
||||
.md-content .katex-display {
|
||||
max-width: 100%;
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
padding-left: 0.25rem;
|
||||
padding-right: 0.25rem;
|
||||
}
|
||||
|
||||
.md-content .katex-display>.katex {
|
||||
display: inline-block;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.swup-transition-fade {
|
||||
opacity: 1;
|
||||
transition: 300ms ease-in-out;
|
||||
}
|
||||
|
||||
.is-animating .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.swup-transition-fade {
|
||||
opacity: 1;
|
||||
transition: opacity 300ms ease-in-out;
|
||||
}
|
||||
|
||||
html.is-animating .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
html.is-animating {
|
||||
cursor: progress;
|
||||
}
|
||||
|
||||
html.is-leaving .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script src="https://unpkg.com/swup@4"></script>
|
||||
<script src="https://unpkg.com/@swup/preload-plugin@3"></script>
|
||||
<script src="https://unpkg.com/@swup/progress-plugin@3"></script>
|
||||
<script>
|
||||
const swup = new Swup({
|
||||
containers: ['#swup'],
|
||||
animationSelector: '[class*="swup-transition-"]',
|
||||
cache: true,
|
||||
preload: true,
|
||||
animateHistoryBrowsing: true,
|
||||
|
||||
plugins: [
|
||||
new SwupPreloadPlugin(),
|
||||
new SwupProgressPlugin()
|
||||
]
|
||||
})
|
||||
window.swup = swup
|
||||
</script>
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.css" crossorigin="anonymous">
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.js" crossorigin="anonymous"></script>
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/contrib/auto-render.min.js"
|
||||
crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
|
||||
|
||||
|
||||
const KATEX_CONFIG = {
|
||||
delimiters: [
|
||||
{left: "$$", right: "$$", display: true},
|
||||
{left: "$", right: "$", display: false},
|
||||
{left: "\\[", right: "\\]", display: true},
|
||||
{left: "\\(", right: "\\)", display: false}
|
||||
],
|
||||
ignoredTags: ["script", "noscript", "style", "textarea", "pre", "code"],
|
||||
throwOnError: false
|
||||
};
|
||||
|
||||
|
||||
function renderKatex() {
|
||||
|
||||
if (typeof renderMathInElement !== "function") {
|
||||
console.log("⏳ Waiting for KaTeX to load...");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const contentArea = document.getElementById('swup') || document.body;
|
||||
|
||||
try {
|
||||
renderMathInElement(contentArea, KATEX_CONFIG);
|
||||
console.log("✅ KaTeX rendered successfully");
|
||||
} catch (error) {
|
||||
console.error("❌ KaTeX rendering error:", error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function renderKatexWithRetry(maxRetries = 10, delay = 100) {
|
||||
let attempts = 0;
|
||||
|
||||
const attempt = () => {
|
||||
if (typeof renderMathInElement === "function") {
|
||||
renderKatex();
|
||||
} else if (attempts < maxRetries) {
|
||||
attempts++;
|
||||
setTimeout(attempt, delay);
|
||||
} else {
|
||||
console.warn("⚠️ KaTeX auto-render not available after", maxRetries, "attempts");
|
||||
}
|
||||
};
|
||||
|
||||
attempt();
|
||||
}
|
||||
|
||||
|
||||
function setupSwupIntegration() {
|
||||
|
||||
if (window.swup) {
|
||||
window.swup.hooks.on('page:view', () => {
|
||||
console.log("🔄 Swup transition complete, re-rendering KaTeX...");
|
||||
|
||||
setTimeout(() => renderKatexWithRetry(3, 50), 50);
|
||||
});
|
||||
console.log("✅ KaTeX-Swup integration ready");
|
||||
} else {
|
||||
|
||||
setTimeout(setupSwupIntegration, 100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
console.log("🚀 Initializing KaTeX...");
|
||||
|
||||
|
||||
renderKatexWithRetry();
|
||||
|
||||
|
||||
setupSwupIntegration();
|
||||
});
|
||||
|
||||
|
||||
window.renderKatex = renderKatex;
|
||||
</script>
|
||||
|
||||
<script type="module">
|
||||
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
|
||||
|
||||
let initialized = false;
|
||||
|
||||
function renderMermaid() {
|
||||
const contentArea = document.getElementById('swup') || document.body;
|
||||
const mermaidBlocks = contentArea.querySelectorAll('.language-mermaid, .mermaid');
|
||||
|
||||
if (mermaidBlocks.length === 0) {
|
||||
console.log("ℹ️ No mermaid blocks found on this page");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!initialized) {
|
||||
mermaid.initialize({startOnLoad: false, theme: 'dark'});
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
mermaidBlocks.forEach(el => {
|
||||
if (el.dataset.processed === 'true') {
|
||||
const source = el.dataset.mermaidSource;
|
||||
if (source) {
|
||||
el.innerHTML = source;
|
||||
el.removeAttribute('data-processed');
|
||||
}
|
||||
} else {
|
||||
el.dataset.mermaidSource = el.textContent;
|
||||
}
|
||||
});
|
||||
|
||||
mermaid.run({nodes: mermaidBlocks})
|
||||
.then(() => console.log("✅ Mermaid rendered successfully"))
|
||||
.catch(err => console.error("❌ Mermaid rendering error:", err));
|
||||
}
|
||||
|
||||
function renderMermaidWithRetry(maxRetries = 10, delay = 100) {
|
||||
let attempts = 0;
|
||||
|
||||
const attempt = () => {
|
||||
if (typeof mermaid.initialize === "function") {
|
||||
renderMermaid();
|
||||
} else if (attempts < maxRetries) {
|
||||
attempts++;
|
||||
setTimeout(attempt, delay);
|
||||
} else {
|
||||
console.warn("⚠️ Mermaid auto-render not available after", maxRetries, "attempts");
|
||||
}
|
||||
};
|
||||
|
||||
attempt();
|
||||
}
|
||||
|
||||
|
||||
function setupSwupIntegration() {
|
||||
|
||||
if (window.swup) {
|
||||
window.swup.hooks.on('page:view', () => {
|
||||
console.log("🔄 Swup transition complete, re-rendering mermaid...");
|
||||
|
||||
setTimeout(() => renderMermaidWithRetry(3, 50), 50);
|
||||
});
|
||||
console.log("✅ Mermaid-Swup integration ready");
|
||||
} else {
|
||||
|
||||
setTimeout(setupSwupIntegration, 100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
console.log("🚀 Initializing KaTeX...");
|
||||
|
||||
|
||||
renderMermaidWithRetry();
|
||||
|
||||
|
||||
setupSwupIntegration();
|
||||
});
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
</head>
|
||||
|
||||
<body class="min-h-screen flex flex-col bg-black font-jersey text-white text-3xl">
|
||||
<header>
|
||||
<div class="sticky absolute top-0 z-50">
|
||||
<nav class="w-full border-b border-gray-800 bg-[#070709]/95 backdrop-blur-sm text-gray-100">
|
||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
||||
<div class="flex items-center justify-between h-16">
|
||||
|
||||
<div class="flex items-center gap-3">
|
||||
|
||||
<a href='https://thereisno.space/' class="flex items-center gap-3 group" aria-label="Homepage">
|
||||
|
||||
<img src='/avatar.jpg' alt="ThereIsNo.Space"
|
||||
class="w-10 h-10 rounded-sm border-2 border-gray-700 object-cover transition-transform duration-300 transform group-hover:scale-105"
|
||||
style="animation: border-breathe 4s ease-in-out infinite;" />
|
||||
<span class="text-white text-lg sm:text-xl md:text-2xl lg:text-3xl font-semibold tracking-wide">
|
||||
ThereIsNo.Space
|
||||
<span class="inline-block ml-2" style="animation: flicker 1.6s steps(2, end) infinite;">_</span>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex items-center gap-4">
|
||||
|
||||
<div class="hidden md:flex items-center">
|
||||
|
||||
|
||||
<nav aria-label="Primary" class="w-full">
|
||||
<ul
|
||||
class="flex flex-col md:flex-row md:items-center md:space-x-6 space-y-2 md:space-y-0 sm:text-lg md:text-xl lg:text-3xl"><li>
|
||||
<a href="/about/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Über uns</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a aria-current="page" href="/posts/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Posts</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div class="md:hidden">
|
||||
<button id="nav-toggle" aria-controls="mobile-menu" aria-expanded="false"
|
||||
class="inline-flex items-center justify-center p-2 rounded-md focus:outline-none focus:ring-2 focus:ring-indigo-400"
|
||||
aria-label="Open menu">
|
||||
<svg class="h-6 w-6 text-gray-200" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
|
||||
stroke="currentColor" aria-hidden="true">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="mobile-menu" class="md:hidden hidden pb-4">
|
||||
|
||||
|
||||
|
||||
<nav aria-label="Primary" class="w-full">
|
||||
<ul
|
||||
class="flex flex-col md:flex-row md:items-center md:space-x-6 space-y-2 md:space-y-0 sm:text-lg md:text-xl lg:text-3xl"><li>
|
||||
<a href="/about/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Über uns</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a aria-current="page" href="/posts/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Posts</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<style>
|
||||
@keyframes flicker {
|
||||
0% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
10% {
|
||||
opacity: 0.2;
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
20% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes border-breathe {
|
||||
0% {
|
||||
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.06);
|
||||
}
|
||||
|
||||
50% {
|
||||
box-shadow: 0 0 18px 6px rgba(99, 102, 241, 0.03);
|
||||
}
|
||||
|
||||
100% {
|
||||
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.06);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<script>
|
||||
(function () {
|
||||
const btn = document.getElementById('nav-toggle');
|
||||
const menu = document.getElementById('mobile-menu');
|
||||
if (!btn || !menu) return;
|
||||
btn.addEventListener('click', () => {
|
||||
const open = menu.classList.toggle('hidden') === false;
|
||||
btn.setAttribute('aria-expanded', open ? 'true' : 'false');
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</div>
|
||||
|
||||
</header>
|
||||
|
||||
<main class="flex-1 w-full">
|
||||
<div id="swup" class="swup-transition-fade">
|
||||
<div class="max-w-3xl lg:max-w-6xl xl:max-w-7xl mx-auto px-5 sm:px-8 lg:px-10 py-10 lg:py-16">
|
||||
|
||||
<h1>Posts</h1>
|
||||
|
||||
|
||||
<section>
|
||||
<h2><a href="/posts/wilkommen/"></a></h2>
|
||||
<p>title: “Willkommen im ThereIsNo.Space”
|
||||
date: 2026-09-14
|
||||
draft: false
|
||||
description: “Der erste Post unseres Hackerspace-Blogs.”
|
||||
tags: [“hackerspace”, “makerspace”]</p>
|
||||
<p>#Dies ist der erste Beitrag auf unserer neuen Seite.</p>
|
||||
<p><strong>echo “Hello, World!” > /dev/thereisno.space</strong>
|
||||
Hier wird künftig über Projekte, Workshops und Events berichtet.
|
||||
<strong>Stay tuned!</strong></p>
|
||||
</section>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<div class="border-t border-gray-800 bg-[#070709] text-gray-400">
|
||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
||||
<div class="flex flex-col md:flex-row items-center justify-between py-6 space-y-4 md:space-y-0">
|
||||
|
||||
|
||||
<div class="text-sm sm:text-base md:text-lg">
|
||||
<span class="relative inline-block">
|
||||
© 2026 ThereIsNo.Space. All rights reserved. <br>
|
||||
Made with <a href="https://gohugo.io" target="_blank">Hugo</a> | <a
|
||||
href="https://github.com/Enerhim/enervoid-theme" target="_blank">Enervoid</a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex items-center space-x-6 text-sm sm:text-base md:text-lg">
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</footer>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,22 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Posts on ThereIsNo.Space</title>
|
||||
<link>https://thereisno.space/posts/</link>
|
||||
<description>Recent content in Posts on ThereIsNo.Space</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>de</language>
|
||||
|
||||
|
||||
|
||||
|
||||
<atom:link href="https://thereisno.space/posts/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title></title>
|
||||
<link>https://thereisno.space/posts/wilkommen/</link>
|
||||
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
|
||||
<guid>https://thereisno.space/posts/wilkommen/</guid>
|
||||
<description><p>title: &ldquo;Willkommen im ThereIsNo.Space&rdquo;
date: 2026-09-14
draft: false
description: &ldquo;Der erste Post unseres Hackerspace-Blogs.&rdquo;
tags: [&ldquo;hackerspace&rdquo;, &ldquo;makerspace&rdquo;]</p>
<p>#Dies ist der erste Beitrag auf unserer neuen Seite.</p>
<p><strong>echo &ldquo;Hello, World!&rdquo; &gt; /dev/thereisno.space</strong>
Hier wird künftig über Projekte, Workshops und Events berichtet.
<strong>Stay tuned!</strong></p></description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
@@ -1,469 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de" dir="ltr">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<link rel="icon" type="image/png" href="/avatar.png">
|
||||
<title></title>
|
||||
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
|
||||
<link rel="stylesheet" type='text/css' href="https://cdn.jsdelivr.net/gh/devicons/devicon@latest/devicon.min.css" />
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/css/all.min.css"
|
||||
integrity="sha512-2SwdPD6INVrV/lHTZbO2nodKhrnDdJK9/kg2XD1r9uGqPo1cUbujc+IYdlYdEErWNu69gVcYgdxlmVmzTWnetw=="
|
||||
crossorigin="anonymous" referrerpolicy="no-referrer" />
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=Ubuntu+Sans+Mono:ital,wght@0,400..700;1,400..700&display=swap');
|
||||
|
||||
.font-jersey {
|
||||
|
||||
font-family: "Ubuntu Sans Mono", monospace;
|
||||
font-optical-sizing: auto;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
|
||||
.md-content .katex-display {
|
||||
max-width: 100%;
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
padding-left: 0.25rem;
|
||||
padding-right: 0.25rem;
|
||||
}
|
||||
|
||||
.md-content .katex-display>.katex {
|
||||
display: inline-block;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.swup-transition-fade {
|
||||
opacity: 1;
|
||||
transition: 300ms ease-in-out;
|
||||
}
|
||||
|
||||
.is-animating .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.swup-transition-fade {
|
||||
opacity: 1;
|
||||
transition: opacity 300ms ease-in-out;
|
||||
}
|
||||
|
||||
html.is-animating .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
html.is-animating {
|
||||
cursor: progress;
|
||||
}
|
||||
|
||||
html.is-leaving .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script src="https://unpkg.com/swup@4"></script>
|
||||
<script src="https://unpkg.com/@swup/preload-plugin@3"></script>
|
||||
<script src="https://unpkg.com/@swup/progress-plugin@3"></script>
|
||||
<script>
|
||||
const swup = new Swup({
|
||||
containers: ['#swup'],
|
||||
animationSelector: '[class*="swup-transition-"]',
|
||||
cache: true,
|
||||
preload: true,
|
||||
animateHistoryBrowsing: true,
|
||||
|
||||
plugins: [
|
||||
new SwupPreloadPlugin(),
|
||||
new SwupProgressPlugin()
|
||||
]
|
||||
})
|
||||
window.swup = swup
|
||||
</script>
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.css" crossorigin="anonymous">
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.js" crossorigin="anonymous"></script>
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/contrib/auto-render.min.js"
|
||||
crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
|
||||
|
||||
|
||||
const KATEX_CONFIG = {
|
||||
delimiters: [
|
||||
{left: "$$", right: "$$", display: true},
|
||||
{left: "$", right: "$", display: false},
|
||||
{left: "\\[", right: "\\]", display: true},
|
||||
{left: "\\(", right: "\\)", display: false}
|
||||
],
|
||||
ignoredTags: ["script", "noscript", "style", "textarea", "pre", "code"],
|
||||
throwOnError: false
|
||||
};
|
||||
|
||||
|
||||
function renderKatex() {
|
||||
|
||||
if (typeof renderMathInElement !== "function") {
|
||||
console.log("⏳ Waiting for KaTeX to load...");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const contentArea = document.getElementById('swup') || document.body;
|
||||
|
||||
try {
|
||||
renderMathInElement(contentArea, KATEX_CONFIG);
|
||||
console.log("✅ KaTeX rendered successfully");
|
||||
} catch (error) {
|
||||
console.error("❌ KaTeX rendering error:", error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function renderKatexWithRetry(maxRetries = 10, delay = 100) {
|
||||
let attempts = 0;
|
||||
|
||||
const attempt = () => {
|
||||
if (typeof renderMathInElement === "function") {
|
||||
renderKatex();
|
||||
} else if (attempts < maxRetries) {
|
||||
attempts++;
|
||||
setTimeout(attempt, delay);
|
||||
} else {
|
||||
console.warn("⚠️ KaTeX auto-render not available after", maxRetries, "attempts");
|
||||
}
|
||||
};
|
||||
|
||||
attempt();
|
||||
}
|
||||
|
||||
|
||||
function setupSwupIntegration() {
|
||||
|
||||
if (window.swup) {
|
||||
window.swup.hooks.on('page:view', () => {
|
||||
console.log("🔄 Swup transition complete, re-rendering KaTeX...");
|
||||
|
||||
setTimeout(() => renderKatexWithRetry(3, 50), 50);
|
||||
});
|
||||
console.log("✅ KaTeX-Swup integration ready");
|
||||
} else {
|
||||
|
||||
setTimeout(setupSwupIntegration, 100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
console.log("🚀 Initializing KaTeX...");
|
||||
|
||||
|
||||
renderKatexWithRetry();
|
||||
|
||||
|
||||
setupSwupIntegration();
|
||||
});
|
||||
|
||||
|
||||
window.renderKatex = renderKatex;
|
||||
</script>
|
||||
|
||||
<script type="module">
|
||||
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
|
||||
|
||||
let initialized = false;
|
||||
|
||||
function renderMermaid() {
|
||||
const contentArea = document.getElementById('swup') || document.body;
|
||||
const mermaidBlocks = contentArea.querySelectorAll('.language-mermaid, .mermaid');
|
||||
|
||||
if (mermaidBlocks.length === 0) {
|
||||
console.log("ℹ️ No mermaid blocks found on this page");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!initialized) {
|
||||
mermaid.initialize({startOnLoad: false, theme: 'dark'});
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
mermaidBlocks.forEach(el => {
|
||||
if (el.dataset.processed === 'true') {
|
||||
const source = el.dataset.mermaidSource;
|
||||
if (source) {
|
||||
el.innerHTML = source;
|
||||
el.removeAttribute('data-processed');
|
||||
}
|
||||
} else {
|
||||
el.dataset.mermaidSource = el.textContent;
|
||||
}
|
||||
});
|
||||
|
||||
mermaid.run({nodes: mermaidBlocks})
|
||||
.then(() => console.log("✅ Mermaid rendered successfully"))
|
||||
.catch(err => console.error("❌ Mermaid rendering error:", err));
|
||||
}
|
||||
|
||||
function renderMermaidWithRetry(maxRetries = 10, delay = 100) {
|
||||
let attempts = 0;
|
||||
|
||||
const attempt = () => {
|
||||
if (typeof mermaid.initialize === "function") {
|
||||
renderMermaid();
|
||||
} else if (attempts < maxRetries) {
|
||||
attempts++;
|
||||
setTimeout(attempt, delay);
|
||||
} else {
|
||||
console.warn("⚠️ Mermaid auto-render not available after", maxRetries, "attempts");
|
||||
}
|
||||
};
|
||||
|
||||
attempt();
|
||||
}
|
||||
|
||||
|
||||
function setupSwupIntegration() {
|
||||
|
||||
if (window.swup) {
|
||||
window.swup.hooks.on('page:view', () => {
|
||||
console.log("🔄 Swup transition complete, re-rendering mermaid...");
|
||||
|
||||
setTimeout(() => renderMermaidWithRetry(3, 50), 50);
|
||||
});
|
||||
console.log("✅ Mermaid-Swup integration ready");
|
||||
} else {
|
||||
|
||||
setTimeout(setupSwupIntegration, 100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
console.log("🚀 Initializing KaTeX...");
|
||||
|
||||
|
||||
renderMermaidWithRetry();
|
||||
|
||||
|
||||
setupSwupIntegration();
|
||||
});
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
</head>
|
||||
|
||||
<body class="min-h-screen flex flex-col bg-black font-jersey text-white text-3xl">
|
||||
<header>
|
||||
<div class="sticky absolute top-0 z-50">
|
||||
<nav class="w-full border-b border-gray-800 bg-[#070709]/95 backdrop-blur-sm text-gray-100">
|
||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
||||
<div class="flex items-center justify-between h-16">
|
||||
|
||||
<div class="flex items-center gap-3">
|
||||
|
||||
<a href='https://thereisno.space/' class="flex items-center gap-3 group" aria-label="Homepage">
|
||||
|
||||
<img src='/avatar.jpg' alt="ThereIsNo.Space"
|
||||
class="w-10 h-10 rounded-sm border-2 border-gray-700 object-cover transition-transform duration-300 transform group-hover:scale-105"
|
||||
style="animation: border-breathe 4s ease-in-out infinite;" />
|
||||
<span class="text-white text-lg sm:text-xl md:text-2xl lg:text-3xl font-semibold tracking-wide">
|
||||
ThereIsNo.Space
|
||||
<span class="inline-block ml-2" style="animation: flicker 1.6s steps(2, end) infinite;">_</span>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex items-center gap-4">
|
||||
|
||||
<div class="hidden md:flex items-center">
|
||||
|
||||
|
||||
<nav aria-label="Primary" class="w-full">
|
||||
<ul
|
||||
class="flex flex-col md:flex-row md:items-center md:space-x-6 space-y-2 md:space-y-0 sm:text-lg md:text-xl lg:text-3xl"><li>
|
||||
<a href="/about/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Über uns</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a aria-current="true" href="/posts/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Posts</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div class="md:hidden">
|
||||
<button id="nav-toggle" aria-controls="mobile-menu" aria-expanded="false"
|
||||
class="inline-flex items-center justify-center p-2 rounded-md focus:outline-none focus:ring-2 focus:ring-indigo-400"
|
||||
aria-label="Open menu">
|
||||
<svg class="h-6 w-6 text-gray-200" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
|
||||
stroke="currentColor" aria-hidden="true">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="mobile-menu" class="md:hidden hidden pb-4">
|
||||
|
||||
|
||||
|
||||
<nav aria-label="Primary" class="w-full">
|
||||
<ul
|
||||
class="flex flex-col md:flex-row md:items-center md:space-x-6 space-y-2 md:space-y-0 sm:text-lg md:text-xl lg:text-3xl"><li>
|
||||
<a href="/about/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Über uns</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a aria-current="true" href="/posts/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Posts</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<style>
|
||||
@keyframes flicker {
|
||||
0% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
10% {
|
||||
opacity: 0.2;
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
20% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes border-breathe {
|
||||
0% {
|
||||
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.06);
|
||||
}
|
||||
|
||||
50% {
|
||||
box-shadow: 0 0 18px 6px rgba(99, 102, 241, 0.03);
|
||||
}
|
||||
|
||||
100% {
|
||||
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.06);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<script>
|
||||
(function () {
|
||||
const btn = document.getElementById('nav-toggle');
|
||||
const menu = document.getElementById('mobile-menu');
|
||||
if (!btn || !menu) return;
|
||||
btn.addEventListener('click', () => {
|
||||
const open = menu.classList.toggle('hidden') === false;
|
||||
btn.setAttribute('aria-expanded', open ? 'true' : 'false');
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</div>
|
||||
|
||||
</header>
|
||||
|
||||
<main class="flex-1 w-full">
|
||||
<div id="swup" class="swup-transition-fade">
|
||||
<div class="max-w-3xl lg:max-w-6xl xl:max-w-7xl mx-auto px-5 sm:px-8 lg:px-10 py-10 lg:py-16">
|
||||
|
||||
<h1></h1>
|
||||
|
||||
|
||||
|
||||
<time datetime="0001-01-01T00:00:00+00:00">1. Januar 1</time>
|
||||
|
||||
<p>title: “Willkommen im ThereIsNo.Space”
|
||||
date: 2026-09-14
|
||||
draft: false
|
||||
description: “Der erste Post unseres Hackerspace-Blogs.”
|
||||
tags: [“hackerspace”, “makerspace”]</p>
|
||||
<p>#Dies ist der erste Beitrag auf unserer neuen Seite.</p>
|
||||
<p><strong>echo “Hello, World!” > /dev/thereisno.space</strong>
|
||||
Hier wird künftig über Projekte, Workshops und Events berichtet.
|
||||
<strong>Stay tuned!</strong></p>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<div class="border-t border-gray-800 bg-[#070709] text-gray-400">
|
||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
||||
<div class="flex flex-col md:flex-row items-center justify-between py-6 space-y-4 md:space-y-0">
|
||||
|
||||
|
||||
<div class="text-sm sm:text-base md:text-lg">
|
||||
<span class="relative inline-block">
|
||||
© 2026 ThereIsNo.Space. All rights reserved. <br>
|
||||
Made with <a href="https://gohugo.io" target="_blank">Hugo</a> | <a
|
||||
href="https://github.com/Enerhim/enervoid-theme" target="_blank">Enervoid</a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex items-center space-x-6 text-sm sm:text-base md:text-lg">
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</footer>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
-27
@@ -1,27 +0,0 @@
|
||||
<?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>https://thereisno.space/blog/</loc>
|
||||
<lastmod>2026-09-14T00:00:00+02:00</lastmod>
|
||||
</url><url>
|
||||
<loc>https://thereisno.space/tags/hackerspace/</loc>
|
||||
<lastmod>2026-09-14T00:00:00+02:00</lastmod>
|
||||
</url><url>
|
||||
<loc>https://thereisno.space/tags/makerspace/</loc>
|
||||
<lastmod>2026-09-14T00:00:00+02:00</lastmod>
|
||||
</url><url>
|
||||
<loc>https://thereisno.space/tags/</loc>
|
||||
<lastmod>2026-09-14T00:00:00+02:00</lastmod>
|
||||
</url><url>
|
||||
<loc>https://thereisno.space/</loc>
|
||||
<lastmod>2026-09-14T00:00:00+02:00</lastmod>
|
||||
</url><url>
|
||||
<loc>https://thereisno.space/blog/wilkommen/</loc>
|
||||
<lastmod>2026-09-14T00:00:00+02:00</lastmod>
|
||||
</url><url>
|
||||
<loc>https://thereisno.space/about/</loc>
|
||||
</url><url>
|
||||
<loc>https://thereisno.space/categories/</loc>
|
||||
</url>
|
||||
</urlset>
|
||||
@@ -1,474 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de" dir="ltr">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<link rel="icon" type="image/png" href="/avatar.png">
|
||||
<title>Hackerspace</title>
|
||||
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
|
||||
<link rel="stylesheet" type='text/css' href="https://cdn.jsdelivr.net/gh/devicons/devicon@latest/devicon.min.css" />
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/css/all.min.css"
|
||||
integrity="sha512-2SwdPD6INVrV/lHTZbO2nodKhrnDdJK9/kg2XD1r9uGqPo1cUbujc+IYdlYdEErWNu69gVcYgdxlmVmzTWnetw=="
|
||||
crossorigin="anonymous" referrerpolicy="no-referrer" />
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=Ubuntu+Sans+Mono:ital,wght@0,400..700;1,400..700&display=swap');
|
||||
|
||||
.font-jersey {
|
||||
|
||||
font-family: "Ubuntu Sans Mono", monospace;
|
||||
font-optical-sizing: auto;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
|
||||
.md-content .katex-display {
|
||||
max-width: 100%;
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
padding-left: 0.25rem;
|
||||
padding-right: 0.25rem;
|
||||
}
|
||||
|
||||
.md-content .katex-display>.katex {
|
||||
display: inline-block;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.swup-transition-fade {
|
||||
opacity: 1;
|
||||
transition: 300ms ease-in-out;
|
||||
}
|
||||
|
||||
.is-animating .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.swup-transition-fade {
|
||||
opacity: 1;
|
||||
transition: opacity 300ms ease-in-out;
|
||||
}
|
||||
|
||||
html.is-animating .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
html.is-animating {
|
||||
cursor: progress;
|
||||
}
|
||||
|
||||
html.is-leaving .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script src="https://unpkg.com/swup@4"></script>
|
||||
<script src="https://unpkg.com/@swup/preload-plugin@3"></script>
|
||||
<script src="https://unpkg.com/@swup/progress-plugin@3"></script>
|
||||
<script>
|
||||
const swup = new Swup({
|
||||
containers: ['#swup'],
|
||||
animationSelector: '[class*="swup-transition-"]',
|
||||
cache: true,
|
||||
preload: true,
|
||||
animateHistoryBrowsing: true,
|
||||
|
||||
plugins: [
|
||||
new SwupPreloadPlugin(),
|
||||
new SwupProgressPlugin()
|
||||
]
|
||||
})
|
||||
window.swup = swup
|
||||
</script>
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.css" crossorigin="anonymous">
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.js" crossorigin="anonymous"></script>
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/contrib/auto-render.min.js"
|
||||
crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
|
||||
|
||||
|
||||
const KATEX_CONFIG = {
|
||||
delimiters: [
|
||||
{left: "$$", right: "$$", display: true},
|
||||
{left: "$", right: "$", display: false},
|
||||
{left: "\\[", right: "\\]", display: true},
|
||||
{left: "\\(", right: "\\)", display: false}
|
||||
],
|
||||
ignoredTags: ["script", "noscript", "style", "textarea", "pre", "code"],
|
||||
throwOnError: false
|
||||
};
|
||||
|
||||
|
||||
function renderKatex() {
|
||||
|
||||
if (typeof renderMathInElement !== "function") {
|
||||
console.log("⏳ Waiting for KaTeX to load...");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const contentArea = document.getElementById('swup') || document.body;
|
||||
|
||||
try {
|
||||
renderMathInElement(contentArea, KATEX_CONFIG);
|
||||
console.log("✅ KaTeX rendered successfully");
|
||||
} catch (error) {
|
||||
console.error("❌ KaTeX rendering error:", error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function renderKatexWithRetry(maxRetries = 10, delay = 100) {
|
||||
let attempts = 0;
|
||||
|
||||
const attempt = () => {
|
||||
if (typeof renderMathInElement === "function") {
|
||||
renderKatex();
|
||||
} else if (attempts < maxRetries) {
|
||||
attempts++;
|
||||
setTimeout(attempt, delay);
|
||||
} else {
|
||||
console.warn("⚠️ KaTeX auto-render not available after", maxRetries, "attempts");
|
||||
}
|
||||
};
|
||||
|
||||
attempt();
|
||||
}
|
||||
|
||||
|
||||
function setupSwupIntegration() {
|
||||
|
||||
if (window.swup) {
|
||||
window.swup.hooks.on('page:view', () => {
|
||||
console.log("🔄 Swup transition complete, re-rendering KaTeX...");
|
||||
|
||||
setTimeout(() => renderKatexWithRetry(3, 50), 50);
|
||||
});
|
||||
console.log("✅ KaTeX-Swup integration ready");
|
||||
} else {
|
||||
|
||||
setTimeout(setupSwupIntegration, 100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
console.log("🚀 Initializing KaTeX...");
|
||||
|
||||
|
||||
renderKatexWithRetry();
|
||||
|
||||
|
||||
setupSwupIntegration();
|
||||
});
|
||||
|
||||
|
||||
window.renderKatex = renderKatex;
|
||||
</script>
|
||||
|
||||
<script type="module">
|
||||
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
|
||||
|
||||
let initialized = false;
|
||||
|
||||
function renderMermaid() {
|
||||
const contentArea = document.getElementById('swup') || document.body;
|
||||
const mermaidBlocks = contentArea.querySelectorAll('.language-mermaid, .mermaid');
|
||||
|
||||
if (mermaidBlocks.length === 0) {
|
||||
console.log("ℹ️ No mermaid blocks found on this page");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!initialized) {
|
||||
mermaid.initialize({startOnLoad: false, theme: 'dark'});
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
mermaidBlocks.forEach(el => {
|
||||
if (el.dataset.processed === 'true') {
|
||||
const source = el.dataset.mermaidSource;
|
||||
if (source) {
|
||||
el.innerHTML = source;
|
||||
el.removeAttribute('data-processed');
|
||||
}
|
||||
} else {
|
||||
el.dataset.mermaidSource = el.textContent;
|
||||
}
|
||||
});
|
||||
|
||||
mermaid.run({nodes: mermaidBlocks})
|
||||
.then(() => console.log("✅ Mermaid rendered successfully"))
|
||||
.catch(err => console.error("❌ Mermaid rendering error:", err));
|
||||
}
|
||||
|
||||
function renderMermaidWithRetry(maxRetries = 10, delay = 100) {
|
||||
let attempts = 0;
|
||||
|
||||
const attempt = () => {
|
||||
if (typeof mermaid.initialize === "function") {
|
||||
renderMermaid();
|
||||
} else if (attempts < maxRetries) {
|
||||
attempts++;
|
||||
setTimeout(attempt, delay);
|
||||
} else {
|
||||
console.warn("⚠️ Mermaid auto-render not available after", maxRetries, "attempts");
|
||||
}
|
||||
};
|
||||
|
||||
attempt();
|
||||
}
|
||||
|
||||
|
||||
function setupSwupIntegration() {
|
||||
|
||||
if (window.swup) {
|
||||
window.swup.hooks.on('page:view', () => {
|
||||
console.log("🔄 Swup transition complete, re-rendering mermaid...");
|
||||
|
||||
setTimeout(() => renderMermaidWithRetry(3, 50), 50);
|
||||
});
|
||||
console.log("✅ Mermaid-Swup integration ready");
|
||||
} else {
|
||||
|
||||
setTimeout(setupSwupIntegration, 100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
console.log("🚀 Initializing KaTeX...");
|
||||
|
||||
|
||||
renderMermaidWithRetry();
|
||||
|
||||
|
||||
setupSwupIntegration();
|
||||
});
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
</head>
|
||||
|
||||
<body class="min-h-screen flex flex-col bg-black font-jersey text-white text-3xl">
|
||||
<header>
|
||||
<div class="sticky absolute top-0 z-50">
|
||||
<nav class="w-full border-b border-gray-800 bg-[#070709]/95 backdrop-blur-sm text-gray-100">
|
||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
||||
<div class="flex items-center justify-between h-16">
|
||||
|
||||
<div class="flex items-center gap-3">
|
||||
|
||||
<a href='https://thereisno.space/' class="flex items-center gap-3 group" aria-label="Homepage">
|
||||
|
||||
<img src='/avatar.jpg' alt="ThereIsNo.Space"
|
||||
class="w-10 h-10 rounded-sm border-2 border-gray-700 object-cover transition-transform duration-300 transform group-hover:scale-105"
|
||||
style="animation: border-breathe 4s ease-in-out infinite;" />
|
||||
<span class="text-white text-lg sm:text-xl md:text-2xl lg:text-3xl font-semibold tracking-wide">
|
||||
ThereIsNo.Space
|
||||
<span class="inline-block ml-2" style="animation: flicker 1.6s steps(2, end) infinite;">_</span>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex items-center gap-4">
|
||||
|
||||
<div class="hidden md:flex items-center">
|
||||
|
||||
|
||||
<nav aria-label="Primary" class="w-full">
|
||||
<ul
|
||||
class="flex flex-col md:flex-row md:items-center md:space-x-6 space-y-2 md:space-y-0 sm:text-lg md:text-xl lg:text-3xl"><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Projects</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/blog/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Blog</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Über uns</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div class="md:hidden">
|
||||
<button id="nav-toggle" aria-controls="mobile-menu" aria-expanded="false"
|
||||
class="inline-flex items-center justify-center p-2 rounded-md focus:outline-none focus:ring-2 focus:ring-indigo-400"
|
||||
aria-label="Open menu">
|
||||
<svg class="h-6 w-6 text-gray-200" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
|
||||
stroke="currentColor" aria-hidden="true">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="mobile-menu" class="md:hidden hidden pb-4">
|
||||
|
||||
|
||||
|
||||
<nav aria-label="Primary" class="w-full">
|
||||
<ul
|
||||
class="flex flex-col md:flex-row md:items-center md:space-x-6 space-y-2 md:space-y-0 sm:text-lg md:text-xl lg:text-3xl"><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Projects</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/blog/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Blog</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Über uns</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<style>
|
||||
@keyframes flicker {
|
||||
0% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
10% {
|
||||
opacity: 0.2;
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
20% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes border-breathe {
|
||||
0% {
|
||||
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.06);
|
||||
}
|
||||
|
||||
50% {
|
||||
box-shadow: 0 0 18px 6px rgba(99, 102, 241, 0.03);
|
||||
}
|
||||
|
||||
100% {
|
||||
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.06);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<script>
|
||||
(function () {
|
||||
const btn = document.getElementById('nav-toggle');
|
||||
const menu = document.getElementById('mobile-menu');
|
||||
if (!btn || !menu) return;
|
||||
btn.addEventListener('click', () => {
|
||||
const open = menu.classList.toggle('hidden') === false;
|
||||
btn.setAttribute('aria-expanded', open ? 'true' : 'false');
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</div>
|
||||
|
||||
</header>
|
||||
|
||||
<main class="flex-1 w-full">
|
||||
<div id="swup" class="swup-transition-fade">
|
||||
<div class="max-w-3xl lg:max-w-6xl xl:max-w-7xl mx-auto px-5 sm:px-8 lg:px-10 py-10 lg:py-16">
|
||||
|
||||
<h1>Hackerspace</h1>
|
||||
|
||||
|
||||
<h2><a href="/blog/wilkommen/">Willkommen im ThereIsNo.Space</a></h2>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<div class="border-t border-gray-800 bg-[#070709] text-gray-400">
|
||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
||||
<div class="flex flex-col md:flex-row items-center justify-between py-6 space-y-4 md:space-y-0">
|
||||
|
||||
|
||||
<div class="text-sm sm:text-base md:text-lg">
|
||||
<span class="relative inline-block">
|
||||
© 2026 ThereIsNo.Space. All rights reserved. <br>
|
||||
Made with <a href="https://gohugo.io" target="_blank">Hugo</a> | <a
|
||||
href="https://github.com/Enerhim/enervoid-theme" target="_blank">Enervoid</a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex items-center space-x-6 text-sm sm:text-base md:text-lg">
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</footer>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,24 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Hackerspace on ThereIsNo.Space</title>
|
||||
<link>https://thereisno.space/tags/hackerspace/</link>
|
||||
<description>Recent content in Hackerspace on ThereIsNo.Space</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>de</language>
|
||||
|
||||
|
||||
|
||||
|
||||
<lastBuildDate>Mon, 14 Sep 2026 00:00:00 +0200</lastBuildDate>
|
||||
|
||||
<atom:link href="https://thereisno.space/tags/hackerspace/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Willkommen im ThereIsNo.Space</title>
|
||||
<link>https://thereisno.space/blog/wilkommen/</link>
|
||||
<pubDate>Mon, 14 Sep 2026 00:00:00 +0200</pubDate>
|
||||
<guid>https://thereisno.space/blog/wilkommen/</guid>
|
||||
<description><p>#Dies ist der erste Beitrag auf unserer neuen Seite.</p>
<p><strong>echo &ldquo;Hello, World!&rdquo; &gt; /dev/thereisno.space</strong>
Hier wird künftig über Projekte, Workshops und Events berichtet.
<strong>Stay tuned!</strong></p></description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
-476
@@ -1,476 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de" dir="ltr">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<link rel="icon" type="image/png" href="/avatar.png">
|
||||
<title>Tags</title>
|
||||
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
|
||||
<link rel="stylesheet" type='text/css' href="https://cdn.jsdelivr.net/gh/devicons/devicon@latest/devicon.min.css" />
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/css/all.min.css"
|
||||
integrity="sha512-2SwdPD6INVrV/lHTZbO2nodKhrnDdJK9/kg2XD1r9uGqPo1cUbujc+IYdlYdEErWNu69gVcYgdxlmVmzTWnetw=="
|
||||
crossorigin="anonymous" referrerpolicy="no-referrer" />
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=Ubuntu+Sans+Mono:ital,wght@0,400..700;1,400..700&display=swap');
|
||||
|
||||
.font-jersey {
|
||||
|
||||
font-family: "Ubuntu Sans Mono", monospace;
|
||||
font-optical-sizing: auto;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
|
||||
.md-content .katex-display {
|
||||
max-width: 100%;
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
padding-left: 0.25rem;
|
||||
padding-right: 0.25rem;
|
||||
}
|
||||
|
||||
.md-content .katex-display>.katex {
|
||||
display: inline-block;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.swup-transition-fade {
|
||||
opacity: 1;
|
||||
transition: 300ms ease-in-out;
|
||||
}
|
||||
|
||||
.is-animating .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.swup-transition-fade {
|
||||
opacity: 1;
|
||||
transition: opacity 300ms ease-in-out;
|
||||
}
|
||||
|
||||
html.is-animating .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
html.is-animating {
|
||||
cursor: progress;
|
||||
}
|
||||
|
||||
html.is-leaving .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script src="https://unpkg.com/swup@4"></script>
|
||||
<script src="https://unpkg.com/@swup/preload-plugin@3"></script>
|
||||
<script src="https://unpkg.com/@swup/progress-plugin@3"></script>
|
||||
<script>
|
||||
const swup = new Swup({
|
||||
containers: ['#swup'],
|
||||
animationSelector: '[class*="swup-transition-"]',
|
||||
cache: true,
|
||||
preload: true,
|
||||
animateHistoryBrowsing: true,
|
||||
|
||||
plugins: [
|
||||
new SwupPreloadPlugin(),
|
||||
new SwupProgressPlugin()
|
||||
]
|
||||
})
|
||||
window.swup = swup
|
||||
</script>
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.css" crossorigin="anonymous">
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.js" crossorigin="anonymous"></script>
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/contrib/auto-render.min.js"
|
||||
crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
|
||||
|
||||
|
||||
const KATEX_CONFIG = {
|
||||
delimiters: [
|
||||
{left: "$$", right: "$$", display: true},
|
||||
{left: "$", right: "$", display: false},
|
||||
{left: "\\[", right: "\\]", display: true},
|
||||
{left: "\\(", right: "\\)", display: false}
|
||||
],
|
||||
ignoredTags: ["script", "noscript", "style", "textarea", "pre", "code"],
|
||||
throwOnError: false
|
||||
};
|
||||
|
||||
|
||||
function renderKatex() {
|
||||
|
||||
if (typeof renderMathInElement !== "function") {
|
||||
console.log("⏳ Waiting for KaTeX to load...");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const contentArea = document.getElementById('swup') || document.body;
|
||||
|
||||
try {
|
||||
renderMathInElement(contentArea, KATEX_CONFIG);
|
||||
console.log("✅ KaTeX rendered successfully");
|
||||
} catch (error) {
|
||||
console.error("❌ KaTeX rendering error:", error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function renderKatexWithRetry(maxRetries = 10, delay = 100) {
|
||||
let attempts = 0;
|
||||
|
||||
const attempt = () => {
|
||||
if (typeof renderMathInElement === "function") {
|
||||
renderKatex();
|
||||
} else if (attempts < maxRetries) {
|
||||
attempts++;
|
||||
setTimeout(attempt, delay);
|
||||
} else {
|
||||
console.warn("⚠️ KaTeX auto-render not available after", maxRetries, "attempts");
|
||||
}
|
||||
};
|
||||
|
||||
attempt();
|
||||
}
|
||||
|
||||
|
||||
function setupSwupIntegration() {
|
||||
|
||||
if (window.swup) {
|
||||
window.swup.hooks.on('page:view', () => {
|
||||
console.log("🔄 Swup transition complete, re-rendering KaTeX...");
|
||||
|
||||
setTimeout(() => renderKatexWithRetry(3, 50), 50);
|
||||
});
|
||||
console.log("✅ KaTeX-Swup integration ready");
|
||||
} else {
|
||||
|
||||
setTimeout(setupSwupIntegration, 100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
console.log("🚀 Initializing KaTeX...");
|
||||
|
||||
|
||||
renderKatexWithRetry();
|
||||
|
||||
|
||||
setupSwupIntegration();
|
||||
});
|
||||
|
||||
|
||||
window.renderKatex = renderKatex;
|
||||
</script>
|
||||
|
||||
<script type="module">
|
||||
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
|
||||
|
||||
let initialized = false;
|
||||
|
||||
function renderMermaid() {
|
||||
const contentArea = document.getElementById('swup') || document.body;
|
||||
const mermaidBlocks = contentArea.querySelectorAll('.language-mermaid, .mermaid');
|
||||
|
||||
if (mermaidBlocks.length === 0) {
|
||||
console.log("ℹ️ No mermaid blocks found on this page");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!initialized) {
|
||||
mermaid.initialize({startOnLoad: false, theme: 'dark'});
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
mermaidBlocks.forEach(el => {
|
||||
if (el.dataset.processed === 'true') {
|
||||
const source = el.dataset.mermaidSource;
|
||||
if (source) {
|
||||
el.innerHTML = source;
|
||||
el.removeAttribute('data-processed');
|
||||
}
|
||||
} else {
|
||||
el.dataset.mermaidSource = el.textContent;
|
||||
}
|
||||
});
|
||||
|
||||
mermaid.run({nodes: mermaidBlocks})
|
||||
.then(() => console.log("✅ Mermaid rendered successfully"))
|
||||
.catch(err => console.error("❌ Mermaid rendering error:", err));
|
||||
}
|
||||
|
||||
function renderMermaidWithRetry(maxRetries = 10, delay = 100) {
|
||||
let attempts = 0;
|
||||
|
||||
const attempt = () => {
|
||||
if (typeof mermaid.initialize === "function") {
|
||||
renderMermaid();
|
||||
} else if (attempts < maxRetries) {
|
||||
attempts++;
|
||||
setTimeout(attempt, delay);
|
||||
} else {
|
||||
console.warn("⚠️ Mermaid auto-render not available after", maxRetries, "attempts");
|
||||
}
|
||||
};
|
||||
|
||||
attempt();
|
||||
}
|
||||
|
||||
|
||||
function setupSwupIntegration() {
|
||||
|
||||
if (window.swup) {
|
||||
window.swup.hooks.on('page:view', () => {
|
||||
console.log("🔄 Swup transition complete, re-rendering mermaid...");
|
||||
|
||||
setTimeout(() => renderMermaidWithRetry(3, 50), 50);
|
||||
});
|
||||
console.log("✅ Mermaid-Swup integration ready");
|
||||
} else {
|
||||
|
||||
setTimeout(setupSwupIntegration, 100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
console.log("🚀 Initializing KaTeX...");
|
||||
|
||||
|
||||
renderMermaidWithRetry();
|
||||
|
||||
|
||||
setupSwupIntegration();
|
||||
});
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
</head>
|
||||
|
||||
<body class="min-h-screen flex flex-col bg-black font-jersey text-white text-3xl">
|
||||
<header>
|
||||
<div class="sticky absolute top-0 z-50">
|
||||
<nav class="w-full border-b border-gray-800 bg-[#070709]/95 backdrop-blur-sm text-gray-100">
|
||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
||||
<div class="flex items-center justify-between h-16">
|
||||
|
||||
<div class="flex items-center gap-3">
|
||||
|
||||
<a href='https://thereisno.space/' class="flex items-center gap-3 group" aria-label="Homepage">
|
||||
|
||||
<img src='/avatar.jpg' alt="ThereIsNo.Space"
|
||||
class="w-10 h-10 rounded-sm border-2 border-gray-700 object-cover transition-transform duration-300 transform group-hover:scale-105"
|
||||
style="animation: border-breathe 4s ease-in-out infinite;" />
|
||||
<span class="text-white text-lg sm:text-xl md:text-2xl lg:text-3xl font-semibold tracking-wide">
|
||||
ThereIsNo.Space
|
||||
<span class="inline-block ml-2" style="animation: flicker 1.6s steps(2, end) infinite;">_</span>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex items-center gap-4">
|
||||
|
||||
<div class="hidden md:flex items-center">
|
||||
|
||||
|
||||
<nav aria-label="Primary" class="w-full">
|
||||
<ul
|
||||
class="flex flex-col md:flex-row md:items-center md:space-x-6 space-y-2 md:space-y-0 sm:text-lg md:text-xl lg:text-3xl"><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Projects</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/blog/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Blog</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Über uns</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div class="md:hidden">
|
||||
<button id="nav-toggle" aria-controls="mobile-menu" aria-expanded="false"
|
||||
class="inline-flex items-center justify-center p-2 rounded-md focus:outline-none focus:ring-2 focus:ring-indigo-400"
|
||||
aria-label="Open menu">
|
||||
<svg class="h-6 w-6 text-gray-200" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
|
||||
stroke="currentColor" aria-hidden="true">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="mobile-menu" class="md:hidden hidden pb-4">
|
||||
|
||||
|
||||
|
||||
<nav aria-label="Primary" class="w-full">
|
||||
<ul
|
||||
class="flex flex-col md:flex-row md:items-center md:space-x-6 space-y-2 md:space-y-0 sm:text-lg md:text-xl lg:text-3xl"><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Projects</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/blog/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Blog</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Über uns</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<style>
|
||||
@keyframes flicker {
|
||||
0% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
10% {
|
||||
opacity: 0.2;
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
20% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes border-breathe {
|
||||
0% {
|
||||
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.06);
|
||||
}
|
||||
|
||||
50% {
|
||||
box-shadow: 0 0 18px 6px rgba(99, 102, 241, 0.03);
|
||||
}
|
||||
|
||||
100% {
|
||||
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.06);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<script>
|
||||
(function () {
|
||||
const btn = document.getElementById('nav-toggle');
|
||||
const menu = document.getElementById('mobile-menu');
|
||||
if (!btn || !menu) return;
|
||||
btn.addEventListener('click', () => {
|
||||
const open = menu.classList.toggle('hidden') === false;
|
||||
btn.setAttribute('aria-expanded', open ? 'true' : 'false');
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</div>
|
||||
|
||||
</header>
|
||||
|
||||
<main class="flex-1 w-full">
|
||||
<div id="swup" class="swup-transition-fade">
|
||||
<div class="max-w-3xl lg:max-w-6xl xl:max-w-7xl mx-auto px-5 sm:px-8 lg:px-10 py-10 lg:py-16">
|
||||
|
||||
<h1>Tags</h1>
|
||||
|
||||
|
||||
<h2><a href="/tags/hackerspace/">Hackerspace</a></h2>
|
||||
|
||||
<h2><a href="/tags/makerspace/">Makerspace</a></h2>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<div class="border-t border-gray-800 bg-[#070709] text-gray-400">
|
||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
||||
<div class="flex flex-col md:flex-row items-center justify-between py-6 space-y-4 md:space-y-0">
|
||||
|
||||
|
||||
<div class="text-sm sm:text-base md:text-lg">
|
||||
<span class="relative inline-block">
|
||||
© 2026 ThereIsNo.Space. All rights reserved. <br>
|
||||
Made with <a href="https://gohugo.io" target="_blank">Hugo</a> | <a
|
||||
href="https://github.com/Enerhim/enervoid-theme" target="_blank">Enervoid</a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex items-center space-x-6 text-sm sm:text-base md:text-lg">
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</footer>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,31 +0,0 @@
|
||||
<?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 ThereIsNo.Space</title>
|
||||
<link>https://thereisno.space/tags/</link>
|
||||
<description>Recent content in Tags on ThereIsNo.Space</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>de</language>
|
||||
|
||||
|
||||
|
||||
|
||||
<lastBuildDate>Mon, 14 Sep 2026 00:00:00 +0200</lastBuildDate>
|
||||
|
||||
<atom:link href="https://thereisno.space/tags/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Hackerspace</title>
|
||||
<link>https://thereisno.space/tags/hackerspace/</link>
|
||||
<pubDate>Mon, 14 Sep 2026 00:00:00 +0200</pubDate>
|
||||
<guid>https://thereisno.space/tags/hackerspace/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Makerspace</title>
|
||||
<link>https://thereisno.space/tags/makerspace/</link>
|
||||
<pubDate>Mon, 14 Sep 2026 00:00:00 +0200</pubDate>
|
||||
<guid>https://thereisno.space/tags/makerspace/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
@@ -1,474 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de" dir="ltr">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<link rel="icon" type="image/png" href="/avatar.png">
|
||||
<title>Makerspace</title>
|
||||
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
|
||||
<link rel="stylesheet" type='text/css' href="https://cdn.jsdelivr.net/gh/devicons/devicon@latest/devicon.min.css" />
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/css/all.min.css"
|
||||
integrity="sha512-2SwdPD6INVrV/lHTZbO2nodKhrnDdJK9/kg2XD1r9uGqPo1cUbujc+IYdlYdEErWNu69gVcYgdxlmVmzTWnetw=="
|
||||
crossorigin="anonymous" referrerpolicy="no-referrer" />
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=Ubuntu+Sans+Mono:ital,wght@0,400..700;1,400..700&display=swap');
|
||||
|
||||
.font-jersey {
|
||||
|
||||
font-family: "Ubuntu Sans Mono", monospace;
|
||||
font-optical-sizing: auto;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
|
||||
.md-content .katex-display {
|
||||
max-width: 100%;
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
padding-left: 0.25rem;
|
||||
padding-right: 0.25rem;
|
||||
}
|
||||
|
||||
.md-content .katex-display>.katex {
|
||||
display: inline-block;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.swup-transition-fade {
|
||||
opacity: 1;
|
||||
transition: 300ms ease-in-out;
|
||||
}
|
||||
|
||||
.is-animating .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.swup-transition-fade {
|
||||
opacity: 1;
|
||||
transition: opacity 300ms ease-in-out;
|
||||
}
|
||||
|
||||
html.is-animating .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
html.is-animating {
|
||||
cursor: progress;
|
||||
}
|
||||
|
||||
html.is-leaving .swup-transition-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script src="https://unpkg.com/swup@4"></script>
|
||||
<script src="https://unpkg.com/@swup/preload-plugin@3"></script>
|
||||
<script src="https://unpkg.com/@swup/progress-plugin@3"></script>
|
||||
<script>
|
||||
const swup = new Swup({
|
||||
containers: ['#swup'],
|
||||
animationSelector: '[class*="swup-transition-"]',
|
||||
cache: true,
|
||||
preload: true,
|
||||
animateHistoryBrowsing: true,
|
||||
|
||||
plugins: [
|
||||
new SwupPreloadPlugin(),
|
||||
new SwupProgressPlugin()
|
||||
]
|
||||
})
|
||||
window.swup = swup
|
||||
</script>
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.css" crossorigin="anonymous">
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.js" crossorigin="anonymous"></script>
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/contrib/auto-render.min.js"
|
||||
crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
|
||||
|
||||
|
||||
const KATEX_CONFIG = {
|
||||
delimiters: [
|
||||
{left: "$$", right: "$$", display: true},
|
||||
{left: "$", right: "$", display: false},
|
||||
{left: "\\[", right: "\\]", display: true},
|
||||
{left: "\\(", right: "\\)", display: false}
|
||||
],
|
||||
ignoredTags: ["script", "noscript", "style", "textarea", "pre", "code"],
|
||||
throwOnError: false
|
||||
};
|
||||
|
||||
|
||||
function renderKatex() {
|
||||
|
||||
if (typeof renderMathInElement !== "function") {
|
||||
console.log("⏳ Waiting for KaTeX to load...");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const contentArea = document.getElementById('swup') || document.body;
|
||||
|
||||
try {
|
||||
renderMathInElement(contentArea, KATEX_CONFIG);
|
||||
console.log("✅ KaTeX rendered successfully");
|
||||
} catch (error) {
|
||||
console.error("❌ KaTeX rendering error:", error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function renderKatexWithRetry(maxRetries = 10, delay = 100) {
|
||||
let attempts = 0;
|
||||
|
||||
const attempt = () => {
|
||||
if (typeof renderMathInElement === "function") {
|
||||
renderKatex();
|
||||
} else if (attempts < maxRetries) {
|
||||
attempts++;
|
||||
setTimeout(attempt, delay);
|
||||
} else {
|
||||
console.warn("⚠️ KaTeX auto-render not available after", maxRetries, "attempts");
|
||||
}
|
||||
};
|
||||
|
||||
attempt();
|
||||
}
|
||||
|
||||
|
||||
function setupSwupIntegration() {
|
||||
|
||||
if (window.swup) {
|
||||
window.swup.hooks.on('page:view', () => {
|
||||
console.log("🔄 Swup transition complete, re-rendering KaTeX...");
|
||||
|
||||
setTimeout(() => renderKatexWithRetry(3, 50), 50);
|
||||
});
|
||||
console.log("✅ KaTeX-Swup integration ready");
|
||||
} else {
|
||||
|
||||
setTimeout(setupSwupIntegration, 100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
console.log("🚀 Initializing KaTeX...");
|
||||
|
||||
|
||||
renderKatexWithRetry();
|
||||
|
||||
|
||||
setupSwupIntegration();
|
||||
});
|
||||
|
||||
|
||||
window.renderKatex = renderKatex;
|
||||
</script>
|
||||
|
||||
<script type="module">
|
||||
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
|
||||
|
||||
let initialized = false;
|
||||
|
||||
function renderMermaid() {
|
||||
const contentArea = document.getElementById('swup') || document.body;
|
||||
const mermaidBlocks = contentArea.querySelectorAll('.language-mermaid, .mermaid');
|
||||
|
||||
if (mermaidBlocks.length === 0) {
|
||||
console.log("ℹ️ No mermaid blocks found on this page");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!initialized) {
|
||||
mermaid.initialize({startOnLoad: false, theme: 'dark'});
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
mermaidBlocks.forEach(el => {
|
||||
if (el.dataset.processed === 'true') {
|
||||
const source = el.dataset.mermaidSource;
|
||||
if (source) {
|
||||
el.innerHTML = source;
|
||||
el.removeAttribute('data-processed');
|
||||
}
|
||||
} else {
|
||||
el.dataset.mermaidSource = el.textContent;
|
||||
}
|
||||
});
|
||||
|
||||
mermaid.run({nodes: mermaidBlocks})
|
||||
.then(() => console.log("✅ Mermaid rendered successfully"))
|
||||
.catch(err => console.error("❌ Mermaid rendering error:", err));
|
||||
}
|
||||
|
||||
function renderMermaidWithRetry(maxRetries = 10, delay = 100) {
|
||||
let attempts = 0;
|
||||
|
||||
const attempt = () => {
|
||||
if (typeof mermaid.initialize === "function") {
|
||||
renderMermaid();
|
||||
} else if (attempts < maxRetries) {
|
||||
attempts++;
|
||||
setTimeout(attempt, delay);
|
||||
} else {
|
||||
console.warn("⚠️ Mermaid auto-render not available after", maxRetries, "attempts");
|
||||
}
|
||||
};
|
||||
|
||||
attempt();
|
||||
}
|
||||
|
||||
|
||||
function setupSwupIntegration() {
|
||||
|
||||
if (window.swup) {
|
||||
window.swup.hooks.on('page:view', () => {
|
||||
console.log("🔄 Swup transition complete, re-rendering mermaid...");
|
||||
|
||||
setTimeout(() => renderMermaidWithRetry(3, 50), 50);
|
||||
});
|
||||
console.log("✅ Mermaid-Swup integration ready");
|
||||
} else {
|
||||
|
||||
setTimeout(setupSwupIntegration, 100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
console.log("🚀 Initializing KaTeX...");
|
||||
|
||||
|
||||
renderMermaidWithRetry();
|
||||
|
||||
|
||||
setupSwupIntegration();
|
||||
});
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
</head>
|
||||
|
||||
<body class="min-h-screen flex flex-col bg-black font-jersey text-white text-3xl">
|
||||
<header>
|
||||
<div class="sticky absolute top-0 z-50">
|
||||
<nav class="w-full border-b border-gray-800 bg-[#070709]/95 backdrop-blur-sm text-gray-100">
|
||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
||||
<div class="flex items-center justify-between h-16">
|
||||
|
||||
<div class="flex items-center gap-3">
|
||||
|
||||
<a href='https://thereisno.space/' class="flex items-center gap-3 group" aria-label="Homepage">
|
||||
|
||||
<img src='/avatar.jpg' alt="ThereIsNo.Space"
|
||||
class="w-10 h-10 rounded-sm border-2 border-gray-700 object-cover transition-transform duration-300 transform group-hover:scale-105"
|
||||
style="animation: border-breathe 4s ease-in-out infinite;" />
|
||||
<span class="text-white text-lg sm:text-xl md:text-2xl lg:text-3xl font-semibold tracking-wide">
|
||||
ThereIsNo.Space
|
||||
<span class="inline-block ml-2" style="animation: flicker 1.6s steps(2, end) infinite;">_</span>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex items-center gap-4">
|
||||
|
||||
<div class="hidden md:flex items-center">
|
||||
|
||||
|
||||
<nav aria-label="Primary" class="w-full">
|
||||
<ul
|
||||
class="flex flex-col md:flex-row md:items-center md:space-x-6 space-y-2 md:space-y-0 sm:text-lg md:text-xl lg:text-3xl"><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Projects</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/blog/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Blog</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Über uns</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div class="md:hidden">
|
||||
<button id="nav-toggle" aria-controls="mobile-menu" aria-expanded="false"
|
||||
class="inline-flex items-center justify-center p-2 rounded-md focus:outline-none focus:ring-2 focus:ring-indigo-400"
|
||||
aria-label="Open menu">
|
||||
<svg class="h-6 w-6 text-gray-200" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
|
||||
stroke="currentColor" aria-hidden="true">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="mobile-menu" class="md:hidden hidden pb-4">
|
||||
|
||||
|
||||
|
||||
<nav aria-label="Primary" class="w-full">
|
||||
<ul
|
||||
class="flex flex-col md:flex-row md:items-center md:space-x-6 space-y-2 md:space-y-0 sm:text-lg md:text-xl lg:text-3xl"><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Projects</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/blog/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Blog</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li><li>
|
||||
<a href="/"class="group inline-flex items-center px-3 py-2 rounded-sm text-gray-200 hover:text-white transition-colors duration-200">
|
||||
<span class="relative inline-block">
|
||||
<span>Über uns</span>
|
||||
|
||||
<span
|
||||
class="absolute left-0 -bottom-1 h-[2px] w-0 bg-indigo-400 transition-all duration-300 group-hover:w-full"></span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<style>
|
||||
@keyframes flicker {
|
||||
0% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
10% {
|
||||
opacity: 0.2;
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
20% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes border-breathe {
|
||||
0% {
|
||||
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.06);
|
||||
}
|
||||
|
||||
50% {
|
||||
box-shadow: 0 0 18px 6px rgba(99, 102, 241, 0.03);
|
||||
}
|
||||
|
||||
100% {
|
||||
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.06);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<script>
|
||||
(function () {
|
||||
const btn = document.getElementById('nav-toggle');
|
||||
const menu = document.getElementById('mobile-menu');
|
||||
if (!btn || !menu) return;
|
||||
btn.addEventListener('click', () => {
|
||||
const open = menu.classList.toggle('hidden') === false;
|
||||
btn.setAttribute('aria-expanded', open ? 'true' : 'false');
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</div>
|
||||
|
||||
</header>
|
||||
|
||||
<main class="flex-1 w-full">
|
||||
<div id="swup" class="swup-transition-fade">
|
||||
<div class="max-w-3xl lg:max-w-6xl xl:max-w-7xl mx-auto px-5 sm:px-8 lg:px-10 py-10 lg:py-16">
|
||||
|
||||
<h1>Makerspace</h1>
|
||||
|
||||
|
||||
<h2><a href="/blog/wilkommen/">Willkommen im ThereIsNo.Space</a></h2>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<div class="border-t border-gray-800 bg-[#070709] text-gray-400">
|
||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
||||
<div class="flex flex-col md:flex-row items-center justify-between py-6 space-y-4 md:space-y-0">
|
||||
|
||||
|
||||
<div class="text-sm sm:text-base md:text-lg">
|
||||
<span class="relative inline-block">
|
||||
© 2026 ThereIsNo.Space. All rights reserved. <br>
|
||||
Made with <a href="https://gohugo.io" target="_blank">Hugo</a> | <a
|
||||
href="https://github.com/Enerhim/enervoid-theme" target="_blank">Enervoid</a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex items-center space-x-6 text-sm sm:text-base md:text-lg">
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</footer>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,24 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Makerspace on ThereIsNo.Space</title>
|
||||
<link>https://thereisno.space/tags/makerspace/</link>
|
||||
<description>Recent content in Makerspace on ThereIsNo.Space</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>de</language>
|
||||
|
||||
|
||||
|
||||
|
||||
<lastBuildDate>Mon, 14 Sep 2026 00:00:00 +0200</lastBuildDate>
|
||||
|
||||
<atom:link href="https://thereisno.space/tags/makerspace/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Willkommen im ThereIsNo.Space</title>
|
||||
<link>https://thereisno.space/blog/wilkommen/</link>
|
||||
<pubDate>Mon, 14 Sep 2026 00:00:00 +0200</pubDate>
|
||||
<guid>https://thereisno.space/blog/wilkommen/</guid>
|
||||
<description><p>#Dies ist der erste Beitrag auf unserer neuen Seite.</p>
<p><strong>echo &ldquo;Hello, World!&rdquo; &gt; /dev/thereisno.space</strong>
Hier wird künftig über Projekte, Workshops und Events berichtet.
<strong>Stay tuned!</strong></p></description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
Reference in new issue
Block a user