Skip to content

Commit bc76ca1

Browse files
hyperpolymathclaude
andcommitted
feat: build a2ml.net + k9-svc.net as ddraig sites; PGP-sign security.txt
Render both front-door sites with ddraig-ssg (Idris 2), preserving how they were originally made. Adds per-site ddraig template + AAA theme: - site/templates/default.html: skip link, labelled landmarks, nav (Home/Spec/Get started), security.txt footer link. - site/assets/style.css: WCAG 2.2 AAA theme (contrast-verified >=7:1 light+dark, :focus-visible, reduced-motion, reflow, >=44px targets) plus component styles (lede/badges/cards/buttons) the pages use. The existing Markdown content renders through ddraig's full parser (raw-HTML cards/badges, pipe tables with <th scope>, fenced code). Built output is vnu-clean (W3C Nu) across all pages; public/ ships to the site root. security.txt: PGP-clearsigned both files (RFC 9116 digital signature) with the existing OpenPGP key and added an Encryption (openpgp4fpr) field, closing the 'unsigned security.txt' finding. (The live 404 is resolved by deployment.) Build: ddraig build <a2ml|k9-svc>/site _site Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent d0d4da2 commit bc76ca1

6 files changed

Lines changed: 360 additions & 4 deletions

File tree

a2ml/site/assets/style.css

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
/* SPDX-License-Identifier: MPL-2.0 */
2+
/* Copyright (c) 2025-2026 Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk> */
3+
/*
4+
* a2ml.net / k9-svc.net site theme — built on the ddraig-ssg AAA base.
5+
* WCAG 2.2 AAA: all text/UI colours contrast-verified >= 7:1 (light + dark),
6+
* focus ring >= 3:1, reduced-motion, reflow, >= 44px targets.
7+
*/
8+
9+
:root {
10+
--bg: #ffffff;
11+
--bg-soft: #f4f5f9;
12+
--bg-code: #eceef5;
13+
--fg: #1a1b26; /* 17.09:1 on --bg */
14+
--fg-muted: #3a3d4d; /* 10.74:1 on --bg */
15+
--link: #3730a3; /* 9.93:1 on --bg */
16+
--link-hover: #1f1b6b;
17+
--border: #5a5e73;
18+
--focus: #3730a3;
19+
--btn-fg: #ffffff; /* on --link (#3730a3) = 9.93:1 */
20+
--radius: 8px;
21+
--maxw: 70rem;
22+
--measure: 40rem;
23+
}
24+
@media (prefers-color-scheme: dark) {
25+
:root {
26+
--bg: #0e0f1a;
27+
--bg-soft: #181a2a;
28+
--bg-code: #1c1f33;
29+
--fg: #e6e8f2; /* 15.60:1 */
30+
--fg-muted: #c2c6d8; /* lightened for >=7:1 on --bg-soft */
31+
--link: #b9c2ff; /* 11.09:1 */
32+
--link-hover: #dde2ff;
33+
--border: #8c91ad;
34+
--focus: #b9c2ff;
35+
--btn-fg: #0e0f1a; /* dark text on light --link in dark mode */
36+
}
37+
}
38+
39+
*, *::before, *::after { box-sizing: border-box; }
40+
html { font-size: 100%; -webkit-text-size-adjust: 100%; }
41+
body {
42+
margin: 0;
43+
font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
44+
font-size: 1.0625rem; line-height: 1.6;
45+
color: var(--fg); background: var(--bg);
46+
overflow-wrap: break-word;
47+
}
48+
.container { width: 100%; max-width: var(--maxw); margin-inline: auto; padding-inline: 1.25rem; }
49+
50+
/* Skip link (2.4.1) */
51+
.skip-link { position: absolute; left: -9999px; top: 0; background: var(--link); color: #fff; padding: .75rem 1.25rem; border-radius: 0 0 var(--radius) 0; font-weight: 600; z-index: 100; min-height: 44px; line-height: 1.4; }
52+
.skip-link:focus { left: 0; }
53+
54+
/* Focus (2.4.7/2.4.11/2.4.13) */
55+
:focus-visible { outline: 3px solid var(--focus); outline-offset: 2px; border-radius: 2px; }
56+
a:focus, button:focus, [tabindex]:focus { outline: 3px solid var(--focus); outline-offset: 2px; }
57+
58+
/* Header / nav */
59+
.site-header { border-bottom: 1px solid var(--border); }
60+
.nav { display: flex; flex-wrap: wrap; align-items: center; gap: 1rem; padding-block: .75rem; }
61+
.brand { font-weight: 700; font-size: 1.2rem; color: var(--fg); text-decoration: none; }
62+
.nav-links { list-style: none; display: flex; flex-wrap: wrap; gap: .5rem 1.25rem; margin: 0; padding: 0; }
63+
.nav-links a, .brand { display: inline-flex; align-items: center; min-height: 44px; }
64+
65+
/* Links: underlined (1.4.1) */
66+
a { color: var(--link); text-decoration: underline; text-underline-offset: 2px; }
67+
a:hover { color: var(--link-hover); }
68+
.brand, .nav-links a, .btn { text-decoration: none; }
69+
.nav-links a:hover, .nav-links a:focus { text-decoration: underline; }
70+
71+
main { display: block; }
72+
.prose { padding-block: 2rem; }
73+
.prose h1 { font-size: 2.25rem; line-height: 1.2; margin: 0 0 1rem; }
74+
.prose h2 { font-size: 1.6rem; line-height: 1.3; margin: 2.25rem 0 .75rem; }
75+
.prose h3 { font-size: 1.25rem; margin: 1.5rem 0 .5rem; }
76+
.prose :is(h1,h2,h3,h4), .prose p, .prose li { max-width: var(--measure); }
77+
78+
/* Lede */
79+
.lede { font-size: 1.3rem; line-height: 1.5; color: var(--fg); max-width: var(--measure); margin: 0 0 1.5rem; }
80+
81+
/* Badges */
82+
.badges { display: flex; flex-wrap: wrap; gap: .5rem; margin: 1rem 0; padding: 0; list-style: none; }
83+
.badge { display: inline-flex; align-items: center; min-height: 1.9rem; padding: .25rem .7rem; border: 1px solid var(--border); border-radius: 999px; font-size: .85rem; color: var(--fg); background: var(--bg-soft); }
84+
85+
/* Buttons (>=44px target, 2.5.5) */
86+
.btn-row { display: flex; flex-wrap: wrap; gap: .75rem; margin: 1.5rem 0; }
87+
.btn { display: inline-flex; align-items: center; min-height: 44px; padding: .6rem 1.15rem; border-radius: var(--radius); font-weight: 600; border: 2px solid var(--link); }
88+
.btn-primary { background: var(--link); color: var(--btn-fg); }
89+
.btn-primary:hover { background: var(--link-hover); border-color: var(--link-hover); color: var(--btn-fg); }
90+
.btn-ghost { background: transparent; color: var(--link); }
91+
.btn-ghost:hover { background: var(--bg-soft); }
92+
93+
/* Cards */
94+
.cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)); gap: 1rem; margin: 1.5rem 0; }
95+
.card { border: 1px solid var(--border); border-radius: var(--radius); padding: 1.25rem; background: var(--bg-soft); }
96+
.card h3 { margin: 0 0 .5rem; font-size: 1.1rem; }
97+
.card p { margin: 0; color: var(--fg); }
98+
99+
/* Code */
100+
code { background: var(--bg-code); padding: .15em .35em; border-radius: 4px; font-size: .9em; }
101+
pre { background: var(--bg-code); padding: 1rem; border-radius: var(--radius); overflow-x: auto; }
102+
pre code { background: none; padding: 0; }
103+
104+
/* Tables */
105+
.prose table { border-collapse: collapse; width: 100%; max-width: 100%; margin: 1rem 0; }
106+
.prose caption { text-align: left; font-weight: 600; color: var(--fg-muted); padding: .5rem 0; }
107+
.prose th, .prose td { border: 1px solid var(--border); padding: .5rem .75rem; text-align: left; }
108+
.prose th { background: var(--bg-soft); }
109+
110+
blockquote { margin: 1rem 0; padding: .5rem 1rem; border-left: 4px solid var(--link); color: var(--fg); background: var(--bg-soft); }
111+
img { max-width: 100%; height: auto; }
112+
hr { border: none; border-top: 1px solid var(--border); margin: 2rem 0; }
113+
.muted { color: var(--fg-muted); }
114+
115+
.site-footer { border-top: 1px solid var(--border); margin-top: 3rem; padding-block: 1.5rem; color: var(--fg-muted); font-size: .95rem; }
116+
.site-footer a { color: var(--link); }
117+
118+
@media (prefers-reduced-motion: reduce) {
119+
*, *::before, *::after { animation-duration: .001ms !important; animation-iteration-count: 1 !important; transition-duration: .001ms !important; scroll-behavior: auto !important; }
120+
}
121+
@media (max-width: 30rem) { .nav { gap: .5rem; } body { font-size: 1rem; } }
Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,29 @@
1+
-----BEGIN PGP SIGNED MESSAGE-----
2+
Hash: SHA512
3+
14
# Security contact for a2ml.net — RFC 9116
25
# https://a2ml.net/.well-known/security.txt
36

