brf/server/templates/public.ts
2026-06-15 14:09:28 +02:00

47 lines
1.4 KiB
TypeScript

import html from '../lib/html.ts'
interface Options {
content: string
css: string[]
head: Promise<{
title?: string
tags?: {
type: string
attributes: Record<string, string>
}[]
}>
preload?: string[]
script: string
state: Promise<Record<string, any>>
}
export default ({ content, css, head, preload, script, state }: Options) => html`<!DOCTYPE html>
<html lang="sv-SE">
<head>
<link rel="icon" href="/favicon.svg" />
<script type="module" src="${script}"></script>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="robots" content="index, follow" />
${css?.map((href) => `<link rel='stylesheet' crossorigin href='${href}'>`)}
${preload?.map((href) => `<link rel='modulepreload' crossorigin href='${href}'>`)}
<title>${head?.then((head) => head.title)}</title>
${head?.then((head) =>
head.tags?.map(
(tag) =>
`<${tag.type} ${Object.entries(tag.attributes)
.map(([name, content]) => `${name}='${content}'`)
.join(' ')}/>`,
),
)}
</head>
<body>
${content}
${state?.then((state) => `<script>window.__STATE__ = ${JSON.stringify(state)}</script>`)}
<script>
var offset = (window.history.state && window.history.state.scrollTop) || 0;
if (offset) window.scrollTo(0, offset);
</script>
</body>
</html>`