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
94 lines
3.7 KiB
Plaintext
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>
|