create-lumfall 1.0.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 (82) hide show
  1. package/README.md +44 -0
  2. package/cli.js +218 -0
  3. package/package.json +29 -0
  4. package/templates/basic/README.md +113 -0
  5. package/templates/basic/app/controller/demo.js +28 -0
  6. package/templates/basic/app/extend/README.md +3 -0
  7. package/templates/basic/app/middleware/README.md +2 -0
  8. package/templates/basic/app/middleware.js +13 -0
  9. package/templates/basic/app/pages/home/entry.home.js +4 -0
  10. package/templates/basic/app/pages/home/home.vue +164 -0
  11. package/templates/basic/app/router/demo.js +17 -0
  12. package/templates/basic/app/router-schema/demo.js +29 -0
  13. package/templates/basic/app/service/demo.js +51 -0
  14. package/templates/basic/app/webpack.config.js +4 -0
  15. package/templates/basic/build.js +7 -0
  16. package/templates/basic/config/config.beta.js +4 -0
  17. package/templates/basic/config/config.default.js +32 -0
  18. package/templates/basic/config/config.local.js +4 -0
  19. package/templates/basic/config/config.prod.js +6 -0
  20. package/templates/basic/package.json +31 -0
  21. package/templates/basic/server.js +26 -0
  22. package/templates/document/README.md +145 -0
  23. package/templates/document/app/extend/README.md +6 -0
  24. package/templates/document/app/middleware/README.md +2 -0
  25. package/templates/document/app/middleware.js +2 -0
  26. package/templates/document/app/pages/docs/assets/docs-logo.svg +5 -0
  27. package/templates/document/app/pages/docs/components/doc-layout.vue +144 -0
  28. package/templates/document/app/pages/docs/components/doc-navbar.vue +103 -0
  29. package/templates/document/app/pages/docs/components/doc-search.vue +131 -0
  30. package/templates/document/app/pages/docs/components/doc-sidebar.vue +29 -0
  31. package/templates/document/app/pages/docs/components/doc-toc.vue +21 -0
  32. package/templates/document/app/pages/docs/content.js +28 -0
  33. package/templates/document/app/pages/docs/docs-config.js +154 -0
  34. package/templates/document/app/pages/docs/docs.vue +24 -0
  35. package/templates/document/app/pages/docs/entry.docs.js +26 -0
  36. package/templates/document/app/pages/docs/markdown/highlight.js +30 -0
  37. package/templates/document/app/pages/docs/markdown/index.js +129 -0
  38. package/templates/document/app/pages/docs/search.js +142 -0
  39. package/templates/document/app/pages/docs/styles/docs.less +1091 -0
  40. package/templates/document/app/pages/docs/styles/vars.less +87 -0
  41. package/templates/document/app/pages/docs/theme.js +47 -0
  42. package/templates/document/app/pages/docs/utils.js +58 -0
  43. package/templates/document/app/pages/docs/views/doc-home.vue +56 -0
  44. package/templates/document/app/pages/docs/views/doc-page.vue +147 -0
  45. package/templates/document/app/webpack.config.js +15 -0
  46. package/templates/document/build.js +6 -0
  47. package/templates/document/config/config.beta.js +2 -0
  48. package/templates/document/config/config.default.js +9 -0
  49. package/templates/document/config/config.local.js +2 -0
  50. package/templates/document/config/config.prod.js +2 -0
  51. package/templates/document/docs/advanced/dashboard.md +66 -0
  52. package/templates/document/docs/advanced/health.md +72 -0
  53. package/templates/document/docs/advanced/monitoring.md +60 -0
  54. package/templates/document/docs/advanced/security.md +88 -0
  55. package/templates/document/docs/core/app-instance.md +114 -0
  56. package/templates/document/docs/core/controller-service.md +113 -0
  57. package/templates/document/docs/core/lifecycle.md +60 -0
  58. package/templates/document/docs/core/middleware.md +83 -0
  59. package/templates/document/docs/core/plugins.md +77 -0
  60. package/templates/document/docs/core/router-schema.md +102 -0
  61. package/templates/document/docs/dsl/api-contract.md +88 -0
  62. package/templates/document/docs/dsl/extend.md +311 -0
  63. package/templates/document/docs/dsl/menu.md +101 -0
  64. package/templates/document/docs/dsl/model-project.md +122 -0
  65. package/templates/document/docs/dsl/overview.md +116 -0
  66. package/templates/document/docs/dsl/reference.md +175 -0
  67. package/templates/document/docs/dsl/schema-actions.md +135 -0
  68. package/templates/document/docs/dsl/schema.md +121 -0
  69. package/templates/document/docs/frontend/build.md +118 -0
  70. package/templates/document/docs/frontend/curl.md +75 -0
  71. package/templates/document/docs/frontend/page.md +99 -0
  72. package/templates/document/docs/frontend/widgets.md +151 -0
  73. package/templates/document/docs/guide/config.md +108 -0
  74. package/templates/document/docs/guide/deployment.md +115 -0
  75. package/templates/document/docs/guide/getting-started.md +199 -0
  76. package/templates/document/docs/guide/introduction.md +55 -0
  77. package/templates/document/docs/guide/structure.md +98 -0
  78. package/templates/document/docs/reference/commands.md +70 -0
  79. package/templates/document/docs/reference/faq.md +94 -0
  80. package/templates/document/package.json +36 -0
  81. package/templates/document/scripts/build-static.js +129 -0
  82. package/templates/document/server.js +13 -0
