Merge branch 'dev' into feat/image-position

This commit is contained in:
Nuno C.
2025-10-14 10:14:18 +01:00
committed by GitHub
80 changed files with 1363 additions and 1145 deletions
+1
View File
@@ -0,0 +1 @@
* @nunocoracao
+2 -1
View File
@@ -1,5 +1,7 @@
## How to contribute to Blowfish ## How to contribute to Blowfish
All development occurs on the `dev` branch and new PRs should be forked from here.
### Bugs & other issues ### Bugs & other issues
#### Found a bug? 🐛 #### Found a bug? 🐛
@@ -11,7 +13,6 @@
#### Have a patch that fixes an issue? #### Have a patch that fixes an issue?
- Great! Open a new GitHub pull request with the patch. - Great! Open a new GitHub pull request with the patch.
- All development occurs on the `dev` branch and new PRs should be forked from here.
- The commands `npm run example`, `npm run example:core`, and `npm run example:production` can be used to test local changes using the example site. - The commands `npm run example`, `npm run example:core`, and `npm run example:production` can be used to test local changes using the example site.
- Ensure the PR description clearly describes the problem and solution. Include the relevant issue number, if applicable. - Ensure the PR description clearly describes the problem and solution. Include the relevant issue number, if applicable.
- **Before submitting**, check the [coding conventions](#coding-conventions) section below to learn more about coding and commit message expectations. - **Before submitting**, check the [coding conventions](#coding-conventions) section below to learn more about coding and commit message expectations.
+26 -91
View File
@@ -1,4 +1,4 @@
/*! tailwindcss v4.1.13 | MIT License | https://tailwindcss.com */ /*! tailwindcss v4.1.14 | MIT License | https://tailwindcss.com */
/*! Blowfish | MIT License | https://github.com/nunocoracao/blowfish */ /*! Blowfish | MIT License | https://github.com/nunocoracao/blowfish */
@layer properties; @layer properties;
#zen-mode-button { #zen-mode-button {
@@ -245,6 +245,7 @@ body.zen-mode-enable {
--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
"Courier New", monospace; "Courier New", monospace;
--spacing: 0.25rem; --spacing: 0.25rem;
--container-2xs: 18rem;
--container-xs: 20rem; --container-xs: 20rem;
--container-xl: 36rem; --container-xl: 36rem;
--container-3xl: 48rem; --container-3xl: 48rem;
@@ -656,6 +657,9 @@ body.zen-mode-enable {
.me-4 { .me-4 {
margin-inline-end: calc(var(--spacing) * 4); margin-inline-end: calc(var(--spacing) * 4);
} }
.me-6 {
margin-inline-end: calc(var(--spacing) * 6);
}
.prose { .prose {
color: var(--tw-prose-body); color: var(--tw-prose-body);
max-width: 65ch; max-width: 65ch;
@@ -747,7 +751,7 @@ body.zen-mode-enable {
} }
:where(hr):not(:where([class~="not-prose"],[class~="not-prose"] *)) { :where(hr):not(:where([class~="not-prose"],[class~="not-prose"] *)) {
border-color: var(--tw-prose-hr); border-color: var(--tw-prose-hr);
border-top-width: 1; border-top-width: 1px;
margin-top: 3em; margin-top: 3em;
margin-bottom: 3em; margin-bottom: 3em;
} }
@@ -832,7 +836,7 @@ body.zen-mode-enable {
font-weight: 600; font-weight: 600;
font-family: inherit; font-family: inherit;
color: var(--tw-prose-kbd); color: var(--tw-prose-kbd);
box-shadow: 0 0 0 1px rgb(var(--tw-prose-kbd-shadows) / 10%), 0 3px 0 rgb(var(--tw-prose-kbd-shadows) / 10%); box-shadow: 0 0 0 1px var(--tw-prose-kbd-shadows), 0 3px 0 var(--tw-prose-kbd-shadows);
font-size: 0.9rem; font-size: 0.9rem;
border-radius: 0.25rem; border-radius: 0.25rem;
padding-top: 0.1875em; padding-top: 0.1875em;
@@ -978,7 +982,7 @@ body.zen-mode-enable {
--tw-prose-quote-borders: rgba(var(--color-primary-200), 1); --tw-prose-quote-borders: rgba(var(--color-primary-200), 1);
--tw-prose-captions: rgba(var(--color-neutral-500), 1); --tw-prose-captions: rgba(var(--color-neutral-500), 1);
--tw-prose-kbd: oklch(21% 0.034 264.665); --tw-prose-kbd: oklch(21% 0.034 264.665);
--tw-prose-kbd-shadows: NaN NaN NaN; --tw-prose-kbd-shadows: color-mix(in oklab, oklch(21% 0.034 264.665) 10%, transparent);
--tw-prose-code: rgba(var(--color-secondary-700), 1); --tw-prose-code: rgba(var(--color-secondary-700), 1);
--tw-prose-pre-code: rgba(var(--color-neutral-700), 1); --tw-prose-pre-code: rgba(var(--color-neutral-700), 1);
--tw-prose-pre-bg: rgba(var(--color-neutral-50), 1); --tw-prose-pre-bg: rgba(var(--color-neutral-50), 1);
@@ -996,7 +1000,7 @@ body.zen-mode-enable {
--tw-prose-invert-quote-borders: rgba(var(--color-primary-900), 1); --tw-prose-invert-quote-borders: rgba(var(--color-primary-900), 1);
--tw-prose-invert-captions: rgba(var(--color-neutral-400), 1); --tw-prose-invert-captions: rgba(var(--color-neutral-400), 1);
--tw-prose-invert-kbd: #fff; --tw-prose-invert-kbd: #fff;
--tw-prose-invert-kbd-shadows: 255 255 255; --tw-prose-invert-kbd-shadows: rgb(255 255 255 / 10%);
--tw-prose-invert-code: rgba(var(--color-secondary-400), 1); --tw-prose-invert-code: rgba(var(--color-secondary-400), 1);
--tw-prose-invert-pre-code: rgba(var(--color-neutral-200), 1); --tw-prose-invert-pre-code: rgba(var(--color-neutral-200), 1);
--tw-prose-invert-pre-bg: rgba(var(--color-neutral-700), 1); --tw-prose-invert-pre-bg: rgba(var(--color-neutral-700), 1);
@@ -1147,9 +1151,6 @@ body.zen-mode-enable {
.mt-20 { .mt-20 {
margin-top: calc(var(--spacing) * 20); margin-top: calc(var(--spacing) * 20);
} }
.mt-\[0\.1rem\] {
margin-top: 0.1rem;
}
.mt-\[0\.5rem\] { .mt-\[0\.5rem\] {
margin-top: 0.5rem; margin-top: 0.5rem;
} }
@@ -1171,9 +1172,6 @@ body.zen-mode-enable {
.mr-5 { .mr-5 {
margin-right: calc(var(--spacing) * 5); margin-right: calc(var(--spacing) * 5);
} }
.mr-auto {
margin-right: auto;
}
.\!mb-0 { .\!mb-0 {
margin-bottom: calc(var(--spacing) * 0) !important; margin-bottom: calc(var(--spacing) * 0) !important;
} }
@@ -1222,12 +1220,6 @@ body.zen-mode-enable {
.ml-2 { .ml-2 {
margin-left: calc(var(--spacing) * 2); margin-left: calc(var(--spacing) * 2);
} }
.ml-3 {
margin-left: calc(var(--spacing) * 3);
}
.ml-auto {
margin-left: auto;
}
.box-border { .box-border {
box-sizing: border-box; box-sizing: border-box;
} }
@@ -1455,9 +1447,6 @@ body.zen-mode-enable {
.max-w-\[5rem\] { .max-w-\[5rem\] {
max-width: 5rem; max-width: 5rem;
} }
.max-w-\[64rem\] {
max-width: 64rem;
}
.max-w-\[200px\] { .max-w-\[200px\] {
max-width: 200px; max-width: 200px;
} }
@@ -1983,9 +1972,6 @@ body.zen-mode-enable {
.p-1\.5 { .p-1\.5 {
padding: calc(var(--spacing) * 1.5); padding: calc(var(--spacing) * 1.5);
} }
.p-2\.5 {
padding: calc(var(--spacing) * 2.5);
}
.p-4 { .p-4 {
padding: calc(var(--spacing) * 4); padding: calc(var(--spacing) * 4);
} }
@@ -2091,18 +2077,12 @@ body.zen-mode-enable {
.pt-\[5px\] { .pt-\[5px\] {
padding-top: 5px; padding-top: 5px;
} }
.pr-0 { .pr-2 {
padding-right: calc(var(--spacing) * 0); padding-right: calc(var(--spacing) * 2);
} }
.pr-8 { .pr-8 {
padding-right: calc(var(--spacing) * 8); padding-right: calc(var(--spacing) * 8);
} }
.pr-\[24px\] {
padding-right: 24px;
}
.pb-0 {
padding-bottom: calc(var(--spacing) * 0);
}
.pb-2 { .pb-2 {
padding-bottom: calc(var(--spacing) * 2); padding-bottom: calc(var(--spacing) * 2);
} }
@@ -2124,12 +2104,6 @@ body.zen-mode-enable {
.pl-0 { .pl-0 {
padding-left: calc(var(--spacing) * 0); padding-left: calc(var(--spacing) * 0);
} }
.pl-4 {
padding-left: calc(var(--spacing) * 4);
}
.pl-\[24px\] {
padding-left: 24px;
}
.text-center { .text-center {
text-align: center; text-align: center;
} }
@@ -2533,27 +2507,6 @@ body.zen-mode-enable {
} }
} }
} }
.group-hover\:text-primary-600 {
&:is(:where(.group):hover *) {
@media (hover: hover) {
color: rgba(var(--color-primary-600), 1);
}
}
}
.group-hover\:underline {
&:is(:where(.group):hover *) {
@media (hover: hover) {
text-decoration-line: underline;
}
}
}
.group-hover\:decoration-primary-500 {
&:is(:where(.group):hover *) {
@media (hover: hover) {
text-decoration-color: rgba(var(--color-primary-500), 1);
}
}
}
.group-hover\:opacity-100 { .group-hover\:opacity-100 {
&:is(:where(.group):hover *) { &:is(:where(.group):hover *) {
@media (hover: hover) { @media (hover: hover) {
@@ -3049,6 +3002,11 @@ body.zen-mode-enable {
padding-inline: calc(var(--spacing) * 24); padding-inline: calc(var(--spacing) * 24);
} }
} }
.md\:pr-4 {
@media (width >= 853px) {
padding-right: calc(var(--spacing) * 4);
}
}
.lg\:absolute { .lg\:absolute {
@media (width >= 1024px) { @media (width >= 1024px) {
position: absolute; position: absolute;
@@ -3139,6 +3097,11 @@ body.zen-mode-enable {
width: auto; width: auto;
} }
} }
.lg\:max-w-2xs {
@media (width >= 1024px) {
max-width: var(--container-2xs);
}
}
.lg\:max-w-7xl { .lg\:max-w-7xl {
@media (width >= 1024px) { @media (width >= 1024px) {
max-width: var(--container-7xl); max-width: var(--container-7xl);
@@ -3224,11 +3187,6 @@ body.zen-mode-enable {
grid-template-columns: repeat(5, minmax(0, 1fr)); grid-template-columns: repeat(5, minmax(0, 1fr));
} }
} }
.ltr\:mr-4 {
&:where(:dir(ltr), [dir="ltr"], [dir="ltr"] *) {
margin-right: calc(var(--spacing) * 4);
}
}
.ltr\:-ml-12 { .ltr\:-ml-12 {
&:where(:dir(ltr), [dir="ltr"], [dir="ltr"] *) { &:where(:dir(ltr), [dir="ltr"], [dir="ltr"] *) {
margin-left: calc(var(--spacing) * -12); margin-left: calc(var(--spacing) * -12);
@@ -3244,21 +3202,11 @@ body.zen-mode-enable {
display: none; display: none;
} }
} }
.ltr\:inline {
&:where(:dir(ltr), [dir="ltr"], [dir="ltr"] *) {
display: inline;
}
}
.rtl\:-mr-\[79px\] { .rtl\:-mr-\[79px\] {
&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) { &:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) {
margin-right: calc(79px * -1); margin-right: calc(79px * -1);
} }
} }
.rtl\:ml-4 {
&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) {
margin-left: calc(var(--spacing) * 4);
}
}
.rtl\:block { .rtl\:block {
&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) { &:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) {
display: block; display: block;
@@ -3269,9 +3217,9 @@ body.zen-mode-enable {
display: none; display: none;
} }
} }
.rtl\:inline { .rtl\:rotate-180 {
&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) { &:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) {
display: inline; rotate: 180deg;
} }
} }
.dark\:flex { .dark\:flex {
@@ -3517,15 +3465,6 @@ body.zen-mode-enable {
} }
} }
} }
.dark\:group-hover\:text-primary-400 {
&:is(.dark *) {
&:is(:where(.group):hover *) {
@media (hover: hover) {
color: rgba(var(--color-primary-400), 1);
}
}
}
}
.dark\:hover\:\!bg-primary-700 { .dark\:hover\:\!bg-primary-700 {
&:is(.dark *) { &:is(.dark *) {
&:hover { &:hover {
@@ -3657,11 +3596,6 @@ button, [role="button"] {
.prose div.min-w-0.max-w-prose > *:first-child { .prose div.min-w-0.max-w-prose > *:first-child {
margin-top: calc(var(--spacing) * 3); margin-top: calc(var(--spacing) * 3);
} }
#TableOfContents {
@media (width >= 1024px) {
max-width: 25vw;
}
}
#TOCView { #TOCView {
max-height: calc(100vh - 150px); max-height: calc(100vh - 150px);
min-height: 0; min-height: 0;
@@ -3746,8 +3680,8 @@ button, [role="button"] {
overflow: auto hidden; overflow: auto hidden;
} }
.katex-display { .katex-display {
padding-right: 2px; padding: 1em;
width: calc(100% - 2px); width: calc(100% - 1em);
} }
table { table {
display: block; display: block;
@@ -3773,6 +3707,7 @@ pre {
object-fit: cover; object-fit: cover;
} }
.single_hero_background { .single_hero_background {
width: calc(100% + 1px);
z-index: -10; z-index: -10;
} }
.hero_gradient { .hero_gradient {
+3 -6
View File
@@ -66,10 +66,6 @@ button,
} }
/* Table of Contents */ /* Table of Contents */
#TableOfContents {
@apply lg:max-w-[25vw];
}
#TOCView { #TOCView {
max-height: calc(100vh - 150px); max-height: calc(100vh - 150px);
min-height: 0; min-height: 0;
@@ -130,8 +126,8 @@ button,
/* Fix katex overflow https://github.com/nunocoracao/blowfish/issues/2138 */ /* Fix katex overflow https://github.com/nunocoracao/blowfish/issues/2138 */
.katex-display { .katex-display {
padding-right: 2px; padding: 1em;
width: calc(100% - 2px); width: calc(100% - 1em);
} }
/* Fix long tables breaking out of article on mobile */ /* Fix long tables breaking out of article on mobile */
@@ -169,6 +165,7 @@ pre {
} }
.single_hero_background { .single_hero_background {
width: calc(100% + 1px); /* patch for very small gap at right edge on mobile devices */
z-index: -10; z-index: -10;
} }
+33
View File
@@ -22,6 +22,34 @@ if (document.documentElement.getAttribute("data-auto-appearance") === "true") {
}); });
} }
// Mermaid dark mode support
var updateMermaidTheme = () => {
if (typeof mermaid !== 'undefined') {
const isDark = document.documentElement.classList.contains("dark");
const mermaids = document.querySelectorAll('pre.mermaid');
mermaids.forEach(e => {
if (e.getAttribute('data-processed')) {
// Already rendered, clean the processed attributes
e.removeAttribute('data-processed');
// Replace the rendered HTML with the stored text
e.innerHTML = e.getAttribute('data-graph');
} else {
// First time, store the text
e.setAttribute('data-graph', e.textContent);
}
});
if (isDark) {
initMermaidDark();
mermaid.run();
} else {
initMermaidLight();
mermaid.run();
}
}
}
window.addEventListener("DOMContentLoaded", (event) => { window.addEventListener("DOMContentLoaded", (event) => {
const switcher = document.getElementById("appearance-switcher"); const switcher = document.getElementById("appearance-switcher");
const switcherMobile = document.getElementById("appearance-switcher-mobile"); const switcherMobile = document.getElementById("appearance-switcher-mobile");
@@ -29,6 +57,9 @@ window.addEventListener("DOMContentLoaded", (event) => {
updateMeta(); updateMeta();
this.updateLogo?.(getTargetAppearance()); this.updateLogo?.(getTargetAppearance());
// Initialize mermaid theme on page load
updateMermaidTheme();
if (switcher) { if (switcher) {
switcher.addEventListener("click", () => { switcher.addEventListener("click", () => {
document.documentElement.classList.toggle("dark"); document.documentElement.classList.toggle("dark");
@@ -38,6 +69,7 @@ window.addEventListener("DOMContentLoaded", (event) => {
targetAppearance targetAppearance
); );
updateMeta(); updateMeta();
updateMermaidTheme();
this.updateLogo?.(targetAppearance); this.updateLogo?.(targetAppearance);
}); });
switcher.addEventListener("contextmenu", (event) => { switcher.addEventListener("contextmenu", (event) => {
@@ -54,6 +86,7 @@ window.addEventListener("DOMContentLoaded", (event) => {
targetAppearance targetAppearance
); );
updateMeta(); updateMeta();
updateMermaidTheme();
this.updateLogo?.(targetAppearance); this.updateLogo?.(targetAppearance);
}); });
switcherMobile.addEventListener("contextmenu", (event) => { switcherMobile.addEventListener("contextmenu", (event) => {
+28 -26
View File
@@ -2,30 +2,32 @@ function css(name) {
return "rgb(" + getComputedStyle(document.documentElement).getPropertyValue(name) + ")"; return "rgb(" + getComputedStyle(document.documentElement).getPropertyValue(name) + ")";
} }
document.addEventListener("DOMContentLoaded", () => { function initMermaidLight() {
const mermaidDivs = document.querySelectorAll("div.mermaid"); mermaid.initialize({
theme: "base",
themeVariables: {
background: css("--color-neutral"),
primaryColor: css("--color-primary-200"),
secondaryColor: css("--color-secondary-200"),
tertiaryColor: css("--color-neutral-100"),
primaryBorderColor: css("--color-primary-400"),
secondaryBorderColor: css("--color-secondary-400"),
tertiaryBorderColor: css("--color-neutral-400"),
lineColor: css("--color-neutral-600"),
fontFamily:
"ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,noto sans,sans-serif",
fontSize: "16px",
},
});
}
for (const div of mermaidDivs) { function initMermaidDark() {
const preElement = div.querySelector("pre"); mermaid.initialize({
if (preElement) { theme: "dark",
div.textContent = preElement.textContent; themeVariables: {
} fontFamily:
} "ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,noto sans,sans-serif",
}); fontSize: "16px",
},
mermaid.initialize({ });
theme: "base", }
themeVariables: {
background: css("--color-neutral"),
primaryColor: css("--color-primary-200"),
secondaryColor: css("--color-secondary-200"),
tertiaryColor: css("--color-neutral-100"),
primaryBorderColor: css("--color-primary-400"),
secondaryBorderColor: css("--color-secondary-400"),
tertiaryBorderColor: css("--color-neutral-400"),
lineColor: css("--color-neutral-600"),
fontFamily:
"ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,noto sans,sans-serif",
fontSize: "16px",
},
});
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+506 -389
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -2,4 +2,4 @@
[module.hugoVersion] [module.hugoVersion]
extended = true extended = true
min = "0.141.0" min = "0.141.0"
max = "0.150.0" max = "0.151.0"
+3
View File
@@ -2,6 +2,9 @@
# These settings are required for the theme to function. # These settings are required for the theme to function.
[goldmark] [goldmark]
[goldmark.parser]
wrapStandAloneImageWithinParagraph = false
[goldmark.renderer] [goldmark.renderer]
unsafe = true unsafe = true
+3
View File
@@ -2,6 +2,9 @@
# These settings are required for the theme to function. # These settings are required for the theme to function.
[goldmark] [goldmark]
[goldmark.parser]
wrapStandAloneImageWithinParagraph = false
[goldmark.renderer] [goldmark.renderer]
unsafe = true unsafe = true
+1 -1
View File
@@ -10,7 +10,7 @@ description: "Questa pagina è stata creata utilizzando il tema Blowfish per Hug
<span class="prose dark:prose-invert">Questa è una demo del layout <code id="layout">background</code>.</span> <span class="prose dark:prose-invert">Questa è una demo del layout <code id="layout">background</code>.</span>
<button <button
id="switch-layout-button" id="switch-layout-button"
class="px-4 !text-neutral !no-underline rounded-md bg-primary-600 hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700" class="px-4 mx-[3px] !text-neutral !no-underline rounded-md bg-primary-600 hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700"
> >
Cambia layout &orarr; Cambia layout &orarr;
</button> </button>
+1 -1
View File
@@ -12,7 +12,7 @@ description: "このページは Hugo の Blowfish テーマを利用して構
<span class="prose dark:prose-invert">こちらは <code id="layout">background</code> レイアウトのデモです。</span> <span class="prose dark:prose-invert">こちらは <code id="layout">background</code> レイアウトのデモです。</span>
<button <button
id="switch-layout-button" id="switch-layout-button"
class="px-4 !text-neutral !no-underline rounded-md bg-primary-600 hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700" class="px-4 mx-[3px] !text-neutral !no-underline rounded-md bg-primary-600 hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700"
> >
レイアウトを変更する&orarr; レイアウトを変更する&orarr;
</button> </button>
+1 -1
View File
@@ -12,7 +12,7 @@ description: "This page was built using the Blowfish theme for Hugo."
<span class="prose dark:prose-invert">This is a demo of the <code id="layout">background</code> layout.</span> <span class="prose dark:prose-invert">This is a demo of the <code id="layout">background</code> layout.</span>
<button <button
id="switch-layout-button" id="switch-layout-button"
class="px-4 !text-neutral !no-underline rounded-md bg-primary-600 hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700" class="px-4 mx-[3px] !text-neutral !no-underline rounded-md bg-primary-600 hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700"
> >
Switch layout &orarr; Switch layout &orarr;
</button> </button>
+1 -1
View File
@@ -12,7 +12,7 @@ description: "此页面是使用 Hugo 的 Blowfish 主题搭建的"
<span class="prose dark:prose-invert"> 这是 <code id="layout">background</code> 的样式示例。</span> <span class="prose dark:prose-invert"> 这是 <code id="layout">background</code> 的样式示例。</span>
<button <button
id="switch-layout-button" id="switch-layout-button"
class="px-4 !text-neutral !no-underline rounded-md bg-primary-600 hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700" class="px-4 mx-[3px] !text-neutral !no-underline rounded-md bg-primary-600 hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700"
> >
切换 layout &orarr; 切换 layout &orarr;
</button> </button>
@@ -55,7 +55,6 @@ _这个例子设置了一个自定义标题,并在页面正文中添加了一
列表页将所有页面聚合到一个目录下,并为访问者提供了一种浏览页面的方式。博客或者作品集是一个典型案例,因为这两种类型的网站会将帖子或项目整合到一个列表页中。 列表页将所有页面聚合到一个目录下,并为访问者提供了一种浏览页面的方式。博客或者作品集是一个典型案例,因为这两种类型的网站会将帖子或项目整合到一个列表页中。
创建一个列表页就如同创建子目录一样简单。例如,要创建一个 "Projects" 列表页,你可以创建`content/projects/`。然后为你的项目创建一个 Markdown 文件。 创建一个列表页就如同创建子目录一样简单。例如,要创建一个 "Projects" 列表页,你可以创建`content/projects/`。然后为你的项目创建一个 Markdown 文件。
Creating a list page is as simple as making a sub-directory in the content folder. For example, to create a "Projects" section, you would create `content/projects/`. Then create a Markdown file for each of your projects.
列表页面默认会自动生成,如果你想在列表添加一些页自定义内容,还需要在此目录创建一个 `_index.md` 文件。 列表页面默认会自动生成,如果你想在列表添加一些页自定义内容,还需要在此目录创建一个 `_index.md` 文件。
@@ -21,7 +21,6 @@ npx blowfish-tools
``` ```
{{< /alert >}} {{< /alert >}}
The config files that ship with Blowfish contain all of the possible settings that the theme recognises. By default, many of these are commented out but you can simply uncomment them to activate or change a specific feature. The config files that ship with Blowfish contain all of the possible settings that the theme recognises. By default, many of these are commented out but you can simply uncomment them to activate or change a specific feature.
## Basic configuration ## Basic configuration
@@ -74,48 +73,61 @@ colorScheme = "blowfish"
Blowfish defines a three-colour palette that is used throughout the theme. Each main colour contains ten shades which are based upon the colours that are included in [Tailwind](https://tailwindcss.com/docs/customizing-colors#color-palette-reference). The three main colours are used for the header, footer, and accent colours. Here are the colors for each scheme: Blowfish defines a three-colour palette that is used throughout the theme. Each main colour contains ten shades which are based upon the colours that are included in [Tailwind](https://tailwindcss.com/docs/customizing-colors#color-palette-reference). The three main colours are used for the header, footer, and accent colours. Here are the colors for each scheme:
#### Blowfish (default) ### Blowfish (default)
{{< swatches "#64748b" "#3b82f6" "#06b6d4" >}} {{< swatches "#64748b" "#3b82f6" "#06b6d4" >}}
#### Avocado ### Avocado
{{< swatches "#78716c" "#84cc16" "#10b981" >}} {{< swatches "#78716c" "#84cc16" "#10b981" >}}
#### Fire ### Fire
{{< swatches "#78716c" "#f97316" "#f43f5e" >}} {{< swatches "#78716c" "#f97316" "#f43f5e" >}}
#### Ocean ### Ocean
{{< swatches "#64748b" "#3b82f6" "#06b6d4" >}} {{< swatches "#64748b" "#3b82f6" "#06b6d4" >}}
#### Forest ### Forest
{{< swatches "#658c86" "#3bf5df" "#06d45c" >}} {{< swatches "#658c86" "#3bf5df" "#06d45c" >}}
#### Princess ### Princess
{{< swatches "#8c658c" "#f53bf2" "#7706d4" >}} {{< swatches "#8c658c" "#f53bf2" "#7706d4" >}}
#### Neon ### Neon
{{< swatches "#8338ec" "#ff006e" "#3a86ff" >}} {{< swatches "#8338ec" "#ff006e" "#3a86ff" >}}
#### Bloody ### Bloody
{{< swatches "#d90429" "#8d99ae" "#457b9d" >}} {{< swatches "#d90429" "#8d99ae" "#457b9d" >}}
#### Terminal ### Terminal
{{< swatches "#004b23" "#38b000" "#1a759f" >}} {{< swatches "#004b23" "#38b000" "#1a759f" >}}
#### Marvel ### Marvel
{{< swatches "#2541b2" "#d81159" "#ffbc42" >}} {{< swatches "#2541b2" "#d81159" "#ffbc42" >}}
#### Noir ### Noir
{{< swatches "#5c6b73" "#9db4c0" "#00a5cf" >}} {{< swatches "#5c6b73" "#9db4c0" "#00a5cf" >}}
#### Autumn ### Autumn
{{< swatches "#0a9396" "#ee9b00" "#bb3e03" >}} {{< swatches "#0a9396" "#ee9b00" "#bb3e03" >}}
#### Congo ### Congo
{{< swatches "#71717a" "#8b5cf6" "#d946ef" >}} {{< swatches "#71717a" "#8b5cf6" "#d946ef" >}}
#### Slate ### Slate
{{< swatches "#6B7280" "#64748b" "#6B7280" >}}
{{< swatches "#6B7280" "#64748b" "#6B7280" >}}
Although these are the default schemes, you can also create your own. Refer to the [Advanced Customisation]({{< ref "advanced-customisation#colour-schemes" >}}) section for details. Although these are the default schemes, you can also create your own. Refer to the [Advanced Customisation]({{< ref "advanced-customisation#colour-schemes" >}}) section for details.
@@ -261,7 +273,7 @@ The default `name` is the `pageRef` title cased.
## Thumbnails & Backgrounds ## Thumbnails & Backgrounds
Blowfish was built so it would be easy to add visual support to your articles. If your familiar with Hugo article structure, you just need to place an image file (almost all formats are supported but we recommend `.png` or `.jpg`) that starts with `feature*` inside your article folder. And that's it, Blowfish will then be able to both use the image as a thumbnail within your website as well as for <a target="_blank" href="https://oembed.com/">oEmbed</a> cards across social platforms. Blowfish was built so it would be easy to add visual support to your articles. If your familiar with Hugo article structure, you just need to place an image file (almost all formats are supported but we recommend `.png` or `.jpg`) that starts with `feature*` inside your article folder. And that's it, Blowfish will then be able to both use the image as a thumbnail within your website as well as for <a target="_blank" href="https://oembed.com/">oEmbed</a> cards across social platforms.
[Here]({{< ref "thumbnails" >}}) is also a guide with more info and a [sample]({{< ref "thumbnail_sample" >}}) if you want to see how you can do it. [Here]({{< ref "thumbnails" >}}) is also a guide with more info and a [sample]({{< ref "thumbnail_sample" >}}) if you want to see how you can do it.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 737 KiB

After

Width:  |  Height:  |  Size: 3.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 811 KiB

After

Width:  |  Height:  |  Size: 3.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 892 KiB

After

Width:  |  Height:  |  Size: 4.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 499 KiB

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 509 KiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 504 KiB

After

Width:  |  Height:  |  Size: 1.6 MiB

@@ -79,7 +79,7 @@ Blowfish 提供了一个完全灵活的主页布局。你可以选择两种主
## 缩略图 ## 缩略图
Blowfish 为你的文章提供了视觉支持。如果你熟悉 Hugo 的文章结构,只需要在你的文章对应的文件夹中防止一个以`feature*`开头的图像文件即可,图像类型几乎支持所有格式,更推荐使用`.png` 或者 `.jpg`。这样一来,Blowfish 将会在你的网站内使用该图片作为缩略图,并用在社交媒体平台上的 <a target="_blank" href="https://oembed.com/">oEmbed</a> 卡片中。 Blowfish 为你的文章提供了视觉支持。如果你熟悉 Hugo 的文章结构,只需要在你的文章对应的文件夹中放置一个以`feature*`开头的图像文件即可,图像类型几乎支持所有格式,更推荐使用`.png` 或者 `.jpg`。这样一来,Blowfish 将会在你的网站内使用该图片作为缩略图,并用在社交媒体平台上的 <a target="_blank" href="https://oembed.com/">oEmbed</a> 卡片中。
[这是]({{< ref "thumbnails" >}})有更多详细内容,并且有一个便于理解的[示例]({{< ref "thumbnail_sample" >}})。 [这是]({{< ref "thumbnails" >}})有更多详细内容,并且有一个便于理解的[示例]({{< ref "thumbnail_sample" >}})。
+2 -2
View File
@@ -124,13 +124,13 @@ Call to action
## Carousel ## Carousel
`carousel` is used to showcase multiple images in an interactive and visually appealing way. This allows a user to slide through multiple images while only taking up the vertical space of a single one. All images are displayed using the full width of the parent component and using one of the predefined aspect ratios of `16:9`, `21:9` or `32:9`. `carousel` is used to showcase multiple images in an interactive and visually appealing way. This allows a user to slide through multiple images while only taking up the vertical space of a single one. All images are displayed using the full width of the parent component and the aspect ratio you set with a default of `16:9`.
<!-- prettier-ignore-start --> <!-- prettier-ignore-start -->
| Parameter | Description | | Parameter | Description |
| --- | --- | | --- | --- |
| `images` | **Required.** A regex string to match image names or URLs. | | `images` | **Required.** A regex string to match image names or URLs. |
| `aspectRatio` | **Optional.** The aspect ratio for the carousel. Either `16-9`, `21-9` or `32-9`. It is set to `16-9` by default. | | `aspectRatio` | **Optional.** The aspect ratio for the carousel. It is set to `16-9` by default. |
| `interval` | **Optional.** The interval for the auto-scrooling, specified in milliseconds. Defaults to `2000` (2s) | | `interval` | **Optional.** The interval for the auto-scrooling, specified in milliseconds. Defaults to `2000` (2s) |
<!-- prettier-ignore-end --> <!-- prettier-ignore-end -->
@@ -275,7 +275,7 @@ The only thing missing is to ship your site. I will be using [Firebase](https://
Lets install firebases CLI - if not on Mac check [install instructions on Firebase](https://firebase.google.com/docs/cli). Lets install firebases CLI - if not on Mac check [install instructions on Firebase](https://firebase.google.com/docs/cli).
```bash ```bash
brew install firebase brew install firebase-cli
``` ```
Now log in and init firebase hosting for the project. Now log in and init firebase hosting for the project.
+1 -1
View File
@@ -6,7 +6,7 @@ cascade:
showEdit: false showEdit: false
showSummary: false showSummary: false
hideFeatureImage: true hideFeatureImage: true
invertPagination: true
--- ---
{{< lead >}} {{< lead >}}
Blowfish dà vita ai tuoi contenuti. :heart_eyes: Blowfish dà vita ai tuoi contenuti. :heart_eyes:
+1
View File
@@ -6,6 +6,7 @@ cascade:
showEdit: false showEdit: false
showSummary: false showSummary: false
hideFeatureImage: true hideFeatureImage: true
invertPagination: true
--- ---
{{< lead >}} {{< lead >}}
+1
View File
@@ -6,6 +6,7 @@ cascade:
showEdit: false showEdit: false
showSummary: false showSummary: false
hideFeatureImage: true hideFeatureImage: true
invertPagination: true
--- ---
{{< lead >}} {{< lead >}}
@@ -6,6 +6,7 @@ cascade:
showEdit: false showEdit: false
showSummary: false showSummary: false
hideFeatureImage: true hideFeatureImage: true
invertPagination: true
--- ---
{{< lead >}} {{< lead >}}
@@ -15,7 +15,6 @@ The examples below are a small selection taken from the [official Mermaid docs](
## Flowchart ## Flowchart
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
graph TD graph TD
A[Christmas] -->|Get money| B(Go shopping) A[Christmas] -->|Get money| B(Go shopping)
@@ -32,11 +31,9 @@ F
G G
end end
{{< /mermaid >}} {{< /mermaid >}}
</div>
## Sequence diagram ## Sequence diagram
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
sequenceDiagram sequenceDiagram
autonumber autonumber
@@ -54,11 +51,9 @@ loop Every minute
John-->Alice: Great! John-->Alice: Great!
end end
{{< /mermaid >}} {{< /mermaid >}}
</div>
## Class diagram ## Class diagram
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
classDiagram classDiagram
Animal "1" <|-- Duck Animal "1" <|-- Duck
@@ -82,11 +77,9 @@ class Zebra{
+run() +run()
} }
{{< /mermaid >}} {{< /mermaid >}}
</div>
## Entity relationship diagram ## Entity relationship diagram
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
erDiagram erDiagram
CUSTOMER }|..|{ DELIVERY-ADDRESS : has CUSTOMER }|..|{ DELIVERY-ADDRESS : has
@@ -98,5 +91,3 @@ ORDER ||--|{ ORDER-ITEM : includes
PRODUCT-CATEGORY ||--|{ PRODUCT : contains PRODUCT-CATEGORY ||--|{ PRODUCT : contains
PRODUCT ||--o{ ORDER-ITEM : "ordered in" PRODUCT ||--o{ ORDER-ITEM : "ordered in"
{{< /mermaid >}} {{< /mermaid >}}
</div>
@@ -15,7 +15,6 @@ Mermaid 図は `mermaid` ショートコードを使うことで Blowfish でサ
## フローチャート ## フローチャート
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
graph TD graph TD
A[クリスマス] -->|収入| B(買い物にいく) A[クリスマス] -->|収入| B(買い物にいく)
@@ -32,11 +31,9 @@ F
G G
end end
{{< /mermaid >}} {{< /mermaid >}}
</div>
## 順序図 ## 順序図
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
sequenceDiagram sequenceDiagram
autonumber autonumber
@@ -54,11 +51,9 @@ loop 毎分
ジョン-->アリス: すばらしい! ジョン-->アリス: すばらしい!
end end
{{< /mermaid >}} {{< /mermaid >}}
</div>
## クラス図 ## クラス図
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
classDiagram classDiagram
Animal "1" <|-- Duck Animal "1" <|-- Duck
@@ -82,11 +77,9 @@ class Zebra{
+run() +run()
} }
{{< /mermaid >}} {{< /mermaid >}}
</div>
## 主従関係図 ## 主従関係図
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
erDiagram erDiagram
CUSTOMER }|..|{ DELIVERY-ADDRESS : has CUSTOMER }|..|{ DELIVERY-ADDRESS : has
@@ -98,5 +91,3 @@ ORDER ||--|{ ORDER-ITEM : includes
PRODUCT-CATEGORY ||--|{ PRODUCT : contains PRODUCT-CATEGORY ||--|{ PRODUCT : contains
PRODUCT ||--o{ ORDER-ITEM : "ordered in" PRODUCT ||--o{ ORDER-ITEM : "ordered in"
{{< /mermaid >}} {{< /mermaid >}}
</div>
@@ -15,7 +15,6 @@ The examples below are a small selection taken from the [official Mermaid docs](
## Flowchart ## Flowchart
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
graph TD graph TD
A[Christmas] -->|Get money| B(Go shopping) A[Christmas] -->|Get money| B(Go shopping)
@@ -32,11 +31,9 @@ F
G G
end end
{{< /mermaid >}} {{< /mermaid >}}
</div>
## Sequence diagram ## Sequence diagram
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
sequenceDiagram sequenceDiagram
autonumber autonumber
@@ -54,11 +51,9 @@ loop Every minute
John-->Alice: Great! John-->Alice: Great!
end end
{{< /mermaid >}} {{< /mermaid >}}
</div>
## Class diagram ## Class diagram
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
classDiagram classDiagram
Animal "1" <|-- Duck Animal "1" <|-- Duck
@@ -82,11 +77,9 @@ class Zebra{
+run() +run()
} }
{{< /mermaid >}} {{< /mermaid >}}
</div>
## Entity relationship diagram ## Entity relationship diagram
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
erDiagram erDiagram
CUSTOMER }|..|{ DELIVERY-ADDRESS : has CUSTOMER }|..|{ DELIVERY-ADDRESS : has
@@ -98,5 +91,3 @@ ORDER ||--|{ ORDER-ITEM : includes
PRODUCT-CATEGORY ||--|{ PRODUCT : contains PRODUCT-CATEGORY ||--|{ PRODUCT : contains
PRODUCT ||--o{ ORDER-ITEM : "ordered in" PRODUCT ||--o{ ORDER-ITEM : "ordered in"
{{< /mermaid >}} {{< /mermaid >}}
</div>
@@ -15,7 +15,6 @@ Blowfish 使用 `mermaid` 简码可以调用。Blowfish 会根据配置的 `colo
## 流程图 ## 流程图
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
graph TD graph TD
A[Christmas] -->|Get money| B(Go shopping) A[Christmas] -->|Get money| B(Go shopping)
@@ -32,11 +31,9 @@ F
G G
end end
{{< /mermaid >}} {{< /mermaid >}}
</div>
## 时序图 ## 时序图
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
sequenceDiagram sequenceDiagram
autonumber autonumber
@@ -54,11 +51,9 @@ loop Every minute
John-->Alice: Great! John-->Alice: Great!
end end
{{< /mermaid >}} {{< /mermaid >}}
</div>
## 类图 ## 类图
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
classDiagram classDiagram
Animal "1" <|-- Duck Animal "1" <|-- Duck
@@ -82,11 +77,9 @@ class Zebra{
+run() +run()
} }
{{< /mermaid >}} {{< /mermaid >}}
</div>
## 实体关系图 ## 实体关系图
<div style="background-color:white; padding: 20px">
{{< mermaid >}} {{< mermaid >}}
erDiagram erDiagram
CUSTOMER }|..|{ DELIVERY-ADDRESS : has CUSTOMER }|..|{ DELIVERY-ADDRESS : has
@@ -98,5 +91,3 @@ ORDER ||--|{ ORDER-ITEM : includes
PRODUCT-CATEGORY ||--|{ PRODUCT : contains PRODUCT-CATEGORY ||--|{ PRODUCT : contains
PRODUCT ||--o{ ORDER-ITEM : "ordered in" PRODUCT ||--o{ ORDER-ITEM : "ordered in"
{{< /mermaid >}} {{< /mermaid >}}
</div>
@@ -12,7 +12,6 @@ type: 'sample'
这是一个在你的文章使用缩略图的快速示例。 这是一个在你的文章使用缩略图的快速示例。
如果你的文章目录看起来像这样: 如果你的文章目录看起来像这样:
If your average directory for an article looks like this:
```shell ```shell
content content
+26 -1
View File
@@ -890,4 +890,29 @@
"Personal site" "Personal site"
] ]
}, },
] {
"title": "metalhearf.fr",
"url": "https://metalhearf.fr",
"source": "n/a",
"tags": [
"Blog",
"Personal site"
]
},
{
"title": "encelo.github.io",
"url": "https://encelo.github.io/",
"source": "https://github.com/encelo/encelo.github.io",
"tags": [
"Personal site",
"Blog"
]
},
{
"title": "ncine.github.io",
"url": "https://ncine.github.io/",
"source": "https://github.com/nCine/nCine-site",
"tags": [
"Project site"
]
}
@@ -1 +1,8 @@
<a rel="me" href="https://masto.ai/@blowfish"></a> {{/* example of extend-footer */}}
{{/*
<p class="text-sm text-neutral-500 dark:text-neutral-400">
<a class="hover:underline hover:decoration-primary-400 hover:text-primary-500" rel="me" href="https://masto.ai/@blowfish">
Follow me on Mastodon
</a>
</p>
*/}}
+86
View File
@@ -0,0 +1,86 @@
global:
language: "DA"
article:
anchor_label: "Anker"
date: "{{ .Date }}"
date_updated: "Opdateret: {{ .Date }}"
draft: "Kladde"
edit_title: "Redigér indhold"
reading_time:
one: "{{ .Count }} minut"
other: "{{ .Count }} minutter"
reading_time_title: "Læsetid"
table_of_contents: "Indholdsfortegnelse"
word_count:
one: "{{ .Count }} ord"
other: "{{ .Count }} ord"
views:
one: "{{ .Count }} visning"
other: "{{ .Count }} visninger"
likes:
one: "{{ .Count }} like"
other: "{{ .Count }} likes"
part_of_series: "Denne artikel er en del af en serie."
part: "Del"
this_article: "Denne artikel"
related_articles: "Relateret"
zen_mode_title:
enable: "Aktiver zen mode"
disable: "Deaktiver zen mode"
a11y:
title: "Tilgængelighedsindstillinger"
disable_blur: "Deaktiver uskarphed"
disable_images: "Deaktiver billeder"
show_link_underline: "Vis link-understregning"
font_size: "Skrift størrelse"
author:
byline_title: "Forfatter"
code:
copy: "Kopi"
copied: "Kopieret"
error:
404_title: "Siden kunne ikke findes :confused:"
404_error: "Fejl 404"
404_description: "Det ser ud til at den side du søger ikke eksisterer."
footer:
dark_appearance: "Skift til mørk udseende"
light_appearance: "Skift til lys udseende"
powered_by: "Genereret af {{ .Hugo }} &amp; {{ .Theme }}"
list:
externalurl_title: "Link til ekstern hjemmeside"
no_articles: "Der er ikke nogle artikler her, endnu."
nav:
scroll_to_top_title: "scrol til top"
skip_to_main: "Gå til hovedindhold"
search:
open_button_title: "Søg (/)"
close_button_title: "Luk (Esc)"
input_placeholder: "Søg"
sharing:
email: "Send via email"
facebook: "Del via Facebook"
line: "Del via LINE"
linkedin: "Del via LinkedIn"
pinterest: "Pin på Pinterest"
reddit: "Send til Reddit"
twitter: "Tweet via Twitter"
bluesky: "Post via Bluesky"
whatsapp: "Del via WhatsApp"
telegram: "Del via Telegram"
mastodon: "Del via Mastodon"
shortcode:
recent_articles: "Seneste"
recent:
show_more: "Vis mere"
+3 -3
View File
@@ -1,10 +1,10 @@
{{ $anchor := anchorize .Anchor }} {{ $anchor := anchorize .Anchor }}
<h{{ .Level }} class="relative group">{{ .Text | safeHTML }} <h{{ .Level }} class="relative group">{{ .Text | safeHTML }}
<div id="{{ $anchor }}" class="anchor"></div> <div id="{{ $anchor }}" class="anchor"></div>
{{ if .Page.Params.showHeadingAnchors | default (.Page.Site.Params.article.showHeadingAnchors | default true) }} {{ if .Page.Params.showHeadingAnchors | default (.Page.Site.Params.article.showHeadingAnchors | default true) }}
<span <span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#{{ $anchor }}" aria-label="{{ i18n "article.anchor_label" }}">#</a> <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#{{ $anchor }}" aria-label="{{ i18n "article.anchor_label" }}">#</a>
</span> </span>
{{ end }} {{ end }}
</h{{ .Level }}> </h{{ .Level }}>
+93 -40
View File
@@ -1,56 +1,109 @@
{{ define "RenderImageSimple" -}} {{- define "RenderImageSimple" -}}
<img class="my-0 rounded-md" loading="lazy" alt="{{ .alt }}" src="{{ .src }}"> {{- $imgObj := .imgObj -}}
{{- end }} {{- $src := .src -}}
{{- $alt := .alt -}}
{{ define "RenderImageResponsive" -}}
<img <img
class="my-0 rounded-md" class="my-0 rounded-md"
loading="lazy" loading="lazy"
decoding="async" decoding="async"
fetchpriority="low" fetchpriority="low"
alt="{{ .alt }}" alt="{{ $alt }}"
srcset=" src="{{ $src }}"
{{ (.resource.Resize "330x").RelPermalink }} 330w, {{ with $imgObj -}}
{{ (.resource.Resize "660x").RelPermalink }} 660w, {{ with $imgObj.Width }}width="{{ . }}"{{ end }}
{{ (.resource.Resize "1280x").RelPermalink }} 1280w {{ with $imgObj.Height }}height="{{ . }}"{{ end }}
" {{- end }}>
data-zoom-src="{{ .resource.RelPermalink }}" {{- end -}}
src="{{ .resource.RelPermalink }}">
{{- end }}
{{ define "RenderImageCaption" -}} {{- define "RenderImageResponsive" -}}
{{- with .caption }} {{/* Responsive Image
The current setting sizes="(min-width: 768px) 50vw, 65vw" makes the iPhone 16 and 16 Pro
select a smaller image, while the iPhone 16 Pro Max selects a larger image.
Steps:
1. Check the media queries in the `sizes` property.
2. Find the first matching value. For example, on a mobile device with a CSS pixel width
of 390px and DPR = 3 (iPhone 13), given setting sizes="(min-width: 768px) 50vw, 100vw",
it matches the `100vw` option.
3. Calculate the optimal image size: 390 × 3 × 100% (100vw) = 1170.
4. Find the corresponding match in the `srcset`.
To make the browser select a smaller image on mobile devices
override the template and change the `sizes` property to "(min-width: 768px) 50vw, 30vw"
The sizes="auto" is valid only when loading="lazy".
*/}}
{{- $imgObj := .imgObj -}}
{{- $alt := .alt -}}
{{- $originalWidth := $imgObj.Width -}}
{{- $img800 := $imgObj -}}
{{- $img1280 := $imgObj -}}
{{- if gt $originalWidth 800 -}}
{{- $img800 = $imgObj.Resize "800x" -}}
{{- end -}}
{{- if gt $originalWidth 1280 -}}
{{- $img1280 = $imgObj.Resize "1280x" -}}
{{- end -}}
{{- $srcset := printf "%s 800w, %s 1280w" $img800.RelPermalink $img1280.RelPermalink -}}
<img
class="my-0 rounded-md"
loading="lazy"
decoding="async"
fetchpriority="auto"
alt="{{ $alt }}"
{{ with $imgObj.Width }}width="{{ . }}"{{ end }}
{{ with $imgObj.Height }}height="{{ . }}"{{ end }}
src="{{ $img800.RelPermalink }}"
srcset="{{ $srcset }}"
sizes="(min-width: 768px) 50vw, 65vw"
data-zoom-src="{{ $imgObj.RelPermalink }}">
{{- end -}}
{{- define "RenderImageCaption" -}}
{{- with .caption -}}
<figcaption>{{ . | markdownify }}</figcaption> <figcaption>{{ . | markdownify }}</figcaption>
{{- end }} {{- end -}}
{{- end }} {{- end -}}
{{- $disableImageOptimizationMD := .Page.Site.Params.disableImageOptimizationMD | default false }} {{- $disableImageOptimizationMD := .Page.Site.Params.disableImageOptimizationMD | default false -}}
{{- $urlStr := .Destination | safeURL -}} {{- $urlStr := .Destination | safeURL -}}
{{- $url := urls.Parse $urlStr -}} {{- $url := urls.Parse $urlStr -}}
{{- $altText := .Text }} {{- $altText := .Text -}}
{{- $caption := .Title }} {{- $caption := .Title -}}
{{- $isRemote := findRE "^(https?|data)" $url.Scheme }} {{- $isRemote := findRE "^(https?|data)" $url.Scheme -}}
{{- $resource := "" }} {{- $resource := "" -}}
{{- if not $isRemote }} {{- if not $isRemote -}}
{{- $resource = or ($.Page.Resources.GetMatch $urlStr) (resources.Get $urlStr) }} {{- $resource = or ($.Page.Resources.GetMatch $urlStr) (resources.Get $urlStr) -}}
{{- end }} {{- end -}}
<figure> <figure>
{{- if $isRemote }} {{- if $isRemote -}}
{{ template "RenderImageSimple" (dict "src" $urlStr "alt" $altText) }} {{- template "RenderImageSimple" (dict "imgObj" "" "src" $urlStr "alt" $altText) -}}
{{- else if $resource }} {{- else if $resource -}}
{{- $isSVG := eq $resource.MediaType.SubType "svg" }} {{- $isSVG := eq $resource.MediaType.SubType "svg" -}}
{{- $shouldOptimize := and (not $disableImageOptimizationMD) (not $isSVG) }} {{- $shouldOptimize := and (not $disableImageOptimizationMD) (not $isSVG) -}}
{{- if $shouldOptimize }} {{- if $shouldOptimize -}}
{{ template "RenderImageResponsive" (dict "resource" $resource "alt" $altText) }} {{- template "RenderImageResponsive" (dict "imgObj" $resource "alt" $altText) -}}
{{- else }} {{- else -}}
{{ template "RenderImageSimple" (dict "src" $resource.RelPermalink "alt" $altText) }} {{/* Not optimize image
{{- end }} If it is an SVG file, pass the permalink
{{- else }} Otherwise, pass the resource to allow width and height attributes
{{ template "RenderImageSimple" (dict "src" $urlStr "alt" $altText) }} */}}
{{- end }} {{- if $isSVG -}}
{{- template "RenderImageSimple" (dict "imgObj" "" "src" $resource.RelPermalink "alt" $altText) -}}
{{- else -}}
{{- template "RenderImageSimple" (dict "imgObj" $resource "src" $resource.RelPermalink "alt" $altText) -}}
{{- end -}}
{{- end -}}
{{- else -}}
{{- template "RenderImageSimple" (dict "imgObj" "" "src" $urlStr "alt" $altText) -}}
{{- end -}}
{{ template "RenderImageCaption" (dict "caption" $caption) }} {{- template "RenderImageCaption" (dict "caption" $caption) -}}
</figure> </figure>
+5 -4
View File
@@ -8,9 +8,10 @@
{{- partial "head.html" . -}} {{- partial "head.html" . -}}
{{- partialCached "init.html" . -}} {{- partialCached "init.html" . -}}
{{ $bodyLayout := "flex flex-col h-screen m-auto leading-7 max-w-7xl px-6 sm:px-14 md:px-24 lg:px-32" }}
<body {{ $bodyColor := "text-lg bg-neutral text-neutral-900 dark:bg-neutral-800 dark:text-neutral" }}
class="flex flex-col h-screen px-6 m-auto text-lg leading-7 max-w-7xl bg-neutral text-neutral-900 dark:bg-neutral-800 dark:text-neutral sm:px-14 md:px-24 lg:px-32 scrollbar-thin scrollbar-track-neutral-200 scrollbar-thumb-neutral-400 dark:scrollbar-track-neutral-800 dark:scrollbar-thumb-neutral-600"> {{ $bodyScrollbar := "scrollbar-thin scrollbar-track-neutral-200 scrollbar-thumb-neutral-400 dark:scrollbar-track-neutral-800 dark:scrollbar-thumb-neutral-600" }}
<body class="{{ $bodyLayout }} {{ $bodyColor }} {{ $bodyScrollbar }}">
<div id="the-top" class="absolute flex self-center"> <div id="the-top" class="absolute flex self-center">
<a <a
class="px-3 py-1 text-sm -translate-y-8 rounded-b-lg bg-primary-200 focus:translate-y-0 dark:bg-neutral-600" class="px-3 py-1 text-sm -translate-y-8 rounded-b-lg bg-primary-200 focus:translate-y-0 dark:bg-neutral-600"
@@ -28,7 +29,7 @@
<div class="relative flex flex-col grow"> <div class="relative flex flex-col grow">
<main id="main-content" class="grow"> <main id="main-content" class="grow">
{{ block "main" . }}{{ end }} {{ block "main" . }}{{ end }}
{{ if and (site.Params.footer.showScrollToTop | default true) (gt .WordCount 1) }} {{ if and (site.Params.footer.showScrollToTop | default true) }}
{{- partial "scroll-to-top.html" . -}} {{- partial "scroll-to-top.html" . -}}
{{ end }} {{ end }}
</main> </main>
+4 -7
View File
@@ -31,19 +31,16 @@
{{/* Body */}} {{/* Body */}}
<section class="flex flex-col max-w-full mt-0 prose dark:prose-invert lg:flex-row"> <section class="flex flex-col max-w-full mt-0 prose dark:prose-invert lg:flex-row">
{{ $enableToc := .Params.showTableOfContents | default (site.Params.list.showTableOfContents | default false) }} {{ $enableToc := site.Params.article.showTableOfContents | default false }}
{{ $enableToc = .Params.showTableOfContents | default $enableToc }}
{{ $showToc := and $enableToc (in .TableOfContents "<ul") }} {{ $showToc := and $enableToc (in .TableOfContents "<ul") }}
{{ $showRelated := site.Params.article.showRelatedPosts | default false }}
{{ $topClass := cond (hasPrefix site.Params.header.layout "fixed") "lg:top-[140px]" "lg:top-10" }} {{ $topClass := cond (hasPrefix site.Params.header.layout "fixed") "lg:top-[140px]" "lg:top-10" }}
{{ if or $showToc $showRelated }} {{ if $showToc }}
<div class="order-first lg:ml-auto px-0 lg:order-last lg:ps-8"> <div class="order-first lg:ml-auto px-0 lg:order-last lg:ps-8 lg:max-w-2xs">
<div class="toc ps-5 print:hidden lg:sticky {{ $topClass }}"> <div class="toc ps-5 print:hidden lg:sticky {{ $topClass }}">
{{ if $showToc }} {{ if $showToc }}
{{ partial "toc.html" . }} {{ partial "toc.html" . }}
{{ end }} {{ end }}
{{ if $showRelated }}
sd
{{ end }}
</div> </div>
</div> </div>
{{ end }} {{ end }}
+1 -1
View File
@@ -1,6 +1,6 @@
{{ define "main" }} {{ define "main" }}
{{ .Scratch.Set "scope" "list" }} {{ .Scratch.Set "scope" "list" }}
{{ $showHero := .Params.showHero | default site.Params.term.showHero | default false }} {{ $showHero := .Params.showHero | default site.Params.taxonomy.showHero | default false }}
{{ if $showHero }} {{ if $showHero }}
{{ $heroStyle := print "hero/" site.Params.taxonomy.heroStyle ".html" }} {{ $heroStyle := print "hero/" site.Params.taxonomy.heroStyle ".html" }}
{{ if templates.Exists ( printf "partials/%s" $heroStyle ) }} {{ if templates.Exists ( printf "partials/%s" $heroStyle ) }}
+8 -8
View File
@@ -1,12 +1,12 @@
{{ with site.Params.fathomAnalytics.site }} {{ if site.Params.fathomAnalytics.site }}
{{ partial "analytics/fathom.html" }} {{ partial "analytics/fathom.html" . }}
{{ end }} {{ end }}
{{ with site.Config.Services.GoogleAnalytics.ID }} {{ if site.Config.Services.GoogleAnalytics.ID }}
{{ partial "analytics/ga.html" }} {{ partial "analytics/ga.html" . }}
{{ end }} {{ end }}
{{ with site.Params.umamiAnalytics.websiteid }} {{ if site.Params.umamiAnalytics.websiteid }}
{{ partial "analytics/umami.html" }} {{ partial "analytics/umami.html" . }}
{{ end }} {{ end }}
{{ with site.Params.selineAnalytics.token }} {{ if site.Params.selineAnalytics.token }}
{{ partial "analytics/seline.html" }} {{ partial "analytics/seline.html" . }}
{{ end }} {{ end }}
@@ -19,8 +19,8 @@
{{ if site.Params.list.showCards }} {{ if site.Params.list.showCards }}
{{ $cardClasses = printf "%s overflow-hidden rounded-md border-2 border-neutral-200 dark:border-neutral-700" $cardClasses }} {{ $cardClasses = printf "%s overflow-hidden rounded-md border-2 border-neutral-200 dark:border-neutral-700" $cardClasses }}
{{ $imgWrapperClasses = "" }} {{ $figureClasses = "" }}
{{ $cardContentClasses = printf "%s p-2.5 pl-4 pb-0" $cardContentClasses }} {{ $cardContentClasses = printf "%s p-4 pt-2" $cardContentClasses }}
{{ else }} {{ else }}
{{ $cardClasses = printf "%s" $cardClasses }} {{ $cardClasses = printf "%s" $cardClasses }}
{{ $imgWrapperClasses = printf "%s thumbnail-shadow md:mr-7" $imgWrapperClasses }} {{ $imgWrapperClasses = printf "%s thumbnail-shadow md:mr-7" $imgWrapperClasses }}
@@ -85,7 +85,7 @@
<div class="flex-none relative overflow-hidden {{ $imgWrapperClasses }} thumbnail"> <div class="flex-none relative overflow-hidden {{ $imgWrapperClasses }} thumbnail">
<img <img
src="{{ . }}" src="{{ . }}"
alt="" alt="{{ with $target.Params.featuredImageAlt }}{{ . }}{{ else }}{{ $target.Title | emojify }}{{ end }}"
loading="lazy" loading="lazy"
decoding="async" decoding="async"
class="not-prose absolute inset-0 w-full h-full object-cover"> class="not-prose absolute inset-0 w-full h-full object-cover">
@@ -56,7 +56,7 @@
<div class="flex-none relative overflow-hidden thumbnail_card_related"> <div class="flex-none relative overflow-hidden thumbnail_card_related">
<img <img
src="{{ . }}" src="{{ . }}"
alt="" alt="{{ $page.Title }}"
loading="lazy" loading="lazy"
decoding="async" decoding="async"
fetchpriority="low" fetchpriority="low"
+1 -1
View File
@@ -60,7 +60,7 @@
<div class="flex-none relative overflow-hidden thumbnail_card"> <div class="flex-none relative overflow-hidden thumbnail_card">
<img <img
src="{{ . }}" src="{{ . }}"
alt="" alt="{{ $page.Title | plainify }}"
loading="lazy" loading="lazy"
decoding="async" decoding="async"
class="not-prose absolute inset-0 w-full h-full object-cover"> class="not-prose absolute inset-0 w-full h-full object-cover">
+1 -1
View File
@@ -78,7 +78,7 @@
<div class="flex-none relative overflow-hidden {{ $imgWrapperClasses }} thumbnail"> <div class="flex-none relative overflow-hidden {{ $imgWrapperClasses }} thumbnail">
<img <img
src="{{ . }}" src="{{ . }}"
alt="" alt="{{ $.Params.featuredImageAlt | default ($.Title | emojify) }}"
loading="lazy" loading="lazy"
decoding="async" decoding="async"
class="not-prose absolute inset-0 w-full h-full object-cover"> class="not-prose absolute inset-0 w-full h-full object-cover">
+22 -38
View File
@@ -9,52 +9,36 @@
<div class="pt-8"> <div class="pt-8">
<hr class="border-dotted border-neutral-300 dark:border-neutral-600"> <hr class="border-dotted border-neutral-300 dark:border-neutral-600">
<div class="flex justify-between pt-3"> <div class="flex justify-between pt-3">
<span> <span class="flex flex-col">
{{ if $prev }} {{ if $prev }}
<a class="flex group mr-3" href="{{ $prev.RelPermalink }}"> <a
<span class="flex text-neutral-700 hover:text-primary-600 dark:text-neutral dark:hover:text-primary-400"
class="mr-3 text-neutral-700 group-hover:text-primary-600 ltr:inline rtl:hidden dark:text-neutral dark:group-hover:text-primary-400" href="{{ $prev.RelPermalink }}">
>&larr;</span <span class="leading-6">
> <span class="inline-block rtl:rotate-180">&larr;</span>&ensp;{{ $prev.Title | emojify }}
<span
class="ml-3 text-neutral-700 group-hover:text-primary-600 ltr:hidden rtl:inline dark:text-neutral dark:group-hover:text-primary-400"
>&rarr;</span
>
<span class="flex flex-col">
<span class="mt-[0.1rem] leading-6 group-hover:underline group-hover:decoration-primary-500"
>{{ $prev.Title | emojify }}</span
>
<span class="mt-[0.1rem] text-xs text-neutral-500 dark:text-neutral-400">
{{ if .Params.showDate | default (.Site.Params.article.showDate | default true) }}
{{ partial "meta/date.html" $prev.Date }}
{{ end }}
</span>
</span> </span>
</a> </a>
{{ if .Params.showDate | default (.Site.Params.article.showDate | default true) }}
<span class="ms-6 mt-1 text-xs text-neutral-500 dark:text-neutral-400">
{{ partial "meta/date.html" $prev.Date }}
</span>
{{ end }}
{{ end }} {{ end }}
</span> </span>
<span> <span class="flex flex-col items-end">
{{ if $next }} {{ if $next }}
<a class="flex text-right group ml-3" href="{{ $next.RelPermalink }}"> <a
<span class="flex flex-col"> class="flex text-right text-neutral-700 hover:text-primary-600 dark:text-neutral dark:hover:text-primary-400"
<span class="mt-[0.1rem] leading-6 group-hover:underline group-hover:decoration-primary-500" href="{{ $next.RelPermalink }}">
>{{ $next.Title | emojify }}</span <span class="leading-6">
> {{ $next.Title | emojify }}&ensp;<span class="inline-block rtl:rotate-180">&rarr;</span>
<span class="mt-[0.1rem] text-xs text-neutral-500 dark:text-neutral-400">
{{ if .Params.showDate | default (.Site.Params.article.showDate | default true) }}
{{ partial "meta/date.html" $next.Date }}
{{ end }}
</span>
</span> </span>
<span
class="ml-3 text-neutral-700 group-hover:text-primary-600 ltr:inline rtl:hidden dark:text-neutral dark:group-hover:text-primary-400"
>&rarr;</span
>
<span
class="mr-3 text-neutral-700 group-hover:text-primary-600 ltr:hidden rtl:inline dark:text-neutral dark:group-hover:text-primary-400"
>&larr;</span
>
</a> </a>
{{ if .Params.showDate | default (.Site.Params.article.showDate | default true) }}
<span class="me-6 mt-1 text-xs text-neutral-500 dark:text-neutral-400">
{{ partial "meta/date.html" $next.Date }}
</span>
{{ end }}
{{ end }} {{ end }}
</span> </span>
</div> </div>
+4 -2
View File
@@ -8,14 +8,16 @@
{{ $authorImage = resources.Get . }} {{ $authorImage = resources.Get . }}
{{ end }} {{ end }}
{{ if $authorImage }} {{ if $authorImage }}
{{ $final := $authorImage }}
{{ if not $disableImageOptimization }} {{ if not $disableImageOptimization }}
{{ $authorImage = $authorImage.Fill "192x192" }} {{ $final = $authorImage.Fill "192x192" }}
{{ end }} {{ end }}
<img <img
class="!mt-0 !mb-0 h-24 w-24 rounded-full me-4" class="!mt-0 !mb-0 h-24 w-24 rounded-full me-4"
width="96" width="96"
height="96" height="96"
src="{{ $authorImage.RelPermalink }}"> src="{{ $final.RelPermalink }}"
data-zoom-src="{{ $authorImage.RelPermalink }}">
{{ end }} {{ end }}
{{ end }} {{ end }}
<div class="place-self-center"> <div class="place-self-center">
+8 -4
View File
@@ -8,26 +8,30 @@
{{ $authorImage = resources.Get . }} {{ $authorImage = resources.Get . }}
{{ end }} {{ end }}
{{ if $authorImage }} {{ if $authorImage }}
{{ $final := $authorImage }}
{{ if not $disableImageOptimization }} {{ if not $disableImageOptimization }}
{{ $authorImage = $authorImage.Fill "192x192" }} {{ $final = $authorImage.Fill "192x192" }}
{{ end }} {{ end }}
<img <img
class="!mt-0 !mb-0 h-24 w-24 rounded-full me-4" class="!mt-0 !mb-0 h-24 w-24 rounded-full me-4"
width="96" width="96"
height="96" height="96"
alt="{{ $.Site.Params.Author.name | default " Author" }}" alt="{{ $.Site.Params.Author.name | default " Author" }}"
src="{{ $authorImage.RelPermalink }}"> src="{{ $final.RelPermalink }}"
data-zoom-src="{{ $authorImage.RelPermalink }}">
{{ else }} {{ else }}
{{ $authorImage := resources.GetRemote . }} {{ $authorImage := resources.GetRemote . }}
{{ $final := $authorImage }}
{{ if not $disableImageOptimization }} {{ if not $disableImageOptimization }}
{{ $authorImage = $authorImage.Fill "192x192" }} {{ $final = $authorImage.Fill "192x192" }}
{{ end }} {{ end }}
<img <img
class="!mt-0 !mb-0 h-24 w-24 rounded-full me-4" class="!mt-0 !mb-0 h-24 w-24 rounded-full me-4"
width="96" width="96"
height="96" height="96"
alt="{{ $.Site.Params.Author.name | default " Author" }}" alt="{{ $.Site.Params.Author.name | default " Author" }}"
src="{{ $authorImage.RelPermalink }}"> src="{{ $authorImage.RelPermalink }}"
data-zoom-src="{{ $authorImage.RelPermalink }}">
{{ end }} {{ end }}
{{ end }} {{ end }}
<div class="place-self-center"> <div class="place-self-center">
+1 -1
View File
@@ -11,7 +11,7 @@
{{ end }} {{ end }}
{{ $navClass := printf "flex flex-row pb-4 text-base font-medium text-neutral-500 dark:text-neutral-400 %s" (cond $onlyIcon "overflow-x-auto py-2" "") }} {{ $navClass := printf "flex flex-row pb-4 text-base font-medium text-neutral-500 dark:text-neutral-400 %s" (cond $onlyIcon "overflow-x-auto py-2" "") }}
{{ $ulClass := printf "flex list-none %s" (cond $onlyIcon "flex-row" "flex-col sm:flex-row") }} {{ $ulClass := printf "flex list-none %s" (cond $onlyIcon "flex-row" "flex-col sm:flex-row") }}
{{ $liClass := printf "flex mb-1 text-end sm:mb-0 sm:me-7 sm:last:me-0 %s" (cond $onlyIcon "ltr:mr-4 rtl:ml-4" "") }} {{ $liClass := printf "flex mb-1 text-end sm:mb-0 sm:me-7 sm:last:me-0 %s" (cond $onlyIcon "me-4" "") }}
<nav class="{{ $navClass }}"> <nav class="{{ $navClass }}">
<ul class="{{ $ulClass }}"> <ul class="{{ $ulClass }}">
{{ range .Site.Menus.footer }} {{ range .Site.Menus.footer }}
+144 -154
View File
@@ -8,21 +8,21 @@
<meta name="theme-color"> <meta name="theme-color">
{{/* Title */}} {{/* Title */}}
{{ if .IsHome -}} {{ if .IsHome }}
<title>{{ .Site.Title | emojify }}</title> <title>{{ .Site.Title | emojify }}</title>
<meta name="title" content="{{ .Site.Title | emojify }}"> <meta name="title" content="{{ .Site.Title | emojify }}">
{{- else -}} {{ else }}
<title>{{ .Title | emojify }} &middot; {{ .Site.Title | emojify }}</title> <title>{{ .Title | emojify }} &middot; {{ .Site.Title | emojify }}</title>
<meta name="title" content="{{ .Title | emojify }} &middot; {{ .Site.Title | emojify }}"> <meta name="title" content="{{ .Title | emojify }} &middot; {{ .Site.Title | emojify }}">
{{- end }} {{ end }}
{{/* Metadata */}} {{/* Metadata */}}
{{ with (.Params.Summary | default .Params.Description) | default .Site.Params.description -}} {{ with (.Params.Summary | default .Params.Description) | default .Site.Params.description }}
<meta name="description" content="{{ . }}"> <meta name="description" content="{{ . }}">
{{- end }} {{ end }}
{{ with .Params.Tags | default .Site.Params.keywords -}} {{ with .Params.Tags | default .Site.Params.keywords }}
<meta name="keywords" content="{{ range . }}{{ . }},{{ end -}}"> <meta name="keywords" content="{{ range . }}{{ . }},{{ end }}">
{{- end }} {{ end }}
{{ with .Site.Params.robots }} {{ with .Site.Params.robots }}
<meta name="robots" content="{{ . }}"> <meta name="robots" content="{{ . }}">
{{ end }} {{ end }}
@@ -30,112 +30,51 @@
<meta name="robots" content="{{ . }}"> <meta name="robots" content="{{ . }}">
{{ end }} {{ end }}
<link rel="canonical" href="{{ .Permalink }}"> <link rel="canonical" href="{{ .Permalink }}">
{{ range .AlternativeOutputFormats -}} {{ range .AlternativeOutputFormats }}
{{ printf ` {{ printf `
<link rel="%s" type="%s" href="%s" title="%s" />` .Rel .MediaType.Type .RelPermalink ($.Site.Title | emojify) | <link rel="%s" type="%s" href="%s" title="%s" />` .Rel .MediaType.Type .RelPermalink ($.Site.Title | emojify) |
safeHTML safeHTML
}} }}
{{ end -}}
{{/* Asset bundles */}}
{{ $assets := newScratch }}
{{ $cssScheme := resources.Get (printf "css/schemes/%s.css" (.Site.Params.colorScheme | default "blowfish")) }}
{{ if not $cssScheme }}
{{ $cssScheme = resources.Get "css/schemes/blowfish.css" }}
{{ end }}
{{ $assets.Add "css" (slice $cssScheme) }}
{{ $cssMain := resources.Get "css/compiled/main.css" }}
{{ $assets.Add "css" (slice $cssMain) }}
{{ $cssCustom := resources.Get "css/custom.css" }}
{{ if $cssCustom }}
{{ $assets.Add "css" (slice $cssCustom) }}
{{ end }}
{{ if not .Site.Params.disableImageZoom | default true }}
{{ $cssZoom := resources.Get "lib/zoom/style.css" }}
{{ $assets.Add "css" (slice $cssZoom) }}
{{ end }}
{{ $bundleCSS := $assets.Get "css" | resources.Concat "css/main.bundle.css" | resources.Minify | resources.Fingerprint
(.Site.Params.fingerprintAlgorithm | default "sha512")
}}
<link
type="text/css"
rel="stylesheet"
href="{{ $bundleCSS.RelPermalink }}"
integrity="{{ $bundleCSS.Data.Integrity }}">
{{ $jsAppearance := resources.Get "js/appearance.js" }}
{{ $jsAppearance = $jsAppearance | resources.ExecuteAsTemplate "js/appearance.js" . | resources.Minify | resources.Fingerprint (.Site.Params.fingerprintAlgorithm | default "sha512") }}
<script
type="text/javascript"
src="{{ $jsAppearance.RelPermalink }}"
integrity="{{ $jsAppearance.Data.Integrity }}"></script>
{{ if site.Params.footer.showScrollToTop | default true }}
{{ $jsToTop := resources.Get "js/scroll-to-top.js" }}
{{ $assets.Add "js" (slice $jsToTop) }}
{{ end }}
{{ if .Site.Params.enableA11y | default false }}
{{ $jsA11y := resources.Get "js/a11y.js" }}
{{ $jsA11y = $jsA11y | resources.Minify | resources.Fingerprint (site.Params.fingerprintAlgorithm | default "sha512") }}
<script src="{{ $jsA11y.RelPermalink }}" integrity="{{ $jsA11y.Data.Integrity }}"></script>
{{ end }}
{{ $shouldIncludeZenMode := or (.Site.Params.enableA11y | default false) (.Params.showZenMode | default (.Site.Params.article.showZenMode | default false)) }}
{{ if and .IsPage $shouldIncludeZenMode }}
{{ $jsZenMode := resources.Get "js/zen-mode.js" }}
{{ $jsZenMode = $jsZenMode | resources.Minify | resources.Fingerprint (.Site.Params.fingerprintAlgorithm | default "sha512") }}
<script
type="text/javascript"
src="{{ $jsZenMode.RelPermalink }}"
integrity="{{ $jsZenMode.Data.Integrity }}"></script>
{{ end }}
{{ if site.Params.footer.showScrollToTop | default true }}
{{ $jsToTop := resources.Get "js/scroll-to-top.js" }}
{{ $assets.Add "js" (slice $jsToTop) }}
{{ end }}
{{ if .Site.Params.enableSearch | default false }}
{{ $jsFuse := resources.Get "lib/fuse/fuse.min.js" }}
{{ $jsSearch := resources.Get "js/search.js" }}
{{ $assets.Add "js" (slice $jsFuse $jsSearch) }}
{{ end }}
{{ if .Site.Params.enableCodeCopy | default false }}
{{ $jsCode := resources.Get "js/code.js" }}
{{ $assets.Add "js" (slice $jsCode) }}
{{ end }}
{{ if .Site.Params.rtl | default false }}
{{ $jsRTL := resources.Get "js/rtl.js" }}
{{ $assets.Add "js" (slice $jsRTL) }}
{{ end }}
{{ $jsMobileMenu := resources.Get "js/mobilemenu.js" }}
{{ $assets.Add "js" (slice $jsMobileMenu) }}
{{ $buttonLikes := resources.Get "js/button-likes.js" }}
{{ $assets.Add "js" (slice $buttonLikes) }}
{{ $katexRender := resources.Get "js/katex-render.js" }}
{{ $assets.Add "js" (slice $katexRender) }}
{{ if $assets.Get "js" }}
{{ $bundleJS := $assets.Get "js" | resources.Concat "js/main.bundle.js" | resources.Minify | resources.Fingerprint
(.Site.Params.fingerprintAlgorithm | default "sha512")
}}
<script
defer
type="text/javascript"
id="script-bundle"
src="{{ $bundleJS.RelPermalink }}"
integrity="{{ $bundleJS.Data.Integrity }}"
data-copy="{{ i18n "code.copy" }}"
data-copied="{{ i18n "code.copied" }}"></script>
{{ end }}
{{ if not .Site.Params.disableImageZoom | default true }}
{{ $zoomJS := resources.Get "lib/zoom/zoom.min.umd.js" | resources.Fingerprint (.Site.Params.fingerprintAlgorithm | default "sha512") }}
<script src="{{ $zoomJS.RelPermalink }}" integrity="{{ $zoomJS.Data.Integrity }}"></script>
{{ end }} {{ end }}
{{/* Icons */}} {{/* Me */}}
{{ if templates.Exists "partials/favicons.html" }} {{ with .Site.Params.Author.name }}
{{ partialCached "favicons.html" .Site }} <meta name="author" content="{{ . }}">
{{ else }} {{ end }}
<link rel="apple-touch-icon" sizes="180x180" href="{{ "apple-touch-icon.png" | relURL }}"> {{ with .Site.Params.Author.links }}
<link rel="icon" type="image/png" sizes="32x32" href="{{ "favicon-32x32.png" | relURL }}"> {{ range $links := . }}
<link rel="icon" type="image/png" sizes="16x16" href="{{ "favicon-16x16.png" | relURL }}"> {{ range $name, $url := $links }}
<link rel="manifest" href="{{ "site.webmanifest" | relURL }}"> {{ if not (strings.HasPrefix $url "mailto:") }}
<link href="{{ $url }}" rel="me">
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{/* Social */}}
{{ template "_internal/opengraph.html" . }}
{{ template "_internal/twitter_cards.html" . }}
{{/* Use defaultSocialImage if feature image does not exist */}}
{{ $featureImage := "" }}
{{ $pageImages := .Resources.ByType "image" }}
{{ range slice "*featured*" "*cover*" "*thumbnail*" }}
{{ if not $featureImage }}
{{ $featureImage = $pageImages.GetMatch . }}
{{ end }}
{{ end }}
{{ if not $featureImage }}
{{ with .Site.Params.defaultSocialImage }}
{{ $socialImage := "" }}
{{ if or (strings.HasPrefix . "http:") (strings.HasPrefix . "https:") }}
{{ $socialImage = resources.GetRemote . }}
{{ else }}
{{ $socialImage = resources.Get . }}
{{ end }}
{{ with $socialImage }}
<meta name="twitter:image" content="{{ .RelPermalink | absURL }}">
<meta property="og:image" content="{{ .RelPermalink | absURL }}">
{{ end }}
{{ end }}
{{ end }} {{ end }}
{{/* Site Verification */}} {{/* Site Verification */}}
@@ -155,52 +94,101 @@
<meta name="fediverse:creator" content="{{ . }}"> <meta name="fediverse:creator" content="{{ . }}">
{{ end }} {{ end }}
{{/* Social */}} {{ $alg := .Site.Params.fingerprintAlgorithm | default "sha512" }}
{{ template "_internal/opengraph.html" . }}
{{ template "_internal/twitter_cards.html" . }}
{{- /* Main page always uses this; fallback elsewhere if no feature image */ -}} {{/* CSS */}}
{{- /* See https://gohugo.io/templates/embedded/#open-graph */ -}} {{ $cssResources := slice }}
{{- $images := .Resources.ByType "image" -}} {{ $schemeName := .Site.Params.colorScheme | default "blowfish" }}
{{- $socialImage := $images.GetMatch "*feature*" -}} {{ $cssScheme := resources.Get (printf "css/schemes/%s.css" $schemeName) | default (resources.Get "css/schemes/blowfish.css") }}
{{ $cssResources = $cssResources | append $cssScheme }}
{{ $cssResources = $cssResources | append (resources.Get "css/compiled/main.css") }}
{{ with resources.Get "css/custom.css" }}
{{ $cssResources = $cssResources | append . }}
{{ end }}
{{ if not .Site.Params.disableImageZoom | default true }}
{{ $cssResources = $cssResources | append (resources.Get "lib/zoom/style.css") }}
{{ end }}
{{ $bundleCSS := $cssResources | resources.Concat "css/main.bundle.css" | resources.Minify | resources.Fingerprint $alg }}
<link
type="text/css"
rel="stylesheet"
href="{{ $bundleCSS.RelPermalink }}"
integrity="{{ $bundleCSS.Data.Integrity }}">
{{- if not $socialImage -}} {{/* JS loaded immediately */}}
{{- with .Site.Params.defaultSocialImage -}} {{ $jsAppearance := resources.Get "js/appearance.js" | resources.ExecuteAsTemplate "js/appearance.js" . | resources.Minify | resources.Fingerprint $alg }}
{{- if or (strings.HasPrefix . "http:") (strings.HasPrefix . "https:") -}} <script
{{- $socialImage = resources.GetRemote . -}} type="text/javascript"
{{- else -}} src="{{ $jsAppearance.RelPermalink }}"
{{- $socialImage = resources.Get . -}} integrity="{{ $jsAppearance.Data.Integrity }}"></script>
{{- end -}} {{ $enableA11y := .Site.Params.enableA11y | default false }}
{{- end -}} {{ if $enableA11y }}
{{- end -}} {{ $jsA11y := resources.Get "js/a11y.js" | resources.Minify | resources.Fingerprint $alg }}
<script src="{{ $jsA11y.RelPermalink }}" integrity="{{ $jsA11y.Data.Integrity }}"></script>
{{ end }}
{{ $showZenMode := .Params.showZenMode | default (.Site.Params.article.showZenMode | default false) }}
{{ $shouldIncludeZenMode := or $enableA11y $showZenMode }}
{{ if and .IsPage $shouldIncludeZenMode }}
{{ $jsZenMode := resources.Get "js/zen-mode.js" | resources.Minify | resources.Fingerprint $alg }}
<script
type="text/javascript"
src="{{ $jsZenMode.RelPermalink }}"
integrity="{{ $jsZenMode.Data.Integrity }}"></script>
{{ end }}
{{ if not .Site.Params.disableImageZoom | default true }}
{{ $zoomJS := resources.Get "lib/zoom/zoom.min.umd.js" | resources.Fingerprint $alg }}
<script src="{{ $zoomJS.RelPermalink }}" integrity="{{ $zoomJS.Data.Integrity }}"></script>
{{ end }}
{{- with $socialImage -}} {{/* JS deferred */}}
<meta name="twitter:image" content="{{ .RelPermalink | absURL }}"> {{ $jsResources := slice }}
<meta property="og:image" content="{{ .RelPermalink | absURL }}"> {{ if site.Params.footer.showScrollToTop | default true }}
{{- end -}} {{ $jsResources = $jsResources | append (resources.Get "js/scroll-to-top.js") }}
{{ end }}
{{ if .Site.Params.enableSearch | default false }}
{{ $jsResources = $jsResources | append (resources.Get "lib/fuse/fuse.min.js") | append (resources.Get "js/search.js") }}
{{ end }}
{{ if .Site.Params.enableCodeCopy | default false }}
{{ $jsResources = $jsResources | append (resources.Get "js/code.js") }}
{{ end }}
{{ if .Site.Params.rtl | default false }}
{{ $jsResources = $jsResources | append (resources.Get "js/rtl.js") }}
{{ end }}
{{ $jsResources = $jsResources | append (resources.Get "js/mobilemenu.js") }}
{{ $jsResources = $jsResources | append (resources.Get "js/button-likes.js") }}
{{ $jsResources = $jsResources | append (resources.Get "js/katex-render.js") }}
{{ if $jsResources }}
{{ $bundleJS := $jsResources | resources.Concat "js/main.bundle.js" | resources.Minify | resources.Fingerprint $alg }}
<script
defer
type="text/javascript"
id="script-bundle"
src="{{ $bundleJS.RelPermalink }}"
integrity="{{ $bundleJS.Data.Integrity }}"
data-copy="{{ i18n "code.copy" }}"
data-copied="{{ i18n "code.copied" }}"></script>
{{ end }}
{{/* Conditional loaded resources */}}
{{ partial "vendor.html" . }}
{{/* Icons */}}
{{ if templates.Exists "partials/favicons.html" }}
{{ partialCached "favicons.html" .Site }}
{{ else }}
<link rel="apple-touch-icon" sizes="180x180" href="{{ "apple-touch-icon.png" | relURL }}">
<link rel="icon" type="image/png" sizes="32x32" href="{{ "favicon-32x32.png" | relURL }}">
<link rel="icon" type="image/png" sizes="16x16" href="{{ "favicon-16x16.png" | relURL }}">
<link rel="manifest" href="{{ "site.webmanifest" | relURL }}">
{{ end }}
{{/* Schema */}} {{/* Schema */}}
{{ partial "schema.html" . }} {{ partial "schema.html" . }}
{{/* Me */}}
{{ with .Site.Params.Author.name }}
<meta name="author" content="{{ . }}">
{{ end }}
{{ with .Site.Params.Author.links }}
{{ range $links := . }}
{{ range $name, $url := $links }}
{{ if not (strings.HasPrefix $url "mailto:") }}
<link href="{{ $url }}" rel="me">
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{/* Vendor */}}
{{ partial "vendor.html" . }}
{{/* Analytics */}} {{/* Analytics */}}
{{ partial "analytics/main.html" .Site }} {{ if hugo.IsProduction }}
{{ partial "analytics/main.html" . }}
{{ end }}
{{/* Extend head - eg. for custom analytics scripts, etc. */}} {{/* Extend head - eg. for custom analytics scripts, etc. */}}
{{ if templates.Exists "partials/extend-head.html" }} {{ if templates.Exists "partials/extend-head.html" }}
@@ -218,11 +206,11 @@
<script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-app.js"></script> <script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-firestore.js"></script> <script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-firestore.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-auth.js"></script> <script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-auth.js"></script>
<script> <script>
const firebaseConfig = { const firebaseConfig = {
apiKey: {{ $.Site.Params.firebase.apiKey }}, apiKey: {{ $.Site.Params.firebase.apiKey }},
authDomain: {{ $.Site.Params.firebase.apiKey }}, authDomain: {{ $.Site.Params.firebase.authDomain }},
projectId: {{ $.Site.Params.firebase.projectId }}, projectId: {{ $.Site.Params.firebase.projectId }},
storageBucket: {{ $.Site.Params.firebase.storageBucket }}, storageBucket: {{ $.Site.Params.firebase.storageBucket }},
messagingSenderId: {{ $.Site.Params.firebase.messagingSenderId }}, messagingSenderId: {{ $.Site.Params.firebase.messagingSenderId }},
@@ -230,18 +218,20 @@
measurementId: {{ $.Site.Params.firebase.measurementId }} measurementId: {{ $.Site.Params.firebase.measurementId }}
}; };
var app = firebase.initializeApp(firebaseConfig); var app = firebase.initializeApp(firebaseConfig);
var db = firebase.firestore(); var db = firebase.firestore();
var auth = firebase.auth(); var auth = firebase.auth();
</script> </script>
{{ end }} {{ end }}
{{ end }} {{ end }}
{{/* Advertisement */}} {{/* Advertisement */}}
{{ with .Site.Params.advertisement.adsense }} {{ with .Site.Params.advertisement.adsense }}
<meta name="google-adsense-account" content="{{ . }}"> <meta name="google-adsense-account" content="{{ . }}">
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client={{ . }}" <script
crossorigin="anonymous"></script> async
src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client={{ . }}"
crossorigin="anonymous"></script>
{{ end }} {{ end }}
</head> </head>
+6 -6
View File
@@ -16,7 +16,7 @@
width="{{ div $logo.Width 2 }}" width="{{ div $logo.Width 2 }}"
height="{{ div $logo.Height 2 }}" height="{{ div $logo.Height 2 }}"
class="logo max-h-[5rem] max-w-[5rem] object-scale-down object-left nozoom" class="logo max-h-[5rem] max-w-[5rem] object-scale-down object-left nozoom"
alt="{{ .Site.Title }}"> alt="">
{{ end }} {{ end }}
</a> </a>
</div> </div>
@@ -68,7 +68,7 @@
{{ end }} {{ end }}
{{/* Mobile navigation */}} {{/* Mobile navigation */}}
{{ define "HeaderMobileNavigation" }} {{ define "HeaderMobileToolbar" }}
<div class="flex md:hidden items-center gap-x-5 md:ml-12 h-12"> <div class="flex md:hidden items-center gap-x-5 md:ml-12 h-12">
<span></span> <span></span>
@@ -104,7 +104,7 @@
</div> </div>
{{ end }} {{ end }}
{{ define "HeaderMobileMenu" }} {{ define "HeaderMobileNavigation" }}
<div class="-my-2 md:hidden"> <div class="-my-2 md:hidden">
<div id="menu-button" class="block"> <div id="menu-button" class="block">
{{ if .Site.Menus.main }} {{ if .Site.Menus.main }}
@@ -243,7 +243,7 @@
{{/* ========== Render HTML ========== */}} {{/* ========== Render HTML ========== */}}
<div <div
class="main-menu flex items-center justify-between px-4 py-6 sm:px-6 md:justify-start gap-x-3 pt-[2px] pr-0 pb-[3px] pl-0"> class="main-menu flex items-center justify-between py-6 md:justify-start gap-x-3 pt-[2px] pr-2 md:pr-4 pb-[3px] pl-0">
{{ template "HeaderLogo" . }} {{ template "HeaderLogo" . }}
<div class="flex flex-1 items-center justify-between"> <div class="flex flex-1 items-center justify-between">
<nav class="flex space-x-3"> <nav class="flex space-x-3">
@@ -254,9 +254,9 @@
{{ end }} {{ end }}
</nav> </nav>
{{ template "HeaderDesktopNavigation" . }} {{ template "HeaderDesktopNavigation" . }}
{{ template "HeaderMobileNavigation" . }} {{ template "HeaderMobileToolbar" . }}
</div> </div>
{{ template "HeaderMobileMenu" . }} {{ template "HeaderMobileNavigation" . }}
</div> </div>
{{ if .Site.Menus.subnavigation }} {{ if .Site.Menus.subnavigation }}
+2 -2
View File
@@ -1,9 +1,9 @@
<div class="min-h-[148px]"></div> <div class="min-h-[148px]"></div>
<div class="fixed inset-x-0 pl-[24px] pr-[24px] z-100"> <div class="fixed inset-x-0 z-100">
<div <div
id="menu-blur" id="menu-blur"
class="absolute opacity-0 inset-x-0 top-0 h-full single_hero_background nozoom bg-neutral dark:bg-neutral-800"></div> class="absolute opacity-0 inset-x-0 top-0 h-full single_hero_background nozoom bg-neutral dark:bg-neutral-800"></div>
<div class="relative max-w-[64rem] ml-auto mr-auto"> <div class="relative m-auto leading-7 max-w-7xl px-6 sm:px-14 md:px-24 lg:px-32">
{{ partial "header/basic.html" . }} {{ partial "header/basic.html" . }}
</div> </div>
</div> </div>
+2 -2
View File
@@ -1,6 +1,6 @@
<div class="min-h-[148px]"></div> <div class="min-h-[148px]"></div>
<div class="fixed inset-x-0 pl-[24px] pr-[24px] bg-neutral dark:bg-neutral-800 z-100"> <div class="fixed inset-x-0 bg-neutral dark:bg-neutral-800 z-100">
<div class="relative max-w-[64rem] ml-auto mr-auto"> <div class="relative m-auto leading-7 max-w-7xl px-6 sm:px-14 md:px-24 lg:px-32">
{{ partial "header/basic.html" . }} {{ partial "header/basic.html" . }}
</div> </div>
</div> </div>
+3 -3
View File
@@ -1,11 +1,11 @@
<div class="min-h-[148px]"></div> <div class="min-h-[148px]"></div>
<div <div
class="fixed inset-x-0 min-h-[130px] opacity-65 pl-[24px] pr-[24px] bg-gradient-to-b from-neutral from-60% dark:from-neutral-800 to-transparent mix-blend-normal z-80"></div> class="fixed inset-x-0 min-h-[130px] opacity-65 bg-gradient-to-b from-neutral from-60% dark:from-neutral-800 to-transparent mix-blend-normal z-80"></div>
<div class="fixed inset-x-0 pl-[24px] pr-[24px] z-100"> <div class="fixed inset-x-0 z-100">
<div <div
id="menu-blur" id="menu-blur"
class="absolute opacity-0 inset-x-0 top-0 h-full single_hero_background nozoom backdrop-blur-2xl shadow-2xl"></div> class="absolute opacity-0 inset-x-0 top-0 h-full single_hero_background nozoom backdrop-blur-2xl shadow-2xl"></div>
<div class="relative max-w-[64rem] ml-auto mr-auto"> <div class="relative m-auto leading-7 max-w-7xl px-6 sm:px-14 md:px-24 lg:px-32">
{{ partial "header/basic.html" . }} {{ partial "header/basic.html" . }}
</div> </div>
</div> </div>
+2 -2
View File
@@ -1,9 +1,9 @@
<div class="min-h-[148px]"></div> <div class="min-h-[148px]"></div>
<div class="fixed inset-x-0 pl-[24px] pr-[24px] z-100"> <div class="fixed inset-x-0 z-100">
<div <div
id="menu-blur" id="menu-blur"
class="absolute opacity-0 inset-x-0 top-0 h-full single_hero_background nozoom backdrop-blur-2xl shadow-2xl"></div> class="absolute opacity-0 inset-x-0 top-0 h-full single_hero_background nozoom backdrop-blur-2xl shadow-2xl"></div>
<div class="relative max-w-[64rem] ml-auto mr-auto"> <div class="relative m-auto leading-7 max-w-7xl px-6 sm:px-14 md:px-24 lg:px-32">
{{ partial "header/basic.html" . }} {{ partial "header/basic.html" . }}
</div> </div>
</div> </div>
@@ -1,6 +1,7 @@
<li class="mt-1"> <li class="mt-1">
<a <a
href="{{ .URL }}" href="{{ .URL }}"
{{ with or .Name .Pre }}aria-label="{{ . }}"{{ end }}
class="flex items-center hover:text-primary-600 dark:hover:text-primary-400"> class="flex items-center hover:text-primary-600 dark:hover:text-primary-400">
{{ if .Pre }} {{ if .Pre }}
<span {{ if and .Pre .Name }}class="mr-1"{{ end }}> <span {{ if and .Pre .Name }}class="mr-1"{{ end }}>
@@ -24,6 +25,7 @@
}} }}
target="_blank" target="_blank"
{{ end }} {{ end }}
{{ with or .Name .Pre }}aria-label="{{ . }}"{{ end }}
class="flex items-center hover:text-primary-600 dark:hover:text-primary-400"> class="flex items-center hover:text-primary-600 dark:hover:text-primary-400">
{{ if .Pre }} {{ if .Pre }}
<span {{ if and .Pre .Name }}class="mr-1"{{ end }}> <span {{ if and .Pre .Name }}class="mr-1"{{ end }}>
@@ -7,6 +7,7 @@
target="_blank" target="_blank"
{{ end }} {{ end }}
class="flex items-center hover:text-primary-600 dark:hover:text-primary-400" class="flex items-center hover:text-primary-600 dark:hover:text-primary-400"
{{ with or .Name .Pre }}aria-label="{{ . }}"{{ end }}
title="{{ .Title }}"> title="{{ .Title }}">
{{ if .Pre }} {{ if .Pre }}
<div {{ if and .Pre .Name }}class="mr-2"{{ end }}> <div {{ if and .Pre .Name }}class="mr-2"{{ end }}>
@@ -12,6 +12,7 @@
target="_blank" target="_blank"
{{ end }} {{ end }}
{{ end }} {{ end }}
{{ with or .Name .Pre }}aria-label="{{ . }}"{{ end }}
class="text-base font-medium hover:text-primary-600 dark:hover:text-primary-400" class="text-base font-medium hover:text-primary-600 dark:hover:text-primary-400"
title="{{ .Title }}"> title="{{ .Title }}">
<p> <p>
@@ -31,6 +32,7 @@
{{ if or (strings.HasPrefix .URL "http:" ) (strings.HasPrefix .URL "https:" ) }} {{ if or (strings.HasPrefix .URL "http:" ) (strings.HasPrefix .URL "https:" ) }}
target="_blank" target="_blank"
{{ end }} {{ end }}
{{ with or .Name .Pre }}aria-label="{{ . }}"{{ end }}
class="flex items-center hover:text-primary-600 dark:hover:text-primary-400"> class="flex items-center hover:text-primary-600 dark:hover:text-primary-400">
{{ if .Pre }} {{ if .Pre }}
<span {{ if and .Pre .Name }}class="mr-1"{{ end }}> <span {{ if and .Pre .Name }}class="mr-1"{{ end }}>
@@ -2,6 +2,7 @@
href="{{ .URL }}" href="{{ .URL }}"
{{ if or (strings.HasPrefix .URL "http:" ) (strings.HasPrefix .URL "https:" ) }}target="_blank"{{ end }} {{ if or (strings.HasPrefix .URL "http:" ) (strings.HasPrefix .URL "https:" ) }}target="_blank"{{ end }}
class="flex items-center hover:text-primary-600 dark:hover:text-primary-400" class="flex items-center hover:text-primary-600 dark:hover:text-primary-400"
{{ with or .Name .Pre }}aria-label="{{ . }}"{{ end }}
title="{{ .Title }}"> title="{{ .Title }}">
{{ if .Pre }} {{ if .Pre }}
<span {{ if and .Pre .Name }}class="mr-1"{{ end }}> <span {{ if and .Pre .Name }}class="mr-1"{{ end }}>
+1 -1
View File
@@ -69,7 +69,7 @@
<img <img
id="background-image" id="background-image"
src="{{ . }}" src="{{ . }}"
alt="" alt="{{ $.Title }}"
loading="eager" loading="eager"
decoding="async" decoding="async"
fetchpriority="high" fetchpriority="high"
+1 -1
View File
@@ -53,7 +53,7 @@
<div class="overflow-hidden h-36 md:h-56 lg:h-72"> <div class="overflow-hidden h-36 md:h-56 lg:h-72">
<img <img
src="{{ . }}" src="{{ . }}"
alt="" alt="{{ with $.Params.featureimagealt }}{{ . }}{{ else }}{{ with $.Title }}Featured image for {{ . }}{{ else }}Featured image{{ end }}{{ end }}"
loading="eager" loading="eager"
decoding="async" decoding="async"
fetchpriority="high" fetchpriority="high"
@@ -87,7 +87,7 @@
<div class="overflow-hidden rounded-md h-36 md:h-56 lg:h-72 nozoom"> <div class="overflow-hidden rounded-md h-36 md:h-56 lg:h-72 nozoom">
<img <img
src="{{ . }}" src="{{ . }}"
alt="" alt="{{ $.Title }}"
loading="eager" loading="eager"
decoding="async" decoding="async"
fetchpriority="high" fetchpriority="high"
@@ -108,6 +108,7 @@
id="background-image-main" id="background-image-main"
src="{{ . }}" src="{{ . }}"
alt="" alt=""
role="presentation"
loading="eager" loading="eager"
decoding="async" decoding="async"
fetchpriority="high" fetchpriority="high"
+5 -3
View File
@@ -50,15 +50,17 @@
{{ $authorImage = resources.Get . }} {{ $authorImage = resources.Get . }}
{{ end }} {{ end }}
{{ if $authorImage }} {{ if $authorImage }}
{{ $final := $authorImage }}
{{ if not $disableImageOptimization }} {{ if not $disableImageOptimization }}
{{ $authorImage = $authorImage.Fill (print "288x288 q" ( $.Site.Params.Author.imagequality | default "96" )) }} {{ $final = $authorImage.Fill (print "288x288 q" ( $.Site.Params.Author.imagequality | default "96" )) }}
{{ end }} {{ end }}
<img <img
class="mb-2 h-36 w-36 rounded-full" class="mb-2 h-36 w-36 rounded-full"
width="144" width="144"
height="144" height="144"
alt="{{ $.Site.Params.Author.name | default " Author" }}" alt="{{ $.Site.Params.Author.name | default `Author` }}"
src="{{ $authorImage.RelPermalink }}"> src="{{ $final.RelPermalink }}"
data-zoom-src="{{ $authorImage.RelPermalink }}">
{{ end }} {{ end }}
{{ end }} {{ end }}
<h1 class="mb-2 text-4xl font-extrabold text-neutral-800 dark:text-neutral-200"> <h1 class="mb-2 text-4xl font-extrabold text-neutral-800 dark:text-neutral-200">
+6 -4
View File
@@ -53,15 +53,17 @@
{{ $authorImage = resources.Get . }} {{ $authorImage = resources.Get . }}
{{ end }} {{ end }}
{{ if $authorImage }} {{ if $authorImage }}
{{ $final := $authorImage }}
{{ if not $disableImageOptimization }} {{ if not $disableImageOptimization }}
{{ $authorImage = $authorImage.Fill (print "288x288 q" ( $.Site.Params.Author.imagequality | default "96" )) }} {{ $final = $authorImage.Fill (print "288x288 q" ( $.Site.Params.Author.imagequality | default "96" )) }}
{{ end }} {{ end }}
<img <img
class="mb-2 rounded-full h-36 w-36" class="mb-2 h-36 w-36 rounded-full"
width="144" width="144"
height="144" height="144"
alt="{{ $.Site.Params.Author.name | default " Author" }}" alt="{{ $.Site.Params.Author.name | default `Author` }}"
src="{{ $authorImage.RelPermalink }}"> src="{{ $final.RelPermalink }}"
data-zoom-src="{{ $authorImage.RelPermalink }}">
{{ end }} {{ end }}
{{ end }} {{ end }}
{{ if not $disableHeroImageFilter }} {{ if not $disableHeroImageFilter }}
+6 -4
View File
@@ -12,15 +12,17 @@
{{ $authorImage = resources.Get . }} {{ $authorImage = resources.Get . }}
{{ end }} {{ end }}
{{ if $authorImage }} {{ if $authorImage }}
{{ $final := $authorImage }}
{{ if not $disableImageOptimization }} {{ if not $disableImageOptimization }}
{{ $authorImage = $authorImage.Fill (print "288x288 q" ( $.Site.Params.Author.imagequality | default "96" )) }} {{ $final = $authorImage.Fill (print "288x288 q" ( $.Site.Params.Author.imagequality | default "96" )) }}
{{ end }} {{ end }}
<img <img
class="mb-2 rounded-full h-36 w-36" class="mb-2 h-36 w-36 rounded-full"
width="144" width="144"
height="144" height="144"
alt="{{ $.Site.Params.Author.name | default " Author" }}" alt="{{ $.Site.Params.Author.name | default `Author` }}"
src="{{ $authorImage.RelPermalink }}"> src="{{ $final.RelPermalink }}"
data-zoom-src="{{ $authorImage.RelPermalink }}">
{{ end }} {{ end }}
{{ end }} {{ end }}
<h1 class="text-4xl font-extrabold"> <h1 class="text-4xl font-extrabold">
+1 -1
View File
@@ -19,7 +19,7 @@
{{ $showMoreLinkDest = .Site.Params.homepage.showMoreLinkDest }} {{ $showMoreLinkDest = .Site.Params.homepage.showMoreLinkDest }}
{{ end }} {{ end }}
<div class="mt-10 flex justify-center"> <div class="mt-10 flex justify-center">
<a href="{{ $showMoreLinkDest }}"> <a href="{{ $showMoreLinkDest | relLangURL }}">
<button <button
class="bg-transparent hover:text-primary-500 prose dark:prose-invert font-semibold py-2 px-4 border border-primary-500 hover:border-transparent rounded"> class="bg-transparent hover:text-primary-500 prose dark:prose-invert font-semibold py-2 px-4 border border-primary-500 hover:border-transparent rounded">
{{ i18n "recent.show_more" | markdownify }} {{ i18n "recent.show_more" | markdownify }}
+6 -2
View File
@@ -1,5 +1,9 @@
{{ $coffeeIsRight := and site.Params.buymeacoffee.globalWidget (eq (lower site.Params.buymeacoffee.globalWidgetPosition) "right") }} {{ $coffeeIsRight := and .Site.Params.buymeacoffee.globalWidget (eq (lower site.Params.buymeacoffee.globalWidgetPosition) "right") }}
{{ $toTopYOffset := cond $coffeeIsRight "bottom-24" "bottom-6" }} {{ $isRTL := .Site.Params.rtl | default false }}
{{ $needAvoidCoffee := ne $coffeeIsRight $isRTL }}
{{ $toTopYOffset := cond $needAvoidCoffee "bottom-24" "bottom-6" }}
<div <div
id="scroll-to-top" id="scroll-to-top"
class="fixed {{ $toTopYOffset }} end-6 z-50 transform translate-y-4 opacity-0 duration-200"> class="fixed {{ $toTopYOffset }} end-6 z-50 transform translate-y-4 opacity-0 duration-200">
+18
View File
@@ -33,12 +33,24 @@
const TOC_LINK_SELECTOR = 'a[href^="#"]' const TOC_LINK_SELECTOR = 'a[href^="#"]'
const NESTED_LIST_SELECTOR = 'li ul' const NESTED_LIST_SELECTOR = 'li ul'
const ACTIVE_CLASS = 'active' const ACTIVE_CLASS = 'active'
let isJumpingToAnchor = false
function getActiveAnchorId(anchors, offsetRatio) { function getActiveAnchorId(anchors, offsetRatio) {
const threshold = window.scrollY + window.innerHeight * offsetRatio const threshold = window.scrollY + window.innerHeight * offsetRatio
const tocLinks = [...document.querySelectorAll('#TableOfContents a[href^="#"]')] const tocLinks = [...document.querySelectorAll('#TableOfContents a[href^="#"]')]
const tocIds = new Set(tocLinks.map(link => link.getAttribute('href').substring(1))) const tocIds = new Set(tocLinks.map(link => link.getAttribute('href').substring(1)))
if (isJumpingToAnchor) {
for (let i = 0; i < anchors.length; i++) {
const anchor = anchors[i]
if (!tocIds.has(anchor.id)) continue
const top = anchor.getBoundingClientRect().top + window.scrollY
if (Math.abs(window.scrollY - top) < 100) {
return anchor.id
}
}
}
for (let i = anchors.length - 1; i >= 0; i--) { for (let i = anchors.length - 1; i >= 0; i--) {
const top = anchors[i].getBoundingClientRect().top + window.scrollY const top = anchors[i].getBoundingClientRect().top + window.scrollY
if (top <= threshold && tocIds.has(anchors[i].id)) { if (top <= threshold && tocIds.has(anchors[i].id)) {
@@ -85,6 +97,12 @@
toc.querySelectorAll(NESTED_LIST_SELECTOR).forEach(ul => ul.style.display = 'none') toc.querySelectorAll(NESTED_LIST_SELECTOR).forEach(ul => ul.style.display = 'none')
} }
links.forEach(link => {
link.addEventListener('click', () => {
isJumpingToAnchor = true
})
})
const config = { const config = {
toc, toc,
anchors, anchors,
+4 -3
View File
@@ -149,8 +149,9 @@
{{ end }} {{ end }}
{{ end }} {{ end }}
{{ $repoCardCSS := resources.FromString "css/repo-cards.css" (delimit $cssRules "\n") {{ $cssContent := delimit $cssRules "\n" }}
| minify | resources.Fingerprint (.Site.Params.fingerprintAlgorithm | default "sha512") {{ $outputPath := path.Join .Page.RelPermalink "repo-cards.css" }}
}} {{ $repoCardCSS := resources.FromString $outputPath $cssContent | minify | resources.Fingerprint (.Site.Params.fingerprintAlgorithm | default "sha512") }}
<link rel="stylesheet" href="{{ $repoCardCSS.RelPermalink }}" integrity="{{ $repoCardCSS.Data.Integrity }}"> <link rel="stylesheet" href="{{ $repoCardCSS.RelPermalink }}" integrity="{{ $repoCardCSS.Data.Integrity }}">
{{ end }} {{ end }}
+7 -3
View File
@@ -1,5 +1,7 @@
{{ $id := delimit (slice "carousel" (partial "functions/uid.html" .) (now.UnixNano)) "-" }} {{ $id := delimit (slice "carousel" (partial "functions/uid.html" .) (now.UnixNano)) "-" }}
{{ $aspect := default "16-9" (.Get "aspectRatio") }} {{ $aspect := (split (.Get "aspectRatio") "-") }}
{{ $aspectx := default "16" (index $aspect 0) }}
{{ $aspecty := default "9" (index $aspect 1) }}
{{ $interval := default "2000" (.Get "interval") }} {{ $interval := default "2000" (.Get "interval") }}
{{ $page := .Page.Resources }} {{ $page := .Page.Resources }}
@@ -47,10 +49,12 @@
data-twe-carousel-item data-twe-carousel-item
style="transition-duration: {{ $interval }}ms;" style="transition-duration: {{ $interval }}ms;"
{{ if eq $index 0 }}data-twe-carousel-active{{ end }}> {{ if eq $index 0 }}data-twe-carousel-active{{ end }}>
<div class="ratio-{{ $aspect }} single_hero_background"> <div
class="single_hero_background"
style="aspect-ratio: {{ $aspectx }} / {{ $aspecty }};">
<img <img
src="{{ $image.RelPermalink }}" src="{{ $image.RelPermalink }}"
class="block absolute top-0 object-cover w-full h-full nozoom" class="block absolute top-0 object-cover w-full h-full not-prose nozoom"
alt="carousel image {{ add $index 1 }}"> alt="carousel image {{ add $index 1 }}">
</div> </div>
</div> </div>
+11 -7
View File
@@ -31,14 +31,18 @@
{{- else }} {{- else }}
<img <img
class="my-0 rounded-md{{ with $nozoom }} nozoom{{ end }}{{ with $class }} {{ . }}{{ end }}" class="my-0 rounded-md{{ with $nozoom }} nozoom{{ end }}{{ with $class }} {{ . }}{{ end }}"
srcset=" loading="lazy"
{{ (.Resize "330x").RelPermalink }} 330w, decoding="async"
{{ (.Resize "660x").RelPermalink }} 660w, fetchpriority="auto"
{{ (.Resize "1024x").RelPermalink }} 1024w,
{{ (.Resize "1320x").RelPermalink }} 2x"
src="{{ (.Resize "660x").RelPermalink }}"
data-zoom-src="{{ (.Resize "1320x").RelPermalink }}"
alt="{{ $altText }}" alt="{{ $altText }}"
{{ with .Width }}width="{{ . }}"{{ end }}
{{ with .Height }}height="{{ . }}"{{ end }}
src="{{ (.Resize "800x").RelPermalink }}"
srcset="
{{- (.Resize "800x").RelPermalink }} 800w,
{{- (.Resize "1280x").RelPermalink }} 1280w"
sizes="(min-width: 768px) 50vw, 65vw"
data-zoom-src="{{ .RelPermalink }}"
/> />
{{- end }} {{- end }}
{{- else }} {{- else }}
+1 -3
View File
@@ -1,3 +1 @@
<div class="mermaid" align="center"> <pre class="not-prose mermaid">{{ .Inner | safeHTML }}</pre>
<pre>{{ .Inner | safeHTML }}</pre>
</div>
+195 -238
View File
@@ -10,7 +10,7 @@
"hasInstallScript": true, "hasInstallScript": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@headlessui/react": "^2.2.8", "@headlessui/react": "^2.2.9",
"@heroicons/react": "^2.2.0", "@heroicons/react": "^2.2.0",
"@iamtraction/google-translate": "^2.0.1", "@iamtraction/google-translate": "^2.0.1",
"@tailwindcss/forms": "^0.5.10", "@tailwindcss/forms": "^0.5.10",
@@ -18,22 +18,22 @@
}, },
"devDependencies": { "devDependencies": {
"@awmottaz/prettier-plugin-void-html": "^1.9.0", "@awmottaz/prettier-plugin-void-html": "^1.9.0",
"@tailwindcss/cli": "^4.1.13", "@tailwindcss/cli": "^4.1.14",
"@tailwindcss/typography": "^0.5.16", "@tailwindcss/typography": "^0.5.19",
"chart.js": "^4.5.0", "chart.js": "^4.5.0",
"fuse.js": "^7.1.0", "fuse.js": "^7.1.0",
"jquery": "^3.7.1", "jquery": "^3.7.1",
"katex": "^0.16.22", "katex": "^0.16.23",
"lite-youtube-embed": "^0.3.3", "lite-youtube-embed": "^0.3.3",
"medium-zoom": "^1.1.0", "medium-zoom": "^1.1.0",
"mermaid": "^11.11.0", "mermaid": "^11.12.0",
"packery": "^3.0.0", "packery": "^3.0.0",
"prettier": "^3.6.2", "prettier": "^3.6.2",
"prettier-plugin-go-template": "^0.0.15", "prettier-plugin-go-template": "^0.0.15",
"puppeteer": "^24.21.0", "puppeteer": "^24.23.0",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"tailwind-scrollbar": "^4.0.2", "tailwind-scrollbar": "^4.0.2",
"tailwindcss": "^4.1.13", "tailwindcss": "^4.1.14",
"tw-elements": "2.0.0", "tw-elements": "2.0.0",
"typeit": "^8.8.7", "typeit": "^8.8.7",
"vendor-copy": "^3.0.1" "vendor-copy": "^3.0.1"
@@ -110,10 +110,11 @@
} }
}, },
"node_modules/@braintree/sanitize-url": { "node_modules/@braintree/sanitize-url": {
"version": "7.1.0", "version": "7.1.1",
"resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.0.tgz", "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz",
"integrity": "sha512-o+UlMLt49RvtCASlOMW0AkHnabN9wR9rwCCherxO0yG4Npy34GkvrAqdXQvrhNs+jh+gkK8gB8Lf05qL/O7KWg==", "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==",
"dev": true "dev": true,
"license": "MIT"
}, },
"node_modules/@chevrotain/cst-dts-gen": { "node_modules/@chevrotain/cst-dts-gen": {
"version": "11.0.3", "version": "11.0.3",
@@ -216,9 +217,9 @@
"integrity": "sha512-XGndio0l5/Gvd6CLIABvsav9HHezgDFFhDfHk1bvLfr9ni8dojqLSvBbotJEjmIwNHL7vK4QzBJTdBRoB+c1ww==" "integrity": "sha512-XGndio0l5/Gvd6CLIABvsav9HHezgDFFhDfHk1bvLfr9ni8dojqLSvBbotJEjmIwNHL7vK4QzBJTdBRoB+c1ww=="
}, },
"node_modules/@headlessui/react": { "node_modules/@headlessui/react": {
"version": "2.2.8", "version": "2.2.9",
"resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.2.8.tgz", "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.2.9.tgz",
"integrity": "sha512-vkiZulDC0lFeTrZTbA4tHvhZHvkUb2PFh5xJ1BvWAZdRK0fayMKO1QEO4inWkXxK1i0I1rcwwu1d6mo0K7Pcbw==", "integrity": "sha512-Mb+Un58gwBn0/yWZfyrCh0TJyurtT+dETj7YHleylHk5od3dv2XqETPGWMyQ5/7sYN7oWdyM1u9MvC0OC8UmzQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@floating-ui/react": "^0.26.16", "@floating-ui/react": "^0.26.16",
@@ -823,31 +824,24 @@
} }
}, },
"node_modules/@tailwindcss/cli": { "node_modules/@tailwindcss/cli": {
"version": "4.1.13", "version": "4.1.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/cli/-/cli-4.1.13.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/cli/-/cli-4.1.14.tgz",
"integrity": "sha512-KEu/iL4CYBzGza/2yZBLXqjCCZB/eRWkRLP8Vg2kkEWk4usC8HLGJW0QAhLS7U5DsAWumsisxgabuppE6NinLw==", "integrity": "sha512-2cErQRcsI8jIObUMVwcd1H2AWgGxwzozHJk7AKM2KB1taOp7L15xQ8kEsZrvVbOjNrb8yXtnSvNtJ+mhCB7EBg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@parcel/watcher": "^2.5.1", "@parcel/watcher": "^2.5.1",
"@tailwindcss/node": "4.1.13", "@tailwindcss/node": "4.1.14",
"@tailwindcss/oxide": "4.1.13", "@tailwindcss/oxide": "4.1.14",
"enhanced-resolve": "^5.18.3", "enhanced-resolve": "^5.18.3",
"mri": "^1.2.0", "mri": "^1.2.0",
"picocolors": "^1.1.1", "picocolors": "^1.1.1",
"tailwindcss": "4.1.13" "tailwindcss": "4.1.14"
}, },
"bin": { "bin": {
"tailwindcss": "dist/index.mjs" "tailwindcss": "dist/index.mjs"
} }
}, },
"node_modules/@tailwindcss/cli/node_modules/tailwindcss": {
"version": "4.1.12",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.12.tgz",
"integrity": "sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==",
"dev": true,
"license": "MIT"
},
"node_modules/@tailwindcss/forms": { "node_modules/@tailwindcss/forms": {
"version": "0.5.10", "version": "0.5.10",
"resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.10.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.10.tgz",
@@ -860,61 +854,54 @@
} }
}, },
"node_modules/@tailwindcss/node": { "node_modules/@tailwindcss/node": {
"version": "4.1.13", "version": "4.1.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.13.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.14.tgz",
"integrity": "sha512-eq3ouolC1oEFOAvOMOBAmfCIqZBJuvWvvYWh5h5iOYfe1HFC6+GZ6EIL0JdM3/niGRJmnrOc+8gl9/HGUaaptw==", "integrity": "sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@jridgewell/remapping": "^2.3.4", "@jridgewell/remapping": "^2.3.4",
"enhanced-resolve": "^5.18.3", "enhanced-resolve": "^5.18.3",
"jiti": "^2.5.1", "jiti": "^2.6.0",
"lightningcss": "1.30.1", "lightningcss": "1.30.1",
"magic-string": "^0.30.18", "magic-string": "^0.30.19",
"source-map-js": "^1.2.1", "source-map-js": "^1.2.1",
"tailwindcss": "4.1.13" "tailwindcss": "4.1.14"
} }
}, },
"node_modules/@tailwindcss/node/node_modules/tailwindcss": {
"version": "4.1.12",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.12.tgz",
"integrity": "sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==",
"dev": true,
"license": "MIT"
},
"node_modules/@tailwindcss/oxide": { "node_modules/@tailwindcss/oxide": {
"version": "4.1.13", "version": "4.1.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.13.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.14.tgz",
"integrity": "sha512-CPgsM1IpGRa880sMbYmG1s4xhAy3xEt1QULgTJGQmZUeNgXFR7s1YxYygmJyBGtou4SyEosGAGEeYqY7R53bIA==", "integrity": "sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==",
"dev": true, "dev": true,
"hasInstallScript": true, "hasInstallScript": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"detect-libc": "^2.0.4", "detect-libc": "^2.0.4",
"tar": "^7.4.3" "tar": "^7.5.1"
}, },
"engines": { "engines": {
"node": ">= 10" "node": ">= 10"
}, },
"optionalDependencies": { "optionalDependencies": {
"@tailwindcss/oxide-android-arm64": "4.1.13", "@tailwindcss/oxide-android-arm64": "4.1.14",
"@tailwindcss/oxide-darwin-arm64": "4.1.13", "@tailwindcss/oxide-darwin-arm64": "4.1.14",
"@tailwindcss/oxide-darwin-x64": "4.1.13", "@tailwindcss/oxide-darwin-x64": "4.1.14",
"@tailwindcss/oxide-freebsd-x64": "4.1.13", "@tailwindcss/oxide-freebsd-x64": "4.1.14",
"@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.13", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.14",
"@tailwindcss/oxide-linux-arm64-gnu": "4.1.13", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.14",
"@tailwindcss/oxide-linux-arm64-musl": "4.1.13", "@tailwindcss/oxide-linux-arm64-musl": "4.1.14",
"@tailwindcss/oxide-linux-x64-gnu": "4.1.13", "@tailwindcss/oxide-linux-x64-gnu": "4.1.14",
"@tailwindcss/oxide-linux-x64-musl": "4.1.13", "@tailwindcss/oxide-linux-x64-musl": "4.1.14",
"@tailwindcss/oxide-wasm32-wasi": "4.1.13", "@tailwindcss/oxide-wasm32-wasi": "4.1.14",
"@tailwindcss/oxide-win32-arm64-msvc": "4.1.13", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.14",
"@tailwindcss/oxide-win32-x64-msvc": "4.1.13" "@tailwindcss/oxide-win32-x64-msvc": "4.1.14"
} }
}, },
"node_modules/@tailwindcss/oxide-android-arm64": { "node_modules/@tailwindcss/oxide-android-arm64": {
"version": "4.1.13", "version": "4.1.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.13.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.14.tgz",
"integrity": "sha512-BrpTrVYyejbgGo57yc8ieE+D6VT9GOgnNdmh5Sac6+t0m+v+sKQevpFVpwX3pBrM2qKrQwJ0c5eDbtjouY/+ew==", "integrity": "sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -929,9 +916,9 @@
} }
}, },
"node_modules/@tailwindcss/oxide-darwin-arm64": { "node_modules/@tailwindcss/oxide-darwin-arm64": {
"version": "4.1.13", "version": "4.1.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.13.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.14.tgz",
"integrity": "sha512-YP+Jksc4U0KHcu76UhRDHq9bx4qtBftp9ShK/7UGfq0wpaP96YVnnjFnj3ZFrUAjc5iECzODl/Ts0AN7ZPOANQ==", "integrity": "sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -946,9 +933,9 @@
} }
}, },
"node_modules/@tailwindcss/oxide-darwin-x64": { "node_modules/@tailwindcss/oxide-darwin-x64": {
"version": "4.1.13", "version": "4.1.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.13.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.14.tgz",
"integrity": "sha512-aAJ3bbwrn/PQHDxCto9sxwQfT30PzyYJFG0u/BWZGeVXi5Hx6uuUOQEI2Fa43qvmUjTRQNZnGqe9t0Zntexeuw==", "integrity": "sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -963,9 +950,9 @@
} }
}, },
"node_modules/@tailwindcss/oxide-freebsd-x64": { "node_modules/@tailwindcss/oxide-freebsd-x64": {
"version": "4.1.13", "version": "4.1.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.13.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.14.tgz",
"integrity": "sha512-Wt8KvASHwSXhKE/dJLCCWcTSVmBj3xhVhp/aF3RpAhGeZ3sVo7+NTfgiN8Vey/Fi8prRClDs6/f0KXPDTZE6nQ==", "integrity": "sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -980,9 +967,9 @@
} }
}, },
"node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
"version": "4.1.13", "version": "4.1.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.13.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.14.tgz",
"integrity": "sha512-mbVbcAsW3Gkm2MGwA93eLtWrwajz91aXZCNSkGTx/R5eb6KpKD5q8Ueckkh9YNboU8RH7jiv+ol/I7ZyQ9H7Bw==", "integrity": "sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@@ -997,9 +984,9 @@
} }
}, },
"node_modules/@tailwindcss/oxide-linux-arm64-gnu": { "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
"version": "4.1.13", "version": "4.1.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.13.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.14.tgz",
"integrity": "sha512-wdtfkmpXiwej/yoAkrCP2DNzRXCALq9NVLgLELgLim1QpSfhQM5+ZxQQF8fkOiEpuNoKLp4nKZ6RC4kmeFH0HQ==", "integrity": "sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1014,9 +1001,9 @@
} }
}, },
"node_modules/@tailwindcss/oxide-linux-arm64-musl": { "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
"version": "4.1.13", "version": "4.1.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.13.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.14.tgz",
"integrity": "sha512-hZQrmtLdhyqzXHB7mkXfq0IYbxegaqTmfa1p9MBj72WPoDD3oNOh1Lnxf6xZLY9C3OV6qiCYkO1i/LrzEdW2mg==", "integrity": "sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1031,9 +1018,9 @@
} }
}, },
"node_modules/@tailwindcss/oxide-linux-x64-gnu": { "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
"version": "4.1.13", "version": "4.1.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.13.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.14.tgz",
"integrity": "sha512-uaZTYWxSXyMWDJZNY1Ul7XkJTCBRFZ5Fo6wtjrgBKzZLoJNrG+WderJwAjPzuNZOnmdrVg260DKwXCFtJ/hWRQ==", "integrity": "sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -1048,9 +1035,9 @@
} }
}, },
"node_modules/@tailwindcss/oxide-linux-x64-musl": { "node_modules/@tailwindcss/oxide-linux-x64-musl": {
"version": "4.1.13", "version": "4.1.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.13.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.14.tgz",
"integrity": "sha512-oXiPj5mi4Hdn50v5RdnuuIms0PVPI/EG4fxAfFiIKQh5TgQgX7oSuDWntHW7WNIi/yVLAiS+CRGW4RkoGSSgVQ==", "integrity": "sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -1065,9 +1052,9 @@
} }
}, },
"node_modules/@tailwindcss/oxide-wasm32-wasi": { "node_modules/@tailwindcss/oxide-wasm32-wasi": {
"version": "4.1.13", "version": "4.1.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.13.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.14.tgz",
"integrity": "sha512-+LC2nNtPovtrDwBc/nqnIKYh/W2+R69FA0hgoeOn64BdCX522u19ryLh3Vf3F8W49XBcMIxSe665kwy21FkhvA==", "integrity": "sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==",
"bundleDependencies": [ "bundleDependencies": [
"@napi-rs/wasm-runtime", "@napi-rs/wasm-runtime",
"@emnapi/core", "@emnapi/core",
@@ -1083,30 +1070,30 @@
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"@emnapi/core": "^1.4.5", "@emnapi/core": "^1.5.0",
"@emnapi/runtime": "^1.4.5", "@emnapi/runtime": "^1.5.0",
"@emnapi/wasi-threads": "^1.0.4", "@emnapi/wasi-threads": "^1.1.0",
"@napi-rs/wasm-runtime": "^0.2.12", "@napi-rs/wasm-runtime": "^1.0.5",
"@tybys/wasm-util": "^0.10.0", "@tybys/wasm-util": "^0.10.1",
"tslib": "^2.8.0" "tslib": "^2.4.0"
}, },
"engines": { "engines": {
"node": ">=14.0.0" "node": ">=14.0.0"
} }
}, },
"node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": {
"version": "1.4.5", "version": "1.5.0",
"dev": true, "dev": true,
"inBundle": true, "inBundle": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"@emnapi/wasi-threads": "1.0.4", "@emnapi/wasi-threads": "1.1.0",
"tslib": "^2.4.0" "tslib": "^2.4.0"
} }
}, },
"node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": {
"version": "1.4.5", "version": "1.5.0",
"dev": true, "dev": true,
"inBundle": true, "inBundle": true,
"license": "MIT", "license": "MIT",
@@ -1116,7 +1103,7 @@
} }
}, },
"node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": {
"version": "1.0.4", "version": "1.1.0",
"dev": true, "dev": true,
"inBundle": true, "inBundle": true,
"license": "MIT", "license": "MIT",
@@ -1126,19 +1113,19 @@
} }
}, },
"node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": {
"version": "0.2.12", "version": "1.0.5",
"dev": true, "dev": true,
"inBundle": true, "inBundle": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"@emnapi/core": "^1.4.3", "@emnapi/core": "^1.5.0",
"@emnapi/runtime": "^1.4.3", "@emnapi/runtime": "^1.5.0",
"@tybys/wasm-util": "^0.10.0" "@tybys/wasm-util": "^0.10.1"
} }
}, },
"node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": {
"version": "0.10.0", "version": "0.10.1",
"dev": true, "dev": true,
"inBundle": true, "inBundle": true,
"license": "MIT", "license": "MIT",
@@ -1148,16 +1135,16 @@
} }
}, },
"node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": {
"version": "2.8.0", "version": "2.8.1",
"dev": true, "dev": true,
"inBundle": true, "inBundle": true,
"license": "0BSD", "license": "0BSD",
"optional": true "optional": true
}, },
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": { "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
"version": "4.1.13", "version": "4.1.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.13.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.14.tgz",
"integrity": "sha512-dziTNeQXtoQ2KBXmrjCxsuPk3F3CQ/yb7ZNZNA+UkNTeiTGgfeh+gH5Pi7mRncVgcPD2xgHvkFCh/MhZWSgyQg==", "integrity": "sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1172,9 +1159,9 @@
} }
}, },
"node_modules/@tailwindcss/oxide-win32-x64-msvc": { "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
"version": "4.1.13", "version": "4.1.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.13.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.14.tgz",
"integrity": "sha512-3+LKesjXydTkHk5zXX01b5KMzLV1xl2mcktBJkje7rhFUpUlYJy7IMOLqjIRQncLTa1WZZiFY/foAeB5nmaiTw==", "integrity": "sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -1189,9 +1176,9 @@
} }
}, },
"node_modules/@tailwindcss/oxide/node_modules/detect-libc": { "node_modules/@tailwindcss/oxide/node_modules/detect-libc": {
"version": "2.1.0", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.0.tgz", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
"integrity": "sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"engines": { "engines": {
@@ -1199,14 +1186,12 @@
} }
}, },
"node_modules/@tailwindcss/typography": { "node_modules/@tailwindcss/typography": {
"version": "0.5.16", "version": "0.5.19",
"resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz",
"integrity": "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==", "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"lodash.castarray": "^4.4.0",
"lodash.isplainobject": "^4.0.6",
"lodash.merge": "^4.6.2",
"postcss-selector-parser": "6.0.10" "postcss-selector-parser": "6.0.10"
}, },
"peerDependencies": { "peerDependencies": {
@@ -1507,14 +1492,14 @@
"dev": true "dev": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "24.5.1", "version": "24.7.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.1.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.0.tgz",
"integrity": "sha512-/SQdmUP2xa+1rdx7VwB9yPq8PaKej8TD5cQ+XfKDPWWC+VDJU4rvVVagXqKUzhKjtFoNA8rXDJAkCxQPAe00+Q==", "integrity": "sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"undici-types": "~7.12.0" "undici-types": "~7.14.0"
} }
}, },
"node_modules/@types/prismjs": { "node_modules/@types/prismjs": {
@@ -1622,17 +1607,16 @@
"dev": true "dev": true
}, },
"node_modules/bare-events": { "node_modules/bare-events": {
"version": "2.6.1", "version": "2.7.0",
"resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.6.1.tgz", "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz",
"integrity": "sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==", "integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0"
"optional": true
}, },
"node_modules/bare-fs": { "node_modules/bare-fs": {
"version": "4.4.4", "version": "4.4.7",
"resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.4.tgz", "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.7.tgz",
"integrity": "sha512-Q8yxM1eLhJfuM7KXVP3zjhBvtMJCYRByoTT+wHXjpdMELv0xICFJX+1w4c7csa+WZEOsq4ItJ4RGwvzid6m/dw==", "integrity": "sha512-huJQxUWc2d1T+6dxnC/FoYpBgEHzJp33mYZqFtQqTTPPyP9xPvmjC16VpR4wTte4ZKd5VxkFAcfDYi51iwWMcg==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"optional": true, "optional": true,
@@ -1855,9 +1839,9 @@
} }
}, },
"node_modules/chromium-bidi": { "node_modules/chromium-bidi": {
"version": "8.0.0", "version": "9.1.0",
"resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-8.0.0.tgz", "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-9.1.0.tgz",
"integrity": "sha512-d1VmE0FD7lxZQHzcDUCKZSNRtRwISXDsdg4HjdTR5+Ll5nQ/vzU12JeNmupD6VWffrPSlrnGhEWlLESKH3VO+g==", "integrity": "sha512-rlUzQ4WzIAWdIbY/viPShhZU2n21CxDUgazXVbw4Hu1MwaeUSEksSeM6DqPgpRjCLXRk702AVRxJxoOz0dw4OA==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
@@ -2585,9 +2569,9 @@
} }
}, },
"node_modules/dayjs": { "node_modules/dayjs": {
"version": "1.11.13", "version": "1.11.18",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz",
"integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
@@ -2653,9 +2637,9 @@
} }
}, },
"node_modules/devtools-protocol": { "node_modules/devtools-protocol": {
"version": "0.0.1495869", "version": "0.0.1508733",
"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1495869.tgz", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1508733.tgz",
"integrity": "sha512-i+bkd9UYFis40RcnkW7XrOprCujXRAHg62IVh/Ah3G8MmNXpCGt1m0dTFhSdx/AVs8XEMbdOGRwdkR1Bcta8AA==", "integrity": "sha512-QJ1R5gtck6nDcdM+nlsaJXcelPEI7ZxSMw1ujHpO1c4+9l+Nue5qlebi9xO1Z2MGr92bFOQTW7/rrheh5hHxDg==",
"dev": true, "dev": true,
"license": "BSD-3-Clause" "license": "BSD-3-Clause"
}, },
@@ -2804,6 +2788,16 @@
"integrity": "sha512-ipiDYhdQSCZ4hSbX4rMW+XzNKMD1prg/sTvoVmSLkuQ1MVlwjJQQA+sW8tMYR3BLUr9KjodFV4pvzunvRhd33Q==", "integrity": "sha512-ipiDYhdQSCZ4hSbX4rMW+XzNKMD1prg/sTvoVmSLkuQ1MVlwjJQQA+sW8tMYR3BLUr9KjodFV4pvzunvRhd33Q==",
"dev": true "dev": true
}, },
"node_modules/events-universal": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz",
"integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"bare-events": "^2.7.0"
}
},
"node_modules/exsolve": { "node_modules/exsolve": {
"version": "1.0.7", "version": "1.0.7",
"resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz",
@@ -3150,9 +3144,9 @@
} }
}, },
"node_modules/jiti": { "node_modules/jiti": {
"version": "2.5.1", "version": "2.6.1",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
"integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==", "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"bin": { "bin": {
@@ -3189,9 +3183,9 @@
"dev": true "dev": true
}, },
"node_modules/katex": { "node_modules/katex": {
"version": "0.16.22", "version": "0.16.23",
"resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz", "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.23.tgz",
"integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==", "integrity": "sha512-7VlC1hsEEolL9xNO05v9VjrvWZePkCVBJqj8ruICxYjZfHaHbaU53AlP+PODyFIXEnaEIEWi3wJy7FPZ95JAVg==",
"dev": true, "dev": true,
"funding": [ "funding": [
"https://opencollective.com/katex", "https://opencollective.com/katex",
@@ -3490,9 +3484,9 @@
} }
}, },
"node_modules/lightningcss/node_modules/detect-libc": { "node_modules/lightningcss/node_modules/detect-libc": {
"version": "2.1.0", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.0.tgz", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
"integrity": "sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"engines": { "engines": {
@@ -3535,24 +3529,6 @@
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
"dev": true "dev": true
}, },
"node_modules/lodash.castarray": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
"integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==",
"dev": true
},
"node_modules/lodash.isplainobject": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
"integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
"dev": true
},
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true
},
"node_modules/loose-envify": { "node_modules/loose-envify": {
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
@@ -3585,16 +3561,16 @@
} }
}, },
"node_modules/marked": { "node_modules/marked": {
"version": "15.0.12", "version": "16.3.0",
"resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", "resolved": "https://registry.npmjs.org/marked/-/marked-16.3.0.tgz",
"integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", "integrity": "sha512-K3UxuKu6l6bmA5FUwYho8CfJBlsUWAooKtdGgMcERSpF7gcBUrCGsLH7wDaaNOzwq18JzSUDyoEb/YsrqMac3w==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"bin": { "bin": {
"marked": "bin/marked.js" "marked": "bin/marked.js"
}, },
"engines": { "engines": {
"node": ">= 18" "node": ">= 20"
} }
}, },
"node_modules/medium-zoom": { "node_modules/medium-zoom": {
@@ -3605,13 +3581,13 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/mermaid": { "node_modules/mermaid": {
"version": "11.11.0", "version": "11.12.0",
"resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.11.0.tgz", "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.12.0.tgz",
"integrity": "sha512-9lb/VNkZqWTRjVgCV+l1N+t4kyi94y+l5xrmBmbbxZYkfRl5hEDaTPMOcaWKCl1McG8nBEaMlWwkcAEEgjhBgg==", "integrity": "sha512-ZudVx73BwrMJfCFmSSJT84y6u5brEoV8DOItdHomNLz32uBjNrelm7mg95X7g+C6UoQH/W6mBLGDEDv73JdxBg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@braintree/sanitize-url": "^7.0.4", "@braintree/sanitize-url": "^7.1.1",
"@iconify/utils": "^3.0.1", "@iconify/utils": "^3.0.1",
"@mermaid-js/parser": "^0.6.2", "@mermaid-js/parser": "^0.6.2",
"@types/d3": "^7.4.3", "@types/d3": "^7.4.3",
@@ -3621,12 +3597,12 @@
"d3": "^7.9.0", "d3": "^7.9.0",
"d3-sankey": "^0.12.3", "d3-sankey": "^0.12.3",
"dagre-d3-es": "7.0.11", "dagre-d3-es": "7.0.11",
"dayjs": "^1.11.13", "dayjs": "^1.11.18",
"dompurify": "^3.2.5", "dompurify": "^3.2.5",
"katex": "^0.16.22", "katex": "^0.16.22",
"khroma": "^2.1.0", "khroma": "^2.1.0",
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"marked": "^15.0.7", "marked": "^16.2.1",
"roughjs": "^4.6.6", "roughjs": "^4.6.6",
"stylis": "^4.3.6", "stylis": "^4.3.6",
"ts-dedent": "^2.2.0", "ts-dedent": "^2.2.0",
@@ -3680,9 +3656,9 @@
} }
}, },
"node_modules/minizlib": { "node_modules/minizlib": {
"version": "3.0.2", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
"integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@@ -3699,22 +3675,6 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/mkdirp": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
"integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
"dev": true,
"license": "MIT",
"bin": {
"mkdirp": "dist/cjs/src/bin.js"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/mlly": { "node_modules/mlly": {
"version": "1.8.0", "version": "1.8.0",
"resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz",
@@ -4108,18 +4068,18 @@
} }
}, },
"node_modules/puppeteer": { "node_modules/puppeteer": {
"version": "24.21.0", "version": "24.23.0",
"resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.21.0.tgz", "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.23.0.tgz",
"integrity": "sha512-JNY9JluUXepKzqKoPHsNVsrkpRRTare8geNP2L8YMkFHOKIvWSki/yUL9l2VJpani49epEHLpVg+zDcbTYibWA==", "integrity": "sha512-BVR1Lg8sJGKXY79JARdIssFWK2F6e1j+RyuJP66w4CUmpaXjENicmA3nNpUXA8lcTdDjAndtP+oNdni3T/qQqA==",
"dev": true, "dev": true,
"hasInstallScript": true, "hasInstallScript": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@puppeteer/browsers": "2.10.10", "@puppeteer/browsers": "2.10.10",
"chromium-bidi": "8.0.0", "chromium-bidi": "9.1.0",
"cosmiconfig": "^9.0.0", "cosmiconfig": "^9.0.0",
"devtools-protocol": "0.0.1495869", "devtools-protocol": "0.0.1508733",
"puppeteer-core": "24.21.0", "puppeteer-core": "24.23.0",
"typed-query-selector": "^2.12.0" "typed-query-selector": "^2.12.0"
}, },
"bin": { "bin": {
@@ -4130,18 +4090,18 @@
} }
}, },
"node_modules/puppeteer-core": { "node_modules/puppeteer-core": {
"version": "24.21.0", "version": "24.23.0",
"resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.21.0.tgz", "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.23.0.tgz",
"integrity": "sha512-WR4FehOs4XJ8OSp7MkGyVB4mfMs9Q6t8Y48TxiTCRxc8G2lJ5OKYPJvgU80dtKl+aIqIbdcNTgIooY49S5SsmA==", "integrity": "sha512-yl25C59gb14sOdIiSnJ08XiPP+O2RjuyZmEG+RjYmCXO7au0jcLf7fRiyii96dXGUBW7Zwei/mVKfxMx/POeFw==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@puppeteer/browsers": "2.10.10", "@puppeteer/browsers": "2.10.10",
"chromium-bidi": "8.0.0", "chromium-bidi": "9.1.0",
"debug": "^4.4.3", "debug": "^4.4.3",
"devtools-protocol": "0.0.1495869", "devtools-protocol": "0.0.1508733",
"typed-query-selector": "^2.12.0", "typed-query-selector": "^2.12.0",
"webdriver-bidi-protocol": "0.2.11", "webdriver-bidi-protocol": "0.3.6",
"ws": "^8.18.3" "ws": "^8.18.3"
}, },
"engines": { "engines": {
@@ -4268,9 +4228,9 @@
} }
}, },
"node_modules/semver": { "node_modules/semver": {
"version": "7.7.2", "version": "7.7.3",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"dev": true, "dev": true,
"license": "ISC", "license": "ISC",
"bin": { "bin": {
@@ -4376,17 +4336,15 @@
} }
}, },
"node_modules/streamx": { "node_modules/streamx": {
"version": "2.22.1", "version": "2.23.0",
"resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz",
"integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"events-universal": "^1.0.0",
"fast-fifo": "^1.3.2", "fast-fifo": "^1.3.2",
"text-decoder": "^1.1.0" "text-decoder": "^1.1.0"
},
"optionalDependencies": {
"bare-events": "^2.2.0"
} }
}, },
"node_modules/string-width": { "node_modules/string-width": {
@@ -4526,15 +4484,15 @@
} }
}, },
"node_modules/tailwindcss": { "node_modules/tailwindcss": {
"version": "4.1.13", "version": "4.1.14",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.13.tgz", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.14.tgz",
"integrity": "sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w==", "integrity": "sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/tapable": { "node_modules/tapable": {
"version": "2.2.3", "version": "2.3.0",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
"integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@@ -4546,17 +4504,16 @@
} }
}, },
"node_modules/tar": { "node_modules/tar": {
"version": "7.4.3", "version": "7.5.1",
"resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz",
"integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==",
"dev": true, "dev": true,
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@isaacs/fs-minipass": "^4.0.0", "@isaacs/fs-minipass": "^4.0.0",
"chownr": "^3.0.0", "chownr": "^3.0.0",
"minipass": "^7.1.2", "minipass": "^7.1.2",
"minizlib": "^3.0.1", "minizlib": "^3.1.0",
"mkdirp": "^3.0.1",
"yallist": "^5.0.0" "yallist": "^5.0.0"
}, },
"engines": { "engines": {
@@ -4591,9 +4548,9 @@
} }
}, },
"node_modules/tar-stream/node_modules/b4a": { "node_modules/tar-stream/node_modules/b4a": {
"version": "1.7.1", "version": "1.7.3",
"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.1.tgz", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz",
"integrity": "sha512-ZovbrBV0g6JxK5cGUF1Suby1vLfKjv4RWi8IxoaO/Mon8BDD9I21RxjHFtgQ+kskJqLAVyQZly3uMBui+vhc8Q==", "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"peerDependencies": { "peerDependencies": {
@@ -4616,9 +4573,9 @@
} }
}, },
"node_modules/text-decoder/node_modules/b4a": { "node_modules/text-decoder/node_modules/b4a": {
"version": "1.7.1", "version": "1.7.3",
"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.1.tgz", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz",
"integrity": "sha512-ZovbrBV0g6JxK5cGUF1Suby1vLfKjv4RWi8IxoaO/Mon8BDD9I21RxjHFtgQ+kskJqLAVyQZly3uMBui+vhc8Q==", "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"peerDependencies": { "peerDependencies": {
@@ -4718,9 +4675,9 @@
} }
}, },
"node_modules/undici-types": { "node_modules/undici-types": {
"version": "7.12.0", "version": "7.14.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz",
"integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==", "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"optional": true "optional": true
@@ -4825,9 +4782,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/webdriver-bidi-protocol": { "node_modules/webdriver-bidi-protocol": {
"version": "0.2.11", "version": "0.3.6",
"resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.2.11.tgz", "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.3.6.tgz",
"integrity": "sha512-Y9E1/oi4XMxcR8AT0ZC4OvYntl34SPgwjmELH+owjBr0korAX4jKgZULBWILGCVGdVCQ0dodTToIETozhG8zvA==", "integrity": "sha512-mlGndEOA9yK9YAbvtxaPTqdi/kaCWYYfwrZvGzcmkr/3lWM+tQj53BxtpVd6qbC6+E5OnHXgCcAhre6AkXzxjA==",
"dev": true, "dev": true,
"license": "Apache-2.0" "license": "Apache-2.0"
}, },
+7 -7
View File
@@ -37,22 +37,22 @@
"homepage": "https://github.com/nunocoracao/blowfish#readme", "homepage": "https://github.com/nunocoracao/blowfish#readme",
"devDependencies": { "devDependencies": {
"@awmottaz/prettier-plugin-void-html": "^1.9.0", "@awmottaz/prettier-plugin-void-html": "^1.9.0",
"@tailwindcss/cli": "^4.1.13", "@tailwindcss/cli": "^4.1.14",
"@tailwindcss/typography": "^0.5.16", "@tailwindcss/typography": "^0.5.19",
"chart.js": "^4.5.0", "chart.js": "^4.5.0",
"fuse.js": "^7.1.0", "fuse.js": "^7.1.0",
"jquery": "^3.7.1", "jquery": "^3.7.1",
"katex": "^0.16.22", "katex": "^0.16.23",
"lite-youtube-embed": "^0.3.3", "lite-youtube-embed": "^0.3.3",
"medium-zoom": "^1.1.0", "medium-zoom": "^1.1.0",
"mermaid": "^11.11.0", "mermaid": "^11.12.0",
"packery": "^3.0.0", "packery": "^3.0.0",
"prettier": "^3.6.2", "prettier": "^3.6.2",
"prettier-plugin-go-template": "^0.0.15", "prettier-plugin-go-template": "^0.0.15",
"puppeteer": "^24.21.0", "puppeteer": "^24.23.0",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"tailwind-scrollbar": "^4.0.2", "tailwind-scrollbar": "^4.0.2",
"tailwindcss": "^4.1.13", "tailwindcss": "^4.1.14",
"tw-elements": "2.0.0", "tw-elements": "2.0.0",
"typeit": "^8.8.7", "typeit": "^8.8.7",
"vendor-copy": "^3.0.1" "vendor-copy": "^3.0.1"
@@ -121,7 +121,7 @@
} }
], ],
"dependencies": { "dependencies": {
"@headlessui/react": "^2.2.8", "@headlessui/react": "^2.2.9",
"@heroicons/react": "^2.2.0", "@heroicons/react": "^2.2.0",
"@iamtraction/google-translate": "^2.0.1", "@iamtraction/google-translate": "^2.0.1",
"@tailwindcss/forms": "^0.5.10", "@tailwindcss/forms": "^0.5.10",
+1 -1
View File
@@ -1 +1 @@
v0.150.0 v0.151.0
+2 -1
View File
@@ -2,9 +2,10 @@ module.exports = {
content: [ content: [
"./layouts/**/*.html", "./layouts/**/*.html",
"./content/**/*.{html,md}", "./content/**/*.{html,md}",
"./node_modules/tw-elements/js/**/*.js",
"./themes/blowfish/layouts/**/*.html", "./themes/blowfish/layouts/**/*.html",
"./themes/blowfish/content/**/*.{html,md}", "./themes/blowfish/content/**/*.{html,md}",
"./node_modules/tw-elements/js/**/*.js", "./themes/blowfish/node_modules/tw-elements/js/**/*.js",
], ],
darkMode: "class", darkMode: "class",
theme: { theme: {