mcp-probe-kit 1.15.1 → 2.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 (162) hide show
  1. package/README.md +113 -1642
  2. package/build/index.js +75 -42
  3. package/build/lib/elicitation-helper.d.ts +73 -0
  4. package/build/lib/elicitation-helper.js +130 -0
  5. package/build/lib/response.d.ts +32 -0
  6. package/build/lib/response.js +28 -0
  7. package/build/lib/tasks-manager.d.ts +116 -0
  8. package/build/lib/tasks-manager.js +217 -0
  9. package/build/lib/toolset-manager.d.ts +48 -0
  10. package/build/lib/toolset-manager.js +112 -0
  11. package/build/schemas/basic-tools.d.ts +0 -32
  12. package/build/schemas/basic-tools.js +0 -34
  13. package/build/schemas/code-analysis-tools.d.ts +0 -36
  14. package/build/schemas/code-analysis-tools.js +0 -38
  15. package/build/schemas/code-gen-tools.d.ts +0 -44
  16. package/build/schemas/code-gen-tools.js +0 -46
  17. package/build/schemas/doc-util-tools.d.ts +0 -54
  18. package/build/schemas/doc-util-tools.js +0 -58
  19. package/build/schemas/index.d.ts +0 -188
  20. package/build/schemas/orchestration-tools.d.ts +0 -22
  21. package/build/schemas/orchestration-tools.js +0 -23
  22. package/build/schemas/output/core-tools.d.ts +817 -0
  23. package/build/schemas/output/core-tools.js +421 -0
  24. package/build/schemas/output/generation-tools.d.ts +936 -0
  25. package/build/schemas/output/generation-tools.js +446 -0
  26. package/build/schemas/output/helper-tools.d.ts +243 -0
  27. package/build/schemas/output/helper-tools.js +138 -0
  28. package/build/schemas/output/index.d.ts +76 -0
  29. package/build/schemas/output/index.js +96 -0
  30. package/build/schemas/output/project-tools.d.ts +702 -0
  31. package/build/schemas/output/project-tools.js +339 -0
  32. package/build/schemas/output/ui-ux-tools.d.ts +469 -0
  33. package/build/schemas/output/ui-ux-tools.js +218 -0
  34. package/build/schemas/output/workflow-tools.d.ts +267 -0
  35. package/build/schemas/output/workflow-tools.js +179 -0
  36. package/build/schemas/structured-output.d.ts +1317 -0
  37. package/build/schemas/structured-output.js +1017 -0
  38. package/build/tools/__tests__/start_ui.integration.test.js +5 -5
  39. package/build/tools/__tests__/start_ui.property.test.js +11 -11
  40. package/build/tools/add_feature.d.ts +1 -13
  41. package/build/tools/add_feature.js +48 -13
  42. package/build/tools/analyze_project.js +57 -18
  43. package/build/tools/check_deps.d.ts +1 -13
  44. package/build/tools/check_deps.js +24 -15
  45. package/build/tools/code_review.d.ts +1 -13
  46. package/build/tools/code_review.js +19 -16
  47. package/build/tools/debug.d.ts +1 -13
  48. package/build/tools/debug.js +18 -16
  49. package/build/tools/estimate.d.ts +1 -19
  50. package/build/tools/estimate.js +36 -6
  51. package/build/tools/fix_bug.d.ts +1 -13
  52. package/build/tools/fix_bug.js +24 -6
  53. package/build/tools/gen_mock.d.ts +1 -19
  54. package/build/tools/gen_mock.js +42 -227
  55. package/build/tools/genapi.d.ts +1 -13
  56. package/build/tools/genapi.js +18 -15
  57. package/build/tools/genchangelog.d.ts +1 -13
  58. package/build/tools/genchangelog.js +36 -212
  59. package/build/tools/gencommit.d.ts +1 -7
  60. package/build/tools/gencommit.js +21 -13
  61. package/build/tools/gendoc.d.ts +1 -13
  62. package/build/tools/gendoc.js +18 -15
  63. package/build/tools/genpr.d.ts +1 -13
  64. package/build/tools/genpr.js +28 -157
  65. package/build/tools/genreadme.d.ts +1 -13
  66. package/build/tools/genreadme.js +22 -587
  67. package/build/tools/gensql.d.ts +1 -13
  68. package/build/tools/gensql.js +24 -283
  69. package/build/tools/gentest.d.ts +1 -13
  70. package/build/tools/gentest.js +49 -16
  71. package/build/tools/index.d.ts +0 -10
  72. package/build/tools/index.js +0 -10
  73. package/build/tools/init_component_catalog.d.ts +3 -20
  74. package/build/tools/init_component_catalog.js +141 -786
  75. package/build/tools/init_project.d.ts +7 -13
  76. package/build/tools/init_project.js +54 -16
  77. package/build/tools/init_project_context.d.ts +1 -13
  78. package/build/tools/init_project_context.js +41 -14
  79. package/build/tools/perf.d.ts +1 -13
  80. package/build/tools/perf.js +18 -15
  81. package/build/tools/refactor.d.ts +1 -13
  82. package/build/tools/refactor.js +54 -15
  83. package/build/tools/render_ui.d.ts +2 -19
  84. package/build/tools/render_ui.js +201 -347
  85. package/build/tools/resolve_conflict.d.ts +1 -13
  86. package/build/tools/resolve_conflict.js +18 -15
  87. package/build/tools/security_scan.d.ts +1 -13
  88. package/build/tools/security_scan.js +16 -5
  89. package/build/tools/start_api.d.ts +7 -13
  90. package/build/tools/start_api.js +69 -157
  91. package/build/tools/start_bugfix.d.ts +1 -7
  92. package/build/tools/start_bugfix.js +38 -2
  93. package/build/tools/start_doc.d.ts +7 -13
  94. package/build/tools/start_doc.js +76 -169
  95. package/build/tools/start_feature.d.ts +1 -7
  96. package/build/tools/start_feature.js +54 -2
  97. package/build/tools/start_onboard.d.ts +1 -7
  98. package/build/tools/start_onboard.js +40 -2
  99. package/build/tools/start_ralph.d.ts +1 -7
  100. package/build/tools/start_ralph.js +88 -2
  101. package/build/tools/start_refactor.d.ts +7 -13
  102. package/build/tools/start_refactor.js +75 -148
  103. package/build/tools/start_release.d.ts +7 -13
  104. package/build/tools/start_release.js +56 -131
  105. package/build/tools/start_review.d.ts +7 -13
  106. package/build/tools/start_review.js +70 -142
  107. package/build/tools/start_ui.d.ts +1 -7
  108. package/build/tools/start_ui.js +98 -8
  109. package/build/tools/ui-ux-tools.d.ts +3 -39
  110. package/build/tools/ui-ux-tools.js +201 -125
  111. package/docs/data/tools.js +864 -0
  112. package/docs/index.html +594 -0
  113. package/docs/pages/all-tools.html +649 -0
  114. package/docs/pages/examples.html +564 -0
  115. package/docs/pages/getting-started.html +529 -0
  116. package/docs/pages/migration.html +308 -0
  117. package/docs/specs/algorithm-enhancement/roadmap.md +619 -0
  118. package/docs/specs/vnext-upgrade/00-OVERVIEW.md +258 -0
  119. package/docs/specs/vnext-upgrade/BETA_RELEASE_GUIDE.md +328 -0
  120. package/docs/specs/vnext-upgrade/GITHUB_DISCUSSION_TEMPLATE.md +236 -0
  121. package/docs/specs/vnext-upgrade/M8.9-PROGRESS-UPDATE.md +248 -0
  122. package/docs/specs/vnext-upgrade/PROGRESS-SUMMARY.md +195 -0
  123. package/docs/specs/vnext-upgrade/QUICK_REFERENCE.md +338 -0
  124. package/docs/specs/vnext-upgrade/README.md +125 -0
  125. package/docs/specs/vnext-upgrade/STATUS-UPDATE-2026-01-26.md +230 -0
  126. package/docs/specs/vnext-upgrade/TOOL_CLEANUP.md +343 -0
  127. package/docs/specs/vnext-upgrade/completed/M1-M2-SUMMARY.md +27 -0
  128. package/docs/specs/vnext-upgrade/completed/M3_COMPLETION_SUMMARY.md +273 -0
  129. package/docs/specs/vnext-upgrade/completed/M4-SUMMARY.md +19 -0
  130. package/docs/specs/vnext-upgrade/completed/M5_COMPLETION_SUMMARY.md +0 -0
  131. package/docs/specs/vnext-upgrade/completed/M8.1-SUMMARY.md +247 -0
  132. package/docs/specs/vnext-upgrade/completed/M8.2-SUMMARY.md +296 -0
  133. package/docs/specs/vnext-upgrade/completed/M8.3-SUMMARY.md +241 -0
  134. package/docs/specs/vnext-upgrade/completed/M8.3-TEST-SUMMARY.md +216 -0
  135. package/docs/specs/vnext-upgrade/completed/M8.4-SUMMARY.md +217 -0
  136. package/docs/specs/vnext-upgrade/completed/M8.4-TEST-SUMMARY.md +198 -0
  137. package/docs/specs/vnext-upgrade/completed/M8.5-SUMMARY.md +202 -0
  138. package/docs/specs/vnext-upgrade/completed/M8.5-TEST-SUMMARY.md +223 -0
  139. package/docs/specs/vnext-upgrade/completed/M8.6-SUMMARY.md +299 -0
  140. package/docs/specs/vnext-upgrade/completed/M8.8-TEST-SUMMARY.md +216 -0
  141. package/docs/specs/vnext-upgrade/completed/TOOL-CLEANUP-SUMMARY.md +210 -0
  142. package/docs/specs/vnext-upgrade/design.md +848 -0
  143. package/docs/specs/vnext-upgrade/requirements.md +221 -0
  144. package/docs/specs/vnext-upgrade/tasks/00-INDEX.md +335 -0
  145. package/docs/specs/vnext-upgrade/tasks/M8.1-SCHEMA-DEFINITION.md +300 -0
  146. package/docs/specs/vnext-upgrade/tasks/M8.2-P1-TOOLS.md +249 -0
  147. package/docs/specs/vnext-upgrade/tasks/M8.3-GENERATION-TOOLS.md +49 -0
  148. package/docs/specs/vnext-upgrade/tasks/M8.4-ORCHESTRATION-TOOLS.md +28 -0
  149. package/docs/specs/vnext-upgrade/tasks/M8.5-PROJECT-TOOLS.md +29 -0
  150. package/docs/specs/vnext-upgrade/tasks/M8.6-UI-TOOLS.md +66 -0
  151. package/docs/specs/vnext-upgrade/tasks/M8.7-HELPER-TOOLS.md +24 -0
  152. package/docs/specs/vnext-upgrade/tasks/M8.8-INTEGRATION-TESTS.md +90 -0
  153. package/docs/specs/vnext-upgrade/tasks/M8.9-DOCUMENTATION.md +103 -0
  154. package/docs/styles/docs.css +556 -0
  155. package/docs/styles/page.css +815 -0
  156. package/docs/vnext/MCP_2025-11-25_GUIDE.md +276 -0
  157. package/docs/vnext/vNext-PRD.md +488 -0
  158. package/package.json +6 -6
  159. package/docs/BEST_PRACTICES.md +0 -1185
  160. package/docs/HOW_TO_TRIGGER.md +0 -1141
  161. package/docs/MCP-Probe-Kit-/344/275/277/347/224/250/346/211/213/345/206/214.html +0 -544
  162. package/docs/MCP-Probe-Kit-/344/275/277/347/224/250/346/211/213/345/206/214.md +0 -1447
