diff --git a/src/components/ArchivePanel.astro b/src/components/ArchivePanel.astro
index 243bd30..c82dbf5 100644
--- a/src/components/ArchivePanel.astro
+++ b/src/components/ArchivePanel.astro
@@ -6,9 +6,9 @@ import I18nKey from "../i18n/i18nKey";
import {UNCATEGORIZED} from "@constants/constants";
interface Props {
- keyword: string;
- tags: string[];
- categories: string[];
+ keyword?: string;
+ tags?: string[];
+ categories?: string[];
}
const { keyword, tags, categories} = Astro.props;
@@ -27,8 +27,8 @@ if (Array.isArray(categories) && categories.length > 0) {
);
}
-const groups = function () {
- const groupedPosts = posts.reduce((grouped, post) => {
+const groups: {year: number, posts: typeof posts}[] = function () {
+ const groupedPosts = posts.reduce((grouped: {[year: number]: typeof posts}, post) => {
const year = post.data.published.getFullYear()
if (!grouped[year]) {
grouped[year] = []
@@ -39,8 +39,8 @@ const groups = function () {
// convert the object to an array
const groupedPostsArray = Object.keys(groupedPosts).map(key => ({
- year: key,
- posts: groupedPosts[key]
+ year: parseInt(key),
+ posts: groupedPosts[parseInt(key)]
}))
// sort years by latest first
diff --git a/src/components/Navbar.astro b/src/components/Navbar.astro
index 5b7a78c..90f70d7 100644
--- a/src/components/Navbar.astro
+++ b/src/components/Navbar.astro
@@ -1,7 +1,7 @@
---
import { Icon } from 'astro-icon/components';
import DisplaySettings from "./widget/DisplaySettings.svelte";
-import {LinkPreset, NavBarLink} from "../types/config";
+import {LinkPreset, type NavBarLink} from "../types/config";
import {navBarConfig, siteConfig} from "../config";
import NavMenuPanel from "./widget/NavMenuPanel.astro";
import Search from "./Search.svelte";
@@ -34,7 +34,7 @@ let links: NavBarLink[] = navBarConfig.links.map((item: NavBarLink | LinkPreset)
>
{l.name}
- {l.external && }
+ {l.external && }
;
})}
@@ -80,22 +80,20 @@ function switchTheme() {
function loadButtonScript() {
let switchBtn = document.getElementById("scheme-switch");
- switchBtn.addEventListener("click", function () {
+ switchBtn!.addEventListener("click", function () {
switchTheme()
});
let settingBtn = document.getElementById("display-settings-switch");
- if (settingBtn) {
- settingBtn.addEventListener("click", function () {
- let settingPanel = document.getElementById("display-setting");
- settingPanel.classList.toggle("float-panel-closed");
- });
- }
+ settingBtn!.addEventListener("click", function () {
+ let settingPanel = document.getElementById("display-setting");
+ settingPanel!.classList.toggle("float-panel-closed");
+ });
let menuBtn = document.getElementById("nav-menu-switch");
- menuBtn.addEventListener("click", function () {
+ menuBtn!.addEventListener("click", function () {
let menuPanel = document.getElementById("nav-menu-panel");
- menuPanel.classList.toggle("float-panel-closed");
+ menuPanel!.classList.toggle("float-panel-closed");
});
}
diff --git a/src/components/PostCard.astro b/src/components/PostCard.astro
index f1d4769..44ab3c8 100644
--- a/src/components/PostCard.astro
+++ b/src/components/PostCard.astro
@@ -8,7 +8,7 @@ import I18nKey from "../i18n/i18nKey";
import {getDir} from "../utils/url-utils";
interface Props {
- class: string;
+ class?: string;
entry: any;
title: string;
url: string;
@@ -17,11 +17,10 @@ interface Props {
category: string;
image: string;
description: string;
- words: number;
draft: boolean;
style: string;
}
-const { entry, title, url, published, tags, category, image, description, words, style } = Astro.props;
+const { entry, title, url, published, tags, category, image, description, style } = Astro.props;
const className = Astro.props.class;
const hasCover = image !== undefined && image !== null && image !== '';
diff --git a/src/components/PostMeta.astro b/src/components/PostMeta.astro
index 34ec1d0..3a0c7f2 100644
--- a/src/components/PostMeta.astro
+++ b/src/components/PostMeta.astro
@@ -10,9 +10,9 @@ interface Props {
published: Date;
tags: string[];
category: string;
- hideTagsForMobile: boolean;
+ hideTagsForMobile?: boolean;
}
-const {published, tags, category, hideTagsForMobile} = Astro.props;
+const {published, tags, category, hideTagsForMobile = false} = Astro.props;
const className = Astro.props.class;
---
diff --git a/src/components/control/ButtonLink.astro b/src/components/control/ButtonLink.astro
index b58d920..154306e 100644
--- a/src/components/control/ButtonLink.astro
+++ b/src/components/control/ButtonLink.astro
@@ -4,9 +4,9 @@ interface Props {
url?: string
label?: string
}
-const { badge, url, name } = Astro.props
+const { badge, url, label } = Astro.props
---
-
+
diff --git a/src/components/widget/Profile.astro b/src/components/widget/Profile.astro
index 4d949a4..f92f309 100644
--- a/src/components/widget/Profile.astro
+++ b/src/components/widget/Profile.astro
@@ -16,7 +16,7 @@ const config = profileConfig;
class="transition opacity-0 scale-90 group-hover:scale-100 group-hover:opacity-100 text-white text-5xl">
-
+
{config.name}
diff --git a/src/components/widget/WidgetLayout.astro b/src/components/widget/WidgetLayout.astro
index 8e58486..8dd410b 100644
--- a/src/components/widget/WidgetLayout.astro
+++ b/src/components/widget/WidgetLayout.astro
@@ -21,7 +21,7 @@ const {
const className = Astro.props.class
---
-
+
{name}
@@ -31,7 +31,7 @@ const className = Astro.props.class
{isCollapsed &&
}
@@ -48,15 +48,15 @@ const className = Astro.props.class
constructor() {
super();
- if (this.dataset.isCollapsed === undefined || this.dataset.isCollapsed === false)
+ if (this.dataset.isCollapsed !== "true")
return;
const id = this.dataset.id;
const btn = this.querySelector('.expand-btn');
const wrapper = this.querySelector(`#${id}`)
- btn.addEventListener('click', () => {
- wrapper.classList.remove('collapsed');
- btn.classList.add('hidden');
+ btn!.addEventListener('click', () => {
+ wrapper!.classList.remove('collapsed');
+ btn!.classList.add('hidden');
})
}
}
diff --git a/src/content/config.ts b/src/content/config.ts
index 5066aaa..b448dd9 100644
--- a/src/content/config.ts
+++ b/src/content/config.ts
@@ -4,11 +4,17 @@ const postsCollection = defineCollection({
schema: z.object({
title: z.string(),
published: z.date(),
- draft: z.boolean().optional(),
- description: z.string().optional(),
- image: z.string().optional(),
- tags: z.array(z.string()).optional(),
- category: z.string().optional(),
+ draft: z.boolean().optional().default(false),
+ description: z.string().optional().default(""),
+ image: z.string().optional().default(""),
+ tags: z.array(z.string()).optional().default([]),
+ category: z.string().optional().default(""),
+
+ /* For internal use */
+ prevTitle: z.string().default(""),
+ prevSlug: z.string().default(""),
+ nextTitle: z.string().default(""),
+ nextSlug: z.string().default(""),
}),
})
export const collections = {
diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro
index f1837a4..70bdf3c 100644
--- a/src/layouts/Layout.astro
+++ b/src/layouts/Layout.astro
@@ -8,14 +8,14 @@ import ImageWrapper from "@components/misc/ImageWrapper.astro";
import {pathsEqual} from "@utils/url-utils";
import ConfigCarrier from "@components/ConfigCarrier.astro";
import {profileConfig, siteConfig} from "@/config";
-import {Favicon} from "../types/config";
+import {type Favicon} from "../types/config";
import {defaultFavicons} from "../constants/icon";
import {LIGHT_MODE, DARK_MODE, AUTO_MODE, DEFAULT_THEME} from "../constants/constants";
import {url} from "../utils/url-utils";
interface Props {
- title: string;
- banner: string;
+ title?: string;
+ banner?: string;
description?: string;
}
@@ -23,8 +23,6 @@ let { title, banner, description } = Astro.props;
const isHomePage = pathsEqual(Astro.url.pathname, '/');
-const testPathName = Astro.url.pathname;
-
const anim = {
old: {
name: 'fadeIn',
@@ -73,7 +71,7 @@ const siteLang = siteConfig.lang.replace('_', '-')
---
-
+
{pageTitle}
@@ -232,13 +230,14 @@ function setClickOutsideToClose(panel: string, ignores: string[]) {
document.addEventListener("click", event => {
let panelDom = document.getElementById(panel);
let tDom = event.target;
+ if (!(tDom instanceof Node)) return; // Ensure the event target is an HTML Node
for (let ig of ignores) {
let ie = document.getElementById(ig)
if (ie == tDom || (ie?.contains(tDom))) {
return;
}
}
- panelDom.classList.add("float-panel-closed");
+ panelDom!.classList.add("float-panel-closed");
});
}
setClickOutsideToClose("display-setting", ["display-setting", "display-settings-switch"])
@@ -257,7 +256,8 @@ function loadHue() {
function setBannerHeight() {
const banner = document.getElementById('banner-wrapper');
- if (document.documentElement.hasAttribute('isHome')) {
+ if (!banner) return
+ if (document.documentElement.dataset.isHome === "true") {
banner.classList.remove('banner-else');
banner.classList.add('banner-home');
} else {
@@ -267,11 +267,13 @@ function setBannerHeight() {
}
function initCustomScrollbar() {
+ const bodyElement = document.querySelector('body');
+ if (!bodyElement) return;
OverlayScrollbars(
// docs say that a initialization to the body element would affect native functionality like window.scrollTo
// but just leave it here for now
{
- target: document.querySelector('body'),
+ target: bodyElement,
cancel: {
nativeScrollbarsOverlaid: true, // don't initialize the overlay scrollbar if there is a native one
}
diff --git a/src/layouts/MainGridLayout.astro b/src/layouts/MainGridLayout.astro
index e687d79..18301ab 100644
--- a/src/layouts/MainGridLayout.astro
+++ b/src/layouts/MainGridLayout.astro
@@ -8,7 +8,7 @@ import BackToTop from "@components/control/BackToTop.astro";
import {siteConfig} from "@/config";
interface Props {
- title: string;
+ title?: string;
banner?: string;
description?: string;
}
diff --git a/src/pages/archive/category/[category].astro b/src/pages/archive/category/[category].astro
index 88aa0d3..33af063 100644
--- a/src/pages/archive/category/[category].astro
+++ b/src/pages/archive/category/[category].astro
@@ -16,7 +16,7 @@ export async function getStaticPaths() {
});
}
-const { category } = Astro.params;
+const category = Astro.params.category as string;
---
diff --git a/src/pages/archive/tag/[tag].astro b/src/pages/archive/tag/[tag].astro
index ce132a4..0e68b65 100644
--- a/src/pages/archive/tag/[tag].astro
+++ b/src/pages/archive/tag/[tag].astro
@@ -5,7 +5,6 @@ import ArchivePanel from "@components/ArchivePanel.astro";
import {i18n} from "@i18n/translation";
import I18nKey from "@i18n/i18nKey";
-
export async function getStaticPaths() {
let posts = await getSortedPosts()
@@ -25,7 +24,7 @@ export async function getStaticPaths() {
});
}
-const { tag } = Astro.params;
+const tag= Astro.params.tag as string;
---
diff --git a/src/pages/posts/[...slug].astro b/src/pages/posts/[...slug].astro
index 20bbe8c..7191bdc 100644
--- a/src/pages/posts/[...slug].astro
+++ b/src/pages/posts/[...slug].astro
@@ -108,21 +108,23 @@ const jsonLd = {
diff --git a/src/utils/setting-utils.ts b/src/utils/setting-utils.ts
index 6471901..dc5d1da 100644
--- a/src/utils/setting-utils.ts
+++ b/src/utils/setting-utils.ts
@@ -14,11 +14,11 @@ export function getHue(): number {
export function setHue(hue: number): void {
localStorage.setItem('hue', String(hue))
- const r = document.querySelector(':root')
+ const r = document.querySelector(':root') as HTMLElement
if (!r) {
return
}
- r.style.setProperty('--hue', hue)
+ r.style.setProperty('--hue', String(hue))
}
diff --git a/src/utils/url-utils.ts b/src/utils/url-utils.ts
index 6b8e545..f2829ee 100644
--- a/src/utils/url-utils.ts
+++ b/src/utils/url-utils.ts
@@ -12,13 +12,11 @@ function joinUrl(...parts: string[]): string {
return joined.replace(/\/+/g, '/');
}
-export function getPostUrlBySlug(slug: string): string | null {
- if (!slug) return null
+export function getPostUrlBySlug(slug: string): string {
return url(`/posts/${slug}/`)
}
-export function getCategoryUrl(category: string): string | null {
- if (!category) return null
+export function getCategoryUrl(category: string): string {
if (category === i18n(i18nKey.uncategorized))
return url('/archive/category/uncategorized/')
return url(`/archive/category/${category}/`)