aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/about.md10
-rw-r--r--src/assets/atom.njk26
-rw-r--r--src/assets/error.md11
-rw-r--r--src/assets/index.css137
-rw-r--r--src/assets/index.mjs12
-rw-r--r--src/assets/json.njk30
-rw-r--r--src/assets/manifest.njk29
-rw-r--r--src/assets/prism.css162
-rw-r--r--src/assets/robot.njk6
-rw-r--r--src/assets/sitemap.njk14
-rw-r--r--src/assets/sw.mjs59
-rw-r--r--src/blog.11ty.js23
-rw-r--r--src/blog.njk19
-rw-r--r--src/data/env.js4
-rw-r--r--src/data/err.js121
-rw-r--r--src/data/metadata.js2
-rw-r--r--src/data/navigator.js13
-rw-r--r--src/gen/atom.11ty.js30
-rw-r--r--src/gen/error.11ty.js21
-rw-r--r--src/gen/gen.11tydata.js (renamed from src/assets/assets.11tydata.js)6
-rw-r--r--src/gen/json.11ty.js28
-rw-r--r--src/gen/manifest.11ty.js28
-rw-r--r--src/gen/metadata.11ty.js15
-rw-r--r--src/gen/robot.11ty.js13
-rw-r--r--src/gen/sitemap.11ty.js17
-rw-r--r--src/index.md11
-rw-r--r--src/layouts/base.11ty.js51
-rw-r--r--src/layouts/base.njk46
-rw-r--r--src/layouts/page.11ty.js14
-rw-r--r--src/layouts/post.11ty.js17
-rw-r--r--src/layouts/post.njk12
-rw-r--r--src/post/post.11tydata.js12
32 files changed, 275 insertions, 724 deletions
diff --git a/src/about.md b/src/about.md
index ef1fad4..a0beb69 100644
--- a/src/about.md
+++ b/src/about.md
@@ -1,15 +1,11 @@
---
-layout: base.njk
+layout: page
title: About Me
-tags:
- - navigator
---
-# About Me
-
## {{ metadata.author.name }}
-!["A Photo of me]({{ metadata.author.image | url}}){.side}
+!["A Photo of me]({{ metadata.author.image}}){.side}
Email: <{{ metadata.author.email }}>
-Github: <{{ metadata.author.github | url}}>
+Github: <{{ metadata.author.github}}>
diff --git a/src/assets/atom.njk b/src/assets/atom.njk
deleted file mode 100644
index 4e517ca..0000000
--- a/src/assets/atom.njk
+++ /dev/null
@@ -1,26 +0,0 @@
----
-permalink: /feed.xml
----
-<?xml version="1.0" encoding="utf-8"?>
-<feed xmlns="http://www.w3.org/2005/Atom">
- <title>{{ metadata.title }}</title>
- <subtitle>{{ metadata.description }}</subtitle>
- <link href="{{ permalink | url | absoluteUrl(metadata.url) }}" rel="self"/>
- <link href="{{ "/" | url | absoluteUrl(metadata.url) }}"/>
- <updated>{{ collections.posts | getNewestCollectionItemDate | dateToRfc3339 }}</updated>
- <id>{{ metadata.url }}</id>
- <author>
- <name>{{ metadata.author.name }}</name>
- <email>{{ metadata.author.email }}</email>
- </author>
- {% for post in collections.posts %}
- {% set absolutePostUrl %}{{ post.url | url | absoluteUrl(metadata.url) }}{% endset %}
- <entry>
- <title>{{ post.data.title }}</title>
- <link href="{{ absolutePostUrl }}"/>
- <updated>{{ post.date | dateToRfc3339 }}</updated>
- <id>{{ '/' | url | absoluteUrl(metadata.url) }}</id>
- <content type="html"><![CDATA[{{ post.templateContent | htmlToAbsoluteUrls( absolutePostUrl ) }}]]></content>
- </entry>
- {% endfor %}
-</feed>
diff --git a/src/assets/error.md b/src/assets/error.md
deleted file mode 100644
index 65655f3..0000000
--- a/src/assets/error.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-layout: base.njk
-pagination:
- data: err
- size: 1
- alias: error
-permalink: "/{{ error.code }}.html"
----
-# ERROR: {{ error.code }} {.err}
-
-{{ error.msg }}
diff --git a/src/assets/index.css b/src/assets/index.css
deleted file mode 100644
index 2a75675..0000000
--- a/src/assets/index.css
+++ /dev/null
@@ -1,137 +0,0 @@
-:root {
- --fg: rgb(0 0 0);
- --bg: rgb(255 255 255);
- --brand: rgb(139 0 0);
-
- @media screen and (prefers-color-scheme: dark) {
- --bg: rgb(0 0 0);
- --fg: rgb(255 255 255);
- --brand: rgb(255 0 0);
- }
-}
-
-body {
- font-family: serif;
- background-color: var(--bg);
- color: var(--fg);
-
- @media screen {
- max-width: 920px;
- min-height: calc(100vh - 1rem);
- margin: 0.5rem auto;
- display: grid;
- grid-template: "head" auto "main" auto "footer" 1fr / auto;
-
- & > header {
- background-color: var(--brand);
- font-weight: bold;
- color: rgb(255 255 255);
- padding: 1rem;
- grid-area: head;
-
- & *:any-link {
- text-decoration: none;
- }
- }
-
- & > footer {
- background-color: var(--brand);
- color: rgb(255 255 255);
- padding: 0.5rem;
- align-self: end;
- grid-area: footer;
-
- & *:any-link {
- text-decoration: none;
- }
- }
-
- & > main {
- margin: 0.5rem 0;
- grid-area: main;
- }
- }
-}
-
-* :any-link {
- color: inherit;
- text-decoration: underline;
-
- @media screen {
- &:is(:hover, :active) {
- font-style: italic;
- }
- }
-}
-
-.header-anchor:any-link {
- text-decoration: none;
-
- @media screen {
- &:is(:hover, :active) {
- font-style: inherit;
- }
- }
-}
-
-a[href^="mailto:"]::after {
- content: "📧";
-}
-
-.err {
- color: var(--brand);
-}
-
-aside {
- width: 40%;
- padding: 0.5rem;
- margin-left: 0.5rem;
- float: right;
- background-color: var(--brand);
- color: rgb(255 255 255);
-}
-
-img {
- max-width: 100%;
- max-height: 100%;
-
- &.side {
- width: 40%;
- float: right;
-
- @media screen and (max-width: 450px) {
- width: 100%;
- float: none;
- }
- }
-}
-
-@media screen {
- nav > a {
- margin-right: 1rem;
- padding-left: 0;
- padding-right: 0;
-
- @media (max-width: 450px) {
- display: block;
- margin: auto;
- text-align: center;
- padding: 16px;
-
- &.navlinks {
- display: none;
-
- &.navopen {
- display: block;
- }
- }
- }
- }
-}
-
-@media print {
- header,
- footer {
- display: none;
- }
-}
diff --git a/src/assets/index.mjs b/src/assets/index.mjs
deleted file mode 100644
index 4d7c2b0..0000000
--- a/src/assets/index.mjs
+++ /dev/null
@@ -1,12 +0,0 @@
-document.getElementById("nav-toogle").addEventListener("click", async() => {
- const navlinks = Array.from(document.getElementsByClassName("navlinks"))
- for (const navlink of navlinks) {
- navlink.classList.toggle("navopen")
- }
- return false
-})
-window.addEventListener('load', async() => {
- if ('serviceWorker' in navigator) {
- navigator.serviceWorker.register('/sw.js')
- }
-}) \ No newline at end of file
diff --git a/src/assets/json.njk b/src/assets/json.njk
deleted file mode 100644
index 0d58804..0000000
--- a/src/assets/json.njk
+++ /dev/null
@@ -1,30 +0,0 @@
----
-permalink: /feed.json
----
-{
- "version": "https://jsonfeed.org/version/1.1",
- "title": "{{ metadata.title }}",
- "language": "{{ metadata.language }}",
- "home_page_url": "{{ metadata.url }}",
- "feed_url": "{{ permalink | url | absoluteUrl(metadata.url) }}",
- "description": "{{ metadata.description }}",
- "author": {
- "name": "{{ metadata.author.name }}"
- },
- "items": [
- {%- for post in collections.posts | reverse %}
- {%- set absolutePostUrl %}{{ post.url | url | absoluteUrl(metadata.url) }}{% endset -%}
- {
- "id": "{{ absolutePostUrl }}",
- "url": "{{ absolutePostUrl }}",
- "title": "{{ post.data.title }}",
- "content_html": {% if post.templateContent %}{{ post.templateContent | htmlToAbsoluteUrls(absolutePostUrl) | dump | safe }}
- {% else %}""{% endif %},
- "date_published": "{{ post.date | rssDate }}"
- }
- {%- if not loop.last -%}
- ,
- {%- endif -%}
-{%- endfor %}
-]
-}
diff --git a/src/assets/manifest.njk b/src/assets/manifest.njk
deleted file mode 100644
index 9362037..0000000
--- a/src/assets/manifest.njk
+++ /dev/null
@@ -1,29 +0,0 @@
----
-permalink: /app.webmanifest
----
-{
- "$schema": "https://json.schemastore.org/web-manifest-combined.json",
- "name": "{{ metadata.title }}",
-
- "lang": "{{ metadata.language }}",
- "start_url": "/",
- "id": "/",
- "scope": "/",
- "display": "minimal-ui",
- "background_color": "{{ metadat.theme }}",
- "theme_color": "{{ metadat.theme }}",
- "description": "{{ metadata.description }}",
- "icons": [
-{%- for size in [192,512,1024] %}
- {
- "src": "/favicon/{{ size }}.png",
- "type": "image/png",
- "sizes": "{{ size }}x{{ size }}",
- "purpose": "maskable"
- }
- {%- if not loop.last -%}
- ,
- {%- endif -%}
- {%- endfor -%}
- ]
-}
diff --git a/src/assets/prism.css b/src/assets/prism.css
deleted file mode 100644
index 110c6be..0000000
--- a/src/assets/prism.css
+++ /dev/null
@@ -1,162 +0,0 @@
-code[class*="language-"],
-pre[class*="language-"] {
- color: rgb(248 248 242);
- background: none;
- text-shadow: 0 1px rgb(0 0 0 / 30%);
- font-family: monospace;
- font-size: 1em;
- text-align: left;
- white-space: pre;
- word-spacing: normal;
- word-break: normal;
- word-wrap: normal;
- line-height: 1.5;
- tab-size: 4;
- hyphens: none;
-
- @media screen and (prefers-color-scheme: dark) {
- code[class*="language-"],
- pre[class*="language-"] {
- color: #000;
- text-shadow: 0 1px #fff;
- }
- }
-}
-
-/* Code blocks */
-
-pre[class*="language-"] {
- padding: 1em;
- margin: 0.5em 0;
- overflow: auto;
- border-radius: 0.3em;
-}
-
-:not(pre) > code[class*="language-"],
-pre[class*="language-"] {
- background: rgb(39 40 34);
-
- @media screen and (prefers-color-scheme: dark) {
- background: rgb(245 242 240);
- }
-}
-
-/* Inline code */
-
-:not(pre) > code[class*="language-"] {
- padding: 0.1em;
- border-radius: 0.3em;
- white-space: normal;
-}
-
-.token.comment,
-.token.prolog,
-.token.doctype,
-.token.cdata {
- color: rgb(130 146 162);
-
- @media screen and (prefers-color-scheme: dark) {
- color: rgb(112 128 144);
- }
-}
-
-.token.punctuation {
- color: rgb(248 248 242);
-
- @media screen and (prefers-color-scheme: dark) {
- color: rgb(153 0 85);
- }
-}
-
-.token.namespace {
- opacity: 0.7;
-}
-
-.token.property,
-.token.tag,
-.token.constant,
-.token.symbol,
-.token.deleted {
- color: rgb(249 38 114);
-
- @media screen and (prefers-color-scheme: dark) {
- color: rgb(153 0 85);
- }
-}
-
-.token.boolean,
-.token.number {
- color: rgb(174 129 255);
-
- @media screen and (prefers-color-scheme: dark) {
- color: rgb(153 0 85);
- }
-}
-
-.token.selector,
-.token.attr-name,
-.token.string,
-.token.char,
-.token.builtin,
-.token.inserted {
- color: rgb(166 226 46);
-
- @media screen and (prefers-color-scheme: dark) {
- color: rgb(102 153 0);
- }
-}
-
-.token.operator,
-.token.entity,
-.token.url,
-.language-css .token.string,
-.style .token.string,
-.token.variable {
- color: rgb(248 248 242);
-
- @media screen and (prefers-color-scheme: dark) {
- color: rgb(154 110 58);
- background: rgb(255 255 255 / 50%);
- }
-}
-
-.token.atrule,
-.token.attr-value,
-.token.function,
-.token.class-name {
- color: rgb(230 219 116);
-
- @media screen and (prefers-color-scheme: dark) {
- color: rgb(0 118 168);
- }
-}
-
-.token.keyword {
- color: rgb(102 217 239);
-
- @media screen and (prefers-color-scheme: dark) {
- color: rgb(221 75 104);
- }
-}
-
-.token.regex,
-.token.important {
- color: rgb(253 151 31);
-
- @media screen (prefers-color-scheme: dark) {
- color: rgb(238 153 0);
- }
-}
-
-.token.important,
-.token.bold {
- font-weight: bold;
-}
-
-.token.italic {
- font-style: italic;
-}
-
-.token.entity {
- cursor: help;
-}
diff --git a/src/assets/robot.njk b/src/assets/robot.njk
deleted file mode 100644
index dcaa728..0000000
--- a/src/assets/robot.njk
+++ /dev/null
@@ -1,6 +0,0 @@
----
-permalink: /robot.txt
----
-User-agent: *
-Allow: /
-Sitemap: {{ "/"| url | absoluteUrl(metadata.url) }}/sitemap.xml \ No newline at end of file
diff --git a/src/assets/sitemap.njk b/src/assets/sitemap.njk
deleted file mode 100644
index 910b238..0000000
--- a/src/assets/sitemap.njk
+++ /dev/null
@@ -1,14 +0,0 @@
----
-permalink: /sitemap.xml
----
-<?xml version="1.0" encoding="utf-8"?>
-<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
-{%- for page in collections.all %}
- {% set absoluteUrl %}{{ page.url | url | absoluteUrl(metadata.url) }}{% endset %}
- <url>
- <loc>{{ absoluteUrl }}</loc>
- <lastmod>{{ page.date | datefmt }}</lastmod>
- </url>
-{%- endfor %}
-</urlset>
-
diff --git a/src/assets/sw.mjs b/src/assets/sw.mjs
deleted file mode 100644
index 78d659a..0000000
--- a/src/assets/sw.mjs
+++ /dev/null
@@ -1,59 +0,0 @@
-const sw_cache = {
- offline: "/offline.html",
- default: [
- "/index.css",
- "/prism.css",
- "/index.js",
- "/favicon/icon.svg",
- "/offline.html",
- "/"
- ],
- // eslint-disable-next-line no-undef
- store: VERSION,
-}
-
-self.addEventListener('install', event => {
- self.skipWaiting()
- event.waitUntil((async() => {
- const cache = await self.caches.open(sw_cache.store)
- return cache.addAll(sw_cache.default)
- })())
-})
-
-self.addEventListener('activate', event => {
- event.waitUntil((async() => {
- const keys = await self.caches.keys()
- Promise.all(keys.map(key => {
- if (key !== sw_cache.store) {
- return self.caches.delete(key)
- }
- }))
- })())
-})
-
-self.addEventListener('fetch', event => {
- event.respondWith((async() => {
- if (event.request.method != 'GET') {
- return fetch(event.request)
- }
-
- const req_url = new URL(event.request.url)
- if (req_url.origin != self.location.origin) {
- return fetch(event.request)
- }
-
- const cacheres = await self.caches.match(event.request)
- return cacheres || (async() => {
- try {
- const response = await self.fetch(event.request)
- const cache = await self.caches.open(sw_cache.store)
- cache.put(event.request, response.clone())
- return response
- } catch {
- return self.caches.match(sw_cache.offline)
- }
- })()
- })())
-
-
-}) \ No newline at end of file
diff --git a/src/blog.11ty.js b/src/blog.11ty.js
new file mode 100644
index 0000000..eb79089
--- /dev/null
+++ b/src/blog.11ty.js
@@ -0,0 +1,23 @@
+module.exports = class {
+ data() {
+ return {
+ layout: "base",
+ title: "Blog"
+ };
+ }
+
+ render(data) {
+ return `<div role="feed" aria-busy="false">
+ ${(data.collections.posts || []).map((post, index, array) => `<article aria-posinset="${index}" aria-setsize="${array.len}">
+ <h1>
+ <a href="${post.url}">${post.data.title}</a>
+ </h1>
+ <small>
+ <time datetime="${data.page.date.toISOString()}">${data.page.date.toDateString()}</time> - <a rel=author href="${data.metadata.author.url}">${data.metadata.author.name}</a>
+ </small>
+ <p>${post.data.description}</p>
+ </article>
+ `).join()}
+ </div>`;
+ }
+};
diff --git a/src/blog.njk b/src/blog.njk
deleted file mode 100644
index 9bd2a05..0000000
--- a/src/blog.njk
+++ /dev/null
@@ -1,19 +0,0 @@
----
-layout: base.njk
-title: Blog
-tags:
- - navigator
----
-<div role="feed" aria-busy="false">
- {% for post in collections.posts %}
- <article aria-posinset="{{ loop.index }}" aria-setsize="{{ loop.size }}">
- <h1>
- <a href="{{ post.url | url }}">{{ post.data.title }}</a>
- </h1>
- <small>
- <p>{{ metadata.author.name }} - {{ post.data.date | datefmt }}</p>
- </small>
- <p>{{ post.data.description }}</p>
- </article>
- {% endfor %}
-</div> \ No newline at end of file
diff --git a/src/data/env.js b/src/data/env.js
index 91842b4..a497313 100644
--- a/src/data/env.js
+++ b/src/data/env.js
@@ -1,3 +1,3 @@
-const process = require("process")
+const process = require("process");
-module.exports = () => process.env \ No newline at end of file
+module.exports = () => process.env; \ No newline at end of file
diff --git a/src/data/err.js b/src/data/err.js
deleted file mode 100644
index 0e3fe56..0000000
--- a/src/data/err.js
+++ /dev/null
@@ -1,121 +0,0 @@
-module.exports = [{
- code: "offline",
- msg: "The Page is offline"
- },
- {
- code: 400,
- msg: "Bad Request"
- },
- {
- code: 401,
- msg: "Unauthorized"
- },
- {
- code: 402,
- msg: "Payment Required"
- },
- {
- code: 403,
- msg: "Forbidden"
- },
- {
- code: 404,
- msg: "Not Found"
- },
- {
- code: 405,
- msg: "Method Not Allowed"
- },
- {
- code: 406,
- msg: "Not Acceptable"
- },
- {
- code: 407,
- msg: "Proxy Authentication Required"
- },
- {
- code: 408,
- msg: "Request Timeout"
- },
- {
- code: 409,
- msg: "Conflict"
- },
- {
- code: 410,
- msg: "Gone"
- },
- {
- code: 411,
- msg: "Length Required"
- },
- {
- code: 412,
- msg: "Precondition Failed"
- },
- {
- code: 413,
- msg: "Payload Too Large"
- },
- {
- code: 414,
- msg: "URI Too Long"
- },
- {
- code: 415,
- msg: "Unsupported Media Type"
- },
- {
- code: 416,
- msg: "Range Not Satisfiable"
- },
- {
- code: 417,
- msg: "Expectation Failed"
- },
- {
- code: 418,
- msg: "I\"m a teapot"
- },
- {
- code: 421,
- msg: "Misdirected Request"
- },
- {
- code: 422,
- msg: "Unprocessable Entity"
- },
- {
- code: 423,
- msg: "Locked"
- },
- {
- code: 424,
- msg: "Failed Dependency"
- },
- {
- code: 425,
- msg: "Too Early"
- },
- {
- code: 426,
- msg: "Upgrade Required"
- },
- {
- code: 428,
- msg: "Precondition Required"
- },
- {
- code: 429,
- msg: "Too Many Requests"
- },
- {
- code: 431,
- msg: "Request Header Fields Too Large"
- },
- {
- code: 451,
- msg: "Unavailable For Legal Reasons"
- }
-] \ No newline at end of file
diff --git a/src/data/metadata.js b/src/data/metadata.js
index db05b63..a38e344 100644
--- a/src/data/metadata.js
+++ b/src/data/metadata.js
@@ -15,4 +15,4 @@ module.exports = {
image: "/favicon/512.png",
url: "/about/#marc-pervaz-boocha"
}
-} \ No newline at end of file
+}; \ No newline at end of file
diff --git a/src/data/navigator.js b/src/data/navigator.js
deleted file mode 100644
index 2081e7d..0000000
--- a/src/data/navigator.js
+++ /dev/null
@@ -1,13 +0,0 @@
-module.exports = [{
- url: "/",
- title: "Home"
- },
- {
- url: "/blog/",
- title: "Blog"
- },
- {
- url: "/about/",
- title: "About"
- }
-] \ No newline at end of file
diff --git a/src/gen/atom.11ty.js b/src/gen/atom.11ty.js
new file mode 100644
index 0000000..0184018
--- /dev/null
+++ b/src/gen/atom.11ty.js
@@ -0,0 +1,30 @@
+module.exports = class {
+ async data() {
+ return {
+ permalink: "/feed.xml"
+ };
+ }
+
+ async render(data) {
+ return `<?xml version="1.0" encoding="utf-8"?>
+ <feed xmlns="http://www.w3.org/2005/Atom">
+ <title>${data.metadata.title}</title>
+ <subtitle>${data.metadata.description}</subtitle>
+ <link href="${new URL(data.url, data.metadata.url)}" rel="self"/>
+ <link href="${data.metadata.url}"/>
+ <updated>${this.getNewestCollectionItemDate((data.collections.posts) || []).toISOString()}</updated>
+ <id>${data.metadata.url}</id>
+ <author>
+ <name>${data.metadata.author.name}</name>
+ <email>${data.metadata.author.email}</email>
+ </author>
+ ${(await Promise.all((data.collections.posts || []).map(async post => `<entry>
+ <title>${post.data.title}</title>
+ <link href="${new URL(post.url, data.metadata.url)}"/>
+ <updated>${post.date.toISOString()}</updated>
+ <id>${new URL(post.url, data.metadata.url)}</id>
+ <content type="html"><![CDATA[${await this.convertHtmlToAbsoluteUrls(post.templateContent, new URL(post.url, data.metadata.url)) || ""}]]></content>
+ </entry>`))).join()}
+ </feed>`;
+ }
+};
diff --git a/src/gen/error.11ty.js b/src/gen/error.11ty.js
new file mode 100644
index 0000000..6c7105e
--- /dev/null
+++ b/src/gen/error.11ty.js
@@ -0,0 +1,21 @@
+module.exports = class {
+ data() {
+ return {
+ layout: "base",
+ pagination: {
+ data: "err",
+ size: 1,
+ },
+ err: {
+ offline: "The Page is offline",
+ 404: "Not Found"
+ },
+ permalink: data => `/${data.pagination.items}.html`
+ };
+ }
+
+ render(data) {
+ return `<h1 style="color: rgb(139 0 0)">ERROR: ${data.pagination.items}</h1>
+ <p>${data.err[data.pagination.items]}</p>`;
+ }
+};
diff --git a/src/assets/assets.11tydata.js b/src/gen/gen.11tydata.js
index 6704307..52b6ced 100644
--- a/src/assets/assets.11tydata.js
+++ b/src/gen/gen.11tydata.js
@@ -1,8 +1,8 @@
-const path = require("path")
+const path = require("path");
module.exports = {
eleventyExcludeFromCollections: true,
eleventyComputed: {
- permalink: data => data.permalink || `/${path.relative("/assets", data.page.filePathStem)}.${data.page.outputFileExtension}`
+ permalink: data => data.permalink || `/${path.relative("/gen", data.page.filePathStem)}.${data.page.outputFileExtension}`
}
-} \ No newline at end of file
+}; \ No newline at end of file
diff --git a/src/gen/json.11ty.js b/src/gen/json.11ty.js
new file mode 100644
index 0000000..017b69c
--- /dev/null
+++ b/src/gen/json.11ty.js
@@ -0,0 +1,28 @@
+module.exports = class {
+ async data() {
+ return {
+ permalink: "/feed.json"
+ };
+ }
+
+ async render(data) {
+ return JSON.stringify({
+ version: "https://jsonfeed.org/version/1.1",
+ title: data.metadata.title,
+ language: data.metadata.language,
+ home_page_url: data.metadata.url,
+ feed_url: new URL(data.page.url, data.metadata.url),
+ description: data.metadata.description,
+ author: {
+ name: data.metadata.author.name
+ },
+ items: await Promise.all((data.collections.posts || []).map(async post => ({
+ id: new URL(post.url, data.metadata.url),
+ url: new URL(post.url, data.metadata.url),
+ title: new URL(post.url, data.metadata.url),
+ content_html: await this.convertHtmlToAbsoluteUrls(post.templateContent, new URL(post.url, data.metadata.url)),
+ date_published: post.date.toISOString()
+ })).reverse())
+ });
+ }
+}; \ No newline at end of file
diff --git a/src/gen/manifest.11ty.js b/src/gen/manifest.11ty.js
new file mode 100644
index 0000000..e41df83
--- /dev/null
+++ b/src/gen/manifest.11ty.js
@@ -0,0 +1,28 @@
+module.exports = class {
+ data() {
+ return {
+ permalink: "/app.webmanifest"
+ };
+ }
+
+ render(data) {
+ return JSON.stringify({
+ $schema: "https://json.schemastore.org/web-manifest-combined.json",
+ name: data.metadata.title,
+ lang: data.metadata.language,
+ start_url: "/",
+ id: "/",
+ scope: "/",
+ display: "minimal-ui",
+ background_color: data.metadata.theme,
+ theme_color: data.metadata.theme,
+ description: data.metadata.description,
+ icons: [192, 512, 1024].map(size => ({
+ src: `/favicon/${size}.png`,
+ type: "image/png",
+ sizes: `${size}x${size}`,
+ purpose: "maskable"
+ }))
+ });
+ }
+}; \ No newline at end of file
diff --git a/src/gen/metadata.11ty.js b/src/gen/metadata.11ty.js
new file mode 100644
index 0000000..87d7997
--- /dev/null
+++ b/src/gen/metadata.11ty.js
@@ -0,0 +1,15 @@
+module.exports = class {
+ data() {
+ return {
+ permalink: "/assets/metadata.js"
+ };
+ }
+
+ render() {
+ const obj = JSON.stringify({
+ version: new Date().toISOString()
+ });
+ return `const obj = '${obj}'
+ export default () => JSON.parse(obj);`;
+ }
+}; \ No newline at end of file
diff --git a/src/gen/robot.11ty.js b/src/gen/robot.11ty.js
new file mode 100644
index 0000000..289d3b6
--- /dev/null
+++ b/src/gen/robot.11ty.js
@@ -0,0 +1,13 @@
+module.exports = class {
+ data() {
+ return {
+ permalink: "/robot.txt"
+ };
+ }
+
+ render(data) {
+ return `User-agent: *
+ Disallow:
+ Sitemap: ${new URL("/sitemap.xml",data.metadata.url)}`;
+ }
+}; \ No newline at end of file
diff --git a/src/gen/sitemap.11ty.js b/src/gen/sitemap.11ty.js
new file mode 100644
index 0000000..02b285f
--- /dev/null
+++ b/src/gen/sitemap.11ty.js
@@ -0,0 +1,17 @@
+module.exports = class {
+ data() {
+ return {
+ permalink: "/sitemap.xml"
+ };
+ }
+
+ render(data) {
+ return `<?xml version="1.0" encoding="utf-8"?>
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
+ ${(data.collections.all || []).map(page => `<url>
+ <loc>${new URL(page.url, data.metadata.url)}</loc>
+ <lastmod>${page.date.toISOString()}</lastmod>
+ </url>`).join()}
+ </urlset>`;
+ }
+};
diff --git a/src/index.md b/src/index.md
index 01346a5..c4d3ed6 100644
--- a/src/index.md
+++ b/src/index.md
@@ -1,11 +1,6 @@
---
-layout: base.njk
-title: Home
-tags:
- - navigator
+layout: page
+title: Welcome
---
-# About This Blog
-
-This is my special place on the big World Wide Web
-
+![Mandlebrotset](/assets/mandle.png)
diff --git a/src/layouts/base.11ty.js b/src/layouts/base.11ty.js
new file mode 100644
index 0000000..a42b15f
--- /dev/null
+++ b/src/layouts/base.11ty.js
@@ -0,0 +1,51 @@
+const {oneLine} = require("common-tags")
+
+module.exports = class {
+ render(data) {
+ return oneLine`<!DOCTYPE html>
+ <html lang="${data.metadata.language}">
+ <head>
+ <meta charset="utf-8">
+ <meta property="og:locale content=en_GB">
+ <title property="og:title">${data.title || data.metadata.title}</title>
+ <meta property="og:site_name" content="${data.metadata.title}">
+ <meta name="author" content="${data.metadata.author.name}">
+ <meta name="description" property="og:description content="${data.description || data.metadata.description}">
+ <meta property="og:type" content="website">
+ ${data.keywords ? `<meta name="keywords" contents="${data.keywords.join()}>`: ""}
+ <meta name="generator" contents="Eleventy v${data.pkg.dependencies["@11ty/eleventy"].replace("^", "")}">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="twitter:card" content="summary">
+ <meta property=og:url content="${new URL(data.page.url, data.metadata.url)}">
+ <link rel="canonical" href="${new URL(data.page.url, data.metadata.url)}">
+ <link rel="alternate" href="${data.metadata.feed.atom}" type="application/atom+xml" title="${data.metadata.title}">
+ <link rel="alternate" href="${data.metadata.feed.json}" type="application/feed+json" title="${data.metadata.title}">
+ <meta property="og:image" content="/favicon/1024.png">
+ <link rel="icon" href="/favicon.ico" sizes="any">
+ <link rel="icon" href="/favicon/icon.svg" type="image/svg+xml">
+ <link rel="apple-touch-icon" href="/favicon/192.png">
+ <link rel="manifest" href="/app.webmanifest">
+ <link rel="stylesheet" href="/assets/index.css">
+ <link rel="stylesheet" href="/vendor/prism.css">
+ <script type="module" src="/assets/index.js" defer></script>
+ </head>
+ <body>
+ <header>
+ <nav>
+ <a href="#" id="nav-toogle">Sudomsg</a>
+ <a class="navlinks" href="/" >Home</a>
+ <a class="navlinks" href="/blog/">Blog</a>
+ <a class="navlinks" href="/about/">About</a>
+ </nav>
+ </header>
+ <main>
+ ${data.content}
+ </main>
+ <footer>
+ Subscribe: <a href="${data.metadata.feed.atom}">RSS</a>
+ <a href="${data.metadata.feed.json}">JSON</a>
+ </footer>
+ </body>
+ </html>`;
+ }
+};
diff --git a/src/layouts/base.njk b/src/layouts/base.njk
deleted file mode 100644
index 20b1100..0000000
--- a/src/layouts/base.njk
+++ /dev/null
@@ -1,46 +0,0 @@
-<!DOCTYPE html>
-<html lang="en-GB">
- <head>
- <meta charset="utf-8"/>
- <meta property="og:locale" content="en_GB"/>
- <title>{{ title or metadata.title }}</title>
- <meta property="og:title" content="{{ title or metadata.title }}"/>
- <meta property="og:site_name" content="{{ metadata.title }}"/>
- <meta name="author" content="{{ metadata.author.name }}"/>
- <meta name="description" content="{{ description or metadata.description }}"/>
- <meta property="og:description" content="{{ description or metadata.description }}"/>
- <meta name="keywords" contents="{{ keywords }}"/>
- <meta name="generator" contents="eleventy"/>
- <meta name="viewport" content="width=device-width, initial-scale=1"/>
- <meta name="twitter:card" content="summary"/>
- <meta property="og:url" content="{{ page.url | url | absoluteUrl(metadata.url) }}"/>
- <link rel="canonical" href="{{ page.url | url | absoluteUrl(metadata.url) }}"/>
- <link rel="alternate" href="{{ metadata.feed.atom | url }}" type="application/atom+xml" title="{{ metadata.title }}"/>
- <link rel="alternate" href="{ metadata.feed.json | url }" type="application/feed+json" title="{{ metadata.title }}"/>
- <link rel="icon" href="{{ '/favicon.ico' | url }}" sizes="any"/>
- <link rel="icon" href="{{ '/favicon/icon.svg' | url }}" type="image/svg+xml"/>
- <link rel="apple-touch-icon" href="{{ '/favicon/192.png' | url }}"/>
- <link rel="manifest" href="{{ '/app.webmanifest' | url }}" crossorigin="use-credentials"/>
- <meta name="theme-color" content="{{ metadat.theme }}"/>
- <link as="style" href="{{ '/index.css' | url }}" rel="stylesheet"/>
- {% if syntaxhighlight %}<link as="style" href="{{ '/prism.css' | url }}" rel="stylesheet"/>{% endif %}
- <script type="module" src="{{ '/index.js' | url }}"></script>
- </head>
- <body>
- <header>
- <nav>
- <a href="#" id="nav-toogle">Sudomsg</a>
- {% for nav in navigator %}
- <a class="navlinks" href="{{ nav.url | url }}">{{ nav.title }}</a>
- {% endfor %}
- </nav>
- </header>
- <main>
- {{ content | safe }}
- </main>
- <footer>
- Subscribe: <a href="{{ metadata.feed.atom | url }}" >RSS</a>
- <a href="{{ metadata.feed.json | url }}" >JSON</a>
- </footer>
- </body>
-</html> \ No newline at end of file
diff --git a/src/layouts/page.11ty.js b/src/layouts/page.11ty.js
new file mode 100644
index 0000000..53b0bd8
--- /dev/null
+++ b/src/layouts/page.11ty.js
@@ -0,0 +1,14 @@
+module.exports = class {
+ data() {
+ return {
+ layout: "base",
+ };
+ }
+
+ render(data) {
+ return `<article>
+ <h1>${data.title}</h1>
+ ${data.content}
+ </article>`;
+ }
+};
diff --git a/src/layouts/post.11ty.js b/src/layouts/post.11ty.js
new file mode 100644
index 0000000..2cd725d
--- /dev/null
+++ b/src/layouts/post.11ty.js
@@ -0,0 +1,17 @@
+module.exports = class {
+ data() {
+ return {
+ layout: "page",
+ tags: [
+ "posts"
+ ]
+ };
+ }
+
+ render(data) {
+ return `<small>
+ <time datetime="${data.page.date.toISOString()}">${data.page.date.toDateString()}</time> - <a rel=author href="${data.metadata.author.url}">${data.metadata.author.name}</a>
+ </small>
+ ${data.content}`;
+ }
+};
diff --git a/src/layouts/post.njk b/src/layouts/post.njk
deleted file mode 100644
index f8a4aee..0000000
--- a/src/layouts/post.njk
+++ /dev/null
@@ -1,12 +0,0 @@
----
-layout: base.njk
-tags:
- - posts
----
-<article>
- <h1>{{ title }}</h1>
- <small>
- <time datetime="{{ date | datefmt }}">{{ date | datefmt }}</time> - <a href="{{ metadata.author.url }}">{{ metadata.author.name }}</a>
- </small>
- {{ content | safe }}
-</article> \ No newline at end of file
diff --git a/src/post/post.11tydata.js b/src/post/post.11tydata.js
index 68f56d2..6ae489a 100644
--- a/src/post/post.11tydata.js
+++ b/src/post/post.11tydata.js
@@ -1,8 +1,8 @@
-const slugify = require("@sindresorhus/slugify")
+const slugify = require("@sindresorhus/slugify");
module.exports = () => ({
- layout: "post.njk",
- eleventyComputed: {
- permalink: data => `/posts/${slugify(data.title)}/`
- }
-}) \ No newline at end of file
+ layout: "post",
+ eleventyComputed: {
+ permalink: data => `/posts/${slugify(data.title)}/`
+ }
+});