mirror of
https://github.com/CaiJimmy/hugo-theme-stack.git
synced 2025-04-29 20:13:31 +08:00
Merge branch 'master' into categories
This commit is contained in:
commit
f12ff29f82
@ -22,3 +22,17 @@ body {
|
|||||||
scrollbar-color: var(--scrollbar-thumb) transparent;
|
scrollbar-color: var(--scrollbar-thumb) transparent;
|
||||||
}
|
}
|
||||||
/**/
|
/**/
|
||||||
|
|
||||||
|
/* scrollbar styles for Chromium */
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb {
|
||||||
|
background-color: var(--scrollbar-thumb);
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-track {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
/**/
|
||||||
|
@ -123,7 +123,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.article-page.has-toc {
|
.article-page.has-toc {
|
||||||
|
|
||||||
.left-sidebar {
|
.left-sidebar {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
@ -395,6 +394,41 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.highlight {
|
||||||
|
background-color: var(--pre-background-color);
|
||||||
|
padding: var(--card-padding);
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
.copyCodeButton {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
margin: initial;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.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;
|
||||||
|
}
|
||||||
|
|
||||||
.table-wrapper {
|
.table-wrapper {
|
||||||
padding: 0 var(--card-padding);
|
padding: 0 var(--card-padding);
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
@ -449,6 +483,7 @@
|
|||||||
/// Negative margins
|
/// Negative margins
|
||||||
blockquote,
|
blockquote,
|
||||||
figure,
|
figure,
|
||||||
|
.highlight,
|
||||||
pre,
|
pre,
|
||||||
.gallery,
|
.gallery,
|
||||||
.video-wrapper,
|
.video-wrapper,
|
||||||
@ -458,30 +493,4 @@
|
|||||||
margin-right: calc((var(--card-padding)) * -1);
|
margin-right: calc((var(--card-padding)) * -1);
|
||||||
width: calc(100% + var(--card-padding) * 2);
|
width: calc(100% + var(--card-padding) * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
.highlight {
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
.copyCodeButton {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.copyCodeButton {
|
|
||||||
position: absolute;
|
|
||||||
top: calc(var(--card-padding));
|
|
||||||
right: 0;
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,19 +1,6 @@
|
|||||||
$defaultTagBackgrounds: #8ea885, #df7988, #0177b8, #ffb900, #6b69d6;
|
$defaultTagBackgrounds: #8ea885, #df7988, #0177b8, #ffb900, #6b69d6;
|
||||||
$defaultTagColors: #fff, #fff, #fff, #fff, #fff;
|
$defaultTagColors: #fff, #fff, #fff, #fff, #fff;
|
||||||
|
|
||||||
[data-scheme="light"] {
|
|
||||||
--pre-text-color: #272822;
|
|
||||||
--pre-background-color: #fafafa;
|
|
||||||
@import "partials/highlight/light.scss";
|
|
||||||
}
|
|
||||||
|
|
||||||
[data-scheme="dark"] {
|
|
||||||
color-scheme: dark;
|
|
||||||
--pre-text-color: #f8f8f2;
|
|
||||||
--pre-background-color: #272822;
|
|
||||||
@import "partials/highlight/dark.scss";
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Global style
|
* Global style
|
||||||
*/
|
*/
|
||||||
@ -46,7 +33,7 @@ $defaultTagColors: #fff, #fff, #fff, #fff, #fff;
|
|||||||
--accent-color-darker: #bdc3c7;
|
--accent-color-darker: #bdc3c7;
|
||||||
--accent-color-text: #000;
|
--accent-color-text: #000;
|
||||||
--body-text-color: rgba(255, 255, 255, 0.7);
|
--body-text-color: rgba(255, 255, 255, 0.7);
|
||||||
--scrollbar-thumb: #424242;
|
--scrollbar-thumb: hsl(0, 0%, 40%);
|
||||||
--scrollbar-track: var(--body-background);
|
--scrollbar-track: var(--body-background);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -160,3 +147,15 @@ $defaultTagColors: #fff, #fff, #fff, #fff, #fff;
|
|||||||
--shadow-l4: 0px 24px 32px rgba(0, 0, 0, 0.04), 0px 16px 24px rgba(0, 0, 0, 0.04), 0px 4px 8px rgba(0, 0, 0, 0.04),
|
--shadow-l4: 0px 24px 32px rgba(0, 0, 0, 0.04), 0px 16px 24px rgba(0, 0, 0, 0.04), 0px 4px 8px rgba(0, 0, 0, 0.04),
|
||||||
0px 0px 1px rgba(0, 0, 0, 0.04);
|
0px 0px 1px rgba(0, 0, 0, 0.04);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[data-scheme="light"] {
|
||||||
|
--pre-text-color: #272822;
|
||||||
|
--pre-background-color: #fafafa;
|
||||||
|
@import "partials/highlight/light.scss";
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-scheme="dark"] {
|
||||||
|
--pre-text-color: #f8f8f2;
|
||||||
|
--pre-background-color: #272822;
|
||||||
|
@import "partials/highlight/dark.scss";
|
||||||
|
}
|
||||||
|
@ -57,6 +57,60 @@ class StackGallery {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static createGallery(container: HTMLElement) {
|
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');
|
||||||
|
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');
|
const figuresEl = container.querySelectorAll('figure.gallery-image');
|
||||||
|
|
||||||
let currentGallery = [];
|
let currentGallery = [];
|
||||||
|
@ -62,20 +62,21 @@ let Stack = {
|
|||||||
/**
|
/**
|
||||||
* Add copy button to code block
|
* Add copy button to code block
|
||||||
*/
|
*/
|
||||||
const codeBlocks = document.querySelectorAll('.article-content > div.highlight');
|
const highlights = document.querySelectorAll('.article-content div.highlight');
|
||||||
const copyText = `Copy`,
|
const copyText = `Copy`,
|
||||||
copiedText = `Copied!`;
|
copiedText = `Copied!`;
|
||||||
codeBlocks.forEach(codeBlock => {
|
|
||||||
|
highlights.forEach(highlight => {
|
||||||
const copyButton = document.createElement('button');
|
const copyButton = document.createElement('button');
|
||||||
copyButton.innerHTML = copyText;
|
copyButton.innerHTML = copyText;
|
||||||
copyButton.classList.add('copyCodeButton');
|
copyButton.classList.add('copyCodeButton');
|
||||||
codeBlock.appendChild(copyButton);
|
highlight.appendChild(copyButton);
|
||||||
|
|
||||||
const pre = codeBlock.getElementsByTagName('pre');
|
const codeBlock = highlight.querySelector('code[data-lang]');
|
||||||
const code = pre[0].textContent;
|
if (!codeBlock) return;
|
||||||
|
|
||||||
copyButton.addEventListener('click', () => {
|
copyButton.addEventListener('click', () => {
|
||||||
navigator.clipboard.writeText(code)
|
navigator.clipboard.writeText(codeBlock.textContent)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
copyButton.textContent = copiedText;
|
copyButton.textContent = copiedText;
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@ params:
|
|||||||
defaultHomeserverUrl: "https://matrix.cactus.chat:8448"
|
defaultHomeserverUrl: "https://matrix.cactus.chat:8448"
|
||||||
serverName: "cactus.chat"
|
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)
|
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:
|
giscus:
|
||||||
repo:
|
repo:
|
||||||
repoID:
|
repoID:
|
||||||
@ -122,15 +122,15 @@ params:
|
|||||||
emitMetadata: 0
|
emitMetadata: 0
|
||||||
|
|
||||||
gitalk:
|
gitalk:
|
||||||
owner:
|
owner:
|
||||||
admin:
|
admin:
|
||||||
repo:
|
repo:
|
||||||
clientID:
|
clientID:
|
||||||
clientSecret:
|
clientSecret:
|
||||||
|
|
||||||
cusdis:
|
cusdis:
|
||||||
host:
|
host:
|
||||||
id:
|
id:
|
||||||
widgets:
|
widgets:
|
||||||
enabled:
|
enabled:
|
||||||
- search
|
- search
|
||||||
@ -183,19 +183,19 @@ menu:
|
|||||||
### For demonstration purpose, the home link will be open in a new tab
|
### For demonstration purpose, the home link will be open in a new tab
|
||||||
newTab: true
|
newTab: true
|
||||||
icon: home
|
icon: home
|
||||||
|
|
||||||
social:
|
social:
|
||||||
- identifier: github
|
- identifier: github
|
||||||
name: GitHub
|
name: GitHub
|
||||||
url: https://github.com/CaiJimmy/hugo-theme-stack
|
url: https://github.com/CaiJimmy/hugo-theme-stack
|
||||||
params:
|
params:
|
||||||
icon: brand-github
|
icon: brand-github
|
||||||
|
|
||||||
- identifier: twitter
|
- identifier: twitter
|
||||||
name: Twitter
|
name: Twitter
|
||||||
url: https://twitter.com
|
url: https://twitter.com
|
||||||
params:
|
params:
|
||||||
icon: brand-twitter
|
icon: brand-twitter
|
||||||
|
|
||||||
related:
|
related:
|
||||||
includeNewer: true
|
includeNewer: true
|
||||||
@ -219,3 +219,9 @@ markup:
|
|||||||
startLevel: 2
|
startLevel: 2
|
||||||
highlight:
|
highlight:
|
||||||
noClasses: false
|
noClasses: false
|
||||||
|
codeFences: true
|
||||||
|
guessSyntax: true
|
||||||
|
lineNoStart: 1
|
||||||
|
lineNos: true
|
||||||
|
lineNumbersInTable: true
|
||||||
|
tabWidth: 4
|
||||||
|
@ -162,3 +162,7 @@ X<sup>n</sup> + Y<sup>n</sup> = Z<sup>n</sup>
|
|||||||
Press <kbd><kbd>CTRL</kbd>+<kbd>ALT</kbd>+<kbd>Delete</kbd></kbd> to end the session.
|
Press <kbd><kbd>CTRL</kbd>+<kbd>ALT</kbd>+<kbd>Delete</kbd></kbd> to end the session.
|
||||||
|
|
||||||
Most <mark>salamanders</mark> are nocturnal, and hunt for insects, worms, and other small creatures.
|
Most <mark>salamanders</mark> are nocturnal, and hunt for insects, worms, and other small creatures.
|
||||||
|
|
||||||
|
## Hyperlinked image
|
||||||
|
|
||||||
|
[](https://google.com)
|
@ -36,3 +36,7 @@ Hugo ships with several [Built-in Shortcodes](https://gohugo.io/content-manageme
|
|||||||
## bilibilibi Shortcode
|
## bilibilibi Shortcode
|
||||||
|
|
||||||
{{< bilibili av498363026 >}}
|
{{< bilibili av498363026 >}}
|
||||||
|
|
||||||
|
## Gist Shortcode
|
||||||
|
|
||||||
|
{{< gist spf13 7896402 >}}
|
2
go.mod
2
go.mod
@ -1,3 +1,3 @@
|
|||||||
module github.com/CaiJimmy/hugo-theme-stack
|
module github.com/CaiJimmy/hugo-theme-stack/v3
|
||||||
|
|
||||||
go 1.12
|
go 1.12
|
||||||
|
@ -25,22 +25,17 @@
|
|||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
<figure
|
<img src="{{ $Permalink }}"
|
||||||
|
{{ with $Width }}width="{{ . }}"{{ end }}
|
||||||
|
{{ with $Height }}height="{{ . }}"{{ end }}
|
||||||
|
{{ with $Srcset }}srcset="{{ . }}"{{ end }}
|
||||||
|
loading="lazy"
|
||||||
|
{{ with $alt }}
|
||||||
|
alt="{{ . }}"
|
||||||
|
{{ end }}
|
||||||
{{ if $galleryImage }}
|
{{ if $galleryImage }}
|
||||||
class="gallery-image"
|
class="gallery-image"
|
||||||
style="
|
data-flex-grow="{{ div (mul $image.Width 100) $image.Height }}"
|
||||||
flex-grow: {{ div (mul $image.Width 100) $image.Height }};
|
data-flex-basis="{{ div (mul $image.Width 240) $image.Height }}px"
|
||||||
flex-basis: {{ div (mul $image.Width 240) $image.Height }}px"
|
|
||||||
{{ end }}>
|
|
||||||
<a href="{{ $Permalink }}" {{ if $galleryImage }}data-size="{{ $image.Width }}x{{ $image.Height }}"{{ end }}>
|
|
||||||
<img src="{{ $Permalink }}"
|
|
||||||
{{ with $Width }}width="{{ . }}"{{ end }}
|
|
||||||
{{ with $Height }}height="{{ . }}"{{ end }}
|
|
||||||
{{ with $Srcset }}srcset="{{ . }}"{{ end }}
|
|
||||||
loading="lazy"
|
|
||||||
{{ with $alt }}alt="{{ . }}"{{ end }}>
|
|
||||||
</a>
|
|
||||||
{{ with $alt }}
|
|
||||||
<figcaption>{{ . | markdownify }}</figcaption>
|
|
||||||
{{ end }}
|
{{ end }}
|
||||||
</figure>
|
>
|
@ -1,4 +1,4 @@
|
|||||||
{{- $ThemeVersion := "3.7.0" -}}
|
{{- $ThemeVersion := "3.8.0" -}}
|
||||||
<footer class="site-footer">
|
<footer class="site-footer">
|
||||||
<section class="copyright">
|
<section class="copyright">
|
||||||
©
|
©
|
||||||
|
Loading…
Reference in New Issue
Block a user