Merge remote-tracking branch 'upstream/main'

This commit is contained in:
CDN 2024-04-07 10:28:49 +08:00
commit cf323291b7
Signed by: cdn0x12
GPG key ID: 0C656827F9F80080
16 changed files with 172 additions and 31 deletions

View file

@ -1,23 +1,24 @@
# Minima
A clean and minimal Hugo theme porting from [Hexo Minima](https://github.com/adisaktijrs/hexo-theme-minima). Check out the [example site](https://mivinci.github.io/hugo-theme-minima).
Minima is a clean and minimal Hugo theme originally ported from [Hexo Minima](https://github.com/adisaktijrs/hexo-theme-minima). Check out the [example site](https://mivinci.github.io/hugo-theme-minima).
![screenshot](./images/tn.png)
> Note that the main branch is in development stage, UI or configuration may vary.
> Note that the main branch is in development phase, UI or configuration may vary.
## Features
- [x] Dark mode
- [x] Multilingual mode
- [x] Code highlighting - VSCode dark+
- [x] Math - KaTeX
- [x] Flowcharts - Mermaid
- [x] Comment - Disqus, Utterances, Giscus
- [x] Google analytics
- [x] External link
- [x] RSS
- [x] 🌗 Dark mode
- [x] 📚 Multilingual mode
- [x] 🏳️‍🌈 Code highlighting - VSCode dark+
- [x] 🔢 Math - KaTeX
- [x] 💹 Flowcharts - Mermaid
- [x] 🧑‍💻 Comment - Disqus, Utterances, Giscus
- [x] 🔎 Search - FuseJS
- [x] 〽️ Google analytics
- [x] 🔗 External link
- [x] ✉️ RSS
## Usage
@ -51,9 +52,9 @@ Follow [exampleSite/config.yaml](https://github.com/Mivinci/hugo-theme-minima/bl
| title | string | title |
| description | string | description |
| date | string | creation time |
| categories | array | category list |
| series | array | series list |
| tags | array | tag list |
| categories | array<string> | category list |
| series | array<string> | series list |
| tags | array<string> | tag list |
| math | bool | enables math plugin |
| diagram | bool | enables diagram plugin |
| comment | bool | enable comment plugin |

View file

@ -44,6 +44,16 @@ main p a:hover {
text-decoration: underline;
}
main .search > input {
width: 100%;
padding: .5em;
font-size: large;
border: 2px solid var(--grid);
border-radius: 2px;
background-color: transparent;
outline: none;
}
@keyframes showup {
from {
opacity: 0;

View file

@ -108,3 +108,11 @@ $heading: (h1, 2.25, 800), (h2, 2, 700), (h3, 1.75, 600), (h4, 1.5, 600),
.md p sup {
margin-left: 4px;
}
.md a {
color: var(--prime);
}
.md a:hover {
text-decoration: underline;
}

View file

@ -37,6 +37,9 @@
padding-left: .9em;
padding-right: 1em;
text-align: right;
user-select: none;
-moz-user-select: none;
-webkit-user-select: none;
}
.chroma .hl .lnt {
@ -141,4 +144,4 @@
.chroma .hl {
display: block;
background-color: var(--code-highlighted-line);
}
}

View file

@ -46,6 +46,7 @@
--prime: #3170a7;
--back: #e6dece;
--text: #434343;
--grid: #555;
--code-back: #dbd3c1be;
--code-text: #24292f;
@ -58,6 +59,7 @@
--prime: #3170a7;
--back: #ccc;
--text: #434343;
--grid: #555;
--code-back: #c1c1c1be;
--code-text: #24292f;

9
assets/js/min/fuse.basic.min.js vendored Normal file

File diff suppressed because one or more lines are too long

24
assets/js/search.js Normal file
View file

@ -0,0 +1,24 @@
import * as params from '@params';
const search_input = document.querySelector("#search-input");
const search_result = document.querySelector("#search-result");
let fuse;
window.onload = async function() {
const data = await fetch("../index.json").then(res => res.json());
const opts = params.search.fuse;
fuse = new Fuse(data, opts);
}
search_input.addEventListener("input", function () {
if (!fuse) return;
const results = fuse.search(this.value.trim());
let html = '';
if (results.length > 0) {
for (const v of results) {
html += `<li><a href="${v.item.permalink}">${v.item.title}</a></li>`;
}
}
search_result.innerHTML = html;
})

View file

@ -1,6 +1,8 @@
import * as params from '@params';
export function setup_selectable () {
const selectable = '{{ .Site.Params.selectable }}'
if (selectable === 'false') {
const selectable = params.selectable
if (!selectable) {
document.documentElement.style = 'user-select:none'
}
}

View file

@ -1,7 +1,9 @@
const comment = '{{ .Site.Params.comment.provider }}'
const default_theme_config = '{{ .Site.Params.defaultTheme }}'
const icon_light = '{{ index .Site.Params.switch 1 }}'
const icon_dark = '{{ index .Site.Params.switch 0 }}'
import * as params from '@params';
const comment = params.comment.provider
const default_theme_config = params.defaulttheme
const icon_light = params.switch[1]
const icon_dark = params.switch[0]
const THEME_LIGHT = default_theme_config === 'system' ? 'light' : default_theme_config
const THEME_DARK = 'dark'

View file

@ -9,7 +9,7 @@ paginate: 12
theme: hugo-theme-minima
# defaultContentLanguage specifies the default language to use.
defaultContentLanguage: en
# language.x setup
# language.xxx setup
languages:
en:
languageName: EN # will be displayed in the navbar.
@ -44,7 +44,7 @@ params:
switch: ["🌚", "🌝"]
# minima has one dark theme and multiple light themes. defaultTheme specifies
# a default light theme to use. currently available options: light, sand, rock, system.
defaultTheme: sand
defaultTheme: light
# displayDate speficies whether or not to display post date on the home page.
displayDate: true
# displayDescription specifies whether or not to display post description on
@ -97,15 +97,42 @@ params:
reactions: true
metadata: false
# search plugin
search:
enable: true
provider: fuse
title: Search
placeholder: Enter keywords
# check out https://fusejs.io
fuse:
keys:
- title
- permalink
- summary
- content
distance: 100
location: 0
threshold: 0.6
ignoreLocation: false
isCaseSensitive: false
includeScore: false
includeMatches: false
minMatchCharLength: 1
shouldSort: true
findAllMatches: false
# menu.main is an array containing what is used as the navigator.
menu:
main:
- identifier: tags
name: "Tags"
weight: 2
name: Tags
weight: 1
- identifier: series
name: "Series"
name: Series
weight: 2
- identifier: search
name: 🔍
weight: 3
# taxonomies defines ways to classify yout posts. Below are some presets that
@ -115,6 +142,13 @@ taxonomies:
tag: tags
series: series
# outputs tells Hugo the kind of files to be rendered.
outputs:
home:
- HTML
- RSS
- JSON
# markup.highlight has two keys set to make sure that the syntax highlighting
# in your posts are rendered correctly, so DO NOT edit them.
markup:

View file

@ -0,0 +1,4 @@
---
title: Search
layout: search
---

View file

@ -0,0 +1,4 @@
---
title: 搜索
layout: search
---

View file

@ -0,0 +1,16 @@
{{ define "main" }}
<main class="container mx-auto">
{{- $title := .Site.Params.search.title | default .Title }}
{{- $placeholder := .Site.Params.search.placeholder | default .Title }}
<h1 class="text-4xl font-extrabold mt-6">{{ $title }}</h1>
<p class="text-sm mb-6">Powered by <a href="https://fusejs.io" target="_blank">fuse.js</a>.</p>
<div class="search">
<input class="mb-4"
autofocus autocomplete="off" id="search-input" type="search" placeholder="{{ printf `%s ↵` $placeholder }}">
{{ if not .Site.Params.search.enable }}
<p>No search plugin is enabled.</p>
{{ end }}
<ul id="search-result"></ul>
</div>
</main>
{{ end }}

View file

@ -11,8 +11,10 @@
<div>
{{ $paginator := .Paginate (where .Site.RegularPages "Kind" "page") }}
{{ range $paginator.Pages }}
{{ if ne .Page.Layout "search" }}
{{ partial "item.html" . }}
{{ end }}
{{ end }}
{{ partial "paginator.html" . }}
</div>
{{ if .Site.Params.friends.feeds }}

7
layouts/index.json Normal file
View file

@ -0,0 +1,7 @@
{{- $.Scratch.Add "index" slice -}}
{{- range site.RegularPages -}}
{{- if ne .Layout "search" -}}
{{- $.Scratch.Add "index" (dict "title" .Title "permalink" .Permalink "summary" .Summary "content" .Plain) -}}
{{- end -}}
{{- end -}}
{{- $.Scratch.Get "index" | jsonify -}}

View file

@ -1,9 +1,11 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
{{ if hugo.IsProduction }}
{{ template "_internal/opengraph.html" . }}
{{ template "_internal/twitter_cards.html" . }}
{{ template "_internal/google_analytics.html" . }}
{{ end }}
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#ffffff">
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#262d33">
<title>
@ -13,14 +15,25 @@
{{ .Site.Title }} - {{ .Title }}
{{ end }}
</title>
<!-- favicon -->
{{ $favicon := "favicon.ico" }}
<link rel="shortcut icon" href="{{ $favicon | relURL }}" type="image/x-icon" />
<!-- styles -->
{{ $options := (dict "targetPath" "minima.css" "outputStyle" "compressed" "enableSourceMap" true) }}
{{ $style := resources.Get "css/main.scss" | resources.ExecuteAsTemplate "main.scss" . | resources.ToCSS $options }}
<link rel="stylesheet" href="{{ $style.RelPermalink }}">
{{ $options = (dict "targetPath" "minima.js" "minify" true) }}
{{ $js := resources.Get "js/main.js" | js.Build $options | resources.ExecuteAsTemplate "minima.js" . }}
<script defer type="text/javascript" src="{{ $js.RelPermalink }}"></script>
{{ $style := resources.Get "css/main.scss" | resources.ExecuteAsTemplate "main.scss" . | resources.ToCSS $options | fingerprint }}
<link rel="stylesheet" href="{{ $style.RelPermalink }}" integrity="{{ $style.Data.Integrity }}">
<!-- scripts -->
{{ $options = (dict "targetPath" "minima.js" "minify" true "params" site.Params) }}
{{ $script := resources.Get "js/main.js" | js.Build $options | fingerprint }}
<script defer type="text/javascript" src="{{ $script.RelPermalink }}" integrity="{{ $script.Data.Integrity }}"></script>
{{ if and .Site.Params.search.enable (eq .Layout "search") }}
{{ $options = (dict "minify" true "params" site.Params) }}
{{ $search := resources.Get "js/search.js" | js.Build $options}}
{{ $fusejs := resources.Get "js/min/fuse.basic.min.js" }}
{{ $script := (slice $fusejs $search) | resources.Concat "assets/js/search.js" | fingerprint }}
<script defer crossorigin="anonymous" src="{{ $script.RelPermalink }}" integrity="{{ $script.Data.Integrity }}"></script>
{{ end }}
<!-- i18n -->
{{ if .IsTranslated }}
{{ range .Translations }}
<link rel="alternate" hreflang="{{ .Language.Lang }}" href="{{ .Permalink }}" title="{{ .Language.LanguageName }}">