Compare commits

...
35 Commits
Author SHA1 Message Date
Jimmy Cai 75f5c209e1 chore: update compiled CSS file 2020-09-20 12:31:37 +02:00
Jimmy Cai 0bcfb160f1 fix: use .RelPermalink to include CSS 2020-09-20 11:33:32 +02:00
Jimmy CaiandGitHub 3a003eadca Merge pull request #13 from CaiJimmy/custom-taxonomy-permalink
feat(article): add support for custom taxonomy link
2020-09-18 20:06:42 +02:00
Jimmy Cai 117dd4b81e fix(article/details): fix custom taxonomy link 2020-09-18 20:05:19 +02:00
Jimmy Cai b2a1afd744 feat(tag cloud): add support for custom taxonomy link 2020-09-18 10:58:38 +02:00
Jimmy CaiandGitHub d292727821 Merge branch 'master' into custom-taxonomy-permalink 2020-09-18 00:35:43 +02:00
Jimmy Cai 93146c9dc3 fix: add .Type as second cache key for helper/image
closes https://github.com/CaiJimmy/hugo-theme-stack/issues/12
2020-09-18 00:12:26 +02:00
Jimmy Cai b540350d76 feat(article): add support for custom taxonomy link 2020-09-18 00:00:39 +02:00
Jimmy Cai c74cc3e4b3 feat(article): add partialCached to article/components/details
Avoid rendering twice (in post list and article page)
2020-09-17 23:13:50 +02:00
Jimmy CaiandGitHub e20d401007 Merge pull request #11 from CaiJimmy/netlify-cache
ci: add cache for Netlify build
2020-09-17 22:33:58 +02:00
Jimmy CaiandGitHub 4a12e6fc31 Merge pull request #10 from CaiJimmy/partials-cache
feat: add partialCached for some of the most invocated partial templates
2020-09-17 22:33:29 +02:00
Jimmy Cai 69e41b1c0d ci(netlify): move plugins folder to exampleSite 2020-09-17 22:30:21 +02:00
Jimmy Cai 3496001c26 fix(netlify): add . to plugin dir 2020-09-17 22:26:08 +02:00
Jimmy Cai c597c208a8 ci(netlify): add resources cache
Modified https://github.com/cdeleeuwe/netlify-plugin-hugo-cache-resources, set cache dir to `exampleSite/resources`
2020-09-17 22:21:14 +02:00
Jimmy Cai bad33e19ae feat(post/single): add partialCached for PhotoSwipe HTML
Forgot to add it
2020-09-17 22:09:15 +02:00
Jimmy Cai 8f0d420d24 feat: add partialCached for data/title data/description 2020-09-17 21:59:57 +02:00
Jimmy Cai cf6502c311 feat: add partialCached to helper/image invocation
Using .RelPermalink as key for cache
2020-09-17 21:52:06 +02:00
Jimmy Cai 9a64b7a6f1 feat: partialCached for PhotoSwipe HTML 2020-09-17 21:46:48 +02:00
Jimmy Cai 96ff911c6e feat(article): better syntax highlight style
Adapt to light & dark mode
2020-09-17 19:48:21 +02:00
Jimmy Cai 845834baa6 refactor(footer): add footer/include.html
To include HTML code for style and script
2020-09-17 19:47:03 +02:00
Jimmy Cai 841508f491 fix(menu): use <ol> to wrap menu items 2020-09-14 13:38:24 +02:00
Jimmy Cai 1e28a661d9 fix(article list): specify image width in srcset 2020-09-14 13:37:50 +02:00
Jimmy Cai 8c4ad17a09 feat(footer): add rel="noopener" to footer links 2020-09-14 13:37:15 +02:00
Jimmy Cai 4267346a4a fix: use absLangURL for menu url
To avoid problem when the site is hosted in subdirectory
2020-09-13 14:03:41 +02:00
Jimmy Cai 779982eb95 doc: update theme.toml 2020-09-13 12:27:14 +02:00
Jimmy Cai a750e02629 doc: add screenshots 2020-09-13 12:24:07 +02:00
Jimmy Cai f26a9fa070 feat: add support for non-extended version of Hugo
resources folder is included now, with compiled SCSS file
2020-09-13 12:16:43 +02:00
Jimmy Cai b06910fc5d feat: add avatar placeholder to assets/img 2020-09-13 11:30:31 +02:00
Jimmy Cai c12de4db04 refactor: rename archive -> archives in config.toml
And rename SVG icon.
2020-09-13 11:26:12 +02:00
Jimmy Cai 7379bbe412 refactor: rename archive -> archives 2020-09-13 11:22:47 +02:00
Jimmy Cai c600f87213 feat: make archive template available for all sections 2020-09-13 11:00:19 +02:00
Jimmy Cai 45e7e07a86 refactor: change default article layout
Post layout become exclusive for `post` section (with toolbar)
Page layout become the default layout (without toolbar)
2020-09-13 10:59:52 +02:00
Jimmy Cai 294f445e0a doc(config.toml): change baseurl to https://example.com
Following Hugo theme showcase guideline
2020-09-13 10:51:31 +02:00
Jimmy Cai 2451b194dc refactor: use relLangURL to build relative links
For better i18n support

Fixes archive page path
Remove tag cloud term exclusion

