diff --git a/README.md b/README.md
index db177df0f..21100a1fd 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@
[Publii](https://getpublii.com/) is a desktop-based CMS for Windows, Mac and Linux that makes creating static websites fast
and hassle-free, even for beginners.
-**Current version: 0.46.1 (build 16918)**
+**Current version: 0.46.2 (build 16966)**
## Why Publii?
Unlike static-site generators that are often unwieldy and difficult to use, Publii provides an
diff --git a/app/back-end/app.js b/app/back-end/app.js
index 3853632d2..6c0edbd9e 100644
--- a/app/back-end/app.js
+++ b/app/back-end/app.js
@@ -358,17 +358,9 @@ class App {
this.currentLanguageMomentLocale = languageConfig.momentLocale;
this.currentWysiwygTranslation = languagesLoader.loadWysiwygTranslation(this.appConfig.language, this.appConfig.languageType);
}
-
- if (
- !this.currentLanguageTranslations ||
- !languageConfig ||
- (!this.currentWysiwygTranslation && this.currentLanguageName !== 'en-gb')
- ) {
- this.loadDefaultLanguage(languagesLoader, true);
- }
- } else {
- this.loadDefaultLanguage(languagesLoader, false);
}
+
+ this.loadDefaultLanguage(languagesLoader, false);
}
// Load plugins
@@ -380,15 +372,15 @@ class App {
// Load default language
loadDefaultLanguage (languagesLoader, errorOccurred = false) {
- this.currentLanguageName = 'en-gb';
- this.currentLanguageType = 'default';
- this.currentLanguageTranslations = languagesLoader.loadTranslations('en-gb', 'default');
+ this.defaultLanguageName = 'en-gb';
+ this.defaultLanguageType = 'default';
+ this.defaultLanguageTranslations = languagesLoader.loadTranslations('en-gb', 'default');
let languageConfig = languagesLoader.loadLanguageConfig('en-gb', 'default');
- this.currentLanguageMomentLocale = languageConfig.momentLocale;
- this.currentWysiwygTranslation = languagesLoader.loadWysiwygTranslation('en-gb', 'default');
+ this.defaultLanguageMomentLocale = languageConfig.momentLocale;
+ this.defaultWysiwygTranslation = languagesLoader.loadWysiwygTranslation('en-gb', 'default');
if (errorOccurred) {
- this.languageLoadingError = true;
+ this.defaultLanguageLoadingError = true;
}
}
@@ -665,6 +657,13 @@ class App {
momentLocale: self.currentLanguageMomentLocale,
languageLoadingError: self.languageLoadingError
},
+ defaultLanguage: {
+ name: self.defaultLanguageName,
+ translations: self.defaultLanguageTranslations,
+ wysiwygTranslation: self.defaultWysiwygTranslation,
+ momentLocale: self.defaultLanguageMomentLocale,
+ languageLoadingError: self.languageLoadingError
+ },
languages: self.languages,
languagesPath: self.languagesPath,
languagesDefaultPath: self.languagesDefaultPath,
diff --git a/app/back-end/author.js b/app/back-end/author.js
index c37fd267b..b4b8c483d 100644
--- a/app/back-end/author.js
+++ b/app/back-end/author.js
@@ -75,14 +75,16 @@ class Author extends Model {
if (!this.isAuthorNameUnique()) {
return {
status: false,
- message: 'author-duplicate-name'
+ message: 'author-duplicate-name',
+ authors: this.authorsData.load()
};
}
if (!this.isAuthorUsernameUnique()) {
return {
status: false,
- message: 'author-duplicate-username'
+ message: 'author-duplicate-username',
+ authors: this.authorsData.load()
};
}
diff --git a/app/back-end/builddata.json b/app/back-end/builddata.json
index 667875c1d..bcca331b1 100644
--- a/app/back-end/builddata.json
+++ b/app/back-end/builddata.json
@@ -1,4 +1,4 @@
{
- "version": "0.46.1",
- "build": 16918
+ "version": "0.46.2",
+ "build": 16966
}
diff --git a/app/back-end/events/page.js b/app/back-end/events/page.js
index 00ff30c30..d6d1748c2 100644
--- a/app/back-end/events/page.js
+++ b/app/back-end/events/page.js
@@ -85,7 +85,9 @@ class PageEvents {
let pagesFile = path.join(this.app.sitesDir, siteName, 'input', 'config', 'pages.config.json');
if (fs.existsSync(pagesFile)) {
- event.sender.send('app-pages-hierarchy-loaded', JSON.parse(fs.readFileSync(pagesFile, { encoding: 'utf8' })));
+ let pagesHierarchy = JSON.parse(fs.readFileSync(pagesFile, { encoding: 'utf8' }));
+ pagesHierarchy = this.removeDuplicatedDataFromHierarchy(pagesHierarchy);
+ event.sender.send('app-pages-hierarchy-loaded', pagesHierarchy);
} else {
event.sender.send('app-pages-hierarchy-loaded', null);
}
@@ -95,8 +97,26 @@ class PageEvents {
ipcMain.on('app-pages-hierarchy-save', (event, pagesData) => {
let pagesFile = path.join(this.app.sitesDir, pagesData.siteName, 'input', 'config', 'pages.config.json');
pagesData.hierarchy = this.removeNullDataFromHierarchy(pagesData.hierarchy);
+ pagesData.hierarchy = this.removeDuplicatedDataFromHierarchy(pagesData.hierarchy);
fs.writeFileSync(pagesFile, JSON.stringify(pagesData.hierarchy, null, 4), { encoding: 'utf8' });
});
+
+ // Update pages hierarchy during post conversion
+ ipcMain.on('app-pages-hierarchy-update', (event, postIDs) => {
+ let pagesFile = path.join(this.app.sitesDir, pagesData.siteName, 'input', 'config', 'pages.config.json');
+ let pagesHierarchy = JSON.parse(fs.readFileSync(pagesFile, { encoding: 'utf8' }));
+
+ for (let i = 0; i < postIDs.length; i++) {
+ pagesHierarchy.push({
+ id: postIDs[i],
+ subpages: []
+ });
+ }
+
+ pagesHierarchy = this.removeNullDataFromHierarchy(pagesHierarchy);
+ pagesHierarchy = this.removeDuplicatedDataFromHierarchy(pagesHierarchy);
+ fs.writeFileSync(pagesFile, JSON.stringify(updatedHierarchy, null, 4), { encoding: 'utf8' });
+ });
}
removeNullDataFromHierarchy (data) {
@@ -107,6 +127,19 @@ class PageEvents {
subpages: item.subpages ? this.removeNullDataFromHierarchy(item.subpages) : []
}));
}
+
+ removeDuplicatedDataFromHierarchy (data) {
+ let existingIds = new Set();
+
+ return data.filter(item => {
+ if (existingIds.has(item.id)) {
+ return false;
+ }
+
+ existingIds.add(item.id);
+ return true;
+ });
+ }
}
module.exports = PageEvents;
diff --git a/app/back-end/modules/import/wxr-parser.js b/app/back-end/modules/import/wxr-parser.js
index 76b5c8a0c..4c18b32c5 100644
--- a/app/back-end/modules/import/wxr-parser.js
+++ b/app/back-end/modules/import/wxr-parser.js
@@ -198,15 +198,15 @@ class WxrParser {
this.autop = autop;
this.postTypes = postTypes;
+ if(authors === 'wp-authors') {
+ this.importAuthors = true;
+ }
+
console.log('(i) CONFIG:');
console.log('- Import authors: ' + this.importAuthors);
console.log('- Used taxonomy: ' + this.usedTaxonomy);
console.log('- Use autop: '+ this.autop + "\n\n");
console.log('- Post types: '+ this.postTypes.toString() + "\n\n");
-
- if(authors === 'wp-authors') {
- this.importAuthors = true;
- }
}
/**
@@ -720,7 +720,7 @@ class WxrParser {
let image = nextImg.imgUrl;
let imageFileName = url.parse(image);
- if(imageFileName && imageFileName.pathname) {
+ if(imageFileName && imageFileName.pathname && imageFileName.protocol) {
imageFileName = path.basename(imageFileName.pathname);
download.image({
diff --git a/app/back-end/modules/render-html/contexts/feed.js b/app/back-end/modules/render-html/contexts/feed.js
index 27d2d17f1..6915fa2d0 100644
--- a/app/back-end/modules/render-html/contexts/feed.js
+++ b/app/back-end/modules/render-html/contexts/feed.js
@@ -34,7 +34,8 @@ class RendererContextFeed extends RendererContext {
${featuredPostsCondition}
status NOT LIKE '%hidden%' AND
status NOT LIKE '%is-page%' AND
- status NOT LIKE '%trashed%'
+ status NOT LIKE '%trashed%' AND
+ status NOT LIKE '%excluded_homepage%'
ORDER BY
created_at DESC
LIMIT
@@ -134,6 +135,11 @@ class RendererContextFeed extends RendererContext {
pt.tag_id = t.id
WHERE
pt.post_id = @postID
+ AND (
+ (json_valid(t.additional_data) AND json_extract(t.additional_data, '$.isHidden') = false)
+ OR t.additional_data IS NULL
+ OR t.additional_data = ''
+ )
ORDER BY
name DESC
`).all({
diff --git a/app/back-end/modules/render-html/contexts/home.js b/app/back-end/modules/render-html/contexts/home.js
index 98a004a95..34b892bc4 100644
--- a/app/back-end/modules/render-html/contexts/home.js
+++ b/app/back-end/modules/render-html/contexts/home.js
@@ -61,6 +61,15 @@ class RendererContextHome extends RendererContext {
this.metaTitle = this.siteConfig.advanced.metaTitle.replace(/%sitename/g, siteName);
this.metaDescription = this.siteConfig.advanced.metaDescription.replace(/%sitename/g, siteName);
+ if (
+ !this.siteConfig.advanced.usePageAsFrontpage &&
+ this.siteConfig.advanced.urls.postsPrefix &&
+ this.renderer.menuContext.indexOf('frontpage') > -1
+ ) {
+ this.metaTitle = this.siteConfig.advanced.homepageMetaTitle.replace(/%sitename/g, siteName);
+ this.metaDescription = this.siteConfig.advanced.homepageMetaDescription.replace(/%sitename/g, siteName);
+ }
+
this.tags = this.renderer.commonData.tags.filter(tag => tag.additionalData.isHidden !== true);
this.mainTags = this.renderer.commonData.mainTags.filter(maintag => maintag.additionalData.isHidden !== true);
this.menus = this.renderer.commonData.menus;
diff --git a/app/back-end/modules/render-html/handlebars/helpers/is.js b/app/back-end/modules/render-html/handlebars/helpers/is.js
index 377457ec9..3a2680280 100644
--- a/app/back-end/modules/render-html/handlebars/helpers/is.js
+++ b/app/back-end/modules/render-html/handlebars/helpers/is.js
@@ -5,7 +5,7 @@
*
* {{#is 'tag,post'}}
*
- * Available phrases: index, tag, post, page, author, 404, search, pagination, index-pagination, tag-pagination, author-pagination
+ * Available phrases: index, blogindex, tag, post, page, author, 404, search, pagination, index-pagination, tag-pagination, author-pagination
*
* @returns {callback}
*/
diff --git a/app/back-end/modules/render-html/handlebars/helpers/json-ld.js b/app/back-end/modules/render-html/handlebars/helpers/json-ld.js
index 12b25003b..435c105d8 100644
--- a/app/back-end/modules/render-html/handlebars/helpers/json-ld.js
+++ b/app/back-end/modules/render-html/handlebars/helpers/json-ld.js
@@ -78,8 +78,8 @@ function jsonLDHelper(rendererInstance, Handlebars) {
"@id": itemData.url,
};
jsonLDObject['headline'] = itemData.title;
- jsonLDObject['datePublished'] = moment(itemData.createdAt).format('YYYY-MM-DDTHH:mm');
- jsonLDObject['dateModified'] = moment(itemData.modifiedAt).format('YYYY-MM-DDTHH:mm');
+ jsonLDObject['datePublished'] = moment(itemData.createdAt).format('YYYY-MM-DDTHH:mmZ');
+ jsonLDObject['dateModified'] = moment(itemData.modifiedAt).format('YYYY-MM-DDTHH:mmZ');
if (itemData.featuredImage.url || context.data.website.logo) {
let imageUrl = '';
diff --git a/app/back-end/modules/render-html/handlebars/helpers/menu-item-classes.js b/app/back-end/modules/render-html/handlebars/helpers/menu-item-classes.js
index 0e71e7c6a..31a528751 100644
--- a/app/back-end/modules/render-html/handlebars/helpers/menu-item-classes.js
+++ b/app/back-end/modules/render-html/handlebars/helpers/menu-item-classes.js
@@ -39,7 +39,9 @@ function menuItemClassesHelper(rendererInstance, Handlebars) {
if (hasActiveChild(this.items, context)) {
output.push(activeParentClass);
} else if (
+ (this.type === 'blogpage' && context[0] === 'blogpage') ||
(this.type === 'frontpage' && context[0] === 'frontpage') ||
+ (this.type === 'frontpage' && context[0] === 'page' && context[2] && context[2] === 'page-' + rendererInstance.siteConfig.advanced.pageAsFrontpage) ||
(this.type === 'tags' && context[0] === 'tags') ||
(this.type === context[0] && this.link === context[1])
) {
diff --git a/app/back-end/modules/render-html/handlebars/helpers/menu-url.js b/app/back-end/modules/render-html/handlebars/helpers/menu-url.js
index 53a15a949..9f84a9d5e 100644
--- a/app/back-end/modules/render-html/handlebars/helpers/menu-url.js
+++ b/app/back-end/modules/render-html/handlebars/helpers/menu-url.js
@@ -51,30 +51,42 @@ function menuURLHelper(rendererInstance, Handlebars) {
let parentItems = rendererInstance.cachedItems.pagesStructureHierarchy[this.linkID];
let pageSlug = this.link;
- if (rendererInstance.siteConfig.advanced.urls.cleanUrls && parentItems && parentItems.length) {
- let slugs = [];
+ if (rendererInstance.siteConfig.advanced.usePageAsFrontpage && rendererInstance.siteConfig.advanced.pageAsFrontpage === this.linkID) {
+ output = baseUrl + '/';
- for (let i = 0; i < parentItems.length; i++) {
- if (rendererInstance.cachedItems.pages[parentItems[i]]) {
- slugs.push(rendererInstance.cachedItems.pages[parentItems[i]].slug);
- }
- }
-
- slugs.push(this.link);
- pageSlug = slugs.join('/');
- }
-
- if (rendererInstance.siteConfig.advanced.urls.cleanUrls) {
- output = baseUrl + '/' + pageSlug + '/';
// In the preview mode we have to load URLs with
// index.html as filesystem on OS doesn't behave
// as the server environment and not redirect to
// a proper URL
if (rendererInstance.previewMode || rendererInstance.siteConfig.advanced.urls.addIndex) {
output += 'index.html';
- }
+ }
} else {
- output = baseUrl + '/' + pageSlug + '.html';
+ if (rendererInstance.siteConfig.advanced.urls.cleanUrls && parentItems && parentItems.length) {
+ let slugs = [];
+
+ for (let i = 0; i < parentItems.length; i++) {
+ if (rendererInstance.cachedItems.pages[parentItems[i]]) {
+ slugs.push(rendererInstance.cachedItems.pages[parentItems[i]].slug);
+ }
+ }
+
+ slugs.push(this.link);
+ pageSlug = slugs.join('/');
+ }
+
+ if (rendererInstance.siteConfig.advanced.urls.cleanUrls) {
+ output = baseUrl + '/' + pageSlug + '/';
+ // In the preview mode we have to load URLs with
+ // index.html as filesystem on OS doesn't behave
+ // as the server environment and not redirect to
+ // a proper URL
+ if (rendererInstance.previewMode || rendererInstance.siteConfig.advanced.urls.addIndex) {
+ output += 'index.html';
+ }
+ } else {
+ output = baseUrl + '/' + pageSlug + '.html';
+ }
}
}
diff --git a/app/back-end/modules/render-html/handlebars/helpers/social-meta-tags.js b/app/back-end/modules/render-html/handlebars/helpers/social-meta-tags.js
index d23a19385..ecaddf44a 100644
--- a/app/back-end/modules/render-html/handlebars/helpers/social-meta-tags.js
+++ b/app/back-end/modules/render-html/handlebars/helpers/social-meta-tags.js
@@ -42,8 +42,23 @@ function socialMetaTagsHelper(rendererInstance, Handlebars) {
siteName = rendererInstance.siteConfig.advanced.metaTitle.replace(/%sitename/g, siteNameValue);
}
- // Get tag values according to the current context - listing or single post page
+ if (
+ !rendererInstance.siteConfig.advanced.usePageAsFrontpage &&
+ rendererInstance.siteConfig.advanced.urls.postsPrefix !== '' &&
+ contextData.data.context.indexOf('index') > -1 &&
+ rendererInstance.siteConfig.advanced.homepageMetaTitle
+ ) {
+ let siteNameValue = rendererInstance.siteConfig.name;
+
+ if (rendererInstance.siteConfig.displayName) {
+ siteNameValue = rendererInstance.siteConfig.displayName;
+ }
+
+ siteName = rendererInstance.siteConfig.advanced.homepageMetaTitle.replace(/%sitename/g, siteNameValue);
+ }
+
if(contextData.data.context.indexOf('post') === -1 && contextData.data.context.indexOf('page') === -1) {
+ // Get tag values according to the current context - listing or single post page
// Data for the index/tag listing page
image = contextData.data.website.logo;
title = siteName;
diff --git a/app/back-end/modules/render-html/helpers/deleteEmpty.js b/app/back-end/modules/render-html/helpers/deleteEmpty.js
new file mode 100644
index 000000000..33480031d
--- /dev/null
+++ b/app/back-end/modules/render-html/helpers/deleteEmpty.js
@@ -0,0 +1,46 @@
+const fs = require('fs');
+const path = require('path');
+const systemFiles = [
+ '.DS_Store',
+ 'desktop.ini',
+ 'Thumbs.db'
+];
+
+function isSystemFile (file) {
+ return systemFiles.includes(file);
+}
+
+function deleteEmpty (dirPath) {
+ if (!fs.existsSync(dirPath)) {
+ return;
+ }
+
+ try {
+ let files = fs.readdirSync(dirPath);
+
+ for (let file of files) {
+ let fullPath = path.join(dirPath, file);
+ let stat = fs.statSync(fullPath);
+
+ if (stat.isDirectory()) {
+ deleteEmpty(fullPath);
+ } else if (isSystemFile(file)) {
+ fs.unlinkSync(fullPath);
+ }
+ }
+
+ files = fs.readdirSync(dirPath);
+ let isDirectoryEmpty = files.length === 0;
+
+ if (isDirectoryEmpty) {
+ fs.rmdirSync(dirPath);
+ console.log('[OK] Deleted empty directory: ', dirPath);
+ }
+ } catch (err) {
+ console.log('(!) Error during deleting empty directories: ', dirPath , ' | Reason: ', err.message);
+ }
+}
+
+module.exports = {
+ deleteEmpty
+};
diff --git a/app/back-end/modules/render-html/helpers/files.js b/app/back-end/modules/render-html/helpers/files.js
index f40d481c3..6bfd15746 100644
--- a/app/back-end/modules/render-html/helpers/files.js
+++ b/app/back-end/modules/render-html/helpers/files.js
@@ -1,7 +1,7 @@
const fs = require('fs-extra');
const list = require('ls-all');
const path = require('path');
-const deleteEmpty = require('delete-empty');
+const { deleteEmpty } = require('./deleteEmpty.js');
const UtilsHelper = require('./../../../helpers/utils');
const normalizePath = require('normalize-path');
const DiffCopy = require('./diffCopy.js');
@@ -270,7 +270,7 @@ class Files {
static async removeEmptyDirectories (outputDir) {
let basePathOutput = path.join(outputDir, 'media');
- await deleteEmpty(basePathOutput);
+ deleteEmpty(basePathOutput);
}
}
diff --git a/app/back-end/modules/render-html/helpers/sitemap.js b/app/back-end/modules/render-html/helpers/sitemap.js
index b66583e6d..73aaee20a 100644
--- a/app/back-end/modules/render-html/helpers/sitemap.js
+++ b/app/back-end/modules/render-html/helpers/sitemap.js
@@ -587,7 +587,7 @@ class Sitemap {
homeIndexPath = this.baseDirectory;
}
- if (postsPrefix && this.siteConfig.advanced.usePageAsFrontpage) {
+ if (postsPrefix) {
let homeIndexFileContent = await readFile(path.join(homeIndexPath, 'index.html'), 'utf8');
if (homeIndexFileContent.indexOf('name="robots" content="noindex') === -1) {
diff --git a/app/back-end/modules/render-html/renderer-context.js b/app/back-end/modules/render-html/renderer-context.js
index 771e7d8e6..25890b438 100644
--- a/app/back-end/modules/render-html/renderer-context.js
+++ b/app/back-end/modules/render-html/renderer-context.js
@@ -365,7 +365,7 @@ class RendererContext {
searchUrl: searchUrl,
errorUrl: errorUrl,
tagsUrl: this.getTagsUrl(),
- pageUrl: this.getPageUrl(context, paginationData, itemSlug),
+ pageUrl: this.getPageUrl(context, paginationData, itemSlug, itemContext),
name: siteNameValue,
logo: logoUrl,
logoSize: logoSize,
@@ -686,7 +686,7 @@ class RendererContext {
return results;
}
- getPageUrl (context, paginationData, itemSlug) {
+ getPageUrl (context, paginationData, itemSlug, itemContext) {
let pagePart = this.siteConfig.advanced.urls.pageName;
let blogBaseUrl = this.siteConfig.domain;
@@ -694,9 +694,13 @@ class RendererContext {
blogBaseUrl = this.siteConfig.domain + '/' + this.siteConfig.advanced.urls.postsPrefix;
}
- if (context === 'index' || context === '404' || context === 'search') {
+ if (context === 'index' || context === 'blogindex' || context === '404' || context === 'search') {
if (!paginationData || paginationData.currentPage === 1) {
- return blogBaseUrl + '/';
+ if (this.siteConfig.advanced.usePageAsFrontpage || context === 'blogindex') {
+ return blogBaseUrl + '/';
+ }
+
+ return this.siteConfig.domain + '/';
} else {
if (this.siteConfig.advanced.urls.postsPrefix) {
return blogBaseUrl + '/' + this.siteConfig.advanced.urls.postsPrefix + '/' + pagePart + '/' + paginationData.currentPage + '/';
@@ -769,6 +773,10 @@ class RendererContext {
return blogBaseUrl + '/' + this.siteConfig.advanced.urls.postsPrefix + '/' + itemSlug + '/';
}
} else if (context === 'page') {
+ if (this.siteConfig.advanced.usePageAsFrontpage && itemContext.page && this.siteConfig.advanced.pageAsFrontpage === itemContext.page.id) {
+ return this.siteConfig.domain + '/';
+ }
+
if (!this.siteConfig.advanced.urls.cleanUrls) {
return this.siteConfig.domain + '/' + itemSlug + '.html';
} else {
diff --git a/app/back-end/modules/render-html/renderer.js b/app/back-end/modules/render-html/renderer.js
index 73ac2a531..ceaedb14f 100644
--- a/app/back-end/modules/render-html/renderer.js
+++ b/app/back-end/modules/render-html/renderer.js
@@ -705,19 +705,20 @@ class Renderer {
* Generate the main view of the theme
*/
generateFrontpage() {
- console.time('HOME');
// Load template
let inputFile = 'index.hbs';
- let compiledTemplate = this.compileTemplate(inputFile);
+ let homeCompiledTemplate = this.compileTemplate(inputFile);
+ let postsCompiledTemplate;
+ let compiledTemplate;
- if (!compiledTemplate) {
- console.timeEnd('HOME');
- return false;
+ if (this.themeConfig.supportedFeatures && this.themeConfig.supportedFeatures.postsPage) {
+ postsCompiledTemplate = this.compileTemplate('posts.hbs');
+ } else {
+ postsCompiledTemplate = this.compileTemplate('index.hbs');
}
// Don't render homepage and it's pagination if we use page as frontpage and posts prefix is empty
if (this.siteConfig.advanced.usePageAsFrontpage && !this.siteConfig.advanced.urls.postsPrefix) {
- console.timeEnd('HOME');
return false;
}
@@ -732,43 +733,16 @@ class Renderer {
postsPerPage = 5;
}
- if (totalNumberOfPosts <= postsPerPage || postsPerPage <= 0 || this.siteConfig.advanced.homepageNoPagination) {
- let context = contextGenerator.getContext(0, postsPerPage);
- let output = '';
- this.menuContext = ['frontpage'];
-
- try {
- this.globalContext = this.createGlobalContext('index', [], false, false, false, context);
-
- output = compiledTemplate(context, {
- data: this.globalContext
- });
- } catch (e) {
- this.errorLog.push({
- message: 'An error (1002) occurred during parsing ' + inputFile + ' file.',
- desc: e.message + "\n\n" + e.stack
- });
- return;
- }
-
- if (this.plugins.hasModifiers('htmlOutput')) {
- output = this.plugins.runModifiers('htmlOutput', this, output, [this.globalContext, context]);
- }
-
- if (this.siteConfig.advanced.urls.postsPrefix === '' || !this.siteConfig.advanced.usePageAsFrontpage) {
- this.templateHelper.saveOutputFile('index.html', output);
- } else {
- this.templateHelper.saveOutputFile(path.join(this.siteConfig.advanced.urls.postsPrefix, 'index.html'), output);
- }
- } else {
+ let hasBlogPagination = !(totalNumberOfPosts <= postsPerPage || postsPerPage <= 0 || this.siteConfig.advanced.homepageNoPagination);
+
+ // When we have blog pagination
+ if (hasBlogPagination) {
let addIndexHtml = this.previewMode || this.siteConfig.advanced.urls.addIndex;
// If user set postsPerPage field to -1 - set it for calculations to 999
postsPerPage = postsPerPage == -1 ? 999 : postsPerPage;
for (let offset = 0; offset < totalNumberOfPosts; offset += postsPerPage) {
- let context = contextGenerator.getContext(offset, postsPerPage);
-
// Add pagination data to the global context
let currentPage = 1;
let totalPages = 0;
@@ -800,32 +774,147 @@ class Renderer {
additionalContexts = ['pagination', 'index-pagination'];
}
- this.menuContext = ['frontpage'];
- this.globalContext = this.createGlobalContext('index', additionalContexts, {
- pagination,
- isFirstPage: currentPage === 1,
- isLastPage: currentPage === totalPages,
- currentPage
- }, false, false, context);
- let output = this.renderTemplate(compiledTemplate, context, this.globalContext, inputFile);
-
- if (this.plugins.hasModifiers('htmlOutput')) {
- output = this.plugins.runModifiers('htmlOutput', this, output, [this.globalContext, context]);
- }
-
+ // detect frontpage/blog index
if (offset === 0) {
- if (this.siteConfig.advanced.urls.postsPrefix === '' || !this.siteConfig.advanced.usePageAsFrontpage) {
+ if (this.siteConfig.advanced.urls.postsPrefix === '' && !this.siteConfig.advanced.usePageAsFrontpage) {
+ compiledTemplate = homeCompiledTemplate;
+ this.menuContext = ['frontpage'];
+ let context = contextGenerator.getContext(offset, postsPerPage);
+ this.globalContext = this.createGlobalContext('index', additionalContexts, {
+ pagination,
+ isFirstPage: currentPage === 1,
+ isLastPage: currentPage === totalPages,
+ currentPage
+ }, false, false, context);
+
+ let output = this.renderTemplate(compiledTemplate, context, this.globalContext, inputFile);
+
+ if (this.plugins.hasModifiers('htmlOutput')) {
+ output = this.plugins.runModifiers('htmlOutput', this, output, [this.globalContext, context]);
+ }
+
this.templateHelper.saveOutputFile('index.html', output);
- } else {
+ } else if (this.siteConfig.advanced.urls.postsPrefix !== '') {
+ compiledTemplate = postsCompiledTemplate;
+ this.menuContext = ['blogpage'];
+ let context = contextGenerator.getContext(offset, postsPerPage);
+ this.globalContext = this.createGlobalContext('blogindex', additionalContexts, {
+ pagination,
+ isFirstPage: currentPage === 1,
+ isLastPage: currentPage === totalPages,
+ currentPage
+ }, false, false, context);
+
+ let output = this.renderTemplate(compiledTemplate, context, this.globalContext, inputFile);
+
+ if (this.plugins.hasModifiers('htmlOutput')) {
+ output = this.plugins.runModifiers('htmlOutput', this, output, [this.globalContext, context]);
+ }
+
this.templateHelper.saveOutputFile(path.join(this.siteConfig.advanced.urls.postsPrefix, 'index.html'), output);
+
+ if (!this.siteConfig.advanced.usePageAsFrontpage) {
+ compiledTemplate = homeCompiledTemplate;
+
+ this.menuContext = ['frontpage'];
+ let context = contextGenerator.getContext(offset, postsPerPage);
+ this.globalContext = this.createGlobalContext('index', additionalContexts, {
+ pagination,
+ isFirstPage: currentPage === 1,
+ isLastPage: currentPage === totalPages,
+ currentPage
+ }, false, false, context);
+
+ let output = this.renderTemplate(compiledTemplate, context, this.globalContext, inputFile);
+
+ if (this.plugins.hasModifiers('htmlOutput')) {
+ output = this.plugins.runModifiers('htmlOutput', this, output, [this.globalContext, context]);
+ }
+
+ this.templateHelper.saveOutputFile('index.html', output);
+ }
}
} else {
+ this.menuContext = ['frontpage'];
+
+ if (this.siteConfig.advanced.urls.postsPrefix !== '') {
+ this.menuContext = ['blogpage'];
+ }
+ let context = contextGenerator.getContext(offset, postsPerPage);
+ this.globalContext = this.createGlobalContext('blogindex', additionalContexts, {
+ pagination,
+ isFirstPage: currentPage === 1,
+ isLastPage: currentPage === totalPages,
+ currentPage
+ }, false, false, context);
+
+ let output = this.renderTemplate(postsCompiledTemplate, context, this.globalContext, inputFile);
+
+ if (this.plugins.hasModifiers('htmlOutput')) {
+ output = this.plugins.runModifiers('htmlOutput', this, output, [this.globalContext, context]);
+ }
+
// We increase the current page number as we need to start URLs from page/2
this.templateHelper.saveOutputHomePaginationFile(currentPage, output);
}
}
}
- console.timeEnd('HOME');
+ console.timeEnd('BLOG PAGINATION');
+
+ // When there is no blog pagination
+ if (!hasBlogPagination) {
+ console.time('HOMEPAGE');
+
+ let output = '';
+
+ if (this.siteConfig.advanced.urls.postsPrefix === '' || !this.siteConfig.advanced.usePageAsFrontpage) {
+ this.menuContext = ['frontpage'];
+ let context = contextGenerator.getContext(0, postsPerPage);
+ this.globalContext = this.createGlobalContext('index', [], false, false, false, context);
+
+ output = homeCompiledTemplate(context, {
+ data: this.globalContext
+ });
+
+ if (this.plugins.hasModifiers('htmlOutput')) {
+ output = this.plugins.runModifiers('htmlOutput', this, output, [this.globalContext, context]);
+ }
+
+ this.templateHelper.saveOutputFile('index.html', output);
+ } else if (this.siteConfig.advanced.urls.postsPrefix !== '') {
+ this.menuContext = ['blogpage'];
+ let context = contextGenerator.getContext(0, postsPerPage);
+ this.globalContext = this.createGlobalContext('blogindex', [], false, false, false, context);
+
+ output = postsCompiledTemplate(context, {
+ data: this.globalContext
+ });
+
+ if (this.plugins.hasModifiers('htmlOutput')) {
+ output = this.plugins.runModifiers('htmlOutput', this, output, [this.globalContext, context]);
+ }
+
+ this.templateHelper.saveOutputFile(path.join(this.siteConfig.advanced.urls.postsPrefix, 'index.html'), output);
+
+ if (!this.siteConfig.advanced.usePageAsFrontpage) {
+ this.menuContext = ['frontpage'];
+ let context = contextGenerator.getContext(0, postsPerPage);
+ this.globalContext = this.createGlobalContext('index', [], false, false, false, context);
+
+ output = homeCompiledTemplate(context, {
+ data: this.globalContext
+ });
+
+ if (this.plugins.hasModifiers('htmlOutput')) {
+ output = this.plugins.runModifiers('htmlOutput', this, output, [this.globalContext, context]);
+ }
+
+ this.templateHelper.saveOutputFile('index.html', output);
+ }
+ }
+
+ console.timeEnd('HOMEPAGE');
+ }
}
/*
@@ -903,7 +992,7 @@ class Renderer {
let fileSlug = 'DEFAULT';
fileSlug = postTemplates[i] === '' ? 'DEFAULT' : postTemplates[i];
- this.menuContext = ['post', postSlugs[i]];
+ this.menuContext = ['post', postSlugs[i], 'post-' + postIDs[i]];
if (!compiledTemplates[fileSlug]) {
fileSlug = 'DEFAULT';
@@ -1191,7 +1280,7 @@ class Renderer {
let fileSlug = 'DEFAULT';
fileSlug = pageTemplates[i] === '' ? 'DEFAULT' : pageTemplates[i];
- this.menuContext = ['page', pageSlugs[i]];
+ this.menuContext = ['page', pageSlugs[i], 'page-' + pageIDs[i]];
if (!compiledTemplates[fileSlug]) {
fileSlug = 'DEFAULT';
diff --git a/app/back-end/page.js b/app/back-end/page.js
index 0f4fc613d..3085bdde0 100644
--- a/app/back-end/page.js
+++ b/app/back-end/page.js
@@ -371,6 +371,7 @@ class Page extends Model {
changeStatus(status, inverse = false) {
let selectQuery = this.db.prepare(`SELECT status FROM posts WHERE id = @id`).all({ id: this.id });
let currentStatus = selectQuery[0].status.split(',');
+ let resetTemplateIfNeeded = status === 'is-page' ? ', template = \'*\'' : '';
if (!inverse) {
if(currentStatus.indexOf(status) === -1) {
@@ -388,6 +389,7 @@ class Page extends Model {
posts
SET
status = @status
+ ${resetTemplateIfNeeded}
WHERE
id = @id`);
updateQuery.run({
diff --git a/app/back-end/post.js b/app/back-end/post.js
index f0f64325b..24102bbfd 100644
--- a/app/back-end/post.js
+++ b/app/back-end/post.js
@@ -414,6 +414,7 @@ class Post extends Model {
changeStatus(status, inverse = false) {
let selectQuery = this.db.prepare(`SELECT status FROM posts WHERE id = @id`).all({ id: this.id });
let currentStatus = selectQuery[0].status.split(',');
+ let resetTemplateIfNeeded = status === 'is-page' ? ', template = \'*\'' : '';
if(!inverse) {
if(currentStatus.indexOf(status) === -1) {
@@ -425,12 +426,13 @@ class Post extends Model {
}
}
- currentStatus = currentStatus.filter(status => status.trim() !== '');
-
+ currentStatus = currentStatus.filter(status => ['excluded_homepage', 'featured', 'hidden'].indexOf(status) === -1 && status.trim() !== '');
+
let updateQuery = this.db.prepare(`UPDATE
posts
SET
status = @status
+ ${resetTemplateIfNeeded}
WHERE
id = @id`);
updateQuery.run({
diff --git a/app/config/AST.currentSite.config.js b/app/config/AST.currentSite.config.js
index 25ebeab7e..30643e375 100644
--- a/app/config/AST.currentSite.config.js
+++ b/app/config/AST.currentSite.config.js
@@ -43,6 +43,9 @@ const AstCurrentSiteConfig = {
homepageNoIndexPagination: false,
homepageNoPagination: false,
metaRobotsIndex: 'index, follow',
+ homepageMetaTitle: '%sitename',
+ homepageMetaDescription: '',
+ homepageMetaRobotsIndex: 'index, follow',
postMetaTitle: '%posttitle - %sitename ',
postMetaDescription: '',
pageMetaTitle: '%pagetitle - %sitename ',
diff --git a/app/default-files/default-languages/en-gb/config.json b/app/default-files/default-languages/en-gb/config.json
index 7e2d064f9..c4f768fcf 100644
--- a/app/default-files/default-languages/en-gb/config.json
+++ b/app/default-files/default-languages/en-gb/config.json
@@ -1,8 +1,8 @@
{
"name": "English - default",
- "version": "1.7.1",
+ "version": "1.7.2",
"author": "Publii Team",
- "publiiSupport": "0.46.1",
+ "publiiSupport": "0.46.2",
"momentLocale": "en",
"wysiwygTranslation": false
}
diff --git a/app/default-files/default-languages/en-gb/translations.json b/app/default-files/default-languages/en-gb/translations.json
index a3850c3c9..19a595e2f 100644
--- a/app/default-files/default-languages/en-gb/translations.json
+++ b/app/default-files/default-languages/en-gb/translations.json
@@ -452,6 +452,7 @@
"cleanUrlsDisabled": "Activate 'Pretty URLs' in the Site settings to unlock the Edit hierarchy option. This will allow you to easily manage the parent-child relationships between your pages.",
"editHierarchy": "Edit hierarchy",
"configureThemeBeforeGeneratingPreview": "A theme must be selected and configured for this website before a preview of this page may be generated.",
+ "convertToPost": "Convert to post",
"currentDefaultTemplate": "Current default template",
"customPageTypes": "Custom Page Types",
"drafts": "Drafts",
@@ -538,6 +539,7 @@
"changePostDate": "Change post date",
"characters": "Characters",
"configureThemeBeforeGeneratingPreview": "A theme must be selected and configured for this website before a preview of this post may be generated.",
+ "convertToPage": "Convert to page",
"currentDefaultTemplate": "Current default template",
"customPostTypes": "Custom Post Types",
"drafts": "Drafts",
@@ -808,6 +810,7 @@
"hideCustomExcerptsOnPostPagesInfo": "When enabled, your post pages won't display text which is placed above the \"Read more\" element in the post editor.",
"hideCustomExcerptsOnPagePages": "Hide custom excerpts on pages",
"hideCustomExcerptsOnPagePagesInfo": "When enabled, your pages won't display text which is placed above the \"Read more\" element in the editor.",
+ "homepage": "Homepage",
"homepageNoIndexPagination": "When enabled, your homepage pagination files will be excluded from the sitemap and will have the noindex, follow robots metatags added.",
"homepagePagination": "Homepage pagination",
"howToPrepareYourThemeForGDPRInfo": "Enabling this option will display a cookie banner on your website. Please read the GDPR Cookie Banner Configuration article for more information on how to configure the banner correctly. ",
diff --git a/app/default-files/default-languages/pl/config.json b/app/default-files/default-languages/pl/config.json
index fa9cdf5bf..30827907b 100644
--- a/app/default-files/default-languages/pl/config.json
+++ b/app/default-files/default-languages/pl/config.json
@@ -1,8 +1,8 @@
{
"name": "Polish - default",
- "version": "1.7.1",
+ "version": "1.7.2",
"author": "Publii Team",
- "publiiSupport": "0.46.1",
+ "publiiSupport": "0.46.2",
"momentLocale": "pl",
"wysiwygTranslation": true
}
diff --git a/app/default-files/default-languages/pl/translations.json b/app/default-files/default-languages/pl/translations.json
index 240f49ead..bade2a577 100644
--- a/app/default-files/default-languages/pl/translations.json
+++ b/app/default-files/default-languages/pl/translations.json
@@ -450,6 +450,7 @@
"closeHierarchy": "Zakończ edycję",
"changePageDate": "Zmień datę publikacji",
"cleanUrlsDisabled": "Włącz opcję 'Ładne adresy URL' w ustawieniach strony, aby odblokować funkcję edycji hierarchii. Umożliwi to łatwe zarządzanie relacjami między stronami nadrzędnymi i podrzędnymi.",
+ "convertToPost": "Konwertuj na wpis",
"editHierarchy": "Edytuj hierarchię",
"configureThemeBeforeGeneratingPreview": "Musisz skonfigurować motyw dla tej witryny przed wygenerowaniem podglądu tej strony.",
"currentDefaultTemplate": "Aktualnie domyślny szablon",
@@ -538,6 +539,7 @@
"changePostDate": "Zmień datę publikacji",
"characters": "Znaki",
"configureThemeBeforeGeneratingPreview": "Musisz skonfigurować motyw dla tej witryny przed wygenerowaniem podglądu tego wpisu.",
+ "convertToPage": "Konwertuj na stronę",
"currentDefaultTemplate": "Aktualnie domyślny szablon",
"customPostTypes": "Własne rodzaje wpisów",
"drafts": "Wersje robocze",
@@ -808,6 +810,7 @@
"hideCustomExcerptsOnPostPagesInfo": "Jeśli ta opcja jest włączona strony wpisów nie będą pokazywać tekstu umieszczonego nad elementem \"Czytaj więcej\" w edytorze wpisu.",
"hideCustomExcerptsOnPagePages": "Ukryj własne zajawki na stronach",
"hideCustomExcerptsOnPagePagesInfo": "Jeśli ta opcja jest włączona strony nie będą pokazywać tekstu umieszczonego nad elementem \"Czytaj więcej\" w edytorze strony.",
+ "homepage": "Strona główna",
"homepageNoIndexPagination": "Jeśli ta opcja jest włączona, pliki paginacji strony głównej zostaną wykluczone z mapy witryny i otrzymają noindex, follow metatag robotów.",
"homepagePagination": "Paginacja strony głównej",
"howToPrepareYourThemeForGDPRInfo": "Włączenie tej opcji spowoduje wyświetlenie banera plików cookie w Twojej witrynie. Aby uzyskać więcej informacji na temat prawidłowej konfiguracji banera zapoznaj się z następującym artykułem GDPR Cookie Banner Configuration ",
diff --git a/app/default-files/default-themes/simple/assets/css/main.css b/app/default-files/default-themes/simple/assets/css/main.css
index 754518a58..44558e330 100644
--- a/app/default-files/default-themes/simple/assets/css/main.css
+++ b/app/default-files/default-themes/simple/assets/css/main.css
@@ -49,6 +49,11 @@ address {
color: var(--white);
}
+:focus-visible {
+ outline: 2px solid var(--color) !important;
+ outline-offset: 2px;
+}
+
html {
font-size: var(--font-size);
-webkit-font-smoothing: antialiased;
@@ -1728,6 +1733,9 @@ textarea {
bottom: 0;
width: 100%;
}
+.post__toc {
+ margin-top: calc(var(--baseline) * 6 + 0.5vw);
+}
.post__toc h3 {
border-bottom: 1px solid var(--dark);
font-size: 1rem;
@@ -1931,7 +1939,6 @@ textarea {
margin: 0 0 1rem;
}
-/* Pagination ------------------------ */
.pagination {
display: flex;
gap: calc(var(--baseline) * 2);
diff --git a/app/default-files/default-themes/simple/assets/css/style.css b/app/default-files/default-themes/simple/assets/css/style.css
index d357ae9bc..61b7f91bd 100755
--- a/app/default-files/default-themes/simple/assets/css/style.css
+++ b/app/default-files/default-themes/simple/assets/css/style.css
@@ -1 +1 @@
-@font-face{font-family:Lora;src:url('../dynamic/fonts/lora/lora.woff2') format('woff2');font-weight:400 700;font-display:swap;font-style:normal}@font-face{font-family:Lora;src:url('../dynamic/fonts/lora/lora-italic.woff2') format('woff2');font-weight:400 700;font-display:swap;font-style:italic}:root{--page-margin:6vw;--page-width:66rem;--entry-width:42rem;--navbar-height:4.4rem;--border-radius:3px;--baseline:0.28333rem;--gallery-gap:calc(var(--baseline) * 1.5);--body-font:'Lora',serif;--heading-font:'Lora',serif;--logo-font:var(--body-font);--menu-font:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-size:clamp(1.1rem, 1.1rem + (0.09999999999999987 * ((100vw - 20rem) / 70)), 1.2rem);--font-weight-normal:400;--font-weight-bold:600;--line-height:1.7;--letter-spacing:0em;--headings-weight:500;--headings-transform:none;--headings-style:normal;--headings-letter-spacing:0em;--headings-line-height:1.2;--hero-height:50vh;--feed-image-size:8rem;--white:#FFFFFF;--black:#17181E;--helper:#FFFFFF;--dark:#17181E;--gray:#57585a;--light:#CACBCF;--lighter:#F3F3F3;--page-bg:#FFFFFF;--color:#D73A42;--text-color:#17181E;--headings-color:#17181E;--link-color:#17181E;--link-color-hover:#D73A42;--nav-link-color:#17181E;--nav-link-color-hover:#17181E;--logo-color:#17181E;--highlight-color:#FFC700;--info-color:#67B1F3;--success-color:#00A563;--warning-color:#EE4E4E}@media all and (min-width:56.25em){:root{--navbar-height:6rem}}@media (prefers-color-scheme:dark){:root{--white:#FFFFFF;--black:#1e1e1e;--helper:#1e1e1e;--dark:#CECBCB;--gray:#9D9D9D;--light:#373737;--lighter:#1e1e1e;--page-bg:#181818;--color:#FFC074;--text-color:#BFBFBF;--headings-color:#EEEDED;--link-color:#EEEDED;--link-color-hover:#FFC074;--nav-link-color:rgba(255,255,255,1);--nav-link-color-hover:rgba(255,255,255,.7);--logo-color:#FFFFFF;--highlight-color:#F6DC90;--info-color:#5B9ED5;--success-color:#54A468;--warning-color:#FB6762}}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0}article,aside,footer,header,hgroup,main,nav,section{display:block}li{list-style:none}img{height:auto;max-width:100%;vertical-align:top}button,input,select,textarea{font:inherit}address{font-style:normal}::-moz-selection{background:var(--color);color:var(--white)}::selection{background:var(--color);color:var(--white)}html{font-size:var(--font-size);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;scroll-behavior:smooth}html.no-scroll{overflow:hidden;position:fixed}body{background:var(--page-bg);color:var(--text-color);font-family:var(--body-font);font-variation-settings:"wght" var(--font-weight-normal);letter-spacing:var(--letter-spacing);line-height:var(--line-height);-ms-scroll-chaining:none;overscroll-behavior:none}a{text-decoration:none}a{color:var(--link-color);-webkit-transition:all .24s ease-out;transition:all .24s ease-out}a:hover{color:var(--link-color-hover)}a:active{color:var(--link-color-hover)}a:focus{outline:0}.invert{color:var(--link-color-hover);-webkit-transition:all .24s ease-out;transition:all .24s ease-out}.invert:hover{color:var(--link-color)}.invert:active{color:var(--link-color)}.invert:focus{outline:0}dl,ol,p,ul{margin-top:calc(var(--baseline) * 4 + .25vw)}blockquote,figure,hr,pre,table{margin-top:calc(var(--baseline) * 6 + .5vw);margin-bottom:calc(var(--baseline) * 6 + .5vw)}h1,h2,h3,h4,h5,h6{color:var(--headings-color);font-family:var(--heading-font);font-variation-settings:"wght" var(--headings-weight);font-style:var(--headings-style);-ms-hyphens:manual;hyphens:manual;letter-spacing:var(--headings-letter-spacing);line-height:var(--headings-line-height);margin-top:calc(var(--baseline) * 6 + 1vw);text-transform:var(--headings-transform)}.h1,h1{font-size:clamp(1.5710900065rem, 1.5710900065rem + 1.424540906 * (100vw - 20rem) / 70, 2.9956309125rem);font-family:var(--heading-font)}.h2,h2{font-size:clamp(1.3808408252rem, 1.3808408252rem + .9332127447 * (100vw - 20rem) / 70, 2.3140535699rem)}.h3,h3{font-size:clamp(1.2136296308rem, 1.2136296308rem + .4621997101 * (100vw - 20rem) / 70, 1.6758293408rem)}.h4,h4{font-size:clamp(1.1377777785rem, 1.1377777785rem + .1567604947 * (100vw - 20rem) / 70, 1.2945382732rem)}.h5,h5{font-size:clamp(1.066666667rem, 1.066666667rem + .0711111115 * (100vw - 20rem) / 70, 1.1377777785rem)}.h6,h6{font-size:clamp(1rem, 1rem + 0 * (100vw - 20rem) / 70, 1rem)}h2+*,h3+*,h4+*,h5+*,h6+*{margin-top:calc(var(--baseline) * 2 + .25vw)}b,strong{font-variation-settings:"wght" var(--font-weight-bold)}blockquote{border-top:2px solid var(--dark);border-bottom:2px solid var(--dark);color:var(--headings-color);font-family:var(--heading-font);font-style:italic;font-variation-settings:"wght" var(--font-weight-bold);padding:calc(var(--baseline) * 6 + 1vw) 2rem;font-size:clamp(1.1377777785rem, 1.1377777785rem + .1567604947 * (100vw - 20rem) / 70, 1.2945382732rem)}blockquote>:first-child{margin-top:0}ol,ul{margin-left:3ch}ol>li,ul>li{list-style:inherit;padding:0 0 var(--baseline) 1ch}dl dt{font-variation-settings:"wght" var(--font-weight-bold)}pre{background-color:var(--lighter);font-size:.8239746086rem;padding:calc(var(--baseline) * 6);white-space:pre-wrap;word-wrap:break-word}pre>code{color:var(--text-color);display:inline-block;font-size:inherit;padding:0}code{background-color:var(--lighter);color:var(--color);font-size:.8239746086rem;font-family:Menlo,Monaco,Consolas,Courier New,monospace}table{border:1px solid var(--light);border-collapse:collapse;border-spacing:0;vertical-align:top;text-align:left;width:100%}table th{font-variation-settings:"wght" var(--font-weight-bold);padding:calc(var(--baseline) * 2.5) calc(var(--baseline) * 4)}table td{border-top:1px solid var(--light);padding:calc(var(--baseline) * 2.5) calc(var(--baseline) * 4)}.table-striped tr:nth-child(2n){background:var(--lighter)}.table-bordered td,.table-bordered th{border:1px solid var(--light)}.table-title th{background:var(--lighter)}figcaption{clear:both;color:var(--gray);font-style:italic;font-size:.7241964329rem;padding:calc(var(--baseline) * 3) 0 0;text-align:center}kbd{background:var(--dark);border-radius:2px;color:var(--white);font-family:Menlo,Monaco,Consolas,Courier New,monospace;font-size:.8789062495rem;padding:calc(var(--baseline) * .5) calc(var(--baseline) * 1.5)}sub,sup{font-size:65%}small{font-size:.8789062495rem}.separator,hr{background:0 0;border:none;height:auto;line-height:1;max-width:none;text-align:center}.separator::before,hr::before{content:"•••";color:var(--dark);font-size:1rem;font-variation-settings:"wght" var(--font-weight-bold);letter-spacing:1.1377777785rem;padding-left:1.1377777785rem}.separator--dot::before{content:"•";color:var(--dark);font-size:1rem;font-variation-settings:"wght" var(--font-weight-bold);letter-spacing:1.1377777785rem;padding-left:1.1377777785rem}.separator--long-line{position:relative}.separator--long-line::before{content:"";height:1rem}.separator--long-line::after{border-top:1px solid var(--light);content:"";height:1px;position:absolute;width:100%;top:50%;left:0}.btn,[type=button],[type=submit],button{align-items:center;background:0 0;border:1px solid var(--dark);border-radius:calc(var(--border-radius) * 10);color:var(--dark);cursor:pointer;display:inline-flex;font-family:var(--menu-font);font-size:.8239746086rem;font-variation-settings:"wght" var(--font-weight-bold);overflow:hidden;padding:calc(var(--baseline) * 2) calc(var(--baseline) * 4);text-align:center;-webkit-transition:all .24s ease-out;transition:all .24s ease-out;vertical-align:middle;will-change:transform}@media all and (max-width:19.9375em){.btn,[type=button],[type=submit],button{width:100%}}.btn:active,.btn:focus,.btn:hover,[type=button]:active,[type=button]:focus,[type=button]:hover,[type=submit]:active,[type=submit]:focus,[type=submit]:hover,button:active,button:focus,button:hover{background-color:var(--dark);color:var(--helper)}.btn--icon{gap:.3rem;justify-content:center}.btn--icon svg{stroke:currentColor}@media all and (min-width:20em){.btn+.btn,.btn+[type=button],.btn+[type=submit],.btn+button,[type=button]+.btn,[type=button]+[type=button],[type=button]+[type=submit],[type=button]+button,[type=submit]+.btn,[type=submit]+[type=button],[type=submit]+[type=submit],[type=submit]+button,button+.btn,button+[type=button],button+[type=submit],button+button{margin-left:calc(var(--baseline) * 2)}}@media all and (max-width:37.4375em){.btn+.btn,.btn+[type=button],.btn+[type=submit],.btn+button,[type=button]+.btn,[type=button]+[type=button],[type=button]+[type=submit],[type=button]+button,[type=submit]+.btn,[type=submit]+[type=button],[type=submit]+[type=submit],[type=submit]+button,button+.btn,button+[type=button],button+[type=submit],button+button{margin-bottom:calc(var(--baseline) * 2)}}.btn:disabled,.btn[disabled],[disabled][type=button],[disabled][type=submit],[type=button]:disabled,[type=submit]:disabled,button:disabled,button[disabled]{background-color:var(--light);border-color:var(--light);color:var(--gray);cursor:not-allowed;pointer-events:none}[type=button],[type=submit],button{-webkit-appearance:none;-moz-appearance:none}::-webkit-search-cancel-button{-webkit-appearance:none}fieldset{border:1px solid var(--light);margin:calc(var(--baseline) * 6 + 1vw) 0 0;padding:calc(var(--baseline) * 6)}fieldset>legend{margin-left:-1rem;padding:0 1rem}legend{font-variation-settings:"wght" 500;padding:0}label{font-variation-settings:"wght" 500;margin:0 calc(var(--baseline) * 4) calc(var(--baseline) * 3) 0}[type=email],[type=number],[type=search],[type=tel],[type=text],[type=url],select,textarea{background-color:var(--page-bg);border:none;border:1px solid var(--light);color:var(--text-color);font-size:1rem;outline:0;padding:calc(var(--baseline) * 1.2) calc(var(--baseline) * 3);vertical-align:middle;width:100%;-webkit-appearance:none;-moz-appearance:none}@media all and (min-width:37.5em){[type=email],[type=number],[type=search],[type=tel],[type=text],[type=url],select,textarea{width:auto}}[type=email]:focus,[type=number]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=url]:focus,select:focus,textarea:focus{border-color:var(--dark)}input[type=checkbox],input[type=radio]{opacity:0;position:absolute}input[type=checkbox]+label,input[type=radio]+label{position:relative;margin-left:-1px;cursor:pointer;padding:0}input[type=checkbox]+label:before,input[type=radio]+label:before{background-color:var(--white);border:1px solid var(--light);border-radius:2px;content:"";display:inline-block;height:calc(var(--baseline) * 5);line-height:calc(var(--baseline) * 5);margin-right:calc(var(--baseline) * 4);vertical-align:middle;text-align:center;width:calc(var(--baseline) * 5)}input[type=checkbox]:checked+label:before,input[type=radio]:checked+label:before{content:"";background-image:url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 11 8'%3e%3cpolygon points='9.53 0 4.4 5.09 1.47 2.18 0 3.64 2.93 6.54 4.4 8 5.87 6.54 11 1.46 9.53 0' fill='%23d73a42'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:11px 8px;background-position:50% 50%}input[type=radio]+label:before{border-radius:50%}input[type=radio]:checked+label:before{background-image:url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3ccircle cx='4' cy='4' r='4' fill='%23d73a42'/%3e%3c/svg%3e")}[type=file]{margin-bottom:calc(var(--baseline) * 6);width:100%}select{max-width:100%;width:auto;position:relative}select:not([multiple]){background:url('data:image/svg+xml;utf8,') no-repeat 90% 50%;background-size:8px;padding-right:calc(var(--baseline) * 12)}select[multiple]{border:1px solid var(--light);padding:calc(var(--baseline) * 6);width:100%}select[multiple]:hover{border-color:var(--light)}select[multiple]:focus{border-color:var(--dark)}select[multiple]:disabled{background-color:var(--light);cursor:not-allowed}select[multiple]:disabled:hover{border-color:var(--light)}textarea{display:block;overflow:auto;resize:vertical;max-width:100%}.top{align-items:center;display:flex;height:var(--navbar-height);position:relative;padding:0 var(--page-margin);-webkit-transition:background .5s ease;transition:background .5s ease;width:100%;z-index:2}@media all and (min-width:56.25em){.top{justify-content:space-between;height:var(--navbar-height)}}.top.sticky{background:var(--page-bg);position:sticky;top:-100px;-webkit-animation:slideDown .5s cubic-bezier(.17,.67,0,1) forwards;animation:slideDown .5s cubic-bezier(.17,.67,0,1) forwards}@-webkit-keyframes slideDown{from{opacity:0;top:-100px}to{opacity:1;top:0}}@keyframes slideDown{from{opacity:0;top:-100px}to{opacity:1;top:0}}.logo{color:var(--logo-color)!important;font-size:1.2136296308rem;font-family:var(--logo-font);font-variation-settings:"wght" var(--font-weight-bold);margin-right:auto;order:1}.logo>img{height:var(--navbar-height);-o-object-fit:contain;object-fit:contain;padding:calc(var(--baseline) * 2) 0;width:auto}.search{order:2}@media all and (min-width:56.25em){.search{order:3}}.search__btn{border-color:var(--light);margin:0;height:2.2rem;padding:0;width:2.2rem}@media all and (min-width:56.25em){.search__btn{margin-left:2rem}}.search__btn:focus,.search__btn:hover{border-color:var(--dark)}.search__form{display:flex;justify-content:space-between;width:100%}.search__form button{width:auto;flex-shrink:0}.search__input{background:0 0;border:none;border-bottom:1px solid var(--dark);display:block;font-family:var(--heading-font);padding:0;width:90%}.search__overlay{background-color:var(--page-bg);-webkit-box-shadow:0 3px 30px rgba(0,0,0,.05);box-shadow:0 3px 30px rgba(0,0,0,.05);left:0;opacity:0;position:fixed;-webkit-transition:all .24s ease-out;transition:all .24s ease-out;top:0;visibility:hidden;width:100%;z-index:2005}.search__overlay-inner{-webkit-animation:slideininput .24s 1s forwards;animation:slideininput .24s 1s forwards;align-items:center;display:flex;height:calc(var(--navbar-height) * 3);justify-content:space-between;padding:0 var(--page-margin);opacity:0;scale:0.9}@-webkit-keyframes slideininput{60%{opacity:0;scale:0.9}100%{opacity:1;scale:1}}@keyframes slideininput{60%{opacity:0;scale:0.9}100%{opacity:1;scale:1}}.search__overlay.expanded{-webkit-transform:translate(0,0);transform:translate(0,0);opacity:1;display:block;visibility:visible}.navbar{order:3}.navbar .navbar__menu{display:flex;flex-wrap:wrap;list-style:none;margin:0;padding:0}@media all and (max-width:56.1875em){.navbar .navbar__menu{display:none}}.navbar .navbar__menu li{font-family:var(--menu-font);display:block;font-size:.8789062495rem;line-height:var(--line-height);font-variation-settings:"wght" 500;padding:0;position:relative;width:auto}.navbar .navbar__menu li a,.navbar .navbar__menu li span[aria-haspopup=true]{color:var(--nav-link-color);display:block;padding:0 .6rem;-webkit-transition:all .24s ease-out;transition:all .24s ease-out}.navbar .navbar__menu li a:active,.navbar .navbar__menu li a:focus,.navbar .navbar__menu li a:hover,.navbar .navbar__menu li span[aria-haspopup=true]:active,.navbar .navbar__menu li span[aria-haspopup=true]:focus,.navbar .navbar__menu li span[aria-haspopup=true]:hover{color:var(--nav-link-color-hover)}.navbar .navbar__menu li span{color:var(--nav-link-color);cursor:default;display:block;padding:0 .6rem}.navbar .navbar__menu>li:hover>a,.navbar .navbar__menu>li:hover>span[aria-haspopup=true]{color:var(--nav-link-color-hover)}.navbar .has-submenu:active>.navbar__submenu,.navbar .has-submenu:focus>.navbar__submenu,.navbar .has-submenu:hover>.navbar__submenu{left:0;opacity:1;-webkit-transform:scale(1);transform:scale(1);visibility:visible;margin-top:.8rem}.navbar .has-submenu:active>.navbar__submenu:before,.navbar .has-submenu:focus>.navbar__submenu:before,.navbar .has-submenu:hover>.navbar__submenu:before{content:"";height:1rem;left:0;position:absolute;width:100%;top:-1rem}.navbar .has-submenu:active>.navbar__submenu.is-right-submenu,.navbar .has-submenu:focus>.navbar__submenu.is-right-submenu,.navbar .has-submenu:hover>.navbar__submenu.is-right-submenu{left:auto;right:0;-webkit-transform-origin:right top;transform-origin:right top}.navbar .has-submenu .has-submenu:active>.navbar__submenu,.navbar .has-submenu .has-submenu:focus>.navbar__submenu,.navbar .has-submenu .has-submenu:hover>.navbar__submenu{top:0;margin-top:0}.navbar .has-submenu .has-submenu:active>.navbar__submenu.is-right-submenu,.navbar .has-submenu .has-submenu:focus>.navbar__submenu.is-right-submenu,.navbar .has-submenu .has-submenu:hover>.navbar__submenu.is-right-submenu{top:0;margin-top:0}.navbar .navbar__submenu{background:var(--lighter);border-radius:calc(var(--border-radius) * 4);left:-9999px;list-style-type:none;margin:0;padding:1rem .85rem;position:absolute;visibility:hidden;white-space:nowrap;z-index:1;opacity:0;-webkit-transform:scale(.8);transform:scale(.8);-webkit-transform-origin:0 top;transform-origin:0 top;-webkit-transition:opacity .15s,-webkit-transform .3s cubic-bezier(.275, 1.375, .8, 1);transition:opacity .15s,-webkit-transform .3s cubic-bezier(.275, 1.375, .8, 1);transition:opacity .15s,transform .3s cubic-bezier(.275, 1.375, .8, 1);transition:opacity .15s,transform .3s cubic-bezier(.275, 1.375, .8, 1),-webkit-transform .3s cubic-bezier(.275, 1.375, .8, 1)}.navbar .navbar__submenu__submenu{z-index:2}.navbar .navbar__submenu li{line-height:1.5;font-size:.8789062495rem}.navbar .navbar__submenu li a,.navbar .navbar__submenu li span[aria-haspopup=true]{border-radius:calc(var(--border-radius) * 3);color:var(--nav-link-color-hover);padding:.5rem 1rem;-webkit-transition:all .24s ease;transition:all .24s ease}.navbar .navbar__submenu li a:active,.navbar .navbar__submenu li a:focus,.navbar .navbar__submenu li a:hover,.navbar .navbar__submenu li span[aria-haspopup=true]:active,.navbar .navbar__submenu li span[aria-haspopup=true]:focus,.navbar .navbar__submenu li span[aria-haspopup=true]:hover{background:var(--page-bg);color:var(--nav-link-color)}.navbar .navbar__submenu li span{color:var(--nav-link-color-hover)!important;padding:.5rem 1rem}.navbar .navbar__submenu li:hover>a,.navbar .navbar__submenu li:hover>span[aria-haspopup=true]{color:var(--nav-link-color)}.navbar .navbar__toggle{background:var(--black);-webkit-box-shadow:none;box-shadow:none;border:none;cursor:pointer;display:block;line-height:1;margin:0;overflow:visible;padding:0;position:relative;right:0;margin-left:.75rem;text-transform:none;z-index:2004;height:3.2rem;padding:0;width:3.2rem}@media all and (min-width:56.25em){.navbar .navbar__toggle{display:none}}.navbar .navbar__toggle:focus,.navbar .navbar__toggle:hover{-webkit-box-shadow:none;box-shadow:none;outline:0;-webkit-transform:none;transform:none}.navbar .navbar__toggle-box{width:20px;height:14px;display:inline-block;position:relative}.navbar .navbar__toggle-inner{display:block;top:50%;text-indent:-9999999em}.navbar .navbar__toggle-inner::before{content:"";display:block;top:-5px}.navbar .navbar__toggle-inner::after{content:"";display:block;bottom:-5px}.navbar .navbar__toggle-inner,.navbar .navbar__toggle-inner::after,.navbar .navbar__toggle-inner::before{width:20px;height:1px;background-color:var(--white);position:absolute;-webkit-transition:opacity .14s ease-out,-webkit-transform;transition:opacity .14s ease-out,-webkit-transform;transition:transform,opacity .14s ease-out;transition:transform,opacity .14s ease-out,-webkit-transform}.navbar .navbar__toggle-inner{-webkit-transition-duration:75ms;transition-duration:75ms;-webkit-transition-timing-function:cubic-bezier(0.55,0.055,0.675,0.19);transition-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}.navbar .navbar__toggle-inner::before{-webkit-transition:top 75ms ease .12s,opacity 75ms ease;transition:top 75ms ease .12s,opacity 75ms ease}.navbar .navbar__toggle-inner::after{-webkit-transition:bottom 75ms ease .12s,-webkit-transform 75ms cubic-bezier(.55, .055, .675, .19);transition:bottom 75ms ease .12s,-webkit-transform 75ms cubic-bezier(.55, .055, .675, .19);transition:bottom 75ms ease .12s,transform 75ms cubic-bezier(.55, .055, .675, .19);transition:bottom 75ms ease .12s,transform 75ms cubic-bezier(.55, .055, .675, .19),-webkit-transform 75ms cubic-bezier(.55, .055, .675, .19)}.navbar .navbar__toggle.is-active .navbar__toggle-inner{-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-transition-delay:0.12s;transition-delay:0.12s;-webkit-transition-timing-function:cubic-bezier(0.215,0.61,0.355,1);transition-timing-function:cubic-bezier(0.215,0.61,0.355,1)}.navbar .navbar__toggle.is-active .navbar__toggle-inner::before{top:0;opacity:0;-webkit-transition:top 75ms ease,opacity 75ms ease .12s;transition:top 75ms ease,opacity 75ms ease .12s}.navbar .navbar__toggle.is-active .navbar__toggle-inner::after{bottom:0;-webkit-transform:rotate(-90deg);transform:rotate(-90deg);-webkit-transition:bottom 75ms ease,-webkit-transform 75ms cubic-bezier(.215, .61, .355, 1) .12s;transition:bottom 75ms ease,-webkit-transform 75ms cubic-bezier(.215, .61, .355, 1) .12s;transition:bottom 75ms ease,transform 75ms cubic-bezier(.215, .61, .355, 1) .12s;transition:bottom 75ms ease,transform 75ms cubic-bezier(.215, .61, .355, 1) .12s,-webkit-transform 75ms cubic-bezier(.215, .61, .355, 1) .12s}.navbar_mobile_overlay{background:var(--page-bg);height:calc(100vh - 4.4rem);left:0;opacity:1;overflow:auto;pointer-events:auto;position:fixed;top:4.4rem;-webkit-transition:all .3s cubic-bezier(0, 0, .3, 1);transition:all .3s cubic-bezier(0, 0, .3, 1);width:100%;z-index:1001}.navbar_mobile_overlay.is-hidden{opacity:0;pointer-events:none}.navbar_mobile_overlay .navbar__menu{margin:24px}.navbar_mobile_overlay .navbar__menu li{list-style:none;margin:0;padding:0;text-align:center}.navbar_mobile_overlay .navbar__menu li a,.navbar_mobile_overlay .navbar__menu li span{color:var(--dark);display:block;padding:calc(var(--baseline) * 2);position:relative}.navbar_mobile_overlay .navbar__menu li a:active,.navbar_mobile_overlay .navbar__menu li a:focus,.navbar_mobile_overlay .navbar__menu li a:hover,.navbar_mobile_overlay .navbar__menu li span:active,.navbar_mobile_overlay .navbar__menu li span:focus,.navbar_mobile_overlay .navbar__menu li span:hover{color:var(--dark)}.navbar_mobile_overlay .navbar__menu li a[aria-haspopup=true]::after,.navbar_mobile_overlay .navbar__menu li span[aria-haspopup=true]::after{content:"";width:0;height:0;border-style:solid;border-width:5px 5px 0 5px;border-color:currentColor transparent transparent transparent;left:calc(var(--baseline) * 2);top:15px;position:relative}.navbar_mobile_overlay .navbar__submenu{margin:0;padding:0;visibility:hidden}.navbar_mobile_overlay .navbar__submenu[aria-hidden=false]{visibility:visible}.navbar_mobile_overlay .navbar__submenu_wrapper{height:0;opacity:0;overflow:hidden;-webkit-transition:all .3s cubic-bezier(.275, 1.375, .8, 1);transition:all .3s cubic-bezier(.275, 1.375, .8, 1)}.navbar_mobile_overlay .navbar__submenu_wrapper.is-active{height:auto;opacity:1}.navbar_mobile_sidebar{background:var(--page-bg);-webkit-box-shadow:0 0 5px rgba(0,0,0,.25);box-shadow:0 0 5px rgba(0,0,0,.25);height:100vh;left:0;max-width:400px;overflow:auto;position:fixed;top:0;-webkit-transition:all .3s cubic-bezier(0, 0, .3, 1);transition:all .3s cubic-bezier(0, 0, .3, 1);width:80%;z-index:1001}.navbar_mobile_sidebar.is-hidden{left:-400px}.navbar_mobile_sidebar .navbar__menu{margin:24px}.navbar_mobile_sidebar .navbar__menu li{font-family:var(--menu-font);font-size:16px;list-style:none;line-height:1.3;margin:0;padding:0}.navbar_mobile_sidebar .navbar__menu li .is-separator,.navbar_mobile_sidebar .navbar__menu li a{color:var(--dark);display:block;padding:10px 20px 10px 0;position:relative}.navbar_mobile_sidebar .navbar__menu li .is-separator:active,.navbar_mobile_sidebar .navbar__menu li .is-separator:focus,.navbar_mobile_sidebar .navbar__menu li .is-separator:hover,.navbar_mobile_sidebar .navbar__menu li a:active,.navbar_mobile_sidebar .navbar__menu li a:focus,.navbar_mobile_sidebar .navbar__menu li a:hover{color:var(--dark)}.navbar_mobile_sidebar .navbar__menu li .is-separator[aria-haspopup=true]::after,.navbar_mobile_sidebar .navbar__menu li a[aria-haspopup=true]::after{content:"";width:0;height:0;border-style:solid;border-width:5px 5px 0 5px;border-color:currentColor transparent transparent transparent;right:0;top:18px;position:absolute}.navbar_mobile_sidebar .navbar__submenu{margin:0 0 0 24px;padding:0;visibility:hidden}.navbar_mobile_sidebar .navbar__submenu[aria-hidden=false]{visibility:visible}.navbar_mobile_sidebar .navbar__submenu_wrapper{height:0;opacity:0;overflow:hidden;-webkit-transition:all .3s cubic-bezier(.275, 1.375, .8, 1);transition:all .3s cubic-bezier(.275, 1.375, .8, 1)}.navbar_mobile_sidebar .navbar__submenu_wrapper.is-active{height:auto;opacity:1}.navbar_mobile_sidebar__overlay{background:rgba(0,0,0,.5);height:100%;opacity:1;pointer-events:auto;position:fixed;top:0;-webkit-transition:all .3s cubic-bezier(0, 0, .3, 1);transition:all .3s cubic-bezier(0, 0, .3, 1);width:100%;z-index:10}.navbar_mobile_sidebar__overlay.is-hidden{opacity:0;pointer-events:none}.wrapper{-webkit-box-sizing:content-box;box-sizing:content-box;max-width:var(--page-width);margin-left:auto;margin-right:auto;padding-left:var(--page-margin);padding-right:var(--page-margin)}.entry-wrapper{-webkit-box-sizing:content-box;box-sizing:content-box;max-width:var(--entry-width);margin-left:auto;margin-right:auto;padding-left:var(--page-margin);padding-right:var(--page-margin)}.hero{position:relative;z-index:1}.hero--noimage::after{background:var(--dark);content:"";display:block;height:1px;bottom:0;width:calc(100% - var(--page-margin) * 2);z-index:-1;max-width:var(--page-width);position:absolute;left:50%;-webkit-transform:translate(-50%,0);transform:translate(-50%,0)}.hero__content{padding-bottom:calc(var(--baseline) * 6 + 1.5vw)}.hero__content h1>sup{font-size:1.066666667rem;vertical-align:top}.hero__content--centered{text-align:center}.hero__content--centered .content__meta{justify-content:center}.hero__cta{margin-top:calc(var(--baseline) * 6)}.hero__image{margin:0 var(--page-margin)}.hero__image-wrapper{position:relative;background:var(--lighter);border-radius:calc(var(--border-radius) * 4)}@media all and (min-width:56.25em){.hero__image-wrapper{height:var(--hero-height)}}.hero__image-wrapper img{border-radius:inherit;display:block;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}@media all and (min-width:56.25em){.hero__image-wrapper img{height:var(--hero-height)}}.hero__image>figcaption{background:var(--page-bg)}@media all and (min-width:56.25em){.hero__image>figcaption{text-align:right}}.feed__item{display:flex;flex-wrap:wrap;gap:calc(2rem + 2vw);margin-top:calc(var(--baseline) * 12 + 2vw)}@media all and (min-width:37.5em){.feed__item{flex-wrap:nowrap}}.feed__item--centered{justify-content:center}.feed__content{max-width:var(--entry-width)}.feed__image{background:var(--lighter);border-radius:calc(var(--border-radius) * 4);flex-shrink:0;height:100%;margin:0;width:100%}@media all and (min-width:37.5em){.feed__image{height:calc(var(--feed-image-size) + 4vw);width:calc(var(--feed-image-size) + 4vw)}}.feed__image>img{border-radius:inherit;display:inline-block;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.feed__image--wide{max-width:var(--page-width)}.feed__meta{align-items:center;color:var(--gray);display:flex;font-size:.8239746086rem;margin-bottom:calc(var(--baseline) * 3)}.feed__author{font-family:var(--menu-font);font-variation-settings:"wght" var(--font-weight-bold);text-decoration:none}.feed__author-thumb{border-radius:50%;height:1.7rem;margin-right:.6rem;width:1.7rem}.feed__date{color:var(--gray);font-style:italic}.feed__author+.feed__date{margin-left:.8rem}.feed__author+.feed__date::before{content:"";background:var(--light);display:inline-block;height:1px;margin-right:4px;width:1rem;vertical-align:middle}.feed__readmore{margin-top:calc(var(--baseline) * 4 + .25vw)}.feed__title{margin-top:0}.feed--grid{margin:0}@media all and (min-width:37.5em){.feed--grid{display:grid;grid-template-columns:100%;gap:0 3rem}}@media all and (min-width:56.25em){.feed--grid{grid-template-columns:repeat(2,1fr)}}.feed--grid h2{margin-top:0}.feed--grid sup{font-size:1.066666667rem;vertical-align:top}.feed--grid li{align-items:center;list-style:none;gap:2rem;padding:0}.content__meta{margin-top:calc(var(--baseline) * 4 + .25vw);margin-bottom:0}.content__meta--centered{justify-content:center}.content__entry{margin-top:calc(var(--baseline) * 6 + 1.5vw)}.content__entry>:first-child{margin-top:0}.content__entry a:not(.btn):not([type=button]):not([type=submit]):not(button):not(.post__toc a):not(.gallery__item a){color:var(--link-color-hover);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:0.2em;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto}.content__entry a:not(.btn):not([type=button]):not([type=submit]):not(button):not(.post__toc a):not(.gallery__item a):active,.content__entry a:not(.btn):not([type=button]):not([type=submit]):not(button):not(.post__toc a):not(.gallery__item a):focus,.content__entry a:not(.btn):not([type=button]):not([type=submit]):not(button):not(.post__toc a):not(.gallery__item a):hover{color:var(--link-color)}.content__entry--nospace{margin-top:0}.content__avatar-thumbs{border-radius:50%;height:4.5rem;width:4.5rem}.content__footer{margin-top:calc(var(--baseline) * 9 + 1vw)}.content__updated{color:var(--gray);font-size:.8789062495rem;font-style:italic}.content__actions{align-items:baseline;display:flex;flex-basis:auto;gap:2rem;justify-content:space-between;margin-top:calc(var(--baseline) * 4 + .25vw);position:relative}.content__share{flex-shrink:0}.content__share-button{border-color:var(--light)}.content__share-popup{background:var(--lighter);border-radius:calc(var(--border-radius) * 4);bottom:140%;display:none;padding:1rem .85rem;position:absolute;right:0;text-align:left;z-index:1}.content__share-popup.is-visible{-webkit-animation:share-popup .48s cubic-bezier(.17,.67,.6,1.34) backwards;animation:share-popup .48s cubic-bezier(.17,.67,.6,1.34) backwards;display:block}@-webkit-keyframes share-popup{from{-webkit-transform:scale(.9);transform:scale(.9)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes share-popup{from{-webkit-transform:scale(.9);transform:scale(.9)}to{-webkit-transform:scale(1);transform:scale(1)}}.content__share-popup>a{border-radius:calc(var(--border-radius) * 3);color:var(--text-color);display:block;font-family:var(--menu-font);font-size:.8239746086rem;padding:.4rem .8rem}.content__share-popup>a:hover{background:var(--page-bg);color:var(--text-color);text-decoration:none}.content__share-popup>a>svg{fill:var(--text-color);display:inline-block;height:.9rem;margin-right:.5666666667rem;pointer-events:none;vertical-align:middle;width:.9rem}.content__tag{margin:0;font-family:var(--menu-font);font-size:.8239746086rem}.content__tag>li{display:inline-flex;margin:.3rem .3rem .3rem 0;padding:0}.content__tag>li>a{border:1px solid var(--light);border-radius:calc(var(--border-radius) * 10);color:var(--dark);font-size:.7241964329rem;font-variation-settings:"wght" var(--font-weight-normal);padding:calc(var(--baseline) * 1) calc(var(--baseline) * 2.5)}.content__tag>li>a:hover{border-color:var(--dark)}.content__bio{display:flex;margin:calc(var(--baseline) * 12 + 1vw) 0}@media all and (min-width:37.5em){.content__bio{align-items:center}}@media all and (min-width:37.5em){.content__bio::before{content:"";border-top:1px solid var(--light);height:1px;margin-right:2rem;width:30%}}.bio__avatar{border-radius:50%;flex-shrink:0;height:2.5rem;margin-right:1.2rem;width:2.5rem}@media all and (min-width:37.5em){.bio__avatar{height:4rem;margin-right:2rem;width:4rem}}.bio__name{margin:0}.bio__desc{font-family:var(--body-font);font-size:.8789062495rem;line-height:1.5}.bio__desc>:first-child{margin-top:calc(var(--baseline) * 2)}.bio__desc a{text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:0.2em;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto}.bio__desc a{color:var(--link-color-hover);-webkit-transition:all .24s ease-out;transition:all .24s ease-out}.bio__desc a:hover{color:var(--link-color)}.bio__desc a:active{color:var(--link-color)}.bio__desc a:focus{outline:0}.content__nav{margin-top:calc(var(--baseline) * 16 + 1vw)}.content__nav-inner{border-top:1px solid var(--dark);border-bottom:1px solid var(--dark);padding:calc(var(--baseline) * 16) 0}@media all and (min-width:37.5em){.content__nav-inner{display:flex;gap:1rem;justify-content:space-between}}@media all and (min-width:56.25em){.content__nav-inner{gap:2rem}}@media all and (max-width:37.4375em){.content__nav-prev+.content__nav-next{margin-top:calc(var(--baseline) * 6 + 1vw)}}@media all and (min-width:37.5em){.content__nav-next{margin-left:auto;text-align:right}}.content__nav-link{font-family:var(--heading-font);font-variation-settings:"wght" var(--font-weight-bold);font-style:italic;height:100%;line-height:1.5;display:flex;gap:1rem;justify-content:space-between;align-items:center}@media all and (min-width:37.5em){.content__nav-link{gap:2rem}}.content__nav-link>div{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}@media all and (min-width:56.25em){.content__nav-link>div{-webkit-line-clamp:4}}.content__nav-link span{color:var(--gray);display:block;font-size:.7724761953rem;font-family:var(--menu-font);font-style:normal;font-variation-settings:"wght" var(--font-weight-normal);margin-bottom:var(--baseline)}.content__nav-image{flex:1 0 4rem;margin:0;height:4rem}@media all and (min-width:37.5em) and (max-width:56.1875em){.content__nav-image{flex-basis:6rem;height:6rem}}@media all and (min-width:56.25em){.content__nav-image{flex-basis:8rem;height:8rem}}.content__nav-image>img{border-radius:calc(var(--border-radius) * 4);display:block;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.content__related{background:var(--lighter);margin-top:calc(var(--baseline) * 16 + 1vw);padding:calc(var(--baseline) * 12 + 3vw) 0}.related__title{margin-top:0}.content__comments{margin-top:calc(var(--baseline) * 9);overflow:hidden}.post__image{display:inline-block}.post__image a,.post__image img{border-radius:calc(var(--border-radius) * 4);display:inline-block}.post__image>figcaption{background-color:var(--page-bg)}.post__image--left{float:left;margin-bottom:0;margin-right:2rem;max-width:50%}.post__image--right{float:right;margin-bottom:0;margin-left:2rem;max-width:50%}.post__image--center{display:block;margin-left:auto;margin-right:auto;text-align:center}.post__image--wide{display:block}@media all and (min-width:56.25em){.post__image--wide{margin-left:calc(-50vw + 50%);margin-right:calc(-50vw + 50%);padding:0 var(--page-margin);text-align:center}.post__image--wide a,.post__image--wide img{display:block;height:auto;margin:auto;max-width:var(--page-width);width:100%}}.post__image--full{background-color:var(--lighter);display:block;margin-left:calc(-50vw + 50%);margin-right:calc(-50vw + 50%);text-align:center}.post__image--full a,.post__image--full img{border-radius:0;display:block;height:auto;width:100%}.post__iframe,.post__video{display:block;margin-top:calc(var(--baseline) * 6 + .5vw);margin-bottom:calc(var(--baseline) * 6 + .5vw);overflow:hidden;padding:0;position:relative;width:100%}.post__iframe::before,.post__video::before{display:block;content:"";padding-top:var(--embed-aspect-ratio)}.post__iframe iframe,.post__iframe video,.post__video iframe,.post__video video{border:none;height:100%;left:0;position:absolute;top:0;bottom:0;width:100%}.post__toc h3{border-bottom:1px solid var(--dark);font-size:1rem;margin:0;padding-bottom:calc(var(--baseline) * 2 + .25vw)}.post__toc ul{counter-reset:item;list-style:decimal;margin:calc(var(--baseline) * 3 + .25vw) 0 0 3ch}.post__toc ul li{counter-increment:item;padding:0}.post__toc ul ul{margin-top:0}.post__toc ul ul li{display:block}.post__toc ul ul li:before{content:counters(item, ".") ". ";margin-left:-3ch}.banner{text-align:center}.banner--after-content{margin-top:calc(var(--baseline) * 9 + 1vw)}.page__desc a{text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:0.2em;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto}@media all and (min-width:37.5em){.page--author__wrapper{display:flex;gap:2rem}}@media all and (min-width:56.25em){.page--author__wrapper{gap:3rem}}.page--author__avatar{border-radius:50%;height:calc(var(--baseline) * 10 + 2vw);margin-top:calc(var(--baseline) * 6 + 1vw);width:calc(var(--baseline) * 10 + 2vw)}.page--author__website{margin-top:calc(var(--baseline) * 4 + .25vw)}.page--search form{align-items:flex-start;display:flex;flex-wrap:wrap}@media all and (max-width:37.4375em){.page--search input{margin-bottom:calc(var(--baseline) * 2)}}@media all and (min-width:20em){.page--search input{flex:1 0 auto;margin-right:calc(var(--baseline) * 2)}}@media all and (max-width:37.4375em){.page--search button{width:100%}}.subpages__title{border-top:1px solid var(--light);padding-top:calc(var(--baseline) * 6 + .5vw)}.subpages__list{list-style:initial;margin-left:2ch}.subpages__list ul{list-style:initial;margin:0 0 0 2ch}.subpages__list li{padding-bottom:0}.readmore{display:inline-block;color:var(--gray);font-size:.9374999997rem;font-style:italic;text-decoration:underline;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto}.align-left{text-align:left}.align-right{text-align:right}.align-center{text-align:center}.align-justify{text-align:justify}.msg{border:1px solid var(--light);border-left-width:2px;font-size:.9374999997rem;padding:calc(var(--baseline) * 6);position:relative}.msg--highlight{border-left-color:var(--highlight-color)}.msg--info{border-left-color:var(--info-color)}.msg--success{border-left-color:var(--success-color)}.msg--warning{border-left-color:var(--warning-color)}.ordered-list{counter-reset:listCounter}.ordered-list li{counter-increment:listCounter;list-style:none;padding-left:.3rem;position:relative}.ordered-list li::before{color:var(--color);content:counter(listCounter,decimal-leading-zero) ".";font-variation-settings:"wght" var(--font-weight-bold);left:-2rem;position:absolute}.dropcap:first-letter{color:var(--headings-color);float:left;font-size:3.6355864383rem;line-height:.7;margin-right:.6rem;padding:calc(var(--baseline) * 2) calc(var(--baseline) * 2) calc(var(--baseline) * 2) 0}.pec-wrapper{height:100%;left:0;position:absolute;top:0;width:100%}.pec-overlay{align-items:center;background-color:var(--lighter);font-size:14px;display:none;height:inherit;justify-content:center;line-height:1.4;padding:1rem;position:relative;text-align:center}@media all and (min-width:37.5em){.pec-overlay{font-size:16px;line-height:var(--line-height);padding:1rem 2rem}}.pec-overlay.is-active{display:flex}.pec-overlay-inner p{margin:0 0 1rem}.pagination{display:flex;gap:calc(var(--baseline) * 2);justify-content:center;margin-top:calc(var(--baseline) * 12 + 1vw)}@media all and (min-width:56.25em){.pagination{margin-top:calc(var(--baseline) * 18 + 1vw)}}.footer{border-top:1px solid var(--light);font-size:.9374999997rem;padding:calc(var(--baseline) * 9 + 1vw) 0 calc(var(--baseline) * 6 + 1vw);margin:calc(var(--baseline) * 12 + 1vw) auto 0;max-width:var(--page-width);text-align:center}.footer--glued{border:none;padding-top:0}.footer__nav ul{list-style:none;margin:0}.footer__nav ul li{display:inline-block;padding:var(--baseline) .5rem}*+.footer__social{margin-top:calc(var(--baseline) * 6 + .5vw)}.footer__social svg{fill:var(--dark);height:1rem;margin:0 .5rem;-webkit-transition:all .12s linear 0s;transition:all .12s linear 0s;width:1rem}.footer__social svg:hover{fill:var(--gray)}.footer__copyright{font-size:.8239746086rem;margin-top:var(--baseline)}.footer__copyright>:first-child{margin:0}.footer__bttop{background:var(--page-bg);bottom:calc(var(--baseline) * 5);border-radius:50%;border-color:var(--light);line-height:1;opacity:0;padding:calc(var(--baseline) * 2);position:fixed;right:2rem;text-align:center;width:auto!important;visibility:hidden;z-index:999}@media all and (min-width:56.25em){.footer__bttop{bottom:calc(var(--baseline) * 10)}}.footer__bttop:hover{border-color:var(--dark);opacity:1}.footer__bttop.is-visible{visibility:visible;opacity:1}.gallery{margin:calc(var(--baseline) * 6 + 1vw) calc(var(--gallery-gap) * -1)}@media all and (min-width:20em){.gallery{display:flex;flex-wrap:wrap}}@media all and (min-width:56.25em){.gallery-wrapper--wide{display:flex;justify-content:center;margin-left:calc(-50vw + 50%);margin-right:calc(-50vw + 50%);padding:0 var(--page-margin)}.gallery-wrapper--wide .gallery{max-width:var(--page-width)}}@media all and (min-width:56.25em){.gallery-wrapper--full{margin-left:calc(-50vw + 50%);margin-right:calc(-50vw + 50%);padding:0 var(--page-margin)}}@media all and (min-width:20em){.gallery[data-columns="1"] .gallery__item{flex:1 0 100%}}@media all and (min-width:30em){.gallery[data-columns="2"] .gallery__item{flex:1 0 50%}}@media all and (min-width:37.5em){.gallery[data-columns="3"] .gallery__item{flex:1 0 33.333%}}@media all and (min-width:56.25em){.gallery[data-columns="4"] .gallery__item{flex:0 1 25%}}@media all and (min-width:56.25em){.gallery[data-columns="5"] .gallery__item{flex:0 1 20%}}@media all and (min-width:56.25em){.gallery[data-columns="6"] .gallery__item{flex:0 1 16.666%}}@media all and (min-width:56.25em){.gallery[data-columns="7"] .gallery__item{flex:1 0 14.285%}}@media all and (min-width:56.25em){.gallery[data-columns="8"] .gallery__item{flex:1 0 12.5%}}.gallery__item{margin:0;padding:var(--gallery-gap);position:relative}@media all and (min-width:20em){.gallery__item{flex:1 0 50%}}@media all and (min-width:30em){.gallery__item{flex:1 0 33.333%}}@media all and (min-width:37.5em){.gallery__item{flex:1 0 25%}}.gallery__item a{border-radius:calc(var(--border-radius) * 4);display:block;height:100%;width:100%}.gallery__item a::after{background:-webkit-gradient(linear,left bottom,left top,from(rgba(0,0,0,.4)),to(rgba(0,0,0,0)));background:linear-gradient(to top,rgba(0,0,0,.4) 0,rgba(0,0,0,0) 100%);border-radius:inherit;bottom:var(--gallery-gap);content:"";display:block;opacity:0;left:var(--gallery-gap);height:calc(100% - var(--gallery-gap) * 2);position:absolute;right:var(--gallery-gap);top:var(--gallery-gap);-webkit-transition:all .24s ease-out;transition:all .24s ease-out;width:calc(100% - var(--gallery-gap) * 2)}.gallery__item a:hover::after{opacity:1}.gallery__item img{border-radius:inherit;display:block;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gallery__item figcaption{bottom:1.2rem;color:var(--white);left:50%;opacity:0;position:absolute;text-align:center;-webkit-transform:translate(-50%,1.2rem);transform:translate(-50%,1.2rem);-webkit-transition:all .24s ease-out;transition:all .24s ease-out}.gallery__item:hover figcaption{opacity:1;-webkit-transform:translate(-50%,0);transform:translate(-50%,0)}.pswp--dark .pswp__bg{background:#000}.pswp--dark .pswp__button,.pswp--dark .pswp__button--arrow--left:before,.pswp--dark .pswp__button--arrow--right:before{background-image:url(../svg/gallery-icons-light.svg)}.pswp--light .pswp__bg{background:var(--white)}.pswp--light .pswp__counter{color:var(--text-color)}.pswp--light .pswp__caption__center{color:var(--text-color)}.pswp--light .pswp__button,.pswp--light .pswp__button--arrow--left:before,.pswp--light .pswp__button--arrow--right:before{background-image:url(../svg/gallery-icons-dark.svg)}.pswp .pswp__button{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;transform:none}img[loading]{opacity:0}img.is-loaded{opacity:1;transition:opacity 1s cubic-bezier(.215, .61, .355, 1)}
\ No newline at end of file
+@font-face{font-family:Lora;src:url('../dynamic/fonts/lora/lora.woff2') format('woff2');font-weight:400 700;font-display:swap;font-style:normal}@font-face{font-family:Lora;src:url('../dynamic/fonts/lora/lora-italic.woff2') format('woff2');font-weight:400 700;font-display:swap;font-style:italic}:root{--page-margin:6vw;--page-width:66rem;--entry-width:42rem;--navbar-height:4.4rem;--border-radius:3px;--baseline:0.28333rem;--gallery-gap:calc(var(--baseline) * 1.5);--body-font:'Lora',serif;--heading-font:'Lora',serif;--logo-font:var(--body-font);--menu-font:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-size:clamp(1.1rem, 1.1rem + (0.09999999999999987 * ((100vw - 20rem) / 70)), 1.2rem);--font-weight-normal:400;--font-weight-bold:600;--line-height:1.7;--letter-spacing:0em;--headings-weight:500;--headings-transform:none;--headings-style:normal;--headings-letter-spacing:0em;--headings-line-height:1.2;--hero-height:50vh;--feed-image-size:8rem;--white:#FFFFFF;--black:#17181E;--helper:#FFFFFF;--dark:#17181E;--gray:#57585a;--light:#CACBCF;--lighter:#F3F3F3;--page-bg:#FFFFFF;--color:#D73A42;--text-color:#17181E;--headings-color:#17181E;--link-color:#17181E;--link-color-hover:#D73A42;--nav-link-color:#17181E;--nav-link-color-hover:#17181E;--logo-color:#17181E;--highlight-color:#FFC700;--info-color:#67B1F3;--success-color:#00A563;--warning-color:#EE4E4E}@media all and (min-width:56.25em){:root{--navbar-height:6rem}}@media (prefers-color-scheme:dark){:root{--white:#FFFFFF;--black:#1e1e1e;--helper:#1e1e1e;--dark:#CECBCB;--gray:#9D9D9D;--light:#373737;--lighter:#1e1e1e;--page-bg:#181818;--color:#FFC074;--text-color:#BFBFBF;--headings-color:#EEEDED;--link-color:#EEEDED;--link-color-hover:#FFC074;--nav-link-color:rgba(255,255,255,1);--nav-link-color-hover:rgba(255,255,255,.7);--logo-color:#FFFFFF;--highlight-color:#F6DC90;--info-color:#5B9ED5;--success-color:#54A468;--warning-color:#FB6762}}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0}article,aside,footer,header,hgroup,main,nav,section{display:block}li{list-style:none}img{height:auto;max-width:100%;vertical-align:top}button,input,select,textarea{font:inherit}address{font-style:normal}::-moz-selection{background:var(--color);color:var(--white)}::selection{background:var(--color);color:var(--white)}:focus-visible{outline:2px solid var(--color)!important;outline-offset:2px}html{font-size:var(--font-size);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;scroll-behavior:smooth}html.no-scroll{overflow:hidden;position:fixed}body{background:var(--page-bg);color:var(--text-color);font-family:var(--body-font);font-variation-settings:"wght" var(--font-weight-normal);letter-spacing:var(--letter-spacing);line-height:var(--line-height);-ms-scroll-chaining:none;overscroll-behavior:none}a{text-decoration:none}a{color:var(--link-color);-webkit-transition:all .24s ease-out;transition:all .24s ease-out}a:hover{color:var(--link-color-hover)}a:active{color:var(--link-color-hover)}a:focus{outline:0}.invert{color:var(--link-color-hover);-webkit-transition:all .24s ease-out;transition:all .24s ease-out}.invert:hover{color:var(--link-color)}.invert:active{color:var(--link-color)}.invert:focus{outline:0}dl,ol,p,ul{margin-top:calc(var(--baseline) * 4 + .25vw)}blockquote,figure,hr,pre,table{margin-top:calc(var(--baseline) * 6 + .5vw);margin-bottom:calc(var(--baseline) * 6 + .5vw)}h1,h2,h3,h4,h5,h6{color:var(--headings-color);font-family:var(--heading-font);font-variation-settings:"wght" var(--headings-weight);font-style:var(--headings-style);-ms-hyphens:manual;hyphens:manual;letter-spacing:var(--headings-letter-spacing);line-height:var(--headings-line-height);margin-top:calc(var(--baseline) * 6 + 1vw);text-transform:var(--headings-transform)}.h1,h1{font-size:clamp(1.5710900065rem, 1.5710900065rem + 1.424540906 * (100vw - 20rem) / 70, 2.9956309125rem);font-family:var(--heading-font)}.h2,h2{font-size:clamp(1.3808408252rem, 1.3808408252rem + .9332127447 * (100vw - 20rem) / 70, 2.3140535699rem)}.h3,h3{font-size:clamp(1.2136296308rem, 1.2136296308rem + .4621997101 * (100vw - 20rem) / 70, 1.6758293408rem)}.h4,h4{font-size:clamp(1.1377777785rem, 1.1377777785rem + .1567604947 * (100vw - 20rem) / 70, 1.2945382732rem)}.h5,h5{font-size:clamp(1.066666667rem, 1.066666667rem + .0711111115 * (100vw - 20rem) / 70, 1.1377777785rem)}.h6,h6{font-size:clamp(1rem, 1rem + 0 * (100vw - 20rem) / 70, 1rem)}h2+*,h3+*,h4+*,h5+*,h6+*{margin-top:calc(var(--baseline) * 2 + .25vw)}b,strong{font-variation-settings:"wght" var(--font-weight-bold)}blockquote{border-top:2px solid var(--dark);border-bottom:2px solid var(--dark);color:var(--headings-color);font-family:var(--heading-font);font-style:italic;font-variation-settings:"wght" var(--font-weight-bold);padding:calc(var(--baseline) * 6 + 1vw) 2rem;font-size:clamp(1.1377777785rem, 1.1377777785rem + .1567604947 * (100vw - 20rem) / 70, 1.2945382732rem)}blockquote>:first-child{margin-top:0}ol,ul{margin-left:3ch}ol>li,ul>li{list-style:inherit;padding:0 0 var(--baseline) 1ch}dl dt{font-variation-settings:"wght" var(--font-weight-bold)}pre{background-color:var(--lighter);font-size:.8239746086rem;padding:calc(var(--baseline) * 6);white-space:pre-wrap;word-wrap:break-word}pre>code{color:var(--text-color);display:inline-block;font-size:inherit;padding:0}code{background-color:var(--lighter);color:var(--color);font-size:.8239746086rem;font-family:Menlo,Monaco,Consolas,Courier New,monospace}table{border:1px solid var(--light);border-collapse:collapse;border-spacing:0;vertical-align:top;text-align:left;width:100%}table th{font-variation-settings:"wght" var(--font-weight-bold);padding:calc(var(--baseline) * 2.5) calc(var(--baseline) * 4)}table td{border-top:1px solid var(--light);padding:calc(var(--baseline) * 2.5) calc(var(--baseline) * 4)}.table-striped tr:nth-child(2n){background:var(--lighter)}.table-bordered td,.table-bordered th{border:1px solid var(--light)}.table-title th{background:var(--lighter)}figcaption{clear:both;color:var(--gray);font-style:italic;font-size:.7241964329rem;padding:calc(var(--baseline) * 3) 0 0;text-align:center}kbd{background:var(--dark);border-radius:2px;color:var(--white);font-family:Menlo,Monaco,Consolas,Courier New,monospace;font-size:.8789062495rem;padding:calc(var(--baseline) * .5) calc(var(--baseline) * 1.5)}sub,sup{font-size:65%}small{font-size:.8789062495rem}.separator,hr{background:0 0;border:none;height:auto;line-height:1;max-width:none;text-align:center}.separator::before,hr::before{content:"•••";color:var(--dark);font-size:1rem;font-variation-settings:"wght" var(--font-weight-bold);letter-spacing:1.1377777785rem;padding-left:1.1377777785rem}.separator--dot::before{content:"•";color:var(--dark);font-size:1rem;font-variation-settings:"wght" var(--font-weight-bold);letter-spacing:1.1377777785rem;padding-left:1.1377777785rem}.separator--long-line{position:relative}.separator--long-line::before{content:"";height:1rem}.separator--long-line::after{border-top:1px solid var(--light);content:"";height:1px;position:absolute;width:100%;top:50%;left:0}.btn,[type=button],[type=submit],button{align-items:center;background:0 0;border:1px solid var(--dark);border-radius:calc(var(--border-radius) * 10);color:var(--dark);cursor:pointer;display:inline-flex;font-family:var(--menu-font);font-size:.8239746086rem;font-variation-settings:"wght" var(--font-weight-bold);overflow:hidden;padding:calc(var(--baseline) * 2) calc(var(--baseline) * 4);text-align:center;-webkit-transition:all .24s ease-out;transition:all .24s ease-out;vertical-align:middle;will-change:transform}@media all and (max-width:19.9375em){.btn,[type=button],[type=submit],button{width:100%}}.btn:active,.btn:focus,.btn:hover,[type=button]:active,[type=button]:focus,[type=button]:hover,[type=submit]:active,[type=submit]:focus,[type=submit]:hover,button:active,button:focus,button:hover{background-color:var(--dark);color:var(--helper)}.btn--icon{gap:.3rem;justify-content:center}.btn--icon svg{stroke:currentColor}@media all and (min-width:20em){.btn+.btn,.btn+[type=button],.btn+[type=submit],.btn+button,[type=button]+.btn,[type=button]+[type=button],[type=button]+[type=submit],[type=button]+button,[type=submit]+.btn,[type=submit]+[type=button],[type=submit]+[type=submit],[type=submit]+button,button+.btn,button+[type=button],button+[type=submit],button+button{margin-left:calc(var(--baseline) * 2)}}@media all and (max-width:37.4375em){.btn+.btn,.btn+[type=button],.btn+[type=submit],.btn+button,[type=button]+.btn,[type=button]+[type=button],[type=button]+[type=submit],[type=button]+button,[type=submit]+.btn,[type=submit]+[type=button],[type=submit]+[type=submit],[type=submit]+button,button+.btn,button+[type=button],button+[type=submit],button+button{margin-bottom:calc(var(--baseline) * 2)}}.btn:disabled,.btn[disabled],[disabled][type=button],[disabled][type=submit],[type=button]:disabled,[type=submit]:disabled,button:disabled,button[disabled]{background-color:var(--light);border-color:var(--light);color:var(--gray);cursor:not-allowed;pointer-events:none}[type=button],[type=submit],button{-webkit-appearance:none;-moz-appearance:none}::-webkit-search-cancel-button{-webkit-appearance:none}fieldset{border:1px solid var(--light);margin:calc(var(--baseline) * 6 + 1vw) 0 0;padding:calc(var(--baseline) * 6)}fieldset>legend{margin-left:-1rem;padding:0 1rem}legend{font-variation-settings:"wght" 500;padding:0}label{font-variation-settings:"wght" 500;margin:0 calc(var(--baseline) * 4) calc(var(--baseline) * 3) 0}[type=email],[type=number],[type=search],[type=tel],[type=text],[type=url],select,textarea{background-color:var(--page-bg);border:none;border:1px solid var(--light);color:var(--text-color);font-size:1rem;outline:0;padding:calc(var(--baseline) * 1.2) calc(var(--baseline) * 3);vertical-align:middle;width:100%;-webkit-appearance:none;-moz-appearance:none}@media all and (min-width:37.5em){[type=email],[type=number],[type=search],[type=tel],[type=text],[type=url],select,textarea{width:auto}}[type=email]:focus,[type=number]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=url]:focus,select:focus,textarea:focus{border-color:var(--dark)}input[type=checkbox],input[type=radio]{opacity:0;position:absolute}input[type=checkbox]+label,input[type=radio]+label{position:relative;margin-left:-1px;cursor:pointer;padding:0}input[type=checkbox]+label:before,input[type=radio]+label:before{background-color:var(--white);border:1px solid var(--light);border-radius:2px;content:"";display:inline-block;height:calc(var(--baseline) * 5);line-height:calc(var(--baseline) * 5);margin-right:calc(var(--baseline) * 4);vertical-align:middle;text-align:center;width:calc(var(--baseline) * 5)}input[type=checkbox]:checked+label:before,input[type=radio]:checked+label:before{content:"";background-image:url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 11 8'%3e%3cpolygon points='9.53 0 4.4 5.09 1.47 2.18 0 3.64 2.93 6.54 4.4 8 5.87 6.54 11 1.46 9.53 0' fill='%23d73a42'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:11px 8px;background-position:50% 50%}input[type=radio]+label:before{border-radius:50%}input[type=radio]:checked+label:before{background-image:url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3ccircle cx='4' cy='4' r='4' fill='%23d73a42'/%3e%3c/svg%3e")}[type=file]{margin-bottom:calc(var(--baseline) * 6);width:100%}select{max-width:100%;width:auto;position:relative}select:not([multiple]){background:url('data:image/svg+xml;utf8,') no-repeat 90% 50%;background-size:8px;padding-right:calc(var(--baseline) * 12)}select[multiple]{border:1px solid var(--light);padding:calc(var(--baseline) * 6);width:100%}select[multiple]:hover{border-color:var(--light)}select[multiple]:focus{border-color:var(--dark)}select[multiple]:disabled{background-color:var(--light);cursor:not-allowed}select[multiple]:disabled:hover{border-color:var(--light)}textarea{display:block;overflow:auto;resize:vertical;max-width:100%}.top{align-items:center;display:flex;height:var(--navbar-height);position:relative;padding:0 var(--page-margin);-webkit-transition:background .5s ease;transition:background .5s ease;width:100%;z-index:2}@media all and (min-width:56.25em){.top{justify-content:space-between;height:var(--navbar-height)}}.top.sticky{background:var(--page-bg);position:sticky;top:-100px;-webkit-animation:slideDown .5s cubic-bezier(.17,.67,0,1) forwards;animation:slideDown .5s cubic-bezier(.17,.67,0,1) forwards}@-webkit-keyframes slideDown{from{opacity:0;top:-100px}to{opacity:1;top:0}}@keyframes slideDown{from{opacity:0;top:-100px}to{opacity:1;top:0}}.logo{color:var(--logo-color)!important;font-size:1.2136296308rem;font-family:var(--logo-font);font-variation-settings:"wght" var(--font-weight-bold);margin-right:auto;order:1}.logo>img{height:var(--navbar-height);-o-object-fit:contain;object-fit:contain;padding:calc(var(--baseline) * 2) 0;width:auto}.search{order:2}@media all and (min-width:56.25em){.search{order:3}}.search__btn{border-color:var(--light);margin:0;height:2.2rem;padding:0;width:2.2rem}@media all and (min-width:56.25em){.search__btn{margin-left:2rem}}.search__btn:focus,.search__btn:hover{border-color:var(--dark)}.search__form{display:flex;justify-content:space-between;width:100%}.search__form button{width:auto;flex-shrink:0}.search__input{background:0 0;border:none;border-bottom:1px solid var(--dark);display:block;font-family:var(--heading-font);padding:0;width:90%}.search__overlay{background-color:var(--page-bg);-webkit-box-shadow:0 3px 30px rgba(0,0,0,.05);box-shadow:0 3px 30px rgba(0,0,0,.05);left:0;opacity:0;position:fixed;-webkit-transition:all .24s ease-out;transition:all .24s ease-out;top:0;visibility:hidden;width:100%;z-index:2005}.search__overlay-inner{-webkit-animation:slideininput .24s 1s forwards;animation:slideininput .24s 1s forwards;align-items:center;display:flex;height:calc(var(--navbar-height) * 3);justify-content:space-between;padding:0 var(--page-margin);opacity:0;scale:0.9}@-webkit-keyframes slideininput{60%{opacity:0;scale:0.9}100%{opacity:1;scale:1}}@keyframes slideininput{60%{opacity:0;scale:0.9}100%{opacity:1;scale:1}}.search__overlay.expanded{-webkit-transform:translate(0,0);transform:translate(0,0);opacity:1;display:block;visibility:visible}.navbar{order:3}.navbar .navbar__menu{display:flex;flex-wrap:wrap;list-style:none;margin:0;padding:0}@media all and (max-width:56.1875em){.navbar .navbar__menu{display:none}}.navbar .navbar__menu li{font-family:var(--menu-font);display:block;font-size:.8789062495rem;line-height:var(--line-height);font-variation-settings:"wght" 500;padding:0;position:relative;width:auto}.navbar .navbar__menu li a,.navbar .navbar__menu li span[aria-haspopup=true]{color:var(--nav-link-color);display:block;padding:0 .6rem;-webkit-transition:all .24s ease-out;transition:all .24s ease-out}.navbar .navbar__menu li a:active,.navbar .navbar__menu li a:focus,.navbar .navbar__menu li a:hover,.navbar .navbar__menu li span[aria-haspopup=true]:active,.navbar .navbar__menu li span[aria-haspopup=true]:focus,.navbar .navbar__menu li span[aria-haspopup=true]:hover{color:var(--nav-link-color-hover)}.navbar .navbar__menu li span{color:var(--nav-link-color);cursor:default;display:block;padding:0 .6rem}.navbar .navbar__menu>li:hover>a,.navbar .navbar__menu>li:hover>span[aria-haspopup=true]{color:var(--nav-link-color-hover)}.navbar .has-submenu:active>.navbar__submenu,.navbar .has-submenu:focus>.navbar__submenu,.navbar .has-submenu:hover>.navbar__submenu{left:0;opacity:1;-webkit-transform:scale(1);transform:scale(1);visibility:visible;margin-top:.8rem}.navbar .has-submenu:active>.navbar__submenu:before,.navbar .has-submenu:focus>.navbar__submenu:before,.navbar .has-submenu:hover>.navbar__submenu:before{content:"";height:1rem;left:0;position:absolute;width:100%;top:-1rem}.navbar .has-submenu:active>.navbar__submenu.is-right-submenu,.navbar .has-submenu:focus>.navbar__submenu.is-right-submenu,.navbar .has-submenu:hover>.navbar__submenu.is-right-submenu{left:auto;right:0;-webkit-transform-origin:right top;transform-origin:right top}.navbar .has-submenu .has-submenu:active>.navbar__submenu,.navbar .has-submenu .has-submenu:focus>.navbar__submenu,.navbar .has-submenu .has-submenu:hover>.navbar__submenu{top:0;margin-top:0}.navbar .has-submenu .has-submenu:active>.navbar__submenu.is-right-submenu,.navbar .has-submenu .has-submenu:focus>.navbar__submenu.is-right-submenu,.navbar .has-submenu .has-submenu:hover>.navbar__submenu.is-right-submenu{top:0;margin-top:0}.navbar .navbar__submenu{background:var(--lighter);border-radius:calc(var(--border-radius) * 4);left:-9999px;list-style-type:none;margin:0;padding:1rem .85rem;position:absolute;visibility:hidden;white-space:nowrap;z-index:1;opacity:0;-webkit-transform:scale(.8);transform:scale(.8);-webkit-transform-origin:0 top;transform-origin:0 top;-webkit-transition:opacity .15s,-webkit-transform .3s cubic-bezier(.275, 1.375, .8, 1);transition:opacity .15s,-webkit-transform .3s cubic-bezier(.275, 1.375, .8, 1);transition:opacity .15s,transform .3s cubic-bezier(.275, 1.375, .8, 1);transition:opacity .15s,transform .3s cubic-bezier(.275, 1.375, .8, 1),-webkit-transform .3s cubic-bezier(.275, 1.375, .8, 1)}.navbar .navbar__submenu__submenu{z-index:2}.navbar .navbar__submenu li{line-height:1.5;font-size:.8789062495rem}.navbar .navbar__submenu li a,.navbar .navbar__submenu li span[aria-haspopup=true]{border-radius:calc(var(--border-radius) * 3);color:var(--nav-link-color-hover);padding:.5rem 1rem;-webkit-transition:all .24s ease;transition:all .24s ease}.navbar .navbar__submenu li a:active,.navbar .navbar__submenu li a:focus,.navbar .navbar__submenu li a:hover,.navbar .navbar__submenu li span[aria-haspopup=true]:active,.navbar .navbar__submenu li span[aria-haspopup=true]:focus,.navbar .navbar__submenu li span[aria-haspopup=true]:hover{background:var(--page-bg);color:var(--nav-link-color)}.navbar .navbar__submenu li span{color:var(--nav-link-color-hover)!important;padding:.5rem 1rem}.navbar .navbar__submenu li:hover>a,.navbar .navbar__submenu li:hover>span[aria-haspopup=true]{color:var(--nav-link-color)}.navbar .navbar__toggle{background:var(--black);-webkit-box-shadow:none;box-shadow:none;border:none;cursor:pointer;display:block;line-height:1;margin:0;overflow:visible;padding:0;position:relative;right:0;margin-left:.75rem;text-transform:none;z-index:2004;height:3.2rem;padding:0;width:3.2rem}@media all and (min-width:56.25em){.navbar .navbar__toggle{display:none}}.navbar .navbar__toggle:focus,.navbar .navbar__toggle:hover{-webkit-box-shadow:none;box-shadow:none;outline:0;-webkit-transform:none;transform:none}.navbar .navbar__toggle-box{width:20px;height:14px;display:inline-block;position:relative}.navbar .navbar__toggle-inner{display:block;top:50%;text-indent:-9999999em}.navbar .navbar__toggle-inner::before{content:"";display:block;top:-5px}.navbar .navbar__toggle-inner::after{content:"";display:block;bottom:-5px}.navbar .navbar__toggle-inner,.navbar .navbar__toggle-inner::after,.navbar .navbar__toggle-inner::before{width:20px;height:1px;background-color:var(--white);position:absolute;-webkit-transition:opacity .14s ease-out,-webkit-transform;transition:opacity .14s ease-out,-webkit-transform;transition:transform,opacity .14s ease-out;transition:transform,opacity .14s ease-out,-webkit-transform}.navbar .navbar__toggle-inner{-webkit-transition-duration:75ms;transition-duration:75ms;-webkit-transition-timing-function:cubic-bezier(0.55,0.055,0.675,0.19);transition-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}.navbar .navbar__toggle-inner::before{-webkit-transition:top 75ms ease .12s,opacity 75ms ease;transition:top 75ms ease .12s,opacity 75ms ease}.navbar .navbar__toggle-inner::after{-webkit-transition:bottom 75ms ease .12s,-webkit-transform 75ms cubic-bezier(.55, .055, .675, .19);transition:bottom 75ms ease .12s,-webkit-transform 75ms cubic-bezier(.55, .055, .675, .19);transition:bottom 75ms ease .12s,transform 75ms cubic-bezier(.55, .055, .675, .19);transition:bottom 75ms ease .12s,transform 75ms cubic-bezier(.55, .055, .675, .19),-webkit-transform 75ms cubic-bezier(.55, .055, .675, .19)}.navbar .navbar__toggle.is-active .navbar__toggle-inner{-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-transition-delay:0.12s;transition-delay:0.12s;-webkit-transition-timing-function:cubic-bezier(0.215,0.61,0.355,1);transition-timing-function:cubic-bezier(0.215,0.61,0.355,1)}.navbar .navbar__toggle.is-active .navbar__toggle-inner::before{top:0;opacity:0;-webkit-transition:top 75ms ease,opacity 75ms ease .12s;transition:top 75ms ease,opacity 75ms ease .12s}.navbar .navbar__toggle.is-active .navbar__toggle-inner::after{bottom:0;-webkit-transform:rotate(-90deg);transform:rotate(-90deg);-webkit-transition:bottom 75ms ease,-webkit-transform 75ms cubic-bezier(.215, .61, .355, 1) .12s;transition:bottom 75ms ease,-webkit-transform 75ms cubic-bezier(.215, .61, .355, 1) .12s;transition:bottom 75ms ease,transform 75ms cubic-bezier(.215, .61, .355, 1) .12s;transition:bottom 75ms ease,transform 75ms cubic-bezier(.215, .61, .355, 1) .12s,-webkit-transform 75ms cubic-bezier(.215, .61, .355, 1) .12s}.navbar_mobile_overlay{background:var(--page-bg);height:calc(100vh - 4.4rem);left:0;opacity:1;overflow:auto;pointer-events:auto;position:fixed;top:4.4rem;-webkit-transition:all .3s cubic-bezier(0, 0, .3, 1);transition:all .3s cubic-bezier(0, 0, .3, 1);width:100%;z-index:1001}.navbar_mobile_overlay.is-hidden{opacity:0;pointer-events:none}.navbar_mobile_overlay .navbar__menu{margin:24px}.navbar_mobile_overlay .navbar__menu li{list-style:none;margin:0;padding:0;text-align:center}.navbar_mobile_overlay .navbar__menu li a,.navbar_mobile_overlay .navbar__menu li span{color:var(--dark);display:block;padding:calc(var(--baseline) * 2);position:relative}.navbar_mobile_overlay .navbar__menu li a:active,.navbar_mobile_overlay .navbar__menu li a:focus,.navbar_mobile_overlay .navbar__menu li a:hover,.navbar_mobile_overlay .navbar__menu li span:active,.navbar_mobile_overlay .navbar__menu li span:focus,.navbar_mobile_overlay .navbar__menu li span:hover{color:var(--dark)}.navbar_mobile_overlay .navbar__menu li a[aria-haspopup=true]::after,.navbar_mobile_overlay .navbar__menu li span[aria-haspopup=true]::after{content:"";width:0;height:0;border-style:solid;border-width:5px 5px 0 5px;border-color:currentColor transparent transparent transparent;left:calc(var(--baseline) * 2);top:15px;position:relative}.navbar_mobile_overlay .navbar__submenu{margin:0;padding:0;visibility:hidden}.navbar_mobile_overlay .navbar__submenu[aria-hidden=false]{visibility:visible}.navbar_mobile_overlay .navbar__submenu_wrapper{height:0;opacity:0;overflow:hidden;-webkit-transition:all .3s cubic-bezier(.275, 1.375, .8, 1);transition:all .3s cubic-bezier(.275, 1.375, .8, 1)}.navbar_mobile_overlay .navbar__submenu_wrapper.is-active{height:auto;opacity:1}.navbar_mobile_sidebar{background:var(--page-bg);-webkit-box-shadow:0 0 5px rgba(0,0,0,.25);box-shadow:0 0 5px rgba(0,0,0,.25);height:100vh;left:0;max-width:400px;overflow:auto;position:fixed;top:0;-webkit-transition:all .3s cubic-bezier(0, 0, .3, 1);transition:all .3s cubic-bezier(0, 0, .3, 1);width:80%;z-index:1001}.navbar_mobile_sidebar.is-hidden{left:-400px}.navbar_mobile_sidebar .navbar__menu{margin:24px}.navbar_mobile_sidebar .navbar__menu li{font-family:var(--menu-font);font-size:16px;list-style:none;line-height:1.3;margin:0;padding:0}.navbar_mobile_sidebar .navbar__menu li .is-separator,.navbar_mobile_sidebar .navbar__menu li a{color:var(--dark);display:block;padding:10px 20px 10px 0;position:relative}.navbar_mobile_sidebar .navbar__menu li .is-separator:active,.navbar_mobile_sidebar .navbar__menu li .is-separator:focus,.navbar_mobile_sidebar .navbar__menu li .is-separator:hover,.navbar_mobile_sidebar .navbar__menu li a:active,.navbar_mobile_sidebar .navbar__menu li a:focus,.navbar_mobile_sidebar .navbar__menu li a:hover{color:var(--dark)}.navbar_mobile_sidebar .navbar__menu li .is-separator[aria-haspopup=true]::after,.navbar_mobile_sidebar .navbar__menu li a[aria-haspopup=true]::after{content:"";width:0;height:0;border-style:solid;border-width:5px 5px 0 5px;border-color:currentColor transparent transparent transparent;right:0;top:18px;position:absolute}.navbar_mobile_sidebar .navbar__submenu{margin:0 0 0 24px;padding:0;visibility:hidden}.navbar_mobile_sidebar .navbar__submenu[aria-hidden=false]{visibility:visible}.navbar_mobile_sidebar .navbar__submenu_wrapper{height:0;opacity:0;overflow:hidden;-webkit-transition:all .3s cubic-bezier(.275, 1.375, .8, 1);transition:all .3s cubic-bezier(.275, 1.375, .8, 1)}.navbar_mobile_sidebar .navbar__submenu_wrapper.is-active{height:auto;opacity:1}.navbar_mobile_sidebar__overlay{background:rgba(0,0,0,.5);height:100%;opacity:1;pointer-events:auto;position:fixed;top:0;-webkit-transition:all .3s cubic-bezier(0, 0, .3, 1);transition:all .3s cubic-bezier(0, 0, .3, 1);width:100%;z-index:10}.navbar_mobile_sidebar__overlay.is-hidden{opacity:0;pointer-events:none}.wrapper{-webkit-box-sizing:content-box;box-sizing:content-box;max-width:var(--page-width);margin-left:auto;margin-right:auto;padding-left:var(--page-margin);padding-right:var(--page-margin)}.entry-wrapper{-webkit-box-sizing:content-box;box-sizing:content-box;max-width:var(--entry-width);margin-left:auto;margin-right:auto;padding-left:var(--page-margin);padding-right:var(--page-margin)}.hero{position:relative;z-index:1}.hero--noimage::after{background:var(--dark);content:"";display:block;height:1px;bottom:0;width:calc(100% - var(--page-margin) * 2);z-index:-1;max-width:var(--page-width);position:absolute;left:50%;-webkit-transform:translate(-50%,0);transform:translate(-50%,0)}.hero__content{padding-bottom:calc(var(--baseline) * 6 + 1.5vw)}.hero__content h1>sup{font-size:1.066666667rem;vertical-align:top}.hero__content--centered{text-align:center}.hero__content--centered .content__meta{justify-content:center}.hero__cta{margin-top:calc(var(--baseline) * 6)}.hero__image{margin:0 var(--page-margin)}.hero__image-wrapper{position:relative;background:var(--lighter);border-radius:calc(var(--border-radius) * 4)}@media all and (min-width:56.25em){.hero__image-wrapper{height:var(--hero-height)}}.hero__image-wrapper img{border-radius:inherit;display:block;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}@media all and (min-width:56.25em){.hero__image-wrapper img{height:var(--hero-height)}}.hero__image>figcaption{background:var(--page-bg)}@media all and (min-width:56.25em){.hero__image>figcaption{text-align:right}}.feed__item{display:flex;flex-wrap:wrap;gap:calc(2rem + 2vw);margin-top:calc(var(--baseline) * 12 + 2vw)}@media all and (min-width:37.5em){.feed__item{flex-wrap:nowrap}}.feed__item--centered{justify-content:center}.feed__content{max-width:var(--entry-width)}.feed__image{background:var(--lighter);border-radius:calc(var(--border-radius) * 4);flex-shrink:0;height:100%;margin:0;width:100%}@media all and (min-width:37.5em){.feed__image{height:calc(var(--feed-image-size) + 4vw);width:calc(var(--feed-image-size) + 4vw)}}.feed__image>img{border-radius:inherit;display:inline-block;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.feed__image--wide{max-width:var(--page-width)}.feed__meta{align-items:center;color:var(--gray);display:flex;font-size:.8239746086rem;margin-bottom:calc(var(--baseline) * 3)}.feed__author{font-family:var(--menu-font);font-variation-settings:"wght" var(--font-weight-bold);text-decoration:none}.feed__author-thumb{border-radius:50%;height:1.7rem;margin-right:.6rem;width:1.7rem}.feed__date{color:var(--gray);font-style:italic}.feed__author+.feed__date{margin-left:.8rem}.feed__author+.feed__date::before{content:"";background:var(--light);display:inline-block;height:1px;margin-right:4px;width:1rem;vertical-align:middle}.feed__readmore{margin-top:calc(var(--baseline) * 4 + .25vw)}.feed__title{margin-top:0}.feed--grid{margin:0}@media all and (min-width:37.5em){.feed--grid{display:grid;grid-template-columns:100%;gap:0 3rem}}@media all and (min-width:56.25em){.feed--grid{grid-template-columns:repeat(2,1fr)}}.feed--grid h2{margin-top:0}.feed--grid sup{font-size:1.066666667rem;vertical-align:top}.feed--grid li{align-items:center;list-style:none;gap:2rem;padding:0}.content__meta{margin-top:calc(var(--baseline) * 4 + .25vw);margin-bottom:0}.content__meta--centered{justify-content:center}.content__entry{margin-top:calc(var(--baseline) * 6 + 1.5vw)}.content__entry>:first-child{margin-top:0}.content__entry a:not(.btn):not([type=button]):not([type=submit]):not(button):not(.post__toc a):not(.gallery__item a){color:var(--link-color-hover);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:0.2em;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto}.content__entry a:not(.btn):not([type=button]):not([type=submit]):not(button):not(.post__toc a):not(.gallery__item a):active,.content__entry a:not(.btn):not([type=button]):not([type=submit]):not(button):not(.post__toc a):not(.gallery__item a):focus,.content__entry a:not(.btn):not([type=button]):not([type=submit]):not(button):not(.post__toc a):not(.gallery__item a):hover{color:var(--link-color)}.content__entry--nospace{margin-top:0}.content__avatar-thumbs{border-radius:50%;height:4.5rem;width:4.5rem}.content__footer{margin-top:calc(var(--baseline) * 9 + 1vw)}.content__updated{color:var(--gray);font-size:.8789062495rem;font-style:italic}.content__actions{align-items:baseline;display:flex;flex-basis:auto;gap:2rem;justify-content:space-between;margin-top:calc(var(--baseline) * 4 + .25vw);position:relative}.content__share{flex-shrink:0}.content__share-button{border-color:var(--light)}.content__share-popup{background:var(--lighter);border-radius:calc(var(--border-radius) * 4);bottom:140%;display:none;padding:1rem .85rem;position:absolute;right:0;text-align:left;z-index:1}.content__share-popup.is-visible{-webkit-animation:share-popup .48s cubic-bezier(.17,.67,.6,1.34) backwards;animation:share-popup .48s cubic-bezier(.17,.67,.6,1.34) backwards;display:block}@-webkit-keyframes share-popup{from{-webkit-transform:scale(.9);transform:scale(.9)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes share-popup{from{-webkit-transform:scale(.9);transform:scale(.9)}to{-webkit-transform:scale(1);transform:scale(1)}}.content__share-popup>a{border-radius:calc(var(--border-radius) * 3);color:var(--text-color);display:block;font-family:var(--menu-font);font-size:.8239746086rem;padding:.4rem .8rem}.content__share-popup>a:hover{background:var(--page-bg);color:var(--text-color);text-decoration:none}.content__share-popup>a>svg{fill:var(--text-color);display:inline-block;height:.9rem;margin-right:.5666666667rem;pointer-events:none;vertical-align:middle;width:.9rem}.content__tag{margin:0;font-family:var(--menu-font);font-size:.8239746086rem}.content__tag>li{display:inline-flex;margin:.3rem .3rem .3rem 0;padding:0}.content__tag>li>a{border:1px solid var(--light);border-radius:calc(var(--border-radius) * 10);color:var(--dark);font-size:.7241964329rem;font-variation-settings:"wght" var(--font-weight-normal);padding:calc(var(--baseline) * 1) calc(var(--baseline) * 2.5)}.content__tag>li>a:hover{border-color:var(--dark)}.content__bio{display:flex;margin:calc(var(--baseline) * 12 + 1vw) 0}@media all and (min-width:37.5em){.content__bio{align-items:center}}@media all and (min-width:37.5em){.content__bio::before{content:"";border-top:1px solid var(--light);height:1px;margin-right:2rem;width:30%}}.bio__avatar{border-radius:50%;flex-shrink:0;height:2.5rem;margin-right:1.2rem;width:2.5rem}@media all and (min-width:37.5em){.bio__avatar{height:4rem;margin-right:2rem;width:4rem}}.bio__name{margin:0}.bio__desc{font-family:var(--body-font);font-size:.8789062495rem;line-height:1.5}.bio__desc>:first-child{margin-top:calc(var(--baseline) * 2)}.bio__desc a{text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:0.2em;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto}.bio__desc a{color:var(--link-color-hover);-webkit-transition:all .24s ease-out;transition:all .24s ease-out}.bio__desc a:hover{color:var(--link-color)}.bio__desc a:active{color:var(--link-color)}.bio__desc a:focus{outline:0}.content__nav{margin-top:calc(var(--baseline) * 16 + 1vw)}.content__nav-inner{border-top:1px solid var(--dark);border-bottom:1px solid var(--dark);padding:calc(var(--baseline) * 16) 0}@media all and (min-width:37.5em){.content__nav-inner{display:flex;gap:1rem;justify-content:space-between}}@media all and (min-width:56.25em){.content__nav-inner{gap:2rem}}@media all and (max-width:37.4375em){.content__nav-prev+.content__nav-next{margin-top:calc(var(--baseline) * 6 + 1vw)}}@media all and (min-width:37.5em){.content__nav-next{margin-left:auto;text-align:right}}.content__nav-link{font-family:var(--heading-font);font-variation-settings:"wght" var(--font-weight-bold);font-style:italic;height:100%;line-height:1.5;display:flex;gap:1rem;justify-content:space-between;align-items:center}@media all and (min-width:37.5em){.content__nav-link{gap:2rem}}.content__nav-link>div{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}@media all and (min-width:56.25em){.content__nav-link>div{-webkit-line-clamp:4}}.content__nav-link span{color:var(--gray);display:block;font-size:.7724761953rem;font-family:var(--menu-font);font-style:normal;font-variation-settings:"wght" var(--font-weight-normal);margin-bottom:var(--baseline)}.content__nav-image{flex:1 0 4rem;margin:0;height:4rem}@media all and (min-width:37.5em) and (max-width:56.1875em){.content__nav-image{flex-basis:6rem;height:6rem}}@media all and (min-width:56.25em){.content__nav-image{flex-basis:8rem;height:8rem}}.content__nav-image>img{border-radius:calc(var(--border-radius) * 4);display:block;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.content__related{background:var(--lighter);margin-top:calc(var(--baseline) * 16 + 1vw);padding:calc(var(--baseline) * 12 + 3vw) 0}.related__title{margin-top:0}.content__comments{margin-top:calc(var(--baseline) * 9);overflow:hidden}.post__image{display:inline-block}.post__image a,.post__image img{border-radius:calc(var(--border-radius) * 4);display:inline-block}.post__image>figcaption{background-color:var(--page-bg)}.post__image--left{float:left;margin-bottom:0;margin-right:2rem;max-width:50%}.post__image--right{float:right;margin-bottom:0;margin-left:2rem;max-width:50%}.post__image--center{display:block;margin-left:auto;margin-right:auto;text-align:center}.post__image--wide{display:block}@media all and (min-width:56.25em){.post__image--wide{margin-left:calc(-50vw + 50%);margin-right:calc(-50vw + 50%);padding:0 var(--page-margin);text-align:center}.post__image--wide a,.post__image--wide img{display:block;height:auto;margin:auto;max-width:var(--page-width);width:100%}}.post__image--full{background-color:var(--lighter);display:block;margin-left:calc(-50vw + 50%);margin-right:calc(-50vw + 50%);text-align:center}.post__image--full a,.post__image--full img{border-radius:0;display:block;height:auto;width:100%}.post__iframe,.post__video{display:block;margin-top:calc(var(--baseline) * 6 + .5vw);margin-bottom:calc(var(--baseline) * 6 + .5vw);overflow:hidden;padding:0;position:relative;width:100%}.post__iframe::before,.post__video::before{display:block;content:"";padding-top:var(--embed-aspect-ratio)}.post__iframe iframe,.post__iframe video,.post__video iframe,.post__video video{border:none;height:100%;left:0;position:absolute;top:0;bottom:0;width:100%}.post__toc{margin-top:calc(var(--baseline) * 6 + .5vw)}.post__toc h3{border-bottom:1px solid var(--dark);font-size:1rem;margin:0;padding-bottom:calc(var(--baseline) * 2 + .25vw)}.post__toc ul{counter-reset:item;list-style:decimal;margin:calc(var(--baseline) * 3 + .25vw) 0 0 3ch}.post__toc ul li{counter-increment:item;padding:0}.post__toc ul ul{margin-top:0}.post__toc ul ul li{display:block}.post__toc ul ul li:before{content:counters(item, ".") ". ";margin-left:-3ch}.banner{text-align:center}.banner--after-content{margin-top:calc(var(--baseline) * 9 + 1vw)}.page__desc a{text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:0.2em;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto}@media all and (min-width:37.5em){.page--author__wrapper{display:flex;gap:2rem}}@media all and (min-width:56.25em){.page--author__wrapper{gap:3rem}}.page--author__avatar{border-radius:50%;height:calc(var(--baseline) * 10 + 2vw);margin-top:calc(var(--baseline) * 6 + 1vw);width:calc(var(--baseline) * 10 + 2vw)}.page--author__website{margin-top:calc(var(--baseline) * 4 + .25vw)}.page--search form{align-items:flex-start;display:flex;flex-wrap:wrap}@media all and (max-width:37.4375em){.page--search input{margin-bottom:calc(var(--baseline) * 2)}}@media all and (min-width:20em){.page--search input{flex:1 0 auto;margin-right:calc(var(--baseline) * 2)}}@media all and (max-width:37.4375em){.page--search button{width:100%}}.subpages__title{border-top:1px solid var(--light);padding-top:calc(var(--baseline) * 6 + .5vw)}.subpages__list{list-style:initial;margin-left:2ch}.subpages__list ul{list-style:initial;margin:0 0 0 2ch}.subpages__list li{padding-bottom:0}.readmore{display:inline-block;color:var(--gray);font-size:.9374999997rem;font-style:italic;text-decoration:underline;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto}.align-left{text-align:left}.align-right{text-align:right}.align-center{text-align:center}.align-justify{text-align:justify}.msg{border:1px solid var(--light);border-left-width:2px;font-size:.9374999997rem;padding:calc(var(--baseline) * 6);position:relative}.msg--highlight{border-left-color:var(--highlight-color)}.msg--info{border-left-color:var(--info-color)}.msg--success{border-left-color:var(--success-color)}.msg--warning{border-left-color:var(--warning-color)}.ordered-list{counter-reset:listCounter}.ordered-list li{counter-increment:listCounter;list-style:none;padding-left:.3rem;position:relative}.ordered-list li::before{color:var(--color);content:counter(listCounter,decimal-leading-zero) ".";font-variation-settings:"wght" var(--font-weight-bold);left:-2rem;position:absolute}.dropcap:first-letter{color:var(--headings-color);float:left;font-size:3.6355864383rem;line-height:.7;margin-right:.6rem;padding:calc(var(--baseline) * 2) calc(var(--baseline) * 2) calc(var(--baseline) * 2) 0}.pec-wrapper{height:100%;left:0;position:absolute;top:0;width:100%}.pec-overlay{align-items:center;background-color:var(--lighter);font-size:14px;display:none;height:inherit;justify-content:center;line-height:1.4;padding:1rem;position:relative;text-align:center}@media all and (min-width:37.5em){.pec-overlay{font-size:16px;line-height:var(--line-height);padding:1rem 2rem}}.pec-overlay.is-active{display:flex}.pec-overlay-inner p{margin:0 0 1rem}.pagination{display:flex;gap:calc(var(--baseline) * 2);justify-content:center;margin-top:calc(var(--baseline) * 12 + 1vw)}@media all and (min-width:56.25em){.pagination{margin-top:calc(var(--baseline) * 18 + 1vw)}}.footer{border-top:1px solid var(--light);font-size:.9374999997rem;padding:calc(var(--baseline) * 9 + 1vw) 0 calc(var(--baseline) * 6 + 1vw);margin:calc(var(--baseline) * 12 + 1vw) auto 0;max-width:var(--page-width);text-align:center}.footer--glued{border:none;padding-top:0}.footer__nav ul{list-style:none;margin:0}.footer__nav ul li{display:inline-block;padding:var(--baseline) .5rem}*+.footer__social{margin-top:calc(var(--baseline) * 6 + .5vw)}.footer__social svg{fill:var(--dark);height:1rem;margin:0 .5rem;-webkit-transition:all .12s linear 0s;transition:all .12s linear 0s;width:1rem}.footer__social svg:hover{fill:var(--gray)}.footer__copyright{font-size:.8239746086rem;margin-top:var(--baseline)}.footer__copyright>:first-child{margin:0}.footer__bttop{background:var(--page-bg);bottom:calc(var(--baseline) * 5);border-radius:50%;border-color:var(--light);line-height:1;opacity:0;padding:calc(var(--baseline) * 2);position:fixed;right:2rem;text-align:center;width:auto!important;visibility:hidden;z-index:999}@media all and (min-width:56.25em){.footer__bttop{bottom:calc(var(--baseline) * 10)}}.footer__bttop:hover{border-color:var(--dark);opacity:1}.footer__bttop.is-visible{visibility:visible;opacity:1}.gallery{margin:calc(var(--baseline) * 6 + 1vw) calc(var(--gallery-gap) * -1)}@media all and (min-width:20em){.gallery{display:flex;flex-wrap:wrap}}@media all and (min-width:56.25em){.gallery-wrapper--wide{display:flex;justify-content:center;margin-left:calc(-50vw + 50%);margin-right:calc(-50vw + 50%);padding:0 var(--page-margin)}.gallery-wrapper--wide .gallery{max-width:var(--page-width)}}@media all and (min-width:56.25em){.gallery-wrapper--full{margin-left:calc(-50vw + 50%);margin-right:calc(-50vw + 50%);padding:0 var(--page-margin)}}@media all and (min-width:20em){.gallery[data-columns="1"] .gallery__item{flex:1 0 100%}}@media all and (min-width:30em){.gallery[data-columns="2"] .gallery__item{flex:1 0 50%}}@media all and (min-width:37.5em){.gallery[data-columns="3"] .gallery__item{flex:1 0 33.333%}}@media all and (min-width:56.25em){.gallery[data-columns="4"] .gallery__item{flex:0 1 25%}}@media all and (min-width:56.25em){.gallery[data-columns="5"] .gallery__item{flex:0 1 20%}}@media all and (min-width:56.25em){.gallery[data-columns="6"] .gallery__item{flex:0 1 16.666%}}@media all and (min-width:56.25em){.gallery[data-columns="7"] .gallery__item{flex:1 0 14.285%}}@media all and (min-width:56.25em){.gallery[data-columns="8"] .gallery__item{flex:1 0 12.5%}}.gallery__item{margin:0;padding:var(--gallery-gap);position:relative}@media all and (min-width:20em){.gallery__item{flex:1 0 50%}}@media all and (min-width:30em){.gallery__item{flex:1 0 33.333%}}@media all and (min-width:37.5em){.gallery__item{flex:1 0 25%}}.gallery__item a{border-radius:calc(var(--border-radius) * 4);display:block;height:100%;width:100%}.gallery__item a::after{background:-webkit-gradient(linear,left bottom,left top,from(rgba(0,0,0,.4)),to(rgba(0,0,0,0)));background:linear-gradient(to top,rgba(0,0,0,.4) 0,rgba(0,0,0,0) 100%);border-radius:inherit;bottom:var(--gallery-gap);content:"";display:block;opacity:0;left:var(--gallery-gap);height:calc(100% - var(--gallery-gap) * 2);position:absolute;right:var(--gallery-gap);top:var(--gallery-gap);-webkit-transition:all .24s ease-out;transition:all .24s ease-out;width:calc(100% - var(--gallery-gap) * 2)}.gallery__item a:hover::after{opacity:1}.gallery__item img{border-radius:inherit;display:block;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gallery__item figcaption{bottom:1.2rem;color:var(--white);left:50%;opacity:0;position:absolute;text-align:center;-webkit-transform:translate(-50%,1.2rem);transform:translate(-50%,1.2rem);-webkit-transition:all .24s ease-out;transition:all .24s ease-out}.gallery__item:hover figcaption{opacity:1;-webkit-transform:translate(-50%,0);transform:translate(-50%,0)}.pswp--dark .pswp__bg{background:#000}.pswp--dark .pswp__button,.pswp--dark .pswp__button--arrow--left:before,.pswp--dark .pswp__button--arrow--right:before{background-image:url(../svg/gallery-icons-light.svg)}.pswp--light .pswp__bg{background:var(--white)}.pswp--light .pswp__counter{color:var(--text-color)}.pswp--light .pswp__caption__center{color:var(--text-color)}.pswp--light .pswp__button,.pswp--light .pswp__button--arrow--left:before,.pswp--light .pswp__button--arrow--right:before{background-image:url(../svg/gallery-icons-dark.svg)}.pswp .pswp__button{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;transform:none}img[loading]{opacity:0}img.is-loaded{opacity:1;transition:opacity 1s cubic-bezier(.215, .61, .355, 1)}
\ No newline at end of file
diff --git a/app/default-files/default-themes/simple/author.hbs b/app/default-files/default-themes/simple/author.hbs
index 0ef58d281..0db1f2fe1 100755
--- a/app/default-files/default-themes/simple/author.hbs
+++ b/app/default-files/default-themes/simple/author.hbs
@@ -99,13 +99,25 @@
{{#author}}
{{#if @config.custom.feedAvatar}}
{{#if avatar}}
-
+ {{#if @config.custom.feedAuthor}}
+
+ {{else}}
+
+
+
+ {{/if}}
{{/if}}
{{/if}}
{{#if @config.custom.feedAuthor}}
diff --git a/app/default-files/default-themes/simple/config.json b/app/default-files/default-themes/simple/config.json
index 6294cd871..71f9d51ef 100755
--- a/app/default-files/default-themes/simple/config.json
+++ b/app/default-files/default-themes/simple/config.json
@@ -1,6 +1,6 @@
{
"name": "Simple",
- "version": "3.0.0.0",
+ "version": "3.0.1.0",
"author": "TidyCustoms