Merge branch 'canary' into master (#711)

* refactor(i18n): simplify the structure of the translation file

* chore: prepare repository for v4.0.0-alpha

* chore: modify go.mod to v4

* refactor: migrate theme configuration to TOML

* fix: exampleSite not using correct theme

* feat: add favicon from assets folder

* refactor: drop linear grandient background feature

remove node-vibrant from dependencies

* feat: use Hugo's code block render hook to implement code copy button

Now it can have i18n support

* refactor: delete color.ts

* refactor: delete Emoji support post from example site

* refactor: drop support for `hidden` field in front matter

* feat: upgrade to PhotoSwipe v5

* chore: bump the required hugo version to 0.100.0

* refactor: remove PhotoSwipe from external.yaml

* fix: extra margin in search result

* fix: incorrect markdown heading level in example site

* refactor: remove some usages of `default` in template

No longer needed thanks to Hugo's configuration merge

* fix: one line codeblock style in firefox

closes https://github.com/CaiJimmy/hugo-theme-stack/issues/564

* feat: add style to new codeblock

* feat: i18n support for codeblock copy text

* fix(menu): jitter when closing menu

It's caused by flexbox gap property, which can't animate

* fix(search): long text overflows under the Search icon

closes https://github.com/CaiJimmy/hugo-theme-stack/issues/515
This commit is contained in:
Jimmy Cai 2022-10-29 17:02:24 +02:00 committed by GitHub
parent d60083e055
commit 8a597a5c9c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
73 changed files with 892 additions and 1976 deletions

View file

@ -5,7 +5,6 @@ date: {{ .Date }}
image:
math:
license:
hidden: false
comments: true
draft: true
---

View file

@ -192,7 +192,6 @@
.article-preview {
font-size: 1.4rem;
color: var(--card-text-color-tertiary);
margin-top: 10px;
line-height: 1.5;
}
}

View file

@ -286,10 +286,12 @@
line-height: 1.428571429;
word-break: break-all;
padding: var(--card-padding);
// keep Codeblocks LTR
[dir="rtl"] & {
direction: ltr;
}
code {
color: unset;
border: none;
@ -303,15 +305,11 @@
padding: var(--card-padding);
position: relative;
&:hover {
.copyCodeButton {
opacity: 1;
}
}
// keep Codeblocks LTR
[dir="rtl"] & {
direction: ltr;
}
pre {
margin: initial;
padding: 0;
@ -320,20 +318,30 @@
}
}
.copyCodeButton {
position: absolute;
top: calc(var(--card-padding));
right: calc(var(--card-padding));
background: var(--card-background);
border: none;
box-shadow: var(--shadow-l2);
border-radius: var(--tag-border-radius);
padding: 8px 16px;
color: var(--card-text-color-main);
cursor: pointer;
font-size: 14px;
opacity: 0;
transition: opacity 0.3s ease;
.codeblock {
header {
background-color: var(--card-background-selected);
padding: 5px var(--card-padding);
display: flex;
justify-content: space-between;
box-shadow: var(--shadow-l1);
span {
text-transform: uppercase;
font-weight: bold;
color: var(--card-text-color-secondary);
}
}
.codeblock-copy {
cursor: pointer;
background-color: transparent;
border: none;
padding: 8px 16px;
color: var(--card-text-color-secondary);
font-size: 14px;
font-weight: bold;
}
}
.table-wrapper {
@ -402,7 +410,7 @@
/// Negative margins
blockquote,
figure,
.highlight,
.codeblock,
pre,
.gallery,
.video-wrapper,

View file

@ -31,6 +31,7 @@
input {
padding: 40px 20px 20px;
padding-inline-end: var(--button-size);
border-radius: var(--card-border-radius);
background-color: var(--card-background);
box-shadow: var(--shadow-l1);
@ -78,5 +79,4 @@
height: 20px;
}
}
}

View file