closes https://github.com/CaiJimmy/hugo-theme-stack/issues/8
2020-09-13 10:14:17 +02:00
Jimmy CaiandGitHub 822eba9513 doc(github): add issue templates 2020-09-12 23:57:44 +02:00
51 changed files with 1098 additions and 124 deletions
+38
View File
@@ -0,0 +1,38 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.
+20
View File
@@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
+3 -1
View File
@@ -33,7 +33,9 @@ The only JavaScript library being used is [node-vibrant](https://github.com/Vibr
## Requirements ## Requirements
This theme uses SCSS and TypeScript. For that reason, it's necessary to use **Hugo Extended version ≥ 0.74.0**. This theme uses SCSS and TypeScript. For that reason, it's necessary to use **Hugo ≥ 0.74.0**.
**Note**: You'll need Hugo Extended version to edit SCSS files
## Installation ## Installation
+390
View File
@@ -0,0 +1,390 @@
/*
* Style: monokai
* https://xyproto.github.io/splash/docs/monokai.html
*/
:root {
--pre-text-color: #f8f8f2;
--pre-background-color: #272822;
}
/* Background */
.chroma {
color: #f8f8f2;
background-color: #272822
}
/* Other */
.chroma .x {}
/* Error */
.chroma .err {
color: #960050;
background-color: #1e0010
}
/* LineTableTD */
.chroma .lntd {
vertical-align: top;
padding: 0;
margin: 0;
border: 0;
}
/* LineTable */
.chroma .lntable {
border-spacing: 0;
padding: 0;
margin: 0;
border: 0;
width: auto;
overflow: auto;
display: block;
}
/* LineHighlight */
.chroma .hl {
display: block;
width: 100%;
background-color: #ffffcc
}
/* LineNumbersTable */
.chroma .lnt {
margin-right: 0.4em;
padding: 0 0.4em 0 0.4em;
color: #7f7f7f
}
/* LineNumbers */
.chroma .ln {
margin-right: 0.4em;
padding: 0 0.4em 0 0.4em;
color: #7f7f7f
}
/* Keyword */
.chroma .k {
color: #66d9ef
}
/* KeywordConstant */
.chroma .kc {
color: #66d9ef
}
/* KeywordDeclaration */
.chroma .kd {
color: #66d9ef
}
/* KeywordNamespace */
.chroma .kn {
color: #f92672
}
/* KeywordPseudo */
.chroma .kp {
color: #66d9ef
}
/* KeywordReserved */
.chroma .kr {
color: #66d9ef
}
/* KeywordType */
.chroma .kt {
color: #66d9ef
}
/* Name */
.chroma .n {}
/* NameAttribute */
.chroma .na {
color: #a6e22e
}
/* NameBuiltin */
.chroma .nb {}
/* NameBuiltinPseudo */
.chroma .bp {}
/* NameClass */
.chroma .nc {
color: #a6e22e
}
/* NameConstant */
.chroma .no {
color: #66d9ef
}
/* NameDecorator */
.chroma .nd {
color: #a6e22e
}
/* NameEntity */
.chroma .ni {}
/* NameException */
.chroma .ne {
color: #a6e22e
}
/* NameFunction */
.chroma .nf {
color: #a6e22e
}
/* NameFunctionMagic */
.chroma .fm {}
/* NameLabel */
.chroma .nl {}
/* NameNamespace */
.chroma .nn {}
/* NameOther */
.chroma .nx {
color: #a6e22e
}
/* NameProperty */
.chroma .py {}
/* NameTag */
.chroma .nt {
color: #f92672
}
/* NameVariable */
.chroma .nv {}
/* NameVariableClass */
.chroma .vc {}
/* NameVariableGlobal */
.chroma .vg {}
/* NameVariableInstance */
.chroma .vi {}
/* NameVariableMagic */
.chroma .vm {}
/* Literal */
.chroma .l {
color: #ae81ff
}
/* LiteralDate */
.chroma .ld {
color: #e6db74
}
/* LiteralString */
.chroma .s {
color: #e6db74
}
/* LiteralStringAffix */
.chroma .sa {
color: #e6db74
}
/* LiteralStringBacktick */
.chroma .sb {
color: #e6db74
}
/* LiteralStringChar */
.chroma .sc {
color: #e6db74
}
/* LiteralStringDelimiter */
.chroma .dl {
color: #e6db74
}
/* LiteralStringDoc */
.chroma .sd {
color: #e6db74
}
/* LiteralStringDouble */
.chroma .s2 {
color: #e6db74
}
/* LiteralStringEscape */
.chroma .se {
color: #ae81ff
}
/* LiteralStringHeredoc */
.chroma .sh {
color: #e6db74
}
/* LiteralStringInterpol */
.chroma .si {
color: #e6db74
}
/* LiteralStringOther */
.chroma .sx {
color: #e6db74
}
/* LiteralStringRegex */
.chroma .sr {
color: #e6db74
}
/* LiteralStringSingle */
.chroma .s1 {
color: #e6db74
}
/* LiteralStringSymbol */
.chroma .ss {
color: #e6db74
}
/* LiteralNumber */
.chroma .m {
color: #ae81ff
}
/* LiteralNumberBin */
.chroma .mb {
color: #ae81ff
}
/* LiteralNumberFloat */
.chroma .mf {
color: #ae81ff
}
/* LiteralNumberHex */
.chroma .mh {
color: #ae81ff
}
/* LiteralNumberInteger */
.chroma .mi {
color: #ae81ff
}
/* LiteralNumberIntegerLong */
.chroma .il {
color: #ae81ff
}
/* LiteralNumberOct */
.chroma .mo {
color: #ae81ff
}
/* Operator */
.chroma .o {
color: #f92672
}
/* OperatorWord */
.chroma .ow {
color: #f92672
}
/* Punctuation */
.chroma .p {}
/* Comment */
.chroma .c {
color: #75715e
}
/* CommentHashbang */
.chroma .ch {
color: #75715e
}
/* CommentMultiline */
.chroma .cm {
color: #75715e
}
/* CommentSingle */
.chroma .c1 {
color: #75715e
}
/* CommentSpecial */
.chroma .cs {
color: #75715e
}
/* CommentPreproc */
.chroma .cp {
color: #75715e
}
/* CommentPreprocFile */
.chroma .cpf {
color: #75715e
}
/* Generic */
.chroma .g {}
/* GenericDeleted */
.chroma .gd {
color: #f92672
}
/* GenericEmph */
.chroma .ge {
font-style: italic
}
/* GenericError */
.chroma .gr {}
/* GenericHeading */
.chroma .gh {}
/* GenericInserted */
.chroma .gi {
color: #a6e22e
}
/* GenericOutput */
.chroma .go {}
/* GenericPrompt */
.chroma .gp {}
/* GenericStrong */
.chroma .gs {
font-weight: bold
}
/* GenericSubheading */
.chroma .gu {
color: #75715e
}
/* GenericTraceback */
.chroma .gt {}
/* GenericUnderline */
.chroma .gl {}
/* TextWhitespace */
.chroma .w {}
+411
View File
@@ -0,0 +1,411 @@
/*
* Style: monokailight
* https://xyproto.github.io/splash/docs/monokailight.html
*/
:root {
--pre-text-color: #272822;
--pre-background-color: #fafafa;
}
/* Background */
.chroma {
color: #272822;
background-color: #fafafa;
}
/* Other */
.chroma .x {}
/* Error */
.chroma .err {
color: #960050;
background-color: #1e0010
}
/* LineTableTD */
.chroma .lntd {
vertical-align: top;
padding: 0;
margin: 0;
border: 0;
}
/* LineTable */
.chroma .lntable {
border-spacing: 0;
padding: 0;
margin: 0;
border: 0;
width: auto;
overflow: auto;
display: block;
}
/* LineHighlight */
.chroma .hl {
display: block;
width: 100%;
background-color: #ffffcc
}
/* LineNumbersTable */
.chroma .lnt {
margin-right: 0.4em;
padding: 0 0.4em 0 0.4em;
color: #7f7f7f
}
/* LineNumbers */
.chroma .ln {
margin-right: 0.4em;
padding: 0 0.4em 0 0.4em;
color: #7f7f7f
}
/* Keyword */
.chroma .k {
color: #00a8c8
}
/* KeywordConstant */
.chroma .kc {
color: #00a8c8
}
/* KeywordDeclaration */
.chroma .kd {
color: #00a8c8
}
/* KeywordNamespace */
.chroma .kn {
color: #f92672
}
/* KeywordPseudo */
.chroma .kp {
color: #00a8c8
}
/* KeywordReserved */
.chroma .kr {
color: #00a8c8
}
/* KeywordType */
.chroma .kt {
color: #00a8c8
}
/* Name */
.chroma .n {
color: #111111
}
/* NameAttribute */
.chroma .na {
color: #75af00
}
/* NameBuiltin */
.chroma .nb {
color: #111111
}
/* NameBuiltinPseudo */
.chroma .bp {
color: #111111
}
/* NameClass */
.chroma .nc {
color: #75af00
}
/* NameConstant */
.chroma .no {
color: #00a8c8
}
/* NameDecorator */
.chroma .nd {
color: #75af00
}
/* NameEntity */
.chroma .ni {
color: #111111
}
/* NameException */
.chroma .ne {
color: #75af00
}
/* NameFunction */
.chroma .nf {
color: #75af00
}
/* NameFunctionMagic */
.chroma .fm {
color: #111111
}
/* NameLabel */
.chroma .nl {
color: #111111
}
/* NameNamespace */
.chroma .nn {
color: #111111
}
/* NameOther */
.chroma .nx {
color: #75af00
}
/* NameProperty */
.chroma .py {
color: #111111
}
/* NameTag */
.chroma .nt {
color: #f92672
}
/* NameVariable */
.chroma .nv {
color: #111111
}
/* NameVariableClass */
.chroma .vc {
color: #111111
}
/* NameVariableGlobal */
.chroma .vg {
color: #111111
}
/* NameVariableInstance */
.chroma .vi {
color: #111111
}
/* NameVariableMagic */
.chroma .vm {
color: #111111
}
/* Literal */
.chroma .l {
color: #ae81ff
}
/* LiteralDate */
.chroma .ld {
color: #d88200
}
/* LiteralString */
.chroma .s {
color: #d88200
}
/* LiteralStringAffix */
.chroma .sa {
color: #d88200
}
/* LiteralStringBacktick */
.chroma .sb {
color: #d88200
}
/* LiteralStringChar */
.chroma .sc {
color: #d88200
}
/* LiteralStringDelimiter */
.chroma .dl {
color: #d88200
}
/* LiteralStringDoc */
.chroma .sd {
color: #d88200
}
/* LiteralStringDouble */
.chroma .s2 {
color: #d88200
}
/* LiteralStringEscape */
.chroma .se {
color: #8045ff
}
/* LiteralStringHeredoc */
.chroma .sh {
color: #d88200
}
/* LiteralStringInterpol */
.chroma .si {
color: #d88200
}
/* LiteralStringOther */
.chroma .sx {
color: #d88200
}
/* LiteralStringRegex */
.chroma .sr {
color: #d88200
}
/* LiteralStringSingle */
.chroma .s1 {
color: #d88200
}
/* LiteralStringSymbol */
.chroma .ss {
color: #d88200
}
/* LiteralNumber */
.chroma .m {
color: #ae81ff
}
/* LiteralNumberBin */
.chroma .mb {
color: #ae81ff
}
/* LiteralNumberFloat */
.chroma .mf {
color: #ae81ff
}
/* LiteralNumberHex */
.chroma .mh {
color: #ae81ff
}
/* LiteralNumberInteger */
.chroma .mi {
color: #ae81ff
}
/* LiteralNumberIntegerLong */
.chroma .il {
color: #ae81ff
}
/* LiteralNumberOct */
.chroma .mo {
color: #ae81ff
}
/* Operator */
.chroma .o {
color: #f92672
}
/* OperatorWord */
.chroma .ow {
color: #f92672
}
/* Punctuation */
.chroma .p {
color: #111111
}
/* Comment */
.chroma .c {
color: #75715e
}
/* CommentHashbang */
.chroma .ch {
color: #75715e
}
/* CommentMultiline */
.chroma .cm {
color: #75715e
}
/* CommentSingle */
.chroma .c1 {
color: #75715e
}
/* CommentSpecial */
.chroma .cs {
color: #75715e
}
/* CommentPreproc */
.chroma .cp {
color: #75715e
}
/* CommentPreprocFile */
.chroma .cpf {
color: #75715e
}
/* Generic */
.chroma .g {}
/* GenericDeleted */
.chroma .gd {}
/* GenericEmph */
.chroma .ge {
font-style: italic
}
/* GenericError */
.chroma .gr {}
/* GenericHeading */
.chroma .gh {}
/* GenericInserted */
.chroma .gi {}
/* GenericOutput */
.chroma .go {}
/* GenericPrompt */
.chroma .gp {}
/* GenericStrong */
.chroma .gs {
font-weight: bold
}
/* GenericSubheading */
.chroma .gu {}
/* GenericTraceback */
.chroma .gt {}
/* GenericUnderline */
.chroma .gl {}
/* TextWhitespace */
.chroma .w {}

Before

Width:  |  Height:  |  Size: 432 B

After

Width:  |  Height:  |  Size: 432 B

Before

Width:  |  Height:  |  Size: 373 B

After

Width:  |  Height:  |  Size: 373 B

@@ -1,6 +1,6 @@
.archive-group { .archives-group {
margin-bottom: var(--section-separation); margin-bottom: var(--section-separation);
.archive-date { .archives-date {
text-transform: uppercase; text-transform: uppercase;
margin-bottom: 10px; margin-bottom: 10px;
font-size: 1.6rem; font-size: 1.6rem;
@@ -12,7 +12,7 @@
} }
} }
.template-archive { .template-archives {
.category-list { .category-list {
margin-bottom: var(--section-separation); margin-bottom: var(--section-separation);
overflow-x: auto; overflow-x: auto;
+1
View File
@@ -122,6 +122,7 @@
/* Menu style */ /* Menu style */
.menu { .menu {
padding-left: 0;
list-style: none; list-style: none;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
+3 -3
View File
@@ -43,9 +43,9 @@
} }
} }
/* Archive widget */ /* Archives widget */
.widget.archive { .widget.archives {
.archive-year { .archives-year {
margin-bottom: 10px; margin-bottom: 10px;
a { a {
background-color: var(--card-background); background-color: var(--card-background);
+1 -1
View File
@@ -18,7 +18,7 @@
@import "partials/pagination.scss"; @import "partials/pagination.scss";
@import "partials/sidebar.scss"; @import "partials/sidebar.scss";
@import "partials/base.scss"; @import "partials/base.scss";
@import "partials/layout/archive.scss"; @import "partials/layout/archives.scss";
@import "partials/layout/article.scss"; @import "partials/layout/article.scss";
@import "partials/layout/taxonomy.scss"; @import "partials/layout/taxonomy.scss";
@import "partials/layout/404.scss"; @import "partials/layout/404.scss";
+15 -11
View File
@@ -1,4 +1,4 @@
baseurl = "https://theme-stack.jimmycai.com/" baseurl = "https://example.com"
languageCode = "en-us" languageCode = "en-us"
theme = "hugo-theme-stack" theme = "hugo-theme-stack"
paginate = 5 paginate = 5
@@ -29,11 +29,11 @@ DefaultContentLanguage = "en" # Theme i18n support
# Only Disqus is available so far # Only Disqus is available so far
provider = "disqus" provider = "disqus"
[params.widgets] [params.widgets]
enabled = ['archive', 'tag-cloud'] enabled = ['archives', 'tag-cloud']
[params.widgets.archive] [params.widgets.archives]
limit = 5 limit = 5
### Archive page relative URL ### Archives page relative URL
path = "archive" path = "archives"
[params.widgets.tagCloud] [params.widgets.tagCloud]
limit = 10 limit = 10
[params.opengraph] [params.opengraph]
@@ -64,15 +64,15 @@ DefaultContentLanguage = "en" # Theme i18n support
[[menu.main]] [[menu.main]]
identifier = "about-cn" identifier = "about-cn"
name = "About" name = "About"
url = "/about/" url = "about"
weight = -90 weight = -90
pre = "user" pre = "user"
[[menu.main]] [[menu.main]]
identifier = "archive" identifier = "archives"
name = "Archive" name = "Archives"
url = "/archive/" url = "archives"
weight = -70 weight = -70
pre = "archive" pre = "archives"
[related] [related]
includeNewer = true includeNewer = true
@@ -85,4 +85,8 @@ DefaultContentLanguage = "en" # Theme i18n support
[[related.indices]] [[related.indices]]
name = "categories" name = "categories"
weight = 200 weight = 200
[markup]
[markup.highlight]
noClasses = false
-6
View File
@@ -1,6 +0,0 @@
---
title: "Archive"
date: 2019-05-28
layout: "archive"
slug: "archive"
---
+6
View File
@@ -0,0 +1,6 @@
---
title: "Archives"
date: 2019-05-28
layout: "archives"
slug: "archives"
---
@@ -0,0 +1,27 @@
> Original Repo: https://github.com/cdeleeuwe/netlify-plugin-hugo-cache-resources
>
# Netlify Build Plugin: Persist Hugo resources Between Builds
Persist [Hugo](https://gohugo.io/) resources folder between Netlify builds for huge build speed improvements! ⚡️
This plugin caches the `resources` folder after build. If you are processing many images, this would improve build duration significantly.
Note: Restoring cache only comes from the production branch. So once cache is saved on the production branch, the next preview build would use the cache. For example, when pushing to the same preview build, the latest preview build will not get the cache from the previous preview build, but will get it from master.
## Usage
To install, add the following lines to your `netlify.toml` file:
```toml
[build]
publish = "public"
[[plugins]]
package = "netlify-plugin-hugo-cache-resources"
[plugins.inputs]
# If it should show more verbose logs (optional, default = true)
debug = true
```
Note: The `[[plugins]]` line is required for each plugin, even if you have other plugins in your `netlify.toml` file already.
@@ -0,0 +1,39 @@
const getResourcesDir = () => {
return 'exampleSite/resources';
}
const printList = (items) => {
console.log('---');
items.forEach((item, index) => {
console.log(`${index + 1}. ${item}`);
});
}
module.exports = {
async onPreBuild({ utils, inputs }) {
const path = getResourcesDir();
const success = await utils.cache.restore(path);
if (success) {
const cachedFiles = await utils.cache.list(path);
console.log(`Restored cached resources folder. Total files: ${cachedFiles.length}`);
if (inputs.debug) printList(cachedFiles);
} else {
console.log(`No cache found for resources folder`);
}
},
async onPostBuild({ utils, inputs }) {
const path = getResourcesDir();
const success = await utils.cache.save(path);
if (success) {
const cachedFiles = await utils.cache.list(path);
console.log(`Saved resources folder to cache. Total files: ${cachedFiles.length}`);
if (inputs.debug) printList(cachedFiles);
} else {
console.log(`No resources folder cached`);
}
}
};
@@ -0,0 +1,5 @@
name: netlify-plugin-hugo-cache
inputs:
- name: debug
description: Show more verbose logs
default: true
+3 -3
View File
@@ -7,10 +7,10 @@
[lastUpdatedOn] [lastUpdatedOn]
other ="Last updated on {{ .Count }}" other ="Last updated on {{ .Count }}"
[widgetArchiveTitle] [widgetArchivesTitle]
other = "Archive" other = "Archives"
[widgetArchiveMore] [widgetArchivesMore]
other = "More" other = "More"
[widgetTagCloudTitle] [widgetTagCloudTitle]
+2 -2
View File
@@ -7,10 +7,10 @@
[lastUpdatedOn] [lastUpdatedOn]
other ="最后更新于 {{ .Count }}" other ="最后更新于 {{ .Count }}"
[widgetArchiveTitle] [widgetArchivesTitle]
other = "归档" other = "归档"
[widgetArchiveMore] [widgetArchivesMore]
other = "更多" other = "更多"
[widgetTagCloudTitle] [widgetTagCloudTitle]
Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

@@ -1,4 +1,4 @@
{{ define "body-class" }}template-archive{{ end }} {{ define "body-class" }}template-archives{{ end }}
{{ define "main" }} {{ define "main" }}
{{ $categories := ($.Site.GetPage "taxonomyTerm" "categories").Pages }} {{ $categories := ($.Site.GetPage "taxonomyTerm" "categories").Pages }}
{{ if $categories }} {{ if $categories }}
@@ -7,7 +7,7 @@
<div class="category-list"> <div class="category-list">
<div class="article-list--tile"> <div class="article-list--tile">
{{ range $categories }} {{ range $categories }}
{{ partial "article-list/tile" (dict "context" . "size" "250x150") }} {{ partial "article-list/tile" (dict "context" . "size" "250x150" "Type" "taxonomy") }}
{{ end }} {{ end }}
</div> </div>
</div> </div>
@@ -20,8 +20,8 @@
{{ range $filtered.GroupByDate "2006" }} {{ range $filtered.GroupByDate "2006" }}
{{ $id := lower (replace .Key " " "-") }} {{ $id := lower (replace .Key " " "-") }}
<div class="archive-group" id="{{ $id }}"> <div class="archives-group" id="{{ $id }}">
<h3 class="archive-date"><a href="{{ $.Permalink }}#{{ $id }}">{{ .Key }}</a></h3> <h3 class="archives-date"><a href="{{ $.Permalink }}#{{ $id }}">{{ .Key }}</a></h3>
<div class="article-list--compact"> <div class="article-list--compact">
{{ range .Pages }} {{ range .Pages }}
{{ partial "article-list/compact" . }} {{ partial "article-list/compact" . }}
+1 -3
View File
@@ -9,8 +9,6 @@
</main> </main>
{{- block "right-sidebar" . -}}{{ end }} {{- block "right-sidebar" . -}}{{ end }}
</div> </div>
{{ partial "footer/script.html" . }} {{ partial "footer/include.html" . }}
{{ partial "footer/style.html" . }}
{{ partial "footer/custom.html" . }}
</body> </body>
</html> </html>
+3 -12
View File
@@ -1,21 +1,12 @@
{{ define "container-class" }}article-page with-toolbar{{ end }} {{ define "body-class" }}article-page keep-sidebar{{ end }}
{{ define "main" }} {{ define "main" }}
<div id="article-toolbar">
<a href="{{ .Site.BaseURL }}" class="back-home">
{{ (resources.Get "icons/back.svg").Content | safeHTML }}
<span>Back</span>
</a>
</div>
{{ partial "article/article.html" . }} {{ partial "article/article.html" . }}
{{ partial "article/components/related-contents" . }} {{ if or (not (isset .Params "comments")) (eq .Params.comments "true")}}
{{ if or (not (isset .Params "comments")) (eq .Params.comments "true")}}
{{ partial "comments/include" . }} {{ partial "comments/include" . }}
{{ end }} {{ end }}
{{ partialCached "footer/footer" . }} {{ partialCached "footer/footer" . }}
{{- partial "article/components/photoswipe.html" . -}} {{ partialCached "article/components/photoswipe" . }}
{{ end }} {{ end }}
+1 -1
View File
@@ -9,7 +9,7 @@
{{ end }} {{ end }}
</div> </div>
{{ $image := partial "helper/image" (dict "Context" . "Type" "taxonomy") }} {{- $image := partialCached "helper/image" (dict "Context" . "Type" "taxonomy") .RelPermalink "taxonomy" -}}
{{ if $image.exists }} {{ if $image.exists }}
<div class="taxonomy-image"> <div class="taxonomy-image">
{{ if $image.resource }} {{ if $image.resource }}
-12
View File
@@ -1,12 +0,0 @@
{{ define "body-class" }}article-page keep-sidebar{{ end }}
{{ define "main" }}
{{ partial "article/article.html" . }}
{{ if or (not (isset .Params "comments")) (eq .Params.comments "true")}}
{{ partial "comments/include" . }}
{{ end }}
{{ partialCached "footer/footer" . }}
{{ partial "article/components/photoswipe" . }}
{{ end }}
+1 -2
View File
@@ -12,8 +12,7 @@
</footer> </footer>
</div> </div>
{{ $image := partial "helper/image" (dict "Context" . "Type" "articleList") }} {{- $image := partialCached "helper/image" (dict "Context" . "Type" "articleList") .RelPermalink "articleList" -}}
{{ if $image.exists }} {{ if $image.exists }}
<div class="article-image"> <div class="article-image">
{{ if $image.resource }} {{ if $image.resource }}
+3 -3
View File
@@ -1,4 +1,4 @@
{{ $image := partial "helper/image" (dict "Context" . "Type" "articleList") }} {{ $image := partialCached "helper/image" (dict "Context" . "Type" "articleList") .RelPermalink "articleList" }}
<article class="{{ if $image.exists }}has-image{{ end }}"> <article class="{{ if $image.exists }}has-image{{ end }}">
{{ if $image.exists }} {{ if $image.exists }}
<div class="article-image"> <div class="article-image">
@@ -8,7 +8,7 @@
{{- $thumbnailRetina := $image.resource.Fill "1600x500" -}} {{- $thumbnailRetina := $image.resource.Fill "1600x500" -}}
<img src="{{ $thumbnail.RelPermalink }}" <img src="{{ $thumbnail.RelPermalink }}"
srcset="{{ $thumbnail.RelPermalink }} 1x, {{ $thumbnailRetina.RelPermalink }} 2x" srcset="{{ $thumbnail.RelPermalink }} 800w, {{ $thumbnailRetina.RelPermalink }} 1600w"
width="{{ $thumbnail.Width }}" height="{{ $thumbnail.Height }}" loading="lazy" width="{{ $thumbnail.Width }}" height="{{ $thumbnail.Height }}" loading="lazy"
alt="Featured image of post {{ .Title }}" /> alt="Featured image of post {{ .Title }}" />
{{ else }} {{ else }}
@@ -18,5 +18,5 @@
</div> </div>
{{ end }} {{ end }}
{{ partial "article/components/details" . }} {{ partialCached "article/components/details" . .RelPermalink }}
</article> </article>
+1 -1
View File
@@ -1,4 +1,4 @@
{{ $image := partial "helper/image" (dict "Context" .context "Type" .Type) }} {{ $image := partialCached "helper/image" (dict "Context" .context "Type" .Type) .context.RelPermalink .Type }}
<article class="{{ if $image.exists }}has-image{{ end }}"> <article class="{{ if $image.exists }}has-image{{ end }}">
<a href="{{ .context.Permalink }}"> <a href="{{ .context.Permalink }}">
@@ -1,16 +1,18 @@
{{ $image := partial "helper/image" (dict "Context" .) }} {{ $image := partialCached "helper/image" (dict "Context" . "Type" "article") .RelPermalink "article" }}
{{ $context := . }} {{- $context := . -}}
{{- $categories := .Params.categories -}}
<div class="article-details"> <div class="article-details">
{{ with $categories := .Params.categories }} {{ if $categories }}
<header class="article-category"> <header class="article-category">
{{ range $categories }} {{ range $category := $categories }}
{{ $term := $.Site.GetPage (printf "/categories/%s" $category) }}
{{ if and $image.exists $image.resource }} {{ if and $image.exists $image.resource }}
{{- $imageRaw := $image.resource | resources.Fingerprint "md5" -}} {{- $imageRaw := $image.resource | resources.Fingerprint "md5" -}}
{{- $20x := $imageRaw.Fill "20x20 smart" -}} {{- $20x := $imageRaw.Fill "20x20 smart" -}}
<a href="/categories/{{ . | urlize }}" class="color-tag" <a href="{{ $term.Permalink }}" class="color-tag"
data-image="{{ $20x.RelPermalink }}" data-key="{{ $context.Slug }}" data-hash="{{ $imageRaw.Data.Integrity }}">{{ . | humanize }}</a> data-image="{{ $20x.RelPermalink }}" data-key="{{ $context.Slug }}" data-hash="{{ $imageRaw.Data.Integrity }}">{{ $term.Title | humanize }}</a>
{{ else }} {{ else }}
<a href="/categories/{{ . | urlize }}">{{ . | humanize }}</a> <a href="{{ $term.Permalink }}">{{ $term.Title | humanize }}</a>
{{ end }} {{ end }}
{{ end }} {{ end }}
</header> </header>
@@ -1,11 +1,5 @@
<footer class="article-footer"> <footer class="article-footer">
{{ with $tags := .Params.Tags }} {{ partial "article/components/tags" . }}
<section class="article-tags">
{{ range $tags }}
<a href="/tags/{{ . | urlize }}">{{ . | humanize }}</a>
{{ end }}
</section>
{{ end }}
{{ if and (.Site.Params.article.license.enabled) (not (eq .Params.license false)) }} {{ if and (.Site.Params.article.license.enabled) (not (eq .Params.license false)) }}
<section class="article-copyright"> <section class="article-copyright">
@@ -1,6 +1,5 @@
<header class="article-header"> <header class="article-header">
{{ $image := partial "helper/image" (dict "Context" . "Type" "article") }} {{- $image := partialCached "helper/image" (dict "Context" . "Type" "article") .RelPermalink "article" -}}
{{ if $image.exists }} {{ if $image.exists }}
<div class="article-image"> <div class="article-image">
{{ if $image.resource }} {{ if $image.resource }}
@@ -16,5 +15,5 @@
</div> </div>
{{ end }} {{ end }}
{{ partial "article/components/details" . }} {{ partialCached "article/components/details" . .RelPermalink }}
</header> </header>
@@ -5,7 +5,7 @@
<div class="related-contents"> <div class="related-contents">
<div class="flex article-list--tile"> <div class="flex article-list--tile">
{{ range . }} {{ range . }}
{{ partial "article-list/tile" (dict "context" . "size" "250x150") }} {{ partial "article-list/tile" (dict "context" . "size" "250x150" "Type" "articleList") }}
{{ end }} {{ end }}
</div> </div>
</div> </div>
@@ -0,0 +1,10 @@
{{- $tags := .Params.Tags -}}
{{ if $tags }}
<section class="article-tags">
{{ range $tag := $tags }}
{{ with $.Site.GetPage (printf "/tags/%s" $tag) }}
<a href="{{ .Permalink }}">{{ .Title | humanize }}</a>
{{ end }}
{{ end }}
</section>
{{ end }}
@@ -0,0 +1,4 @@
{{- $light := resources.Get "css/highlight/light.css" | minify -}}
{{- $dark := resources.Get "css/highlight/dark.css" | minify -}}
<link rel="stylesheet" href="{{ $light.RelPermalink }}" media="(prefers-color-scheme: light)">
<link rel="stylesheet" href="{{ $dark.RelPermalink }}" media="(prefers-color-scheme: dark)">
@@ -1,7 +1,7 @@
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vibrant.min.js" <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vibrant.min.js"
integrity="sha256-5NovOZc4iwiAWTYIFiIM7DxKUXKWvpVEuMEPLzcm5/g=" crossorigin="anonymous"></script> integrity="sha256-5NovOZc4iwiAWTYIFiIM7DxKUXKWvpVEuMEPLzcm5/g=" crossorigin="anonymous"></script>
{{ $opts := dict "minify" hugo.IsProduction }} {{- $opts := dict "minify" hugo.IsProduction -}}
{{ $script := resources.Get "ts/main.ts" | js.Build $opts }} {{- $script := resources.Get "ts/main.ts" | js.Build $opts -}}
<script type="text/javascript" src="{{ $script.RelPermalink }}" defer></script> <script type="text/javascript" src="{{ $script.RelPermalink }}" defer></script>
+3 -3
View File
@@ -1,8 +1,8 @@
<footer class="site-footer"> <footer class="site-footer">
<section class="copyright">&copy; {{ now.Format "2006" }} {{ .Site.Title }}</section> <section class="copyright">&copy; {{ now.Format "2006" }} {{ .Site.Title }}</section>
<section class="powerby"> <section class="powerby">
Built with <a href="https://gohugo.io/" target="_blank">Hugo</a> <br /> Built with <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a> <br />
Theme <b><a href="https://github.com/CaiJimmy/hugo-theme-stack" target="_blank">Stack</a></b> designed by Theme <b><a href="https://github.com/CaiJimmy/hugo-theme-stack" target="_blank" rel="noopener">Stack</a></b> designed by
<a href="https://jimmycai.com" target="_blank">Jimmy</a> <a href="https://jimmycai.com" target="_blank" rel="noopener">Jimmy</a>
</section> </section>
</footer> </footer>
+4
View File
@@ -0,0 +1,4 @@
{{ partialCached "footer/components/script.html" . }}
{{ partialCached "footer/components/custom-font.html" . }}
{{ partialCached "footer/components/highlight.html" . }}
{{ partial "footer/custom.html" . }}
+2 -2
View File
@@ -2,10 +2,10 @@
<meta charset='utf-8'> <meta charset='utf-8'>
<meta name='viewport' content='width=device-width, initial-scale=1'> <meta name='viewport' content='width=device-width, initial-scale=1'>
{{- $description := partial "data/description" . -}} {{- $description := partialCached "data/description" . .RelPermalink -}}
<meta name='description' content='{{ $description }}'> <meta name='description' content='{{ $description }}'>
{{- $title := partial "data/title" . -}} {{- $title := partialCached "data/title" . .RelPermalink -}}
<title>{{ $title }}</title> <title>{{ $title }}</title>
<link rel='canonical' href='{{ .Permalink }}'> <link rel='canonical' href='{{ .Permalink }}'>
@@ -1,5 +1,5 @@
{{- $title := partial "data/title" . -}} {{- $title := partialCached "data/title" . .RelPermalink -}}
{{- $description := partial "data/description" . -}} {{- $description := partialCached "data/description" . .RelPermalink -}}
<meta property='og:title' content='{{ $title }}'> <meta property='og:title' content='{{ $title }}'>
<meta property='og:description' content='{{ $description }}'> <meta property='og:description' content='{{ $description }}'>
@@ -37,7 +37,7 @@
{{- end -}} {{- end -}}
{{- end -}} {{- end -}}
{{ $image := partial "helper/image" (dict "Context" . "Type" "opengraph") }} {{ $image := partialCached "helper/image" (dict "Context" . "Type" "opengraph") .RelPermalink "opengraph" }}
{{- if $image.exists -}} {{- if $image.exists -}}
<meta property='og:image' content='{{ absURL $image.permalink }}' /> <meta property='og:image' content='{{ absURL $image.permalink }}' />
{{- end -}} {{- end -}}
@@ -2,13 +2,13 @@
<meta name="twitter:site" content="{{ . }}"> <meta name="twitter:site" content="{{ . }}">
{{- end -}} {{- end -}}
{{- $title := partial "data/title" . -}} {{- $title := partialCached "data/title" . .RelPermalink -}}
{{- $description := partial "data/description" . -}} {{- $description := partialCached "data/description" . .RelPermalink -}}
<meta name="twitter:title" content="{{ $title }}"> <meta name="twitter:title" content="{{ $title }}">
<meta name="twitter:description" content="{{ $description }}"> <meta name="twitter:description" content="{{ $description }}">
{{- $image := partial "helper/image" (dict "Context" . "Type" "opengraph") -}} {{- $image := partialCached "helper/image" (dict "Context" . "Type" "opengraph") .RelPermalink "opengraph" -}}
{{- if $image.exists -}} {{- if $image.exists -}}
<meta name="twitter:card" content="{{ .Site.Params.opengraph.twitter.card }}"> <meta name="twitter:card" content="{{ .Site.Params.opengraph.twitter.card }}">
<meta name="twitter:image" content='{{ absURL $image.permalink }}' /> <meta name="twitter:image" content='{{ absURL $image.permalink }}' />
+1 -1
View File
@@ -1,3 +1,3 @@
{{ $sass := resources.Get "scss/style.scss" }} {{ $sass := resources.Get "scss/style.scss" }}
{{ $style := $sass | resources.ToCSS | minify }} {{ $style := $sass | resources.ToCSS | minify }}
<link rel="stylesheet" href="{{ $style.Permalink }}"> <link rel="stylesheet" href="{{ $style.RelPermalink }}">
+3 -3
View File
@@ -25,13 +25,13 @@
<h2 class="site-description">{{ .Site.Params.sidebar.subtitle }}</h2> <h2 class="site-description">{{ .Site.Params.sidebar.subtitle }}</h2>
</header> </header>
<nav class="menu" id="main-menu"> <ol class="menu" id="main-menu">
{{ $currentPage := . }} {{ $currentPage := . }}
{{ range .Site.Menus.main }} {{ range .Site.Menus.main }}
{{ $active := or (eq $currentPage.Title .Name) (or ($currentPage.HasMenuCurrent "main" .) ($currentPage.IsMenuCurrent "main" .)) }} {{ $active := or (eq $currentPage.Title .Name) (or ($currentPage.HasMenuCurrent "main" .) ($currentPage.IsMenuCurrent "main" .)) }}
<li {{ if $active }} class='current' {{ end }}> <li {{ if $active }} class='current' {{ end }}>
<a href='{{ .URL }}'> <a href='{{ .URL | absLangURL }}'>
{{ if .Pre }} {{ if .Pre }}
{{ (resources.Get (delimit (slice "icons/" .Pre ".svg") "")).Content | safeHTML }} {{ (resources.Get (delimit (slice "icons/" .Pre ".svg") "")).Content | safeHTML }}
{{ end }} {{ end }}
@@ -39,5 +39,5 @@
</a> </a>
</li> </li>
{{ end }} {{ end }}
</nav> </ol>
</aside> </aside>
@@ -1,28 +1,28 @@
<section class="widget archive"> <section class="widget archives">
<div class="widget-icon"> <div class="widget-icon">
{{ (resources.Get "icons/infinity.svg").Content | safeHTML }} {{ (resources.Get "icons/infinity.svg").Content | safeHTML }}
</div> </div>
<h1 class="widget-title">{{ T "widgetArchiveTitle" }}</h1> <h1 class="widget-title">{{ T "widgetArchivesTitle" }}</h1>
{{ $pages := where .Site.RegularPages "Type" "in" .Site.Params.mainSections }} {{ $pages := where .Site.RegularPages "Type" "in" .Site.Params.mainSections }}
{{ $notHidden := where .Site.RegularPages "Params.hidden" "!=" true }} {{ $notHidden := where .Site.RegularPages "Params.hidden" "!=" true }}
{{ $filtered := ($pages | intersect $notHidden) }} {{ $filtered := ($pages | intersect $notHidden) }}
{{ $archive := $filtered.GroupByDate "2006" }} {{ $archives := $filtered.GroupByDate "2006" }}
{{ range first .Site.Params.widgets.archive.limit ($archive) }} {{ range first .Site.Params.widgets.archives.limit ($archives) }}
{{ $id := lower (replace .Key " " "-") }} {{ $id := lower (replace .Key " " "-") }}
<div class="archive-year"> <div class="archives-year">
<a href="{{ $.Site.BaseURL }}{{ $.Site.Params.widgets.archive.path }}#{{ $id }}"> <a href="{{ $.Site.Params.widgets.archives.path | relLangURL }}#{{ $id }}">
<span class="year">{{ .Key }}</span> <span class="year">{{ .Key }}</span>
<span class="count">{{ len .Pages }}</span> <span class="count">{{ len .Pages }}</span>
</a> </a>
</div> </div>
{{ end }} {{ end }}
{{ if gt (len $archive) .Site.Params.widgets.archive.limit }} {{ if gt (len $archives) .Site.Params.widgets.archives.limit }}
<div class="archive-year"> <div class="archives-year">
<a href="{{ $.Site.BaseURL }}/archive"> <a href="{{ $.Site.Params.widgets.archives.path | relLangURL }}">
<span class="year">{{ T "widgetArchiveMore" }}</span> <span class="year">{{ T "widgetArchivesMore" }}</span>
</a> </a>
</div> </div>
{{ end }} {{ end }}
+5 -5
View File
@@ -1,5 +1,4 @@
{{ $tags := .Site.Taxonomies.tags.ByCount }} {{ $tags := .Site.Taxonomies.tags.ByCount }}
{{ $v2 := where $tags "Term" "not in" (slice "hugo" "tag" "rss") }}
<section class="widget tagCloud"> <section class="widget tagCloud">
<div class="widget-icon"> <div class="widget-icon">
@@ -8,10 +7,11 @@
<h1 class="widget-title">{{ T "widgetTagCloudTitle" }}</h1> <h1 class="widget-title">{{ T "widgetTagCloudTitle" }}</h1>
<div class="tagCloud-tags"> <div class="tagCloud-tags">
{{ range first .Site.Params.widgets.tagCloud.limit $v2 }} {{ range first .Site.Params.widgets.tagCloud.limit $tags }}
<a href="{{ $.Site.BaseURL }}tags/{{ .Term | urlize }}/" class="font_size_{{ .Count }}"> {{ $term := $.Site.GetPage (printf "/tags/%s" .Term) }}
{{ .Term | humanize }} <a href="{{ $term.Permalink }}" class="font_size_{{ .Count }}">
</a> {{ $term.Title | humanize }}
</a>
{{ end }} {{ end }}
</div> </div>
</section> </section>
+21
View File
@@ -0,0 +1,21 @@
{{ define "container-class" }}article-page with-toolbar{{ end }}
{{ define "main" }}
<div id="article-toolbar">
<a href="{{ .Site.BaseURL }}" class="back-home">
{{ (resources.Get "icons/back.svg").Content | safeHTML }}
<span>Back</span>
</a>
</div>
{{ partial "article/article.html" . }}
{{ partial "article/components/related-contents" . }}
{{ if or (not (isset .Params "comments")) (eq .Params.comments "true")}}
{{ partial "comments/include" . }}
{{ end }}
{{ partialCached "footer/footer" . }}
{{- partialCached "article/components/photoswipe.html" . -}}
{{ end }}
+6 -3
View File
@@ -6,12 +6,15 @@
HUGO_THEME = "repo" HUGO_THEME = "repo"
[context.production] [context.production]
command = "cd exampleSite && hugo --gc --themesDir ../.." command = "cd exampleSite && hugo --gc --themesDir ../.. -b ${URL}"
[context.production.environment] [context.production.environment]
HUGO_ENV = "production" HUGO_ENV = "production"
[context.branch-deploy] [context.branch-deploy]
command = "cd exampleSite && hugo --gc --themesDir ../.. -b ${DEPLOY_PRIME_URL}/" command = "cd exampleSite && hugo --gc --themesDir ../.. -b ${DEPLOY_PRIME_URL}"
[context.deploy-preview] [context.deploy-preview]
command = "cd exampleSite && hugo --gc --themesDir ../.. -b ${DEPLOY_PRIME_URL}/" command = "cd exampleSite && hugo --gc --themesDir ../.. -b ${DEPLOY_PRIME_URL}"
[[plugins]]
package = "/exampleSite/plugins/netlify-plugin-hugo-cache-resources"
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"Target":"scss/style.min.css","MediaType":"text/css","Data":{}}
+15 -3
View File
@@ -4,10 +4,22 @@
name = "Stack" name = "Stack"
license = "GPL-3.0-only" license = "GPL-3.0-only"
licenselink = "https://github.com/CaiJimmy/hugo-theme-stack/blob/master/LICENSE" licenselink = "https://github.com/CaiJimmy/hugo-theme-stack/blob/master/LICENSE"
description = "Just another simple Hugo theme" description = "Card-style Hugo theme designed for bloggers"
homepage = "https://blog.jimmycai.com/p/hugo-theme-stack" homepage = "https://blog.jimmycai.com/p/hugo-theme-stack"
tags = [] tags = [
features = [] "blog",
"responsive",
"clean",
"light",
"dark",
"personal"
]
features = [
"disqus",
"photoswipe",
"opengraph",
"widgets"
]
min_version = "0.74.0" min_version = "0.74.0"
[author] [author]