Merge remote-tracking branch 'origin/main' into sidebar-data-source

This commit is contained in:
Xin 2024-11-11 22:59:41 +00:00
commit 168ecf91f4
77 changed files with 3213 additions and 1372 deletions

View File

@ -3,7 +3,7 @@
"features": { "features": {
"ghcr.io/devcontainers/features/hugo:1": { "ghcr.io/devcontainers/features/hugo:1": {
"extended": true, "extended": true,
"version": "0.124.1" "version": "0.131.0"
}, },
"ghcr.io/devcontainers/features/node:1": {} "ghcr.io/devcontainers/features/node:1": {}
}, },

View File

@ -57,7 +57,7 @@ We recommend that you search existing [issues][issues] or discussions before ope
### Local development setup ### Local development setup
- [Hugo][hugo] >= v0.115.0 (extended version) - [Hugo][hugo] >= v0.124.0 (extended version)
- [Node.js][nodejs] - [Node.js][nodejs]
- [Go][go] - [Go][go]

View File

@ -17,6 +17,8 @@ assignees: ''
2. 2.
3. 3.
<!-- Provide a minimal example or link to a repository that reproduces the bug -->
**Expected Behavior** **Expected Behavior**
<!-- What should have happened? --> <!-- What should have happened? -->

View File

@ -31,7 +31,7 @@ jobs:
build: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
env: env:
HUGO_VERSION: 0.124.1 HUGO_VERSION: 0.136.5
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
@ -41,10 +41,10 @@ jobs:
- name: Setup Go - name: Setup Go
uses: actions/setup-go@v5 uses: actions/setup-go@v5
with: with:
go-version: '1.22' go-version: '1.23'
- name: Setup Pages - name: Setup Pages
id: pages id: pages
uses: actions/configure-pages@v4 uses: actions/configure-pages@v5
- name: Setup Hugo - name: Setup Hugo
run: | run: |
wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \ wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \
@ -54,11 +54,12 @@ jobs:
# For maximum backward compatibility with Hugo modules # For maximum backward compatibility with Hugo modules
HUGO_ENVIRONMENT: production HUGO_ENVIRONMENT: production
HUGO_ENV: production HUGO_ENV: production
# Use the latest release of the theme to build exampleSite
run: | run: |
hugo \ cd exampleSite && rm go.mod
--minify \ hugo mod init github.com/imfing/hextra/exampleSite
--themesDir=../.. --source=exampleSite \ hugo mod get -u github.com/imfing/hextra
--baseURL "${{ steps.pages.outputs.base_url }}/" hugo --minify --baseURL "${{ steps.pages.outputs.base_url }}/"
- name: Upload artifact - name: Upload artifact
uses: actions/upload-pages-artifact@v3 uses: actions/upload-pages-artifact@v3
with: with:

View File

@ -21,7 +21,7 @@
- **响应式布局和深色模式支持** - 在任何设备上看起来都足够美观, 无论是手机, 平板电脑或者电脑. 深色模式的支持使 Hextra 可以应对各种照明环境. - **响应式布局和深色模式支持** - 在任何设备上看起来都足够美观, 无论是手机, 平板电脑或者电脑. 深色模式的支持使 Hextra 可以应对各种照明环境.
- **快速且轻量** - 由 Hugo 强力支持, Hugo 是一个快如闪电的静态站点生成器, 这一切都只需一个可执行文件, Hextra 始终保持最小化, 无需 Javascript 或者 Node.js. - **快速且轻量** - 由 Hugo 强力支持, Hugo 是一个快如闪电的静态站点生成器, 这一切都只需一个可执行文件, Hextra 始终保持最小化, 无需 Javascript 或者 Node.js.
- **全文搜索** - 集成了 Flexsearch 的全文搜索, 无需额外的配置. - **全文搜索** - 集成了 Flexsearch 的全文搜索, 无需额外的配置.
- **网站中的瑞士军刀** - Markdown, 代码高亮, LaTex 数学公式, diagrams 图表和 Shortcodes 都可以用于丰富你的内容. 目录, 面包屑导航, 分页, 侧边栏等均由 Hextra 自动生成。 - **功能齐全** - Markdown, 代码高亮, LaTex 数学公式, diagrams 图表和 Shortcodes 都可以用于丰富你的内容. 目录, 面包屑导航, 分页, 侧边栏等均由 Hextra 自动生成。
- **多语言和 SEO Ready** - Hugo 的多语言模式使得构建多语言网站更简单. 具有 SEO tags, Open Graph, 和 Twitter Cards 等诸多开箱即用的功能. - **多语言和 SEO Ready** - Hugo 的多语言模式使得构建多语言网站更简单. 具有 SEO tags, Open Graph, 和 Twitter Cards 等诸多开箱即用的功能.
## 快速开始 ## 快速开始

View File

