mirror of
https://github.com/nunocoracao/blowfish.git
synced 2026-10-11 14:29:31 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f2e9eaa80f | ||
|
|
8eb1f330c5 | ||
|
|
44f787680b | ||
|
|
270a0a74d2 | ||
|
|
a57db858b4 | ||
|
|
2e195fc1e1 | ||
|
|
a666aa54b8 | ||
|
|
89e261f8e4 | ||
|
|
d35a493ba0 | ||
|
|
78341b1822 | ||
|
|
58e075717e | ||
|
|
137860d31a | ||
|
|
cee3e324fd | ||
|
|
2b83b517cc | ||
|
|
cc5cd8f11a | ||
|
|
c6d40c6d3f | ||
|
|
8fda75b134 | ||
|
|
965b0ac6ef | ||
|
|
08f6ccd618 | ||
|
|
3864f6f095 | ||
|
|
9ec0e6810a | ||
|
|
a132a9c5e6 | ||
|
|
0e8848d9c8 | ||
|
|
deffce8a02 | ||
|
|
e2dfae4a64 | ||
|
|
8aac2d7585 | ||
|
|
b9883c761d | ||
|
|
7b0fbea8ab | ||
|
|
4d6a84b041 | ||
|
|
0bc71ebe8d | ||
|
|
ae9b25b69c | ||
|
|
1475200ab4 | ||
|
|
f04dd3659a | ||
|
|
9986ed01ff | ||
|
|
16acbfee52 | ||
|
|
4b864d00e5 | ||
|
|
5a274629e4 | ||
|
|
e917645fba | ||
|
|
82aef982f1 | ||
|
|
cc91b648ec | ||
|
|
10314cff71 | ||
|
|
a7a04c6c5e | ||
|
|
c4bb9ab9b6 | ||
|
|
15299c15ab | ||
|
|
78fa726ebb | ||
|
|
b9ee790d5d | ||
|
|
ee2fc91522 | ||
|
|
9bcb7d37d3 | ||
|
|
d8685e5c9c | ||
|
|
8a9fe666e4 | ||
|
|
a95f11fe56 | ||
|
|
0b5a29e251 | ||
|
|
03615baf92 | ||
|
|
0e29ae9c52 | ||
|
|
ce0d91fcd5 | ||
|
|
a18688473e | ||
|
|
2d5718dd11 | ||
|
|
8779739162 | ||
|
|
cdcbc40d47 | ||
|
|
eb19b988ec | ||
|
|
ca6fe5f967 | ||
|
|
4996869378 | ||
|
|
b0e07a7c0d | ||
|
|
7fdb8ba1b1 | ||
|
|
03be92ad0f | ||
|
|
39adcba775 | ||
|
|
70861235ba | ||
|
|
3f4636afc1 | ||
|
|
26790a12e6 | ||
|
|
a6dc9b52e4 | ||
|
|
a308a86365 | ||
|
|
7691ee18ed | ||
|
|
830b36a9fa | ||
|
|
7ea30cb4f1 | ||
|
|
1f0b3672b5 | ||
|
|
1f0a84a24b | ||
|
|
877a2609e9 | ||
|
|
18ac5b1920 | ||
|
|
7c127074f9 | ||
|
|
e9b51aadcd | ||
|
|
c8d1b46316 | ||
|
|
bad5bf18ac | ||
|
|
ce60eab796 | ||
|
|
99224f248c | ||
|
|
d0b6ea29b4 | ||
|
|
34c82f38ca | ||
|
|
342b3451b3 | ||
|
|
58b9aee2d0 | ||
|
|
524a6869c3 | ||
|
|
b0c563bc15 | ||
|
|
cbc8cf12cd | ||
|
|
503f60fe75 | ||
|
|
167ee1fa4c | ||
|
|
859685f0c2 | ||
|
|
a0fc381ba9 | ||
|
|
ef712c33f9 | ||
|
|
e84fc0e1c6 | ||
|
|
79a78bcef4 | ||
|
|
cc94a0e6c8 | ||
|
|
ffa18c9c4f | ||
|
|
8549e06095 | ||
|
|
01d8db1e4d | ||
|
|
e71a4109cf | ||
|
|
6e70744e9a | ||
|
|
471ee57621 | ||
|
|
28a04921a7 | ||
|
|
5af20c6f9a | ||
|
|
2aa15ce844 | ||
|
|
c92c0aa3ce | ||
|
|
c9271d1df2 | ||
|
|
c08f0a9ffa | ||
|
|
d7c2d69571 | ||
|
|
122d5c70aa | ||
|
|
45c9acab9e | ||
|
|
bcdab29c30 | ||
|
|
1bec932730 | ||
|
|
217a143e6b | ||
|
|
faea1bb046 | ||
|
|
26b89169e3 | ||
|
|
878ba448aa | ||
|
|
87fe076689 | ||
|
|
0b14915f54 | ||
|
|
d8416ee104 | ||
|
|
4c7ef61265 | ||
|
|
b1d22fb30a | ||
|
|
a839c82416 | ||
|
|
4b5ff6ab59 | ||
|
|
e9350de407 | ||
|
|
a7731a15be | ||
|
|
c0fadfb0b7 | ||
|
|
7af7ed9720 | ||
|
|
ab6c812198 | ||
|
|
20c6de4eb8 | ||
|
|
3a912caf92 | ||
|
|
d049a3f020 | ||
|
|
0036fb8c02 | ||
|
|
e6c8e05040 | ||
|
|
22a9b643de | ||
|
|
2d5bf43ea3 | ||
|
|
8a1669e1f4 | ||
|
|
a132c61d0c | ||
|
|
3dea18a9cb | ||
|
|
4cc9899469 | ||
|
|
e4fdf17032 | ||
|
|
4fddd9d1eb | ||
|
|
ae27bba4e9 | ||
|
|
71fc6ee8b8 | ||
|
|
15c580ab86 | ||
|
|
1d7579f3b0 | ||
|
|
3bc2b4b82e | ||
|
|
9e0ad31ec8 | ||
|
|
1b6df4c166 | ||
|
|
34610228ad | ||
|
|
4705b55e09 | ||
|
|
7fed4fa2d1 | ||
|
|
6f99fefab3 | ||
|
|
c74017c987 | ||
|
|
641c16a150 | ||
|
|
be7f6b6f8f | ||
|
|
55f2f22849 | ||
|
|
812effc613 | ||
|
|
02a7397119 | ||
|
|
e35bcc0f24 | ||
|
|
f18c6a0564 | ||
|
|
e1e59f0009 | ||
|
|
6e96c55f0a | ||
|
|
de0645aa3d | ||
|
|
7e1ecd5480 | ||
|
|
1771c92213 | ||
|
|
350d669406 | ||
|
|
c747c623eb | ||
|
|
fef811f3a1 | ||
|
|
4b7677ea89 | ||
|
|
03b2f4502a | ||
|
|
5fb61dee19 | ||
|
|
15bf0ea12a | ||
|
|
6cbe52620f | ||
|
|
81da343120 | ||
|
|
8de5e47efd | ||
|
|
91098a0135 | ||
|
|
9ffb78e7df | ||
|
|
e1c13d658d | ||
|
|
7059f91d57 | ||
|
|
6076126e4c | ||
|
|
ebfe68673f | ||
|
|
774e2e05c1 | ||
|
|
9d7798faa4 | ||
|
|
8a2f58be77 | ||
|
|
b2ef80da49 | ||
|
|
43c32d207b | ||
|
|
47e08a5633 | ||
|
|
857dc8de99 | ||
|
|
19a4e5f5af | ||
|
|
bebff03d62 | ||
|
|
af75177900 | ||
|
|
b61ca7359f | ||
|
|
1b4de022c2 | ||
|
|
e30ea0a5c9 | ||
|
|
43da14b0b3 | ||
|
|
d0a1a5b249 | ||
|
|
7742b4e239 | ||
|
|
faab08cec5 | ||
|
|
d38accc6ff | ||
|
|
58799b9847 | ||
|
|
ad697ff032 | ||
|
|
e753c191c3 | ||
|
|
c53c0ce6d6 | ||
|
|
8bdb64c6d7 | ||
|
|
8ac2ee05b8 | ||
|
|
326e3536e9 | ||
|
|
0cc0b57139 | ||
|
|
3b46fb243b | ||
|
|
8cd533569e | ||
|
|
889c87bf14 | ||
|
|
68cf60bd1d | ||
|
|
92c7b3ecdf | ||
|
|
f017af8d84 | ||
|
|
d4c8c941e4 | ||
|
|
72ca84791a | ||
|
|
94ff143975 | ||
|
|
38a04ae80b | ||
|
|
99d329c7b0 | ||
|
|
1408e8bb53 | ||
|
|
617c6f0c15 | ||
|
|
896bc473a8 | ||
|
|
712cb48fb2 | ||
|
|
73580313b4 | ||
|
|
b509f51f9b | ||
|
|
bbe38534d5 | ||
|
|
0e9a151ce5 | ||
|
|
54e7ebc4d9 | ||
|
|
76a23c05af | ||
|
|
3dd3d0fae8 | ||
|
|
166a326dc7 | ||
|
|
5ee9c27876 | ||
|
|
76edd20456 | ||
|
|
eb09b4ec25 | ||
|
|
8e1f46b102 | ||
|
|
33d013309d | ||
|
|
506740b1cf | ||
|
|
7b04a6407a | ||
|
|
788493921e | ||
|
|
25961a04d9 | ||
|
|
651804603a | ||
|
|
c107bc0c50 | ||
|
|
3960982afa | ||
|
|
ab668ca55d | ||
|
|
e63154d379 | ||
|
|
7dec363f54 | ||
|
|
827fab1ef9 | ||
|
|
63da02addc | ||
|
|
277f7a94cb | ||
|
|
750766a445 | ||
|
|
a975c43516 | ||
|
|
7a9baa1c50 | ||
|
|
82a593e0ed | ||
|
|
b096d35b85 | ||
|
|
2da29e25d5 | ||
|
|
96ef081d17 | ||
|
|
fbf833bce5 | ||
|
|
18ed97928f | ||
|
|
b7eeb165d1 | ||
|
|
39209dbab3 | ||
|
|
31019347aa | ||
|
|
faca690a95 | ||
|
|
be564f4ae1 | ||
|
|
77ac889406 | ||
|
|
8c9e51e310 | ||
|
|
269f09b8a6 | ||
|
|
3a9016a6d9 | ||
|
|
a402822d8b | ||
|
|
6da1c6b870 | ||
|
|
ed75c36449 | ||
|
|
2172b94fe6 | ||
|
|
69775ac779 | ||
|
|
37b5015278 | ||
|
|
ce657d3351 | ||
|
|
9d5806220e | ||
|
|
9f2045746e | ||
|
|
071ab0de6c | ||
|
|
d9ea382e81 | ||
|
|
599ebb8610 | ||
|
|
2540c8102f | ||
|
|
b8fa87eca2 | ||
|
|
9c8e3a1e2e | ||
|
|
7be81551d4 | ||
|
|
f08149b7db | ||
|
|
e5fc548eb5 | ||
|
|
7a23e560c3 | ||
|
|
7090513545 | ||
|
|
4277590661 | ||
|
|
d3109b4cc9 | ||
|
|
9fd883fab5 | ||
|
|
e5d370cb2d | ||
|
|
228eaa164d | ||
|
|
e27e55856e | ||
|
|
1d275134ad | ||
|
|
10083786cb | ||
|
|
8121c3f032 | ||
|
|
9c861e7c62 | ||
|
|
17906e63e2 | ||
|
|
2c7d234312 | ||
|
|
493bb3eb5c | ||
|
|
6fe75d5277 | ||
|
|
601bb87559 | ||
|
|
dbb7d3f7f2 | ||
|
|
2cac2bfe4a | ||
|
|
8c8a914fa9 | ||
|
|
c3e7d1b8b1 | ||
|
|
4a16b20d3f | ||
|
|
0083e927c1 | ||
|
|
ec69178703 | ||
|
|
14a2ea0c80 | ||
|
|
966828efff | ||
|
|
fc9e6efb80 | ||
|
|
590d4c1479 | ||
|
|
b7dc7bc8a2 | ||
|
|
f9eb1d4e81 | ||
|
|
57591446ea | ||
|
|
d79d17e807 | ||
|
|
bb4eeeeeee | ||
|
|
4ce7a3521a | ||
|
|
287e397b82 | ||
|
|
a377e1b072 | ||
|
|
8281d9d990 | ||
|
|
ec8a1b3d73 | ||
|
|
e8d22f1f1b | ||
|
|
949e367a01 | ||
|
|
c7f6955e80 | ||
|
|
1aba089483 | ||
|
|
314877d325 | ||
|
|
45b6a073e0 | ||
|
|
9d819bc405 | ||
|
|
ec05d2c753 | ||
|
|
865cca8eaa | ||
|
|
6cd3b88a8a | ||
|
|
f408467bf5 | ||
|
|
db2f6b15e8 | ||
|
|
493c998742 | ||
|
|
a6f38c0e6f | ||
|
|
d3fd01c37d | ||
|
|
b260175ebf | ||
|
|
11845d4a7c | ||
|
|
85a781a998 | ||
|
|
3c534548df | ||
|
|
bf0713c0cf | ||
|
|
ef9486f794 | ||
|
|
c78b3a1e6a | ||
|
|
230ee3ab16 | ||
|
|
8ab8807398 | ||
|
|
522bdbe29e | ||
|
|
b0c5cd70da | ||
|
|
8cd0aed78a | ||
|
|
6f6323ff55 | ||
|
|
446cf9541c | ||
|
|
6804d068cc | ||
|
|
7edef0ff7f | ||
|
|
8629e52b84 | ||
|
|
9dd3fce747 | ||
|
|
94fdf4fded |
No files matched your search
@@ -5,7 +5,7 @@ version: 2
|
||||
updates:
|
||||
- package-ecosystem: "npm"
|
||||
directory: "/"
|
||||
target-branch: "dev"
|
||||
target-branch: "main"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
day: "wednesday"
|
||||
@@ -15,7 +15,7 @@ updates:
|
||||
- "dependencies"
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
target-branch: "dev"
|
||||
target-branch: "main"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
day: "wednesday"
|
||||
|
||||
@@ -10,7 +10,7 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- run: zip -r config-default.zip config/_default
|
||||
- uses: actions/upload-artifact@v6
|
||||
- uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: config-default
|
||||
path: config-default.zip
|
||||
|
||||
@@ -13,7 +13,7 @@ jobs:
|
||||
- name: Check out code into the Go module directory
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
ref: dev
|
||||
ref: main
|
||||
submodules: true # Fetch Hugo themes (true OR recursive)
|
||||
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
|
||||
|
||||
@@ -51,4 +51,4 @@ jobs:
|
||||
[2]: https://github.com/peter-evans/create-pull-request
|
||||
labels: dependencies, automated pr
|
||||
branch: hugo-new-version
|
||||
base: dev
|
||||
base: main
|
||||
@@ -42,7 +42,7 @@ jobs:
|
||||
submodules: recursive
|
||||
- name: Setup Pages
|
||||
id: pages
|
||||
uses: actions/configure-pages@v5
|
||||
uses: actions/configure-pages@v6
|
||||
- name: Build with Hugo
|
||||
env:
|
||||
# For maximum backward compatibility with Hugo modules
|
||||
@@ -65,4 +65,4 @@ jobs:
|
||||
steps:
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v4
|
||||
uses: actions/deploy-pages@v5
|
||||
@@ -32,3 +32,4 @@ jobs:
|
||||
days-before-close: 0
|
||||
remove-stale-when-updated: true
|
||||
operations-per-run: 100
|
||||
exempt-issue-labels: 'keep,security'
|
||||
@@ -23,6 +23,15 @@ exampleSite/resources/
|
||||
node_modules
|
||||
.hugo_build.lock
|
||||
|
||||
# Firebase scripts
|
||||
scripts/serviceAccountKey.json
|
||||
scripts/node_modules/
|
||||
scripts/*.csv
|
||||
|
||||
# Google Analytics export (temporary)
|
||||
ga-pageviews.csv
|
||||
*.csv
|
||||
|
||||
# OS generated files
|
||||
.DS_Store
|
||||
.DS_Store?
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
"trailingComma": "all",
|
||||
"proseWrap": "always",
|
||||
"plugins": [
|
||||
"@awmottaz/prettier-plugin-void-html",
|
||||
"prettier-plugin-go-template"
|
||||
],
|
||||
"overrides": [
|
||||
|
||||
Vendored
+56
-2
@@ -79,7 +79,14 @@
|
||||
"{{< /chart >}}"
|
||||
],
|
||||
"description": "Use the Chart.js library to embed charts into articles using simple structured data. Blowfish chart Shortcode. Documentation: https://blowfish.page/docs/shortcodes/#chart ",
|
||||
},
|
||||
},
|
||||
"email": {
|
||||
"prefix": ["BFS-email", "HSC-email", "email"],
|
||||
"body": [
|
||||
"{{< email email=\"mailto:${1:hello@test.com}\" text=\"${2:text}\" subject=\"${3:Reply to awesome article}\" >}}$0",
|
||||
],
|
||||
"description": "Creates an obfuscated mailto link. Documentation: https://blowfish.page/docs/shortcodes/#email ",
|
||||
},
|
||||
"figure": {
|
||||
"prefix": ["BFS-figure", "HSC-figure", "figure"],
|
||||
"body": [
|
||||
@@ -178,6 +185,53 @@
|
||||
],
|
||||
"description": "Output a set of up to three different colors. Blowfish swatches Shortcode. Documentation: https://blowfish.page/docs/shortcodes/#swatches ",
|
||||
},
|
||||
"Tabs - Basic": {
|
||||
"prefix": "tabs",
|
||||
"body": [
|
||||
"{{< tabs >}}",
|
||||
"",
|
||||
" {{< tab label=\"${1:Tab 1}\" >}}",
|
||||
" $2",
|
||||
" {{< /tab >}}",
|
||||
"",
|
||||
" {{< tab label=\"${3:Tab 2}\" >}}",
|
||||
" $4",
|
||||
" {{< /tab >}}",
|
||||
"",
|
||||
"{{< /tabs >}}"
|
||||
],
|
||||
"description": "Insert Hugo tabs shortcode"
|
||||
},
|
||||
"Tabs - Full Options": {
|
||||
"prefix": "tabsfull",
|
||||
"body": [
|
||||
"{{< tabs group=\"${1:group-name}\" default=\"${2:Default Tab}\" >}}",
|
||||
"",
|
||||
" {{< tab label=\"${3:Tab 1}\" icon=\"${4:code}\" >}}",
|
||||
" $5",
|
||||
" {{< /tab >}}",
|
||||
"",
|
||||
" {{< tab label=\"${2:Default Tab}\" icon=\"${6:sun}\" >}}",
|
||||
" $7",
|
||||
" {{< /tab >}}",
|
||||
"",
|
||||
" {{< tab label=\"${8:Tab 3}\" icon=\"${9:moon}\" >}}",
|
||||
" $0",
|
||||
" {{< /tab >}}",
|
||||
"",
|
||||
"{{< /tabs >}}"
|
||||
],
|
||||
"description": "Insert Hugo tabs with group, default, and icons"
|
||||
},
|
||||
"Tab": {
|
||||
"prefix": "tab",
|
||||
"body": [
|
||||
"{{< tab label=\"${1:Tab Label}\" >}}",
|
||||
"$2",
|
||||
"{{< /tab >}}"
|
||||
],
|
||||
"description": "Insert Hugo tab item"
|
||||
},
|
||||
"timeline": {
|
||||
"prefix": ["BFS-timeline", "HSC-timeline", "timeline"],
|
||||
"body": [
|
||||
@@ -208,4 +262,4 @@
|
||||
"description": "Typewriter-Like text. Blowfish typeit Shortcode. Documentation: https://blowfish.page/docs/shortcodes/#typeit https://www.typeitjs.com/docs/vanilla/usage/ ",
|
||||
},
|
||||
|
||||
}
|
||||
}
|
||||
+12
-1
@@ -1,6 +1,6 @@
|
||||
## How to contribute to Blowfish
|
||||
|
||||
All development occurs on the `dev` branch and new PRs should be forked from here.
|
||||
All development occurs on the `main` branch and new PRs should be forked from here.
|
||||
|
||||
### Bugs & other issues
|
||||
|
||||
@@ -31,6 +31,17 @@ All development occurs on the `dev` branch and new PRs should be forked from her
|
||||
- If you have a general question, these should be asked using [GitHub Discussions](https://github.com/nunocoracao/blowfish/discussions). Feel free to open a [new discussion](https://github.com/nunocoracao/blowfish/discussions/new) to ask your question using the "Q&A" category.
|
||||
- Be sure to check if your question has already been answered by searching [existing Q&A discussions](https://github.com/nunocoracao/blowfish/discussions/categories/q-a).
|
||||
|
||||
### Breaking changes
|
||||
|
||||
- We do not accept breaking changes unless they are strictly required to keep supporting the project (e.g. a dependency deprecating a feature we rely on).
|
||||
- Changes that would cause existing user customizations to silently stop working (such as renaming partial paths, removing config options, or changing template signatures) will be rejected.
|
||||
- If you're unsure whether your change is breaking, open a discussion first.
|
||||
|
||||
### Pull request guidelines
|
||||
|
||||
- Keep PRs focused on a single change. Do not bundle unrelated modifications (e.g. bug fix + version bump + new user entry) into the same PR.
|
||||
- PRs that mix multiple unrelated changes will be closed and the author will be asked to split them.
|
||||
|
||||
### Coding conventions
|
||||
|
||||
- Indent using 2 spaces (soft tabs).
|
||||
|
||||
+15
-3
@@ -1,6 +1,18 @@
|
||||
github: [nunocoracao]
|
||||
custom:
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: [nunocoracao] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
patreon: # Replace with a single Patreon username
|
||||
open_collective: # Replace with a single Open Collective username
|
||||
ko_fi: # Replace with a single Ko-fi username
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
liberapay: # Replace with a single Liberapay username
|
||||
issuehunt: # Replace with a single IssueHunt username
|
||||
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
|
||||
polar: # Replace with a single Polar username
|
||||
buy_me_a_coffee: nunocoracao # Replace with a single Buy Me a Coffee username
|
||||
thanks_dev: # Replace with a single thanks.dev username
|
||||
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
||||
[
|
||||
"https://www.paypal.me/nunocoracao",
|
||||
"https://www.buymeacoffee.com/nunocoracao",
|
||||
]
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
[English](https://github.com/nunocoracao/blowfish/blob/main/README.md) | [Français](https://github.com/nunocoracao/blowfish/blob/main/README.fr.md) | Deutsch | [Português (PT)](https://github.com/nunocoracao/blowfish/blob/main/README.pt-pt.md) | [Português (BR)](https://github.com/nunocoracao/blowfish/blob/main/README.pt-br.md) | [Español](https://github.com/nunocoracao/blowfish/blob/main/README.es.md) | [日本語](https://github.com/nunocoracao/blowfish/blob/main/README.ja.md) | [简体中文](https://github.com/nunocoracao/blowfish/blob/main/README.zh-cn.md) | [Indonesian](https://github.com/nunocoracao/blowfish/blob/main/README.id.md)
|
||||
# Blowfish
|
||||
[](https://app.netlify.com/sites/snazzy-dango-efb2ec/deploys)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.87.0)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
|
||||
[](https://github.com/nunocoracao/blowfish/blob/main/LICENSE)
|
||||
[](https://themes.gohugo.io/themes/blowfish/)
|
||||

|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
[English](https://github.com/nunocoracao/blowfish/blob/main/README.md) | [Français](https://github.com/nunocoracao/blowfish/blob/main/README.fr.md) | [Deutsch](https://github.com/nunocoracao/blowfish/blob/main/README.de.md) | [Português (PT)](https://github.com/nunocoracao/blowfish/blob/main/README.pt-pt.md) | [Português (BR)](https://github.com/nunocoracao/blowfish/blob/main/README.pt-br.md) | Español | [日本語](https://github.com/nunocoracao/blowfish/blob/main/README.ja.md) | [简体中文](https://github.com/nunocoracao/blowfish/blob/main/README.zh-cn.md) | [Indonesian](https://github.com/nunocoracao/blowfish/blob/main/README.id.md)
|
||||
# Blowfish
|
||||
[](https://app.netlify.com/sites/snazzy-dango-efb2ec/deploys)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.87.0)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
|
||||
[](https://github.com/nunocoracao/blowfish/blob/main/LICENSE)
|
||||
[](https://themes.gohugo.io/themes/blowfish/)
|
||||

|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
[English](https://github.com/nunocoracao/blowfish/blob/main/README.md) | Français | [Deutsch](https://github.com/nunocoracao/blowfish/blob/main/README.de.md) | [Português (PT)](https://github.com/nunocoracao/blowfish/blob/main/README.pt-pt.md) | [Português (BR)](https://github.com/nunocoracao/blowfish/blob/main/README.pt-br.md) | [Español](https://github.com/nunocoracao/blowfish/blob/main/README.es.md) | [日本語](https://github.com/nunocoracao/blowfish/blob/main/README.ja.md) | [简体中文](https://github.com/nunocoracao/blowfish/blob/main/README.zh-cn.md) | [Indonesian](https://github.com/nunocoracao/blowfish/blob/main/README.id.md)
|
||||
# Blowfish
|
||||
[](https://app.netlify.com/sites/snazzy-dango-efb2ec/deploys)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.87.0)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
|
||||
[](https://github.com/nunocoracao/blowfish/blob/main/LICENSE)
|
||||
[](https://themes.gohugo.io/themes/blowfish/)
|
||||

|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
|
||||
# Blowfish
|
||||
[](https://app.netlify.com/sites/snazzy-dango-efb2ec/deploys)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.87.0)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
|
||||
[](https://github.com/nunocoracao/blowfish/blob/main/LICENSE)
|
||||
[](https://themes.gohugo.io/themes/blowfish/)
|
||||

|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
[English](https://github.com/nunocoracao/blowfish/blob/main/README.md) | [Français](https://github.com/nunocoracao/blowfish/blob/main/README.fr.md) | [Deutsch](https://github.com/nunocoracao/blowfish/blob/main/README.de.md) | [Português (PT)](https://github.com/nunocoracao/blowfish/blob/main/README.pt-pt.md) | [Português (BR)](https://github.com/nunocoracao/blowfish/blob/main/README.pt-br.md) | [Español](https://github.com/nunocoracao/blowfish/blob/main/README.es.md) | 日本語 | [简体中文](https://github.com/nunocoracao/blowfish/blob/main/README.zh-cn.md) | [Indonesian](https://github.com/nunocoracao/blowfish/blob/main/README.id.md)
|
||||
# Blowfish
|
||||
[](https://app.netlify.com/sites/snazzy-dango-efb2ec/deploys)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.87.0)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
|
||||
[](https://github.com/nunocoracao/blowfish/blob/main/LICENSE)
|
||||
[](https://themes.gohugo.io/themes/blowfish/)
|
||||

|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
English | [Français](https://github.com/nunocoracao/blowfish/blob/main/README.fr.md) | [Deutsch](https://github.com/nunocoracao/blowfish/blob/main/README.de.md) | [Português (PT)](https://github.com/nunocoracao/blowfish/blob/main/README.pt-pt.md) | [Português (BR)](https://github.com/nunocoracao/blowfish/blob/main/README.pt-br.md) | [Español](https://github.com/nunocoracao/blowfish/blob/main/README.es.md) | [日本語](https://github.com/nunocoracao/blowfish/blob/main/README.ja.md) | [简体中文](https://github.com/nunocoracao/blowfish/blob/main/README.zh-cn.md) | [Indonesian](https://github.com/nunocoracao/blowfish/blob/main/README.id.md)
|
||||
# Blowfish
|
||||
[](https://app.netlify.com/sites/snazzy-dango-efb2ec/deploys)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.87.0)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
|
||||
[](https://github.com/nunocoracao/blowfish/blob/main/LICENSE)
|
||||
[](https://themes.gohugo.io/themes/blowfish/)
|
||||

|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
[English](https://github.com/nunocoracao/blowfish/blob/main/README.md) | [Français](https://github.com/nunocoracao/blowfish/blob/main/README.fr.md) | [Deutsch](https://github.com/nunocoracao/blowfish/blob/main/README.de.md) | [Português (PT)](https://github.com/nunocoracao/blowfish/blob/main/README.pt-pt.md) | Português (BR) | [Español](https://github.com/nunocoracao/blowfish/blob/main/README.es.md) | [日本語](https://github.com/nunocoracao/blowfish/blob/main/README.ja.md) | [简体中文](https://github.com/nunocoracao/blowfish/blob/main/README.zh-cn.md) | [Indonesian](https://github.com/nunocoracao/blowfish/blob/main/README.id.md)
|
||||
# Blowfish
|
||||
[](https://app.netlify.com/sites/snazzy-dango-efb2ec/deploys)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.87.0)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
|
||||
[](https://github.com/nunocoracao/blowfish/blob/main/LICENSE)
|
||||
[](https://themes.gohugo.io/themes/blowfish/)
|
||||

|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
[English](https://github.com/nunocoracao/blowfish/blob/main/README.md) | [Français](https://github.com/nunocoracao/blowfish/blob/main/README.fr.md) | [Deutsch](https://github.com/nunocoracao/blowfish/blob/main/README.de.md) | Português (PT) | [Português (BR)](https://github.com/nunocoracao/blowfish/blob/main/README.pt-br.md) | [Español](https://github.com/nunocoracao/blowfish/blob/main/README.es.md) | [日本語](https://github.com/nunocoracao/blowfish/blob/main/README.ja.md) | [简体中文](https://github.com/nunocoracao/blowfish/blob/main/README.zh-cn.md) | [Indonesian](https://github.com/nunocoracao/blowfish/blob/main/README.id.md)
|
||||
# Blowfish
|
||||
[](https://app.netlify.com/sites/snazzy-dango-efb2ec/deploys)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.87.0)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
|
||||
[](https://github.com/nunocoracao/blowfish/blob/main/LICENSE)
|
||||
[](https://themes.gohugo.io/themes/blowfish/)
|
||||

|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
[English](https://github.com/nunocoracao/blowfish/blob/main/README.md) | [Français](https://github.com/nunocoracao/blowfish/blob/main/README.fr.md) | [Deutsch](https://github.com/nunocoracao/blowfish/blob/main/README.de.md) | [Português (PT)](https://github.com/nunocoracao/blowfish/blob/main/README.pt-pt.md) | [Português (BR)](https://github.com/nunocoracao/blowfish/blob/main/README.pt-br.md) | [Español](https://github.com/nunocoracao/blowfish/blob/main/README.es.md) | [日本語](https://github.com/nunocoracao/blowfish/blob/main/README.ja.md) | 简体中文 | [Indonesian](https://github.com/nunocoracao/blowfish/blob/main/README.id.md)
|
||||
# Blowfish
|
||||
[](https://app.netlify.com/sites/snazzy-dango-efb2ec/deploys)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.87.0)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
|
||||
[](https://github.com/nunocoracao/blowfish/blob/main/LICENSE)
|
||||
[](https://themes.gohugo.io/themes/blowfish/)
|
||||

|
||||
|
||||
+565
-141
File diff suppressed because it is too large.
Load diff
@@ -68,50 +68,50 @@
|
||||
|
||||
html.dark {
|
||||
/* GitHub Core Types (5) */
|
||||
--adm-note-bg: color-mix(in srgb, theme("colors.sky.900 / 0.4"), black 15%);
|
||||
--adm-note-bg: color-mix(in srgb, theme("colors.sky.800"), #0f0f0f 50%);
|
||||
--adm-note-text: theme("colors.sky.100");
|
||||
|
||||
--adm-tip-bg: color-mix(in srgb, theme("colors.emerald.900 / 0.4"), black 15%);
|
||||
--adm-tip-bg: color-mix(in srgb, theme("colors.emerald.800"), #0f0f0f 50%);
|
||||
--adm-tip-text: theme("colors.emerald.100");
|
||||
|
||||
--adm-important-bg: color-mix(in srgb, theme("colors.purple.900 / 0.4"), black 15%);
|
||||
--adm-important-bg: color-mix(in srgb, theme("colors.purple.800"), #0f0f0f 50%);
|
||||
--adm-important-text: theme("colors.purple.100");
|
||||
|
||||
--adm-warning-bg: color-mix(in srgb, theme("colors.orange.900 / 0.4"), black 15%);
|
||||
--adm-warning-bg: color-mix(in srgb, theme("colors.orange.800"), #0f0f0f 45%);
|
||||
--adm-warning-text: theme("colors.orange.100");
|
||||
|
||||
--adm-caution-bg: color-mix(in srgb, theme("colors.red.900 / 0.4"), black 15%);
|
||||
--adm-caution-bg: color-mix(in srgb, theme("colors.red.800"), #0f0f0f 45%);
|
||||
--adm-caution-text: theme("colors.red.100");
|
||||
|
||||
/* Extended Types (10) */
|
||||
--adm-abstract-bg: color-mix(in srgb, theme("colors.cyan.900 / 0.4"), black 15%);
|
||||
--adm-abstract-bg: color-mix(in srgb, theme("colors.cyan.800"), #0f0f0f 50%);
|
||||
--adm-abstract-text: theme("colors.cyan.100");
|
||||
|
||||
--adm-bug-bg: color-mix(in srgb, theme("colors.rose.900 / 0.4"), black 15%);
|
||||
--adm-bug-bg: color-mix(in srgb, theme("colors.rose.800"), #0f0f0f 50%);
|
||||
--adm-bug-text: theme("colors.rose.100");
|
||||
|
||||
--adm-danger-bg: color-mix(in srgb, theme("colors.red.900 / 0.4"), black 15%);
|
||||
--adm-danger-bg: color-mix(in srgb, theme("colors.red.800"), #0f0f0f 45%);
|
||||
--adm-danger-text: theme("colors.red.100");
|
||||
|
||||
--adm-example-bg: color-mix(in srgb, theme("colors.purple.900 / 0.4"), black 15%);
|
||||
--adm-example-bg: color-mix(in srgb, theme("colors.purple.800"), #0f0f0f 50%);
|
||||
--adm-example-text: theme("colors.purple.100");
|
||||
|
||||
--adm-failure-bg: color-mix(in srgb, theme("colors.pink.900 / 0.4"), black 15%);
|
||||
--adm-failure-bg: color-mix(in srgb, theme("colors.pink.800"), #0f0f0f 50%);
|
||||
--adm-failure-text: theme("colors.pink.100");
|
||||
|
||||
--adm-info-bg: color-mix(in srgb, theme("colors.blue.900 / 0.4"), black 15%);
|
||||
--adm-info-bg: color-mix(in srgb, theme("colors.blue.800"), #0f0f0f 50%);
|
||||
--adm-info-text: theme("colors.blue.100");
|
||||
|
||||
--adm-question-bg: color-mix(in srgb, theme("colors.amber.900 / 0.4"), black 15%);
|
||||
--adm-question-bg: color-mix(in srgb, theme("colors.amber.800"), #0f0f0f 50%);
|
||||
--adm-question-text: theme("colors.amber.100");
|
||||
|
||||
--adm-quote-bg: color-mix(in srgb, theme("colors.gray.900 / 0.4"), black 15%);
|
||||
--adm-quote-bg: color-mix(in srgb, theme("colors.gray.800"), #0f0f0f 50%);
|
||||
--adm-quote-text: theme("colors.gray.100");
|
||||
|
||||
--adm-success-bg: color-mix(in srgb, theme("colors.emerald.900 / 0.4"), black 15%);
|
||||
--adm-success-bg: color-mix(in srgb, theme("colors.emerald.800"), #0f0f0f 50%);
|
||||
--adm-success-text: theme("colors.emerald.100");
|
||||
|
||||
--adm-todo-bg: color-mix(in srgb, theme("colors.sky.800 / 0.4"), black 15%);
|
||||
--adm-todo-bg: color-mix(in srgb, theme("colors.sky.800"), #0f0f0f 50%);
|
||||
--adm-todo-text: theme("colors.sky.100");
|
||||
}
|
||||
|
||||
|
||||
@@ -83,6 +83,22 @@
|
||||
width: calc(100% - 5px);
|
||||
margin: 0px !important;
|
||||
}
|
||||
|
||||
.gallery figure {
|
||||
display: inline-block;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.gallery figcaption {
|
||||
margin-top: 0.25rem;
|
||||
font-size: 0.875rem;
|
||||
line-height: 1.25rem;
|
||||
color: rgb(var(--color-neutral-600));
|
||||
}
|
||||
|
||||
.dark .gallery figcaption {
|
||||
color: rgb(var(--color-neutral-400));
|
||||
}
|
||||
@media (width >= 640px) {
|
||||
.sm\:grid-w10 {
|
||||
width: calc(10% - 5px);
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
.gist-container .gist {
|
||||
h1 {
|
||||
margin-bottom: calc(var(--spacing) * 4);
|
||||
}
|
||||
.gist-file {
|
||||
border: 1px solid rgb(var(--color-neutral-300));
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
}
|
||||
.gist-meta {
|
||||
background-color: white;
|
||||
color: rgb(var(--color-neutral-600));
|
||||
border-radius: 0 0 8px 8px;
|
||||
}
|
||||
.gist-meta a {
|
||||
color: rgb(var(--color-primary-600));
|
||||
}
|
||||
.highlight tr {
|
||||
border-bottom: none;
|
||||
}
|
||||
.gist-file .file {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
/* Dark Mode */
|
||||
.dark & {
|
||||
.gist-file {
|
||||
border-color: rgb(var(--color-neutral-800));
|
||||
}
|
||||
.gist-data {
|
||||
background-color: rgb(var(--color-neutral-900));
|
||||
border-bottom: 1px solid rgb(var(--color-neutral-800));
|
||||
}
|
||||
.gist-meta {
|
||||
background-color: rgb(26, 26, 26);
|
||||
color: rgb(var(--color-neutral-400));
|
||||
}
|
||||
.gist-meta a {
|
||||
color: rgb(var(--color-primary-400));
|
||||
}
|
||||
.blob-wrapper {
|
||||
filter: invert(0.9) hue-rotate(180deg);
|
||||
background-color: #fff;
|
||||
}
|
||||
.gist-data {
|
||||
background: rgb(26, 26, 26);
|
||||
color: rgb(var(--color-neutral-100));
|
||||
}
|
||||
}
|
||||
}
|
||||
+56
-16
@@ -6,9 +6,14 @@
|
||||
@import "./components/chroma.css" layer(utilities);
|
||||
@import "./components/tabs.css" layer(utilities);
|
||||
@import "./components/zen-mode.css";
|
||||
@import "./components/gist.css";
|
||||
@import "./components/a11y.css";
|
||||
@import "./components/admonition.css" layer(components);
|
||||
|
||||
html:not(.dark) {
|
||||
color-scheme: light;
|
||||
}
|
||||
|
||||
html.dark {
|
||||
color-scheme: dark;
|
||||
}
|
||||
@@ -178,11 +183,13 @@ pre {
|
||||
|
||||
.thumbnail_card {
|
||||
min-width: 300px;
|
||||
height: 200px;
|
||||
aspect-ratio: var(--thumbnail-aspect-ratio, 1.5);
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.thumbnail_card_related {
|
||||
height: 150px;
|
||||
aspect-ratio: var(--thumbnail-aspect-ratio, 1.5);
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.thumbnail {
|
||||
@@ -247,29 +254,62 @@ pre {
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
.nested-menu:hover + .menuhide {
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
transition:
|
||||
visibility 0.3s,
|
||||
opacity 0.3s ease-in-out;
|
||||
@layer utilities {
|
||||
.bf-border-color {
|
||||
@apply border-neutral-300 dark:border-neutral-700;
|
||||
}
|
||||
|
||||
.bf-border-color-hover {
|
||||
@apply hover:border-primary-600 dark:hover:border-primary-400;
|
||||
}
|
||||
|
||||
.bf-icon-color-hover {
|
||||
@apply hover:text-primary-600 dark:hover:text-primary-400;
|
||||
}
|
||||
|
||||
.bf-scrollbar {
|
||||
@apply scrollbar-thin scrollbar-track-neutral-200 scrollbar-thumb-neutral-400 dark:scrollbar-track-neutral-800 dark:scrollbar-thumb-neutral-600;
|
||||
}
|
||||
}
|
||||
|
||||
.menuhide:hover {
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
transition:
|
||||
visibility 0.3s,
|
||||
opacity 0.3s ease-in-out;
|
||||
/* Prevent body scroll when mobile menu is open */
|
||||
body:has(#mobile-menu-toggle:checked) {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Reset body position for desktop after it was modified on mobile */
|
||||
@media (min-width: 853px) {
|
||||
body:has(#mobile-menu-toggle:checked) {
|
||||
overflow: visible;
|
||||
}
|
||||
}
|
||||
|
||||
/* Hide buy me a coffee in mobile menu */
|
||||
#bmc-wbtn {
|
||||
z-index: 50 !important;
|
||||
}
|
||||
|
||||
.nested-menu {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.menuhide {
|
||||
visibility: hidden;
|
||||
position: absolute;
|
||||
z-index: 1000;
|
||||
white-space: nowrap;
|
||||
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
|
||||
transition:
|
||||
visibility 0.3s,
|
||||
opacity 0.3s ease-in-out;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
.nested-menu:hover .menuhide,
|
||||
.nested-menu:focus-within .menuhide {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
.active {
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 25 35"><path fill="currentColor" d="m0 35 12.172-7L0 21ZM12.172 0 0 7l12.172 7v14l12.172-7V7Z"></path></svg>
|
||||
|
After Width: | Height: | Size: 162 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><path fill="currentColor" d="M158.4 0L7 292h89.2l62.2-116.1L220.1 292h88.5zm150.2 292l-43.9 88.2-44.6-88.2h-67.6l112.2 220 111.5-220z"/></svg>
|
||||
|
After Width: | Height: | Size: 205 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path fill="currentColor" d="M401.3 49.9c-79.8 160.1-84.6 152.5-87.9 173.2l-5.2 32.8c-1.9 12-6.6 23.5-13.7 33.4L145.6 497.1c-7.6 10.6-20.4 16.2-33.4 14.6-40.3-5-77.8-32.2-95.3-68.5-5.7-11.8-4.5-25.8 3.1-36.4l148.9-207.9c7.1-9.9 16.4-18 27.2-23.7l29.3-15.5c18.5-9.8 9.7-11.9 135.6-138.9 1-4.8 1-7.3 3.6-8 3-.7 6.6-1 6.3-4.6l-.4-4.6c-.2-1.9 1.3-3.6 3.2-3.6 4.5-.1 13.2 1.2 25.6 10 12.3 8.9 16.4 16.8 17.7 21.1.6 1.8-.6 3.7-2.4 4.2l-4.5 1.1c-3.4.9-2.5 4.4-2.3 7.4.1 2.8-2.3 3.6-6.5 6.1zM230.1 36.4c3.4.9 2.5 4.4 2.3 7.4-.2 2.7 2.1 3.5 6.4 6 7.9 15.9 15.3 30.5 22.2 44 .7 1.3 2.3 1.5 3.3.5 11.2-12 24.6-26.2 40.5-42.6 1.3-1.4 1.4-3.5.1-4.9-8-8.2-16.5-16.9-25.6-26.1-1-4.7-1-7.3-3.6-8-3-.8-6.6-1-6.3-4.6.3-3.3 1.4-8.1-2.8-8.2-4.5-.1-13.2 1.1-25.6 10-12.3 8.9-16.4 16.8-17.7 21.1-1.4 4.2 3.6 4.6 6.8 5.4zM620 406.7L471.2 198.8c-13.2-18.5-26.6-23.4-56.4-39.1-11.2-5.9-14.2-10.9-30.5-28.9-1-1.1-2.9-.9-3.6.5-46.3 88.8-47.1 82.8-49 94.8-1.7 10.7-1.3 20 .3 29.8 1.9 12 6.6 23.5 13.7 33.4l148.9 207.9c7.6 10.6 20.2 16.2 33.1 14.7 40.3-4.9 78-32 95.7-68.6 5.4-11.9 4.3-25.9-3.4-36.6z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -1,4 +0,0 @@
|
||||
document.getElementById("button_likes") &&
|
||||
document.getElementById("button_likes").addEventListener("click", () => {
|
||||
process_article();
|
||||
});
|
||||
@@ -0,0 +1,13 @@
|
||||
(function () {
|
||||
const links = document.querySelectorAll(".email-link");
|
||||
links.forEach((link) => {
|
||||
let email = atob(link.getAttribute("data-email"));
|
||||
const subject = link.getAttribute("data-subject");
|
||||
let mailto = email.startsWith("mailto:") ? email : "mailto:" + email;
|
||||
|
||||
if (subject) {
|
||||
mailto += (mailto.includes("?") ? "&" : "?") + "subject=" + encodeURIComponent(subject);
|
||||
}
|
||||
link.href = mailto;
|
||||
});
|
||||
})();
|
||||
@@ -0,0 +1,154 @@
|
||||
import { initializeApp } from "https://www.gstatic.com/firebasejs/9.23.0/firebase-app.js";
|
||||
import {
|
||||
getFirestore,
|
||||
doc,
|
||||
getDoc,
|
||||
setDoc,
|
||||
updateDoc,
|
||||
increment,
|
||||
onSnapshot,
|
||||
} from "https://www.gstatic.com/firebasejs/9.23.0/firebase-firestore.js";
|
||||
import { getAuth, signInAnonymously } from "https://www.gstatic.com/firebasejs/9.23.0/firebase-auth.js";
|
||||
|
||||
let app, db, auth, oids;
|
||||
try {
|
||||
const configEl = document.getElementById("firebase-config");
|
||||
if (!configEl?.textContent) {
|
||||
throw new Error("Firebase config element not found");
|
||||
}
|
||||
|
||||
const data = JSON.parse(configEl.textContent);
|
||||
app = initializeApp(data.config);
|
||||
|
||||
oids = {
|
||||
views: configEl.getAttribute("data-views"),
|
||||
likes: configEl.getAttribute("data-likes"),
|
||||
};
|
||||
|
||||
db = getFirestore(app);
|
||||
auth = getAuth(app);
|
||||
} catch (e) {
|
||||
console.error("Firebase initialization failed:", e.message);
|
||||
throw e;
|
||||
}
|
||||
|
||||
const id = oids?.views?.replaceAll("/", "-");
|
||||
const id_likes = oids?.likes?.replaceAll("/", "-");
|
||||
let liked = false;
|
||||
let authReady = false;
|
||||
|
||||
function formatNumber(n) {
|
||||
return n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
|
||||
}
|
||||
|
||||
function toggleLoaders(node) {
|
||||
var classesString = node.className;
|
||||
if (classesString == "") return;
|
||||
var classes = classesString.split(" ");
|
||||
for (var i in classes) {
|
||||
node.classList.toggle(classes[i]);
|
||||
}
|
||||
}
|
||||
|
||||
function updateDisplay(collection, nodeId) {
|
||||
const node = document.getElementById(nodeId);
|
||||
if (!node) return;
|
||||
|
||||
const docId = nodeId.replaceAll("/", "-");
|
||||
onSnapshot(
|
||||
doc(db, collection, docId),
|
||||
(snapshot) => {
|
||||
node.innerText = snapshot.exists() ? formatNumber(snapshot.data()[collection]) : 0;
|
||||
toggleLoaders(node);
|
||||
},
|
||||
(error) => {
|
||||
console.error("Firebase snapshot update failed:", error);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
async function recordView(id) {
|
||||
if (!id || localStorage.getItem(id)) return;
|
||||
|
||||
try {
|
||||
const ref = doc(db, "views", id);
|
||||
const snap = await getDoc(ref);
|
||||
|
||||
snap.exists() ? await updateDoc(ref, { views: increment(1) }) : await setDoc(ref, { views: 1 });
|
||||
|
||||
localStorage.setItem(id, true);
|
||||
} catch (e) {
|
||||
console.error("Record view operation failed:", e.message);
|
||||
}
|
||||
}
|
||||
|
||||
function updateButton(isLiked) {
|
||||
const hearts = document.querySelectorAll("span[id='button_likes_heart']");
|
||||
const empties = document.querySelectorAll("span[id='button_likes_emtpty_heart']");
|
||||
const texts = document.querySelectorAll("span[id='button_likes_text']");
|
||||
|
||||
hearts.forEach((el) => {
|
||||
el.style.display = isLiked ? "" : "none";
|
||||
});
|
||||
empties.forEach((el) => {
|
||||
el.style.display = isLiked ? "none" : "";
|
||||
});
|
||||
texts.forEach((el) => {
|
||||
el.innerText = isLiked ? "" : "\xa0Like";
|
||||
});
|
||||
}
|
||||
|
||||
async function toggleLike(add) {
|
||||
if (!id_likes || !authReady) return;
|
||||
|
||||
try {
|
||||
const ref = doc(db, "likes", id_likes);
|
||||
const snap = await getDoc(ref);
|
||||
|
||||
liked = add;
|
||||
add ? localStorage.setItem(id_likes, true) : localStorage.removeItem(id_likes);
|
||||
updateButton(add);
|
||||
|
||||
snap.exists()
|
||||
? await updateDoc(ref, { likes: increment(add ? 1 : -1) })
|
||||
: await setDoc(ref, { likes: add ? 1 : 0 });
|
||||
} catch (e) {
|
||||
console.error("Like operation failed:", e.message);
|
||||
liked = !add;
|
||||
add ? localStorage.removeItem(id_likes) : localStorage.setItem(id_likes, true);
|
||||
updateButton(!add);
|
||||
}
|
||||
}
|
||||
|
||||
signInAnonymously(auth)
|
||||
.then(() => {
|
||||
authReady = true;
|
||||
|
||||
document.querySelectorAll("span[id^='views_']").forEach((node) => {
|
||||
if (node.id) updateDisplay("views", node.id);
|
||||
});
|
||||
|
||||
document.querySelectorAll("span[id^='likes_']").forEach((node) => {
|
||||
if (node.id) updateDisplay("likes", node.id);
|
||||
});
|
||||
|
||||
recordView(id);
|
||||
|
||||
if (id_likes && localStorage.getItem(id_likes)) {
|
||||
liked = true;
|
||||
updateButton(true);
|
||||
}
|
||||
|
||||
const likeButton = document.getElementById("button_likes");
|
||||
if (likeButton) {
|
||||
likeButton.addEventListener("click", () => {
|
||||
toggleLike(!liked);
|
||||
});
|
||||
}
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("Firebase anonymous sign-in failed:", error.message);
|
||||
authReady = false;
|
||||
});
|
||||
|
||||
window.process_article = () => toggleLike(!liked);
|
||||
@@ -1,33 +0,0 @@
|
||||
var menuButton = document.getElementById("menu-button");
|
||||
var menuCloseButton = document.getElementById("menu-close-button");
|
||||
var menuWrapper = document.getElementById("menu-wrapper");
|
||||
|
||||
var menuOpen = false;
|
||||
|
||||
var openMenu = function () {
|
||||
if (!menuOpen) {
|
||||
menuOpen = true;
|
||||
document.body.style.overflowY = "hidden";
|
||||
menuButton.style.visibility = "hidden";
|
||||
menuWrapper.style.visibility = "visible";
|
||||
menuWrapper.style.opacity = "1";
|
||||
window.onbeforeunload = function () {
|
||||
closeMenu();
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
var closeMenu = function (e) {
|
||||
if (menuOpen) {
|
||||
menuOpen = false;
|
||||
document.body.style.overflowY = "auto";
|
||||
menuButton.style.visibility = "visible";
|
||||
menuWrapper.style.visibility = "hidden";
|
||||
menuWrapper.style.opacity = "0";
|
||||
window.onbeforeunload = function () {};
|
||||
e.stopPropagation();
|
||||
}
|
||||
};
|
||||
|
||||
menuButton && menuButton.addEventListener("click", openMenu);
|
||||
menuCloseButton && menuCloseButton.addEventListener("click", closeMenu);
|
||||
@@ -1,131 +0,0 @@
|
||||
const pageScriptElement = document.currentScript;
|
||||
const oid =
|
||||
pageScriptElement && pageScriptElement.getAttribute("data-oid")
|
||||
? pageScriptElement.getAttribute("data-oid")
|
||||
: (console.error("data-oid is null"), null);
|
||||
const oid_likes =
|
||||
pageScriptElement && pageScriptElement.getAttribute("data-oid-likes")
|
||||
? pageScriptElement.getAttribute("data-oid-likes")
|
||||
: (console.error("data-oid-likes is null"), null);
|
||||
let liked_page = false;
|
||||
const id = oid ? oid.replaceAll("/", "-") : oid;
|
||||
const id_likes = oid_likes ? oid_likes.replaceAll("/", "-") : oid_likes;
|
||||
|
||||
if (typeof auth !== "undefined") {
|
||||
const viewed = localStorage.getItem(id);
|
||||
|
||||
if (!viewed) {
|
||||
auth
|
||||
.signInAnonymously()
|
||||
.then(() => {
|
||||
const docRef = db.collection("views").doc(id);
|
||||
localStorage.setItem(id, true);
|
||||
docRef
|
||||
.get()
|
||||
.then((doc) => {
|
||||
if (doc.exists) {
|
||||
db.collection("views")
|
||||
.doc(id)
|
||||
.update({
|
||||
views: firebase.firestore.FieldValue.increment(1),
|
||||
});
|
||||
} else {
|
||||
db.collection("views").doc(id).set({ views: 1 });
|
||||
}
|
||||
})
|
||||
.catch((error) => {
|
||||
console.log("Error getting document:", error);
|
||||
});
|
||||
})
|
||||
.catch((error) => {
|
||||
const errorCode = error.code;
|
||||
const errorMessage = error.message;
|
||||
console.error(errorCode, errorMessage);
|
||||
});
|
||||
}
|
||||
|
||||
const liked = localStorage.getItem(id_likes);
|
||||
|
||||
if (liked) {
|
||||
liked_page = true;
|
||||
document.querySelectorAll("span[id='button_likes_heart']")[0].style.display = "";
|
||||
document.querySelectorAll("span[id='button_likes_emtpty_heart']")[0].style.display = "none";
|
||||
document.querySelectorAll("span[id='button_likes_text']")[0].innerText = "";
|
||||
}
|
||||
}
|
||||
|
||||
function like_article(id_likes) {
|
||||
auth
|
||||
.signInAnonymously()
|
||||
.then(() => {
|
||||
const docRef = db.collection("likes").doc(id_likes);
|
||||
docRef
|
||||
.get()
|
||||
.then((doc) => {
|
||||
liked_page = true;
|
||||
localStorage.setItem(id_likes, true);
|
||||
document.querySelectorAll("span[id='button_likes_heart']")[0].style.display = "";
|
||||
document.querySelectorAll("span[id='button_likes_emtpty_heart']")[0].style.display = "none";
|
||||
document.querySelectorAll("span[id='button_likes_text']")[0].innerText = "";
|
||||
if (doc.exists) {
|
||||
db.collection("likes")
|
||||
.doc(id_likes)
|
||||
.update({
|
||||
likes: firebase.firestore.FieldValue.increment(1),
|
||||
});
|
||||
} else {
|
||||
db.collection("likes").doc(id_likes).set({ likes: 1 });
|
||||
}
|
||||
})
|
||||
.catch((error) => {
|
||||
console.log("Error getting document:", error);
|
||||
});
|
||||
})
|
||||
.catch((error) => {
|
||||
const errorCode = error.code;
|
||||
const errorMessage = error.message;
|
||||
console.error(errorCode, errorMessage);
|
||||
});
|
||||
}
|
||||
|
||||
function remove_like_article(id_likes) {
|
||||
auth
|
||||
.signInAnonymously()
|
||||
.then(() => {
|
||||
const docRef = db.collection("likes").doc(id_likes);
|
||||
docRef
|
||||
.get()
|
||||
.then((doc) => {
|
||||
liked_page = false;
|
||||
localStorage.removeItem(id_likes);
|
||||
document.querySelectorAll("span[id='button_likes_heart']")[0].style.display = "none";
|
||||
document.querySelectorAll("span[id='button_likes_emtpty_heart']")[0].style.display = "";
|
||||
document.querySelectorAll("span[id='button_likes_text']")[0].innerText = "\xa0Like";
|
||||
if (doc.exists) {
|
||||
db.collection("likes")
|
||||
.doc(id_likes)
|
||||
.update({
|
||||
likes: firebase.firestore.FieldValue.increment(-1),
|
||||
});
|
||||
} else {
|
||||
db.collection("likes").doc(id_likes).set({ likes: 0 });
|
||||
}
|
||||
})
|
||||
.catch((error) => {
|
||||
console.log("Error getting document:", error);
|
||||
});
|
||||
})
|
||||
.catch((error) => {
|
||||
const errorCode = error.code;
|
||||
const errorMessage = error.message;
|
||||
console.error(errorCode, errorMessage);
|
||||
});
|
||||
}
|
||||
|
||||
function process_article() {
|
||||
if (!liked_page) {
|
||||
like_article(id_likes);
|
||||
} else {
|
||||
remove_like_article(id_likes);
|
||||
}
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
if (typeof auth !== "undefined") {
|
||||
var viewsCollection = db.collection("views");
|
||||
var likesCollection = db.collection("likes");
|
||||
|
||||
function numberWithCommas(x) {
|
||||
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
|
||||
}
|
||||
|
||||
function toggleLoaders(node) {
|
||||
var classesString = node.className;
|
||||
if (classesString == "") return;
|
||||
var classes = classesString.split(" ");
|
||||
for (var i in classes) {
|
||||
node.classList.toggle(classes[i]);
|
||||
}
|
||||
}
|
||||
|
||||
var update_views = function (node, id) {
|
||||
viewsCollection.doc(id).onSnapshot((doc) => {
|
||||
var data = doc.data();
|
||||
if (data) {
|
||||
node.innerText = numberWithCommas(data.views);
|
||||
} else {
|
||||
node.innerText = 0;
|
||||
}
|
||||
toggleLoaders(node);
|
||||
});
|
||||
};
|
||||
|
||||
var update_likes = function (node, id) {
|
||||
likesCollection.doc(id).onSnapshot((doc) => {
|
||||
var data = doc.data();
|
||||
if (data) {
|
||||
node.innerText = numberWithCommas(data.likes);
|
||||
} else {
|
||||
node.innerText = 0;
|
||||
}
|
||||
toggleLoaders(node);
|
||||
});
|
||||
};
|
||||
|
||||
auth
|
||||
.signInAnonymously()
|
||||
.then(() => {
|
||||
var views_nodes = document.querySelectorAll("span[id^='views_']");
|
||||
|
||||
for (var i in views_nodes) {
|
||||
var node = views_nodes[i];
|
||||
var id = node.id ? node.id.replaceAll("/", "-") : node.id;
|
||||
if (id) {
|
||||
update_views(node, id);
|
||||
}
|
||||
}
|
||||
|
||||
var likes_nodes = document.querySelectorAll("span[id^='likes_']");
|
||||
|
||||
for (var i in likes_nodes) {
|
||||
var node = likes_nodes[i];
|
||||
var id = node.id ? node.id.replaceAll("/", "-") : node.id;
|
||||
if (id) {
|
||||
update_likes(node, id);
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch((error) => {
|
||||
var errorCode = error.code;
|
||||
var errorMessage = error.message;
|
||||
console.error(errorCode, errorMessage);
|
||||
});
|
||||
}
|
||||
@@ -27,7 +27,7 @@ function _getPackeryOptions(nodeGallery) {
|
||||
}
|
||||
|
||||
(function init() {
|
||||
$(window).on("load", function () {
|
||||
window.addEventListener("load", function () {
|
||||
let packeries = [];
|
||||
let nodeGalleries = document.querySelectorAll(".gallery");
|
||||
|
||||
@@ -35,6 +35,5 @@ function _getPackeryOptions(nodeGallery) {
|
||||
let packery = new Packery(nodeGallery, _getPackeryOptions(nodeGallery));
|
||||
packeries.push(packery);
|
||||
});
|
||||
console.groupEnd();
|
||||
});
|
||||
})();
|
||||
@@ -5,7 +5,25 @@ function initTabs() {
|
||||
|
||||
const container = button.closest(".tab__container");
|
||||
const tabIndex = parseInt(button.dataset.tabIndex);
|
||||
activateTab(container, tabIndex);
|
||||
const tabLabel = button.dataset.tabLabel;
|
||||
const group = container.dataset.tabGroup;
|
||||
|
||||
if (group) {
|
||||
const allGroupContainers = document.querySelectorAll(`.tab__container[data-tab-group="${group}"]`);
|
||||
|
||||
allGroupContainers.forEach((groupContainer) => {
|
||||
const targetButton = Array.from(groupContainer.querySelectorAll(".tab__button")).find(
|
||||
(btn) => btn.dataset.tabLabel === tabLabel,
|
||||
);
|
||||
|
||||
if (targetButton) {
|
||||
const targetIndex = parseInt(targetButton.dataset.tabIndex);
|
||||
activateTab(groupContainer, targetIndex);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
activateTab(container, tabIndex);
|
||||
}
|
||||
};
|
||||
|
||||
document.addEventListener("click", tabClickHandler);
|
||||
|
||||
Vendored
+3
-3
@@ -1,9 +1,9 @@
|
||||
/**
|
||||
* Fuse.js v7.1.0 - Lightweight fuzzy-search (http://fusejs.io)
|
||||
* Fuse.js v7.2.0 - Lightweight fuzzy-search (http://fusejs.io)
|
||||
*
|
||||
* Copyright (c) 2025 Kiro Risk (http://kiro.me)
|
||||
* Copyright (c) 2026 Kiro Risk (http://kiro.me)
|
||||
* All Rights Reserved. Apache Software License 2.0
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*/
|
||||
var e,t;e=this,t=function(){"use strict";function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function t(t){for(var n=1;n<arguments.length;n++){var r=null!=arguments[n]?arguments[n]:{};n%2?e(Object(r),!0).forEach((function(e){o(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):e(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,v(r.key),r)}}function u(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),Object.defineProperty(e,"prototype",{writable:!1}),e}function o(e,t,n){return(t=v(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function c(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}function a(e){return a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},a(e)}function s(e,t){return s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},s(e,t)}function h(e,t){if(t&&("object"==typeof t||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}function l(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=a(e);if(t){var i=a(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return h(this,n)}}function f(e){return function(e){if(Array.isArray(e))return d(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return d(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?d(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function v(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}function g(e){return Array.isArray?Array.isArray(e):"[object Array]"===M(e)}var y=1/0;function p(e){return null==e?"":function(e){if("string"==typeof e)return e;var t=e+"";return"0"==t&&1/e==-y?"-0":t}(e)}function A(e){return"string"==typeof e}function m(e){return"number"==typeof e}function C(e){return!0===e||!1===e||function(e){return k(e)&&null!==e}(e)&&"[object Boolean]"==M(e)}function k(e){return"object"===n(e)}function E(e){return null!=e}function F(e){return!e.trim().length}function M(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":Object.prototype.toString.call(e)}var b=function(e){return"Missing ".concat(e," property in key")},D=function(e){return"Property 'weight' in key '".concat(e,"' must be a positive integer")},B=Object.prototype.hasOwnProperty,x=function(){function e(t){var n=this;r(this,e),this._keys=[],this._keyMap={};var i=0;t.forEach((function(e){var t=w(e);n._keys.push(t),n._keyMap[t.id]=t,i+=t.weight})),this._keys.forEach((function(e){e.weight/=i}))}return u(e,[{key:"get",value:function(e){return this._keyMap[e]}},{key:"keys",value:function(){return this._keys}},{key:"toJSON",value:function(){return JSON.stringify(this._keys)}}]),e}();function w(e){var t=null,n=null,r=null,i=1,u=null;if(A(e)||g(e))r=e,t=S(e),n=L(e);else{if(!B.call(e,"name"))throw new ErLine truncated
|
||||
var e,t;e=this,t=function(){"use strict";function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function t(t){for(var n=1;n<arguments.length;n++){var r=null!=arguments[n]?arguments[n]:{};n%2?e(Object(r),!0).forEach((function(e){o(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):e(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,v(r.key),r)}}function u(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),Object.defineProperty(e,"prototype",{writable:!1}),e}function o(e,t,n){return(t=v(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function c(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&a(e,t)}function s(e){return s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},s(e)}function a(e,t){return a=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},a(e,t)}function h(e,t){if(t&&("object"==typeof t||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}function l(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=s(e);if(t){var i=s(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return h(this,n)}}function f(e){return function(e){if(Array.isArray(e))return d(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return d(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?d(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function v(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}function g(e){return Array.isArray?Array.isArray(e):"[object Array]"===M(e)}var y=1/0;function p(e){return null==e?"":function(e){if("string"==typeof e)return e;var t=e+"";return"0"==t&&1/e==-y?"-0":t}(e)}function A(e){return"string"==typeof e}function m(e){return"number"==typeof e}function C(e){return!0===e||!1===e||function(e){return k(e)&&null!==e}(e)&&"[object Boolean]"==M(e)}function k(e){return"object"===n(e)}function F(e){return null!=e}function b(e){return!e.trim().length}function M(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":Object.prototype.toString.call(e)}var E=function(e){return"Missing ".concat(e," property in key")},D=function(e){return"Property 'weight' in key '".concat(e,"' must be a positive integer")},B=Object.prototype.hasOwnProperty,x=function(){function e(t){var n=this;r(this,e),this._keys=[],this._keyMap={};var i=0;t.forEach((function(e){var t=_(e);n._keys.push(t),n._keyMap[t.id]=t,i+=t.weight})),this._keys.forEach((function(e){e.weight/=i}))}return u(e,[{key:"get",value:function(e){return this._keyMap[e]}},{key:"keys",value:function(){return this._keys}},{key:"toJSON",value:function(){return JSON.stringify(this._keys)}}]),e}();function _(e){var t=null,n=null,r=null,i=1,u=null;if(A(e)||g(e))r=e,t=S(e),n=w(e);else{if(!B.call(e,"name"))throw new ErLine truncated
|
||||
Vendored
-2
@@ -1,2 +0,0 @@
|
||||
/*! jQuery v3.7.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/animatedSelector,-effects/Tween | (c) OpenJS Foundation and other contributors | jquery.org/license */
|
||||
!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},m=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||m).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/animatedSelector,-effects/Tween",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}function fe(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}ce.fn=ce.prototype={jquery:t,constructor:ce,length:0,toArray:function(){return ae.call(this)},get:function(e){return null==e?ae.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=ce.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return ce.each(this,e)},map:function(n){return this.pushStack(ce.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(ae.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(ce.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(ce.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:oe.sort,splice:oe.splice},ce.extend=ce.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||v(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(ce.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||ce.isPlainObject(n)?n:{},i=!1,a[t]=ce.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},ce.extend({expando:"jQuery"+(t+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==i.call(e))&&(!(t=r(e))||"function"==typeof(n=ue.call(t,"constructor")&&t.constructor)&&o.call(n)===a)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(c(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},text:function(e){var t,n="",r=0,i=e.nodeType;if(!i)while(t=e[r++])n+=ce.text(t);return 1===i||11===i?e.textContent:9===i?e.documentElement.textContent:3===i||4===i?e.nodeValue:n},makeArray:function(e,t){var n=t||[];return null!=e&&(c(Object(e))?ce.merge(n,"string"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:se.call(t,e,n)},isXMLDoc:function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!l.test(t||n&&n.nodeName||"HTML")},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(c(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:le}),"function"==typeof Symbol&&(ce.fn[Symbol.iterator]=oe[Symbol.iterator]),ce.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var de=oe.pop,pe=oe.sort,he=oe.splice,ge="[\\x20\\t\\r\\n\\f]",ve=new RegExp("^"+ge+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ge+"+$","g");ce.contains=function(e,t){var n=t&&t.parentNode;return e===n||!(!n||1!==n.nodeType||!(e.contains?e.contains(n):e.compareDocumentPosition&&16&e.compareDocumentPosition(n)))};var f=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;function d(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e}ce.escapeSelector=function(e){return(e+Line truncated
|
||||
Vendored
+1
-1
@@ -1 +1 @@
|
||||
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("katex")):"function"==typeof define&&define.amd?define(["katex"],t):"object"==typeof exports?exports.renderMathInElement=t(require("katex")):e.renderMathInElement=t(e.katex)}("undefined"!=typeof self?self:this,(function(e){return function(){"use strict";var t={757:function(t){t.exports=e}},n={};function r(e){var o=n[e];if(void 0!==o)return o.exports;var i=n[e]={exports:{}};return t[e](i,i.exports,r),i.exports}r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,{a:t}),t},r.d=function(e,t){for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var o={};r.d(o,{default:function(){return p}});var i=r(757),a=r.n(i);const l=function(e,t,n){let r=n,o=0;const i=e.length;for(;r<t.length;){const n=t[r];if(o<=0&&t.slice(r,r+i)===e)return r;"\\"===n?r++:"{"===n?o++:"}"===n&&o--,r++}return-1},s=/^\\begin{/;var d=function(e,t){let n;const r=[],o=new RegExp("("+t.map((e=>e.left.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"))).join("|")+")");for(;n=e.search(o),-1!==n;){n>0&&(r.push({type:"text",data:e.slice(0,n)}),e=e.slice(n));const o=t.findIndex((t=>e.startsWith(t.left)));if(n=l(t[o].right,e,t[o].left.length),-1===n)break;const i=e.slice(0,n+t[o].right.length),a=s.test(i)?i:e.slice(t[o].left.length,n);r.push({type:"math",data:a,rawData:i,display:t[o].display}),e=e.slice(n+t[o].right.length)}return""!==e&&r.push({type:"text",data:e}),r};const c=function(e,t){const n=d(e,t.delimiters);if(1===n.length&&"text"===n[0].type)return null;const r=document.createDocumentFragment();for(let e=0;e<n.length;e++)if("text"===n[e].type)r.appendChild(document.createTextNode(n[e].data));else{const o=document.createElement("span");let i=n[e].data;t.displayMode=n[e].display;try{t.preProcess&&(i=t.preProcess(i)),a().render(i,o,t)}catch(o){if(!(o instanceof a().ParseError))throw o;t.errorCallback("KaTeX auto-render: Failed to parse `"+n[e].data+"` with ",o),r.appendChild(document.createTextNode(n[e].rawData));continue}r.appendChild(o)}return r},f=function(e,t){for(let n=0;n<e.childNodes.length;n++){const r=e.childNodes[n];if(3===r.nodeType){let o=r.textContent,i=r.nextSibling,a=0;for(;i&&i.nodeType===Node.TEXT_NODE;)o+=i.textContent,i=i.nextSibling,a++;const l=c(o,t);if(l){for(let e=0;e<a;e++)r.nextSibling.remove();n+=l.childNodes.length-1,e.replaceChild(l,r)}else n+=a}else if(1===r.nodeType){const e=" "+r.className+" ";-1===t.ignoredTags.indexOf(r.nodeName.toLowerCase())&&t.ignoredClasses.every((t=>-1===e.indexOf(" "+t+" ")))&&f(r,t)}}};var p=function(e,t){if(!e)throw new Error("No element provided to render");const n={};for(const e in t)t.hasOwnProperty(e)&&(n[e]=t[e]);n.delimiters=n.delimiters||[{left:"$$",right:"$$",display:!0},{left:"\\(",right:"\\)",display:!1},{left:"\\begin{equation}",right:"\\end{equation}",display:!0},{left:"\\begin{align}",right:"\\end{align}",display:!0},{left:"\\begin{alignat}",right:"\\end{alignat}",display:!0},{left:"\\begin{gather}",right:"\\end{gather}",display:!0},{left:"\\begin{CD}",right:"\\end{CD}",display:!0},{left:"\\[",right:"\\]",display:!0}],n.ignoredTags=n.ignoredTags||["script","noscript","style","textarea","pre","code","option"],n.ignoredClasses=n.ignoredClasses||[],n.errorCallback=n.errorCallback||console.error,n.macros=n.macros||{},f(e,n)};return o=o.default}()}));
|
||||
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("katex")):"function"==typeof define&&define.amd?define(["katex"],t):"object"==typeof exports?exports.renderMathInElement=t(require("katex")):e.renderMathInElement=t(e.katex)}("undefined"!=typeof self?self:this,function(e){return function(){"use strict";var t={757:function(t){t.exports=e}},n={};function r(e){var o=n[e];if(void 0!==o)return o.exports;var i=n[e]={exports:{}};return t[e](i,i.exports,r),i.exports}r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,{a:t}),t},r.d=function(e,t){for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var o={};r.d(o,{default:function(){return p}});var i=r(757),a=r.n(i);const l=function(e,t,n){let r=n,o=0;const i=e.length;for(;r<t.length;){const n=t[r];if(o<=0&&t.slice(r,r+i)===e)return r;"\\"===n?r++:"{"===n?o++:"}"===n&&o--,r++}return-1},s=/^\\begin{/;var d=function(e,t){let n;const r=[],o=new RegExp("("+t.map(e=>e.left.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")).join("|")+")");for(;n=e.search(o),-1!==n;){n>0&&(r.push({type:"text",data:e.slice(0,n)}),e=e.slice(n));const o=t.findIndex(t=>e.startsWith(t.left));if(n=l(t[o].right,e,t[o].left.length),-1===n)break;const i=e.slice(0,n+t[o].right.length),a=s.test(i)?i:e.slice(t[o].left.length,n);r.push({type:"math",data:a,rawData:i,display:t[o].display}),e=e.slice(n+t[o].right.length)}return""!==e&&r.push({type:"text",data:e}),r};const c=function(e,t){const n=d(e,t.delimiters);if(1===n.length&&"text"===n[0].type)return null;const r=document.createDocumentFragment();for(let e=0;e<n.length;e++)if("text"===n[e].type)r.appendChild(document.createTextNode(n[e].data));else{const o=document.createElement("span");let i=n[e].data;t.displayMode=n[e].display;try{t.preProcess&&(i=t.preProcess(i)),a().render(i,o,t)}catch(o){if(!(o instanceof a().ParseError))throw o;t.errorCallback("KaTeX auto-render: Failed to parse `"+n[e].data+"` with ",o),r.appendChild(document.createTextNode(n[e].rawData));continue}r.appendChild(o)}return r},f=function(e,t){for(let o=0;o<e.childNodes.length;o++){const i=e.childNodes[o];if(3===i.nodeType){var n;let a=null!=(n=i.textContent)?n:"",l=i.nextSibling,s=0;for(;l&&l.nodeType===Node.TEXT_NODE;){var r;a+=null!=(r=l.textContent)?r:"",l=l.nextSibling,s++}const d=c(a,t);if(d){for(let e=0;e<s;e++)i.nextSibling.remove();o+=d.childNodes.length-1,e.replaceChild(d,i)}else o+=s}else if(1===i.nodeType){const e=" "+i.className+" ";!t.ignoredTags.has(i.nodeName.toLowerCase())&&t.ignoredClasses.every(t=>!e.includes(" "+t+" "))&&f(i,t)}}};var p=function(e,t){if(!e)throw new Error("No element provided to render");const n={};Object.assign(n,t),n.delimiters=n.delimiters||[{left:"$$",right:"$$",display:!0},{left:"\\(",right:"\\)",display:!1},{left:"\\begin{equation}",right:"\\end{equation}",display:!0},{left:"\\begin{align}",right:"\\end{align}",display:!0},{left:"\\begin{alignat}",right:"\\end{alignat}",display:!0},{left:"\\begin{gather}",right:"\\end{gather}",display:!0},{left:"\\begin{CD}",right:"\\end{CD}",display:!0},{left:"\\[",right:"\\]",display:!0}],n.ignoredTags=new Set((null==t?void 0:t.ignoredTags)||["script","noscript","style","textarea","pre","code","option"]),n.ignoredClasses=n.ignoredClasses||[],n.errorCallback=n.errorCallback||console.error,n.macros=n.macros||{},f(e,n)};return o=o.default}()});
|
||||
Vendored
+1
-1
@@ -1 +1 @@
|
||||
@font-face{font-display:block;font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(fonts/KaTeX_AMS-Regular.woff2) format("woff2"),url(fonts/KaTeX_AMS-Regular.woff) format("woff"),url(fonts/KaTeX_AMS-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Bold.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Regular.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Fraktur-Bold.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Bold.woff) format("woff"),url(fonts/KaTeX_Fraktur-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Fraktur-Regular.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Regular.woff) format("woff"),url(fonts/KaTeX_Fraktur-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Main-Bold.woff2) format("woff2"),url(fonts/KaTeX_Main-Bold.woff) format("woff"),url(fonts/KaTeX_Main-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Main-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Main-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Main-BoldItalic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Main-Italic.woff2) format("woff2"),url(fonts/KaTeX_Main-Italic.woff) format("woff"),url(fonts/KaTeX_Main-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Main-Regular.woff2) format("woff2"),url(fonts/KaTeX_Main-Regular.woff) format("woff"),url(fonts/KaTeX_Main-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Math-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Math-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Math-BoldItalic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Math-Italic.woff2) format("woff2"),url(fonts/KaTeX_Math-Italic.woff) format("woff"),url(fonts/KaTeX_Math-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:normal;font-weight:700;src:url(fonts/KaTeX_SansSerif-Bold.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Bold.woff) format("woff"),url(fonts/KaTeX_SansSerif-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:italic;font-weight:400;src:url(fonts/KaTeX_SansSerif-Italic.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Italic.woff) format("woff"),url(fonts/KaTeX_SansSerif-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:normal;font-weight:400;src:url(fonts/KaTeX_SansSerif-Regular.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Regular.woff) format("woff"),url(fonts/KaTeX_SansSerif-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Script-Regular.woff2) format("woff2"),url(fonts/KaTeX_Script-Regular.woff) format("woff"),url(fonts/KaTeX_Script-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size1-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size1-Regular.woff) format("woff"),url(fonts/KaTeX_Size1-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size2-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size2-Regular.woff) format("woff"),url(fonts/KaTeX_Size2-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size3-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size3-Regular.woff) format("woff"),url(fonts/KaTeX_Size3-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size4-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size4-Regular.woff) format("woff"),url(fonts/KaTeX_Size4-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Typewriter-Regular.woff2) format("woff2"),url(fonts/KaTeX_Typewriter-ReguLine truncated
|
||||
@font-face{font-display:block;font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(fonts/KaTeX_AMS-Regular.woff2) format("woff2"),url(fonts/KaTeX_AMS-Regular.woff) format("woff"),url(fonts/KaTeX_AMS-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Bold.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Regular.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Fraktur-Bold.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Bold.woff) format("woff"),url(fonts/KaTeX_Fraktur-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Fraktur-Regular.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Regular.woff) format("woff"),url(fonts/KaTeX_Fraktur-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Main-Bold.woff2) format("woff2"),url(fonts/KaTeX_Main-Bold.woff) format("woff"),url(fonts/KaTeX_Main-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Main-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Main-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Main-BoldItalic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Main-Italic.woff2) format("woff2"),url(fonts/KaTeX_Main-Italic.woff) format("woff"),url(fonts/KaTeX_Main-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Main-Regular.woff2) format("woff2"),url(fonts/KaTeX_Main-Regular.woff) format("woff"),url(fonts/KaTeX_Main-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Math-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Math-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Math-BoldItalic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Math-Italic.woff2) format("woff2"),url(fonts/KaTeX_Math-Italic.woff) format("woff"),url(fonts/KaTeX_Math-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:normal;font-weight:700;src:url(fonts/KaTeX_SansSerif-Bold.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Bold.woff) format("woff"),url(fonts/KaTeX_SansSerif-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:italic;font-weight:400;src:url(fonts/KaTeX_SansSerif-Italic.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Italic.woff) format("woff"),url(fonts/KaTeX_SansSerif-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:normal;font-weight:400;src:url(fonts/KaTeX_SansSerif-Regular.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Regular.woff) format("woff"),url(fonts/KaTeX_SansSerif-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Script-Regular.woff2) format("woff2"),url(fonts/KaTeX_Script-Regular.woff) format("woff"),url(fonts/KaTeX_Script-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size1-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size1-Regular.woff) format("woff"),url(fonts/KaTeX_Size1-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size2-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size2-Regular.woff) format("woff"),url(fonts/KaTeX_Size2-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size3-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size3-Regular.woff) format("woff"),url(fonts/KaTeX_Size3-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size4-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size4-Regular.woff) format("woff"),url(fonts/KaTeX_Size4-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Typewriter-Regular.woff2) format("woff2"),url(fonts/KaTeX_Typewriter-ReguLine truncated
|
||||
Vendored
+1
-1
@@ -1 +1 @@
|
||||
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.katex=t():e.katex=t()}("undefined"!=typeof self?self:this,(function(){return function(){"use strict";var e={d:function(t,r){for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t={};e.d(t,{default:function(){return Wn}});class r{constructor(e,t){this.name=void 0,this.position=void 0,this.length=void 0,this.rawMessage=void 0;let n,o,s="KaTeX parse error: "+e;const i=t&&t.loc;if(i&&i.start<=i.end){const e=i.lexer.input;n=i.start,o=i.end,n===e.length?s+=" at end of input: ":s+=" at position "+(n+1)+": ";const t=e.slice(n,o).replace(/[^]/g,"$&\u0332");let r,a;r=n>15?"\u2026"+e.slice(n-15,n):e.slice(0,n),a=o+15<e.length?e.slice(o,o+15)+"\u2026":e.slice(o),s+=r+t+a}const a=new Error(s);return a.name="ParseError",a.__proto__=r.prototype,a.position=n,null!=n&&null!=o&&(a.length=o-n),a.rawMessage=e,a}}r.prototype.__proto__=Error.prototype;var n=r;const o=/([A-Z])/g,s={"&":"&",">":">","<":"<",'"':""","'":"'"},i=/[&><"']/g;const a=function(e){return"ordgroup"===e.type||"color"===e.type?1===e.body.length?a(e.body[0]):e:"font"===e.type?a(e.body):e};var l={deflt:function(e,t){return void 0===e?t:e},escape:function(e){return String(e).replace(i,(e=>s[e]))},hyphenate:function(e){return e.replace(o,"-$1").toLowerCase()},getBaseElem:a,isCharacterBox:function(e){const t=a(e);return"mathord"===t.type||"textord"===t.type||"atom"===t.type},protocolFromUrl:function(e){const t=/^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(e);return t?":"!==t[2]?null:/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(t[1])?t[1].toLowerCase():null:"_relative"}};const h={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format <type>"},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color <color>",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:e=>"#"+e},macros:{type:"object",cli:"-m, --macro <def>",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:(e,t)=>(t.push(e),t)},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:e=>Math.max(0,e),cli:"--min-rule-thickness <size>",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:e=>Math.max(0,e),cli:"-s, --max-size <n>",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:e=>Math.max(0,e),cli:"-e, --max-expand <n>",cliProcessor:e=>"Infinity"===e?1/0:parseInt(e)},globalGroup:{type:"boolean",cli:!1}};function c(e){if(e.default)return e.default;const t=e.type,r=Array.isArray(t)?t[0]:t;if("string"!=typeof r)return r.enum[0];switch(r){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}class m{constructor(e){this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.Line truncated
|
||||
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.katex=t():e.katex=t()}("undefined"!=typeof self?self:this,function(){return function(){"use strict";var e={d:function(t,r){for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t={};e.d(t,{default:function(){return io}});class r extends Error{constructor(e,t){let n,o,s="KaTeX parse error: "+e;const i=t&&t.loc;if(i&&i.start<=i.end){const e=i.lexer.input;n=i.start,o=i.end,n===e.length?s+=" at end of input: ":s+=" at position "+(n+1)+": ";const t=e.slice(n,o).replace(/[^]/g,"$&\u0332");let r,l;r=n>15?"\u2026"+e.slice(n-15,n):e.slice(0,n),l=o+15<e.length?e.slice(o,o+15)+"\u2026":e.slice(o),s+=r+t+l}super(s),this.name="ParseError",Object.setPrototypeOf(this,r.prototype),this.position=n,null!=n&&null!=o&&(this.length=o-n),this.rawMessage=e}}var n=r;const o=/([A-Z])/g,s=e=>e.replace(o,"-$1").toLowerCase(),i={"&":"&",">":">","<":"<",'"':""","'":"'"},l=/[&><"']/g,a=e=>String(e).replace(l,e=>i[e]),c=e=>"ordgroup"===e.type||"color"===e.type?1===e.body.length?c(e.body[0]):e:"font"===e.type?c(e.body):e,h=new Set(["mathord","textord","atom"]),m=e=>h.has(c(e).type),u={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format <type>"},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color <color>",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:e=>"#"+e},macros:{type:"object",cli:"-m, --macro <def>",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:(e,t)=>(t.push(e),t)},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:e=>Math.max(0,e),cli:"--min-rule-thickness <size>",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:e=>Math.max(0,e),cli:"-s, --max-size <n>",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:e=>Math.max(0,e),cli:"-e, --max-expand <n>",cliProcessor:e=>"Infinity"===e?1/0:parseInt(e)},globalGroup:{type:"boolean",cli:!1}};function p(e){if("default"in e)return e.default;const t=e.type,r=Array.isArray(t)?t[0]:t;if("string"!=typeof r)return r.enum[0];switch(r){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}class d{constructor(e){void 0===e&&(e={}),e=e||{};for(const t of Object.keys(u)){const r=u[t],n=e[t];this[t]=void 0!==n?r.processor?r.processor(n):n:p(r)}}reportNonstrict(e,t,r){let o=this.strict;if("function"==typeof o&&(o=o(e,t,r)),o&&"ignore"!==o){if(!0===o||"error"===o)throw new n("LaTeX-incompatible input and strict mode is set to 'error': "+t+" ["+e+"]",r);"warn"===o?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+o+"': "+t+" ["+e+"]")}}useStrictBehavior(e,t,r)Line truncated
|
||||
@@ -52,7 +52,7 @@ lite-youtube > iframe {
|
||||
}
|
||||
|
||||
/* play button */
|
||||
lite-youtube > .lty-playbtn {
|
||||
lite-youtube > .lyt-playbtn {
|
||||
display: block;
|
||||
/* Make the button element cover the whole area for a large hover/click target… */
|
||||
width: 100%;
|
||||
@@ -69,8 +69,8 @@ lite-youtube > .lty-playbtn {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
lite-youtube:hover > .lty-playbtn,
|
||||
lite-youtube .lty-playbtn:focus {
|
||||
lite-youtube:hover > .lyt-playbtn,
|
||||
lite-youtube .lyt-playbtn:focus {
|
||||
filter: none;
|
||||
}
|
||||
|
||||
@@ -79,7 +79,7 @@ lite-youtube.lyt-activated {
|
||||
cursor: unset;
|
||||
}
|
||||
lite-youtube.lyt-activated::before,
|
||||
lite-youtube.lyt-activated > .lty-playbtn {
|
||||
lite-youtube.lyt-activated > .lyt-playbtn {
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ class LiteYTEmbed extends HTMLElement {
|
||||
connectedCallback() {
|
||||
this.videoId = this.getAttribute('videoid');
|
||||
|
||||
let playBtnEl = this.querySelector('.lty-playbtn');
|
||||
let playBtnEl = this.querySelector('.lyt-playbtn,.lty-playbtn');
|
||||
// A label for the button takes priority over a [playlabel] attribute on the custom-element
|
||||
this.playLabel = (playBtnEl && playBtnEl.textContent.trim()) || this.getAttribute('playlabel') || 'Play';
|
||||
|
||||
@@ -34,7 +34,8 @@ class LiteYTEmbed extends HTMLElement {
|
||||
if (!playBtnEl) {
|
||||
playBtnEl = document.createElement('button');
|
||||
playBtnEl.type = 'button';
|
||||
playBtnEl.classList.add('lty-playbtn');
|
||||
// Include the mispelled 'lty-' in case it's still being used. https://github.com/paulirish/lite-youtube-embed/issues/65
|
||||
playBtnEl.classList.add('lyt-playbtn', 'lty-playbtn');
|
||||
this.append(playBtnEl);
|
||||
}
|
||||
if (!playBtnEl.textContent) {
|
||||
@@ -200,6 +201,8 @@ class LiteYTEmbed extends HTMLElement {
|
||||
iframeEl.title = this.playLabel;
|
||||
iframeEl.allow = 'accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture';
|
||||
iframeEl.allowFullscreen = true;
|
||||
// Required by Youtube to fix Error 153
|
||||
iframeEl.referrerPolicy = 'strict-origin-when-cross-origin';
|
||||
// AFAIK, the encoding here isn't necessary for XSS, but we'll do it only because this is a URL
|
||||
// https://stackoverflow.com/q/64959723/89484
|
||||
iframeEl.src = `https://www.youtube-nocookie.com/embed/${encodeURIComponent(this.videoId)}?${this.getParams().toString()}`;
|
||||
|
||||
Vendored
+984
-497
File diff suppressed because it is too large.
Load diff
+1
-1
@@ -2,4 +2,4 @@
|
||||
[module.hugoVersion]
|
||||
extended = true
|
||||
min = "0.141.0"
|
||||
max = "0.153.2"
|
||||
max = "0.160.1"
|
||||
@@ -1,6 +1,6 @@
|
||||
disabled = false
|
||||
languageCode = "en"
|
||||
languageName = "English"
|
||||
locale = "en"
|
||||
label = "English"
|
||||
weight = 1
|
||||
title = "Blowfish"
|
||||
|
||||
@@ -62,15 +62,18 @@ title = "Blowfish"
|
||||
# { spotify = "https://open.spotify.com/user/userid" },
|
||||
# { stack-overflow = "https://stackoverflow.com/users/userid/username" },
|
||||
# { steam = "https://steamcommunity.com/profiles/userid" },
|
||||
# { strava = "https://www.strava.com/athletes/username" },
|
||||
# { telegram = "https://t.me/username" },
|
||||
# { threads = "https://www.threads.net/@username" },
|
||||
# { tiktok = "https://tiktok.com/@username" },
|
||||
# { tumblr = "https://username.tumblr.com" },
|
||||
# { twitch = "https://twitch.tv/username" },
|
||||
# { untappd = "https://untappd.com/user/username" },
|
||||
# { twitter = "https://twitter.com/username" },
|
||||
# { x-twitter = "https://twitter.com/username" },
|
||||
# { whatsapp = "https://wa.me/phone-number" },
|
||||
# { youtube = "https://youtube.com/username" },
|
||||
# { ko-fi = "https://ko-fi.com/username" },
|
||||
# { codeberg = "https://codeberg.org/username"},
|
||||
# { printables = "https://www.printables.com/@username"},
|
||||
# ]
|
||||
@@ -29,6 +29,8 @@ disableTextInHeader = false
|
||||
# defaultFeaturedImage = "IMAGE.jpg" # used as default for featured images in all articles
|
||||
# defaultSocialImage = "/android-chrome-512x512.png" # used as default for social media sharing (Open Graph and Twitter)
|
||||
hotlinkFeatureImage = false
|
||||
# Thumbnail aspect ratio as a number (e.g., "1.5", "1.0", "1.777")
|
||||
# thumbnailAspectRatio = "1.5"
|
||||
# imagePosition = "50% 50%"
|
||||
|
||||
# highlightCurrentMenuArea = true
|
||||
@@ -87,12 +89,15 @@ forgejoDefaultServer = "https://v11.next.forgejo.org"
|
||||
showTableOfContents = false
|
||||
# showRelatedContent = false
|
||||
# relatedContentLimit = 3
|
||||
showTaxonomies = false # use showTaxonomies OR showCategoryOnly, not both
|
||||
showCategoryOnly = false # use showTaxonomies OR showCategoryOnly, not both
|
||||
showTaxonomies = false # Enable the display of taxonomies for the related article.
|
||||
showCategories = true # These will show if showTaxonomies is true.
|
||||
showTags = true # These will show if showTaxonomies is true.
|
||||
showCategoriesInSecondaryColor = false # This will change the color of category badges, so the user can better distinguish between the two. Only if showTaxonomies is true.
|
||||
showAuthorsBadges = false
|
||||
showWordCount = true
|
||||
# sharingLinks = [ "linkedin", "twitter", "bluesky", "mastodon", "reddit", "pinterest", "facebook", "email", "whatsapp", "telegram", "line"]
|
||||
showZenMode = false
|
||||
# externalLinkForceNewTab = false # disable to allow external links in the same tab (defaults to true)
|
||||
|
||||
[list]
|
||||
showHero = false
|
||||
@@ -118,6 +123,8 @@ forgejoDefaultServer = "https://v11.next.forgejo.org"
|
||||
showTermCount = true
|
||||
showHero = false
|
||||
# heroStyle = "background" # valid options: basic, big, background, thumbAndBackground
|
||||
layoutBackgroundBlur = true # only used when heroStyle equals background or thumbAndBackground
|
||||
layoutBackgroundHeaderSpace = true # only used when heroStyle equals background
|
||||
showBreadcrumbs = false
|
||||
showViews = false
|
||||
showLikes = false
|
||||
@@ -127,6 +134,8 @@ forgejoDefaultServer = "https://v11.next.forgejo.org"
|
||||
[term]
|
||||
showHero = false
|
||||
# heroStyle = "background" # valid options: basic, big, background, thumbAndBackground
|
||||
layoutBackgroundBlur = true # only used when heroStyle equals background or thumbAndBackground
|
||||
layoutBackgroundHeaderSpace = true # only used when heroStyle equals background
|
||||
showBreadcrumbs = false
|
||||
showViews = false
|
||||
showLikes = false
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
+1
-1
@@ -52,6 +52,6 @@
|
||||
"mastodon": {
|
||||
"icon": "mastodon",
|
||||
"title": "sharing.mastodon",
|
||||
"url": "https://s2f.kytta.dev/?text=%[2]s %[1]s"
|
||||
"url": "https://share.joinmastodon.org/#text=%[2]s %[1]s"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
[{"avatar_url":"https://avatars.githubusercontent.com/u/928965?u=f5d781ca0eb5cb5c7ce9e5ee5d3b24dae3d6e987\u0026v=4\u0026s=128","profile_url":"https://github.com/nazar-pc","username":"nazar-pc"},{"avatar_url":"https://avatars.githubusercontent.com/u/17061177?u=dfc0b44e86fa09e96605ec9c7775f4f98df90a20\u0026v=4\u0026s=128","profile_url":"https://github.com/ytocquet","username":"ytocquet"},{"avatar_url":"https://avatars.githubusercontent.com/u/147227691?v=4\u0026s=128","profile_url":"https://github.com/AtmosphericIgnition","username":"AtmosphericIgnition"}]
|
||||
@@ -1,5 +1,5 @@
|
||||
languageCode = "de"
|
||||
languageName = "Deutsch"
|
||||
locale = "de"
|
||||
label = "Deutsch"
|
||||
weight = 3
|
||||
title = "Blowfish"
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
languageCode = "en"
|
||||
languageName = "English"
|
||||
locale = "en"
|
||||
label = "English"
|
||||
weight = 1
|
||||
title = "Blowfish"
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
languageCode = "es"
|
||||
languageName = "Español"
|
||||
locale = "es"
|
||||
label = "Español"
|
||||
weight = 6
|
||||
title = "Blowfish"
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
languageCode = "fr"
|
||||
languageName = "Français"
|
||||
locale = "fr"
|
||||
label = "Français"
|
||||
weight = 2
|
||||
title = "Blowfish"
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
languageCode = "it"
|
||||
languageName = "Italiano"
|
||||
locale = "it"
|
||||
label = "Italiano"
|
||||
weight = 4
|
||||
title = "Blowfish"
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
languageCode = "ja"
|
||||
languageName = "日本語"
|
||||
locale = "ja"
|
||||
label = "日本語"
|
||||
weight = 8
|
||||
title = "Blowfish"
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
languageCode = "pt-br"
|
||||
languageName = "Português (Brasil)"
|
||||
locale = "pt-br"
|
||||
label = "Português (Brasil)"
|
||||
weight = 6
|
||||
title = "Blowfish"
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
languageCode = "pt-pt"
|
||||
languageName = "Português (Portugal)"
|
||||
locale = "pt-pt"
|
||||
label = "Português (Portugal)"
|
||||
weight = 5
|
||||
title = "Blowfish"
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
languageCode = "zh-cn"
|
||||
languageName = "简体中文"
|
||||
locale = "zh-cn"
|
||||
label = "简体中文"
|
||||
weight = 9
|
||||
title = "Blowfish"
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ fingerprintAlgorithm = "sha512" # Valid values are "sha512" (default), "sha384",
|
||||
|
||||
[article]
|
||||
showDate = false
|
||||
showViews = false
|
||||
showViews = true
|
||||
showLikes = false
|
||||
showDateOnlyInArticle = false
|
||||
showDateUpdated = false
|
||||
@@ -134,13 +134,13 @@ fingerprintAlgorithm = "sha512" # Valid values are "sha512" (default), "sha384",
|
||||
cardViewScreenWidth = false
|
||||
|
||||
[firebase]
|
||||
#apiKey = "AIzaSyB5tqlqDky77Vb4Tc4apiHV4hRZI18KGiY"
|
||||
#authDomain = "blowfish-21fff.firebaseapp.com"
|
||||
#projectId = "blowfish-21fff"
|
||||
#storageBucket = "blowfish-21fff.appspot.com"
|
||||
#messagingSenderId = "60108104191"
|
||||
#appId = "1:60108104191:web:039842ebe1370698b487ca"
|
||||
#measurementId = "G-PEDMYR1V0K"
|
||||
apiKey = "AIzaSyB5tqlqDky77Vb4Tc4apiHV4hRZI18KGiY"
|
||||
authDomain = "blowfish-21fff.firebaseapp.com"
|
||||
projectId = "blowfish-21fff"
|
||||
storageBucket = "blowfish-21fff.appspot.com"
|
||||
messagingSenderId = "60108104191"
|
||||
appId = "1:60108104191:web:039842ebe1370698b487ca"
|
||||
measurementId = "G-PEDMYR1V0K"
|
||||
|
||||
[fathomAnalytics]
|
||||
# site = "ABC12345"
|
||||
|
||||
@@ -231,7 +231,7 @@ Mit den installierten Abhängigkeiten bleibt nur noch, die [Tailwind CLI](https:
|
||||
|
||||
```shell
|
||||
cd ../..
|
||||
./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit
|
||||
node ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit
|
||||
```
|
||||
|
||||
Es ist ein etwas unschöner Befehl aufgrund der beteiligten Pfade, aber im Wesentlichen rufen Sie die Tailwind CLI auf und übergeben ihr den Speicherort der Tailwind-Konfigurationsdatei (die wir oben betrachtet haben), wo die `main.css`-Datei des Themes zu finden ist und wohin Sie die kompilierte CSS-Datei platzieren möchten (sie geht in den Ordner `assets/css/compiled/` Ihres Hugo-Projekts).
|
||||
@@ -253,8 +253,8 @@ Um diese ganze Lösung abzurunden, können Sie diesen gesamten Prozess vereinfac
|
||||
"description": "",
|
||||
"scripts": {
|
||||
"server": "hugo server -b http://localhost -p 8000",
|
||||
"dev": "NODE_ENV=development ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit -w",
|
||||
"build": "NODE_ENV=production ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit"
|
||||
"dev": cross-env "NODE_ENV=development ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit -w",
|
||||
"build": cross-env "NODE_ENV=production ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit"
|
||||
},
|
||||
// und mehr...
|
||||
}
|
||||
|
||||
@@ -231,7 +231,7 @@ Con las dependencias instaladas, todo lo que queda es usar [Tailwind CLI](https:
|
||||
|
||||
```shell
|
||||
cd ../..
|
||||
./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit
|
||||
node ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit
|
||||
```
|
||||
|
||||
Es un comando un poco feo debido a las rutas involucradas pero esencialmente estás llamando a Tailwind CLI y pasándole la ubicación del archivo de config de Tailwind (el que vimos arriba), dónde encontrar el archivo `main.css` del tema y luego dónde quieres que se coloque el archivo CSS compilado (va a la carpeta `assets/css/compiled/` de tu proyecto Hugo).
|
||||
@@ -253,8 +253,8 @@ Para completar completamente esta solución, puedes simplificar todo este proces
|
||||
"description": "",
|
||||
"scripts": {
|
||||
"server": "hugo server -b http://localhost -p 8000",
|
||||
"dev": "NODE_ENV=development ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit -w",
|
||||
"build": "NODE_ENV=production ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit"
|
||||
"dev": cross-env "NODE_ENV=development ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit -w",
|
||||
"build": cross-env "NODE_ENV=production ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit"
|
||||
},
|
||||
// y más...
|
||||
}
|
||||
|
||||
@@ -231,7 +231,7 @@ Avec les dépendances installées, il ne reste plus qu'à utiliser [Tailwind CLI
|
||||
|
||||
```shell
|
||||
cd ../..
|
||||
./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit
|
||||
node ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit
|
||||
```
|
||||
|
||||
C'est une commande un peu laide à cause des chemins impliqués mais essentiellement vous appelez Tailwind CLI et lui passez l'emplacement du fichier de config Tailwind (celui que nous avons regardé ci-dessus), où trouver le fichier `main.css` du thème et ensuite où vous voulez que le fichier CSS compilé soit placé (il va dans le dossier `assets/css/compiled/` de votre projet Hugo).
|
||||
@@ -253,8 +253,8 @@ Pour compléter entièrement cette solution, vous pouvez simplifier tout ce proc
|
||||
"description": "",
|
||||
"scripts": {
|
||||
"server": "hugo server -b http://localhost -p 8000",
|
||||
"dev": "NODE_ENV=development ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit -w",
|
||||
"build": "NODE_ENV=production ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit"
|
||||
"dev": cross-env "NODE_ENV=development ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit -w",
|
||||
"build": cross-env "NODE_ENV=production ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit"
|
||||
},
|
||||
// et plus...
|
||||
}
|
||||
|
||||
@@ -231,7 +231,7 @@ With the dependencies installed all that's left is to use [Tailwind CLI](https:/
|
||||
|
||||
```shell
|
||||
cd ../..
|
||||
./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit
|
||||
node ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit
|
||||
```
|
||||
|
||||
It's a bit of an ugly command due to the paths involved but essentially you're calling Tailwind CLI and passing it the location of the Tailwind config file (the one we looked at above), where to find the theme's `main.css` file and then where you want the compiled CSS file to be placed (it's going into the `assets/css/compiled/` folder of your Hugo project).
|
||||
@@ -253,8 +253,8 @@ To fully complete this solution, you can simplify this whole process by adding a
|
||||
"description": "",
|
||||
"scripts": {
|
||||
"server": "hugo server -b http://localhost -p 8000",
|
||||
"dev": "NODE_ENV=development ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit -w",
|
||||
"build": "NODE_ENV=production ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit"
|
||||
"dev": cross-env "NODE_ENV=development ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit -w",
|
||||
"build": cross-env "NODE_ENV=production ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit"
|
||||
},
|
||||
// and more...
|
||||
}
|
||||
|
||||
@@ -232,7 +232,7 @@ npm install
|
||||
|
||||
```shell
|
||||
cd ../..
|
||||
./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit
|
||||
node ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit
|
||||
```
|
||||
|
||||
関係するパスのため少し見苦しいコマンドですが、基本的に Tailwind CLI を呼び出し、Tailwind 設定ファイルの場所(上で見たもの)、テーマの `main.css` ファイルの場所、そしてコンパイル済み CSS ファイルを配置する場所(Hugo プロジェクトの `assets/css/compiled/` フォルダ)を渡しています。
|
||||
@@ -254,8 +254,8 @@ cd ../..
|
||||
"description": "",
|
||||
"scripts": {
|
||||
"server": "hugo server -b http://localhost -p 8000",
|
||||
"dev": "NODE_ENV=development ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit -w",
|
||||
"build": "NODE_ENV=production ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit"
|
||||
"dev": cross-env "NODE_ENV=development ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit -w",
|
||||
"build": cross-env "NODE_ENV=production ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit"
|
||||
},
|
||||
// その他...
|
||||
}
|
||||
|
||||
@@ -156,65 +156,16 @@ See all available styles in [Hugo's documentation](https://gohugo.io/quick-refer
|
||||
|
||||
## Building the theme CSS from source
|
||||
|
||||
If you'd like to make a major change, you can take advantage of Tailwind CSS's JIT compiler and rebuild the entire theme CSS from scratch. This is useful if you want to adjust the Tailwind configuration or add extra Tailwind classes to the main stylesheet.
|
||||
If you'd like to make a major change, you can rebuild the entire theme CSS from scratch. This is useful if you want to adjust the Tailwind configuration or add extra Tailwind classes to the main stylesheet.
|
||||
|
||||
{{< alert >}}
|
||||
**Note:** Building the theme manually is intended for advanced users.
|
||||
{{< /alert >}}
|
||||
> [!INFO]
|
||||
> Building the theme manually is intended for advanced users.
|
||||
|
||||
Let's step through how building the Tailwind CSS works.
|
||||
### How it works
|
||||
|
||||
### Tailwind configuration
|
||||
Tailwind works by [scanning your project files](https://tailwindcss.com/docs/detecting-classes-in-source-files#which-files-are-scanned) as plain text to find class-like tokens and then generating CSS only for the utilities it recognizes and that actually appear in those files.
|
||||
|
||||
In order to generate a CSS file that only contains the Tailwind classes that are actually being used the JIT compiler needs to scan through all the HTML templates and Markdown content files to check which styles are present in the markup. The compiler does this by looking at the `tailwind.config.js` file which is included in the root of the theme directory:
|
||||
|
||||
```js
|
||||
// themes/blowfish/tailwind.config.js
|
||||
|
||||
module.exports = {
|
||||
content: [
|
||||
"./layouts/**/*.html",
|
||||
"./content/**/*.{html,md}",
|
||||
"./themes/blowfish/layouts/**/*.html",
|
||||
"./themes/blowfish/content/**/*.{html,md}",
|
||||
],
|
||||
|
||||
// and more...
|
||||
};
|
||||
```
|
||||
|
||||
This default configuration has been included with these content paths so that you can easily generate your own CSS file without needing to modify it, provided you follow a particular project structure. Namely, **you have to include Blowfish in your project as a subdirectory at `themes/blowfish/`**. This means you cannot easily use Hugo Modules to install the theme and you must go down either the git submodule (recommended) or manual install routes. The [Installation docs]({{< ref "installation" >}}) explain how to install the theme using either of these methods.
|
||||
|
||||
### Project structure
|
||||
|
||||
In order to take advantage of the default configuration, your project should look something like this...
|
||||
|
||||
```shell
|
||||
.
|
||||
├── assets
|
||||
│ └── css
|
||||
│ └── compiled
|
||||
│ └── main.css # this is the file we will generate
|
||||
├── config # site config
|
||||
│ └── _default
|
||||
├── content # site content
|
||||
│ ├── _index.md
|
||||
│ ├── projects
|
||||
│ │ └── _index.md
|
||||
│ └── blog
|
||||
│ └── _index.md
|
||||
├── layouts # custom layouts for your site
|
||||
│ ├── partials
|
||||
│ │ └── extend-article-link/simple.html
|
||||
│ ├── projects
|
||||
│ │ └── list.html
|
||||
│ └── shortcodes
|
||||
│ └── disclaimer.html
|
||||
└── themes
|
||||
└── blowfish # git submodule or manual theme install
|
||||
```
|
||||
|
||||
This example structure adds a new `projects` content type with its own custom layout along with a custom shortcode and extended partial. Provided the project follows this structure, all that's required is to recompile the `main.css` file.
|
||||
The following steps focus on installing Tailwind and configuring it so the theme source files are correctly included in this scan. All commands are demonstrated for users who installed the theme as a [Git submodule]({{< ref "installation" >}}), while Hugo Module users must first vendor the theme source into the `_vendor` directory using `hugo mod vendor` and adjust the command paths accordingly.
|
||||
|
||||
### Install dependencies
|
||||
|
||||
@@ -231,12 +182,10 @@ With the dependencies installed all that's left is to use [Tailwind CLI](https:/
|
||||
|
||||
```shell
|
||||
cd ../..
|
||||
./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit
|
||||
node ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit
|
||||
```
|
||||
|
||||
It's a bit of an ugly command due to the paths involved but essentially you're calling Tailwind CLI and passing it the location of the Tailwind config file (the one we looked at above), where to find the theme's `main.css` file and then where you want the compiled CSS file to be placed (it's going into the `assets/css/compiled/` folder of your Hugo project).
|
||||
|
||||
The config file will automatically inspect all the content and layouts in your project as well as all those in the theme and build a new CSS file that contains all the CSS required for your website. Due to the way Hugo handles file hierarchy, this file in your project will now automatically override the one that comes with the theme.
|
||||
It's a bit of an ugly command due to the paths involved but essentially you're calling Tailwind CLI and passing it the location of the Tailwind config file, where to find the theme's `main.css` file and then where you want the compiled CSS file to be placed. Due to the way Hugo handles file hierarchy, the compiled CSS file in your project will now automatically override the one that comes with the theme.
|
||||
|
||||
Each time you make a change to your layouts and need new Tailwind CSS styles, you can simply re-run the command and generate the new CSS file. You can also add `-w` to the end of the command to run the JIT compiler in watch mode.
|
||||
|
||||
@@ -253,8 +202,8 @@ To fully complete this solution, you can simplify this whole process by adding a
|
||||
"description": "",
|
||||
"scripts": {
|
||||
"server": "hugo server -b http://localhost -p 8000",
|
||||
"dev": "NODE_ENV=development ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit -w",
|
||||
"build": "NODE_ENV=production ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit"
|
||||
"dev": cross-env "NODE_ENV=development ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit -w",
|
||||
"build": cross-env "NODE_ENV=production ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit"
|
||||
},
|
||||
// and more...
|
||||
}
|
||||
|
||||
@@ -231,7 +231,7 @@ Com as dependências instaladas, tudo o que resta é usar o [Tailwind CLI](https
|
||||
|
||||
```shell
|
||||
cd ../..
|
||||
./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit
|
||||
node ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit
|
||||
```
|
||||
|
||||
É um comando um pouco feio devido aos caminhos envolvidos, mas essencialmente você está chamando o Tailwind CLI e passando a localização do arquivo de config do Tailwind (o que vimos acima), onde encontrar o arquivo `main.css` do tema e então onde você quer que o arquivo CSS compilado seja colocado (ele vai para a pasta `assets/css/compiled/` do seu projeto Hugo).
|
||||
@@ -253,8 +253,8 @@ Para completar totalmente esta solução, você pode simplificar todo este proce
|
||||
"description": "",
|
||||
"scripts": {
|
||||
"server": "hugo server -b http://localhost -p 8000",
|
||||
"dev": "NODE_ENV=development ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit -w",
|
||||
"build": "NODE_ENV=production ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit"
|
||||
"dev": cross-env "NODE_ENV=development ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit -w",
|
||||
"build": cross-env "NODE_ENV=production ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit"
|
||||
},
|
||||
// e mais...
|
||||
}
|
||||
|
||||
@@ -231,7 +231,7 @@ Com as dependências instaladas, tudo o que resta é utilizar o [Tailwind CLI](h
|
||||
|
||||
```shell
|
||||
cd ../..
|
||||
./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit
|
||||
node ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit
|
||||
```
|
||||
|
||||
É um comando um pouco feio devido aos caminhos envolvidos, mas essencialmente está a chamar o Tailwind CLI e a passar-lhe a localização do ficheiro de config do Tailwind (o que vimos acima), onde encontrar o ficheiro `main.css` do tema e depois onde quer que o ficheiro CSS compilado seja colocado (vai para a pasta `assets/css/compiled/` do seu projeto Hugo).
|
||||
@@ -253,8 +253,8 @@ Para completar totalmente esta solução, pode simplificar todo este processo ad
|
||||
"description": "",
|
||||
"scripts": {
|
||||
"server": "hugo server -b http://localhost -p 8000",
|
||||
"dev": "NODE_ENV=development ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit -w",
|
||||
"build": "NODE_ENV=production ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit"
|
||||
"dev": cross-env "NODE_ENV=development ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit -w",
|
||||
"build": cross-env "NODE_ENV=production ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit"
|
||||
},
|
||||
// e mais...
|
||||
}
|
||||
|
||||
@@ -153,67 +153,18 @@ html {
|
||||
|
||||
在 [Hugo 文档](https://gohugo.io/quick-reference/syntax-highlighting-styles/#styles)中查看所有可用的样式。
|
||||
|
||||
## 从源代码构建主题 CSS
|
||||
## 从源码构建主题 CSS
|
||||
|
||||
如果您想进行大量更改,您可以利用 Tailwind CSS 的 JIT 编译器并从头开始重建整个主题 CSS。尤其是您想要调整 Tailwind 配置或向主样式表添加额外的 Tailwind 类的时候,这种方法将非常有用。
|
||||
如果你需要进行较大的改动,可以从零开始重新构建整个主题的 CSS。这在你希望调整 Tailwind 配置或向主样式表中添加额外的 Tailwind 类时非常有用。
|
||||
|
||||
{{< alert >}}
|
||||
**注意:** 手动构建主题仅适用于高级用户。
|
||||
{{< /alert >}}
|
||||
> [!INFO]
|
||||
> 手动构建主题仅适用于高级用户。
|
||||
|
||||
让我们逐步了解构建 Tailwind CSS 的工作原理。
|
||||
### 工作原理
|
||||
|
||||
### Tailwind 配置
|
||||
Tailwind 会以纯文本方式[扫描你的项目文件](https://tailwindcss.com/docs/detecting-classes-in-source-files#which-files-are-scanned),查找类似类名的标记,并只为它能够识别且实际出现在这些文件中的工具类生成 CSS。
|
||||
|
||||
为了生成仅包含用于实际使用的 Tailwind 类的 CSS 文件,JIT 编译器需要扫描所有 HTML 模板和 Markdown 文档,以检查 markup 中存在哪些样式。编译器将根据主题目录根目录中的 `tailwind.config.js` 文件来完成此操作:
|
||||
|
||||
```js
|
||||
// themes/blowfish/tailwind.config.js
|
||||
|
||||
module.exports = {
|
||||
content: [
|
||||
"./layouts/**/*.html",
|
||||
"./content/**/*.{html,md}",
|
||||
"./themes/blowfish/layouts/**/*.html",
|
||||
"./themes/blowfish/content/**/*.{html,md}",
|
||||
],
|
||||
|
||||
// 更多...
|
||||
};
|
||||
```
|
||||
|
||||
此默认配置包含了这些路径,以便您可以十分方便地生成自己的 CSS 文件,而无需修改它,前提是您遵循我们的主题项目结构。也就是说,**您必须将 Blowfish 主题文件夹 `themes/blowfish/` 作为子目录包含在项目中**。这意味着您无法使用 Hugo Modules 方式来安装主题,而必须使用 git 子模块(推荐)或手动安装。 [安装文档]({{< ref "installation" >}}) 介绍了如何使用以上方法安装主题。
|
||||
|
||||
### 项目结构
|
||||
|
||||
为了充分利用默认配置,您的项目结构应该如下所示:
|
||||
|
||||
```shell
|
||||
.
|
||||
├── assets
|
||||
│ └── css
|
||||
│ └── compiled
|
||||
│ └── main.css # 这是我们生成的文件
|
||||
├── config # 站点配置
|
||||
│ └── _default
|
||||
├── content # site content
|
||||
│ ├── _index.md
|
||||
│ ├── projects
|
||||
│ │ └── _index.md
|
||||
│ └── blog
|
||||
│ └── _index.md
|
||||
├── layouts # 站点的自定义布局
|
||||
│ ├── partials
|
||||
│ │ └── extend-article-link/simple.html
|
||||
│ ├── projects
|
||||
│ │ └── list.html
|
||||
│ └── shortcodes
|
||||
│ └── disclaimer.html
|
||||
└── themes
|
||||
└── blowfish # Git 子模块或本地复制安装
|
||||
```
|
||||
|
||||
此示例结构添加了一个新自定义的 `projects` 内容类型,具有自定义的 layout 以及自定义的 shortcodes 和扩展的 partials 。如果项目遵循类似结构,所需要做的就是仅仅是重新编译 `main.css` 文件。
|
||||
接下来的步骤将重点介绍如何安装 Tailwind 并进行相关配置,以确保主题源码文件能够被正确纳入扫描范围。所有命令均以通过 [Git submodule]({{< ref "installation" >}}) 安装主题的用户为示例;如果你使用的是 Hugo Module,则需要先通过 `hugo mod vendor` 将主题源码 vendor 到 `_vendor` 目录中,并相应调整命令中的路径。
|
||||
|
||||
### 安装依赖项
|
||||
|
||||
@@ -230,15 +181,16 @@ npm install
|
||||
|
||||
```shell
|
||||
cd ../..
|
||||
./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit
|
||||
node ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit
|
||||
```
|
||||
|
||||
这个命令稍微有点复杂,因为涉及到几个路径。但本质上你是在调用 Tailwind CLI 并提供下面三个参数:
|
||||
|
||||
- Tailwind 配置文件 `tailwind.config.js`
|
||||
- 主题的 `main.css` 文件
|
||||
- 编译产出后的 CSS 文件的位置 `assets/css/compiled/`
|
||||
- 编译产出后的 CSS 文件的位置 `assets/css/compiled/main.css`
|
||||
|
||||
配置文件将自动检查项目中以及主题中的所有内容和布局,并构建一个新的 CSS 文件,其中包含网站所需的所有 CSS。由于 Hugo 处理文件层次结构的方式,此文件现在将自动覆盖主题附带的文件。
|
||||
Tailwind 将自动检查项目中的所有内容和布局,并构建新的 `main.css`,其中包含网站所需的所有 CSS。由于 Hugo 处理文件层次结构的方式,此文件现在将自动覆盖主题附带的 `main.css`。
|
||||
|
||||
每次更改布局并需要新的 Tailwind CSS 样式时,您只需重新运行命令并生成新的 CSS 文件即可。您还可以在命令末尾添加 `-w` 以在监视模式下运行 JIT 编译器。
|
||||
|
||||
@@ -255,8 +207,8 @@ cd ../..
|
||||
"description": "",
|
||||
"scripts": {
|
||||
"server": "hugo server -b http://localhost -p 8000",
|
||||
"dev": "NODE_ENV=development ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit -w",
|
||||
"build": "NODE_ENV=production ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit"
|
||||
"dev": cross-env "NODE_ENV=development ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit -w",
|
||||
"build": cross-env "NODE_ENV=production ./themes/blowfish/node_modules/@tailwindcss/cli/dist/index.mjs -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit"
|
||||
},
|
||||
// and more...
|
||||
}
|
||||
|
||||
@@ -258,6 +258,7 @@ Many of the article defaults here can be overridden on a per article basis by sp
|
||||
| `article.showComments` | `false` | Whether or not the [comments partial]({{< ref "partials#comments" >}}) is included after the article footer. |
|
||||
| `article.sharingLinks` | _Not set_ | Which sharing links to display at the end of each article. When not provided, or set to `false` no links will be displayed. Available values are: "bluesky", "email", "facebook", "line", "linkedin", "mastodon", "pinterest", "reddit", "telegram", "twitter", and "whatsapp" |
|
||||
| `article.showZenMode` | `false` | Flag to activate Zen Mode reading feature for articles. |
|
||||
| `article.externalLinkForceNewTab` | `true` | Flag per aprire i link esterni nel markdown in una nuova scheda. |
|
||||
|
||||
### List
|
||||
|
||||
|
||||
@@ -258,6 +258,7 @@ Blowfish は、テーマの機能を制御する多数の設定パラメータ
|
||||
| `article.showComments` | `false` | 記事のフッターの後に [コメントパーシャル]({{< ref "partials#コメント" >}}) を含めるかどうかです。 |
|
||||
| `article.sharingLinks` | _未設定_ | 各記事の最後に表示する共有リンクです。指定されていないか、`false` に設定されている場合、リンクは表示されません。使用可能な値は、"bluesky"、"email"、"facebook"、"line"、"linkedin"、"mastodon"、"pinterest"、"reddit"、"telegram"、"twitter"、"whatsapp"です。 |
|
||||
| `article.showZenMode` | `false` | 記事のZenモードリーダー機能を有効にするフラグです。 |
|
||||
| `article.externalLinkForceNewTab` | `true` | マークダウン内の外部リンクを新しいタブで開くかどうかです。 |
|
||||
|
||||
### リスト(List)
|
||||
|
||||
|
||||
@@ -67,6 +67,7 @@ The theme currently supports the following languages by default:
|
||||
| Language | Code |
|
||||
| ---------------------------- | ------- |
|
||||
| Arabic | `ar` |
|
||||
| Basque | `eu` |
|
||||
| Bulgarian | `bg` |
|
||||
| Bengali | `bn` |
|
||||
| Catalan | `ca` |
|
||||
@@ -244,8 +245,8 @@ Many of the article defaults here can be overridden on a per article basis by sp
|
||||
| `article.showAuthorBottom` | `false` | Author boxes are displayed at the bottom of each page instead of the top. |
|
||||
| `article.showHero` | `false` | Whether the thumbnail image will be shown as a hero image within each article page. |
|
||||
| `article.heroStyle` | _Not set_ | Style to display the hero image, valid options are: `basic`, `big`, `background`, `thumbAndBackground`. Effective only if `article.showHero = true`. |
|
||||
| `article.layoutBackgroundBlur` | `true` | Makes the background image in the background article heroStyle blur with the scroll |
|
||||
| `article.layoutBackgroundHeaderSpace` | `true` | Add space between the header and the body. |
|
||||
| `article.layoutBackgroundBlur` | `true` | Makes the background image in the background article heroStyle blur with the scroll. Only used when `heroStyle` equals `background` or `thumbAndBackground`. |
|
||||
| `article.layoutBackgroundHeaderSpace` | `true` | Add space between the header and the body. Only used when `heroStyle` equals `background`. |
|
||||
| `article.showBreadcrumbs` | `false` | Whether or not breadcrumbs are displayed in the article header. |
|
||||
| `article.showDraftLabel` | `true` | Whether or not the draft indicator is shown next to articles when site is built with `--buildDrafts`. |
|
||||
| `article.showEdit` | `false` | Whether or not the link to edit the article content should be displayed. |
|
||||
@@ -260,12 +261,15 @@ Many of the article defaults here can be overridden on a per article basis by sp
|
||||
| `article.showRelatedContent` | `false` | Display related content for each post. Might required additional configuration to your `hugo.toml`. Please check the theme `hugo.toml` if you want to enable this feature and copy all the relevant _related_ entries. Also check [Hugo's docs](https://gohugo.io/content-management/related/) on related content. |
|
||||
| `article.relatedContentLimit` | `3` | Limit of related articles to display if `showRelatedContent` is turned on. |
|
||||
| `article.showTaxonomies` | `false` | Whether or not all the taxonomies related to this article are displayed. |
|
||||
| `article.showCategoryOnly` | `false` | Whether or not the "category" taxonomy is displayed. `showTaxonomies` should be `false` when this param is used, otherwise duplicates will appear. |
|
||||
| `article.showCategories` | `true` | Whether or not the `category` taxonomies are displayed. Requires `showTaxonomies` to be `true`. |
|
||||
| `article.showTags` | `true` | Whether or not the `tag` taxonomies are displayed. Requires `showTaxonomies` to be `true`. |
|
||||
| `article.showCategoriesInSecondaryColor` | `false` | This will make the `category` taxonomy badges to show in a secondary color, so the user can better distinguish between categories and tags. Requires `showTaxonomies` to be `true`. |
|
||||
| `article.showAuthorsBadges` | `false` | Whether the `authors` taxonomies are are displayed in the article or list header. This requires the setup of `multiple authors` and the `authors` taxonomy. Check [this page]({{< ref "multi-author" >}}) for more details on how to configure that feature. |
|
||||
| `article.showWordCount` | `false` | Whether or not article word counts are displayed. |
|
||||
| `article.showComments` | `false` | Whether or not the [comments partial]({{< ref "partials#comments" >}}) is included after the article footer. |
|
||||
| `article.sharingLinks` | _Not set_ | Which sharing links to display at the end of each article. When not provided, or set to `false` no links will be displayed. Available values are: "bluesky", "email", "facebook", "line", "linkedin", "mastodon", "pinterest", "reddit", "telegram", "twitter", and "whatsapp" |
|
||||
| `article.showZenMode` | `false` | Flag to activate Zen Mode reading feature for articles. |
|
||||
| `article.externalLinkForceNewTab` | `true` | Should external links in markdown open in a new tab. |
|
||||
|
||||
### List
|
||||
|
||||
@@ -273,9 +277,9 @@ Many of the article defaults here can be overridden on a per article basis by sp
|
||||
| --- | --- | --- |
|
||||
| `list.showHero` | `false` | Whether the thumbnail image will be shown as a hero image within each list page. |
|
||||
| `list.heroStyle` | _Not set_ | Style to display the hero image, valid options are: `basic`, `big`, `background`, `thumbAndBackground`. Effective only if `list.showHero = true`. |
|
||||
| `list.layoutBackgroundBlur` | `true` | Makes the background image in the background list heroStyle blur with the scroll. Only used when `heroStyle` equals `background` or `thumbAndBackground`. |
|
||||
| `list.layoutBackgroundHeaderSpace` | `true` | Add space between the header and the body. Only used when `heroStyle` equals `background`. |
|
||||
| `list.showBreadcrumbs` | `false` | Whether or not breadcrumbs are displayed in the header on list pages. |
|
||||
| `list.layoutBackgroundBlur` | `true` | Makes the background image in the background list heroStyle blur with the scroll |
|
||||
| `list.layoutBackgroundHeaderSpace` | `true` | Add space between the header and the body. |
|
||||
| `list.showTableOfContents` | `false` | Whether or not the table of contents is displayed on list pages. |
|
||||
| `list.showSummary` | `false` | Whether or not article summaries are displayed on list pages. If a summary is not provided in the [front matter]({{< ref "front-matter" >}}), one will be auto generated using the `summaryLength` parameter in the [site configuration](#site-configuration). |
|
||||
| `list.showViews` | `false` | Whether or not list views are displayed. This requires firebase integrations to be enabled, look below. |
|
||||
@@ -301,6 +305,8 @@ Many of the article defaults here can be overridden on a per article basis by sp
|
||||
| `taxonomy.showTermCount` | `true` | Whether or not the number of articles within a taxonomy term is displayed on the taxonomy listing. |
|
||||
| `taxonomy.showHero` | `false` | Whether the thumbnail image will be shown as a hero image within each taxonomy page. |
|
||||
| `taxonomy.heroStyle` | _Not set_ | Style to display the hero image, valid options are: `basic`, `big`, `background`, `thumbAndBackground`. Effective only if `taxonomy.showHero = true`. |
|
||||
| `taxonomy.layoutBackgroundBlur` | `true` | Makes the background image in the background taxonomy heroStyle blur with the scroll. Only used when `heroStyle` equals `background` or `thumbAndBackground`. |
|
||||
| `taxonomy.layoutBackgroundHeaderSpace` | `true` | Add space between the header and the body. Only used when `heroStyle` equals `background`. |
|
||||
| `taxonomy.showBreadcrumbs` | `false` | Whether or not breadcrumbs are displayed in the taxonomy header. |
|
||||
| `taxonomy.showViews` | `false` | Whether or not article views are displayed. This requires firebase integrations to be enabled, look below. |
|
||||
| `taxonomy.showLikes` | `false` | Whether or not article likes are displayed. This requires firebase integrations to be enabled, look below. |
|
||||
@@ -313,6 +319,8 @@ Many of the article defaults here can be overridden on a per article basis by sp
|
||||
| --- | --- | --- |
|
||||
| `term.showHero` | `false` | Whether the thumbnail image will be shown as a hero image within each term page. |
|
||||
| `term.heroStyle` | _Not set_ | Style to display the hero image, valid options are: `basic`, `big`, `background`, `thumbAndBackground`. Effective only if `term.showHero = true`. |
|
||||
| `term.layoutBackgroundBlur` | `true` | Makes the background image in the background term heroStyle blur with the scroll. Only used when `heroStyle` equals `background` or `thumbAndBackground`. |
|
||||
| `term.layoutBackgroundHeaderSpace` | `true` | Add space between the header and the body. Only used when `heroStyle` equals `background`. |
|
||||
| `term.showBreadcrumbs` | `false` | Whether or not breadcrumbs are displayed in the term header. |
|
||||
| `term.showViews` | `false` | Whether or not article views are displayed. This requires firebase integrations to be enabled, look below. |
|
||||
| `term.showLikes` | `false` | Whether or not article likes are displayed. This requires firebase integrations to be enabled, look below. |
|
||||
|
||||
@@ -9,7 +9,7 @@ series: ["部署教程"]
|
||||
series_order: 4
|
||||
---
|
||||
|
||||
Blowfish 适宜个高度定制化的主题,使用到了一些 Hugo 中最新的特性来简化配置方式。
|
||||
Blowfish 是一个高度定制化的主题,使用到了一些 Hugo 中最新的特性来简化配置方式。
|
||||
|
||||
主题附带了默认配置,可以让你快速启动一个基本的博客或静态网站。
|
||||
|
||||
@@ -262,6 +262,7 @@ Blowfish 提供了大量控制主题功能的配置参数,下面的表格中
|
||||
| `article.showComments` | `false` | 是否在文章末尾添加 [评论部分]({{< ref "partials#comments" >}})。 |
|
||||
| `article.sharingLinks` | _无_ | 在文章末尾显示的分享链接。如果没有提供或设置为 `false`,则不会显示任何分享链接。可用的值包括:"bluesky"、"email"、"facebook"、"line"、"linkedin"、"mastodon"、"pinterest"、"reddit"、"telegram"、"twitter"和"whatsapp" |
|
||||
| `article.showZenMode` | `false` | 指定是否激活文章阅读的禅模式,即隐藏常规的界面元素。 |
|
||||
| `article.externalLinkForceNewTab` | `true` | 是否强制 Markdown 中的外部链接在新标签页中打开。 |
|
||||
|
||||
### 列表页
|
||||
|
||||
|
||||
@@ -40,13 +40,38 @@ const app = initializeApp(firebaseConfig);
|
||||
const analytics = getAnalytics(app);
|
||||
```
|
||||
|
||||
5. Firestore einrichten - Wählen Sie Build und öffnen Sie Firestore. Erstellen Sie eine neue Datenbank und wählen Sie den Start im Produktionsmodus. Wählen Sie den Serverstandort und warten Sie. Sobald dies gestartet ist, müssen Sie die Regeln konfigurieren. Kopieren Sie einfach die Datei unten und drücken Sie Veröffentlichen.
|
||||
5. Firestore einrichten - Wählen Sie Build und öffnen Sie Firestore. Erstellen Sie eine neue Datenbank und wählen Sie den Start im Produktionsmodus. Wählen Sie den Serverstandort und warten Sie. Sobald dies gestartet ist, müssen Sie die Regeln konfigurieren. Kopieren Sie einfach die Datei unten und drücken Sie Veröffentlichen. Diese Regeln stellen sicher, dass Aufrufe nur um 1 erhöht werden können und Likes nur um +1 oder -1 geändert werden können (und nie unter 0 fallen).
|
||||
```txt
|
||||
rules_version = '2';
|
||||
service cloud.firestore {
|
||||
match /databases/{database}/documents {
|
||||
// Views - read anyone, only increment by 1
|
||||
match /views/{document} {
|
||||
allow read: if request.auth != null;
|
||||
allow create: if request.auth != null
|
||||
&& request.resource.data.keys().hasOnly(['views'])
|
||||
&& request.resource.data.views == 1;
|
||||
allow update: if request.auth != null
|
||||
&& request.resource.data.diff(resource.data).affectedKeys().hasOnly(['views'])
|
||||
&& request.resource.data.views == resource.data.views + 1;
|
||||
}
|
||||
|
||||
// Likes - read anyone, only +1 or -1
|
||||
match /likes/{document} {
|
||||
allow read: if request.auth != null;
|
||||
allow create: if request.auth != null
|
||||
&& request.resource.data.keys().hasOnly(['likes'])
|
||||
&& request.resource.data.likes == 1;
|
||||
allow update: if request.auth != null
|
||||
&& request.resource.data.diff(resource.data).affectedKeys().hasOnly(['likes'])
|
||||
&& (request.resource.data.likes == resource.data.likes + 1
|
||||
|| request.resource.data.likes == resource.data.likes - 1)
|
||||
&& request.resource.data.likes >= 0;
|
||||
}
|
||||
|
||||
// Deny everything else
|
||||
match /{document=**} {
|
||||
allow read, write: if request.auth != null;
|
||||
allow read, write: if false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,13 +40,38 @@ const app = initializeApp(firebaseConfig);
|
||||
const analytics = getAnalytics(app);
|
||||
```
|
||||
|
||||
5. Configurar Firestore - Selecciona Build y abre Firestore. Crea una nueva base de datos y elige iniciar en modo producción. Selecciona la ubicación del servidor y espera. Una vez iniciado, necesitas configurar las reglas. Simplemente copia y pega el archivo de abajo y presiona publicar.
|
||||
5. Configurar Firestore - Selecciona Build y abre Firestore. Crea una nueva base de datos y elige iniciar en modo producción. Selecciona la ubicación del servidor y espera. Una vez iniciado, necesitas configurar las reglas. Simplemente copia y pega el archivo de abajo y presiona publicar. Estas reglas aseguran que las vistas solo pueden incrementarse en 1, y los likes solo pueden cambiarse en +1 o -1 (y nunca bajar de 0).
|
||||
```txt
|
||||
rules_version = '2';
|
||||
service cloud.firestore {
|
||||
match /databases/{database}/documents {
|
||||
// Views - read anyone, only increment by 1
|
||||
match /views/{document} {
|
||||
allow read: if request.auth != null;
|
||||
allow create: if request.auth != null
|
||||
&& request.resource.data.keys().hasOnly(['views'])
|
||||
&& request.resource.data.views == 1;
|
||||
allow update: if request.auth != null
|
||||
&& request.resource.data.diff(resource.data).affectedKeys().hasOnly(['views'])
|
||||
&& request.resource.data.views == resource.data.views + 1;
|
||||
}
|
||||
|
||||
// Likes - read anyone, only +1 or -1
|
||||
match /likes/{document} {
|
||||
allow read: if request.auth != null;
|
||||
allow create: if request.auth != null
|
||||
&& request.resource.data.keys().hasOnly(['likes'])
|
||||
&& request.resource.data.likes == 1;
|
||||
allow update: if request.auth != null
|
||||
&& request.resource.data.diff(resource.data).affectedKeys().hasOnly(['likes'])
|
||||
&& (request.resource.data.likes == resource.data.likes + 1
|
||||
|| request.resource.data.likes == resource.data.likes - 1)
|
||||
&& request.resource.data.likes >= 0;
|
||||
}
|
||||
|
||||
// Deny everything else
|
||||
match /{document=**} {
|
||||
allow read, write: if request.auth != null;
|
||||
allow read, write: if false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,13 +40,38 @@ const app = initializeApp(firebaseConfig);
|
||||
const analytics = getAnalytics(app);
|
||||
```
|
||||
|
||||
5. Configurer Firestore - Sélectionnez Build et ouvrez Firestore. Créez une nouvelle base de données et choisissez de démarrer en mode production. Sélectionnez l'emplacement du serveur et attendez. Une fois démarré, vous devez configurer les règles. Copiez et collez simplement le fichier ci-dessous et appuyez sur publier.
|
||||
5. Configurer Firestore - Sélectionnez Build et ouvrez Firestore. Créez une nouvelle base de données et choisissez de démarrer en mode production. Sélectionnez l'emplacement du serveur et attendez. Une fois démarré, vous devez configurer les règles. Copiez et collez simplement le fichier ci-dessous et appuyez sur publier. Ces règles garantissent que les vues ne peuvent être incrémentées que de 1, et les likes ne peuvent être modifiés que de +1 ou -1 (et ne jamais descendre en dessous de 0).
|
||||
```txt
|
||||
rules_version = '2';
|
||||
service cloud.firestore {
|
||||
match /databases/{database}/documents {
|
||||
// Views - read anyone, only increment by 1
|
||||
match /views/{document} {
|
||||
allow read: if request.auth != null;
|
||||
allow create: if request.auth != null
|
||||
&& request.resource.data.keys().hasOnly(['views'])
|
||||
&& request.resource.data.views == 1;
|
||||
allow update: if request.auth != null
|
||||
&& request.resource.data.diff(resource.data).affectedKeys().hasOnly(['views'])
|
||||
&& request.resource.data.views == resource.data.views + 1;
|
||||
}
|
||||
|
||||
// Likes - read anyone, only +1 or -1
|
||||
match /likes/{document} {
|
||||
allow read: if request.auth != null;
|
||||
allow create: if request.auth != null
|
||||
&& request.resource.data.keys().hasOnly(['likes'])
|
||||
&& request.resource.data.likes == 1;
|
||||
allow update: if request.auth != null
|
||||
&& request.resource.data.diff(resource.data).affectedKeys().hasOnly(['likes'])
|
||||
&& (request.resource.data.likes == resource.data.likes + 1
|
||||
|| request.resource.data.likes == resource.data.likes - 1)
|
||||
&& request.resource.data.likes >= 0;
|
||||
}
|
||||
|
||||
// Deny everything else
|
||||
match /{document=**} {
|
||||
allow read, write: if request.auth != null;
|
||||
allow read, write: if false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,13 +40,38 @@ const app = initializeApp(firebaseConfig);
|
||||
const analytics = getAnalytics(app);
|
||||
```
|
||||
|
||||
5. Setup Firestore - Select Build and open Firestore. Create a new database and choose to start in production mode. Select server location and wait. Once that is started you need to configure the rules. Just copy and paste the file below and press publish.
|
||||
5. Setup Firestore - Select Build and open Firestore. Create a new database and choose to start in production mode. Select server location and wait. Once that is started you need to configure the rules. Just copy and paste the file below and press publish. These rules ensure that views can only be incremented by 1, and likes can only be changed by +1 or -1 (and never go below 0).
|
||||
```txt
|
||||
rules_version = '2';
|
||||
service cloud.firestore {
|
||||
match /databases/{database}/documents {
|
||||
// Views - read anyone, only increment by 1
|
||||
match /views/{document} {
|
||||
allow read: if request.auth != null;
|
||||
allow create: if request.auth != null
|
||||
&& request.resource.data.keys().hasOnly(['views'])
|
||||
&& request.resource.data.views == 1;
|
||||
allow update: if request.auth != null
|
||||
&& request.resource.data.diff(resource.data).affectedKeys().hasOnly(['views'])
|
||||
&& request.resource.data.views == resource.data.views + 1;
|
||||
}
|
||||
|
||||
// Likes - read anyone, only +1 or -1
|
||||
match /likes/{document} {
|
||||
allow read: if request.auth != null;
|
||||
allow create: if request.auth != null
|
||||
&& request.resource.data.keys().hasOnly(['likes'])
|
||||
&& request.resource.data.likes == 1;
|
||||
allow update: if request.auth != null
|
||||
&& request.resource.data.diff(resource.data).affectedKeys().hasOnly(['likes'])
|
||||
&& (request.resource.data.likes == resource.data.likes + 1
|
||||
|| request.resource.data.likes == resource.data.likes - 1)
|
||||
&& request.resource.data.likes >= 0;
|
||||
}
|
||||
|
||||
// Deny everything else
|
||||
match /{document=**} {
|
||||
allow read, write: if request.auth != null;
|
||||
allow read, write: if false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,13 +40,38 @@ const app = initializeApp(firebaseConfig);
|
||||
const analytics = getAnalytics(app);
|
||||
```
|
||||
|
||||
5. Firestore を設定する - 「ビルド」を選択して Firestore を開きます。新しいデータベースを作成し、本番モードで開始することを選択します。サーバーの場所を選択して待ちます。開始したら、ルールを設定する必要があります。以下のファイルをコピーして貼り付け、「公開」をクリックします。
|
||||
5. Firestore を設定する - 「ビルド」を選択して Firestore を開きます。新しいデータベースを作成し、本番モードで開始することを選択します。サーバーの場所を選択して待ちます。開始したら、ルールを設定する必要があります。以下のファイルをコピーして貼り付け、「公開」をクリックします。これらのルールは、閲覧数は1ずつのみ増加でき、いいねは+1または-1のみ変更可能(0未満にはならない)であることを保証します。
|
||||
```txt
|
||||
rules_version = '2';
|
||||
service cloud.firestore {
|
||||
match /databases/{database}/documents {
|
||||
// Views - read anyone, only increment by 1
|
||||
match /views/{document} {
|
||||
allow read: if request.auth != null;
|
||||
allow create: if request.auth != null
|
||||
&& request.resource.data.keys().hasOnly(['views'])
|
||||
&& request.resource.data.views == 1;
|
||||
allow update: if request.auth != null
|
||||
&& request.resource.data.diff(resource.data).affectedKeys().hasOnly(['views'])
|
||||
&& request.resource.data.views == resource.data.views + 1;
|
||||
}
|
||||
|
||||
// Likes - read anyone, only +1 or -1
|
||||
match /likes/{document} {
|
||||
allow read: if request.auth != null;
|
||||
allow create: if request.auth != null
|
||||
&& request.resource.data.keys().hasOnly(['likes'])
|
||||
&& request.resource.data.likes == 1;
|
||||
allow update: if request.auth != null
|
||||
&& request.resource.data.diff(resource.data).affectedKeys().hasOnly(['likes'])
|
||||
&& (request.resource.data.likes == resource.data.likes + 1
|
||||
|| request.resource.data.likes == resource.data.likes - 1)
|
||||
&& request.resource.data.likes >= 0;
|
||||
}
|
||||
|
||||
// Deny everything else
|
||||
match /{document=**} {
|
||||
allow read, write: if request.auth != null;
|
||||
allow read, write: if false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,13 +40,38 @@ const app = initializeApp(firebaseConfig);
|
||||
const analytics = getAnalytics(app);
|
||||
```
|
||||
|
||||
5. Setup Firestore - Select Build and open Firestore. Create a new database and choose to start in production mode. Select server location and wait. Once that is started you need to configure the rules. Just copy and paste the file below and press publish.
|
||||
5. Setup Firestore - Select Build and open Firestore. Create a new database and choose to start in production mode. Select server location and wait. Once that is started you need to configure the rules. Just copy and paste the file below and press publish. These rules ensure that views can only be incremented by 1, and likes can only be changed by +1 or -1 (and never go below 0).
|
||||
```txt
|
||||
rules_version = '2';
|
||||
service cloud.firestore {
|
||||
match /databases/{database}/documents {
|
||||
// Views - read anyone, only increment by 1
|
||||
match /views/{document} {
|
||||
allow read: if request.auth != null;
|
||||
allow create: if request.auth != null
|
||||
&& request.resource.data.keys().hasOnly(['views'])
|
||||
&& request.resource.data.views == 1;
|
||||
allow update: if request.auth != null
|
||||
&& request.resource.data.diff(resource.data).affectedKeys().hasOnly(['views'])
|
||||
&& request.resource.data.views == resource.data.views + 1;
|
||||
}
|
||||
|
||||
// Likes - read anyone, only +1 or -1
|
||||
match /likes/{document} {
|
||||
allow read: if request.auth != null;
|
||||
allow create: if request.auth != null
|
||||
&& request.resource.data.keys().hasOnly(['likes'])
|
||||
&& request.resource.data.likes == 1;
|
||||
allow update: if request.auth != null
|
||||
&& request.resource.data.diff(resource.data).affectedKeys().hasOnly(['likes'])
|
||||
&& (request.resource.data.likes == resource.data.likes + 1
|
||||
|| request.resource.data.likes == resource.data.likes - 1)
|
||||
&& request.resource.data.likes >= 0;
|
||||
}
|
||||
|
||||
// Deny everything else
|
||||
match /{document=**} {
|
||||
allow read, write: if request.auth != null;
|
||||
allow read, write: if false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,13 +40,38 @@ const app = initializeApp(firebaseConfig);
|
||||
const analytics = getAnalytics(app);
|
||||
```
|
||||
|
||||
5. Configurar Firestore - Selecione Build e abra Firestore. Crie um novo banco de dados e escolha iniciar no modo produção. Selecione a localização do servidor e aguarde. Uma vez iniciado, você precisa configurar as regras. Basta copiar e colar o arquivo abaixo e pressionar publicar.
|
||||
5. Configurar Firestore - Selecione Build e abra Firestore. Crie um novo banco de dados e escolha iniciar no modo produção. Selecione a localização do servidor e aguarde. Uma vez iniciado, você precisa configurar as regras. Basta copiar e colar o arquivo abaixo e pressionar publicar. Essas regras garantem que as visualizações só podem ser incrementadas em 1, e as curtidas só podem ser alteradas em +1 ou -1 (e nunca abaixo de 0).
|
||||
```txt
|
||||
rules_version = '2';
|
||||
service cloud.firestore {
|
||||
match /databases/{database}/documents {
|
||||
// Views - read anyone, only increment by 1
|
||||
match /views/{document} {
|
||||
allow read: if request.auth != null;
|
||||
allow create: if request.auth != null
|
||||
&& request.resource.data.keys().hasOnly(['views'])
|
||||
&& request.resource.data.views == 1;
|
||||
allow update: if request.auth != null
|
||||
&& request.resource.data.diff(resource.data).affectedKeys().hasOnly(['views'])
|
||||
&& request.resource.data.views == resource.data.views + 1;
|
||||
}
|
||||
|
||||
// Likes - read anyone, only +1 or -1
|
||||
match /likes/{document} {
|
||||
allow read: if request.auth != null;
|
||||
allow create: if request.auth != null
|
||||
&& request.resource.data.keys().hasOnly(['likes'])
|
||||
&& request.resource.data.likes == 1;
|
||||
allow update: if request.auth != null
|
||||
&& request.resource.data.diff(resource.data).affectedKeys().hasOnly(['likes'])
|
||||
&& (request.resource.data.likes == resource.data.likes + 1
|
||||
|| request.resource.data.likes == resource.data.likes - 1)
|
||||
&& request.resource.data.likes >= 0;
|
||||
}
|
||||
|
||||
// Deny everything else
|
||||
match /{document=**} {
|
||||
allow read, write: if request.auth != null;
|
||||
allow read, write: if false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,13 +40,38 @@ const app = initializeApp(firebaseConfig);
|
||||
const analytics = getAnalytics(app);
|
||||
```
|
||||
|
||||
5. Configurar Firestore - Selecione Build e abra Firestore. Crie uma nova base de dados e escolha iniciar no modo produção. Selecione a localização do servidor e aguarde. Assim que estiver iniciado, precisa de configurar as regras. Basta copiar e colar o ficheiro abaixo e premir publicar.
|
||||
5. Configurar Firestore - Selecione Build e abra Firestore. Crie uma nova base de dados e escolha iniciar no modo produção. Selecione a localização do servidor e aguarde. Assim que estiver iniciado, precisa de configurar as regras. Basta copiar e colar o ficheiro abaixo e premir publicar. Estas regras garantem que as visualizações só podem ser incrementadas em 1, e os gostos só podem ser alterados em +1 ou -1 (e nunca abaixo de 0).
|
||||
```txt
|
||||
rules_version = '2';
|
||||
service cloud.firestore {
|
||||
match /databases/{database}/documents {
|
||||
// Views - read anyone, only increment by 1
|
||||
match /views/{document} {
|
||||
allow read: if request.auth != null;
|
||||
allow create: if request.auth != null
|
||||
&& request.resource.data.keys().hasOnly(['views'])
|
||||
&& request.resource.data.views == 1;
|
||||
allow update: if request.auth != null
|
||||
&& request.resource.data.diff(resource.data).affectedKeys().hasOnly(['views'])
|
||||
&& request.resource.data.views == resource.data.views + 1;
|
||||
}
|
||||
|
||||
// Likes - read anyone, only +1 or -1
|
||||
match /likes/{document} {
|
||||
allow read: if request.auth != null;
|
||||
allow create: if request.auth != null
|
||||
&& request.resource.data.keys().hasOnly(['likes'])
|
||||
&& request.resource.data.likes == 1;
|
||||
allow update: if request.auth != null
|
||||
&& request.resource.data.diff(resource.data).affectedKeys().hasOnly(['likes'])
|
||||
&& (request.resource.data.likes == resource.data.likes + 1
|
||||
|| request.resource.data.likes == resource.data.likes - 1)
|
||||
&& request.resource.data.likes >= 0;
|
||||
}
|
||||
|
||||
// Deny everything else
|
||||
match /{document=**} {
|
||||
allow read, write: if request.auth != null;
|
||||
allow read, write: if false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,13 +40,38 @@ const app = initializeApp(firebaseConfig);
|
||||
const analytics = getAnalytics(app);
|
||||
```
|
||||
|
||||
5. 设置 Firestore - 选择 Build 并打开 Firestore. 创建一个数据库,并在生产环境中启动。选择服务器位置然后等待其部署完成。启动之后你需要配置规则。只需要复制并粘贴下面的内容,然后点击发布即可。
|
||||
5. 设置 Firestore - 选择 Build 并打开 Firestore. 创建一个数据库,并在生产环境中启动。选择服务器位置然后等待其部署完成。启动之后你需要配置规则。只需要复制并粘贴下面的内容,然后点击发布即可。这些规则确保阅读量只能增加1,点赞量只能增加或减少1(且不会低于0)。
|
||||
```txt
|
||||
rules_version = '2';
|
||||
service cloud.firestore {
|
||||
match /databases/{database}/documents {
|
||||
// Views - read anyone, only increment by 1
|
||||
match /views/{document} {
|
||||
allow read: if request.auth != null;
|
||||
allow create: if request.auth != null
|
||||
&& request.resource.data.keys().hasOnly(['views'])
|
||||
&& request.resource.data.views == 1;
|
||||
allow update: if request.auth != null
|
||||
&& request.resource.data.diff(resource.data).affectedKeys().hasOnly(['views'])
|
||||
&& request.resource.data.views == resource.data.views + 1;
|
||||
}
|
||||
|
||||
// Likes - read anyone, only +1 or -1
|
||||
match /likes/{document} {
|
||||
allow read: if request.auth != null;
|
||||
allow create: if request.auth != null
|
||||
&& request.resource.data.keys().hasOnly(['likes'])
|
||||
&& request.resource.data.likes == 1;
|
||||
allow update: if request.auth != null
|
||||
&& request.resource.data.diff(resource.data).affectedKeys().hasOnly(['likes'])
|
||||
&& (request.resource.data.likes == resource.data.likes + 1
|
||||
|| request.resource.data.likes == resource.data.likes - 1)
|
||||
&& request.resource.data.likes >= 0;
|
||||
}
|
||||
|
||||
// Deny everything else
|
||||
match /{document=**} {
|
||||
allow read, write: if request.auth != null;
|
||||
allow read, write: if false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,4 +57,5 @@ Die Standardwerte der Front-Matter-Parameter werden von der [Basiskonfiguration]
|
||||
| `excludeFromSearch` | `false` | Ob dieser Artikel von der Sitemap und dem Suchindex ausgeschlossen werden soll. Wenn `true`, erscheint die Seite nicht in `sitemap.xml` oder `index.json`. |
|
||||
| `layoutBackgroundBlur` | `true` | Lässt das Hintergrundbild im background heroStyle beim Scrollen verschwimmen |
|
||||
| `layoutBackgroundHeaderSpace` | `true` | Fügt Abstand zwischen Header und Body hinzu. |
|
||||
| `externalLinkForceNewTab` | `article.externalLinkForceNewTab` | Sollen externe Links im Markdown in einem neuen Tab geöffnet werden? |
|
||||
<!-- prettier-ignore-end -->
|
||||
@@ -57,4 +57,5 @@ Los valores predeterminados de los parámetros de front matter se heredan de la
|
||||
| `excludeFromSearch` | `false` | Si este artículo debe excluirse del sitemap y el índice de búsqueda. Cuando es `true`, la página no aparecerá en `sitemap.xml` ni `index.json`. |
|
||||
| `layoutBackgroundBlur` | `true` | Hace que la imagen de fondo en el heroStyle background se difumine con el desplazamiento |
|
||||
| `layoutBackgroundHeaderSpace` | `true` | Añade espacio entre el encabezado y el cuerpo. |
|
||||
| `externalLinkForceNewTab` | `article.externalLinkForceNewTab` | ¿Deben los enlaces externos en markdown abrirse en una nueva pestaña? |
|
||||
<!-- prettier-ignore-end -->
|
||||
@@ -57,4 +57,5 @@ Les valeurs par défaut des paramètres front matter sont héritées de la [conf
|
||||
| `excludeFromSearch` | `false` | Si cet article doit être exclu du sitemap et de l'index de recherche. Lorsque `true`, la page n'apparaîtra pas dans `sitemap.xml` ou `index.json`. |
|
||||
| `layoutBackgroundBlur` | `true` | Fait flouter l'image d'arrière-plan dans le heroStyle background avec le défilement |
|
||||
| `layoutBackgroundHeaderSpace` | `true` | Ajoute de l'espace entre l'en-tête et le corps. |
|
||||
| `externalLinkForceNewTab` | `article.externalLinkForceNewTab` | Les liens externes dans le markdown doivent-ils s'ouvrir dans un nouvel onglet? |
|
||||
<!-- prettier-ignore-end -->
|
||||
@@ -55,4 +55,5 @@ I valori predefiniti dei parametri del front metter vengono ereditati dalla [con
|
||||
| `xml` | `true` unless excluded by `sitemap.excludedKinds` | Se questo articolo è incluso o meno nel file `/sitemap.xml` generato. |
|
||||
| `layoutBackgroundBlur` | `true` | Rende l'immagine di sfondo sullo sfondo heroStyle sfocata con lo scorrimento. |
|
||||
| `layoutBackgroundHeaderSpace` | `true` | Aggiungi spazio tra l'intestazione e il body. |
|
||||
| `externalLinkForceNewTab` | `article.externalLinkForceNewTab` | Flag per aprire i link esterni nel markdown in una nuova scheda. |
|
||||
<!-- prettier-ignore-end -->
|
||||
@@ -56,4 +56,5 @@ series_order: 7
|
||||
| `xml` | `sitemap.excludedKinds` によって除外されない限り `true` | この記事が生成された `/sitemap.xml` ファイルに含まれるかどうか。 |
|
||||
| `layoutBackgroundBlur` | `true` | background heroStyle の背景画像をスクロールでぼかします |
|
||||
| `layoutBackgroundHeaderSpace` | `true` | ヘッダーと本文の間にスペースを追加します |
|
||||
| `externalLinkForceNewTab` | `article.externalLinkForceNewTab` | マークダウン内の外部リンクを新しいタブで開くかどうかです。 |
|
||||
<!-- prettier-ignore-end -->
|
||||
@@ -57,4 +57,5 @@ Front matter parameter default values are inherited from the theme's [base confi
|
||||
| `excludeFromSearch` | `false` | Whether or not this article should be excluded from the sitemap and search index. When `true`, the page will not appear in `sitemap.xml` or `index.json`. |
|
||||
| `layoutBackgroundBlur` | `true` | Makes the background image in the background heroStyle blur with the scroll |
|
||||
| `layoutBackgroundHeaderSpace` | `true` | Add space between the header and the body. |
|
||||
| `externalLinkForceNewTab` | `article.externalLinkForceNewTab` | Should external links in markdown open in a new tab. |
|
||||
<!-- prettier-ignore-end -->
|
||||
@@ -57,4 +57,5 @@ Os valores padrão dos parâmetros de front matter são herdados da [configuraç
|
||||
| `excludeFromSearch` | `false` | Se este artigo deve ser excluído do sitemap e índice de pesquisa. Quando `true`, a página não aparecerá em `sitemap.xml` ou `index.json`. |
|
||||
| `layoutBackgroundBlur` | `true` | Faz a imagem de fundo no heroStyle background desfocar com a rolagem |
|
||||
| `layoutBackgroundHeaderSpace` | `true` | Adiciona espaço entre o cabeçalho e o corpo. |
|
||||
| `externalLinkForceNewTab` | `article.externalLinkForceNewTab` | Links externos no markdown devem abrir em uma nova aba? |
|
||||
<!-- prettier-ignore-end -->
|
||||
@@ -57,4 +57,5 @@ Os valores predefinidos dos parâmetros de front matter são herdados da [config
|
||||
| `excludeFromSearch` | `false` | Se este artigo deve ser excluído do sitemap e índice de pesquisa. Quando `true`, a página não aparecerá em `sitemap.xml` ou `index.json`. |
|
||||
| `layoutBackgroundBlur` | `true` | Faz a imagem de fundo no heroStyle background desfocar com a rolagem |
|
||||
| `layoutBackgroundHeaderSpace` | `true` | Adiciona espaço entre o cabeçalho e o corpo. |
|
||||
| `externalLinkForceNewTab` | `article.externalLinkForceNewTab` | Links externos no markdown devem abrir em uma nova aba? |
|
||||
<!-- prettier-ignore-end -->
|
||||
@@ -56,4 +56,5 @@ front matter 参数中的默认值是从[基础配置]({{< ref "configuration" >
|
||||
| `xml` | `true` unless excluded by `sitemap.excludedKinds` | 是否将这篇文章包含在生成的 `/sitemap.xml` 文件中。 |
|
||||
| `layoutBackgroundBlur` | `true` | 向下滚动主页时,是否模糊背景图。 |
|
||||
| `layoutBackgroundHeaderSpace` | `true` | 在标题和正文之间添加空白区域间隔。 |
|
||||
| `externalLinkForceNewTab` | `article.externalLinkForceNewTab` | 是否强制 Markdown 中的外部链接在新标签页中打开。 |
|
||||
<!-- prettier-ignore-end -->
|
||||
@@ -22,7 +22,7 @@ Diese Anweisungen bringen Sie von einem komplett leeren Zustand mit Hugo und Blo
|
||||
Wenn Sie Hugo noch nicht verwendet haben, müssen Sie es [auf Ihrem lokalen Computer installieren](https://gohugo.io/getting-started/installing). Sie können überprüfen, ob es bereits installiert ist, indem Sie den Befehl `hugo version` ausführen.
|
||||
|
||||
{{< alert >}}
|
||||
Stellen Sie sicher, dass Sie **Hugo Version 0.87.0** oder höher verwenden, da das Theme einige der neuesten Hugo-Funktionen nutzt.
|
||||
Stellen Sie sicher, dass Sie **Hugo Version 0.141.0** oder höher verwenden, da das Theme einige der neuesten Hugo-Funktionen nutzt.
|
||||
{{< /alert >}}
|
||||
|
||||
Sie finden detaillierte Installationsanweisungen für Ihre Plattform in der [Hugo-Dokumentation](https://gohugo.io/getting-started/installing).
|
||||
|
||||
@@ -22,7 +22,7 @@ Estas instrucciones te ayudarán a empezar con Hugo y Blowfish desde un estado c
|
||||
Si nunca has usado Hugo antes, necesitarás [instalarlo en tu máquina local](https://gohugo.io/getting-started/installing). Puedes verificar si ya está instalado ejecutando el comando `hugo version`.
|
||||
|
||||
{{< alert >}}
|
||||
Asegúrate de estar usando **Hugo versión 0.87.0** o posterior, ya que el tema aprovecha algunas de las últimas características de Hugo.
|
||||
Asegúrate de estar usando **Hugo versión 0.141.0** o posterior, ya que el tema aprovecha algunas de las últimas características de Hugo.
|
||||
{{< /alert >}}
|
||||
|
||||
Puedes encontrar instrucciones de instalación detalladas para tu plataforma en la [documentación de Hugo](https://gohugo.io/getting-started/installing).
|
||||
|
||||
@@ -22,7 +22,7 @@ Ces instructions vous permettront de démarrer avec Hugo et Blowfish à partir d
|
||||
Si vous n'avez jamais utilisé Hugo auparavant, vous devrez [l'installer sur votre machine locale](https://gohugo.io/getting-started/installing). Vous pouvez vérifier s'il est déjà installé en exécutant la commande `hugo version`.
|
||||
|
||||
{{< alert >}}
|
||||
Assurez-vous d'utiliser **Hugo version 0.87.0** ou ultérieure car le thème tire parti de certaines des dernières fonctionnalités de Hugo.
|
||||
Assurez-vous d'utiliser **Hugo version 0.141.0** ou ultérieure car le thème tire parti de certaines des dernières fonctionnalités de Hugo.
|
||||
{{< /alert >}}
|
||||
|
||||
Vous pouvez trouver des instructions d'installation détaillées pour votre plateforme dans la [documentation Hugo](https://gohugo.io/getting-started/installing).
|
||||
|
||||
@@ -23,7 +23,7 @@ Se non hai mai utilizzato Hugo prima, dovrai [installarlo nella tua local machin
|
||||
Puoi verificare se hai già installato Hugo utilizzando il comando `hugo version`.
|
||||
|
||||
{{< alert >}}
|
||||
Assicurati di usare la **versione 0.87.0 di Hugo** o successiva, poiché il tema sfrutta alcune delle ultime caratteristiche di Hugo.
|
||||
Assicurati di usare la **versione 0.141.0 di Hugo** o successiva, poiché il tema sfrutta alcune delle ultime caratteristiche di Hugo.
|
||||
{{< /alert >}}
|
||||
|
||||
Puoi trovare le istruzioni dettagliate sull'installazione per la propria piattaforma in [Documenti Hugo](https://gohugo.io/getting-started/installing).
|
||||
|
||||
@@ -22,7 +22,7 @@ Hugo の[クイックスタートガイド](https://gohugo.io/getting-started/qu
|
||||
Hugo を初めて使用する場合は、[公式サイトの手順](https://gohugo.io/getting-started/installing)に従って、ローカルマシンにインストールしてください。すでにインストールされているかどうかは、コマンド `hugo version` を実行して確認できます。
|
||||
|
||||
{{< alert >}}
|
||||
テーマは最新の Hugo の機能を活用しているため、**Hugo バージョン 0.87.0 以降**を使用していることを確認してください。
|
||||
テーマは最新の Hugo の機能を活用しているため、**Hugo バージョン 0.141.0 以降**を使用していることを確認してください。
|
||||
{{< /alert >}}
|
||||
|
||||
お使いのプラットフォームに合わせた詳細なインストール手順は、[Hugo の公式ドキュメント](https://gohugo.io/getting-started/installing)に記載されています。
|
||||
|
||||
@@ -22,7 +22,7 @@ These instructions will get you up and running using Hugo and Blowfish from a co
|
||||
If you haven't used Hugo before, you will need to [install it onto your local machine](https://gohugo.io/getting-started/installing). You can check if it's already installed by running the command `hugo version`.
|
||||
|
||||
{{< alert >}}
|
||||
Make sure you are using **Hugo version 0.87.0** or later as the theme takes advantage of some of the latest Hugo features.
|
||||
Make sure you are using **Hugo version 0.141.0** or later as the theme takes advantage of some of the latest Hugo features.
|
||||
{{< /alert >}}
|
||||
|
||||
You can find detailed installation instructions for your platform in the [Hugo docs](https://gohugo.io/getting-started/installing).
|
||||
|
||||
@@ -22,7 +22,7 @@ Estas instruções vão te ajudar a começar com Hugo e Blowfish a partir de um
|
||||
Se você nunca usou Hugo antes, precisará [instalá-lo em sua máquina local](https://gohugo.io/getting-started/installing). Você pode verificar se já está instalado executando o comando `hugo version`.
|
||||
|
||||
{{< alert >}}
|
||||
Certifique-se de estar usando **Hugo versão 0.87.0** ou posterior, pois o tema aproveita alguns dos recursos mais recentes do Hugo.
|
||||
Certifique-se de estar usando **Hugo versão 0.141.0** ou posterior, pois o tema aproveita alguns dos recursos mais recentes do Hugo.
|
||||
{{< /alert >}}
|
||||
|
||||
Você pode encontrar instruções de instalação detalhadas para sua plataforma na [documentação do Hugo](https://gohugo.io/getting-started/installing).
|
||||
|
||||
@@ -22,7 +22,7 @@ Estas instruções irão ajudá-lo a começar com Hugo e Blowfish a partir de um
|
||||
Se nunca utilizou Hugo antes, precisará de [instalá-lo na sua máquina local](https://gohugo.io/getting-started/installing). Pode verificar se já está instalado executando o comando `hugo version`.
|
||||
|
||||
{{< alert >}}
|
||||
Certifique-se de que está a utilizar **Hugo versão 0.87.0** ou posterior, pois o tema aproveita algumas das funcionalidades mais recentes do Hugo.
|
||||
Certifique-se de que está a utilizar **Hugo versão 0.141.0** ou posterior, pois o tema aproveita algumas das funcionalidades mais recentes do Hugo.
|
||||
{{< /alert >}}
|
||||
|
||||
Pode encontrar instruções de instalação detalhadas para a sua plataforma na [documentação do Hugo](https://gohugo.io/getting-started/installing).
|
||||
|
||||
@@ -22,7 +22,7 @@ series_order: 2
|
||||
如果你之前没有使用过 Hugo,你首先需要了解[在本地机器安装 Hugo](https://gohugo.io/getting-started/installing)。你可以通过运行命令 `hugo version` 来检查是否安装完成。
|
||||
|
||||
{{< alert >}}
|
||||
确保你使用 **Hugo 0.87.0** 或更高的版本,Blowfish 主题中使用了最新的 Hugo 特性。
|
||||
确保你使用 **Hugo 0.141.0** 或更高的版本,Blowfish 主题中使用了最新的 Hugo 特性。
|
||||
{{< /alert >}}
|
||||
|
||||
你可以在 [Hugo 文档](https://gohugo.io/getting-started/installing) 中找到不同平台更加详细的安装指南。
|
||||
|
||||
@@ -46,6 +46,8 @@ Um die Umami Analytics-Unterstützung zu aktivieren, geben Sie einfach Ihren [Um
|
||||
Wenn Sie auch die benutzerdefinierte Domain-Funktion von Umami verwenden und deren Skript von Ihrer Domain bereitstellen möchten, können Sie zusätzlich den Konfigurationswert `domain` angeben. Wenn Sie keinen `domain`-Wert angeben, wird das Skript direkt von Umami DNS (analytics.umami.is) geladen.
|
||||
Wenn Sie möchten, dass der Tracker nur auf bestimmten Domains ausgeführt wird, können Sie den Konfigurationswert `dataDomains` angeben. Wenn Sie keinen `dataDomains`-Wert angeben, wird das Skript auf jeder Website ausgeführt, bei der `domain` und `websiteid` übereinstimmen. Wenn die Umgebungsvariable `TRACKER_SCRIPT_NAME` konfiguriert ist, können Sie einen benutzerdefinierten Skriptnamen `scriptName` angeben. Wenn sie nicht konfiguriert ist, kommentieren Sie sie entweder aus oder verwenden Sie den Standard `script.js`.
|
||||
|
||||
Wenn Sie die Do Not Track Einstellung im Browser berücksichtigen möchten, dann setzen Sie `doNotTrack` auf `true`, Blowfish berücksichtigt die Do Not Track Einstellung standardmäßig nicht.
|
||||
|
||||
{{< alert >}}
|
||||
**Hinweis:** Wenn Sie Umami Analytics aktivieren, unterstützt Blowfish [Umami Track Event](https://umami.is/docs/track-events) automatisch. Wenn Sie Track Event nicht unterstützen möchten, muss der Parameter `enableTrackEvent` auf `false` gesetzt werden.
|
||||
{{< /alert >}}
|
||||
@@ -58,6 +60,7 @@ Wenn Sie möchten, dass der Tracker nur auf bestimmten Domains ausgeführt wird,
|
||||
domain = "llama.yoursite.com"
|
||||
dataDomains = "yoursite.com,yoursite2.com"
|
||||
scriptName = "TRACKER_SCRIPT_NAME"
|
||||
doNotTrack = false
|
||||
enableTrackEvent = true
|
||||
```
|
||||
|
||||
|
||||
Loaded 100 of 2518 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user