mirror of
https://github.com/nunocoracao/blowfish.git
synced 2026-10-12 14:59:20 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e9699d8c5d | ||
|
|
34b1f117fc | ||
|
|
6c7c4b6a9f | ||
|
|
a7fc9862e4 | ||
|
|
e0b8a49054 | ||
|
|
c4607f0a8f | ||
|
|
7d8b388bfb | ||
|
|
b5054889cb | ||
|
|
7b0904947d | ||
|
|
2c01906987 | ||
|
|
5342dd2128 | ||
|
|
b7d5f96bea | ||
|
|
f80473e761 | ||
|
|
6f6fba6d4d | ||
|
|
8671b01505 | ||
|
|
de2c627aac | ||
|
|
6d8a9b0712 | ||
|
|
62ffaac7ab | ||
|
|
64c437e67f | ||
|
|
6760c9de65 | ||
|
|
562db70231 | ||
|
|
ab9e81d586 | ||
|
|
56f66b633d | ||
|
|
d170cf3d96 | ||
|
|
26bbbbc288 | ||
|
|
5e144d4f11 | ||
|
|
86fd828353 | ||
|
|
a6ce29638a | ||
|
|
8b0691b632 | ||
|
|
863b64815c | ||
|
|
5df9ce4b32 | ||
|
|
e0e28b651a | ||
|
|
a9869a55a6 | ||
|
|
88863335fd | ||
|
|
6d33438e18 | ||
|
|
baf74cca1a | ||
|
|
1eb3d8da3e | ||
|
|
dff1858ca5 | ||
|
|
ab5c7b7c97 | ||
|
|
350458a3c5 | ||
|
|
c7305a9727 | ||
|
|
75a6f741c8 | ||
|
|
c37d7fcd21 | ||
|
|
7c2545d598 | ||
|
|
2d37ecace0 | ||
|
|
8d28507fe9 | ||
|
|
1e5b7fde7e | ||
|
|
27cdc57bda | ||
|
|
8eff80bb12 | ||
|
|
cda04a5061 | ||
|
|
da8ca782aa | ||
|
|
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 |
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,12 +10,12 @@ 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
|
||||
- name: Upload to release
|
||||
uses: softprops/action-gh-release@v2
|
||||
uses: softprops/action-gh-release@v3
|
||||
with:
|
||||
files: config-default.zip
|
||||
tag_name: ${{ github.event.release.tag_name }}
|
||||
@@ -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
|
||||
@@ -51,7 +51,7 @@ jobs:
|
||||
run: |
|
||||
hugo --minify -s exampleSite --themesDir ../.. -d ../docs --baseURL https://nunocoracao.github.io/blowfish/
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-pages-artifact@v4
|
||||
uses: actions/upload-pages-artifact@v5
|
||||
with:
|
||||
path: ./docs
|
||||
|
||||
@@ -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'
|
||||
@@ -16,7 +16,7 @@ jobs:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Hugo
|
||||
uses: peaceiris/actions-hugo@v3.0.0
|
||||
uses: peaceiris/actions-hugo@v3.2.1
|
||||
with:
|
||||
hugo-version: "latest"
|
||||
|
||||
|
||||
+11
-1
@@ -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?
|
||||
@@ -31,4 +40,5 @@ node_modules
|
||||
.Trashes
|
||||
.idea
|
||||
.Ulysses-Group.plist
|
||||
.Ulysses-Settings.plist
|
||||
.Ulysses-Settings.plist
|
||||
.watchfire/
|
||||
@@ -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/ ",
|
||||
},
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
version: 1
|
||||
project_id: fafe4c77-495a-44fc-9eaf-8e38596cdc04
|
||||
name: blowfish
|
||||
status: active
|
||||
color: '#8b5cf6'
|
||||
default_agent: claude-code
|
||||
sandbox: auto
|
||||
auto_merge: true
|
||||
auto_delete_branch: true
|
||||
auto_start_tasks: true
|
||||
notifications:
|
||||
muted: false
|
||||
definition: |
|
||||
Blowfish is a powerful, lightweight Hugo theme built with Tailwind CSS.
|
||||
Repo: https://github.com/nunocoracao/blowfish · Demo & docs: https://blowfish.page/
|
||||
|
||||
Stack & layout:
|
||||
- Hugo theme (min Hugo 0.141.0). Templates in `layouts/`, partials in `layouts/partials/`, shortcodes in `layouts/shortcodes/`.
|
||||
- Tailwind CSS 4 via `@tailwindcss/cli` — source in `assets/css/main.css`, output in `assets/css/compiled/main.css`.
|
||||
- JS vendored from `node_modules/` into `assets/lib/` via `vendor-copy` (configured in `package.json` under `devVendorCopy`).
|
||||
- Localisation strings live in `i18n/`. All static text MUST go through `i18n` lookups, never hardcoded.
|
||||
- `exampleSite/` is the testbed. Run `npm run example` (or `:core` / `:production`) to preview locally.
|
||||
- `config/` holds default theme config; users override in their own site.
|
||||
|
||||
Coding conventions (from CONTRIBUTING.md):
|
||||
- 2-space indent. Spaces inside Go template tags: `{{< alert >}}` not `{{<alert>}}`.
|
||||
- Extract repeated template logic into partials.
|
||||
- Relative asset paths without leading slash; trailing slash for folders (e.g. `static/img/`).
|
||||
- Prettier config is included; respect it.
|
||||
|
||||
PR & commit rules (strict — enforced):
|
||||
- Single-purpose PRs only. Do NOT bundle unrelated changes (e.g. bug fix + version bump + new user entry). Mixed PRs get closed.
|
||||
- NO breaking changes unless strictly required by a dependency. Renaming partials, removing config options, or changing template signatures will be rejected — they silently break user customisations.
|
||||
- Commits: Gitmoji prefix, imperative mood ("Fix bug", not "Fixed"), ≤72-char summary, no trailing period. Reference issue numbers when relevant.
|
||||
- Commit incrementally rather than one giant commit.
|
||||
|
||||
Before marking a task done:
|
||||
- If templates/CSS/JS changed, run `npm run example` and verify in the browser. Type-checks alone don't validate Hugo theme behavior.
|
||||
- Check that any new user-facing string is wired through `i18n/` for all supported languages (or at least English with a clear note).
|
||||
- Don't bump `package.json` version or touch `release-versions/` as part of a feature/fix PR — those are released separately.
|
||||
created_at: 2026-05-04T23:12:29.75161Z
|
||||
updated_at: 2026-05-04T23:12:30.276795Z
|
||||
next_task_number: 1
|
||||
@@ -0,0 +1,33 @@
|
||||
# Secrets & Setup Instructions
|
||||
|
||||
Use this file to tell agents how to access external services and credentials
|
||||
for this project. Agents will read these instructions before starting work.
|
||||
|
||||
## Examples
|
||||
|
||||
### CLI Tools (already authenticated)
|
||||
```
|
||||
# Firebase — I'm already logged in via `firebase login`
|
||||
# Use `firebase use <project-id>` to switch projects
|
||||
|
||||
# AWS — credentials configured in default profile
|
||||
# Use `aws sts get-caller-identity` to verify access
|
||||
|
||||
# gcloud — authenticated via `gcloud auth login`
|
||||
```
|
||||
|
||||
### Environment Variables
|
||||
```
|
||||
# Set these before running the app:
|
||||
# export DATABASE_URL=<value>
|
||||
# export API_KEY=<value>
|
||||
```
|
||||
|
||||
### API Keys & Tokens
|
||||
```
|
||||
# Stripe test key: use the key in .env.local
|
||||
# OpenAI: use the org key from 1Password CLI (`op read ...`)
|
||||
```
|
||||
|
||||
---
|
||||
Delete this sample content and replace with your own instructions.
|
||||
+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.141.0)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.158.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.141.0)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.158.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.141.0)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.158.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.141.0)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.158.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.141.0)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.158.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.141.0)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.158.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.141.0)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.158.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.141.0)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.158.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.141.0)
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.158.0)
|
||||
[](https://github.com/nunocoracao/blowfish/blob/main/LICENSE)
|
||||
[](https://themes.gohugo.io/themes/blowfish/)
|
||||

|
||||
|
||||
+246
-75
@@ -1,4 +1,4 @@
|
||||
/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
|
||||
/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */
|
||||
/*! Blowfish | MIT License | https://github.com/nunocoracao/blowfish */
|
||||
@layer properties;
|
||||
@layer theme, base, components, utilities;
|
||||
@@ -10,7 +10,6 @@
|
||||
"Courier New", monospace;
|
||||
--spacing: 0.25rem;
|
||||
--container-2xs: 18rem;
|
||||
--container-xs: 20rem;
|
||||
--container-md: 28rem;
|
||||
--container-xl: 36rem;
|
||||
--container-3xl: 48rem;
|
||||
@@ -264,9 +263,15 @@
|
||||
.-start-6 {
|
||||
inset-inline-start: calc(var(--spacing) * -6);
|
||||
}
|
||||
.start {
|
||||
inset-inline-start: var(--spacing);
|
||||
}
|
||||
.start-\[calc\(max\(-50vw\,-800px\)\+50\%\)\] {
|
||||
inset-inline-start: calc(max(-50vw, -800px) + 50%);
|
||||
}
|
||||
.end {
|
||||
inset-inline-end: var(--spacing);
|
||||
}
|
||||
.end-6 {
|
||||
inset-inline-end: calc(var(--spacing) * 6);
|
||||
}
|
||||
@@ -277,7 +282,7 @@
|
||||
top: calc(var(--spacing) * 0);
|
||||
}
|
||||
.top-1\/2 {
|
||||
top: calc(1/2 * 100%);
|
||||
top: calc(1 / 2 * 100%);
|
||||
}
|
||||
.top-5 {
|
||||
top: calc(var(--spacing) * 5);
|
||||
@@ -285,6 +290,9 @@
|
||||
.top-20 {
|
||||
top: calc(var(--spacing) * 20);
|
||||
}
|
||||
.top-full {
|
||||
top: 100%;
|
||||
}
|
||||
.right-0 {
|
||||
right: calc(var(--spacing) * 0);
|
||||
}
|
||||
@@ -301,7 +309,7 @@
|
||||
left: calc(var(--spacing) * 0);
|
||||
}
|
||||
.left-1\/2 {
|
||||
left: calc(1/2 * 100%);
|
||||
left: calc(1 / 2 * 100%);
|
||||
}
|
||||
.-z-10 {
|
||||
z-index: calc(10 * -1);
|
||||
@@ -923,6 +931,9 @@
|
||||
.mt-12 {
|
||||
margin-top: calc(var(--spacing) * 12);
|
||||
}
|
||||
.mt-16 {
|
||||
margin-top: calc(var(--spacing) * 16);
|
||||
}
|
||||
.mt-20 {
|
||||
margin-top: calc(var(--spacing) * 20);
|
||||
}
|
||||
@@ -983,6 +994,9 @@
|
||||
.mb-12 {
|
||||
margin-bottom: calc(var(--spacing) * 12);
|
||||
}
|
||||
.mb-16 {
|
||||
margin-bottom: calc(var(--spacing) * 16);
|
||||
}
|
||||
.mb-20 {
|
||||
margin-bottom: calc(var(--spacing) * 20);
|
||||
}
|
||||
@@ -1030,6 +1044,12 @@
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 3;
|
||||
}
|
||||
.line-clamp-5 {
|
||||
overflow: hidden;
|
||||
display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 5;
|
||||
}
|
||||
.\!block {
|
||||
display: block !important;
|
||||
}
|
||||
@@ -1086,7 +1106,7 @@
|
||||
height: calc(var(--spacing) * 0);
|
||||
}
|
||||
.h-1\/2 {
|
||||
height: calc(1/2 * 100%);
|
||||
height: calc(1 / 2 * 100%);
|
||||
}
|
||||
.h-3 {
|
||||
height: calc(var(--spacing) * 3);
|
||||
@@ -1112,6 +1132,9 @@
|
||||
.h-14 {
|
||||
height: calc(var(--spacing) * 14);
|
||||
}
|
||||
.h-16 {
|
||||
height: calc(var(--spacing) * 16);
|
||||
}
|
||||
.h-24 {
|
||||
height: calc(var(--spacing) * 24);
|
||||
}
|
||||
@@ -1127,6 +1150,9 @@
|
||||
.h-84 {
|
||||
height: calc(var(--spacing) * 84);
|
||||
}
|
||||
.h-120 {
|
||||
height: calc(var(--spacing) * 120);
|
||||
}
|
||||
.h-\[3px\] {
|
||||
height: 3px;
|
||||
}
|
||||
@@ -1196,6 +1222,9 @@
|
||||
.w-12 {
|
||||
width: calc(var(--spacing) * 12);
|
||||
}
|
||||
.w-16 {
|
||||
width: calc(var(--spacing) * 16);
|
||||
}
|
||||
.w-24 {
|
||||
width: calc(var(--spacing) * 24);
|
||||
}
|
||||
@@ -1217,6 +1246,9 @@
|
||||
.w-full {
|
||||
width: 100%;
|
||||
}
|
||||
.w-max {
|
||||
width: max-content;
|
||||
}
|
||||
.w-screen {
|
||||
width: 100vw;
|
||||
}
|
||||
@@ -1229,6 +1261,9 @@
|
||||
.max-w-20 {
|
||||
max-width: calc(var(--spacing) * 20);
|
||||
}
|
||||
.max-w-48 {
|
||||
max-width: calc(var(--spacing) * 48);
|
||||
}
|
||||
.max-w-\[200px\] {
|
||||
max-width: 200px;
|
||||
}
|
||||
@@ -1299,7 +1334,7 @@
|
||||
flex-basis: auto;
|
||||
}
|
||||
.-translate-x-1\/2 {
|
||||
--tw-translate-x: calc(calc(1/2 * 100%) * -1);
|
||||
--tw-translate-x: calc(calc(1 / 2 * 100%) * -1);
|
||||
translate: var(--tw-translate-x) var(--tw-translate-y);
|
||||
}
|
||||
.-translate-x-full {
|
||||
@@ -1311,7 +1346,7 @@
|
||||
translate: var(--tw-translate-x) var(--tw-translate-y);
|
||||
}
|
||||
.-translate-y-1\/2 {
|
||||
--tw-translate-y: calc(calc(1/2 * 100%) * -1);
|
||||
--tw-translate-y: calc(calc(1 / 2 * 100%) * -1);
|
||||
translate: var(--tw-translate-x) var(--tw-translate-y);
|
||||
}
|
||||
.-translate-y-8 {
|
||||
@@ -1414,6 +1449,13 @@
|
||||
.gap-4 {
|
||||
gap: calc(var(--spacing) * 4);
|
||||
}
|
||||
.space-y-2 {
|
||||
:where(& > :not(:last-child)) {
|
||||
--tw-space-y-reverse: 0;
|
||||
margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));
|
||||
margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)));
|
||||
}
|
||||
}
|
||||
.space-y-3 {
|
||||
:where(& > :not(:last-child)) {
|
||||
--tw-space-y-reverse: 0;
|
||||
@@ -1604,6 +1646,10 @@
|
||||
--tw-border-style: dotted;
|
||||
border-style: dotted;
|
||||
}
|
||||
.border-none {
|
||||
--tw-border-style: none;
|
||||
border-style: none;
|
||||
}
|
||||
.border-solid {
|
||||
--tw-border-style: solid;
|
||||
border-style: solid;
|
||||
@@ -1623,6 +1669,9 @@
|
||||
.border-primary-500 {
|
||||
border-color: rgba(var(--color-primary-500), 1);
|
||||
}
|
||||
.border-secondary-400 {
|
||||
border-color: rgba(var(--color-secondary-400), 1);
|
||||
}
|
||||
.border-secondary-500 {
|
||||
border-color: rgba(var(--color-secondary-500), 1);
|
||||
}
|
||||
@@ -1710,6 +1759,9 @@
|
||||
background-color: color-mix(in oklab, rgba(var(--color-neutral-500), 1) 50%, transparent);
|
||||
}
|
||||
}
|
||||
.bg-neutral-900 {
|
||||
background-color: rgba(var(--color-neutral-900), 1);
|
||||
}
|
||||
.bg-neutral\/25 {
|
||||
background-color: color-mix(in srgb, rgba(rgba(var(--color-neutral), 1), 1) 25%, transparent);
|
||||
@supports (color: color-mix(in lab, red, red)) {
|
||||
@@ -1728,10 +1780,10 @@
|
||||
.bg-primary-200 {
|
||||
background-color: rgba(var(--color-primary-200), 1);
|
||||
}
|
||||
.bg-primary-200\/50 {
|
||||
background-color: color-mix(in srgb, rgba(rgba(var(--color-primary-200), 1), 1) 50%, transparent);
|
||||
.bg-primary-200\/80 {
|
||||
background-color: color-mix(in srgb, rgba(rgba(var(--color-primary-200), 1), 1) 80%, transparent);
|
||||
@supports (color: color-mix(in lab, red, red)) {
|
||||
background-color: color-mix(in oklab, rgba(var(--color-primary-200), 1) 50%, transparent);
|
||||
background-color: color-mix(in oklab, rgba(var(--color-primary-200), 1) 80%, transparent);
|
||||
}
|
||||
}
|
||||
.bg-primary-500 {
|
||||
@@ -1746,10 +1798,10 @@
|
||||
.bg-white {
|
||||
background-color: #fff;
|
||||
}
|
||||
.bg-linear-65 {
|
||||
--tw-gradient-position: 65deg;
|
||||
.bg-linear-60 {
|
||||
--tw-gradient-position: 60deg;
|
||||
@supports (background-image: linear-gradient(in lab, red, red)) {
|
||||
--tw-gradient-position: 65deg in oklab;
|
||||
--tw-gradient-position: 60deg in oklab;
|
||||
}
|
||||
background-image: linear-gradient(var(--tw-gradient-stops));
|
||||
}
|
||||
@@ -1912,9 +1964,6 @@
|
||||
.pe-3 {
|
||||
padding-inline-end: calc(var(--spacing) * 3);
|
||||
}
|
||||
.pt-1 {
|
||||
padding-top: calc(var(--spacing) * 1);
|
||||
}
|
||||
.pt-2 {
|
||||
padding-top: calc(var(--spacing) * 2);
|
||||
}
|
||||
@@ -2105,6 +2154,9 @@
|
||||
.text-neutral-500 {
|
||||
color: rgba(var(--color-neutral-500), 1);
|
||||
}
|
||||
.text-neutral-600 {
|
||||
color: rgba(var(--color-neutral-600), 1);
|
||||
}
|
||||
.text-neutral-700 {
|
||||
color: rgba(var(--color-neutral-700), 1);
|
||||
}
|
||||
@@ -2135,6 +2187,9 @@
|
||||
.text-primary-800 {
|
||||
color: rgba(var(--color-primary-800), 1);
|
||||
}
|
||||
.text-secondary-700 {
|
||||
color: rgba(var(--color-secondary-700), 1);
|
||||
}
|
||||
.text-transparent {
|
||||
color: transparent;
|
||||
}
|
||||
@@ -2229,6 +2284,10 @@
|
||||
--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
|
||||
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
||||
}
|
||||
.shadow-md {
|
||||
--tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
|
||||
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
||||
}
|
||||
.shadow-sm {
|
||||
--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
|
||||
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
||||
@@ -2237,6 +2296,13 @@
|
||||
--tw-shadow: 0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
|
||||
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
||||
}
|
||||
.ring-2 {
|
||||
--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
|
||||
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
||||
}
|
||||
.ring-primary-500 {
|
||||
--tw-ring-color: rgba(var(--color-primary-500), 1);
|
||||
}
|
||||
.outline {
|
||||
outline-style: var(--tw-outline-style);
|
||||
outline-width: 1px;
|
||||
@@ -2249,6 +2315,11 @@
|
||||
--tw-blur: blur(8px) !important;
|
||||
filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,) !important;
|
||||
}
|
||||
.drop-shadow {
|
||||
--tw-drop-shadow-size: drop-shadow(0 1px 2px var(--tw-drop-shadow-color, rgb(0 0 0 / 0.1))) drop-shadow(0 1px 1px var(--tw-drop-shadow-color, rgb(0 0 0 / 0.06)));
|
||||
--tw-drop-shadow: drop-shadow(0 1px 2px rgb(0 0 0 / 0.1)) drop-shadow( 0 1px 1px rgb(0 0 0 / 0.06));
|
||||
filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
|
||||
}
|
||||
.invert {
|
||||
--tw-invert: invert(100%);
|
||||
filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
|
||||
@@ -2324,6 +2395,11 @@
|
||||
transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
|
||||
transition-duration: var(--tw-duration, var(--default-transition-duration));
|
||||
}
|
||||
.transition-colors {
|
||||
transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
|
||||
transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
|
||||
transition-duration: var(--tw-duration, var(--default-transition-duration));
|
||||
}
|
||||
.transition-opacity {
|
||||
transition-property: opacity;
|
||||
transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
|
||||
@@ -2390,6 +2466,40 @@
|
||||
rotate: 0deg;
|
||||
}
|
||||
}
|
||||
.group-focus-within\:visible {
|
||||
&:is(:where(.group):focus-within *) {
|
||||
visibility: visible;
|
||||
}
|
||||
}
|
||||
.group-focus-within\:opacity-100 {
|
||||
&:is(:where(.group):focus-within *) {
|
||||
opacity: 100%;
|
||||
}
|
||||
}
|
||||
.group-hover\:visible {
|
||||
&:is(:where(.group):hover *) {
|
||||
@media (hover: hover) {
|
||||
visibility: visible;
|
||||
}
|
||||
}
|
||||
}
|
||||
.group-hover\:scale-110 {
|
||||
&:is(:where(.group):hover *) {
|
||||
@media (hover: hover) {
|
||||
--tw-scale-x: 110%;
|
||||
--tw-scale-y: 110%;
|
||||
--tw-scale-z: 110%;
|
||||
scale: var(--tw-scale-x) var(--tw-scale-y);
|
||||
}
|
||||
}
|
||||
}
|
||||
.group-hover\:text-primary-500 {
|
||||
&:is(:where(.group):hover *) {
|
||||
@media (hover: hover) {
|
||||
color: rgba(var(--color-primary-500), 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
.group-hover\:opacity-100 {
|
||||
&:is(:where(.group):hover *) {
|
||||
@media (hover: hover) {
|
||||
@@ -2397,6 +2507,21 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
.group-hover\:ring-2 {
|
||||
&:is(:where(.group):hover *) {
|
||||
@media (hover: hover) {
|
||||
--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
|
||||
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
||||
}
|
||||
}
|
||||
}
|
||||
.group-hover\:ring-primary-500 {
|
||||
&:is(:where(.group):hover *) {
|
||||
@media (hover: hover) {
|
||||
--tw-ring-color: rgba(var(--color-primary-500), 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
.group-data-\[twe-input-focused\]\:border-x-0 {
|
||||
&:is(:where(.group)[data-twe-input-focused] *) {
|
||||
border-inline-style: var(--tw-border-style);
|
||||
@@ -2781,7 +2906,7 @@
|
||||
}
|
||||
.sm\:w-1\/2 {
|
||||
@media (width >= 640px) {
|
||||
width: calc(1/2 * 100%);
|
||||
width: calc(1 / 2 * 100%);
|
||||
}
|
||||
}
|
||||
.sm\:grid-cols-2 {
|
||||
@@ -2869,7 +2994,7 @@
|
||||
}
|
||||
.md\:w-1\/3 {
|
||||
@media (width >= 853px) {
|
||||
width: calc(1/3 * 100%);
|
||||
width: calc(1 / 3 * 100%);
|
||||
}
|
||||
}
|
||||
.md\:w-auto {
|
||||
@@ -2947,16 +3072,16 @@
|
||||
margin-inline: auto;
|
||||
}
|
||||
}
|
||||
.lg\:ms-auto {
|
||||
@media (width >= 1024px) {
|
||||
margin-inline-start: auto;
|
||||
}
|
||||
}
|
||||
.lg\:mt-0 {
|
||||
@media (width >= 1024px) {
|
||||
margin-top: calc(var(--spacing) * 0);
|
||||
}
|
||||
}
|
||||
.lg\:ml-auto {
|
||||
@media (width >= 1024px) {
|
||||
margin-left: auto;
|
||||
}
|
||||
}
|
||||
.lg\:block {
|
||||
@media (width >= 1024px) {
|
||||
display: block;
|
||||
@@ -2984,7 +3109,7 @@
|
||||
}
|
||||
.lg\:w-1\/4 {
|
||||
@media (width >= 1024px) {
|
||||
width: calc(1/4 * 100%);
|
||||
width: calc(1 / 4 * 100%);
|
||||
}
|
||||
}
|
||||
.lg\:w-auto {
|
||||
@@ -3007,11 +3132,6 @@
|
||||
max-width: none;
|
||||
}
|
||||
}
|
||||
.lg\:max-w-xs {
|
||||
@media (width >= 1024px) {
|
||||
max-width: var(--container-xs);
|
||||
}
|
||||
}
|
||||
.lg\:grid-flow-col-dense {
|
||||
@media (width >= 1024px) {
|
||||
grid-auto-flow: column dense;
|
||||
@@ -3069,7 +3189,7 @@
|
||||
}
|
||||
.xl\:w-1\/4 {
|
||||
@media (width >= 1280px) {
|
||||
width: calc(1/4 * 100%);
|
||||
width: calc(1 / 4 * 100%);
|
||||
}
|
||||
}
|
||||
.xl\:grid-cols-4 {
|
||||
@@ -3157,6 +3277,11 @@
|
||||
border-color: rgba(var(--color-primary-600), 1);
|
||||
}
|
||||
}
|
||||
.dark\:border-secondary-600 {
|
||||
&:is(.dark *) {
|
||||
border-color: rgba(var(--color-secondary-600), 1);
|
||||
}
|
||||
}
|
||||
.dark\:border-white\/10 {
|
||||
&:is(.dark *) {
|
||||
border-color: color-mix(in oklab, #fff 10%, transparent);
|
||||
@@ -3209,6 +3334,11 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
.dark\:bg-neutral-100 {
|
||||
&:is(.dark *) {
|
||||
background-color: rgba(var(--color-neutral-100), 1);
|
||||
}
|
||||
}
|
||||
.dark\:bg-neutral-400 {
|
||||
&:is(.dark *) {
|
||||
background-color: rgba(var(--color-neutral-400), 1);
|
||||
@@ -3289,6 +3419,14 @@
|
||||
background-color: rgba(var(--color-primary-800), 1);
|
||||
}
|
||||
}
|
||||
.dark\:bg-primary-800\/30 {
|
||||
&:is(.dark *) {
|
||||
background-color: color-mix(in srgb, rgba(rgba(var(--color-primary-800), 1), 1) 30%, transparent);
|
||||
@supports (color: color-mix(in lab, red, red)) {
|
||||
background-color: color-mix(in oklab, rgba(var(--color-primary-800), 1) 30%, transparent);
|
||||
}
|
||||
}
|
||||
}
|
||||
.dark\:bg-primary-900 {
|
||||
&:is(.dark *) {
|
||||
background-color: rgba(var(--color-primary-900), 1);
|
||||
@@ -3300,46 +3438,18 @@
|
||||
--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
|
||||
}
|
||||
}
|
||||
.dark\:from-neutral-900\/88 {
|
||||
&:is(.dark *) {
|
||||
--tw-gradient-from: color-mix(in srgb, rgba(rgba(var(--color-neutral-900), 1), 1) 88%, transparent);
|
||||
@supports (color: color-mix(in lab, red, red)) {
|
||||
--tw-gradient-from: color-mix(in oklab, rgba(var(--color-neutral-900), 1) 88%, transparent);
|
||||
}
|
||||
--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
|
||||
}
|
||||
}
|
||||
.dark\:from-primary-600 {
|
||||
&:is(.dark *) {
|
||||
--tw-gradient-from: rgba(var(--color-primary-600), 1);
|
||||
--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
|
||||
}
|
||||
}
|
||||
.dark\:via-neutral-800\/72 {
|
||||
&:is(.dark *) {
|
||||
--tw-gradient-via: color-mix(in srgb, rgba(rgba(var(--color-neutral-800), 1), 1) 72%, transparent);
|
||||
@supports (color: color-mix(in lab, red, red)) {
|
||||
--tw-gradient-via: color-mix(in oklab, rgba(var(--color-neutral-800), 1) 72%, transparent);
|
||||
}
|
||||
--tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);
|
||||
--tw-gradient-stops: var(--tw-gradient-via-stops);
|
||||
}
|
||||
}
|
||||
.dark\:to-neutral-800 {
|
||||
&:is(.dark *) {
|
||||
--tw-gradient-to: rgba(var(--color-neutral-800), 1);
|
||||
--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
|
||||
}
|
||||
}
|
||||
.dark\:to-neutral-900\/55 {
|
||||
&:is(.dark *) {
|
||||
--tw-gradient-to: color-mix(in srgb, rgba(rgba(var(--color-neutral-900), 1), 1) 55%, transparent);
|
||||
@supports (color: color-mix(in lab, red, red)) {
|
||||
--tw-gradient-to: color-mix(in oklab, rgba(var(--color-neutral-900), 1) 55%, transparent);
|
||||
}
|
||||
--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
|
||||
}
|
||||
}
|
||||
.dark\:to-secondary-800 {
|
||||
&:is(.dark *) {
|
||||
--tw-gradient-to: rgba(var(--color-secondary-800), 1);
|
||||
@@ -3386,6 +3496,11 @@
|
||||
color: rgba(var(--color-neutral-800), 1);
|
||||
}
|
||||
}
|
||||
.dark\:text-neutral-900 {
|
||||
&:is(.dark *) {
|
||||
color: rgba(var(--color-neutral-900), 1);
|
||||
}
|
||||
}
|
||||
.dark\:text-primary-200 {
|
||||
&:is(.dark *) {
|
||||
color: rgba(var(--color-primary-200), 1);
|
||||
@@ -3396,6 +3511,11 @@
|
||||
color: rgba(var(--color-primary-400), 1);
|
||||
}
|
||||
}
|
||||
.dark\:text-secondary-400 {
|
||||
&:is(.dark *) {
|
||||
color: rgba(var(--color-secondary-400), 1);
|
||||
}
|
||||
}
|
||||
.dark\:text-white {
|
||||
&:is(.dark *) {
|
||||
color: #fff;
|
||||
@@ -4116,6 +4236,55 @@ body.zen-mode-enable {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
.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 & {
|
||||
.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));
|
||||
}
|
||||
}
|
||||
}
|
||||
.a11y-panel-enter-active {
|
||||
animation: slideInFromTop 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards;
|
||||
}
|
||||
@@ -4228,35 +4397,35 @@ body.zen-mode-enable {
|
||||
--adm-todo-text: oklch(44.3% 0.11 240.79);
|
||||
}
|
||||
html.dark {
|
||||
--adm-note-bg: color-mix(in srgb, color-mix(in oklab, oklch(39.1% 0.09 240.876) 40%, transparent), black 15%);
|
||||
--adm-note-bg: color-mix(in srgb, oklch(44.3% 0.11 240.79), #0f0f0f 50%);
|
||||
--adm-note-text: oklch(95.1% 0.026 236.824);
|
||||
--adm-tip-bg: color-mix(in srgb, color-mix(in oklab, oklch(37.8% 0.077 168.94) 40%, transparent), black 15%);
|
||||
--adm-tip-bg: color-mix(in srgb, oklch(43.2% 0.095 166.913), #0f0f0f 50%);
|
||||
--adm-tip-text: oklch(95% 0.052 163.051);
|
||||
--adm-important-bg: color-mix(in srgb, color-mix(in oklab, oklch(38.1% 0.176 304.987) 40%, transparent), black 15%);
|
||||
--adm-important-bg: color-mix(in srgb, oklch(43.8% 0.218 303.724), #0f0f0f 50%);
|
||||
--adm-important-text: oklch(94.6% 0.033 307.174);
|
||||
--adm-warning-bg: color-mix(in srgb, color-mix(in oklab, oklch(40.8% 0.123 38.172) 40%, transparent), black 15%);
|
||||
--adm-warning-bg: color-mix(in srgb, oklch(47% 0.157 37.304), #0f0f0f 45%);
|
||||
--adm-warning-text: oklch(95.4% 0.038 75.164);
|
||||
--adm-caution-bg: color-mix(in srgb, color-mix(in oklab, oklch(39.6% 0.141 25.723) 40%, transparent), black 15%);
|
||||
--adm-caution-bg: color-mix(in srgb, oklch(44.4% 0.177 26.899), #0f0f0f 45%);
|
||||
--adm-caution-text: oklch(93.6% 0.032 17.717);
|
||||
--adm-abstract-bg: color-mix(in srgb, color-mix(in oklab, oklch(39.8% 0.07 227.392) 40%, transparent), black 15%);
|
||||
--adm-abstract-bg: color-mix(in srgb, oklch(45% 0.085 224.283), #0f0f0f 50%);
|
||||
--adm-abstract-text: oklch(95.6% 0.045 203.388);
|
||||
--adm-bug-bg: color-mix(in srgb, color-mix(in oklab, oklch(41% 0.159 10.272) 40%, transparent), black 15%);
|
||||
--adm-bug-bg: color-mix(in srgb, oklch(45.5% 0.188 13.697), #0f0f0f 50%);
|
||||
--adm-bug-text: oklch(94.1% 0.03 12.58);
|
||||
--adm-danger-bg: color-mix(in srgb, color-mix(in oklab, oklch(39.6% 0.141 25.723) 40%, transparent), black 15%);
|
||||
--adm-danger-bg: color-mix(in srgb, oklch(44.4% 0.177 26.899), #0f0f0f 45%);
|
||||
--adm-danger-text: oklch(93.6% 0.032 17.717);
|
||||
--adm-example-bg: color-mix(in srgb, color-mix(in oklab, oklch(38.1% 0.176 304.987) 40%, transparent), black 15%);
|
||||
--adm-example-bg: color-mix(in srgb, oklch(43.8% 0.218 303.724), #0f0f0f 50%);
|
||||
--adm-example-text: oklch(94.6% 0.033 307.174);
|
||||
--adm-failure-bg: color-mix(in srgb, color-mix(in oklab, oklch(40.8% 0.153 2.432) 40%, transparent), black 15%);
|
||||
--adm-failure-bg: color-mix(in srgb, oklch(45.9% 0.187 3.815), #0f0f0f 50%);
|
||||
--adm-failure-text: oklch(94.8% 0.028 342.258);
|
||||
--adm-info-bg: color-mix(in srgb, color-mix(in oklab, oklch(37.9% 0.146 265.522) 40%, transparent), black 15%);
|
||||
--adm-info-bg: color-mix(in srgb, oklch(42.4% 0.199 265.638), #0f0f0f 50%);
|
||||
--adm-info-text: oklch(93.2% 0.032 255.585);
|
||||
--adm-question-bg: color-mix(in srgb, color-mix(in oklab, oklch(41.4% 0.112 45.904) 40%, transparent), black 15%);
|
||||
--adm-question-bg: color-mix(in srgb, oklch(47.3% 0.137 46.201), #0f0f0f 50%);
|
||||
--adm-question-text: oklch(96.2% 0.059 95.617);
|
||||
--adm-quote-bg: color-mix(in srgb, color-mix(in oklab, oklch(21% 0.034 264.665) 40%, transparent), black 15%);
|
||||
--adm-quote-bg: color-mix(in srgb, oklch(27.8% 0.033 256.848), #0f0f0f 50%);
|
||||
--adm-quote-text: oklch(96.7% 0.003 264.542);
|
||||
--adm-success-bg: color-mix(in srgb, color-mix(in oklab, oklch(37.8% 0.077 168.94) 40%, transparent), black 15%);
|
||||
--adm-success-bg: color-mix(in srgb, oklch(43.2% 0.095 166.913), #0f0f0f 50%);
|
||||
--adm-success-text: oklch(95% 0.052 163.051);
|
||||
--adm-todo-bg: color-mix(in srgb, color-mix(in oklab, oklch(44.3% 0.11 240.79) 40%, transparent), black 15%);
|
||||
--adm-todo-bg: color-mix(in srgb, oklch(44.3% 0.11 240.79), #0f0f0f 50%);
|
||||
--adm-todo-text: oklch(95.1% 0.026 236.824);
|
||||
}
|
||||
.admonition-content > :first-child {
|
||||
@@ -4531,10 +4700,12 @@ 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 {
|
||||
width: 300px;
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
+5
-2
@@ -6,6 +6,7 @@
|
||||
@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);
|
||||
|
||||
@@ -182,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 {
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg fill="currentColor" viewBox="0 0 24 24" role="img" xmlns="http://www.w3.org/2000/svg"><path d="M10.617 11.473l4.686 3.695-3.102-7.662zM12 0C5.371 0 0 5.371 0 12s5.371 12 12 12 12-5.371 12-12S18.629 0 12 0zm5.797 17.305c-.011.471-.403.842-.875.83-.236 0-.416-.09-.664-.293l-6.19-5-2.079 5.203H6.191L11.438 5.44c.124-.314.427-.52.764-.506.326-.014.63.189.742.506l4.774 11.494c.045.111.08.234.08.348-.001.009-.001.009-.001.023z"/></svg>
|
||||
|
After Width: | Height: | Size: 478 B |
@@ -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,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);
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* Fuse.js v7.3.0 - Lightweight fuzzy-search (http://fusejs.io)
|
||||
*
|
||||
* Copyright (c) 2026 Kiro Risk (http://kiro.me)
|
||||
* All Rights Reserved. Apache Software License 2.0
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*/
|
||||
"use strict";function t(t){return Array.isArray?Array.isArray(t):"[object Array]"===u(t)}function e(t){return null==t?"":function(t){if("string"==typeof t)return t;if("bigint"==typeof t)return t.toString();const e=t+"";return"0"==e&&1/t==-1/0?"-0":e}(t)}function s(t){return"string"==typeof t}function i(t){return"number"==typeof t}function n(t){return!0===t||!1===t||function(t){return r(t)&&null!==t}(t)&&"[object Boolean]"==u(t)}function r(t){return"object"==typeof t}function c(t){return null!=t}function o(t){return!t.trim().length}function u(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":Object.prototype.toString.call(t)}const h=Object.prototype.hasOwnProperty;class a{constructor(t){this._keys=[],this._keyMap={};let e=0;t.forEach(t=>{const s=l(t);this._keys.push(s),this._keyMap[s.id]=s,e+=s.weight}),this._keys.forEach(t=>{t.weight/=e})}get(t){return this._keyMap[t]}keys(){return this._keys}toJSON(){return JSON.stringify(this._keys)}}function l(e){let i=null,n=null,r=null,c=1,o=null;if(s(e)||t(e))r=e,i=d(e),n=g(e);else{if(!h.call(e,"name"))throw new Error((t=>`Missing ${t} property in key`)("name"));const t=e.name;if(r=t,h.call(e,"weight")&&(c=e.weight,c<=0))throw new Error((t=>`Property 'weight' in key '${t}' must be a positive integer`)(t));i=d(t),n=g(t),o=e.getFn}return{path:i,id:n,weight:c,src:r,getFn:o}}function d(e){return t(e)?e:e.split(".")}function g(e){return t(e)?e.join("."):e}const f={useExtendedSearch:!1,useTokenSearch:!1,getFn:function(r,o){const u=[];let h=!1;const a=(r,o,l,d)=>{if(c(r))if(o[l]){const g=r[o[l]];if(!c(g))return;if(l===o.length-1&&(s(g)||i(g)||n(g)||"bigint"==typeof g))u.push(void 0!==d?{v:e(g),i:d}:e(g));else if(t(g)){h=!0;for(let t=0,e=g.length;t<e;t+=1)a(g[t],o,l+1,t)}else o.length&&a(g,o,l+1,d)}else u.push(void 0!==d?{v:r,i:d}:r)};return a(r,s(o)?o.split("."):o,0),h?u:u[0]},ignoreLocation:!1,ignoreFieldNorm:!1,fieldNormWeight:1},p=Object.freeze({isCaseSensitive:!1,ignoreDiacritics:!1,includeScore:!1,keys:[],shouldSort:!0,sortFn:(t,e)=>t.score===e.score?t.idx<e.idx?-1:1:t.score<e.score?-1:1,includeMatches:!1,findAllMatches:!1,minMatchCharLength:1,location:0,threshold:.6,distance:100,...f}),A=/[^ ]+/g;class m{constructor({getFn:t=p.getFn,fieldNormWeight:e=p.fieldNormWeight}={}){this.norm=function(t=1,e=3){const s=new Map,i=Math.pow(10,e);return{get(e){const n=e.match(A).length;if(s.has(n))return s.get(n);const r=1/Math.pow(n,.5*t),c=parseFloat(Math.round(r*i)/i);return s.set(n,c),c},clear(){s.clear()}}}(e,3),this.getFn=t,this.isCreated=!1,this.docs=[],this.keys=[],this._keysMap={},this.setIndexRecords()}setSources(t=[]){this.docs=t}setIndexRecords(t=[]){this.records=t}setKeys(t=[]){this.keys=t,this._keysMap={},t.forEach((t,e)=>{this._keysMap[t.id]=e})}create(){!this.isCreated&&this.docs.length&&(this.isCreated=!0,s(this.docs[0])?this.docs.forEach((t,e)=>{this._addString(t,e)}):this.docs.forEach((t,e)=>{this._addObject(t,e)}),this.norm.clear())}add(t){const e=this.size();s(t)?this._addString(t,e):this._addObject(t,e)}removeAt(t){this.records.splice(t,1);for(let e=t,s=this.size();e<s;e+=1)this.records[e].i-=1}removeAll(t){for(let e=t.length-1;e>=0;e-=1)this.records.splice(t[e],1);for(let t=0,e=this.records.length;t<e;t+=1)this.records[t].i=t}getValueForItemAtKeyId(t,e){return t[this._keysMap[e]]}size(){return this.records.length}_addString(t,e){if(!c(t)||o(t))return;const s={v:t,i:e,n:this.norm.get(t)};this.records.push(s)}_addObject(i,n){const r={i:n,$:{}};this.keys.forEach((n,u)=>{const h=n.getFn?n.getFn(i):this.getFn(i,n.path);if(c(h))if(t(h)){const t=[];for(let i=0,n=h.length;i<n;i+=1){const n=h[i];if(c(n))if(s(n)){if(!o(n)){const e={v:n,i:i,n:this.norm.get(n)};t.push(e)}}else if(c(n.v)){const i=s(n.v)?n.v:e(n.v);if(!o(i)){const e={v:i,i:n.i,n:this.norm.get(i)};t.push(e)}}}r.$[u]=t}else if(s(h)&&!o(h)){const t={v:h,n:this.norm.get(h)};r.$[u]=t}}),this.records.push(r)}toJSON(){return{keys:this.keys.map(({getFn:t,...e})=>e),records:this.records}}}function C(t,e,{getFn:s=p.getFn,fieldNormWeight:i=p.fieldNormWeight}={}){const n=new m({getFn:s,fieldNormWeight:i});return n.setKeys(t.map(l)),n.setSources(e),n.create(),n}const M=32;function y(t,e,s,{location:i=p.location,distance:n=p.distance,threshold:r=p.threshold,findAllMatches:c=p.findAllMatches,minMatchCharLength:o=p.minMatchCharLength,includeMatches:u=p.includeMatches,ignoreLocation:h=p.ignoreLocation}={}){if(e.length>M)throw new Error(`Pattern length exceeds max of ${M}.`);const a=e.length,l=t.length,d=Math.max(0,Math.min(i,l));let g=r,f=d;const A=(t,e)=>{const s=t/a;if(h)return s;const i=Math.abs(d-e);return n?s+i/n:i?1:s},m=o>1||u,C=m?Array(l):[];let y;for(;(y=t.indexOf(e,f))>-1;){const t=A(0,y);if(g=Math.min(t,g),f=y+a,m){let t=0;for(;t<a;)C[y+t]=1,t+=1}}f=-1;let x=[],F=1,D=a+l;const E=1<<a-1;for(let e=0;e<a;e+=1){let i=0,n=D;for(;i<n;){A(e,d+n)<=g?i=n:D=n,n=Math.floor((D-i)/2+i)}D=n;let r=Math.max(1,d-n+1);const o=c?l:Math.min(d+n,l)+a,u=Array(o+2);u[o+1]=(1<<e)-1;for(let i=o;i>=r;i-=1){const n=i-1,c=sLine truncated
|
||||
Vendored
-9
@@ -1,9 +0,0 @@
|
||||
/**
|
||||
* Fuse.js v7.1.0 - Lightweight fuzzy-search (http://fusejs.io)
|
||||
*
|
||||
* Copyright (c) 2025 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
|
||||
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
|
||||
Vendored
+1513
-919
File diff suppressed because it is too large.
Load diff
+2
-2
@@ -1,5 +1,5 @@
|
||||
[module]
|
||||
[module.hugoVersion]
|
||||
extended = true
|
||||
min = "0.141.0"
|
||||
max = "0.154.1"
|
||||
min = "0.158.0"
|
||||
max = "0.161.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
|
||||
@@ -40,6 +42,9 @@ fingerprintAlgorithm = "sha512" # Valid values are "sha512" (default), "sha384",
|
||||
giteaDefaultServer = "https://git.fsfe.org"
|
||||
forgejoDefaultServer = "https://v11.next.forgejo.org"
|
||||
|
||||
[seo]
|
||||
# metaDescriptionOrder = ["summary", "description", "site"] # Controls the fallback order for the HTML meta description. Valid values are "summary", "description", and "site".
|
||||
|
||||
[header]
|
||||
layout = "basic" # valid options: basic, fixed, fixed-fill, fixed-gradient, fixed-fill-blur
|
||||
|
||||
@@ -87,12 +92,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 +126,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 +137,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
|
||||
|
||||
+444
-264
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"
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -1 +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?v=4\u0026s=128","profile_url":"https://github.com/ytocquet","username":"ytocquet"},{"avatar_url":"https://avatars.githubusercontent.com/u/49299328?v=4\u0026s=128","profile_url":"https://github.com/LITUATUI","username":"LITUATUI"}]
|
||||
[{"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"
|
||||
|
||||
@@ -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` |
|
||||
@@ -185,6 +186,7 @@ Many of the article defaults here can be overridden on a per article basis by sp
|
||||
| `showViews` | _Not set_ | Whether or not articles and list views are displayed. This requires firebase integrations to be enabled, look below. |
|
||||
| `showLikes` | _Not set_ | Whether or not articles and list likes are displayed. This requires firebase integrations to be enabled, look below. |
|
||||
| `robots` | _Not set_ | String that indicates how robots should handle your site. If set, it will be output in the page head. Refer to [Google's docs](https://developers.google.com/search/docs/advanced/robots/robots_meta_tag#directives) for valid values. |
|
||||
| `seo.metaDescriptionOrder` | `["summary", "description", "site"]` | Controls the fallback order for the HTML meta description. Valid values are `summary`, `description`, and `site`. Use `["description", "summary", "site"]` if you want front matter `description` to take precedence over `summary`. |
|
||||
| `disableImageZoom` | `false` | Disables image zoom feature across all the images in the site. |
|
||||
| `disableImageOptimization` | `false` | Disables image resize and optimization features across all the images in the site, except images using markdown syntax (``) |
|
||||
| `disableImageOptimizationMD` | `false` | Disables image resize and optimization features only for images using markdown syntax (``). |
|
||||
@@ -244,8 +246,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 +262,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 +278,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 +306,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 +320,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.141.0** oder höher verwenden, da das Theme einige der neuesten Hugo-Funktionen nutzt.
|
||||
Stellen Sie sicher, dass Sie **Hugo Version 0.158.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.141.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.158.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.141.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.158.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.141.0 di Hugo** o successiva, poiché il tema sfrutta alcune delle ultime caratteristiche di Hugo.
|
||||
Assicurati di usare la **versione 0.158.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.141.0 以降**を使用していることを確認してください。
|
||||
テーマは最新の Hugo の機能を活用しているため、**Hugo バージョン 0.158.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.141.0** or later as the theme takes advantage of some of the latest Hugo features.
|
||||
Make sure you are using **Hugo version 0.158.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.141.0** ou posterior, pois o tema aproveita alguns dos recursos mais recentes do Hugo.
|
||||
Certifique-se de estar usando **Hugo versão 0.158.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.141.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.158.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.141.0** 或更高的版本,Blowfish 主题中使用了最新的 Hugo 特性。
|
||||
确保你使用 **Hugo 0.158.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
|
||||
```
|
||||
|
||||
|
||||
@@ -46,6 +46,8 @@ To enable Umami Analytics support, simply provide your [Umami tracking code](htt
|
||||
If you also use the custom domain feature of Umami and would like to serve their script from your domain, you can also additionally provide the `domain` configuration value. If you don't provide a `domain` value, the script will load directly from Umami DNS (analytics.umami.is).
|
||||
If you want the tracker to only run on specific domains, you can provide the `dataDomains` configuration value. If you don't provide a `dataDomains` value, the script will run on any website where the `domain` and`websiteid` match. If the environment variable `TRACKER_SCRIPT_NAME` is configured, you can specify a custom script name `scriptName`. If it is not configured, either comment it out or use the default `script.js`.
|
||||
|
||||
If you want to honor the Do Not Track setting of the users browser, you have to set `doNotTrack` to `true`. Blowfish does not honor the Do Not Track setting per default.
|
||||
|
||||
{{< alert >}}
|
||||
**Note:** If you enable Umami Analytics, Blowfish will support [Umami Track Event](https://umami.is/docs/track-events) automatically. If you do not want to support Track Event, the param `enableTrackEvent` must set to `false`.
|
||||
{{< /alert >}}
|
||||
@@ -59,6 +61,7 @@ If you want the tracker to only run on specific domains, you can provide the `da
|
||||
dataDomains = "yoursite.com,yoursite2.com"
|
||||
scriptName = "TRACKER_SCRIPT_NAME"
|
||||
enableTrackEvent = true
|
||||
doNotTrack = false
|
||||
```
|
||||
|
||||
### Seline Analytics
|
||||
|
||||
@@ -96,6 +96,127 @@ The alert sign (`+` or `-`) is optional to control whether the admonition is fol
|
||||
|
||||
> [!INFO]- Customize admonition
|
||||
> See the [admonition customization guide](https://github.com/nunocoracao/blowfish/blob/main/layouts/_default/_markup/render-blockquote.html).
|
||||
## Accordion
|
||||
|
||||
`accordion` creates a collapsible set of panels. Use the `accordionItem` sub-shortcode to define each item. You can control whether multiple items can be open at the same time using the `mode` parameter.
|
||||
|
||||
<!-- prettier-ignore-start -->
|
||||
| Parameter | Description |
|
||||
| --------- | ------------------------------------------------------------------------------------------------- |
|
||||
| `mode` | **Optional.** `collapse` (single open) or `open` (multiple open). Defaults to `collapse`. |
|
||||
| `separated` | **Optional.** `true` to show each item as a separate card. Defaults to `false` (joined list). |
|
||||
<!-- prettier-ignore-end -->
|
||||
|
||||
`accordionItem` parameters:
|
||||
|
||||
<!-- prettier-ignore-start -->
|
||||
| Parameter | Description |
|
||||
| --------- | --------------------------------------------------------------------------------------------------- |
|
||||
| `title` | **Required.** Title shown in the item header. |
|
||||
| `open` | **Optional.** Set to `true` to have the item open by default. |
|
||||
| `header` | **Optional.** Alias for `title`, kept for compatibility with other shortcodes. |
|
||||
| `icon` | **Optional.** Icon name to display before the title. |
|
||||
| `align` | **Optional.** Align text within the item: `left`, `center`, `right` |
|
||||
<!-- prettier-ignore-end -->
|
||||
|
||||
**Example 1: `mode="open"` (multiple items can be open) + `separated=true`**
|
||||
|
||||
```md
|
||||
{{</* accordion mode="open" separated=true */>}}
|
||||
{{</* accordionItem title="Markdown example" icon="code" open=true */>}}
|
||||
This item demonstrates Markdown rendering:
|
||||
- **Bold text**
|
||||
- Lists
|
||||
- `inline code`
|
||||
{{</* /accordionItem */>}}
|
||||
|
||||
{{</* accordionItem title="Shortcode example" md=false */>}}
|
||||
This item demonstrates shortcode rendering with <code>md=false</code>:
|
||||
|
||||
{{</* alert */>}}This is an inline alert.{{</* /alert */>}}
|
||||
{{</* /accordionItem */>}}
|
||||
{{</* /accordion */>}}
|
||||
```
|
||||
|
||||
{{< accordion mode="open" separated=true >}}
|
||||
{{< accordionItem title="Markdown example" icon="code" open=true >}}
|
||||
This item demonstrates Markdown rendering:
|
||||
- **Bold text**
|
||||
- Lists
|
||||
- `inline code`
|
||||
{{< /accordionItem >}}
|
||||
|
||||
{{< accordionItem title="Shortcode example" md=false >}}
|
||||
This item demonstrates shortcode rendering with <code>md=false</code>:
|
||||
|
||||
{{< alert >}}This is an inline alert.{{< /alert >}}
|
||||
{{< /accordionItem >}}
|
||||
{{< /accordion >}}
|
||||
|
||||
**Example 2: `mode="collapse"` (only one item open at a time)**
|
||||
|
||||
```md
|
||||
{{</* accordion mode="collapse" */>}}
|
||||
{{</* accordionItem title="First item" open=true */>}}
|
||||
This item uses Markdown with a short list:
|
||||
1. One
|
||||
2. Two
|
||||
3. Three
|
||||
{{</* /accordionItem */>}}
|
||||
|
||||
{{</* accordionItem title="Second item" md=false */>}}
|
||||
This item includes another shortcode:
|
||||
{{</* badge */>}}Tip{{</* /badge */>}}
|
||||
{{</* /accordionItem */>}}
|
||||
{{</* /accordion */>}}
|
||||
```
|
||||
|
||||
{{< accordion mode="collapse" >}}
|
||||
{{< accordionItem title="First item" open=true >}}
|
||||
This item uses Markdown with a short list:
|
||||
1. One
|
||||
2. Two
|
||||
3. Three
|
||||
{{< /accordionItem >}}
|
||||
|
||||
{{< accordionItem title="Second item" md=false >}}
|
||||
This item includes another shortcode:
|
||||
{{< badge >}}Tip{{< /badge >}}
|
||||
{{< /accordionItem >}}
|
||||
{{< /accordion >}}
|
||||
|
||||
<br/><br/><br/>
|
||||
|
||||
## Ansible Galaxy Card
|
||||
|
||||
`ansible` renders a card for an [Ansible Galaxy](https://galaxy.ansible.com/) entry, fetched at build time. It accepts either a `role` or a `collection` parameter, both in `namespace.name` form.
|
||||
|
||||
<!-- prettier-ignore-start -->
|
||||
| Parameter | Description |
|
||||
| ------------ | ------------------------------------------------------------------------------------ |
|
||||
| `role` | [String] Galaxy role in the format `namespace.name`, e.g. `geerlingguy.docker` |
|
||||
| `collection` | [String] Galaxy collection in the format `namespace.name`, e.g. `community.general` |
|
||||
<!-- prettier-ignore-end -->
|
||||
|
||||
Set exactly one of `role` or `collection` per call.
|
||||
|
||||
All card values are fetched at build time via Hugo's `resources.GetRemote`. Galaxy does not allow cross-origin requests, so the card is not refreshed in the browser — rebuild the site to update the values.
|
||||
|
||||
**Example 1: Role**
|
||||
|
||||
```md
|
||||
{{</* ansible role="geerlingguy.docker" */>}}
|
||||
```
|
||||
|
||||
{{< ansible role="geerlingguy.docker" >}}
|
||||
|
||||
**Example 2: Collection**
|
||||
|
||||
```md
|
||||
{{</* ansible collection="community.general" */>}}
|
||||
```
|
||||
|
||||
{{< ansible collection="community.general" >}}
|
||||
|
||||
<br/><br/><br/>
|
||||
|
||||
@@ -141,7 +262,7 @@ New article!
|
||||
|
||||
## Button
|
||||
|
||||
`button` outputs a styled button component which can be used to highlight a primary action. It has three optional variables `href`, `target` and `rel` which can be used to specify the URL, target and relation of the link.
|
||||
`button` outputs a styled button component which can be used to highlight a primary action. It has four optional variables `pageRef`, `href`, `target` and `rel`. `pageRef` resolves an internal page reference using the current page context, producing a language- and trailing-slash-aware URL that is consistent with the theme's navigation menus. `href` accepts any URL or path. When both are set, `pageRef` takes precedence.
|
||||
|
||||
**Example:**
|
||||
|
||||
@@ -155,6 +276,18 @@ Call to action
|
||||
Call to action
|
||||
{{< /button >}}
|
||||
|
||||
**Example using `pageRef`:**
|
||||
|
||||
```md
|
||||
{{</* button pageRef="docs/getting-started" */>}}
|
||||
Get started
|
||||
{{</* /button */>}}
|
||||
```
|
||||
|
||||
{{< button pageRef="docs/getting-started" >}}
|
||||
Get started
|
||||
{{< /button >}}
|
||||
|
||||
<br/><br/><br/>
|
||||
|
||||
## Carousel
|
||||
@@ -165,10 +298,13 @@ Call to action
|
||||
| Parameter | Description |
|
||||
| --- | --- |
|
||||
| `images` | **Required.** A regex string to match image names or URLs. |
|
||||
| `captions` | **Optional.** A list of `key:caption` pairs. Keys can be image filenames (for local images) or full URLs (for remote images). Captions support Markdown. |
|
||||
| `aspectRatio` | **Optional.** The aspect ratio for the carousel. It is set to `16-9` by default. |
|
||||
| `interval` | **Optional.** The interval for the auto-scrooling, specified in milliseconds. Defaults to `2000` (2s) |
|
||||
<!-- prettier-ignore-end -->
|
||||
|
||||
Captions are matched by key. For local images, use the filename (e.g. `01.jpg`). For remote images, use the full URL.
|
||||
|
||||
**Example 1:** 16:9 aspect ratio and verbose list of images
|
||||
|
||||
```md
|
||||
@@ -185,6 +321,14 @@ Call to action
|
||||
|
||||
{{< carousel images="gallery/*" aspectRatio="21-9" interval="2500" >}}
|
||||
|
||||
**Example 3:** Add captions
|
||||
|
||||
```md
|
||||
{{</* carousel images="gallery/*" captions="{01.jpg:First image with *formatting*,02.jpg:Second image with a [link](https://example.com)}" */>}}
|
||||
```
|
||||
|
||||
{{< carousel images="gallery/*" captions="{01.jpg:First image with *formatting*,02.jpg:Second image with a [link](https://example.com)}" >}}
|
||||
|
||||
<br/><br/><br/>
|
||||
|
||||
## Chart
|
||||
@@ -277,6 +421,18 @@ This shortcode is for importing code from external sources easily without copyin
|
||||
|
||||
<br/><br/><br/>
|
||||
|
||||
## Email
|
||||
|
||||
Creates an obfuscated mailto link:
|
||||
|
||||
```md
|
||||
{{</* email email="mailto:hello@test.com" text="text" subject="Reply to awesome article" */>}}
|
||||
```
|
||||
|
||||
{{< email email="mailto:hello@test.com" text="text" subject="Reply to awesome article" >}}
|
||||
|
||||
<br/><br/><br/>
|
||||
|
||||
## Figure
|
||||
|
||||
Blowfish includes a `figure` shortcode for adding images to content. The shortcode replaces the base Hugo functionality in order to provide additional performance benefits.
|
||||
@@ -292,6 +448,7 @@ The `figure` shortcode accepts six parameters:
|
||||
| `alt` | [Alternative text description](https://moz.com/learn/seo/alt-text) for the image. |
|
||||
| `caption` | Markdown for the image caption, which will be displayed below the image. |
|
||||
| `class` | Additional CSS classes to apply to the image. |
|
||||
| `figureClass` | Additional CSS classes to apply to the `<figure>` wrapper. Useful for galleries. |
|
||||
| `href` | URL that the image should be linked to. |
|
||||
| `target` | The target attribute for the `href` URL. |
|
||||
| `nozoom` | `nozoom=true` disables the image "zoom" functionality. This is most useful in combination with a `href` link. |
|
||||
@@ -349,6 +506,8 @@ Blowfish also supports automatic conversion of images included using standard Ma
|
||||
|
||||
In order to add images to the gallery, use `img` tags for each image and add `class="grid-wXX"` in order for the gallery to be able to identify the column width for each image. The widths available by default start at 10% and go all the way to 100% in 5% increments. For example, to set the width to 65%, set the class to `grid-w65`. Additionally, widths for 33% and 66% are also available in order to build galleries with 3 cols. You can also leverage tailwind's responsive indicators to have a reponsive grid.
|
||||
|
||||
If you need captions, you can use the `figure` shortcode inside the gallery. When doing so, set the grid width on the `figure` using `figureClass`, and use `caption` for the text.
|
||||
|
||||
**Example 1: normal gallery**
|
||||
|
||||
```md
|
||||
@@ -401,6 +560,24 @@ In order to add images to the gallery, use `img` tags for each image and add `cl
|
||||
|
||||
<br/><br/><br/>
|
||||
|
||||
**Example 3: gallery with captions (using `figure`)**
|
||||
|
||||
```md
|
||||
{{</* gallery */>}}
|
||||
{{</* figure src="gallery/01.jpg" alt="Gallery image 1" caption="First caption" figureClass="grid-w33" */>}}
|
||||
{{</* figure src="gallery/02.jpg" alt="Gallery image 2" caption="Second caption" figureClass="grid-w33" */>}}
|
||||
{{</* figure src="gallery/03.jpg" alt="Gallery image 3" caption="Third caption" figureClass="grid-w33" */>}}
|
||||
{{</* /gallery */>}}
|
||||
```
|
||||
|
||||
{{< gallery >}}
|
||||
{{< figure src="gallery/01.jpg" alt="Gallery image 1" caption="First caption" figureClass="grid-w33" >}}
|
||||
{{< figure src="gallery/02.jpg" alt="Gallery image 2" caption="Second caption" figureClass="grid-w33" >}}
|
||||
{{< figure src="gallery/03.jpg" alt="Gallery image 3" caption="Third caption" figureClass="grid-w33" >}}
|
||||
{{< /gallery >}}
|
||||
|
||||
<br/><br/><br/>
|
||||
|
||||
## Gist
|
||||
|
||||
`gist` shortcode allows you to embed a GitHub Gist directly into your content by specifying the Gist user, ID, and optionally a specific file.
|
||||
@@ -753,7 +930,15 @@ You can see some additional Mermaid examples on the [diagrams and flowcharts sam
|
||||
|
||||
The `tabs` shortcode is commonly used to present different variants of a particular step. For example, it can be used to show how to install VS Code on different platforms.
|
||||
|
||||
**Example**
|
||||
| Parameter | Description |
|
||||
| --------- | -------------------------------------------------------- |
|
||||
| `group` | **Optional.** Group name for synchronized tab switching. All tabs with the same group name will switch together. |
|
||||
| `default` | **Optional.** Label of the tab to be active by default. If not set, the first tab will be active. |
|
||||
| `label` | **Required.** The text label displayed on the tab button. |
|
||||
| `icon` | **Optional.** Icon name to display before the label. |
|
||||
| `md` | **Optional.** Render tab content as Markdown (default `true`). Set `md=false` to allow nested shortcodes inside tab content. |
|
||||
|
||||
**Example 1: Basic Usage**
|
||||
|
||||
`````md
|
||||
{{</* tabs */>}}
|
||||
@@ -778,8 +963,8 @@ The `tabs` shortcode is commonly used to present different variants of a particu
|
||||
```
|
||||
{{</* /tab */>}}
|
||||
|
||||
{{</* tab label="Linux" */>}}
|
||||
See [documentation](https://code.visualstudio.com/docs/setup/linux#_install-vs-code-on-linux).
|
||||
{{</* tab label="Linux" md=false */>}}
|
||||
{{</* alert */>}}See [documentation](https://code.visualstudio.com/docs/setup/linux#_install-vs-code-on-linux).{{</* /alert */>}}
|
||||
{{</* /tab */>}}
|
||||
|
||||
{{</* /tabs */>}}
|
||||
@@ -809,12 +994,100 @@ The `tabs` shortcode is commonly used to present different variants of a particu
|
||||
```
|
||||
{{< /tab >}}
|
||||
|
||||
{{< tab label="Linux" >}}
|
||||
See [documentation](https://code.visualstudio.com/docs/setup/linux#_install-vs-code-on-linux).
|
||||
{{< tab label="Linux" md=false >}}
|
||||
{{< alert >}}See [documentation](https://code.visualstudio.com/docs/setup/linux#_install-vs-code-on-linux).{{< /alert >}}
|
||||
{{< /tab >}}
|
||||
|
||||
{{< /tabs >}}
|
||||
|
||||
**Example 2: With Group, Default, and Icon**
|
||||
|
||||
`````md
|
||||
{{</* tabs group="lang" default="Python" */>}}
|
||||
{{</* tab label="JavaScript" icon="code" */>}}
|
||||
```javascript
|
||||
console.log("Hello");
|
||||
```
|
||||
{{</* /tab */>}}
|
||||
|
||||
{{</* tab label="Python" icon="sun" */>}}
|
||||
```python
|
||||
print("Hello")
|
||||
```
|
||||
{{</* /tab */>}}
|
||||
|
||||
{{</* tab label="Go" icon="moon" */>}}
|
||||
```go
|
||||
fmt.Println("Hello")
|
||||
```
|
||||
{{</* /tab */>}}
|
||||
{{</* /tabs */>}}
|
||||
|
||||
{{</* tabs group="lang" default="Python" */>}}
|
||||
{{</* tab label="JavaScript" icon="code" */>}}
|
||||
```javascript
|
||||
const add = (a, b) => a + b;
|
||||
```
|
||||
{{</* /tab */>}}
|
||||
|
||||
{{</* tab label="Python" icon="sun" */>}}
|
||||
```python
|
||||
def add(a, b): return a + b
|
||||
```
|
||||
{{</* /tab */>}}
|
||||
|
||||
{{</* tab label="Go" icon="moon" */>}}
|
||||
```go
|
||||
func add(a, b int) int { return a + b }
|
||||
```
|
||||
{{</* /tab */>}}
|
||||
{{</* /tabs */>}}
|
||||
`````
|
||||
|
||||
**Output**
|
||||
|
||||
{{< tabs group="lang" default="Python" >}}
|
||||
{{< tab label="JavaScript" icon="code" >}}
|
||||
```javascript
|
||||
console.log("Hello");
|
||||
```
|
||||
{{< /tab >}}
|
||||
|
||||
{{< tab label="Python" icon="sun" >}}
|
||||
```python
|
||||
print("Hello")
|
||||
```
|
||||
{{< /tab >}}
|
||||
|
||||
{{< tab label="Go" icon="moon" >}}
|
||||
```go
|
||||
fmt.Println("Hello")
|
||||
```
|
||||
{{< /tab >}}
|
||||
{{< /tabs >}}
|
||||
|
||||
{{< tabs group="lang" default="Python" >}}
|
||||
{{< tab label="JavaScript" icon="code" >}}
|
||||
```javascript
|
||||
const add = (a, b) => a + b;
|
||||
```
|
||||
{{< /tab >}}
|
||||
|
||||
{{< tab label="Python" icon="sun" >}}
|
||||
```python
|
||||
def add(a, b): return a + b
|
||||
```
|
||||
{{< /tab >}}
|
||||
|
||||
{{< tab label="Go" icon="moon" >}}
|
||||
```go
|
||||
func add(a, b int) int { return a + b }
|
||||
```
|
||||
{{< /tab >}}
|
||||
{{< /tabs >}}
|
||||
|
||||
In this example, both tab groups share the same `group="lang"` parameter, so clicking any tab will synchronize both groups. The `default="Python"` parameter makes Python the initially active tab, and `icon="code"` adds an icon before each label.
|
||||
|
||||
<br/><br/><br/>
|
||||
|
||||
## Timeline
|
||||
|
||||
@@ -11,7 +11,7 @@ series_order: 8
|
||||
|
||||
除了所有[默认 Hugo 简码](https://gohugo.io/content-management/shortcodes/) 之外,Blowfish 还添加了一些额外的功能。
|
||||
|
||||
## Alert
|
||||
## 醒目框
|
||||
|
||||
`alert` 可以将其中内容输出为文章中的风格化消息框。它对于吸引读者注意您不想让读者错过的重要信息很有用。
|
||||
|
||||
@@ -64,7 +64,7 @@ This is an error!
|
||||
|
||||
<br/><br/><br/>
|
||||
|
||||
## Admonition
|
||||
## 提示框
|
||||
|
||||
Admonition 用于在内容中插入醒目提示。
|
||||
|
||||
@@ -99,7 +99,7 @@ Admonition 的用途与 alert shortcode 类似,但其实现方式是通过 Hug
|
||||
|
||||
<br/><br/><br/>
|
||||
|
||||
## Article
|
||||
## 文章嵌入
|
||||
|
||||
`Article` 将把一篇文章嵌入到一个 markdown 文件中。 参数中的 `link`应该是要嵌入的文件的 `.RelPermalink`。请注意,如果简码引用其父级文件,则它不会显示任何内容。 *注意:如果您在 Blowfish(即 /blowfish/)等子文件夹中运行网站,请在链接中包含该路径。*
|
||||
|
||||
@@ -121,7 +121,7 @@ Admonition 的用途与 alert shortcode 类似,但其实现方式是通过 Hug
|
||||
|
||||
<br/><br/><br/>
|
||||
|
||||
## Badge
|
||||
## 徽章
|
||||
|
||||
`badge` 输出一个美观的徽章组件,该组件对于显示元数据很有用。
|
||||
|
||||
@@ -139,7 +139,7 @@ New article!
|
||||
|
||||
<br/><br/><br/>
|
||||
|
||||
## Button
|
||||
## 按钮
|
||||
|
||||
`button` 输出一个样式化的按钮组件,可用于突出显示主要操作。它有三个可选变量 `href`、`target` 和 `rel`,可用于指定链接的 URL、目标和关系。
|
||||
|
||||
@@ -157,7 +157,7 @@ Call to action
|
||||
|
||||
<br/><br/><br/>
|
||||
|
||||
## Carousel
|
||||
## 滑动画册
|
||||
|
||||
`carousel` 用于生成可交互且具有视觉吸引力的方式展示多个图像的画廊。这允许用户滑动浏览多个图像,同时仅占用单个图像的垂直空间。 所有图像均使用父组件的完整宽度并使用预定义的宽高比 `16:9` 、 `21:9` 或 `32:9` 之一显示。
|
||||
|
||||
@@ -187,7 +187,7 @@ Call to action
|
||||
|
||||
<br/><br/><br/>
|
||||
|
||||
## Chart
|
||||
## 图表
|
||||
|
||||
`chart` 使用 Chart.js 库将图表嵌入到使用简单结构化数据的文章中。它支持多种[不同的图表样式](https://www.chartjs.org/docs/latest/samples/),并且所有内容都可以在简码中进行配置。只需在简码中提供图表参数,Chart.js 将完成剩下的工作。
|
||||
|
||||
@@ -225,7 +225,7 @@ data: {
|
||||
|
||||
<br/><br/><br/>
|
||||
|
||||
## Code Importer
|
||||
## 导入源码
|
||||
|
||||
此短代码用于轻松从外部源导入代码,无需复制和粘贴
|
||||
|
||||
@@ -306,7 +306,7 @@ Blowfish 还支持使用标准 Markdown 语法自动转换图像。只需使用
|
||||

|
||||
```
|
||||
|
||||
## Forgejo Card
|
||||
## Forgejo 卡片
|
||||
|
||||
`forgejo` allows you to quickly link a Forgejo repository via the forgejo API, providing real-time updates on stats such as stars and forks.
|
||||
|
||||
@@ -345,7 +345,7 @@ Blowfish 还支持使用标准 Markdown 语法自动转换图像。只需使用
|
||||
|
||||
<br/><br/><br/>
|
||||
|
||||
## Gallery
|
||||
## 排布画册
|
||||
|
||||
`gallery` 允许您以响应式一次展示多个图像,并具有更加多样化和有趣的布局的图库。
|
||||
|
||||
@@ -612,7 +612,7 @@ Blowfish 还支持使用标准 Markdown 语法自动转换图像。只需使用
|
||||
|
||||
<br/><br/><br/>
|
||||
|
||||
## Lead
|
||||
## 开篇语
|
||||
|
||||
`lead` 用于强调文章的开头。它可以用来设计介绍的样式,或者指出一条重要的信息。只需将任何 Markdown 内容包装在 `lead` 简码中即可。
|
||||
|
||||
@@ -763,7 +763,14 @@ B-->C[Profit]
|
||||
|
||||
`tabs` 简码常用于呈现某个步骤的不同变体。例如,可用于展示在不同平台上安装 VS Code 的方式。
|
||||
|
||||
**示例**
|
||||
| 参数 | 描述 |
|
||||
| --------- | --------------------------------------- |
|
||||
| `group` | **可选。** 用于同步切换标签页的组名。具有相同组名的所有标签页将一起切换。 |
|
||||
| `default` | **可选。** 默认激活的标签页的标签。如果未设置,默认激活第一个标签页。 |
|
||||
| `label` | **必填。** 显示在标签按钮上的文本标签。 |
|
||||
| `icon` | **可选。** 在标签前显示的图标名称。 |
|
||||
|
||||
**示例 1:基本用法**
|
||||
|
||||
````md
|
||||
{{</* tabs */>}}
|
||||
@@ -825,6 +832,94 @@ B-->C[Profit]
|
||||
|
||||
{{< /tabs >}}
|
||||
|
||||
**示例 2:使用 Group、Default 和 Icon**
|
||||
|
||||
`````md
|
||||
{{</* tabs group="lang" default="Python" */>}}
|
||||
{{</* tab label="JavaScript" icon="code" */>}}
|
||||
```javascript
|
||||
console.log("Hello");
|
||||
```
|
||||
{{</* /tab */>}}
|
||||
|
||||
{{</* tab label="Python" icon="sun" */>}}
|
||||
```python
|
||||
print("Hello")
|
||||
```
|
||||
{{</* /tab */>}}
|
||||
|
||||
{{</* tab label="Go" icon="moon" */>}}
|
||||
```go
|
||||
fmt.Println("Hello")
|
||||
```
|
||||
{{</* /tab */>}}
|
||||
{{</* /tabs */>}}
|
||||
|
||||
{{</* tabs group="lang" default="Python" */>}}
|
||||
{{</* tab label="JavaScript" icon="code" */>}}
|
||||
```javascript
|
||||
const add = (a, b) => a + b;
|
||||
```
|
||||
{{</* /tab */>}}
|
||||
|
||||
{{</* tab label="Python" icon="sun" */>}}
|
||||
```python
|
||||
def add(a, b): return a + b
|
||||
```
|
||||
{{</* /tab */>}}
|
||||
|
||||
{{</* tab label="Go" icon="moon" */>}}
|
||||
```go
|
||||
func add(a, b int) int { return a + b }
|
||||
```
|
||||
{{</* /tab */>}}
|
||||
{{</* /tabs */>}}
|
||||
`````
|
||||
|
||||
**Output**
|
||||
|
||||
{{< tabs group="lang" default="Python" >}}
|
||||
{{< tab label="JavaScript" icon="code" >}}
|
||||
```javascript
|
||||
console.log("Hello");
|
||||
```
|
||||
{{< /tab >}}
|
||||
|
||||
{{< tab label="Python" icon="sun" >}}
|
||||
```python
|
||||
print("Hello")
|
||||
```
|
||||
{{< /tab >}}
|
||||
|
||||
{{< tab label="Go" icon="moon" >}}
|
||||
```go
|
||||
fmt.Println("Hello")
|
||||
```
|
||||
{{< /tab >}}
|
||||
{{< /tabs >}}
|
||||
|
||||
{{< tabs group="lang" default="Python" >}}
|
||||
{{< tab label="JavaScript" icon="code" >}}
|
||||
```javascript
|
||||
const add = (a, b) => a + b;
|
||||
```
|
||||
{{< /tab >}}
|
||||
|
||||
{{< tab label="Python" icon="sun" >}}
|
||||
```python
|
||||
def add(a, b): return a + b
|
||||
```
|
||||
{{< /tab >}}
|
||||
|
||||
{{< tab label="Go" icon="moon" >}}
|
||||
```go
|
||||
func add(a, b int) int { return a + b }
|
||||
```
|
||||
{{< /tab >}}
|
||||
{{< /tabs >}}
|
||||
|
||||
在这个示例中,两个标签组都使用了相同的 `group="lang"` 参数,因此点击任意一个标签时,两个标签组都会同步切换。`default="Python"` 参数用于指定 Python 为初始激活的标签,而 `icon="code"` 会在每个标签标题前添加一个图标。
|
||||
|
||||
<br/><br/><br/>
|
||||
|
||||
## 时间线
|
||||
|
||||
@@ -26,7 +26,7 @@ Una característica muy solicitada: ¡Blowfish ahora es multilingüe! Si publica
|
||||
|
||||
<div class="text-2xl text-center" style="font-size: 2.8rem">🇬🇧 🇩🇪 🇫🇷 🇪🇸 🇨🇳 🇧🇷 🇹🇷 🇧🇩</div>
|
||||
|
||||
Gracias a las contribuciones de la comunidad, Blowfish ya ha sido traducido a [treinta idiomas](https://github.com/nunocoracao/blowfish/tree/main/i18n), y se añadirán más con el tiempo. Por cierto, ¡los [pull requests](https://github.com/nunocoracao/blowfish/pulls) para nuevos idiomas siempre son bienvenidos!
|
||||
Gracias a las contribuciones de la comunidad, Blowfish ya ha sido traducido a [treinta y dos idiomas](https://github.com/nunocoracao/blowfish/tree/main/i18n), y se añadirán más con el tiempo. Por cierto, ¡los [pull requests](https://github.com/nunocoracao/blowfish/pulls) para nuevos idiomas siempre son bienvenidos!
|
||||
|
||||
## Soporte para idiomas RTL
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ A highly requested feature, Blowfish is now multilingual! If you publish your co
|
||||
|
||||
<div class="text-2xl text-center" style="font-size: 2.8rem">🇬🇧 🇩🇪 🇫🇷 🇪🇸 🇨🇳 🇧🇷 🇹🇷 🇧🇩</div>
|
||||
|
||||
Thanks to submissions from the community, Blowfish has already been translated into [thirty languages](https://github.com/nunocoracao/blowfish/tree/main/i18n) with more to be added over time. By the way, [pull requests](https://github.com/nunocoracao/blowfish/pulls) for new languages are always welcome!
|
||||
Thanks to submissions from the community, Blowfish has already been translated into [thirty-two languages](https://github.com/nunocoracao/blowfish/tree/main/i18n) with more to be added over time. By the way, [pull requests](https://github.com/nunocoracao/blowfish/pulls) for new languages are always welcome!
|
||||
|
||||
## RTL language support
|
||||
|
||||
|
||||
@@ -15,116 +15,4 @@ Zusätzlich werden benutzerdefinierte Icons vollständig unterstützt. Stellen S
|
||||
|
||||
Die vollständige Liste der integrierten Icons und ihre entsprechenden Namen finden Sie unten.
|
||||
|
||||
| Icon-Name | Vorschau |
|
||||
| -------------------- | --------------------------------- |
|
||||
| amazon | {{< icon amazon >}} |
|
||||
| apple | {{< icon apple >}} |
|
||||
| bars | {{< icon bars >}} |
|
||||
| bell | {{< icon bell >}} |
|
||||
| blogger | {{< icon blogger >}} |
|
||||
| bluesky | {{< icon bluesky >}} |
|
||||
| bomb | {{< icon bomb >}} |
|
||||
| bug | {{< icon bug >}} |
|
||||
| check | {{< icon check >}} |
|
||||
| circle-info | {{< icon circle-info >}} |
|
||||
| cloud | {{< icon cloud >}} |
|
||||
| cloud-moon | {{< icon cloud-moon >}} |
|
||||
| code | {{< icon code>}} |
|
||||
| codeberg | {{< icon codeberg >}} |
|
||||
| codepen | {{< icon codepen >}} |
|
||||
| comment | {{< icon comment >}} |
|
||||
| dev | {{< icon dev >}} |
|
||||
| discourse | {{< icon discourse >}} |
|
||||
| docker | {{< icon docker >}} |
|
||||
| download | {{< icon download >}} |
|
||||
| dribbble | {{< icon dribbble >}} |
|
||||
| edit | {{< icon edit >}} |
|
||||
| email | {{< icon email >}} |
|
||||
| envelope | {{< icon envelope >}} |
|
||||
| expand | {{< icon expand >}} |
|
||||
| eye | {{< icon eye >}} |
|
||||
| facebook | {{< icon facebook >}} |
|
||||
| fediverse | {{< icon fediverse >}} |
|
||||
| fire | {{< icon fire >}} |
|
||||
| flickr | {{< icon flickr >}} |
|
||||
| fork | {{< icon fork >}} |
|
||||
| foursquare | {{< icon foursquare >}} |
|
||||
| ghost | {{< icon ghost >}} |
|
||||
| github | {{< icon github >}} |
|
||||
| gitlab | {{< icon gitlab >}} |
|
||||
| globe | {{< icon globe >}} |
|
||||
| goodreads | {{< icon goodreads >}} |
|
||||
| google | {{< icon google >}} |
|
||||
| google-scholar | {{< icon google-scholar >}} |
|
||||
| graduation-cap | {{< icon graduation-cap >}} |
|
||||
| hackernews | {{< icon hackernews >}} |
|
||||
| hashnode | {{< icon hashnode >}} |
|
||||
| heart-empty | {{< icon heart-empty >}} |
|
||||
| heart | {{< icon heart >}} |
|
||||
| image | {{< icon image >}} |
|
||||
| instagram | {{< icon instagram >}} |
|
||||
| itch-io | {{< icon itch-io >}} |
|
||||
| keybase | {{< icon keybase >}} |
|
||||
| keyoxide | {{< icon keyoxide >}} |
|
||||
| kickstarter | {{< icon kickstarter >}} |
|
||||
| ko-fi | {{< icon ko-fi >}} |
|
||||
| language | {{< icon language >}} |
|
||||
| lastfm | {{< icon lastfm >}} |
|
||||
| lightbulb | {{< icon lightbulb >}} |
|
||||
| line | {{< icon line >}} |
|
||||
| link | {{< icon link >}} |
|
||||
| linkedin | {{< icon linkedin >}} |
|
||||
| list | {{< icon list >}} |
|
||||
| location-dot | {{< icon location-dot >}} |
|
||||
| lock | {{< icon lock >}} |
|
||||
| mastodon | {{< icon mastodon >}} |
|
||||
| matrix | {{< icon matrix >}} |
|
||||
| medium | {{< icon medium >}} |
|
||||
| microsoft | {{< icon microsoft >}} |
|
||||
| moon | {{< icon moon >}} |
|
||||
| mug-hot | {{< icon mug-hot >}} |
|
||||
| music | {{< icon music >}} |
|
||||
| orcid | {{< icon orcid >}} |
|
||||
| patreon | {{< icon patreon >}} |
|
||||
| paypal | {{< icon paypal >}} |
|
||||
| peertube | {{< icon peertube >}} |
|
||||
| pencil | {{< icon pencil >}} |
|
||||
| pgpkey | {{< icon pgpkey >}} |
|
||||
| phone | {{< icon phone >}} |
|
||||
| pinterest | {{< icon pinterest >}} |
|
||||
| pixelfed | {{< icon pixelfed >}} |
|
||||
| poo | {{< icon poo >}} |
|
||||
| reddit | {{< icon reddit >}} |
|
||||
| researchgate | {{< icon researchgate >}} |
|
||||
| rss | {{< icon rss >}} |
|
||||
| rss-square | {{< icon rss-square >}} |
|
||||
| scale-balanced | {{< icon scale-balanced >}} |
|
||||
| search | {{< icon search >}} |
|
||||
| shield | {{< icon shield >}} |
|
||||
| signal | {{< icon signal >}} |
|
||||
| skull-crossbones | {{< icon skull-crossbones >}} |
|
||||
| slack | {{< icon slack >}} |
|
||||
| snapchat | {{< icon snapchat >}} |
|
||||
| soundcloud | {{< icon soundcloud >}} |
|
||||
| spotify | {{< icon spotify >}} |
|
||||
| stack-overflow | {{< icon stack-overflow >}} |
|
||||
| star | {{< icon star >}} |
|
||||
| steam | {{< icon steam >}} |
|
||||
| stripe | {{< icon stripe >}} |
|
||||
| substack | {{< icon substack >}} |
|
||||
| sun | {{< icon sun >}} |
|
||||
| tag | {{< icon tag >}} |
|
||||
| telegram | {{< icon telegram >}} |
|
||||
| threads | {{< icon threads >}} |
|
||||
| tiktok | {{< icon tiktok >}} |
|
||||
| triangle-exclamation | {{< icon triangle-exclamation >}} |
|
||||
| tumblr | {{< icon tumblr >}} |
|
||||
| twitch | {{< icon twitch >}} |
|
||||
| twitter | {{< icon twitter >}} |
|
||||
| wand-magic-sparkles | {{< icon wand-magic-sparkles >}} |
|
||||
| whatsapp | {{< icon whatsapp >}} |
|
||||
| worktree | {{< icon worktree >}} |
|
||||
| x-twitter | {{< icon x-twitter >}} |
|
||||
| xing | {{< icon xing >}} |
|
||||
| xmark | {{< icon xmark >}} |
|
||||
| youtube | {{< icon youtube >}} |
|
||||
{{< icon-ref >}}
|
||||
@@ -15,116 +15,4 @@ Además, los iconos personalizados también son totalmente compatibles. Simpleme
|
||||
|
||||
La lista completa de iconos integrados y sus nombres correspondientes se puede consultar a continuación.
|
||||
|
||||
| Nombre del icono | Vista previa |
|
||||
| -------------------- | --------------------------------- |
|
||||
| amazon | {{< icon amazon >}} |
|
||||
| apple | {{< icon apple >}} |
|
||||
| bars | {{< icon bars >}} |
|
||||
| bell | {{< icon bell >}} |
|
||||
| blogger | {{< icon blogger >}} |
|
||||
| bluesky | {{< icon bluesky >}} |
|
||||
| bomb | {{< icon bomb >}} |
|
||||
| bug | {{< icon bug >}} |
|
||||
| check | {{< icon check >}} |
|
||||
| circle-info | {{< icon circle-info >}} |
|
||||
| cloud | {{< icon cloud >}} |
|
||||
| cloud-moon | {{< icon cloud-moon >}} |
|
||||
| code | {{< icon code>}} |
|
||||
| codeberg | {{< icon codeberg >}} |
|
||||
| codepen | {{< icon codepen >}} |
|
||||
| comment | {{< icon comment >}} |
|
||||
| dev | {{< icon dev >}} |
|
||||
| discourse | {{< icon discourse >}} |
|
||||
| docker | {{< icon docker >}} |
|
||||
| download | {{< icon download >}} |
|
||||
| dribbble | {{< icon dribbble >}} |
|
||||
| edit | {{< icon edit >}} |
|
||||
| email | {{< icon email >}} |
|
||||
| envelope | {{< icon envelope >}} |
|
||||
| expand | {{< icon expand >}} |
|
||||
| eye | {{< icon eye >}} |
|
||||
| facebook | {{< icon facebook >}} |
|
||||
| fediverse | {{< icon fediverse >}} |
|
||||
| fire | {{< icon fire >}} |
|
||||
| flickr | {{< icon flickr >}} |
|
||||
| fork | {{< icon fork >}} |
|
||||
| foursquare | {{< icon foursquare >}} |
|
||||
| ghost | {{< icon ghost >}} |
|
||||
| github | {{< icon github >}} |
|
||||
| gitlab | {{< icon gitlab >}} |
|
||||
| globe | {{< icon globe >}} |
|
||||
| goodreads | {{< icon goodreads >}} |
|
||||
| google | {{< icon google >}} |
|
||||
| google-scholar | {{< icon google-scholar >}} |
|
||||
| graduation-cap | {{< icon graduation-cap >}} |
|
||||
| hackernews | {{< icon hackernews >}} |
|
||||
| hashnode | {{< icon hashnode >}} |
|
||||
| heart-empty | {{< icon heart-empty >}} |
|
||||
| heart | {{< icon heart >}} |
|
||||
| image | {{< icon image >}} |
|
||||
| instagram | {{< icon instagram >}} |
|
||||
| itch-io | {{< icon itch-io >}} |
|
||||
| keybase | {{< icon keybase >}} |
|
||||
| keyoxide | {{< icon keyoxide >}} |
|
||||
| kickstarter | {{< icon kickstarter >}} |
|
||||
| ko-fi | {{< icon ko-fi >}} |
|
||||
| language | {{< icon language >}} |
|
||||
| lastfm | {{< icon lastfm >}} |
|
||||
| lightbulb | {{< icon lightbulb >}} |
|
||||
| line | {{< icon line >}} |
|
||||
| link | {{< icon link >}} |
|
||||
| linkedin | {{< icon linkedin >}} |
|
||||
| list | {{< icon list >}} |
|
||||
| location-dot | {{< icon location-dot >}} |
|
||||
| lock | {{< icon lock >}} |
|
||||
| mastodon | {{< icon mastodon >}} |
|
||||
| matrix | {{< icon matrix >}} |
|
||||
| medium | {{< icon medium >}} |
|
||||
| microsoft | {{< icon microsoft >}} |
|
||||
| moon | {{< icon moon >}} |
|
||||
| mug-hot | {{< icon mug-hot >}} |
|
||||
| music | {{< icon music >}} |
|
||||
| orcid | {{< icon orcid >}} |
|
||||
| patreon | {{< icon patreon >}} |
|
||||
| paypal | {{< icon paypal >}} |
|
||||
| peertube | {{< icon peertube >}} |
|
||||
| pencil | {{< icon pencil >}} |
|
||||
| pgpkey | {{< icon pgpkey >}} |
|
||||
| phone | {{< icon phone >}} |
|
||||
| pinterest | {{< icon pinterest >}} |
|
||||
| pixelfed | {{< icon pixelfed >}} |
|
||||
| poo | {{< icon poo >}} |
|
||||
| reddit | {{< icon reddit >}} |
|
||||
| researchgate | {{< icon researchgate >}} |
|
||||
| rss | {{< icon rss >}} |
|
||||
| rss-square | {{< icon rss-square >}} |
|
||||
| scale-balanced | {{< icon scale-balanced >}} |
|
||||
| search | {{< icon search >}} |
|
||||
| shield | {{< icon shield >}} |
|
||||
| signal | {{< icon signal >}} |
|
||||
| skull-crossbones | {{< icon skull-crossbones >}} |
|
||||
| slack | {{< icon slack >}} |
|
||||
| snapchat | {{< icon snapchat >}} |
|
||||
| soundcloud | {{< icon soundcloud >}} |
|
||||
| spotify | {{< icon spotify >}} |
|
||||
| stack-overflow | {{< icon stack-overflow >}} |
|
||||
| star | {{< icon star >}} |
|
||||
| steam | {{< icon steam >}} |
|
||||
| stripe | {{< icon stripe >}} |
|
||||
| substack | {{< icon substack >}} |
|
||||
| sun | {{< icon sun >}} |
|
||||
| tag | {{< icon tag >}} |
|
||||
| telegram | {{< icon telegram >}} |
|
||||
| threads | {{< icon threads >}} |
|
||||
| tiktok | {{< icon tiktok >}} |
|
||||
| triangle-exclamation | {{< icon triangle-exclamation >}} |
|
||||
| tumblr | {{< icon tumblr >}} |
|
||||
| twitch | {{< icon twitch >}} |
|
||||
| twitter | {{< icon twitter >}} |
|
||||
| wand-magic-sparkles | {{< icon wand-magic-sparkles >}} |
|
||||
| whatsapp | {{< icon whatsapp >}} |
|
||||
| worktree | {{< icon worktree >}} |
|
||||
| x-twitter | {{< icon x-twitter >}} |
|
||||
| xing | {{< icon xing >}} |
|
||||
| xmark | {{< icon xmark >}} |
|
||||
| youtube | {{< icon youtube >}} |
|
||||
{{< icon-ref >}}
|
||||
Loaded 100 of 2541 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user