47
Contact: mailto:j.d.a.jewell@open.ac.uk
8+
Encryption: openpgp4fpr:4A03639C1EB1F86C7F0C97A91835A14A2867091E
59
Expires: 2027-06-21T00:00:00Z
610
Preferred-Languages: en
711
Canonical: https://a2ml.net/.well-known/security.txt
812
Policy: https://github.com/hyperpolymath/a2ml-ecosystem/security/policy
913
Acknowledgments: https://github.com/hyperpolymath/a2ml-ecosystem/security/advisories
14+
-----BEGIN PGP SIGNATURE-----
1015

11-
# Encryption: add a URL to a published PGP key to make this fully complete,
12-
# and PGP-sign this file (clearsign) once the key is in place.
16+
iQIzBAEBCgAdFiEEljlFF1RJblHWtTfK0RkBfr9pWrEFAmo5ozcACgkQ0RkBfr9p
17+
WrH2ORAAvgcBt6nmPx96PfNW6iwOKulGyx5suCH7+vfNZY5Y91U2ONOgiskpA3Oc
18+
HLQ2j79cWv96C50SvWahHGu6xUCovMKPAJYpCeSV973mpsLGuxzOXghfTZw9re5F
19+
E1W3BuuSYCGsb04maxSw8uWZ9H/ik3JJnrvOiXEcxUihJlfJSsxy6ZXZ8WwC+ajO
20+
k90f2yaS/TN9JPgyXwH8WwaNeVh1ZnnWUSdfLVmCvu5aXp+J21EqlJBumO/HCTRe
21+
hh8ojRwr8BGib4jbaAfPRfOZ3VIs1JUx1cJuRGsn3BkqLWuIyIeP9Xw3AVEt4pbv
22+
9G/XYAz0MULTxqA7pJUtMwF91KOlZ24DtB0yxKjcXev8L/1vW7EU0pBsO140Kqhq
23+
ULpPos0LpO/bGgeOBSQr164XTNFcWrEBmLjN1Qyi7ZqdMqTU2cNyM+3KFyPiPfnM
24+
7cW7H7R8xhr/RTzN8zz0eJnOFmX3rVSy854CUW/kmTBU/5GhFFBP7YqB2QBACqqW
25+
g+DpKobebYdL+B1jokzu4umhLd37hssojOcm0RuS13Fz3JSkvYpDKKHEjTTUO/lY
26+
k8EuilmGKWFXNwwDhwLzrx307N+9gqoDwTKBkuOx8lj5IwjJXZvO1R6pWrIR8quF
27+
7It/9vKqNo0O2xoebNsDM5DAn2zCtViftOieM2Tjk+gtLuxQ5yo=
28+
=vBOZ
29+
-----END PGP SIGNATURE-----