@ -11,7 +11,6 @@
flex-direction: column;
flex-shrink: 0;
align-self: stretch;
gap: var(--sidebar-element-separation);
max-width: none;
width: 100%;
position: relative;
@ -65,6 +64,11 @@
}
}
}
.social-menu,
.menu {
margin-top: var(--sidebar-element-separation);
}
}
.right-sidebar {

28
assets/ts/codeblock.ts Normal file
View file

@ -0,0 +1,28 @@
/**
* Copy button for code blocks
*/
export default () => {
const copyButtons = document.querySelectorAll('.codeblock-copy');
copyButtons.forEach(button => {
const codeblockID = button.getAttribute('data-id'),
copyText = button.textContent,
copiedText = button.getAttribute('data-copied-text');
if (!codeblockID) return;
button.addEventListener('click', (e) => {
e.preventDefault();
const codeblock = document.getElementById(codeblockID) as HTMLElement;
if (!codeblockID) return;
navigator.clipboard.writeText(codeblock.textContent)
.then(() => {
button.textContent = copiedText;
setTimeout(() => {
button.textContent = copyText;
}, 1000);
})
.catch(err => {
alert(err)
console.log('Something went wrong', err);
});
}, false);
});
}

View file

@ -1,63 +0,0 @@
interface colorScheme {
hash: string, /// Regenerate color scheme when the image hash is changed
DarkMuted: {
hex: string,
rgb: Number[],
bodyTextColor: string
},
Vibrant: {
hex: string,
rgb: Number[],
bodyTextColor: string
}
}
let colorsCache: { [key: string]: colorScheme } = {};
if (localStorage.hasOwnProperty('StackColorsCache')) {
try {
colorsCache = JSON.parse(localStorage.getItem('StackColorsCache'));
}
catch (e) {
colorsCache = {};
}
}
async function getColor(key: string, hash: string, imageURL: string) {
if (!key) {
/**
* If no key is provided, do not cache the result
*/
return await Vibrant.from(imageURL).getPalette();
}
if (!colorsCache.hasOwnProperty(key) || colorsCache[key].hash !== hash) {
/**
* If key is provided, but not found in cache, or the hash mismatches => Regenerate color scheme
*/
const palette = await Vibrant.from(imageURL).getPalette();
colorsCache[key] = {
hash: hash,
Vibrant: {
hex: palette.Vibrant.hex,
rgb: palette.Vibrant.rgb,
bodyTextColor: palette.Vibrant.bodyTextColor
},
DarkMuted: {
hex: palette.DarkMuted.hex,
rgb: palette.DarkMuted.rgb,
bodyTextColor: palette.DarkMuted.bodyTextColor
}
}
/* Save the result in localStorage */
localStorage.setItem('StackColorsCache', JSON.stringify(colorsCache));
}
return colorsCache[key];
}
export {
getColor
}

View file

@ -1,186 +1,92 @@
declare global {
interface Window {
PhotoSwipe: any;
PhotoSwipeUI_Default: any
const wrap = (figures: HTMLElement[]) => {
const galleryContainer = document.createElement('div');
galleryContainer.className = 'gallery';
const parentNode = figures[0].parentNode,
first = figures[0];
parentNode.insertBefore(galleryContainer, first)
for (const figure of figures) {
galleryContainer.appendChild(figure);
}
}
interface PhotoSwipeItem {
w: number;
h: number;
src: string;
msrc: string;
title?: string;
el: HTMLElement;
}
export default (container: HTMLElement) => {
/// The process of wrapping image with figure tag is done using JavaScript instead of only Hugo markdown render hook
/// because it can not detect whether image is being wrapped by a link or not
/// and it lead to a invalid HTML construction (<a><figure><img></figure></a>)
const images = container.querySelectorAll('img.gallery-image') as NodeListOf<HTMLImageElement>;
for (const img of Array.from(images)) {
/// Images are wrapped with figure tag if the paragraph has only images without texts
/// This is done to allow inline images within paragraphs
const paragraph = img.closest('p');
class StackGallery {
private galleryUID: number;
private items: PhotoSwipeItem[] = [];
if (!paragraph || !container.contains(paragraph)) continue;
constructor(container: HTMLElement, galleryUID = 1) {
if (window.PhotoSwipe == undefined || window.PhotoSwipeUI_Default == undefined) {
console.error("PhotoSwipe lib not loaded.");
return;
if (paragraph.textContent.trim() == '') {
/// Once we insert figcaption, this check no longer works
/// So we add a class to paragraph to mark it
paragraph.classList.add('no-text');
}
this.galleryUID = galleryUID;
let isNewLineImage = paragraph.classList.contains('no-text');
if (!isNewLineImage) continue;
StackGallery.createGallery(container);
this.loadItems(container);
this.bindClick();
}
const hasLink = img.parentElement.tagName == 'A';
private loadItems(container: HTMLElement) {
this.items = [];
let el: HTMLElement = img;
/// Wrap image with figure tag, with flex-grow and flex-basis values extracted from img's data attributes
const figure = document.createElement('figure');
figure.style.setProperty('flex-grow', img.getAttribute('data-flex-grow') || '1');
figure.style.setProperty('flex-basis', img.getAttribute('data-flex-basis') || '0');
if (hasLink) {
/// Wrap <a> if it exists
el = img.parentElement;
}
el.parentElement.insertBefore(figure, el);
figure.appendChild(el);
const figures = container.querySelectorAll('figure.gallery-image');
/// Add figcaption if it exists
if (img.hasAttribute('alt')) {
const figcaption = document.createElement('figcaption');
figcaption.innerText = img.getAttribute('alt');
figure.appendChild(figcaption);
}
for (const el of figures) {
const figcaption = el.querySelector('figcaption'),
img = el.querySelector('img');
/// Wrap img tag with <a> tag if image was not wrapped by <a> tag
if (!hasLink) {
figure.className = 'gallery-image';
let aux: PhotoSwipeItem = {
w: parseInt(img.getAttribute('width')),
h: parseInt(img.getAttribute('height')),
src: img.src,
msrc: img.getAttribute('data-thumb') || img.src,
el: el
}
if (figcaption) {
aux.title = figcaption.innerHTML;
}
this.items.push(aux);
const a = document.createElement('a');
a.href = img.src;
a.setAttribute('target', '_blank');
a.setAttribute('data-pswp-width', img.width.toString());
a.setAttribute('data-pswp-height', img.height.toString());
img.parentNode.insertBefore(a, img);
a.appendChild(img);
}
}
public static createGallery(container: HTMLElement) {
/// The process of wrapping image with figure tag is done using JavaScript instead of only Hugo markdown render hook
/// because it can not detect whether image is being wrapped by a link or not
/// and it lead to a invalid HTML construction (<a><figure><img></figure></a>)
const images = container.querySelectorAll('img.gallery-image');
for (const img of Array.from(images)) {
/// Images are wrapped with figure tag if the paragraph has only images without texts
/// This is done to allow inline images within paragraphs
const paragraph = img.closest('p');
if (!paragraph || !container.contains(paragraph)) continue;
if (paragraph.textContent.trim() == '') {
/// Once we insert figcaption, this check no longer works
/// So we add a class to paragraph to mark it
paragraph.classList.add('no-text');
}
let isNewLineImage = paragraph.classList.contains('no-text');
if (!isNewLineImage) continue;
const hasLink = img.parentElement.tagName == 'A';
let el: HTMLElement = img;
/// Wrap image with figure tag, with flex-grow and flex-basis values extracted from img's data attributes
const figure = document.createElement('figure');
figure.style.setProperty('flex-grow', img.getAttribute('data-flex-grow') || '1');
figure.style.setProperty('flex-basis', img.getAttribute('data-flex-basis') || '0');
if (hasLink) {
/// Wrap <a> if it exists
el = img.parentElement;
}
el.parentElement.insertBefore(figure, el);
figure.appendChild(el);
/// Add figcaption if it exists
if (img.hasAttribute('alt')) {
const figcaption = document.createElement('figcaption');
figcaption.innerText = img.getAttribute('alt');
figure.appendChild(figcaption);
}
/// Wrap img tag with <a> tag if image was not wrapped by <a> tag
if (!hasLink) {
figure.className = 'gallery-image';
const a = document.createElement('a');
a.href = img.src;
a.setAttribute('target', '_blank');
img.parentNode.insertBefore(a, img);
a.appendChild(img);
}
const figuresEl = container.querySelectorAll('figure.gallery-image') as NodeListOf<HTMLElement>;
let currentGallery = [];
for (const figure of Array.from(figuresEl)) {
if (!currentGallery.length) {
/// First iteration
currentGallery = [figure];
}
const figuresEl = container.querySelectorAll('figure.gallery-image');
let currentGallery = [];
for (const figure of figuresEl) {
if (!currentGallery.length) {
/// First iteration
currentGallery = [figure];
}
else if (figure.previousElementSibling === currentGallery[currentGallery.length - 1]) {
/// Adjacent figures
currentGallery.push(figure);
}
else if (currentGallery.length) {
/// End gallery
StackGallery.wrap(currentGallery);
currentGallery = [figure];
}
else if (figure.previousElementSibling === currentGallery[currentGallery.length - 1]) {
/// Adjacent figures
currentGallery.push(figure);
}
if (currentGallery.length > 0) {
StackGallery.wrap(currentGallery);
else if (currentGallery.length) {
/// End gallery
wrap(currentGallery);
currentGallery = [figure];
}
}
/**
* Wrap adjacent figure tags with div.gallery
* @param figures
*/
public static wrap(figures: HTMLElement[]) {
const galleryContainer = document.createElement('div');
galleryContainer.className = 'gallery';
const parentNode = figures[0].parentNode,
first = figures[0];
parentNode.insertBefore(galleryContainer, first)
for (const figure of figures) {
galleryContainer.appendChild(figure);
}
if (currentGallery.length > 0) {
wrap(currentGallery);
}
public open(index: number) {
const pswp = document.querySelector('.pswp') as HTMLDivElement;
const ps = new window.PhotoSwipe(pswp, window.PhotoSwipeUI_Default, this.items, {
index: index,
galleryUID: this.galleryUID,
getThumbBoundsFn: (index) => {
const thumbnail = this.items[index].el.getElementsByTagName('img')[0],
pageYScroll = window.pageYOffset || document.documentElement.scrollTop,
rect = thumbnail.getBoundingClientRect();
return { x: rect.left, y: rect.top + pageYScroll, w: rect.width };
}
});
ps.init();
}
private bindClick() {
for (const [index, item] of this.items.entries()) {
const a = item.el.querySelector('a');
a.addEventListener('click', (e) => {
e.preventDefault();
this.open(index);
})
}
}
}
export default StackGallery;
};

View file

@ -5,8 +5,7 @@
* @website: https://jimmycai.com
* @link: https://github.com/CaiJimmy/hugo-theme-stack
*/
import StackGallery from "ts/gallery";
import { getColor } from 'ts/color';
import StackCodeBlock from "ts/codeblock";
import menu from 'ts/menu';
import createElement from 'ts/createElement';
import StackColorScheme from 'ts/colorScheme';
@ -22,76 +21,12 @@ let Stack = {
const articleContent = document.querySelector('.article-content') as HTMLElement;
if (articleContent) {
new StackGallery(articleContent);
setupSmoothAnchors();
setupScrollspy();
}
/**
* Add linear gradient background to tile style article
*/
const articleTile = document.querySelector('.article-list--tile');
if (articleTile) {
let observer = new IntersectionObserver(async (entries, observer) => {
entries.forEach(entry => {
if (!entry.isIntersecting) return;
observer.unobserve(entry.target);
const articles = entry.target.querySelectorAll('article.has-image');
articles.forEach(async articles => {
const image = articles.querySelector('img'),
imageURL = image.src,
key = image.getAttribute('data-key'),
hash = image.getAttribute('data-hash'),
articleDetails: HTMLDivElement = articles.querySelector('.article-details');
const colors = await getColor(key, hash, imageURL);
articleDetails.style.background = `
linear-gradient(0deg,
rgba(${colors.DarkMuted.rgb[0]}, ${colors.DarkMuted.rgb[1]}, ${colors.DarkMuted.rgb[2]}, 0.5) 0%,
rgba(${colors.Vibrant.rgb[0]}, ${colors.Vibrant.rgb[1]}, ${colors.Vibrant.rgb[2]}, 0.75) 100%)`;
})
})
});
observer.observe(articleTile)
}
/**
* Add copy button to code block
*/
const highlights = document.querySelectorAll('.article-content div.highlight');
const copyText = `Copy`,
copiedText = `Copied!`;
highlights.forEach(highlight => {
const copyButton = document.createElement('button');
copyButton.innerHTML = copyText;
copyButton.classList.add('copyCodeButton');
highlight.appendChild(copyButton);
const codeBlock = highlight.querySelector('code[data-lang]');
if (!codeBlock) return;
copyButton.addEventListener('click', () => {
navigator.clipboard.writeText(codeBlock.textContent)
.then(() => {
copyButton.textContent = copiedText;
setTimeout(() => {
copyButton.textContent = copyText;
}, 1000);
})
.catch(err => {
alert(err)
console.log('Something went wrong', err);
});
});
});
new StackColorScheme(document.getElementById('dark-mode-toggle'));
StackCodeBlock();
}
}

View file

@ -1,143 +0,0 @@
module:
hugoVersion:
extended: true
min: "0.87.0"
params:
mainSections:
- post
featuredImageField: image
rssFullContent: true
favicon:
footer:
since:
customText:
dateFormat:
published: Jan 02, 2006
lastUpdated: Jan 02, 2006 15:04 MST
sidebar:
compact: false
emoji:
subtitle:
avatar:
enabled: true
local: true
src: img/avatar.png
article:
math: false
toc: true
readingTime: true
license:
enabled: false
default: Licensed under CC BY-NC-SA 4.0
comments:
enabled: false
provider: disqus
disqusjs:
shortname:
apiUrl:
apiKey:
admin:
adminLabel:
utterances:
repo:
issueTerm: pathname
label:
remark42:
host:
site:
locale:
vssue:
platform:
owner:
repo:
clientId:
clientSecret:
autoCreateIssue: false
# Waline client configuration see: https://waline.js.org/en/reference/client.html
waline:
serverURL:
lang:
visitor:
avatar:
emoji:
- https://cdn.jsdelivr.net/gh/walinejs/emojis/weibo
requiredMeta:
- name
- email
- url
placeholder:
locale:
admin: Admin
twikoo:
envId:
region:
path:
lang:
giscus:
repo:
repoID:
category:
categoryID:
mapping:
strict:
lightTheme:
darkTheme:
reactionsEnabled: 1
emitMetadata: 0
inputPosition:
lang:
gitalk:
owner:
admin:
repo:
clientID:
clientSecret:
cusdis:
host:
id:
widgets:
homepage: []
page: []
opengraph:
twitter:
# Your Twitter username
site:
# Available values: summary, summary_large_image
card: summary_large_image
defaultImage:
opengraph:
enabled: false
local: false
src:
colorScheme:
# Display toggle
toggle: true
# Available values: auto, light, dark
default: auto
imageProcessing:
cover:
enabled: true
content:
enabled: true

View file

@ -0,0 +1,3 @@
[hugoVersion]
extended = true
min = "0.100.0"

View file

@ -0,0 +1,52 @@
# Theme's default configuration
mainSections = ["post"]
featuredImageField = "image"
rssFullContent = true
[footer]
[dateFormat]
published = "Jan 02, 2006"
lastUpdated = "Jan 02, 2006 15:04 MST"
[sidebar]
compact = false
[sidebar.avatar]
enabled = true
local = true
src = "img/avatar.png"
[article]
math = false
toc = true
readingTime = true
[article.license]
enabled = false
default = "Licensed under CC BY-NC-SA 4.0"
[comments]
enabled = false
provider = "disqus"
[widgets]
homepage = []
page = []
[opengraph.twitter]
card = "summary_large_image"
[defaultImage.opengraph]
enabled = false
local = false
[colorScheme]
toggle = true
default = "auto"
[imageProcessing.cover]
enabled = true
[imageProcessing.content]
enabled = true

View file

@ -1,25 +1,3 @@
Vibrant:
- src: https://cdn.jsdelivr.net/npm/node-vibrant@3.1.6/dist/vibrant.min.js
integrity: sha256-awcR2jno4kI5X0zL8ex0vi2z+KMkF24hUW8WePSA9HM=
type: script
PhotoSwipe:
- src: https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe.min.js
integrity: sha256-ePwmChbbvXbsO02lbM3HoHbSHTHFAeChekF1xKJdleo=
type: script
defer: true
- src: https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe-ui-default.min.js
integrity: sha256-UKkzOn/w1mBxRmLLGrSeyB4e1xbrp4xylgAWb3M42pU=
type: script
defer: true
- src: https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/default-skin/default-skin.min.css
type: style
- src: https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe.min.css
type: style
KaTeX:
- src: https://cdn.jsdelivr.net/npm/katex@0.15.6/dist/katex.min.css
integrity: sha256-J+iAE0sgH8QSz9hpcDxXIftnj65JEZgNhGcgReTTK9s=

View file

@ -1 +0,0 @@
Example site modified from https://github.com/gohugoio/hugoBasicExample

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View file

@ -1,239 +0,0 @@
baseurl: https://example.com
languageCode: en-us
theme: hugo-theme-stack
paginate: 5
title: Example Site
languages:
en:
languageName: English
title: Example Site
description: Example description
weight: 1
zh-cn:
languageName: 中文
title: 演示站点
description: 演示说明
weight: 2
ar:
languageName: عربي
languagedirection: rtl
title: موقع تجريبي
description: وصف تجريبي
weight: 3
# Change it to your Disqus shortname before using
disqusShortname: hugo-theme-stack
# GA Tracking ID
googleAnalytics:
# Theme i18n support
# Available values: ar, bn, ca, de, el, en, es, fr, hu, id, it, ja, ko, nl, pt-br, th, uk, zh-cn, zh-hk, zh-tw
DefaultContentLanguage: en
# Set hasCJKLanguage to true if DefaultContentLanguage is in [zh-cn ja ko]
# This will make .Summary and .WordCount behave correctly for CJK languages.
hasCJKLanguage: false
permalinks:
post: /p/:slug/
page: /:slug/
params:
mainSections:
- post
featuredImageField: image
rssFullContent: true
favicon: # e.g.: favicon placed in `static/favicon.ico` of your site folder, then set this field to `/favicon.ico` (`/` is necessary)
footer:
since: 2020
customText:
dateFormat:
published: Jan 02, 2006
lastUpdated: Jan 02, 2006 15:04 MST
sidebar:
emoji: 🍥
subtitle: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
avatar:
enabled: true
local: true
src: img/avatar.png
article:
math: false
toc: true
readingTime: true
license:
enabled: true
default: Licensed under CC BY-NC-SA 4.0
comments:
enabled: true
provider: disqus
disqusjs:
shortname:
apiUrl:
apiKey:
admin:
adminLabel:
utterances:
repo:
issueTerm: pathname
label:
remark42:
host:
site:
locale:
vssue:
platform:
owner:
repo:
clientId:
clientSecret:
autoCreateIssue: false
# Waline client configuration see: https://waline.js.org/en/reference/component.html
waline:
serverURL:
lang:
pageview:
emoji:
- https://unpkg.com/@waline/emojis@1.0.1/weibo
requiredMeta:
- name
- email
- url
locale:
admin: Admin
placeholder:
twikoo:
envId:
region:
path:
lang:
# See https://cactus.chat/docs/reference/web-client/#configuration for description of the various options
cactus:
defaultHomeserverUrl: "https://matrix.cactus.chat:8448"
serverName: "cactus.chat"
siteName: "" # You must insert a unique identifier here matching the one you registered (See https://cactus.chat/docs/getting-started/quick-start/#register-your-site)
giscus:
repo:
repoID:
category:
categoryID:
mapping:
lightTheme:
darkTheme:
reactionsEnabled: 1
emitMetadata: 0
gitalk:
owner:
admin:
repo:
clientID:
clientSecret:
cusdis:
host:
id:
widgets:
homepage:
- type: search
- type: archives
params:
limit: 5
- type: categories
params:
limit: 10
- type: tag-cloud
params:
limit: 10
page:
- type: toc
opengraph:
twitter:
# Your Twitter username
site:
# Available values: summary, summary_large_image
card: summary_large_image
defaultImage:
opengraph:
enabled: false
local: false
src:
colorScheme:
# Display toggle
toggle: true
# Available values: auto, light, dark
default: auto
imageProcessing:
cover:
enabled: true
content:
enabled: true
### Custom menu
### See https://docs.stack.jimmycai.com/configuration/custom-menu.html
### To remove about, archive and search page menu item, remove `menu` field from their FrontMatter
menu:
main: []
social:
- identifier: github
name: GitHub
url: https://github.com/CaiJimmy/hugo-theme-stack
params:
icon: brand-github
- identifier: twitter
name: Twitter
url: https://twitter.com
params:
icon: brand-twitter
related:
includeNewer: true
threshold: 60
toLower: false
indices:
- name: tags
weight: 100
- name: categories
weight: 200
markup:
goldmark:
renderer:
## Set to true if you have HTML content inside Markdown
unsafe: false
tableOfContents:
endLevel: 4
ordered: true
startLevel: 2
highlight:
noClasses: false
codeFences: true
guessSyntax: true
lineNoStart: 1
lineNos: true
lineNumbersInTable: true
tabWidth: 4

View file

@ -0,0 +1,20 @@
# Change baseurl before deploy
baseurl = "https://demo.stack.jimmycai.com"
languageCode = "en-us"
paginate = 5
title = "Hugo Theme Stack Starter"
theme = "hugo-theme-stack"
# Theme i18n support
# Available values: ar, bn, ca, de, el, en, es, fr, hu, id, it, ja, ko, nl, pt-br, th, uk, zh-cn, zh-hk, zh-tw
DefaultContentLanguage = "en"
# Set hasCJKLanguage to true if DefaultContentLanguage is in [zh-cn ja ko]
# This will make .Summary and .WordCount behave correctly for CJK languages.
hasCJKLanguage = false
# Change it to your Disqus shortname before using
disqusShortname = "hugo-theme-stack"
# GA Tracking ID
googleAnalytics = ""

View file

@ -0,0 +1,16 @@
# Enable multilanguage site support
[en]
languageName = "English"
title = "Hugo Theme Stack Example Site"
weight = 1
[zh-cn]
languageName = "中文"
title = "Hugo 主题 Stack 演示站点"
weight = 2
[ar]
languageName = "عربي"
languagedirection = "rtl"
title = "موقع تجريبي"
weight = 3

View file

@ -0,0 +1,18 @@
# Markdown renderer configuration
[goldmark.renderer]
# Set it to true if you have HTML content inside Markdown
unsafe = false
[tableOfContents]
endLevel = 4
ordered = true
startLevel = 2
[highlight]
noClasses = false
codeFences = true
guessSyntax = true
lineNoStart = 1
lineNos = true
lineNumbersInTable = true
tabWidth = 4

View file

@ -0,0 +1,20 @@
### Custom menu
### See https://docs.stack.jimmycai.com/configuration/custom-menu.html
### To remove about, archive and search page menu item, remove `menu` field from their FrontMatter
main = []
[[social]]
identifier = "github"
name = "GitHub"
url = "https://github.com/CaiJimmy/hugo-theme-stack"
[social.params]
icon = "brand-github"
[[social]]
identifier = "twitter"
name = "Twitter"
url = "https://twitter.com"
[social.params]
icon = "brand-twitter"

View file

@ -0,0 +1,106 @@
mainSections = ["post"]
featuredImageField = "image"
rssFullContent = true
favicon = "img/favicon.png"
[footer]
since = 2020
[dateFormat]
published = "Jan 02, 2006"
lastUpdated = "Jan 02, 2006 15:04 MST"
[sidebar]
emoji = "🍥"
subtitle = "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
[sidebar.avatar]
enabled = true
local = true
src = "img/logo.jpg"
[article]
math = false
toc = true
readingTime = true
[article.license]
enabled = true
default = "Licensed under CC BY-NC-SA 4.0"
[comments]
enabled = true
provider = "disqus"
[comments.disqusjs]
[comments.utterances]
issueTerm = "pathname"
[comments.remark42]
[comments.vssue]
autoCreateIssue = false
[comments.waline]
emoji = ["https://unpkg.com/@waline/emojis@1.0.1/weibo"]
requiredMeta = ["name", "email", "url"]
[comments.waline.locale]
admin = "Admin"
[comments.twikoo]
[comments.cactus]
defaultHomeserverUrl = "https://matrix.cactus.chat:8448"
serverName = "cactus.chat"
siteName = ""
[comments.giscus]
reactionsEnabled = 1
emitMetadata = 0
[comments.gitalk]
[comments.cusdis]
[[widgets.homepage]]
type = "search"
[[widgets.homepage]]
type = "archives"
[widgets.homepage.params]
limit = 5
[[widgets.homepage]]
type = "categories"
[widgets.homepage.params]
limit = 10
[[widgets.homepage]]
type = "tag-cloud"
[widgets.homepage.params]
limit = 10
[[widgets.page]]
type = "toc"
[opengraph.twitter]
card = "summary_large_image"
[defaultImage.opengraph]
enabled = false
local = false
[colorScheme]
toggle = true
default = "auto"
[imageProcessing.cover]
enabled = true
[imageProcessing.content]
enabled = true

View file

@ -0,0 +1,3 @@
# Permalinks format of each content section
post = "/p/:slug/"
page = "/:slug/"

View file

@ -0,0 +1,12 @@
# Related contents configuration
includeNewer = true
threshold = 60
toLower = false
[[indices]]
name = "tags"
weight = 100
[[indices]]
name = "categories"
weight = 200

View file

@ -1,50 +0,0 @@
+++
author = "Hugo Authors"
title = "Emoji Support"
date = "2019-03-05"
description = "Guide to emoji usage in Hugo"
categories = [
"Test"
]
tags = [
"emoji",
]
image = "the-creative-exchange-d2zvqp3fpro-unsplash.jpg"
+++
Emoji can be enabled in a Hugo project in a number of ways.
<!--more-->
The [`emojify`](https://gohugo.io/functions/emojify/) function can be called directly in templates or [Inline Shortcodes](https://gohugo.io/templates/shortcode-templates/#inline-shortcodes).
To enable emoji globally, set `enableEmoji` to `true` in your site's [configuration](https://gohugo.io/getting-started/configuration/) and then you can type emoji shorthand codes directly in content files; e.g.
<p><span class="nowrap"><span class="emojify">🙈</span> <code>:see_no_evil:</code></span> <span class="nowrap"><span class="emojify">🙉</span> <code>:hear_no_evil:</code></span> <span class="nowrap"><span class="emojify">🙊</span> <code>:speak_no_evil:</code></span></p>
<br>
The [Emoji cheat sheet](http://www.emoji-cheat-sheet.com/) is a useful reference for emoji shorthand codes.
***
**N.B.** The above steps enable Unicode Standard emoji characters and sequences in Hugo, however the rendering of these glyphs depends on the browser and the platform. To style the emoji you can either use a third party emoji font or a font stack; e.g.
{{< highlight html >}}
.emoji {
font-family: Apple Color Emoji, Segoe UI Emoji, NotoColorEmoji, Segoe UI Symbol, Android Emoji, EmojiSymbols;
}
{{< /highlight >}}
{{< css.inline >}}
<style>
.emojify {
font-family: Apple Color Emoji, Segoe UI Emoji, NotoColorEmoji, Segoe UI Symbol, Android Emoji, EmojiSymbols;
font-size: 2rem;
vertical-align: middle;
}
@media screen and (max-width:650px) {
.nowrap {
display: block;
margin: 25px 0;
}
}
</style>
{{< /css.inline >}}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

View file

@ -42,12 +42,12 @@ Itatur? Quiatae cullecum rem ent aut odis in re eossequodi nonsequ idebis ne sap
The blockquote element represents content that is quoted from another source, optionally with a citation which must be within a `footer` or `cite` element, and optionally with in-line changes such as annotations and abbreviations.
#### Blockquote without attribution
### Blockquote without attribution
> Tiam, ad mint andaepu dandae nostion secatur sequo quae.
> **Note** that you can use *Markdown syntax* within a blockquote.
#### Blockquote with attribution
### Blockquote with attribution
> Don't communicate by sharing memory, share memory by communicating.<br>
> — <cite>Rob Pike[^1]</cite>
@ -63,7 +63,7 @@ Tables aren't part of the core Markdown spec, but Hugo supports supports them ou
Bob | 27
Alice | 23
#### Inline Markdown within tables
### Inline Markdown within tables
| Italics | Bold | Code |
| -------- | -------- | ------ |
@ -74,8 +74,7 @@ Tables aren't part of the core Markdown spec, but Hugo supports supports them ou
| Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Phasellus ultricies, sapien non euismod aliquam, dui ligula tincidunt odio, at accumsan nulla sapien eget ex. | Proin eleifend dictum ipsum, non euismod ipsum pulvinar et. Vivamus sollicitudin, quam in pulvinar aliquam, metus elit pretium purus | Proin sit amet velit nec enim imperdiet vehicula. | Ut bibendum vestibulum quam, eu egestas turpis gravida nec | Sed scelerisque nec turpis vel viverra. Vivamus vitae pretium sapien |
## Code Blocks
#### Code block with backticks
### Code block with backticks
```html
<!doctype html>
@ -90,7 +89,7 @@ Tables aren't part of the core Markdown spec, but Hugo supports supports them ou
</html>
```
#### Code block indented with four spaces
### Code block indented with four spaces
<!doctype html>
<html lang="en">
@ -103,21 +102,7 @@ Tables aren't part of the core Markdown spec, but Hugo supports supports them ou
</body>
</html>
#### Code block with Hugo's internal highlight shortcode
{{< highlight html >}}
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Example HTML5 Document</title>
</head>
<body>
<p>Test</p>
</body>
</html>
{{< /highlight >}}
#### Diff code block
### Diff code block
```diff
[dependencies.bevy]
@ -127,21 +112,27 @@ rev = "11f52b8c72fc3a568e8bb4a4cd1f3eb025ac2e13"
+ features = ["jpeg", "dynamic"]
```
### One line code block
```html
<p>A paragraph</p>
```
## List Types
#### Ordered List
### Ordered List
1. First item
2. Second item
3. Third item
#### Unordered List
### Unordered List
* List item
* Another item
* And another item
#### Nested list
### Nested list
* Fruit
* Apple

2
go.mod
View file

@ -1,3 +1,3 @@
module github.com/CaiJimmy/hugo-theme-stack/v3
module github.com/CaiJimmy/hugo-theme-stack/v4
go 1.17

View file

@ -1,74 +1,45 @@
toggleMenu:
other: اخفي القائمة
toggleMenu: اخفي القائمة
darkMode:
other: الوضع الداكن
darkMode: الوضع الداكن
list:
page:
one: "{{ .Count }} صفحه"
other: "{{ .Count }} صفحات"
section:
other: قسم
section: قسم
subsection:
one: قسم فرعي
other: اقسام فرعية
article:
back:
other: خلف
tableOfContents:
other: جدول المحتويات
relatedContent:
other: محتوى مشابهه
lastUpdatedOn:
other: التعديل الاخير
back: خلف
tableOfContents: جدول المحتويات
relatedContent: محتوى مشابهه
lastUpdatedOn: التعديل الاخير
readingTime:
one: "تُقرأ خلال دقيقة"
other: "تُقرأ خلال {{ .Count }} دقائق"
notFound:
title:
other: غير موجود
subtitle:
other: تعذر العثور على الصفحة المطلوبة.
title: غير موجود
subtitle: تعذر العثور على الصفحة المطلوبة.
widget:
archives:
title:
other: الارشيفات
more:
other: اكثر
title: الارشيفات
more: اكثر
tagCloud:
title:
other: وسوم
title: وسوم
categoriesCloud:
title:
other: التصنيفات
title: التصنيفات
search:
title:
other: بحث
placeholder:
other: اكتب...
resultTitle:
other: "#PAGES_COUNT نتيجة (#TIME_SECONDS ثواني)"
title: بحث
placeholder: اكتب...
resultTitle: "#PAGES_COUNT نتيجة (#TIME_SECONDS ثواني)"
footer:
builtWith:
other: "مبني بستخدام {{ .Generator }}"
designedBy:
other: "قالب {{ .Theme }} مصمم من {{ .DesignedBy }}"
builtWith: "مبني بستخدام {{ .Generator }}"
designedBy: "قالب {{ .Theme }} مصمم من {{ .DesignedBy }}"

View file

@ -1,73 +1,52 @@
toggleMenu:
other: টগল মেনু
toggleMenu: টগল মেনু
darkMode:
other: ডার্ক মোড
darkMode: ডার্ক মোড
list:
page:
one: "{{ .Count }} পাতা"
other: "{{ .Count }} পাতা"
section:
other: অনুচ্ছেদ
section: অনুচ্ছেদ
subsection:
one: উপ-অনুচ্ছেদ
other: উপ-অনুচ্ছেদ
article:
back:
other: পেছনে
back: পেছনে
tableOfContents:
other: সূচিপত্র
tableOfContents: সূচিপত্র
relatedContent:
other: সম্পর্কিত বিষয়বস্তু
relatedContent: সম্পর্কিত বিষয়বস্তু
lastUpdatedOn:
other: সর্বশেষ আপডেট করা হয়েছে
lastUpdatedOn: সর্বশেষ আপডেট করা হয়েছে
readingTime:
one: "{{ .Count }} মিনিটে পড়া যাবে"
other: "{{ .Count }} মিনিটে পড়া যাবে"
notFound:
title:
other: পাওয়া যায়নি
title: পাওয়া যায়নি
subtitle:
other: এই পাতাটি বিদ্যমান নেই
subtitle: এই পাতাটি বিদ্যমান নেই
widget:
archives:
title:
other: আর্কাইভ
more:
other: আরও
title: আর্কাইভ
more: আরও
tagCloud:
title:
other: ট্যাগ
title: ট্যাগ
categoriesCloud:
title:
other: বিভাগ
title: বিভাগ
search:
title:
other: অনুসন্ধান
title: অনুসন্ধান
placeholder:
other: কিছু টাইপ করুন...
placeholder: কিছু টাইপ করুন...
resultTitle:
other: "#PAGES_COUNT পাতা (#TIME_SECONDS সেকেন্ড)"
resultTitle: "#PAGES_COUNT পাতা (#TIME_SECONDS সেকেন্ড)"
footer:
builtWith:
other: "{{ .Generator }} দিয়ে নির্মিত"
designedBy:
other: "থিম {{ .Theme }} ডিজাইন করেছেন {{ .DesignedBy }}"
builtWith: "{{ .Generator }} দিয়ে নির্মিত"
designedBy: "থিম {{ .Theme }} ডিজাইন করেছেন {{ .DesignedBy }}"

View file

@ -1,73 +1,43 @@
toggleMenu:
other: Toggle Menu
toggleMenu: Toggle Menu
darkMode:
other: Mode fosc
darkMode: Mode fosc
list:
page:
one: "{{ .Count }} pàgina"
other: "{{ .Count }} pàgines"
section:
other: Secció
section: Secció
subsection:
one: Subsecció
other: Subseccions
article:
back:
other: Tornar
tableOfContents:
other: Taula de contingut
relatedContent:
other: Continguts relacionats
lastUpdatedOn:
other: Última vegada actualitzat
back: Tornar
tableOfContents: Taula de contingut
relatedContent: Continguts relacionats
lastUpdatedOn: Última vegada actualitzat
readingTime:
one: "{{ .Count }} minut a llegir"
other: "{{ .Count }} minuts a llegir"
notFound:
title:
other: No Trobat
subtitle:
other: Aquesta pàgina no existeix
title: No Trobat
subtitle: Aquesta pàgina no existeix
widget:
archives:
title:
other: Arxiu
more:
other: Més
title: Arxiu
more: Més
tagCloud:
title:
other: Etiquetes
title: Etiquetes
categoriesCloud:
title:
other: Categories
title: Categories
search:
title:
other: Cerca
placeholder:
other: Tecleja alguna cosa...
resultTitle:
other: "#PAGES_COUNT pàgines en (#TIME_SECONDS segons)"
title: Cerca
placeholder: Tecleja alguna cosa...
resultTitle: "#PAGES_COUNT pàgines en (#TIME_SECONDS segons)"
footer:
builtWith:
other: Creat amb {{ .Generator }}
designedBy:
other: Tema {{ .Theme }} dissenyat per {{ .DesignedBy }}
builtWith: Creat amb {{ .Generator }}
designedBy: Tema {{ .Theme }} dissenyat per {{ .DesignedBy }}

View file

@ -1,74 +1,43 @@
toggleMenu:
other: Menü umschalten
toggleMenu: Menü umschalten
darkMode:
other: Dunkler Modus
darkMode: Dunkler Modus
list:
page:
one: "{{ .Count }} Seite"
other: "{{ .Count }} Seiten"
section:
other: Abschnitt
section: Abschnitt
subsection:
one: Unterabschnitt
other: Unterabschnitte
article:
back:
other: Zurück
tableOfContents:
other: Inhaltsverzeichnis
relatedContent:
other: Verwandte Inhalte
lastUpdatedOn:
other: Zuletzt aktualisiert am
back: Zurück
tableOfContents: Inhaltsverzeichnis
relatedContent: Verwandte Inhalte
lastUpdatedOn: Zuletzt aktualisiert am
readingTime:
one: "{{ .Count }} Minute Lesezeit"
other: "{{ .Count }} Minuten Lesezeit"
notFound:
title:
other: Seite nicht gefunden
subtitle:
other: Diese Seite existiert nicht
title: Seite nicht gefunden
subtitle: Diese Seite existiert nicht
widget:
archives:
title:
other: Archiv
more:
other: Weitere
title: Archiv
more: Weitere
tagCloud:
title:
other: Schlagwörter
title: Schlagwörter
categoriesCloud:
title:
other: Kategorien
title: Kategorien
search:
title:
other: Suche
placeholder:
other: Etwas tippen...
resultTitle:
other: "#PAGES_COUNT Seiten (#TIME_SECONDS Sekunden)"
title: Suche
placeholder: Etwas tippen...
resultTitle: "#PAGES_COUNT Seiten (#TIME_SECONDS Sekunden)"
footer:
builtWith:
other: Erstellt mit {{ .Generator }}
designedBy:
other: Theme {{ .Theme }} gestaltet von {{ .DesignedBy }}
builtWith: Erstellt mit {{ .Generator }}
designedBy: Theme {{ .Theme }} gestaltet von {{ .DesignedBy }}

View file

@ -1,70 +1,41 @@
toggleMenu:
other: Εναλλαγή Μενού
toggleMenu: Εναλλαγή Μενού
darkMode:
other: Σκοτεινό θέμα
darkMode: Σκοτεινό θέμα
list:
page:
one: "{{ .Count }} σελιδα"
other: "{{ .Count }} σελιδες"
section:
other: Ενότητα
section: Ενότητα
subsection:
one: Υποενότητα
other: Υποενότητες
article:
back:
other: Πισω
tableOfContents:
other: Πινακας περιεχομενων
relatedContent:
other: Σχετικο περιεχομενο
lastUpdatedOn:
other: Τελευταια τροποποιηση στις
back: Πισω
tableOfContents: Πινακας περιεχομενων
relatedContent: Σχετικο περιεχομενο
lastUpdatedOn: Τελευταια τροποποιηση στις
readingTime:
one: "{{ .Count }} λεπτό ανάγνωσης"
### Seems that there's no need to add 's' even if it's plural in English
other: "{{ .Count }} λεπτά ανάγνωσης"
notFound:
title:
other: Δε βρέθηκε
subtitle:
other: Η σελίδα δε βρέθηκε.
title: Δε βρέθηκε
subtitle: Η σελίδα δε βρέθηκε.
widget:
archives:
title:
other: Αρχειο
more:
other: Περισσότερα
title: Αρχειο
more: Περισσότερα
tagCloud:
title:
other: Tags
title: Tags
search:
title:
other: Αναζήτηση
placeholder:
other: Πληκτρολογήστε κάτι...
resultTitle:
other: "#PAGES_COUNT σελιδες (#TIME_SECONDS δευτερολεπτα)"
title: Αναζήτηση
placeholder: Πληκτρολογήστε κάτι...
resultTitle: "#PAGES_COUNT σελιδες (#TIME_SECONDS δευτερολεπτα)"
footer:
builtWith:
other: Δημιουργήθηκε με τη χρήση {{ .Generator }}
designedBy:
other: Το θέμα {{ .Theme }} σχεδιάστηκε από το {{ .DesignedBy }}
builtWith: Δημιουργήθηκε με τη χρήση {{ .Generator }}
designedBy: Το θέμα {{ .Theme }} σχεδιάστηκε από το {{ .DesignedBy }}

View file

@ -1,73 +1,46 @@
toggleMenu:
other: Toggle Menu
toggleMenu: Toggle Menu
darkMode:
other: Dark Mode
darkMode: Dark Mode
list:
page:
one: "{{ .Count }} page"
other: "{{ .Count }} pages"
section:
other: Section
section: Section
subsection:
one: Subsection
other: Subsections
article:
back:
other: Back
tableOfContents:
other: Table of contents
relatedContent:
other: Related content
lastUpdatedOn:
other: Last updated on
back: Back
tableOfContents: Table of contents
relatedContent: Related content
lastUpdatedOn: Last updated on
readingTime:
one: "{{ .Count }} minute read"
other: "{{ .Count }} minute read"
codeblock:
copy: Copy
copied: Copied!
notFound:
title:
other: Not Found
subtitle:
other: This page does not exist
title: Not Found
subtitle: This page does not exist
widget:
archives:
title:
other: Archives
more:
other: More
title: Archives
more: More
tagCloud:
title:
other: Tags
title: Tags
categoriesCloud:
title:
other: Categories
title: Categories
search:
title:
other: Search
placeholder:
other: Type something...
resultTitle:
other: "#PAGES_COUNT pages (#TIME_SECONDS seconds)"
title: Search
placeholder: Type something...
resultTitle: "#PAGES_COUNT pages (#TIME_SECONDS seconds)"
footer:
builtWith:
other: Built with {{ .Generator }}
designedBy:
other: Theme {{ .Theme }} designed by {{ .DesignedBy }}
builtWith: Built with {{ .Generator }}
designedBy: Theme {{ .Theme }} designed by {{ .DesignedBy }}

View file

@ -1,73 +1,43 @@
toggleMenu:
other: Toggle Menu
toggleMenu: Toggle Menu
darkMode:
other: Modo oscuro
darkMode: Modo oscuro
list:
page:
one: "{{ .Count }} página"
other: "{{ .Count }} páginas"
section:
other: Sección
section: Sección
subsection:
one: Subsección
other: Subsecciones
article:
back:
other: Volver
tableOfContents:
other: Tabla de contenido
relatedContent:
other: Contenidos relacionados
lastUpdatedOn:
other: Última vez actualizado
back: Volver
tableOfContents: Tabla de contenido
relatedContent: Contenidos relacionados
lastUpdatedOn: Última vez actualizado
readingTime:
one: "{{ .Count }} minuto a leer"
other: "{{ .Count }} minutos a leer"
notFound:
title:
other: No Encontrado
subtitle:
other: Esta página no existe
title: No Encontrado
subtitle: Esta página no existe
widget:
archives:
title:
other: Archivo
more:
other: Más
title: Archivo
more: Más
tagCloud:
title:
other: Etiquetas
title: Etiquetas
categoriesCloud:
title:
other: Categorías
title: Categorías
search:
title:
other: Búsqueda
placeholder:
other: Teclea algo...
resultTitle:
other: "#PAGES_COUNT páginas en (#TIME_SECONDS segundos)"
title: Búsqueda
placeholder: Teclea algo...
resultTitle: "#PAGES_COUNT páginas en (#TIME_SECONDS segundos)"
footer:
builtWith:
other: Creado con {{ .Generator }}
designedBy:
other: Tema {{ .Theme }} diseñado por {{ .DesignedBy }}
builtWith: Creado con {{ .Generator }}
designedBy: Tema {{ .Theme }} diseñado por {{ .DesignedBy }}

View file

@ -1,73 +1,43 @@
toggleMenu:
other: منو
toggleMenu: منو
darkMode:
other: حالت شب
darkMode: حالت شب
list:
page:
one: "{{ .Count }} صفحه"
other: "{{ .Count }} صفحه"
section:
other: بخش
section: بخش
subsection:
one: زیربخش
other: زیربخش
article:
back:
other: قبلی
tableOfContents:
other: فهرست
relatedContent:
other: مطالب مرتبط
lastUpdatedOn:
other: آخرین بروزرسانی در
back: قبلی
tableOfContents: فهرست
relatedContent: مطالب مرتبط
lastUpdatedOn: آخرین بروزرسانی در
readingTime:
one: "مطالعه در {{ .Count }} دقیقه"
other: "مطالعه در {{ .Count }} دقیقه"
notFound:
title:
other: یافت نشد
subtitle:
other: این صحه وجود ندارد
title: یافت نشد
subtitle: این صحه وجود ندارد
widget:
archives:
title:
other: آرشیو
more:
other: بیشتر
title: آرشیو
more: بیشتر
tagCloud:
title:
other: تگ ها
title: تگ ها
categoriesCloud:
title:
other: دسته بندی
title: دسته بندی
search:
title:
other: جستجو
placeholder:
other: تایپ کنید ...
resultTitle:
other: "#PAGES_COUNT صفحه (#TIME_SECONDS ثانیه)"
title: جستجو
placeholder: تایپ کنید ...
resultTitle: "#PAGES_COUNT صفحه (#TIME_SECONDS ثانیه)"
footer:
builtWith:
other: قدرت گرفته از {{ .Generator }}
designedBy:
other: قالب {{ .Theme }} ساخته شده توسط {{ .DesignedBy }}
builtWith: قدرت گرفته از {{ .Generator }}
designedBy: قالب {{ .Theme }} ساخته شده توسط {{ .DesignedBy }}

View file

@ -1,69 +1,41 @@
toggleMenu:
other: Afficher le menu
toggleMenu: Afficher le menu
darkMode:
other: Mode sombre
darkMode: Mode sombre
list:
page:
one: "{{ .Count }} page"
other: "{{ .Count }} pages"
section:
other: Section
section: Section
subsection:
one: Sous-section
other: Sous-sections
article:
back:
other: Retour
tableOfContents:
other: Table des matières
relatedContent:
other: Contenus liés
lastUpdatedOn:
other: Dernière mise à jour le
back: Retour
tableOfContents: Table des matières
relatedContent: Contenus liés
lastUpdatedOn: Dernière mise à jour le
readingTime:
one: "{{ .Count }} minute de lecture"
other: "{{ .Count }} minutes de lecture"
notFound:
title:
other: Page non trouvée
subtitle:
other: Cette page n'existe pas.
title: Page non trouvée
subtitle: Cette page n'existe pas.
widget:
archives:
title:
other: Archives
more:
other: Autres
title: Archives
more: Autres
tagCloud:
title:
other: Mots clés
title: Mots clés
search:
title:
other: Rechercher
placeholder:
other: Cherchez un article, une publication, etc.
resultTitle:
other: "#PAGES_COUNT pages (#TIME_SECONDS secondes)"
title: Rechercher
placeholder: Cherchez un article, une publication, etc.
resultTitle: "#PAGES_COUNT pages (#TIME_SECONDS secondes)"
footer:
builtWith:
other: Généré avec {{ .Generator }}
designedBy:
other: Thème {{ .Theme }} conçu par {{ .DesignedBy }}
builtWith: Généré avec {{ .Generator }}
designedBy: Thème {{ .Theme }} conçu par {{ .DesignedBy }}

View file

@ -1,73 +1,43 @@
toggleMenu:
other: Menü Kapcsolása
toggleMenu: Menü Kapcsolása
darkMode:
other: Sötét Mód
darkMode: Sötét Mód
list:
page:
one: "{{ .Count }} oldal"
other: "{{ .Count }} oldalak"
section:
other: Szekció
section: Szekció
subsection:
one: Alszekció
other: Alszekciók
article:
back:
other: Vissza
tableOfContents:
other: Tartalomjegyzék
relatedContent:
other: Kapcsolódó tartalom
lastUpdatedOn:
other: Utolsó frissítés időpontja
back: Vissza
tableOfContents: Tartalomjegyzék
relatedContent: Kapcsolódó tartalom
lastUpdatedOn: Utolsó frissítés időpontja
readingTime:
one: "{{ .Count }} percnyi olvasmány"
other: "{{ .Count }} percnyi olvasmány"
notFound:
title:
other: Nem található
subtitle:
other: Ez az oldal nem létezik
title: Nem található
subtitle: Ez az oldal nem létezik
widget:
archives:
title:
other: Archívum
more:
other: Több
title: Archívum
more: Több
tagCloud:
title:
other: Cimkék
title: Cimkék
categoriesCloud:
title:
other: Kategóriák
title: Kategóriák
search:
title:
other: Keresés
placeholder:
other: Írj valamit...
resultTitle:
other: "#PAGES_COUNT oldal (#TIME_SECONDS másodperc alatt)"
title: Keresés
placeholder: Írj valamit...
resultTitle: "#PAGES_COUNT oldal (#TIME_SECONDS másodperc alatt)"
footer:
builtWith:
other: "{{ .Generator }} használatával készült"
designedBy:
other: A {{ .Theme }} dizájnt {{ .DesignedBy }} tervezte
builtWith: "{{ .Generator }} használatával készült"
designedBy: A {{ .Theme }} dizájnt {{ .DesignedBy }} tervezte

View file

@ -1,73 +1,43 @@
toggleMenu:
other: Tampilkan Menu
toggleMenu: Tampilkan Menu
darkMode:
other: Mode Gelap
darkMode: Mode Gelap
list:
page:
one: "{{ .Count }} halaman"
other: "{{ .Count }} halaman"
section:
other: Bagian
section: Bagian
subsection:
one: Subbagian
other: Subbagian
article:
back:
other: Kembali
tableOfContents:
other: Daftar Isi
relatedContent:
other: Konten terkait
lastUpdatedOn:
other: Terakhir diperbarui pada
back: Kembali
tableOfContents: Daftar Isi
relatedContent: Konten terkait
lastUpdatedOn: Terakhir diperbarui pada
readingTime:
one: "Waktu Membaca: {{ .Count }} menit"
other: "Waktu Membaca: {{ .Count }} menit"
notFound:
title:
other: Tidak ditemukan
subtitle:
other: Halaman yang Anda akses tidak ditemukan.
title: Tidak ditemukan
subtitle: Halaman yang Anda akses tidak ditemukan.
widget:
archives:
title:
other: Arsip
more:
other: Lebih
title: Arsip
more: Lebih
tagCloud:
title:
other: Tag
title: Tag
categoriesCloud:
title:
other: Kategori
title: Kategori
search:
title:
other: Cari
placeholder:
other: Ketik sesuatu...
resultTitle:
other: "#PAGES_COUNT halaman (#TIME_SECONDS detik)"
title: Cari
placeholder: Ketik sesuatu...
resultTitle: "#PAGES_COUNT halaman (#TIME_SECONDS detik)"
footer:
builtWith:
other: Dibangun dengan {{ .Generator }}
designedBy:
other: Tema {{ .Theme }} dirancang oleh {{ .DesignedBy }}
builtWith: Dibangun dengan {{ .Generator }}
designedBy: Tema {{ .Theme }} dirancang oleh {{ .DesignedBy }}

View file

@ -1,73 +1,43 @@
toggleMenu:
other: Toggle Menu
toggleMenu: Toggle Menu
darkMode:
other: Dark Mode
darkMode: Dark Mode
list:
page:
one: "{{ .Count }} pagina"
other: "{{ .Count }} pagine"
section:
other: Sezione
section: Sezione
subsection:
one: Sottosezione
other: Sottosezioni
article:
back:
other: Indietro
tableOfContents:
other: Indice
relatedContent:
other: Contenuti correlati
lastUpdatedOn:
other: Aggiornato il
back: Indietro
tableOfContents: Indice
relatedContent: Contenuti correlati
lastUpdatedOn: Aggiornato il
readingTime:
one: "{{ .Count }} min per leggere"
other: "{{ .Count }} min per leggere"
notFound:
title:
other: Non trovato
subtitle:
other: Questa pagina non esiste.
title: Non trovato
subtitle: Questa pagina non esiste.
widget:
archives:
title:
other: Archivi
more:
other: Di più
title: Archivi
more: Di più
tagCloud:
title:
other: Tags
title: Tags
categoriesCloud:
title:
other: Categorie
title: Categorie
search:
title:
other: Cerca
placeholder:
other: Scrivi qualcosa...
resultTitle:
other: "#PAGES_COUNT pagine (#TIME_SECONDS secondi)"
title: Cerca
placeholder: Scrivi qualcosa...
resultTitle: "#PAGES_COUNT pagine (#TIME_SECONDS secondi)"
footer:
builtWith:
other: Realizzato con {{ .Generator }}
designedBy:
other: Tema {{ .Theme }} realizzato da {{ .DesignedBy }}
builtWith: Realizzato con {{ .Generator }}
designedBy: Tema {{ .Theme }} realizzato da {{ .DesignedBy }}

View file

@ -1,60 +1,32 @@
toggleMenu:
other: メニューを開く・閉じる
toggleMenu: メニューを開く・閉じる
darkMode:
other: ダークモード
darkMode: ダークモード
article:
back:
other: 前のページ
tableOfContents:
other: 目次
relatedContent:
other: 関連するコンテンツ
lastUpdatedOn:
other: 最終更新
readingTime:
other: "読了時間: {{ .Count }}分"
back: 前のページ
tableOfContents: 目次
relatedContent: 関連するコンテンツ
lastUpdatedOn: 最終更新
readingTime: "読了時間: {{ .Count }}分"
notFound:
title:
other: 404 Not Found
subtitle:
other: 指定されたページは存在しません。
title: 404 Not Found
subtitle: 指定されたページは存在しません。
widget:
archives:
title:
other: アーカイブ
more:
other: さらに見る
title: アーカイブ
more: さらに見る
tagCloud:
title:
other: タグ
title: タグ
categoriesCloud:
title:
other: カテゴリ
title: カテゴリ
search:
title:
other: 検索
placeholder:
other: 入力...
resultTitle:
other: "#PAGES_COUNT 件 #TIME_SECONDS 秒)"
title: 検索
placeholder: 入力...
resultTitle: "#PAGES_COUNT 件 #TIME_SECONDS 秒)"
footer:
builtWith:
other: Built with {{ .Generator }}
designedBy:
other: テーマ {{ .Theme }} は {{ .DesignedBy }} によって設計されています。
builtWith: Built with {{ .Generator }}
designedBy: テーマ {{ .Theme }} は {{ .DesignedBy }} によって設計されています。

View file

@ -1,72 +1,45 @@
toggleMenu:
other: 메뉴 여닫기
toggleMenu: 메뉴 여닫기
darkMode:
other: 다크 모드
darkMode: 다크 모드
list:
page:
one: "{{ .Count }} 페이지"
other: "{{ .Count }} 페이지"
section:
other: 섹션
section: 섹션
subsection:
one: 서브섹션
other: 서브섹션
article:
back:
other: 뒤로가기
tableOfContents:
other: 목차
relatedContent:
other: 관련 글
lastUpdatedOn:
other: "마지막 수정: "
back: 뒤로가기
tableOfContents: 목차
relatedContent: 관련 글
lastUpdatedOn: "마지막 수정: "
readingTime:
one: "{{ .Count }} 분 정도"
other: "{{ .Count }} 분 정도"
notFound:
title:
other: 찾을 수 없음
subtitle:
other: 페이지를 찾을 수 없습니다.
title: 찾을 수 없음
subtitle: 페이지를 찾을 수 없습니다.
widget:
archives:
title:
other: 보관함
more:
other: 더보기
title: 보관함
more: 더보기
categoriesCloud:
title:
other: 카테고리
title: 카테고리
tagCloud:
title:
other: 태그
title: 태그
search:
title:
other: 검색
placeholder:
other: 검색어를 입력하세요...
resultTitle:
other: "#PAGES_COUNT 페이지 (#TIME_SECONDS 초)"
title: 검색
placeholder: 검색어를 입력하세요...
resultTitle: "#PAGES_COUNT 페이지 (#TIME_SECONDS 초)"
footer:
builtWith:
other: "{{ .Generator }}로 만듦"
designedBy:
other: "{{ .DesignedBy }}의 {{ .Theme }} 테마 사용 중"
builtWith: "{{ .Generator }}로 만듦"
designedBy: "{{ .DesignedBy }}의 {{ .Theme }} 테마 사용 중"

View file

@ -1,57 +1,38 @@
toggleMenu:
other: Open Menu
toggleMenu: Open Menu
darkMode:
other: Donkere modus
darkMode: Donkere modus
list:
page:
one: "{{ .Count }} pagina"
other: "{{ .Count }} pagina's"
section:
other: Sectie
section: Sectie
subsection:
one: Subsectie
other: Subsecties
article:
relatedContent:
other: Gerelateerde inhoud
lastUpdatedOn:
other: Laatst bijgewerkt op
relatedContent: Gerelateerde inhoud
lastUpdatedOn: Laatst bijgewerkt op
notFound:
title:
other: Niet gevonden
subtitle:
other: Deze pagina bestaat niet.
title: Niet gevonden
subtitle: Deze pagina bestaat niet.
widget:
archives:
title:
other: Archief
more:
other: Meer
title: Archief
more: Meer
tagCloud:
title:
other: Tags
title: Tags
categoriesCloud:
title:
other: Categorie
title: Categorie
search:
title:
other: Zoeken
placeholder:
other: Typ iets
resultTitle:
other: "#PAGES_COUNT pagina's (#TIME_SECONDS seconden)"
title: Zoeken
placeholder: Typ iets
resultTitle: "#PAGES_COUNT pagina's (#TIME_SECONDS seconden)"
footer:
builtWith:
other: Gemaakt met {{ .Generator }}
designedBy:
other: Theme {{ .Theme }} ontworpen door {{ .DesignedBy }}
builtWith: Gemaakt met {{ .Generator }}
designedBy: Theme {{ .Theme }} ontworpen door {{ .DesignedBy }}

View file

@ -1,73 +1,43 @@
toggleMenu:
other: Przełącz Menu
toggleMenu: Przełącz Menu
darkMode:
other: Tryb ciemny
darkMode: Tryb ciemny
list:
page:
one: "{{ .Count }} strona"
other: "{{ .Count }} stron"
section:
other: Sekcja
section: Sekcja
subsection:
one: Podsekcja
other: Podsekcje
article:
back:
other: Wróć
tableOfContents:
other: Spis treści
relatedContent:
other: Powiązane artykuły
lastUpdatedOn:
other: Ostatnio zaktualizowany
back: Wróć
tableOfContents: Spis treści
relatedContent: Powiązane artykuły
lastUpdatedOn: Ostatnio zaktualizowany
readingTime:
one: "Przeczytasz w {{ .Count }} minutę"
other: "Przeczytasz w {{ .Count }} minut"
notFound:
title:
other: Nie znaleziono
subtitle:
other: Ta strona nie istnieje
title: Nie znaleziono
subtitle: Ta strona nie istnieje
widget:
archives:
title:
other: Archiwum
more:
other: Więcej
title: Archiwum
more: Więcej
tagCloud:
title:
other: Tagi
title: Tagi
categoriesCloud:
title:
other: Kategorie
title: Kategorie
search:
title:
other: Szukaj
placeholder:
other: Wpisz coś...
resultTitle:
other: "#PAGES_COUNT stron (#TIME_SECONDS sekund)"
title: Szukaj
placeholder: Wpisz coś...
resultTitle: "#PAGES_COUNT stron (#TIME_SECONDS sekund)"
footer:
builtWith:
other: Zbudowano z {{ .Generator }}
designedBy:
other: Motyw {{ .Theme }} zaprojektowany przez {{ .DesignedBy }}
builtWith: Zbudowano z {{ .Generator }}
designedBy: Motyw {{ .Theme }} zaprojektowany przez {{ .DesignedBy }}

View file

@ -1,67 +1,45 @@
toggleMenu:
other: Alternar Menu
toggleMenu: Alternar Menu
darkMode:
other: Modo Escuro
darkMode: Modo Escuro
list:
page:
one: "{{ .Count }} página"
other: "{{ .Count }} páginas"
section:
other: Seção
section: Seção
subsection:
one: Subseção
other: Subseções
article:
back:
other: Voltar
tableOfContents:
other: Índice
relatedContent:
other: Conteúdo relacionado
lastUpdatedOn:
other: Última atualização em
back: Voltar
tableOfContents: Índice
relatedContent: Conteúdo relacionado
lastUpdatedOn: Última atualização em
readingTime:
one: "{{ .Count }} minuto de leitura"
other: "{{ .Count }} minutos de leitura"
notFound:
title:
other: Não Encontrado
subtitle:
other: Esta página não existe.
title: Não Encontrado
subtitle: Esta página não existe.
widget:
archives:
title:
other: Arquivos
more:
other: Mais
title: Arquivos
more: Mais
tagCloud:
title:
other: Tags
title: Tags
categoriesCloud:
title:
other: Categorias
title: Categorias
search:
title:
other: Busca
placeholder:
other: Digite algo...
resultTitle:
other: "#PAGES_COUNT páginas (#TIME_SECONDS segundos)"
title: Busca
placeholder: Digite algo...
resultTitle: "#PAGES_COUNT páginas (#TIME_SECONDS segundos)"
footer:
builtWith:
other: Criado com {{ .Generator }}
designedBy:
other: Tema {{ .Theme }} desenvolvido por {{ .DesignedBy }}
builtWith: Criado com {{ .Generator }}
designedBy: Tema {{ .Theme }} desenvolvido por {{ .DesignedBy }}

View file

@ -1,8 +1,6 @@
toggleMenu:
other: Показать/скрыть меню
toggleMenu: Показать/скрыть меню
darkMode:
other: Тёмный режим
darkMode: Тёмный режим
list:
page:
@ -10,10 +8,7 @@ list:
few: "{{ .Count }} страницы"
many: "{{ .Count }} страниц"
other: "{{ .Count }} страниц"
section:
other: Раздел
section: Раздел
subsection:
one: Подраздел
few: Подразделы
@ -21,43 +16,28 @@ list:
other: Подразделы
article:
back:
other: Назад
relatedContent:
other: Также рекомендуем
lastUpdatedOn:
other: Обновлено
tableOfContents:
other: Содержание
readingTime:
other: "Время чтения: {{ .Count }} мин."
back: Назад
relatedContent: Также рекомендуем
lastUpdatedOn: Обновлено
tableOfContents: Содержание
readingTime: "Время чтения: {{ .Count }} мин."
notFound:
title:
other: Не найдено
subtitle:
other: Запрашиваемая страница не существует
title: Не найдено
subtitle: Запрашиваемая страница не существует
widget:
archives:
title:
other: Архивы
more:
other: Ещё
title: Архивы
more: Ещё
tagCloud:
title:
other: Теги
title: Теги
search:
title:
other: Поиск
placeholder:
other: Введите что-нибудь...
resultTitle:
other: "Найдено #PAGES_COUNT страниц (за #TIME_SECONDS с.)"
title: Поиск
placeholder: Введите что-нибудь...
resultTitle: "Найдено #PAGES_COUNT страниц (за #TIME_SECONDS с.)"
footer:
builtWith:
other: Создано при помощи {{ .Generator }}
designedBy:
other: Тема {{ .Theme }}, дизайн {{ .DesignedBy }}
builtWith: Создано при помощи {{ .Generator }}
designedBy: Тема {{ .Theme }}, дизайн {{ .DesignedBy }}

View file

@ -1,70 +1,41 @@
toggleMenu:
other: สลับเมนู
toggleMenu: สลับเมนู
darkMode:
other: ธีมมืด
darkMode: ธีมมืด
list:
page:
one: "{{ .Count }} หน้า"
other: "{{ .Count }} หน้า"
section:
other: หมวดหมู่
section: หมวดหมู่
subsection:
one: หมวดหมู่ย่อย
other: หมวดหมู่ย่อยอื่นๆ
article:
back:
other: กลับไป
tableOfContents:
other: สารบัญ
relatedContent:
other: เนื้อหาคล้ายคลึงกัน
lastUpdatedOn:
other: อัปเดตล่าสุดเมื่อ
back: กลับไป
tableOfContents: สารบัญ
relatedContent: เนื้อหาคล้ายคลึงกัน
lastUpdatedOn: อัปเดตล่าสุดเมื่อ
readingTime:
one: "น่าจะใช้เวลา {{ .Count }} นาทีในการอ่าน"
other: "น่าจะใช้เวลา {{ .Count }} นาทีในการอ่าน"
notFound:
title:
other: ไม่พบหัวข้อ
subtitle:
other: ไม่พบหน้านี้ในระบบ
title: ไม่พบหัวข้อ
subtitle: ไม่พบหน้านี้ในระบบ
widget:
archives:
title:
other: เนื้อหาที่เก็บถาวรแล้ว
more:
other: อื่นๆ นอกจากนี้
title: เนื้อหาที่เก็บถาวรแล้ว
more: อื่นๆ นอกจากนี้
tagCloud:
title:
other: แท็ก
title: แท็ก
search:
title:
other: ค้นหา
placeholder:
other: พิมพ์เพื่อค้นหา ...
resultTitle:
other: "#PAGES_COUNT pages (#TIME_SECONDS seconds)"
title: ค้นหา
placeholder: พิมพ์เพื่อค้นหา ...
resultTitle: "#PAGES_COUNT pages (#TIME_SECONDS seconds)"
footer:
builtWith:
other: ถูกสร้างด้วย {{ .Generator }}
designedBy:
other: ธีม {{ .Theme }} ออกแบบโดย {{ .DesignedBy }}
builtWith: ถูกสร้างด้วย {{ .Generator }}
designedBy: ธีม {{ .Theme }} ออกแบบโดย {{ .DesignedBy }}

View file

@ -1,53 +1,36 @@
toggleMenu:
other: Menüyü Gizle
toggleMenu: Menüyü Gizle
darkMode:
other: Koyu Mod
darkMode: Koyu Mod
list:
page:
one: "{{ .Count }} makale"
other: "{{ .Count }} makale"
section:
other: Bölüm
section: Bölüm
subsection:
one: Alt bölüm
other: Alt bölümler
article:
relatedContent:
other: Alakalı içerikler
lastUpdatedOn:
other: Son güncelleme
relatedContent: Alakalı içerikler
lastUpdatedOn: Son güncelleme
notFound:
title:
other: Bulunamadı
subtitle:
other: Aradığınız sayfa mevcut değil.
title: Bulunamadı
subtitle: Aradığınız sayfa mevcut değil.
widget:
archives:
title:
other: Arşiv
more:
other: Daha fazla
title: Arşiv
more: Daha fazla
tagCloud:
title:
other: Etiketler
title: Etiketler
search:
title:
other: Arama
placeholder:
other: Birşeyler yazın...
resultTitle:
other: "#PAGES_COUNT sayfa (#TIME_SECONDS saniye)"
title: Arama
placeholder: Birşeyler yazın...
resultTitle: "#PAGES_COUNT sayfa (#TIME_SECONDS saniye)"
footer:
builtWith:
other: "{{ .Generator }} ile oluşturuldu."
designedBy:
other: "{{ .Theme }} teması {{ .DesignedBy }} tarafından tasarlandı"
builtWith: "{{ .Generator }} ile oluşturuldu."
designedBy: "{{ .Theme }} teması {{ .DesignedBy }} tarafından tasarlandı"

View file

@ -1,71 +1,42 @@
toggleMenu:
other: Показати меню
toggleMenu: Показати меню
darkMode:
other: Темна тема
darkMode: Темна тема
list:
page:
one: "{{ .Count }} сторінка"
few: "{{ .Count }} сторінки"
other: "{{ .Count }} сторінок"
section:
other: Секція
section: Секція
subsection:
one: Підсекція
other: Підсекції
article:
back:
other: Назад
tableOfContents:
other: Зміст
relatedContent:
other: Схожі матеріали
lastUpdatedOn:
other: Востаннє оновлено
back: Назад
tableOfContents: Зміст
relatedContent: Схожі матеріали
lastUpdatedOn: Востаннє оновлено
readingTime:
one: "Час читання: {{ .Count }} хв"
other: "Час читання: {{ .Count }} хв"
notFound:
title:
other: Не знайдено
subtitle:
other: Ця сторінка не існує
title: Не знайдено
subtitle: Ця сторінка не існує
widget:
archives:
title:
other: Архіви
more:
other: Більше
title: Архіви
more: Більше
tagCloud:
title:
other: Теґи
title: Теґи
search:
title:
other: Пошук
placeholder:
other: Напишіть що-небудь...
resultTitle:
other: "#PAGES_COUNT сторінок (#TIME_SECONDS секунд)"
title: Пошук
placeholder: Напишіть що-небудь...
resultTitle: "#PAGES_COUNT сторінок (#TIME_SECONDS секунд)"
footer:
builtWith:
other: Створено з {{ .Generator }}
designedBy:
other: Тема {{ .Theme }}, дизайн {{ .DesignedBy }}
builtWith: Створено з {{ .Generator }}
designedBy: Тема {{ .Theme }}, дизайн {{ .DesignedBy }}

View file

@ -1,60 +1,32 @@
toggleMenu:
other: 切换菜单
toggleMenu: 切换菜单
darkMode:
other: 暗色模式
darkMode: 暗色模式
article:
back:
other: 返回
tableOfContents:
other: 目录
relatedContent:
other: 相关文章
lastUpdatedOn:
other: 最后更新于
readingTime:
other: "阅读时长: {{ .Count }} 分钟"
back: 返回
tableOfContents: 目录
relatedContent: 相关文章
lastUpdatedOn: 最后更新于
readingTime: "阅读时长: {{ .Count }} 分钟"
notFound:
title:
other: 404 错误
subtitle:
other: 页面不存在
title: 404 错误
subtitle: 页面不存在
widget:
archives:
title:
other: 归档
more:
other: 更多
title: 归档
more: 更多
tagCloud:
title:
other: 标签云
title: 标签云
categoriesCloud:
title:
other: 分类
title: 分类
search:
title:
other: 搜索
placeholder:
other: 输入关键词...
resultTitle:
other: "#PAGES_COUNT 个结果 (用时 #TIME_SECONDS 秒)"
title: 搜索
placeholder: 输入关键词...
resultTitle: "#PAGES_COUNT 个结果 (用时 #TIME_SECONDS 秒)"
footer:
builtWith:
other: Built with {{ .Generator }}
designedBy:
other: 主题 {{ .Theme }} 由 {{ .DesignedBy }} 设计
builtWith: Built with {{ .Generator }}
designedBy: 主题 {{ .Theme }} 由 {{ .DesignedBy }} 设计

View file

@ -1,73 +1,43 @@
toggleMenu:
other: 切換選單
toggleMenu: 切換選單
darkMode:
other: 深色模式
darkMode: 深色模式
list:
page:
one: "第 {{ .Count }} 頁"
other: "第 {{ .Count }} 頁"
section:
other: Section
section: Section
subsection:
one: Subsection
other: Subsections
article:
back:
other: 返回
tableOfContents:
other: 目錄
relatedContent:
other: 相關內容
lastUpdatedOn:
other: 上次改過於
back: 返回
tableOfContents: 目錄
relatedContent: 相關內容
lastUpdatedOn: 上次改過於
readingTime:
one: "需要 {{ .Count }} 分鐘閱讀"
other: "需要 {{ .Count }} 分鐘閱讀"
notFound:
title:
other: Not Found
subtitle:
other: 頁面不存在
title: Not Found
subtitle: 頁面不存在
widget:
archives:
title:
other: Archives
more:
other: 更多
title: Archives
more: 更多
tagCloud:
title:
other: Tags
title: Tags
categoriesCloud:
title:
other: Categories
title: Categories
search:
title:
other: 搜尋
placeholder:
other: Type 關鍵字...
resultTitle:
other: "#PAGES_COUNT pages (#TIME_SECONDS seconds)"
title: 搜尋
placeholder: Type 關鍵字...
resultTitle: "#PAGES_COUNT pages (#TIME_SECONDS seconds)"
footer:
builtWith:
other: Built with {{ .Generator }}
designedBy:
other: 主題 {{ .Theme }} 由 {{ .DesignedBy }} 設計
builtWith: Built with {{ .Generator }}
designedBy: 主題 {{ .Theme }} 由 {{ .DesignedBy }} 設計

View file

@ -1,49 +1,26 @@
toggleMenu:
other: 切換選單
toggleMenu: 切換選單
darkMode:
other: 夜晚模式
darkMode: 夜晚模式
article:
back:
other: 返回
tableOfContents:
other: 目錄
relatedContent:
other: 相關文章
lastUpdatedOn:
other: 最後更新
readingTime:
other: "閱讀時間: {{ .Count }} 分鐘"
back: 返回
tableOfContents: 目錄
relatedContent: 相關文章
lastUpdatedOn: 最後更新
readingTime: "閱讀時間: {{ .Count }} 分鐘"
notFound:
title:
other: 404 錯誤
subtitle:
other: 頁面不存在
title: 404 錯誤
subtitle: 頁面不存在
widget:
archives:
title:
other: 紀錄
more:
other: 更多
title: 紀錄
more: 更多
tagCloud:
title:
other: 標籤雲
title: 標籤雲
search:
title:
other: 搜尋
placeholder:
other: 輸入關鍵字...
resultTitle:
other: "#PAGES_COUNT 個結果 (用時 #TIME_SECONDS 秒)"
title: 搜尋
placeholder: 輸入關鍵字...
resultTitle: "#PAGES_COUNT 個結果 (用時 #TIME_SECONDS 秒)"

View file

@ -0,0 +1,20 @@
{{- $class := .Attributes.class | default "" -}}
{{- $lang := .Attributes.lang | default .Type -}}
<div class="codeblock">
<header>
<span class="codeblock-lang">{{ $lang }}</span>
<button
class="codeblock-copy"
data-id="codeblock-id-{{ .Ordinal }}"
data-copied-text="{{ T `article.codeblock.copied` }}"
>
{{ T `article.codeblock.copy` }}
</button>
</header>
<code id="codeblock-id-{{ .Ordinal }}" style="display:none;">{{- .Inner -}}</code>
{{- if transform.CanHighlight $lang -}}
<div class="{{ $class }}">{{- highlight .Inner $lang -}}</div>
{{- else -}}
<pre><code class="{{ $class }}">{{- .Inner -}}</code></pre>
{{- end -}}
</div>

View file

@ -17,7 +17,7 @@
{{- $Height = $image.Height -}}
{{- $galleryImage = true -}}
{{- if (default true .Page.Site.Params.imageProcessing.content.enabled) -}}
{{- if .Page.Site.Params.imageProcessing.content.enabled -}}
{{- $small := $image.Resize `480x` -}}
{{- $big := $image.Resize `1024x` -}}
{{- $Srcset = printf `%s 480w, %s 1024w` $small.RelPermalink $big.RelPermalink -}}

View file

@ -16,10 +16,8 @@
</header>
{{ $pages := where .Site.RegularPages "Type" "in" .Site.Params.mainSections }}
{{ $notHidden := where .Site.RegularPages "Params.hidden" "!=" true }}
{{ $filtered := ($pages | intersect $notHidden) }}
{{ range $filtered.GroupByDate "2006" }}
{{ range $pages.GroupByDate "2006" }}
{{ $id := lower (replace .Key " " "-") }}
<div class="archives-group" id="{{ $id }}">
<h2 class="archives-date section-title"><a href="{{ $.RelPermalink }}#{{ $id }}">{{ .Key }}</a></h2>

View file

@ -25,7 +25,7 @@
{{- $Width := $image.resource.Width -}}
{{- $Height := $image.resource.Height -}}
{{- if (default true .Page.Site.Params.imageProcessing.cover.enabled) -}}
{{- if .Page.Site.Params.imageProcessing.cover.enabled -}}
{{- $thumbnail := $image.resource.Fill "120x120" -}}
{{- $Permalink = $thumbnail.RelPermalink -}}
{{- $Width = $thumbnail.Width -}}

View file

@ -6,7 +6,6 @@
{{- else -}}
{{- $pages = $pctx.Pages -}}
{{- end -}}
{{- $pages := where $pages "Params.hidden" "!=" true -}}
{{- $limit := .Site.Config.Services.RSS.Limit -}}
{{- if ge $limit 1 -}}
{{- $pages = $pages | first $limit -}}

View file

@ -1,9 +1,6 @@
{{ define "main" }}
{{ $pages := where .Site.RegularPages "Type" "in" .Site.Params.mainSections }}
{{ $notHidden := where .Site.RegularPages "Params.hidden" "!=" true }}
{{ $filtered := ($pages | intersect $notHidden) }}
{{ $pag := .Paginate ($filtered) }}
{{ $pag := .Paginate ($pages) }}
<section class="article-list">
{{ range $index, $element := $pag.Pages }}
{{ partial "article-list/default" . }}

View file

@ -1,16 +1,13 @@
{{- $pages := where .Site.RegularPages "Type" "in" .Site.Params.mainSections -}}
{{- $notHidden := where .Site.RegularPages "Params.hidden" "!=" true -}}
{{- $filtered := ($pages | intersect $notHidden) -}}
{{- $result := slice -}}
{{- range $filtered -}}
{{- range $pages -}}
{{- $data := dict "title" .Title "date" .Date "permalink" .Permalink "content" (.Plain) -}}
{{- $image := partialCached "helper/image" (dict "Context" . "Type" "articleList") .RelPermalink "articleList" -}}
{{- if $image.exists -}}
{{- $imagePermalink := "" -}}
{{- if and $image.resource (default true .Page.Site.Params.imageProcessing.cover.enabled) -}}
{{- if and $image.resource .Page.Site.Params.imageProcessing.cover.enabled -}}
{{- $thumbnail := $image.resource.Fill "120x120" -}}
{{- $imagePermalink = (absURL $thumbnail.Permalink) -}}
{{- else -}}

View file

@ -19,7 +19,7 @@
{{- $Width := $image.resource.Width -}}
{{- $Height := $image.resource.Height -}}
{{- if (default true .Page.Site.Params.imageProcessing.cover.enabled) -}}
{{- if .Page.Site.Params.imageProcessing.cover.enabled -}}
{{- $thumbnail := $image.resource.Fill "120x120" -}}
{{- $Permalink = $thumbnail.RelPermalink -}}
{{- $Width = $thumbnail.Width -}}

View file

@ -9,7 +9,7 @@
{{- $Height := $image.resource.Height -}}
{{- $Srcset := "" -}}
{{- if (default true .Page.Site.Params.imageProcessing.cover.enabled) -}}
{{- if .Page.Site.Params.imageProcessing.cover.enabled -}}
{{- $thumbnail := $image.resource.Resize "800x" -}}
{{- $thumbnailRetina := $image.resource.Resize "1600x" -}}
{{- $Srcset = printf "%s 800w, %s 1600w" $thumbnail.RelPermalink $thumbnailRetina.RelPermalink -}}

View file

@ -1,68 +1,20 @@
<!-- Root element of PhotoSwipe. Must have class pswp. -->
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
{{- $opts := dict "minify" hugo.IsProduction "format" "esm" -}}
{{- $galleryScript := resources.Get "ts/gallery.ts" | js.Build $opts -}}
<!-- Background of PhotoSwipe.
It's a separate element as animating opacity is faster than rgba(). -->
<div class="pswp__bg"></div>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/photoswipe@5.2.7/dist/photoswipe.css"
integrity="sha256-olf9rfn3AG8zR6lkPXkN3PZq63z8tElx7Ela6T4eklo=" crossorigin="anonymous">
<!-- Slides wrapper with overflow:hidden. -->
<div class="pswp__scroll-wrap">
<script type="module">
import StackGallery from '{{ $galleryScript.RelPermalink }}';
import PhotoSwipeLightbox from 'https://cdn.jsdelivr.net/npm/photoswipe@5.2.7/dist/photoswipe-lightbox.esm.min.js';
<!-- Container that holds slides.
PhotoSwipe keeps only 3 of them in the DOM to save memory.
Don't modify these 3 pswp__item elements, data is added later on. -->
<div class="pswp__container">
<div class="pswp__item"></div>
<div class="pswp__item"></div>
<div class="pswp__item"></div>
</div>
console.log(StackGallery)
StackGallery(document.querySelector('.article-content'));
<!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
<div class="pswp__ui pswp__ui--hidden">
<div class="pswp__top-bar">
<!-- Controls are self-explanatory. Order can be changed. -->
<div class="pswp__counter"></div>
<button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
<button class="pswp__button pswp__button--share" title="Share"></button>
<button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
<button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>
<!-- Preloader demo https://codepen.io/dimsemenov/pen/yyBWoR -->
<!-- element will get class pswp__preloader--active when preloader is running -->
<div class="pswp__preloader">
<div class="pswp__preloader__icn">
<div class="pswp__preloader__cut">
<div class="pswp__preloader__donut"></div>
</div>
</div>
</div>
</div>
<div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
<div class="pswp__share-tooltip"></div>
</div>
<button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
</button>
<button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
</button>
<div class="pswp__caption">
<div class="pswp__caption__center"></div>
</div>
</div>
</div>
</div>
{{- partial "helper/external" (dict "Context" . "Namespace" "PhotoSwipe") -}}
const lightbox = new PhotoSwipeLightbox({
gallery: '.article-content',
children: '.gallery-image a',
pswpModule: () => import('https://cdn.jsdelivr.net/npm/photoswipe@5.2.7/dist/photoswipe.esm.min.js')
});
lightbox.init();
</script>

View file

@ -1,4 +1,4 @@
{{ $related := (where (.Site.RegularPages.Related .) "Params.hidden" "!=" true) | first 5 }}
{{ $related := .Site.RegularPages.Related . | first 5 }}
{{ with $related }}
<aside class="related-content--wrapper">
<h2 class="section-title">{{ T "article.relatedContent" }}</h2>

View file

@ -6,9 +6,7 @@
<!-- Build paginator -->
{{ $pages := where .Site.RegularPages "Section" "in" .Site.Params.mainSections }}
{{ $notHidden := where .Site.RegularPages "Params.hidden" "!=" true }}
{{ $filtered := ($pages | intersect $notHidden) }}
{{ $pag := .Paginate ($filtered) }}
{{ $pag := .Paginate ($pages) }}
{{ if .Paginator.HasPrev }}
<!-- Paginated. Append page number to title -->
@ -20,8 +18,7 @@
<!-- Taxonomy page -->
<!-- Build paginator -->
{{ $notHidden := where .Pages "Params.hidden" "!=" true }}
{{ $pag := .Paginate ($notHidden) }}
{{ $pag := .Paginate .Pages }}
<!-- {TAXONOMY_TYPE}: {TAXONOMY_TERM} -->
{{ $title = slice (title .Data.Singular) ": " $title }}

View file

@ -1,5 +1,3 @@
{{- partial "helper/external" (dict "Context" . "Namespace" "Vibrant") -}}
{{- $opts := dict "minify" hugo.IsProduction -}}
{{- $script := resources.Get "ts/main.ts" | js.Build $opts -}}

View file

@ -1,4 +1,4 @@
{{- $ThemeVersion := "3.16.0" -}}
{{- $ThemeVersion := "4.0.0-alpha.0" -}}
<footer class="site-footer">
<section class="copyright">
&copy;

View file

@ -1,5 +1,5 @@
{{- $defaultColorScheme := default "auto" .Site.Params.colorScheme.default -}}
{{- if not (default false .Site.Params.colorScheme.toggle) -}}
{{- $defaultColorScheme := .Site.Params.colorScheme.default -}}
{{- if not .Site.Params.colorScheme.toggle -}}
{{/* If toggle is disabled, force default scheme */}}
<script>
(function() {

View file

@ -19,7 +19,12 @@
{{- end -}}
{{ with .Site.Params.favicon }}
<link rel="shortcut icon" href="{{ . }}" />
{{ $favicon := resources.Get . }}
{{ if $favicon }}
<link rel="shortcut icon" href="{{ $favicon.RelPermalink }}" />
{{ else }}
{{ errorf "Failed loading favicon from %q" . }}
{{ end }}
{{ end }}
{{- template "_internal/google_analytics.html" . -}}

View file

@ -11,6 +11,6 @@
{{- $image := partialCached "helper/image" (dict "Context" . "Type" "opengraph") .RelPermalink "opengraph" -}}
{{- if $image.exists -}}
<meta name="twitter:card" content="{{ default `summary_large_image` .Site.Params.opengraph.twitter.card }}">
<meta name="twitter:card" content="{{ .Site.Params.opengraph.twitter.card }}">
<meta name="twitter:image" content='{{ absURL $image.permalink }}' />
{{- end -}}

View file

@ -7,7 +7,7 @@
<header>
{{ with .Site.Params.sidebar.avatar }}
{{ if (default true .enabled) }}
{{ if .enabled }}
<figure class="site-avatar">
<a href="{{ .Site.BaseURL | relLangURL }}">
{{ if not .local }}
@ -89,7 +89,7 @@
</li>
{{ end }}
{{ if (default false .Site.Params.colorScheme.toggle) }}
{{ if .Site.Params.colorScheme.toggle }}
<li id="dark-mode-toggle">
{{ partial "helper/icon" "toggle-left" }}
{{ partial "helper/icon" "toggle-right" }}

View file

@ -10,9 +10,7 @@
<h2 class="widget-title section-title">{{ T "widget.archives.title" }}</h2>
{{ $pages := where $context.Site.RegularPages "Type" "in" $context.Site.Params.mainSections }}
{{ $notHidden := where $context.Site.RegularPages "Params.hidden" "!=" true }}
{{ $filtered := ($pages | intersect $notHidden) }}
{{ $archives := $filtered.GroupByDate "2006" }}
{{ $archives := $pages.GroupByDate "2006" }}
<div class="widget-archive--list">
{{ range $index, $item := first (add $limit 1) ($archives) }}

View file

@ -20,7 +20,7 @@ features = [
"search",
]
min_version = "0.87.0"
min_version = "0.100.0"
[author]
name = "Jimmy Cai"