@@ -0,0 +1,815 @@
1
+ /* MCP Probe Kit - 内页统一样式 */
2
+
3
+ * {
4
+ margin: 0;
5
+ padding: 0;
6
+ box-sizing: border-box;
7
+ }
8
+
9
+ /* 移除点击后的蓝色边框 */
10
+ *:focus {
11
+ outline: none;
12
+ }
13
+
14
+ /* 为键盘导航用户保留可访问性 */
15
+ *:focus-visible {
16
+ outline: 2px solid var(--primary);
17
+ outline-offset: 2px;
18
+ }
19
+
20
+ :root {
21
+ --primary: #2563EB;
22
+ --primary-hover: #1D4ED8;
23
+ --text-primary: #0F172A;
24
+ --text-secondary: #475569;
25
+ --text-tertiary: #64748B;
26
+ --bg-page: #F8FAFC;
27
+ --bg-card: #FFFFFF;
28
+ --bg-hover: #F1F5F9;
29
+ --border: #E2E8F0;
30
+ --border-hover: #CBD5E1;
31
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
32
+ --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07);
33
+ --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);
34
+ --spacing-xs: 4px;
35
+ --spacing-sm: 8px;
36
+ --spacing-md: 16px;
37
+ --spacing-lg: 24px;
38
+ --spacing-xl: 32px;
39
+ }
40
+
41
+ body {
42
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
43
+ background: var(--bg-page);
44
+ color: var(--text-primary);
45
+ line-height: 1.7;
46
+ min-height: 100vh;
47
+ display: flex;
48
+ flex-direction: column;
49
+ }
50
+
51
+ /* ========== Topbar ========== */
52
+ .topbar {
53
+ position: sticky;
54
+ top: 0;
55
+ z-index: 100;
56
+ background: rgba(255, 255, 255, 0.95);
57
+ backdrop-filter: blur(10px);
58
+ border-bottom: 1px solid var(--border);
59
+ height: 60px;
60
+ transition: box-shadow 0.2s;
61
+ }
62
+
63
+ .topbar.scrolled {
64
+ box-shadow: var(--shadow-sm);
65
+ }
66
+
67
+ .topbar-container {
68
+ max-width: 100%;
69
+ height: 100%;
70
+ padding: 0 var(--spacing-lg);
71
+ display: flex;
72
+ align-items: center;
73
+ justify-content: space-between;
74
+ gap: var(--spacing-lg);
75
+ }
76
+
77
+ .topbar-brand {
78
+ display: flex;
79
+ align-items: center;
80
+ gap: var(--spacing-sm);
81
+ font-size: 16px;
82
+ font-weight: 600;
83
+ color: var(--text-primary);
84
+ text-decoration: none;
85
+ transition: color 0.2s;
86
+ white-space: nowrap;
87
+ }
88
+
89
+ .topbar-brand:hover {
90
+ color: var(--primary);
91
+ }
92
+
93
+ .topbar-actions {
94
+ display: flex;
95
+ align-items: center;
96
+ gap: var(--spacing-lg);
97
+ }
98
+
99
+ .topbar-link {
100
+ color: var(--text-secondary);
101
+ text-decoration: none;
102
+ font-size: 14px;
103
+ font-weight: 500;
104
+ transition: color 0.2s;
105
+ display: flex;
106
+ align-items: center;
107
+ gap: 4px;
108
+ white-space: nowrap;
109
+ }
110
+
111
+ .topbar-link:hover {
112
+ color: var(--primary);
113
+ }
114
+
115
+ .topbar-link.external::after {
116
+ content: "↗";
117
+ font-size: 12px;
118
+ }
119
+
120
+ /* ========== Layout ========== */
121
+ .layout {
122
+ display: flex;
123
+ flex: 1;
124
+ position: relative;
125
+ }
126
+
127
+ /* ========== Sidebar ========== */
128
+ .sidebar {
129
+ width: 260px;
130
+ background: var(--bg-card);
131
+ border-right: 1px solid var(--border);
132
+ position: fixed;
133
+ left: 0;
134
+ top: 60px;
135
+ bottom: 0;
136
+ overflow-y: auto;
137
+ overflow-x: hidden;
138
+ z-index: 50;
139
+ display: flex;
140
+ flex-direction: column;
141
+ }
142
+
143
+ .sidebar::-webkit-scrollbar {
144
+ width: 4px;
145
+ }
146
+
147
+ .sidebar::-webkit-scrollbar-track {
148
+ background: transparent;
149
+ }
150
+
151
+ .sidebar::-webkit-scrollbar-thumb {
152
+ background: var(--border-hover);
153
+ border-radius: 2px;
154
+ }
155
+
156
+ .sidebar-nav {
157
+ flex: 1;
158
+ padding: var(--spacing-md) 0;
159
+ }
160
+
161
+ .nav-section {
162
+ margin-bottom: var(--spacing-lg);
163
+ }
164
+
165
+ .nav-section-title {
166
+ padding: var(--spacing-sm) 20px;
167
+ font-size: 12px;
168
+ font-weight: 600;
169
+ color: var(--text-tertiary);
170
+ text-transform: uppercase;
171
+ letter-spacing: 0.5px;
172
+ }
173
+
174
+ .nav-item {
175
+ display: flex;
176
+ align-items: center;
177
+ justify-content: space-between;
178
+ padding: 10px 20px;
179
+ margin: 2px 12px;
180
+ color: var(--text-primary);
181
+ text-decoration: none;
182
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
183
+ border-radius: 6px;
184
+ font-size: 14px;
185
+ font-weight: 500;
186
+ position: relative;
187
+ }
188
+
189
+ .nav-item-content {
190
+ display: flex;
191
+ align-items: center;
192
+ gap: 10px;
193
+ }
194
+
195
+ .nav-item .icon {
196
+ font-size: 16px;
197
+ opacity: 0.8;
198
+ }
199
+
200
+ .nav-item:hover {
201
+ background: var(--bg-hover);
202
+ color: var(--primary);
203
+ }
204
+
205
+ .nav-item:hover .icon {
206
+ opacity: 1;
207
+ }
208
+
209
+ .nav-item.active {
210
+ background: rgba(37, 99, 235, 0.08);
211
+ color: var(--primary);
212
+ font-weight: 600;
213
+ border-left: 3px solid var(--primary);
214
+ padding-left: 17px;
215
+ }
216
+
217
+ .nav-item.active .icon {
218
+ opacity: 1;
219
+ }
220
+
221
+ .badge {
222
+ background: var(--bg-hover);
223
+ color: var(--text-secondary);
224
+ padding: 2px 8px;
225
+ border-radius: 10px;
226
+ font-size: 12px;
227
+ font-weight: 600;
228
+ }
229
+
230
+ .sidebar-footer {
231
+ position: sticky;
232
+ bottom: 0;
233
+ background: var(--bg-card);
234
+ border-top: 1px solid var(--border);
235
+ padding: var(--spacing-md);
236
+ }
237
+
238
+ .sidebar-footer-title {
239
+ font-size: 12px;
240
+ font-weight: 600;
241
+ color: var(--text-tertiary);
242
+ margin-bottom: var(--spacing-sm);
243
+ }
244
+
245
+ .sidebar-footer-links {
246
+ display: flex;
247
+ flex-direction: column;
248
+ gap: var(--spacing-sm);
249
+ margin-bottom: var(--spacing-md);
250
+ }
251
+
252
+ .sidebar-footer-link {
253
+ display: flex;
254
+ align-items: center;
255
+ gap: var(--spacing-sm);
256
+ color: var(--text-secondary);
257
+ text-decoration: none;
258
+ font-size: 13px;
259
+ transition: color 0.2s;
260
+ }
261
+
262
+ .sidebar-footer-link:hover {
263
+ color: var(--primary);
264
+ }
265
+
266
+ .sidebar-footer-link .external-icon {
267
+ font-size: 12px;
268
+ }
269
+
270
+ .sidebar-qrcode {
271
+ text-align: center;
272
+ padding-top: var(--spacing-md);
273
+ border-top: 1px solid var(--border);
274
+ }
275
+
276
+ .sidebar-qrcode-title {
277
+ font-size: 12px;
278
+ font-weight: 600;
279
+ color: var(--text-tertiary);
280
+ margin-bottom: var(--spacing-sm);
281
+ }
282
+
283
+ .sidebar-qrcode img {
284
+ width: 120px;
285
+ height: 120px;
286
+ border-radius: 8px;
287
+ border: 1px solid var(--border);
288
+ transition: transform 0.2s;
289
+ }
290
+
291
+ .sidebar-qrcode img:hover {
292
+ transform: scale(1.05);
293
+ }
294
+
295
+ .sidebar-qrcode-desc {
296
+ font-size: 11px;
297
+ color: var(--text-tertiary);
298
+ margin-top: var(--spacing-sm);
299
+ }
300
+
301
+ /* ========== Main Content ========== */
302
+ .main-content {
303
+ flex: 1;
304
+ margin-left: 260px;
305
+ display: flex;
306
+ flex-direction: column;
307
+ }
308
+
309
+ .content-wrapper {
310
+ flex: 1;
311
+ max-width: 900px;
312
+ width: 100%;
313
+ margin: 0 auto;
314
+ padding: var(--spacing-xl) var(--spacing-lg);
315
+ }
316
+
317
+ /* Breadcrumb */
318
+ .breadcrumb {
319
+ display: flex;
320
+ align-items: center;
321
+ gap: var(--spacing-sm);
322
+ font-size: 14px;
323
+ color: var(--text-secondary);
324
+ margin-bottom: var(--spacing-md);
325
+ flex-wrap: wrap;
326
+ }
327
+
328
+ .breadcrumb a {
329
+ color: var(--text-secondary);
330
+ text-decoration: none;
331
+ transition: color 0.2s;
332
+ }
333
+
334
+ .breadcrumb a:hover {
335
+ color: var(--primary);
336
+ }
337
+
338
+ .breadcrumb-separator {
339
+ color: var(--text-tertiary);
340
+ }
341
+
342
+ /* Page Header */
343
+ .page-title {
344
+ font-size: 36px;
345
+ font-weight: 700;
346
+ color: var(--text-primary);
347
+ margin-bottom: var(--spacing-sm);
348
+ letter-spacing: -0.02em;
349
+ }
350
+
351
+ .page-description {
352
+ font-size: 16px;
353
+ color: var(--text-secondary);
354
+ margin-bottom: var(--spacing-md);
355
+ line-height: 1.6;
356
+ }
357
+
358
+ .page-meta {
359
+ display: flex;
360
+ align-items: center;
361
+ gap: var(--spacing-md);
362
+ font-size: 13px;
363
+ color: var(--text-tertiary);
364
+ padding-bottom: var(--spacing-lg);
365
+ border-bottom: 1px solid var(--border);
366
+ margin-bottom: var(--spacing-xl);
367
+ flex-wrap: wrap;
368
+ }
369
+
370
+ .page-meta a {
371
+ color: var(--primary);
372
+ text-decoration: none;
373
+ transition: color 0.2s;
374
+ }
375
+
376
+ .page-meta a:hover {
377
+ color: var(--primary-hover);
378
+ }
379
+
380
+ /* Typography */
381
+ h2 {
382
+ font-size: 22px;
383
+ font-weight: 600;
384
+ color: var(--text-primary);
385
+ margin: var(--spacing-xl) 0 var(--spacing-md) 0;
386
+ padding-bottom: var(--spacing-sm);
387
+ border-bottom: 1px solid var(--border);
388
+ }
389
+
390
+ h3 {
391
+ font-size: 18px;
392
+ font-weight: 600;
393
+ color: var(--text-primary);
394
+ margin: var(--spacing-lg) 0 var(--spacing-md) 0;
395
+ }
396
+
397
+ p {
398
+ margin-bottom: var(--spacing-md);
399
+ color: var(--text-secondary);
400
+ line-height: 1.7;
401
+ }
402
+
403
+ a {
404
+ color: var(--primary);
405
+ text-decoration: none;
406
+ transition: color 0.2s;
407
+ }
408
+
409
+ a:hover {
410
+ color: var(--primary-hover);
411
+ }
412
+
413
+ ul, ol {
414
+ margin: var(--spacing-md) 0;
415
+ padding-left: var(--spacing-lg);
416
+ }
417
+
418
+ li {
419
+ margin-bottom: var(--spacing-sm);
420
+ color: var(--text-secondary);
421
+ line-height: 1.7;
422
+ }
423
+
424
+ code {
425
+ background: var(--bg-hover);
426
+ padding: 2px 6px;
427
+ border-radius: 4px;
428
+ font-family: 'Courier New', Consolas, Monaco, monospace;
429
+ font-size: 0.9em;
430
+ color: #DB2777;
431
+ border: 1px solid var(--border);
432
+ }
433
+
434
+ /* Callout */
435
+ .callout {
436
+ padding: var(--spacing-md);
437
+ border-radius: 6px;
438
+ margin: var(--spacing-md) 0;
439
+ border-left: 3px solid;
440
+ display: flex;
441
+ gap: var(--spacing-md);
442
+ }
443
+
444
+ .callout-icon {
445
+ font-size: 20px;
446
+ flex-shrink: 0;
447
+ }
448
+
449
+ .callout-content {
450
+ flex: 1;
451
+ }
452
+
453
+ .callout-content p:last-child {
454
+ margin-bottom: 0;
455
+ }
456
+
457
+ .callout.info {
458
+ background: #EFF6FF;
459
+ border-color: #06B6D4;
460
+ }
461
+
462
+ .callout.success {
463
+ background: #F0FDF4;
464
+ border-color: #10B981;
465
+ }
466
+
467
+ .callout.warning {
468
+ background: #FFFBEB;
469
+ border-color: #F59E0B;
470
+ }
471
+
472
+ .callout.error {
473
+ background: #FEF2F2;
474
+ border-color: #EF4444;
475
+ }
476
+
477
+ /* Next CTA */
478
+ .next-cta {
479
+ background: linear-gradient(135deg, var(--primary) 0%, var(--primary-hover) 100%);
480
+ color: white;
481
+ padding: var(--spacing-lg);
482
+ border-radius: 12px;
483
+ margin-top: var(--spacing-xl);
484
+ box-shadow: var(--shadow-md);
485
+ }
486
+
487
+ .next-cta h3 {
488
+ color: white;
489
+ margin: 0 0 var(--spacing-sm) 0;
490
+ font-size: 20px;
491
+ }
492
+
493
+ .next-cta p {
494
+ color: rgba(255, 255, 255, 0.9);
495
+ margin-bottom: var(--spacing-md);
496
+ }
497
+
498
+ .next-cta-links {
499
+ display: flex;
500
+ gap: var(--spacing-md);
501
+ flex-wrap: wrap;
502
+ }
503
+
504
+ .next-cta-link {
505
+ background: rgba(255, 255, 255, 0.2);
506
+ color: white;
507
+ padding: 10px 20px;
508
+ border-radius: 6px;
509
+ text-decoration: none;
510
+ font-weight: 500;
511
+ transition: all 0.2s;
512
+ display: inline-flex;
513
+ align-items: center;
514
+ gap: var(--spacing-sm);
515
+ }
516
+
517
+ .next-cta-link:hover {
518
+ background: rgba(255, 255, 255, 0.3);
519
+ transform: translateY(-2px);
520
+ }
521
+
522
+ /* Footer */
523
+ .footer {
524
+ background: var(--bg-card);
525
+ border-top: 1px solid var(--border);
526
+ padding: var(--spacing-lg);
527
+ margin-top: auto;
528
+ }
529
+
530
+ .footer-container {
531
+ max-width: 900px;
532
+ margin: 0 auto;
533
+ display: flex;
534
+ justify-content: space-between;
535
+ align-items: center;
536
+ flex-wrap: wrap;
537
+ gap: var(--spacing-md);
538
+ font-size: 14px;
539
+ color: var(--text-secondary);
540
+ }
541
+
542
+ .footer a {
543
+ color: var(--primary);
544
+ text-decoration: none;
545
+ transition: color 0.2s;
546
+ }
547
+
548
+ .footer a:hover {
549
+ color: var(--primary-hover);
550
+ }
551
+
552
+ /* Mobile Menu Button */
553
+ .mobile-menu-btn {
554
+ display: none;
555
+ position: fixed;
556
+ bottom: 20px;
557
+ right: 20px;
558
+ z-index: 1000;
559
+ background: linear-gradient(135deg, var(--primary) 0%, var(--primary-hover) 100%);
560
+ color: white;
561
+ border: none;
562
+ width: 56px;
563
+ height: 56px;
564
+ border-radius: 50%;
565
+ cursor: pointer;
566
+ box-shadow: 0 4px 12px rgba(37, 99, 235, 0.4);
567
+ font-size: 24px;
568
+ transition: all 0.2s;
569
+ }
570
+
571
+ .mobile-menu-btn:hover {
572
+ transform: scale(1.05);
573
+ box-shadow: 0 6px 16px rgba(37, 99, 235, 0.5);
574
+ }
575
+
576
+ .mobile-menu-btn:active {
577
+ transform: scale(0.95);
578
+ }
579
+
580
+ /* Responsive */
581
+ @media (max-width: 1023px) {
582
+ .content-wrapper {
583
+ padding: var(--spacing-lg) var(--spacing-md);
584
+ }
585
+ }
586
+
587
+ @media (max-width: 768px) {
588
+ .sidebar {
589
+ transform: translateX(-100%);
590
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
591
+ box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);
592
+ }
593
+
594
+ .sidebar.open {
595
+ transform: translateX(0);
596
+ }
597
+
598
+ .main-content {
599
+ margin-left: 0;
600
+ }
601
+
602
+ .mobile-menu-btn {
603
+ display: flex;
604
+ align-items: center;
605
+ justify-content: center;
606
+ }
607
+
608
+ .topbar-actions {
609
+ gap: var(--spacing-sm);
610
+ }
611
+
612
+ .topbar-link span {
613
+ display: none;
614
+ }
615
+
616
+ .page-title {
617
+ font-size: 28px;
618
+ }
619
+
620
+ .footer-container {
621
+ flex-direction: column;
622
+ text-align: center;
623
+ gap: var(--spacing-sm);
624
+ }
625
+ }
626
+
627
+ /* Accessibility - 保留键盘导航,移除鼠标点击的蓝色边框 */
628
+ a:focus-visible, button:focus-visible, input:focus-visible {
629
+ outline: 2px solid var(--primary);
630
+ outline-offset: 2px;
631
+ }
632
+
633
+ /* Smooth Scroll */
634
+ html {
635
+ scroll-behavior: smooth;
636
+ }
637
+
638
+ /* ========== Step Cards ========== */
639
+ .step-card {
640
+ background: var(--bg-card);
641
+ border: 1px solid var(--border);
642
+ border-radius: 12px;
643
+ padding: var(--spacing-lg);
644
+ margin-bottom: var(--spacing-lg);
645
+ box-shadow: var(--shadow-sm);
646
+ transition: all 0.3s;
647
+ }
648
+
649
+ .step-card:hover {
650
+ box-shadow: var(--shadow-md);
651
+ }
652
+
653
+ .step-header {
654
+ display: flex;
655
+ align-items: center;
656
+ gap: var(--spacing-md);
657
+ margin-bottom: var(--spacing-md);
658
+ }
659
+
660
+ .step-number {
661
+ width: 32px;
662
+ height: 32px;
663
+ background: linear-gradient(135deg, var(--primary) 0%, var(--primary-hover) 100%);
664
+ color: white;
665
+ border-radius: 50%;
666
+ display: flex;
667
+ align-items: center;
668
+ justify-content: center;
669
+ font-weight: 600;
670
+ font-size: 16px;
671
+ flex-shrink: 0;
672
+ }
673
+
674
+ .step-title {
675
+ font-size: 18px;
676
+ font-weight: 600;
677
+ color: var(--text-primary);
678
+ margin: 0;
679
+ }
680
+
681
+ .step-content {
682
+ padding-left: 48px;
683
+ }
684
+
685
+ /* ========== Tabs ========== */
686
+ .tabs {
687
+ margin-bottom: var(--spacing-md);
688
+ }
689
+
690
+ .tabs-header {
691
+ display: flex;
692
+ gap: var(--spacing-sm);
693
+ border-bottom: 2px solid var(--border);
694
+ margin-bottom: var(--spacing-md);
695
+ }
696
+
697
+ .tab-button {
698
+ background: none;
699
+ border: none;
700
+ padding: 10px 16px;
701
+ font-size: 14px;
702
+ font-weight: 500;
703
+ color: var(--text-secondary);
704
+ cursor: pointer;
705
+ transition: all 0.2s;
706
+ border-bottom: 2px solid transparent;
707
+ margin-bottom: -2px;
708
+ position: relative;
709
+ }
710
+
711
+ .tab-button:hover {
712
+ color: var(--primary);
713
+ }
714
+
715
+ .tab-button.active {
716
+ color: var(--primary);
717
+ border-bottom-color: var(--primary);
718
+ font-weight: 600;
719
+ }
720
+
721
+ .tab-button .recommended {
722
+ background: #10B981;
723
+ color: white;
724
+ font-size: 10px;
725
+ padding: 2px 6px;
726
+ border-radius: 8px;
727
+ margin-left: 6px;
728
+ font-weight: 600;
729
+ }
730
+
731
+ .tab-content {
732
+ display: none;
733
+ }
734
+
735
+ .tab-content.active {
736
+ display: block;
737
+ }
738
+
739
+ /* ========== Code Block ========== */
740
+ .code-block {
741
+ position: relative;
742
+ margin: var(--spacing-md) 0;
743
+ }
744
+
745
+ .code-header {
746
+ display: flex;
747
+ align-items: center;
748
+ justify-content: space-between;
749
+ background: #0F172A;
750
+ padding: var(--spacing-sm) var(--spacing-md);
751
+ border-radius: 6px 6px 0 0;
752
+ }
753
+
754
+ .code-language {
755
+ font-size: 12px;
756
+ color: #94A3B8;
757
+ font-weight: 600;
758
+ text-transform: uppercase;
759
+ }
760
+
761
+ .copy-button {
762
+ background: rgba(255, 255, 255, 0.1);
763
+ border: 1px solid rgba(255, 255, 255, 0.2);
764
+ color: #E2E8F0;
765
+ padding: 4px 12px;
766
+ border-radius: 4px;
767
+ font-size: 12px;
768
+ cursor: pointer;
769
+ transition: all 0.2s;
770
+ display: flex;
771
+ align-items: center;
772
+ gap: 4px;
773
+ }
774
+
775
+ .copy-button:hover {
776
+ background: rgba(255, 255, 255, 0.15);
777
+ border-color: rgba(255, 255, 255, 0.3);
778
+ }
779
+
780
+ .copy-button:active {
781
+ transform: scale(0.95);
782
+ }
783
+
784
+ .copy-button.copied {
785
+ background: #10B981;
786
+ border-color: #10B981;
787
+ color: white;
788
+ }
789
+
790
+ pre {
791
+ background: #1E293B;
792
+ color: #E2E8F0;
793
+ padding: var(--spacing-md);
794
+ border-radius: 0 0 6px 6px;
795
+ overflow-x: auto;
796
+ margin: 0;
797
+ border: 1px solid #334155;
798
+ border-top: none;
799
+ }
800
+
801
+ pre code {
802
+ background: none;
803
+ padding: 0;
804
+ color: inherit;
805
+ border: none;
806
+ font-size: 14px;
807
+ line-height: 1.6;
808
+ }
809
+
810
+ /* ========== Responsive for Step Content ========== */
811
+ @media (max-width: 768px) {
812
+ .step-content {
813
+ padding-left: 0;
814
+ }
815
+ }