a2ml/site/templates/default.html

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<!DOCTYPE html>
2+
<!--
3+
SPDX-License-Identifier: MPL-2.0
4+
a2ml.net / k9-svc.net site template (ddraig-ssg) — WCAG 2.2 AAA-capable.
5+
Variables: title, brand, description, date, content (content substituted last).
6+
-->
7+
<html lang="en">
8+
<head>
9+
<meta charset="UTF-8">
10+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
11+
<title>{{title}}</title>
12+
<meta name="description" content="{{description}}">
13+
<meta name="color-scheme" content="light dark">
14+
<link rel="stylesheet" href="/assets/style.css">
15+
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
16+
</head>
17+
<body>
18+
<a class="skip-link" href="#main">Skip to content</a>
19+
<header class="site-header">
20+
<nav class="container nav" aria-label="Primary">
21+
<a class="brand" href="/">{{brand}}</a>
22+
<ul class="nav-links">
23+
<li><a href="/">Home</a></li>
24+
<li><a href="/spec.html">Spec</a></li>
25+
<li><a href="/start.html">Get started</a></li>
26+
</ul>
27+
</nav>
28+
</header>
29+
<main id="main" class="container" tabindex="-1">
30+
<article class="prose">
31+
{{content}}
32+
</article>
33+
</main>
34+
<footer class="site-footer">
35+
<div class="container">
36+
<p class="muted">&#169; Jonathan D.A. Jewell &middot; Code <a href="https://www.mozilla.org/MPL/2.0/">MPL-2.0</a>, docs <a href="https://creativecommons.org/licenses/by-sa/4.0/">CC-BY-SA-4.0</a> &middot; <a href="/.well-known/security.txt">security.txt</a> &middot; <time>{{date}}</time></p>
37+
</div>
38+
</footer>
39+
</body>
40+
</html>

