@rathnasgala/theme 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +20 -0
- package/payload/.gala/artifact-files/gitignore +5 -0
- package/payload/.gala/managed-files.json +51 -0
- package/payload/.gala/publish.yml.template +35 -0
- package/payload/eleventy.config.js +47 -0
- package/payload/lib/build-manifest.js +189 -0
- package/payload/lib/engagement-snapshot.js +43 -0
- package/payload/lib/publication-state.js +61 -0
- package/payload/lib/render-markdown.js +96 -0
- package/payload/lib/seo.js +287 -0
- package/payload/lib/site-config.js +23 -0
- package/payload/package-lock.json +2042 -0
- package/payload/package.json +21 -0
- package/payload/src/404.njk +12 -0
- package/payload/src/_data/buildManifest.js +3 -0
- package/payload/src/_data/engagementSnapshot.js +5 -0
- package/payload/src/_data/feedLinks.js +15 -0
- package/payload/src/_data/languages.js +10 -0
- package/payload/src/_data/site.js +5 -0
- package/payload/src/_includes/components/ui.njk +17 -0
- package/payload/src/_includes/layouts/base.njk +40 -0
- package/payload/src/_includes/layouts/post.njk +11 -0
- package/payload/src/assets/interactions.js +54 -0
- package/payload/src/assets/preferences.js +30 -0
- package/payload/src/assets/search.js +81 -0
- package/payload/src/assets/theme-mode.js +35 -0
- package/payload/src/assets/theme.css +125 -0
- package/payload/src/feed.11ty.js +46 -0
- package/payload/src/index.njk +8 -0
- package/payload/src/languages.11ty.js +38 -0
- package/payload/src/posts.11ty.js +35 -0
- package/payload/src/redirects.11ty.js +37 -0
- package/payload/src/search-index.11ty.js +23 -0
- package/payload/src/search.njk +16 -0
- package/payload/src/settings.njk +19 -0
- package/payload/src/sitemap.11ty.js +26 -0
- package/payload/static/robots.txt +2 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
function html(value) {
|
|
2
|
+
return String(value)
|
|
3
|
+
.replaceAll('&', '&')
|
|
4
|
+
.replaceAll('<', '<')
|
|
5
|
+
.replaceAll('>', '>')
|
|
6
|
+
.replaceAll('"', '"')
|
|
7
|
+
.replaceAll("'", ''');
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export default class PublishedSlugRedirects {
|
|
11
|
+
data() {
|
|
12
|
+
return {
|
|
13
|
+
pagination: {
|
|
14
|
+
data: 'buildManifest.redirects',
|
|
15
|
+
size: 1,
|
|
16
|
+
alias: 'redirect'
|
|
17
|
+
},
|
|
18
|
+
permalink: ({ redirect }) => `${redirect.relativeUrl}index.html`,
|
|
19
|
+
eleventyExcludeFromCollections: true
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
render({ redirect }) {
|
|
24
|
+
const target = html(redirect.targetUrl);
|
|
25
|
+
return `<!doctype html>
|
|
26
|
+
<html lang="${html(redirect.language)}">
|
|
27
|
+
<head>
|
|
28
|
+
<meta charset="utf-8">
|
|
29
|
+
<meta http-equiv="refresh" content="0; url=${target}">
|
|
30
|
+
<link rel="canonical" href="${target}">
|
|
31
|
+
<title>Post moved</title>
|
|
32
|
+
</head>
|
|
33
|
+
<body><p>This post moved to <a href="${target}">${target}</a>.</p></body>
|
|
34
|
+
</html>
|
|
35
|
+
`;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export default class SearchIndex {
|
|
2
|
+
data() {
|
|
3
|
+
return {
|
|
4
|
+
permalink: '/search-index.json',
|
|
5
|
+
eleventyExcludeFromCollections: true
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
render({ buildManifest }) {
|
|
10
|
+
const entries = buildManifest.posts
|
|
11
|
+
.filter(({ publicationState }) => publicationState === 'published')
|
|
12
|
+
.map((post) => ({
|
|
13
|
+
id: post.id,
|
|
14
|
+
language: post.language,
|
|
15
|
+
title: post.frontmatter.title,
|
|
16
|
+
description: post.frontmatter.description ?? null,
|
|
17
|
+
tags: post.frontmatter.tags ?? [],
|
|
18
|
+
url: post.pageUrl,
|
|
19
|
+
body: post.body
|
|
20
|
+
}));
|
|
21
|
+
return `${JSON.stringify({ schemaVersion: 1, entries })}\n`;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: layouts/base.njk
|
|
3
|
+
title: Search
|
|
4
|
+
permalink: /search/index.html
|
|
5
|
+
searchPage: true
|
|
6
|
+
---
|
|
7
|
+
<h1>Search</h1>
|
|
8
|
+
<section data-gala-search data-index-url="{{ '/search-index.json' | url }}">
|
|
9
|
+
<form class="gala-search" action="{{ '/search/' | url }}" role="search">
|
|
10
|
+
<label for="gala-search-query">Search published posts</label>
|
|
11
|
+
<input id="gala-search-query" name="q" type="search" autocomplete="off">
|
|
12
|
+
<button type="submit">Search</button>
|
|
13
|
+
</form>
|
|
14
|
+
<p data-search-status role="status" aria-live="polite">Enter a search term.</p>
|
|
15
|
+
<ol class="gala-search-results" data-search-results></ol>
|
|
16
|
+
</section>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: layouts/base.njk
|
|
3
|
+
title: Settings
|
|
4
|
+
permalink: /settings/index.html
|
|
5
|
+
---
|
|
6
|
+
<h1>Reader settings</h1>
|
|
7
|
+
<section aria-labelledby="theme-setting">
|
|
8
|
+
<h2 id="theme-setting">Theme</h2>
|
|
9
|
+
<button type="button" data-theme-mode-toggle aria-label="Color mode: system. Activate for light.">Theme: system</button>
|
|
10
|
+
</section>
|
|
11
|
+
<section aria-labelledby="language-setting">
|
|
12
|
+
<h2 id="language-setting">Language preference</h2>
|
|
13
|
+
<p>Your preference highlights matching choices. The language in the page URL always controls the content.</p>
|
|
14
|
+
<label>Preferred language
|
|
15
|
+
<select data-language-preference>
|
|
16
|
+
{% for language in languages %}<option value="{{ language | escape }}">{{ language }}</option>{% endfor %}
|
|
17
|
+
</select>
|
|
18
|
+
</label>
|
|
19
|
+
</section>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { articleHreflang, renderSitemap } from '../lib/seo.js';
|
|
2
|
+
|
|
3
|
+
export default class Sitemap {
|
|
4
|
+
data() {
|
|
5
|
+
return { permalink: '/sitemap.xml' };
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
render({ buildManifest, site }) {
|
|
9
|
+
const published = buildManifest.posts.filter(
|
|
10
|
+
({ publicationState }) => publicationState === 'published'
|
|
11
|
+
);
|
|
12
|
+
const hreflang = articleHreflang(published, site);
|
|
13
|
+
return renderSitemap(published.map((post) => {
|
|
14
|
+
const links = hreflang.get(post.source);
|
|
15
|
+
return {
|
|
16
|
+
url: post.pageUrl,
|
|
17
|
+
lastModified: post.frontmatter.editHistory?.at(-1)?.slice(0, 10)
|
|
18
|
+
?? post.frontmatter.publishAfterDate,
|
|
19
|
+
variants: links
|
|
20
|
+
.filter(({ hreflang: language }) => language !== 'x-default')
|
|
21
|
+
.map(({ hreflang: language, href: url }) => ({ language, url })),
|
|
22
|
+
xDefaultUrl: links.find(({ hreflang: language }) => language === 'x-default').href
|
|
23
|
+
};
|
|
24
|
+
}));
|
|
25
|
+
}
|
|
26
|
+
}
|