Files
pw/src/layouts/Base.astro
T
2026-06-12 17:52:00 +02:00

89 lines
3.4 KiB
Plaintext

---
import { ClientRouter } from 'astro:transitions';
import Head from '../components/Head.astro';
import Header from '../components/Header.astro';
import Footer from '../components/Footer.astro';
import Palette from '../components/Palette.astro';
import CookieBanner from '../components/CookieBanner.astro';
import { SITE } from '../consts';
import '../styles/global.css';
interface Props {
title?: string;
description?: string;
image?: string;
type?: 'website' | 'article';
publishedTime?: string;
modifiedTime?: string;
tags?: string[];
jsonLd?: unknown[];
}
const { title, description, image, type, publishedTime, modifiedTime, tags, jsonLd } = Astro.props;
---
<!doctype html>
<Fragment set:html={`<!--
_ ____ ____ _____ ____
/ \\ / ___| / ___| ____| _ \\
/ _ \\ \\___ \\| | _| _| | |_) |
/ ___ \\ ___) | |_| | |___| _ <
/_/ \\_\\____/ \\____|_____|_| \\_\\
Hej, kildekode-læser. Du er min slags.
Statisk Astro, ingen frameworks, self-hosted på Proxmox.
Prøv Cmd/Ctrl+K — eller den gamle kode: op op ned ned venstre højre venstre højre B A.
-->`} />
<html lang={SITE.lang}>
<head>
<script is:inline>
(() => {
const apply = () => {
const t = localStorage.getItem('theme') ||
(window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark');
document.documentElement.dataset.theme = t;
};
apply();
document.addEventListener('astro:after-swap', apply);
document.addEventListener('click', (e) => {
const btn = e.target.closest('[data-theme-toggle]');
if (!btn) return;
const next = document.documentElement.dataset.theme === 'light' ? 'dark' : 'light';
document.documentElement.dataset.theme = next;
localStorage.setItem('theme', next);
});
})();
</script>
<Head {title} {description} {image} {type} {publishedTime} {modifiedTime} {tags} {jsonLd} />
<ClientRouter />
<!-- Registrér service worker'en (PWA/offline). Genereret af @vite-pwa i build;
is:inline + public-sti så Astro ikke bundler den. 404 i dev = harmløst. -->
<script is:inline src="/registerSW.js"></script>
</head>
<body class="min-h-screen flex flex-col antialiased">
<Header />
<main class="mx-auto w-full max-w-3xl flex-1 px-5 py-12">
<slot />
</main>
<Footer />
<Palette />
<CookieBanner />
<script is:inline>
// Konami-koden: ↑↑↓↓←→←→BA → terminal-tema + en lille rulle. En klassiker skal æres.
(() => {
if (window.__konami) return; window.__konami = true;
const seq = ['ArrowUp','ArrowUp','ArrowDown','ArrowDown','ArrowLeft','ArrowRight','ArrowLeft','ArrowRight','b','a'];
let pos = 0;
document.addEventListener('keydown', (e) => {
pos = e.key === seq[pos] ? pos + 1 : (e.key === seq[0] ? 1 : 0);
if (pos !== seq.length) return;
pos = 0;
document.documentElement.dataset.theme = 'terminal';
localStorage.setItem('theme', 'terminal');
document.body.animate(
[{ transform: 'rotate(0)' }, { transform: 'rotate(360deg)' }],
{ duration: 900, easing: 'ease-in-out' });
console.log('%c> adgang givet. velkommen til terminalen.', 'color:#4bff7e;font-family:monospace;font-size:14px');
});
})();
</script>
</body>
</html>