@ -74,7 +74,7 @@
/* CommentPreprocFile */ .chroma .cpf { color: #8b949e; font-weight: bold; font-style: italic } /* CommentPreprocFile */ .chroma .cpf { color: #8b949e; font-weight: bold; font-style: italic }
/* Generic */ .chroma .g { } /* Generic */ .chroma .g { }
/* GenericDeleted */ .chroma .gd { color: #ffa198; background-color: #490202 } /* 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 } /* GenericError */ .chroma .gr { color: #ffa198 }
/* GenericHeading */ .chroma .gh { color: #79c0ff; font-weight: bold } /* GenericHeading */ .chroma .gh { color: #79c0ff; font-weight: bold }
/* GenericInserted */ .chroma .gi { color: #56d364; background-color: #0f5323 } /* GenericInserted */ .chroma .gi { color: #56d364; background-color: #0f5323 }

View File

@ -1,5 +1,5 @@
/* /*
! tailwindcss v3.4.3 | MIT License | https://tailwindcss.com ! tailwindcss v3.4.10 | MIT License | https://tailwindcss.com
*//* *//*
1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
@ -596,10 +596,6 @@ video {
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
} }
.hx-my-1 {
margin-top: 0.25rem;
margin-bottom: 0.25rem;
}
.hx-my-1\.5 { .hx-my-1\.5 {
margin-top: 0.375rem; margin-top: 0.375rem;
margin-bottom: 0.375rem; margin-bottom: 0.375rem;
@ -608,9 +604,6 @@ video {
margin-top: 0.5rem; margin-top: 0.5rem;
margin-bottom: 0.5rem; margin-bottom: 0.5rem;
} }
.-hx-mb-0 {
margin-bottom: -0px;
}
.-hx-mb-0\.5 { .-hx-mb-0\.5 {
margin-bottom: -0.125rem; margin-bottom: -0.125rem;
} }
@ -719,9 +712,6 @@ video {
.hx-h-2 { .hx-h-2 {
height: 0.5rem; height: 0.5rem;
} }
.hx-h-3 {
height: 0.75rem;
}
.hx-h-3\.5 { .hx-h-3\.5 {
height: 0.875rem; height: 0.875rem;
} }
@ -758,9 +748,6 @@ video {
.hx-w-2 { .hx-w-2 {
width: 0.5rem; width: 0.5rem;
} }
.hx-w-3 {
width: 0.75rem;
}
.hx-w-3\.5 { .hx-w-3\.5 {
width: 0.875rem; width: 0.875rem;
} }
@ -888,10 +875,6 @@ video {
.hx-gap-4 { .hx-gap-4 {
gap: 1rem; gap: 1rem;
} }
.hx-gap-x-1 {
-moz-column-gap: 0.25rem;
column-gap: 0.25rem;
}
.hx-gap-x-1\.5 { .hx-gap-x-1\.5 {
-moz-column-gap: 0.375rem; -moz-column-gap: 0.375rem;
column-gap: 0.375rem; column-gap: 0.375rem;
@ -914,9 +897,15 @@ video {
.hx-overflow-x-hidden { .hx-overflow-x-hidden {
overflow-x: hidden; overflow-x: hidden;
} }
.hx-overflow-y-hidden {
overflow-y: hidden;
}
.hx-overscroll-contain { .hx-overscroll-contain {
overscroll-behavior: contain; overscroll-behavior: contain;
} }
.hx-overscroll-x-contain {
overscroll-behavior-x: contain;
}
.hx-text-ellipsis { .hx-text-ellipsis {
text-overflow: ellipsis; text-overflow: ellipsis;
} }
@ -1017,18 +1006,18 @@ video {
} }
.hx-bg-primary-100 { .hx-bg-primary-100 {
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
background-color: hsl(var(--primary-hue) var(--primary-saturation) 94% / var(--tw-bg-opacity)); background-color: hsl(var(--primary-hue) var(--primary-saturation) calc(var(--primary-lightness) + calc(calc(100% - var(--primary-lightness)) / 50) * 44) / var(--tw-bg-opacity));
} }
.hx-bg-primary-400 { .hx-bg-primary-400 {
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
background-color: hsl(var(--primary-hue) var(--primary-saturation) 66% / var(--tw-bg-opacity)); background-color: hsl(var(--primary-hue) var(--primary-saturation) calc(var(--primary-lightness) + calc(calc(100% - var(--primary-lightness)) / 50) * 16) / var(--tw-bg-opacity));
} }
.hx-bg-primary-600 { .hx-bg-primary-600 {
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
background-color: hsl(var(--primary-hue) var(--primary-saturation) 45% / var(--tw-bg-opacity)); background-color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 45) / var(--tw-bg-opacity));
} }
.hx-bg-primary-700\/5 { .hx-bg-primary-700\/5 {
background-color: hsl(var(--primary-hue) var(--primary-saturation) 39% / 0.05); background-color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 39) / 0.05);
} }
.hx-bg-red-100 { .hx-bg-red-100 {
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
@ -1060,9 +1049,6 @@ video {
-webkit-background-clip: text; -webkit-background-clip: text;
background-clip: text; background-clip: text;
} }
.hx-p-0 {
padding: 0px;
}
.hx-p-0\.5 { .hx-p-0\.5 {
padding: 0.125rem; padding: 0.125rem;
} }
@ -1081,10 +1067,6 @@ video {
.hx-p-6 { .hx-p-6 {
padding: 1.5rem; padding: 1.5rem;
} }
.hx-px-1 {
padding-left: 0.25rem;
padding-right: 0.25rem;
}
.hx-px-1\.5 { .hx-px-1\.5 {
padding-left: 0.375rem; padding-left: 0.375rem;
padding-right: 0.375rem; padding-right: 0.375rem;
@ -1093,6 +1075,10 @@ video {
padding-left: 0.5rem; padding-left: 0.5rem;
padding-right: 0.5rem; padding-right: 0.5rem;
} }
.hx-px-2\.5 {
padding-left: 0.625rem;
padding-right: 0.625rem;
}
.hx-px-3 { .hx-px-3 {
padding-left: 0.75rem; padding-left: 0.75rem;
padding-right: 0.75rem; padding-right: 0.75rem;
@ -1190,6 +1176,9 @@ video {
.hx-text-4xl { .hx-text-4xl {
font-size: 2.25rem; font-size: 2.25rem;
} }
.hx-text-\[\.65rem\] {
font-size: .65rem;
}
.hx-text-\[10px\] { .hx-text-\[10px\] {
font-size: 10px; font-size: 10px;
} }
@ -1285,7 +1274,7 @@ video {
} }
.hx-text-primary-800 { .hx-text-primary-800 {
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: hsl(var(--primary-hue) var(--primary-saturation) 32% / var(--tw-text-opacity)); color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 32) / var(--tw-text-opacity));
} }
.hx-text-red-900 { .hx-text-red-900 {
--tw-text-opacity: 1; --tw-text-opacity: 1;
@ -1460,7 +1449,7 @@ video {
} }
} }
.content :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)):is(html[class~="dark"] *) { .content :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)):is(html[class~="dark"] *) {
border-color: hsl(var(--primary-hue) var(--primary-saturation) 94% / 0.1); border-color: hsl(var(--primary-hue) var(--primary-saturation) calc(var(--primary-lightness) + calc(calc(100% - var(--primary-lightness)) / 50) * 44) / 0.1);
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: rgb(241 245 249 / var(--tw-text-opacity)); color: rgb(241 245 249 / var(--tw-text-opacity));
} }
@ -1528,7 +1517,7 @@ video {
} }
.content :where(a):not(:where([class~=not-prose],[class~=not-prose] *)) { .content :where(a):not(:where([class~=not-prose],[class~=not-prose] *)) {
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: hsl(var(--primary-hue) var(--primary-saturation) 45% / var(--tw-text-opacity)); color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 45) / var(--tw-text-opacity));
text-decoration-line: underline; text-decoration-line: underline;
text-decoration-thickness: from-font; text-decoration-thickness: from-font;
text-underline-position: from-font; text-underline-position: from-font;
@ -1562,7 +1551,7 @@ video {
margin-bottom: 1rem; margin-bottom: 1rem;
overflow-x: auto; overflow-x: auto;
border-radius: 0.75rem; border-radius: 0.75rem;
background-color: hsl(var(--primary-hue) var(--primary-saturation) 39% / 0.05); background-color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 39) / 0.05);
padding-top: 1rem; padding-top: 1rem;
padding-bottom: 1rem; padding-bottom: 1rem;
font-size: .9em; font-size: .9em;
@ -1574,18 +1563,18 @@ video {
.content :where(pre):not(:where(.hextra-code-block pre, [class~=not-prose],[class~=not-prose] *)) { .content :where(pre):not(:where(.hextra-code-block pre, [class~=not-prose],[class~=not-prose] *)) {
border-width: 1px; border-width: 1px;
border-color: hsl(var(--primary-hue) var(--primary-saturation) 24% / 0.2); border-color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 24) / 0.2);
--tw-contrast: contrast(1.5); --tw-contrast: contrast(1.5);
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
} }
} }
.content :where(pre):not(:where(.hextra-code-block pre, [class~=not-prose],[class~=not-prose] *)):is(html[class~="dark"] *) { .content :where(pre):not(:where(.hextra-code-block pre, [class~=not-prose],[class~=not-prose] *)):is(html[class~="dark"] *) {
background-color: hsl(var(--primary-hue) var(--primary-saturation) 77% / 0.1); background-color: hsl(var(--primary-hue) var(--primary-saturation) calc(var(--primary-lightness) + calc(calc(100% - var(--primary-lightness)) / 50) * 27) / 0.1);
} }
@media (prefers-contrast: more) { @media (prefers-contrast: more) {
.content :where(pre):not(:where(.hextra-code-block pre, [class~=not-prose],[class~=not-prose] *)):is(html[class~="dark"] *) { .content :where(pre):not(:where(.hextra-code-block pre, [class~=not-prose],[class~=not-prose] *)):is(html[class~="dark"] *) {
border-color: hsl(var(--primary-hue) var(--primary-saturation) 94% / 0.4); border-color: hsl(var(--primary-hue) var(--primary-saturation) calc(var(--primary-lightness) + calc(calc(100% - var(--primary-lightness)) / 50) * 44) / 0.4);
} }
} }
.content :where(code):not(:where(.hextra-code-block code, [class~=not-prose],[class~=not-prose] *)) { .content :where(code):not(:where(.hextra-code-block code, [class~=not-prose],[class~=not-prose] *)) {
@ -2119,7 +2108,7 @@ article details > summary::before {
/* GenericDeleted */ /* GenericDeleted */
.dark .highlight .chroma .gd { color: #ffa198; background-color: #490202 } .dark .highlight .chroma .gd { color: #ffa198; background-color: #490202 }
/* GenericEmph */ /* GenericEmph */
.dark .highlight .chroma .ge { font-style: italic } .dark .highlight .chroma .ge { color: inherit; font-style: italic }
/* GenericError */ /* GenericError */
.dark .highlight .chroma .gr { color: #ffa198 } .dark .highlight .chroma .gr { color: #ffa198 }
/* GenericHeading */ /* GenericHeading */
@ -2146,7 +2135,7 @@ article details > summary::before {
} }
.hextra-code-block pre { .hextra-code-block pre {
overflow-x: auto; overflow-x: auto;
background-color: hsl(var(--primary-hue) var(--primary-saturation) 39% / 0.05); background-color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 39) / 0.05);
font-size: .9em; font-size: .9em;
font-weight: 500; font-weight: 500;
-webkit-font-smoothing: auto; -webkit-font-smoothing: auto;
@ -2156,18 +2145,18 @@ article details > summary::before {
.hextra-code-block pre { .hextra-code-block pre {
border-width: 1px; border-width: 1px;
border-color: hsl(var(--primary-hue) var(--primary-saturation) 24% / 0.2); border-color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 24) / 0.2);
--tw-contrast: contrast(1.5); --tw-contrast: contrast(1.5);
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
} }
} }
.hextra-code-block pre:is(html[class~="dark"] *) { .hextra-code-block pre:is(html[class~="dark"] *) {
background-color: hsl(var(--primary-hue) var(--primary-saturation) 77% / 0.1); background-color: hsl(var(--primary-hue) var(--primary-saturation) calc(var(--primary-lightness) + calc(calc(100% - var(--primary-lightness)) / 50) * 27) / 0.1);
} }
@media (prefers-contrast: more) { @media (prefers-contrast: more) {
.hextra-code-block pre:is(html[class~="dark"] *) { .hextra-code-block pre:is(html[class~="dark"] *) {
border-color: hsl(var(--primary-hue) var(--primary-saturation) 94% / 0.4); border-color: hsl(var(--primary-hue) var(--primary-saturation) calc(var(--primary-lightness) + calc(calc(100% - var(--primary-lightness)) / 50) * 44) / 0.4);
} }
} }
.hextra-code-block .filename { .hextra-code-block .filename {
@ -2180,7 +2169,7 @@ article details > summary::before {
white-space: nowrap; white-space: nowrap;
border-top-left-radius: 0.75rem; border-top-left-radius: 0.75rem;
border-top-right-radius: 0.75rem; border-top-right-radius: 0.75rem;
background-color: hsl(var(--primary-hue) var(--primary-saturation) 39% / 0.05); background-color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 39) / 0.05);
padding-top: 0.5rem; padding-top: 0.5rem;
padding-bottom: 0.5rem; padding-bottom: 0.5rem;
padding-left: 1rem; padding-left: 1rem;
@ -2190,7 +2179,7 @@ article details > summary::before {
color: rgb(55 65 81 / var(--tw-text-opacity)); color: rgb(55 65 81 / var(--tw-text-opacity));
} }
.hextra-code-block .filename:is(html[class~="dark"] *) { .hextra-code-block .filename:is(html[class~="dark"] *) {
background-color: hsl(var(--primary-hue) var(--primary-saturation) 77% / 0.1); background-color: hsl(var(--primary-hue) var(--primary-saturation) calc(var(--primary-lightness) + calc(calc(100% - var(--primary-lightness)) / 50) * 27) / 0.1);
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: rgb(229 231 235 / var(--tw-text-opacity)); color: rgb(229 231 235 / var(--tw-text-opacity));
} }
@ -2247,11 +2236,14 @@ article details > summary::before {
.chroma .hl { .chroma .hl {
display: block; display: block;
width: 100%; width: 100%;
background-color: hsl(var(--primary-hue) var(--primary-saturation) 32% / 0.1); background-color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 32) / 0.1);
} }
.hextra-cards { .hextra-cards {
grid-template-columns: repeat(auto-fill, minmax(max(250px, calc((100% - 1rem * 2) / var(--hextra-cards-grid-cols))), 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 { .hextra-card img {
-webkit-user-select: none; -webkit-user-select: none;
-moz-user-select: none; -moz-user-select: none;
@ -2267,6 +2259,7 @@ article details > summary::before {
} }
.hextra-card p { .hextra-card p {
margin-top: 0.5rem; margin-top: 0.5rem;
position: relative;
} }
.dark .hextra-card svg { .dark .hextra-card svg {
color: #ffffff66; color: #ffffff66;
@ -2274,6 +2267,12 @@ article details > summary::before {
.dark .hextra-card:hover svg { .dark .hextra-card:hover svg {
color: currentColor; color: currentColor;
} }
.hextra-card-tag {
position: absolute;
top: 5px;
right: 5px;
z-index: 10;
}
.steps h3 { .steps h3 {
counter-increment: step; counter-increment: step;
} }
@ -2349,13 +2348,13 @@ article details > summary::before {
} }
.search-wrapper li .active { .search-wrapper li .active {
border-radius: 0.375rem; border-radius: 0.375rem;
background-color: hsl(var(--primary-hue) var(--primary-saturation) 50% / 0.1); background-color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 50) / 0.1);
} }
@media (prefers-contrast: more) { @media (prefers-contrast: more) {
.search-wrapper li .active { .search-wrapper li .active {
--tw-border-opacity: 1; --tw-border-opacity: 1;
border-color: hsl(var(--primary-hue) var(--primary-saturation) 50% / var(--tw-border-opacity)); border-color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 50) / var(--tw-border-opacity));
} }
} }
.search-wrapper .no-result { .search-wrapper .no-result {
@ -2442,7 +2441,7 @@ article details > summary::before {
} }
.search-wrapper .match { .search-wrapper .match {
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: hsl(var(--primary-hue) var(--primary-saturation) 45% / var(--tw-text-opacity)); color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 45) / var(--tw-text-opacity));
} }
@media (max-width: 767px) { @media (max-width: 767px) {
.sidebar-container { .sidebar-container {
@ -2494,7 +2493,7 @@ nav .search-wrapper {
background-color: rgb(255 255 255 / .85); background-color: rgb(255 255 255 / .85);
--tw-backdrop-blur: blur(12px); --tw-backdrop-blur: blur(12px);
-webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
} }
.nav-container-blur:is(html[class~="dark"] *) { .nav-container-blur:is(html[class~="dark"] *) {
background-color: rgb(17 17 17 / 0.8) !important; background-color: rgb(17 17 17 / 0.8) !important;
@ -2535,30 +2534,30 @@ nav .search-wrapper {
.hamburger-menu svg.open > g:nth-of-type(2) path { .hamburger-menu svg.open > g:nth-of-type(2) path {
transform: translate3d(0, -4px, 0); transform: translate3d(0, -4px, 0);
} }
.hextra-scrollbar { .hextra-scrollbar, .hextra-scrollbar * {
scrollbar-width: thin; /* Firefox */ scrollbar-width: thin; /* Firefox */
scrollbar-color: oklch(55.55% 0 0 / 40%) transparent; /* Firefox */ scrollbar-color: oklch(55.55% 0 0 / 40%) transparent; /* Firefox */
scrollbar-gutter: stable; scrollbar-gutter: stable;
} }
.hextra-scrollbar::-webkit-scrollbar { .hextra-scrollbar::-webkit-scrollbar, .hextra-scrollbar *::-webkit-scrollbar {
height: 0.75rem; height: 0.75rem;
width: 0.75rem; width: 0.75rem;
} }
.hextra-scrollbar::-webkit-scrollbar-track { .hextra-scrollbar::-webkit-scrollbar-track, .hextra-scrollbar *::-webkit-scrollbar-track {
background-color: transparent; background-color: transparent;
} }
.hextra-scrollbar::-webkit-scrollbar-thumb { .hextra-scrollbar::-webkit-scrollbar-thumb, .hextra-scrollbar *::-webkit-scrollbar-thumb {
border-radius: 10px; border-radius: 10px;
} }
.hextra-scrollbar:hover::-webkit-scrollbar-thumb { .hextra-scrollbar:hover::-webkit-scrollbar-thumb, .hextra-scrollbar *:hover::-webkit-scrollbar-thumb {
border: 3px solid transparent; border: 3px solid transparent;
background-color: var(--tw-shadow-color); background-color: var(--tw-shadow-color);
background-clip: content-box; background-clip: content-box;
--tw-shadow-color: rgb(115 115 115 / 0.2); --tw-shadow-color: rgb(115 115 115 / 0.2);
--tw-shadow: var(--tw-shadow-colored); --tw-shadow: var(--tw-shadow-colored);
} }
.hextra-scrollbar:hover::-webkit-scrollbar-thumb:hover { .hextra-scrollbar:hover::-webkit-scrollbar-thumb:hover, .hextra-scrollbar *:hover::-webkit-scrollbar-thumb:hover {
--tw-shadow-color: rgb(115 115 115 / 0.4); --tw-shadow-color: rgb(115 115 115 / 0.4);
--tw-shadow: var(--tw-shadow-colored); --tw-shadow: var(--tw-shadow-colored);
} }
@ -2569,7 +2568,7 @@ nav .search-wrapper {
--tw-bg-opacity: .85; --tw-bg-opacity: .85;
--tw-backdrop-blur: blur(12px); --tw-backdrop-blur: blur(12px);
-webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
} }
.hextra-code-copy-btn:is(html[class~="dark"] *) { .hextra-code-copy-btn:is(html[class~="dark"] *) {
--tw-bg-opacity: 0.8; --tw-bg-opacity: 0.8;
@ -2580,6 +2579,27 @@ nav .search-wrapper {
grid-template-columns: repeat(var(--hextra-feature-grid-cols), minmax(0, 1fr)) grid-template-columns: repeat(var(--hextra-feature-grid-cols), minmax(0, 1fr))
} }
} }
.hextra-jupyter-code-cell {
scrollbar-gutter: auto;
margin-top: 1.5rem;
}
.hextra-jupyter-code-cell .hextra-jupyter-code-cell-outputs-container {
overflow: hidden;
font-size: .75rem;
}
.hextra-jupyter-code-cell .hextra-jupyter-code-cell-outputs-container .hextra-jupyter-code-cell-outputs {
max-height: 50vh;
overflow: auto;
}
.hextra-jupyter-code-cell .hextra-jupyter-code-cell-outputs-container .hextra-jupyter-code-cell-outputs pre {
max-width: 100%;
overflow: auto;
font-size: .75rem;
}
.hextra-badge {
display: inline-flex;
align-items: center;
}
html { html {
font-size: 1rem; font-size: 1rem;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
@ -2601,12 +2621,14 @@ body:is(html[class~="dark"] *) {
:root { :root {
--primary-hue: 212deg; --primary-hue: 212deg;
--primary-saturation: 100%; --primary-saturation: 100%;
--primary-lightness: 50%;
--navbar-height: 4rem; --navbar-height: 4rem;
--menu-height: 3.75rem; --menu-height: 3.75rem;
} }
.dark { .dark {
--primary-hue: 204deg; --primary-hue: 204deg;
--primary-saturation: 100%; --primary-saturation: 100%;
--primary-lightness: 50%;
} }
.placeholder\:hx-text-gray-500::-moz-placeholder { .placeholder\:hx-text-gray-500::-moz-placeholder {
--tw-text-opacity: 1; --tw-text-opacity: 1;
@ -2703,11 +2725,11 @@ body:is(html[class~="dark"] *) {
} }
.hover\:hx-bg-primary-50:hover { .hover\:hx-bg-primary-50:hover {
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
background-color: hsl(var(--primary-hue) var(--primary-saturation) 97% / var(--tw-bg-opacity)); background-color: hsl(var(--primary-hue) var(--primary-saturation) calc(var(--primary-lightness) + calc(calc(100% - var(--primary-lightness)) / 50) * 47) / var(--tw-bg-opacity));
} }
.hover\:hx-bg-primary-700:hover { .hover\:hx-bg-primary-700:hover {
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
background-color: hsl(var(--primary-hue) var(--primary-saturation) 39% / var(--tw-bg-opacity)); background-color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 39) / var(--tw-bg-opacity));
} }
.hover\:hx-bg-slate-50:hover { .hover\:hx-bg-slate-50:hover {
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
@ -2727,7 +2749,7 @@ body:is(html[class~="dark"] *) {
} }
.hover\:hx-text-primary-600:hover { .hover\:hx-text-primary-600:hover {
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: hsl(var(--primary-hue) var(--primary-saturation) 45% / var(--tw-text-opacity)); color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 45) / var(--tw-text-opacity));
} }
.hover\:hx-opacity-60:hover { .hover\:hx-opacity-60:hover {
opacity: 0.6; opacity: 0.6;
@ -2764,7 +2786,7 @@ body:is(html[class~="dark"] *) {
} }
.focus\:hx-ring-primary-300:focus { .focus\:hx-ring-primary-300:focus {
--tw-ring-opacity: 1; --tw-ring-opacity: 1;
--tw-ring-color: hsl(var(--primary-hue) var(--primary-saturation) 77% / var(--tw-ring-opacity)); --tw-ring-color: hsl(var(--primary-hue) var(--primary-saturation) calc(var(--primary-lightness) + calc(calc(100% - var(--primary-lightness)) / 50) * 27) / var(--tw-ring-opacity));
} }
.active\:hx-bg-gray-400\/20:active { .active\:hx-bg-gray-400\/20:active {
background-color: rgb(156 163 175 / 0.2); background-color: rgb(156 163 175 / 0.2);
@ -2798,27 +2820,27 @@ body:is(html[class~="dark"] *) {
.hx-group\/copybtn.copied .group-\[\.copied\]\/copybtn\:hx-hidden { .hx-group\/copybtn.copied .group-\[\.copied\]\/copybtn\:hx-hidden {
display: none; display: none;
} }
.data-\[state\=selected\]\:hx-block[data-state=selected] { .data-\[state\=selected\]\:hx-block[data-state="selected"] {
display: block; display: block;
} }
.data-\[state\=closed\]\:hx-hidden[data-state=closed] { .data-\[state\=closed\]\:hx-hidden[data-state="closed"] {
display: none; display: none;
} }
.data-\[state\=open\]\:hx-hidden[data-state=open] { .data-\[state\=open\]\:hx-hidden[data-state="open"] {
display: none; display: none;
} }
.data-\[state\=selected\]\:hx-border-primary-500[data-state=selected] { .data-\[state\=selected\]\:hx-border-primary-500[data-state="selected"] {
--tw-border-opacity: 1; --tw-border-opacity: 1;
border-color: hsl(var(--primary-hue) var(--primary-saturation) 50% / var(--tw-border-opacity)); border-color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 50) / var(--tw-border-opacity));
} }
.data-\[state\=selected\]\:hx-text-primary-600[data-state=selected] { .data-\[state\=selected\]\:hx-text-primary-600[data-state="selected"] {
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: hsl(var(--primary-hue) var(--primary-saturation) 45% / var(--tw-text-opacity)); color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 45) / var(--tw-text-opacity));
} }
.hx-group[data-theme=dark] .group-data-\[theme\=dark\]\:hx-hidden { .hx-group[data-theme="dark"] .group-data-\[theme\=dark\]\:hx-hidden {
display: none; display: none;
} }
.hx-group[data-theme=light] .group-data-\[theme\=light\]\:hx-hidden { .hx-group[data-theme="light"] .group-data-\[theme\=light\]\:hx-hidden {
display: none; display: none;
} }
@media (prefers-contrast: more) { @media (prefers-contrast: more) {
@ -2852,7 +2874,7 @@ body:is(html[class~="dark"] *) {
.contrast-more\:hx-border-primary-500 { .contrast-more\:hx-border-primary-500 {
--tw-border-opacity: 1; --tw-border-opacity: 1;
border-color: hsl(var(--primary-hue) var(--primary-saturation) 50% / var(--tw-border-opacity)); border-color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 50) / var(--tw-border-opacity));
} }
.contrast-more\:hx-border-transparent { .contrast-more\:hx-border-transparent {
@ -2967,14 +2989,14 @@ body:is(html[class~="dark"] *) {
background-color: rgb(251 146 60 / 0.2); background-color: rgb(251 146 60 / 0.2);
} }
.dark\:hx-bg-primary-300\/10:is(html[class~="dark"] *) { .dark\:hx-bg-primary-300\/10:is(html[class~="dark"] *) {
background-color: hsl(var(--primary-hue) var(--primary-saturation) 77% / 0.1); background-color: hsl(var(--primary-hue) var(--primary-saturation) calc(var(--primary-lightness) + calc(calc(100% - var(--primary-lightness)) / 50) * 27) / 0.1);
} }
.dark\:hx-bg-primary-400\/10:is(html[class~="dark"] *) { .dark\:hx-bg-primary-400\/10:is(html[class~="dark"] *) {
background-color: hsl(var(--primary-hue) var(--primary-saturation) 66% / 0.1); background-color: hsl(var(--primary-hue) var(--primary-saturation) calc(var(--primary-lightness) + calc(calc(100% - var(--primary-lightness)) / 50) * 16) / 0.1);
} }
.dark\:hx-bg-primary-600:is(html[class~="dark"] *) { .dark\:hx-bg-primary-600:is(html[class~="dark"] *) {
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
background-color: hsl(var(--primary-hue) var(--primary-saturation) 45% / var(--tw-bg-opacity)); background-color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 45) / var(--tw-bg-opacity));
} }
.dark\:hx-bg-red-900\/30:is(html[class~="dark"] *) { .dark\:hx-bg-red-900\/30:is(html[class~="dark"] *) {
background-color: rgb(127 29 29 / 0.3); background-color: rgb(127 29 29 / 0.3);
@ -3028,7 +3050,7 @@ body:is(html[class~="dark"] *) {
} }
.dark\:hx-text-primary-600:is(html[class~="dark"] *) { .dark\:hx-text-primary-600:is(html[class~="dark"] *) {
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: hsl(var(--primary-hue) var(--primary-saturation) 45% / var(--tw-text-opacity)); color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 45) / var(--tw-text-opacity));
} }
.dark\:hx-text-red-200:is(html[class~="dark"] *) { .dark\:hx-text-red-200:is(html[class~="dark"] *) {
--tw-text-opacity: 1; --tw-text-opacity: 1;
@ -3117,14 +3139,14 @@ body:is(html[class~="dark"] *) {
background-color: rgb(23 23 23 / var(--tw-bg-opacity)); background-color: rgb(23 23 23 / var(--tw-bg-opacity));
} }
.dark\:hover\:hx-bg-primary-100\/5:hover:is(html[class~="dark"] *) { .dark\:hover\:hx-bg-primary-100\/5:hover:is(html[class~="dark"] *) {
background-color: hsl(var(--primary-hue) var(--primary-saturation) 94% / 0.05); background-color: hsl(var(--primary-hue) var(--primary-saturation) calc(var(--primary-lightness) + calc(calc(100% - var(--primary-lightness)) / 50) * 44) / 0.05);
} }
.dark\:hover\:hx-bg-primary-700:hover:is(html[class~="dark"] *) { .dark\:hover\:hx-bg-primary-700:hover:is(html[class~="dark"] *) {
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
background-color: hsl(var(--primary-hue) var(--primary-saturation) 39% / var(--tw-bg-opacity)); background-color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 39) / var(--tw-bg-opacity));
} }
.hover\:dark\:hx-bg-primary-500\/10:is(html[class~="dark"] *):hover { .hover\:dark\:hx-bg-primary-500\/10:is(html[class~="dark"] *):hover {
background-color: hsl(var(--primary-hue) var(--primary-saturation) 50% / 0.1); background-color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 50) / 0.1);
} }
.dark\:hover\:hx-text-gray-100:hover:is(html[class~="dark"] *) { .dark\:hover\:hx-text-gray-100:hover:is(html[class~="dark"] *) {
--tw-text-opacity: 1; --tw-text-opacity: 1;
@ -3152,7 +3174,7 @@ body:is(html[class~="dark"] *) {
} }
.hover\:dark\:hx-text-primary-600:is(html[class~="dark"] *):hover { .hover\:dark\:hx-text-primary-600:is(html[class~="dark"] *):hover {
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: hsl(var(--primary-hue) var(--primary-saturation) 45% / var(--tw-text-opacity)); color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 45) / var(--tw-text-opacity));
} }
.dark\:hover\:hx-shadow-none:hover:is(html[class~="dark"] *) { .dark\:hover\:hx-shadow-none:hover:is(html[class~="dark"] *) {
--tw-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000;
@ -3165,7 +3187,7 @@ body:is(html[class~="dark"] *) {
} }
.dark\:focus\:hx-ring-primary-800:focus:is(html[class~="dark"] *) { .dark\:focus\:hx-ring-primary-800:focus:is(html[class~="dark"] *) {
--tw-ring-opacity: 1; --tw-ring-opacity: 1;
--tw-ring-color: hsl(var(--primary-hue) var(--primary-saturation) 32% / var(--tw-ring-opacity)); --tw-ring-color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 32) / var(--tw-ring-opacity));
} }
@media (prefers-contrast: more) { @media (prefers-contrast: more) {
@ -3185,7 +3207,7 @@ body:is(html[class~="dark"] *) {
.contrast-more\:dark\:hx-border-primary-500:is(html[class~="dark"] *) { .contrast-more\:dark\:hx-border-primary-500:is(html[class~="dark"] *) {
--tw-border-opacity: 1; --tw-border-opacity: 1;
border-color: hsl(var(--primary-hue) var(--primary-saturation) 50% / var(--tw-border-opacity)); border-color: hsl(var(--primary-hue) var(--primary-saturation) calc(calc(var(--primary-lightness) / 50) * 50) / var(--tw-border-opacity));
} }
.dark\:contrast-more\:hx-border-neutral-400:is(html[class~="dark"] *) { .dark\:contrast-more\:hx-border-neutral-400:is(html[class~="dark"] *) {
@ -3363,9 +3385,6 @@ body:is(html[class~="dark"] *) {
display: block; display: block;
} }
} }
.ltr\:hx-right-1:where([dir="ltr"], [dir="ltr"] *) {
right: 0.25rem;
}
.ltr\:hx-right-1\.5:where([dir="ltr"], [dir="ltr"] *) { .ltr\:hx-right-1\.5:where([dir="ltr"], [dir="ltr"] *) {
right: 0.375rem; right: 0.375rem;
} }
@ -3440,9 +3459,6 @@ body:is(html[class~="dark"] *) {
left: auto; left: auto;
} }
} }
.rtl\:hx-left-1:where([dir="rtl"], [dir="rtl"] *) {
left: 0.25rem;
}
.rtl\:hx-left-1\.5:where([dir="rtl"], [dir="rtl"] *) { .rtl\:hx-left-1\.5:where([dir="rtl"], [dir="rtl"] *) {
left: 0.375rem; left: 0.375rem;
} }

View File

@ -0,0 +1,3 @@
.hextra-badge {
@apply hx-inline-flex hx-items-center;
}

View File

@ -2,6 +2,10 @@
grid-template-columns: repeat(auto-fill, minmax(max(250px, calc((100% - 1rem * 2) / var(--hextra-cards-grid-cols))), 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 { .hextra-card img {
user-select: none; user-select: none;
} }
@ -18,6 +22,7 @@
.hextra-card p { .hextra-card p {
margin-top: 0.5rem; margin-top: 0.5rem;
position: relative;
} }
.dark .hextra-card svg { .dark .hextra-card svg {
@ -27,3 +32,10 @@
.dark .hextra-card:hover svg { .dark .hextra-card:hover svg {
color: currentColor; color: currentColor;
} }
.hextra-card-tag {
position: absolute;
top: 5px;
right: 5px;
z-index: 10;
}

View 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;
}
}
}
}

View File

@ -1,4 +1,4 @@
.hextra-scrollbar { .hextra-scrollbar, .hextra-scrollbar * {
scrollbar-width: thin; /* Firefox */ scrollbar-width: thin; /* Firefox */
scrollbar-color: oklch(55.55% 0 0 / 40%) transparent; /* Firefox */ scrollbar-color: oklch(55.55% 0 0 / 40%) transparent; /* Firefox */

View File

@ -10,6 +10,8 @@
@import "components/scrollbar.css"; @import "components/scrollbar.css";
@import "components/code-copy.css"; @import "components/code-copy.css";
@import "components/hextra/feature-grid.css"; @import "components/hextra/feature-grid.css";
@import "components/jupyter.css";
@import "components/badge.css";
html { html {
@apply hx-text-base hx-antialiased; @apply hx-text-base hx-antialiased;
@ -24,6 +26,7 @@ body {
:root { :root {
--primary-hue: 212deg; --primary-hue: 212deg;
--primary-saturation: 100%; --primary-saturation: 100%;
--primary-lightness: 50%;
--navbar-height: 4rem; --navbar-height: 4rem;
--menu-height: 3.75rem; --menu-height: 3.75rem;
} }
@ -31,4 +34,5 @@ body {
.dark { .dark {
--primary-hue: 204deg; --primary-hue: 204deg;
--primary-saturation: 100%; --primary-saturation: 100%;
--primary-lightness: 50%;
} }

View File

@ -200,7 +200,7 @@ document.addEventListener("DOMContentLoaded", function () {
cache: 100, cache: 100,
document: { document: {
id: 'id', id: 'id',
store: ['title'], store: ['title', 'crumb'],
index: "content" index: "content"
} }
}); });
@ -210,7 +210,7 @@ document.addEventListener("DOMContentLoaded", function () {
cache: 100, cache: 100,
document: { document: {
id: 'id', id: 'id',
store: ['title', 'content', 'url', 'display'], store: ['title', 'content', 'url', 'display', 'crumb'],
index: "content", index: "content",
tag: 'pageId' tag: 'pageId'
} }
@ -222,6 +222,30 @@ document.addEventListener("DOMContentLoaded", function () {
for (const route in data) { for (const route in data) {
let pageContent = ''; let pageContent = '';
++pageId; ++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) { for (const heading in data[route].data) {
const [hash, text] = heading.split('#'); const [hash, text] = heading.split('#');
@ -235,6 +259,7 @@ document.addEventListener("DOMContentLoaded", function () {
id: url, id: url,
url, url,
title, title,
crumb,
pageId: `page_${pageId}`, pageId: `page_${pageId}`,
content: title, content: title,
...(paragraphs[0] && { display: paragraphs[0] }) ...(paragraphs[0] && { display: paragraphs[0] })
@ -245,6 +270,7 @@ document.addEventListener("DOMContentLoaded", function () {
id: `${url}_${i}`, id: `${url}_${i}`,
url, url,
title, title,
crumb,
pageId: `page_${pageId}`, pageId: `page_${pageId}`,
content: paragraphs[i] content: paragraphs[i]
}); });
@ -256,6 +282,7 @@ document.addEventListener("DOMContentLoaded", function () {
window.pageIndex.add({ window.pageIndex.add({
id: pageId, id: pageId,
title: data[route].title, title: data[route].title,
crumb,
content: pageContent content: pageContent
}); });
@ -308,7 +335,7 @@ document.addEventListener("DOMContentLoaded", function () {
_page_rk: i, _page_rk: i,
_section_rk: j, _section_rk: j,
route: url, route: url,
prefix: isFirstItemOfPage ? result.doc.title : undefined, prefix: isFirstItemOfPage ? result.doc.crumb : undefined,
children: { title, content } children: { title, content }
}) })
isFirstItemOfPage = false isFirstItemOfPage = false

View File

@ -8,6 +8,11 @@ function isVisible(element) {
} }
document.addEventListener("DOMContentLoaded", function () { document.addEventListener("DOMContentLoaded", function () {
scrollToActiveItem();
enableCollapsibles();
});
function enableCollapsibles() {
const buttons = document.querySelectorAll(".hextra-sidebar-collapsible-button"); const buttons = document.querySelectorAll(".hextra-sidebar-collapsible-button");
buttons.forEach(function (button) { buttons.forEach(function (button) {
button.addEventListener("click", function (e) { button.addEventListener("click", function (e) {
@ -51,4 +56,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,
});
}

View File

@ -1,14 +1,14 @@
document.querySelectorAll('.tabs-toggle').forEach(function (button) { document.querySelectorAll('.hextra-tabs-toggle').forEach(function (button) {
button.addEventListener('click', function (e) { button.addEventListener('click', function (e) {
// set parent tabs to unselected // 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 = ''); tabs.map(tab => tab.dataset.state = '');
// set current tab to selected // set current tab to selected
e.target.dataset.state = 'selected'; e.target.dataset.state = 'selected';
// set all panels to unselected // 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) { Array.from(panelsContainer.children).forEach(function (panel) {
panel.dataset.state = ''; panel.dataset.state = '';
}); });

File diff suppressed because one or more lines are too long

View File

@ -36,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"/> <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> </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> 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> 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> 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>

File diff suppressed because one or more lines are too long

View File

@ -34,12 +34,13 @@ The color of text mixed with `other text` can customized with:
### Primary Color ### Primary Color
The primary color of the theme can be customized by setting the `--primary-hue` and `--primary-saturation` variables: The primary color of the theme can be customized by setting the `--primary-hue`, `--primary-saturation` and `--primary-lightness` variables:
```css {filename="assets/css/custom.css"} ```css {filename="assets/css/custom.css"}
:root { :root {
--primary-hue: 100deg; --primary-hue: 100deg;
--primary-saturation: 90%; --primary-saturation: 90%;
--primary-lightness: 50%;
} }
``` ```

View File

@ -186,10 +186,10 @@ To customize the [favicon](https://en.wikipedia.org/wiki/Favicon) for your site,
{{< /filetree/folder >}} {{< /filetree/folder >}}
{{< /filetree/container >}} {{< /filetree/container >}}
Include both `favicon.ico` and `favicon.svg` files in your project to ensure your site's favicons display correctly. Include `favicon.ico`, `favicon.svg` and `favicon-dark.svg` files in your project to ensure your site's favicons display correctly.
While `favicon.ico` is generally for older browsers, `favicon.svg` is supported by modern ones. The optional `favicon-dark.svg` can be included for a tailored experience in dark mode. While `favicon.ico` is generally for older browsers, `favicon.svg` and `favicon-dark.svg` are supported by modern browsers.
Feel free to use tools like [favicon.io](https://favicon.io/) or [favycon](https://github.com/ruisaraiva19/favycon) to generate these icons. Use tools like [favicon.io](https://favicon.io/) or [favycon](https://github.com/ruisaraiva19/favycon) to generate such icons.
### Theme Configuration ### Theme Configuration
@ -251,6 +251,23 @@ Options for `flexsearch.index`:
- `heading` - level 1 and level 2 headings - `heading` - level 1 and level 2 headings
- `title` - only include the page title - `title` - only include the page title
To customize the search tokenize, set the `params.search.flexsearch.tokenize` parameter in the config file:
```yaml {filename="hugo.yaml"}
params:
# ...
flexsearch:
# full | forward | reverse | strict
tokenize: forward
```
Options for [`flexsearch.tokenize`](https://github.com/nextapps-de/flexsearch/#tokenizer-prefix-search):
- `strict` - index whole words
- `forward` - incrementally index words in forward direction
- `reverse` - incrementally index words in both directions
- `full` - index every possible combination
To exclude a page from the search index, set the `excludeSearch: true` in the front matter of the page: To exclude a page from the search index, set the `excludeSearch: true` in the front matter of the page:
```yaml {filename="content/docs/guide/configuration.md"} ```yaml {filename="content/docs/guide/configuration.md"}

View File

@ -219,6 +219,25 @@ params:
- `heading` - 一级和二级标题 - `heading` - 一级和二级标题
- `title` - 仅搜索标题 - `title` - 仅搜索标题
要自定义检索分词,请在配置文件中设置`params.search.flexsearch.tokenize`
```hugo.yaml
params:
# ...
flexsearch:
# full | forward | reverse | strict
tokenize: forward
```
[`flexsearch.tokenize`](https://github.com/nextapps-de/flexsearch/#tokenizer-prefix-search)的可选项:
- `strict` - 严格单词匹配
- `forward` - 单词前缀匹配
- `reverse` - 单词前后缀匹配
- `full` - 单词子串匹配。
> 在默认的分词逻辑下,中文一句话就是一个“单词”
要从搜索索引中排除页面,更改 front matter 中的 `excludeSearch: true`: 要从搜索索引中排除页面,更改 front matter 中的 `excludeSearch: true`:
```yaml {filename="content/docs/guide/configuration.md"} ```yaml {filename="content/docs/guide/configuration.md"}

View File

@ -54,7 +54,7 @@ jobs:
build: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
env: env:
HUGO_VERSION: 0.121.2 HUGO_VERSION: 0.131.0
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
@ -64,7 +64,7 @@ jobs:
- name: Setup Go - name: Setup Go
uses: actions/setup-go@v5 uses: actions/setup-go@v5
with: with:
go-version: '1.21' go-version: '1.22'
- name: Setup Pages - name: Setup Pages
id: pages id: pages
uses: actions/configure-pages@v4 uses: actions/configure-pages@v4
@ -146,7 +146,7 @@ For more details, check out:
3. If you are not using [hextra-starter-template][hextra-starter-template], configure the following manually: 3. If you are not using [hextra-starter-template][hextra-starter-template], configure the following manually:
- Configure the Build command to `hugo --gc --minify` - Configure the Build command to `hugo --gc --minify`
- Specify the Publish directory to `public` - Specify the Publish directory to `public`
- Add Environment variable `HUGO_VERSION` and set to `0.119.0` - Add Environment variable `HUGO_VERSION` and set to `0.132.2`
4. Deploy! 4. Deploy!
Check [Hugo on Netlify](https://docs.netlify.com/integrations/frameworks/hugo/) for more details. Check [Hugo on Netlify](https://docs.netlify.com/integrations/frameworks/hugo/) for more details.

View File

@ -28,14 +28,28 @@ Hugo از سینتکس [مارک‌داون](https://en.wikipedia.org/wiki/Markd
[^1]: نقل‌قول بالا گزیده‌ای از [سخنرانی](https://www.youtube.com/watch?v=PAAkCSZUG1c) راب پایک در Gopherfest، در تاریخ ۲۷ آبان ۱۳۹۴ است. [^1]: نقل‌قول بالا گزیده‌ای از [سخنرانی](https://www.youtube.com/watch?v=PAAkCSZUG1c) راب پایک در Gopherfest، در تاریخ ۲۷ آبان ۱۳۹۴ است.
```markdown {filename=Markdown}
> با اشتراک‌گذاری حافظه ارتباط برقرار نکنید، حافظه را با برقراری ارتباط به اشتراک بگذارید.<br>
> — <cite>راب پایک[^1]</cite>
[^1]: نقل‌قول بالا گزیده‌ای از [سخنرانی](https://www.youtube.com/watch?v=PAAkCSZUG1c) راب پایک در Gopherfest، در تاریخ ۲۷ آبان ۱۳۹۴ است.
```
### جدول‌ها ### جدول‌ها
جدول‌ها بخشی از مشخصات اصلی مارک‌داون نیستند، اما Hugo از آنها در خارج از جعبه پشتیبانی می‌کند. جدول‌ها بخشی از مشخصات اصلی مارک‌داون نیستند، اما Hugo از آنها در خارج از جعبه پشتیبانی می‌کند.
نام | سن | نام | سن |
--------|------ |--------|------|
گودرز | ۳۰ | گودرز | ۳۰|
آصف | ۳۴ | آصف | ۳۴ |
```markdown {filename=Markdown}
| نام | سن |
|--------|------|
| گودرز | ۳۰|
| آصف | ۳۴ |
```
#### مارک‌داون درون‌خطی درون جدول‌ها #### مارک‌داون درون‌خطی درون جدول‌ها
@ -43,6 +57,12 @@ Hugo از سینتکس [مارک‌داون](https://en.wikipedia.org/wiki/Markd
| -------- | -------- | ------ | | -------- | -------- | ------ |
| *کج* | **توپر** | `کد` | | *کج* | **توپر** | `کد` |
```markdown {filename=Markdown}
| کج | توپر | کد |
| -------- | -------- | ------ |
| *کج* | **توپر** | `کد` |
```
### بلوک‌های کد ### بلوک‌های کد
{{< cards >}} {{< cards >}}
@ -57,12 +77,24 @@ Hugo از سینتکس [مارک‌داون](https://en.wikipedia.org/wiki/Markd
2. دومین آیتم 2. دومین آیتم
3. سومین آیتم 3. سومین آیتم
```markdown {filename=Markdown}
1. اولین آیتم
2. دومین آیتم
3. سومین آیتم
```
#### فهرست مرتب‌نشده #### فهرست مرتب‌نشده
* فهرست آیتم * فهرست آیتم
* یک آیتم دیگه * یک آیتم دیگه
* و یک آیتم دیگه * و یک آیتم دیگه
```markdown {filename=Markdown}
* فهرست آیتم
* یک آیتم دیگه
* و یک آیتم دیگه
```
#### فهرست تو در تو #### فهرست تو در تو
* میوه * میوه
@ -73,13 +105,31 @@ Hugo از سینتکس [مارک‌داون](https://en.wikipedia.org/wiki/Markd
* شیر * شیر
* پنیر * پنیر
```markdown {filename=Markdown}
* میوه
* سیب
* پرتقال
* موز
* لبنیات
* شیر
* پنیر
```
### عکس‌ها ### عکس‌ها
![](https://source.unsplash.com/featured/800x600?landscape) ![landscape](https://picsum.photos/800/600)
```markdown {filename=Markdown}
![landscape](https://picsum.photos/800/600)
```
با توضیحات: با توضیحات:
![](https://source.unsplash.com/featured/800x600?landscape "یک چشم‌انداز Unsplash") ![landscape](https://picsum.photos/800/600 "یک چشم‌انداز Unsplash")
```markdown {filename=Markdown}
![landscape](https://picsum.photos/800/600 "یک چشم‌انداز Unsplash")
```
## پیکربندی ## پیکربندی

View File

@ -14,7 +14,7 @@ Hugo supports [Markdown](https://en.wikipedia.org/wiki/Markdown) syntax for form
| Style | Syntax | Example | Output | | Style | Syntax | Example | Output |
| -------- | -------- | ------ | ------ | | -------- | -------- | ------ | ------ |
| Bold | `**bold text**` | `**bold text**` | **bold text** | | Bold | `**bold text**` | `**bold text**` | **bold text** |
| Italic | `*italicized text*` | `*italicized text* | *italicized text* | | Italic | `*italicized text*` | `*italicized text*` | *italicized text* |
| Strikethrough | `~~strikethrough text~~` | `~~strikethrough text~~` | ~~strikethrough 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 | | 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 | | Superscript | `<sup></sup>` | `This is a <sup>superscript</sup> text` | This is a <sup>superscript</sup> text |
@ -28,14 +28,28 @@ Blockquote with attribution
[^1]: The above quote is excerpted from Rob Pike's [talk](https://www.youtube.com/watch?v=PAAkCSZUG1c) during Gopherfest, November 18, 2015. [^1]: The above quote is excerpted from Rob Pike's [talk](https://www.youtube.com/watch?v=PAAkCSZUG1c) during Gopherfest, November 18, 2015.
```markdown {filename=Markdown}
> 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
Tables aren't part of the core Markdown spec, but Hugo supports them out-of-the-box. Tables aren't part of the core Markdown spec, but Hugo supports them out-of-the-box.
Name | Age | Name | Age |
--------|------ |--------|------|
Bob | 27 | Bob | 27 |
Alice | 23 | Alice | 23 |
```markdown {filename=Markdown}
| Name | Age |
|--------|------|
| Bob | 27 |
| Alice | 23 |
```
#### Inline Markdown within tables #### Inline Markdown within tables
@ -43,6 +57,12 @@ Tables aren't part of the core Markdown spec, but Hugo supports them out-of-the-
| -------- | -------- | ------ | | -------- | -------- | ------ |
| *italics* | **bold** | `code` | | *italics* | **bold** | `code` |
```markdown {filename=Markdown}
| Italics | Bold | Code |
| -------- | -------- | ------ |
| *italics* | **bold** | `code` |
```
### Code Blocks ### Code Blocks
{{< cards >}} {{< cards >}}
@ -57,12 +77,24 @@ Tables aren't part of the core Markdown spec, but Hugo supports them out-of-the-
2. Second item 2. Second item
3. Third item 3. Third item
```markdown {filename=Markdown}
1. First item
2. Second item
3. Third item
```
#### Unordered List #### Unordered List
* List item * List item
* Another item * Another item
* And another item * And another item
```markdown {filename=Markdown}
* List item
* Another item
* And another item
```
#### Nested list #### Nested list
* Fruit * Fruit
@ -73,13 +105,31 @@ Tables aren't part of the core Markdown spec, but Hugo supports them out-of-the-
* Milk * Milk
* Cheese * Cheese
```markdown {filename=Markdown}
* Fruit
* Apple
* Orange
* Banana
* Dairy
* Milk
* Cheese
```
### Images ### Images
![](https://source.unsplash.com/featured/800x600?landscape) ![landscape](https://picsum.photos/800/600)
```markdown {filename=Markdown}
![landscape](https://picsum.photos/800/600)
```
With caption: With caption:
![](https://source.unsplash.com/featured/800x600?landscape "Unsplash Landscape") ![landscape](https://picsum.photos/800/600 "Unsplash Landscape")
```markdown {filename=Markdown}
![landscape](https://picsum.photos/800/600 "Unsplash Landscape")
```
## Configuration ## Configuration

View File

@ -28,14 +28,28 @@ Hugo 支持 [Markdown](https://en.wikipedia.org/wiki/Markdown) 来书写内容
[^1]: The above quote is excerpted from Rob Pike's [talk](https://www.youtube.com/watch?v=PAAkCSZUG1c) during Gopherfest, November 18, 2015. [^1]: The above quote is excerpted from Rob Pike's [talk](https://www.youtube.com/watch?v=PAAkCSZUG1c) during Gopherfest, November 18, 2015.
```markdown {filename=Markdown}
> 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.
```
### 表格 ### 表格
表格并非核心 Markdown 规范,但 Hugo 支持开箱即用的表格: 表格并非核心 Markdown 规范,但 Hugo 支持开箱即用的表格:
Name | Age | Name | Age |
--------|------ |--------|------|
Bob | 27 | Bob | 27 |
Alice | 23 | Alice | 23 |
```markdown {filename=Markdown}
| Name | Age |
|--------|------|
| Bob | 27 |
| Alice | 23 |
```
#### Markdown 表格中的内联 #### Markdown 表格中的内联
@ -43,6 +57,12 @@ Hugo 支持 [Markdown](https://en.wikipedia.org/wiki/Markdown) 来书写内容
| -------- | -------- | ------ | | -------- | -------- | ------ |
| *italics* | **bold** | `code` | | *italics* | **bold** | `code` |
```markdown {filename=Markdown}
| Italics | Bold | Code |
| -------- | -------- | ------ |
| *italics* | **bold** | `code` |
```
### 代码块 ### 代码块
{{< cards >}} {{< cards >}}
@ -57,12 +77,24 @@ Hugo 支持 [Markdown](https://en.wikipedia.org/wiki/Markdown) 来书写内容
2. Second item 2. Second item
3. Third item 3. Third item
```markdown {filename=Markdown}
1. First item
2. Second item
3. Third item
```
#### 无序列表 #### 无序列表
* List item * List item
* Another item * Another item
* And another item * And another item
```markdown {filename=Markdown}
* List item
* Another item
* And another item
```
#### 嵌套列表 #### 嵌套列表
* Fruit * Fruit
@ -73,13 +105,31 @@ Hugo 支持 [Markdown](https://en.wikipedia.org/wiki/Markdown) 来书写内容
* Milk * Milk
* Cheese * Cheese
```markdown {filename=Markdown}
* Fruit
* Apple
* Orange
* Banana
* Dairy
* Milk
* Cheese
```
### 图片 ### 图片
![](https://source.unsplash.com/featured/800x600?landscape) ![landscape](https://picsum.photos/800/600)
```markdown {filename=Markdown}
![landscape](https://picsum.photos/800/600)
```
带有标题: 带有标题:
![](https://source.unsplash.com/featured/800x600?landscape "Unsplash Landscape") ![landscape](https://picsum.photos/800/600 "Unsplash Landscape")
```markdown {filename=Markdown}
![landscape](https://picsum.photos/800/600 "Unsplash Landscape")
```
## 配置 ## 配置

View File

@ -82,6 +82,45 @@ weight: 2
It is recommended to keep the sidebar not too deep. If you have a lot of content, consider **splitting them into multiple sections**. It is recommended to keep the sidebar not too deep. If you have a lot of content, consider **splitting them into multiple sections**.
{{< /callout >}} {{< /callout >}}
## Breadcrumb Navigation
Breadcrumbs are auto-generated based on the directory structure of `/content`.
For example, consider the file structure [demonstrated above](#directory-structure). Given that structure, the breadcrumbs atop the page at `/docs/guide/organize-files/` would appear automatically as follows:
```
Documentation > Guide > Organize Files
```
### Customizing Breadcrumb Link Titles
By default, each breadcrumb link is generated based on that page's `title` parameter. You can customize this by specifying a `linkTitle`.
For example, if instead of `Organize Files` we wanted the breadcrumb to be `Foo Bar`:
```yaml {filename="content/docs/guide/organize-files.md"}
---
linkTitle: Foo Bar
title: Organize Files
---
```
This would now generate the following breadcrumbs:
```
Documentation > Guide > Foo Bar
```
### Hiding Breadcrumbs
You can hide breadcrumbs completely from a page by specifying `breadcrumbs: false` in its front matter:
```yaml {filename="content/docs/guide/organize-files.md"}
---
breadcrumbs: false
title: Organize Files
---
```
## Configure Content Directory ## Configure Content Directory
By default, the root `content/` directory is used by Hugo to build the site. By default, the root `content/` directory is used by Hugo to build the site.

View File

@ -6,7 +6,7 @@ prev: /docs/guide
## 目录结构 ## 目录结构
默认情况下Hugo 在 `context` 目录中搜索 Markdown 文件,目录的结构决定了网站的最终输出结构。 默认情况下Hugo 在 `content` 目录中搜索 Markdown 文件,目录的结构决定了网站的最终输出结构。
以示例网站为例: 以示例网站为例:
<!--more--> <!--more-->

View File

@ -9,7 +9,6 @@ next: /docs/guide/shortcodes/callout
Hextra provides a collection of beautiful shortcodes to enhance your content. Hextra provides a collection of beautiful shortcodes to enhance your content.
{{< cards >}} {{< cards >}}
{{< card link="callout" title="Callout" icon="warning" >}} {{< card link="callout" title="Callout" icon="warning" >}}
{{< card link="cards" title="Cards" icon="card" >}} {{< card link="cards" title="Cards" icon="card" >}}
@ -19,3 +18,12 @@ Hextra provides a collection of beautiful shortcodes to enhance your content.
{{< card link="steps" title="Steps" icon="one" >}} {{< card link="steps" title="Steps" icon="one" >}}
{{< card link="tabs" title="Tabs" icon="collection" >}} {{< card link="tabs" title="Tabs" icon="collection" >}}
{{< /cards >}} {{< /cards >}}
<div style="padding-top:4rem"></div>
Additional shortcodes provided by Hugo and Hextra:
{{< cards >}}
{{< card link="jupyter" title="Jupyter Notebook" icon="jupyter" tag="alpha" >}}
{{< card link="others" title="Others" icon="view-grid" >}}
{{< /cards >}}

View File

@ -7,11 +7,12 @@ linkTitle: Cards
{{< cards >}} {{< cards >}}
{{< card link="../callout" title="Callout" icon="warning" >}} {{< card link="../callout" title="Callout" icon="warning" >}}
{{< card link="../callout" title="Card with tag" icon="tag" tag="custom tag">}}
{{< card link="/" title="No Icon" >}} {{< card link="/" title="No Icon" >}}
{{< /cards >}} {{< /cards >}}
{{< cards >}} {{< cards >}}
{{< card link="/" title="Image Card" image="https://source.unsplash.com/featured/800x600?landscape" subtitle="Unsplash Landscape" >}} {{< card link="/" title="Image Card" image="https://github.com/user-attachments/assets/71b7e3ec-1a8d-4582-b600-5425c6cc0407" subtitle="Internet Image" >}}
{{< card link="/" title="Local Image" image="/images/card-image-unprocessed.jpg" subtitle="Raw image under static directory." >}} {{< card link="/" title="Local Image" image="/images/card-image-unprocessed.jpg" subtitle="Raw image under static directory." >}}
{{< card link="/" title="Local Image" image="images/space.jpg" subtitle="Image under assets directory, processed by Hugo." method="Resize" options="600x q80 webp" >}} {{< card link="/" title="Local Image" image="images/space.jpg" subtitle="Image under assets directory, processed by Hugo." method="Resize" options="600x q80 webp" >}}
{{< /cards >}} {{< /cards >}}
@ -21,6 +22,7 @@ linkTitle: Cards
``` ```
{{</* cards */>}} {{</* cards */>}}
{{</* card link="../callout" title="Callout" icon="warning" */>}} {{</* card link="../callout" title="Callout" icon="warning" */>}}
{{</* card link="../callout" title="Card with tag" icon="tag" tag= "A custom tag" */>}}
{{</* card link="/" title="No Icon" */>}} {{</* card link="/" title="No Icon" */>}}
{{</* /cards */>}} {{</* /cards */>}}
``` ```
@ -35,12 +37,14 @@ linkTitle: Cards
## Card Parameters ## Card Parameters
| Parameter | Description | | Parameter | Description |
|----------- |---------------------------------------| |----------- |-----------------------------------------------------------------|
| `link` | URL (internal or external). | | `link` | URL (internal or external). |
| `title` | Title heading for the card. | | `title` | Title heading for the card. |
| `subtitle` | Subtitle heading (supports Markdown). | | `subtitle` | Subtitle heading (supports Markdown). |
| `icon` | Name of the icon. | | `icon` | Name of the icon. |
| `tag` | Text in tag. |
| `tagColor` | Color of the tag: `gray` (default), `yellow`, `red` and `blue`. |
## Image Card ## Image Card
@ -62,3 +66,51 @@ Hextra auto-detects if image processing is needed during build and applies the `
It currently supports these `method`: `Resize`, `Fit`, `Fill` and `Crop`. It currently supports these `method`: `Resize`, `Fit`, `Fill` and `Crop`.
For more on Hugo's built in image processing commands, methods, and options see their [Image Processing Documentation](https://gohugo.io/content-management/image-processing/). For more on Hugo's built in image processing commands, methods, and options see their [Image Processing Documentation](https://gohugo.io/content-management/image-processing/).
## Tags
Card supports adding tags which could be useful to show extra status information.
{{< cards >}}
{{< card link="../callout" title="Card with default tag" tag="tag text" >}}
{{< card link="../callout" title="Card with error tag" tag="tag text" tagType="error" >}}
{{< card link="../callout" title="Card with info tag" tag="tag text" tagType="info" >}}
{{< card link="../callout" title="Card with warning tag" tag="tag text" tagType="warning" >}}
{{< card link="/" title="Image Card" image="https://github.com/user-attachments/assets/71b7e3ec-1a8d-4582-b600-5425c6cc0407" subtitle="Internet Image" tag="tag text" tagType="error" >}}
{{< /cards >}}
```
{{</* cards */>}}
{{</* card link="../callout" title="Card with default tag color" tag="tag text" */>}}
{{</* card link="../callout" title="Card with default red tag" tag="tag text" tagType="error" */>}}
{{</* card link="../callout" title="Card with blue tag" tag="tag text" tagType="info" */>}}
{{</* card link="../callout" title="Card with yellow tag" tag="tag text" tagType="warning" */>}}
{{</* /cards */>}}
```
## Columns
You can specify the maximum number of columns for cards to span by passing the `cols` parameter to the `cards` shortcode. Note that columns will still be collapsed on smaller screens.
{{< cards cols="1" >}}
{{< card link="/" title="Top Card" >}}
{{< card link="/" title="Bottom Card" >}}
{{< /cards >}}
{{< cards cols="2" >}}
{{< card link="/" title="Left Card" >}}
{{< card link="/" title="Right Card" >}}
{{< /cards >}}
```
{{</* cards cols="1" */>}}
{{</* card link="/" title="Top Card" */>}}
{{</* card link="/" title="Bottom Card" */>}}
{{</* /cards */>}}
{{</* cards cols="2" */>}}
{{</* card link="/" title="Left Card" */>}}
{{</* card link="/" title="Right Card" */>}}
{{</* /cards */>}}
```

View File

@ -0,0 +1,79 @@
---
title: "Jupyter Notebook Component"
linktitle: "Jupyter Notebook"
math: true
sidebar:
exclude: true
---
{{< callout >}}Experimental feature to include Jupyter Notebooks via a shortcode. Note that not all cell types are supported.{{< /callout >}}
[Jupyter Notebook](https://jupyter.org/) is a language-agnostic HTML notebook application for [Project Jupyter](https://jupyter.org/). It allows you to create and share documents that contain live code, equations, visualizations, and narrative text.
<!--more-->
## How to use
### Using a local notebook
To use the Jupyter Notebook shortcode, you need to have a Jupyter Notebook file in your project. Similar to how you would [add images](../../organize-files#add-images) to the project, you can add Jupyter Notebooks to the `assets` folder.
{{< filetree/container >}}
{{< filetree/folder name="assets" >}}
{{< filetree/file name="notebook.ipynb" >}}
{{< /filetree/folder >}}
{{< filetree/folder name="content" >}}
{{< filetree/folder name="docs" >}}
{{< filetree/file name="my-page.md" >}}
{{< /filetree/folder >}}
{{< /filetree/folder >}}
{{< /filetree/container >}}
Include the Jupyter Notebook in the page using the `jupyter` shortcode:
```markdown {filename="content/docs/my-page.md"}
---
title: My Page
math: true
---
{{%/* jupyter "notebook.ipynb" */%}}
```
Alternatively, you can utilize the [page bundles][page-bundles] feature of Hugo to organize the Jupyter Notebooks together with the Markdown file.
{{< filetree/container >}}
{{< filetree/folder name="content" >}}
{{< filetree/folder name="docs" >}}
{{< filetree/folder name="my-page" >}}
{{< filetree/file name="index.md" >}}
{{< filetree/file name="notebook.ipynb" >}}
{{< /filetree/folder >}}
{{< /filetree/folder >}}
{{< /filetree/folder >}}
{{< /filetree/container >}}
```markdown {filename="content/docs/my-page/index.md"}
---
title: My Page
math: true
---
{{%/* jupyter "notebook.ipynb" */%}}
```
### Using a remote notebook
You can also use a remote notebook by providing the URL to the notebook file. For example, to include [What is the Jupyter Notebook](https://github.com/jupyter/notebook/blob/main/docs/source/examples/Notebook/What%20is%20the%20Jupyter%20Notebook.ipynb) notebook in the page, you can use the following shortcode:
```
{{%/* jupyter "https://raw.githubusercontent.com/jupyter/notebook/main/docs/source/examples/Notebook/What%20is%20the%20Jupyter%20Notebook.ipynb" */%}}
```
## Example Notebook
{{< callout type="info" >}}The following is an example of a notebook file that is included in the project assets folder.{{< /callout >}}
{{% jupyter "example.ipynb" %}}
[page-bundles]: https://gohugo.io/content-management/page-bundles/#leaf-bundles

View File

@ -0,0 +1,78 @@
---
title: Other Shortcodes
linkTitle: Others
sidebar:
exclude: true
---
{{< callout emoji="" >}}
Some of these are Hugo built-in shortcodes.
These shortcodes are considered less stable and may be changed anytime.
{{< /callout >}}
## Badge
```
{{</* badge "Badge" */>}}
```
Result:
{{< badge "Badge" >}}
Variants:
```
{{</* badge content="info" type="info" */>}}
{{</* badge content="warning" type="warning" */>}}
{{</* badge content="error" type="error" */>}}
```
Result:
{{< badge content="info" type="info" >}} &nbsp;
{{< badge content="warning" type="warning" >}} &nbsp;
{{< badge content="error" type="error" >}}
With link:
```
{{</* badge content="Releases" link="https://github.com/imfing/hextra/releases" */>}}
```
Result:
{{< badge content="Releases" link="https://github.com/imfing/hextra/releases" >}}
## YouTube
Embed a YouTube video.
```
{{</* youtube VIDEO_ID */>}}
```
Result:
{{< youtube id=dQw4w9WgXcQ loading=lazy >}}
For more information, see [Hugo's YouTube Shortcode](https://gohugo.io/content-management/shortcodes/#youtube).
## PDF
With PDF shortcode, you can embed a PDF file in your content.
```
{{</* pdf "https://example.com/sample.pdf" */>}}
```
You can also place the PDF file in your project directory and use the relative path.
```
{{</* pdf "path/to/file.pdf" */>}}
```
Example:
{{< pdf "https://upload.wikimedia.org/wikipedia/commons/1/13/Example.pdf" >}}

View File

@ -25,6 +25,11 @@ This is the third step.
## Usage ## Usage
{{< callout emoji="" >}}
Please note that this shortcode is intended **only for Markdown content**.
If you put HTML content or other shortcodes as step content, it may not render as expected.
{{< /callout >}}
Put Markdown h3 header within `steps` shortcode. Put Markdown h3 header within `steps` shortcode.
``` ```

View File

@ -78,11 +78,18 @@ def main():
say_hello() say_hello()
``` ```
### Copy Button ### Copy Button
By default, copy button is enabled for code blocks. By default, copy button is enabled for code blocks. Its behavior can changed by modifying the site configuration file:
```yaml {linenos=table,linenostart=42,filename="hugo.yaml"}
params:
highlight:
copy:
enable: true
# hover | always
display: hover
```
## Supported Languages ## Supported Languages

View File

@ -12,6 +12,26 @@ Open source projects powered by Hextra
</p> </p>
{{< cards >}} {{< cards >}}
{{< card
link="https://github.com/mightymoud/sidekick"
title="Sidekick"
image="https://github.com/user-attachments/assets/4ae2a9d7-77b6-42eb-a9d7-5c4599f0f812"
imageStyle="object-fit:cover; aspect-ratio:16/9;"
>}}
{{< card
link="https://github.com/welding-torch/installc"
title="Install C"
image="https://github.com/user-attachments/assets/c9a85327-c7e7-40f1-830a-b4190a5e47bd"
imageStyle="object-fit:cover; aspect-ratio:16/9;"
>}}
{{< card
link="https://github.com/axivo/website"
title="AXIVO Docs"
image="https://github.com/imfing/hextra/assets/19806136/f22f0710-23a0-430b-8bad-616283b8a3e5"
imageStyle="object-fit:cover; aspect-ratio:16/9;"
>}}
{{< card {{< card
link="https://github.com/infracourse/web" link="https://github.com/infracourse/web"

View File

@ -13,6 +13,13 @@ layout: wide
{{< cards >}} {{< cards >}}
{{< card
link="https://github.com/axivo/website"
title="AXIVO Docs"
image="https://github.com/imfing/hextra/assets/19806136/f22f0710-23a0-430b-8bad-616283b8a3e5"
imageStyle="object-fit:cover; aspect-ratio:16/9;"
>}}
{{< card {{< card
link="https://github.com/infracourse/web" link="https://github.com/infracourse/web"
title="Stanford CS 40" title="Stanford CS 40"

View File

@ -151,6 +151,12 @@ params:
sortBy: date sortBy: date
sortOrder: desc # or "asc" sortOrder: desc # or "asc"
highlight:
copy:
enable: true
# hover | always
display: hover
comments: comments:
enable: false enable: false
type: giscus type: giscus

View File

@ -27,6 +27,7 @@
"head", "head",
"hr", "hr",
"html", "html",
"iframe",
"img", "img",
"input", "input",
"kbd", "kbd",
@ -190,6 +191,7 @@
"data-[state=selected]:hx-block", "data-[state=selected]:hx-block",
"data-[state=selected]:hx-border-primary-500", "data-[state=selected]:hx-border-primary-500",
"data-[state=selected]:hx-text-primary-600", "data-[state=selected]:hx-text-primary-600",
"dataframe",
"filename", "filename",
"first:hx-mt-0", "first:hx-mt-0",
"focus:hx-bg-white", "focus:hx-bg-white",
@ -207,10 +209,12 @@
"group-hover:hx-underline", "group-hover:hx-underline",
"group-open:before:hx-rotate-90", "group-open:before:hx-rotate-90",
"hamburger-menu", "hamburger-menu",
"hextra-badge",
"hextra-card", "hextra-card",
"hextra-card-icon", "hextra-card-icon",
"hextra-card-image", "hextra-card-image",
"hextra-card-subtitle", "hextra-card-subtitle",
"hextra-card-tag",
"hextra-cards", "hextra-cards",
"hextra-code-block", "hextra-code-block",
"hextra-code-copy-btn", "hextra-code-copy-btn",
@ -220,8 +224,14 @@
"hextra-filetree", "hextra-filetree",
"hextra-filetree-folder", "hextra-filetree-folder",
"hextra-footer", "hextra-footer",
"hextra-jupyter-code-cell",
"hextra-jupyter-code-cell-outputs",
"hextra-jupyter-code-cell-outputs-container",
"hextra-pdf",
"hextra-scrollbar", "hextra-scrollbar",
"hextra-sidebar-collapsible-button", "hextra-sidebar-collapsible-button",
"hextra-tabs-panel",
"hextra-tabs-toggle",
"hextra-toc", "hextra-toc",
"highlight", "highlight",
"hover:dark:hx-bg-primary-500/10", "hover:dark:hx-bg-primary-500/10",
@ -392,7 +402,9 @@
"hx-overflow-x-auto", "hx-overflow-x-auto",
"hx-overflow-x-hidden", "hx-overflow-x-hidden",
"hx-overflow-y-auto", "hx-overflow-y-auto",
"hx-overflow-y-hidden",
"hx-overscroll-contain", "hx-overscroll-contain",
"hx-overscroll-x-contain",
"hx-p-0.5", "hx-p-0.5",
"hx-p-1", "hx-p-1",
"hx-p-1.5", "hx-p-1.5",
@ -414,6 +426,7 @@
"hx-pt-8", "hx-pt-8",
"hx-px-1.5", "hx-px-1.5",
"hx-px-2", "hx-px-2",
"hx-px-2.5",
"hx-px-3", "hx-px-3",
"hx-px-4", "hx-px-4",
"hx-px-6", "hx-px-6",
@ -452,6 +465,7 @@
"hx-sticky", "hx-sticky",
"hx-text-2xl", "hx-text-2xl",
"hx-text-4xl", "hx-text-4xl",
"hx-text-[.65rem]",
"hx-text-[10px]", "hx-text-[10px]",
"hx-text-[color:hsl(var(--primary-hue),100%,50%)]", "hx-text-[color:hsl(var(--primary-hue),100%,50%)]",
"hx-text-base", "hx-text-base",
@ -603,8 +617,6 @@
"steps", "steps",
"subheading-anchor", "subheading-anchor",
"success-icon", "success-icon",
"tabs-panel",
"tabs-toggle",
"theme-toggle", "theme-toggle",
"xl:hx-block" "xl:hx-block"
], ],

View File

@ -4,7 +4,7 @@ changeTheme: "Darstellung ändern"
copyCode: "Code kopieren" copyCode: "Code kopieren"
copyright: "© 2024 Hextra Project." copyright: "© 2024 Hextra Project."
dark: "Dunkel" dark: "Dunkel"
editThisPage: "Diese Seite auf Github bearbeiten →" editThisPage: "Diese Seite auf GitHub bearbeiten →"
lastUpdated: "Zuletzt aktualisiert am" lastUpdated: "Zuletzt aktualisiert am"
light: "Hell" light: "Hell"
noResultsFound: "Keine Ergebnisse gefunden." noResultsFound: "Keine Ergebnisse gefunden."

14
i18n/he.yaml Normal file
View File

@ -0,0 +1,14 @@
backToTop: "גלול למעלה"
changeLanguage: "שנה שפה"
changeTheme: "שנה ערכת צבעים"
copyCode: "העתק קוד"
copyright: "© 2024 פרוייקט Hextra"
dark: "כהה"
editThisPage: "← ערוך עמוד זה בגיטהאב"
lastUpdated: "עודכן לאחרונה ב"
light: "בהיר"
noResultsFound: "לא נמצאו תוצאות."
onThisPage: "בעמוד זה"
poweredBy: "Hextra מופעל על-ידי"
readMore: "← קרא עוד"
searchPlaceholder: "חיפוש..."

View File

@ -3,7 +3,7 @@ changeLanguage: "언어변경"
changeTheme: "테마변경" changeTheme: "테마변경"
copyright: "© 2024 Hextra Project." copyright: "© 2024 Hextra Project."
dark: "어두운 테마" dark: "어두운 테마"
editThisPage: "Github에서 편집하기 →" editThisPage: "GitHub에서 편집하기 →"
lastUpdated: "마지막 수정일자" lastUpdated: "마지막 수정일자"
light: "밝은 테마" light: "밝은 테마"
noResultsFound: "결과 없음" noResultsFound: "결과 없음"

14
i18n/nl.yaml Normal file
View File

@ -0,0 +1,14 @@
backToTop: "Terug naar boven"
changeLanguage: "Taal veranderen"
changeTheme: "Thema aanpassen"
copyCode: "Kopieer code"
copyright: "© 2024 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..."

14
i18n/ru.yaml Normal file
View File

@ -0,0 +1,14 @@
backToTop: 'Прокрутить к началу'
changeLanguage: 'Изменить язык'
changeTheme: 'Изменить тему'
copyCode: 'Скопировать код'
copyright: '2024 Проект Hextra.'
dark: 'Темная'
editThisPage: 'Отредактировать страницу на GitHub →'
lastUpdated: 'Последнее обновление'
light: 'Светлая'
noResultsFound: 'Ничего не найдено.'
onThisPage: 'На этой странице'
poweredBy: 'При поддержке Hextra'
readMore: 'Читать далее →'
searchPlaceholder: 'Поиск...'

14
i18n/uk.yaml Normal file
View File

@ -0,0 +1,14 @@
backToTop: "Прокрутити до початку"
changeLanguage: "Змінити мову"
changeTheme: "Змінити тему"
copyCode: "Скопіювати код"
copyright: "2024 Проєкт Hextra."
dark: "Темна"
editThisPage: "Редагувати цю сторінку на GitHub →"
lastUpdated: "Востаннє оновлено"
light: "Світла"
noResultsFound: "Не знайдено результатів"
onThisPage: "На цій сторінці"
poweredBy: "Працює завдяки Hextra"
readMore: "Читати більше →"
searchPlaceholder: "Пошук..."

View File

@ -5,7 +5,7 @@
<article class="hx-w-full hx-break-words hx-flex hx-min-h-[calc(100vh-var(--navbar-height))] hx-min-w-0 hx-justify-center hx-pb-8 hx-pr-[calc(env(safe-area-inset-right)-1.5rem)]"> <article class="hx-w-full hx-break-words hx-flex hx-min-h-[calc(100vh-var(--navbar-height))] hx-min-w-0 hx-justify-center hx-pb-8 hx-pr-[calc(env(safe-area-inset-right)-1.5rem)]">
<main class="hx-w-full hx-min-w-0 hx-max-w-6xl hx-px-6 hx-pt-4 md:hx-px-12"> <main class="hx-w-full hx-min-w-0 hx-max-w-6xl hx-px-6 hx-pt-4 md:hx-px-12">
<div class="content"> <div class="content">
<h1>{{ .Title }}</h1> {{ if .Title }}<h1>{{ .Title }}</h1>{{ end }}
{{ .Content }} {{ .Content }}
</div> </div>
<div class="hx-mt-16"></div> <div class="hx-mt-16"></div>

View File

@ -5,7 +5,7 @@
<article class="hx-w-full hx-break-words hx-flex hx-min-h-[calc(100vh-var(--navbar-height))] hx-min-w-0 hx-justify-center hx-pb-8 hx-pr-[calc(env(safe-area-inset-right)-1.5rem)]"> <article class="hx-w-full hx-break-words hx-flex hx-min-h-[calc(100vh-var(--navbar-height))] hx-min-w-0 hx-justify-center hx-pb-8 hx-pr-[calc(env(safe-area-inset-right)-1.5rem)]">
<main class="hx-w-full hx-min-w-0 hx-max-w-6xl hx-px-6 hx-pt-4 md:hx-px-12"> <main class="hx-w-full hx-min-w-0 hx-max-w-6xl hx-px-6 hx-pt-4 md:hx-px-12">
<br class="hx-mt-1.5 hx-text-sm" /> <br class="hx-mt-1.5 hx-text-sm" />
<h1 class="hx-text-center hx-mt-2 hx-text-4xl hx-font-bold hx-tracking-tight hx-text-slate-900 dark:hx-text-slate-100">{{ .Title }}</h1> {{ if .Title }}<h1 class="hx-text-center hx-mt-2 hx-text-4xl hx-font-bold hx-tracking-tight hx-text-slate-900 dark:hx-text-slate-100">{{ .Title }}</h1>{{ end }}
<div class="hx-mb-16"></div> <div class="hx-mb-16"></div>
<div class="content"> <div class="content">
{{ .Content }} {{ .Content }}

View File

@ -3,7 +3,7 @@
{{ partial "sidebar.html" (dict "context" . "disableSidebar" true "displayPlaceholder" false) }} {{ partial "sidebar.html" (dict "context" . "disableSidebar" true "displayPlaceholder" false) }}
<article class="hx-w-full hx-break-words hx-min-h-[calc(100vh-var(--navbar-height))] hx-min-w-0 hx-pt-4 hx-pb-8 hx-pl-[max(env(safe-area-inset-left),1.5rem)] hx-pr-[max(env(safe-area-inset-left),1.5rem)]"> <article class="hx-w-full hx-break-words hx-min-h-[calc(100vh-var(--navbar-height))] hx-min-w-0 hx-pt-4 hx-pb-8 hx-pl-[max(env(safe-area-inset-left),1.5rem)] hx-pr-[max(env(safe-area-inset-left),1.5rem)]">
<br class="hx-mt-1.5 hx-text-sm" /> <br class="hx-mt-1.5 hx-text-sm" />
<h1 class="hx-text-center hx-mt-2 hx-text-4xl hx-font-bold hx-tracking-tight hx-text-slate-900 dark:hx-text-slate-100">{{ .Title }}</h1> {{ if .Title }}<h1 class="hx-text-center hx-mt-2 hx-text-4xl hx-font-bold hx-tracking-tight hx-text-slate-900 dark:hx-text-slate-100">{{ .Title }}</h1>{{ end }}
<div class="content"> <div class="content">
{{ .Content }} {{ .Content }}
</div> </div>

View File

@ -5,7 +5,7 @@
<article class="hx-w-full hx-break-words hx-flex hx-min-h-[calc(100vh-var(--navbar-height))] hx-min-w-0 hx-justify-center hx-pb-8 hx-pr-[calc(env(safe-area-inset-right)-1.5rem)]"> <article class="hx-w-full hx-break-words hx-flex hx-min-h-[calc(100vh-var(--navbar-height))] hx-min-w-0 hx-justify-center hx-pb-8 hx-pr-[calc(env(safe-area-inset-right)-1.5rem)]">
<main class="hx-w-full hx-min-w-0 hx-max-w-6xl hx-px-6 hx-pt-4 md:hx-px-12"> <main class="hx-w-full hx-min-w-0 hx-max-w-6xl hx-px-6 hx-pt-4 md:hx-px-12">
<br class="hx-mt-1.5 hx-text-sm" /> <br class="hx-mt-1.5 hx-text-sm" />
<h1 class="hx-text-center hx-mt-2 hx-text-4xl hx-font-bold hx-tracking-tight hx-text-slate-900 dark:hx-text-slate-100">{{ .Title }}</h1> {{ if .Title }}<h1 class="hx-text-center hx-mt-2 hx-text-4xl hx-font-bold hx-tracking-tight hx-text-slate-900 dark:hx-text-slate-100">{{ .Title }}</h1>{{ end }}
<div class="content">{{ .Content }}</div> <div class="content">{{ .Content }}</div>
{{- $pages := partial "utils/sort-pages" (dict "page" . "by" site.Params.blog.list.sortBy "order" site.Params.blog.list.sortOrder) -}} {{- $pages := partial "utils/sort-pages" (dict "page" . "by" site.Params.blog.list.sortBy "order" site.Params.blog.list.sortOrder) -}}
{{- range $pages }} {{- range $pages }}

View File

@ -5,7 +5,7 @@
<article class="hx-w-full hx-break-words hx-flex hx-min-h-[calc(100vh-var(--navbar-height))] hx-min-w-0 hx-justify-center hx-pb-8 hx-pr-[calc(env(safe-area-inset-right)-1.5rem)]"> <article class="hx-w-full hx-break-words hx-flex hx-min-h-[calc(100vh-var(--navbar-height))] hx-min-w-0 hx-justify-center hx-pb-8 hx-pr-[calc(env(safe-area-inset-right)-1.5rem)]">
<main class="hx-w-full hx-min-w-0 hx-max-w-6xl hx-px-6 hx-pt-4 md:hx-px-12"> <main class="hx-w-full hx-min-w-0 hx-max-w-6xl hx-px-6 hx-pt-4 md:hx-px-12">
{{ partial "breadcrumb.html" . }} {{ partial "breadcrumb.html" . }}
<h1 class="hx-mt-2 hx-text-4xl hx-font-bold hx-tracking-tight hx-text-slate-900 dark:hx-text-slate-100">{{ .Title }}</h1> {{ if .Title }}<h1 class="hx-mt-2 hx-text-4xl hx-font-bold hx-tracking-tight hx-text-slate-900 dark:hx-text-slate-100">{{ .Title }}</h1>{{ end }}
<div class="hx-mt-4 hx-mb-16 hx-text-gray-500 hx-text-sm hx-flex hx-items-center hx-flex-wrap hx-gap-y-2"> <div class="hx-mt-4 hx-mb-16 hx-text-gray-500 hx-text-sm hx-flex hx-items-center hx-flex-wrap hx-gap-y-2">
{{- with $date := .Date }}<span class="hx-mr-1">{{ partial "utils/format-date" $date }}</span>{{ end -}} {{- with $date := .Date }}<span class="hx-mr-1">{{ partial "utils/format-date" $date }}</span>{{ end -}}
{{- $lazyLoading := site.Params.enableImageLazyLoading | default true -}} {{- $lazyLoading := site.Params.enableImageLazyLoading | default true -}}

View File

@ -6,7 +6,7 @@
<main class="hx-w-full hx-min-w-0 hx-max-w-6xl hx-px-6 hx-pt-4 md:hx-px-12"> <main class="hx-w-full hx-min-w-0 hx-max-w-6xl hx-px-6 hx-pt-4 md:hx-px-12">
{{ partial "breadcrumb.html" . }} {{ partial "breadcrumb.html" . }}
<div class="content"> <div class="content">
<h1>{{ .Title }}</h1> {{ if .Title }}<h1>{{ .Title }}</h1>{{ end }}
{{ .Content }} {{ .Content }}
</div> </div>
{{ partial "components/last-updated.html" . }} {{ partial "components/last-updated.html" . }}

View File

@ -6,7 +6,7 @@
<main class="hx-w-full hx-min-w-0 hx-max-w-6xl hx-px-6 hx-pt-4 md:hx-px-12"> <main class="hx-w-full hx-min-w-0 hx-max-w-6xl hx-px-6 hx-pt-4 md:hx-px-12">
{{ partial "breadcrumb.html" . }} {{ partial "breadcrumb.html" . }}
<div class="content"> <div class="content">
<h1>{{ .Title }}</h1> {{ if .Title }}<h1>{{ .Title }}</h1>{{ end }}
{{ .Content }} {{ .Content }}
</div> </div>
{{ partial "components/last-updated.html" . }} {{ partial "components/last-updated.html" . }}

View File

@ -4,7 +4,7 @@
{{ partial "toc.html" . }} {{ partial "toc.html" . }}
<article class="hx-w-full hx-break-words hx-flex hx-min-h-[calc(100vh-var(--navbar-height))] hx-min-w-0 hx-justify-center hx-pb-8 hx-pr-[calc(env(safe-area-inset-right)-1.5rem)]"> <article class="hx-w-full hx-break-words hx-flex hx-min-h-[calc(100vh-var(--navbar-height))] hx-min-w-0 hx-justify-center hx-pb-8 hx-pr-[calc(env(safe-area-inset-right)-1.5rem)]">
<main class="hx-w-full hx-min-w-0 hx-max-w-6xl hx-px-6 hx-pt-4 md:hx-px-12"> <main class="hx-w-full hx-min-w-0 hx-max-w-6xl hx-px-6 hx-pt-4 md:hx-px-12">
<h1 class="hx-text-center hx-mt-2 hx-text-4xl hx-font-bold hx-tracking-tight hx-text-slate-900 dark:hx-text-slate-100">{{ .Title }}</h1> {{ if .Title }}<h1 class="hx-text-center hx-mt-2 hx-text-4xl hx-font-bold hx-tracking-tight hx-text-slate-900 dark:hx-text-slate-100">{{ .Title }}</h1>{{ end }}
<div class="content"> <div class="content">
{{ .Content }} {{ .Content }}
</div> </div>

View File

@ -1,13 +1,15 @@
<div class="hx-mt-1.5 hx-flex hx-items-center hx-gap-1 hx-overflow-hidden hx-text-sm hx-text-gray-500 dark:hx-text-gray-400 contrast-more:hx-text-current"> {{- if (default true .Params.breadcrumbs) }}
{{- range .Ancestors.Reverse }} <div class="hx-mt-1.5 hx-flex hx-items-center hx-gap-1 hx-overflow-hidden hx-text-sm hx-text-gray-500 dark:hx-text-gray-400 contrast-more:hx-text-current">
{{- if not .IsHome }} {{- range .Ancestors.Reverse }}
<div class="hx-whitespace-nowrap hx-transition-colors hx-min-w-[24px] hx-overflow-hidden hx-text-ellipsis hover:hx-text-gray-900 dark:hover:hx-text-gray-100"> {{- if not .IsHome }}
<a href="{{ .Permalink }}">{{- partial "utils/title" . -}}</a> <div class="hx-whitespace-nowrap hx-transition-colors hx-min-w-[24px] hx-overflow-hidden hx-text-ellipsis hover:hx-text-gray-900 dark:hover:hx-text-gray-100">
</div> <a href="{{ .RelPermalink }}">{{- partial "utils/title" . -}}</a>
{{- partial "utils/icon.html" (dict "name" "chevron-right" "attributes" "class=\"hx-w-3.5 hx-shrink-0 rtl:-hx-rotate-180\"") -}} </div>
{{- partial "utils/icon.html" (dict "name" "chevron-right" "attributes" "class=\"hx-w-3.5 hx-shrink-0 rtl:-hx-rotate-180\"") -}}
{{ end -}}
{{ end -}} {{ end -}}
{{ end -}} <div class="hx-whitespace-nowrap hx-transition-colors hx-font-medium hx-text-gray-700 contrast-more:hx-font-bold contrast-more:hx-text-current dark:hx-text-gray-100 contrast-more:dark:hx-text-current">
<div class="hx-whitespace-nowrap hx-transition-colors hx-font-medium hx-text-gray-700 contrast-more:hx-font-bold contrast-more:hx-text-current dark:hx-text-gray-100 contrast-more:dark:hx-text-current"> {{- partial "utils/title" . -}}
{{- partial "utils/title" . -}} </div>
</div> </div>
</div> {{ end -}}

View File

@ -20,7 +20,7 @@
{{- partial "language-switch.html" (dict "context" .) -}} {{- partial "language-switch.html" (dict "context" .) -}}
{{- with $displayThemeToggle }}{{ partial "theme-toggle.html" }}{{ end -}} {{- with $displayThemeToggle }}{{ partial "theme-toggle.html" }}{{ end -}}
</div> </div>
{{- if or site.IsMultiLingual $displayThemeToggle -}} {{- if or hugo.IsMultilingual $displayThemeToggle -}}
<hr class="dark:hx-border-neutral-800" /> <hr class="dark:hx-border-neutral-800" />
{{- end -}} {{- end -}}
{{- end -}} {{- end -}}

View File

@ -1,10 +1,4 @@
{{/* site.GoogleAnalytics is deprecated in Hugo v0.120.0 */}} {{- with site.Config.Services.GoogleAnalytics.ID }}
{{/* it will be removed in a future version */}}
{{- $gtagID := "" -}}
{{- with site.GoogleAnalytics -}}{{ $gtagID = . }}{{- end -}}
{{- with site.Config.Services.GoogleAnalytics.ID -}}{{ $gtagID = . }}{{- end -}}
{{- with $gtagID }}
<!-- Global site tag (gtag.js) - Google Analytics --> <!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id={{ . }}"></script> <script async src="https://www.googletagmanager.com/gtag/js?id={{ . }}"></script>
<script> <script>

View File

@ -1,6 +1,6 @@
{{- if and (not hugo.IsProduction) (eq hugo.Environment "theme") }} {{- if and (not hugo.IsProduction) (eq hugo.Environment "theme") }}
{{- $styles := resources.Get "css/styles.css" }} {{- $styles := resources.Get "css/styles.css" }}
{{- $styles = $styles | resources.PostCSS (dict "inlineImports" true) }} {{- $styles = $styles | postCSS (dict "inlineImports" true) }}
<link href="{{ $styles.RelPermalink }}" rel="stylesheet" /> <link href="{{ $styles.RelPermalink }}" rel="stylesheet" />
{{- else }} {{- else }}
{{- $styles := resources.Get "css/compiled/main.css" -}} {{- $styles := resources.Get "css/compiled/main.css" -}}

View File

@ -6,7 +6,7 @@
{{ else -}} {{ else -}}
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
{{ end -}} {{ end -}}
{{ partialCached "favicons.html" . }} {{ partialCached "favicons.html" . -}}
<title> <title>
{{- if .IsHome -}} {{- if .IsHome -}}
{{ .Site.Title -}} {{ .Site.Title -}}
@ -17,25 +17,24 @@
</title> </title>
<meta name="description" content="{{ partial "utils/page-description.html" . }}" /> <meta name="description" content="{{ partial "utils/page-description.html" . }}" />
{{ with .Params.canonical }} {{- with .Params.canonical -}}
<link rel="canonical" href="{{ . }}" itemprop="url" /> <link rel="canonical" href="{{ . }}" itemprop="url" />
{{ else }} {{- else -}}
<link rel="canonical" href="{{ .Permalink }}" itemprop="url" /> <link rel="canonical" href="{{ .Permalink }}" itemprop="url" />
{{ end }} {{- end -}}
{{ partial "opengraph.html" . }} {{- partial "opengraph.html" . -}}
{{ template "_internal/schema.html" . -}} {{- template "_internal/schema.html" . -}}
{{ template "_internal/twitter_cards.html" . -}} {{- template "_internal/twitter_cards.html" . -}}
{{ partialCached "head-css.html" . }} {{- partialCached "head-css.html" . -}}
<!-- Google Analytics --> <!-- Google Analytics -->
{{- if and (eq hugo.Environment "production") (or .Site.GoogleAnalytics .Site.Config.Services.GoogleAnalytics.ID) }} {{- if and (eq hugo.Environment "production") .Site.Config.Services.GoogleAnalytics.ID }}
<link rel="preconnect" href="https://www.googletagmanager.com" crossorigin /> <link rel="preconnect" href="https://www.googletagmanager.com" crossorigin />
{{ partial "google-analytics.html" . }} {{ partial "google-analytics.html" . }}
{{- end }} {{- end }}
<script> <script>
/* Initialize light/dark mode */ /* Initialize light/dark mode */

View File

@ -5,7 +5,7 @@
{{- $changeLanguage := (T "changeLanguage") | default "Change language" -}} {{- $changeLanguage := (T "changeLanguage") | default "Change language" -}}
{{- if site.IsMultiLingual -}} {{- if hugo.IsMultilingual -}}
<div class="hx-flex hx-justify-items-start {{ if $grow }}hx-grow{{ end }}"> <div class="hx-flex hx-justify-items-start {{ if $grow }}hx-grow{{ end }}">
<button <button
title="{{ $changeLanguage }}" title="{{ $changeLanguage }}"

View File

@ -42,7 +42,7 @@
{{/* Display icon menu item */}} {{/* Display icon menu item */}}
{{- if .Params.icon -}} {{- if .Params.icon -}}
{{- $rel := cond (eq .Params.icon "mastodon") "noreferer me" "noreferer" }} {{- $rel := cond (eq .Params.icon "mastodon") "noreferrer me" "noreferrer" }}
<a class="hx-p-2 hx-text-current" {{ if $external }}target="_blank" rel="{{ $rel }}"{{ end }} href="{{ $link }}" title="{{ or (T .Identifier) .Name | safeHTML }}"> <a class="hx-p-2 hx-text-current" {{ if $external }}target="_blank" rel="{{ $rel }}"{{ end }} href="{{ $link }}" title="{{ or (T .Identifier) .Name | safeHTML }}">
{{- partial "utils/icon.html" (dict "name" .Params.icon "attributes" "height=24") -}} {{- partial "utils/icon.html" (dict "name" .Params.icon "attributes" "height=24") -}}
<span class="hx-sr-only">{{ or (T .Identifier) .Name | safeHTML }}</span> <span class="hx-sr-only">{{ or (T .Identifier) .Name | safeHTML }}</span>
@ -53,7 +53,7 @@
<a <a
title="{{ or (T .Identifier) .Name | safeHTML }}" title="{{ or (T .Identifier) .Name | safeHTML }}"
href="{{ $link }}" href="{{ $link }}"
{{ if $external }}target="_blank" rel="noreferer"{{ end }} {{ if $external }}target="_blank" rel="noreferrer"{{ end }}
class="hx-text-sm contrast-more:hx-text-gray-700 contrast-more:dark:hx-text-gray-100 hx-relative -hx-ml-2 hx-hidden hx-whitespace-nowrap hx-p-2 md:hx-inline-block {{ $activeClass }}" class="hx-text-sm contrast-more:hx-text-gray-700 contrast-more:dark:hx-text-gray-100 hx-relative -hx-ml-2 hx-hidden hx-whitespace-nowrap hx-p-2 md:hx-inline-block {{ $activeClass }}"
> >
<span class="hx-text-center">{{ or (T .Identifier) .Name | safeHTML }}</span> <span class="hx-text-center">{{ or (T .Identifier) .Name | safeHTML }}</span>

View File

@ -60,12 +60,18 @@
{{- end -}} {{- end -}}
<script> <script>
// TODO: make render options configurable // TODO: make render options configurable
// Reference: https://katex.org/docs/autorender#api
document.addEventListener("DOMContentLoaded", function () { document.addEventListener("DOMContentLoaded", function () {
renderMathInElement(document.body, { renderMathInElement(document.body, {
delimiters: [ delimiters: [
{ left: "$$", right: "$$", display: true }, { left: "$$", right: "$$", display: true },
{ left: "$", right: "$", display: false }, { left: "$", right: "$", display: false },
{ left: "\\(", right: "\\)", display: false }, { left: "\\(", right: "\\)", display: false },
{ left: "\\begin{equation}", right: "\\end{equation}", display: true },
{left: "\\begin{align}", right: "\\end{align}", display: true},
{left: "\\begin{alignat}", right: "\\end{alignat}", display: true},
{left: "\\begin{gather}", right: "\\end{gather}", display: true},
{left: "\\begin{CD}", right: "\\end{CD}", display: true},
{ left: "\\[", right: "\\]", display: true }, { left: "\\[", right: "\\]", display: true },
], ],
throwOnError: false, throwOnError: false,

View File

@ -0,0 +1,16 @@
{{- $content := .content -}}
{{- $type := .type -}}
{{- $class := .class | default "" -}}
{{- $border := .border | default false -}}
{{- $defaultClass := "hx-text-gray-600 hx-bg-gray-100 dark:hx-bg-neutral-800 dark:hx-text-neutral-200 hx-border-gray-200 dark:hx-border-neutral-700" -}}
{{- $warningClass := "hx-border-yellow-100 hx-bg-yellow-50 hx-text-yellow-900 dark:hx-border-yellow-200/30 dark:hx-bg-yellow-700/30 dark:hx-text-yellow-200" -}}
{{- $infoClass := "hx-border-blue-200 hx-bg-blue-100 hx-text-blue-900 dark:hx-border-blue-200/30 dark:hx-bg-blue-900/30 dark:hx-text-blue-200" -}}
{{- $errorClass := "hx-border-red-200 hx-bg-red-100 hx-text-red-900 dark:hx-border-red-200/30 dark:hx-bg-red-900/30 dark:hx-text-red-200" -}}
{{- $borderClass := cond (eq $border true) "hx-border" "" -}}
{{- $badgeClass := cond (eq $type "info") $infoClass (cond (eq $type "warning") $warningClass (cond (eq $type "error") $errorClass $defaultClass)) -}}
<div class="hextra-badge {{ $class }}">
<div class="hx-inline-flex hx-items-center hx-rounded-full hx-px-2.5 hx-leading-6 hx-text-[.65rem] {{ $borderClass }} {{ $badgeClass }}">{{- $content -}}</div>
</div>
{{- /* Strip trailing newline. */ -}}

View File

@ -7,6 +7,8 @@
{{- $width := .width -}} {{- $width := .width -}}
{{- $height := .height -}} {{- $height := .height -}}
{{- $imageStyle := .imageStyle -}} {{- $imageStyle := .imageStyle -}}
{{- $tag := .tag -}}
{{- $tagType := .tagType -}}
{{ $linkClass := "hover:hx-border-gray-300 hx-bg-transparent hx-shadow-sm dark:hx-border-neutral-800 hover:hx-bg-slate-50 hover:hx-shadow-md dark:hover:hx-border-neutral-700 dark:hover:hx-bg-neutral-900" }} {{ $linkClass := "hover:hx-border-gray-300 hx-bg-transparent hx-shadow-sm dark:hx-border-neutral-800 hover:hx-bg-slate-50 hover:hx-shadow-md dark:hover:hx-border-neutral-700 dark:hover:hx-bg-neutral-900" }}
{{- with $image -}} {{- with $image -}}
@ -50,5 +52,15 @@
{{- with $subtitle -}} {{- with $subtitle -}}
<div class="hextra-card-subtitle hx-line-clamp-3 hx-text-sm hx-font-normal hx-text-gray-500 dark:hx-text-gray-400 hx-px-4 hx-mb-4 hx-mt-2">{{- $subtitle | markdownify -}}</div> <div class="hextra-card-subtitle hx-line-clamp-3 hx-text-sm hx-font-normal hx-text-gray-500 dark:hx-text-gray-400 hx-px-4 hx-mb-4 hx-mt-2">{{- $subtitle | markdownify -}}</div>
{{- end -}} {{- end -}}
{{- if $tag }}
{{- partial "shortcodes/badge.html" (dict
"content" $tag
"type" $tagType
"class" "hextra-card-tag"
"border" true
)
-}}
{{- end -}}
</a> </a>
{{- /* Strip trailing newline. */ -}} {{- /* Strip trailing newline. */ -}}

View File

@ -0,0 +1,6 @@
{{- $cols := .cols | default 3 -}}
{{- $content := .content -}}
<div class="hextra-cards hx-mt-4 hx-gap-4 hx-grid not-prose" style="--hextra-cards-grid-cols: {{ $cols }};">
{{- $content -}}
</div>

View File

@ -43,9 +43,9 @@
{{ $switchesClass := cond $disableSidebar "md:hx-hidden" "" -}} {{ $switchesClass := cond $disableSidebar "md:hx-hidden" "" -}}
{{ $displayThemeToggle := (site.Params.theme.displayToggle | default true) -}} {{ $displayThemeToggle := (site.Params.theme.displayToggle | default true) -}}
{{ if or site.IsMultiLingual $displayThemeToggle }} {{ if or hugo.IsMultilingual $displayThemeToggle }}
<div class="{{ $switchesClass }} {{ with site.IsMultiLingual }}hx-justify-end{{ end }} hx-sticky hx-bottom-0 hx-bg-white dark:hx-bg-dark hx-mx-4 hx-py-4 hx-shadow-[0_-12px_16px_#fff] hx-flex hx-items-center hx-gap-2 dark:hx-border-neutral-800 dark:hx-shadow-[0_-12px_16px_#111] contrast-more:hx-border-neutral-400 contrast-more:hx-shadow-none contrast-more:dark:hx-shadow-none hx-border-t" data-toggle-animation="show"> <div class="{{ $switchesClass }} {{ with hugo.IsMultilingual }}hx-justify-end{{ end }} hx-sticky hx-bottom-0 hx-bg-white dark:hx-bg-dark hx-mx-4 hx-py-4 hx-shadow-[0_-12px_16px_#fff] hx-flex hx-items-center hx-gap-2 dark:hx-border-neutral-800 dark:hx-shadow-[0_-12px_16px_#111] contrast-more:hx-border-neutral-400 contrast-more:hx-shadow-none contrast-more:dark:hx-shadow-none hx-border-t" data-toggle-animation="show">
{{- with site.IsMultiLingual -}} {{- with hugo.IsMultilingual -}}
{{- partial "language-switch" (dict "context" $context "grow" true) -}} {{- partial "language-switch" (dict "context" $context "grow" true) -}}
{{- with $displayThemeToggle }}{{ partial "theme-toggle" (dict "hideLabel" true) }}{{ end -}} {{- with $displayThemeToggle }}{{ partial "theme-toggle" (dict "hideLabel" true) }}{{ end -}}
{{- else -}} {{- else -}}
@ -160,7 +160,7 @@
hx-text-gray-500 hover:hx-bg-gray-100 hover:hx-text-gray-900 contrast-more:hx-border contrast-more:hx-border-transparent contrast-more:hx-text-gray-900 contrast-more:hover:hx-border-gray-900 dark:hx-text-neutral-400 dark:hover:hx-bg-primary-100/5 dark:hover:hx-text-gray-50 contrast-more:dark:hx-text-gray-50 contrast-more:dark:hover:hx-border-gray-50 hx-text-gray-500 hover:hx-bg-gray-100 hover:hx-text-gray-900 contrast-more:hx-border contrast-more:hx-border-transparent contrast-more:hx-text-gray-900 contrast-more:hover:hx-border-gray-900 dark:hx-text-neutral-400 dark:hover:hx-bg-primary-100/5 dark:hover:hx-text-gray-50 contrast-more:dark:hx-text-gray-50 contrast-more:dark:hover:hx-border-gray-50
{{- end -}}" {{- end -}}"
href="{{ .link }}" href="{{ .link }}"
{{ if $external }}target="_blank" rel="noreferer"{{ end }} {{ if $external }}target="_blank" rel="noreferrer"{{ end }}
> >
{{- .title -}} {{- .title -}}
{{- with .context }} {{- with .context }}

View File

@ -38,7 +38,7 @@
{{- $editURL = urls.JoinPath $editURL $sourceDir $path -}} {{- $editURL = urls.JoinPath $editURL $sourceDir $path -}}
{{- end -}} {{- end -}}
{{- end -}} {{- end -}}
<a class="hx-text-xs hx-font-medium hx-text-gray-500 hover:hx-text-gray-900 dark:hx-text-gray-400 dark:hover:hx-text-gray-100 contrast-more:hx-text-gray-800 contrast-more:dark:hx-text-gray-50" href="{{ $editURL }}" target="_blank" rel="noreferer">{{ $editThisPage }}</a> <a class="hx-text-xs hx-font-medium hx-text-gray-500 hover:hx-text-gray-900 dark:hx-text-gray-400 dark:hover:hx-text-gray-100 contrast-more:hx-text-gray-800 contrast-more:dark:hx-text-gray-50" href="{{ $editURL }}" target="_blank" rel="noreferrer">{{ $editThisPage }}</a>
{{- end -}} {{- end -}}
{{/* Scroll To Top */}} {{/* Scroll To Top */}}
<button aria-hidden="true" id="backToTop" onClick="scrollUp();" class="hx-transition-all hx-duration-75 hx-opacity-0 hx-text-xs hx-font-medium hx-text-gray-500 hover:hx-text-gray-900 dark:hx-text-gray-400 dark:hover:hx-text-gray-100 contrast-more:hx-text-gray-800 contrast-more:dark:hx-text-gray-50"> <button aria-hidden="true" id="backToTop" onClick="scrollUp();" class="hx-transition-all hx-duration-75 hx-opacity-0 hx-text-xs hx-font-medium hx-text-gray-500 hover:hx-text-gray-900 dark:hx-text-gray-400 dark:hover:hx-text-gray-100 contrast-more:hx-text-gray-800 contrast-more:dark:hx-text-gray-50">

View File

@ -0,0 +1,33 @@
{{- if .IsNamedParams -}}
{{- $content := .Get "content" -}}
{{- $type := .Get "type" | default "" -}}
{{- $class := .Get "class" | default "" -}}
{{- $link := .Get "link" | default "" -}}
{{- if $link -}}
<a href="{{ $link }}" title="{{ $content | plainify }}" target="_blank">
{{- partial "shortcodes/badge.html" (dict
"content" $content
"type" $type
"class" $class
"border" true
)
-}}
</a>
{{- else -}}
{{- partial "shortcodes/badge.html" (dict
"content" $content
"type" $type
"class" $class
"border" true
)
-}}
{{- end -}}
{{- else -}}
{{- $content := .Get 0 -}}
{{- partial "shortcodes/badge.html" (dict
"content" $content
"border" true
)
-}}
{{- end -}}

View File

@ -7,6 +7,8 @@
{{- $width := 0 -}} {{- $width := 0 -}}
{{- $height := 0 -}} {{- $height := 0 -}}
{{- $imageStyle := .Get "imageStyle" -}} {{- $imageStyle := .Get "imageStyle" -}}
{{- $tag := .Get "tag" -}}
{{- $tagType := .Get "tagType" -}}
{{/* Image processing options */}} {{/* Image processing options */}}
{{- $method := .Get "method" | default "Resize" | humanize -}} {{- $method := .Get "method" | default "Resize" | humanize -}}
@ -48,5 +50,7 @@
"width" $width "width" $width
"height" $height "height" $height
"imageStyle" $imageStyle "imageStyle" $imageStyle
"tag" $tag
"tagType" $tagType
) )
-}} -}}

View File

@ -1,5 +1,3 @@
{{- $cols := .Get "cols" | default 3 -}} {{- $cols := .Get "cols" | default 3 -}}
<div class="hextra-cards hx-mt-4 hx-gap-4 hx-grid not-prose" style="--hextra-cards-grid-cols: {{ $cols }};"> {{- partial "shortcodes/cards" (dict "cols" $cols "content" .Inner) -}}
{{- .Inner -}}
</div>

View File

@ -0,0 +1,38 @@
{{- $class := .Get "class" -}}
{{- $cols := .Get "cols" | default 2 -}}
{{- $image := .Get "image" -}}
{{- $imageCard := .Get "imageCard" | default false -}}
{{- $imageClass := .Get "imageClass" -}}
{{- $imageLink := .Get "imageLink" -}}
{{- $imageLinkExternal := hasPrefix $imageLink "http" -}}
{{- $imageStyle := .Get "imageStyle" -}}
{{- $imageTitle := .Get "imageTitle" -}}
{{- $imageWidth := .Get "imageWidth" | default 350 -}}
{{- $imageHeight := .Get "imageHeight" | default 350 -}}
{{- $style := .Get "style" -}}
{{- $css := printf "--hextra-feature-grid-cols: %v; %s" $cols $style -}}
{{- $href := cond (hasPrefix $imageLink "/") ($imageLink | relURL) $imageLink -}}
{{- if hasPrefix $image "/" -}}
{{- $image = relURL (strings.TrimPrefix "/" $image) -}}
{{- end -}}
<div
class="{{ $class }} hextra-feature-grid hx-grid sm:max-lg:hx-grid-cols-2 max-sm:hx-grid-cols-1 hx-gap-4 hx-w-full not-prose"
{{ with $css }}style="{{ . | safeCSS }}"{{ end }}
>
<div class="hx-w-full">
{{ .Inner }}
</div>
{{- with $image }}
<div class="hx-mx-auto">
<a
{{ with $imageLink }}href="{{ $href }}" {{ with $imageLinkExternal }} target="_blank" rel="noreferrer"{{ end }}{{ end }}
{{ with $imageStyle }}style="{{ . | safeCSS }}"{{ end }}
class="{{ $imageClass }} {{ if $imageCard }}hextra-feature-card not-prose hx-block hx-relative hx-p-6 hx-overflow-hidden hx-rounded-3xl hx-border hx-border-gray-200 hover:hx-border-gray-300 dark:hx-border-neutral-800 dark:hover:hx-border-neutral-700 before:hx-pointer-events-none before:hx-absolute before:hx-inset-0 before:hx-bg-glass-gradient{{ end }}"
>
<img src="{{ $image }}" width="{{ $imageWidth }}" height="{{ $imageHeight }}" {{ with $imageTitle }}alt="{{ $imageTitle }}"{{ end }}/>
</a>
</div>
{{ end -}}
</div>

View File

@ -5,7 +5,7 @@ Renders the page using the RenderShortcode method on the Page object.
You must call this shortcode using the {{% %}} notation. You must call this shortcode using the {{% %}} notation.
@param {string} (postional parameter 0) The path to the page, relative to the content directory. @param {string} (positional parameter 0) The path to the page, relative to the content directory.
@returns template.HTML @returns template.HTML
@example {{% include "functions/_common/glob-patterns" %}} @example {{% include "functions/_common/glob-patterns" %}}

View File

@ -0,0 +1,81 @@
{{/* Render Jupyter Notebook */}}
{{- $path := .Get 0 -}}
{{- $data := "" -}}
{{- $page := .Page -}}
{{- $isLocal := not (urls.Parse $path).Scheme -}}
{{- $isPage := and (eq .Page.Kind "page") (not .Page.BundleType) -}}
{{/* https://gohugo.io/functions/transform/unmarshal/ */}}
{{- if (not $isLocal) -}}
{{- with resources.GetRemote $path -}}
{{- with unmarshal .Content -}}{{- $data = . -}}{{- end -}}
{{- else -}}
{{- errorf "Remote resource not found: %s" $path -}}
{{- end -}}
{{- else if (not $isPage) -}}
{{- with .Page.Resources.Get $path -}}
{{- with unmarshal .Content -}}{{- $data = . -}}{{- end -}}
{{- else -}}
{{- errorf "Local resource not found: %s" $path -}}
{{- end -}}
{{- else -}}
{{- with resources.Get $path -}}
{{- with unmarshal .Content -}}{{- $data = . -}}{{- end -}}
{{- else -}}
{{- errorf "Local resource not found: %s" $path -}}
{{- end -}}
{{- end -}}
{{- $language := index $data "metadata" "language_info" "name" | default "python" -}}
{{- with index $data "cells" -}}
{{- range $cell := . -}}
{{- if eq (index $cell "cell_type") "code" -}}
{{- $source := index $cell "source" -}}
{{- $sourceContent := (cond (reflect.IsSlice $source) (delimit $source "") $source) -}}
{{- with ($sourceContent | strings.Chomp) -}}
{{ (printf "\n\n```%s\n%s\n```\n" $language .) | safeHTML -}}
{{- end -}}
<div class="hextra-jupyter-code-cell hextra-scrollbar">
{{- $outputs := index $cell "outputs" -}}
{{- with $outputs -}}
<div class="hextra-jupyter-code-cell-outputs-container">
<div class="hextra-jupyter-code-cell-outputs">
{{- range $output := . -}}
{{- if eq (index $output "output_type") "display_data" -}}
{{- $data := index $output "data" -}}
{{- $image := index $data "image/png" -}}
{{- if $image -}}
<img src="data:image/png;base64,{{- $image -}}" alt="image" />
{{- end -}}
{{- else if eq (index $output "output_type") "stream" -}}
{{- $text := index $output "text" -}}
{{- $textContent := (cond (reflect.IsSlice $text) (delimit $text "") $text) -}}
<pre class="not-prose">{{- $textContent -}}</pre>
{{- else if eq (index $output "output_type") "execute_result" -}}
{{- $data := index $output "data" -}}
{{- $text := index $data "text/plain" -}}
{{- $textContent := (cond (reflect.IsSlice $text) (delimit $text "") $text) -}}
<pre class="not-prose">{{- $textContent -}}</pre>
{{- $html := index $data "text/html" -}}
{{- if $html -}}
{{- $htmlText := delimit $html "" -}}
<div>
{{- $htmlText | safeHTML -}}
</div>
{{- end -}}
{{- end -}}
{{- end -}}
</div>
</div>
{{- end -}}
</div>
{{- else if eq (index $cell "cell_type") "markdown" -}}
{{- $source := index $cell "source" }}
{{- $sourceContent := (cond (reflect.IsSlice $source) (delimit $source "") $source) }}
{{ (printf "\n%s\n" $sourceContent) | safeHTML }}
{{- end -}}
{{- end -}}
{{- end -}}

View File

@ -1,11 +1,12 @@
{{- $defaultIndex := int ((.Parent.Get "defaultIndex") | default "0") -}} {{- $defaultIndex := int ((.Parent.Get "defaultIndex") | default "0") -}}
<div <div
class="tabs-panel hx-rounded hx-pt-6 hx-hidden data-[state=selected]:hx-block" class="hextra-tabs-panel hx-rounded hx-pt-6 hx-hidden data-[state=selected]:hx-block"
id="tabs-panel-{{ .Ordinal }}" id="tabs-panel-{{ .Ordinal }}"
role="tabpanel" role="tabpanel"
{{ if eq .Ordinal $defaultIndex }}tabindex="0"{{ end }} {{- if eq .Ordinal $defaultIndex }} tabindex="0" {{ end -}}
{{ if eq .Ordinal $defaultIndex }}data-state="selected"{{ end }} {{- if eq .Ordinal $defaultIndex }} data-state="selected" {{ end -}}
> >
{{ .InnerDeindent | markdownify }} {{- .InnerDeindent | markdownify -}}
</div> </div>
{{- /* Drop trailing newlines */ -}}

View File

@ -5,22 +5,24 @@
{{ errorf "no items provided" }} {{ errorf "no items provided" }}
{{- end -}} {{- end -}}
<div class="hextra-scrollbar hx-overflow-x-auto hx-overflow-y-hidden hx-overscroll-x-contain">
<div class="hx-mt-4 hx-flex hx-w-max hx-min-w-full hx-border-b hx-border-gray-200 hx-pb-px dark:hx-border-neutral-800"> <div class="hx-mt-4 hx-flex hx-w-max hx-min-w-full hx-border-b hx-border-gray-200 hx-pb-px dark:hx-border-neutral-800">
{{- range $i, $item := $items -}} {{- range $i, $item := $items -}}
<button <button
class="tabs-toggle data-[state=selected]:hx-border-primary-500 data-[state=selected]:hx-text-primary-600 hx-mr-2 hx-rounded-t hx-p-2 hx-font-medium hx-leading-5 hx-transition-colors -hx-mb-0.5 hx-select-none hx-border-b-2 hx-border-transparent hx-text-gray-600 hover:hx-border-gray-200 hover:hx-text-black dark:hx-text-gray-200 dark:hover:hx-border-neutral-800 dark:hover:hx-text-white" class="hextra-tabs-toggle data-[state=selected]:hx-border-primary-500 data-[state=selected]:hx-text-primary-600 hx-mr-2 hx-rounded-t hx-p-2 hx-font-medium hx-leading-5 hx-transition-colors -hx-mb-0.5 hx-select-none hx-border-b-2 hx-border-transparent hx-text-gray-600 hover:hx-border-gray-200 hover:hx-text-black dark:hx-text-gray-200 dark:hover:hx-border-neutral-800 dark:hover:hx-text-white"
role="tab" role="tab"
type="button" type="button"
aria-controls="tabs-panel-{{ $i }}" aria-controls="tabs-panel-{{ $i }}"
{{ if eq $i $defaultIndex }}aria-selected="true"{{ end }} {{- if eq $i $defaultIndex }} aria-selected="true" {{ end -}}
{{ if eq $i $defaultIndex }}tabindex="0"{{ end }} {{- if eq $i $defaultIndex }} tabindex="0" {{ end -}}
{{ if eq $i $defaultIndex }}data-state="selected"{{ end }} {{- if eq $i $defaultIndex }} data-state="selected"{{ end -}}
> >
{{- $item -}} {{- $item -}}
</button> </button>
{{- end -}} {{- end -}}
</div>
</div> </div>
<div> <div>
{{ .Inner }} {{- .Inner -}}
</div> </div>
{{- /* Drop trailing newlines */ -}}

View File

@ -7,4 +7,6 @@ command = "cd exampleSite && hugo --gc --minify --themesDir ../.. -b ${DEPLOY_PR
ignore = "false" ignore = "false"
[build.environment] [build.environment]
HUGO_VERSION = "0.117.0" HUGO_VERSION = "0.132.2"
GO_VERSION = "1.22.3"
NODE_VERSION = "22.2.0"

1269
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -3,10 +3,18 @@ const colors = require('tailwindcss/colors')
const makePrimaryColor = const makePrimaryColor =
l => l =>
({ opacityValue }) => { ({ opacityValue }) => {
return ( let result = "hsl(var(--primary-hue) var(--primary-saturation) ";
`hsl(var(--primary-hue) var(--primary-saturation) ${l}%` + if (l <= 50) {
(opacityValue ? ` / ${opacityValue})` : ')') // Interpolate between lower values
) result+= `calc(calc(var(--primary-lightness) / 50) * ${l})`;
}
else {
// Interpolate between higher values
result+= `calc(var(--primary-lightness) + calc(calc(100% - var(--primary-lightness)) / 50) * ${l - 50})`;
}
result += (opacityValue ? ` / ${opacityValue})` : ')');
return result;
} }
/** @type {import('tailwindcss').Config} */ /** @type {import('tailwindcss').Config} */

View File

@ -25,4 +25,4 @@ tasks:
- curl -o assets/lib/katex/katex.min.css https://cdn.jsdelivr.net/npm/katex@latest/dist/katex.min.css - curl -o assets/lib/katex/katex.min.css https://cdn.jsdelivr.net/npm/katex@latest/dist/katex.min.css
- curl -o assets/lib/katex/auto-render.min.js https://cdn.jsdelivr.net/npm/katex@0.16.10/dist/contrib/auto-render.min.js - curl -o assets/lib/katex/auto-render.min.js https://cdn.jsdelivr.net/npm/katex@0.16.10/dist/contrib/auto-render.min.js
- curl -o assets/lib/katex/mhchem.min.js https://cdn.jsdelivr.net/npm/katex@0.16.10/dist/contrib/mhchem.min.js - curl -o assets/lib/katex/mhchem.min.js https://cdn.jsdelivr.net/npm/katex@0.16.10/dist/contrib/mhchem.min.js
- curl -o assets/lib/mermaid/mermaid.min.js https://cdn.jsdelivr.net/npm/mermaid@10.9.0/dist/mermaid.min.js - curl -o assets/lib/mermaid/mermaid.min.js https://cdn.jsdelivr.net/npm/mermaid@11.3.0/dist/mermaid.min.js

View File

@ -9,7 +9,7 @@ homepage = "https://github.com/imfing/hextra/"
demosite = "https://imfing.github.io/hextra/" demosite = "https://imfing.github.io/hextra/"
tags = ["Modern", "Elegant", "Blog", "Documentation", "Responsive", "Clean", "Light", "Dark", "Minimal"] tags = ["Modern", "Elegant", "Blog", "Documentation", "Responsive", "Clean", "Light", "Dark", "Minimal"]
features = ["Responsive", "Dark Mode", "Search", "Syntax Highlighting", "Multilingual", "Social", "Blog", "RSS", "Customization"] features = ["Responsive", "Dark Mode", "Search", "Syntax Highlighting", "Multilingual", "Social", "Blog", "RSS", "Customization"]
min_version = "0.111.0" min_version = "0.124.0"
[author] [author]
name = "Xin" name = "Xin"