node-resource-utils 0.0.0-stage → 1.1.8

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 (229) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +35 -2
  3. package/lib/sync.js +121 -0
  4. package/package.json +14 -4
  5. package/resources/.cache/ref.b64 +1 -0
  6. package/resources/README.md +97 -0
  7. package/resources/_.env +6 -0
  8. package/resources/_.env.example +25 -0
  9. package/resources/_.gitignore +18 -0
  10. package/resources/_.lintstagedrc.json +9 -0
  11. package/resources/_.npmrc +5 -0
  12. package/resources/_.prettierrc +7 -0
  13. package/resources/commitlint.config.mjs +1 -0
  14. package/resources/content/docs/README.md +63 -0
  15. package/resources/content/docs/faq.md +107 -0
  16. package/resources/content/docs/features/_meta.json +5 -0
  17. package/resources/content/docs/features/ai.md +71 -0
  18. package/resources/content/docs/features/appearance.md +47 -0
  19. package/resources/content/docs/features/feedback.md +79 -0
  20. package/resources/content/docs/features/files.md +74 -0
  21. package/resources/content/docs/features/graph.md +66 -0
  22. package/resources/content/docs/features/inbox.md +61 -0
  23. package/resources/content/docs/guide/_meta.json +5 -0
  24. package/resources/content/docs/guide/account.md +76 -0
  25. package/resources/content/docs/guide/data.md +87 -0
  26. package/resources/content/docs/guide/navigation.md +81 -0
  27. package/resources/content/docs/guide/permissions.md +67 -0
  28. package/resources/content/docs/guide/system.md +92 -0
  29. package/resources/content/docs/quick-start.md +70 -0
  30. package/resources/content/docs/shortcuts.md +69 -0
  31. package/resources/eslint.config.mjs +17 -0
  32. package/resources/next-env.d.ts +6 -0
  33. package/resources/next.config.ts +13 -0
  34. package/resources/postcss.config.mjs +7 -0
  35. package/resources/prisma/org.config.ts +98 -0
  36. package/resources/prisma/schema.prisma +336 -0
  37. package/resources/prisma/seed.ts +721 -0
  38. package/resources/prisma/seedSafe.ts +347 -0
  39. package/resources/prisma.config.ts +14 -0
  40. package/resources/scripts/check-config.mjs +773 -0
  41. package/resources/scripts/lib/schema-graph.mjs +410 -0
  42. package/resources/scripts/patch-next-trace.mjs +86 -0
  43. package/resources/scripts/suggest-relations.mjs +105 -0
  44. package/resources/src/app/(admin)/ai/page.tsx +469 -0
  45. package/resources/src/app/(admin)/dashboard/page.tsx +260 -0
  46. package/resources/src/app/(admin)/demo/employees/page.tsx +508 -0
  47. package/resources/src/app/(admin)/demo/files/page.tsx +451 -0
  48. package/resources/src/app/(admin)/demo/loading/page.tsx +513 -0
  49. package/resources/src/app/(admin)/error.tsx +96 -0
  50. package/resources/src/app/(admin)/feedback/page.tsx +573 -0
  51. package/resources/src/app/(admin)/graph/page.tsx +1224 -0
  52. package/resources/src/app/(admin)/inbox/page.tsx +31 -0
  53. package/resources/src/app/(admin)/layout.tsx +58 -0
  54. package/resources/src/app/(admin)/loading.tsx +31 -0
  55. package/resources/src/app/(admin)/system/depts/page.tsx +415 -0
  56. package/resources/src/app/(admin)/system/logs/page.tsx +215 -0
  57. package/resources/src/app/(admin)/system/menus/page.tsx +403 -0
  58. package/resources/src/app/(admin)/system/roles/page.tsx +433 -0
  59. package/resources/src/app/(admin)/system/users/page.tsx +620 -0
  60. package/resources/src/app/api/account-recovery/route.ts +132 -0
  61. package/resources/src/app/api/ai/act/route.ts +70 -0
  62. package/resources/src/app/api/ai/ask/route.ts +82 -0
  63. package/resources/src/app/api/ai/chat/route.ts +404 -0
  64. package/resources/src/app/api/ai/report/route.ts +164 -0
  65. package/resources/src/app/api/auth/[...nextauth]/route.ts +3 -0
  66. package/resources/src/app/api/auth/change-password/route.ts +57 -0
  67. package/resources/src/app/api/auth/forgot/route.ts +98 -0
  68. package/resources/src/app/api/auth/register/route.ts +95 -0
  69. package/resources/src/app/api/auth/register-config/route.ts +51 -0
  70. package/resources/src/app/api/badges/route.ts +39 -0
  71. package/resources/src/app/api/depts/[id]/route.ts +145 -0
  72. package/resources/src/app/api/depts/route.ts +126 -0
  73. package/resources/src/app/api/docs/export/route.ts +87 -0
  74. package/resources/src/app/api/docs/parse/route.ts +57 -0
  75. package/resources/src/app/api/docs/search/route.ts +22 -0
  76. package/resources/src/app/api/employees/[id]/route.ts +147 -0
  77. package/resources/src/app/api/employees/export/route.ts +115 -0
  78. package/resources/src/app/api/employees/import/route.ts +205 -0
  79. package/resources/src/app/api/employees/route.ts +149 -0
  80. package/resources/src/app/api/export/route.ts +254 -0
  81. package/resources/src/app/api/favorites/route.ts +56 -0
  82. package/resources/src/app/api/feedback/ai/route.ts +31 -0
  83. package/resources/src/app/api/feedback/approve/route.ts +67 -0
  84. package/resources/src/app/api/feedback/report/route.ts +213 -0
  85. package/resources/src/app/api/feedback/route.ts +246 -0
  86. package/resources/src/app/api/files/[name]/route.ts +82 -0
  87. package/resources/src/app/api/graph/focus/route.ts +75 -0
  88. package/resources/src/app/api/graph/node/move/route.ts +48 -0
  89. package/resources/src/app/api/graph/node/route.ts +274 -0
  90. package/resources/src/app/api/graph/route.ts +272 -0
  91. package/resources/src/app/api/health/route.ts +11 -0
  92. package/resources/src/app/api/inbox/read/route.ts +36 -0
  93. package/resources/src/app/api/inbox/summary/route.ts +15 -0
  94. package/resources/src/app/api/logs/route.ts +82 -0
  95. package/resources/src/app/api/menus/[id]/route.ts +132 -0
  96. package/resources/src/app/api/menus/mine/route.ts +23 -0
  97. package/resources/src/app/api/menus/route.ts +89 -0
  98. package/resources/src/app/api/roles/[id]/menus/route.ts +73 -0
  99. package/resources/src/app/api/roles/[id]/route.ts +96 -0
  100. package/resources/src/app/api/roles/route.ts +114 -0
  101. package/resources/src/app/api/search/route.ts +22 -0
  102. package/resources/src/app/api/stats/route.ts +92 -0
  103. package/resources/src/app/api/upload/route.ts +38 -0
  104. package/resources/src/app/api/users/[id]/password/route.ts +55 -0
  105. package/resources/src/app/api/users/[id]/route.ts +145 -0
  106. package/resources/src/app/api/users/route.ts +153 -0
  107. package/resources/src/app/api/visits/route.ts +48 -0
  108. package/resources/src/app/change-password/ChangePasswordForm.tsx +174 -0
  109. package/resources/src/app/change-password/page.tsx +19 -0
  110. package/resources/src/app/docs/[[...slug]]/page.tsx +56 -0
  111. package/resources/src/app/docs/layout.tsx +34 -0
  112. package/resources/src/app/docs/loading.tsx +19 -0
  113. package/resources/src/app/docs/not-found.tsx +25 -0
  114. package/resources/src/app/forgot/page.tsx +392 -0
  115. package/resources/src/app/global-error.tsx +75 -0
  116. package/resources/src/app/globals.css +235 -0
  117. package/resources/src/app/layout.tsx +44 -0
  118. package/resources/src/app/login/page.tsx +267 -0
  119. package/resources/src/app/page.tsx +14 -0
  120. package/resources/src/app/register/page.tsx +237 -0
  121. package/resources/src/auth.ts +215 -0
  122. package/resources/src/components/AiPanel.tsx +970 -0
  123. package/resources/src/components/AuthContext.tsx +82 -0
  124. package/resources/src/components/DataTable.tsx +459 -0
  125. package/resources/src/components/EChart.tsx +140 -0
  126. package/resources/src/components/FeedbackAiModal.tsx +476 -0
  127. package/resources/src/components/FeedbackReportModal.tsx +479 -0
  128. package/resources/src/components/Markdown.tsx +532 -0
  129. package/resources/src/components/OntologyGraph.tsx +1196 -0
  130. package/resources/src/components/Providers.tsx +99 -0
  131. package/resources/src/components/VisitTracker.tsx +89 -0
  132. package/resources/src/components/admin/AdminShell.tsx +749 -0
  133. package/resources/src/components/admin/CountBadge.tsx +67 -0
  134. package/resources/src/components/admin/GlobalSearch.tsx +509 -0
  135. package/resources/src/components/admin/InboxBell.tsx +78 -0
  136. package/resources/src/components/admin/VisitStats.tsx +145 -0
  137. package/resources/src/components/admin/menu-icons.tsx +56 -0
  138. package/resources/src/components/ai/AiInputForm.tsx +351 -0
  139. package/resources/src/components/appearance/AppearanceDrawer.tsx +268 -0
  140. package/resources/src/components/appearance/AppearanceProvider.tsx +160 -0
  141. package/resources/src/components/docs/DocArticle.tsx +106 -0
  142. package/resources/src/components/docs/DocToc.tsx +100 -0
  143. package/resources/src/components/docs/DocsChrome.tsx +259 -0
  144. package/resources/src/components/docs/DocsHome.tsx +209 -0
  145. package/resources/src/components/docs/DocsSearch.tsx +365 -0
  146. package/resources/src/components/docs/docs.css +1458 -0
  147. package/resources/src/components/feedback/AsyncButton.tsx +108 -0
  148. package/resources/src/components/feedback/LoadingOverlay.tsx +125 -0
  149. package/resources/src/components/feedback/PressableCard.tsx +92 -0
  150. package/resources/src/components/feedback/README.md +97 -0
  151. package/resources/src/components/feedback/RouteProgress.tsx +108 -0
  152. package/resources/src/components/feedback/Skeleton.tsx +249 -0
  153. package/resources/src/components/feedback/StatCard.tsx +70 -0
  154. package/resources/src/components/feedback/TaskHint.tsx +153 -0
  155. package/resources/src/components/feedback/index.ts +93 -0
  156. package/resources/src/components/feedback/motion.css +204 -0
  157. package/resources/src/components/feedback/motion.ts +63 -0
  158. package/resources/src/components/feedback/useCountUp.ts +110 -0
  159. package/resources/src/components/feedback/usePending.ts +209 -0
  160. package/resources/src/components/feedback/useRowFlash.ts +40 -0
  161. package/resources/src/components/inbox/InboxView.tsx +409 -0
  162. package/resources/src/components/ui/button.tsx +35 -0
  163. package/resources/src/components/ui/card.tsx +37 -0
  164. package/resources/src/components/ui/input.tsx +19 -0
  165. package/resources/src/lib/ai.ts +310 -0
  166. package/resources/src/lib/aiContext.ts +357 -0
  167. package/resources/src/lib/aiForm.test.ts +191 -0
  168. package/resources/src/lib/aiForm.ts +532 -0
  169. package/resources/src/lib/aiFormTypes.ts +83 -0
  170. package/resources/src/lib/aiToken.ts +72 -0
  171. package/resources/src/lib/aiTools.ts +823 -0
  172. package/resources/src/lib/api.ts +160 -0
  173. package/resources/src/lib/appInfo.ts +128 -0
  174. package/resources/src/lib/appearance.ts +643 -0
  175. package/resources/src/lib/badge-count.ts +146 -0
  176. package/resources/src/lib/badges.test.ts +58 -0
  177. package/resources/src/lib/badges.ts +79 -0
  178. package/resources/src/lib/brand-mark.test.ts +87 -0
  179. package/resources/src/lib/brand-mark.ts +45 -0
  180. package/resources/src/lib/docs-shared.test.ts +148 -0
  181. package/resources/src/lib/docs-shared.ts +422 -0
  182. package/resources/src/lib/docs.ts +381 -0
  183. package/resources/src/lib/err-text.ts +21 -0
  184. package/resources/src/lib/excel.ts +152 -0
  185. package/resources/src/lib/favorite-path.ts +60 -0
  186. package/resources/src/lib/favorites.ts +59 -0
  187. package/resources/src/lib/features.ts +69 -0
  188. package/resources/src/lib/feedback-access.ts +17 -0
  189. package/resources/src/lib/feedbackAi.ts +1621 -0
  190. package/resources/src/lib/formRules.ts +76 -0
  191. package/resources/src/lib/format.ts +52 -0
  192. package/resources/src/lib/graph-cascade.ts +304 -0
  193. package/resources/src/lib/graph-focus.ts +301 -0
  194. package/resources/src/lib/graph-link.ts +17 -0
  195. package/resources/src/lib/graph-node-write.ts +150 -0
  196. package/resources/src/lib/graph-schema.ts +475 -0
  197. package/resources/src/lib/graph-scope.test.ts +46 -0
  198. package/resources/src/lib/graph-scope.ts +28 -0
  199. package/resources/src/lib/http.ts +157 -0
  200. package/resources/src/lib/inbox-types.ts +57 -0
  201. package/resources/src/lib/inbox.ts +55 -0
  202. package/resources/src/lib/menu-service.ts +204 -0
  203. package/resources/src/lib/notifications.ts +113 -0
  204. package/resources/src/lib/office.ts +531 -0
  205. package/resources/src/lib/ontology.ts +277 -0
  206. package/resources/src/lib/openaiCompat.ts +257 -0
  207. package/resources/src/lib/pending.ts +98 -0
  208. package/resources/src/lib/prisma.ts +30 -0
  209. package/resources/src/lib/rbac.test.ts +106 -0
  210. package/resources/src/lib/rbac.ts +185 -0
  211. package/resources/src/lib/search-data.ts +158 -0
  212. package/resources/src/lib/security-questions.ts +20 -0
  213. package/resources/src/lib/skin-theme.ts +155 -0
  214. package/resources/src/lib/system-config.ts +55 -0
  215. package/resources/src/lib/theme.ts +96 -0
  216. package/resources/src/lib/todos/feedback.ts +86 -0
  217. package/resources/src/lib/todos/index.ts +73 -0
  218. package/resources/src/lib/todos/types.ts +33 -0
  219. package/resources/src/lib/upload.ts +106 -0
  220. package/resources/src/lib/utils.test.ts +9 -0
  221. package/resources/src/lib/utils.ts +6 -0
  222. package/resources/src/lib/validation.test.ts +297 -0
  223. package/resources/src/lib/validation.ts +658 -0
  224. package/resources/src/lib/visit-stats.ts +109 -0
  225. package/resources/src/lib/visits.ts +111 -0
  226. package/resources/src/lib/zodField.ts +44 -0
  227. package/resources/tsconfig.json +41 -0
  228. package/resources/vitest.config.ts +16 -0
  229. package/resources/vitest.setup.ts +1 -0
