dsh-dock 0.11.3 → 0.11.6

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.
package/client.js CHANGED
@@ -12,11 +12,7 @@ var __getOwnPropNames = Object.getOwnPropertyNames;
12
12
  var __getProtoOf = Object.getPrototypeOf;
13
13
  var __hasOwnProp = Object.prototype.hasOwnProperty;
14
14
  var __commonJS = (cb, mod) => function __require() {
15
- try {
16
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
17
- } catch (e) {
18
- throw mod = 0, e;
19
- }
15
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
20
16
  };
21
17
  var __export = (target, all) => {
22
18
  for (var name in all)
@@ -40,18 +36,18 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
40
36
  ));
41
37
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
42
38
 
43
- // node_modules/qrcode/lib/can-promise.js
39
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/can-promise.js
44
40
  var require_can_promise = __commonJS({
45
- "node_modules/qrcode/lib/can-promise.js"(exports, module2) {
41
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/can-promise.js"(exports, module2) {
46
42
  module2.exports = function() {
47
43
  return typeof Promise === "function" && Promise.prototype && Promise.prototype.then;
48
44
  };
49
45
  }
50
46
  });
51
47
 
52
- // node_modules/qrcode/lib/core/utils.js
48
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.js
53
49
  var require_utils = __commonJS({
54
- "node_modules/qrcode/lib/core/utils.js"(exports) {
50
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.js"(exports) {
55
51
  var toSJISFunction;
56
52
  var CODEWORDS_COUNT = [
57
53
  0,
@@ -128,9 +124,9 @@ var require_utils = __commonJS({
128
124
  }
129
125
  });
130
126
 
131
- // node_modules/qrcode/lib/core/error-correction-level.js
127
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-level.js
132
128
  var require_error_correction_level = __commonJS({
133
- "node_modules/qrcode/lib/core/error-correction-level.js"(exports) {
129
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-level.js"(exports) {
134
130
  exports.L = { bit: 1 };
135
131
  exports.M = { bit: 0 };
136
132
  exports.Q = { bit: 3 };
@@ -173,9 +169,9 @@ var require_error_correction_level = __commonJS({
173
169
  }
174
170
  });
175
171
 
176
- // node_modules/qrcode/lib/core/bit-buffer.js
172
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-buffer.js
177
173
  var require_bit_buffer = __commonJS({
178
- "node_modules/qrcode/lib/core/bit-buffer.js"(exports, module2) {
174
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-buffer.js"(exports, module2) {
179
175
  function BitBuffer() {
180
176
  this.buffer = [];
181
177
  this.length = 0;
@@ -208,9 +204,9 @@ var require_bit_buffer = __commonJS({
208
204
  }
209
205
  });
210
206
 
211
- // node_modules/qrcode/lib/core/bit-matrix.js
207
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-matrix.js
212
208
  var require_bit_matrix = __commonJS({
213
- "node_modules/qrcode/lib/core/bit-matrix.js"(exports, module2) {
209
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-matrix.js"(exports, module2) {
214
210
  function BitMatrix(size) {
215
211
  if (!size || size < 1) {
216
212
  throw new Error("BitMatrix size must be defined and greater than 0");
@@ -237,9 +233,9 @@ var require_bit_matrix = __commonJS({
237
233
  }
238
234
  });
239
235
 
240
- // node_modules/qrcode/lib/core/alignment-pattern.js
236
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alignment-pattern.js
241
237
  var require_alignment_pattern = __commonJS({
242
- "node_modules/qrcode/lib/core/alignment-pattern.js"(exports) {
238
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alignment-pattern.js"(exports) {
243
239
  var getSymbolSize = require_utils().getSymbolSize;
244
240
  exports.getRowColCoords = function getRowColCoords(version) {
245
241
  if (version === 1) return [];
@@ -272,9 +268,9 @@ var require_alignment_pattern = __commonJS({
272
268
  }
273
269
  });
274
270
 
275
- // node_modules/qrcode/lib/core/finder-pattern.js
271
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/finder-pattern.js
276
272
  var require_finder_pattern = __commonJS({
277
- "node_modules/qrcode/lib/core/finder-pattern.js"(exports) {
273
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/finder-pattern.js"(exports) {
278
274
  var getSymbolSize = require_utils().getSymbolSize;
279
275
  var FINDER_PATTERN_SIZE = 7;
280
276
  exports.getPositions = function getPositions(version) {
@@ -291,9 +287,9 @@ var require_finder_pattern = __commonJS({
291
287
  }
292
288
  });
293
289
 
294
- // node_modules/qrcode/lib/core/mask-pattern.js
290
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mask-pattern.js
295
291
  var require_mask_pattern = __commonJS({
296
- "node_modules/qrcode/lib/core/mask-pattern.js"(exports) {
292
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mask-pattern.js"(exports) {
297
293
  exports.Patterns = {
298
294
  PATTERN000: 0,
299
295
  PATTERN001: 1,
@@ -433,9 +429,9 @@ var require_mask_pattern = __commonJS({
433
429
  }
434
430
  });
435
431
 
436
- // node_modules/qrcode/lib/core/error-correction-code.js
432
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-code.js
437
433
  var require_error_correction_code = __commonJS({
438
- "node_modules/qrcode/lib/core/error-correction-code.js"(exports) {
434
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-code.js"(exports) {
439
435
  var ECLevel = require_error_correction_level();
440
436
  var EC_BLOCKS_TABLE = [
441
437
  // L M Q H
@@ -794,9 +790,9 @@ var require_error_correction_code = __commonJS({
794
790
  }
795
791
  });
796
792
 
797
- // node_modules/qrcode/lib/core/galois-field.js
793
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/galois-field.js
798
794
  var require_galois_field = __commonJS({
799
- "node_modules/qrcode/lib/core/galois-field.js"(exports) {
795
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/galois-field.js"(exports) {
800
796
  var EXP_TABLE = new Uint8Array(512);
801
797
  var LOG_TABLE = new Uint8Array(256);
802
798
  (function initTables() {
@@ -827,9 +823,9 @@ var require_galois_field = __commonJS({
827
823
  }
828
824
  });
829
825
 
830
- // node_modules/qrcode/lib/core/polynomial.js
826
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/polynomial.js
831
827
  var require_polynomial = __commonJS({
832
- "node_modules/qrcode/lib/core/polynomial.js"(exports) {
828
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/polynomial.js"(exports) {
833
829
  var GF = require_galois_field();
834
830
  exports.mul = function mul(p1, p2) {
835
831
  const coeff = new Uint8Array(p1.length + p2.length - 1);
@@ -863,9 +859,9 @@ var require_polynomial = __commonJS({
863
859
  }
864
860
  });
865
861
 
866
- // node_modules/qrcode/lib/core/reed-solomon-encoder.js
862
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/reed-solomon-encoder.js
867
863
  var require_reed_solomon_encoder = __commonJS({
868
- "node_modules/qrcode/lib/core/reed-solomon-encoder.js"(exports, module2) {
864
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/reed-solomon-encoder.js"(exports, module2) {
869
865
  var Polynomial = require_polynomial();
870
866
  function ReedSolomonEncoder(degree) {
871
867
  this.genPoly = void 0;
@@ -895,18 +891,18 @@ var require_reed_solomon_encoder = __commonJS({
895
891
  }
896
892
  });
897
893
 
898
- // node_modules/qrcode/lib/core/version-check.js
894
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version-check.js
899
895
  var require_version_check = __commonJS({
900
- "node_modules/qrcode/lib/core/version-check.js"(exports) {
896
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version-check.js"(exports) {
901
897
  exports.isValid = function isValid(version) {
902
898
  return !isNaN(version) && version >= 1 && version <= 40;
903
899
  };
904
900
  }
905
901
  });
906
902
 
907
- // node_modules/qrcode/lib/core/regex.js
903
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/regex.js
908
904
  var require_regex = __commonJS({
909
- "node_modules/qrcode/lib/core/regex.js"(exports) {
905
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/regex.js"(exports) {
910
906
  var numeric = "[0-9]+";
911
907
  var alphanumeric = "[A-Z $%*+\\-./:]+";
912
908
  var kanji = "(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";
@@ -932,9 +928,9 @@ var require_regex = __commonJS({
932
928
  }
933
929
  });
934
930
 
935
- // node_modules/qrcode/lib/core/mode.js
931
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mode.js
936
932
  var require_mode = __commonJS({
937
- "node_modules/qrcode/lib/core/mode.js"(exports) {
933
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mode.js"(exports) {
938
934
  var VersionCheck = require_version_check();
939
935
  var Regex = require_regex();
940
936
  exports.NUMERIC = {
@@ -1013,9 +1009,9 @@ var require_mode = __commonJS({
1013
1009
  }
1014
1010
  });
1015
1011
 
1016
- // node_modules/qrcode/lib/core/version.js
1012
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version.js
1017
1013
  var require_version = __commonJS({
1018
- "node_modules/qrcode/lib/core/version.js"(exports) {
1014
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version.js"(exports) {
1019
1015
  var Utils = require_utils();
1020
1016
  var ECCode = require_error_correction_code();
1021
1017
  var ECLevel = require_error_correction_level();
@@ -1108,9 +1104,9 @@ var require_version = __commonJS({
1108
1104
  }
1109
1105
  });
1110
1106
 
1111
- // node_modules/qrcode/lib/core/format-info.js
1107
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/format-info.js
1112
1108
  var require_format_info = __commonJS({
1113
- "node_modules/qrcode/lib/core/format-info.js"(exports) {
1109
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/format-info.js"(exports) {
1114
1110
  var Utils = require_utils();
1115
1111
  var G15 = 1 << 10 | 1 << 8 | 1 << 5 | 1 << 4 | 1 << 2 | 1 << 1 | 1 << 0;
1116
1112
  var G15_MASK = 1 << 14 | 1 << 12 | 1 << 10 | 1 << 4 | 1 << 1;
@@ -1126,9 +1122,9 @@ var require_format_info = __commonJS({
1126
1122
  }
1127
1123
  });
1128
1124
 
1129
- // node_modules/qrcode/lib/core/numeric-data.js
1125
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/numeric-data.js
1130
1126
  var require_numeric_data = __commonJS({
1131
- "node_modules/qrcode/lib/core/numeric-data.js"(exports, module2) {
1127
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/numeric-data.js"(exports, module2) {
1132
1128
  var Mode = require_mode();
1133
1129
  function NumericData(data) {
1134
1130
  this.mode = Mode.NUMERIC;
@@ -1161,9 +1157,9 @@ var require_numeric_data = __commonJS({
1161
1157
  }
1162
1158
  });
1163
1159
 
1164
- // node_modules/qrcode/lib/core/alphanumeric-data.js
1160
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alphanumeric-data.js
1165
1161
  var require_alphanumeric_data = __commonJS({
1166
- "node_modules/qrcode/lib/core/alphanumeric-data.js"(exports, module2) {
1162
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alphanumeric-data.js"(exports, module2) {
1167
1163
  var Mode = require_mode();
1168
1164
  var ALPHA_NUM_CHARS = [
1169
1165
  "0",
@@ -1240,9 +1236,9 @@ var require_alphanumeric_data = __commonJS({
1240
1236
  }
1241
1237
  });
1242
1238
 
1243
- // node_modules/qrcode/lib/core/byte-data.js
1239
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/byte-data.js
1244
1240
  var require_byte_data = __commonJS({
1245
- "node_modules/qrcode/lib/core/byte-data.js"(exports, module2) {
1241
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/byte-data.js"(exports, module2) {
1246
1242
  var Mode = require_mode();
1247
1243
  function ByteData(data) {
1248
1244
  this.mode = Mode.BYTE;
@@ -1270,9 +1266,9 @@ var require_byte_data = __commonJS({
1270
1266
  }
1271
1267
  });
1272
1268
 
1273
- // node_modules/qrcode/lib/core/kanji-data.js
1269
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/kanji-data.js
1274
1270
  var require_kanji_data = __commonJS({
1275
- "node_modules/qrcode/lib/core/kanji-data.js"(exports, module2) {
1271
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/kanji-data.js"(exports, module2) {
1276
1272
  var Mode = require_mode();
1277
1273
  var Utils = require_utils();
1278
1274
  function KanjiData(data) {
@@ -1309,9 +1305,9 @@ var require_kanji_data = __commonJS({
1309
1305
  }
1310
1306
  });
1311
1307
 
1312
- // node_modules/dijkstrajs/dijkstra.js
1308
+ // .devdeps/node_modules/.pnpm/dijkstrajs@1.0.3/node_modules/dijkstrajs/dijkstra.js
1313
1309
  var require_dijkstra = __commonJS({
1314
- "node_modules/dijkstrajs/dijkstra.js"(exports, module2) {
1310
+ ".devdeps/node_modules/.pnpm/dijkstrajs@1.0.3/node_modules/dijkstrajs/dijkstra.js"(exports, module2) {
1315
1311
  "use strict";
1316
1312
  var dijkstra = {
1317
1313
  single_source_shortest_paths: function(graph, s, d) {
@@ -1410,9 +1406,9 @@ var require_dijkstra = __commonJS({
1410
1406
  }
1411
1407
  });
1412
1408
 
1413
- // node_modules/qrcode/lib/core/segments.js
1409
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/segments.js
1414
1410
  var require_segments = __commonJS({
1415
- "node_modules/qrcode/lib/core/segments.js"(exports) {
1411
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/segments.js"(exports) {
1416
1412
  var Mode = require_mode();
1417
1413
  var NumericData = require_numeric_data();
1418
1414
  var AlphanumericData = require_alphanumeric_data();
@@ -1596,9 +1592,9 @@ var require_segments = __commonJS({
1596
1592
  }
1597
1593
  });
1598
1594
 
1599
- // node_modules/qrcode/lib/core/qrcode.js
1595
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/qrcode.js
1600
1596
  var require_qrcode = __commonJS({
1601
- "node_modules/qrcode/lib/core/qrcode.js"(exports) {
1597
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/qrcode.js"(exports) {
1602
1598
  var Utils = require_utils();
1603
1599
  var ECLevel = require_error_correction_level();
1604
1600
  var BitBuffer = require_bit_buffer();
@@ -1857,9 +1853,9 @@ var require_qrcode = __commonJS({
1857
1853
  }
1858
1854
  });
1859
1855
 
1860
- // node_modules/qrcode/lib/renderer/utils.js
1856
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.js
1861
1857
  var require_utils2 = __commonJS({
1862
- "node_modules/qrcode/lib/renderer/utils.js"(exports) {
1858
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.js"(exports) {
1863
1859
  function hex2rgba(hex) {
1864
1860
  if (typeof hex === "number") {
1865
1861
  hex = hex.toString();
@@ -1937,9 +1933,9 @@ var require_utils2 = __commonJS({
1937
1933
  }
1938
1934
  });
1939
1935
 
1940
- // node_modules/qrcode/lib/renderer/canvas.js
1936
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/canvas.js
1941
1937
  var require_canvas = __commonJS({
1942
- "node_modules/qrcode/lib/renderer/canvas.js"(exports) {
1938
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/canvas.js"(exports) {
1943
1939
  var Utils = require_utils2();
1944
1940
  function clearCanvas(ctx, canvas, size) {
1945
1941
  ctx.clearRect(0, 0, canvas.width, canvas.height);
@@ -1990,9 +1986,9 @@ var require_canvas = __commonJS({
1990
1986
  }
1991
1987
  });
1992
1988
 
1993
- // node_modules/qrcode/lib/renderer/svg-tag.js
1989
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/svg-tag.js
1994
1990
  var require_svg_tag = __commonJS({
1995
- "node_modules/qrcode/lib/renderer/svg-tag.js"(exports) {
1991
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/svg-tag.js"(exports) {
1996
1992
  var Utils = require_utils2();
1997
1993
  function getColorAttrib(color, attrib) {
1998
1994
  const alpha = color.a / 255;
@@ -2048,9 +2044,9 @@ var require_svg_tag = __commonJS({
2048
2044
  }
2049
2045
  });
2050
2046
 
2051
- // node_modules/qrcode/lib/browser.js
2047
+ // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/browser.js
2052
2048
  var require_browser = __commonJS({
2053
- "node_modules/qrcode/lib/browser.js"(exports) {
2049
+ ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/browser.js"(exports) {
2054
2050
  var canPromise = require_can_promise();
2055
2051
  var QRCode2 = require_qrcode();
2056
2052
  var CanvasRenderer = require_canvas();
@@ -2346,6 +2342,21 @@ function fmtCostCnyExact(usd, rate) {
2346
2342
  const v = (Number(usd) || 0) * (Number(rate) > 0 ? Number(rate) : 7.2);
2347
2343
  return "\xA5" + v.toFixed(4);
2348
2344
  }
2345
+ function fmtDurCompact(ms) {
2346
+ if (ms === null || ms === void 0 || isNaN(ms)) return "\u2014";
2347
+ if (ms < 1e3) return Math.round(ms) + "ms";
2348
+ if (ms < 6e4) return (ms / 1e3).toFixed(1) + "s";
2349
+ if (ms < 36e5) return Math.round(ms / 6e4) + "m";
2350
+ return (ms / 36e5).toFixed(1) + "h";
2351
+ }
2352
+ function startOfToday() {
2353
+ const d = /* @__PURE__ */ new Date();
2354
+ d.setHours(0, 0, 0, 0);
2355
+ return d.getTime();
2356
+ }
2357
+ function hourOf(ts) {
2358
+ return new Date(ts).getHours();
2359
+ }
2349
2360
  var EXPORT_COLUMNS = [
2350
2361
  ["\u65F6\u95F4", (r) => fmtTime(r.time)],
2351
2362
  ["\u4F1A\u8BDDID", (r) => r.sessionId || ""],
@@ -2428,6 +2439,204 @@ function statusInfo(r) {
2428
2439
  if (r.status === "interrupted") return { code: 500, label: "500", cls: "warn", title: "\u4E2D\u65AD" };
2429
2440
  return { code: 0, label: "\u2026", cls: "pend", title: "\u8FDB\u884C\u4E2D" };
2430
2441
  }
2442
+ var CHART_COLORS = ["#60a5fa", "#fbbf24", "#4ade80", "#f472b6", "#a78bfa", "#fb923c", "#2dd4bf", "#e879f9", "#94a3b8", "#f87171"];
2443
+ function chartColor(i) {
2444
+ return CHART_COLORS[i % CHART_COLORS.length];
2445
+ }
2446
+ var CHART_METRICS = [
2447
+ ["totalTokens", "\u603B Token", (v) => fmtCompact(v)],
2448
+ ["calls", "\u8C03\u7528\u6B21\u6570", (v) => fmtNum(v)],
2449
+ ["cost", "\u91D1\u989D", (v, rate) => fmtCostCny(v, rate)],
2450
+ ["outputTokens", "\u8F93\u51FA Token", (v) => fmtCompact(v)]
2451
+ ];
2452
+ var CHART_DIMS = [
2453
+ ["model", "\u6A21\u578B"],
2454
+ ["provider", "\u63D0\u4F9B\u5546"],
2455
+ ["status", "\u72B6\u6001"],
2456
+ ["effort", "\u63A8\u7406\u5F3A\u5EA6"]
2457
+ ];
2458
+ function emptyAgg() {
2459
+ return { calls: 0, totalTokens: 0, outputTokens: 0, inputTokens: 0, cacheReadTokens: 0, reasoningTokens: 0, cost: 0, llmMs: 0, timed: 0 };
2460
+ }
2461
+ function addToAgg(a, r) {
2462
+ a.calls += 1;
2463
+ a.totalTokens += Number(r.totalTokens) || 0;
2464
+ a.outputTokens += Number(r.outputTokens) || 0;
2465
+ a.inputTokens += Number(r.inputTokens) || 0;
2466
+ a.cacheReadTokens += Number(r.cacheReadTokens) || 0;
2467
+ a.reasoningTokens += Number(r.reasoningTokens) || 0;
2468
+ a.cost += Number(r.cost) || 0;
2469
+ if (typeof r.llmMs === "number") {
2470
+ a.llmMs += r.llmMs;
2471
+ a.timed += 1;
2472
+ }
2473
+ }
2474
+ function groupByKey(records, keyFn, metric) {
2475
+ const map = /* @__PURE__ */ new Map();
2476
+ for (const r of records) {
2477
+ const k = keyFn(r);
2478
+ let a = map.get(k);
2479
+ if (!a) {
2480
+ a = emptyAgg();
2481
+ a.key = k;
2482
+ map.set(k, a);
2483
+ }
2484
+ addToAgg(a, r);
2485
+ }
2486
+ return [...map.values()].sort((a, b) => (b[metric] || 0) - (a[metric] || 0));
2487
+ }
2488
+ function DonutChart({ items, metric, metricFmt, rate, centerLabel, emptyText }) {
2489
+ const total = items.reduce((s, it) => s + (Number(it[metric]) || 0), 0);
2490
+ if (!items.length || total <= 0) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-chart-empty", children: emptyText || "\u6682\u65E0\u6570\u636E" });
2491
+ const shown = items.slice(0, 8);
2492
+ const restSum = items.slice(8).reduce((s, it) => s + (Number(it[metric]) || 0), 0);
2493
+ if (restSum > 0) {
2494
+ const restAgg = Object.assign(emptyAgg(), { key: "\u5176\u4ED6(" + (items.length - 8) + "\u9879)" });
2495
+ restAgg[metric] = restSum;
2496
+ shown.push(restAgg);
2497
+ }
2498
+ const R = 15.9155;
2499
+ let acc = 0;
2500
+ const segs = shown.map((it, i) => {
2501
+ const v = Number(it[metric]) || 0;
2502
+ const frac = v / total;
2503
+ const seg = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
2504
+ "circle",
2505
+ {
2506
+ cx: "21",
2507
+ cy: "21",
2508
+ r: R,
2509
+ fill: "none",
2510
+ stroke: chartColor(i),
2511
+ strokeWidth: frac > 0.02 ? 7 : 5,
2512
+ strokeDasharray: frac * 100 + " " + (100 - frac * 100),
2513
+ strokeDashoffset: String(25 - acc * 100),
2514
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("title", { children: it.key + "\uFF1A" + metricFmt(v, rate) + "\uFF08" + (frac * 100).toFixed(1) + "%\uFF09" })
2515
+ },
2516
+ it.key
2517
+ );
2518
+ acc += frac;
2519
+ return seg;
2520
+ });
2521
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-donut-wrap", children: [
2522
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", { className: "dtok-donut", viewBox: "0 0 42 42", role: "img", children: [
2523
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "21", cy: "21", r: R, fill: "none", stroke: "var(--dsw-alias-border-l1)", strokeWidth: "7" }),
2524
+ segs,
2525
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("text", { x: "21", y: "19.5", textAnchor: "middle", className: "dtok-donut-v", children: metricFmt(total, rate) }),
2526
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("text", { x: "21", y: "26", textAnchor: "middle", className: "dtok-donut-l", children: centerLabel })
2527
+ ] }),
2528
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-legend", children: shown.map((it, i) => {
2529
+ const v = Number(it[metric]) || 0;
2530
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-legend-row", title: it.key, children: [
2531
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "dtok-dot", style: { background: chartColor(i) } }),
2532
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "dtok-legend-k", children: it.key }),
2533
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "dtok-legend-v", children: [
2534
+ metricFmt(v, rate),
2535
+ " \xB7 ",
2536
+ (v / total * 100).toFixed(1),
2537
+ "%"
2538
+ ] })
2539
+ ] }, it.key);
2540
+ }) })
2541
+ ] });
2542
+ }
2543
+ function HBarChart({ items, metric, metricFmt, rate, maxRows, emptyText }) {
2544
+ if (!items.length) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-chart-empty", children: emptyText || "\u6682\u65E0\u6570\u636E" });
2545
+ const shown = items.slice(0, maxRows || 12);
2546
+ const max = Math.max(...shown.map((it) => Number(it[metric]) || 0), 1e-9);
2547
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-hbars", children: shown.map((it, i) => {
2548
+ const v = Number(it[metric]) || 0;
2549
+ const pct = Math.max(1.5, v / max * 100);
2550
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-hbar-row", title: it.key + "\uFF1A" + metricFmt(v, rate), children: [
2551
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "dtok-hbar-k", children: it.key }),
2552
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "dtok-hbar-track", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "dtok-hbar-fill", style: { width: pct + "%", background: chartColor(i) } }) }),
2553
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "dtok-hbar-v", children: metricFmt(v, rate) })
2554
+ ] }, it.key);
2555
+ }) });
2556
+ }
2557
+ function HourChart({ hours, metric, metricFmt, rate, emptyText }) {
2558
+ const total = hours.reduce((s, h) => s + (Number(h[metric]) || 0), 0);
2559
+ if (total <= 0) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-chart-empty", children: emptyText || "\u6682\u65E0\u6570\u636E" });
2560
+ const max = Math.max(...hours.map((h) => Number(h[metric]) || 0), 1e-9);
2561
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-hours", role: "img", children: hours.map((h) => {
2562
+ const v = Number(h[metric]) || 0;
2563
+ const pct = v > 0 ? Math.max(2, v / max * 100) : 0;
2564
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "dtok-hour-col", title: h.hour + " \u65F6\uFF1A" + metricFmt(v, rate), children: pct > 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "dtok-hour-bar", style: { height: pct + "%" } }) : null }, h.hour);
2565
+ }) });
2566
+ }
2567
+ function ChartsPanel({ records, rate }) {
2568
+ const [metric, setMetric] = (0, import_react2.useState)("totalTokens");
2569
+ const [dim, setDimLocal] = (0, import_react2.useState)("model");
2570
+ const metricDef = CHART_METRICS.find((m) => m[0] === metric) || CHART_METRICS[0];
2571
+ const metricFmt = metricDef[2];
2572
+ const todayRecs = (0, import_react2.useMemo)(() => {
2573
+ const t0 = startOfToday();
2574
+ return records.filter((r) => Number(r.time) >= t0);
2575
+ }, [records]);
2576
+ const todayByModel = (0, import_react2.useMemo)(() => groupByKey(todayRecs, (r) => r.model || "(\u672A\u77E5)", metric), [todayRecs, metric]);
2577
+ const byDim = (0, import_react2.useMemo)(() => groupByKey(records, (r) => r[dim] || "(\u7A7A)", metric), [records, dim, metric]);
2578
+ const modelTime = (0, import_react2.useMemo)(() => groupByKey(records, (r) => r.model || "(\u672A\u77E5)", "llmMs"), [records]);
2579
+ const timedCalls = (0, import_react2.useMemo)(() => records.reduce((s, r) => s + (typeof r.llmMs === "number" ? 1 : 0), 0), [records]);
2580
+ const hours = (0, import_react2.useMemo)(() => {
2581
+ const arr = [];
2582
+ for (let h = 0; h < 24; h++) {
2583
+ const a = emptyAgg();
2584
+ a.hour = h;
2585
+ arr.push(a);
2586
+ }
2587
+ for (const r of records) addToAgg(arr[hourOf(r.time)], r);
2588
+ return arr;
2589
+ }, [records]);
2590
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-charts", children: [
2591
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-chart-toolbar", children: [
2592
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "dtok-chart-toolbar-label", children: "\u6307\u6807" }),
2593
+ CHART_METRICS.map(([id, label]) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { className: "dtok-btn tiny" + (metric === id ? " primary" : ""), onClick: () => setMetric(id), children: label }, id)),
2594
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "dtok-chart-toolbar-note", children: "\u56FE\u8868\u8DDF\u968F\u4E0A\u65B9\u7B5B\u9009\u6761\u4EF6\uFF08\u65F6\u95F4 / \u4F1A\u8BDD / \u63D0\u4F9B\u5546 / \u6A21\u578B / \u72B6\u6001 / \u5F3A\u5EA6\uFF09\u5B9E\u65F6\u8054\u52A8" })
2595
+ ] }),
2596
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-chart-grid", children: [
2597
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-chart-card", children: [
2598
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-chart-title", children: [
2599
+ "\u4ECA\u65E5\u6A21\u578B\u7528\u91CF\u5360\u6BD4",
2600
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "dtok-chart-sub", children: [
2601
+ metricDef[1],
2602
+ " \xB7 ",
2603
+ todayRecs.length,
2604
+ " \u6B21\u8C03\u7528"
2605
+ ] })
2606
+ ] }),
2607
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DonutChart, { items: todayByModel, metric, metricFmt, rate, centerLabel: "\u4ECA\u65E5" + metricDef[1], emptyText: "\u4ECA\u65E5\u6682\u65E0\u8C03\u7528" })
2608
+ ] }),
2609
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-chart-card", children: [
2610
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-chart-title", children: [
2611
+ "24 \u5C0F\u65F6\u8C03\u7528\u5206\u5E03",
2612
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "dtok-chart-sub", children: [
2613
+ "\u6309\u5C0F\u65F6\u805A\u5408 \xB7 ",
2614
+ metricDef[1]
2615
+ ] })
2616
+ ] }),
2617
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(HourChart, { hours, metric, metricFmt, rate })
2618
+ ] }),
2619
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-chart-card", children: [
2620
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-chart-title", children: [
2621
+ "\u6A21\u578B\u8017\u65F6\u6392\u884C",
2622
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "dtok-chart-sub", children: [
2623
+ "\u7D2F\u8BA1 LLM \u8017\u65F6 \xB7 \u5DF2\u8BA1\u65F6 ",
2624
+ timedCalls,
2625
+ " \u6B21"
2626
+ ] })
2627
+ ] }),
2628
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(HBarChart, { items: modelTime, metric: "llmMs", metricFmt: (v) => fmtDurCompact(v), rate, emptyText: "\u6682\u65E0\u8BA1\u65F6\u6570\u636E" })
2629
+ ] }),
2630
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-chart-card", children: [
2631
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-chart-title", children: [
2632
+ "\u5206\u5E03\u7EDF\u8BA1",
2633
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "dtok-chart-sub", children: CHART_DIMS.map(([id, label]) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { className: "dtok-btn tiny" + (dim === id ? " primary" : ""), style: { marginLeft: 4 }, onClick: () => setDimLocal(id), children: label }, id)) })
2634
+ ] }),
2635
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(HBarChart, { items: byDim, metric, metricFmt, rate })
2636
+ ] })
2637
+ ] })
2638
+ ] });
2639
+ }
2431
2640
  var css = `
2432
2641
  .dtok-root{display:flex;flex-direction:column;gap:8px;width:100%;min-width:0;}
2433
2642
  .dtok-status{display:flex;align-items:center;gap:10px;font-size:12px;color:var(--dsw-alias-label-secondary);flex-wrap:wrap;}
@@ -2463,7 +2672,7 @@ var css = `
2463
2672
  .dtok-code.pend{color:var(--dsw-alias-label-tertiary,#94a3b8);}
2464
2673
  .dtok-detail-link{color:var(--dk-accent);cursor:pointer;font-size:11px;}
2465
2674
  .dtok-detail-link:hover{text-decoration:underline;}
2466
- .dtok-detail{position:fixed;inset:0;z-index:10000;background:rgba(0,0,0,0.5);display:flex;align-items:center;justify-content:center;}
2675
+ .dtok-detail{position:fixed;inset:0;z-index:201;background:rgba(0,0,0,0.5);display:flex;align-items:center;justify-content:center;}
2467
2676
  .dtok-detail-card{background:var(--dsw-alias-bg-layer-2,#1c212b);border:1px solid var(--dsw-alias-border-l2,#3a4150);border-radius:12px;padding:20px 24px;max-width:640px;width:92%;max-height:80vh;overflow:auto;color:var(--dsw-alias-label-primary,#e8eaf0);}
2468
2677
  .dtok-detail-card h3{margin:0 0 12px;font-size:15px;}
2469
2678
  .dtok-detail-row{display:flex;gap:8px;padding:4px 0;font-size:12px;border-bottom:1px solid var(--dk-tdim);}
@@ -2527,7 +2736,7 @@ var css = `
2527
2736
  .dtok-btn.primary:not([disabled]):active{transform:none;}
2528
2737
  }
2529
2738
  /* ---- \u5355\u4EF7\u8BBE\u7F6E\uFF08\u5B50\u5F39\u7A97\uFF09 ---- */
2530
- .dtok-pm-backdrop{position:fixed;inset:0;z-index:2100;background:rgba(15,17,21,.5);backdrop-filter:blur(3px);display:flex;align-items:center;justify-content:center;}
2739
+ .dtok-pm-backdrop{position:fixed;inset:0;z-index:201;background:rgba(15,17,21,.5);backdrop-filter:blur(3px);display:flex;align-items:center;justify-content:center;}
2531
2740
  .dtok-pm{box-sizing:border-box;width:min(980px,calc(100vw - 32px));height:min(760px,calc(100vh - 32px));display:flex;flex-direction:column;border-radius:14px;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2,#1c212b);color:var(--dsw-alias-label-primary);box-shadow:0 20px 64px rgb(0 0 0 / .4);overflow:hidden;}
2532
2741
  .dtok-pm.max{border-radius:10px;}
2533
2742
  .dtok-pm-head{display:flex;align-items:center;gap:10px;padding:10px 12px;border-bottom:1px solid var(--dsw-alias-border-l1);cursor:move;user-select:none;flex:none;background:var(--dsw-alias-bg-layer-1);}
@@ -2558,6 +2767,35 @@ var css = `
2558
2767
  .dtok-src{font-size:11px;color:var(--dsw-alias-label-tertiary,#94a3b8);}
2559
2768
  .dtok-src.custom{color:var(--dsw-alias-state-success-primary,#4ade80);}
2560
2769
  .dtok-src.fallback{color:var(--dk-warn);}
2770
+ /* ---- \u56FE\u8868\u7EDF\u8BA1\uFF08\u7EAF CSS/SVG\uFF09 ---- */
2771
+ .dtok-charts{display:flex;flex-direction:column;gap:10px;min-width:0;}
2772
+ .dtok-chart-toolbar{display:flex;align-items:center;gap:6px;flex-wrap:wrap;padding:6px 10px;border:1px solid var(--dsw-alias-border-l1);border-radius:10px;background:var(--dsw-alias-bg-layer-1);}
2773
+ .dtok-chart-toolbar-label{font-size:12px;color:var(--dsw-alias-label-secondary);flex:none;}
2774
+ .dtok-chart-toolbar-note{font-size:11px;color:var(--dsw-alias-label-tertiary,#94a3b8);margin-left:auto;}
2775
+ .dtok-chart-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:10px;}
2776
+ .dtok-chart-card{border:1px solid var(--dsw-alias-border-l1);border-radius:10px;background:var(--dsw-alias-bg-layer-1);padding:10px 12px;min-width:0;display:flex;flex-direction:column;gap:8px;}
2777
+ .dtok-chart-title{font-size:13px;font-weight:600;color:var(--dsw-alias-label-primary);display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
2778
+ .dtok-chart-sub{font-size:11px;font-weight:400;color:var(--dsw-alias-label-secondary);}
2779
+ .dtok-chart-empty{text-align:center;color:var(--dsw-alias-label-secondary);padding:28px 0;font-size:12px;}
2780
+ .dtok-donut-wrap{display:flex;align-items:center;gap:14px;flex-wrap:wrap;}
2781
+ .dtok-donut{width:150px;height:150px;flex:none;}
2782
+ .dtok-donut-v{font-size:6.5px;font-weight:700;fill:var(--dsw-alias-label-primary);}
2783
+ .dtok-donut-l{font-size:3.6px;fill:var(--dsw-alias-label-secondary);}
2784
+ .dtok-legend{flex:1;min-width:150px;display:flex;flex-direction:column;gap:3px;max-height:170px;overflow:auto;}
2785
+ .dtok-legend-row{display:flex;align-items:center;gap:6px;font-size:11px;min-width:0;}
2786
+ .dtok-dot{width:8px;height:8px;border-radius:50%;flex:none;}
2787
+ .dtok-legend-k{color:var(--dsw-alias-label-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;}
2788
+ .dtok-legend-v{color:var(--dsw-alias-label-secondary);margin-left:auto;flex:none;}
2789
+ .dtok-hbars{display:flex;flex-direction:column;gap:4px;max-height:220px;overflow:auto;}
2790
+ .dtok-hbar-row{display:flex;align-items:center;gap:8px;font-size:11px;min-width:0;}
2791
+ .dtok-hbar-k{flex:0 1 34%;color:var(--dsw-alias-label-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
2792
+ .dtok-hbar-track{flex:1;height:12px;border-radius:4px;background:rgb(127 127 127 / .16);overflow:hidden;min-width:40px;}
2793
+ .dtok-hbar-fill{display:block;height:100%;border-radius:4px;transition:width .3s ease;}
2794
+ .dtok-hbar-v{flex:none;color:var(--dsw-alias-label-secondary);min-width:52px;text-align:right;}
2795
+ .dtok-hours{display:flex;align-items:flex-end;gap:3px;height:130px;padding-top:4px;}
2796
+ .dtok-hour-col{flex:1;display:flex;align-items:flex-end;height:100%;min-width:0;}
2797
+ .dtok-hour-bar{display:block;width:100%;border-radius:3px 3px 0 0;background:linear-gradient(180deg,var(--dk-accent),rgb(127 127 127 / .25));min-height:2px;transition:height .3s ease;}
2798
+ .dtok-hour-col:hover .dtok-hour-bar{filter:brightness(1.3);}
2561
2799
  `;
2562
2800
  function Detail({ rec, onClose, rate }) {
2563
2801
  const st = statusInfo(rec);
@@ -2668,20 +2906,35 @@ function PriceModal({ onClose, onSaved }) {
2668
2906
  window.addEventListener("keydown", onKey);
2669
2907
  return () => window.removeEventListener("keydown", onKey);
2670
2908
  }, [onClose]);
2909
+ const backdropDownRef = (0, import_react2.useRef)(false);
2671
2910
  const style = maxed ? { position: "fixed", left: 8, top: 8, right: 8, bottom: 8, width: "auto", height: "auto" } : geom ? { position: "fixed", left: geom.x, top: geom.y, width: geom.w, height: geom.h } : null;
2672
2911
  const portalTarget = typeof document !== "undefined" && document.body ? document.body : null;
2673
- const overlay = /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-pm-backdrop", onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { ref: dlgRef, className: "dtok-pm" + (maxed ? " max" : ""), style, onClick: (e) => e.stopPropagation(), children: [
2674
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-pm-head", onPointerDown: (e) => startDrag(e, "move"), onDoubleClick: () => setMaxed((v) => !v), children: [
2675
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("b", { children: "\u5355\u4EF7\u8BBE\u7F6E" }),
2676
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "dtok-pm-sub", children: "\u4EBA\u6C11\u5E01\u5143 / \u767E\u4E07 tokens \xB7 \u81EA\u5B9A\u4E49\u5355\u4EF7\u4F18\u5148\u4E8E\u5B98\u7F51\u4EF7\u4E0E\u5185\u7F6E\u4EF7" }),
2677
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "dtok-pm-ctrls", children: [
2678
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "dtok-btn tiny", title: maxed ? "\u8FD8\u539F" : "\u6700\u5927\u5316", onClick: () => setMaxed((v) => !v), children: maxed ? "\u2750" : "\u25A2" }),
2679
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "dtok-btn tiny", title: "\u5173\u95ED", onClick: onClose, children: "\u2715" })
2912
+ const overlay = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
2913
+ "div",
2914
+ {
2915
+ className: "dtok-pm-backdrop",
2916
+ onPointerDown: (e) => {
2917
+ backdropDownRef.current = e.target === e.currentTarget;
2918
+ },
2919
+ onClick: (e) => {
2920
+ if (!backdropDownRef.current) return;
2921
+ if (e.target !== e.currentTarget) return;
2922
+ onClose();
2923
+ },
2924
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { ref: dlgRef, className: "dtok-pm" + (maxed ? " max" : ""), style, onClick: (e) => e.stopPropagation(), children: [
2925
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-pm-head", onPointerDown: (e) => startDrag(e, "move"), onDoubleClick: () => setMaxed((v) => !v), children: [
2926
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("b", { children: "\u5355\u4EF7\u8BBE\u7F6E" }),
2927
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "dtok-pm-sub", children: "\u4EBA\u6C11\u5E01\u5143 / \u767E\u4E07 tokens \xB7 \u81EA\u5B9A\u4E49\u5355\u4EF7\u4F18\u5148\u4E8E\u5B98\u7F51\u4EF7\u4E0E\u5185\u7F6E\u4EF7" }),
2928
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "dtok-pm-ctrls", children: [
2929
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "dtok-btn tiny", title: maxed ? "\u8FD8\u539F" : "\u6700\u5927\u5316", onClick: () => setMaxed((v) => !v), children: maxed ? "\u2750" : "\u25A2" }),
2930
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "dtok-btn tiny", title: "\u5173\u95ED", onClick: onClose, children: "\u2715" })
2931
+ ] })
2932
+ ] }),
2933
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-pm-body", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PricingEditor, { onClose, onSaved, embedded: true }) }),
2934
+ maxed ? null : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-pm-resize", title: "\u62D6\u52A8\u7F29\u653E", onPointerDown: (e) => startDrag(e, "resize") })
2680
2935
  ] })
2681
- ] }),
2682
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-pm-body", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PricingEditor, { onClose, onSaved, embedded: true }) }),
2683
- maxed ? null : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-pm-resize", title: "\u62D6\u52A8\u7F29\u653E", onPointerDown: (e) => startDrag(e, "resize") })
2684
- ] }) });
2936
+ }
2937
+ );
2685
2938
  return portalTarget && typeof import_react2.default.createPortal === "function" ? import_react2.default.createPortal(overlay, portalTarget) : overlay;
2686
2939
  }
2687
2940
  function PricingEditor({ onClose, onSaved, embedded }) {
@@ -2975,6 +3228,7 @@ function TokenLogView(props) {
2975
3228
  const [page, setPage] = (0, import_react2.useState)(0);
2976
3229
  const [detailRec, setDetailRec] = (0, import_react2.useState)(null);
2977
3230
  const [showPricing, setShowPricing] = (0, import_react2.useState)(() => !!(props && props.params && props.params.openPricing));
3231
+ const [tab, setTab] = (0, import_react2.useState)(() => props && props.params && props.params.charts ? "charts" : "detail");
2978
3232
  const [fetchedAt, setFetchedAt] = (0, import_react2.useState)(0);
2979
3233
  const [justUpdated, setJustUpdated] = (0, import_react2.useState)(false);
2980
3234
  const wasLoadingRef = (0, import_react2.useRef)(false);
@@ -3182,83 +3436,95 @@ function TokenLogView(props) {
3182
3436
  "\u9519\u8BEF: ",
3183
3437
  err
3184
3438
  ] }, "err"));
3185
- if (cards.length) bodyNodes.push(
3186
- // key 带 fetchedAt:每次「手动查询 / 首次加载」拿到新数据时重建一次,KPI 卡重播回弹动画
3187
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-cards" + (fetchedAt ? " dtok-pop" : ""), children: cards.map((c, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-card", style: { "--i": String(i) }, children: [
3188
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "v", children: c.v }),
3189
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "l", children: c.l })
3190
- ] }, c.l)) }, "cards-" + fetchedAt)
3191
- );
3192
- if (summaryRows.length) bodyNodes.push(
3193
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-section-title", children: [
3194
- "\u7EDF\u8BA1\u5206\u7EC4: ",
3195
- dim || "\u65E0",
3196
- " (",
3197
- summaryRows.length,
3198
- " \u7EC4)"
3199
- ] }, "sum"),
3200
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-table-wrap", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("table", { className: "dtok-table", children: [
3201
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("thead", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("tr", { children: [
3202
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: "\u7EF4\u5EA6" }),
3203
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: "\u8C03\u7528" }),
3204
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: "\u8F93\u5165(\u547D\u4E2D)" }),
3205
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: "\u8F93\u5165(\u672A\u547D\u4E2D)" }),
3206
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: "\u547D\u4E2D\u7387" }),
3207
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: "\u8F93\u51FA" }),
3208
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: "\u603BToken" }),
3209
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: "\u91D1\u989D\uFF08\u4EBA\u6C11\u5E01\uFF09" }),
3210
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: "\u8017\u65F6" })
3211
- ] }) }),
3212
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("tbody", { children: summaryRows })
3213
- ] }) }, "sumtab")
3214
- );
3215
- bodyNodes.push(/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-section-title", children: "\u6309\u7EF4\u5EA6\u7EDF\u8BA1" }, "dimtitle"));
3216
3439
  bodyNodes.push(
3217
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-filter", style: { padding: "4px 0 0", border: "none", background: "transparent" }, children: ["", "provider", "model", "status", "effort"].map((d) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { className: "dtok-btn" + (dim === d ? " primary" : ""), onClick: () => {
3218
- setDim(d);
3219
- runQuery(d);
3220
- }, children: d === "" ? "\u65E0\u5206\u7EC4" : d }, d)) }, "dimrow")
3440
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-filter", style: { padding: "2px 0 0", border: "none", background: "transparent", gap: 4 }, children: [
3441
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { className: "dtok-btn" + (tab === "detail" ? " primary" : ""), onClick: () => setTab("detail"), children: "\u660E\u7EC6" }),
3442
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { className: "dtok-btn" + (tab === "charts" ? " primary" : ""), onClick: () => setTab("charts"), children: "\u56FE\u8868\u7EDF\u8BA1" })
3443
+ ] }, "tabs")
3221
3444
  );
3222
- bodyNodes.push(/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-section-title", children: "\u8C03\u7528\u660E\u7EC6" }, "dettitle"));
3223
- if (sorted.length === 0) {
3224
- bodyNodes.push(/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-empty", children: loading ? "\u52A0\u8F7D\u4E2D\u2026" : "\u65E0\u5339\u914D\u8BB0\u5F55" }, "empty"));
3225
- } else {
3226
- const pager = (key, cls) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-pager " + cls, children: [
3227
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { className: "dtok-btn", disabled: pageSafe <= 0, onClick: () => setPage(pageSafe - 1), children: "\u4E0A\u4E00\u9875" }),
3228
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
3229
- "\u7B2C ",
3230
- pageSafe + 1,
3231
- " / ",
3232
- pageCount,
3233
- " \u9875 \xB7 \u5171 ",
3234
- sorted.length,
3235
- " \u6761"
3236
- ] }),
3237
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { className: "dtok-btn", disabled: pageSafe >= pageCount - 1, onClick: () => setPage(pageSafe + 1), children: "\u4E0B\u4E00\u9875" })
3238
- ] }, key);
3239
- bodyNodes.push(pager("pager-top", "top"));
3445
+ if (tab === "charts") {
3240
3446
  bodyNodes.push(
3447
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ChartsPanel, { records, rate: rateCny }, "charts-" + fetchedAt)
3448
+ );
3449
+ } else {
3450
+ if (cards.length) bodyNodes.push(
3451
+ // key 带 fetchedAt:每次「手动查询 / 首次加载」拿到新数据时重建一次,KPI 卡重播回弹动画
3452
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-cards" + (fetchedAt ? " dtok-pop" : ""), children: cards.map((c, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-card", style: { "--i": String(i) }, children: [
3453
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "v", children: c.v }),
3454
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "l", children: c.l })
3455
+ ] }, c.l)) }, "cards-" + fetchedAt)
3456
+ );
3457
+ if (summaryRows.length) bodyNodes.push(
3458
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-section-title", children: [
3459
+ "\u7EDF\u8BA1\u5206\u7EC4: ",
3460
+ dim || "\u65E0",
3461
+ " (",
3462
+ summaryRows.length,
3463
+ " \u7EC4)"
3464
+ ] }, "sum"),
3241
3465
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-table-wrap", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("table", { className: "dtok-table", children: [
3242
3466
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("thead", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("tr", { children: [
3243
- sortTh("\u65F6\u95F4", "time"),
3244
- sortTh("\u4F1A\u8BDDID", "sessionId"),
3245
- sortTh("\u63D0\u4F9B\u5546", "provider"),
3246
- sortTh("\u6A21\u578B", "model"),
3247
- sortTh("\u8F93\u5165(\u547D\u4E2D)", "cacheReadTokens"),
3248
- sortTh("\u8F93\u5165(\u672A\u547D\u4E2D)", "inputTokens"),
3249
- sortTh("\u547D\u4E2D%", "cacheHitPercent"),
3250
- sortTh("\u8F93\u51FA", "outputTokens"),
3251
- sortTh("\u63A8\u7406", "reasoningTokens"),
3252
- sortTh("\u603B\u989D", "totalTokens"),
3253
- sortTh("\u91D1\u989D\uFF08\u4EBA\u6C11\u5E01\uFF09", "cost"),
3254
- sortTh("\u5F3A\u5EA6", "effort"),
3255
- sortTh("\u72B6\u6001", "status"),
3256
- sortTh("\u8017\u65F6", "llmMs")
3467
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: "\u7EF4\u5EA6" }),
3468
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: "\u8C03\u7528" }),
3469
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: "\u8F93\u5165(\u547D\u4E2D)" }),
3470
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: "\u8F93\u5165(\u672A\u547D\u4E2D)" }),
3471
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: "\u547D\u4E2D\u7387" }),
3472
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: "\u8F93\u51FA" }),
3473
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: "\u603BToken" }),
3474
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: "\u91D1\u989D\uFF08\u4EBA\u6C11\u5E01\uFF09" }),
3475
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: "\u8017\u65F6" })
3257
3476
  ] }) }),
3258
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("tbody", { children: detailRows })
3259
- ] }) }, "detail")
3477
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("tbody", { children: summaryRows })
3478
+ ] }) }, "sumtab")
3479
+ );
3480
+ bodyNodes.push(/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-section-title", children: "\u6309\u7EF4\u5EA6\u7EDF\u8BA1" }, "dimtitle"));
3481
+ bodyNodes.push(
3482
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-filter", style: { padding: "4px 0 0", border: "none", background: "transparent" }, children: ["", "provider", "model", "status", "effort"].map((d) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { className: "dtok-btn" + (dim === d ? " primary" : ""), onClick: () => {
3483
+ setDim(d);
3484
+ runQuery(d);
3485
+ }, children: d === "" ? "\u65E0\u5206\u7EC4" : d }, d)) }, "dimrow")
3260
3486
  );
3261
- bodyNodes.push(pager("pager-bottom", "bottom"));
3487
+ bodyNodes.push(/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-section-title", children: "\u8C03\u7528\u660E\u7EC6" }, "dettitle"));
3488
+ if (sorted.length === 0) {
3489
+ bodyNodes.push(/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-empty", children: loading ? "\u52A0\u8F7D\u4E2D\u2026" : "\u65E0\u5339\u914D\u8BB0\u5F55" }, "empty"));
3490
+ } else {
3491
+ const pager = (key, cls) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-pager " + cls, children: [
3492
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { className: "dtok-btn", disabled: pageSafe <= 0, onClick: () => setPage(pageSafe - 1), children: "\u4E0A\u4E00\u9875" }),
3493
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
3494
+ "\u7B2C ",
3495
+ pageSafe + 1,
3496
+ " / ",
3497
+ pageCount,
3498
+ " \u9875 \xB7 \u5171 ",
3499
+ sorted.length,
3500
+ " \u6761"
3501
+ ] }),
3502
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { className: "dtok-btn", disabled: pageSafe >= pageCount - 1, onClick: () => setPage(pageSafe + 1), children: "\u4E0B\u4E00\u9875" })
3503
+ ] }, key);
3504
+ bodyNodes.push(pager("pager-top", "top"));
3505
+ bodyNodes.push(
3506
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dtok-table-wrap", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("table", { className: "dtok-table", children: [
3507
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("thead", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("tr", { children: [
3508
+ sortTh("\u65F6\u95F4", "time"),
3509
+ sortTh("\u4F1A\u8BDDID", "sessionId"),
3510
+ sortTh("\u63D0\u4F9B\u5546", "provider"),
3511
+ sortTh("\u6A21\u578B", "model"),
3512
+ sortTh("\u8F93\u5165(\u547D\u4E2D)", "cacheReadTokens"),
3513
+ sortTh("\u8F93\u5165(\u672A\u547D\u4E2D)", "inputTokens"),
3514
+ sortTh("\u547D\u4E2D%", "cacheHitPercent"),
3515
+ sortTh("\u8F93\u51FA", "outputTokens"),
3516
+ sortTh("\u63A8\u7406", "reasoningTokens"),
3517
+ sortTh("\u603B\u989D", "totalTokens"),
3518
+ sortTh("\u91D1\u989D\uFF08\u4EBA\u6C11\u5E01\uFF09", "cost"),
3519
+ sortTh("\u5F3A\u5EA6", "effort"),
3520
+ sortTh("\u72B6\u6001", "status"),
3521
+ sortTh("\u8017\u65F6", "llmMs")
3522
+ ] }) }),
3523
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("tbody", { children: detailRows })
3524
+ ] }) }, "detail")
3525
+ );
3526
+ bodyNodes.push(pager("pager-bottom", "bottom"));
3527
+ }
3262
3528
  }
3263
3529
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-root", onClick: (e) => e.stopPropagation(), children: [
3264
3530
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dtok-status", children: [
@@ -5721,18 +5987,18 @@ function AnimationStat(props) {
5721
5987
  }
5722
5988
  var css2 = [
5723
5989
  // 顶部流光细线(3px,比首版更醒目)
5724
- ".dkan-line{position:fixed;top:0;left:0;right:0;height:3px;z-index:9990;pointer-events:none;background:color-mix(in srgb,var(--dk-accent) 30%,transparent);}",
5990
+ ".dkan-line{position:fixed;top:0;left:0;right:0;height:3px;z-index:2;pointer-events:none;background:color-mix(in srgb,var(--dk-accent) 30%,transparent);}",
5725
5991
  '.dkan-line::after{content:"";position:absolute;top:0;bottom:0;left:-42%;width:42%;background:linear-gradient(90deg,transparent,var(--dk-accent) 60%,#fff);box-shadow:0 0 10px 1px color-mix(in srgb,var(--dk-accent) 70%,transparent);animation:dkan-flow calc(1.9s / var(--dkan-speed,1)) linear infinite;}',
5726
5992
  "@keyframes dkan-flow{to{left:100%}}",
5727
5993
  // 完成瞬间的一次性流光(成功绿 / 异常红),动画结束自动清场
5728
- ".dkan-done{position:fixed;top:0;left:0;right:0;height:3px;z-index:9991;pointer-events:none;background:linear-gradient(90deg,transparent,var(--dsw-alias-state-success-primary,#34d399) 50%,#fff);background-size:50% 100%;background-repeat:no-repeat;animation:dkan-done 1.1s var(--ds-ease-in-out) forwards;}",
5994
+ ".dkan-done{position:fixed;top:0;left:0;right:0;height:3px;z-index:3;pointer-events:none;background:linear-gradient(90deg,transparent,var(--dsw-alias-state-success-primary,#34d399) 50%,#fff);background-size:50% 100%;background-repeat:no-repeat;animation:dkan-done 1.1s var(--ds-ease-in-out) forwards;}",
5729
5995
  ".dkan-done.err{background-image:linear-gradient(90deg,transparent,var(--dsw-alias-state-error-primary,#f87171) 50%,#fff);}",
5730
5996
  "@keyframes dkan-done{0%{background-position:-60% 0;opacity:0}25%{opacity:1}100%{background-position:160% 0;opacity:0}}",
5731
5997
  // 环屏巡航:光点沿屏幕边缘转一整圈
5732
- ".dkan-orbit{position:fixed;top:0;left:0;width:12px;height:12px;z-index:9990;pointer-events:none;border-radius:50%;background:var(--dk-accent);box-shadow:0 0 14px 4px color-mix(in srgb,var(--dk-accent) 60%,transparent),0 0 30px 8px color-mix(in srgb,var(--dk-accent) 25%,transparent);animation:dkan-orbit calc(14s / var(--dkan-speed,1)) linear infinite;}",
5998
+ ".dkan-orbit{position:fixed;top:0;left:0;width:12px;height:12px;z-index:2;pointer-events:none;border-radius:50%;background:var(--dk-accent);box-shadow:0 0 14px 4px color-mix(in srgb,var(--dk-accent) 60%,transparent),0 0 30px 8px color-mix(in srgb,var(--dk-accent) 25%,transparent);animation:dkan-orbit calc(14s / var(--dkan-speed,1)) linear infinite;}",
5733
5999
  "@keyframes dkan-orbit{0%{top:0;left:0}25%{top:0;left:calc(100vw - 12px)}50%{top:calc(100vh - 12px);left:calc(100vw - 12px)}75%{top:calc(100vh - 12px);left:0}100%{top:0;left:0}}",
5734
6000
  // ===== 氛围动效 =====
5735
- ".dkan-amb{position:fixed;inset:0;z-index:9989;pointer-events:none;overflow:hidden;}",
6001
+ ".dkan-amb{position:fixed;inset:0;z-index:1;pointer-events:none;overflow:hidden;}",
5736
6002
  // pointer-events 不继承:全屏装饰层的子粒子(星点/流星/极光/火花/彩带)必须各自透明于点击
5737
6003
  ".dkan-amb *,.dkan-fxwrap *{pointer-events:none;}",
5738
6004
  // 代码雨:字符列缓落(提亮加大,速度随吞吐)
@@ -5762,15 +6028,15 @@ var css2 = [
5762
6028
  ".dkan-space-runner{position:fixed;left:0;top:0;width:108px;height:56px;opacity:0;animation-duration:calc(10.8s / var(--dkan-speed,1));animation-timing-function:linear;animation-iteration-count:infinite;animation-delay:var(--dkan-run-delay,0s);will-change:transform,opacity;contain:layout paint style;backface-visibility:hidden;}.dkan-space-runner .dkan-freighter{left:0;top:0;transform:translateZ(0) scale(.52);transform-origin:top left;filter:none}.dkan-space-runner .dkan-freighter-engine i{animation:none;opacity:.76;box-shadow:-6px 0 8px #22d3ee}.dkan-space-runner .dkan-freighter-nose{filter:none}.dkan-space-runner.route-0{animation-name:dkan-space-route-a}.dkan-space-runner.route-1{animation-name:dkan-space-route-b}.dkan-space-runner.route-2{animation-name:dkan-space-route-c}",
5763
6029
  "@keyframes dkan-space-route-a{0%{opacity:0;transform:translate3d(var(--dkan-alpha-x),var(--dkan-alpha-y),0) rotate(151deg)}7%,86%{opacity:.9}100%{opacity:0;transform:translate3d(var(--dkan-beta-x),var(--dkan-beta-y),0) rotate(151deg)}}@keyframes dkan-space-route-b{0%{opacity:0;transform:translate3d(var(--dkan-beta-x),var(--dkan-beta-y),0) rotate(-90deg)}7%,86%{opacity:.9}100%{opacity:0;transform:translate3d(var(--dkan-gamma-x),var(--dkan-gamma-y),0) rotate(-90deg)}}@keyframes dkan-space-route-c{0%{opacity:0;transform:translate3d(var(--dkan-gamma-x),var(--dkan-gamma-y),0) rotate(-18deg)}7%,86%{opacity:.9}100%{opacity:0;transform:translate3d(var(--dkan-alpha-x),var(--dkan-alpha-y),0) rotate(-18deg)}}",
5764
6030
  // 完成归航:一艘货运旗舰从航线飞到真实会话输入框上方,货舱逐格表达实际输出量。
5765
- ".dkan-delivery{position:fixed;left:0;top:0;width:210px;height:88px;z-index:9994;pointer-events:none;will-change:transform,opacity;contain:layout paint style;isolation:isolate;animation:dkan-delivery-flight var(--dkan-delivery-duration,8600ms) cubic-bezier(.22,.61,.36,1) forwards;}",
6031
+ ".dkan-delivery{position:fixed;left:0;top:0;width:210px;height:88px;z-index:6;pointer-events:none;will-change:transform,opacity;contain:layout paint style;isolation:isolate;animation:dkan-delivery-flight var(--dkan-delivery-duration,8600ms) cubic-bezier(.22,.61,.36,1) forwards;}",
5766
6032
  "@keyframes dkan-delivery-flight{0%{opacity:0;transform:translate3d(var(--dkan-from-x),var(--dkan-from-y),0) scale(.5) rotate(-12deg)}6%{opacity:1;transform:translate3d(var(--dkan-from-x),var(--dkan-from-y),0) scale(.56) rotate(-10deg)}100%{opacity:1;transform:translate3d(var(--dkan-to-x),var(--dkan-to-y),0) scale(1) rotate(0)}}",
5767
6033
  ".dkan-delivery-trail{position:absolute;left:-132px;top:26px;width:154px;height:4px;border-radius:999px;background:linear-gradient(90deg,transparent,#34d399 48%,#d9f99d 78%,transparent);opacity:.9;animation:dkan-delivery-trail var(--dkan-delivery-duration,8600ms) linear forwards;}@keyframes dkan-delivery-trail{0%,82%{opacity:.9}100%{opacity:0}}.dkan-freighter{position:absolute;left:10px;top:10px;width:176px;height:45px;display:block;filter:drop-shadow(0 0 9px color-mix(in srgb,#7dd3fc 62%,transparent));}.dkan-delivery .dkan-freighter,.dkan-departure .dkan-freighter{filter:none}.dkan-delivery .dkan-freighter-engine i,.dkan-departure .dkan-freighter-engine i{animation:none;opacity:.76;box-shadow:-6px 0 8px #22d3ee}.dkan-delivery .dkan-freighter-nose,.dkan-departure .dkan-freighter-nose{filter:none}.dkan-freighter-hull{position:absolute;z-index:3;left:21px;top:7px;width:126px;height:31px;background:linear-gradient(150deg,#f8fbff 0%,#9cc8ff 30%,#385d91 72%,#1d3150);clip-path:polygon(0 30%,43% 0,83% 17%,100% 50%,83% 83%,43% 100%,0 70%,12% 50%);box-shadow:inset 0 1px 0 rgb(255 255 255 / .7),inset -7px -5px 9px rgb(8 24 49 / .38);}.dkan-freighter-nose{position:absolute;z-index:4;right:10px;top:16px;width:28px;height:14px;background:linear-gradient(90deg,#a9d1ff,#e8f5ff);clip-path:polygon(0 0,100% 50%,0 100%,22% 50%);filter:drop-shadow(5px 0 5px color-mix(in srgb,#93c5fd 62%,transparent));}.dkan-freighter-canopy{position:absolute;z-index:5;left:77px;top:10px;width:39px;height:11px;border-radius:70% 48% 42% 32%;background:linear-gradient(135deg,#ecfeff 0%,#67e8f9 32%,#2563eb 75%);transform:skewX(-18deg);box-shadow:inset 0 2px 2px rgb(255 255 255 / .7),0 0 8px color-mix(in srgb,#67e8f9 42%,transparent);}.dkan-freighter-fin{position:absolute;z-index:2;left:48px;top:3px;width:24px;height:17px;background:linear-gradient(135deg,#31557f,#a7caf7);clip-path:polygon(0 100%,58% 0,100% 100%);}.dkan-freighter-wing{position:absolute;z-index:1;left:48px;width:60px;height:18px;background:linear-gradient(135deg,#24436d,#8ebaf4);}.dkan-freighter-wing.left{top:2px;clip-path:polygon(0 100%,100% 0,68% 100%)}.dkan-freighter-wing.right{top:26px;clip-path:polygon(0 0,68% 0,100% 100%)}",
5768
6034
  ".dkan-freighter-cargo{position:absolute;z-index:6;left:37px;top:31px;width:74px;height:7px;display:flex;align-items:center;gap:2px;padding:1px 3px;border-radius:4px;background:#172842;border:1px solid color-mix(in srgb,#b8d8ff 48%,transparent);box-shadow:inset 0 1px 0 rgb(255 255 255 / .2);}.dkan-freighter-cargo i{display:block;flex:1;min-width:4px;height:5px;border-radius:1px;background:linear-gradient(135deg,#fef3c7,#f59e0b 58%,#b45309);box-shadow:0 0 4px color-mix(in srgb,#fbbf24 58%,transparent);}.dkan-freighter-cargo.empty i{background:linear-gradient(135deg,#dbeafe,#38bdf8 58%,#1d4ed8);box-shadow:0 0 4px color-mix(in srgb,#38bdf8 55%,transparent);}.dkan-freighter-engine{position:absolute;z-index:0;left:5px;top:19px;display:flex;gap:3px;align-items:center;height:11px;}.dkan-freighter-engine i{width:18px;height:5px;border-radius:60% 0 0 60%;background:linear-gradient(90deg,transparent,#67e8f9);box-shadow:-9px 0 12px #22d3ee;animation:dkan-engine .34s ease-in-out infinite alternate;}.dkan-freighter-engine i:nth-child(2){animation-delay:-.14s}",
5769
6035
  "@keyframes dkan-engine{to{transform:scaleX(.55);opacity:.5}}",
5770
6036
  ".dkan-delivery-label{position:absolute;left:21px;top:58px;display:flex;align-items:baseline;gap:6px;padding:4px 8px;border:1px solid color-mix(in srgb,#93c5fd 30%,var(--dsw-alias-border-l1));border-radius:999px;background:color-mix(in srgb,var(--dsw-alias-bg-layer-2) 82%,transparent);backdrop-filter:blur(10px);color:var(--dsw-alias-label-secondary);font:10px/1.2 var(--ds-font-family,system-ui,sans-serif);white-space:nowrap;}.dkan-delivery-label b{color:var(--dsw-alias-label-primary);font-weight:650}.dkan-delivery-label span{color:var(--dk-accent);}",
5771
6037
  "@media (max-width:1100px){.dkan-space-system,.dkan-space-runner{display:none}}",
5772
- ".dkan-ready-freighter{position:fixed;width:210px;height:88px;z-index:9994;pointer-events:none;filter:drop-shadow(0 10px 14px rgb(0 0 0 / .18));}.dkan-ready-freighter>span:last-child{position:absolute;left:21px;top:58px;padding:4px 8px;border:1px solid color-mix(in srgb,#93c5fd 28%,var(--dsw-alias-border-l1));border-radius:999px;background:color-mix(in srgb,var(--dsw-alias-bg-layer-2) 80%,transparent);backdrop-filter:blur(10px);color:var(--dsw-alias-label-secondary);font:10px/1.2 var(--ds-font-family,system-ui,sans-serif);white-space:nowrap;}.dkan-departure{position:fixed;left:0;top:0;width:210px;height:88px;z-index:9994;pointer-events:none;will-change:transform,opacity;contain:layout paint style;isolation:isolate;animation:dkan-departure-flight var(--dkan-departure-duration,8600ms) cubic-bezier(.42,0,.85,.45) forwards;}@keyframes dkan-departure-flight{0%{opacity:0;transform:translate3d(var(--dkan-from-x),var(--dkan-from-y),0) scale(1) rotate(var(--dkan-flight-angle,0deg))}6%{opacity:1;transform:translate3d(var(--dkan-from-x),var(--dkan-from-y),0) scale(1) rotate(var(--dkan-flight-angle,0deg))}100%{opacity:0;transform:translate3d(var(--dkan-to-x),var(--dkan-to-y),0) scale(.24) rotate(var(--dkan-flight-angle,0deg))}}",
5773
- ".dkan-space-stuck{position:fixed;right:20px;top:88px;width:244px;height:160px;z-index:9993;pointer-events:none;border:1px solid color-mix(in srgb,#f59e0b 48%,var(--dsw-alias-border-l1));border-radius:20px;background:color-mix(in srgb,var(--dsw-alias-bg-layer-2) 88%,transparent);backdrop-filter:blur(16px);box-shadow:0 18px 54px rgb(0 0 0 / .28),0 0 30px color-mix(in srgb,#f59e0b 15%,transparent);}.dkan-space-stuck .dkan-freighter{left:37px;top:11px;transform:scale(.9);transform-origin:top left;}.dkan-stuck-code{position:absolute;left:17px;right:17px;top:60px;height:36px;border-radius:7px;background:linear-gradient(90deg,color-mix(in srgb,#f59e0b 18%,transparent),transparent);color:var(--dk-warn);font:700 14px/36px var(--ds-font-family-code,monospace);letter-spacing:.12em;text-align:center;overflow:hidden;}.dkan-stuck-code::after{content:'';position:absolute;inset:0;background:linear-gradient(90deg,transparent,color-mix(in srgb,#fef3c7 70%,transparent),transparent);transform:translateX(-110%);animation:dkan-stuck-scan 1.25s linear infinite;}.dkan-stuck-code i{display:inline-block;width:7px;height:7px;margin-right:8px;border-radius:50%;background:#f59e0b;box-shadow:0 0 9px #f59e0b;animation:dkan-stuck-pulse .8s ease-in-out infinite alternate;}.dkan-space-stuck strong{position:absolute;left:0;right:0;top:108px;color:var(--dsw-alias-label-primary);font:650 13px/1.2 var(--ds-font-family,system-ui,sans-serif);text-align:center;}.dkan-space-stuck small{position:absolute;left:18px;right:18px;top:128px;color:var(--dsw-alias-label-secondary);font:11px/1.25 var(--ds-font-family,system-ui,sans-serif);text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}@keyframes dkan-stuck-scan{to{transform:translateX(110%)}}@keyframes dkan-stuck-pulse{to{transform:scale(.55);opacity:.45}}",
6038
+ ".dkan-ready-freighter{position:fixed;width:210px;height:88px;z-index:6;pointer-events:none;filter:drop-shadow(0 10px 14px rgb(0 0 0 / .18));}.dkan-ready-freighter>span:last-child{position:absolute;left:21px;top:58px;padding:4px 8px;border:1px solid color-mix(in srgb,#93c5fd 28%,var(--dsw-alias-border-l1));border-radius:999px;background:color-mix(in srgb,var(--dsw-alias-bg-layer-2) 80%,transparent);backdrop-filter:blur(10px);color:var(--dsw-alias-label-secondary);font:10px/1.2 var(--ds-font-family,system-ui,sans-serif);white-space:nowrap;}.dkan-departure{position:fixed;left:0;top:0;width:210px;height:88px;z-index:6;pointer-events:none;will-change:transform,opacity;contain:layout paint style;isolation:isolate;animation:dkan-departure-flight var(--dkan-departure-duration,8600ms) cubic-bezier(.42,0,.85,.45) forwards;}@keyframes dkan-departure-flight{0%{opacity:0;transform:translate3d(var(--dkan-from-x),var(--dkan-from-y),0) scale(1) rotate(var(--dkan-flight-angle,0deg))}6%{opacity:1;transform:translate3d(var(--dkan-from-x),var(--dkan-from-y),0) scale(1) rotate(var(--dkan-flight-angle,0deg))}100%{opacity:0;transform:translate3d(var(--dkan-to-x),var(--dkan-to-y),0) scale(.24) rotate(var(--dkan-flight-angle,0deg))}}",
6039
+ ".dkan-space-stuck{position:fixed;right:20px;top:88px;width:244px;height:160px;z-index:5;pointer-events:none;border:1px solid color-mix(in srgb,#f59e0b 48%,var(--dsw-alias-border-l1));border-radius:20px;background:color-mix(in srgb,var(--dsw-alias-bg-layer-2) 88%,transparent);backdrop-filter:blur(16px);box-shadow:0 18px 54px rgb(0 0 0 / .28),0 0 30px color-mix(in srgb,#f59e0b 15%,transparent);}.dkan-space-stuck .dkan-freighter{left:37px;top:11px;transform:scale(.9);transform-origin:top left;}.dkan-stuck-code{position:absolute;left:17px;right:17px;top:60px;height:36px;border-radius:7px;background:linear-gradient(90deg,color-mix(in srgb,#f59e0b 18%,transparent),transparent);color:var(--dk-warn);font:700 14px/36px var(--ds-font-family-code,monospace);letter-spacing:.12em;text-align:center;overflow:hidden;}.dkan-stuck-code::after{content:'';position:absolute;inset:0;background:linear-gradient(90deg,transparent,color-mix(in srgb,#fef3c7 70%,transparent),transparent);transform:translateX(-110%);animation:dkan-stuck-scan 1.25s linear infinite;}.dkan-stuck-code i{display:inline-block;width:7px;height:7px;margin-right:8px;border-radius:50%;background:#f59e0b;box-shadow:0 0 9px #f59e0b;animation:dkan-stuck-pulse .8s ease-in-out infinite alternate;}.dkan-space-stuck strong{position:absolute;left:0;right:0;top:108px;color:var(--dsw-alias-label-primary);font:650 13px/1.2 var(--ds-font-family,system-ui,sans-serif);text-align:center;}.dkan-space-stuck small{position:absolute;left:18px;right:18px;top:128px;color:var(--dsw-alias-label-secondary);font:11px/1.25 var(--ds-font-family,system-ui,sans-serif);text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}@keyframes dkan-stuck-scan{to{transform:translateX(110%)}}@keyframes dkan-stuck-pulse{to{transform:scale(.55);opacity:.45}}",
5774
6040
  // 窄屏(手机/分屏)贴右会溢出:回落到水平居中、屏幕上方,避开正文重心
5775
6041
  "@media (max-width:760px){.dkan-space-stuck{right:50%;transform:translateX(50%);top:64px;}}",
5776
6042
  // 极光:顶部柔光带呼吸流动(加浓)
@@ -5810,7 +6076,7 @@ var css2 = [
5810
6076
  ".dkan-lantern{contain:strict}.dkan-lantern i{position:absolute;bottom:-30px;border-radius:45% 45% 34% 34%;background:linear-gradient(150deg,#fff7c2 0%,#fbbf24 46%,#f97316 100%);box-shadow:0 0 10px 3px color-mix(in srgb,#fbbf24 36%,transparent);opacity:0;animation-name:dkan-lantern-rise;animation-timing-function:cubic-bezier(.34,.02,.6,1);animation-iteration-count:infinite;will-change:transform,opacity}.dkan-lantern i::after{content:'';position:absolute;left:42%;top:100%;width:16%;height:13px;background:linear-gradient(#f59e0b,transparent)}",
5811
6077
  "@keyframes dkan-lantern-rise{0%{opacity:0;transform:translate3d(0,0,0) rotate(-3deg) scale(.72)}12%{opacity:.72}78%{opacity:.48}100%{opacity:0;transform:translate3d(var(--drift),-104vh,0) rotate(4deg) scale(1.04)}}",
5812
6078
  // ===== 交互反馈层 =====
5813
- ".dkan-fxwrap{position:fixed;inset:0;z-index:9992;pointer-events:none;overflow:hidden;}",
6079
+ ".dkan-fxwrap{position:fixed;inset:0;z-index:4;pointer-events:none;overflow:hidden;}",
5814
6080
  ".dkan-fx{position:absolute;}",
5815
6081
  // 纸飞机:从点击处向右上飞出淡出(加大加亮)
5816
6082
  ".dkan-fx-plane{color:var(--dk-accent);font-size:24px;text-shadow:0 0 8px color-mix(in srgb,var(--dk-accent) 70%,transparent);animation:dkan-plane 1.2s var(--ds-ease-in-out) forwards;}",
@@ -5832,7 +6098,7 @@ var css2 = [
5832
6098
  ".dkan-fx-confetti i{position:absolute;top:-14px;width:8px;height:13px;border-radius:2px;box-shadow:0 0 4px currentColor;animation:dkan-confetti 2s var(--ds-ease-in-out) forwards;}",
5833
6099
  "@keyframes dkan-confetti{0%{opacity:1;transform:translateY(0) rotate(0)}100%{opacity:0;transform:translateY(75vh) translateX(var(--dx)) rotate(var(--r))}}",
5834
6100
  // 右下角状态徽标(玻璃拟态,可点击);抬到 dsh 输入卡上方避免重叠错位
5835
- ".dkan-badge{position:fixed;right:20px;bottom:calc(var(--dsh-composer-height,152px) + 20px);z-index:9990;display:inline-flex;align-items:center;gap:8px;padding:7px 14px;border-radius:999px;cursor:pointer;border:1px solid var(--dsw-alias-border-l1);background:color-mix(in srgb,var(--dsw-alias-bg-layer-2) 78%,transparent);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);box-shadow:0 6px 24px rgb(0 0 0 / .16);color:var(--dsw-alias-label-secondary);font-family:inherit;font-size:12px;line-height:18px;pointer-events:auto;animation:dkan-rise .3s var(--ds-ease-in-out);transition:color .15s var(--ds-ease-in-out);}",
6101
+ ".dkan-badge{position:fixed;right:20px;bottom:calc(var(--dsh-composer-height,152px) + 20px);z-index:2;display:inline-flex;align-items:center;gap:8px;padding:7px 14px;border-radius:999px;cursor:pointer;border:1px solid var(--dsw-alias-border-l1);background:color-mix(in srgb,var(--dsw-alias-bg-layer-2) 78%,transparent);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);box-shadow:0 6px 24px rgb(0 0 0 / .16);color:var(--dsw-alias-label-secondary);font-family:inherit;font-size:12px;line-height:18px;pointer-events:auto;animation:dkan-rise .3s var(--ds-ease-in-out);transition:color .15s var(--ds-ease-in-out);}",
5836
6102
  ".dkan-badge:hover{color:var(--dsw-alias-label-primary);}",
5837
6103
  ".dkan-badge .n{color:var(--dsw-alias-label-primary);font-weight:600;}",
5838
6104
  "@keyframes dkan-rise{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}",
@@ -5922,7 +6188,7 @@ var css2 = [
5922
6188
  ".dkan-prev-bot .dkan-bot-scene{--dkan-bot-scale:1;transform:scale(.56);transform-origin:center;}",
5923
6189
  // ===== 桌面伙伴:具象人物 + 紧凑双工位(尺寸可调,整卡可拖拽) =====
5924
6190
  // 卡片:玻璃拟态;默认停泊右下(dsh 输入卡上方),拖动后位置持久化、可放屏幕任意处
5925
- ".dkan-botcard{--dkan-bot-scale:1.35;position:fixed;right:20px;bottom:calc(var(--dsh-composer-height,152px) + 20px);z-index:9990;display:flex;flex-direction:column;gap:6px;padding:10px 12px;border-radius:16px;cursor:grab;border:1px solid var(--dsw-alias-border-l1);background:color-mix(in srgb,var(--dsw-alias-bg-layer-2) 86%,transparent);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);box-shadow:0 12px 36px rgb(0 0 0 / .22);color:var(--dsw-alias-label-secondary);font-family:inherit;font-size:12px;pointer-events:auto;touch-action:none;user-select:none;animation:dkan-rise .3s var(--ds-ease-in-out);}",
6191
+ ".dkan-botcard{--dkan-bot-scale:1.35;position:fixed;right:20px;bottom:calc(var(--dsh-composer-height,152px) + 20px);z-index:2;display:flex;flex-direction:column;gap:6px;padding:10px 12px;border-radius:16px;cursor:grab;border:1px solid var(--dsw-alias-border-l1);background:color-mix(in srgb,var(--dsw-alias-bg-layer-2) 86%,transparent);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);box-shadow:0 12px 36px rgb(0 0 0 / .22);color:var(--dsw-alias-label-secondary);font-family:inherit;font-size:12px;pointer-events:auto;touch-action:none;user-select:none;animation:dkan-rise .3s var(--ds-ease-in-out);}",
5926
6192
  ".dkan-botcard:hover,.dkan-botcard:focus-visible{border-color:var(--dk-accent);outline:none;}",
5927
6193
  ".dkan-botcard.dkan-dragging{cursor:grabbing;animation:none;}",
5928
6194
  ".dkan-botcard .n{color:var(--dsw-alias-label-primary);font-weight:600;}",
@@ -6795,7 +7061,7 @@ function NotifyStat(props) {
6795
7061
  }
6796
7062
  var css3 = [
6797
7063
  // 通知卡片栈(右上角,不遮 dsh 自身 UI)
6798
- ".dknt-toasts{position:fixed;top:16px;right:16px;z-index:9995;display:flex;flex-direction:column;gap:8px;width:min(380px,calc(100vw - 32px));}",
7064
+ ".dknt-toasts{position:fixed;top:16px;right:16px;z-index:7;display:flex;flex-direction:column;gap:8px;width:min(380px,calc(100vw - 32px));}",
6799
7065
  ".dknt-toast{border-radius:12px;padding:12px 14px;pointer-events:auto;background:color-mix(in srgb,var(--dsw-alias-bg-layer-2) 88%,transparent);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--dsw-alias-border-l1);box-shadow:0 10px 36px rgb(0 0 0 / .22);animation:dknt-toast-in .32s var(--ds-ease-in-out);}",
6800
7066
  ".dknt-toast.out{animation:dknt-toast-out .24s var(--ds-ease-in-out) forwards;}",
6801
7067
  "@keyframes dknt-toast-in{from{opacity:0;transform:translateX(14px)}to{opacity:1;transform:none}}",
@@ -10567,8 +10833,8 @@ var baseCss = `
10567
10833
  .dgcov-grid{--dgame-accent:var(--dk-games-accent,#7c3aed);display:flex;gap:10px;flex-wrap:wrap}.dgcov{flex:1;min-width:230px;display:flex;flex-direction:column;gap:8px;padding:11px;border:1px solid var(--dsw-alias-border-l1);border-radius:13px;background:var(--dsw-alias-bg-layer-2);cursor:pointer;font-family:inherit;text-align:left;transition:border-color .16s ease,transform .16s ease}.dgcov:hover{border-color:var(--dgame-accent);transform:translateY(-2px)}.dgcov:focus-visible{outline:2px solid var(--dgame-accent);outline-offset:2px}.dgcov.on{border-color:var(--dgame-accent);box-shadow:0 0 0 1px color-mix(in srgb,var(--dgame-accent) 40%,transparent)}.dgcov-name{display:flex;align-items:center;gap:7px;font-size:13px;font-weight:600;color:var(--dsw-alias-label-primary)}.dgcov-name i{width:8px;height:8px;border-radius:50%;flex:none}.dgcov-name em{margin-left:auto;font-style:normal;font-size:10px;color:var(--dgame-accent);border:1px solid color-mix(in srgb,var(--dgame-accent) 45%,transparent);border-radius:999px;padding:1px 8px;white-space:nowrap}.dgcov-desc{font-size:11.5px;color:var(--dsw-alias-label-secondary);line-height:1.55}.dgcov-prev{position:relative;display:block;height:96px;border-radius:9px;overflow:hidden;border:1px solid color-mix(in srgb,var(--dgame-accent) 25%,var(--dsw-alias-border-l1))}
10568
10834
  .dgcov-prev-dash{background:radial-gradient(circle at 70% 20%,color-mix(in srgb,#1d4ed8 30%,transparent),transparent 55%),linear-gradient(180deg,#0d1330,#171233)}.dgcov-prev-dash i{position:absolute;top:-22%;font-style:normal;color:#fb7185;text-shadow:0 0 10px #f43f5e;font-size:15px;animation:dgcov-fall 1.5s linear infinite}.dgcov-prev-dash i::after{content:'\u25C6'}.dgcov-prev-dash i:nth-child(1){left:16%}.dgcov-prev-dash i:nth-child(2){left:50%;animation-delay:-.5s}.dgcov-prev-dash i:nth-child(3){left:82%;animation-delay:-1s}.dgcov-prev-dash b{position:absolute;left:50%;bottom:8px;margin-left:-9px;font-size:17px;color:#a5f3fc;text-shadow:0 0 12px #38bdf8;animation:dgcov-dodge 2.4s ease-in-out infinite}.dgcov-prev-dash b::after{content:'\u25B2'}@keyframes dgcov-fall{to{transform:translateY(140px)}}@keyframes dgcov-dodge{0%,100%{transform:translateX(-46px)}25%,75%{transform:translateX(0)}50%{transform:translateX(46px)}}
10569
10835
  .dgcov-prev-reactor{display:grid;grid-template-columns:repeat(3,1fr);gap:7px;padding:14px;background:linear-gradient(135deg,#272463,#12102c)}.dgcov-prev-reactor i{display:block;border-radius:9px;background:#191c38;border:1px solid color-mix(in srgb,#ffffff 11%,transparent);animation:dgcov-reactor 3s ease-in-out infinite}.dgcov-prev-reactor i:nth-child(1){animation-delay:0s}.dgcov-prev-reactor i:nth-child(2){animation-delay:-.33s}.dgcov-prev-reactor i:nth-child(3){animation-delay:-.66s}.dgcov-prev-reactor i:nth-child(4){animation-delay:-1s}.dgcov-prev-reactor i:nth-child(5){animation-delay:-1.33s}.dgcov-prev-reactor i:nth-child(6){animation-delay:-1.66s}.dgcov-prev-reactor i:nth-child(7){animation-delay:-2s}.dgcov-prev-reactor i:nth-child(8){animation-delay:-2.33s}.dgcov-prev-reactor i:nth-child(9){animation-delay:-2.66s}@keyframes dgcov-reactor{0%,20%,100%{background:#191c38;box-shadow:none;border-color:color-mix(in srgb,#ffffff 11%,transparent)}40%,64%{background:radial-gradient(circle at 35% 30%,#ecfeff,#67e8f9 40%,#2563eb 85%);box-shadow:0 0 14px color-mix(in srgb,#22d3ee 55%,transparent);border-color:#67e8f9}}
10570
- .dgfab{--dgame-accent:var(--dk-games-accent,#7c3aed);position:fixed;z-index:9985;display:flex;flex-direction:column;align-items:center;gap:6px;box-sizing:border-box;width:36px;padding:11px 0;border:1px solid color-mix(in srgb,var(--dgame-accent) 42%,var(--dsw-alias-border-l1));background:color-mix(in srgb,var(--dsw-alias-bg-layer-2) 82%,transparent);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);color:var(--dsw-alias-label-primary);font-family:inherit;cursor:grab;user-select:none;touch-action:none;box-shadow:0 6px 24px rgb(0 0 0 / .18);transition:left .22s ease,top .22s ease,border-color .15s ease,opacity .15s ease}.dgfab:hover{border-color:var(--dgame-accent)}.dgfab-side-left{border-radius:0 12px 12px 0;border-left:none}.dgfab-side-right{border-radius:12px 0 0 12px;border-right:none}.dgfab-drag{transition:none;cursor:grabbing;box-shadow:0 10px 34px rgb(0 0 0 / .3);z-index:9986}.dgfab-hide{display:none}.dgfab-ico{display:inline-flex;color:var(--dgame-accent)}.dgfab-label{writing-mode:vertical-rl;letter-spacing:.22em;font-size:11px;line-height:1;color:var(--dsw-alias-label-secondary)}
10571
- .dgwin{--dgame-accent:#a78bfa;--dgame-accent-soft:color-mix(in srgb,#a78bfa 16%,transparent);--dsw-alias-label-primary:#e7ecff;--dsw-alias-label-secondary:#aab3e8;--dsw-alias-label-tertiary:#7d86c0;--dsw-alias-border-l1:rgb(255 255 255 / .12);--dsw-alias-border-l2:rgb(255 255 255 / .17);--dsw-alias-bg-layer-1:#0d1230;--dsw-alias-bg-layer-2:#131a3d;--dsw-alias-interactive-bg-hover:rgb(255 255 255 / .08);position:fixed;z-index:9993;display:flex;flex-direction:column;border:1px solid rgb(255 255 255 / .14);border-radius:14px;background:radial-gradient(600px 300px at 80% -10%,color-mix(in srgb,#312e81 30%,transparent),transparent 60%),radial-gradient(500px 340px at -10% 110%,color-mix(in srgb,#0ea5e9 14%,transparent),transparent 55%),linear-gradient(180deg,#0b1024,#12102a 60%,#0a0f22);color:var(--dsw-alias-label-primary);box-shadow:0 24px 72px rgb(0 0 0 / .5);animation:dgwin-in .18s ease-out}.dgwin::before{content:'';position:absolute;inset:0;pointer-events:none;background-image:radial-gradient(1px 1px at 12% 22%,rgb(255 255 255 / .35),transparent),radial-gradient(1px 1px at 34% 68%,rgb(255 255 255 / .26),transparent),radial-gradient(1.5px 1.5px at 58% 14%,rgb(199 210 254 / .35),transparent),radial-gradient(1px 1px at 76% 44%,rgb(255 255 255 / .22),transparent),radial-gradient(1.5px 1.5px at 88% 78%,rgb(165 243 252 / .3),transparent),radial-gradient(1px 1px at 22% 88%,rgb(255 255 255 / .18),transparent),radial-gradient(1px 1px at 45% 38%,rgb(255 255 255 / .15),transparent),radial-gradient(1px 1px at 67% 86%,rgb(255 255 255 / .19),transparent)}@keyframes dgwin-in{from{opacity:0;transform:translateY(8px) scale(.985)}}
10836
+ .dgfab{--dgame-accent:var(--dk-games-accent,#7c3aed);position:fixed;z-index:1;display:flex;flex-direction:column;align-items:center;gap:6px;box-sizing:border-box;width:36px;padding:11px 0;border:1px solid color-mix(in srgb,var(--dgame-accent) 42%,var(--dsw-alias-border-l1));background:color-mix(in srgb,var(--dsw-alias-bg-layer-2) 82%,transparent);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);color:var(--dsw-alias-label-primary);font-family:inherit;cursor:grab;user-select:none;touch-action:none;box-shadow:0 6px 24px rgb(0 0 0 / .18);transition:left .22s ease,top .22s ease,border-color .15s ease,opacity .15s ease}.dgfab:hover{border-color:var(--dgame-accent)}.dgfab-side-left{border-radius:0 12px 12px 0;border-left:none}.dgfab-side-right{border-radius:12px 0 0 12px;border-right:none}.dgfab-drag{transition:none;cursor:grabbing;box-shadow:0 10px 34px rgb(0 0 0 / .3);z-index:2}.dgfab-hide{display:none}.dgfab-ico{display:inline-flex;color:var(--dgame-accent)}.dgfab-label{writing-mode:vertical-rl;letter-spacing:.22em;font-size:11px;line-height:1;color:var(--dsw-alias-label-secondary)}
10837
+ .dgwin{--dgame-accent:#a78bfa;--dgame-accent-soft:color-mix(in srgb,#a78bfa 16%,transparent);--dsw-alias-label-primary:#e7ecff;--dsw-alias-label-secondary:#aab3e8;--dsw-alias-label-tertiary:#7d86c0;--dsw-alias-border-l1:rgb(255 255 255 / .12);--dsw-alias-border-l2:rgb(255 255 255 / .17);--dsw-alias-bg-layer-1:#0d1230;--dsw-alias-bg-layer-2:#131a3d;--dsw-alias-interactive-bg-hover:rgb(255 255 255 / .08);position:fixed;z-index:5;display:flex;flex-direction:column;border:1px solid rgb(255 255 255 / .14);border-radius:14px;background:radial-gradient(600px 300px at 80% -10%,color-mix(in srgb,#312e81 30%,transparent),transparent 60%),radial-gradient(500px 340px at -10% 110%,color-mix(in srgb,#0ea5e9 14%,transparent),transparent 55%),linear-gradient(180deg,#0b1024,#12102a 60%,#0a0f22);color:var(--dsw-alias-label-primary);box-shadow:0 24px 72px rgb(0 0 0 / .5);animation:dgwin-in .18s ease-out}.dgwin::before{content:'';position:absolute;inset:0;pointer-events:none;background-image:radial-gradient(1px 1px at 12% 22%,rgb(255 255 255 / .35),transparent),radial-gradient(1px 1px at 34% 68%,rgb(255 255 255 / .26),transparent),radial-gradient(1.5px 1.5px at 58% 14%,rgb(199 210 254 / .35),transparent),radial-gradient(1px 1px at 76% 44%,rgb(255 255 255 / .22),transparent),radial-gradient(1.5px 1.5px at 88% 78%,rgb(165 243 252 / .3),transparent),radial-gradient(1px 1px at 22% 88%,rgb(255 255 255 / .18),transparent),radial-gradient(1px 1px at 45% 38%,rgb(255 255 255 / .15),transparent),radial-gradient(1px 1px at 67% 86%,rgb(255 255 255 / .19),transparent)}@keyframes dgwin-in{from{opacity:0;transform:translateY(8px) scale(.985)}}
10572
10838
  .dgwin-min{height:auto!important;border-radius:12px}.dgwin-min .dgwin-body{display:none}.dgwin-min .dgwin-resize{display:none}
10573
10839
  .dgwin-max{border-radius:12px}.dgwin-max .dgwin-body .dgame-game{align-items:stretch}.dgwin-max .dgwin-body .dgame-dash-stage,.dgwin-max .dgwin-body .dgame-tetris,.dgwin-max .dgwin-body .dgame-tetris-board,.dgwin-max .dgwin-body .dgame-snake-stage,.dgwin-max .dgwin-body .dgame-sokoban-stage,.dgwin-max .dgwin-body .dgame-gomoku-board,.dgwin-max .dgwin-body .dgame-xiangqi-board,.dgwin-max .dgwin-body .dgame-tank-stage,.dgwin-max .dgwin-body .dgame-breakout,.dgwin-max .dgwin-body .dgame-racer,.dgwin-max .dgwin-body .dgame-reactor{width:100%;max-width:none}.dgwin-max .dgwin-body .dgame-controls{width:100%;max-width:none}
10574
10840
  .dgwin-bar{flex:none;display:flex;align-items:center;gap:9px;padding:10px 12px;border-bottom:1px solid rgb(255 255 255 / .09);background:rgb(7 11 28 / .72);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);color:#cdd6ff;cursor:move;user-select:none;touch-action:none;position:relative;z-index:2}.dgwin-ico{display:inline-flex;color:#a78bfa}.dgwin-title{display:flex;flex-direction:column;gap:1px;min-width:0;flex:1}.dgwin-title b{font-size:13px}.dgwin-title span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px;color:#8f98ce}.dgwin-task{display:inline-flex;align-items:center;gap:7px;padding:5px 11px;border-radius:999px;border:1px solid rgb(255 255 255 / .13);background:rgb(255 255 255 / .05);font-size:11px;color:#aab3e8;white-space:nowrap}.dgwin-task i{width:7px;height:7px;border-radius:50%;background:#6b7499;flex:none}.dgwin-task.live{color:#c4f5e4;border-color:color-mix(in srgb,#34d399 33%,transparent);background:color-mix(in srgb,#34d399 8%,transparent)}.dgwin-task.live i{background:#34d399;box-shadow:0 0 0 3px color-mix(in srgb,#34d399 14%,transparent);animation:dgame-pulse 1.8s ease-in-out infinite}.dgwin-ctrls{display:flex;align-items:center;gap:6px;flex:none}.dgwin-btn{cursor:pointer;border:1px solid rgb(255 255 255 / .17);background:rgb(255 255 255 / .07);color:#e6ebff;border-radius:8px;padding:5px 10px;font:inherit;font-size:11px;transition:background .15s ease,border-color .15s ease}.dgwin-btn:hover{background:rgb(255 255 255 / .13);border-color:rgb(255 255 255 / .28)}.dgwin-sq{cursor:pointer;border:1px solid transparent;background:transparent;color:#a9b2e2;border-radius:8px;width:28px;height:26px;display:inline-flex;align-items:center;justify-content:center;font-size:12px;transition:background .15s ease,color .15s ease}.dgwin-sq:hover{background:rgb(255 255 255 / .12);color:#fff}
@@ -10916,10 +11182,10 @@ function MobileRelayView() {
10916
11182
  function MobileRelayOverlay() {
10917
11183
  (0, import_react21.useEffect)(() => {
10918
11184
  if (typeof window === "undefined" || typeof document === "undefined") return void 0;
10919
- if (window.__dshDockMobileDrawer) return void 0;
11185
+ const hostPresent = !!(window.__dshDockMobileDrawer && document.querySelector(".dsh-mobile-drawer-btn"));
10920
11186
  const mq = window.matchMedia ? window.matchMedia("(max-width:700px)") : null;
10921
11187
  if (!mq) return void 0;
10922
- window.__dshDockMobileDrawer = "client";
11188
+ if (!hostPresent) window.__dshDockMobileDrawer = "client";
10923
11189
  const narrow = () => mq.matches;
10924
11190
  const frameEl = () => document.querySelector('[class$="frame"]');
10925
11191
  const sidebarCollapsed = () => {
@@ -10941,17 +11207,72 @@ function MobileRelayOverlay() {
10941
11207
  const c = d.querySelector('button[aria-label="\u5173\u95ED\u8BE6\u60C5"]');
10942
11208
  if (c) c.click();
10943
11209
  };
10944
- const fab = document.createElement("button");
10945
- fab.type = "button";
10946
- fab.className = "dsh-mobile-drawer-btn";
10947
- fab.setAttribute("aria-label", "\u6253\u5F00\u4F1A\u8BDD\u5217\u8868");
10948
- fab.innerHTML = '<svg viewBox="0 0 24 24"><path d="M4 7h16M4 12h16M4 17h10"/></svg>';
10949
- fab.addEventListener("click", expand);
10950
- const scrim = document.createElement("div");
10951
- scrim.className = "dsh-mobile-scrim";
10952
- document.body.appendChild(fab);
10953
- document.body.appendChild(scrim);
11210
+ let fab = null;
11211
+ let scrim = null;
11212
+ if (!hostPresent) {
11213
+ fab = document.createElement("button");
11214
+ fab.type = "button";
11215
+ fab.className = "dsh-mobile-drawer-btn";
11216
+ fab.setAttribute("aria-label", "\u6253\u5F00\u4F1A\u8BDD\u5217\u8868");
11217
+ fab.innerHTML = '<svg viewBox="0 0 24 24"><path d="M4 7h16M4 12h16M4 17h10"/></svg>';
11218
+ fab.addEventListener("click", expand);
11219
+ scrim = document.createElement("div");
11220
+ scrim.className = "dsh-mobile-scrim";
11221
+ document.body.appendChild(fab);
11222
+ document.body.appendChild(scrim);
11223
+ }
11224
+ const tabbar = document.createElement("nav");
11225
+ tabbar.className = "dsh-mobile-tabbar";
11226
+ tabbar.setAttribute("aria-label", "\u5E95\u90E8\u5BFC\u822A");
11227
+ const tabDefs = [
11228
+ {
11229
+ id: "sessions",
11230
+ label: "\u4F1A\u8BDD",
11231
+ icon: '<svg viewBox="0 0 24 24"><path d="M21 12a8 8 0 0 1-8 8H5l-2 2V12a8 8 0 0 1 8-8h2a8 8 0 0 1 8 8z"/></svg>',
11232
+ act: () => expand()
11233
+ },
11234
+ {
11235
+ id: "dock",
11236
+ label: "\u529F\u80FD\u575E",
11237
+ icon: '<svg viewBox="0 0 24 24"><rect x="4" y="4" width="7" height="7" rx="1.5"/><rect x="13" y="4" width="7" height="7" rx="1.5"/><rect x="4" y="13" width="7" height="7" rx="1.5"/><rect x="13" y="13" width="7" height="7" rx="1.5"/></svg>',
11238
+ act: () => {
11239
+ if (panelNav.open) setPanelOpen(false);
11240
+ else openPanel("home");
11241
+ }
11242
+ },
11243
+ {
11244
+ id: "settings",
11245
+ label: "\u8BBE\u7F6E",
11246
+ icon: '<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="3.2"/><path d="M19.4 15a1.7 1.7 0 0 0 .34 1.87l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06A1.7 1.7 0 0 0 15 19.4a1.7 1.7 0 0 0-1 1.55V21a2 2 0 1 1-4 0v-.09A1.7 1.7 0 0 0 9 19.4a1.7 1.7 0 0 0-1.87.34l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06A1.7 1.7 0 0 0 4.6 15a1.7 1.7 0 0 0-1.55-1H3a2 2 0 1 1 0-4h.09A1.7 1.7 0 0 0 4.6 9a1.7 1.7 0 0 0-.34-1.87l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06A1.7 1.7 0 0 0 9 4.6a1.7 1.7 0 0 0 1-1.55V3a2 2 0 1 1 4 0v.09a1.7 1.7 0 0 0 1 1.51 1.7 1.7 0 0 0 1.87-.34l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06A1.7 1.7 0 0 0 19.4 9c.23.6.86 1 1.51 1H21a2 2 0 1 1 0 4h-.09a1.7 1.7 0 0 0-1.51 1z"/></svg>',
11247
+ act: () => {
11248
+ const b = [...document.querySelectorAll("button")].find((x) => (x.getAttribute("aria-label") || "") === "\u8BBE\u7F6E" || (x.textContent || "").trim() === "\u8BBE\u7F6E");
11249
+ if (b) b.click();
11250
+ }
11251
+ }
11252
+ ];
11253
+ const tabButtons = tabDefs.map((def) => {
11254
+ const b = document.createElement("button");
11255
+ b.type = "button";
11256
+ b.className = "dsh-mobile-tab";
11257
+ b.dataset.tab = def.id;
11258
+ b.innerHTML = def.icon + "<span>" + def.label + "</span>";
11259
+ b.addEventListener("click", () => def.act());
11260
+ tabbar.appendChild(b);
11261
+ return b;
11262
+ });
11263
+ document.body.appendChild(tabbar);
11264
+ const syncTabs = () => {
11265
+ const expanded = !sidebarCollapsed();
11266
+ const settingsOpen = dialogOpen();
11267
+ for (const b of tabButtons) {
11268
+ const id = b.dataset.tab;
11269
+ const on = id === "sessions" && expanded || id === "dock" && panelNav.open || id === "settings" && settingsOpen;
11270
+ b.classList.toggle("on", on);
11271
+ }
11272
+ };
11273
+ const unsubPanel = subscribePanel(syncTabs);
10954
11274
  const place = () => {
11275
+ if (!fab) return;
10955
11276
  const vh = window.innerHeight;
10956
11277
  let top = null;
10957
11278
  const g = document.querySelector(".dgfab");
@@ -10969,10 +11290,14 @@ function MobileRelayOverlay() {
10969
11290
  const sync = () => {
10970
11291
  const on = narrow() && !!frameEl() && !dialogOpen();
10971
11292
  const collapsed = sidebarCollapsed();
10972
- const showFab = on && collapsed;
10973
- fab.style.display = showFab ? "" : "none";
10974
- if (showFab) place();
10975
- scrim.style.display = on && !collapsed ? "" : "none";
11293
+ if (fab) {
11294
+ const showFab = on && collapsed && !panelNav.open;
11295
+ fab.style.display = showFab ? "" : "none";
11296
+ if (showFab) place();
11297
+ }
11298
+ if (scrim) scrim.style.display = on && !collapsed ? "" : "none";
11299
+ tabbar.style.display = narrow() && !!frameEl() && !panelNav.open ? "" : "none";
11300
+ syncTabs();
10976
11301
  };
10977
11302
  sync();
10978
11303
  const observer = typeof MutationObserver !== "undefined" ? new MutationObserver(sync) : null;
@@ -10986,7 +11311,7 @@ function MobileRelayOverlay() {
10986
11311
  if (!narrow()) return;
10987
11312
  const t = e.target;
10988
11313
  if (!t || !t.closest) return;
10989
- if (t.closest(".dsh-mobile-drawer-btn")) return;
11314
+ if (t.closest(".dsh-mobile-drawer-btn") || t.closest(".dsh-mobile-tabbar")) return;
10990
11315
  const expanded = !!document.querySelector('button[aria-label="\u6536\u8D77\u4FA7\u8FB9\u680F"],button[aria-label="Collapse sidebar"]');
10991
11316
  const col = document.querySelector('[class*="sidebarCol"]');
10992
11317
  const inSidebar = col && col.contains(t);
@@ -11004,16 +11329,18 @@ function MobileRelayOverlay() {
11004
11329
  if (t.closest('[role="dialog"],[class*="dockm"],[class*="dgfab"],[class*="dgwin"],[class*="dgame"],[class*="detailsCol"]')) return;
11005
11330
  collapse();
11006
11331
  };
11007
- document.addEventListener("click", onClick, true);
11332
+ if (!hostPresent) document.addEventListener("click", onClick, true);
11008
11333
  return () => {
11009
- document.removeEventListener("click", onClick, true);
11334
+ if (!hostPresent) document.removeEventListener("click", onClick, true);
11010
11335
  if (observer) observer.disconnect();
11011
11336
  clearInterval(timer);
11337
+ unsubPanel();
11012
11338
  if (mq.removeEventListener) mq.removeEventListener("change", onMq);
11013
11339
  else if (mq.removeListener) mq.removeListener(onMq);
11014
11340
  window.removeEventListener("resize", place);
11015
- fab.remove();
11016
- scrim.remove();
11341
+ if (fab) fab.remove();
11342
+ if (scrim) scrim.remove();
11343
+ tabbar.remove();
11017
11344
  if (window.__dshDockMobileDrawer === "client") delete window.__dshDockMobileDrawer;
11018
11345
  };
11019
11346
  }, []);
@@ -11040,14 +11367,32 @@ var feature10 = {
11040
11367
  .dmr{--dmr-accent:var(--dk-accent,#2f6fed);--dmr-accent-soft:color-mix(in srgb,var(--dmr-accent) 13%,transparent);display:flex;flex-direction:column;gap:16px;max-width:720px;color:var(--dsw-alias-label-primary);font-size:13px;line-height:1.5}.dmr h3,.dmr h4,.dmr p{margin:0}.dmr h3{font-size:17px;line-height:1.25;letter-spacing:-.01em}.dmr h4{font-size:13px}.dmr-hero,.dmr-status-head{display:flex;align-items:flex-start;gap:12px}.dmr-hero>div,.dmr-status-head>div{min-width:0;display:flex;flex-direction:column;gap:4px}.dmr-hero p,.dmr-status-head p,.dmr-field small,.dmr-share small,.dmr-overview-card small,.dmr-task small,.dmr-note p{color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.55}.dmr-hero-icon{width:42px;height:42px;display:inline-flex;align-items:center;justify-content:center;flex:none;border-radius:14px;background:var(--dmr-accent-soft);color:var(--dmr-accent);border:1px solid color-mix(in srgb,var(--dmr-accent) 35%,var(--dsw-alias-border-l1))}.dmr-steps{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin:0;padding:0;list-style:none}.dmr-steps li{display:flex;gap:9px;padding:11px;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:12px}.dmr-steps li>span{width:21px;height:21px;display:inline-flex;align-items:center;justify-content:center;flex:none;border-radius:50%;font-size:11px;font-weight:700;color:var(--dmr-accent);background:var(--dmr-accent-soft)}.dmr-steps div{display:flex;flex-direction:column;gap:3px;min-width:0}.dmr-steps strong{font-size:12px}.dmr-steps small{font-size:11px;color:var(--dsw-alias-label-secondary);line-height:1.45}.dmr-field{display:flex;flex-direction:column;gap:6px;font-weight:600}.dmr-field input,.dmr-field select,.dmr-note textarea{box-sizing:border-box;width:100%;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);border-radius:10px;padding:10px 12px;min-height:44px;font:inherit;outline:none;transition:border-color .18s ease,box-shadow .18s ease}.dmr-field input:focus,.dmr-field select:focus,.dmr-note textarea:focus{border-color:var(--dmr-accent);box-shadow:0 0 0 3px var(--dmr-accent-soft)}.dmr-field small{font-weight:400}.dmr-network-grid{display:grid;grid-template-columns:minmax(0,1.4fr) minmax(150px,.6fr);gap:12px}.dmr-security{padding:12px 13px;border:1px solid color-mix(in srgb,var(--dk-warn) 48%,var(--dsw-alias-border-l1));border-radius:12px;background:color-mix(in srgb,var(--dk-warn) 9%,transparent)}.dmr-security strong{display:block;margin-bottom:4px;color:var(--dk-warn);font-size:12px}.dmr-security p{font-size:12px;color:var(--dsw-alias-label-secondary);line-height:1.55}.dmr-primary,.dmr-secondary,.dmr-text-button,.dmr-icon-button{font:inherit;touch-action:manipulation;cursor:pointer;transition:transform .15s ease,background .18s ease,border-color .18s ease,opacity .18s ease}.dmr-primary,.dmr-secondary{min-height:44px;display:inline-flex;align-items:center;justify-content:center;gap:8px;border-radius:10px;padding:9px 13px;font-weight:600}.dmr-primary{align-self:flex-start;border:1px solid var(--dmr-accent);background:var(--dmr-accent);color:#fff}.dmr-primary:hover{filter:brightness(1.05)}.dmr-secondary{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary)}.dmr-secondary:hover{border-color:var(--dmr-accent);background:var(--dmr-accent-soft)}.dmr-primary:active,.dmr-secondary:active,.dmr-icon-button:active{transform:scale(.98)}.dmr-primary:disabled,.dmr-secondary:disabled,.dmr-text-button:disabled,.dmr-icon-button:disabled{cursor:not-allowed;opacity:.5}.dmr-message{display:flex;align-items:flex-start;gap:7px;padding:10px 12px;border-radius:10px;font-size:12px}.dmr-message.success{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb,var(--dsw-alias-state-success-primary) 10%,transparent)}.dmr-message.error{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 10%,transparent)}.dmr-status-head{justify-content:space-between}.dmr-eyebrow{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600;color:var(--dmr-accent)}.dmr-eyebrow i{width:7px;height:7px;border-radius:50%;background:currentColor;box-shadow:0 0 0 4px var(--dmr-accent-soft)}.dmr-icon-button{display:inline-flex;align-items:center;justify-content:center;flex:none;width:44px;height:44px;border:1px solid var(--dsw-alias-border-l2);border-radius:10px;background:transparent;color:var(--dsw-alias-label-secondary)}.dmr-icon-button:hover{color:var(--dsw-alias-state-error-primary);border-color:currentColor}.dmr-share{display:flex;flex-direction:column;gap:9px;padding:13px;border:1px solid color-mix(in srgb,var(--dmr-accent) 32%,var(--dsw-alias-border-l1));border-radius:13px;background:var(--dmr-accent-soft)}.dmr-share-layout{display:grid;grid-template-columns:196px minmax(0,1fr);gap:16px;align-items:center}.dmr-qr-card{box-sizing:border-box;display:flex;flex-direction:column;align-items:center;gap:5px;padding:10px;border-radius:12px;background:#fff;color:#111827;text-align:center}.dmr-qr-card img{display:block;width:176px;height:176px;max-width:100%;object-fit:contain}.dmr-qr-card strong{font-size:12px}.dmr-qr-card small{color:#4b5563;font-size:10px}.dmr-qr-loading{display:grid;place-items:center;width:176px;height:176px;color:#64748b;font-size:12px}.dmr-share-detail{min-width:0;display:flex;flex-direction:column;gap:10px}.dmr-share-detail>div:first-child{display:flex;flex-direction:column;gap:4px}.dmr-link{padding:10px 11px;border-radius:8px;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);font:12px/1.4 ui-monospace,SFMono-Regular,Menlo,monospace;word-break:break-all;color:var(--dsw-alias-label-secondary)}.dmr-share-actions{display:flex;gap:8px;flex-wrap:wrap}.dmr-share-actions .dmr-primary{align-self:auto}.dmr-overview{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.dmr-overview-card{display:flex;flex-direction:column;gap:3px;padding:12px;border:1px solid var(--dsw-alias-border-l1);border-radius:12px;background:var(--dsw-alias-bg-layer-1)}.dmr-overview-card>span{font-size:11px;color:var(--dsw-alias-label-tertiary)}.dmr-overview-card strong{font-size:16px;letter-spacing:-.01em}.dmr-section{display:flex;flex-direction:column;gap:9px}.dmr-section-head{display:flex;align-items:center;justify-content:space-between;gap:10px}.dmr-section-head small{font-size:11px;color:var(--dsw-alias-label-tertiary)}.dmr-text-button{border:0;background:transparent;color:var(--dmr-accent);padding:8px;min-height:36px;font-weight:600}.dmr-task-list{display:flex;flex-direction:column;gap:8px}.dmr-task{display:flex;align-items:flex-start;gap:9px;padding:10px 11px;border:1px solid var(--dsw-alias-border-l1);border-radius:10px;background:var(--dsw-alias-bg-layer-1)}.dmr-task>div{display:flex;min-width:0;flex:1;flex-direction:column;gap:2px}.dmr-task strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dmr-phase{flex:none;border-radius:999px;padding:3px 8px;font-size:11px;background:var(--dmr-accent-soft);color:var(--dmr-accent)}.dmr-phase.write{color:var(--dsw-alias-state-success-primary)}.dmr-phase.code{color:var(--dk-warn)}.dmr-phase.search{color:#0d9488}.dmr-empty{padding:18px 12px;text-align:center;border:1px dashed var(--dsw-alias-border-l2);border-radius:10px;color:var(--dsw-alias-label-secondary);font-size:12px}.dmr-note{display:flex;flex-direction:column;gap:9px;padding-top:2px}.dmr-note blockquote{margin:0;padding:10px 12px;border-left:3px solid var(--dmr-accent);border-radius:0 9px 9px 0;background:var(--dmr-accent-soft);white-space:pre-wrap;font-size:12px}.dmr-note textarea{min-height:88px;resize:vertical;line-height:1.5}.dmr-note .dmr-secondary{align-self:flex-start}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@media (max-width:680px){.dmr{gap:14px;font-size:14px}.dmr h3{font-size:18px}.dmr-steps{grid-template-columns:1fr;gap:8px}.dmr-steps li{padding:10px}.dmr-steps small,.dmr-hero p,.dmr-status-head p,.dmr-field small,.dmr-share small,.dmr-overview-card small,.dmr-task small,.dmr-note p{font-size:12px}.dmr-network-grid{grid-template-columns:1fr;gap:10px}.dmr-field input,.dmr-field select{font-size:16px}.dmr-primary,.dmr-secondary{width:100%;font-size:14px}.dmr-share-layout{grid-template-columns:1fr;gap:12px}.dmr-qr-card{width:min(240px,100%);margin:0 auto}.dmr-qr-card img,.dmr-qr-loading{width:210px;height:210px}.dmr-share-actions{flex-direction:column}.dmr-share-actions .dmr-primary{width:100%}.dmr-overview{gap:8px}.dmr-overview-card{padding:11px}.dmr-status-head{gap:8px}.dmr-link{font-size:11px}.dmr-note textarea{font-size:16px;min-height:104px}.dmr-note .dmr-secondary{align-self:stretch}.dmr-compact .dmr-hero-icon{width:40px;height:40px;border-radius:13px}}@media (prefers-reduced-motion:reduce){.dmr-primary,.dmr-secondary,.dmr-text-button,.dmr-icon-button,.dmr-field input,.dmr-field select,.dmr-note textarea{transition:none}}.dmr-lan{flex:none;margin-top:6px;padding-top:16px;border-top:1px solid var(--dsw-alias-border-l1)}.dmr-lan-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.dmr-lan-title{min-width:0;display:flex;flex-direction:column;gap:4px}.dmr-lan-title p{color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.55}.dmr-lan-badge{flex:none;display:inline-flex;align-items:center;gap:6px;border-radius:999px;padding:5px 10px;font-size:11px;font-weight:700;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-tertiary)}.dmr-lan-badge.on{border-color:color-mix(in srgb,var(--dmr-accent) 45%,transparent);background:var(--dmr-accent-soft);color:var(--dmr-accent)}.dmr-lan-active,.dmr-lan-idle{display:flex;flex-direction:column;gap:12px}.dmr-lan-active .dmr-share-detail small strong{color:var(--dsw-alias-state-error-primary)}.dmr-danger{border-color:color-mix(in srgb,var(--dsw-alias-state-error-primary) 45%,var(--dsw-alias-border-l2));color:var(--dsw-alias-state-error-primary)}.dmr-danger:hover{border-color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 10%,transparent)}
11041
11368
  /* \u62BD\u5C49\u628A\u624B\uFF1A\u8D34\u5DE6\u8FB9\u7F18\uFF08\u540C\u8DA3\u5473\u6E38\u620F\u6D6E\u6807\u7684\u8FB9\u7F18\u5438\u9644\u8BED\u8A00\uFF09\uFF0Ctop \u7531 place() \u52A8\u6001\u8BBE\u5B9A\uFF1B
11042
11369
  * z \u5E8F 70 < \u906E\u7F69 75 < \u4FA7\u680F 80 < overlayLayer 90\uFF0C\u9762\u677F/\u5F39\u7A97\u6253\u5F00\u65F6\u81EA\u7136\u88AB\u76D6\u3002 */
11043
- @media (max-width:700px){.dsh-mobile-drawer-btn{position:fixed;left:0;top:38vh;z-index:70;box-sizing:border-box;width:30px;height:48px;padding:0;display:flex;align-items:center;justify-content:center;border:1px solid var(--dsw-alias-border-l1,rgba(127,139,161,.35));border-left:none;border-radius:0 12px 12px 0;background:color-mix(in srgb,var(--dsw-alias-bg-layer-2,#1c2230) 88%,transparent);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);color:var(--dsw-alias-label-primary,#e6eaf2);box-shadow:4px 0 18px rgba(0,0,0,.28);cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent}.dsh-mobile-drawer-btn:active{transform:scale(.94)}.dsh-mobile-drawer-btn svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}.dsh-mobile-scrim{position:fixed;inset:0;z-index:75;background:rgba(8,10,14,.45);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);touch-action:none}}`,
11370
+ @media (max-width:700px){.dsh-mobile-drawer-btn{position:fixed;left:0;top:38vh;z-index:70;box-sizing:border-box;width:30px;height:48px;padding:0;display:flex;align-items:center;justify-content:center;border:1px solid var(--dsw-alias-border-l1,rgba(127,139,161,.35));border-left:none;border-radius:0 12px 12px 0;background:color-mix(in srgb,var(--dsw-alias-bg-layer-2,#1c2230) 88%,transparent);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);color:var(--dsw-alias-label-primary,#e6eaf2);box-shadow:4px 0 18px rgba(0,0,0,.28);cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent}.dsh-mobile-drawer-btn:active{transform:scale(.94)}.dsh-mobile-drawer-btn svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}.dsh-mobile-scrim{position:fixed;inset:0;z-index:75;background:rgba(8,10,14,.45);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);touch-action:none}
11371
+ /* ---- \u4EFF ZCode \u624B\u673A\u7AEF\uFF1A\u5E95\u90E8 Tab \u680F + \u8F93\u5165\u533A\u5438\u9644\u5E95\u90E8 ---- */
11372
+ .dsh-mobile-tabbar{position:fixed;left:0;right:0;bottom:0;z-index:65;display:flex;align-items:stretch;justify-content:space-around;padding:6px 8px calc(8px + env(safe-area-inset-bottom,0px));background:color-mix(in srgb,var(--dsw-alias-bg-layer-2,#1c2230) 92%,transparent);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-top:1px solid var(--dsw-alias-border-l1,rgba(127,139,161,.25));touch-action:manipulation}
11373
+ .dsh-mobile-tab{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;min-height:48px;padding:4px 0;border:0;background:transparent;color:var(--dsw-alias-label-tertiary,#8b95ab);font:600 11px/1.2 inherit;cursor:pointer;-webkit-tap-highlight-color:transparent;border-radius:10px}
11374
+ .dsh-mobile-tab svg{width:21px;height:21px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
11375
+ .dsh-mobile-tab.on{color:var(--dsw-alias-label-primary,#e6eaf2)}
11376
+ .dsh-mobile-tab.on svg{color:var(--dk-accent,#4d9fff)}
11377
+ .dsh-mobile-tab:active{transform:scale(.94)}
11378
+ /* \u8F93\u5165\u533A\u5438\u9644\u5230 Tab \u680F\u4E0A\u65B9\uFF1A\u5BBF\u4E3B\u628A\u6B22\u8FCE\u5185\u5BB9 justify-content:center \u5782\u76F4\u5C45\u4E2D\uFF0C
11379
+ * \u624B\u673A\u89C6\u53E3\u4E0B\u8F93\u5165\u5361\u7247\u60AC\u5728\u4E2D\u90E8\u3001\u4E0B\u65B9\u7559\u51FA\u5927\u7247\u7A7A\u767D\u3002\u6539\u4E3A flex-end \u8D34\u5E95\uFF0C\u5E76\u7ED9
11380
+ * \u6EDA\u52A8\u4F53\u7559\u51FA Tab \u680F\u9AD8\u5EA6\u7684\u5185\u8FB9\u8DDD\uFF0C\u907F\u514D\u5185\u5BB9\u88AB Tab \u680F\u906E\u6321\u3002 */
11381
+ [class*="scrollBody"]{justify-content:flex-end !important;padding-bottom:calc(72px + env(safe-area-inset-bottom,0px)) !important}
11382
+ [class*="scrollBody"]>[class*="composerSeat"]{padding-bottom:6px}
11383
+ /* \u6536\u8D77\u7684\u4FA7\u680F\u8F68\u9053\uFF08collapsed rail\uFF09\u5728\u7A84\u5C4F\u53EA\u5269 1px \u5360\u4F4D\uFF0C\u4F46\u8F68\u9053\u91CC\u7684\u6309\u94AE
11384
+ * \u4ECD\u4F1A\u6EA2\u51FA\u8D34\u5728\u5DE6\u8FB9\u7F18\uFF08\u529F\u80FD\u575E/\u8FDB\u5316/\u8BBE\u7F6E\u4E09\u679A\u9732\u51FA\u534A\u8FB9\u7684\u5706\u94AE\uFF09\u3002\u9690\u85CF\u6574\u5217\uFF0C
11385
+ * \u8FD9\u4E9B\u5165\u53E3\u5DF2\u7531\u5E95\u90E8 Tab \u680F\u63A5\u7BA1\uFF1B\u5C55\u5F00\u62BD\u5C49\uFF08z 80\uFF09\u4E0D\u53D7\u5F71\u54CD\u3002 */
11386
+ [class*="sidebarCol"]:has([class*="collapsed"]){visibility:hidden}
11387
+ /* \u62BD\u5C49\u628A\u624B\u4ECE\u5C4F\u5E55\u4E2D\u90E8\u632A\u5230 Tab \u680F\u4E0A\u65B9\u4E00\u70B9\uFF0C\u514D\u5F97\u5B64\u96F6\u96F6\u60AC\u5728\u534A\u7A7A */
11388
+ .dsh-mobile-drawer-btn{top:auto !important;bottom:calc(96px + env(safe-area-inset-bottom,0px))}}`,
11044
11389
  View: MobileRelayView,
11045
11390
  HomeStat: MobileRelayHomeStat,
11046
11391
  Overlay: MobileRelayOverlay
11047
11392
  };
11048
11393
 
11049
11394
  // src/client.jsx
11050
- var DOCK_VERSION = "0.11.3";
11395
+ var DOCK_VERSION = "0.11.6";
11051
11396
  var BUILTIN_FEATURES = [feature, feature2, feature3, feature4, feature5, feature6, feature7, feature8, feature9, feature10];
11052
11397
  var PLANNED_FEATURES = [];
11053
11398
  var PLANNED_NOTES = {};
@@ -11244,27 +11589,16 @@ function ensureCss() {
11244
11589
  dockCssTag = document.querySelector('style[data-plugin-css="dsh-dock"]');
11245
11590
  } else {
11246
11591
  dockCssTag = document.createElement("style");
11247
- dockCssTag.dataset.pluginCss = "dsh-dock";
11248
11592
  document.head.appendChild(dockCssTag);
11249
11593
  }
11250
11594
  }
11595
+ dockCssTag.dataset.plugin = "dsh-dock";
11596
+ dockCssTag.dataset.pluginCss = "dsh-dock";
11251
11597
  dockCssTag.textContent = fullDockCss();
11252
11598
  } catch (e) {
11253
11599
  console.error("[dsh-dock] ensureCss failed:", e && e.message ? e.message : String(e));
11254
11600
  }
11255
11601
  }
11256
- function scheduleInitialCss() {
11257
- if (typeof document === "undefined" || initialCssSchedule || dockCssTag && dockCssTag.isConnected) return;
11258
- const run = () => {
11259
- initialCssSchedule = null;
11260
- ensureCss();
11261
- };
11262
- if (typeof window !== "undefined" && typeof window.requestIdleCallback === "function") {
11263
- initialCssSchedule = { type: "idle", id: window.requestIdleCallback(run, { timeout: 350 }) };
11264
- } else {
11265
- initialCssSchedule = { type: "timer", id: setTimeout(run, 48) };
11266
- }
11267
- }
11268
11602
  function useExternalVersion() {
11269
11603
  const [, bump] = import_react22.default.useReducer((n) => n + 1, 0);
11270
11604
  import_react22.default.useEffect(() => {
@@ -11693,7 +12027,7 @@ function FeatureOverlays() {
11693
12027
  var ctxRef = { current: null };
11694
12028
  function apply(ctx) {
11695
12029
  ctxRef.current = ctx;
11696
- scheduleInitialCss();
12030
+ ensureCss();
11697
12031
  initFeatureState(BUILTIN_FEATURES.concat(PLANNED_FEATURES));
11698
12032
  const slots = ctx.get("slots");
11699
12033
  if (slots === void 0) return;