@jet-w/astro-blog 0.1.0

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.
Files changed (140) hide show
  1. package/dist/chunk-FXPGR372.js +0 -0
  2. package/dist/chunk-GYLSY3OJ.js +173 -0
  3. package/dist/config/index.d.ts +166 -0
  4. package/dist/config/index.js +38 -0
  5. package/dist/index.d.ts +34 -0
  6. package/dist/index.js +59 -0
  7. package/dist/types/index.d.ts +75 -0
  8. package/dist/types/index.js +1 -0
  9. package/package.json +84 -0
  10. package/src/components/EChartsCard.vue +118 -0
  11. package/src/components/Mermaid.vue +73 -0
  12. package/src/components/about/ContentCard.astro +27 -0
  13. package/src/components/about/IconCard.astro +77 -0
  14. package/src/components/about/SocialLinks.astro +54 -0
  15. package/src/components/about/TagCard.astro +65 -0
  16. package/src/components/about/TagGroup.astro +33 -0
  17. package/src/components/about/TimelineCard.astro +52 -0
  18. package/src/components/blog/FloatingToc.vue +198 -0
  19. package/src/components/blog/Hero.astro +147 -0
  20. package/src/components/blog/NavigationTabs.vue +245 -0
  21. package/src/components/blog/PostCard.astro +161 -0
  22. package/src/components/blog/PostNavigation.astro +106 -0
  23. package/src/components/blog/RelatedPosts.astro +175 -0
  24. package/src/components/blog/TableOfContents.astro +153 -0
  25. package/src/components/blog/TagCloud.astro +91 -0
  26. package/src/components/home/FeaturedPostsSection.astro +54 -0
  27. package/src/components/home/QuickNavSection.astro +81 -0
  28. package/src/components/home/RecentPostsSection.astro +52 -0
  29. package/src/components/home/StatsSection.astro +44 -0
  30. package/src/components/layout/Footer.astro +103 -0
  31. package/src/components/layout/Header.astro +68 -0
  32. package/src/components/layout/Sidebar.astro +594 -0
  33. package/src/components/media/Bilibili.astro +114 -0
  34. package/src/components/media/Slides.astro +313 -0
  35. package/src/components/media/Video.astro +111 -0
  36. package/src/components/media/VideoPlayer.astro +89 -0
  37. package/src/components/media/YouTube.astro +92 -0
  38. package/src/components/pte/StudyCalendar.vue +1348 -0
  39. package/src/components/ui/Icon.astro +187 -0
  40. package/src/components/ui/MobileMenu.vue +201 -0
  41. package/src/components/ui/Pagination.astro +143 -0
  42. package/src/components/ui/SearchBox.vue +179 -0
  43. package/src/components/ui/SearchInterface.vue +409 -0
  44. package/src/components/ui/SidebarToggle.vue +57 -0
  45. package/src/components/ui/ThemeToggle.vue +90 -0
  46. package/src/layouts/AboutLayout.astro +18 -0
  47. package/src/layouts/BaseLayout.astro +362 -0
  48. package/src/layouts/PageLayout.astro +217 -0
  49. package/src/layouts/SlidesLayout.astro +320 -0
  50. package/src/plugins/rehype-clean-containers.mjs +24 -0
  51. package/src/plugins/rehype-relative-links.mjs +43 -0
  52. package/src/plugins/rehype-tabs.mjs +116 -0
  53. package/src/plugins/remark-containers.mjs +407 -0
  54. package/src/plugins/remark-mermaid.mjs +46 -0
  55. package/src/styles/global.css +870 -0
  56. package/src/styles/slides.css +220 -0
  57. package/src/utils/sidebar.ts +492 -0
  58. package/templates/default/astro.config.mjs +51 -0
  59. package/templates/default/content/pages/about.mdx +93 -0
  60. package/templates/default/content/pages/index.mdx +20 -0
  61. package/templates/default/content/posts/blog_docs/01-quick-start.md +162 -0
  62. package/templates/default/content/posts/blog_docs/02-frontmatter.md +277 -0
  63. package/templates/default/content/posts/blog_docs/03-markdown-basic.md +350 -0
  64. package/templates/default/content/posts/blog_docs/04-containers.md +331 -0
  65. package/templates/default/content/posts/blog_docs/05-code-blocks.md +388 -0
  66. package/templates/default/content/posts/blog_docs/06-mermaid.md +431 -0
  67. package/templates/default/content/posts/blog_docs/07-video.md +243 -0
  68. package/templates/default/content/posts/blog_docs/08-latex.md +382 -0
  69. package/templates/default/content/posts/blog_docs/09-icons.md +326 -0
  70. package/templates/default/content/posts/blog_docs/10-sidebar.md +445 -0
  71. package/templates/default/content/posts/blog_docs/11-config.md +334 -0
  72. package/templates/default/content/posts/blog_docs/12-slides.mdx +552 -0
  73. package/templates/default/content/posts/blog_docs/README.md +151 -0
  74. package/templates/default/content/slides/demo.md +146 -0
  75. package/templates/default/content/slides/docs/basic-demo.md +35 -0
  76. package/templates/default/content/slides/docs/code-demo.md +62 -0
  77. package/templates/default/content/slides/docs/echarts-demo.md +139 -0
  78. package/templates/default/content/slides/docs/fragment-demo.md +35 -0
  79. package/templates/default/content/slides/docs/math-demo.md +48 -0
  80. package/templates/default/content/slides/docs/mermaid-demo.md +105 -0
  81. package/templates/default/content/slides/docs/theme-demo.md +38 -0
  82. package/templates/default/content/slides/docs/vertical-demo.md +50 -0
  83. package/templates/default/package.json +31 -0
  84. package/templates/default/public/favicon-bak.svg +4 -0
  85. package/templates/default/public/images/avatar.jpg +0 -0
  86. package/templates/default/public/images/avatar.svg +142 -0
  87. package/templates/default/public/js/mermaid-container.js +402 -0
  88. package/templates/default/public/js/mermaid-init.js +131 -0
  89. package/templates/default/public/js/mermaid-render.js +98 -0
  90. package/templates/default/public/js/mermaid-simple.js +95 -0
  91. package/templates/default/public/js/tabs-init.js +86 -0
  92. package/templates/default/public/media/individual_portfolio/INDIVIDUAL PORTFOLIO.png +0 -0
  93. package/templates/default/public/slides/plugin/highlight/highlight.js +5 -0
  94. package/templates/default/public/slides/plugin/highlight/monokai.css +71 -0
  95. package/templates/default/public/slides/plugin/markdown/markdown.js +7 -0
  96. package/templates/default/public/slides/plugin/math/math.js +1 -0
  97. package/templates/default/public/slides/plugin/notes/notes.js +1 -0
  98. package/templates/default/public/slides/reveal.css +9 -0
  99. package/templates/default/public/slides/reveal.js +9 -0
  100. package/templates/default/public/slides/theme/beige.css +366 -0
  101. package/templates/default/public/slides/theme/black-contrast.css +362 -0
  102. package/templates/default/public/slides/theme/black.css +359 -0
  103. package/templates/default/public/slides/theme/blood.css +392 -0
  104. package/templates/default/public/slides/theme/dracula.css +385 -0
  105. package/templates/default/public/slides/theme/league.css +368 -0
  106. package/templates/default/public/slides/theme/moon.css +362 -0
  107. package/templates/default/public/slides/theme/night.css +360 -0
  108. package/templates/default/public/slides/theme/serif.css +363 -0
  109. package/templates/default/public/slides/theme/simple.css +362 -0
  110. package/templates/default/public/slides/theme/sky.css +370 -0
  111. package/templates/default/public/slides/theme/solarized.css +363 -0
  112. package/templates/default/public/slides/theme/white-contrast.css +362 -0
  113. package/templates/default/public/slides/theme/white.css +359 -0
  114. package/templates/default/public/slides/theme/white_contrast_compact_verbatim_headers.css +360 -0
  115. package/templates/default/public/test-complete.html +43 -0
  116. package/templates/default/public/test-mermaid.html +124 -0
  117. package/templates/default/src/config/index.ts +114 -0
  118. package/templates/default/src/content.config.ts +96 -0
  119. package/templates/default/src/pages/[...slug].astro +27 -0
  120. package/templates/default/src/pages/archives/[year]/[month]/page/[page].astro +176 -0
  121. package/templates/default/src/pages/archives/[year]/[month].astro +158 -0
  122. package/templates/default/src/pages/archives/index.astro +210 -0
  123. package/templates/default/src/pages/categories/[category]/page/[page].astro +218 -0
  124. package/templates/default/src/pages/categories/[category].astro +198 -0
  125. package/templates/default/src/pages/categories/index.astro +190 -0
  126. package/templates/default/src/pages/container-test.astro +79 -0
  127. package/templates/default/src/pages/mermaid-direct.html +78 -0
  128. package/templates/default/src/pages/posts/[...slug].astro +335 -0
  129. package/templates/default/src/pages/posts/index.astro +541 -0
  130. package/templates/default/src/pages/posts/page/[page].astro +146 -0
  131. package/templates/default/src/pages/rss.xml.ts +28 -0
  132. package/templates/default/src/pages/search-index.json.ts +21 -0
  133. package/templates/default/src/pages/search.astro +50 -0
  134. package/templates/default/src/pages/slides/[...slug].astro +54 -0
  135. package/templates/default/src/pages/slides/index.astro +135 -0
  136. package/templates/default/src/pages/tags/[tag]/page/[page].astro +211 -0
  137. package/templates/default/src/pages/tags/[tag].astro +191 -0
  138. package/templates/default/src/pages/tags/index.astro +167 -0
  139. package/templates/default/tailwind.config.mjs +78 -0
  140. package/templates/default/tsconfig.json +9 -0
