@yuhere/js-jsonrpc2 2.1.12 → 2.1.14

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 (181) hide show
  1. package/dist/cli/cli.d.ts +0 -1
  2. package/dist/cli/cli.js +0 -1
  3. package/dist/cli/demo-methods.d.ts +0 -1
  4. package/dist/cli/demo-methods.js +0 -1
  5. package/dist/cli/express.d.ts +0 -1
  6. package/dist/cli/express.js +0 -1
  7. package/dist/cli/stdio.d.ts +0 -1
  8. package/dist/cli/stdio.js +0 -1
  9. package/dist/core/Repository.d.ts +0 -1
  10. package/dist/core/Repository.js +0 -1
  11. package/dist/core/convert.d.ts +0 -1
  12. package/dist/core/convert.js +0 -1
  13. package/dist/core/descriptor.d.ts +0 -1
  14. package/dist/core/descriptor.js +0 -1
  15. package/dist/core/index.d.ts +0 -1
  16. package/dist/core/index.js +0 -1
  17. package/dist/core/llm-tools.d.ts +0 -1
  18. package/dist/core/llm-tools.js +41 -43
  19. package/dist/core/permission.d.ts +0 -1
  20. package/dist/core/permission.js +0 -1
  21. package/dist/core/spec-check.d.ts +0 -1
  22. package/dist/core/spec-check.js +0 -1
  23. package/dist/core/system-methods.d.ts +0 -1
  24. package/dist/core/system-methods.js +0 -1
  25. package/dist/errors/RPCError.d.ts +0 -1
  26. package/dist/errors/RPCError.js +0 -1
  27. package/dist/errors/codes.d.ts +0 -1
  28. package/dist/errors/codes.js +0 -1
  29. package/dist/errors/index.d.ts +0 -1
  30. package/dist/errors/index.js +0 -1
  31. package/dist/index.d.ts +0 -1
  32. package/dist/index.js +0 -1
  33. package/dist/metrics/memory.d.ts +0 -1
  34. package/dist/metrics/memory.js +0 -1
  35. package/dist/metrics/prom.d.ts +0 -1
  36. package/dist/metrics/prom.js +0 -1
  37. package/dist/schema/json/index.d.ts +1 -2
  38. package/dist/schema/json/index.js +0 -1
  39. package/dist/schema/json/marker.d.ts +0 -1
  40. package/dist/schema/json/marker.js +0 -1
  41. package/dist/schema/json/primitives.d.ts +49 -70
  42. package/dist/schema/json/primitives.js +70 -77
  43. package/dist/schema/z/protocol.d.ts +1 -2
  44. package/dist/schema/z/protocol.js +0 -1
  45. package/dist/schema/z/register.d.ts +0 -1
  46. package/dist/schema/z/register.js +0 -1
  47. package/dist/stream/stringify-stream.d.ts +0 -1
  48. package/dist/stream/stringify-stream.js +94 -70
  49. package/dist/transport/express/body.d.ts +0 -1
  50. package/dist/transport/express/body.js +0 -1
  51. package/dist/transport/express/index.d.ts +0 -1
  52. package/dist/transport/express/index.js +0 -1
  53. package/dist/transport/express/middleware.d.ts +0 -1
  54. package/dist/transport/express/middleware.js +0 -1
  55. package/dist/transport/express/respond.d.ts +0 -1
  56. package/dist/transport/express/respond.js +0 -1
  57. package/dist/transport/stdio/index.d.ts +0 -1
  58. package/dist/transport/stdio/index.js +0 -1
  59. package/dist/transport/stdio/middleware.d.ts +0 -1
  60. package/dist/transport/stdio/middleware.js +0 -1
  61. package/dist/transport/ws/index.d.ts +0 -1
  62. package/dist/transport/ws/index.js +0 -1
  63. package/dist/transport/ws/middleware.d.ts +0 -1
  64. package/dist/transport/ws/middleware.js +0 -1
  65. package/dist/transport/ws/standalone.d.ts +0 -1
  66. package/dist/transport/ws/standalone.js +0 -1
  67. package/dist/types.d.ts +0 -1
  68. package/dist/types.js +0 -1
  69. package/dist/webclient/webui/src/client/httpTransport.d.ts +8 -0
  70. package/dist/webclient/webui/src/client/httpTransport.js +114 -0
  71. package/dist/webclient/webui/src/client/index.d.ts +4 -0
  72. package/dist/webclient/webui/src/client/index.js +2 -0
  73. package/dist/webclient/webui/src/client/rpc.d.ts +24 -0
  74. package/dist/webclient/webui/src/client/rpc.js +32 -0
  75. package/dist/webclient/webui/src/client/types.d.ts +14 -0
  76. package/dist/webclient/webui/src/client/types.js +1 -0
  77. package/dist/webclient/webui/src/client/wsTransport.d.ts +8 -0
  78. package/{webui/src/api/wsTransport.ts → dist/webclient/webui/src/client/wsTransport.js} +263 -305
  79. package/htdoc/assets/favicon-CXdFuLlv.png +0 -0
  80. package/{webui/src/styles/geek.css → htdoc/assets/index-Rq1yIwo2.css} +58 -0
  81. package/htdoc/assets/{index-Cr0Jnrgb.js → index-mYqtDOwe.js} +1344 -398
  82. package/htdoc/assets/index-mYqtDOwe.js.map +1 -0
  83. package/htdoc/index.html +4 -2
  84. package/package.json +10 -7
  85. package/dist/cli/cli.d.ts.map +0 -1
  86. package/dist/cli/cli.js.map +0 -1
  87. package/dist/cli/demo-methods.d.ts.map +0 -1
  88. package/dist/cli/demo-methods.js.map +0 -1
  89. package/dist/cli/express.d.ts.map +0 -1
  90. package/dist/cli/express.js.map +0 -1
  91. package/dist/cli/stdio.d.ts.map +0 -1
  92. package/dist/cli/stdio.js.map +0 -1
  93. package/dist/core/Repository.d.ts.map +0 -1
  94. package/dist/core/Repository.js.map +0 -1
  95. package/dist/core/convert.d.ts.map +0 -1
  96. package/dist/core/convert.js.map +0 -1
  97. package/dist/core/descriptor.d.ts.map +0 -1
  98. package/dist/core/descriptor.js.map +0 -1
  99. package/dist/core/index.d.ts.map +0 -1
  100. package/dist/core/index.js.map +0 -1
  101. package/dist/core/llm-tools.d.ts.map +0 -1
  102. package/dist/core/llm-tools.js.map +0 -1
  103. package/dist/core/permission.d.ts.map +0 -1
  104. package/dist/core/permission.js.map +0 -1
  105. package/dist/core/spec-check.d.ts.map +0 -1
  106. package/dist/core/spec-check.js.map +0 -1
  107. package/dist/core/system-methods.d.ts.map +0 -1
  108. package/dist/core/system-methods.js.map +0 -1
  109. package/dist/errors/RPCError.d.ts.map +0 -1
  110. package/dist/errors/RPCError.js.map +0 -1
  111. package/dist/errors/codes.d.ts.map +0 -1
  112. package/dist/errors/codes.js.map +0 -1
  113. package/dist/errors/index.d.ts.map +0 -1
  114. package/dist/errors/index.js.map +0 -1
  115. package/dist/index.d.ts.map +0 -1
  116. package/dist/index.js.map +0 -1
  117. package/dist/metrics/memory.d.ts.map +0 -1
  118. package/dist/metrics/memory.js.map +0 -1
  119. package/dist/metrics/prom.d.ts.map +0 -1
  120. package/dist/metrics/prom.js.map +0 -1
  121. package/dist/schema/json/index.d.ts.map +0 -1
  122. package/dist/schema/json/index.js.map +0 -1
  123. package/dist/schema/json/marker.d.ts.map +0 -1
  124. package/dist/schema/json/marker.js.map +0 -1
  125. package/dist/schema/json/primitives.d.ts.map +0 -1
  126. package/dist/schema/json/primitives.js.map +0 -1
  127. package/dist/schema/z/protocol.d.ts.map +0 -1
  128. package/dist/schema/z/protocol.js.map +0 -1
  129. package/dist/schema/z/register.d.ts.map +0 -1
  130. package/dist/schema/z/register.js.map +0 -1
  131. package/dist/stream/stringify-stream.d.ts.map +0 -1
  132. package/dist/stream/stringify-stream.js.map +0 -1
  133. package/dist/transport/express/body.d.ts.map +0 -1
  134. package/dist/transport/express/body.js.map +0 -1
  135. package/dist/transport/express/index.d.ts.map +0 -1
  136. package/dist/transport/express/index.js.map +0 -1
  137. package/dist/transport/express/middleware.d.ts.map +0 -1
  138. package/dist/transport/express/middleware.js.map +0 -1
  139. package/dist/transport/express/respond.d.ts.map +0 -1
  140. package/dist/transport/express/respond.js.map +0 -1
  141. package/dist/transport/stdio/index.d.ts.map +0 -1
  142. package/dist/transport/stdio/index.js.map +0 -1
  143. package/dist/transport/stdio/middleware.d.ts.map +0 -1
  144. package/dist/transport/stdio/middleware.js.map +0 -1
  145. package/dist/transport/ws/index.d.ts.map +0 -1
  146. package/dist/transport/ws/index.js.map +0 -1
  147. package/dist/transport/ws/middleware.d.ts.map +0 -1
  148. package/dist/transport/ws/middleware.js.map +0 -1
  149. package/dist/transport/ws/standalone.d.ts.map +0 -1
  150. package/dist/transport/ws/standalone.js.map +0 -1
  151. package/dist/types.d.ts.map +0 -1
  152. package/dist/types.js.map +0 -1
  153. package/htdoc/assets/index-Ck-39Igh.css +0 -963
  154. package/htdoc/assets/index-Cr0Jnrgb.js.map +0 -1
  155. package/webui/index.html +0 -12
  156. package/webui/src/App.tsx +0 -164
  157. package/webui/src/api/docGen.ts +0 -188
  158. package/webui/src/api/glob.ts +0 -90
  159. package/webui/src/api/httpTransport.ts +0 -148
  160. package/webui/src/api/metrics.ts +0 -135
  161. package/webui/src/api/paramForm.ts +0 -80
  162. package/webui/src/api/rpc.ts +0 -57
  163. package/webui/src/api/schema.ts +0 -12
  164. package/webui/src/api/types.ts +0 -16
  165. package/webui/src/components/MethodDetail.tsx +0 -43
  166. package/webui/src/components/MethodTree.tsx +0 -118
  167. package/webui/src/components/MetricsPanel.md +0 -126
  168. package/webui/src/components/MetricsPanel.tsx +0 -290
  169. package/webui/src/components/SchemaForm.tsx +0 -697
  170. package/webui/src/components/SchemaView.tsx +0 -151
  171. package/webui/src/components/TestPanel.tsx +0 -322
  172. package/webui/src/components/Toolbar.tsx +0 -82
  173. package/webui/src/hooks/useMethodDetail.ts +0 -61
  174. package/webui/src/hooks/useMethods.ts +0 -27
  175. package/webui/src/hooks/useMetrics.ts +0 -91
  176. package/webui/src/main.tsx +0 -13
  177. package/webui/src/theme/ThemeProvider.tsx +0 -79
  178. package/webui/src/vite-env.d.ts +0 -1
  179. package/webui/tsconfig.json +0 -34
  180. package/webui/tsconfig.node.json +0 -13
  181. package/webui/vite.config.ts +0 -15
