Files
pw/src/layouts/Base.astro
T
Asger Geel Weirsøe 2915d0a928 Send <html lang> og <head> med igen
ASCII-hilsenen til view-source-læserne stod før <html>, og så smed Astros
compiler både <html>- og <head>-tagget væk. Browserne gættede sig til
resten, men lang-attributten har manglet på hele sitet siden juni. Hilsenen
står nu som første linje i <head>.

Claude-Session: https://claude.ai/code/session_012LCTmU2ewo8tnM1dByYAoG
2026-10-04 07:28:09 +02:00

94 lines
3.7 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[];
noindex?: boolean;
lang?: 'da' | 'en';
alternates?: { lang: 'da' | 'en'; path: string }[];
}
const { title, description, image, type, publishedTime, modifiedTime, tags, jsonLd, noindex, lang, alternates } = Astro.props;
---
<!doctype html>
<html lang={lang ?? SITE.lang}>
<head>
{/* Hilsenen skal stå INDE i <head>. Stod den før <html>, smed Astros compiler
både <html> og <head> væk, og sitet mistede lang-attributten (juni-okt. 2026). */}
<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.
-->`} />
<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} {noindex} {lang} {alternates} />
<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>