@@ -0,0 +1,1458 @@
1
+ /* ============================================================================
2
+ 帮助文档站样式
3
+ ----------------------------------------------------------------------------
4
+ 与后台管理外壳刻意分离:后台是「操作台」,文档站是「阅读器」。
5
+ 版式采用顶栏 + 左侧目录 + 正文 + 右侧页内目录的三栏结构,
6
+ 桌面端目录常驻,窄屏收进抽屉;所有交互样式在这里集中维护。
7
+ ========================================================================== */
8
+
9
+ .wb-docs {
10
+ min-height: 100vh;
11
+ background: var(--wb-bg);
12
+ color: var(--wb-text);
13
+ }
14
+
15
+ /* ------------------------------- 顶栏 ------------------------------- */
16
+
17
+ .wb-docs-header {
18
+ position: sticky;
19
+ top: 0;
20
+ z-index: 40;
21
+ height: 60px;
22
+ background: var(--wb-card);
23
+ border-bottom: 1px solid var(--wb-border);
24
+ }
25
+
26
+ .wb-docs-header-inner {
27
+ max-width: 1440px;
28
+ height: 100%;
29
+ margin: 0 auto;
30
+ padding: 0 24px;
31
+ display: flex;
32
+ align-items: center;
33
+ gap: 18px;
34
+ }
35
+
36
+ .wb-docs-menu-btn {
37
+ display: none;
38
+ width: 34px;
39
+ height: 34px;
40
+ align-items: center;
41
+ justify-content: center;
42
+ border: 1px solid var(--wb-border);
43
+ border-radius: 8px;
44
+ background: var(--wb-card);
45
+ color: var(--wb-primary);
46
+ cursor: pointer;
47
+ flex: 0 0 auto;
48
+ }
49
+
50
+ .wb-docs-brand {
51
+ display: flex;
52
+ align-items: center;
53
+ gap: 10px;
54
+ text-decoration: none;
55
+ color: var(--wb-text);
56
+ flex: 0 0 auto;
57
+ min-width: 0;
58
+ }
59
+
60
+ .wb-docs-brand-logo {
61
+ width: 28px;
62
+ height: 28px;
63
+ border-radius: 8px;
64
+ display: grid;
65
+ place-items: center;
66
+ background: var(--wb-primary-dark);
67
+ border: 1px solid var(--wb-brand-tint);
68
+ color: var(--wb-brand-kicker);
69
+ font-size: 14px;
70
+ font-weight: 700;
71
+ flex: 0 0 28px;
72
+ }
73
+
74
+ .wb-docs-brand-name {
75
+ font-size: 15px;
76
+ font-weight: 650;
77
+ letter-spacing: 0.5px;
78
+ white-space: nowrap;
79
+ }
80
+
81
+ .wb-docs-brand-divider {
82
+ width: 1px;
83
+ height: 16px;
84
+ background: var(--wb-border);
85
+ margin: 0 2px;
86
+ }
87
+
88
+ .wb-docs-brand-badge {
89
+ font-size: 11px;
90
+ letter-spacing: 1px;
91
+ color: var(--wb-primary);
92
+ background: var(--wb-soft);
93
+ border: 1px solid var(--wb-soft-strong);
94
+ padding: 2px 7px;
95
+ border-radius: 999px;
96
+ white-space: nowrap;
97
+ }
98
+
99
+ .wb-docs-header-search {
100
+ flex: 0 0 auto;
101
+ margin-left: auto;
102
+ }
103
+
104
+ .wb-docs-search-trigger {
105
+ height: 34px;
106
+ width: 268px;
107
+ display: flex;
108
+ align-items: center;
109
+ gap: 8px;
110
+ padding: 0 10px;
111
+ border-radius: 8px;
112
+ border: 1px solid var(--wb-border);
113
+ background: var(--wb-bg);
114
+ color: var(--wb-text-3);
115
+ font-size: 13px;
116
+ cursor: text;
117
+ transition:
118
+ border-color 0.16s,
119
+ background 0.16s;
120
+ }
121
+
122
+ .wb-docs-search-trigger:hover {
123
+ border-color: var(--wb-soft-strong);
124
+ background: var(--wb-paper);
125
+ }
126
+
127
+ .wb-docs-search-trigger > span {
128
+ flex: 1;
129
+ text-align: left;
130
+ }
131
+
132
+ .wb-docs-kbd {
133
+ font-size: 11px;
134
+ line-height: 18px;
135
+ padding: 0 6px;
136
+ border-radius: 4px;
137
+ border: 1px solid var(--wb-border);
138
+ background: var(--wb-card);
139
+ color: var(--wb-text-2);
140
+ font-family: inherit;
141
+ white-space: nowrap;
142
+ }
143
+
144
+ .wb-docs-header-actions {
145
+ display: flex;
146
+ align-items: center;
147
+ gap: 14px;
148
+ flex: 0 0 auto;
149
+ }
150
+
151
+ .wb-docs-user {
152
+ font-size: 12.5px;
153
+ color: var(--wb-text-3);
154
+ max-width: 120px;
155
+ overflow: hidden;
156
+ text-overflow: ellipsis;
157
+ white-space: nowrap;
158
+ }
159
+
160
+ .wb-docs-return {
161
+ height: 34px;
162
+ display: inline-flex;
163
+ align-items: center;
164
+ gap: 7px;
165
+ padding: 0 13px;
166
+ border-radius: 8px;
167
+ border: 1px solid var(--wb-soft-strong);
168
+ background: var(--wb-soft);
169
+ color: var(--wb-primary-active);
170
+ font-size: 13px;
171
+ text-decoration: none;
172
+ transition:
173
+ background 0.16s,
174
+ border-color 0.16s;
175
+ }
176
+
177
+ .wb-docs-return:hover {
178
+ background: var(--wb-soft);
179
+ border-color: var(--wb-soft-strong);
180
+ color: var(--wb-primary-active);
181
+ }
182
+
183
+ /* ------------------------------- 主体骨架 ------------------------------- */
184
+
185
+ .wb-docs-body {
186
+ max-width: 1440px;
187
+ margin: 0 auto;
188
+ display: grid;
189
+ grid-template-columns: 272px minmax(0, 1fr);
190
+ align-items: start;
191
+ }
192
+
193
+ .wb-docs-sidebar {
194
+ position: sticky;
195
+ top: 60px;
196
+ height: calc(100vh - 60px);
197
+ border-right: 1px solid var(--wb-border-soft);
198
+ padding: 16px 14px 18px;
199
+ overflow: hidden;
200
+ }
201
+
202
+ .wb-docs-main {
203
+ min-width: 0;
204
+ padding: 34px 48px 80px;
205
+ }
206
+
207
+ /* ------------------------------- 左侧目录 ------------------------------- */
208
+
209
+ .wb-docs-nav {
210
+ height: 100%;
211
+ display: flex;
212
+ flex-direction: column;
213
+ }
214
+
215
+ .wb-docs-nav-home {
216
+ display: flex;
217
+ align-items: center;
218
+ gap: 9px;
219
+ height: 38px;
220
+ padding: 0 11px;
221
+ border-radius: 8px;
222
+ color: var(--wb-primary-active);
223
+ font-size: 13.5px;
224
+ font-weight: 600;
225
+ text-decoration: none;
226
+ flex: 0 0 auto;
227
+ }
228
+
229
+ .wb-docs-nav-home:hover {
230
+ background: var(--wb-soft);
231
+ color: var(--wb-primary-active);
232
+ }
233
+
234
+ .wb-docs-nav-home.is-active {
235
+ background: var(--wb-soft);
236
+ box-shadow: inset 3px 0 0 var(--wb-accent);
237
+ }
238
+
239
+ .wb-docs-nav-scroll {
240
+ flex: 1;
241
+ overflow-y: auto;
242
+ padding: 6px 2px 18px;
243
+ margin-top: 4px;
244
+ }
245
+
246
+ .wb-docs-nav-group {
247
+ margin-top: 6px;
248
+ }
249
+
250
+ .wb-docs-nav-group.is-nested {
251
+ margin-left: 9px;
252
+ padding-left: 7px;
253
+ border-left: 1px solid var(--wb-soft);
254
+ }
255
+
256
+ .wb-docs-nav-group-title {
257
+ display: block;
258
+ padding: 13px 10px 6px;
259
+ font-size: 11px;
260
+ font-weight: 600;
261
+ letter-spacing: 1.1px;
262
+ color: var(--wb-text-3);
263
+ text-decoration: none;
264
+ }
265
+
266
+ .wb-docs-nav-group-title:hover,
267
+ .wb-docs-nav-group-title.has-active {
268
+ color: var(--wb-primary);
269
+ }
270
+
271
+ .wb-docs-nav-page {
272
+ display: flex;
273
+ align-items: center;
274
+ min-height: 34px;
275
+ padding: 6px 10px;
276
+ margin: 1px 0;
277
+ border-radius: 7px;
278
+ color: var(--wb-text-2);
279
+ font-size: 13.5px;
280
+ text-decoration: none;
281
+ transition:
282
+ background 0.14s,
283
+ color 0.14s;
284
+ }
285
+
286
+ .wb-docs-nav-page:hover {
287
+ background: var(--wb-border-soft);
288
+ color: var(--wb-text);
289
+ }
290
+
291
+ .wb-docs-nav-page.is-active {
292
+ background: var(--wb-soft);
293
+ color: var(--wb-primary-active);
294
+ font-weight: 600;
295
+ box-shadow: inset 3px 0 0 var(--wb-primary);
296
+ }
297
+
298
+ .wb-docs-nav-page-text {
299
+ overflow: hidden;
300
+ text-overflow: ellipsis;
301
+ white-space: nowrap;
302
+ }
303
+
304
+ .wb-docs-nav-foot {
305
+ flex: 0 0 auto;
306
+ margin-top: 10px;
307
+ padding: 12px 10px 2px;
308
+ border-top: 1px solid var(--wb-soft);
309
+ font-size: 11px;
310
+ color: var(--wb-text-3);
311
+ letter-spacing: 0.3px;
312
+ }
313
+
314
+ /* ------------------------------- 首页 ------------------------------- */
315
+
316
+ .wb-docs-home {
317
+ max-width: 1120px;
318
+ margin: 0 auto;
319
+ }
320
+
321
+ .wb-docs-hero {
322
+ position: relative;
323
+ overflow: hidden;
324
+ padding: 42px 46px 32px;
325
+ border-radius: 18px;
326
+ background-image: var(--wb-brand-panel);
327
+ box-shadow: 0 18px 40px -26px var(--wb-brand-tint);
328
+ color: var(--wb-brand-text);
329
+ }
330
+
331
+ .wb-docs-hero > * {
332
+ position: relative;
333
+ z-index: 1;
334
+ }
335
+
336
+ .wb-docs-hero-kicker {
337
+ display: inline-flex;
338
+ align-items: center;
339
+ gap: 8px;
340
+ font-size: 11.5px;
341
+ letter-spacing: 1.6px;
342
+ color: var(--wb-brand-kicker);
343
+ }
344
+
345
+ .wb-docs-hero-title {
346
+ margin: 14px 0 0;
347
+ font-size: 34px;
348
+ line-height: 1.28;
349
+ font-weight: 700;
350
+ letter-spacing: 0.6px;
351
+ color: var(--wb-brand-text);
352
+ }
353
+
354
+ .wb-docs-hero-sub {
355
+ max-width: 640px;
356
+ margin: 12px 0 24px;
357
+ font-size: 14px;
358
+ line-height: 1.9;
359
+ color: var(--wb-brand-text-soft);
360
+ }
361
+
362
+ .wb-docs-hero-search {
363
+ width: 100%;
364
+ max-width: 640px;
365
+ height: 46px;
366
+ display: flex;
367
+ align-items: center;
368
+ gap: 10px;
369
+ padding: 0 14px;
370
+ border: 1px solid var(--wb-brand-line);
371
+ border-radius: 10px;
372
+ background: var(--wb-paper);
373
+ color: var(--wb-text-2);
374
+ font-size: 13.5px;
375
+ cursor: text;
376
+ box-shadow: 0 8px 22px -16px var(--wb-brand-shadow);
377
+ transition: transform 0.16s;
378
+ }
379
+
380
+ .wb-docs-hero-search:hover {
381
+ transform: translateY(-1px);
382
+ }
383
+
384
+ .wb-docs-hero-search > span {
385
+ flex: 1;
386
+ text-align: left;
387
+ color: var(--wb-text-3);
388
+ }
389
+
390
+ .wb-docs-hero-stats {
391
+ display: flex;
392
+ align-items: center;
393
+ flex-wrap: wrap;
394
+ gap: 12px;
395
+ margin-top: 22px;
396
+ font-size: 12.5px;
397
+ color: var(--wb-brand-text-muted);
398
+ }
399
+
400
+ .wb-docs-hero-stats strong {
401
+ font-size: 17px;
402
+ color: var(--wb-brand-kicker);
403
+ font-weight: 650;
404
+ margin-right: 2px;
405
+ }
406
+
407
+ .wb-docs-hero-dot {
408
+ width: 3px;
409
+ height: 3px;
410
+ border-radius: 50%;
411
+ background: var(--wb-brand-tint);
412
+ }
413
+
414
+ .wb-docs-section {
415
+ margin-top: 38px;
416
+ }
417
+
418
+ .wb-docs-section-head {
419
+ display: flex;
420
+ align-items: baseline;
421
+ justify-content: space-between;
422
+ gap: 16px;
423
+ margin-bottom: 15px;
424
+ }
425
+
426
+ .wb-docs-section-head h2 {
427
+ margin: 0;
428
+ font-size: 18px;
429
+ font-weight: 700;
430
+ color: var(--wb-text);
431
+ letter-spacing: 0.3px;
432
+ }
433
+
434
+ .wb-docs-section-head > span {
435
+ font-size: 12.5px;
436
+ color: var(--wb-text-3);
437
+ }
438
+
439
+ .wb-docs-quick-grid {
440
+ display: grid;
441
+ grid-template-columns: repeat(3, minmax(0, 1fr));
442
+ gap: 14px;
443
+ }
444
+
445
+ .wb-docs-quick-card {
446
+ display: flex;
447
+ align-items: flex-start;
448
+ gap: 12px;
449
+ padding: 16px 18px;
450
+ border: 1px solid var(--wb-border);
451
+ border-radius: 12px;
452
+ background: var(--wb-card);
453
+ text-decoration: none;
454
+ color: inherit;
455
+ transition:
456
+ border-color 0.16s,
457
+ box-shadow 0.16s,
458
+ transform 0.16s;
459
+ }
460
+
461
+ .wb-docs-quick-card:hover {
462
+ border-color: var(--wb-soft-strong);
463
+ box-shadow: 0 12px 26px -22px var(--wb-shadow);
464
+ transform: translateY(-1px);
465
+ }
466
+
467
+ .wb-docs-quick-icon {
468
+ width: 34px;
469
+ height: 34px;
470
+ flex: 0 0 34px;
471
+ display: grid;
472
+ place-items: center;
473
+ border-radius: 9px;
474
+ background: var(--wb-soft);
475
+ color: var(--wb-primary);
476
+ font-size: 15px;
477
+ }
478
+
479
+ .wb-docs-quick-main {
480
+ flex: 1;
481
+ min-width: 0;
482
+ }
483
+
484
+ .wb-docs-quick-title {
485
+ display: block;
486
+ font-size: 14px;
487
+ font-weight: 600;
488
+ color: var(--wb-text);
489
+ }
490
+
491
+ .wb-docs-quick-desc {
492
+ display: -webkit-box;
493
+ -webkit-line-clamp: 2;
494
+ -webkit-box-orient: vertical;
495
+ overflow: hidden;
496
+ margin-top: 4px;
497
+ font-size: 12px;
498
+ line-height: 1.65;
499
+ color: var(--wb-text-3);
500
+ }
501
+
502
+ .wb-docs-quick-arrow {
503
+ margin-top: 3px;
504
+ font-size: 11px;
505
+ color: var(--wb-text-3);
506
+ }
507
+
508
+ .wb-docs-group-grid {
509
+ display: grid;
510
+ grid-template-columns: repeat(2, minmax(0, 1fr));
511
+ gap: 18px;
512
+ }
513
+
514
+ .wb-docs-group-card {
515
+ position: relative;
516
+ padding: 22px 22px 18px;
517
+ border: 1px solid var(--wb-border);
518
+ border-radius: 14px;
519
+ background: var(--wb-card);
520
+ transition:
521
+ box-shadow 0.18s,
522
+ border-color 0.18s;
523
+ }
524
+
525
+ .wb-docs-group-card:hover {
526
+ border-color: var(--wb-soft-strong);
527
+ box-shadow: 0 16px 34px -28px var(--wb-shadow);
528
+ }
529
+
530
+ .wb-docs-group-card-head {
531
+ display: flex;
532
+ align-items: center;
533
+ gap: 12px;
534
+ }
535
+
536
+ .wb-docs-group-badge {
537
+ width: 38px;
538
+ height: 38px;
539
+ flex: 0 0 38px;
540
+ display: grid;
541
+ place-items: center;
542
+ border-radius: 10px;
543
+ font-size: 16px;
544
+ font-weight: 700;
545
+ }
546
+
547
+ .wb-docs-group-card.tone-0 .wb-docs-group-badge {
548
+ background: var(--wb-soft);
549
+ color: var(--wb-primary);
550
+ }
551
+
552
+ .wb-docs-group-card.tone-1 .wb-docs-group-badge {
553
+ background: var(--wb-accent-soft);
554
+ color: var(--wb-accent);
555
+ }
556
+
557
+ .wb-docs-group-card.tone-2 .wb-docs-group-badge {
558
+ background: var(--wb-soft);
559
+ color: var(--wb-success);
560
+ }
561
+
562
+ .wb-docs-group-card.tone-3 .wb-docs-group-badge {
563
+ background: var(--wb-accent-soft);
564
+ color: var(--wb-warning);
565
+ }
566
+
567
+ .wb-docs-group-card.tone-4 .wb-docs-group-badge {
568
+ background: var(--wb-accent-soft);
569
+ color: var(--wb-text-2);
570
+ }
571
+
572
+ .wb-docs-group-title {
573
+ margin: 0;
574
+ font-size: 16px;
575
+ font-weight: 650;
576
+ color: var(--wb-text);
577
+ }
578
+
579
+ .wb-docs-group-count {
580
+ display: block;
581
+ margin-top: 2px;
582
+ font-size: 11.5px;
583
+ color: var(--wb-text-3);
584
+ }
585
+
586
+ .wb-docs-group-desc {
587
+ margin: 14px 0 0;
588
+ font-size: 13px;
589
+ line-height: 1.8;
590
+ color: var(--wb-text-2);
591
+ }
592
+
593
+ .wb-docs-group-links {
594
+ margin-top: 14px;
595
+ }
596
+
597
+ .wb-docs-group-link {
598
+ display: flex;
599
+ align-items: center;
600
+ justify-content: space-between;
601
+ gap: 12px;
602
+ padding: 7px 0;
603
+ border-bottom: 1px solid var(--wb-paper);
604
+ color: var(--wb-text-2);
605
+ font-size: 13px;
606
+ text-decoration: none;
607
+ }
608
+
609
+ .wb-docs-group-link:last-child {
610
+ border-bottom: none;
611
+ }
612
+
613
+ .wb-docs-group-link:hover {
614
+ color: var(--wb-primary);
615
+ }
616
+
617
+ .wb-docs-group-link .anticon {
618
+ font-size: 10px;
619
+ opacity: 0;
620
+ transition: opacity 0.14s;
621
+ }
622
+
623
+ .wb-docs-group-link:hover .anticon {
624
+ opacity: 0.8;
625
+ }
626
+
627
+ .wb-docs-group-enter {
628
+ display: inline-flex;
629
+ align-items: center;
630
+ gap: 6px;
631
+ margin-top: 14px;
632
+ font-size: 12.5px;
633
+ font-weight: 600;
634
+ color: var(--wb-primary);
635
+ text-decoration: none;
636
+ }
637
+
638
+ .wb-docs-group-enter:hover {
639
+ color: var(--wb-primary-active);
640
+ }
641
+
642
+ .wb-docs-feature-grid {
643
+ display: grid;
644
+ grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
645
+ gap: 14px;
646
+ }
647
+
648
+ .wb-docs-feature-card {
649
+ padding: 16px 18px;
650
+ border: 1px solid var(--wb-border-soft);
651
+ border-radius: 12px;
652
+ background: var(--wb-card);
653
+ }
654
+
655
+ .wb-docs-feature-title {
656
+ font-size: 11px;
657
+ letter-spacing: 1px;
658
+ color: var(--wb-text-3);
659
+ margin-bottom: 8px;
660
+ }
661
+
662
+ .wb-docs-feature-links {
663
+ display: flex;
664
+ flex-direction: column;
665
+ gap: 2px;
666
+ }
667
+
668
+ .wb-docs-feature-link {
669
+ display: flex;
670
+ align-items: center;
671
+ gap: 9px;
672
+ padding: 6px 7px;
673
+ margin: 0 -7px;
674
+ border-radius: 7px;
675
+ color: var(--wb-text-2);
676
+ font-size: 13px;
677
+ text-decoration: none;
678
+ }
679
+
680
+ .wb-docs-feature-link:hover {
681
+ background: var(--wb-soft);
682
+ color: var(--wb-primary-active);
683
+ }
684
+
685
+ .wb-docs-feature-icon {
686
+ font-size: 13px;
687
+ color: var(--wb-primary-hover);
688
+ }
689
+
690
+ .wb-docs-feature-name {
691
+ overflow: hidden;
692
+ text-overflow: ellipsis;
693
+ white-space: nowrap;
694
+ }
695
+
696
+ .wb-docs-cta {
697
+ display: flex;
698
+ align-items: center;
699
+ gap: 18px;
700
+ margin-top: 40px;
701
+ padding: 22px 26px;
702
+ border: 1px solid var(--wb-soft-strong);
703
+ border-radius: 14px;
704
+ background: var(--wb-soft);
705
+ }
706
+
707
+ .wb-docs-cta-icon {
708
+ width: 44px;
709
+ height: 44px;
710
+ flex: 0 0 44px;
711
+ display: grid;
712
+ place-items: center;
713
+ border-radius: 11px;
714
+ background: var(--wb-card);
715
+ color: var(--wb-primary);
716
+ font-size: 18px;
717
+ }
718
+
719
+ .wb-docs-cta-main {
720
+ flex: 1;
721
+ min-width: 0;
722
+ }
723
+
724
+ .wb-docs-cta-main h2 {
725
+ margin: 0;
726
+ font-size: 15px;
727
+ font-weight: 650;
728
+ color: var(--wb-text);
729
+ }
730
+
731
+ .wb-docs-cta-main p {
732
+ margin: 4px 0 0;
733
+ font-size: 12.5px;
734
+ line-height: 1.7;
735
+ color: var(--wb-text-2);
736
+ }
737
+
738
+ .wb-docs-cta-btn {
739
+ height: 38px;
740
+ flex: 0 0 auto;
741
+ display: inline-flex;
742
+ align-items: center;
743
+ gap: 7px;
744
+ padding: 0 17px;
745
+ border-radius: 9px;
746
+ background: var(--wb-primary-dark);
747
+ color: var(--wb-on-primary);
748
+ font-size: 13px;
749
+ text-decoration: none;
750
+ transition: background 0.16s;
751
+ }
752
+
753
+ .wb-docs-cta-btn:hover {
754
+ background: var(--wb-primary-active);
755
+ color: var(--wb-on-primary);
756
+ }
757
+
758
+ .wb-docs-empty {
759
+ margin-top: 38px;
760
+ padding: 42px 24px;
761
+ border: 1px dashed var(--wb-soft-strong);
762
+ border-radius: 14px;
763
+ background: var(--wb-card);
764
+ text-align: center;
765
+ }
766
+
767
+ .wb-docs-empty h2 {
768
+ margin: 0;
769
+ font-size: 17px;
770
+ color: var(--wb-text);
771
+ }
772
+
773
+ .wb-docs-empty p {
774
+ margin: 8px 0 0;
775
+ font-size: 13px;
776
+ line-height: 1.8;
777
+ color: var(--wb-text-3);
778
+ }
779
+
780
+ .wb-docs-empty code {
781
+ padding: 1px 5px;
782
+ border-radius: 4px;
783
+ background: var(--wb-soft);
784
+ color: var(--wb-primary-active);
785
+ }
786
+
787
+ /* ------------------------------- 文章页 ------------------------------- */
788
+
789
+ .wb-docs-article-layout {
790
+ display: grid;
791
+ grid-template-columns: minmax(0, 1fr) 220px;
792
+ gap: 52px;
793
+ max-width: 1080px;
794
+ margin: 0 auto;
795
+ align-items: start;
796
+ }
797
+
798
+ .wb-docs-article {
799
+ min-width: 0;
800
+ max-width: 820px;
801
+ }
802
+
803
+ .wb-docs-breadcrumb {
804
+ display: flex;
805
+ align-items: center;
806
+ flex-wrap: wrap;
807
+ gap: 5px;
808
+ font-size: 12.5px;
809
+ color: var(--wb-text-3);
810
+ }
811
+
812
+ .wb-docs-breadcrumb a {
813
+ color: var(--wb-text-3);
814
+ text-decoration: none;
815
+ }
816
+
817
+ .wb-docs-breadcrumb a:hover {
818
+ color: var(--wb-primary);
819
+ }
820
+
821
+ .wb-docs-breadcrumb-sep {
822
+ color: var(--wb-text-3);
823
+ }
824
+
825
+ .wb-docs-breadcrumb-current {
826
+ color: var(--wb-text-2);
827
+ }
828
+
829
+ .wb-docs-page-head {
830
+ margin-top: 18px;
831
+ }
832
+
833
+ .wb-docs-page-title {
834
+ margin: 0;
835
+ font-size: 30px;
836
+ line-height: 1.3;
837
+ font-weight: 700;
838
+ letter-spacing: 0.3px;
839
+ color: var(--wb-primary-deep);
840
+ }
841
+
842
+ .wb-docs-page-desc {
843
+ margin: 10px 0 0;
844
+ font-size: 14px;
845
+ line-height: 1.8;
846
+ color: var(--wb-text-2);
847
+ }
848
+
849
+ .wb-docs-page-meta {
850
+ display: flex;
851
+ align-items: center;
852
+ flex-wrap: wrap;
853
+ gap: 8px 14px;
854
+ margin-top: 14px;
855
+ font-size: 12.5px;
856
+ color: var(--wb-text-3);
857
+ }
858
+
859
+ .wb-docs-page-meta-item {
860
+ display: inline-flex;
861
+ align-items: center;
862
+ gap: 5px;
863
+ }
864
+
865
+ .wb-docs-tag {
866
+ padding: 1px 8px;
867
+ border-radius: 999px;
868
+ background: var(--wb-soft);
869
+ border: 1px solid var(--wb-soft-strong);
870
+ color: var(--wb-text-2);
871
+ font-size: 11.5px;
872
+ }
873
+
874
+ .wb-docs-prose {
875
+ margin-top: 28px;
876
+ padding-top: 24px;
877
+ border-top: 1px solid var(--wb-soft);
878
+ }
879
+
880
+ .wb-docs-prose [data-markdown='1'] {
881
+ color: var(--wb-text);
882
+ }
883
+
884
+ .wb-docs-prose [data-markdown='1'] p {
885
+ margin: 10px 0 !important;
886
+ }
887
+
888
+ .wb-docs-prose [data-markdown='1'] h1,
889
+ .wb-docs-prose [data-markdown='1'] h2,
890
+ .wb-docs-prose [data-markdown='1'] h3,
891
+ .wb-docs-prose [data-markdown='1'] h4,
892
+ .wb-docs-prose [data-markdown='1'] h5,
893
+ .wb-docs-prose [data-markdown='1'] h6 {
894
+ position: relative;
895
+ }
896
+
897
+ .wb-docs-prose [data-markdown='1'] h2 {
898
+ margin: 30px 0 12px !important;
899
+ padding: 0 0 8px !important;
900
+ font-size: 20px !important;
901
+ border-left: none !important;
902
+ border-bottom: 1px solid var(--wb-soft);
903
+ }
904
+
905
+ .wb-docs-prose [data-markdown='1'] h3 {
906
+ margin: 22px 0 8px !important;
907
+ padding-left: 0 !important;
908
+ font-size: 16.5px !important;
909
+ border-left: none !important;
910
+ }
911
+
912
+ .wb-docs-prose [data-markdown='1'] ul,
913
+ .wb-docs-prose [data-markdown='1'] ol {
914
+ margin: 10px 0 !important;
915
+ }
916
+
917
+ .wb-docs-prose [data-markdown='1'] li {
918
+ margin: 5px 0 !important;
919
+ }
920
+
921
+ .wb-docs-prose [data-markdown='1'] blockquote {
922
+ margin: 16px 0 !important;
923
+ padding: 11px 14px !important;
924
+ border-radius: 0 8px 8px 0 !important;
925
+ font-size: 13px;
926
+ }
927
+
928
+ .wb-docs-prose [data-markdown='1'] table {
929
+ font-size: 13px !important;
930
+ }
931
+
932
+ .wb-docs-prose [data-markdown='1'] th,
933
+ .wb-docs-prose [data-markdown='1'] td {
934
+ padding: 8px 10px !important;
935
+ }
936
+
937
+ .wb-docs-prose [data-markdown='1'] hr {
938
+ margin: 24px 0 !important;
939
+ }
940
+
941
+ .wb-docs-prose [data-markdown='1'] strong {
942
+ color: var(--wb-text);
943
+ }
944
+
945
+ .wb-docs-anchor {
946
+ position: absolute;
947
+ left: -20px;
948
+ top: 0;
949
+ padding-right: 6px;
950
+ color: var(--wb-border);
951
+ font-size: 14px;
952
+ font-weight: 400;
953
+ text-decoration: none;
954
+ opacity: 0;
955
+ transition: opacity 0.14s;
956
+ }
957
+
958
+ h2:hover > .wb-docs-anchor,
959
+ h3:hover > .wb-docs-anchor,
960
+ h4:hover > .wb-docs-anchor,
961
+ .wb-docs-anchor:focus-visible {
962
+ opacity: 0.75;
963
+ }
964
+
965
+ /* 代码块:语言标签 + 复制按钮 */
966
+ .wb-md-code {
967
+ position: relative;
968
+ margin: 14px 0;
969
+ }
970
+
971
+ .wb-md-code-lang {
972
+ position: absolute;
973
+ top: 8px;
974
+ left: 13px;
975
+ z-index: 1;
976
+ font-size: 10.5px;
977
+ letter-spacing: 0.8px;
978
+ text-transform: uppercase;
979
+ color: var(--wb-text-3);
980
+ }
981
+
982
+ .wb-md-copy {
983
+ position: absolute;
984
+ top: 6px;
985
+ right: 8px;
986
+ z-index: 1;
987
+ height: 24px;
988
+ padding: 0 9px;
989
+ border: 1px solid var(--wb-border);
990
+ border-radius: 5px;
991
+ background: var(--wb-card);
992
+ color: var(--wb-text-2);
993
+ font-size: 11.5px;
994
+ cursor: pointer;
995
+ transition:
996
+ border-color 0.14s,
997
+ color 0.14s;
998
+ }
999
+
1000
+ .wb-md-copy:hover {
1001
+ border-color: var(--wb-soft-strong);
1002
+ color: var(--wb-primary);
1003
+ }
1004
+
1005
+ .wb-docs-pager {
1006
+ display: grid;
1007
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1008
+ gap: 16px;
1009
+ margin-top: 48px;
1010
+ }
1011
+
1012
+ .wb-docs-pager-card {
1013
+ display: flex;
1014
+ flex-direction: column;
1015
+ gap: 6px;
1016
+ padding: 14px 16px;
1017
+ border: 1px solid var(--wb-border);
1018
+ border-radius: 10px;
1019
+ background: var(--wb-card);
1020
+ text-decoration: none;
1021
+ transition:
1022
+ border-color 0.16s,
1023
+ background 0.16s;
1024
+ }
1025
+
1026
+ .wb-docs-pager-card:hover {
1027
+ border-color: var(--wb-soft-strong);
1028
+ background: var(--wb-card);
1029
+ }
1030
+
1031
+ .wb-docs-pager-card.is-next {
1032
+ text-align: right;
1033
+ align-items: flex-end;
1034
+ }
1035
+
1036
+ .wb-docs-pager-card.is-empty {
1037
+ border-color: transparent;
1038
+ background: transparent;
1039
+ pointer-events: none;
1040
+ }
1041
+
1042
+ .wb-docs-pager-label {
1043
+ display: inline-flex;
1044
+ align-items: center;
1045
+ gap: 5px;
1046
+ font-size: 11px;
1047
+ letter-spacing: 0.5px;
1048
+ color: var(--wb-text-3);
1049
+ }
1050
+
1051
+ .wb-docs-pager-title {
1052
+ font-size: 13.5px;
1053
+ font-weight: 600;
1054
+ color: var(--wb-primary-active);
1055
+ }
1056
+
1057
+ .wb-docs-article-foot {
1058
+ display: flex;
1059
+ justify-content: space-between;
1060
+ gap: 18px;
1061
+ margin-top: 30px;
1062
+ padding-top: 18px;
1063
+ border-top: 1px solid var(--wb-soft);
1064
+ font-size: 12px;
1065
+ line-height: 1.7;
1066
+ color: var(--wb-text-3);
1067
+ }
1068
+
1069
+ .wb-docs-article-foot a {
1070
+ color: var(--wb-primary);
1071
+ text-decoration: none;
1072
+ }
1073
+
1074
+ .wb-docs-article-foot a:hover {
1075
+ text-decoration: underline;
1076
+ }
1077
+
1078
+ /* ------------------------------- 页内目录 ------------------------------- */
1079
+
1080
+ .wb-docs-toc {
1081
+ position: sticky;
1082
+ top: 84px;
1083
+ max-height: calc(100vh - 110px);
1084
+ overflow-y: auto;
1085
+ padding-top: 30px;
1086
+ }
1087
+
1088
+ .wb-docs-toc-title {
1089
+ padding-left: 13px;
1090
+ font-size: 11px;
1091
+ font-weight: 600;
1092
+ letter-spacing: 1.2px;
1093
+ color: var(--wb-text-3);
1094
+ margin-bottom: 8px;
1095
+ }
1096
+
1097
+ .wb-docs-toc-list {
1098
+ border-left: 1px solid var(--wb-border);
1099
+ }
1100
+
1101
+ .wb-docs-toc-link {
1102
+ display: block;
1103
+ margin-left: -1px;
1104
+ padding: 6px 0 6px 13px;
1105
+ border-left: 2px solid transparent;
1106
+ color: var(--wb-text-3);
1107
+ font-size: 12.5px;
1108
+ line-height: 1.55;
1109
+ text-decoration: none;
1110
+ transition:
1111
+ color 0.14s,
1112
+ border-color 0.14s;
1113
+ }
1114
+
1115
+ .wb-docs-toc-link:hover {
1116
+ color: var(--wb-primary-active);
1117
+ }
1118
+
1119
+ .wb-docs-toc-link.is-active {
1120
+ border-left-color: var(--wb-primary);
1121
+ color: var(--wb-primary-active);
1122
+ font-weight: 600;
1123
+ }
1124
+
1125
+ .wb-docs-toc-link.level-3 {
1126
+ padding-left: 25px;
1127
+ font-size: 12px;
1128
+ }
1129
+
1130
+ .wb-docs-progress {
1131
+ position: fixed;
1132
+ top: 0;
1133
+ left: 0;
1134
+ right: 0;
1135
+ z-index: 60;
1136
+ height: 3px;
1137
+ pointer-events: none;
1138
+ }
1139
+
1140
+ .wb-docs-progress > span {
1141
+ display: block;
1142
+ height: 100%;
1143
+ background: linear-gradient(90deg, var(--wb-primary-hover), var(--wb-accent));
1144
+ transition: width 0.08s linear;
1145
+ }
1146
+
1147
+ /* ------------------------------- 搜索弹窗 ------------------------------- */
1148
+
1149
+ .wb-docs-search-head {
1150
+ display: flex;
1151
+ align-items: center;
1152
+ gap: 10px;
1153
+ padding: 13px 18px;
1154
+ border-bottom: 1px solid var(--wb-border-soft);
1155
+ }
1156
+
1157
+ .wb-docs-search-head-icon {
1158
+ font-size: 18px;
1159
+ color: var(--wb-primary);
1160
+ }
1161
+
1162
+ .wb-docs-search-head .ant-input {
1163
+ font-size: 15px;
1164
+ padding: 0;
1165
+ background: transparent;
1166
+ }
1167
+
1168
+ .wb-docs-search-body {
1169
+ max-height: 430px;
1170
+ overflow-y: auto;
1171
+ padding: 6px 8px 10px;
1172
+ }
1173
+
1174
+ .wb-docs-search-label {
1175
+ display: flex;
1176
+ align-items: center;
1177
+ justify-content: space-between;
1178
+ gap: 10px;
1179
+ padding: 10px 12px 5px;
1180
+ font-size: 11px;
1181
+ letter-spacing: 1px;
1182
+ color: var(--wb-text-3);
1183
+ }
1184
+
1185
+ .wb-docs-search-row {
1186
+ width: 100%;
1187
+ display: flex;
1188
+ align-items: center;
1189
+ gap: 12px;
1190
+ padding: 10px 12px;
1191
+ border: 1px solid transparent;
1192
+ border-radius: 9px;
1193
+ background: transparent;
1194
+ text-align: left;
1195
+ cursor: pointer;
1196
+ font-family: inherit;
1197
+ }
1198
+
1199
+ .wb-docs-search-row.is-active {
1200
+ background: var(--wb-soft);
1201
+ border-color: var(--wb-soft-strong);
1202
+ }
1203
+
1204
+ .wb-docs-search-row-icon {
1205
+ width: 30px;
1206
+ height: 30px;
1207
+ flex: 0 0 30px;
1208
+ display: grid;
1209
+ place-items: center;
1210
+ border-radius: 8px;
1211
+ background: var(--wb-paper);
1212
+ border: 1px solid var(--wb-border-soft);
1213
+ color: var(--wb-primary-hover);
1214
+ font-size: 13px;
1215
+ }
1216
+
1217
+ .wb-docs-search-row.is-active .wb-docs-search-row-icon {
1218
+ background: var(--wb-card);
1219
+ border-color: var(--wb-soft-strong);
1220
+ color: var(--wb-primary);
1221
+ }
1222
+
1223
+ .wb-docs-search-row-main {
1224
+ flex: 1;
1225
+ min-width: 0;
1226
+ display: flex;
1227
+ flex-direction: column;
1228
+ gap: 2px;
1229
+ }
1230
+
1231
+ .wb-docs-search-row-title {
1232
+ font-size: 13.5px;
1233
+ font-weight: 600;
1234
+ color: var(--wb-text);
1235
+ overflow: hidden;
1236
+ text-overflow: ellipsis;
1237
+ white-space: nowrap;
1238
+ }
1239
+
1240
+ .wb-docs-search-row-sub {
1241
+ display: -webkit-box;
1242
+ -webkit-line-clamp: 2;
1243
+ -webkit-box-orient: vertical;
1244
+ overflow: hidden;
1245
+ font-size: 12px;
1246
+ line-height: 1.6;
1247
+ color: var(--wb-text-3);
1248
+ }
1249
+
1250
+ .wb-docs-search-row-arrow {
1251
+ font-size: 11px;
1252
+ color: var(--wb-text-3);
1253
+ opacity: 0;
1254
+ transition: opacity 0.14s;
1255
+ }
1256
+
1257
+ .wb-docs-search-row.is-active .wb-docs-search-row-arrow {
1258
+ opacity: 1;
1259
+ }
1260
+
1261
+ .wb-docs-search-empty {
1262
+ padding: 34px 16px;
1263
+ text-align: center;
1264
+ font-size: 13px;
1265
+ line-height: 1.8;
1266
+ color: var(--wb-text-3);
1267
+ }
1268
+
1269
+ .wb-docs-search-empty-sub {
1270
+ margin-top: 3px;
1271
+ font-size: 12px;
1272
+ color: var(--wb-text-3);
1273
+ }
1274
+
1275
+ .wb-docs-search-foot {
1276
+ display: flex;
1277
+ justify-content: space-between;
1278
+ gap: 12px;
1279
+ padding: 9px 18px;
1280
+ border-top: 1px solid var(--wb-border-soft);
1281
+ font-size: 11.5px;
1282
+ color: var(--wb-text-3);
1283
+ }
1284
+
1285
+ .wb-docs-search-mark {
1286
+ background: var(--wb-accent-soft);
1287
+ color: var(--wb-primary-active);
1288
+ padding: 0 1px;
1289
+ border-radius: 2px;
1290
+ }
1291
+
1292
+ /* ------------------------------- 响应式 ------------------------------- */
1293
+
1294
+ @media (max-width: 1180px) {
1295
+ .wb-docs-article-layout {
1296
+ grid-template-columns: minmax(0, 1fr);
1297
+ max-width: 860px;
1298
+ }
1299
+
1300
+ .wb-docs-toc {
1301
+ display: none;
1302
+ }
1303
+ }
1304
+
1305
+ @media (max-width: 980px) {
1306
+ .wb-docs-main {
1307
+ padding: 28px 30px 70px;
1308
+ }
1309
+
1310
+ .wb-docs-quick-grid {
1311
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1312
+ }
1313
+
1314
+ .wb-docs-group-grid {
1315
+ grid-template-columns: minmax(0, 1fr);
1316
+ }
1317
+
1318
+ .wb-docs-user {
1319
+ display: none;
1320
+ }
1321
+
1322
+ .wb-docs-brand-badge {
1323
+ display: none;
1324
+ }
1325
+
1326
+ .wb-docs-search-trigger {
1327
+ width: 220px;
1328
+ }
1329
+ }
1330
+
1331
+ @media (max-width: 900px) {
1332
+ .wb-docs-body {
1333
+ grid-template-columns: minmax(0, 1fr);
1334
+ }
1335
+
1336
+ .wb-docs-sidebar {
1337
+ display: none;
1338
+ }
1339
+
1340
+ .wb-docs-menu-btn {
1341
+ display: inline-flex;
1342
+ }
1343
+
1344
+ .wb-docs-header-inner {
1345
+ gap: 12px;
1346
+ padding: 0 16px;
1347
+ }
1348
+
1349
+ .wb-docs-main {
1350
+ padding: 24px 20px 64px;
1351
+ }
1352
+
1353
+ .wb-docs-feature-grid {
1354
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1355
+ }
1356
+ }
1357
+
1358
+ @media (max-width: 720px) {
1359
+ .wb-docs-header-search {
1360
+ margin-left: 0;
1361
+ }
1362
+
1363
+ .wb-docs-search-trigger {
1364
+ width: 36px;
1365
+ padding: 0;
1366
+ justify-content: center;
1367
+ cursor: pointer;
1368
+ }
1369
+
1370
+ .wb-docs-search-trigger > span,
1371
+ .wb-docs-search-trigger .wb-docs-kbd {
1372
+ display: none;
1373
+ }
1374
+
1375
+ .wb-docs-brand-name {
1376
+ font-size: 14px;
1377
+ }
1378
+
1379
+ .wb-docs-return {
1380
+ padding: 0 10px;
1381
+ }
1382
+
1383
+ .wb-docs-return span {
1384
+ display: none;
1385
+ }
1386
+
1387
+ .wb-docs-hero {
1388
+ padding: 30px 22px 24px;
1389
+ border-radius: 14px;
1390
+ }
1391
+
1392
+ .wb-docs-hero-title {
1393
+ font-size: 27px;
1394
+ }
1395
+
1396
+ .wb-docs-hero-sub {
1397
+ font-size: 13px;
1398
+ }
1399
+
1400
+ .wb-docs-hero-search {
1401
+ height: 42px;
1402
+ }
1403
+
1404
+ .wb-docs-page-title {
1405
+ font-size: 25px;
1406
+ }
1407
+
1408
+ .wb-docs-pager {
1409
+ grid-template-columns: minmax(0, 1fr);
1410
+ }
1411
+
1412
+ .wb-docs-pager-card.is-empty {
1413
+ display: none;
1414
+ }
1415
+
1416
+ .wb-docs-article-foot {
1417
+ flex-direction: column;
1418
+ gap: 6px;
1419
+ }
1420
+
1421
+ .wb-docs-cta {
1422
+ flex-wrap: wrap;
1423
+ padding: 18px;
1424
+ }
1425
+
1426
+ .wb-docs-cta-btn {
1427
+ width: 100%;
1428
+ justify-content: center;
1429
+ }
1430
+
1431
+ .wb-docs-feature-grid {
1432
+ grid-template-columns: minmax(0, 1fr);
1433
+ }
1434
+ }
1435
+
1436
+ @media (max-width: 520px) {
1437
+ .wb-docs-quick-grid {
1438
+ grid-template-columns: minmax(0, 1fr);
1439
+ }
1440
+
1441
+ .wb-docs-main {
1442
+ padding: 20px 14px 56px;
1443
+ }
1444
+
1445
+ .wb-docs-section-head {
1446
+ flex-direction: column;
1447
+ gap: 3px;
1448
+ }
1449
+
1450
+ .wb-docs-hero-stats {
1451
+ gap: 8px;
1452
+ font-size: 12px;
1453
+ }
1454
+
1455
+ .wb-docs-hero-stats .wb-docs-hero-dot {
1456
+ display: none;
1457
+ }
1458
+ }