@@ -1,963 +0,0 @@
1
- /* ================================================================
2
- * 颜色令牌
3
- * 默认 = 暗色;light 覆盖;system 由 ThemeProvider 写 data-theme 决定
4
- * ================================================================ */
5
- :root {
6
- --bg: #0b0f14;
7
- --bg-elev: #11161d;
8
- --bg-deep: #010409;
9
- --fg: #c9d1d9;
10
- --fg-dim: #8b949e;
11
- --border: #21262d;
12
- --border-strong: #30363d;
13
- --accent: #39d353;
14
- --accent-dim: #2a9f3e;
15
- --danger: #f85149;
16
- --hover-bg: #161b22;
17
- --active-bg: #1f6feb33;
18
- --accent-fg: #79c0ff;
19
-
20
- /* Schema / 语法高亮 */
21
- --syn-string: #a5d6ff;
22
- --syn-number: #f2cc60;
23
- --syn-boolean: #ff7b72;
24
- --syn-literal: #d2a8ff;
25
- --syn-container: #7ee787;
26
- --syn-object: #79c0ff;
27
- --syn-union: #ffa657;
28
- --syn-nullable: #ff79c6;
29
- --syn-muted: #8b949e;
30
-
31
- --mono: "JetBrains Mono", "Fira Code", Menlo, Consolas, "Courier New", monospace;
32
- }
33
-
34
- :root[data-theme='light'] {
35
- --bg: #ffffff;
36
- --bg-elev: #f6f8fa;
37
- --bg-deep: #f6f8fa;
38
- --fg: #1f2328;
39
- --fg-dim: #59636e;
40
- --border: #d0d7de;
41
- --border-strong: #afb8c1;
42
- --accent: #1a7f37;
43
- --accent-dim: #116329;
44
- --danger: #cf222e;
45
- --hover-bg: #eaeef2;
46
- --active-bg: #ddf4ff;
47
- --accent-fg: #0969da;
48
-
49
- --syn-string: #0a3069;
50
- --syn-number: #0550ae;
51
- --syn-boolean: #cf222e;
52
- --syn-literal: #8250df;
53
- --syn-container: #116329;
54
- --syn-object: #0969da;
55
- --syn-union: #bc4c00;
56
- --syn-nullable: #a626a4;
57
- --syn-muted: #57606a;
58
- }
59
-
60
- /* ================================================================
61
- * 基础
62
- * ================================================================ */
63
- * {
64
- box-sizing: border-box;
65
- }
66
-
67
- html,
68
- body,
69
- #root {
70
- height: 100%;
71
- }
72
-
73
- body {
74
- margin: 0;
75
- background: var(--bg);
76
- color: var(--fg);
77
- font: 13px/1.55 var(--mono);
78
- -webkit-font-smoothing: antialiased;
79
- }
80
-
81
- button {
82
- font: inherit;
83
- background: var(--bg-elev);
84
- color: var(--fg);
85
- border: 1px solid var(--border-strong);
86
- padding: 4px 12px;
87
- border-radius: 4px;
88
- cursor: pointer;
89
- transition: border-color .15s, color .15s, background .15s;
90
- }
91
-
92
- button:hover:not(:disabled) {
93
- border-color: var(--accent);
94
- color: var(--accent);
95
- }
96
-
97
- button:disabled {
98
- opacity: .5;
99
- cursor: not-allowed;
100
- }
101
-
102
- input[type="checkbox"] {
103
- accent-color: var(--accent);
104
- }
105
-
106
- /* ================================================================
107
- * 布局
108
- * ================================================================ */
109
- .app {
110
- display: flex;
111
- flex-direction: column;
112
- height: 100%;
113
- }
114
-
115
- .toolbar {
116
- display: flex;
117
- align-items: center;
118
- gap: 16px;
119
- padding: 10px 16px;
120
- border-bottom: 1px solid var(--border);
121
- background: var(--bg-elev);
122
- flex-wrap: wrap;
123
- }
124
-
125
- .toolbar h1 {
126
- font-size: 15px;
127
- margin: 0;
128
- color: var(--accent);
129
- letter-spacing: .5px;
130
- }
131
-
132
- /* 分段按钮 */
133
- .segmented {
134
- display: inline-flex;
135
- border: 1px solid var(--border-strong);
136
- border-radius: 4px;
137
- overflow: hidden;
138
- }
139
-
140
- .segmented button {
141
- border: none;
142
- border-radius: 0;
143
- background: transparent;
144
- padding: 4px 12px;
145
- color: var(--fg-dim);
146
- }
147
-
148
- .segmented button+button {
149
- border-left: 1px solid var(--border-strong);
150
- }
151
-
152
- .segmented button:hover:not(.active) {
153
- color: var(--fg);
154
- background: var(--hover-bg);
155
- }
156
-
157
- .segmented button.active {
158
- background: var(--active-bg);
159
- color: var(--accent);
160
- }
161
-
162
- main {
163
- flex: 1;
164
- display: grid;
165
- grid-template-columns: 320px 1fr;
166
- min-height: 0;
167
- }
168
-
169
- .sidebar {
170
- border-right: 1px solid var(--border);
171
- overflow: auto;
172
- padding: 12px;
173
- background: var(--bg-elev);
174
- }
175
-
176
- .sidebar h2 {
177
- font-size: 12px;
178
- color: var(--fg-dim);
179
- text-transform: uppercase;
180
- letter-spacing: 1px;
181
- margin: 0 0 8px;
182
- }
183
-
184
- .content {
185
- overflow: auto;
186
- padding: 16px 20px;
187
- display: flex;
188
- flex-direction: column;
189
- gap: 24px;
190
- }
191
-
192
- /* ================================================================
193
- * 方法树
194
- * ================================================================ */
195
- .tree,
196
- .tree ul {
197
- list-style: none;
198
- margin: 0;
199
- padding: 0;
200
- }
201
-
202
- .dir-row {
203
- display: flex;
204
- align-items: center;
205
- gap: 4px;
206
- padding: 2px 4px;
207
- cursor: pointer;
208
- border-radius: 3px;
209
- }
210
-
211
- .dir-row:hover {
212
- background: var(--hover-bg);
213
- }
214
-
215
- .expander {
216
- color: var(--fg-dim);
217
- width: 12px;
218
- display: inline-block;
219
- }
220
-
221
- .dir {
222
- color: var(--syn-object);
223
- }
224
-
225
- .leaf {
226
- padding: 2px 4px;
227
- cursor: pointer;
228
- border-radius: 3px;
229
- color: var(--accent);
230
- white-space: nowrap;
231
- overflow: hidden;
232
- text-overflow: ellipsis;
233
- }
234
-
235
- .leaf:hover {
236
- background: var(--hover-bg);
237
- }
238
-
239
- .leaf.active {
240
- background: var(--active-bg);
241
- color: var(--accent-fg);
242
- }
243
-
244
- /* ================================================================
245
- * 详情 / 测试面板
246
- * ================================================================ */
247
- .detail h2 {
248
- margin: 0 0 12px;
249
- color: var(--accent);
250
- font-size: 16px;
251
- word-break: break-all;
252
- }
253
-
254
- .detail h3,
255
- .test h3 {
256
- margin: 16px 0 6px;
257
- font-size: 12px;
258
- color: var(--fg-dim);
259
- text-transform: uppercase;
260
- letter-spacing: 1px;
261
- }
262
-
263
- pre,
264
- textarea {
265
- background: var(--bg-deep);
266
- border: 1px solid var(--border);
267
- color: var(--fg);
268
- padding: 10px;
269
- border-radius: 4px;
270
- font: inherit;
271
- width: 100%;
272
- overflow: auto;
273
- margin: 0;
274
- }
275
-
276
- pre {
277
- white-space: pre-wrap;
278
- word-break: break-word;
279
- max-height: 320px;
280
- }
281
-
282
- textarea {
283
- resize: vertical;
284
- min-height: 100px;
285
- outline: none;
286
- }
287
-
288
- textarea:focus {
289
- border-color: var(--accent);
290
- }
291
-
292
- .test .actions {
293
- display: flex;
294
- gap: 8px;
295
- margin: 10px 0 4px;
296
- }
297
-
298
- .hint {
299
- color: var(--fg-dim);
300
- font-style: italic;
301
- }
302
-
303
- .error {
304
- color: var(--danger);
305
- }
306
-
307
- .output {
308
- color: var(--syn-string);
309
- }
310
-
311
- .empty {
312
- color: var(--fg-dim);
313
- padding: 12px 0;
314
- }
315
-
316
- ::-webkit-scrollbar {
317
- width: 10px;
318
- height: 10px;
319
- }
320
-
321
- ::-webkit-scrollbar-track {
322
- background: var(--bg);
323
- }
324
-
325
- ::-webkit-scrollbar-thumb {
326
- background: var(--border);
327
- border-radius: 5px;
328
- border: 2px solid var(--bg);
329
- }
330
-
331
- ::-webkit-scrollbar-thumb:hover {
332
- background: var(--border-strong);
333
- }
334
-
335
- /* ================================================================
336
- * Schema 视图(只读,MethodDetail 返回值用)
337
- * ================================================================ */
338
- .signature-schemas {
339
- display: flex;
340
- flex-direction: column;
341
- gap: 10px;
342
- }
343
-
344
- .param-block {
345
- background: var(--bg-deep);
346
- border: 1px solid var(--border);
347
- border-radius: 4px;
348
- padding: 8px 10px;
349
- }
350
-
351
- .param-index {
352
- font-size: 12px;
353
- color: var(--fg-dim);
354
- margin-bottom: 4px;
355
- }
356
-
357
- .schema-node {
358
- line-height: 1.6;
359
- }
360
-
361
- .schema-head {
362
- display: flex;
363
- align-items: baseline;
364
- gap: 4px;
365
- cursor: default;
366
- flex-wrap: wrap;
367
- }
368
-
369
- .schema-head:has(.schema-expander:not(:empty)) {
370
- cursor: pointer;
371
- }
372
-
373
- .schema-expander {
374
- color: var(--fg-dim);
375
- width: 12px;
376
- display: inline-block;
377
- flex: none;
378
- }
379
-
380
- .schema-label {
381
- color: var(--syn-union);
382
- }
383
-
384
- .schema-label::after {
385
- content: '';
386
- }
387
-
388
- .schema-kind {
389
- font-weight: bold;
390
- }
391
-
392
- .schema-nullable {
393
- color: var(--fg-dim);
394
- }
395
-
396
- .schema-nullable-badge {
397
- color: var(--syn-nullable);
398
- font-size: 90%;
399
- font-weight: bold;
400
- letter-spacing: .5px;
401
- text-transform: lowercase;
402
- opacity: .9;
403
- }
404
-
405
- .schema-constraints {
406
- color: var(--syn-muted);
407
- font-size: 90%;
408
- }
409
-
410
- .schema-description {
411
- color: var(--fg-dim);
412
- font-style: italic;
413
- font-size: 90%;
414
- }
415
-
416
- .schema-children {
417
- margin-top: 2px;
418
- }
419
-
420
- /* ================================================================
421
- * SchemaForm(参数类型 + 值输入合并)
422
- * ================================================================ */
423
- .schema-form {
424
- display: flex;
425
- flex-direction: column;
426
- gap: 10px;
427
- margin-bottom: 12px;
428
- }
429
-
430
- .sf-node {
431
- margin: 2px 0;
432
- }
433
-
434
- .sf-head {
435
- display: flex;
436
- align-items: baseline;
437
- gap: 6px;
438
- flex-wrap: wrap;
439
- font-size: 12px;
440
- line-height: 1.6;
441
- }
442
-
443
- .sf-head-clickable {
444
- cursor: pointer;
445
- border-radius: 3px;
446
- }
447
-
448
- .sf-head-clickable:hover {
449
- background: var(--hover-bg);
450
- }
451
-
452
- .sf-expander {
453
- color: var(--fg-dim);
454
- width: 12px;
455
- display: inline-block;
456
- flex: none;
457
- }
458
-
459
- .sf-label {
460
- color: var(--syn-union);
461
- font-weight: bold;
462
- }
463
-
464
- .sf-kind {
465
- font-weight: bold;
466
- }
467
-
468
- .sf-nullable {
469
- color: var(--fg-dim);
470
- }
471
-
472
- .sf-nullable-badge {
473
- color: var(--syn-nullable);
474
- font-size: 90%;
475
- font-weight: bold;
476
- letter-spacing: .5px;
477
- text-transform: lowercase;
478
- opacity: .9;
479
- }
480
-
481
- .sf-desc {
482
- color: var(--fg-dim);
483
- font-style: italic;
484
- font-size: 90%;
485
- }
486
-
487
- .sf-constraints {
488
- color: var(--syn-muted);
489
- font-size: 90%;
490
- }
491
-
492
- .sf-children {
493
- margin-top: 2px;
494
- }
495
-
496
- .sf-null-indicator {
497
- color: var(--syn-muted);
498
- font-style: italic;
499
- font-size: 12px;
500
- }
501
-
502
- .sf-row {
503
- display: flex;
504
- align-items: flex-start;
505
- gap: 10px;
506
- }
507
-
508
- .sf-row>.sf-head-inline {
509
- flex: 0 0 auto;
510
- display: flex;
511
- align-items: baseline;
512
- gap: 6px;
513
- flex-wrap: nowrap;
514
- white-space: nowrap;
515
- min-width: 0;
516
- padding-top: 3px;
517
- }
518
-
519
- .sf-row>.sf-input-cell {
520
- flex: 1 1 auto;
521
- min-width: 0;
522
- display: flex;
523
- flex-direction: column;
524
- gap: 2px;
525
- }
526
-
527
- .sf-row .sf-input,
528
- .sf-row .sf-textarea {
529
- width: 100%;
530
- min-width: 0;
531
- }
532
-
533
- .sf-array-item,
534
- .sf-record-item {
535
- display: flex;
536
- align-items: flex-start;
537
- gap: 8px;
538
- border-left: 2px solid var(--border);
539
- padding-left: 6px;
540
- margin: 2px 0;
541
- }
542
-
543
- .sf-array-item>.sf-node,
544
- .sf-record-item>.sf-node {
545
- flex: 1;
546
- min-width: 0;
547
- }
548
-
549
- .sf-record-add {
550
- display: flex;
551
- gap: 6px;
552
- margin-top: 6px;
553
- padding-left: 6px;
554
- }
555
-
556
- .sf-union-picker {
557
- margin: 0;
558
- }
559
-
560
- .sf-input {
561
- background: var(--bg);
562
- border: 1px solid var(--border-strong);
563
- color: var(--fg);
564
- font: inherit;
565
- padding: 3px 8px;
566
- border-radius: 3px;
567
- outline: none;
568
- min-width: 120px;
569
- }
570
-
571
- .sf-input:focus {
572
- border-color: var(--accent);
573
- }
574
-
575
- .sf-scalar {
576
- display: flex;
577
- align-items: center;
578
- gap: 6px;
579
- }
580
-
581
- .sf-textarea {
582
- width: 100%;
583
- min-height: 60px;
584
- font-size: 12px;
585
- background: var(--bg-deep);
586
- border: 1px solid var(--border);
587
- color: var(--fg);
588
- padding: 6px;
589
- border-radius: 3px;
590
- resize: vertical;
591
- outline: none;
592
- font-family: var(--mono);
593
- }
594
-
595
- .sf-textarea:focus {
596
- border-color: var(--accent);
597
- }
598
-
599
- @media (max-width: 720px) {
600
- .sf-row {
601
- flex-direction: column;
602
- gap: 4px;
603
- }
604
-
605
- .sf-row>.sf-head-inline {
606
- white-space: normal;
607
- padding-top: 0;
608
- }
609
- }
610
-
611
- .error.small {
612
- font-size: 11px;
613
- }
614
-
615
- /* ---- 工具栏主题下拉(右上角) ---- */
616
- .toolbar .theme-select {
617
- margin-left: auto;
618
- display: inline-flex;
619
- align-items: center;
620
- gap: 6px;
621
- font-size: 12px;
622
- color: var(--fg-dim);
623
- white-space: nowrap;
624
- }
625
-
626
- .theme-select-label {
627
- color: var(--fg-dim);
628
- }
629
-
630
- .theme-select select {
631
- font: inherit;
632
- font-size: 12px;
633
- background: var(--bg);
634
- color: var(--fg);
635
- border: 1px solid var(--border-strong);
636
- border-radius: 4px;
637
- padding: 3px 24px 3px 8px;
638
- outline: none;
639
- cursor: pointer;
640
- /* 自定义下拉箭头,跨主题可见 */
641
- appearance: none;
642
- -webkit-appearance: none;
643
- background-image: linear-gradient(45deg, transparent 50%, var(--fg-dim) 50%),
644
- linear-gradient(135deg, var(--fg-dim) 50%, transparent 50%);
645
- background-position: calc(100% - 12px) 50%, calc(100% - 8px) 50%;
646
- background-size: 4px 4px, 4px 4px;
647
- background-repeat: no-repeat;
648
- transition: border-color .15s, color .15s;
649
- }
650
-
651
- .theme-select select:hover {
652
- border-color: var(--accent);
653
- color: var(--fg);
654
- }
655
-
656
- .theme-select select:focus {
657
- border-color: var(--accent);
658
- }
659
-
660
-
661
- .actions .error.small {
662
- align-self: center;
663
- margin-left: 4px;
664
- }
665
-
666
-
667
-
668
- /* ---- 分裂按钮(主体复制 + ▾ 选格式) ---- */
669
- .split-button {
670
- position: relative;
671
- display: inline-flex;
672
- }
673
-
674
- .split-button-main,
675
- .split-button-caret {
676
- border-radius: 0;
677
- border: 1px solid var(--border-strong);
678
- background: var(--bg-elev);
679
- color: var(--fg);
680
- font: inherit;
681
- padding: 4px 10px;
682
- cursor: pointer;
683
- transition: border-color .15s, color .15s, background .15s;
684
- }
685
-
686
- .split-button-main {
687
- border-top-left-radius: 4px;
688
- border-bottom-left-radius: 4px;
689
- border-right: none;
690
- }
691
-
692
- .split-button-caret {
693
- border-top-right-radius: 4px;
694
- border-bottom-right-radius: 4px;
695
- padding: 4px 8px;
696
- line-height: 1;
697
- }
698
-
699
- .split-button:hover>.split-button-main:not(:disabled),
700
- .split-button:hover>.split-button-caret:not(:disabled) {
701
- border-color: var(--accent);
702
- color: var(--accent);
703
- }
704
-
705
- .split-button-main:disabled,
706
- .split-button-caret:disabled {
707
- opacity: .5;
708
- cursor: not-allowed;
709
- }
710
-
711
- .split-button-menu {
712
- position: absolute;
713
- top: 100%;
714
- left: 0;
715
- margin: 4px 0 0;
716
- padding: 4px 0;
717
- list-style: none;
718
- background: var(--bg-elev);
719
- border: 1px solid var(--border-strong);
720
- border-radius: 4px;
721
- min-width: 140px;
722
- z-index: 20;
723
- box-shadow: 0 4px 12px rgba(0, 0, 0, .3);
724
- }
725
-
726
- .split-button-menu li {
727
- padding: 5px 12px;
728
- cursor: pointer;
729
- font-size: 12px;
730
- color: var(--fg);
731
- display: flex;
732
- justify-content: space-between;
733
- gap: 12px;
734
- }
735
-
736
- .split-button-menu li:hover {
737
- background: var(--hover-bg);
738
- color: var(--accent);
739
- }
740
-
741
- .split-button-menu li .check {
742
- color: var(--accent);
743
- }
744
-
745
- @media (max-width: 720px) {
746
- .split-button {
747
- display: inline-flex;
748
- }
749
- }
750
-
751
- /* ---- 耗时徽章(TestPanel 结果区) ---- */
752
- .elapsed-badge {
753
- color: var(--syn-number);
754
- font-size: 12px;
755
- font-weight: normal;
756
- letter-spacing: 0;
757
- text-transform: none;
758
- }
759
-
760
- .elapsed-badge .hint {
761
- font-size: 11px;
762
- }
763
-
764
-
765
-
766
- /* ================================================================
767
- * Metrics 面板
768
- * ================================================================ */
769
- .metrics {
770
- display: flex;
771
- flex-direction: column;
772
- gap: 16px;
773
- }
774
-
775
- .metrics-header {
776
- display: flex;
777
- align-items: center;
778
- justify-content: space-between;
779
- gap: 12px;
780
- flex-wrap: wrap;
781
- }
782
-
783
- .metrics-header h2 {
784
- margin: 0;
785
- color: var(--accent);
786
- font-size: 16px;
787
- }
788
-
789
- .metrics-controls {
790
- display: flex;
791
- align-items: center;
792
- gap: 10px;
793
- flex-wrap: wrap;
794
- }
795
-
796
- .metrics-auto {
797
- display: inline-flex;
798
- align-items: center;
799
- gap: 4px;
800
- font-size: 12px;
801
- color: var(--fg-dim);
802
- cursor: pointer;
803
- user-select: none;
804
- }
805
-
806
- .metrics-cards {
807
- display: grid;
808
- grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
809
- gap: 10px;
810
- }
811
-
812
- .metric-card {
813
- background: var(--bg-elev);
814
- border: 1px solid var(--border);
815
- border-radius: 4px;
816
- padding: 10px 12px;
817
- display: flex;
818
- flex-direction: column;
819
- gap: 4px;
820
- }
821
-
822
- .metric-card-label {
823
- font-size: 11px;
824
- color: var(--fg-dim);
825
- text-transform: uppercase;
826
- letter-spacing: 1px;
827
- }
828
-
829
- .metric-card-value {
830
- font-size: 22px;
831
- font-weight: bold;
832
- color: var(--fg);
833
- font-variant-numeric: tabular-nums;
834
- }
835
-
836
- .metric-card-danger .metric-card-value {
837
- color: var(--danger);
838
- }
839
-
840
- .metric-card-warn .metric-card-value {
841
- color: var(--syn-number);
842
- }
843
-
844
- .metrics-table {
845
- width: 100%;
846
- border-collapse: collapse;
847
- font-size: 12px;
848
- font-variant-numeric: tabular-nums;
849
- }
850
-
851
- .metrics-table th,
852
- .metrics-table td {
853
- padding: 6px 8px;
854
- border-bottom: 1px solid var(--border);
855
- text-align: left;
856
- white-space: nowrap;
857
- }
858
-
859
- .metrics-table th {
860
- color: var(--fg-dim);
861
- font-weight: normal;
862
- text-transform: uppercase;
863
- letter-spacing: .5px;
864
- font-size: 11px;
865
- position: sticky;
866
- top: 0;
867
- background: var(--bg);
868
- z-index: 1;
869
- }
870
-
871
- .metrics-table td.num,
872
- .metrics-table th.num {
873
- text-align: right;
874
- }
875
-
876
- .metrics-table tr:hover td {
877
- background: var(--hover-bg);
878
- }
879
-
880
- .metrics-table .method-name {
881
- color: var(--accent);
882
- font-family: var(--mono);
883
- max-width: 260px;
884
- overflow: hidden;
885
- text-overflow: ellipsis;
886
- }
887
-
888
- .metrics-table .error {
889
- color: var(--danger);
890
- }
891
-
892
- .metrics-table .warn {
893
- color: var(--syn-number);
894
- }
895
-
896
- .metrics-table .rate-hot {
897
- color: var(--syn-boolean);
898
- font-weight: bold;
899
- }
900
-
901
- .metrics-table .rate-warm {
902
- color: var(--syn-number);
903
- }
904
-
905
- .metrics-table .rate-cold {
906
- color: var(--fg-dim);
907
- }
908
-
909
- .metrics-table.compact th,
910
- .metrics-table.compact td {
911
- padding: 3px 6px;
912
- font-size: 11px;
913
- }
914
-
915
- .view-switch {
916
- margin-bottom: 8px;
917
- width: 100%;
918
- }
919
-
920
- .view-switch button {
921
- flex: 1;
922
- }
923
-
924
- /* ---- Metrics 侧边栏 ---- */
925
- .metrics-sidebar {
926
- display: flex;
927
- flex-direction: column;
928
- gap: 8px;
929
- }
930
-
931
- .metrics-filter {
932
- display: flex;
933
- flex-direction: column;
934
- gap: 4px;
935
- }
936
-
937
- .metrics-filter-label {
938
- font-size: 11px;
939
- color: var(--fg-dim);
940
- text-transform: uppercase;
941
- letter-spacing: 1px;
942
- }
943
-
944
- .metrics-filter-help {
945
- font-size: 11px;
946
- line-height: 1.5;
947
- margin: 0;
948
- }
949
-
950
- .metrics-filter-help code {
951
- background: var(--bg-deep);
952
- border: 1px solid var(--border);
953
- border-radius: 3px;
954
- padding: 0 4px;
955
- font-size: 11px;
956
- color: var(--syn-literal);
957
- }
958
-
959
- .metrics-filter-stat {
960
- font-size: 11px;
961
- margin: 4px 0 0;
962
- color: var(--accent);
963
- }