k9-svc/site/assets/style.css

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
/* SPDX-License-Identifier: MPL-2.0 */
2+
/* Copyright (c) 2025-2026 Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk> */
3+
/*
4+
* a2ml.net / k9-svc.net site theme — built on the ddraig-ssg AAA base.
5+
* WCAG 2.2 AAA: all text/UI colours contrast-verified >= 7:1 (light + dark),
6+
* focus ring >= 3:1, reduced-motion, reflow, >= 44px targets.
7+
*/
8+
9+
:root {
10+
--bg: #ffffff;
11+
--bg-soft: #f4f5f9;
12+
--bg-code: #eceef5;
13+
--fg: #1a1b26; /* 17.09:1 on --bg */
14+
--fg-muted: #3a3d4d; /* 10.74:1 on --bg */
15+
--link: #3730a3; /* 9.93:1 on --bg */
16+
--link-hover: #1f1b6b;
17+
--border: #5a5e73;
18+
--focus: #3730a3;
19+
--btn-fg: #ffffff; /* on --link (#3730a3) = 9.93:1 */
20+
--radius: 8px;
21+
--maxw: 70rem;
22+
--measure: 40rem;
23+
}
24+
@media (prefers-color-scheme: dark) {
25+
:root {
26+
--bg: #0e0f1a;
27+
--bg-soft: #181a2a;
28+
--bg-code: #1c1f33;
29+
--fg: #e6e8f2; /* 15.60:1 */
30+
--fg-muted: #c2c6d8; /* lightened for >=7:1 on --bg-soft */
31+
--link: #b9c2ff; /* 11.09:1 */
32+
--link-hover: #dde2ff;
33+
--border: #8c91ad;
34+
--focus: #b9c2ff;
35+
--btn-fg: #0e0f1a; /* dark text on light --link in dark mode */
36+
}
37+
}
38+
39+
*, *::before, *::after { box-sizing: border-box; }
40+
html { font-size: 100%; -webkit-text-size-adjust: 100%; }
41+
body {
42+
margin: 0;
43+
font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
44+
font-size: 1.0625rem; line-height: 1.6;
45+
color: var(--fg); background: var(--bg);
46+
overflow-wrap: break-word;
47+
}
48+
.container { width: 100%; max-width: var(--maxw); margin-inline: auto; padding-inline: 1.25rem; }
49+
50+
/* Skip link (2.4.1) */
51+
.skip-link { position: absolute; left: -9999px; top: 0; background: var(--link); color: #fff; padding: .75rem 1.25rem; border-radius: 0 0 var(--radius) 0; font-weight: 600; z-index: 100; min-height: 44px; line-height: 1.4; }
52+
.skip-link:focus { left: 0; }
53+
54+
/* Focus (2.4.7/2.4.11/2.4.13) */
55+
:focus-visible { outline: 3px solid var(--focus); outline-offset: 2px; border-radius: 2px; }
56+
a:focus, button:focus, [tabindex]:focus { outline: 3px solid var(--focus); outline-offset: 2px; }
57+
58+
/* Header / nav */
59+
.site-header { border-bottom: 1px solid var(--border); }
60+
.nav { display: flex; flex-wrap: wrap; align-items: center; gap: 1rem; padding-block: .75rem; }
61+
.brand { font-weight: 700; font-size: 1.2rem; color: var(--fg); text-decoration: none; }
62+
.nav-links { list-style: none; display: flex; flex-wrap: wrap; gap: .5rem 1.25rem; margin: 0; padding: 0; }
63+
.nav-links a, .brand { display: inline-flex; align-items: center; min-height: 44px; }
64+
65+
/* Links: underlined (1.4.1) */
66+
a { color: var(--link); text-decoration: underline; text-underline-offset: 2px; }
67+
a:hover { color: var(--link-hover); }
68+
.brand, .nav-links a, .btn { text-decoration: none; }
69+
.nav-links a:hover, .nav-links a:focus { text-decoration: underline; }
70+
71+
main { display: block; }
72+
.prose { padding-block: 2rem; }
73+
.prose h1 { font-size: 2.25rem; line-height: 1.2; margin: 0 0 1rem; }
74+
.prose h2 { font-size: 1.6rem; line-height: 1.3; margin: 2.25rem 0 .75rem; }
75+
.prose h3 { font-size: 1.25rem; margin: 1.5rem 0 .5rem; }
76+
.prose :is(h1,h2,h3,h4), .prose p, .prose li { max-width: var(--measure); }
77+
78+
/* Lede */
79+
.lede { font-size: 1.3rem; line-height: 1.5; color: var(--fg); max-width: var(--measure); margin: 0 0 1.5rem; }
80+
81+
/* Badges */
82+
.badges { display: flex; flex-wrap: wrap; gap: .5rem; margin: 1rem 0; padding: 0; list-style: none; }
83+
.badge { display: inline-flex; align-items: center; min-height: 1.9rem; padding: .25rem .7rem; border: 1px solid var(--border); border-radius: 999px; font-size: .85rem; color: var(--fg); background: var(--bg-soft); }
84+
85+
/* Buttons (>=44px target, 2.5.5) */
86+
.btn-row { display: flex; flex-wrap: wrap; gap: .75rem; margin: 1.5rem 0; }
87+
.btn { display: inline-flex; align-items: center; min-height: 44px; padding: .6rem 1.15rem; border-radius: var(--radius); font-weight: 600; border: 2px solid var(--link); }
88+
.btn-primary { background: var(--link); color: var(--btn-fg); }
89+
.btn-primary:hover { background: var(--link-hover); border-color: var(--link-hover); color: var(--btn-fg); }
90+
.btn-ghost { background: transparent; color: var(--link); }
91+
.btn-ghost:hover { background: var(--bg-soft); }
92+
93+
/* Cards */
94+
.cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)); gap: 1rem; margin: 1.5rem 0; }
95+
.card { border: 1px solid var(--border); border-radius: var(--radius); padding: 1.25rem; background: var(--bg-soft); }
96+
.card h3 { margin: 0 0 .5rem; font-size: 1.1rem; }
97+
.card p { margin: 0; color: var(--fg); }
98+
99+
/* Code */
100+
code { background: var(--bg-code); padding: .15em .35em; border-radius: 4px; font-size: .9em; }
101+
pre { background: var(--bg-code); padding: 1rem; border-radius: var(--radius); overflow-x: auto; }
102+
pre code { background: none; padding: 0; }
103+
104+
/* Tables */
105+
.prose table { border-collapse: collapse; width: 100%; max-width: 100%; margin: 1rem 0; }
106+
.prose caption { text-align: left; font-weight: 600; color: var(--fg-muted); padding: .5rem 0; }
107+
.prose th, .prose td { border: 1px solid var(--border); padding: .5rem .75rem; text-align: left; }
108+
.prose th { background: var(--bg-soft); }
109+
110+
blockquote { margin: 1rem 0; padding: .5rem 1rem; border-left: 4px solid var(--link); color: var(--fg); background: var(--bg-soft); }
111+
img { max-width: 100%; height: auto; }
112+
hr { border: none; border-top: 1px solid var(--border); margin: 2rem 0; }
113+
.muted { color: var(--fg-muted); }
114+
115+
.site-footer { border-top: 1px solid var(--border); margin-top: 3rem; padding-block: 1.5rem; color: var(--fg-muted); font-size: .95rem; }
116+
.site-footer a { color: var(--link); }
117+
118+
@media (prefers-reduced-motion: reduce) {
119+
*, *::before, *::after { animation-duration: .001ms !important; animation-iteration-count: 1 !important; transition-duration: .001ms !important; scroll-behavior: auto !important; }
120+
}
121+
@media (max-width: 30rem) { .nav { gap: .5rem; } body { font-size: 1rem; } }
Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,29 @@
1+
-----BEGIN PGP SIGNED MESSAGE-----
2+
Hash: SHA512
3+
14
# Security contact for k9-svc.net — RFC 9116
25
# https://k9-svc.net/.well-known/security.txt
36

