Compare commits
250 Commits
Author | SHA1 | Date | |
---|---|---|---|
a8ed33eeb6 | |||
d3a3b999b3 | |||
b8ad7a107b | |||
30c4ff0288 | |||
a6aea0051a | |||
![]() |
cb3373d500 | ||
![]() |
56f28e6f14 | ||
![]() |
14036ffea6 | ||
![]() |
a1232ecf9f | ||
![]() |
a933f464f5 | ||
![]() |
709a407b2e | ||
![]() |
876eb3abff | ||
![]() |
a27f6eef5e | ||
![]() |
323f4c4b44 | ||
![]() |
b8f617f1b0 | ||
![]() |
9632c4d05a | ||
![]() |
594b1f190c | ||
![]() |
12815aaddc | ||
![]() |
e532637cbc | ||
![]() |
79bb4504a0 | ||
![]() |
26a298da5d | ||
![]() |
cf61e606c1 | ||
![]() |
0716533699 | ||
![]() |
9efcda2fdd | ||
![]() |
655148f329 | ||
![]() |
b6d14afca3 | ||
![]() |
bc778ee243 | ||
![]() |
f377609eba | ||
![]() |
a9b992436e | ||
![]() |
7f5a7f2f5a | ||
![]() |
30fddec3fa | ||
![]() |
68dd327312 | ||
![]() |
0c90c1aa50 | ||
![]() |
fe2271b60b | ||
![]() |
bd34a5bad3 | ||
![]() |
0dcf7e7a40 | ||
![]() |
86a1f3fd96 | ||
![]() |
4c4f43779c | ||
![]() |
ff85e6951d | ||
![]() |
ec37876f4d | ||
![]() |
f65aca556d | ||
![]() |
7b7eb0f1f3 | ||
![]() |
80fae9f86d | ||
![]() |
1358c5b945 | ||
![]() |
b4d292010b | ||
![]() |
37089d237a | ||
![]() |
2565f372d1 | ||
![]() |
a97a1791cc | ||
![]() |
97ea67198b | ||
![]() |
94624bcac6 | ||
![]() |
f1f84b1bf9 | ||
![]() |
d367a443f1 | ||
![]() |
36ab5287b5 | ||
![]() |
9173f59392 | ||
![]() |
c70900c25f | ||
![]() |
cabdb421e3 | ||
![]() |
de9f9b312e | ||
![]() |
2af73b3d7e | ||
![]() |
d1c3c40a95 | ||
![]() |
086af4d173 | ||
![]() |
c6de4b5b6b | ||
![]() |
66d2bf57ba | ||
![]() |
526be88d7b | ||
![]() |
2863a3a029 | ||
![]() |
852a07b15e | ||
![]() |
e83c11f31a | ||
![]() |
f439e6bb87 | ||
![]() |
9c0ba06db4 | ||
![]() |
5c6ed19c34 | ||
![]() |
0986b9ee84 | ||
![]() |
d2d2a62d5a | ||
![]() |
e3b582676e | ||
![]() |
56f6f19978 | ||
![]() |
1313415c8b | ||
![]() |
3cba6b9820 | ||
![]() |
6ee6ddeacb | ||
![]() |
db92de0f1b | ||
![]() |
b2bc4f7098 | ||
![]() |
857c4e4ca1 | ||
![]() |
d3f251b621 | ||
![]() |
d43ac66494 | ||
![]() |
4eca719b0b | ||
![]() |
daaf281012 | ||
![]() |
ba7707d4d9 | ||
![]() |
25da2baf7f | ||
![]() |
234fd39254 | ||
![]() |
4a7ab16695 | ||
![]() |
19852552c6 | ||
![]() |
80a1692ade | ||
![]() |
81720c7727 | ||
![]() |
f98fa8c389 | ||
![]() |
3503b4c4f1 | ||
![]() |
bf38320797 | ||
![]() |
6a9117ae7c | ||
![]() |
be7e0d3f40 | ||
![]() |
e4cdabff12 | ||
![]() |
2f127a2f2f | ||
![]() |
781e7000c4 | ||
![]() |
8e98791082 | ||
![]() |
6d4bbac085 | ||
![]() |
5103da4cd5 | ||
![]() |
9f2b67c08c | ||
![]() |
0d6cbba9df | ||
![]() |
1936b46af4 | ||
![]() |
ab9e40effd | ||
![]() |
5080877576 | ||
![]() |
24fb13b221 | ||
![]() |
a5b59b61f1 | ||
![]() |
ef536af9e8 | ||
![]() |
d8351aa432 | ||
![]() |
741a640b1a | ||
![]() |
935ff7f719 | ||
![]() |
29e70c8b21 | ||
![]() |
c634cb83eb | ||
![]() |
22d4737b99 | ||
![]() |
fba95d5336 | ||
![]() |
07b67ff112 | ||
![]() |
5c7303bee7 | ||
![]() |
0e312d3476 | ||
![]() |
98546e66b9 | ||
![]() |
b1f49c091f | ||
![]() |
8e6cc68e88 | ||
![]() |
9995617c66 | ||
![]() |
10907cdc25 | ||
![]() |
6bd2cfbd6b | ||
![]() |
2d8f42f4c5 | ||
![]() |
716af59393 | ||
![]() |
7191e25958 | ||
![]() |
c630805511 | ||
![]() |
cb274c8ac5 | ||
![]() |
fbe1aac123 | ||
![]() |
ff8f2537ca | ||
![]() |
728fe21ef1 | ||
![]() |
fc964f11a6 | ||
![]() |
09e9f52019 | ||
![]() |
f5e4283961 | ||
![]() |
10f1d85ab4 | ||
![]() |
fd9a87a86a | ||
![]() |
1f9e7c8b39 | ||
![]() |
7772313a53 | ||
![]() |
7f0a35ab48 | ||
![]() |
35c733b7ee | ||
![]() |
aad68d8afd | ||
![]() |
d58a8b5469 | ||
![]() |
64ac97b2d6 | ||
![]() |
27c976bcc1 | ||
![]() |
d675d3bc7b | ||
![]() |
456c96921a | ||
![]() |
c2d7ba8ce5 | ||
![]() |
8801a04ebe | ||
![]() |
21b0acdec5 | ||
![]() |
c0a1bc32dd | ||
![]() |
4ea18168e3 | ||
![]() |
23c84e124c | ||
![]() |
678f0b86ee | ||
![]() |
defc9bc11b | ||
![]() |
363c8c91ee | ||
![]() |
088e9f7821 | ||
![]() |
7be079f504 | ||
![]() |
10ba5533e5 | ||
![]() |
433beed666 | ||
![]() |
56a87e559d | ||
![]() |
9d68f7c71a | ||
![]() |
e3f6069968 | ||
![]() |
de1286c7fc | ||
![]() |
c0a1d5cb67 | ||
![]() |
50f1b084ae | ||
![]() |
0d629b67b9 | ||
![]() |
7c902b4eb9 | ||
![]() |
9744b4d727 | ||
![]() |
34aecec9d4 | ||
![]() |
15ea31c389 | ||
![]() |
141e0d8f8c | ||
![]() |
2d2e8aec4c | ||
![]() |
c6f432566d | ||
![]() |
ae01ac08b6 | ||
![]() |
b5ab4ecdcb | ||
![]() |
cf7b669278 | ||
![]() |
53b688f014 | ||
![]() |
8ad5a0cf0e | ||
![]() |
e135f5a6b4 | ||
![]() |
97e6945c04 | ||
![]() |
93cb788e52 | ||
![]() |
88b0f1b2ab | ||
![]() |
a31b46f5e3 | ||
![]() |
6641d36b98 | ||
![]() |
e42d01898a | ||
![]() |
6cd4c55613 | ||
![]() |
cb09b7ce1e | ||
![]() |
96c6ff073f | ||
![]() |
28a20e1e7e | ||
![]() |
5f4c7423d0 | ||
![]() |
2bc4ed19e3 | ||
![]() |
8aa6439132 | ||
![]() |
b7558aca44 | ||
![]() |
55ff819dae | ||
![]() |
924d8508d0 | ||
![]() |
1b932f260a | ||
![]() |
5768ed4695 | ||
![]() |
f4cea168b1 | ||
![]() |
e2d00fdcd0 | ||
![]() |
103faa24f3 | ||
![]() |
d1bed05843 | ||
![]() |
2df3c563bf | ||
![]() |
ec02eb34fe | ||
![]() |
46dea718e6 | ||
![]() |
adf5a113fc | ||
![]() |
6a19ac31c0 | ||
![]() |
3c4ede96df | ||
![]() |
01f7e3a425 | ||
![]() |
da5a087891 | ||
![]() |
79883dc7cc | ||
![]() |
b283227046 | ||
![]() |
0e9cf1a519 | ||
![]() |
fdc30c6cd5 | ||
![]() |
3632294706 | ||
![]() |
929578192b | ||
![]() |
c18d5def26 | ||
![]() |
4e63aa4f14 | ||
![]() |
b51bfa3177 | ||
![]() |
c799160e86 | ||
![]() |
00d26dee2c | ||
![]() |
e9ea9786e9 | ||
![]() |
84ac7fe773 | ||
![]() |
a184cfd41e | ||
![]() |
76ac694542 | ||
![]() |
f70ba59ca0 | ||
![]() |
4a9a2850fc | ||
![]() |
4553a8eda2 | ||
![]() |
237d890f67 | ||
![]() |
04e131f93a | ||
![]() |
61e41f247b | ||
![]() |
6d00cb32b0 | ||
![]() |
939acc02a8 | ||
![]() |
e4c36236df | ||
![]() |
4381f31085 | ||
![]() |
171399889d | ||
![]() |
3bcdf84ad4 | ||
![]() |
8e8f7f23c9 | ||
![]() |
5b71912ab2 | ||
![]() |
34c6f6c7f3 | ||
![]() |
8a4e093f12 | ||
![]() |
ed14cf01c3 | ||
![]() |
b709452d16 | ||
![]() |
e1a2109a68 | ||
![]() |
392c6f8dde | ||
![]() |
7993dc3230 | ||
![]() |
b96eb01af3 | ||
![]() |
e1fa9e73d2 | ||
![]() |
c0d15f89e8 |
@ -1,22 +0,0 @@
|
||||
{
|
||||
"image": "mcr.microsoft.com/devcontainers/go:1",
|
||||
"features": {
|
||||
"ghcr.io/devcontainers/features/hugo:1": {
|
||||
"extended": true,
|
||||
"version": "0.116.1"
|
||||
},
|
||||
"ghcr.io/devcontainers/features/node:1": {}
|
||||
},
|
||||
"customizations": {
|
||||
"vscode": {
|
||||
"extensions": [
|
||||
"mhutchie.git-graph",
|
||||
"esbenp.prettier-vscode",
|
||||
"tamasfe.even-better-toml",
|
||||
"budparr.language-hugo-vscode"
|
||||
]
|
||||
}
|
||||
},
|
||||
"postCreateCommand": "npm install",
|
||||
"forwardPorts": [1313]
|
||||
}
|
72
.github/workflows/pages.yml
vendored
72
.github/workflows/pages.yml
vendored
@ -1,72 +0,0 @@
|
||||
# Sample workflow for building and deploying a Hugo site to GitHub Pages
|
||||
name: Deploy Hugo site to Pages
|
||||
|
||||
on:
|
||||
# Runs on pushes targeting the default branch
|
||||
push:
|
||||
branches: ["main"]
|
||||
|
||||
# Allows you to run this workflow manually from the Actions tab
|
||||
workflow_dispatch:
|
||||
|
||||
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
|
||||
permissions:
|
||||
contents: read
|
||||
pages: write
|
||||
id-token: write
|
||||
|
||||
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
|
||||
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
|
||||
concurrency:
|
||||
group: "pages"
|
||||
cancel-in-progress: false
|
||||
|
||||
# Default to bash
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
jobs:
|
||||
# Build job
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
HUGO_VERSION: 0.117.0
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: '1.20'
|
||||
- name: Setup Hugo
|
||||
uses: peaceiris/actions-hugo@v2
|
||||
with:
|
||||
hugo-version: ${{ env.HUGO_VERSION }}
|
||||
extended: true
|
||||
- name: Build with Hugo
|
||||
env:
|
||||
# For maximum backward compatibility with Hugo modules
|
||||
HUGO_ENVIRONMENT: production
|
||||
HUGO_ENV: production
|
||||
run: |
|
||||
hugo \
|
||||
--minify \
|
||||
--themesDir=../.. --source=exampleSite \
|
||||
--baseURL "https://imfing.github.io/hextra/"
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-pages-artifact@v2
|
||||
with:
|
||||
path: ./exampleSite/public
|
||||
|
||||
# Deployment job
|
||||
deploy:
|
||||
environment:
|
||||
name: github-pages
|
||||
url: ${{ steps.deployment.outputs.page_url }}
|
||||
runs-on: ubuntu-latest
|
||||
needs: build
|
||||
steps:
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v2
|
@ -1,4 +1,7 @@
|
||||
{
|
||||
"plugins": [
|
||||
"prettier-plugin-go-template"
|
||||
],
|
||||
"goTemplateBracketSpacing": true,
|
||||
"htmlWhitespaceSensitivity": "css",
|
||||
"printWidth": 200,
|
||||
|
4
.vscode/settings.json
vendored
4
.vscode/settings.json
vendored
@ -1,4 +0,0 @@
|
||||
{
|
||||
"editor.tabSize": 2,
|
||||
"css.customData": [".vscode/tailwind.json"]
|
||||
}
|
55
.vscode/tailwind.json
vendored
55
.vscode/tailwind.json
vendored
@ -1,55 +0,0 @@
|
||||
{
|
||||
"version": 1.1,
|
||||
"atDirectives": [
|
||||
{
|
||||
"name": "@tailwind",
|
||||
"description": "Use the `@tailwind` directive to insert Tailwind's `base`, `components`, `utilities` and `screens` styles into your CSS.",
|
||||
"references": [
|
||||
{
|
||||
"name": "Tailwind Documentation",
|
||||
"url": "https://tailwindcss.com/docs/functions-and-directives#tailwind"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "@apply",
|
||||
"description": "Use the `@apply` directive to inline any existing utility classes into your own custom CSS. This is useful when you find a common utility pattern in your HTML that you’d like to extract to a new component.",
|
||||
"references": [
|
||||
{
|
||||
"name": "Tailwind Documentation",
|
||||
"url": "https://tailwindcss.com/docs/functions-and-directives#apply"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "@responsive",
|
||||
"description": "You can generate responsive variants of your own classes by wrapping their definitions in the `@responsive` directive:\n```css\n@responsive {\n .alert {\n background-color: #E53E3E;\n }\n}\n```\n",
|
||||
"references": [
|
||||
{
|
||||
"name": "Tailwind Documentation",
|
||||
"url": "https://tailwindcss.com/docs/functions-and-directives#responsive"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "@screen",
|
||||
"description": "The `@screen` directive allows you to create media queries that reference your breakpoints by **name** instead of duplicating their values in your own CSS:\n```css\n@screen sm {\n /* ... */\n}\n```\n…gets transformed into this:\n```css\n@media (min-width: 640px) {\n /* ... */\n}\n```\n",
|
||||
"references": [
|
||||
{
|
||||
"name": "Tailwind Documentation",
|
||||
"url": "https://tailwindcss.com/docs/functions-and-directives#screen"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "@variants",
|
||||
"description": "Generate `hover`, `focus`, `active` and other **variants** of your own utilities by wrapping their definitions in the `@variants` directive:\n```css\n@variants hover, focus {\n .btn-brand {\n background-color: #3182CE;\n }\n}\n```\n",
|
||||
"references": [
|
||||
{
|
||||
"name": "Tailwind Documentation",
|
||||
"url": "https://tailwindcss.com/docs/functions-and-directives#variants"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
48
README.fa.md
Normal file
48
README.fa.md
Normal file
@ -0,0 +1,48 @@
|
||||
<div align="center">
|
||||
<h1 align="center">هگزترا</h1>
|
||||
<sup align="center"><a href="README.md">English</a> | <a href="README.zh-cn.md">简体中文</a> | <a href="README.fa.md">فارسی</a></sup>
|
||||
<p align="center">تم هیوگو مدرن، پاسخگو و دارای امکانات کامل برای ایجاد وبسایتهای استاتیک زیبا.</p>
|
||||
|
||||
نسخهی نمایشی → [imfing.github.io/hextra](https://imfing.github.io/hextra/fa)
|
||||
</div>
|
||||
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/5097752/263550533-c18343ca-3848-4230-b5c0-ee989d7916da.png">
|
||||
<img alt="Hextra" src="https://user-images.githubusercontent.com/5097752/263550528-663599f9-17a1-4686-b5c4-3da233b5034d.png">
|
||||
</picture>
|
||||
|
||||
<div align="right">
|
||||
<a href="https://github.com/imfing/hextra/actions/workflows/pages.yml"><img alt="GitHub Actions Status" src="https://github.com/imfing/hextra/actions/workflows/pages.yml/badge.svg"></a> <a href="https://app.netlify.com/sites/hugo-hextra/deploys"><img alt="Netlify Status" src="https://api.netlify.com/api/v1/badges/61d6e55a-2447-487e-b59f-c9537e5df175/deploy-status"></a>
|
||||
</div>
|
||||
|
||||
## ویژگیها
|
||||
|
||||
- **طراحی زیبا** - با الهام از Nextra، هگزترا از Tailwind CSS برای ارائه یک طراحی مدرن که سایت شما را برجسته میکند، استفاده میکند.
|
||||
- **طراحی واکنشگرا و حالت تیره** - در تمام دستگاهها، از تلفن همراه، تبلت تا دسکتاپ، عالی به نظر میرسد. حالت تیره نیز برای انطباق با شرایط مختلف روشنایی پشتیبانی میشود.
|
||||
- **سریع و سبک** - طراحی شده توسط Hugo، یک ایجادکننده سایت استاتیک سریع مثل رعد و برق که در یک فایل باینری قرار گرفته است، هگزترا ردپای خود را به حداقل میرساند. برای استفاده از آن به جاوااسکریپت یا Node.js نیازی ندارید.
|
||||
- **جستجوی متن کامل** - جستجوی متن کاملا آفلاین داخلی طراحی شده توسط FlexSearch، بدون نیاز به پیکربندی اضافی.
|
||||
- **امکانات کامل** - برای بهتر کردن محتوای شما مارکداون، برجستهکردن سینتکس، فرمولهای ریاضی LaTeX، نمودارها و عناصر Shortcodeها را شامل میشه. فهرست مطالب، بردکرامب، صفحهبندی، پیمایش نوار کناری و موارد دیگر همه به صورت خودکار تولید میشوند.
|
||||
- **چند زبانه و سئو آماده** - سایتهای چند زبانه با حالت چند زبانه Hugo راحت ساخته میشوند. پشتیبانی خارج از جعبه برای برچسبهای سئو، Open Graph و کارتهای توییتر گنجانده شده است.
|
||||
|
||||
## شروع کنید
|
||||
|
||||
### شروع سریع از طریق Template
|
||||
|
||||
استفاده از [Hextra Starter Template](https://github.com/imfing/hextra-starter-template) سادهترین روش برای راهاندازی سریع یک وبسایت جدید با تم هگزترا است. با کلیک بر روی دکمه "Use this template" در بالای صفحه مخزن شروع کنید.
|
||||
|
||||
مخزن تم همچنین شامل یک [گردش کار گیتهاب Actions](https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site#publishing-with-a-custom-github-actions-workflow) رای بهکاراندازی وبسایت شما در گیتهاب Pages است.
|
||||
|
||||
<img alt="Hextra Starter Template" src="https://user-images.githubusercontent.com/5097752/263551418-c403b9a9-a76c-47a6-8466-513d772ef0b7.jpg" width=600/>
|
||||
|
||||
### استفاده
|
||||
|
||||
برای اطلاعات بیشتر به بخش [مستندات](https://imfing.github.io/hextra/fa/docs) مراجعه کنید.
|
||||
|
||||
## مشارکت کردن
|
||||
|
||||
از مشارکت افراد جدید استقبال میکنیم.
|
||||
برای شروع، [راهنمای مشارکت](.github/CONTRIBUTING.md) را بررسی کنید.
|
||||
|
||||
## مجوز
|
||||
|
||||
[مجوز MIT](./LICENSE)
|
14
README.md
14
README.md
@ -1,5 +1,6 @@
|
||||
<div align="center">
|
||||
<h1 align="center">Hextra</h1>
|
||||
<sup align="center"><a href="README.md">English</a> | <a href="README.zh-cn.md">简体中文</a> | <a href="README.fa.md">فارسی</a></sup>
|
||||
<p align="center">Modern, responsive, batteries-included Hugo theme for creating beautiful static websites.</p>
|
||||
|
||||
Demo → [imfing.github.io/hextra](https://imfing.github.io/hextra/)
|
||||
@ -17,10 +18,10 @@ Demo → [imfing.github.io/hextra](https://imfing.github.io/hextra/)
|
||||
## Features
|
||||
|
||||
- **Beautiful Design** - Inspired by Nextra, Hextra utilizes Tailwind CSS to offer a modern design that makes your site look outstanding.
|
||||
- **Responsive Layout and Dark Mode** - It looks great on all devices, from mobile, tablet to desktop. Dark mode is also supported to accomodate various lighting conditions.
|
||||
- **Fast and Lightweight** - Powered by Hugo, a lightning-fast static-site generator housed in a single binary file, Hextra keeps its footprint minimal. No Javascript or Node.js are needed to use it.
|
||||
- **Full-text Search** - Built-in offline full-text search powered by FlexSearch, no additional configuration required.
|
||||
- **Battery-included** - Markdown, syntax highlighting, LaTeX math formulae, diagrams and Shortcodes elements to enhance your content. Table of contents, breadcumbs, pagination, sidebar navigation and more are all automatically generated.
|
||||
- **Responsive Layout and Dark Mode** - It looks great on all devices, from mobile to desktop. Dark mode is also supported to accommodate various lighting conditions.
|
||||
- **Fast and Lightweight** - Powered by Hugo, a lightning-fast static-site generator housed in a single binary file, Hextra keeps its footprint minimal. No JavaScript or Node.js are needed to use it.
|
||||
- **Full-text Search** - Built-in offline full-text search powered by FlexSearch, no extra configuration required.
|
||||
- **Battery-included** - Markdown, syntax highlighting, LaTeX math formulae, diagrams and Shortcodes elements to enhance your content. Table of contents, breadcrumbs, pagination, sidebar navigation and more are all automatically generated.
|
||||
- **Multi-language and SEO Ready** - Multi-language sites made easy with Hugo's multilingual mode. Out-of-the-box support is included for SEO tags, Open Graph, and Twitter Cards.
|
||||
|
||||
## Quick Start
|
||||
@ -31,13 +32,16 @@ Using the [Hextra Starter Template](https://github.com/imfing/hextra-starter-tem
|
||||
|
||||
The template repository also includes a [GitHub Actions workflow](https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site#publishing-with-a-custom-github-actions-workflow) for deploying your website to GitHub Pages.
|
||||
|
||||
<img alt="Hextra Starter Template" src="https://user-images.githubusercontent.com/5097752/263551418-c403b9a9-a76c-47a6-8466-513d772ef0b7.jpg" width=600/>
|
||||
|
||||
### Usage
|
||||
|
||||
Refer to the [documentation](https://imfing.github.io/hextra/docs) for more information.
|
||||
|
||||
## Contributing
|
||||
|
||||
This project is actively under development. Contributions are welcome!
|
||||
Contributions are welcome.
|
||||
Check out the [contributing guide](.github/CONTRIBUTING.md) to get started.
|
||||
|
||||
## License
|
||||
|
||||
|
45
README.zh-cn.md
Normal file
45
README.zh-cn.md
Normal file
@ -0,0 +1,45 @@
|
||||
<div align="center">
|
||||
<h1 align="center">Hextra</h1>
|
||||
<sup align="center"><a href="README.md">English</a> | <a href="README.zh-cn.md">简体中文</a> | <a href="README.fa.md">فارسی</a></sup>
|
||||
<p align="center">用于创建美观的静态站点的现代化, 响应式, 功能强大的 Hugo 主题.</p>
|
||||
|
||||
演示 → [imfing.github.io/hextra](https://imfing.github.io/hextra/)
|
||||
</div>
|
||||
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/5097752/263550533-c18343ca-3848-4230-b5c0-ee989d7916da.png">
|
||||
<img alt="Hextra" src="https://user-images.githubusercontent.com/5097752/263550528-663599f9-17a1-4686-b5c4-3da233b5034d.png">
|
||||
</picture>
|
||||
|
||||
<div align="right">
|
||||
<a href="https://github.com/imfing/hextra/actions/workflows/pages.yml"><img alt="GitHub Actions Status" src="https://github.com/imfing/hextra/actions/workflows/pages.yml/badge.svg"></a> <a href="https://app.netlify.com/sites/hugo-hextra/deploys"><img alt="Netlify Status" src="https://api.netlify.com/api/v1/badges/61d6e55a-2447-487e-b59f-c9537e5df175/deploy-status"></a>
|
||||
</div>
|
||||
|
||||
## 特性
|
||||
|
||||
- **美观的设计** - 受 Nextra 的启发,Hextra 利用 Tailwind CSS 提供现代化的设计,使您的网站看起来美观有加.
|
||||
- **响应式布局和深色模式支持** - 在任何设备上看起来都足够美观, 无论是手机, 平板电脑或者电脑. 深色模式的支持使 Hextra 可以应对各种照明环境.
|
||||
- **快速且轻量** - 由 Hugo 强力支持, Hugo 是一个快如闪电的静态站点生成器, 这一切都只需一个可执行文件, Hextra 始终保持最小化, 无需 Javascript 或者 Node.js.
|
||||
- **全文搜索** - 集成了 Flexsearch 的全文搜索, 无需额外的配置.
|
||||
- **功能齐全** - Markdown, 代码高亮, LaTex 数学公式, diagrams 图表和 Shortcodes 都可以用于丰富你的内容. 目录, 面包屑导航, 分页, 侧边栏等均由 Hextra 自动生成。
|
||||
- **多语言和 SEO Ready** - Hugo 的多语言模式使得构建多语言网站更简单. 具有 SEO tags, Open Graph, 和 Twitter Cards 等诸多开箱即用的功能.
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 使用模板
|
||||
|
||||
使用 [Hextra stater template](https://github.com/imfing/hextra-starter-template) 是使用 Hextra 主题的最简单方法. 点击仓库页面上的 `Use this template` 按钮开始使用.
|
||||
|
||||
此仓库中包含一个 [GitHub Actions workflow](https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site#publishing-with-a-custom-github-actions-workflow) 来帮助你免费在 GitHub Pages 上自动构建和部署网站.
|
||||
|
||||
### 使用
|
||||
|
||||
转至[文档](https://imfing.github.io/hextra/zh-cn/docs)
|
||||
|
||||
## 贡献
|
||||
|
||||
该项目正在积极开发中. 欢迎贡献!
|
||||
|
||||
## 许可证
|
||||
|
||||
[MIT License](./LICENSE)
|
@ -74,7 +74,7 @@
|
||||
/* CommentPreprocFile */ .chroma .cpf { color: #8b949e; font-weight: bold; font-style: italic }
|
||||
/* Generic */ .chroma .g { }
|
||||
/* GenericDeleted */ .chroma .gd { color: #ffa198; background-color: #490202 }
|
||||
/* GenericEmph */ .chroma .ge { font-style: italic }
|
||||
/* GenericEmph */ .chroma .ge { color: inherit; font-style: italic }
|
||||
/* GenericError */ .chroma .gr { color: #ffa198 }
|
||||
/* GenericHeading */ .chroma .gh { color: #79c0ff; font-weight: bold }
|
||||
/* GenericInserted */ .chroma .gi { color: #56d364; background-color: #0f5323 }
|
||||
|
File diff suppressed because it is too large
Load Diff
3
assets/css/components/badge.css
Normal file
3
assets/css/components/badge.css
Normal file
@ -0,0 +1,3 @@
|
||||
.hextra-badge {
|
||||
@apply hx-inline-flex hx-items-center;
|
||||
}
|
@ -1,5 +1,9 @@
|
||||
.hextra-cards {
|
||||
grid-template-columns: repeat(auto-fill, minmax(max(250px, calc((100% - 1rem * 2) / var(--rows))), 1fr));
|
||||
grid-template-columns: repeat(auto-fill, minmax(max(250px, calc((100% - 1rem * 2) / var(--hextra-cards-grid-cols))), 1fr));
|
||||
}
|
||||
|
||||
.hextra-card {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.hextra-card img {
|
||||
@ -18,6 +22,7 @@
|
||||
|
||||
.hextra-card p {
|
||||
margin-top: 0.5rem;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.dark .hextra-card svg {
|
||||
@ -27,3 +32,10 @@
|
||||
.dark .hextra-card:hover svg {
|
||||
color: currentColor;
|
||||
}
|
||||
|
||||
.hextra-card-tag {
|
||||
position: absolute;
|
||||
top: 5px;
|
||||
right: 5px;
|
||||
z-index: 10;
|
||||
}
|
||||
|
7
assets/css/components/code-copy.css
Normal file
7
assets/css/components/code-copy.css
Normal file
@ -0,0 +1,7 @@
|
||||
@supports (
|
||||
(-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))
|
||||
) {
|
||||
.hextra-code-copy-btn {
|
||||
@apply hx-backdrop-blur-md hx-bg-opacity-[.85] dark:hx-bg-opacity-80;
|
||||
}
|
||||
}
|
5
assets/css/components/hextra/feature-grid.css
Normal file
5
assets/css/components/hextra/feature-grid.css
Normal file
@ -0,0 +1,5 @@
|
||||
.hextra-feature-grid {
|
||||
@media (min-width: 1024px) {
|
||||
grid-template-columns: repeat(var(--hextra-feature-grid-cols), minmax(0, 1fr));
|
||||
}
|
||||
}
|
17
assets/css/components/jupyter.css
Normal file
17
assets/css/components/jupyter.css
Normal file
@ -0,0 +1,17 @@
|
||||
.hextra-jupyter-code-cell {
|
||||
scrollbar-gutter: auto;
|
||||
|
||||
@apply hx-mt-6;
|
||||
|
||||
.hextra-jupyter-code-cell-outputs-container {
|
||||
@apply hx-text-xs hx-overflow-hidden;
|
||||
|
||||
.hextra-jupyter-code-cell-outputs {
|
||||
@apply hx-overflow-auto hx-max-h-[50vh];
|
||||
|
||||
pre {
|
||||
@apply hx-text-xs hx-overflow-auto hx-max-w-full;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,12 +1,20 @@
|
||||
nav {
|
||||
.search-wrapper {
|
||||
@apply hidden md:inline-block;
|
||||
@apply hx-hidden md:hx-inline-block;
|
||||
}
|
||||
}
|
||||
|
||||
@supports (
|
||||
(-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))
|
||||
) {
|
||||
.nav-container-blur {
|
||||
@apply hx-backdrop-blur-md hx-bg-white/[.85] dark:!hx-bg-dark/80;
|
||||
}
|
||||
}
|
||||
|
||||
.hamburger-menu svg {
|
||||
g {
|
||||
@apply origin-center;
|
||||
@apply hx-origin-center;
|
||||
transition: transform 0.2s cubic-bezier(0.25, 1, 0.5, 1);
|
||||
}
|
||||
path {
|
||||
@ -29,16 +37,16 @@ nav {
|
||||
|
||||
&.open > {
|
||||
path {
|
||||
@apply opacity-0;
|
||||
@apply hx-opacity-0;
|
||||
}
|
||||
g:nth-of-type(1) {
|
||||
@apply rotate-45;
|
||||
@apply hx-rotate-45;
|
||||
path {
|
||||
transform: translate3d(0, 4px, 0);
|
||||
}
|
||||
}
|
||||
g:nth-of-type(2) {
|
||||
@apply -rotate-45;
|
||||
@apply -hx-rotate-45;
|
||||
path {
|
||||
transform: translate3d(0, -4px, 0);
|
||||
}
|
||||
|
21
assets/css/components/scrollbar.css
Normal file
21
assets/css/components/scrollbar.css
Normal file
@ -0,0 +1,21 @@
|
||||
.hextra-scrollbar, .hextra-scrollbar * {
|
||||
scrollbar-width: thin; /* Firefox */
|
||||
scrollbar-color: oklch(55.55% 0 0 / 40%) transparent; /* Firefox */
|
||||
|
||||
scrollbar-gutter: stable;
|
||||
&::-webkit-scrollbar {
|
||||
@apply hx-w-3 hx-h-3;
|
||||
}
|
||||
&::-webkit-scrollbar-track {
|
||||
@apply hx-bg-transparent;
|
||||
}
|
||||
&::-webkit-scrollbar-thumb {
|
||||
@apply hx-rounded-[10px];
|
||||
}
|
||||
&:hover::-webkit-scrollbar-thumb {
|
||||
border: 3px solid transparent;
|
||||
background-color: var(--tw-shadow-color);
|
||||
background-clip: content-box;
|
||||
@apply hx-shadow-neutral-500/20 hover:hx-shadow-neutral-500/40;
|
||||
}
|
||||
}
|
@ -1,31 +1,31 @@
|
||||
.search-wrapper {
|
||||
li {
|
||||
@apply mx-2.5 break-words rounded-md contrast-more:border text-gray-800 contrast-more:border-transparent dark:text-gray-300;
|
||||
@apply hx-mx-2.5 hx-break-words hx-rounded-md contrast-more:hx-border hx-text-gray-800 contrast-more:hx-border-transparent dark:hx-text-gray-300;
|
||||
a {
|
||||
@apply block scroll-m-12 px-2.5 py-2;
|
||||
@apply hx-block hx-scroll-m-12 hx-px-2.5 hx-py-2;
|
||||
}
|
||||
|
||||
.title {
|
||||
@apply text-base font-semibold leading-5;
|
||||
@apply hx-text-base hx-font-semibold hx-leading-5;
|
||||
}
|
||||
|
||||
.active {
|
||||
@apply rounded-md bg-primary-500/10 contrast-more:border-primary-500;
|
||||
@apply hx-rounded-md hx-bg-primary-500/10 contrast-more:hx-border-primary-500;
|
||||
}
|
||||
}
|
||||
|
||||
.no-result {
|
||||
@apply block select-none p-8 text-center text-sm text-gray-400;
|
||||
@apply hx-block hx-select-none hx-p-8 hx-text-center hx-text-sm hx-text-gray-400;
|
||||
}
|
||||
|
||||
.prefix {
|
||||
@apply mx-2.5 mb-2 mt-6 select-none border-b border-black/10 px-2.5 pb-1.5 text-xs font-semibold
|
||||
uppercase text-gray-500 first:mt-0 dark:border-white/20 dark:text-gray-300 contrast-more:border-gray-600
|
||||
contrast-more:text-gray-900 contrast-more:dark:border-gray-50 contrast-more:dark:text-gray-50;
|
||||
@apply hx-mx-2.5 hx-mb-2 hx-mt-6 hx-select-none hx-border-b hx-border-black/10 hx-px-2.5 hx-pb-1.5 hx-text-xs hx-font-semibold
|
||||
hx-uppercase hx-text-gray-500 first:hx-mt-0 dark:hx-border-white/20 dark:hx-text-gray-300 contrast-more:hx-border-gray-600
|
||||
contrast-more:hx-text-gray-900 contrast-more:dark:hx-border-gray-50 contrast-more:dark:hx-text-gray-50;
|
||||
}
|
||||
|
||||
.excerpt {
|
||||
@apply overflow-hidden text-ellipsis mt-1 text-sm leading-[1.35rem] text-gray-600 dark:text-gray-400 contrast-more:dark:text-gray-50;
|
||||
@apply hx-overflow-hidden hx-text-ellipsis hx-mt-1 hx-text-sm hx-leading-[1.35rem] hx-text-gray-600 dark:hx-text-gray-400 contrast-more:dark:hx-text-gray-50;
|
||||
display: -webkit-box;
|
||||
line-clamp: 1;
|
||||
-webkit-line-clamp: 1;
|
||||
@ -33,6 +33,6 @@
|
||||
}
|
||||
|
||||
.match {
|
||||
@apply text-primary-600;
|
||||
@apply hx-text-primary-600;
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
@media (max-width: 767px) {
|
||||
.sidebar-container {
|
||||
@apply fixed pt-[calc(var(--navbar-height))] top-0 w-full bottom-0 z-[15] overscroll-contain bg-white dark:bg-dark;
|
||||
@apply hx-fixed hx-pt-[calc(var(--navbar-height))] hx-top-0 hx-w-full hx-bottom-0 hx-z-[15] hx-overscroll-contain hx-bg-white dark:hx-bg-dark;
|
||||
transition: transform 0.8s cubic-bezier(0.52, 0.16, 0.04, 1);
|
||||
will-change: transform, opacity;
|
||||
contain: layout style;
|
||||
@ -10,12 +10,12 @@
|
||||
|
||||
.sidebar-container {
|
||||
li > div {
|
||||
@apply h-0;
|
||||
@apply hx-h-0;
|
||||
}
|
||||
li.open > div {
|
||||
@apply h-auto;
|
||||
@apply hx-h-auto hx-pt-1;
|
||||
}
|
||||
li.open > a > span > svg > path {
|
||||
@apply rotate-90;
|
||||
@apply hx-rotate-90;
|
||||
}
|
||||
}
|
||||
|
@ -2,10 +2,16 @@
|
||||
counter-increment: step;
|
||||
|
||||
&:before {
|
||||
@apply absolute w-[33px] h-[33px];
|
||||
@apply border-4 border-white bg-gray-100 dark:border-dark dark:bg-neutral-800;
|
||||
@apply rounded-full text-neutral-400 text-base font-normal text-center -indent-px;
|
||||
@apply mt-[3px] ml-[-41px];
|
||||
@apply hx-absolute hx-w-[33px] hx-h-[33px];
|
||||
@apply hx-border-4 hx-border-white hx-bg-gray-100 dark:hx-border-dark dark:hx-bg-neutral-800;
|
||||
@apply hx-rounded-full hx-text-neutral-400 hx-text-base hx-font-normal hx-text-center -hx-indent-px;
|
||||
@apply hx-mt-[3px] ltr:hx-ml-[-41px] rtl:hx-mr-[-44px];
|
||||
content: counter(step);
|
||||
}
|
||||
}
|
||||
|
||||
:lang(fa) .steps h3 {
|
||||
&:before {
|
||||
content: counter(step, persian);
|
||||
}
|
||||
}
|
||||
|
@ -2,47 +2,52 @@
|
||||
@import "chroma/light.css";
|
||||
@import "chroma/dark.css";
|
||||
|
||||
.code-block {
|
||||
@apply text-[.9em] leading-5;
|
||||
.hextra-code-block {
|
||||
@apply hx-text-[.9em] hx-leading-5;
|
||||
|
||||
pre {
|
||||
@apply text-[.9em] bg-primary-700/5 overflow-x-auto font-medium subpixel-antialiased dark:bg-primary-300/10 contrast-more:border contrast-more:border-primary-900/20 contrast-more:contrast-150 contrast-more:dark:border-primary-100/40;
|
||||
@apply hx-text-[.9em] hx-bg-primary-700/5 hx-overflow-x-auto hx-font-medium hx-subpixel-antialiased dark:hx-bg-primary-300/10 contrast-more:hx-border contrast-more:hx-border-primary-900/20 contrast-more:hx-contrast-150 contrast-more:dark:hx-border-primary-100/40;
|
||||
}
|
||||
|
||||
.filename {
|
||||
@apply absolute top-0 z-[1] w-full truncate rounded-t-xl bg-primary-700/5 py-2 px-4 text-xs text-gray-700 dark:bg-primary-300/10 dark:text-gray-200;
|
||||
@apply hx-absolute hx-top-0 hx-z-[1] hx-w-full hx-truncate hx-rounded-t-xl hx-bg-primary-700/5 hx-py-2 hx-px-4 hx-text-xs hx-text-gray-700 dark:hx-bg-primary-300/10 dark:hx-text-gray-200;
|
||||
}
|
||||
|
||||
.filename + pre:not(.lntable pre) {
|
||||
/* Override padding for code blocks with filename but no highlight */
|
||||
@apply hx-pt-12;
|
||||
}
|
||||
}
|
||||
|
||||
.code-block pre:not(.lntable pre) {
|
||||
@apply px-4 mb-4 py-4 rounded-xl;
|
||||
.hextra-code-block pre:not(.lntable pre) {
|
||||
@apply hx-px-4 hx-mb-4 hx-py-4 hx-rounded-xl;
|
||||
}
|
||||
|
||||
.code-block div:nth-of-type(2) pre {
|
||||
@apply pt-12 pb-4;
|
||||
.hextra-code-block div:nth-of-type(2) pre {
|
||||
@apply hx-pt-12 hx-pb-4;
|
||||
}
|
||||
|
||||
.chroma {
|
||||
.lntable {
|
||||
@apply m-0 block w-auto overflow-auto rounded-xl;
|
||||
@apply hx-m-0 hx-block hx-w-auto hx-overflow-auto hx-rounded-xl;
|
||||
|
||||
pre {
|
||||
@apply pt-4 pb-4;
|
||||
@apply hx-pt-4 hx-pb-4;
|
||||
}
|
||||
}
|
||||
.ln,
|
||||
.lnt:not(.hl > .lnt),
|
||||
.hl {
|
||||
@apply pl-4 pr-4 min-w-[2.6rem] text-neutral-600 dark:text-neutral-300;
|
||||
.hl:not(.line) {
|
||||
@apply hx-pl-4 hx-pr-4 hx-min-w-[2.6rem] hx-text-neutral-600 dark:hx-text-neutral-300;
|
||||
}
|
||||
.lntd {
|
||||
@apply p-0 align-top;
|
||||
@apply hx-p-0 hx-align-top;
|
||||
}
|
||||
.lntd:last-of-type {
|
||||
@apply w-full;
|
||||
@apply hx-w-full;
|
||||
}
|
||||
/* LineHighlight */
|
||||
.hl {
|
||||
@apply block w-full bg-primary-800/10;
|
||||
@apply hx-block hx-w-full hx-bg-primary-800/10;
|
||||
}
|
||||
}
|
||||
|
@ -1,3 +1,5 @@
|
||||
@import "tailwind.css";
|
||||
|
||||
@import "typography.css";
|
||||
@import "highlight.css";
|
||||
@import "components/cards.css";
|
||||
@ -5,27 +7,32 @@
|
||||
@import "components/search.css";
|
||||
@import "components/sidebar.css";
|
||||
@import "components/navbar.css";
|
||||
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
@import "components/scrollbar.css";
|
||||
@import "components/code-copy.css";
|
||||
@import "components/hextra/feature-grid.css";
|
||||
@import "components/jupyter.css";
|
||||
@import "components/badge.css";
|
||||
|
||||
html {
|
||||
@apply text-base antialiased;
|
||||
@apply hx-text-base hx-antialiased;
|
||||
font-feature-settings: "rlig" 1, "calt" 1, "ss01" 1;
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
}
|
||||
|
||||
body {
|
||||
@apply w-full bg-white dark:bg-dark dark:text-gray-100;
|
||||
@apply hx-w-full hx-bg-white dark:hx-bg-dark dark:hx-text-gray-100;
|
||||
}
|
||||
|
||||
:root {
|
||||
--primary-hue: 212deg;
|
||||
--primary-saturation: 100%;
|
||||
--primary-lightness: 50%;
|
||||
--navbar-height: 4rem;
|
||||
--menu-height: 3.75rem;
|
||||
}
|
||||
|
||||
.dark {
|
||||
--primary-hue: 204deg;
|
||||
--primary-saturation: 100%;
|
||||
--primary-lightness: 50%;
|
||||
}
|
||||
|
3
assets/css/tailwind.css
Normal file
3
assets/css/tailwind.css
Normal file
@ -0,0 +1,3 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
@ -1,154 +1,133 @@
|
||||
.content {
|
||||
h1 {
|
||||
@apply mt-2 text-4xl font-bold tracking-tight text-slate-900 dark:text-slate-100;
|
||||
:where(h1):not(:where([class~=not-prose],[class~=not-prose] *)) {
|
||||
@apply hx-mt-2 hx-text-4xl hx-font-bold hx-tracking-tight hx-text-slate-900 dark:hx-text-slate-100;
|
||||
}
|
||||
h2 {
|
||||
@apply font-semibold tracking-tight text-slate-900 dark:text-slate-100 mt-10 border-b pb-1 text-3xl border-neutral-200/70 contrast-more:border-neutral-400 dark:border-primary-100/10 contrast-more:dark:border-neutral-400;
|
||||
:where(h2):not(:where([class~=not-prose],[class~=not-prose] *)) {
|
||||
@apply hx-font-semibold hx-tracking-tight hx-text-slate-900 dark:hx-text-slate-100 hx-mt-10 hx-border-b hx-pb-1 hx-text-3xl hx-border-neutral-200/70 contrast-more:hx-border-neutral-400 dark:hx-border-primary-100/10 contrast-more:dark:hx-border-neutral-400;
|
||||
}
|
||||
h3 {
|
||||
@apply font-semibold tracking-tight text-slate-900 dark:text-slate-100 mt-8 text-2xl;
|
||||
:where(h3):not(:where([class~=not-prose],[class~=not-prose] *)) {
|
||||
@apply hx-font-semibold hx-tracking-tight hx-text-slate-900 dark:hx-text-slate-100 hx-mt-8 hx-text-2xl;
|
||||
}
|
||||
h4 {
|
||||
@apply font-semibold tracking-tight text-slate-900 dark:text-slate-100 mt-8 text-xl;
|
||||
:where(h4):not(:where([class~=not-prose],[class~=not-prose] *)) {
|
||||
@apply hx-font-semibold hx-tracking-tight hx-text-slate-900 dark:hx-text-slate-100 hx-mt-8 hx-text-xl;
|
||||
}
|
||||
h5 {
|
||||
@apply font-semibold tracking-tight text-slate-900 dark:text-slate-100 mt-8 text-lg;
|
||||
:where(h5):not(:where([class~=not-prose],[class~=not-prose] *)) {
|
||||
@apply hx-font-semibold hx-tracking-tight hx-text-slate-900 dark:hx-text-slate-100 hx-mt-8 hx-text-lg;
|
||||
}
|
||||
h6 {
|
||||
@apply font-semibold tracking-tight text-slate-900 dark:text-slate-100 mt-8 text-base;
|
||||
:where(h6):not(:where([class~=not-prose],[class~=not-prose] *)) {
|
||||
@apply hx-font-semibold hx-tracking-tight hx-text-slate-900 dark:hx-text-slate-100 hx-mt-8 hx-text-base;
|
||||
}
|
||||
p {
|
||||
@apply mt-6 leading-7 first:mt-0;
|
||||
:where(p):not(:where([class~=not-prose],[class~=not-prose] *)) {
|
||||
@apply hx-mt-6 hx-leading-7 first:hx-mt-0;
|
||||
}
|
||||
a {
|
||||
@apply text-primary-600 underline decoration-from-font [text-underline-position:from-font];
|
||||
:where(a):not(:where([class~=not-prose],[class~=not-prose] *)) {
|
||||
@apply hx-text-primary-600 hx-underline hx-decoration-from-font [text-underline-position:from-font];
|
||||
}
|
||||
.not-prose a {
|
||||
@apply text-current no-underline;
|
||||
:where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)) {
|
||||
@apply hx-mt-6 hx-border-gray-300 hx-italic hx-text-gray-700 dark:hx-border-gray-700 dark:hx-text-gray-400 first:hx-mt-0 ltr:hx-border-l-2 ltr:hx-pl-6 rtl:hx-border-r-2 rtl:hx-pr-6;
|
||||
}
|
||||
blockquote {
|
||||
@apply mt-6 border-gray-300 italic text-gray-700 dark:border-gray-700 dark:text-gray-400 first:mt-0 ltr:border-l-2 ltr:pl-6 rtl:border-r-2 rtl:pr-6;
|
||||
:where(pre):not(:where(.hextra-code-block pre, [class~=not-prose],[class~=not-prose] *)) {
|
||||
@apply hx-bg-primary-700/5 hx-mb-4 hx-overflow-x-auto hx-rounded-xl hx-font-medium hx-subpixel-antialiased dark:hx-bg-primary-300/10 hx-text-[.9em] contrast-more:hx-border contrast-more:hx-border-primary-900/20 contrast-more:hx-contrast-150 contrast-more:dark:hx-border-primary-100/40 hx-py-4;
|
||||
}
|
||||
pre:not(.code-block pre) {
|
||||
@apply bg-primary-700/5 mb-4 overflow-x-auto rounded-xl font-medium subpixel-antialiased dark:bg-primary-300/10 text-[.9em] contrast-more:border contrast-more:border-primary-900/20 contrast-more:contrast-150 contrast-more:dark:border-primary-100/40 py-4;
|
||||
:where(code):not(:where(.hextra-code-block code, [class~=not-prose],[class~=not-prose] *)) {
|
||||
@apply hx-border-black hx-border-opacity-[0.04] hx-bg-opacity-[0.03] hx-bg-black hx-break-words hx-rounded-md hx-border hx-py-0.5 hx-px-[.25em] hx-text-[.9em] dark:hx-border-white/10 dark:hx-bg-white/10;
|
||||
}
|
||||
code:not(.code-block code) {
|
||||
@apply border-black border-opacity-[0.04] bg-opacity-[0.03] bg-black break-words rounded-md border py-0.5 px-[.25em] text-[.9em] dark:border-white/10 dark:bg-white/10;
|
||||
}
|
||||
table:not(.code-block table) {
|
||||
@apply block overflow-x-auto mt-6 p-0 first:mt-0;
|
||||
:where(table):not(:where(.hextra-code-block table, [class~=not-prose],[class~=not-prose] *)) {
|
||||
@apply hx-block hx-overflow-x-auto hx-mt-6 hx-p-0 first:hx-mt-0;
|
||||
|
||||
tr {
|
||||
@apply m-0 border-t border-gray-300 p-0 dark:border-gray-600 even:bg-gray-100 even:dark:bg-gray-600/20;
|
||||
@apply hx-m-0 hx-border-t hx-border-gray-300 hx-p-0 dark:hx-border-gray-600 even:hx-bg-gray-100 even:dark:hx-bg-gray-600/20;
|
||||
}
|
||||
th {
|
||||
@apply m-0 border border-gray-300 px-4 py-2 font-semibold dark:border-gray-600;
|
||||
@apply hx-m-0 hx-border hx-border-gray-300 hx-px-4 hx-py-2 hx-font-semibold dark:hx-border-gray-600;
|
||||
}
|
||||
td {
|
||||
@apply m-0 border border-gray-300 px-4 py-2 dark:border-gray-600;
|
||||
@apply hx-m-0 hx-border hx-border-gray-300 hx-px-4 hx-py-2 dark:hx-border-gray-600;
|
||||
}
|
||||
}
|
||||
ol {
|
||||
@apply mt-6 list-decimal first:mt-0 ltr:ml-6 rtl:mr-6;
|
||||
:where(ol):not(:where([class~=not-prose],[class~=not-prose] *)) {
|
||||
@apply hx-mt-6 hx-list-decimal first:hx-mt-0 ltr:hx-ml-6 rtl:hx-mr-6;
|
||||
li {
|
||||
@apply my-2;
|
||||
@apply hx-my-2;
|
||||
}
|
||||
}
|
||||
ul {
|
||||
@apply mt-6 list-disc first:mt-0 ltr:ml-6 rtl:mr-6;
|
||||
:where(ul):not(:where([class~=not-prose],[class~=not-prose] *)) {
|
||||
@apply hx-mt-6 hx-list-disc first:hx-mt-0 ltr:hx-ml-6 rtl:hx-mr-6;
|
||||
li {
|
||||
@apply my-2;
|
||||
@apply hx-my-2;
|
||||
}
|
||||
}
|
||||
.not-prose ul, .not-prose ol {
|
||||
@apply m-0 list-none;
|
||||
li {
|
||||
@apply m-0;
|
||||
}
|
||||
/* This CSS rule targets the first nested unordered (ul) or ordered (ol) list
|
||||
inside the list item (li) of any parent ul or ol.
|
||||
The rule sets the top margin of the selected list to zero. */
|
||||
:where(ul, ol) > li > :where(ul, ol):not(:where([class~=not-prose],[class~=not-prose] *)) {
|
||||
@apply hx-mt-0;
|
||||
}
|
||||
kbd {
|
||||
@apply border-black border-opacity-[0.04] bg-opacity-[0.03] bg-black break-words rounded-md border py-0.5 px-[.25em] text-[.9em] dark:border-white/10 dark:bg-white/10;
|
||||
:where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)) {
|
||||
@apply hx-border-black hx-border-opacity-[0.04] hx-bg-opacity-[0.03] hx-bg-black hx-break-words hx-rounded-md hx-border hx-py-0.5 hx-px-[.25em] hx-text-[.9em] dark:hx-border-white/10 dark:hx-bg-white/10;
|
||||
}
|
||||
pre:not(.code-block pre).mermaid {
|
||||
@apply bg-transparent rounded-none dark:bg-transparent;
|
||||
:where(pre.mermaid):not(:where(.hextra-code-block pre, [class~=not-prose],[class~=not-prose] *)) {
|
||||
@apply hx-bg-transparent hx-rounded-none dark:hx-bg-transparent;
|
||||
}
|
||||
img {
|
||||
@apply mx-auto my-4 rounded-md;
|
||||
:where(img):not(:where([class~=not-prose],[class~=not-prose] *)) {
|
||||
@apply hx-mx-auto hx-my-4 hx-rounded-md;
|
||||
}
|
||||
.not-prose img {
|
||||
@apply m-0 rounded-none;
|
||||
}
|
||||
figure {
|
||||
:where(figure):not(:where([class~=not-prose],[class~=not-prose] *)) {
|
||||
figcaption {
|
||||
@apply text-sm text-gray-500 dark:text-gray-400 mt-2 block text-center;
|
||||
@apply hx-text-sm hx-text-gray-500 dark:hx-text-gray-400 hx-mt-2 hx-block hx-text-center;
|
||||
}
|
||||
}
|
||||
/* Definition list */
|
||||
:where(dl):not(:where([class~=not-prose],[class~=not-prose] *)) {
|
||||
dt {
|
||||
@apply hx-mt-6 hx-font-semibold;
|
||||
}
|
||||
dd {
|
||||
@apply hx-my-2 hx-ps-6;
|
||||
}
|
||||
}
|
||||
.footnotes {
|
||||
@apply mt-12 text-sm;
|
||||
@apply hx-mt-12 hx-text-sm;
|
||||
}
|
||||
}
|
||||
|
||||
.subheading-anchor {
|
||||
@apply opacity-0 transition-opacity ltr:ml-1 rtl:mr-1;
|
||||
@apply hx-opacity-0 hx-transition-opacity ltr:hx-ml-1 rtl:hx-mr-1;
|
||||
|
||||
span:target + &,
|
||||
:hover > &,
|
||||
&:focus {
|
||||
@apply opacity-100;
|
||||
@apply hx-opacity-100;
|
||||
}
|
||||
|
||||
span + &,
|
||||
:hover > & {
|
||||
@apply !no-underline;
|
||||
@apply !hx-no-underline;
|
||||
}
|
||||
|
||||
&:after {
|
||||
@apply content-['#'] px-1;
|
||||
@apply text-gray-300 dark:text-neutral-700;
|
||||
@apply hx-content-['#'] hx-px-1;
|
||||
@apply hx-text-gray-300 dark:hx-text-neutral-700;
|
||||
span:target + & {
|
||||
@apply text-gray-400;
|
||||
@apply dark:text-neutral-500;
|
||||
@apply hx-text-gray-400;
|
||||
@apply dark:hx-text-neutral-500;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
article.typesetting-article {
|
||||
font-size: 17px;
|
||||
font-feature-settings:
|
||||
'rlig' 1,
|
||||
'calt' 1;
|
||||
h1 {
|
||||
@apply mt-6 mb-4 text-center;
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
h2 {
|
||||
@apply border-none;
|
||||
}
|
||||
a {
|
||||
@apply no-underline hover:underline;
|
||||
}
|
||||
p {
|
||||
@apply leading-8;
|
||||
}
|
||||
code {
|
||||
@apply border-none dark:bg-neutral-700;
|
||||
}
|
||||
pre code {
|
||||
@apply dark:bg-transparent;
|
||||
}
|
||||
.subheading-anchor + a {
|
||||
@apply no-underline hover:no-underline after:hidden;
|
||||
}
|
||||
}
|
||||
|
||||
article details > summary {
|
||||
&::-webkit-details-marker {
|
||||
@apply hidden;
|
||||
@apply hx-hidden;
|
||||
}
|
||||
&::before {
|
||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z' clip-rule='evenodd' /%3E%3C/svg%3E");
|
||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='hx-h-5 hx-w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z' clip-rule='evenodd' /%3E%3C/svg%3E");
|
||||
height: 1.2em;
|
||||
width: 1.2em;
|
||||
vertical-align: -4px;
|
||||
padding: 0 0.6em;
|
||||
}
|
||||
}
|
||||
|
||||
:lang(fa) ol {
|
||||
list-style-type: persian;
|
||||
}
|
||||
|
22
assets/js/back-to-top.js
Normal file
22
assets/js/back-to-top.js
Normal file
@ -0,0 +1,22 @@
|
||||
// Back to top button
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
const backToTop = document.querySelector("#backToTop");
|
||||
if (backToTop) {
|
||||
document.addEventListener("scroll", (e) => {
|
||||
if (window.scrollY > 300) {
|
||||
backToTop.classList.remove("hx-opacity-0");
|
||||
} else {
|
||||
backToTop.classList.add("hx-opacity-0");
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
function scrollUp() {
|
||||
window.scroll({
|
||||
top: 0,
|
||||
left: 0,
|
||||
behavior: "smooth",
|
||||
});
|
||||
}
|
@ -1,30 +1,66 @@
|
||||
document.querySelectorAll('.code-copy-btn').forEach(function (button) {
|
||||
button.addEventListener('click', function (e) {
|
||||
e.preventDefault();
|
||||
const targetId = button.getAttribute('data-clipboard-target');
|
||||
const target = document.querySelector(targetId);
|
||||
let codeElement;
|
||||
if (target.tagName === 'CODE') {
|
||||
codeElement = target;
|
||||
} else {
|
||||
// Select the last code element in case line numbers are present
|
||||
const codeElements = target.querySelectorAll('code');
|
||||
codeElement = codeElements[codeElements.length - 1];
|
||||
}
|
||||
if (codeElement) {
|
||||
// Replace double newlines with single newlines in the innerText
|
||||
// as each line inside <span> has trailing newline '\n'
|
||||
const code = codeElement.innerText.replace(/\n\n/g, '\n');
|
||||
navigator.clipboard.writeText(code).then(function () {
|
||||
button.classList.add('copied');
|
||||
setTimeout(function () {
|
||||
button.classList.remove('copied');
|
||||
}, 500);
|
||||
}).catch(function (err) {
|
||||
console.error('Failed to copy text: ', err);
|
||||
});
|
||||
} else {
|
||||
console.error('Target element not found');
|
||||
}
|
||||
// Copy button for code blocks
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const getCopyIcon = () => {
|
||||
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
|
||||
svg.innerHTML = `
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" />
|
||||
`;
|
||||
svg.setAttribute('fill', 'none');
|
||||
svg.setAttribute('viewBox', '0 0 24 24');
|
||||
svg.setAttribute('stroke', 'currentColor');
|
||||
svg.setAttribute('stroke-width', '2');
|
||||
return svg;
|
||||
}
|
||||
|
||||
const getSuccessIcon = () => {
|
||||
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
|
||||
svg.innerHTML = `
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7" />
|
||||
`;
|
||||
svg.setAttribute('fill', 'none');
|
||||
svg.setAttribute('viewBox', '0 0 24 24');
|
||||
svg.setAttribute('stroke', 'currentColor');
|
||||
svg.setAttribute('stroke-width', '2');
|
||||
return svg;
|
||||
}
|
||||
|
||||
document.querySelectorAll('.hextra-code-copy-btn').forEach(function (button) {
|
||||
// Add copy and success icons
|
||||
button.querySelector('.copy-icon')?.appendChild(getCopyIcon());
|
||||
button.querySelector('.success-icon')?.appendChild(getSuccessIcon());
|
||||
|
||||
// Add click event listener for copy button
|
||||
button.addEventListener('click', function (e) {
|
||||
e.preventDefault();
|
||||
// Get the code target
|
||||
const target = button.parentElement.previousElementSibling;
|
||||
let codeElement;
|
||||
if (target.tagName === 'CODE') {
|
||||
codeElement = target;
|
||||
} else {
|
||||
// Select the last code element in case line numbers are present
|
||||
const codeElements = target.querySelectorAll('code');
|
||||
codeElement = codeElements[codeElements.length - 1];
|
||||
}
|
||||
if (codeElement) {
|
||||
let code = codeElement.innerText;
|
||||
// Replace double newlines with single newlines in the innerText
|
||||
// as each line inside <span> has trailing newline '\n'
|
||||
if ("lang" in codeElement.dataset) {
|
||||
code = code.replace(/\n\n/g, '\n');
|
||||
}
|
||||
navigator.clipboard.writeText(code).then(function () {
|
||||
button.classList.add('copied');
|
||||
setTimeout(function () {
|
||||
button.classList.remove('copied');
|
||||
}, 1000);
|
||||
}).catch(function (err) {
|
||||
console.error('Failed to copy text: ', err);
|
||||
});
|
||||
} else {
|
||||
console.error('Target element not found');
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -1,5 +1,16 @@
|
||||
// Search functionality using FlexSearch.
|
||||
|
||||
// Change shortcut key to cmd+k on Mac, iPad or iPhone.
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
if (/iPad|iPhone|Macintosh/.test(navigator.userAgent)) {
|
||||
// select the kbd element under the .search-wrapper class
|
||||
const keys = document.querySelectorAll(".search-wrapper kbd");
|
||||
keys.forEach(key => {
|
||||
key.innerHTML = '<span class="hx-text-xs">⌘</span>K';
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Render the search data as JSON.
|
||||
// {{ $searchDataFile := printf "%s.search-data.json" .Language.Lang }}
|
||||
// {{ $searchData := resources.Get "json/search-data.json" | resources.ExecuteAsTemplate $searchDataFile . }}
|
||||
@ -16,6 +27,20 @@
|
||||
el.addEventListener('focus', init);
|
||||
el.addEventListener('keyup', search);
|
||||
el.addEventListener('keydown', handleKeyDown);
|
||||
el.addEventListener('input', handleInputChange);
|
||||
}
|
||||
|
||||
const shortcutElements = document.querySelectorAll('.search-wrapper kbd');
|
||||
|
||||
function setShortcutElementsOpacity(opacity) {
|
||||
shortcutElements.forEach(el => {
|
||||
el.style.opacity = opacity;
|
||||
});
|
||||
}
|
||||
|
||||
function handleInputChange(e) {
|
||||
const opacity = e.target.value.length > 0 ? 0 : 100;
|
||||
setShortcutElementsOpacity(opacity);
|
||||
}
|
||||
|
||||
// Get the search wrapper, input, and results elements.
|
||||
@ -68,6 +93,7 @@
|
||||
e.target !== resultsElement &&
|
||||
!resultsElement.contains(e.target)
|
||||
) {
|
||||
setShortcutElementsOpacity(100);
|
||||
hideSearchResults();
|
||||
}
|
||||
});
|
||||
@ -117,7 +143,7 @@
|
||||
function hideSearchResults() {
|
||||
const { resultsElement } = getActiveSearchElement();
|
||||
if (!resultsElement) return;
|
||||
resultsElement.classList.add('hidden');
|
||||
resultsElement.classList.add('hx-hidden');
|
||||
}
|
||||
|
||||
// Handle keyboard events.
|
||||
@ -146,6 +172,10 @@
|
||||
case 'Escape':
|
||||
e.preventDefault();
|
||||
hideSearchResults();
|
||||
// Clear the input when pressing escape
|
||||
inputElement.value = '';
|
||||
inputElement.dispatchEvent(new Event('input'));
|
||||
// Remove focus from the input
|
||||
inputElement.blur();
|
||||
break;
|
||||
}
|
||||
@ -159,24 +189,40 @@
|
||||
}
|
||||
}
|
||||
|
||||
// Preload the search index.
|
||||
/**
|
||||
* Preloads the search index by fetching data and adding it to the FlexSearch index.
|
||||
* @returns {Promise<void>} A promise that resolves when the index is preloaded.
|
||||
*/
|
||||
async function preloadIndex() {
|
||||
const tokenize = '{{- site.Params.search.flexsearch.tokenize | default "forward" -}}';
|
||||
|
||||
const isCJK = () => {
|
||||
const lang = document.documentElement.lang || "en";
|
||||
return lang.startsWith("zh") || lang.startsWith("ja") || lang.startsWith("ko");
|
||||
}
|
||||
|
||||
const encodeCJK = (str) => str.replace(/[\x00-\x7F]/g, "").split("");
|
||||
const encodeDefault = (str) => (""+str).toLocaleLowerCase().split(/[\p{Z}\p{S}\p{P}\p{C}]+/u);
|
||||
const encodeFunction = isCJK() ? encodeCJK : encodeDefault;
|
||||
|
||||
window.pageIndex = new FlexSearch.Document({
|
||||
tokenize: 'forward',
|
||||
tokenize,
|
||||
encode: encodeFunction,
|
||||
cache: 100,
|
||||
document: {
|
||||
id: 'id',
|
||||
store: ['title'],
|
||||
store: ['title', 'crumb'],
|
||||
index: "content"
|
||||
}
|
||||
});
|
||||
|
||||
window.sectionIndex = new FlexSearch.Document({
|
||||
tokenize: 'forward',
|
||||
tokenize,
|
||||
encode: encodeFunction,
|
||||
cache: 100,
|
||||
document: {
|
||||
id: 'id',
|
||||
store: ['title', 'content', 'url', 'display'],
|
||||
store: ['title', 'content', 'url', 'display', 'crumb'],
|
||||
index: "content",
|
||||
tag: 'pageId'
|
||||
}
|
||||
@ -188,6 +234,30 @@
|
||||
for (const route in data) {
|
||||
let pageContent = '';
|
||||
++pageId;
|
||||
const urlParts = route.split('/').filter(x => x != "" && !x.startsWith('#'));
|
||||
|
||||
let crumb = '';
|
||||
let searchUrl = '/'
|
||||
for (let i = 0; i < urlParts.length; i++) {
|
||||
const urlPart = urlParts[i];
|
||||
searchUrl += urlPart + '/'
|
||||
|
||||
const crumbData = data[searchUrl];
|
||||
if (!crumbData) {
|
||||
console.warn('Excluded page', searchUrl, '- will not be included for search result breadcrumb for', route);
|
||||
continue;
|
||||
}
|
||||
|
||||
let title = data[searchUrl].title;
|
||||
if (title == "_index") {
|
||||
title = urlPart.split("-").map(x => x).join(" ");
|
||||
}
|
||||
crumb += title;
|
||||
|
||||
if (i < urlParts.length - 1) {
|
||||
crumb += ' > ';
|
||||
}
|
||||
}
|
||||
|
||||
for (const heading in data[route].data) {
|
||||
const [hash, text] = heading.split('#');
|
||||
@ -201,6 +271,7 @@
|
||||
id: url,
|
||||
url,
|
||||
title,
|
||||
crumb,
|
||||
pageId: `page_${pageId}`,
|
||||
content: title,
|
||||
...(paragraphs[0] && { display: paragraphs[0] })
|
||||
@ -211,6 +282,7 @@
|
||||
id: `${url}_${i}`,
|
||||
url,
|
||||
title,
|
||||
crumb,
|
||||
pageId: `page_${pageId}`,
|
||||
content: paragraphs[i]
|
||||
});
|
||||
@ -222,12 +294,17 @@
|
||||
window.pageIndex.add({
|
||||
id: pageId,
|
||||
title: data[route].title,
|
||||
crumb,
|
||||
content: pageContent
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs a search based on the provided query and displays the results.
|
||||
* @param {Event} e - The event object.
|
||||
*/
|
||||
function search(e) {
|
||||
const query = e.target.value;
|
||||
if (!e.target.value) {
|
||||
@ -239,7 +316,7 @@
|
||||
while (resultsElement.firstChild) {
|
||||
resultsElement.removeChild(resultsElement.firstChild);
|
||||
}
|
||||
resultsElement.classList.remove('hidden');
|
||||
resultsElement.classList.remove('hx-hidden');
|
||||
|
||||
const pageResults = window.pageIndex.search(query, 5, { enrich: true, suggest: true })[0]?.result || [];
|
||||
|
||||
@ -270,7 +347,7 @@
|
||||
_page_rk: i,
|
||||
_section_rk: j,
|
||||
route: url,
|
||||
prefix: isFirstItemOfPage ? result.doc.title : undefined,
|
||||
prefix: isFirstItemOfPage ? result.doc.crumb : undefined,
|
||||
children: { title, content }
|
||||
})
|
||||
isFirstItemOfPage = false
|
||||
@ -296,6 +373,12 @@
|
||||
displayResults(sortedResults, query);
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays the search results on the page.
|
||||
*
|
||||
* @param {Array} results - The array of search results.
|
||||
* @param {string} query - The search query.
|
||||
*/
|
||||
function displayResults(results, query) {
|
||||
const { resultsElement } = getActiveSearchElement();
|
||||
if (!resultsElement) return;
|
||||
|
@ -5,7 +5,7 @@
|
||||
e.preventDefault();
|
||||
switcher.dataset.state = switcher.dataset.state === 'open' ? 'closed' : 'open';
|
||||
const optionsElement = switcher.nextElementSibling;
|
||||
optionsElement.classList.toggle('hidden');
|
||||
optionsElement.classList.toggle('hx-hidden');
|
||||
|
||||
// Calculate position of language options element
|
||||
const switcherRect = switcher.getBoundingClientRect();
|
||||
@ -21,7 +21,7 @@
|
||||
languageSwitchers.forEach((switcher) => {
|
||||
switcher.dataset.state = 'closed';
|
||||
const optionsElement = switcher.nextElementSibling;
|
||||
optionsElement.classList.add('hidden');
|
||||
optionsElement.classList.add('hx-hidden');
|
||||
});
|
||||
}
|
||||
});
|
||||
|
@ -1,19 +1,49 @@
|
||||
// Hamburger menu for mobile navigation
|
||||
|
||||
const menu = document.querySelector('.hamburger-menu');
|
||||
|
||||
menu.addEventListener('click', (e) => {
|
||||
e.preventDefault();
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const menu = document.querySelector('.hamburger-menu');
|
||||
const overlay = document.querySelector('.mobile-menu-overlay');
|
||||
const sidebarContainer = document.querySelector('.sidebar-container');
|
||||
|
||||
// Toggle the hamburger menu
|
||||
menu.querySelector('svg').classList.toggle('open');
|
||||
// Initialize the overlay
|
||||
const overlayClasses = ['hx-fixed', 'hx-inset-0', 'hx-z-10', 'hx-bg-black/80', 'dark:hx-bg-black/60'];
|
||||
overlay.classList.add('hx-bg-transparent');
|
||||
overlay.classList.remove("hx-hidden", ...overlayClasses);
|
||||
|
||||
// When the menu is open, we want to show the navigation sidebar
|
||||
sidebarContainer.classList.toggle('max-md:[transform:translate3d(0,-100%,0)]');
|
||||
sidebarContainer.classList.toggle('max-md:[transform:translate3d(0,0,0)]');
|
||||
function toggleMenu() {
|
||||
// Toggle the hamburger menu
|
||||
menu.querySelector('svg').classList.toggle('open');
|
||||
|
||||
// When the menu is open, we want to prevent the body from scrolling
|
||||
document.body.classList.toggle('overflow-hidden');
|
||||
document.body.classList.toggle('md:overflow-auto');
|
||||
// When the menu is open, we want to show the navigation sidebar
|
||||
sidebarContainer.classList.toggle('max-md:[transform:translate3d(0,-100%,0)]');
|
||||
sidebarContainer.classList.toggle('max-md:[transform:translate3d(0,0,0)]');
|
||||
|
||||
// When the menu is open, we want to prevent the body from scrolling
|
||||
document.body.classList.toggle('hx-overflow-hidden');
|
||||
document.body.classList.toggle('md:hx-overflow-auto');
|
||||
}
|
||||
|
||||
menu.addEventListener('click', (e) => {
|
||||
e.preventDefault();
|
||||
toggleMenu();
|
||||
|
||||
if (overlay.classList.contains('hx-bg-transparent')) {
|
||||
// Show the overlay
|
||||
overlay.classList.add(...overlayClasses);
|
||||
overlay.classList.remove('hx-bg-transparent');
|
||||
} else {
|
||||
// Hide the overlay
|
||||
overlay.classList.remove(...overlayClasses);
|
||||
overlay.classList.add('hx-bg-transparent');
|
||||
}
|
||||
});
|
||||
|
||||
overlay.addEventListener('click', (e) => {
|
||||
e.preventDefault();
|
||||
toggleMenu();
|
||||
|
||||
// Hide the overlay
|
||||
overlay.classList.remove(...overlayClasses);
|
||||
overlay.classList.add('hx-bg-transparent');
|
||||
});
|
||||
});
|
||||
|
@ -1,4 +1,9 @@
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
scrollToActiveItem();
|
||||
enableCollapsibles();
|
||||
});
|
||||
|
||||
function enableCollapsibles() {
|
||||
const buttons = document.querySelectorAll(".hextra-sidebar-collapsible-button");
|
||||
buttons.forEach(function (button) {
|
||||
button.addEventListener("click", function (e) {
|
||||
@ -9,4 +14,23 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function scrollToActiveItem() {
|
||||
const sidebarScrollbar = document.querySelector("aside.sidebar-container > .hextra-scrollbar");
|
||||
const activeItems = document.querySelectorAll(".sidebar-active-item");
|
||||
const visibleActiveItem = Array.from(activeItems).find(function (activeItem) {
|
||||
return activeItem.getBoundingClientRect().height > 0;
|
||||
});
|
||||
|
||||
if (!visibleActiveItem) {
|
||||
return;
|
||||
}
|
||||
|
||||
const yOffset = visibleActiveItem.clientHeight;
|
||||
const yDistance = visibleActiveItem.getBoundingClientRect().top - sidebarScrollbar.getBoundingClientRect().top;
|
||||
sidebarScrollbar.scrollTo({
|
||||
behavior: "instant",
|
||||
top: yDistance - yOffset
|
||||
});
|
||||
}
|
||||
|
@ -1,14 +1,14 @@
|
||||
document.querySelectorAll('.tabs-toggle').forEach(function (button) {
|
||||
document.querySelectorAll('.hextra-tabs-toggle').forEach(function (button) {
|
||||
button.addEventListener('click', function (e) {
|
||||
// set parent tabs to unselected
|
||||
const tabs = Array.from(e.target.parentElement.querySelectorAll('.tabs-toggle'));
|
||||
const tabs = Array.from(e.target.parentElement.querySelectorAll('.hextra-tabs-toggle'));
|
||||
tabs.map(tab => tab.dataset.state = '');
|
||||
|
||||
// set current tab to selected
|
||||
e.target.dataset.state = 'selected';
|
||||
|
||||
// set all panels to unselected
|
||||
const panelsContainer = e.target.parentElement.nextElementSibling;
|
||||
const panelsContainer = e.target.parentElement.parentElement.nextElementSibling;
|
||||
Array.from(panelsContainer.children).forEach(function (panel) {
|
||||
panel.dataset.state = '';
|
||||
});
|
||||
|
@ -1,36 +1,51 @@
|
||||
// Dark theme toggle
|
||||
// Light / Dark theme toggle
|
||||
(function () {
|
||||
const defaultTheme = '{{ site.Params.theme.default | default `system`}}'
|
||||
|
||||
const themeToggleButtons = document.querySelectorAll(".theme-toggle");
|
||||
const themeToggleButtons = document.querySelectorAll(".theme-toggle");
|
||||
|
||||
// Change the icons inside the button based on previous settings
|
||||
if (
|
||||
localStorage.getItem("color-theme") === "dark" ||
|
||||
(!("color-theme" in localStorage) && window.matchMedia("(prefers-color-scheme: dark)").matches)
|
||||
) {
|
||||
themeToggleButtons.forEach((el) => el.dataset.theme = "dark");
|
||||
} else {
|
||||
themeToggleButtons.forEach((el) => el.dataset.theme = "light");
|
||||
}
|
||||
// Change the icons of the buttons based on previous settings or system theme
|
||||
if (
|
||||
localStorage.getItem("color-theme") === "dark" ||
|
||||
(!("color-theme" in localStorage) &&
|
||||
((window.matchMedia("(prefers-color-scheme: dark)").matches && defaultTheme === "system") || defaultTheme === "dark"))
|
||||
) {
|
||||
themeToggleButtons.forEach((el) => el.dataset.theme = "dark");
|
||||
} else {
|
||||
themeToggleButtons.forEach((el) => el.dataset.theme = "light");
|
||||
}
|
||||
|
||||
themeToggleButtons.forEach((el) => {
|
||||
el.addEventListener("click", function () {
|
||||
if (localStorage.getItem("color-theme")) {
|
||||
if (localStorage.getItem("color-theme") === "light") {
|
||||
document.documentElement.classList.add("dark");
|
||||
localStorage.setItem("color-theme", "dark");
|
||||
// Add click event handler to the buttons
|
||||
themeToggleButtons.forEach((el) => {
|
||||
el.addEventListener("click", function () {
|
||||
if (localStorage.getItem("color-theme")) {
|
||||
if (localStorage.getItem("color-theme") === "light") {
|
||||
setDarkTheme();
|
||||
localStorage.setItem("color-theme", "dark");
|
||||
} else {
|
||||
setLightTheme();
|
||||
localStorage.setItem("color-theme", "light");
|
||||
}
|
||||
} else {
|
||||
document.documentElement.classList.remove("dark");
|
||||
localStorage.setItem("color-theme", "light");
|
||||
if (document.documentElement.classList.contains("dark")) {
|
||||
setLightTheme();
|
||||
localStorage.setItem("color-theme", "light");
|
||||
} else {
|
||||
setDarkTheme();
|
||||
localStorage.setItem("color-theme", "dark");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (document.documentElement.classList.contains("dark")) {
|
||||
document.documentElement.classList.remove("dark");
|
||||
localStorage.setItem("color-theme", "light");
|
||||
} else {
|
||||
document.documentElement.classList.add("dark");
|
||||
localStorage.setItem("color-theme", "dark");
|
||||
}
|
||||
}
|
||||
el.dataset.theme = document.documentElement.classList.contains("dark") ? "dark" : "light";
|
||||
el.dataset.theme = document.documentElement.classList.contains("dark") ? "dark" : "light";
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// Listen for system theme changes
|
||||
window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", (e) => {
|
||||
if (defaultTheme === "system" && !("color-theme" in localStorage)) {
|
||||
e.matches ? setDarkTheme() : setLightTheme();
|
||||
themeToggleButtons.forEach((el) =>
|
||||
el.dataset.theme = document.documentElement.classList.contains("dark") ? "dark" : "light"
|
||||
);
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
@ -1,3 +1,10 @@
|
||||
{{/* FlexSearch Index Data */}}
|
||||
{{- $indexType := site.Params.search.flexsearch.index | default "content" -}}
|
||||
|
||||
{{- if not (in (slice "content" "summary" "heading" "title" ) $indexType) -}}
|
||||
{{- errorf "unknown flexsearch index type: %s" $indexType -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $pages := where .Site.Pages "Kind" "in" (slice "page" "section") -}}
|
||||
{{- $pages = where $pages "Params.excludeSearch" "!=" true -}}
|
||||
{{- $pages = where $pages "Content" "!=" "" -}}
|
||||
@ -7,7 +14,7 @@
|
||||
{{- range $index, $page := $pages -}}
|
||||
{{- $pageTitle := $page.LinkTitle | default $page.File.BaseFileName -}}
|
||||
{{- $pageLink := $page.RelPermalink -}}
|
||||
{{- $data := partial "utils/fragments" $page -}}
|
||||
{{- $data := partial "utils/fragments" (dict "context" $page "type" $indexType) -}}
|
||||
{{- $output = $output | merge (dict $pageLink (dict "title" $pageTitle "data" $data)) -}}
|
||||
{{- end -}}
|
||||
|
||||
|
2
assets/lib/katex/auto-render.min.js
vendored
2
assets/lib/katex/auto-render.min.js
vendored
@ -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={771:function(t){t.exports=e}},r={};function n(e){var i=r[e];if(void 0!==i)return i.exports;var a=r[e]={exports:{}};return t[e](a,a.exports,n),a.exports}n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},n.d=function(e,t){for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var i={};return function(){n.d(i,{default:function(){return s}});var e=n(771),t=n.n(e),r=function(e,t,r){for(var n=r,i=0,a=e.length;n<t.length;){var o=t[n];if(i<=0&&t.slice(n,n+a)===e)return n;"\\"===o?n++:"{"===o?i++:"}"===o&&i--,n++}return-1},a=/^\\begin{/,o=function(e,t){for(var n,i=[],o=new RegExp("("+t.map((function(e){return e.left.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")})).join("|")+")");-1!==(n=e.search(o));){n>0&&(i.push({type:"text",data:e.slice(0,n)}),e=e.slice(n));var l=t.findIndex((function(t){return e.startsWith(t.left)}));if(-1===(n=r(t[l].right,e,t[l].left.length)))break;var d=e.slice(0,n+t[l].right.length),s=a.test(d)?d:e.slice(t[l].left.length,n);i.push({type:"math",data:s,rawData:d,display:t[l].display}),e=e.slice(n+t[l].right.length)}return""!==e&&i.push({type:"text",data:e}),i},l=function(e,r){var n=o(e,r.delimiters);if(1===n.length&&"text"===n[0].type)return null;for(var i=document.createDocumentFragment(),a=0;a<n.length;a++)if("text"===n[a].type)i.appendChild(document.createTextNode(n[a].data));else{var l=document.createElement("span"),d=n[a].data;r.displayMode=n[a].display;try{r.preProcess&&(d=r.preProcess(d)),t().render(d,l,r)}catch(e){if(!(e instanceof t().ParseError))throw e;r.errorCallback("KaTeX auto-render: Failed to parse `"+n[a].data+"` with ",e),i.appendChild(document.createTextNode(n[a].rawData));continue}i.appendChild(l)}return i},d=function e(t,r){for(var n=0;n<t.childNodes.length;n++){var i=t.childNodes[n];if(3===i.nodeType){for(var a=i.textContent,o=i.nextSibling,d=0;o&&o.nodeType===Node.TEXT_NODE;)a+=o.textContent,o=o.nextSibling,d++;var s=l(a,r);if(s){for(var f=0;f<d;f++)i.nextSibling.remove();n+=s.childNodes.length-1,t.replaceChild(s,i)}else n+=d}else 1===i.nodeType&&function(){var t=" "+i.className+" ";-1===r.ignoredTags.indexOf(i.nodeName.toLowerCase())&&r.ignoredClasses.every((function(e){return-1===t.indexOf(" "+e+" ")}))&&e(i,r)}()}},s=function(e,t){if(!e)throw new Error("No element provided to render");var r={};for(var n in t)t.hasOwnProperty(n)&&(r[n]=t[n]);r.delimiters=r.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}],r.ignoredTags=r.ignoredTags||["script","noscript","style","textarea","pre","code","option"],r.ignoredClasses=r.ignoredClasses||[],r.errorCallback=r.errorCallback||console.error,r.macros=r.macros||{},d(e,r)}}(),i=i.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={771: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={};return function(){r.d(o,{default:function(){return d}});var e=r(771),t=r.n(e);const n=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},i=/^\\begin{/;var a=function(e,t){let r;const o=[],a=new RegExp("("+t.map((e=>e.left.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"))).join("|")+")");for(;r=e.search(a),-1!==r;){r>0&&(o.push({type:"text",data:e.slice(0,r)}),e=e.slice(r));const a=t.findIndex((t=>e.startsWith(t.left)));if(r=n(t[a].right,e,t[a].left.length),-1===r)break;const l=e.slice(0,r+t[a].right.length),s=i.test(l)?l:e.slice(t[a].left.length,r);o.push({type:"math",data:s,rawData:l,display:t[a].display}),e=e.slice(r+t[a].right.length)}return""!==e&&o.push({type:"text",data:e}),o};const l=function(e,n){const r=a(e,n.delimiters);if(1===r.length&&"text"===r[0].type)return null;const o=document.createDocumentFragment();for(let e=0;e<r.length;e++)if("text"===r[e].type)o.appendChild(document.createTextNode(r[e].data));else{const i=document.createElement("span");let a=r[e].data;n.displayMode=r[e].display;try{n.preProcess&&(a=n.preProcess(a)),t().render(a,i,n)}catch(i){if(!(i instanceof t().ParseError))throw i;n.errorCallback("KaTeX auto-render: Failed to parse `"+r[e].data+"` with ",i),o.appendChild(document.createTextNode(r[e].rawData));continue}o.appendChild(i)}return o},s=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 s=l(o,t);if(s){for(let e=0;e<a;e++)r.nextSibling.remove();n+=s.childNodes.length-1,e.replaceChild(s,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+" ")))&&s(r,t)}}};var d=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||{},s(e,n)}}(),o=o.default}()}));
|
2
assets/lib/katex/katex.min.css
vendored
2
assets/lib/katex/katex.min.css
vendored
File diff suppressed because one or more lines are too long
2
assets/lib/katex/katex.min.js
vendored
2
assets/lib/katex/katex.min.js
vendored
File diff suppressed because one or more lines are too long
3618
assets/lib/mermaid/mermaid.min.js
vendored
3618
assets/lib/mermaid/mermaid.min.js
vendored
File diff suppressed because one or more lines are too long
30
config.yaml
30
config.yaml
@ -1,30 +0,0 @@
|
||||
build:
|
||||
buildStats:
|
||||
enable: true
|
||||
disableIDs: true
|
||||
cacheBusters:
|
||||
- source: assets/watching/hugo_stats\.json
|
||||
target: styles\.css
|
||||
- source: assets/.*\.(js|ts|jsx|tsx)
|
||||
target: (js|scripts|javascript)
|
||||
- source: assets/.*\.(css|sass|scss)$
|
||||
target: (css|styles|scss|sass)
|
||||
- source: (postcss|tailwind)\.config\.js
|
||||
target: (css|styles|scss|sass)
|
||||
- source: assets/.*\.(.*)$
|
||||
target: $1
|
||||
|
||||
module:
|
||||
mounts:
|
||||
- source: static
|
||||
target: static
|
||||
- source: layouts
|
||||
target: layouts
|
||||
- source: data
|
||||
target: data
|
||||
- source: assets
|
||||
target: assets
|
||||
- source: i18n
|
||||
target: i18n
|
||||
- source: archetypes
|
||||
target: archetypes
|
@ -9,6 +9,21 @@ github: >
|
||||
<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path>
|
||||
</svg>
|
||||
|
||||
codeberg: >
|
||||
<svg fill="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M11.955.49A12 12 0 0 0 0 12.49a12 12 0 0 0 1.832 6.373L11.838 5.928a.187.14 0 0 1 .324 0l10.006 12.935A12 12 0 0 0 24 12.49a12 12 0 0 0-12-12 12 12 0 0 0-.045 0zm.375 6.467 4.416 16.553a12 12 0 0 0 5.137-4.213z"/>
|
||||
</svg>
|
||||
|
||||
gitlab: >
|
||||
<svg fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||
<path d="m23.6 9.593l-.033-.086L20.3.98a.851.851 0 0 0-.336-.405a.875.875 0 0 0-1 .054a.875.875 0 0 0-.29.44L16.47 7.818H7.537L5.333 1.07a.857.857 0 0 0-.29-.441a.875.875 0 0 0-1-.054a.859.859 0 0 0-.336.405L.433 9.502l-.032.086a6.066 6.066 0 0 0 2.012 7.01l.01.009l.03.021l4.977 3.727l2.462 1.863l1.5 1.132a1.009 1.009 0 0 0 1.22 0l1.499-1.132l2.461-1.863l5.006-3.75l.013-.01a6.068 6.068 0 0 0 2.01-7.002"/>
|
||||
</svg>
|
||||
|
||||
bitbucket: >
|
||||
<svg fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||
<path d="M.778 1.213a.768.768 0 0 0-.768.892l3.263 19.81c.084.5.515.868 1.022.873H19.95a.772.772 0 0 0 .77-.646l3.27-20.03a.768.768 0 0 0-.768-.891zM14.52 15.53H9.522L8.17 8.466h7.561z" />
|
||||
</svg>
|
||||
|
||||
hextra: <svg viewBox="0 0 180 180" xmlns="http://www.w3.org/2000/svg" fill="currentColor"><path fill-rule="evenodd" clip-rule="evenodd" d="m 105.50024,22.224647 c -9.59169,-5.537563 -21.40871,-5.537563 -31.000093,0 L 39.054693,42.689119 C 29.463353,48.226675 23.55484,58.460531 23.55484,69.535642 v 40.928918 c 0,11.07542 5.908513,21.3092 15.499853,26.84652 l 35.445453,20.46446 c 9.591313,5.53732 21.408404,5.53732 31.000094,0 l 35.44507,-20.46446 c 9.59131,-5.53732 15.49985,-15.7711 15.49985,-26.84652 V 69.535642 c 0,-11.075111 -5.90854,-21.308967 -15.49985,-26.846523 z M 34.112797,85.737639 c -1.384445,2.397827 -1.384445,5.352099 0,7.749927 l 24.781554,42.922974 c 1.38437,2.39783 3.942853,3.87496 6.711592,3.87496 h 49.563107 c 2.76905,0 5.3273,-1.47713 6.71144,-3.87496 l 24.78194,-42.922974 c 1.38414,-2.397828 1.38414,-5.3521 0,-7.749927 L 121.88049,42.814746 c -1.38414,-2.397828 -3.94239,-3.874964 -6.71144,-3.874964 H 65.605944 c -2.768739,0 -5.327223,1.477059 -6.711592,3.874964 z" style="stroke-width:0.774993" /></svg>
|
||||
|
||||
hugo: <svg viewBox="0 0 370 391" xmlns="http://www.w3.org/2000/svg"><g clip-rule="evenodd" fill-rule="evenodd"><path d="m207.5 22.4 114.4 66.6c13.5 7.9 21.9 22.4 21.9 38v136.4c0 17.3-9.3 33.3-24.5 41.8l-113.5 63.9a49.06 49.06 0 0 1 -48.5-.2l-104.5-60.1c-16.4-9.5-26.6-27-26.6-45.9v-129.5c0-19.1 9.9-36.8 26.1-46.8l102.8-63.5c16-9.9 36.2-10.1 52.4-.7z" fill="#ff4088" stroke="#c9177e" stroke-width="27" /><path d="m105.6 298.2v-207.2h43.4v75.5h71.9v-75.5h43.5v207.2h-43.5v-90.6h-71.9v90.6z" fill="#fff" /></g></svg>
|
||||
@ -21,6 +36,8 @@ hugo-full: >
|
||||
<path fill="#fff" d="M1320.72 89.15c58.79 0 106.52 47.73 106.52 106.51 0 58.8-47.73 106.52-106.52 106.52-58.78 0-106.52-47.73-106.52-106.52 0-58.78 47.74-106.51 106.52-106.51zm0 39.57c36.95 0 66.94 30 66.94 66.94a66.97 66.97 0 0 1-66.94 66.94c-36.95 0-66.94-29.99-66.94-66.94a66.97 66.97 0 0 1 66.93-66.94h.01zm-283.8 65.31c0 47.18-8.94 60.93-26.81 80.58-17.87 19.65-41.57 27.57-71.1 27.57-27 0-48.75-9.58-67.61-26.23-20.88-18.45-36.08-47.04-36.08-78.95 0-31.37 11.72-58.48 32.49-78.67 18.22-17.67 45.34-29.18 73.3-29.18 33.77 0 68.83 15.98 90.44 47.53l-31.73 26.82c-13.45-25.03-32.94-33.46-60.82-34.26-30.83-.88-64.77 28.53-62.25 67.75 1.4 21.94 11.65 59.65 60.96 66.57 25.9 3.63 55.36-24.02 55.36-39.04H944.4v-37.5h92.5V194l.02.03zm-562.6-94.65h42.29v112.17c0 17.8.49 29.33 1.47 34.61 1.69 8.48 4.81 14.37 11.17 19.5 6.37 5.13 13.8 6.59 24.84 6.59 11.2 0 14.96-1.74 20.66-6.6 5.69-4.85 9.12-9.46 10.28-16.53 1.15-7.07 3.07-18.8 3.07-35.18V99.38h42.28v108.78c0 24.86-1.07 42.43-3.21 52.69-2.14 10.27-6.08 18.93-11.82 26-5.74 7.06-13.42 12.69-23.03 16.88-9.62 4.19-22.16 6.28-37.65 6.28-18.7 0-32.87-2.28-42.52-6.85-9.66-4.57-17.3-10.5-22.9-17.8-5.61-7.3-9.3-14.95-11.08-22.96-2.58-11.86-3.88-29.38-3.88-52.55V99.38h.03zM93.91 299.92V92.7h43.35v75.48h71.92V92.7h43.48v207.22h-43.48v-90.61h-71.92v90.61z"/>
|
||||
</svg>
|
||||
|
||||
jupyter: <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M7.157 22.201A1.784 1.799 0 0 1 5.374 24a1.784 1.799 0 0 1-1.784-1.799a1.784 1.799 0 0 1 1.784-1.799a1.784 1.799 0 0 1 1.783 1.799M20.582 1.427a1.415 1.427 0 0 1-1.415 1.428a1.415 1.427 0 0 1-1.416-1.428A1.415 1.427 0 0 1 19.167 0a1.415 1.427 0 0 1 1.415 1.427M4.992 3.336A1.047 1.056 0 0 1 3.946 4.39a1.047 1.056 0 0 1-1.047-1.055A1.047 1.056 0 0 1 3.946 2.28a1.047 1.056 0 0 1 1.046 1.056m7.336 1.517c3.769 0 7.06 1.38 8.768 3.424a9.36 9.36 0 0 0-3.393-4.547a9.24 9.24 0 0 0-5.377-1.728A9.24 9.24 0 0 0 6.95 3.73a9.36 9.36 0 0 0-3.394 4.547c1.713-2.04 5.004-3.424 8.772-3.424m.001 13.295c-3.768 0-7.06-1.381-8.768-3.425a9.36 9.36 0 0 0 3.394 4.547A9.24 9.24 0 0 0 12.33 21a9.24 9.24 0 0 0 5.377-1.729a9.36 9.36 0 0 0 3.393-4.547c-1.712 2.044-5.003 3.425-8.772 3.425Z" /></svg>
|
||||
|
||||
warning: <svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z"></path></svg>
|
||||
one: <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="-1 0 19 19"><path d="M16.417 9.6A7.917 7.917 0 1 1 8.5 1.683 7.917 7.917 0 0 1 16.417 9.6zM9.666 6.508H8.248L6.09 8.09l.806 1.103 1.222-.945v4.816h1.547z"></path></svg>
|
||||
cards: <svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M6 6.878V6a2.25 2.25 0 0 1 2.25-2.25h7.5A2.25 2.25 0 0 1 18 6v.878m-12 0c.235-.083.487-.128.75-.128h10.5c.263 0 .515.045.75.128m-12 0A2.25 2.25 0 0 0 4.5 9v.878m13.5-3A2.25 2.25 0 0 1 19.5 9v.878m0 0a2.246 2.246 0 0 0-.75-.128H5.25c-.263 0-.515.045-.75.128m15 0A2.25 2.25 0 0 1 21 12v6a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 18v-6c0-.98.626-1.813 1.5-2.122"></path></svg>
|
||||
@ -270,3 +287,6 @@ twitter: <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill=
|
||||
mastodon: <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z"></path></svg>
|
||||
youtube: <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill="currentColor" d="M8.051 1.999h.089c.822.003 4.987.033 6.11.335a2.01 2.01 0 0 1 1.415 1.42c.101.38.172.883.22 1.402l.01.104l.022.26l.008.104c.065.914.073 1.77.074 1.957v.075c-.001.194-.01 1.108-.082 2.06l-.008.105l-.009.104c-.05.572-.124 1.14-.235 1.558a2.007 2.007 0 0 1-1.415 1.42c-1.16.312-5.569.334-6.18.335h-.142c-.309 0-1.587-.006-2.927-.052l-.17-.006l-.087-.004l-.171-.007l-.171-.007c-1.11-.049-2.167-.128-2.654-.26a2.007 2.007 0 0 1-1.415-1.419c-.111-.417-.185-.986-.235-1.558L.09 9.82l-.008-.104A31.4 31.4 0 0 1 0 7.68v-.123c.002-.215.01-.958.064-1.778l.007-.103l.003-.052l.008-.104l.022-.26l.01-.104c.048-.519.119-1.023.22-1.402a2.007 2.007 0 0 1 1.415-1.42c.487-.13 1.544-.21 2.654-.26l.17-.007l.172-.006l.086-.003l.171-.007A99.788 99.788 0 0 1 7.858 2h.193zM6.4 5.209v4.818l4.157-2.408L6.4 5.209z"/></svg>
|
||||
x-twitter: <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"/></svg>
|
||||
linkedin: <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037c-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85c3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065a2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>
|
||||
slack: <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52zm1.271 0a2.527 2.527 0 0 1 2.521-2.52a2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52zm0 1.271a2.528 2.528 0 0 1 2.521 2.521a2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521zm10.122 2.521a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522zm-1.268 0a2.528 2.528 0 0 1-2.523 2.521a2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522zm-2.523 10.122a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522zm0-1.268a2.527 2.527 0 0 1-2.52-2.523a2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523z" /></svg>
|
||||
bluesky: <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 530"><path fill="currentColor" d="M136 44c66 50 138 151 164 205 26-54 98-155 164-205 48-36 126-64 126 25 0 18-10 149-16 170-21 74-96 93-163 81 117 20 147 86 82 153-122 125-176-32-189-72-3-8-4-11-4-8 0-3-1 0-4 8-13 40-67 197-189 72-65-67-35-133 82-153-67 12-142-7-163-81-6-21-16-152-16-170 0-89 78-61 126-25z"/></svg>
|
||||
|
26
dev.toml
Normal file
26
dev.toml
Normal file
@ -0,0 +1,26 @@
|
||||
# Theme development config for exampleSite
|
||||
# https://gohugo.io/getting-started/configuration/#configure-cache-busters
|
||||
[build]
|
||||
[build.buildStats]
|
||||
enable = true
|
||||
disableIDs = true
|
||||
[[build.cachebusters]]
|
||||
source = 'assets/watching/hugo_stats\.json'
|
||||
target = 'styles\.css'
|
||||
[[build.cachebusters]]
|
||||
source = '(postcss|tailwind)\.config\.js'
|
||||
target = 'css'
|
||||
[[build.cachebusters]]
|
||||
source = 'assets/.*\.(js|ts|jsx|tsx)'
|
||||
target = 'js'
|
||||
[[build.cachebusters]]
|
||||
source = 'assets/.*\.(.*)$'
|
||||
target = '$1'
|
||||
|
||||
[module]
|
||||
[[module.mounts]]
|
||||
source = "assets"
|
||||
target = "assets"
|
||||
[[module.mounts]]
|
||||
source = "hugo_stats.json"
|
||||
target = "assets/watching/hugo_stats.json"
|
@ -1,4 +0,0 @@
|
||||
---
|
||||
title: Hextra Theme
|
||||
layout: hextra-home
|
||||
---
|
@ -1,20 +0,0 @@
|
||||
---
|
||||
title: "このサイトについて"
|
||||
toc: false
|
||||
---
|
||||
|
||||
Hextraは、現代的な静的ウェブサイトを構築するためのシンプルで高速で柔軟なテーマとして設計されています。特にドキュメンテーションウェブサイトに適していますが、ブログ、ポートフォリオなどのさまざまなタイプのサイトにも使用できます。
|
||||
|
||||
Hugoは、Jekyllと同様に静的サイトジェネレーターです。Hugoの特徴は、単一のバイナリであることで、さまざまなプラットフォームで簡単にインストールして実行できることです。また、数千ページのサイトをミリ秒単位でレンダリングできるほど非常に高速で信頼性があります。
|
||||
|
||||
Hextraは、最小限のフットプリントに焦点を当てた考え方で構築されています。始めるためには、Node.jsのような追加の依存関係は必要ありません。必要なのは、単一のYAML設定ファイルと、Markdownのコンテンツだけです。そのため、ツールのセットアップではなく、質の高いコンテンツの作成に集中できます。
|
||||
|
||||
## クレジット
|
||||
|
||||
Hextraをビルドするには、次のツールとインスピレーションが必要です:
|
||||
|
||||
- [Hugo](https://gohugo.io/)
|
||||
- [Tailwind CSS](https://tailwindcss.com/)
|
||||
- [Heroicons](https://heroicons.com/)
|
||||
- [Nextra](https://nextra.vercel.app/)
|
||||
- [Next.js](https://nextjs.org/)
|
@ -1,20 +0,0 @@
|
||||
---
|
||||
title: About
|
||||
toc: false
|
||||
---
|
||||
|
||||
Hextra is designed to be a simple, fast, and flexible theme for building modern static websites. It is especially well-suited for documentation websites but can also be used for various types of sites, such as blogs, portfolios, and more.
|
||||
|
||||
Hugo, like Jekyll, is a static site generator. What sets Hugo apart is that it is a single binary, making it easy to install and run on various platforms. It is also extremely fast and reliable, capable of rendering a site with thousands of pages in milliseconds.
|
||||
|
||||
Hextra is built with a mindset focused on having a minimal footprint. To get started, no extra dependencies like Node.js packages are required; all you need is a single YAML configuration file, along with your Markdown content. Thus, we can focus on writing quality content instead of setting up tooling.
|
||||
|
||||
## Credits
|
||||
|
||||
Hextra cannot be built without the following tools and inspirations:
|
||||
|
||||
- [Hugo](https://gohugo.io/)
|
||||
- [Tailwind CSS](https://tailwindcss.com/)
|
||||
- [Heroicons](https://heroicons.com/)
|
||||
- [Nextra](https://nextra.vercel.app/)
|
||||
- [Next.js](https://nextjs.org/)
|
@ -1,3 +0,0 @@
|
||||
---
|
||||
title: "Blog"
|
||||
---
|
@ -1,149 +0,0 @@
|
||||
---
|
||||
title: Markdown Syntax Guide
|
||||
date: 2020-01-01
|
||||
authors:
|
||||
- name: John Doe
|
||||
link: https://example.com/johndoe
|
||||
excludeSearch: true
|
||||
---
|
||||
|
||||
This article offers a sample of basic Markdown syntax that can be used in Hugo content files.
|
||||
<!--more-->
|
||||
|
||||
## Basic Syntax
|
||||
|
||||
### Headings
|
||||
|
||||
```
|
||||
# Heading 1
|
||||
## Heading 2
|
||||
### Heading 3
|
||||
#### Heading 4
|
||||
##### Heading 5
|
||||
###### Heading 6
|
||||
```
|
||||
|
||||
## Heading 2
|
||||
### Heading 3
|
||||
#### Heading 4
|
||||
##### Heading 5
|
||||
###### Heading 6
|
||||
|
||||
### Emphasis
|
||||
|
||||
```text
|
||||
*This text will be italic*
|
||||
_This will also be italic_
|
||||
|
||||
**This text will be bold**
|
||||
__This will also be bold__
|
||||
|
||||
_You **can** combine them_
|
||||
```
|
||||
|
||||
*This text will be italic*
|
||||
|
||||
_This will also be italic_
|
||||
|
||||
**This text will be bold**
|
||||
|
||||
__This will also be bold__
|
||||
|
||||
_You **can** combine them_
|
||||
|
||||
### Lists
|
||||
|
||||
#### Unordered
|
||||
|
||||
```
|
||||
* Item 1
|
||||
* Item 2
|
||||
* Item 2a
|
||||
* Item 2b
|
||||
```
|
||||
|
||||
* Item 1
|
||||
* Item 2
|
||||
* Item 2a
|
||||
* Item 2b
|
||||
|
||||
#### Ordered
|
||||
|
||||
```
|
||||
1. Item 1
|
||||
2. Item 2
|
||||
3. Item 3
|
||||
1. Item 3a
|
||||
2. Item 3b
|
||||
```
|
||||
|
||||
### Images
|
||||
|
||||
```markdown
|
||||

|
||||
```
|
||||
|
||||

|
||||
|
||||
### Links
|
||||
|
||||
```markdown
|
||||
[Hugo](https://gohugo.io)
|
||||
```
|
||||
|
||||
[Hugo](https://gohugo.io)
|
||||
|
||||
### Blockquotes
|
||||
|
||||
```markdown
|
||||
As Newton said:
|
||||
|
||||
> If I have seen further it is by standing on the shoulders of Giants.
|
||||
```
|
||||
|
||||
> If I have seen further it is by standing on the shoulders of Giants.
|
||||
|
||||
### Inline Code
|
||||
|
||||
```markdown
|
||||
Inline `code` has `back-ticks around` it.
|
||||
```
|
||||
|
||||
Inline `code` has `back-ticks around` it.
|
||||
|
||||
### Code Blocks
|
||||
|
||||
#### Syntax Highlighting
|
||||
|
||||
````markdown
|
||||
```go
|
||||
func main() {
|
||||
fmt.Println("Hello World")
|
||||
}
|
||||
```
|
||||
````
|
||||
|
||||
```go
|
||||
func main() {
|
||||
fmt.Println("Hello World")
|
||||
}
|
||||
```
|
||||
|
||||
### Tables
|
||||
|
||||
```markdown
|
||||
| Syntax | Description |
|
||||
| --------- | ----------- |
|
||||
| Header | Title |
|
||||
| Paragraph | Text |
|
||||
```
|
||||
|
||||
| Syntax | Description |
|
||||
| --------- | ----------- |
|
||||
| Header | Title |
|
||||
| Paragraph | Text |
|
||||
|
||||
## References
|
||||
|
||||
- [Markdown Syntax](https://www.markdownguide.org/basic-syntax/)
|
||||
- [Hugo Markdown](https://gohugo.io/content-management/formats/#markdown)
|
@ -1,17 +0,0 @@
|
||||
---
|
||||
linkTitle: "ドキュメンテーション"
|
||||
title: Hextraへようこそ
|
||||
---
|
||||
|
||||
👋 こんにちは!Hextraドキュメンテーションへようこそ!
|
||||
|
||||
<!--more-->
|
||||
|
||||
## Hextraとは?
|
||||
|
||||
Hextraは、[Hugo][hugo]テーマの一つで、[Tailwind CSS][tailwind-css]を使用して作られた、現代的で高速なバッテリー内蔵のテーマです。
|
||||
ドキュメンテーション、ブログ、ウェブサイトの美しいウェブサイトを構築するために設計され、様々な要件に対応するための機能と柔軟性を提供します。
|
||||
|
||||
[hugo]: https://gohugo.io/
|
||||
[flex-search]: https://github.com/nextapps-de/flexsearch
|
||||
[tailwind-css]: https://tailwindcss.com/
|
@ -1,41 +0,0 @@
|
||||
---
|
||||
linkTitle: "Documentation"
|
||||
title: Introduction
|
||||
---
|
||||
|
||||
👋 Hello! Welcome to the Hextra documentation!
|
||||
|
||||
<!--more-->
|
||||
|
||||
## What is Hextra?
|
||||
|
||||
Hextra is a modern, fast and batteries-included [Hugo][hugo] theme built with [Tailwind CSS][tailwind-css].
|
||||
Designed for building beautiful websites for documentation, blogs and websites, it provides out-of-the-box features and flexibility to meet various requirements.
|
||||
|
||||
## Features
|
||||
|
||||
- **Beautiful Design** - Inspired by Nextra, Hextra utilizes Tailwind CSS to offer a modern design that makes your site look outstanding.
|
||||
- **Responsive Layout and Dark Mode** - It looks great on all devices, from mobile, tablet to desktop. Dark mode is also supported to accomodate various lighting conditions.
|
||||
- **Fast and Lightweight** - Powered by Hugo, a lightning-fast static-site generator housed in a single binary file, Hextra keeps its footprint minimal. No Javascript or Node.js are needed to use it.
|
||||
- **Full-text Search** - Built-in offline full-text search powered by FlexSearch, no additional configuration required.
|
||||
- **Battery-included** - Markdown, syntax highlighting, LaTeX math formulae, diagrams and Shortcodes elements to enhance your content. Table of contents, breadcumbs, pagination, sidebar navigation and more are all automatically generated.
|
||||
- **Multi-language and SEO Ready** - Multi-language sites made easy with Hugo's multilingual mode. Out-of-the-box support is included for SEO tags, Open Graph, and Twitter Cards.
|
||||
|
||||
## Questions or Feedback?
|
||||
|
||||
{{< callout emoji="❓" >}}
|
||||
Hextra is still in active development.
|
||||
Have a question or feedback? Feel free to [open an issue](https://github.com/imfing/hextra/issues)!
|
||||
{{< /callout >}}
|
||||
|
||||
## Next
|
||||
|
||||
Dive right into the following section to get started:
|
||||
|
||||
{{< cards >}}
|
||||
{{< card link="getting-started" title="Getting Started" icon="document-text" subtitle="Learn how to create website using Hextra" >}}
|
||||
{{< /cards >}}
|
||||
|
||||
[hugo]: https://gohugo.io/
|
||||
[flex-search]: https://github.com/nextapps-de/flexsearch
|
||||
[tailwind-css]: https://tailwindcss.com/
|
@ -1,13 +0,0 @@
|
||||
---
|
||||
linkTitle: Advanced
|
||||
title: Advanced Topics
|
||||
---
|
||||
|
||||
This section covers some advanced topics of the theme.
|
||||
|
||||
<!--more-->
|
||||
|
||||
{{< cards >}}
|
||||
{{< card link="multi-language" title="Multi-language" icon="translate" >}}
|
||||
{{< card link="customization" title="Customization" icon="pencil" >}}
|
||||
{{< /cards >}}
|
@ -1,58 +0,0 @@
|
||||
---
|
||||
title: Customizing Hextra
|
||||
linkTitle: Customization
|
||||
---
|
||||
|
||||
Hextra offers some default customization options in the `hugo.yaml` config file to configure the theme.
|
||||
This page describes the available options and how to customize the theme further.
|
||||
|
||||
<!--more-->
|
||||
|
||||
## Custom CSS
|
||||
|
||||
To add custom CSS, we need to create a file `assets/css/custom.css` in our site. Hextra will automatically load this file. For example, customize the font family of the content:
|
||||
|
||||
```css {filename="assets/css/custom.css"}
|
||||
.content {
|
||||
font-family: "Times New Roman", Times, serif;
|
||||
}
|
||||
```
|
||||
|
||||
### Primary Color
|
||||
|
||||
The primary color of the theme can be customized by setting the `--primary-hue` variable:
|
||||
|
||||
```css {filename="assets/css/custom.css"}
|
||||
:root {
|
||||
--primary-hue: 100deg;
|
||||
}
|
||||
```
|
||||
|
||||
### Syntax Highlighting
|
||||
|
||||
List of available syntax highlighting themes are available at [Chroma Styles Gallery](https://xyproto.github.io/splash/docs/all.html). The stylesheet can be generated using the command:
|
||||
|
||||
```bash
|
||||
$ hugo gen chromastyles --style=github
|
||||
```
|
||||
|
||||
To override the default syntax highlighting theme, we can add the generated styles to the custom CSS file.
|
||||
|
||||
## Custom Scripts
|
||||
|
||||
You may add custom scripts to the end of the head for every page by adding the following file:
|
||||
|
||||
```
|
||||
layouts/partials/custom/head-end.html
|
||||
```
|
||||
|
||||
## Custom Layouts
|
||||
|
||||
The layouts of the theme can be overridden by creating a file with the same name in the `layouts` directory of your site.
|
||||
For example, to override the `single.html` layout for docs, create a file `layouts/docs/single.html` in your site.
|
||||
|
||||
For further information, refer to the [Hugo Templates](https://gohugo.io/templates/).
|
||||
|
||||
## Further Customization
|
||||
|
||||
Didn't find what you were looking for? Feel free to [open an issue](https://github.com/imfing/hextra/issues) or make a contribution to the theme!
|
@ -1,82 +0,0 @@
|
||||
---
|
||||
title: "Multi-language"
|
||||
weight: 1
|
||||
---
|
||||
|
||||
Hextra supports creating site with multiple languages using Hugo's [multilingual mode](https://gohugo.io/content-management/multilingual/).
|
||||
|
||||
<!--more-->
|
||||
|
||||
## Enable Multi-language
|
||||
|
||||
To make our site multi-language, we need to tell Hugo the supported languages. We need to add to the site configuration file:
|
||||
|
||||
```yaml {filename="hugo.yaml"}
|
||||
defaultContentLanguage: en
|
||||
languages:
|
||||
en:
|
||||
languageName: English
|
||||
weight: 1
|
||||
fr:
|
||||
languageName: Français
|
||||
weight: 2
|
||||
ja:
|
||||
languageName: 日本語
|
||||
weight: 3
|
||||
```
|
||||
|
||||
## Manage Translations by Filename
|
||||
|
||||
Hugo supports managing translations by filename. For example, if we have a file `content/docs/_index.md` in English, we can create a file `content/docs/_index.fr.md` for French translation.
|
||||
|
||||
{{< filetree/container >}}
|
||||
{{< filetree/folder name="content" >}}
|
||||
{{< filetree/folder name="docs" state="open" >}}
|
||||
{{< filetree/file name="_index.md" >}}
|
||||
{{< filetree/file name="_index.fr.md" >}}
|
||||
{{< filetree/file name="_index.ja.md" >}}
|
||||
{{< /filetree/folder >}}
|
||||
{{< /filetree/folder >}}
|
||||
{{< /filetree/container >}}
|
||||
|
||||
Note: Hugo also supports [Translation by content directory](https://gohugo.io/content-management/multilingual/#translation-by-content-directory).
|
||||
|
||||
## Translate Menu Items
|
||||
|
||||
To translate menu items in the navigation bar, we need to set the `identifier` field:
|
||||
|
||||
```yaml {filename="hugo.yaml"}
|
||||
menu:
|
||||
main:
|
||||
- identifier: documentation
|
||||
name: Documentation
|
||||
pageRef: /docs
|
||||
weight: 1
|
||||
- identifier: blog
|
||||
name: Blog
|
||||
pageRef: /blog
|
||||
weight: 2
|
||||
```
|
||||
|
||||
and translate them in the corresponding i18n file:
|
||||
|
||||
```yaml {filename="i18n/fr.yaml"}
|
||||
documentation: Documentation
|
||||
blog: Blog
|
||||
```
|
||||
|
||||
## Translate Strings
|
||||
|
||||
To translate strings on the other places, we need to add the translation to the corresponding i18n file:
|
||||
|
||||
```yaml {filename="i18n/fr.yaml"}
|
||||
readMore: Lire la suite
|
||||
```
|
||||
|
||||
A list of strings used in the theme can be found in the `i18n/en.yaml` file.
|
||||
|
||||
## Read More
|
||||
|
||||
- [Hugo Multilingual Mode](https://gohugo.io/content-management/multilingual/)
|
||||
- [Hugo Multilingual Part 1: Content translation](https://www.regisphilibert.com/blog/2018/08/hugo-multilingual-part-1-managing-content-translation/)
|
||||
- [Hugo Multilingual Part 2: Strings localization](https://www.regisphilibert.com/blog/2018/08/hugo-multilingual-part-2-i18n-string-localization/)
|
@ -1,6 +0,0 @@
|
||||
---
|
||||
title: はじめに
|
||||
weight: 1
|
||||
---
|
||||
|
||||
プロジェクトの紹介。
|
@ -1,84 +0,0 @@
|
||||
---
|
||||
title: Getting Started
|
||||
weight: 1
|
||||
next: /docs/guide
|
||||
prev: /docs
|
||||
---
|
||||
|
||||
## Quick Start from Template
|
||||
|
||||
{{< icon "github" >}} [imfing/hextra-starter-template](https://github.com/imfing/hextra-starter-template)
|
||||
|
||||
You will be able to quickly get started by using the above template repository.
|
||||
|
||||
<img src="https://docs.github.com/assets/cb-77734/mw-1440/images/help/repository/use-this-template-button.webp" width="500">
|
||||
|
||||
We have provided a [GitHub Actions workflow](https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site#publishing-with-a-custom-github-actions-workflow) which can help automatically build and deploy your site to GitHub Pages, and host it for free.
|
||||
|
||||
[🌐 Demo ↗](https://imfing.github.io/hextra-starter-template/)
|
||||
|
||||
## Start as New Project
|
||||
|
||||
### Prerequisites
|
||||
|
||||
Before we start, make sure we have [Hugo](https://gohugo.io/) installed.
|
||||
Please refer to Hugo's [official installation guide](https://gohugo.io/installation/) for more details.
|
||||
|
||||
[Hugo modules](https://gohugo.io/hugo-modules/) are the recommended way to manage Hugo themes. To use Hugo modules, we need to install [Git](https://git-scm.com/) and [Go](https://go.dev/).
|
||||
|
||||
{{% steps %}}
|
||||
|
||||
### Initialize a new Hugo site
|
||||
|
||||
```bash
|
||||
$ hugo new site my-site --format=yaml
|
||||
```
|
||||
|
||||
### Configure Hextra theme via module
|
||||
|
||||
```shell
|
||||
# initialize hugo module
|
||||
$ cd my-site
|
||||
$ hugo mod init github.com/username/my-site
|
||||
|
||||
# add Hextra theme
|
||||
$ hugo mod get github.com/imfing/hextra
|
||||
```
|
||||
|
||||
Edit `hugo.yaml` to enable Hextra theme:
|
||||
|
||||
```yaml
|
||||
module:
|
||||
imports:
|
||||
- path: github.com/imfing/hextra
|
||||
```
|
||||
|
||||
### Create your first content pages
|
||||
|
||||
Let's create a new content page for the home page and the documentation page:
|
||||
|
||||
```shell
|
||||
$ hugo new content/_index.md
|
||||
$ hugo new content/docs/_index.md
|
||||
```
|
||||
|
||||
### Preview the site locally
|
||||
|
||||
```shell
|
||||
$ hugo server
|
||||
```
|
||||
|
||||
Voila! You can see your new site at `http://localhost:1313/`.
|
||||
|
||||
{{% /steps %}}
|
||||
|
||||
|
||||
## Next
|
||||
|
||||
Explore the following sections to start adding more contents:
|
||||
|
||||
{{< cards >}}
|
||||
{{< card link="../guide/organize-files" title="Organize Files" icon="document-duplicate" >}}
|
||||
{{< card link="../guide/configuration" title="Configuration" icon="adjustments" >}}
|
||||
{{< card link="../guide/markdown" title="Markdown" icon="markdown" >}}
|
||||
{{< /cards >}}
|
@ -1,21 +0,0 @@
|
||||
---
|
||||
title: Guide
|
||||
weight: 2
|
||||
next: /docs/guide/organize-files
|
||||
sidebar:
|
||||
open: true
|
||||
---
|
||||
|
||||
Explore the following sections to learn to compose content using Hextra:
|
||||
|
||||
<!--more-->
|
||||
|
||||
{{< cards >}}
|
||||
{{< card link="organize-files" title="Organize Files" icon="document-duplicate" >}}
|
||||
{{< card link="configuration" title="Configuration" icon="adjustments" >}}
|
||||
{{< card link="markdown" title="Markdown" icon="markdown" >}}
|
||||
{{< card link="syntax-highlighting" title="Syntax Highlighting" icon="sparkles" >}}
|
||||
{{< card link="latex" title="LaTeX" icon="variable" >}}
|
||||
{{< card link="diagrams" title="Diagrams" icon="chart-square-bar" >}}
|
||||
{{< card link="shortcodes" title="Shortcodes" icon="template" >}}
|
||||
{{< /cards >}}
|
@ -1,126 +0,0 @@
|
||||
---
|
||||
title: Configuration
|
||||
weight: 2
|
||||
---
|
||||
|
||||
Hugo reads its configuration from `hugo.yaml` in the root of your Hugo site.
|
||||
The config file is where you can configure all aspects of your site.
|
||||
You can find the config file for this site in `exampleSite/hugo.yaml` as a good starting point.
|
||||
|
||||
<!--more-->
|
||||
|
||||
## Navigation
|
||||
|
||||
### Menu
|
||||
|
||||
Top right menu is defined under the `menu.main` section in the config file:
|
||||
|
||||
```yaml {filename="hugo.yaml"}
|
||||
menu:
|
||||
main:
|
||||
- name: Documentation
|
||||
pageRef: /docs
|
||||
weight: 1
|
||||
- name: Blog
|
||||
pageRef: /blog
|
||||
weight: 2
|
||||
- name: About
|
||||
pageRef: /about
|
||||
weight: 3
|
||||
- name: Search
|
||||
weight: 4
|
||||
params:
|
||||
type: search
|
||||
- name: GitHub
|
||||
weight: 5
|
||||
url: "https://github.com/imfing/hextra"
|
||||
params:
|
||||
icon: github
|
||||
```
|
||||
|
||||
There are different types of menu items:
|
||||
|
||||
1. Link to a page in the site with `pageRef`
|
||||
```yaml
|
||||
- name: Documentation
|
||||
pageRef: /docs
|
||||
```
|
||||
2. Link to an external URL with `url`
|
||||
```yaml
|
||||
- name: GitHub
|
||||
url: "https://github.com"
|
||||
```
|
||||
3. Search bar with `type: search`
|
||||
```yaml
|
||||
- name: Search
|
||||
params:
|
||||
type: search
|
||||
```
|
||||
4. Icon
|
||||
```yaml
|
||||
- name: GitHub
|
||||
params:
|
||||
icon: github
|
||||
```
|
||||
|
||||
These menu items can be sorted by setting the `weight` parameter.
|
||||
|
||||
## Sidebar
|
||||
|
||||
### Main Sidebar
|
||||
|
||||
For the main sidebar, it is automatically generated from the structure of the content directory.
|
||||
See the [Organize Files](/docs/guide/organize-files) page for more details.
|
||||
|
||||
### Extra Links
|
||||
|
||||
Sidebar extra links are defined under the `menu.sidebar` section in the config file:
|
||||
|
||||
```yaml {filename="hugo.yaml"}
|
||||
menu:
|
||||
sidebar:
|
||||
- name: More
|
||||
params:
|
||||
type: separator
|
||||
weight: 1
|
||||
- name: "About"
|
||||
pageRef: "/about"
|
||||
weight: 2
|
||||
- name: "Hugo Docs ↗"
|
||||
url: "https://gohugo.io/documentation/"
|
||||
weight: 3
|
||||
```
|
||||
|
||||
## Right Sidebar
|
||||
|
||||
### Table of Contents
|
||||
|
||||
Table of contents is automatically generated from the headings in the content file. It can be disabled by setting `toc: false` in the front matter of the page.
|
||||
|
||||
```yaml {filename="content/docs/guide/configuration.md"}
|
||||
---
|
||||
title: Configuration
|
||||
toc: false
|
||||
---
|
||||
```
|
||||
|
||||
### Page Edit Link
|
||||
|
||||
To configure the page edit link, we can set the `params.editURL.base` parameter in the config file:
|
||||
|
||||
```yaml {filename="hugo.yaml"}
|
||||
params:
|
||||
editURL:
|
||||
base: "https://github.com/your-username/your-repo/edit/main"
|
||||
```
|
||||
|
||||
The edit links will be automatically generated for each page.
|
||||
If you want to set edit link for a specific page, you can set the `params.editURL` parameter in the front matter of the page:
|
||||
|
||||
```yaml {filename="content/docs/guide/configuration.md"}
|
||||
---
|
||||
title: Configuration
|
||||
params:
|
||||
editURL: "https://example.com/edit/this/page"
|
||||
---
|
||||
```
|
@ -1,52 +0,0 @@
|
||||
---
|
||||
title: Diagrams
|
||||
weight: 6
|
||||
---
|
||||
|
||||
Currently, Hextra supports [Mermaid](#mermaid) for diagrams.
|
||||
|
||||
<!--more-->
|
||||
|
||||
## Mermaid
|
||||
|
||||
[Mermaid](https://github.com/mermaid-js/mermaid#readme) is a JavaScript based diagramming and charting tool that takes Markdown-inspired text definitions and creates diagrams dynamically in the browser. For example, Mermaid can render flow charts, sequence diagrams, pie charts and more.
|
||||
|
||||
Using Mermaid in Hextra is as simple as writing a code block with language set `mermaid`:
|
||||
|
||||
````markdown
|
||||
```mermaid
|
||||
graph TD;
|
||||
A-->B;
|
||||
A-->C;
|
||||
B-->D;
|
||||
C-->D;
|
||||
```
|
||||
````
|
||||
|
||||
will be rendered as:
|
||||
|
||||
```mermaid
|
||||
graph TD;
|
||||
A-->B;
|
||||
A-->C;
|
||||
B-->D;
|
||||
C-->D;
|
||||
```
|
||||
|
||||
Sequence diagram:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Alice
|
||||
participant Bob
|
||||
Alice->>John: Hello John, how are you?
|
||||
loop Healthcheck
|
||||
John->>John: Fight against hypochondria
|
||||
end
|
||||
Note right of John: Rational thoughts <br/>prevail!
|
||||
John-->>Alice: Great!
|
||||
John->>Bob: How about you?
|
||||
Bob-->>John: Jolly good!
|
||||
```
|
||||
|
||||
For more information, please refer to [Mermaid Documentation](https://mermaid-js.github.io/mermaid/#/).
|
@ -1,60 +0,0 @@
|
||||
---
|
||||
title: "LaTeX"
|
||||
weight: 4
|
||||
math: true
|
||||
---
|
||||
|
||||
$\KaTeX$ is used for rendering LaTeX math expressions. It can be enabled per page by setting `math` to `true` in the page front matter.
|
||||
|
||||
<!--more-->
|
||||
|
||||
```yaml {filename="Markdown"}
|
||||
---
|
||||
title: "My Page with LaTeX"
|
||||
math: true
|
||||
---
|
||||
|
||||
```
|
||||
|
||||
When enabled, the scripts, stylesheets and fonts from KaTeX will be included automatically in your site. You can start using LaTeX math expressions in your Markdown content.
|
||||
|
||||
## Example
|
||||
|
||||
Both inline and separate paragraph LaTeX math expressions are supported in the Markdown content.
|
||||
|
||||
### Inline
|
||||
|
||||
```markdown {filename="page.md"}
|
||||
This $\sigma(z) = \frac{1}{1 + e^{-z}}$ is inline.
|
||||
```
|
||||
|
||||
This $\sigma(z) = \frac{1}{1 + e^{-z}}$ is inline.
|
||||
|
||||
### Separate Paragraph
|
||||
|
||||
```markdown {filename="page.md"}
|
||||
$$F(\omega) = \int_{-\infty}^{\infty} f(t) e^{-j\omega t} \, dt$$
|
||||
```
|
||||
|
||||
will be rendered as:
|
||||
|
||||
$$F(\omega) = \int_{-\infty}^{\infty} f(t) e^{-j\omega t} \, dt$$
|
||||
|
||||
|
||||
## Supported Functions
|
||||
|
||||
For a list of supported functions, see [KaTeX supported functions](https://katex.org/docs/supported.html).
|
||||
|
||||
## Chemistry
|
||||
|
||||
Chemistry expressions are supported via [mhchem](https://mhchem.github.io/MathJax-mhchem/) extension.
|
||||
|
||||
Inline: $\ce{H2O}$ is water.
|
||||
|
||||
Separate paragraph:
|
||||
|
||||
```markdown {filename="page.md"}
|
||||
$$\ce{Hg^2+ ->[I-] HgI2 ->[I-] [Hg^{II}I4]^2-}$$
|
||||
```
|
||||
|
||||
$$\ce{Hg^2+ ->[I-] HgI2 ->[I-] [Hg^{II}I4]^2-}$$
|
@ -1,106 +0,0 @@
|
||||
---
|
||||
title: Markdown
|
||||
weight: 2
|
||||
---
|
||||
|
||||
Hugo supports [Markdown](https://en.wikipedia.org/wiki/Markdown) syntax for formatting text, creating lists, and more. This page will show you some of the most common Markdown syntax examples.
|
||||
|
||||
<!--more-->
|
||||
|
||||
## Markdown Examples
|
||||
|
||||
### Styling Text
|
||||
|
||||
| Style | Syntax | Example | Output |
|
||||
| -------- | -------- | ------ | ------ |
|
||||
| Bold | `**bold text**` | `**bold text**` | **bold text** |
|
||||
| Italic | `*italicized text*` | `*italicized text* | *italicized text* |
|
||||
| Strikethrough | `~~strikethrough text~~` | `~~strikethrough text~~` | ~~strikethrough text~~ |
|
||||
| Subscript | `<sub></sub>` | `This is a <sub>subscript</sub> text` | This is a <sub>subscript</sub> text |
|
||||
| Superscript | `<sup></sup>` | `This is a <sup>superscript</sup> text` | This is a <sup>superscript</sup> text |
|
||||
|
||||
### Blockquotes
|
||||
|
||||
Blockquote with attribution
|
||||
|
||||
> Don't communicate by sharing memory, share memory by communicating.<br>
|
||||
> — <cite>Rob Pike[^1]</cite>
|
||||
|
||||
[^1]: The above quote is excerpted from Rob Pike's [talk](https://www.youtube.com/watch?v=PAAkCSZUG1c) during Gopherfest, November 18, 2015.
|
||||
|
||||
### Tables
|
||||
|
||||
Tables aren't part of the core Markdown spec, but Hugo supports them out-of-the-box.
|
||||
|
||||
Name | Age
|
||||
--------|------
|
||||
Bob | 27
|
||||
Alice | 23
|
||||
|
||||
#### Inline Markdown within tables
|
||||
|
||||
| Italics | Bold | Code |
|
||||
| -------- | -------- | ------ |
|
||||
| *italics* | **bold** | `code` |
|
||||
|
||||
### Code Blocks
|
||||
|
||||
{{< cards >}}
|
||||
{{< card link="/docs/guide/syntax-highlighting" title="Syntax Highlighting" icon="sparkles" >}}
|
||||
{{< /cards >}}
|
||||
|
||||
### Lists
|
||||
|
||||
#### Ordered List
|
||||
|
||||
1. First item
|
||||
2. Second item
|
||||
3. Third item
|
||||
|
||||
#### Unordered List
|
||||
|
||||
* List item
|
||||
* Another item
|
||||
* And another item
|
||||
|
||||
#### Nested list
|
||||
|
||||
* Fruit
|
||||
* Apple
|
||||
* Orange
|
||||
* Banana
|
||||
* Dairy
|
||||
* Milk
|
||||
* Cheese
|
||||
|
||||
### Images
|
||||
|
||||

|
||||
|
||||
With caption:
|
||||
|
||||

|
||||
|
||||
## Configuration
|
||||
|
||||
Hugo uses [Goldmark](https://github.com/yuin/goldmark) for Markdown parsing.
|
||||
Markdown rendering can be configured in `hugo.yaml` under `markup.goldmark`.
|
||||
Below is the default configuration for Hextra:
|
||||
|
||||
```yaml {filename="hugo.yaml"}
|
||||
markup:
|
||||
goldmark:
|
||||
renderer:
|
||||
unsafe: true
|
||||
highlight:
|
||||
noClasses: false
|
||||
```
|
||||
|
||||
For more configuration options, see Hugo documentation on [Configure Markup](https://gohugo.io/getting-started/configuration-markup/).
|
||||
|
||||
## Learning Resources
|
||||
|
||||
* [Markdown Guide](https://www.markdownguide.org/)
|
||||
* [Markdown Cheatsheet](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet)
|
||||
* [Markdown Tutorial](https://www.markdowntutorial.com/)
|
||||
* [Markdown Reference](https://commonmark.org/help/)
|
@ -1,64 +0,0 @@
|
||||
---
|
||||
title: Organize Files
|
||||
weight: 1
|
||||
---
|
||||
|
||||
## Directory Structure
|
||||
|
||||
By default, Hugo searches for Markdown files in the `content` directory, and the structure of the directory determines the final output structure of your website.
|
||||
Take the example site as an example:
|
||||
|
||||
<!--more-->
|
||||
|
||||
{{< filetree/container >}}
|
||||
{{< filetree/folder name="content" >}}
|
||||
{{< filetree/file name="_index.md" >}}
|
||||
{{< filetree/folder name="docs" state="open" >}}
|
||||
{{< filetree/file name="_index.md" >}}
|
||||
{{< filetree/file name="getting-started.md" >}}
|
||||
{{< filetree/folder name="guide" state="open" >}}
|
||||
{{< filetree/file name="_index.md" >}}
|
||||
{{< filetree/file name="organize-files.md" >}}
|
||||
{{< /filetree/folder >}}
|
||||
{{< /filetree/folder >}}
|
||||
{{< filetree/folder name="blog" state="open" >}}
|
||||
{{< filetree/file name="_index.md" >}}
|
||||
{{< filetree/file name="post-1.md" >}}
|
||||
{{< /filetree/folder >}}
|
||||
{{< /filetree/folder >}}
|
||||
{{< /filetree/container >}}
|
||||
|
||||
Each of the `_index.md` files is the index page for the corresponding section. The other Markdown files are regular pages.
|
||||
|
||||
```
|
||||
content
|
||||
├── _index.md // <- /
|
||||
├── docs
|
||||
│ ├── _index.md // <- /docs/
|
||||
│ ├── getting-started.md // <- /docs/getting-started/
|
||||
│ └── guide
|
||||
│ ├── _index.md // <- /docs/guide/
|
||||
│ └── organize-files.md // <- /docs/guide/organize-files/
|
||||
└── blog
|
||||
├── _index.md // <- /blog/
|
||||
└── post-1.md // <- /blog/post-1/
|
||||
```
|
||||
|
||||
## Sidebar Navigation
|
||||
|
||||
The sidebar navigation is generated automatically based on the content organization alphabetically. To manually configure the sidebar order, we can use the `weight` parameter in the front matter of the Markdown files.
|
||||
|
||||
```yaml {filename="content/docs/guide/_index.md"}
|
||||
---
|
||||
title: Guide
|
||||
weight: 2
|
||||
---
|
||||
```
|
||||
|
||||
{{< callout emoji="ℹ️">}}
|
||||
It is recommended to keep the sidebar not too deep. If you have a lot of content, consider **splitting them into multiple sections**.
|
||||
{{< /callout >}}
|
||||
|
||||
## Configure Content Directory
|
||||
|
||||
If we need to use a different directory for our content, we can do so by setting the [`contentDir`](https://gohugo.io/getting-started/configuration/#contentdir) parameter in our site configuration file.
|
@ -1,6 +0,0 @@
|
||||
---
|
||||
title: コンポーネント
|
||||
weight: 2
|
||||
---
|
||||
|
||||
Hextraは、[Hugo Shortcodes](https://gohugo.io/content-management/shortcodes/)に基づいたさまざまな組み込みコンポーネントを提供しています。
|
@ -1,18 +0,0 @@
|
||||
---
|
||||
title: Shortcodes
|
||||
weight: 9
|
||||
---
|
||||
|
||||
[Hugo Shortcodes](https://gohugo.io/content-management/shortcodes/) are simple snippets inside your content files calling built-in or custom templates.
|
||||
|
||||
Hextra provides a collection of beautiful shortcodes to enhance your content.
|
||||
|
||||
|
||||
{{< cards >}}
|
||||
{{< card link="callouts" title="Callouts" icon="warning" >}}
|
||||
{{< card link="cards" title="Cards" icon="card" >}}
|
||||
{{< card link="filetree" title="FileTree" icon="folder-tree" >}}
|
||||
{{< card link="icon" title="Icon" icon="badge-check" >}}
|
||||
{{< card link="steps" title="Steps" icon="one" >}}
|
||||
{{< card link="tabs" title="Tabs" icon="collection" >}}
|
||||
{{< /cards >}}
|
@ -1,74 +0,0 @@
|
||||
---
|
||||
title: Callout Component
|
||||
linkTitle: Callout
|
||||
---
|
||||
|
||||
A built-in component to show important information to the reader.
|
||||
|
||||
## Example
|
||||
|
||||
{{< callout emoji="👾">}}
|
||||
A **callout** is a short piece of text intended to attract attention.
|
||||
{{< /callout >}}
|
||||
|
||||
{{< callout type="info" >}}
|
||||
A **callout** is a short piece of text intended to attract attention.
|
||||
{{< /callout >}}
|
||||
|
||||
{{< callout type="warning" >}}
|
||||
A **callout** is a short piece of text intended to attract attention.
|
||||
{{< /callout >}}
|
||||
|
||||
{{< callout type="error" >}}
|
||||
A **callout** is a short piece of text intended to attract attention.
|
||||
{{< /callout >}}
|
||||
|
||||
## Usage
|
||||
|
||||
### Default
|
||||
|
||||
{{< callout emoji="🌐">}}
|
||||
Hugo can be used to create a wide variety of websites, including blogs, portfolios, documentation sites, and more.
|
||||
{{< /callout >}}
|
||||
|
||||
```markdown
|
||||
{{</* callout emoji="🌐" */>}}
|
||||
Hugo can be used to create a wide variety of websites, including blogs, portfolios, documentation sites, and more.
|
||||
{{</* /callout */>}}
|
||||
```
|
||||
|
||||
### Info
|
||||
|
||||
{{< callout type="info" >}}
|
||||
Please visit GitHub to see the latest releases.
|
||||
{{< /callout >}}
|
||||
|
||||
```markdown
|
||||
{{</* callout type="info" */>}}
|
||||
Please visit GitHub to see the latest releases.
|
||||
{{</* /callout */>}}
|
||||
```
|
||||
|
||||
### Warning
|
||||
|
||||
{{< callout type="warning" >}}
|
||||
This API will be deprecated in the next version.
|
||||
{{< /callout >}}
|
||||
|
||||
```markdown
|
||||
{{</* callout type="warning" */>}}
|
||||
A **callout** is a short piece of text intended to attract attention.
|
||||
{{</* /callout */>}}
|
||||
```
|
||||
|
||||
### Error
|
||||
|
||||
{{< callout type="error" >}}
|
||||
Something went wrong and it's going to explode.
|
||||
{{< /callout >}}
|
||||
|
||||
```markdown
|
||||
{{</* callout type="error" */>}}
|
||||
Something went wrong and it's going to explode.
|
||||
{{</* /callout */>}}
|
||||
```
|
@ -1,31 +0,0 @@
|
||||
---
|
||||
title: Cards Component
|
||||
linkTitle: Cards
|
||||
---
|
||||
|
||||
## Example
|
||||
|
||||
{{< cards >}}
|
||||
{{< card link="/" title="Callout" icon="warning" >}}
|
||||
{{< card link="/" title="No Icon" >}}
|
||||
{{< /cards >}}
|
||||
|
||||
{{< cards >}}
|
||||
{{< card link="/" title="Image Card" image="https://source.unsplash.com/featured/800x600?landscape" subtitle="Unsplash Landscape" >}}
|
||||
{{< /cards >}}
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
```
|
||||
{{</* cards */>}}
|
||||
{{</* card link="/" title="Callout" icon="warning" */>}}
|
||||
{{</* card link="/" title="No Icon" */>}}
|
||||
{{</* /cards */>}}
|
||||
```
|
||||
|
||||
```
|
||||
{{</* cards */>}}
|
||||
{{</* card link="/" title="Image Card" image="https://source.unsplash.com/featured/800x600?landscape" subtitle="Unsplash Landscape" */>}}
|
||||
{{</* /cards */>}}
|
||||
```
|
@ -1,34 +0,0 @@
|
||||
---
|
||||
title: FileTree Component
|
||||
linkTitle: FileTree
|
||||
---
|
||||
|
||||
## Example
|
||||
|
||||
{{< filetree/container >}}
|
||||
{{< filetree/folder name="content" >}}
|
||||
{{< filetree/file name="_index.md" >}}
|
||||
{{< filetree/folder name="docs" state="closed" >}}
|
||||
{{< filetree/file name="_index.md" >}}
|
||||
{{< filetree/file name="introduction.md" >}}
|
||||
{{< filetree/file name="introduction.fr.md" >}}
|
||||
{{< /filetree/folder >}}
|
||||
{{< /filetree/folder >}}
|
||||
{{< filetree/file name="hugo.toml" >}}
|
||||
{{< /filetree/container >}}
|
||||
|
||||
## Usage
|
||||
|
||||
```text {filename="Markdown"}
|
||||
{{</* filetree/container */>}}
|
||||
{{</* filetree/folder name="content" */>}}
|
||||
{{</* filetree/file name="_index.md" */>}}
|
||||
{{</* filetree/folder name="docs" state="closed" */>}}
|
||||
{{</* filetree/file name="_index.md" */>}}
|
||||
{{</* filetree/file name="introduction.md" */>}}
|
||||
{{</* filetree/file name="introduction.fr.md" */>}}
|
||||
{{</* /filetree/folder */>}}
|
||||
{{</* /filetree/folder */>}}
|
||||
{{</* filetree/file name="hugo.toml" */>}}
|
||||
{{</* /filetree/container */>}}
|
||||
```
|
@ -1,38 +0,0 @@
|
||||
---
|
||||
title: Icon
|
||||
---
|
||||
|
||||
To use this shortcode inline, inline shortcode needs to be enabled in the config:
|
||||
|
||||
```yaml {filename="hugo.yaml"}
|
||||
enableInlineShortcodes: true
|
||||
```
|
||||
|
||||
The list of available icons can be found in `data/icons.yaml`.
|
||||
|
||||
## Example
|
||||
|
||||
{{< icon "academic-cap" >}}
|
||||
{{< icon "cake" >}}
|
||||
{{< icon "gift" >}}
|
||||
{{< icon "sparkles" >}}
|
||||
|
||||
## Usage
|
||||
|
||||
```
|
||||
{{</* icon "github" */>}}
|
||||
```
|
||||
|
||||
[Heroicons](https://v1.heroicons.com/) v1 outline icons are available out of the box.
|
||||
|
||||
You can also add your own icons by adding them to `data/icon.yaml`:
|
||||
|
||||
```yaml {filename="data/icon.yaml"}
|
||||
your-icon: <svg>your icon svg content</svg>
|
||||
```
|
||||
|
||||
which can then be used like this:
|
||||
|
||||
```
|
||||
{{</* icon "your-icon" */>}}
|
||||
```
|
@ -1,40 +0,0 @@
|
||||
---
|
||||
title: Steps
|
||||
---
|
||||
|
||||
A built-in component to display a series of steps.
|
||||
|
||||
## Example
|
||||
|
||||
{{% steps %}}
|
||||
|
||||
### Step 1
|
||||
|
||||
This is the first step.
|
||||
|
||||
### Step 2
|
||||
|
||||
This is the second step.
|
||||
|
||||
### Step 3
|
||||
|
||||
This is the third step.
|
||||
|
||||
{{% /steps %}}
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
Put Markdown h3 header within `steps` shortcode.
|
||||
|
||||
```
|
||||
{{%/* steps */%}}
|
||||
### Step 1
|
||||
|
||||
This is the first step.
|
||||
|
||||
### Step 2
|
||||
|
||||
This is the second step.
|
||||
{{%/* /steps */%}}
|
||||
```
|
@ -1,51 +0,0 @@
|
||||
---
|
||||
title: Tabs
|
||||
---
|
||||
|
||||
## Example
|
||||
|
||||
{{< tabs items="JSON,YAML,TOML" >}}
|
||||
|
||||
{{< tab >}}**JSON**: JavaScript Object Notation (JSON) is a standard text-based format for representing structured data based on JavaScript object syntax.{{< /tab >}}
|
||||
{{< tab >}}**YAML**: YAML is a human-readable data serialization language.{{< /tab >}}
|
||||
{{< tab >}}**TOML**: TOML aims to be a minimal configuration file format that's easy to read due to obvious semantics.{{< /tab >}}
|
||||
|
||||
{{< /tabs >}}
|
||||
|
||||
## Usage
|
||||
|
||||
### Default
|
||||
|
||||
```
|
||||
{{</* tabs items="JSON,YAML,TOML" */>}}
|
||||
|
||||
{{</* tab */>}}**JSON**: JavaScript Object Notation (JSON) is a standard text-based format for representing structured data based on JavaScript object syntax.{{</* /tab */>}}
|
||||
{{</* tab */>}}**YAML**: YAML is a human-readable data serialization language.{{</* /tab */>}}
|
||||
{{</* tab */>}}**TOML**: TOML aims to be a minimal configuration file format that's easy to read due to obvious semantics.{{</* /tab */>}}
|
||||
|
||||
{{</* /tabs */>}}
|
||||
```
|
||||
|
||||
### Specify Selected Index
|
||||
|
||||
Use `defaultIndex` property to specify the selected tab. The index starts from 0.
|
||||
|
||||
```
|
||||
{{</* tabs items="JSON,YAML,TOML" defaultIndex="1" */>}}
|
||||
|
||||
{{</* tab */>}}**JSON**: JavaScript Object Notation (JSON) is a standard text-based format for representing structured data based on JavaScript object syntax.{{</* /tab */>}}
|
||||
{{</* tab */>}}**YAML**: YAML is a human-readable data serialization language.{{</* /tab */>}}
|
||||
{{</* tab */>}}**TOML**: TOML aims to be a minimal configuration file format that's easy to read due to obvious semantics.{{</* /tab */>}}
|
||||
|
||||
{{</* /tabs */>}}
|
||||
```
|
||||
|
||||
The `YAML` tab will be selected by default.
|
||||
|
||||
{{< tabs items="JSON,YAML,TOML" defaultIndex="1" >}}
|
||||
|
||||
{{< tab >}}**JSON**: JavaScript Object Notation (JSON) is a standard text-based format for representing structured data based on JavaScript object syntax.{{< /tab >}}
|
||||
{{< tab >}}**YAML**: YAML is a human-readable data serialization language.{{< /tab >}}
|
||||
{{< tab >}}**TOML**: TOML aims to be a minimal configuration file format that's easy to read due to obvious semantics.{{< /tab >}}
|
||||
|
||||
{{< /tabs >}}
|
@ -1,89 +0,0 @@
|
||||
---
|
||||
title: "Syntax Highlighting"
|
||||
weight: 3
|
||||
---
|
||||
|
||||
Hugo uses [Chroma](https://github.com/alecthomas/chroma), a general purpose syntax highlighter in pure Go, for syntax highlighting.
|
||||
It is recommended to use backticks for code blocks in Markdown content. For example:
|
||||
|
||||
<!--more-->
|
||||
|
||||
````markdown {filename="Markdown"}
|
||||
```python
|
||||
def say_hello():
|
||||
print("Hello!")
|
||||
```
|
||||
````
|
||||
|
||||
will be rendered as:
|
||||
|
||||
```python
|
||||
def say_hello():
|
||||
print("Hello!")
|
||||
```
|
||||
|
||||
## Features
|
||||
|
||||
### Filename
|
||||
|
||||
To add a filename or title to the code block, set attribute `filename`:
|
||||
|
||||
````markdown {filename="Markdown"}
|
||||
```python {filename="hello.py"}
|
||||
def say_hello():
|
||||
print("Hello!")
|
||||
```
|
||||
````
|
||||
|
||||
```python {filename="hello.py"}
|
||||
def say_hello():
|
||||
print("Hello!")
|
||||
```
|
||||
|
||||
### Line Numbers
|
||||
|
||||
To set line numbers, set attribute `linenos` to `table` and optionally set `linenostart` to the starting line number:
|
||||
|
||||
````markdown {filename="Markdown"}
|
||||
```python {linenos=table,linenostart=42}
|
||||
def say_hello():
|
||||
print("Hello!")
|
||||
```
|
||||
````
|
||||
|
||||
```python {linenos=table,linenostart=42}
|
||||
def say_hello():
|
||||
print("Hello!")
|
||||
```
|
||||
|
||||
### Highlighting Lines
|
||||
|
||||
To highlight lines, set attribute `hl_lines` to a list of line numbers:
|
||||
|
||||
````markdown {filename="Markdown"}
|
||||
```python {linenos=table,hl_lines=[2,4],linenostart=1,filename="hello.py"}
|
||||
def say_hello():
|
||||
print("Hello!")
|
||||
|
||||
def main():
|
||||
say_hello()
|
||||
```
|
||||
````
|
||||
|
||||
```python {linenos=table,hl_lines=[2,4],linenostart=1,filename="hello.py"}
|
||||
def say_hello():
|
||||
print("Hello!")
|
||||
|
||||
def main():
|
||||
say_hello()
|
||||
```
|
||||
|
||||
|
||||
### Copy Button
|
||||
|
||||
By default, copy button is enabled for code blocks.
|
||||
|
||||
|
||||
## Supported Languages
|
||||
|
||||
For a list of supported languages, please see [Chroma's documentation](https://github.com/alecthomas/chroma#supported-languages).
|
@ -1,5 +0,0 @@
|
||||
module github.com/imfing/hextra/exampleSite
|
||||
|
||||
go 1.20
|
||||
|
||||
replace github.com/imfing/hextra => ../
|
@ -1,3 +0,0 @@
|
||||
go 1.20
|
||||
|
||||
use ../
|
@ -1,108 +0,0 @@
|
||||
# Configuration
|
||||
baseURL: "https://example.com/"
|
||||
title: "Hextra"
|
||||
|
||||
enableRobotsTXT: true
|
||||
enableGitInfo: true
|
||||
# enableEmoji: false
|
||||
# hasCJKLanguage: true
|
||||
|
||||
outputs:
|
||||
home: [HTML]
|
||||
page: [HTML]
|
||||
section: [HTML, RSS]
|
||||
|
||||
defaultContentLanguage: en
|
||||
languages:
|
||||
en:
|
||||
languageName: English
|
||||
weight: 1
|
||||
title: Hextra
|
||||
ja:
|
||||
languageName: 日本語
|
||||
weight: 2
|
||||
title: "Hextra テーマ"
|
||||
|
||||
module:
|
||||
hugoVersion:
|
||||
extended: true
|
||||
min: "0.111.0"
|
||||
|
||||
workspace: hugo.work
|
||||
imports:
|
||||
path: github.com/imfing/hextra
|
||||
|
||||
markup:
|
||||
goldmark:
|
||||
renderer:
|
||||
unsafe: true
|
||||
highlight:
|
||||
noClasses: false
|
||||
|
||||
enableInlineShortcodes: true
|
||||
|
||||
menu:
|
||||
main:
|
||||
- identifier: documentation
|
||||
name: Documentation
|
||||
pageRef: /docs
|
||||
weight: 1
|
||||
- identifier: blog
|
||||
name: Blog
|
||||
pageRef: /blog
|
||||
weight: 2
|
||||
- identifier: about
|
||||
name: About
|
||||
pageRef: /about
|
||||
weight: 3
|
||||
- name: Search
|
||||
weight: 4
|
||||
params:
|
||||
type: search
|
||||
- name: GitHub
|
||||
weight: 5
|
||||
url: "https://github.com/imfing/hextra"
|
||||
params:
|
||||
icon: github
|
||||
|
||||
sidebar:
|
||||
- identifier: more
|
||||
name: More
|
||||
params:
|
||||
type: separator
|
||||
weight: 1
|
||||
- identifier: about
|
||||
name: "About"
|
||||
pageRef: "/about"
|
||||
weight: 2
|
||||
- identifier: hugoDocs
|
||||
name: "Hugo Docs ↗"
|
||||
url: "https://gohugo.io/documentation/"
|
||||
weight: 3
|
||||
|
||||
params:
|
||||
description: Modern, responsive, batteries-included Hugo theme for creating beautiful static websites.
|
||||
|
||||
navbar:
|
||||
displayTitle: true
|
||||
displayLogo: true
|
||||
logo:
|
||||
path: images/logo.svg
|
||||
dark: images/logo-dark.svg
|
||||
# link: /
|
||||
# width: 40
|
||||
# height: 20
|
||||
|
||||
footer:
|
||||
displayCopyright: true
|
||||
displayPoweredBy: true
|
||||
|
||||
displayUpdatedDate: true
|
||||
dateFormat: "January 2, 2006"
|
||||
|
||||
search:
|
||||
enable: true
|
||||
|
||||
editURL:
|
||||
enable: true
|
||||
base: "https://github.com/imfing/hextra/edit/main/exampleSite/content"
|
@ -1,569 +0,0 @@
|
||||
{
|
||||
"htmlElements": {
|
||||
"tags": [
|
||||
"a",
|
||||
"article",
|
||||
"aside",
|
||||
"blockquote",
|
||||
"body",
|
||||
"br",
|
||||
"button",
|
||||
"cite",
|
||||
"code",
|
||||
"del",
|
||||
"div",
|
||||
"em",
|
||||
"figcaption",
|
||||
"figure",
|
||||
"footer",
|
||||
"g",
|
||||
"h1",
|
||||
"h2",
|
||||
"h3",
|
||||
"h4",
|
||||
"h5",
|
||||
"h6",
|
||||
"head",
|
||||
"hr",
|
||||
"html",
|
||||
"img",
|
||||
"input",
|
||||
"kbd",
|
||||
"li",
|
||||
"link",
|
||||
"main",
|
||||
"meta",
|
||||
"nav",
|
||||
"ol",
|
||||
"p",
|
||||
"path",
|
||||
"pre",
|
||||
"script",
|
||||
"section",
|
||||
"span",
|
||||
"strong",
|
||||
"style",
|
||||
"sub",
|
||||
"sup",
|
||||
"svg",
|
||||
"table",
|
||||
"tbody",
|
||||
"td",
|
||||
"th",
|
||||
"thead",
|
||||
"time",
|
||||
"title",
|
||||
"tr",
|
||||
"ul"
|
||||
],
|
||||
"classes": [
|
||||
"-mb-0.5",
|
||||
"-ml-2",
|
||||
"-mr-2",
|
||||
"-mt-20",
|
||||
"[-webkit-tap-highlight-color:transparent]",
|
||||
"[-webkit-touch-callout:none]",
|
||||
"[counter-reset:step]",
|
||||
"[hyphens:auto]",
|
||||
"[text-underline-position:from-font]",
|
||||
"[word-break:break-word]",
|
||||
"absolute",
|
||||
"active:bg-gray-400/20",
|
||||
"active:opacity-50",
|
||||
"active:shadow-gray-200",
|
||||
"active:shadow-sm",
|
||||
"align-text-bottom",
|
||||
"appearance-none",
|
||||
"aspect-auto",
|
||||
"before:absolute",
|
||||
"before:bg-glass-gradient",
|
||||
"before:bg-gray-200",
|
||||
"before:content-[\"\"]",
|
||||
"before:content-['#']",
|
||||
"before:inset-0",
|
||||
"before:inset-y-1",
|
||||
"before:opacity-25",
|
||||
"before:pointer-events-none",
|
||||
"before:w-px",
|
||||
"bg-black/[.05]",
|
||||
"bg-blue-100",
|
||||
"bg-clip-text",
|
||||
"bg-gradient-to-b",
|
||||
"bg-gradient-to-r",
|
||||
"bg-gray-100",
|
||||
"bg-orange-50",
|
||||
"bg-primary-100",
|
||||
"bg-primary-400",
|
||||
"bg-primary-600",
|
||||
"bg-primary-700/5",
|
||||
"bg-red-100",
|
||||
"bg-transparent",
|
||||
"bg-white",
|
||||
"bg-yellow-50",
|
||||
"block",
|
||||
"border",
|
||||
"border-b",
|
||||
"border-b-2",
|
||||
"border-black/5",
|
||||
"border-blue-200",
|
||||
"border-gray-200",
|
||||
"border-l",
|
||||
"border-orange-100",
|
||||
"border-red-200",
|
||||
"border-t",
|
||||
"border-transparent",
|
||||
"border-yellow-100",
|
||||
"bottom-0",
|
||||
"break-words",
|
||||
"capitalize",
|
||||
"chroma",
|
||||
"code-block",
|
||||
"code-copy-btn",
|
||||
"content",
|
||||
"contrast-more:border",
|
||||
"contrast-more:border-current",
|
||||
"contrast-more:border-gray-900",
|
||||
"contrast-more:border-neutral-400",
|
||||
"contrast-more:border-primary-500",
|
||||
"contrast-more:border-t",
|
||||
"contrast-more:border-transparent",
|
||||
"contrast-more:dark:border-current",
|
||||
"contrast-more:dark:border-gray-50",
|
||||
"contrast-more:dark:border-neutral-400",
|
||||
"contrast-more:dark:border-primary-500",
|
||||
"contrast-more:dark:hover:border-gray-50",
|
||||
"contrast-more:dark:shadow-[0_0_0_1px_#fff]",
|
||||
"contrast-more:dark:shadow-none",
|
||||
"contrast-more:dark:text-current",
|
||||
"contrast-more:dark:text-gray-100",
|
||||
"contrast-more:dark:text-gray-300",
|
||||
"contrast-more:dark:text-gray-50",
|
||||
"contrast-more:font-bold",
|
||||
"contrast-more:hover:border-gray-900",
|
||||
"contrast-more:shadow-[0_0_0_1px_#000]",
|
||||
"contrast-more:shadow-none",
|
||||
"contrast-more:text-current",
|
||||
"contrast-more:text-gray-700",
|
||||
"contrast-more:text-gray-800",
|
||||
"contrast-more:text-gray-900",
|
||||
"contrast-more:underline",
|
||||
"cursor-default",
|
||||
"cursor-pointer",
|
||||
"dark:before:bg-neutral-800",
|
||||
"dark:bg-blue-900/30",
|
||||
"dark:bg-dark",
|
||||
"dark:bg-dark/50",
|
||||
"dark:bg-gray-50/10",
|
||||
"dark:bg-neutral-800",
|
||||
"dark:bg-neutral-900",
|
||||
"dark:bg-orange-400/20",
|
||||
"dark:bg-primary-300/10",
|
||||
"dark:bg-primary-400/10",
|
||||
"dark:bg-primary-600",
|
||||
"dark:bg-red-900/30",
|
||||
"dark:bg-yellow-700/30",
|
||||
"dark:block",
|
||||
"dark:border-blue-200/30",
|
||||
"dark:border-gray-100/20",
|
||||
"dark:border-neutral-700",
|
||||
"dark:border-neutral-800",
|
||||
"dark:border-orange-400/30",
|
||||
"dark:border-red-200/30",
|
||||
"dark:border-white/10",
|
||||
"dark:border-yellow-200/30",
|
||||
"dark:contrast-more:border-neutral-400",
|
||||
"dark:focus:bg-dark",
|
||||
"dark:focus:ring-primary-800",
|
||||
"dark:from-gray-100",
|
||||
"dark:hidden",
|
||||
"dark:hover:bg-gray-100/5",
|
||||
"dark:hover:bg-neutral-700",
|
||||
"dark:hover:bg-neutral-900",
|
||||
"dark:hover:bg-primary-100/5",
|
||||
"dark:hover:bg-primary-700",
|
||||
"dark:hover:border-gray-600",
|
||||
"dark:hover:border-neutral-500",
|
||||
"dark:hover:border-neutral-700",
|
||||
"dark:hover:border-neutral-800",
|
||||
"dark:hover:shadow-none",
|
||||
"dark:hover:text-gray-100",
|
||||
"dark:hover:text-gray-200",
|
||||
"dark:hover:text-gray-300",
|
||||
"dark:hover:text-gray-50",
|
||||
"dark:hover:text-neutral-50",
|
||||
"dark:hover:text-white",
|
||||
"dark:opacity-80",
|
||||
"dark:placeholder:text-gray-400",
|
||||
"dark:ring-white/20",
|
||||
"dark:shadow-[0_-12px_16px_#111]",
|
||||
"dark:shadow-[0_-1px_0_rgba(255,255,255,.1)_inset]",
|
||||
"dark:shadow-none",
|
||||
"dark:text-blue-200",
|
||||
"dark:text-gray-100",
|
||||
"dark:text-gray-200",
|
||||
"dark:text-gray-300",
|
||||
"dark:text-gray-400",
|
||||
"dark:text-gray-50",
|
||||
"dark:text-neutral-200",
|
||||
"dark:text-neutral-400",
|
||||
"dark:text-orange-300",
|
||||
"dark:text-primary-600",
|
||||
"dark:text-red-200",
|
||||
"dark:text-slate-100",
|
||||
"dark:text-yellow-200",
|
||||
"dark:to-gray-400",
|
||||
"data-[state=closed]:hidden",
|
||||
"data-[state=open]:hidden",
|
||||
"data-[state=selected]:block",
|
||||
"data-[state=selected]:border-primary-500",
|
||||
"data-[state=selected]:text-primary-600",
|
||||
"decoration-from-font",
|
||||
"duration-200",
|
||||
"ease-in-out",
|
||||
"filename",
|
||||
"first:mt-0",
|
||||
"flex",
|
||||
"flex-col",
|
||||
"focus:bg-white",
|
||||
"focus:outline-none",
|
||||
"focus:ring-4",
|
||||
"focus:ring-primary-300",
|
||||
"font-bold",
|
||||
"font-extrabold",
|
||||
"font-medium",
|
||||
"font-mono",
|
||||
"font-normal",
|
||||
"font-semibold",
|
||||
"footnote-backref",
|
||||
"footnote-ref",
|
||||
"footnotes",
|
||||
"from-gray-800",
|
||||
"from-gray-900",
|
||||
"gap-1",
|
||||
"gap-2",
|
||||
"gap-4",
|
||||
"grid",
|
||||
"grid-cols-1",
|
||||
"group",
|
||||
"group-[.copied]/copybtn:block",
|
||||
"group-[.copied]/copybtn:hidden",
|
||||
"group-data-[theme=dark]:hidden",
|
||||
"group-data-[theme=light]:hidden",
|
||||
"group-hover/code:opacity-100",
|
||||
"group/code",
|
||||
"group/copybtn",
|
||||
"grow",
|
||||
"h-0",
|
||||
"h-16",
|
||||
"h-2",
|
||||
"h-4",
|
||||
"h-5",
|
||||
"h-7",
|
||||
"h-[18px]",
|
||||
"h-full",
|
||||
"hamburger-menu",
|
||||
"hextra-card",
|
||||
"hextra-cards",
|
||||
"hextra-filetree",
|
||||
"hextra-filetree-folder",
|
||||
"hextra-footer",
|
||||
"hextra-sidebar-collapsible-button",
|
||||
"hextra-toc",
|
||||
"hidden",
|
||||
"highlight",
|
||||
"hover:bg-gray-100",
|
||||
"hover:bg-gray-800/5",
|
||||
"hover:bg-primary-50",
|
||||
"hover:bg-primary-700",
|
||||
"hover:bg-slate-50",
|
||||
"hover:border-gray-200",
|
||||
"hover:border-gray-300",
|
||||
"hover:border-gray-400",
|
||||
"hover:dark:bg-primary-500/10",
|
||||
"hover:dark:text-primary-600",
|
||||
"hover:opacity-60",
|
||||
"hover:opacity-75",
|
||||
"hover:shadow-gray-100",
|
||||
"hover:shadow-lg",
|
||||
"hover:shadow-md",
|
||||
"hover:text-black",
|
||||
"hover:text-gray-800",
|
||||
"hover:text-gray-900",
|
||||
"hover:text-primary-600",
|
||||
"icon",
|
||||
"inline",
|
||||
"inline-block",
|
||||
"inline-flex",
|
||||
"inset-x-0",
|
||||
"inset-y-0",
|
||||
"items-center",
|
||||
"items-start",
|
||||
"justify-between",
|
||||
"justify-center",
|
||||
"justify-end",
|
||||
"justify-items-start",
|
||||
"justify-start",
|
||||
"language-options",
|
||||
"language-switcher",
|
||||
"leading-5",
|
||||
"leading-6",
|
||||
"leading-7",
|
||||
"leading-tight",
|
||||
"left-[24px]",
|
||||
"left-[36px]",
|
||||
"lg:grid-cols-3",
|
||||
"lg:leading-[1.1]",
|
||||
"line-clamp-3",
|
||||
"list-none",
|
||||
"lntable",
|
||||
"lntd",
|
||||
"ltr:-mr-4",
|
||||
"ltr:before:left-0",
|
||||
"ltr:md:left-auto",
|
||||
"ltr:ml-3",
|
||||
"ltr:ml-auto",
|
||||
"ltr:mr-auto",
|
||||
"ltr:pl-12",
|
||||
"ltr:pl-16",
|
||||
"ltr:pl-3",
|
||||
"ltr:pl-4",
|
||||
"ltr:pl-8",
|
||||
"ltr:pr-0",
|
||||
"ltr:pr-2",
|
||||
"ltr:pr-4",
|
||||
"ltr:pr-9",
|
||||
"ltr:right-1.5",
|
||||
"ltr:right-3",
|
||||
"ltr:rotate-180",
|
||||
"ltr:text-right",
|
||||
"m-[11px]",
|
||||
"max-h-64",
|
||||
"max-h-[calc(100vh-var(--navbar-height)-env(safe-area-inset-bottom))]",
|
||||
"max-h-[min(calc(50vh-11rem-env(safe-area-inset-bottom)),400px)]",
|
||||
"max-lg:min-h-[340px]",
|
||||
"max-md:[transform:translate3d(0,-100%,0)]",
|
||||
"max-md:hidden",
|
||||
"max-md:min-h-[340px]",
|
||||
"max-w-6xl",
|
||||
"max-w-[50%]",
|
||||
"max-w-[90rem]",
|
||||
"max-w-[min(calc(100vw-2rem),calc(100%+20rem))]",
|
||||
"max-w-none",
|
||||
"max-w-screen-xl",
|
||||
"max-xl:hidden",
|
||||
"mb-10",
|
||||
"mb-12",
|
||||
"mb-16",
|
||||
"mb-2",
|
||||
"mb-4",
|
||||
"mb-8",
|
||||
"md:aspect-[1.1/1]",
|
||||
"md:h-[calc(100vh-var(--navbar-height)-var(--menu-height))]",
|
||||
"md:hidden",
|
||||
"md:inline-block",
|
||||
"md:justify-start",
|
||||
"md:max-h-[min(calc(100vh-5rem-env(safe-area-inset-bottom)),400px)]",
|
||||
"md:pt-12",
|
||||
"md:px-12",
|
||||
"md:self-start",
|
||||
"md:shrink-0",
|
||||
"md:sticky",
|
||||
"md:text-5xl",
|
||||
"md:text-lg",
|
||||
"md:text-sm",
|
||||
"md:top-16",
|
||||
"md:w-64",
|
||||
"mermaid",
|
||||
"min-h-[100px]",
|
||||
"min-h-[calc(100vh-var(--navbar-height))]",
|
||||
"min-w-0",
|
||||
"min-w-[18px]",
|
||||
"min-w-[24px]",
|
||||
"min-w-full",
|
||||
"ml-1",
|
||||
"ml-4",
|
||||
"mr-2",
|
||||
"mt-1.5",
|
||||
"mt-12",
|
||||
"mt-16",
|
||||
"mt-2",
|
||||
"mt-4",
|
||||
"mt-5",
|
||||
"mt-6",
|
||||
"mt-8",
|
||||
"mx-1",
|
||||
"mx-2",
|
||||
"mx-4",
|
||||
"mx-auto",
|
||||
"my-1.5",
|
||||
"my-2",
|
||||
"next-error-h1",
|
||||
"no-underline",
|
||||
"not-prose",
|
||||
"opacity-0",
|
||||
"opacity-50",
|
||||
"opacity-80",
|
||||
"open",
|
||||
"order-last",
|
||||
"origin-center",
|
||||
"overflow-auto",
|
||||
"overflow-hidden",
|
||||
"overflow-x-auto",
|
||||
"overflow-x-hidden",
|
||||
"overflow-y-auto",
|
||||
"overscroll-contain",
|
||||
"p-0.5",
|
||||
"p-1.5",
|
||||
"p-2",
|
||||
"p-4",
|
||||
"p-6",
|
||||
"pb-6",
|
||||
"pb-8",
|
||||
"pb-[env(safe-area-inset-bottom)]",
|
||||
"pb-px",
|
||||
"pl-5",
|
||||
"pl-6",
|
||||
"pl-[max(env(safe-area-inset-left),1.5rem)]",
|
||||
"placeholder:text-gray-500",
|
||||
"pointer-events-none",
|
||||
"pr-4",
|
||||
"pr-[calc(env(safe-area-inset-right)-1.5rem)]",
|
||||
"pr-[max(env(safe-area-inset-right),1.5rem)]",
|
||||
"print:bg-transparent",
|
||||
"print:hidden",
|
||||
"pt-1",
|
||||
"pt-4",
|
||||
"pt-6",
|
||||
"pt-8",
|
||||
"px-1.5",
|
||||
"px-2",
|
||||
"px-3",
|
||||
"px-4",
|
||||
"px-6",
|
||||
"py-1",
|
||||
"py-1.5",
|
||||
"py-12",
|
||||
"py-2",
|
||||
"py-2.5",
|
||||
"py-3",
|
||||
"py-4",
|
||||
"relative",
|
||||
"right-0",
|
||||
"ring-1",
|
||||
"ring-black/5",
|
||||
"rounded",
|
||||
"rounded-3xl",
|
||||
"rounded-full",
|
||||
"rounded-lg",
|
||||
"rounded-md",
|
||||
"rounded-sm",
|
||||
"rounded-t",
|
||||
"rounded-xl",
|
||||
"rtl:-ml-4",
|
||||
"rtl:-rotate-180",
|
||||
"rtl:before:right-0",
|
||||
"rtl:left-1.5",
|
||||
"rtl:left-3",
|
||||
"rtl:md:right-auto",
|
||||
"rtl:ml-auto",
|
||||
"rtl:mr-3",
|
||||
"rtl:mr-auto",
|
||||
"rtl:pl-2",
|
||||
"rtl:pl-4",
|
||||
"rtl:pl-9",
|
||||
"rtl:pr-12",
|
||||
"rtl:pr-16",
|
||||
"rtl:pr-3",
|
||||
"rtl:pr-4",
|
||||
"rtl:pr-8",
|
||||
"rtl:text-left",
|
||||
"scroll-my-6",
|
||||
"scroll-py-6",
|
||||
"search-input",
|
||||
"search-results",
|
||||
"search-wrapper",
|
||||
"select-none",
|
||||
"shadow",
|
||||
"shadow-[0_-12px_16px_#fff]",
|
||||
"shadow-[0_-12px_16px_white]",
|
||||
"shadow-[0_2px_4px_rgba(0,0,0,.02),0_1px_0_rgba(0,0,0,.06)]",
|
||||
"shadow-gray-100",
|
||||
"shadow-lg",
|
||||
"shadow-sm",
|
||||
"shadow-xl",
|
||||
"shrink-0",
|
||||
"sidebar-active-item",
|
||||
"sidebar-container",
|
||||
"sm:block",
|
||||
"sm:flex",
|
||||
"sm:grid-cols-2",
|
||||
"sm:items-start",
|
||||
"sm:px-4",
|
||||
"sm:text-xl",
|
||||
"sm:w-[110%]",
|
||||
"sr-only",
|
||||
"steps",
|
||||
"sticky",
|
||||
"subheading-anchor",
|
||||
"success-icon",
|
||||
"tabs-panel",
|
||||
"tabs-toggle",
|
||||
"text-2xl",
|
||||
"text-4xl",
|
||||
"text-[10px]",
|
||||
"text-[color:hsl(var(--primary-hue),100%,50%)]",
|
||||
"text-base",
|
||||
"text-blue-900",
|
||||
"text-center",
|
||||
"text-current",
|
||||
"text-ellipsis",
|
||||
"text-gray-100",
|
||||
"text-gray-500",
|
||||
"text-gray-600",
|
||||
"text-gray-700",
|
||||
"text-gray-800",
|
||||
"text-gray-900",
|
||||
"text-left",
|
||||
"text-orange-800",
|
||||
"text-primary-800",
|
||||
"text-red-900",
|
||||
"text-slate-900",
|
||||
"text-sm",
|
||||
"text-transparent",
|
||||
"text-white",
|
||||
"text-xl",
|
||||
"text-xs",
|
||||
"text-yellow-900",
|
||||
"theme-toggle",
|
||||
"to-gray-600",
|
||||
"top-0",
|
||||
"top-16",
|
||||
"top-8",
|
||||
"top-[40%]",
|
||||
"top-full",
|
||||
"tracking-tight",
|
||||
"tracking-tighter",
|
||||
"transition",
|
||||
"transition-all",
|
||||
"transition-colors",
|
||||
"transition-opacity",
|
||||
"transition-transform",
|
||||
"underline",
|
||||
"underline-offset-2",
|
||||
"w-2",
|
||||
"w-3.5",
|
||||
"w-4",
|
||||
"w-64",
|
||||
"w-[110%]",
|
||||
"w-[180%]",
|
||||
"w-full",
|
||||
"w-max",
|
||||
"w-screen",
|
||||
"whitespace-nowrap",
|
||||
"xl:block",
|
||||
"z-20",
|
||||
"z-[-1]"
|
||||
],
|
||||
"ids": null
|
||||
}
|
||||
}
|
115
hugo.yaml
Normal file
115
hugo.yaml
Normal file
@ -0,0 +1,115 @@
|
||||
languageCode: zh-cn
|
||||
title: 代码片段
|
||||
defaultContentLanguage: zh-cn
|
||||
enableRobotsTXT: true
|
||||
enableGitInfo: true
|
||||
enableEmoji: true
|
||||
hasCJKLanguage: true
|
||||
enableInlineShortcodes: true
|
||||
|
||||
# services:
|
||||
# googleAnalytics:
|
||||
# ID: G-MEASUREMENT_ID
|
||||
|
||||
outputs:
|
||||
home: [HTML]
|
||||
page: [HTML]
|
||||
section: [HTML, RSS]
|
||||
|
||||
languages:
|
||||
zh-cn:
|
||||
languageName: 简体中文
|
||||
languageCode: zh-CN
|
||||
weight: 4
|
||||
title: Hextra
|
||||
|
||||
module:
|
||||
hugoVersion:
|
||||
extended: true
|
||||
min: "0.112.0"
|
||||
|
||||
markup:
|
||||
highlight:
|
||||
noClasses: false
|
||||
goldmark:
|
||||
renderer:
|
||||
unsafe: true
|
||||
extensions:
|
||||
passthrough:
|
||||
delimiters:
|
||||
block: [['\[', '\]'], ['$$', '$$']]
|
||||
inline: [['\(', '\)']]
|
||||
enable: true
|
||||
|
||||
menu:
|
||||
main:
|
||||
- name: Search
|
||||
weight: 1
|
||||
params:
|
||||
type: search
|
||||
- name: GitHub
|
||||
weight: 2
|
||||
url: "https://github.com/imfing/hextra-starter-template"
|
||||
params:
|
||||
icon: github
|
||||
|
||||
params:
|
||||
description: Modern, responsive, batteries-included Hugo theme for creating beautiful static websites.
|
||||
|
||||
navbar:
|
||||
displayTitle: true
|
||||
displayLogo: true
|
||||
logo:
|
||||
path: images/logo.svg
|
||||
dark: images/logo-dark.svg
|
||||
# width: 40
|
||||
# height: 20
|
||||
# link: /
|
||||
width: wide
|
||||
|
||||
page:
|
||||
# full (100%), wide (90rem), normal (1280px)
|
||||
width: normal
|
||||
|
||||
theme:
|
||||
# light | dark | system
|
||||
default: system
|
||||
displayToggle: true
|
||||
|
||||
footer:
|
||||
enable: true
|
||||
displayCopyright: true
|
||||
displayPoweredBy: true
|
||||
width: normal
|
||||
|
||||
displayUpdatedDate: true
|
||||
dateFormat: "January 2, 2006"
|
||||
|
||||
# Search
|
||||
# flexsearch is enabled by default
|
||||
search:
|
||||
enable: true
|
||||
type: flexsearch
|
||||
|
||||
flexsearch:
|
||||
# index page by: content | summary | heading | title
|
||||
index: content
|
||||
# full | forward | reverse | strict
|
||||
# https://github.com/nextapps-de/flexsearch/#tokenizer-prefix-search
|
||||
tokenize: forward
|
||||
|
||||
editURL:
|
||||
enable: false
|
||||
|
||||
blog:
|
||||
list:
|
||||
displayTags: true
|
||||
# date | lastmod | publishDate | title | weight
|
||||
sortBy: date
|
||||
sortOrder: desc # or "asc"
|
||||
|
||||
highlight:
|
||||
copy:
|
||||
enable: true
|
||||
# hover | always
|
||||
display: hover
|
14
i18n/cs.yaml
Normal file
14
i18n/cs.yaml
Normal file
@ -0,0 +1,14 @@
|
||||
backToTop: "Zpět nahoru"
|
||||
changeLanguage: "Změnit jazyk"
|
||||
changeTheme: "Změnit vzhled"
|
||||
copyCode: "Zkopírovat kód"
|
||||
copyright: "© 2025 Hextra Project."
|
||||
dark: "Tmavý"
|
||||
editThisPage: "Upravit tuto stránku na GitHubu →"
|
||||
lastUpdated: "Naposledy změněno"
|
||||
light: "Světlý"
|
||||
noResultsFound: "Nebylo nic nalezeno."
|
||||
onThisPage: "Na této stránce"
|
||||
poweredBy: "Powered by Hextra"
|
||||
readMore: "Přečíst víc →"
|
||||
searchPlaceholder: "Hledat..."
|
14
i18n/de.yaml
Normal file
14
i18n/de.yaml
Normal file
@ -0,0 +1,14 @@
|
||||
backToTop: "Nach oben"
|
||||
changeLanguage: "Sprache ändern"
|
||||
changeTheme: "Darstellung ändern"
|
||||
copyCode: "Code kopieren"
|
||||
copyright: "© 2025 Hextra Project."
|
||||
dark: "Dunkel"
|
||||
editThisPage: "Diese Seite auf GitHub bearbeiten →"
|
||||
lastUpdated: "Zuletzt aktualisiert am"
|
||||
light: "Hell"
|
||||
noResultsFound: "Keine Ergebnisse gefunden."
|
||||
onThisPage: "Auf dieser Seite"
|
||||
poweredBy: "Unterstützt durch Hextra"
|
||||
readMore: "Mehr lesen →"
|
||||
searchPlaceholder: "Suchen..."
|
15
i18n/en.yaml
15
i18n/en.yaml
@ -1,5 +1,14 @@
|
||||
onThisPage: "On this page"
|
||||
backToTop: "Scroll to top"
|
||||
changeLanguage: "Change language"
|
||||
changeTheme: "Change theme"
|
||||
copyCode: "Copy code"
|
||||
copyright: "© 2025 Hextra Project."
|
||||
dark: "Dark"
|
||||
editThisPage: "Edit this page on GitHub →"
|
||||
lastUpdated: "Last updated on"
|
||||
|
||||
copyright: "© 2023 Hextra Project."
|
||||
light: "Light"
|
||||
noResultsFound: "No results found."
|
||||
onThisPage: "On this page"
|
||||
poweredBy: "Powered by Hextra"
|
||||
readMore: "Read more →"
|
||||
searchPlaceholder: "Search..."
|
||||
|
13
i18n/es.yaml
Normal file
13
i18n/es.yaml
Normal file
@ -0,0 +1,13 @@
|
||||
backToTop: "Subir al inicio"
|
||||
changeLanguage: "Cambiar idioma"
|
||||
changeTheme: "Cambiar tema"
|
||||
copyright: "© 2025 Proyecto Hextra."
|
||||
dark: "Oscuro"
|
||||
editThisPage: "Edita esta página en GitHub →"
|
||||
lastUpdated: "Última actualización"
|
||||
light: "Claro"
|
||||
noResultsFound: "No hubo resultados."
|
||||
onThisPage: "En esta página"
|
||||
poweredBy: "Con tecnología de Hextra"
|
||||
readMore: "Leer más →"
|
||||
searchPlaceholder: "Buscar..."
|
14
i18n/fa.yaml
Normal file
14
i18n/fa.yaml
Normal file
@ -0,0 +1,14 @@
|
||||
backToTop: "به بالا بروید"
|
||||
changeLanguage: "تغییر زبان"
|
||||
changeTheme: "تغییر تم"
|
||||
copyCode: "کپی کد"
|
||||
copyright: "© ۲۰۲۴ پروژه هگزترا."
|
||||
dark: "تیره"
|
||||
editThisPage: "ویرایش این صفحه در گیتهاب ←"
|
||||
lastUpdated: "آخرین بهروزرسانی در"
|
||||
light: "روشن"
|
||||
noResultsFound: "هیچ نتیجهای پیدا نشد."
|
||||
onThisPage: "در این صفحه"
|
||||
poweredBy: "طراحی شده توسط هگزترا"
|
||||
readMore: "ادامه مطلب ←"
|
||||
searchPlaceholder: "جستجو..."
|
13
i18n/fr.yaml
Normal file
13
i18n/fr.yaml
Normal file
@ -0,0 +1,13 @@
|
||||
backToTop: "Revenir en haut"
|
||||
changeLanguage: "Changer la langue"
|
||||
changeTheme: "Thème d'affichage"
|
||||
copyright: "© 2025 Hextra Project."
|
||||
dark: "Sombre"
|
||||
editThisPage: "Modifier cette page sur GitHub →"
|
||||
lastUpdated: "Dernière modification"
|
||||
light: "Clair"
|
||||
noResultsFound: "Pas de résultats trouvés"
|
||||
onThisPage: "Sur cette page"
|
||||
poweredBy: "Propulsé par Hextra"
|
||||
readMore: "Lire plus →"
|
||||
searchPlaceholder: "Rechercher..."
|
14
i18n/he.yaml
Normal file
14
i18n/he.yaml
Normal file
@ -0,0 +1,14 @@
|
||||
backToTop: "גלול למעלה"
|
||||
changeLanguage: "שנה שפה"
|
||||
changeTheme: "שנה ערכת צבעים"
|
||||
copyCode: "העתק קוד"
|
||||
copyright: "© 2025 פרוייקט Hextra"
|
||||
dark: "כהה"
|
||||
editThisPage: "← ערוך עמוד זה בגיטהאב"
|
||||
lastUpdated: "עודכן לאחרונה ב"
|
||||
light: "בהיר"
|
||||
noResultsFound: "לא נמצאו תוצאות."
|
||||
onThisPage: "בעמוד זה"
|
||||
poweredBy: "Hextra מופעל על-ידי"
|
||||
readMore: "← קרא עוד"
|
||||
searchPlaceholder: "חיפוש..."
|
27
i18n/ja.yaml
27
i18n/ja.yaml
@ -1,16 +1,13 @@
|
||||
# Navbar
|
||||
documentation: "ドキュメンテーション"
|
||||
blog: "ブログ"
|
||||
about: "このサイトについて"
|
||||
|
||||
more: "もっと"
|
||||
hugoDocs: "Hugoドキュメント ↗"
|
||||
|
||||
searchPlaceholder: "検索ドキュメント..."
|
||||
noResultsFound: "検索結果が見つかりませんでした"
|
||||
|
||||
onThisPage: "このページでは"
|
||||
editThisPage: "このページをGitHubで編集する →"
|
||||
backToTop: "トップにスクロール"
|
||||
changeLanguage: "言語を変更"
|
||||
changeTheme: "テーマを変更"
|
||||
copyright: "© 2025 Hextra プロジェクト。"
|
||||
dark: "ダーク"
|
||||
editThisPage: "このページをGitHubで編集 →"
|
||||
lastUpdated: "最終更新日"
|
||||
|
||||
copyright: "© 2023 Hextra Project."
|
||||
light: "ライト"
|
||||
noResultsFound: "結果が見つかりませんでした。"
|
||||
onThisPage: "このページの内容"
|
||||
poweredBy: "提供元 Hextra"
|
||||
readMore: "もっと読む →"
|
||||
searchPlaceholder: "検索..."
|
||||
|
13
i18n/ko.yaml
Normal file
13
i18n/ko.yaml
Normal file
@ -0,0 +1,13 @@
|
||||
backToTop: "맨위로 스크롤"
|
||||
changeLanguage: "언어변경"
|
||||
changeTheme: "테마변경"
|
||||
copyright: "© 2025 Hextra Project."
|
||||
dark: "어두운 테마"
|
||||
editThisPage: "GitHub에서 편집하기 →"
|
||||
lastUpdated: "마지막 수정일자"
|
||||
light: "밝은 테마"
|
||||
noResultsFound: "결과 없음"
|
||||
onThisPage: "페이지 목차"
|
||||
poweredBy: "제공 Hextra"
|
||||
readMore: "더보기 →"
|
||||
searchPlaceholder: "검색..."
|
13
i18n/nb.yaml
Normal file
13
i18n/nb.yaml
Normal file
@ -0,0 +1,13 @@
|
||||
backToTop: "Gå til toppen"
|
||||
changeLanguage: "Endre språk"
|
||||
changeTheme: "Endre tema"
|
||||
copyright: "© 2025 Hextra-prosjektet."
|
||||
dark: "Mørk"
|
||||
editThisPage: "Rediger denne siden på GitHub →"
|
||||
lastUpdated: "Sist oppdatert"
|
||||
light: "Lys"
|
||||
noResultsFound: "Fant ingen treff."
|
||||
onThisPage: "På denne siden"
|
||||
poweredBy: "Powered by Hextra"
|
||||
readMore: "Les mer →"
|
||||
searchPlaceholder: "Søk..."
|
14
i18n/nl.yaml
Normal file
14
i18n/nl.yaml
Normal file
@ -0,0 +1,14 @@
|
||||
backToTop: "Terug naar boven"
|
||||
changeLanguage: "Taal veranderen"
|
||||
changeTheme: "Thema aanpassen"
|
||||
copyCode: "Kopieer code"
|
||||
copyright: "© 2025 Hextra Project."
|
||||
dark: "Donker"
|
||||
editThisPage: "Bewerk deze pagina op GitHub →"
|
||||
lastUpdated: "Laatst bijgewerkt op"
|
||||
light: "Licht"
|
||||
noResultsFound: "Geen resultaten gevonden."
|
||||
onThisPage: "Op deze pagina"
|
||||
poweredBy: "Mogelijk gemaakt door Hextra"
|
||||
readMore: "Lees meer →"
|
||||
searchPlaceholder: "Zoeken..."
|
13
i18n/nn.yaml
Normal file
13
i18n/nn.yaml
Normal file
@ -0,0 +1,13 @@
|
||||
backToTop: "Gå til toppen"
|
||||
changeLanguage: "Endre språk"
|
||||
changeTheme: "Endre tema"
|
||||
copyright: "© 2025 Hextra-prosjektet."
|
||||
dark: "Mørk"
|
||||
editThisPage: "Rediger denne sida på GitHub →"
|
||||
lastUpdated: "Sist oppdatert"
|
||||
light: "Ljos"
|
||||
noResultsFound: "Fann ingen treff."
|
||||
onThisPage: "På denne sida"
|
||||
poweredBy: "Powered by Hextra"
|
||||
readMore: "Les meir →"
|
||||
searchPlaceholder: "Søk..."
|
13
i18n/pt.yaml
Normal file
13
i18n/pt.yaml
Normal file
@ -0,0 +1,13 @@
|
||||
backToTop: "Voltar ao topo"
|
||||
changeLanguage: "Mudar a língua"
|
||||
changeTheme: "Mudar tema"
|
||||
copyright: "© 2025 Projecto Hextra."
|
||||
dark: "Escuro"
|
||||
editThisPage: "Edita esta página no GitHub →"
|
||||
lastUpdated: "Última modificação"
|
||||
light: "Claro"
|
||||
noResultsFound: "Nenhum resultado encontrado"
|
||||
onThisPage: "Nesta página"
|
||||
poweredBy: "Com a tecnologia de Hextra"
|
||||
readMore: "Ler mais →"
|
||||
searchPlaceholder: "Procurar..."
|
14
i18n/ro.yaml
Normal file
14
i18n/ro.yaml
Normal file
@ -0,0 +1,14 @@
|
||||
backToTop: "Înapoi sus"
|
||||
changeLanguage: "Schimbă limba"
|
||||
changeTheme: "Schimbă tema"
|
||||
copyCode: "Copiază codul"
|
||||
copyright: "© 2025 Hextra Project."
|
||||
dark: "Întuneric"
|
||||
editThisPage: "Editați această pagină pe GitHub ←"
|
||||
lastUpdated: "Ultima actualizare la"
|
||||
light: "Lumină"
|
||||
noResultsFound: "Nici un rezultat găsit."
|
||||
onThisPage: "Pe această pagină"
|
||||
poweredBy: "Susținut de Hextra"
|
||||
readMore: "Citește mai mult ←"
|
||||
searchPlaceholder: "Caută..."
|
14
i18n/ru.yaml
Normal file
14
i18n/ru.yaml
Normal file
@ -0,0 +1,14 @@
|
||||
backToTop: 'Прокрутить к началу'
|
||||
changeLanguage: 'Изменить язык'
|
||||
changeTheme: 'Изменить тему'
|
||||
copyCode: 'Скопировать код'
|
||||
copyright: '2025 Проект Hextra.'
|
||||
dark: 'Темная'
|
||||
editThisPage: 'Отредактировать страницу на GitHub →'
|
||||
lastUpdated: 'Последнее обновление'
|
||||
light: 'Светлая'
|
||||
noResultsFound: 'Ничего не найдено.'
|
||||
onThisPage: 'На этой странице'
|
||||
poweredBy: 'При поддержке Hextra'
|
||||
readMore: 'Читать далее →'
|
||||
searchPlaceholder: 'Поиск...'
|
13
i18n/sw.yaml
Normal file
13
i18n/sw.yaml
Normal file
@ -0,0 +1,13 @@
|
||||
backToTop: "Tembeza hadi juu"
|
||||
changeLanguage: "Badilisha lugha"
|
||||
changeTheme: "Badilisha mandhari"
|
||||
copyright: "© 2025 Hextra Project."
|
||||
dark: "Meusi"
|
||||
editThisPage: "Hariri ukurasa huu kwenye GitHub →"
|
||||
lastUpdated: "Ilisasishwa mwisho"
|
||||
light: "Meupe"
|
||||
noResultsFound: "Hakuna matokeo yalipopatikana."
|
||||
onThisPage: "Kwenye ukurasa huu"
|
||||
poweredBy: "Inaendeshwa na Hextra"
|
||||
readMore: "Soma zaidi →"
|
||||
searchPlaceholder: "Tafuta..."
|
14
i18n/uk.yaml
Normal file
14
i18n/uk.yaml
Normal file
@ -0,0 +1,14 @@
|
||||
backToTop: "Прокрутити до початку"
|
||||
changeLanguage: "Змінити мову"
|
||||
changeTheme: "Змінити тему"
|
||||
copyCode: "Скопіювати код"
|
||||
copyright: "2025 Проєкт Hextra."
|
||||
dark: "Темна"
|
||||
editThisPage: "Редагувати цю сторінку на GitHub →"
|
||||
lastUpdated: "Востаннє оновлено"
|
||||
light: "Світла"
|
||||
noResultsFound: "Не знайдено результатів"
|
||||
onThisPage: "На цій сторінці"
|
||||
poweredBy: "Працює завдяки Hextra"
|
||||
readMore: "Читати більше →"
|
||||
searchPlaceholder: "Пошук..."
|
13
i18n/vi.yaml
Normal file
13
i18n/vi.yaml
Normal file
@ -0,0 +1,13 @@
|
||||
backToTop: "Lướt lên đầu trang"
|
||||
changeLanguage: "Đổi ngôn ngữ"
|
||||
changeTheme: "Đổi chủ đề"
|
||||
copyright: "© 2025 Hextra Project."
|
||||
dark: "Tối"
|
||||
editThisPage: "Sửa trang này trên GitHub →"
|
||||
lastUpdated: "Lần cuối cập nhật lúc"
|
||||
light: "Sáng"
|
||||
noResultsFound: "Không tìm thấy kết quả."
|
||||
onThisPage: "Ở trang này"
|
||||
poweredBy: "Chạy bởi Hextra"
|
||||
readMore: "Đọc thêm →"
|
||||
searchPlaceholder: "Tìm kiếm..."
|
13
i18n/zh-cn.yaml
Normal file
13
i18n/zh-cn.yaml
Normal file
@ -0,0 +1,13 @@
|
||||
backToTop: "返回顶部"
|
||||
changeLanguage: "切换语言"
|
||||
changeTheme: "切换主题"
|
||||
copyright: "© 2025 Hextra Project."
|
||||
dark: "深色"
|
||||
editThisPage: "在 GitHub 上编辑此页 →"
|
||||
lastUpdated: "最后更新于"
|
||||
light: "浅色"
|
||||
noResultsFound: "无结果"
|
||||
onThisPage: "此页上"
|
||||
poweredBy: "由 Hextra 驱动"
|
||||
readMore: "更多 →"
|
||||
searchPlaceholder: "搜索文档..."
|
13
i18n/zh-tw.yaml
Normal file
13
i18n/zh-tw.yaml
Normal file
@ -0,0 +1,13 @@
|
||||
backToTop: "返回頂部"
|
||||
changeLanguage: "切換語言"
|
||||
changeTheme: "切換主題"
|
||||
copyright: "© 2025 Hextra Project."
|
||||
dark: "深色"
|
||||
editThisPage: "在 GitHub 上編輯此頁 →"
|
||||
lastUpdated: "最後更新於"
|
||||
light: "淺色"
|
||||
noResultsFound: "無結果"
|
||||
onThisPage: "此頁上"
|
||||
poweredBy: "由 Hextra 驅動"
|
||||
readMore: "更多 →"
|
||||
searchPlaceholder: "搜尋文檔..."
|
@ -1,27 +1,39 @@
|
||||
<div style='font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"; height:100vh; text-align:center; display:flex; flex-direction:column; align-items:center; justify-content:center'>
|
||||
<div>
|
||||
<style>
|
||||
body {
|
||||
color: #000;
|
||||
background: #fff;
|
||||
margin: 0;
|
||||
}
|
||||
.next-error-h1 {
|
||||
border-right: 1px solid rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
@media (prefers-color-scheme: dark) {
|
||||
body {
|
||||
color: #fff;
|
||||
background: #000;
|
||||
}
|
||||
.next-error-h1 {
|
||||
border-right: 1px solid rgba(255, 255, 255, 0.3);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<h1 class="next-error-h1" style='display: inline-block; margin: 0 20px 0 0; padding-right: 23px; font-size: 24px; font-weight: 500; vertical-align: top; line-height: 49px; font-feature-settings: "rlig" 1,"calt" 1,"ss01" 1,"ss06" 1 !important;'>404</h1>
|
||||
<div style="display: inline-block; text-align: left">
|
||||
<h2 style="font-size: 14px; font-weight: 400; line-height: 49px; margin: 0">This page could not be found.</h2>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<body
|
||||
style='font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"; height:100vh; text-align:center; display:flex; flex-direction:column; align-items:center; justify-content:center'>
|
||||
<div>
|
||||
<style>
|
||||
body {
|
||||
color: #000;
|
||||
background: #fff;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.next-error-h1 {
|
||||
border-right: 1px solid rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
body {
|
||||
color: #fff;
|
||||
background: #000;
|
||||
}
|
||||
|
||||
.next-error-h1 {
|
||||
border-right: 1px solid rgba(255, 255, 255, 0.3);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<h1 class="next-error-h1"
|
||||
style='display: inline-block; margin: 0 20px 0 0; padding-right: 23px; font-size: 24px; font-weight: 500; vertical-align: top; line-height: 49px; font-feature-settings: "rlig" 1,"calt" 1,"ss01" 1,"ss06" 1 !important;'>
|
||||
404</h1>
|
||||
<div style="display: inline-block; text-align: left">
|
||||
<h2 style="font-size: 14px; font-weight: 400; line-height: 49px; margin: 0">This page could not be found.
|
||||
</h2>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
9
layouts/_default/_markup/render-blockquote-alert.html
Normal file
9
layouts/_default/_markup/render-blockquote-alert.html
Normal file
@ -0,0 +1,9 @@
|
||||
{{- if not (in (slice "note" "tip" "important" "warning" "caution") .AlertType) -}}
|
||||
{{- warnf "Alert type %s is not supported" .AlertType -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $content := .Text -}}
|
||||
{{- $alertType := .AlertType -}}
|
||||
{{- $alertTitle := .AlertTitle -}}
|
||||
|
||||
{{- partial "components/github-style-alert.html" (dict "content" $content "alertType" $alertType "alertTitle" $alertTitle) -}}
|
3
layouts/_default/_markup/render-blockquote-regular.html
Normal file
3
layouts/_default/_markup/render-blockquote-regular.html
Normal file
@ -0,0 +1,3 @@
|
||||
<blockquote>
|
||||
{{ .Text }}
|
||||
</blockquote>
|
@ -1,4 +1,4 @@
|
||||
<pre class="mermaid mt-6">
|
||||
<pre class="mermaid hx-mt-6">
|
||||
{{- .Inner | safeHTML -}}
|
||||
</pre>
|
||||
{{- .Page.Store.Set "hasMermaid" true -}}
|
||||
|
@ -1,23 +1,13 @@
|
||||
{{- $class := .Attributes.class | default "" -}}
|
||||
{{- $filename := .Attributes.filename | default "" -}}
|
||||
{{- $base_url := .Attributes.base_url | default "" -}}
|
||||
{{- $lang := .Attributes.lang | default .Type -}}
|
||||
|
||||
|
||||
<div class="code-block relative mt-6 first:mt-0 group/code">
|
||||
{{- if $filename -}}
|
||||
<div class="filename">{{ $filename }}</div>
|
||||
<div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
|
||||
{{- partial "components/codeblock" (dict "filename" $filename "lang" $lang "base_url" $base_url "content" .Inner "options" .Options) -}}
|
||||
|
||||
{{- if or (eq site.Params.highlight.copy.enable nil) (site.Params.highlight.copy.enable) -}}
|
||||
{{- partialCached "components/codeblock-copy-button" (dict "filename" $filename) $filename -}}
|
||||
{{- end -}}
|
||||
{{- if transform.CanHighlight $lang -}}
|
||||
<div id="code-block-{{ .Ordinal }}">
|
||||
{{- highlight .Inner $lang .Options -}}
|
||||
</div>
|
||||
{{- else -}}
|
||||
<pre><code id="code-block-{{ .Ordinal }}">{{ .Inner }}</code></pre>
|
||||
{{- end -}}
|
||||
<div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 {{ if $filename }}top-8{{ else }}top-0{{ end }}">
|
||||
<button class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50" title="Copy code" data-clipboard-target="#code-block-{{ .Ordinal }}">
|
||||
{{ partial "utils/icon.html" (dict "name" "copy" "attributes" "class=\"group-[.copied]/copybtn:hidden pointer-events-none h-4 w-4\"") }}
|
||||
{{ partial "utils/icon.html" (dict "name" "check" "attributes" "class=\"hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4\"") }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1,7 +1,7 @@
|
||||
<h{{ .Level }}>
|
||||
{{- .Text | safeHTML -}}
|
||||
{{- if gt .Level 1 -}}
|
||||
<span class="absolute -mt-20" id="{{ .Anchor | safeURL }}"></span>
|
||||
<span class="hx-absolute -hx-mt-20" id="{{ .Anchor | safeURL }}"></span>
|
||||
<a href="#{{ .Anchor | safeURL }}" class="subheading-anchor" aria-label="Permalink for this section"></a>
|
||||
{{- end -}}
|
||||
</h{{ .Level }}>
|
||||
|
@ -1,8 +1,27 @@
|
||||
{{- if .Title -}}
|
||||
{{- $alt := .PlainText | safeHTML -}}
|
||||
{{- $lazyLoading := .Page.Site.Params.enableImageLazyLoading | default true -}}
|
||||
{{- $dest := .Destination -}}
|
||||
|
||||
{{- $isLocal := not (urls.Parse $dest).Scheme -}}
|
||||
{{- $isPage := and (eq .Page.Kind "page") (not .Page.BundleType) -}}
|
||||
{{- $startsWithSlash := hasPrefix $dest "/" -}}
|
||||
{{- $startsWithRelative := hasPrefix $dest "../" -}}
|
||||
|
||||
{{- if and $dest $isLocal -}}
|
||||
{{- if $startsWithSlash -}}
|
||||
{{/* Images under static directory */}}
|
||||
{{- $dest = (relURL (strings.TrimPrefix "/" $dest)) -}}
|
||||
{{- else if and $isPage (not $startsWithRelative) -}}
|
||||
{{/* Images that are sibling to the individual page file */}}
|
||||
{{ $dest = (printf "../%s" $dest) }}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- with .Title -}}
|
||||
<figure>
|
||||
<img src="{{ .Destination | safeURL }}" title="{{ .Title }}" alt="{{ .PlainText | safeHTML }}" loading="lazy" />
|
||||
<figcaption>{{ .Title }}</figcaption>
|
||||
<img src="{{ $dest | safeURL }}" title="{{ . }}" alt="{{ $alt }}" {{ if $lazyLoading }}loading="lazy"{{ end }} />
|
||||
<figcaption>{{ . }}</figcaption>
|
||||
</figure>
|
||||
{{- else -}}
|
||||
<img src="{{ .Destination | safeURL }}" alt="{{ .PlainText | safeHTML }}" loading="lazy" />
|
||||
<img src="{{ $dest | safeURL }}" alt="{{ $alt }}" {{ if $lazyLoading }}loading="lazy"{{ end }} />
|
||||
{{- end -}}
|
||||
|
@ -1,10 +1,12 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{ .Site.Language.Lang }}">
|
||||
{{- partial "head.html" . -}}
|
||||
<body dir="ltr">
|
||||
<body dir="{{ .Site.Language.LanguageDirection | default `ltr` }}">
|
||||
{{- partial "navbar.html" . -}}
|
||||
{{- block "main" . }}{{ end -}}
|
||||
{{- if not .Site.Params.footer.disabled }}{{ partial "footer.html" . }}{{ end }}
|
||||
{{- if or (eq .Site.Params.footer.enable nil) (.Site.Params.footer.enable) }}
|
||||
{{ partial "footer.html" . }}
|
||||
{{ end }}
|
||||
{{ partial "scripts.html" . }}
|
||||
</body>
|
||||
{{ partial "scripts.html" . }}
|
||||
</html>
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user