@xingwangzhe/stalux 1.24.2 → 1.24.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -2
- package/src/components/stalux/layout/head.astro +105 -36
- package/src/pages/links.astro +6 -7
- package/src/assets/BiCcCircle.svg +0 -1
- package/src/assets/astro.svg +0 -1
- package/src/assets/background.svg +0 -1
- package/src/internal/pagefind.ts +0 -41
- package/src/styles/components/posts/postCategories.module.css +0 -50
- package/src/styles/components/posts/postLeft.module.css +0 -38
- package/src/styles/components/posts/postRight.module.css +0 -60
- package/src/styles/components/posts/postTags.module.css +0 -51
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xingwangzhe/stalux",
|
|
3
|
-
"version": "1.24.
|
|
3
|
+
"version": "1.24.4",
|
|
4
4
|
"description": "A powerful, modern Astro blog theme — use as template or install as plugin",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"astro",
|
|
@@ -100,7 +100,6 @@
|
|
|
100
100
|
"devDependencies": {
|
|
101
101
|
"astro": "^7.2.3",
|
|
102
102
|
"knip": "^6.32.2",
|
|
103
|
-
"license-checker-rseidelsohn": "5.0.1",
|
|
104
103
|
"oxfmt": "^0.64.0",
|
|
105
104
|
"oxlint": "^1.79.0",
|
|
106
105
|
"typescript": "^7.0.2"
|
|
@@ -43,8 +43,6 @@ interface Props {
|
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
const props = Astro.props as Props;
|
|
46
|
-
const effectiveTitle = siteConfig.seoTitle || props.title;
|
|
47
|
-
const effectiveDescription = props.description;
|
|
48
46
|
const isArticle = props.isArticle ?? false;
|
|
49
47
|
|
|
50
48
|
const canonicalBase = siteConfig.canonical || siteConfig.url;
|
|
@@ -68,12 +66,20 @@ const isNotFoundPage =
|
|
|
68
66
|
Astro.url.pathname === "/404" || Astro.url.pathname === "/404/";
|
|
69
67
|
const routeKind = getRouteKind(Astro.url.pathname);
|
|
70
68
|
const isCollectionPage = routeKind.endsWith("-index") || routeKind.endsWith("-detail");
|
|
69
|
+
// seoTitle 是首页的搜索标题,不应覆盖文章/分类等内页标题。
|
|
70
|
+
const effectiveTitle = routeKind === "home" && siteConfig.seoTitle ? siteConfig.seoTitle : props.title;
|
|
71
|
+
const effectiveDescription = props.description;
|
|
72
|
+
const siteTitleSuffix = siteConfig.title ? ` | ${siteConfig.title}` : "";
|
|
73
|
+
const contentTitle =
|
|
74
|
+
siteTitleSuffix && effectiveTitle.endsWith(siteTitleSuffix)
|
|
75
|
+
? effectiveTitle.slice(0, -siteTitleSuffix.length)
|
|
76
|
+
: effectiveTitle;
|
|
71
77
|
const resolvedNoindex = Boolean(siteConfig.noindex) || isNotFoundPage || Boolean(props.noindex);
|
|
72
78
|
const resolvedNofollow = Boolean(siteConfig.nofollow) || isNotFoundPage;
|
|
73
79
|
|
|
74
80
|
const openGraphConfig: Record<string, unknown> = {
|
|
75
81
|
basic: {
|
|
76
|
-
title:
|
|
82
|
+
title: contentTitle,
|
|
77
83
|
type: isArticle ? "article" : "website",
|
|
78
84
|
image: ogImagePath,
|
|
79
85
|
url: canonicalUrl,
|
|
@@ -85,7 +91,7 @@ const openGraphConfig: Record<string, unknown> = {
|
|
|
85
91
|
},
|
|
86
92
|
image: {
|
|
87
93
|
url: ogImagePath,
|
|
88
|
-
alt:
|
|
94
|
+
alt: contentTitle,
|
|
89
95
|
},
|
|
90
96
|
};
|
|
91
97
|
|
|
@@ -101,11 +107,11 @@ if (isArticle) {
|
|
|
101
107
|
}
|
|
102
108
|
|
|
103
109
|
const twitterConfig = {
|
|
104
|
-
card: "summary_large_image" as TwitterCardType,
|
|
105
|
-
title:
|
|
110
|
+
card: (props.cover ? "summary_large_image" : "summary") as TwitterCardType,
|
|
111
|
+
title: contentTitle,
|
|
106
112
|
description: effectiveDescription,
|
|
107
113
|
image: ogImagePath,
|
|
108
|
-
imageAlt:
|
|
114
|
+
imageAlt: contentTitle,
|
|
109
115
|
...(siteConfig.twitterSite ? { site: siteConfig.twitterSite } : {}),
|
|
110
116
|
};
|
|
111
117
|
|
|
@@ -140,6 +146,14 @@ const extendedLink = [
|
|
|
140
146
|
const extendedMeta = [
|
|
141
147
|
{ name: "viewport", content: "width=device-width, initial-scale=1" },
|
|
142
148
|
{ name: "color-scheme", content: "dark" },
|
|
149
|
+
...(!resolvedNoindex
|
|
150
|
+
? [
|
|
151
|
+
{
|
|
152
|
+
name: "googlebot",
|
|
153
|
+
content: "max-image-preview:large, max-snippet:-1, max-video-preview:-1",
|
|
154
|
+
},
|
|
155
|
+
]
|
|
156
|
+
: []),
|
|
143
157
|
];
|
|
144
158
|
|
|
145
159
|
let schema: Record<string, unknown>;
|
|
@@ -148,55 +162,111 @@ const sameAs = mediaLinksConfig?.items
|
|
|
148
162
|
.filter((link) => /^https?:\/\//i.test(link));
|
|
149
163
|
const authorEntity = {
|
|
150
164
|
"@type": "Person",
|
|
165
|
+
"@id": `${siteUrl}/#author`,
|
|
151
166
|
name: authorConfig.name,
|
|
167
|
+
url: `${siteUrl}/about/`,
|
|
152
168
|
...(toAbsolute(authorConfig.avatar) ? { image: toAbsolute(authorConfig.avatar) } : {}),
|
|
153
169
|
...(sameAs.length ? { sameAs } : {}),
|
|
154
170
|
};
|
|
155
171
|
const publisher = {
|
|
156
172
|
"@type": "Organization",
|
|
173
|
+
"@id": `${siteUrl}/#publisher`,
|
|
157
174
|
name: siteName,
|
|
158
175
|
url: siteUrl,
|
|
159
176
|
...(authorConfig.avatar ? { logo: toAbsolute(authorConfig.avatar) } : {}),
|
|
160
177
|
};
|
|
178
|
+
const websiteEntity = {
|
|
179
|
+
"@type": "WebSite",
|
|
180
|
+
"@id": `${siteUrl}/#website`,
|
|
181
|
+
url: `${siteUrl}/`,
|
|
182
|
+
name: siteName,
|
|
183
|
+
description: siteConfig.description,
|
|
184
|
+
inLanguage: siteConfig.lang || "zh-CN",
|
|
185
|
+
publisher: { "@id": `${siteUrl}/#publisher` },
|
|
186
|
+
};
|
|
187
|
+
const breadcrumbItems: Record<string, unknown>[] = [
|
|
188
|
+
{
|
|
189
|
+
"@type": "ListItem",
|
|
190
|
+
position: 1,
|
|
191
|
+
name: siteName,
|
|
192
|
+
item: `${siteUrl}/`,
|
|
193
|
+
},
|
|
194
|
+
];
|
|
195
|
+
if (isArticle && props.categories?.[0]) {
|
|
196
|
+
breadcrumbItems.push({
|
|
197
|
+
"@type": "ListItem",
|
|
198
|
+
position: breadcrumbItems.length + 1,
|
|
199
|
+
name: props.categories[0],
|
|
200
|
+
item: `${siteUrl}/categories/${encodeURIComponent(props.categories[0])}/`,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
if (routeKind !== "home") {
|
|
204
|
+
breadcrumbItems.push({
|
|
205
|
+
"@type": "ListItem",
|
|
206
|
+
position: breadcrumbItems.length + 1,
|
|
207
|
+
name: contentTitle,
|
|
208
|
+
item: canonicalUrl,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
const breadcrumbEntity = {
|
|
212
|
+
"@type": "BreadcrumbList",
|
|
213
|
+
"@id": `${canonicalUrl}#breadcrumb`,
|
|
214
|
+
itemListElement: breadcrumbItems,
|
|
215
|
+
};
|
|
161
216
|
if (isArticle) {
|
|
162
217
|
schema = {
|
|
163
218
|
"@context": "https://schema.org",
|
|
164
|
-
"@
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
219
|
+
"@graph": [
|
|
220
|
+
websiteEntity,
|
|
221
|
+
authorEntity,
|
|
222
|
+
publisher,
|
|
223
|
+
breadcrumbEntity,
|
|
224
|
+
{
|
|
225
|
+
"@type": "BlogPosting",
|
|
226
|
+
"@id": `${canonicalUrl}#article`,
|
|
227
|
+
headline: contentTitle,
|
|
228
|
+
description: effectiveDescription,
|
|
229
|
+
url: canonicalUrl,
|
|
230
|
+
...(ogImagePath ? { image: ogImagePath } : {}),
|
|
231
|
+
...(props.date ? { datePublished: props.date } : {}),
|
|
232
|
+
...(props.updated || props.date ? { dateModified: props.updated || props.date } : {}),
|
|
233
|
+
...(props.tags?.length ? { keywords: props.tags.join(", ") } : {}),
|
|
234
|
+
...(props.categories?.length ? { articleSection: props.categories } : {}),
|
|
235
|
+
author: { "@id": `${siteUrl}/#author`, ...(props.author ? { name: props.author } : {}) },
|
|
236
|
+
publisher: { "@id": `${siteUrl}/#publisher` },
|
|
237
|
+
isPartOf: { "@id": `${siteUrl}/#website` },
|
|
238
|
+
inLanguage: siteConfig.lang || "zh-CN",
|
|
239
|
+
mainEntityOfPage: {
|
|
240
|
+
"@type": "WebPage",
|
|
241
|
+
"@id": canonicalUrl,
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
],
|
|
179
245
|
};
|
|
180
246
|
} else if (routeKind === "home") {
|
|
181
247
|
schema = {
|
|
182
248
|
"@context": "https://schema.org",
|
|
183
|
-
"@
|
|
184
|
-
url: canonicalUrl,
|
|
185
|
-
name: effectiveTitle,
|
|
186
|
-
description: effectiveDescription,
|
|
187
|
-
inLanguage: siteConfig.lang || "zh-CN",
|
|
188
|
-
publisher,
|
|
189
|
-
author: authorEntity,
|
|
249
|
+
"@graph": [websiteEntity, authorEntity, publisher],
|
|
190
250
|
};
|
|
191
251
|
} else {
|
|
192
252
|
schema = {
|
|
193
253
|
"@context": "https://schema.org",
|
|
194
|
-
"@
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
254
|
+
"@graph": [
|
|
255
|
+
websiteEntity,
|
|
256
|
+
authorEntity,
|
|
257
|
+
publisher,
|
|
258
|
+
breadcrumbEntity,
|
|
259
|
+
{
|
|
260
|
+
"@type": isCollectionPage ? "CollectionPage" : routeKind === "about" ? "AboutPage" : "WebPage",
|
|
261
|
+
"@id": canonicalUrl,
|
|
262
|
+
url: canonicalUrl,
|
|
263
|
+
name: contentTitle,
|
|
264
|
+
description: effectiveDescription,
|
|
265
|
+
inLanguage: siteConfig.lang || "zh-CN",
|
|
266
|
+
isPartOf: { "@id": `${siteUrl}/#website` },
|
|
267
|
+
breadcrumb: { "@id": `${canonicalUrl}#breadcrumb` },
|
|
268
|
+
},
|
|
269
|
+
],
|
|
200
270
|
};
|
|
201
271
|
}
|
|
202
272
|
const ldJson = JSON.stringify(schema, null, 2).replace(/<\//g, "<\\/");
|
|
@@ -233,4 +303,3 @@ const ldJson = JSON.stringify(schema, null, 2).replace(/<\//g, "<\\/");
|
|
|
233
303
|
<script type="application/ld+json" set:html={ldJson} />
|
|
234
304
|
<VerCount />
|
|
235
305
|
</head>
|
|
236
|
-
|
package/src/pages/links.astro
CHANGED
|
@@ -7,17 +7,16 @@ import { getSiteData, getLinksData } from "@utils/config-utils";
|
|
|
7
7
|
const configEntries = await getCollection("config");
|
|
8
8
|
const siteConfig = getSiteData(configEntries);
|
|
9
9
|
const linksConfig = getLinksData(configEntries)!;
|
|
10
|
-
const siteTitle = siteConfig.title;
|
|
11
10
|
const siteDescription = siteConfig.description;
|
|
12
11
|
const linksTitle = linksConfig.title;
|
|
13
12
|
const linksDescription = linksConfig.description;
|
|
14
13
|
---
|
|
15
14
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
15
|
+
<ListPage
|
|
16
|
+
title={linksTitle}
|
|
17
|
+
description={linksDescription || siteDescription}
|
|
18
|
+
heading={linksTitle}
|
|
19
|
+
subheading={linksDescription}
|
|
20
|
+
>
|
|
22
21
|
<LinkList />
|
|
23
22
|
</ListPage>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 16 16"><path fill="#cccccc" d="M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8m15 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0M5.408 5.89c-.83 0-1.318.64-1.318 1.753v.742c0 1.108.479 1.727 1.318 1.727c.69 0 1.138-.435 1.187-1.05h1.147v.114c-.058 1.147-1.029 1.938-2.343 1.938c-1.612 0-2.518-1.028-2.518-2.729v-.747c0-1.7.914-2.75 2.518-2.75c1.319 0 2.29.812 2.343 1.999v.11H6.595c-.049-.638-.506-1.108-1.187-1.108Zm5.404 0c-.831 0-1.319.64-1.319 1.753v.742c0 1.108.48 1.727 1.319 1.727c.69 0 1.138-.435 1.186-1.05h1.147v.114c-.057 1.147-1.028 1.938-2.342 1.938c-1.613 0-2.518-1.028-2.518-2.729v-.747c0-1.7.914-2.75 2.518-2.75c1.318 0 2.29.812 2.342 1.999v.11h-1.147c-.048-.638-.505-1.108-1.186-1.108Z"/></svg>
|
package/src/assets/astro.svg
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" fill="none" width="115" height="48"><path fill="#17191E" d="M7.77 36.35C6.4 35.11 6 32.51 6.57 30.62c.99 1.2 2.35 1.57 3.75 1.78 2.18.33 4.31.2 6.33-.78.23-.12.44-.27.7-.42.18.55.23 1.1.17 1.67a4.56 4.56 0 0 1-1.94 3.23c-.43.32-.9.61-1.34.91-1.38.94-1.76 2.03-1.24 3.62l.05.17a3.63 3.63 0 0 1-1.6-1.38 3.87 3.87 0 0 1-.63-2.1c0-.37 0-.74-.05-1.1-.13-.9-.55-1.3-1.33-1.32a1.56 1.56 0 0 0-1.63 1.26c0 .06-.03.12-.05.2Z"/><path fill="url(#a)" d="M7.77 36.35C6.4 35.11 6 32.51 6.57 30.62c.99 1.2 2.35 1.57 3.75 1.78 2.18.33 4.31.2 6.33-.78.23-.12.44-.27.7-.42.18.55.23 1.1.17 1.67a4.56 4.56 0 0 1-1.94 3.23c-.43.32-.9.61-1.34.91-1.38.94-1.76 2.03-1.24 3.62l.05.17a3.63 3.63 0 0 1-1.6-1.38 3.87 3.87 0 0 1-.63-2.1c0-.37 0-.74-.05-1.1-.13-.9-.55-1.3-1.33-1.32a1.56 1.56 0 0 0-1.63 1.26c0 .06-.03.12-.05.2Z"/><path fill="#17191E" d="M.02 30.31s4.02-1.95 8.05-1.95l3.04-9.4c.11-.45.44-.76.82-.76.37 0 .7.31.82.76l3.04 9.4c4.77 0 8.05 1.95 8.05 1.95L17 11.71c-.2-.56-.53-.91-.98-.91H7.83c-.44 0-.76.35-.97.9L.02 30.31Zm42.37-5.97c0 1.64-2.05 2.62-4.88 2.62-1.85 0-2.5-.45-2.5-1.41 0-1 .8-1.49 2.65-1.49 1.67 0 3.09.03 4.73.23v.05Zm.03-2.04a21.37 21.37 0 0 0-4.37-.36c-5.32 0-7.82 1.25-7.82 4.18 0 3.04 1.71 4.2 5.68 4.2 3.35 0 5.63-.84 6.46-2.92h.14c-.03.5-.05 1-.05 1.4 0 1.07.18 1.16 1.06 1.16h4.15a16.9 16.9 0 0 1-.36-4c0-1.67.06-2.93.06-4.62 0-3.45-2.07-5.64-8.56-5.64-2.8 0-5.9.48-8.26 1.19.22.93.54 2.83.7 4.06 2.04-.96 4.95-1.37 7.2-1.37 3.11 0 3.97.71 3.97 2.15v.57Zm11.37 3c-.56.07-1.33.07-2.12.07-.83 0-1.6-.03-2.12-.1l-.02.58c0 2.85 1.87 4.52 8.45 4.52 6.2 0 8.2-1.64 8.2-4.55 0-2.74-1.33-4.09-7.2-4.39-4.58-.2-4.99-.7-4.99-1.28 0-.66.59-1 3.65-1 3.18 0 4.03.43 4.03 1.35v.2a46.13 46.13 0 0 1 4.24.03l.02-.55c0-3.36-2.8-4.46-8.2-4.46-6.08 0-8.13 1.49-8.13 4.39 0 2.6 1.64 4.23 7.48 4.48 4.3.14 4.77.62 4.77 1.28 0 .7-.7 1.03-3.71 1.03-3.47 0-4.35-.48-4.35-1.47v-.13Zm19.82-12.05a17.5 17.5 0 0 1-6.24 3.48c.03.84.03 2.4.03 3.24l1.5.02c-.02 1.63-.04 3.6-.04 4.9 0 3.04 1.6 5.32 6.58 5.32 2.1 0 3.5-.23 5.23-.6a43.77 43.77 0 0 1-.46-4.13c-1.03.34-2.34.53-3.78.53-2 0-2.82-.55-2.82-2.13 0-1.37 0-2.65.03-3.84 2.57.02 5.13.07 6.64.11-.02-1.18.03-2.9.1-4.04-2.2.04-4.65.07-6.68.07l.07-2.93h-.16Zm13.46 6.04a767.33 767.33 0 0 1 .07-3.18H82.6c.07 1.96.07 3.98.07 6.92 0 2.95-.03 4.99-.07 6.93h5.18c-.09-1.37-.11-3.68-.11-5.65 0-3.1 1.26-4 4.12-4 1.33 0 2.28.16 3.1.46.03-1.16.26-3.43.4-4.43-.86-.25-1.81-.41-2.96-.41-2.46-.03-4.26.98-5.1 3.38l-.17-.02Zm22.55 3.65c0 2.5-1.8 3.66-4.64 3.66-2.81 0-4.61-1.1-4.61-3.66s1.82-3.52 4.61-3.52c2.82 0 4.64 1.03 4.64 3.52Zm4.71-.11c0-4.96-3.87-7.18-9.35-7.18-5.5 0-9.23 2.22-9.23 7.18 0 4.94 3.49 7.59 9.21 7.59 5.77 0 9.37-2.65 9.37-7.6Z"/><defs><linearGradient id="a" x1="6.33" x2="19.43" y1="40.8" y2="34.6" gradientUnits="userSpaceOnUse"><stop stop-color="#D83333"/><stop offset="1" stop-color="#F041FF"/></linearGradient></defs></svg>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="1440" height="1024" fill="none"><path fill="url(#a)" fill-rule="evenodd" d="M-217.58 475.75c91.82-72.02 225.52-29.38 341.2-44.74C240 415.56 372.33 315.14 466.77 384.9c102.9 76.02 44.74 246.76 90.31 366.31 29.83 78.24 90.48 136.14 129.48 210.23 57.92 109.99 169.67 208.23 155.9 331.77-13.52 121.26-103.42 264.33-224.23 281.37-141.96 20.03-232.72-220.96-374.06-196.99-151.7 25.73-172.68 330.24-325.85 315.72-128.6-12.2-110.9-230.73-128.15-358.76-12.16-90.14 65.87-176.25 44.1-264.57-26.42-107.2-167.12-163.46-176.72-273.45-10.15-116.29 33.01-248.75 124.87-320.79Z" clip-rule="evenodd" style="opacity:.154"/><path fill="url(#b)" fill-rule="evenodd" d="M1103.43 115.43c146.42-19.45 275.33-155.84 413.5-103.59 188.09 71.13 409 212.64 407.06 413.88-1.94 201.25-259.28 278.6-414.96 405.96-130 106.35-240.24 294.39-405.6 265.3-163.7-28.8-161.93-274.12-284.34-386.66-134.95-124.06-436-101.46-445.82-284.6-9.68-180.38 247.41-246.3 413.54-316.9 101.01-42.93 207.83 21.06 316.62 6.61Z" clip-rule="evenodd" style="opacity:.154"/><defs><linearGradient id="b" x1="373" x2="1995.44" y1="1100" y2="118.03" gradientUnits="userSpaceOnUse"><stop stop-color="#D83333"/><stop offset="1" stop-color="#F041FF"/></linearGradient><linearGradient id="a" x1="107.37" x2="1130.66" y1="1993.35" y2="1026.31" gradientUnits="userSpaceOnUse"><stop stop-color="#3245FF"/><stop offset="1" stop-color="#BC52EE"/></linearGradient></defs></svg>
|
package/src/internal/pagefind.ts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pagefind 搜索索引生成器
|
|
3
|
-
*
|
|
4
|
-
* 从原 src/integrations/pagefind.ts 迁移而来,
|
|
5
|
-
* 变为集成的一个内部模块,在构建完成时自动运行。
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import path from "node:path";
|
|
9
|
-
import { fileURLToPath } from "node:url";
|
|
10
|
-
|
|
11
|
-
import type { AstroIntegrationLogger } from "astro";
|
|
12
|
-
|
|
13
|
-
export async function pagefind(dir: URL, logger: AstroIntegrationLogger): Promise<void> {
|
|
14
|
-
const outDir = fileURLToPath(dir);
|
|
15
|
-
logger.info("Running Pagefind indexer...");
|
|
16
|
-
|
|
17
|
-
try {
|
|
18
|
-
const { createIndex } = await import("pagefind");
|
|
19
|
-
const { index, errors } = await createIndex();
|
|
20
|
-
|
|
21
|
-
if (!index) {
|
|
22
|
-
logger.error("Pagefind failed to create index");
|
|
23
|
-
errors?.forEach((e) => logger.error(e));
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const { page_count } = await index.addDirectory({ path: outDir });
|
|
28
|
-
if (page_count === 0) {
|
|
29
|
-
logger.warn("Pagefind: no pages indexed");
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const { outputPath } = await index.writeFiles({
|
|
34
|
-
outputPath: path.join(outDir, "pagefind"),
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
logger.info(`Pagefind indexed ${page_count} pages → ${outputPath}`);
|
|
38
|
-
} catch (error) {
|
|
39
|
-
logger.error(`Pagefind indexing failed: ${error}`);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
.categoriesContainer {
|
|
2
|
-
display: flex;
|
|
3
|
-
flex-direction: column;
|
|
4
|
-
gap: var(--space-xs);
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
.title {
|
|
8
|
-
margin: 0;
|
|
9
|
-
font-size: var(--font-size-base);
|
|
10
|
-
font-weight: 600;
|
|
11
|
-
color: var(--white-90p);
|
|
12
|
-
padding-bottom: var(--space-sm);
|
|
13
|
-
border-bottom: var(--border-thin) solid var(--white-20p);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
.categoryList {
|
|
17
|
-
display: flex;
|
|
18
|
-
flex-direction: column;
|
|
19
|
-
gap: var(--space-sm);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
.category {
|
|
23
|
-
display: inline-flex;
|
|
24
|
-
padding: var(--space-sm) var(--space-xs);
|
|
25
|
-
background: var(--white-05p);
|
|
26
|
-
color: var(--white-80p);
|
|
27
|
-
border-left: var(--border-thick) solid var(--accent-60p);
|
|
28
|
-
text-decoration: none;
|
|
29
|
-
transition:
|
|
30
|
-
color var(--transition-medium),
|
|
31
|
-
transform var(--transition-medium);
|
|
32
|
-
border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
|
|
33
|
-
font-size: var(--font-size-small);
|
|
34
|
-
transform: translateX(0);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
.category:hover {
|
|
38
|
-
transform: translateX(4px);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
.category:active {
|
|
42
|
-
transform: translateX(2px);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
.empty {
|
|
46
|
-
color: var(--white-50p);
|
|
47
|
-
font-size: var(--font-size-small);
|
|
48
|
-
text-align: center;
|
|
49
|
-
padding: var(--space-md) 0;
|
|
50
|
-
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/* 左侧边栏 */
|
|
2
|
-
|
|
3
|
-
.leftSidebar {
|
|
4
|
-
position: sticky;
|
|
5
|
-
top: 20px;
|
|
6
|
-
width: 100%;
|
|
7
|
-
height: fit-content;
|
|
8
|
-
max-height: calc(100vh - 40px);
|
|
9
|
-
overflow-y: auto;
|
|
10
|
-
display: flex;
|
|
11
|
-
flex-direction: column;
|
|
12
|
-
gap: var(--space-lg);
|
|
13
|
-
padding: var(--space-lg) 0;
|
|
14
|
-
|
|
15
|
-
/* 隐藏滚动条但保留滚动功能 */
|
|
16
|
-
scrollbar-width: none;
|
|
17
|
-
-ms-overflow-style: none;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
.leftSidebar::-webkit-scrollbar {
|
|
21
|
-
display: none;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
@media (max-width: 1200px) {
|
|
25
|
-
.leftSidebar {
|
|
26
|
-
display: none;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
.sidebarContainer {
|
|
31
|
-
display: flex;
|
|
32
|
-
flex-direction: column;
|
|
33
|
-
background: var(--black-10p);
|
|
34
|
-
border-radius: var(--radius-lg);
|
|
35
|
-
padding: var(--space-md);
|
|
36
|
-
box-shadow: var(--shadow-sidebar);
|
|
37
|
-
transition: all var(--transition-normal) ease;
|
|
38
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/* 右侧边栏 - 文章纲要和元数据 */
|
|
2
|
-
|
|
3
|
-
.rightSidebar {
|
|
4
|
-
position: sticky;
|
|
5
|
-
top: 20px;
|
|
6
|
-
width: 100%;
|
|
7
|
-
height: fit-content;
|
|
8
|
-
max-height: calc(100vh - 40px);
|
|
9
|
-
overflow-y: auto;
|
|
10
|
-
display: flex;
|
|
11
|
-
flex-direction: column;
|
|
12
|
-
gap: var(--space-lg);
|
|
13
|
-
padding: var(--space-lg) 0;
|
|
14
|
-
|
|
15
|
-
/* 为 scrollIntoView 预留底部空间,确保长目录的激活项不会被裁切 */
|
|
16
|
-
scroll-padding-bottom: 8rem;
|
|
17
|
-
|
|
18
|
-
/* 隐藏滚动条但保留滚动功能 */
|
|
19
|
-
scrollbar-width: none;
|
|
20
|
-
-ms-overflow-style: none;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
.rightSidebar::-webkit-scrollbar {
|
|
24
|
-
display: none;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
.sidebarContainer {
|
|
28
|
-
display: flex;
|
|
29
|
-
flex-direction: column;
|
|
30
|
-
background: var(--black-10p);
|
|
31
|
-
border-radius: var(--radius-lg);
|
|
32
|
-
padding: var(--space-md);
|
|
33
|
-
box-shadow: var(--shadow-sidebar);
|
|
34
|
-
transition: all var(--transition-normal) ease;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/* 响应式设计 */
|
|
38
|
-
|
|
39
|
-
@media (max-width: 1400px) {
|
|
40
|
-
.rightSidebar {
|
|
41
|
-
width: 240px;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
@media (max-width: 1200px) {
|
|
46
|
-
.rightSidebar {
|
|
47
|
-
display: none;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
@media (max-width: 768px) {
|
|
52
|
-
.rightSidebar {
|
|
53
|
-
position: static;
|
|
54
|
-
width: 100%;
|
|
55
|
-
max-height: none;
|
|
56
|
-
top: auto;
|
|
57
|
-
order: 2;
|
|
58
|
-
padding: 1rem 0;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
.tagsContainer {
|
|
2
|
-
display: flex;
|
|
3
|
-
flex-direction: column;
|
|
4
|
-
gap: var(--space-xs);
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
.title {
|
|
8
|
-
margin: 0;
|
|
9
|
-
font-size: var(--font-size-base);
|
|
10
|
-
font-weight: 600;
|
|
11
|
-
color: var(--white-90p);
|
|
12
|
-
padding-bottom: var(--space-sm);
|
|
13
|
-
border-bottom: var(--border-thin) solid var(--white-20p);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
.tagList {
|
|
17
|
-
display: flex;
|
|
18
|
-
flex-wrap: wrap;
|
|
19
|
-
gap: var(--space-sm);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
.tag {
|
|
23
|
-
display: inline-block;
|
|
24
|
-
padding: 0.4rem 0.8rem;
|
|
25
|
-
background: var(--white-10p);
|
|
26
|
-
border: none;
|
|
27
|
-
border-radius: var(--radius-full);
|
|
28
|
-
font-size: var(--font-size-smaller);
|
|
29
|
-
text-decoration: none;
|
|
30
|
-
transition:
|
|
31
|
-
color var(--transition-medium),
|
|
32
|
-
transform var(--transition-medium);
|
|
33
|
-
white-space: nowrap;
|
|
34
|
-
transform: translateY(0);
|
|
35
|
-
color: var(--white-85p);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
.tag:hover {
|
|
39
|
-
transform: translateY(-2px);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
.tag:active {
|
|
43
|
-
transform: translateY(-1px);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
.empty {
|
|
47
|
-
color: var(--white-50p);
|
|
48
|
-
font-size: var(--font-size-small);
|
|
49
|
-
text-align: center;
|
|
50
|
-
padding: var(--space-md) 0;
|
|
51
|
-
}
|