47
Contact: mailto:j.d.a.jewell@open.ac.uk
8+
Encryption: openpgp4fpr:4A03639C1EB1F86C7F0C97A91835A14A2867091E
59
Expires: 2027-06-21T00:00:00Z
610
Preferred-Languages: en
711
Canonical: https://k9-svc.net/.well-known/security.txt
812
Policy: https://github.com/hyperpolymath/k9-ecosystem/security/policy
913
Acknowledgments: https://github.com/hyperpolymath/k9-ecosystem/security/advisories
14+
-----BEGIN PGP SIGNATURE-----
1015

11-
# Encryption: add a URL to a published PGP key to make this fully complete,
12-
# and PGP-sign this file (clearsign) once the key is in place.
16+
iQIzBAEBCgAdFiEEljlFF1RJblHWtTfK0RkBfr9pWrEFAmo5o0cACgkQ0RkBfr9p
17+
WrFnhw//auzOJy7fkw/d/UO4sCX4LKdWpmSlgrM3x3Hif94Vub9jsMcNuN0NtgAd
18+
6RQGf8Cj4eUCNPln1yDK8jnuwCnafd0RSQ7eS7LsGVZqG51okFrd2U7C/dyOgIHA
19+
yGwLU2rvKXdsxp5VqUyuN60e0BNsB0erJxLZjytmU+OUbnjjWuHVrOmBRWz94DMo
20+
vvA7pFNXM0GI0wkQuAKRFcum3IT0VH2DAzTmD11oW0YQr4vJOgwseiWFS1KfMWPY
21+
bSyHbRYgBU6NRPL4UpBg0vwmWlgo7UolOR2JpCVJN1H6oFX4GZIBEw7hrk5+iD8z
22+
CfyW/yeIKG5fRZfpzfbID4ynt9ji9+BvHedRdou7D+bl6TPoM+xXSJLmjV2I8xYS
23+
su0BLj/6V6Aqpker3VP7NJscDLS7t/+KRXj7O2XIMSRjokRL5yIyxkcQVmhqfVKy
24+
i+qkNS9sMSAY89Ce6E2bpn7f2wdBP42yCOGHISjNjv9LsmmSkuoNjy36qTR3kAgH
25+
0KZWylOErsKdwTh9tU0URTHVTiNfhiw4WOc2/1wt+QN2/Ipg8XdcNnqLG66cs8j3
26+
hYIYw2a7JA+KlSCrUJ+Zv8FJKnZS6htw9FBHpzxyqQJlCjz55ksZU82hyar8WlX/
27+
LY6nWrIp/peBURvi3CgVXPuJuKDSOrJnZ8F1INDN1i7uTpE3olw=
28+
=dLTg
29+
-----END PGP SIGNATURE-----

