Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
779982eb95 | ||
|
|
a750e02629 | ||
|
|
f26a9fa070 | ||
|
|
b06910fc5d | ||
|
|
c12de4db04 | ||
|
|
7379bbe412 | ||
|
|
c600f87213 | ||
|
|
45e7e07a86 | ||
|
|
294f445e0a | ||
|
|
2451b194dc | ||
|
|
822eba9513 | ||
|
|
929cd3c43a | ||
|
|
f0b3617ec4 |
@@ -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.
|
||||
@@ -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.
|
||||
@@ -1,44 +1,56 @@
|
||||

|
||||

|
||||
# Hugo Theme Stack
|
||||
|
||||
Just another simple theme for Hugo
|
||||
|
||||
[](https://app.netlify.com/sites/hugo-theme-stack/deploys)
|
||||
> Card-style Hugo theme designed for bloggers.
|
||||
|
||||
## Demo
|
||||
|
||||
[Example Site](https://theme-stack.jimmycai.com/)
|
||||
|
||||
[](https://app.netlify.com/sites/hugo-theme-stack/deploys)
|
||||
|
||||
## Documentation & more information
|
||||
|
||||
[Documentation](https://www.notion.so/jimmycai/Hugo-Theme-Stack-511aec5b9ed845ce9b6e3ae0bf7fb6d4) | [中文文档](https://www.notion.so/jimmycai/Hugo-Stack-511aec5b9ed845ce9b6e3ae0bf7fb6d4)
|
||||
[Documentation](https://www.notion.so/jimmycai/Hugo-Theme-Stack-511aec5b9ed845ce9b6e3ae0bf7fb6d4) | [中文文档](https://www.notion.so/jimmycai/Hugo-Theme-Stack-511aec5b9ed845ce9b6e3ae0bf7fb6d4)
|
||||
|
||||
## Features
|
||||
## Introduction
|
||||
|
||||
- Full Vanilla JS, without jQuery
|
||||
- No CSS framework
|
||||
- PhotoSwipe integration
|
||||
- Responsive images
|
||||
- Lazy load images by default
|
||||
- Archive page
|
||||
- Dark mode
|
||||
Stack is a simple card-style Hugo theme designed for bloggers, some of its features are:
|
||||
|
||||
- Responsive images support
|
||||
- Lazy load images
|
||||
- Dark mode
|
||||
- [PhotoSwipe](https://photoswipe.com/) integration
|
||||
- Archive page template
|
||||
- Full native JavaScript, no jQuery or any other frameworks are used
|
||||
- No CSS framework, keep it simple and minimal
|
||||
- External dependencies (like PhotoSwipe's library) are being loaded selectively, or asynchronously
|
||||
- Properly cropped thumbnails
|
||||
|
||||
The only JavaScript library being used is [node-vibrant](https://github.com/Vibrant-Colors/node-vibrant) for generating colour schemes for articles.
|
||||
|
||||

|
||||
|
||||
## Requirements
|
||||
|
||||
- **Hugo extended >= 0.74**
|
||||
This theme uses SCSS and TypeScript. For that reason, it's necessary to use **Hugo ≥ 0.74.0**.
|
||||
|
||||
It's built and tested on version 0.74, might not work correctly on older versions of Hugo.
|
||||
**Note**: You'll need Hugo Extended version to edit SCSS files
|
||||
|
||||
## Installation
|
||||
|
||||
Clone / Download this repository to `theme` folder, and edit your site config following `exampleSite/config.toml`.
|
||||
|
||||
Check [documentation](https://www.notion.so/jimmycai/Hugo-Theme-Stack-511aec5b9ed845ce9b6e3ae0bf7fb6d4) for more details.
|
||||
|
||||
## Copyright
|
||||
|
||||
**Licensed under the GNU General Public License v3.0**
|
||||
|
||||
Please do not remove the "*Theme Stack designed by Jimmy*" text and link.
|
||||
|
||||
If you want to port this theme to another blogging platform, please let me know🙏.
|
||||
|
||||
## Thanks to
|
||||
|
||||
- [Vibrant-Colors/node-vibrant](https://github.com/Vibrant-Colors/node-vibrant)
|
||||
|
||||
|
Before Width: | Height: | Size: 432 B After Width: | Height: | Size: 432 B |
|
Before Width: | Height: | Size: 373 B After Width: | Height: | Size: 373 B |
+3
-3
@@ -1,6 +1,6 @@
|
||||
.archive-group {
|
||||
.archives-group {
|
||||
margin-bottom: var(--section-separation);
|
||||
.archive-date {
|
||||
.archives-date {
|
||||
text-transform: uppercase;
|
||||
margin-bottom: 10px;
|
||||
font-size: 1.6rem;
|
||||
@@ -12,7 +12,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
.template-archive {
|
||||
.template-archives {
|
||||
.category-list {
|
||||
margin-bottom: var(--section-separation);
|
||||
overflow-x: auto;
|
||||
@@ -43,9 +43,9 @@
|
||||
}
|
||||
}
|
||||
|
||||
/* Archive widget */
|
||||
.widget.archive {
|
||||
.archive-year {
|
||||
/* Archives widget */
|
||||
.widget.archives {
|
||||
.archives-year {
|
||||
margin-bottom: 10px;
|
||||
a {
|
||||
background-color: var(--card-background);
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
@import "partials/pagination.scss";
|
||||
@import "partials/sidebar.scss";
|
||||
@import "partials/base.scss";
|
||||
@import "partials/layout/archive.scss";
|
||||
@import "partials/layout/archives.scss";
|
||||
@import "partials/layout/article.scss";
|
||||
@import "partials/layout/taxonomy.scss";
|
||||
@import "partials/layout/404.scss";
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
baseurl = "https://theme-stack.jimmycai.com/"
|
||||
baseurl = "https://example.com"
|
||||
languageCode = "en-us"
|
||||
theme = "hugo-theme-stack"
|
||||
paginate = 5
|
||||
@@ -29,11 +29,11 @@ DefaultContentLanguage = "en" # Theme i18n support
|
||||
# Only Disqus is available so far
|
||||
provider = "disqus"
|
||||
[params.widgets]
|
||||
enabled = ['archive', 'tag-cloud']
|
||||
[params.widgets.archive]
|
||||
enabled = ['archives', 'tag-cloud']
|
||||
[params.widgets.archives]
|
||||
limit = 5
|
||||
### Archive page relative URL
|
||||
path = "archive"
|
||||
### Archives page relative URL
|
||||
path = "archives"
|
||||
[params.widgets.tagCloud]
|
||||
limit = 10
|
||||
[params.opengraph]
|
||||
@@ -68,11 +68,11 @@ DefaultContentLanguage = "en" # Theme i18n support
|
||||
weight = -90
|
||||
pre = "user"
|
||||
[[menu.main]]
|
||||
identifier = "archive"
|
||||
name = "Archive"
|
||||
url = "/archive/"
|
||||
identifier = "archives"
|
||||
name = "Archives"
|
||||
url = "/archives/"
|
||||
weight = -70
|
||||
pre = "archive"
|
||||
pre = "archives"
|
||||
|
||||
[related]
|
||||
includeNewer = true
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "Archive"
|
||||
date: 2019-05-28
|
||||
layout: "archive"
|
||||
slug: "archive"
|
||||
---
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
title: "Archives"
|
||||
date: 2019-05-28
|
||||
layout: "archives"
|
||||
slug: "archives"
|
||||
---
|
||||
+3
-3
@@ -7,10 +7,10 @@
|
||||
[lastUpdatedOn]
|
||||
other ="Last updated on {{ .Count }}"
|
||||
|
||||
[widgetArchiveTitle]
|
||||
other = "Archive"
|
||||
[widgetArchivesTitle]
|
||||
other = "Archives"
|
||||
|
||||
[widgetArchiveMore]
|
||||
[widgetArchivesMore]
|
||||
other = "More"
|
||||
|
||||
[widgetTagCloudTitle]
|
||||
|
||||
+2
-2
@@ -7,10 +7,10 @@
|
||||
[lastUpdatedOn]
|
||||
other ="最后更新于 {{ .Count }}"
|
||||
|
||||
[widgetArchiveTitle]
|
||||
[widgetArchivesTitle]
|
||||
other = "归档"
|
||||
|
||||
[widgetArchiveMore]
|
||||
[widgetArchivesMore]
|
||||
other = "更多"
|
||||
|
||||
[widgetTagCloudTitle]
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 50 KiB |
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" }}
|
||||
{{ $categories := ($.Site.GetPage "taxonomyTerm" "categories").Pages }}
|
||||
{{ if $categories }}
|
||||
@@ -20,8 +20,8 @@
|
||||
|
||||
{{ range $filtered.GroupByDate "2006" }}
|
||||
{{ $id := lower (replace .Key " " "-") }}
|
||||
<div class="archive-group" id="{{ $id }}">
|
||||
<h3 class="archive-date"><a href="{{ $.Permalink }}#{{ $id }}">{{ .Key }}</a></h3>
|
||||
<div class="archives-group" id="{{ $id }}">
|
||||
<h3 class="archives-date"><a href="{{ $.Permalink }}#{{ $id }}">{{ .Key }}</a></h3>
|
||||
<div class="article-list--compact">
|
||||
{{ range .Pages }}
|
||||
{{ partial "article-list/compact" . }}
|
||||
@@ -1,21 +1,12 @@
|
||||
{{ define "container-class" }}article-page with-toolbar{{ end }}
|
||||
{{ define "body-class" }}article-page keep-sidebar{{ 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")}}
|
||||
{{ if or (not (isset .Params "comments")) (eq .Params.comments "true")}}
|
||||
{{ partial "comments/include" . }}
|
||||
{{ end }}
|
||||
|
||||
{{ partialCached "footer/footer" . }}
|
||||
|
||||
{{- partial "article/components/photoswipe.html" . -}}
|
||||
{{ partial "article/components/photoswipe" . }}
|
||||
{{ end }}
|
||||
@@ -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 }}
|
||||
@@ -7,10 +7,10 @@
|
||||
{{ if and $image.exists $image.resource }}
|
||||
{{- $imageRaw := $image.resource | resources.Fingerprint "md5" -}}
|
||||
{{- $20x := $imageRaw.Fill "20x20 smart" -}}
|
||||
<a href="/categories/{{ . | urlize }}" class="color-tag"
|
||||
<a href="{{ printf `categories/%s` (. | urlize) | relLangURL }}" class="color-tag"
|
||||
data-image="{{ $20x.RelPermalink }}" data-key="{{ $context.Slug }}" data-hash="{{ $imageRaw.Data.Integrity }}">{{ . | humanize }}</a>
|
||||
{{ else }}
|
||||
<a href="/categories/{{ . | urlize }}">{{ . | humanize }}</a>
|
||||
<a href="{{ printf `categories/%s` (. | urlize) | relLangURL }}">{{ . | humanize }}</a>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
</header>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
{{ with $tags := .Params.Tags }}
|
||||
<section class="article-tags">
|
||||
{{ range $tags }}
|
||||
<a href="/tags/{{ . | urlize }}">{{ . | humanize }}</a>
|
||||
<a href="{{ printf `tags/%s` (. | urlize) | relLangURL }}">{{ . | humanize }}</a>
|
||||
{{ end }}
|
||||
</section>
|
||||
{{ end }}
|
||||
|
||||
@@ -12,20 +12,14 @@
|
||||
{{ $result = merge $result (dict "permalink" $imageValue) }}
|
||||
{{ else }}
|
||||
{{ $pageResourceImage := .Context.Resources.GetMatch (printf "%s" ($imageValue | safeURL)) }}
|
||||
{{ $siteResourceImage := resources.GetMatch (printf "%s" ($imageValue | safeURL)) }}
|
||||
|
||||
{{ if $pageResourceImage }}
|
||||
<!-- If image is found under page bundle -->
|
||||
{{ $result = merge $result (dict "permalink" $pageResourceImage.RelPermalink) }}
|
||||
{{ $result = merge $result (dict "resource" $pageResourceImage) }}
|
||||
{{ else if $siteResourceImage }}
|
||||
<!-- Try search image under site's assets folder -->
|
||||
{{ $result = merge $result (dict "permalink" $siteResourceImage.RelPermalink) }}
|
||||
{{ $result = merge $result (dict "resource" $siteResourceImage) }}
|
||||
{{ else }}
|
||||
<!-- Can not find the image -->
|
||||
{{ errorf "Failed loading image: %q" $imageValue }}
|
||||
{{ $result = merge $result (dict "exists" false) }}
|
||||
<!-- Can not find the image under page bundle. Could be a relative linked image -->
|
||||
{{ $result = merge $result (dict "permalink" $imageValue) }}
|
||||
{{ end }}
|
||||
|
||||
{{ end }}
|
||||
|
||||
@@ -1,28 +1,28 @@
|
||||
<section class="widget archive">
|
||||
<section class="widget archives">
|
||||
<div class="widget-icon">
|
||||
{{ (resources.Get "icons/infinity.svg").Content | safeHTML }}
|
||||
</div>
|
||||
<h1 class="widget-title">{{ T "widgetArchiveTitle" }}</h1>
|
||||
<h1 class="widget-title">{{ T "widgetArchivesTitle" }}</h1>
|
||||
|
||||
{{ $pages := where .Site.RegularPages "Type" "in" .Site.Params.mainSections }}
|
||||
{{ $notHidden := where .Site.RegularPages "Params.hidden" "!=" true }}
|
||||
{{ $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 " " "-") }}
|
||||
<div class="archive-year">
|
||||
<a href="{{ $.Site.BaseURL }}{{ $.Site.Params.widgets.archive.path }}#{{ $id }}">
|
||||
<div class="archives-year">
|
||||
<a href="{{ $.Site.Params.widgets.archives.path | relLangURL }}#{{ $id }}">
|
||||
<span class="year">{{ .Key }}</span>
|
||||
<span class="count">{{ len .Pages }}</span>
|
||||
</a>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
{{ if gt (len $archive) .Site.Params.widgets.archive.limit }}
|
||||
<div class="archive-year">
|
||||
<a href="{{ $.Site.BaseURL }}/archive">
|
||||
<span class="year">{{ T "widgetArchiveMore" }}</span>
|
||||
{{ if gt (len $archives) .Site.Params.widgets.archives.limit }}
|
||||
<div class="archives-year">
|
||||
<a href="{{ $.Site.Params.widgets.archives.path | relLangURL }}">
|
||||
<span class="year">{{ T "widgetArchivesMore" }}</span>
|
||||
</a>
|
||||
</div>
|
||||
{{ end }}
|
||||
@@ -1,5 +1,4 @@
|
||||
{{ $tags := .Site.Taxonomies.tags.ByCount }}
|
||||
{{ $v2 := where $tags "Term" "not in" (slice "hugo" "tag" "rss") }}
|
||||
|
||||
<section class="widget tagCloud">
|
||||
<div class="widget-icon">
|
||||
@@ -8,8 +7,8 @@
|
||||
<h1 class="widget-title">{{ T "widgetTagCloudTitle" }}</h1>
|
||||
|
||||
<div class="tagCloud-tags">
|
||||
{{ range first .Site.Params.widgets.tagCloud.limit $v2 }}
|
||||
<a href="{{ $.Site.BaseURL }}tags/{{ .Term | urlize }}/" class="font_size_{{ .Count }}">
|
||||
{{ range first .Site.Params.widgets.tagCloud.limit $tags }}
|
||||
<a href="{{ printf `tags/%s` (.Term | urlize) | relLangURL }}" class="font_size_{{ .Count }}">
|
||||
{{ .Term | humanize }}
|
||||
</a>
|
||||
{{ end }}
|
||||
|
||||
@@ -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" . }}
|
||||
|
||||
{{- partial "article/components/photoswipe.html" . -}}
|
||||
{{ end }}
|
||||
+3
-3
@@ -6,12 +6,12 @@
|
||||
HUGO_THEME = "repo"
|
||||
|
||||
[context.production]
|
||||
command = "cd exampleSite && hugo --gc --themesDir ../.."
|
||||
command = "cd exampleSite && hugo --gc --themesDir ../.. -b ${URL}"
|
||||
[context.production.environment]
|
||||
HUGO_ENV = "production"
|
||||
|
||||
[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]
|
||||
command = "cd exampleSite && hugo --gc --themesDir ../.. -b ${DEPLOY_PRIME_URL}/"
|
||||
command = "cd exampleSite && hugo --gc --themesDir ../.. -b ${DEPLOY_PRIME_URL}"
|
||||
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
@@ -4,10 +4,22 @@
|
||||
name = "Stack"
|
||||
license = "GPL-3.0-only"
|
||||
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"
|
||||
tags = []
|
||||
features = []
|
||||
tags = [
|
||||
"blog",
|
||||
"responsive",
|
||||
"clean",
|
||||
"light",
|
||||
"dark",
|
||||
"personal"
|
||||
]
|
||||
features = [
|
||||
"disqus",
|
||||
"photoswipe",
|
||||
"opengraph",
|
||||
"widgets"
|
||||
]
|
||||
min_version = "0.74.0"
|
||||
|
||||
[author]
|
||||
|
||||
Reference in New Issue
Block a user