@@ -0,0 +1,870 @@
1
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap');
2
+
3
+ @tailwind base;
4
+ @tailwind components;
5
+ @tailwind utilities;
6
+
7
+ @layer base {
8
+ html {
9
+ font-family: 'Inter', 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', system-ui, sans-serif;
10
+ scroll-behavior: smooth;
11
+ }
12
+
13
+ body {
14
+ @apply bg-white dark:bg-slate-900 text-slate-900 dark:text-slate-100 transition-colors duration-300;
15
+ }
16
+
17
+ /* 提高深色模式下普通文字的对比度 */
18
+ .dark {
19
+ --tw-prose-body: theme('colors.slate.300');
20
+ --tw-prose-headings: theme('colors.slate.100');
21
+ --tw-prose-bold: theme('colors.slate.200');
22
+ --tw-prose-counters: theme('colors.slate.400');
23
+ --tw-prose-bullets: theme('colors.slate.400');
24
+ }
25
+
26
+ /* 自定义滚动条 */
27
+ ::-webkit-scrollbar {
28
+ width: 6px;
29
+ height: 6px;
30
+ }
31
+
32
+ ::-webkit-scrollbar-track {
33
+ @apply bg-slate-100 dark:bg-slate-800;
34
+ }
35
+
36
+ ::-webkit-scrollbar-thumb {
37
+ @apply bg-slate-300 dark:bg-slate-600 rounded-full;
38
+ }
39
+
40
+ ::-webkit-scrollbar-thumb:hover {
41
+ @apply bg-slate-400 dark:bg-slate-500;
42
+ }
43
+ }
44
+
45
+ @layer components {
46
+ /* 自定义按钮样式 */
47
+ .btn-primary {
48
+ @apply bg-primary-500 hover:bg-primary-600 text-white px-4 py-2 rounded-lg transition-colors duration-200 font-medium;
49
+ }
50
+
51
+ .btn-secondary {
52
+ @apply border border-primary-500 text-primary-500 hover:bg-primary-50 dark:hover:bg-primary-900/20 px-4 py-2 rounded-lg transition-colors duration-200 font-medium;
53
+ }
54
+
55
+ .btn-ghost {
56
+ @apply text-primary-500 hover:bg-primary-50 dark:hover:bg-primary-900/20 px-4 py-2 rounded-lg transition-colors duration-200 font-medium;
57
+ }
58
+
59
+ /* 卡片样式 */
60
+ .card {
61
+ @apply bg-white dark:bg-slate-800 border border-slate-200 dark:border-slate-700 rounded-xl p-6 shadow-sm hover:shadow-md transition-shadow duration-200;
62
+ }
63
+
64
+ /* 输入框样式 */
65
+ .input {
66
+ @apply w-full px-4 py-3 border border-slate-300 dark:border-slate-600 rounded-lg bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-100 placeholder-slate-500 dark:placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent transition-colors duration-200;
67
+ }
68
+
69
+ /* 链接样式 */
70
+ .link {
71
+ @apply text-primary-500 hover:text-primary-600 dark:hover:text-primary-400 transition-colors duration-200;
72
+ }
73
+
74
+ /* 文章内容样式 */
75
+ .prose-custom {
76
+ @apply prose prose-slate dark:prose-invert max-w-none;
77
+ }
78
+
79
+ /* 深色模式下提高正文对比度 - 适用于所有 prose */
80
+ .dark .prose,
81
+ .dark .prose-custom {
82
+ --tw-prose-body: theme('colors.slate.200');
83
+ --tw-prose-headings: theme('colors.white');
84
+ --tw-prose-lead: theme('colors.slate.300');
85
+ --tw-prose-bold: theme('colors.white');
86
+ --tw-prose-links: theme('colors.primary.400');
87
+ --tw-prose-counters: theme('colors.slate.300');
88
+ --tw-prose-bullets: theme('colors.slate.300');
89
+ --tw-prose-hr: theme('colors.slate.600');
90
+ --tw-prose-quotes: theme('colors.slate.200');
91
+ --tw-prose-quote-borders: theme('colors.slate.600');
92
+ --tw-prose-captions: theme('colors.slate.300');
93
+ --tw-prose-code: theme('colors.slate.100');
94
+ --tw-prose-pre-code: theme('colors.slate.200');
95
+ --tw-prose-pre-bg: theme('colors.slate.900');
96
+ --tw-prose-th-borders: theme('colors.slate.600');
97
+ --tw-prose-td-borders: theme('colors.slate.700');
98
+ }
99
+
100
+ .prose-custom h1,
101
+ .prose-custom h2,
102
+ .prose-custom h3,
103
+ .prose-custom h4,
104
+ .prose-custom h5,
105
+ .prose-custom h6,
106
+ .dark .prose h1,
107
+ .dark .prose h2,
108
+ .dark .prose h3,
109
+ .dark .prose h4,
110
+ .dark .prose h5,
111
+ .dark .prose h6 {
112
+ @apply font-semibold text-slate-900 dark:text-white;
113
+ }
114
+
115
+ .prose-custom p,
116
+ .prose-custom li {
117
+ @apply text-slate-700 dark:text-slate-200;
118
+ }
119
+
120
+ .prose-custom a,
121
+ .dark .prose a {
122
+ @apply text-primary-500 hover:text-primary-600 dark:text-primary-400 dark:hover:text-primary-300 no-underline border-b border-primary-200 hover:border-primary-400 transition-colors duration-200;
123
+ }
124
+
125
+ .prose-custom code,
126
+ .dark .prose code {
127
+ @apply bg-slate-100 dark:bg-slate-800 text-slate-900 dark:text-slate-200 px-1.5 py-0.5 rounded text-sm font-mono;
128
+ }
129
+
130
+ /* 移除 Tailwind Typography 默认添加的反引号 */
131
+ .prose code::before,
132
+ .prose code::after,
133
+ .prose-custom code::before,
134
+ .prose-custom code::after {
135
+ content: none;
136
+ }
137
+
138
+ .prose-custom pre,
139
+ .dark .prose pre {
140
+ @apply bg-slate-900 dark:bg-slate-950 rounded-lg overflow-x-auto;
141
+ }
142
+
143
+ .prose-custom pre code,
144
+ .dark .prose pre code {
145
+ @apply bg-transparent text-slate-100 p-0;
146
+ }
147
+
148
+ .prose-custom blockquote,
149
+ .dark .prose blockquote {
150
+ @apply border-l-4 border-primary-200 dark:border-primary-600 bg-primary-50 dark:bg-primary-900/30 pl-4 py-2 rounded-r-lg;
151
+ }
152
+
153
+ .prose-custom blockquote p,
154
+ .dark .prose blockquote p {
155
+ @apply text-slate-600 dark:text-slate-300;
156
+ }
157
+
158
+ .prose-custom strong,
159
+ .dark .prose strong {
160
+ @apply text-slate-900 dark:text-white;
161
+ }
162
+
163
+ /* 容器样式 */
164
+ .custom-container {
165
+ @apply my-6 border-l-4 rounded-lg shadow-sm overflow-hidden;
166
+ }
167
+
168
+ .container-title {
169
+ @apply px-4 py-2 font-semibold text-sm flex items-center;
170
+ }
171
+
172
+ .container-content {
173
+ @apply px-4 py-3;
174
+ }
175
+
176
+ /* tip 容器 */
177
+ .container-tip {
178
+ @apply border-blue-400 bg-blue-50 dark:bg-blue-900/20;
179
+ }
180
+
181
+ .container-tip .container-title {
182
+ @apply text-blue-800 dark:text-blue-200 bg-blue-100 dark:bg-blue-800/30;
183
+ }
184
+
185
+ .container-tip .container-content {
186
+ @apply text-blue-700 dark:text-blue-300;
187
+ }
188
+
189
+ /* note 容器 */
190
+ .container-note {
191
+ @apply border-gray-400 bg-gray-50 dark:bg-gray-800/30;
192
+ }
193
+
194
+ .container-note .container-title {
195
+ @apply text-gray-800 dark:text-gray-200 bg-gray-100 dark:bg-gray-700/50;
196
+ }
197
+
198
+ .container-note .container-content {
199
+ @apply text-gray-700 dark:text-gray-300;
200
+ }
201
+
202
+ /* warning 容器 */
203
+ .container-warning {
204
+ @apply border-yellow-400 bg-yellow-50 dark:bg-yellow-900/20;
205
+ }
206
+
207
+ .container-warning .container-title {
208
+ @apply text-yellow-800 dark:text-yellow-200 bg-yellow-100 dark:bg-yellow-800/30;
209
+ }
210
+
211
+ .container-warning .container-content {
212
+ @apply text-yellow-700 dark:text-yellow-300;
213
+ }
214
+
215
+ /* danger 容器 */
216
+ .container-danger {
217
+ @apply border-red-400 bg-red-50 dark:bg-red-900/20;
218
+ }
219
+
220
+ .container-danger .container-title {
221
+ @apply text-red-800 dark:text-red-200 bg-red-100 dark:bg-red-800/30;
222
+ }
223
+
224
+ .container-danger .container-content {
225
+ @apply text-red-700 dark:text-red-300;
226
+ }
227
+
228
+ /* info 容器 */
229
+ .container-info {
230
+ @apply border-cyan-400 bg-cyan-50 dark:bg-cyan-900/20;
231
+ }
232
+
233
+ .container-info .container-title {
234
+ @apply text-cyan-800 dark:text-cyan-200 bg-cyan-100 dark:bg-cyan-800/30;
235
+ }
236
+
237
+ .container-info .container-content {
238
+ @apply text-cyan-700 dark:text-cyan-300;
239
+ }
240
+
241
+ /* details 容器 */
242
+ .container-details {
243
+ @apply border-purple-400 bg-purple-50 dark:bg-purple-900/20;
244
+ }
245
+
246
+ .container-details .container-title {
247
+ @apply text-purple-800 dark:text-purple-200 bg-purple-100 dark:bg-purple-800/30;
248
+ }
249
+
250
+ .container-details .container-content {
251
+ @apply text-purple-700 dark:text-purple-300;
252
+ }
253
+
254
+ /* 容器内的段落样式 */
255
+ .custom-container .container-content p {
256
+ @apply mb-3 last:mb-0;
257
+ }
258
+
259
+ .custom-container .container-content ul,
260
+ .custom-container .container-content ol {
261
+ @apply mb-3 last:mb-0;
262
+ }
263
+
264
+ .custom-container .container-content li {
265
+ @apply mb-1 last:mb-0;
266
+ }
267
+ }
268
+
269
+ /* 暗色模式过渡动画 */
270
+ * {
271
+ transition-property: background-color, border-color, color, fill, stroke;
272
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
273
+ transition-duration: 150ms;
274
+ }
275
+
276
+ /* 代码高亮主题 */
277
+ .astro-code {
278
+ @apply rounded-lg !important;
279
+ }
280
+
281
+ /* 代码块增强样式 */
282
+ .code-block-wrapper {
283
+ @apply relative my-4 rounded-lg overflow-hidden border border-slate-700 dark:border-slate-600;
284
+ }
285
+
286
+ .code-block-header {
287
+ @apply flex items-center justify-between px-4 py-2 bg-slate-800 dark:bg-slate-900 border-b border-slate-700 dark:border-slate-600;
288
+ }
289
+
290
+ .code-block-lang {
291
+ @apply text-xs font-mono text-slate-400 dark:text-slate-500 uppercase tracking-wide;
292
+ }
293
+
294
+ .code-block-actions {
295
+ @apply flex items-center gap-2;
296
+ }
297
+
298
+ .code-block-btn {
299
+ @apply flex items-center gap-1 px-2 py-1 text-xs text-slate-400 hover:text-slate-200 bg-slate-700/50 hover:bg-slate-700 rounded transition-colors duration-200;
300
+ }
301
+
302
+ .code-block-btn svg {
303
+ @apply w-4 h-4;
304
+ }
305
+
306
+ .code-block-btn.copied {
307
+ @apply text-green-400;
308
+ }
309
+
310
+ .code-block-content {
311
+ @apply relative;
312
+ }
313
+
314
+ .code-block-content pre {
315
+ @apply !my-0 !rounded-none !border-0;
316
+ }
317
+
318
+ /* 代码块收缩状态 */
319
+ .code-block-wrapper.collapsed .code-block-content {
320
+ @apply max-h-24 overflow-hidden;
321
+ }
322
+
323
+ .code-block-wrapper.collapsed .code-block-content::after {
324
+ content: '';
325
+ @apply absolute bottom-0 left-0 right-0 h-12 bg-gradient-to-t from-slate-900 to-transparent pointer-events-none;
326
+ }
327
+
328
+ .code-block-wrapper.collapsed .collapse-btn .collapse-icon {
329
+ @apply rotate-180;
330
+ }
331
+
332
+ /* 展开按钮 */
333
+ .code-block-expand {
334
+ @apply absolute bottom-2 left-1/2 -translate-x-1/2 z-10;
335
+ }
336
+
337
+ .code-block-wrapper:not(.collapsed) .code-block-expand {
338
+ @apply hidden;
339
+ }
340
+
341
+ .expand-btn {
342
+ @apply flex items-center gap-1 px-3 py-1 text-xs text-slate-300 bg-slate-800/90 hover:bg-slate-700 rounded-full border border-slate-600 transition-colors duration-200;
343
+ }
344
+
345
+ /* 底部收起按钮 */
346
+ .code-block-collapse {
347
+ @apply flex justify-center py-2 border-t border-slate-700/50 bg-gradient-to-t from-slate-900 to-transparent;
348
+ }
349
+
350
+ .code-block-wrapper.collapsed .code-block-collapse {
351
+ @apply hidden;
352
+ }
353
+
354
+ .collapse-bottom-btn {
355
+ @apply flex items-center gap-1 px-3 py-1 text-xs text-slate-300 bg-slate-800/90 hover:bg-slate-700 rounded-full border border-slate-600 transition-colors duration-200 cursor-pointer;
356
+ }
357
+
358
+ /* 加载动画 */
359
+ .loading {
360
+ @apply animate-pulse;
361
+ }
362
+
363
+ /* 回到顶部按钮 */
364
+ .back-to-top {
365
+ @apply fixed bottom-8 right-8 bg-primary-500 hover:bg-primary-600 text-white w-12 h-12 rounded-full flex items-center justify-center shadow-lg transition-all duration-300 opacity-0 invisible;
366
+ }
367
+
368
+ .back-to-top.show {
369
+ @apply opacity-100 visible;
370
+ }
371
+
372
+ /* 移动端适配 */
373
+ @media (max-width: 640px) {
374
+ .back-to-top {
375
+ @apply bottom-6 right-6 w-10 h-10;
376
+ }
377
+ }
378
+
379
+ /* 侧边栏折叠样式 - 超高特异性 */
380
+ html body.sidebar-collapsed aside[data-sidebar] {
381
+ transform: translateX(-100%) !important;
382
+ opacity: 0 !important;
383
+ pointer-events: none !important;
384
+ transition: transform 0.3s ease-in-out, opacity 0.3s ease-in-out !important;
385
+ margin-left: -256px !important; /* -w-64 fallback */
386
+ }
387
+
388
+ /* 主内容区在侧边栏折叠时的样式调整 */
389
+ html body.sidebar-collapsed div[data-main-content] {
390
+ padding-left: 0 !important;
391
+ padding-right: 0 !important;
392
+ transition: padding-left 0.3s ease-in-out, padding-right 0.3s ease-in-out !important;
393
+ }
394
+
395
+ /* 侧边栏切换按钮位置调整 */
396
+ html body.sidebar-collapsed div[data-sidebar-toggle] {
397
+ left: 0.25rem !important; /* 侧边栏隐藏时按钮贴近左边 */
398
+ }
399
+
400
+ html body:not(.sidebar-collapsed) div[data-sidebar-toggle] {
401
+ left: 16.25rem !important; /* 侧边栏显示时按钮在侧边栏右侧 (w-64 + 0.25rem) */
402
+ }
403
+
404
+ /* 平滑过渡动画 */
405
+ aside[data-sidebar] {
406
+ transform: translateX(0);
407
+ opacity: 1;
408
+ transition: transform 0.3s ease-in-out, opacity 0.3s ease-in-out;
409
+ }
410
+
411
+ div[data-main-content] {
412
+ transition: padding-left 0.3s ease-in-out, padding-right 0.3s ease-in-out;
413
+ }
414
+
415
+ div[data-sidebar-toggle] {
416
+ transition: left 0.3s ease-in-out;
417
+ }
418
+
419
+ /* 确保在小屏设备上侧边栏保持显示 */
420
+ @media (max-width: 1023px) {
421
+ html body.sidebar-collapsed aside[data-sidebar] {
422
+ transform: translateX(0) !important;
423
+ opacity: 1 !important;
424
+ pointer-events: auto !important;
425
+ margin-left: 0 !important;
426
+ }
427
+
428
+ /* 小屏设备上隐藏切换按钮 */
429
+ div[data-sidebar-toggle] {
430
+ display: none !important;
431
+ }
432
+ }
433
+
434
+ /* ========== Mermaid 全屏预览样式 ========== */
435
+
436
+ /* 全屏按钮 */
437
+ .mermaid-fullscreen-btn {
438
+ position: absolute;
439
+ top: 0.5rem;
440
+ right: 0.5rem;
441
+ display: flex;
442
+ align-items: center;
443
+ justify-content: center;
444
+ width: 36px;
445
+ height: 36px;
446
+ background: rgba(255, 255, 255, 0.9);
447
+ border: 1px solid #e2e8f0;
448
+ border-radius: 0.5rem;
449
+ cursor: pointer;
450
+ color: #64748b;
451
+ transition: all 0.2s ease;
452
+ z-index: 10;
453
+ opacity: 0;
454
+ }
455
+
456
+ .mermaid-rendered:hover .mermaid-fullscreen-btn {
457
+ opacity: 1;
458
+ }
459
+
460
+ .mermaid-fullscreen-btn:hover {
461
+ background: #f1f5f9;
462
+ color: #3b82f6;
463
+ border-color: #3b82f6;
464
+ }
465
+
466
+ /* 深色模式按钮 */
467
+ .dark .mermaid-fullscreen-btn {
468
+ background: rgba(30, 41, 59, 0.9);
469
+ border-color: #475569;
470
+ color: #94a3b8;
471
+ }
472
+
473
+ .dark .mermaid-fullscreen-btn:hover {
474
+ background: #334155;
475
+ color: #60a5fa;
476
+ border-color: #60a5fa;
477
+ }
478
+
479
+ /* 全屏模态框 */
480
+ .mermaid-fullscreen-modal {
481
+ position: fixed;
482
+ top: 0;
483
+ left: 0;
484
+ width: 100vw;
485
+ height: 100vh;
486
+ z-index: 9999;
487
+ display: none;
488
+ }
489
+
490
+ .mermaid-fullscreen-modal.active {
491
+ display: block;
492
+ }
493
+
494
+ /* 背景遮罩 */
495
+ .mermaid-fullscreen-backdrop {
496
+ position: absolute;
497
+ top: 0;
498
+ left: 0;
499
+ width: 100%;
500
+ height: 100%;
501
+ background: rgba(0, 0, 0, 0.85);
502
+ backdrop-filter: blur(4px);
503
+ }
504
+
505
+ /* 内容容器 */
506
+ .mermaid-fullscreen-container {
507
+ position: relative;
508
+ display: flex;
509
+ flex-direction: column;
510
+ width: 100%;
511
+ height: 100%;
512
+ z-index: 1;
513
+ }
514
+
515
+ /* 头部控制栏 */
516
+ .mermaid-fullscreen-header {
517
+ display: flex;
518
+ align-items: center;
519
+ justify-content: space-between;
520
+ padding: 1rem 1.5rem;
521
+ background: rgba(15, 23, 42, 0.95);
522
+ border-bottom: 1px solid #334155;
523
+ }
524
+
525
+ .mermaid-fullscreen-title {
526
+ font-size: 1rem;
527
+ font-weight: 500;
528
+ color: #e2e8f0;
529
+ }
530
+
531
+ .mermaid-fullscreen-controls {
532
+ display: flex;
533
+ align-items: center;
534
+ gap: 0.5rem;
535
+ }
536
+
537
+ /* 缩放按钮 */
538
+ .mermaid-zoom-btn {
539
+ display: flex;
540
+ align-items: center;
541
+ justify-content: center;
542
+ width: 36px;
543
+ height: 36px;
544
+ background: #334155;
545
+ border: 1px solid #475569;
546
+ border-radius: 0.375rem;
547
+ cursor: pointer;
548
+ color: #cbd5e1;
549
+ transition: all 0.2s ease;
550
+ }
551
+
552
+ .mermaid-zoom-btn:hover {
553
+ background: #475569;
554
+ color: #f1f5f9;
555
+ border-color: #64748b;
556
+ }
557
+
558
+ /* 缩放级别显示 */
559
+ .mermaid-zoom-level {
560
+ min-width: 50px;
561
+ text-align: center;
562
+ font-size: 0.875rem;
563
+ font-weight: 500;
564
+ color: #94a3b8;
565
+ padding: 0 0.5rem;
566
+ }
567
+
568
+ /* 关闭按钮 */
569
+ .mermaid-close-btn {
570
+ display: flex;
571
+ align-items: center;
572
+ justify-content: center;
573
+ width: 40px;
574
+ height: 40px;
575
+ background: transparent;
576
+ border: none;
577
+ border-radius: 0.375rem;
578
+ cursor: pointer;
579
+ color: #94a3b8;
580
+ margin-left: 0.5rem;
581
+ transition: all 0.2s ease;
582
+ }
583
+
584
+ .mermaid-close-btn:hover {
585
+ background: #ef4444;
586
+ color: white;
587
+ }
588
+
589
+ /* 内容区域 */
590
+ .mermaid-fullscreen-content {
591
+ flex: 1;
592
+ display: flex;
593
+ align-items: center;
594
+ justify-content: center;
595
+ overflow: auto;
596
+ padding: 2rem;
597
+ }
598
+
599
+ /* SVG 包装器 */
600
+ .mermaid-fullscreen-svg-wrapper {
601
+ display: flex;
602
+ align-items: center;
603
+ justify-content: center;
604
+ transform-origin: center center;
605
+ padding: 2rem;
606
+ background: white;
607
+ border-radius: 0.75rem;
608
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
609
+ cursor: grab;
610
+ user-select: none;
611
+ }
612
+
613
+ .mermaid-fullscreen-svg-wrapper:active {
614
+ cursor: grabbing;
615
+ }
616
+
617
+ .mermaid-fullscreen-svg-wrapper svg {
618
+ max-width: none;
619
+ height: auto;
620
+ pointer-events: none;
621
+ }
622
+
623
+ /* 深色模式 SVG 容器 */
624
+ .dark .mermaid-fullscreen-svg-wrapper {
625
+ background: #1e293b;
626
+ }
627
+
628
+ /* 响应式适配 */
629
+ @media (max-width: 640px) {
630
+ .mermaid-fullscreen-header {
631
+ padding: 0.75rem 1rem;
632
+ }
633
+
634
+ .mermaid-fullscreen-title {
635
+ font-size: 0.875rem;
636
+ }
637
+
638
+ .mermaid-zoom-btn {
639
+ width: 32px;
640
+ height: 32px;
641
+ }
642
+
643
+ .mermaid-close-btn {
644
+ width: 36px;
645
+ height: 36px;
646
+ }
647
+
648
+ .mermaid-fullscreen-content {
649
+ padding: 1rem;
650
+ }
651
+
652
+ .mermaid-fullscreen-svg-wrapper {
653
+ padding: 1rem;
654
+ }
655
+ }
656
+
657
+ /* ========== 深色模式文字对比度增强 ========== */
658
+ /* 放在文件末尾,确保优先级最高 */
659
+
660
+ /* prose 内容在深色模式下的对比度增强 */
661
+ .dark .prose p,
662
+ .dark .prose li,
663
+ .dark .prose-invert p,
664
+ .dark .prose-invert li {
665
+ color: #e2e8f0 !important; /* slate-200 */
666
+ }
667
+
668
+ /* prose-invert 的 CSS 变量覆盖 */
669
+ .dark .prose-invert {
670
+ --tw-prose-body: #e2e8f0; /* slate-200 */
671
+ --tw-prose-headings: #ffffff;
672
+ --tw-prose-lead: #cbd5e1; /* slate-300 */
673
+ --tw-prose-bold: #ffffff;
674
+ --tw-prose-counters: #cbd5e1;
675
+ --tw-prose-bullets: #cbd5e1;
676
+ }
677
+
678
+ /* 表格在深色模式下的对比度增强 */
679
+ .dark .prose table,
680
+ .dark .prose-invert table {
681
+ @apply border-slate-600;
682
+ }
683
+
684
+ .dark .prose th,
685
+ .dark .prose-invert th {
686
+ @apply text-slate-100 bg-slate-700 border-slate-600;
687
+ }
688
+
689
+ .dark .prose td,
690
+ .dark .prose-invert td {
691
+ @apply text-slate-200 border-slate-600;
692
+ }
693
+
694
+ .dark .prose tr,
695
+ .dark .prose-invert tr {
696
+ @apply border-slate-600;
697
+ }
698
+
699
+ .dark .prose tbody tr:nth-child(even),
700
+ .dark .prose-invert tbody tr:nth-child(even) {
701
+ @apply bg-slate-800/50;
702
+ }
703
+
704
+ .dark .prose tbody tr:hover,
705
+ .dark .prose-invert tbody tr:hover {
706
+ @apply bg-slate-700/50;
707
+ }
708
+
709
+ /* ========== 视频嵌入样式 ========== */
710
+
711
+ /* 视频容器基础样式 */
712
+ .video-container {
713
+ @apply relative w-full my-6 rounded-lg overflow-hidden bg-black shadow-lg;
714
+ }
715
+
716
+ .video-container iframe,
717
+ .video-container video {
718
+ @apply absolute top-0 left-0 w-full h-full;
719
+ }
720
+
721
+ /* 平台标识 */
722
+ .video-platform-badge {
723
+ @apply absolute top-3 left-3 flex items-center gap-1.5 px-2.5 py-1 rounded-md text-xs font-medium z-10 opacity-0 transition-opacity duration-200;
724
+ background: rgba(0, 0, 0, 0.7);
725
+ backdrop-filter: blur(4px);
726
+ }
727
+
728
+ .video-container:hover .video-platform-badge {
729
+ @apply opacity-100;
730
+ }
731
+
732
+ .video-platform-badge svg {
733
+ @apply w-4 h-4;
734
+ }
735
+
736
+ /* YouTube 样式 */
737
+ .youtube-video .video-platform-badge {
738
+ @apply text-red-400;
739
+ }
740
+
741
+ /* Bilibili 样式 */
742
+ .bilibili-video .video-platform-badge {
743
+ @apply text-pink-400;
744
+ }
745
+
746
+ /* 自托管视频样式 */
747
+ .self-hosted-video .video-platform-badge {
748
+ @apply text-blue-400;
749
+ }
750
+
751
+ /* 视频错误提示 */
752
+ .video-error {
753
+ @apply my-6 p-6 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg text-center;
754
+ }
755
+
756
+ .video-error p {
757
+ @apply text-red-600 dark:text-red-400 m-0;
758
+ }
759
+
760
+ /* 视频回退文字 */
761
+ .video-fallback {
762
+ @apply text-white text-center p-4;
763
+ }
764
+
765
+ .video-fallback a {
766
+ @apply text-blue-400 hover:text-blue-300 underline;
767
+ }
768
+
769
+ /* 响应式视频网格 */
770
+ .video-grid {
771
+ @apply grid gap-6 my-6;
772
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
773
+ }
774
+
775
+ .video-grid .video-container {
776
+ @apply my-0;
777
+ }
778
+
779
+ /* 视频标题样式 */
780
+ .video-title {
781
+ @apply mt-2 text-sm text-slate-600 dark:text-slate-400 text-center;
782
+ }
783
+
784
+ /* 视频加载占位 */
785
+ .video-container::before {
786
+ content: '';
787
+ @apply absolute inset-0 flex items-center justify-center bg-slate-800;
788
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2'%3E%3Cpolygon points='5 3 19 12 5 21 5 3'%3E%3C/polygon%3E%3C/svg%3E");
789
+ background-repeat: no-repeat;
790
+ background-position: center;
791
+ z-index: 0;
792
+ }
793
+
794
+ .video-container iframe,
795
+ .video-container video {
796
+ z-index: 1;
797
+ }
798
+
799
+ /* ========== Tabs 组件样式 ========== */
800
+
801
+ .custom-tabs {
802
+ @apply my-6 border border-slate-200 dark:border-slate-700 rounded-lg overflow-hidden;
803
+ }
804
+
805
+ .tabs-header {
806
+ @apply flex flex-wrap gap-0 bg-slate-100 dark:bg-slate-800 border-b border-slate-200 dark:border-slate-700;
807
+ }
808
+
809
+ .tab-button {
810
+ @apply px-4 py-3 text-sm font-medium text-slate-600 dark:text-slate-400 bg-transparent border-b-2 border-transparent transition-all duration-200 cursor-pointer;
811
+ }
812
+
813
+ .tab-button:hover {
814
+ @apply text-slate-900 dark:text-slate-200 bg-slate-50 dark:bg-slate-700/50;
815
+ }
816
+
817
+ .tab-button.active {
818
+ @apply text-primary-600 dark:text-primary-400 bg-white dark:bg-slate-900 border-b-2 border-primary-500;
819
+ }
820
+
821
+ .tabs-content {
822
+ @apply bg-white dark:bg-slate-900;
823
+ }
824
+
825
+ .tab-panel {
826
+ @apply hidden p-4;
827
+ }
828
+
829
+ .tab-panel.active {
830
+ @apply block;
831
+ }
832
+
833
+ /* Tab 内容样式 */
834
+ .tab-panel p {
835
+ @apply mb-3 last:mb-0 text-slate-700 dark:text-slate-300;
836
+ }
837
+
838
+ .tab-panel table {
839
+ @apply w-full my-3;
840
+ }
841
+
842
+ .tab-panel th {
843
+ @apply px-3 py-2 text-left text-sm font-semibold text-slate-900 dark:text-slate-100 bg-slate-50 dark:bg-slate-800 border border-slate-200 dark:border-slate-700;
844
+ }
845
+
846
+ .tab-panel td {
847
+ @apply px-3 py-2 text-sm text-slate-700 dark:text-slate-300 border border-slate-200 dark:border-slate-700;
848
+ }
849
+
850
+ .tab-panel blockquote {
851
+ @apply my-3 pl-4 py-2 border-l-4 border-primary-300 dark:border-primary-600 bg-primary-50 dark:bg-primary-900/20 rounded-r-lg;
852
+ }
853
+
854
+ .tab-panel blockquote p {
855
+ @apply text-slate-600 dark:text-slate-300 mb-0;
856
+ }
857
+
858
+ .tab-panel ul,
859
+ .tab-panel ol {
860
+ @apply my-3 pl-6;
861
+ }
862
+
863
+ .tab-panel li {
864
+ @apply mb-1 text-slate-700 dark:text-slate-300;
865
+ }
866
+
867
+ /* Tab 内的容器样式 */
868
+ .tab-panel .custom-container {
869
+ @apply my-3;
870
+ }