@@ -0,0 +1,1091 @@
1
+ // 文档站布局与 markdown 排版样式。类名统一 doc- 前缀,避免与业务样式冲突。
2
+
3
+ * {
4
+ box-sizing: border-box;
5
+ }
6
+
7
+ // 注意:不要在 html 上全局设置 scroll-behavior: smooth,
8
+ // 平滑滚动由 doc-layout 的锚点点击处理用 scrollIntoView 实现
9
+ // (全局 smooth 会干扰自动化工具的元素稳定性检查)。
10
+
11
+ body {
12
+ margin: 0;
13
+ background-color: var(--doc-bg);
14
+ color: var(--doc-text-1);
15
+ font-family:
16
+ -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue",
17
+ "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
18
+ -webkit-font-smoothing: antialiased;
19
+ }
20
+
21
+ // 标题锚点跳转时给顶部导航留出空间
22
+ .doc-markdown h2,
23
+ .doc-markdown h3,
24
+ .doc-markdown h4 {
25
+ scroll-margin-top: 76px;
26
+ }
27
+
28
+ // ============ 布局骨架 ============
29
+
30
+ .doc-shell {
31
+ min-height: 100vh;
32
+ }
33
+
34
+ .doc-body {
35
+ display: flex;
36
+ align-items: flex-start;
37
+ padding-top: 60px;
38
+ }
39
+
40
+ .doc-main {
41
+ display: flex;
42
+ flex: 1 1 auto;
43
+ min-width: 0;
44
+ justify-content: center;
45
+ }
46
+
47
+ .doc-content-wrap {
48
+ width: 100%;
49
+ max-width: 780px;
50
+ padding: 32px 40px 80px;
51
+ min-width: 0;
52
+ }
53
+
54
+ .doc-desktop-sidebar {
55
+ flex: 0 0 auto;
56
+ }
57
+
58
+ .doc-toc-rail {
59
+ flex: 0 0 auto;
60
+ }
61
+
62
+ // ============ 顶部导航 ============
63
+
64
+ .doc-navbar {
65
+ position: fixed;
66
+ top: 0;
67
+ left: 0;
68
+ right: 0;
69
+ z-index: 100;
70
+ display: flex;
71
+ align-items: center;
72
+ justify-content: space-between;
73
+ height: 60px;
74
+ padding: 0 20px;
75
+ background-color: var(--doc-navbar-bg);
76
+ backdrop-filter: blur(10px);
77
+ border-bottom: 1px solid var(--doc-border);
78
+ }
79
+
80
+ .doc-navbar-left {
81
+ display: flex;
82
+ align-items: center;
83
+ gap: 4px;
84
+ min-width: 0;
85
+ }
86
+
87
+ .doc-navbar-burger {
88
+ display: none;
89
+ border: none;
90
+ background: none;
91
+ font-size: 18px;
92
+ padding: 6px 8px;
93
+ cursor: pointer;
94
+ color: var(--doc-text-1);
95
+ }
96
+
97
+ .doc-navbar-brand {
98
+ display: flex;
99
+ align-items: center;
100
+ gap: 10px;
101
+ margin-right: 20px;
102
+ text-decoration: none;
103
+ flex: 0 0 auto;
104
+ }
105
+
106
+ .doc-navbar-logo {
107
+ width: 28px;
108
+ height: 28px;
109
+ }
110
+
111
+ .doc-navbar-title {
112
+ font-size: 18px;
113
+ font-weight: 700;
114
+ color: var(--doc-text-1);
115
+ white-space: nowrap;
116
+ }
117
+
118
+ .doc-navbar-nav {
119
+ display: flex;
120
+ align-items: center;
121
+ gap: 4px;
122
+ overflow-x: auto;
123
+ }
124
+
125
+ .doc-navbar-link {
126
+ padding: 6px 12px;
127
+ border-radius: 8px;
128
+ font-size: 14px;
129
+ color: var(--doc-text-2);
130
+ text-decoration: none;
131
+ white-space: nowrap;
132
+ transition: color 0.2s, background-color 0.2s;
133
+
134
+ &:hover {
135
+ color: var(--doc-text-1);
136
+ background-color: var(--doc-bg-soft);
137
+ }
138
+
139
+ &.active {
140
+ color: var(--doc-brand);
141
+ font-weight: 500;
142
+ }
143
+ }
144
+
145
+ .doc-navbar-right {
146
+ display: flex;
147
+ align-items: center;
148
+ gap: 8px;
149
+ }
150
+
151
+ .doc-search-trigger {
152
+ display: flex;
153
+ align-items: center;
154
+ gap: 8px;
155
+ padding: 6px 10px;
156
+ border: 1px solid var(--doc-border);
157
+ border-radius: 8px;
158
+ background-color: var(--doc-bg-soft);
159
+ color: var(--doc-text-3);
160
+ font-size: 13px;
161
+ cursor: pointer;
162
+ transition: border-color 0.2s, color 0.2s;
163
+
164
+ &:hover {
165
+ color: var(--doc-text-2);
166
+ border-color: var(--doc-brand);
167
+ }
168
+
169
+ kbd {
170
+ font-family: inherit;
171
+ font-size: 11px;
172
+ padding: 1px 5px;
173
+ border: 1px solid var(--doc-border);
174
+ border-radius: 4px;
175
+ background-color: var(--doc-bg);
176
+ }
177
+ }
178
+
179
+ .doc-icon-btn {
180
+ display: inline-flex;
181
+ align-items: center;
182
+ justify-content: center;
183
+ width: 34px;
184
+ height: 34px;
185
+ border: none;
186
+ border-radius: 8px;
187
+ background: none;
188
+ color: var(--doc-text-2);
189
+ font-size: 16px;
190
+ cursor: pointer;
191
+ text-decoration: none;
192
+ transition: color 0.2s, background-color 0.2s;
193
+
194
+ &:hover {
195
+ color: var(--doc-text-1);
196
+ background-color: var(--doc-bg-soft);
197
+ }
198
+ }
199
+
200
+ // ============ 侧边栏 ============
201
+
202
+ .doc-sidebar {
203
+ width: 264px;
204
+ position: sticky;
205
+ top: 60px;
206
+ height: calc(100vh - 60px);
207
+ overflow-y: auto;
208
+ padding: 24px 16px 48px;
209
+ background-color: var(--doc-sidebar-bg);
210
+ border-right: 1px solid var(--doc-border);
211
+ }
212
+
213
+ .doc-sidebar-group {
214
+ margin-bottom: 24px;
215
+ }
216
+
217
+ .doc-sidebar-group-title {
218
+ padding: 0 12px;
219
+ margin-bottom: 6px;
220
+ font-size: 13px;
221
+ font-weight: 600;
222
+ color: var(--doc-text-1);
223
+ }
224
+
225
+ .doc-sidebar-link {
226
+ display: block;
227
+ padding: 6px 12px;
228
+ margin: 1px 0;
229
+ border-radius: 8px;
230
+ font-size: 13.5px;
231
+ line-height: 1.6;
232
+ color: var(--doc-text-2);
233
+ text-decoration: none;
234
+ transition: color 0.2s, background-color 0.2s;
235
+
236
+ &:hover {
237
+ color: var(--doc-text-1);
238
+ background-color: var(--doc-bg-soft);
239
+ }
240
+
241
+ &.active {
242
+ color: var(--doc-brand);
243
+ background-color: var(--doc-brand-soft);
244
+ font-weight: 500;
245
+ }
246
+ }
247
+
248
+ // 移动端抽屉
249
+ .doc-drawer-mask {
250
+ position: fixed;
251
+ inset: 0;
252
+ z-index: 90;
253
+ background-color: rgba(0, 0, 0, 0.4);
254
+ }
255
+
256
+ .doc-drawer-sidebar {
257
+ position: absolute;
258
+ top: 0;
259
+ left: 0;
260
+ bottom: 0;
261
+ border-right: 1px solid var(--doc-border);
262
+ box-shadow: var(--doc-shadow);
263
+ }
264
+
265
+ // ============ 目录(TOC) ============
266
+
267
+ .doc-toc {
268
+ width: 216px;
269
+ position: sticky;
270
+ top: 60px;
271
+ max-height: calc(100vh - 60px);
272
+ overflow-y: auto;
273
+ padding: 32px 20px 48px 8px;
274
+ }
275
+
276
+ .doc-toc-title {
277
+ font-size: 12px;
278
+ font-weight: 600;
279
+ color: var(--doc-text-3);
280
+ letter-spacing: 0.04em;
281
+ margin-bottom: 8px;
282
+ }
283
+
284
+ .doc-toc-link {
285
+ display: block;
286
+ padding: 4px 0 4px 12px;
287
+ font-size: 13px;
288
+ line-height: 1.5;
289
+ color: var(--doc-text-3);
290
+ text-decoration: none;
291
+ border-left: 1px solid var(--doc-border);
292
+ transition: color 0.2s, border-color 0.2s;
293
+
294
+ &:hover {
295
+ color: var(--doc-text-1);
296
+ }
297
+
298
+ &.active {
299
+ color: var(--doc-brand);
300
+ border-left-color: var(--doc-brand);
301
+ }
302
+
303
+ &.level-3 {
304
+ padding-left: 26px;
305
+ }
306
+ }
307
+
308
+ // ============ markdown 正文排版 ============
309
+
310
+ .doc-markdown {
311
+ font-size: 15px;
312
+ line-height: 1.8;
313
+ color: var(--doc-text-1);
314
+ word-wrap: break-word;
315
+
316
+ h1 {
317
+ margin: 8px 0 24px;
318
+ font-size: 30px;
319
+ font-weight: 700;
320
+ line-height: 1.3;
321
+ }
322
+
323
+ h2 {
324
+ margin: 40px 0 16px;
325
+ padding-bottom: 10px;
326
+ font-size: 22px;
327
+ font-weight: 600;
328
+ border-bottom: 1px solid var(--doc-border);
329
+ }
330
+
331
+ h3 {
332
+ margin: 28px 0 12px;
333
+ font-size: 18px;
334
+ font-weight: 600;
335
+ }
336
+
337
+ h4 {
338
+ margin: 20px 0 10px;
339
+ font-size: 16px;
340
+ font-weight: 600;
341
+ }
342
+
343
+ p {
344
+ margin: 0 0 14px;
345
+ }
346
+
347
+ a {
348
+ color: var(--doc-brand);
349
+ text-decoration: none;
350
+
351
+ &:hover {
352
+ text-decoration: underline;
353
+ }
354
+ }
355
+
356
+ ul,
357
+ ol {
358
+ margin: 0 0 14px;
359
+ padding-left: 24px;
360
+
361
+ li {
362
+ margin: 4px 0;
363
+ }
364
+ }
365
+
366
+ blockquote {
367
+ margin: 0 0 16px;
368
+ padding: 10px 16px;
369
+ border-left: 3px solid var(--doc-brand);
370
+ border-radius: 0 8px 8px 0;
371
+ background-color: var(--doc-bg-soft);
372
+ color: var(--doc-text-2);
373
+
374
+ p {
375
+ margin: 0;
376
+ }
377
+ }
378
+
379
+ table {
380
+ width: 100%;
381
+ margin: 0 0 18px;
382
+ border-collapse: collapse;
383
+ font-size: 14px;
384
+ display: block;
385
+ overflow-x: auto;
386
+
387
+ th,
388
+ td {
389
+ border: 1px solid var(--doc-border);
390
+ padding: 8px 14px;
391
+ text-align: left;
392
+ }
393
+
394
+ th {
395
+ background-color: var(--doc-bg-soft);
396
+ font-weight: 600;
397
+ white-space: nowrap;
398
+ }
399
+
400
+ tr:nth-child(2n) td {
401
+ background-color: var(--doc-bg-soft);
402
+ }
403
+ }
404
+
405
+ img {
406
+ max-width: 100%;
407
+ border-radius: 8px;
408
+ }
409
+
410
+ hr {
411
+ margin: 28px 0;
412
+ border: none;
413
+ border-top: 1px solid var(--doc-border);
414
+ }
415
+
416
+ // 行内代码
417
+ code:not(.hljs) {
418
+ padding: 2px 6px;
419
+ border-radius: 6px;
420
+ font-size: 0.88em;
421
+ background-color: var(--doc-inline-code-bg);
422
+ color: var(--doc-inline-code-text);
423
+ font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
424
+ }
425
+
426
+ h1 code,
427
+ h2 code,
428
+ h3 code,
429
+ h4 code,
430
+ td code {
431
+ font-size: 0.9em;
432
+ }
433
+ }
434
+
435
+ // 标题锚点 #
436
+ .doc-header-anchor {
437
+ margin-left: 6px;
438
+ font-size: 0.8em;
439
+ font-weight: 400;
440
+ opacity: 0;
441
+ transition: opacity 0.2s;
442
+
443
+ &:hover {
444
+ text-decoration: none !important;
445
+ }
446
+ }
447
+
448
+ .doc-markdown h2:hover .doc-header-anchor,
449
+ .doc-markdown h3:hover .doc-header-anchor,
450
+ .doc-markdown h4:hover .doc-header-anchor {
451
+ opacity: 1;
452
+ }
453
+
454
+ // ============ 代码块 ============
455
+
456
+ .doc-code-block {
457
+ margin: 0 0 18px;
458
+ border: 1px solid var(--doc-code-border);
459
+ border-radius: 10px;
460
+ overflow: hidden;
461
+ background-color: var(--doc-code-bg);
462
+
463
+ pre {
464
+ margin: 0;
465
+ padding: 14px 16px;
466
+ overflow-x: auto;
467
+ font-size: 13.5px;
468
+ line-height: 1.65;
469
+ background-color: var(--doc-code-bg);
470
+ }
471
+
472
+ code.hljs {
473
+ padding: 0;
474
+ background: none;
475
+ color: var(--doc-code-text);
476
+ font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
477
+ }
478
+ }
479
+
480
+ .doc-code-bar {
481
+ display: flex;
482
+ align-items: center;
483
+ justify-content: space-between;
484
+ padding: 6px 12px 6px 16px;
485
+ background-color: var(--doc-code-bar-bg);
486
+ border-bottom: 1px solid var(--doc-code-border);
487
+ }
488
+
489
+ .doc-code-lang {
490
+ font-size: 12px;
491
+ color: var(--doc-text-3);
492
+ font-family: "SFMono-Regular", Consolas, monospace;
493
+ }
494
+
495
+ .doc-code-copy {
496
+ border: none;
497
+ background: none;
498
+ padding: 2px 8px;
499
+ border-radius: 6px;
500
+ font-size: 12px;
501
+ color: var(--doc-text-3);
502
+ cursor: pointer;
503
+ transition: color 0.2s, background-color 0.2s;
504
+
505
+ &:hover {
506
+ color: var(--doc-text-1);
507
+ background-color: var(--doc-bg);
508
+ }
509
+ }
510
+
511
+ // highlight.js 语法高亮:全部走 CSS 变量,亮暗主题自动切换
512
+ .hljs-keyword,
513
+ .hljs-selector-tag,
514
+ .hljs-doctag {
515
+ color: var(--doc-hl-keyword);
516
+ }
517
+
518
+ .hljs-built_in {
519
+ color: var(--doc-hl-built-in);
520
+ }
521
+
522
+ .hljs-type,
523
+ .hljs-class .hljs-title {
524
+ color: var(--doc-hl-type);
525
+ }
526
+
527
+ .hljs-literal,
528
+ .hljs-number {
529
+ color: var(--doc-hl-literal);
530
+ }
531
+
532
+ .hljs-string,
533
+ .hljs-regexp,
534
+ .hljs-template-variable,
535
+ .hljs-char.escape_ {
536
+ color: var(--doc-hl-string);
537
+ }
538
+
539
+ .hljs-comment {
540
+ color: var(--doc-hl-comment);
541
+ font-style: italic;
542
+ }
543
+
544
+ .hljs-title,
545
+ .hljs-title.function_,
546
+ .hljs-function {
547
+ color: var(--doc-hl-function);
548
+ }
549
+
550
+ .hljs-tag,
551
+ .hljs-name {
552
+ color: var(--doc-hl-tag);
553
+ }
554
+
555
+ .hljs-attr,
556
+ .hljs-attribute,
557
+ .hljs-property {
558
+ color: var(--doc-hl-attr);
559
+ }
560
+
561
+ .hljs-variable,
562
+ .hljs-params {
563
+ color: var(--doc-hl-variable);
564
+ }
565
+
566
+ .hljs-meta,
567
+ .hljs-meta .hljs-keyword,
568
+ .hljs-meta .hljs-string {
569
+ color: var(--doc-hl-meta);
570
+ }
571
+
572
+ .hljs-section,
573
+ .hljs-symbol,
574
+ .hljs-bullet {
575
+ color: var(--doc-hl-section);
576
+ }
577
+
578
+ .hljs-selector-id,
579
+ .hljs-selector-class,
580
+ .hljs-selector-attr,
581
+ .hljs-selector-pseudo {
582
+ color: var(--doc-hl-selector);
583
+ }
584
+
585
+ .hljs-addition {
586
+ background-color: var(--doc-hl-addition-bg);
587
+ }
588
+
589
+ .hljs-deletion {
590
+ background-color: var(--doc-hl-deletion-bg);
591
+ }
592
+
593
+ .hljs-emphasis {
594
+ font-style: italic;
595
+ }
596
+
597
+ .hljs-strong {
598
+ font-weight: 600;
599
+ }
600
+
601
+ // ============ 提示块(::: tip / info / warning / danger) ============
602
+
603
+ .doc-container {
604
+ margin: 0 0 16px;
605
+ padding: 12px 16px;
606
+ border-radius: 8px;
607
+ border-left: 3px solid var(--doc-border);
608
+ background-color: var(--doc-bg-soft);
609
+ font-size: 14px;
610
+
611
+ .doc-container-title {
612
+ margin: 0 0 6px;
613
+ font-weight: 600;
614
+ font-size: 14px;
615
+ }
616
+
617
+ p {
618
+ margin: 0 0 8px;
619
+
620
+ &:last-child {
621
+ margin-bottom: 0;
622
+ }
623
+ }
624
+ }
625
+
626
+ .doc-container-tip {
627
+ border-left-color: #00b42a;
628
+
629
+ .doc-container-title {
630
+ color: #00b42a;
631
+ }
632
+ }
633
+
634
+ .doc-container-info {
635
+ border-left-color: var(--doc-brand);
636
+
637
+ .doc-container-title {
638
+ color: var(--doc-brand);
639
+ }
640
+ }
641
+
642
+ .doc-container-warning {
643
+ border-left-color: #ff7d00;
644
+
645
+ .doc-container-title {
646
+ color: #ff7d00;
647
+ }
648
+ }
649
+
650
+ .doc-container-danger {
651
+ border-left-color: #f53f3f;
652
+
653
+ .doc-container-title {
654
+ color: #f53f3f;
655
+ }
656
+ }
657
+
658
+ // ============ 上一篇 / 下一篇 ============
659
+
660
+ .doc-pager {
661
+ display: flex;
662
+ justify-content: space-between;
663
+ gap: 16px;
664
+ margin-top: 48px;
665
+ padding-top: 24px;
666
+ border-top: 1px solid var(--doc-border);
667
+ }
668
+
669
+ .doc-pager-item {
670
+ display: flex;
671
+ flex-direction: column;
672
+ gap: 4px;
673
+ padding: 12px 16px;
674
+ border: 1px solid var(--doc-border);
675
+ border-radius: 10px;
676
+ text-decoration: none;
677
+ max-width: 48%;
678
+ transition: border-color 0.2s, box-shadow 0.2s;
679
+
680
+ &:hover {
681
+ border-color: var(--doc-brand);
682
+ box-shadow: var(--doc-shadow);
683
+ }
684
+
685
+ .doc-pager-label {
686
+ font-size: 12px;
687
+ color: var(--doc-text-3);
688
+ }
689
+
690
+ .doc-pager-title {
691
+ display: flex;
692
+ align-items: center;
693
+ gap: 4px;
694
+ font-size: 14px;
695
+ font-weight: 500;
696
+ color: var(--doc-brand);
697
+ }
698
+
699
+ &.next {
700
+ margin-left: auto;
701
+ text-align: right;
702
+ }
703
+
704
+ &.placeholder {
705
+ border: none;
706
+ }
707
+ }
708
+
709
+ .doc-content-footer {
710
+ margin-top: 20px;
711
+ font-size: 12.5px;
712
+ color: var(--doc-text-3);
713
+ text-align: center;
714
+ }
715
+
716
+ // ============ 404 ============
717
+
718
+ .doc-not-found {
719
+ padding: 80px 0;
720
+ text-align: center;
721
+
722
+ h1 {
723
+ font-size: 64px;
724
+ margin: 0 0 16px;
725
+ color: var(--doc-text-2);
726
+ }
727
+
728
+ p {
729
+ color: var(--doc-text-2);
730
+ }
731
+
732
+ code {
733
+ padding: 2px 6px;
734
+ border-radius: 6px;
735
+ background-color: var(--doc-inline-code-bg);
736
+ color: var(--doc-inline-code-text);
737
+ }
738
+
739
+ .doc-not-found-home {
740
+ display: inline-block;
741
+ margin-top: 12px;
742
+ color: var(--doc-brand);
743
+ text-decoration: none;
744
+ }
745
+ }
746
+
747
+ // ============ 首页 ============
748
+
749
+ .doc-home {
750
+ width: 100%;
751
+ max-width: 1080px;
752
+ padding: 72px 32px 64px;
753
+ }
754
+
755
+ .doc-hero {
756
+ text-align: center;
757
+
758
+ .doc-hero-name {
759
+ margin: 0 0 12px;
760
+ font-size: 52px;
761
+ font-weight: 800;
762
+ line-height: 1.2;
763
+ background: linear-gradient(120deg, var(--doc-brand) 20%, #14c9c9 80%);
764
+ -webkit-background-clip: text;
765
+ background-clip: text;
766
+ -webkit-text-fill-color: transparent;
767
+ }
768
+
769
+ .doc-hero-tagline {
770
+ margin: 0 0 16px;
771
+ font-size: 24px;
772
+ font-weight: 600;
773
+ color: var(--doc-text-1);
774
+ }
775
+
776
+ .doc-hero-text {
777
+ margin: 0 auto 32px;
778
+ max-width: 640px;
779
+ font-size: 15.5px;
780
+ line-height: 1.8;
781
+ color: var(--doc-text-2);
782
+ }
783
+
784
+ .doc-hero-actions {
785
+ display: flex;
786
+ justify-content: center;
787
+ gap: 14px;
788
+ }
789
+
790
+ .doc-hero-btn {
791
+ display: inline-flex;
792
+ align-items: center;
793
+ padding: 10px 26px;
794
+ border-radius: 10px;
795
+ border: 1px solid var(--doc-border);
796
+ font-size: 15px;
797
+ font-weight: 500;
798
+ color: var(--doc-text-1);
799
+ text-decoration: none;
800
+ transition: all 0.2s;
801
+
802
+ &:hover {
803
+ border-color: var(--doc-brand);
804
+ color: var(--doc-brand);
805
+ }
806
+
807
+ &.brand {
808
+ background-color: var(--doc-brand);
809
+ border-color: var(--doc-brand);
810
+ color: #fff;
811
+
812
+ &:hover {
813
+ color: #fff;
814
+ opacity: 0.88;
815
+ }
816
+ }
817
+
818
+ &.brand-outline {
819
+ border-color: var(--doc-brand);
820
+ color: var(--doc-brand);
821
+ background-color: var(--doc-brand-soft);
822
+
823
+ &:hover {
824
+ opacity: 0.85;
825
+ }
826
+ }
827
+ }
828
+ }
829
+
830
+ .doc-features {
831
+ display: grid;
832
+ grid-template-columns: repeat(3, 1fr);
833
+ gap: 18px;
834
+ margin-top: 72px;
835
+ }
836
+
837
+ .doc-feature-card {
838
+ padding: 22px;
839
+ border: 1px solid var(--doc-border);
840
+ border-radius: 12px;
841
+ background-color: var(--doc-bg);
842
+ transition: box-shadow 0.2s, transform 0.2s;
843
+
844
+ &:hover {
845
+ box-shadow: var(--doc-shadow);
846
+ transform: translateY(-2px);
847
+ }
848
+
849
+ .doc-feature-icon {
850
+ font-size: 26px;
851
+ margin-bottom: 10px;
852
+ }
853
+
854
+ .doc-feature-title {
855
+ margin: 0 0 8px;
856
+ font-size: 16px;
857
+ font-weight: 600;
858
+ color: var(--doc-text-1);
859
+ }
860
+
861
+ .doc-feature-details {
862
+ margin: 0;
863
+ font-size: 13.5px;
864
+ line-height: 1.7;
865
+ color: var(--doc-text-2);
866
+ }
867
+ }
868
+
869
+ .doc-home-footer {
870
+ margin-top: 72px;
871
+ text-align: center;
872
+ font-size: 13px;
873
+ color: var(--doc-text-3);
874
+ }
875
+
876
+ // ============ 搜索弹窗 ============
877
+
878
+ .doc-search-mask {
879
+ position: fixed;
880
+ inset: 0;
881
+ z-index: 200;
882
+ background-color: rgba(0, 0, 0, 0.45);
883
+ display: flex;
884
+ justify-content: center;
885
+ align-items: flex-start;
886
+ padding: 12vh 16px 0;
887
+ }
888
+
889
+ .doc-search-panel {
890
+ width: 100%;
891
+ max-width: 620px;
892
+ max-height: 70vh;
893
+ display: flex;
894
+ flex-direction: column;
895
+ background-color: var(--doc-bg);
896
+ border: 1px solid var(--doc-border);
897
+ border-radius: 14px;
898
+ box-shadow: var(--doc-shadow);
899
+ overflow: hidden;
900
+ }
901
+
902
+ .doc-search-input-row {
903
+ display: flex;
904
+ align-items: center;
905
+ gap: 10px;
906
+ padding: 14px 16px;
907
+ border-bottom: 1px solid var(--doc-border);
908
+
909
+ .doc-search-icon {
910
+ font-size: 16px;
911
+ color: var(--doc-text-3);
912
+ }
913
+ }
914
+
915
+ .doc-search-input {
916
+ flex: 1;
917
+ border: none;
918
+ outline: none;
919
+ background: none;
920
+ font-size: 15px;
921
+ color: var(--doc-text-1);
922
+
923
+ &::placeholder {
924
+ color: var(--doc-text-3);
925
+ }
926
+ }
927
+
928
+ .doc-search-kbd {
929
+ font-family: inherit;
930
+ font-size: 11px;
931
+ padding: 2px 6px;
932
+ border: 1px solid var(--doc-border);
933
+ border-radius: 4px;
934
+ color: var(--doc-text-3);
935
+ }
936
+
937
+ .doc-search-results {
938
+ flex: 1;
939
+ overflow-y: auto;
940
+ padding: 8px;
941
+ }
942
+
943
+ .doc-search-empty {
944
+ padding: 32px 16px;
945
+ text-align: center;
946
+ font-size: 13.5px;
947
+ color: var(--doc-text-3);
948
+ }
949
+
950
+ .doc-search-item {
951
+ display: block;
952
+ padding: 10px 12px;
953
+ border-radius: 8px;
954
+ cursor: pointer;
955
+ text-decoration: none;
956
+
957
+ &.active {
958
+ background-color: var(--doc-brand-soft);
959
+ }
960
+
961
+ .doc-search-item-title {
962
+ font-size: 14.5px;
963
+ font-weight: 600;
964
+ color: var(--doc-text-1);
965
+
966
+ mark {
967
+ background-color: var(--doc-mark-bg);
968
+ color: inherit;
969
+ border-radius: 2px;
970
+ padding: 0 1px;
971
+ }
972
+ }
973
+
974
+ .doc-search-item-heading {
975
+ display: flex;
976
+ align-items: center;
977
+ gap: 4px;
978
+ margin-top: 2px;
979
+ font-size: 12.5px;
980
+ color: var(--doc-brand);
981
+ }
982
+
983
+ .doc-search-item-snippet {
984
+ margin-top: 4px;
985
+ font-size: 12.5px;
986
+ line-height: 1.6;
987
+ color: var(--doc-text-3);
988
+ overflow: hidden;
989
+ text-overflow: ellipsis;
990
+ display: -webkit-box;
991
+ -webkit-line-clamp: 2;
992
+ -webkit-box-orient: vertical;
993
+
994
+ mark {
995
+ background-color: var(--doc-mark-bg);
996
+ color: inherit;
997
+ border-radius: 2px;
998
+ padding: 0 1px;
999
+ }
1000
+ }
1001
+ }
1002
+
1003
+ .doc-search-footer {
1004
+ display: flex;
1005
+ gap: 16px;
1006
+ padding: 10px 16px;
1007
+ border-top: 1px solid var(--doc-border);
1008
+ font-size: 12px;
1009
+ color: var(--doc-text-3);
1010
+
1011
+ kbd {
1012
+ font-family: inherit;
1013
+ font-size: 11px;
1014
+ padding: 1px 5px;
1015
+ margin-right: 2px;
1016
+ border: 1px solid var(--doc-border);
1017
+ border-radius: 4px;
1018
+ }
1019
+ }
1020
+
1021
+ // ============ 过渡动画 ============
1022
+
1023
+ .doc-fade-enter-active,
1024
+ .doc-fade-leave-active {
1025
+ transition: opacity 0.18s ease;
1026
+ }
1027
+
1028
+ .doc-fade-enter-from,
1029
+ .doc-fade-leave-to {
1030
+ opacity: 0;
1031
+ }
1032
+
1033
+ // ============ 响应式 ============
1034
+
1035
+ @media (max-width: 1280px) {
1036
+ .doc-toc-rail {
1037
+ display: none;
1038
+ }
1039
+ }
1040
+
1041
+ @media (max-width: 960px) {
1042
+ .doc-desktop-sidebar {
1043
+ display: none;
1044
+ }
1045
+
1046
+ .doc-navbar-burger {
1047
+ display: inline-flex;
1048
+ }
1049
+
1050
+ .doc-navbar-nav {
1051
+ display: none;
1052
+ }
1053
+
1054
+ .doc-content-wrap {
1055
+ padding: 24px 20px 64px;
1056
+ }
1057
+
1058
+ .doc-home {
1059
+ padding: 48px 20px 48px;
1060
+ }
1061
+
1062
+ .doc-hero .doc-hero-name {
1063
+ font-size: 40px;
1064
+ }
1065
+
1066
+ .doc-hero .doc-hero-tagline {
1067
+ font-size: 20px;
1068
+ }
1069
+
1070
+ .doc-features {
1071
+ grid-template-columns: repeat(2, 1fr);
1072
+ }
1073
+
1074
+ .doc-search-trigger-text {
1075
+ display: none;
1076
+ }
1077
+ }
1078
+
1079
+ @media (max-width: 600px) {
1080
+ .doc-features {
1081
+ grid-template-columns: 1fr;
1082
+ }
1083
+
1084
+ .doc-pager {
1085
+ flex-direction: column;
1086
+
1087
+ .doc-pager-item {
1088
+ max-width: 100%;
1089
+ }
1090
+ }
1091
+ }