@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xingwangzhe/stalux",
3
- "version": "1.24.2",
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: effectiveTitle,
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: effectiveTitle,
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: effectiveTitle,
110
+ card: (props.cover ? "summary_large_image" : "summary") as TwitterCardType,
111
+ title: contentTitle,
106
112
  description: effectiveDescription,
107
113
  image: ogImagePath,
108
- imageAlt: effectiveTitle,
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
- "@type": "BlogPosting",
165
- headline: effectiveTitle,
166
- description: effectiveDescription,
167
- url: canonicalUrl,
168
- ...(ogImagePath ? { image: ogImagePath } : {}),
169
- ...(props.date ? { datePublished: props.date } : {}),
170
- ...(props.updated || props.date ? { dateModified: props.updated || props.date } : {}),
171
- ...(props.tags?.length ? { keywords: props.tags.join(", ") } : {}),
172
- author: props.author ? { ...authorEntity, name: props.author } : authorEntity,
173
- publisher,
174
- inLanguage: siteConfig.lang || "zh-CN",
175
- mainEntityOfPage: {
176
- "@type": "WebPage",
177
- "@id": canonicalUrl,
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
- "@type": "WebSite",
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
- "@type": isCollectionPage ? "CollectionPage" : routeKind === "about" ? "AboutPage" : "WebPage",
195
- url: canonicalUrl,
196
- name: effectiveTitle,
197
- description: effectiveDescription,
198
- inLanguage: siteConfig.lang || "zh-CN",
199
- isPartOf: { "@type": "WebSite", url: siteUrl, name: siteName },
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
-
@@ -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
- <ListPage
17
- title={siteTitle}
18
- description={siteDescription}
19
- heading={linksTitle}
20
- subheading={linksDescription}
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>
@@ -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>
@@ -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
- }