k9-svc/site/templates/default.html

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<!DOCTYPE html>
2+
<!--
3+
SPDX-License-Identifier: MPL-2.0
4+
a2ml.net / k9-svc.net site template (ddraig-ssg) — WCAG 2.2 AAA-capable.
5+
Variables: title, brand, description, date, content (content substituted last).
6+
-->
7+
<html lang="en">
8+
<head>
9+
<meta charset="UTF-8">
10+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
11+
<title>{{title}}</title>
12+
<meta name="description" content="{{description}}">
13+
<meta name="color-scheme" content="light dark">
14+
<link rel="stylesheet" href="/assets/style.css">
15+
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
16+
</head>
17+
<body>
18+
<a class="skip-link" href="#main">Skip to content</a>
19+
<header class="site-header">
20+
<nav class="container nav" aria-label="Primary">
21+
<a class="brand" href="/">{{brand}}</a>
22+
<ul class="nav-links">
23+
<li><a href="/">Home</a></li>
24+
<li><a href="/spec.html">Spec</a></li>
25+
<li><a href="/start.html">Get started</a></li>
26+
</ul>
27+
</nav>
28+
</header>
29+
<main id="main" class="container" tabindex="-1">
30+
<article class="prose">
31+
{{content}}
32+
</article>
33+
</main>
34+
<footer class="site-footer">
35+
<div class="container">
36+
<p class="muted">&#169; Jonathan D.A. Jewell &middot; Code <a href="https://www.mozilla.org/MPL/2.0/">MPL-2.0</a>, docs <a href="https://creativecommons.org/licenses/by-sa/4.0/">CC-BY-SA-4.0</a> &middot; <a href="/.well-known/security.txt">security.txt</a> &middot; <time>{{date}}</time></p>
37+
</div>
38+
</footer>
39+
</body>
40+
</html>

0 commit comments

Comments
 (0)