dsh-dock 0.12.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/client.js CHANGED
@@ -12,7 +12,11 @@ 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
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
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
+ }
16
20
  };
17
21
  var __export = (target, all) => {
18
22
  for (var name in all)
@@ -36,18 +40,18 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
36
40
  ));
37
41
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
38
42
 
39
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/can-promise.js
43
+ // node_modules/qrcode/lib/can-promise.js
40
44
  var require_can_promise = __commonJS({
41
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/can-promise.js"(exports, module2) {
45
+ "node_modules/qrcode/lib/can-promise.js"(exports, module2) {
42
46
  module2.exports = function() {
43
47
  return typeof Promise === "function" && Promise.prototype && Promise.prototype.then;
44
48
  };
45
49
  }
46
50
  });
47
51
 
48
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.js
52
+ // node_modules/qrcode/lib/core/utils.js
49
53
  var require_utils = __commonJS({
50
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.js"(exports) {
54
+ "node_modules/qrcode/lib/core/utils.js"(exports) {
51
55
  var toSJISFunction;
52
56
  var CODEWORDS_COUNT = [
53
57
  0,
@@ -124,9 +128,9 @@ var require_utils = __commonJS({
124
128
  }
125
129
  });
126
130
 
127
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-level.js
131
+ // node_modules/qrcode/lib/core/error-correction-level.js
128
132
  var require_error_correction_level = __commonJS({
129
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-level.js"(exports) {
133
+ "node_modules/qrcode/lib/core/error-correction-level.js"(exports) {
130
134
  exports.L = { bit: 1 };
131
135
  exports.M = { bit: 0 };
132
136
  exports.Q = { bit: 3 };
@@ -169,9 +173,9 @@ var require_error_correction_level = __commonJS({
169
173
  }
170
174
  });
171
175
 
172
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-buffer.js
176
+ // node_modules/qrcode/lib/core/bit-buffer.js
173
177
  var require_bit_buffer = __commonJS({
174
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-buffer.js"(exports, module2) {
178
+ "node_modules/qrcode/lib/core/bit-buffer.js"(exports, module2) {
175
179
  function BitBuffer() {
176
180
  this.buffer = [];
177
181
  this.length = 0;
@@ -204,9 +208,9 @@ var require_bit_buffer = __commonJS({
204
208
  }
205
209
  });
206
210
 
207
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-matrix.js
211
+ // node_modules/qrcode/lib/core/bit-matrix.js
208
212
  var require_bit_matrix = __commonJS({
209
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-matrix.js"(exports, module2) {
213
+ "node_modules/qrcode/lib/core/bit-matrix.js"(exports, module2) {
210
214
  function BitMatrix(size) {
211
215
  if (!size || size < 1) {
212
216
  throw new Error("BitMatrix size must be defined and greater than 0");
@@ -233,9 +237,9 @@ var require_bit_matrix = __commonJS({
233
237
  }
234
238
  });
235
239
 
236
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alignment-pattern.js
240
+ // node_modules/qrcode/lib/core/alignment-pattern.js
237
241
  var require_alignment_pattern = __commonJS({
238
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alignment-pattern.js"(exports) {
242
+ "node_modules/qrcode/lib/core/alignment-pattern.js"(exports) {
239
243
  var getSymbolSize = require_utils().getSymbolSize;
240
244
  exports.getRowColCoords = function getRowColCoords(version) {
241
245
  if (version === 1) return [];
@@ -268,9 +272,9 @@ var require_alignment_pattern = __commonJS({
268
272
  }
269
273
  });
270
274
 
271
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/finder-pattern.js
275
+ // node_modules/qrcode/lib/core/finder-pattern.js
272
276
  var require_finder_pattern = __commonJS({
273
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/finder-pattern.js"(exports) {
277
+ "node_modules/qrcode/lib/core/finder-pattern.js"(exports) {
274
278
  var getSymbolSize = require_utils().getSymbolSize;
275
279
  var FINDER_PATTERN_SIZE = 7;
276
280
  exports.getPositions = function getPositions(version) {
@@ -287,9 +291,9 @@ var require_finder_pattern = __commonJS({
287
291
  }
288
292
  });
289
293
 
290
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mask-pattern.js
294
+ // node_modules/qrcode/lib/core/mask-pattern.js
291
295
  var require_mask_pattern = __commonJS({
292
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mask-pattern.js"(exports) {
296
+ "node_modules/qrcode/lib/core/mask-pattern.js"(exports) {
293
297
  exports.Patterns = {
294
298
  PATTERN000: 0,
295
299
  PATTERN001: 1,
@@ -429,9 +433,9 @@ var require_mask_pattern = __commonJS({
429
433
  }
430
434
  });
431
435
 
432
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-code.js
436
+ // node_modules/qrcode/lib/core/error-correction-code.js
433
437
  var require_error_correction_code = __commonJS({
434
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-code.js"(exports) {
438
+ "node_modules/qrcode/lib/core/error-correction-code.js"(exports) {
435
439
  var ECLevel = require_error_correction_level();
436
440
  var EC_BLOCKS_TABLE = [
437
441
  // L M Q H
@@ -790,9 +794,9 @@ var require_error_correction_code = __commonJS({
790
794
  }
791
795
  });
792
796
 
793
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/galois-field.js
797
+ // node_modules/qrcode/lib/core/galois-field.js
794
798
  var require_galois_field = __commonJS({
795
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/galois-field.js"(exports) {
799
+ "node_modules/qrcode/lib/core/galois-field.js"(exports) {
796
800
  var EXP_TABLE = new Uint8Array(512);
797
801
  var LOG_TABLE = new Uint8Array(256);
798
802
  (function initTables() {
@@ -823,9 +827,9 @@ var require_galois_field = __commonJS({
823
827
  }
824
828
  });
825
829
 
826
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/polynomial.js
830
+ // node_modules/qrcode/lib/core/polynomial.js
827
831
  var require_polynomial = __commonJS({
828
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/polynomial.js"(exports) {
832
+ "node_modules/qrcode/lib/core/polynomial.js"(exports) {
829
833
  var GF = require_galois_field();
830
834
  exports.mul = function mul(p1, p2) {
831
835
  const coeff = new Uint8Array(p1.length + p2.length - 1);
@@ -859,9 +863,9 @@ var require_polynomial = __commonJS({
859
863
  }
860
864
  });
861
865
 
862
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/reed-solomon-encoder.js
866
+ // node_modules/qrcode/lib/core/reed-solomon-encoder.js
863
867
  var require_reed_solomon_encoder = __commonJS({
864
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/reed-solomon-encoder.js"(exports, module2) {
868
+ "node_modules/qrcode/lib/core/reed-solomon-encoder.js"(exports, module2) {
865
869
  var Polynomial = require_polynomial();
866
870
  function ReedSolomonEncoder(degree) {
867
871
  this.genPoly = void 0;
@@ -891,18 +895,18 @@ var require_reed_solomon_encoder = __commonJS({
891
895
  }
892
896
  });
893
897
 
894
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version-check.js
898
+ // node_modules/qrcode/lib/core/version-check.js
895
899
  var require_version_check = __commonJS({
896
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version-check.js"(exports) {
900
+ "node_modules/qrcode/lib/core/version-check.js"(exports) {
897
901
  exports.isValid = function isValid(version) {
898
902
  return !isNaN(version) && version >= 1 && version <= 40;
899
903
  };
900
904
  }
901
905
  });
902
906
 
903
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/regex.js
907
+ // node_modules/qrcode/lib/core/regex.js
904
908
  var require_regex = __commonJS({
905
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/regex.js"(exports) {
909
+ "node_modules/qrcode/lib/core/regex.js"(exports) {
906
910
  var numeric = "[0-9]+";
907
911
  var alphanumeric = "[A-Z $%*+\\-./:]+";
908
912
  var kanji = "(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";
@@ -928,9 +932,9 @@ var require_regex = __commonJS({
928
932
  }
929
933
  });
930
934
 
931
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mode.js
935
+ // node_modules/qrcode/lib/core/mode.js
932
936
  var require_mode = __commonJS({
933
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mode.js"(exports) {
937
+ "node_modules/qrcode/lib/core/mode.js"(exports) {
934
938
  var VersionCheck = require_version_check();
935
939
  var Regex = require_regex();
936
940
  exports.NUMERIC = {
@@ -1009,9 +1013,9 @@ var require_mode = __commonJS({
1009
1013
  }
1010
1014
  });
1011
1015
 
1012
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version.js
1016
+ // node_modules/qrcode/lib/core/version.js
1013
1017
  var require_version = __commonJS({
1014
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version.js"(exports) {
1018
+ "node_modules/qrcode/lib/core/version.js"(exports) {
1015
1019
  var Utils = require_utils();
1016
1020
  var ECCode = require_error_correction_code();
1017
1021
  var ECLevel = require_error_correction_level();
@@ -1104,9 +1108,9 @@ var require_version = __commonJS({
1104
1108
  }
1105
1109
  });
1106
1110
 
1107
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/format-info.js
1111
+ // node_modules/qrcode/lib/core/format-info.js
1108
1112
  var require_format_info = __commonJS({
1109
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/format-info.js"(exports) {
1113
+ "node_modules/qrcode/lib/core/format-info.js"(exports) {
1110
1114
  var Utils = require_utils();
1111
1115
  var G15 = 1 << 10 | 1 << 8 | 1 << 5 | 1 << 4 | 1 << 2 | 1 << 1 | 1 << 0;
1112
1116
  var G15_MASK = 1 << 14 | 1 << 12 | 1 << 10 | 1 << 4 | 1 << 1;
@@ -1122,9 +1126,9 @@ var require_format_info = __commonJS({
1122
1126
  }
1123
1127
  });
1124
1128
 
1125
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/numeric-data.js
1129
+ // node_modules/qrcode/lib/core/numeric-data.js
1126
1130
  var require_numeric_data = __commonJS({
1127
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/numeric-data.js"(exports, module2) {
1131
+ "node_modules/qrcode/lib/core/numeric-data.js"(exports, module2) {
1128
1132
  var Mode = require_mode();
1129
1133
  function NumericData(data) {
1130
1134
  this.mode = Mode.NUMERIC;
@@ -1157,9 +1161,9 @@ var require_numeric_data = __commonJS({
1157
1161
  }
1158
1162
  });
1159
1163
 
1160
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alphanumeric-data.js
1164
+ // node_modules/qrcode/lib/core/alphanumeric-data.js
1161
1165
  var require_alphanumeric_data = __commonJS({
1162
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alphanumeric-data.js"(exports, module2) {
1166
+ "node_modules/qrcode/lib/core/alphanumeric-data.js"(exports, module2) {
1163
1167
  var Mode = require_mode();
1164
1168
  var ALPHA_NUM_CHARS = [
1165
1169
  "0",
@@ -1236,9 +1240,9 @@ var require_alphanumeric_data = __commonJS({
1236
1240
  }
1237
1241
  });
1238
1242
 
1239
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/byte-data.js
1243
+ // node_modules/qrcode/lib/core/byte-data.js
1240
1244
  var require_byte_data = __commonJS({
1241
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/byte-data.js"(exports, module2) {
1245
+ "node_modules/qrcode/lib/core/byte-data.js"(exports, module2) {
1242
1246
  var Mode = require_mode();
1243
1247
  function ByteData(data) {
1244
1248
  this.mode = Mode.BYTE;
@@ -1266,9 +1270,9 @@ var require_byte_data = __commonJS({
1266
1270
  }
1267
1271
  });
1268
1272
 
1269
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/kanji-data.js
1273
+ // node_modules/qrcode/lib/core/kanji-data.js
1270
1274
  var require_kanji_data = __commonJS({
1271
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/kanji-data.js"(exports, module2) {
1275
+ "node_modules/qrcode/lib/core/kanji-data.js"(exports, module2) {
1272
1276
  var Mode = require_mode();
1273
1277
  var Utils = require_utils();
1274
1278
  function KanjiData(data) {
@@ -1305,9 +1309,9 @@ var require_kanji_data = __commonJS({
1305
1309
  }
1306
1310
  });
1307
1311
 
1308
- // .devdeps/node_modules/.pnpm/dijkstrajs@1.0.3/node_modules/dijkstrajs/dijkstra.js
1312
+ // node_modules/dijkstrajs/dijkstra.js
1309
1313
  var require_dijkstra = __commonJS({
1310
- ".devdeps/node_modules/.pnpm/dijkstrajs@1.0.3/node_modules/dijkstrajs/dijkstra.js"(exports, module2) {
1314
+ "node_modules/dijkstrajs/dijkstra.js"(exports, module2) {
1311
1315
  "use strict";
1312
1316
  var dijkstra = {
1313
1317
  single_source_shortest_paths: function(graph, s, d) {
@@ -1406,9 +1410,9 @@ var require_dijkstra = __commonJS({
1406
1410
  }
1407
1411
  });
1408
1412
 
1409
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/segments.js
1413
+ // node_modules/qrcode/lib/core/segments.js
1410
1414
  var require_segments = __commonJS({
1411
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/segments.js"(exports) {
1415
+ "node_modules/qrcode/lib/core/segments.js"(exports) {
1412
1416
  var Mode = require_mode();
1413
1417
  var NumericData = require_numeric_data();
1414
1418
  var AlphanumericData = require_alphanumeric_data();
@@ -1592,9 +1596,9 @@ var require_segments = __commonJS({
1592
1596
  }
1593
1597
  });
1594
1598
 
1595
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/qrcode.js
1599
+ // node_modules/qrcode/lib/core/qrcode.js
1596
1600
  var require_qrcode = __commonJS({
1597
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/qrcode.js"(exports) {
1601
+ "node_modules/qrcode/lib/core/qrcode.js"(exports) {
1598
1602
  var Utils = require_utils();
1599
1603
  var ECLevel = require_error_correction_level();
1600
1604
  var BitBuffer = require_bit_buffer();
@@ -1853,9 +1857,9 @@ var require_qrcode = __commonJS({
1853
1857
  }
1854
1858
  });
1855
1859
 
1856
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.js
1860
+ // node_modules/qrcode/lib/renderer/utils.js
1857
1861
  var require_utils2 = __commonJS({
1858
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.js"(exports) {
1862
+ "node_modules/qrcode/lib/renderer/utils.js"(exports) {
1859
1863
  function hex2rgba(hex) {
1860
1864
  if (typeof hex === "number") {
1861
1865
  hex = hex.toString();
@@ -1933,9 +1937,9 @@ var require_utils2 = __commonJS({
1933
1937
  }
1934
1938
  });
1935
1939
 
1936
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/canvas.js
1940
+ // node_modules/qrcode/lib/renderer/canvas.js
1937
1941
  var require_canvas = __commonJS({
1938
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/canvas.js"(exports) {
1942
+ "node_modules/qrcode/lib/renderer/canvas.js"(exports) {
1939
1943
  var Utils = require_utils2();
1940
1944
  function clearCanvas(ctx, canvas, size) {
1941
1945
  ctx.clearRect(0, 0, canvas.width, canvas.height);
@@ -1986,9 +1990,9 @@ var require_canvas = __commonJS({
1986
1990
  }
1987
1991
  });
1988
1992
 
1989
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/svg-tag.js
1993
+ // node_modules/qrcode/lib/renderer/svg-tag.js
1990
1994
  var require_svg_tag = __commonJS({
1991
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/svg-tag.js"(exports) {
1995
+ "node_modules/qrcode/lib/renderer/svg-tag.js"(exports) {
1992
1996
  var Utils = require_utils2();
1993
1997
  function getColorAttrib(color, attrib) {
1994
1998
  const alpha = color.a / 255;
@@ -2044,9 +2048,9 @@ var require_svg_tag = __commonJS({
2044
2048
  }
2045
2049
  });
2046
2050
 
2047
- // .devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/browser.js
2051
+ // node_modules/qrcode/lib/browser.js
2048
2052
  var require_browser = __commonJS({
2049
- ".devdeps/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/browser.js"(exports) {
2053
+ "node_modules/qrcode/lib/browser.js"(exports) {
2050
2054
  var canPromise = require_can_promise();
2051
2055
  var QRCode2 = require_qrcode();
2052
2056
  var CanvasRenderer = require_canvas();
@@ -2122,7 +2126,7 @@ __export(client_exports, {
2122
2126
  inject: () => inject
2123
2127
  });
2124
2128
  module.exports = __toCommonJS(client_exports);
2125
- var import_react22 = __toESM(require("react"), 1);
2129
+ var import_react24 = __toESM(require("react"), 1);
2126
2130
 
2127
2131
  // src/shared.js
2128
2132
  var import_react = __toESM(require("react"), 1);
@@ -11177,6 +11181,11 @@ function RemoteCard() {
11177
11181
  busy === "stop" ? "\u6B63\u5728\u5173\u95ED\u2026" : "\u5173\u95ED\u8FDC\u7A0B\u8BBF\u95EE"
11178
11182
  ] })
11179
11183
  ] }),
11184
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("small", { children: [
11185
+ "\u5DF2\u767B\u5F55\u8BBE\u5907\uFF1A",
11186
+ typeof lan.devices === "number" ? lan.devices : 0,
11187
+ " \u53F0\uFF08\u6539\u5BC6\u6216\u5173\u95ED\u5165\u53E3\u5373\u5168\u90E8\u4E0B\u7EBF\uFF09"
11188
+ ] }),
11180
11189
  /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("small", { children: "\u4E3B\u5B9E\u4F8B\u4FDD\u6301\u4EC5\u672C\u673A\uFF08\u7ED3\u6784\u4E0A\u4E0D\u5B58\u5728\u514D\u767B\u5F55\u76F4\u8FDE\uFF09\uFF1B\u8D26\u53F7\u5BC6\u7801\u53EA\u53D1\u7ED9\u81EA\u5DF1\u3002\u82E5\u5F00\u542F\u524D\u5DF2\u6709\u65E7\u670D\u52A1\u5668\u6A21\u5F0F\uFF080.0.0.0\uFF09\u914D\u7F6E\uFF0C\u4F1A\u4E00\u5E76\u79FB\u9664\u5E76\u63D0\u793A\u91CD\u542F\u3002" })
11181
11190
  ] })
11182
11191
  ] }) }) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("button", { type: "button", className: "dmr-primary", onClick: enable, disabled: busy === "start", children: busy === "start" ? "\u6B63\u5728\u5F00\u542F\u2026" : /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
@@ -11215,10 +11224,44 @@ function MobileRelayView() {
11215
11224
  function MobileRelayOverlay() {
11216
11225
  (0, import_react21.useEffect)(() => {
11217
11226
  if (typeof window === "undefined" || typeof document === "undefined") return void 0;
11218
- const hostPresent = !!(window.__dshDockMobileDrawer && document.querySelector(".dsh-mobile-drawer-btn"));
11227
+ const host = window.location && window.location.hostname || "";
11228
+ const loopback = host === "127.0.0.1" || host === "localhost" || host === "::1" || host.endsWith(".localhost");
11229
+ if (loopback) return void 0;
11230
+ if (typeof MutationObserver === "undefined") return void 0;
11231
+ let done = false;
11232
+ const tryDismiss = () => {
11233
+ if (done) return;
11234
+ const dialogs = document.querySelectorAll('[role="dialog"]');
11235
+ for (const dialog of dialogs) {
11236
+ const text = dialog.textContent || "";
11237
+ if (!/预览版说明|Preview Notice/.test(text)) continue;
11238
+ const btn = [...dialog.querySelectorAll("button")].find((b) => {
11239
+ const t = (b.textContent || "").trim();
11240
+ return t === "\u7EE7\u7EED" || t === "Continue";
11241
+ });
11242
+ if (btn) {
11243
+ done = true;
11244
+ btn.click();
11245
+ observer.disconnect();
11246
+ }
11247
+ break;
11248
+ }
11249
+ };
11250
+ const observer = new MutationObserver(tryDismiss);
11251
+ observer.observe(document.body, { childList: true, subtree: true });
11252
+ tryDismiss();
11253
+ const stopTimer = setTimeout(() => observer.disconnect(), 6e4);
11254
+ return () => {
11255
+ clearTimeout(stopTimer);
11256
+ observer.disconnect();
11257
+ };
11258
+ }, []);
11259
+ (0, import_react21.useEffect)(() => {
11260
+ if (typeof window === "undefined" || typeof document === "undefined") return void 0;
11219
11261
  const mq = window.matchMedia ? window.matchMedia("(max-width:700px)") : null;
11220
11262
  if (!mq) return void 0;
11221
- if (!hostPresent) window.__dshDockMobileDrawer = "client";
11263
+ if (window.__dshDockMobileDrawer === "host") return void 0;
11264
+ window.__dshDockMobileDrawer = "client";
11222
11265
  const narrow = () => mq.matches;
11223
11266
  const frameEl = () => document.querySelector('[class$="frame"]');
11224
11267
  const sidebarCollapsed = () => {
@@ -11226,6 +11269,7 @@ function MobileRelayOverlay() {
11226
11269
  return !!f && f.hasAttribute("data-sidebar-collapsed");
11227
11270
  };
11228
11271
  const dialogOpen = () => !!document.querySelector('[role="dialog"][class*="panel"]');
11272
+ const rightOpen = () => !!document.querySelector("[data-sidebar-right-panel][data-sidebar-right-open]");
11229
11273
  const collapse = () => {
11230
11274
  const b = document.querySelector('button[aria-label="\u6536\u8D77\u4FA7\u8FB9\u680F"],button[aria-label="Collapse sidebar"]');
11231
11275
  if (b) b.click();
@@ -11235,28 +11279,20 @@ function MobileRelayOverlay() {
11235
11279
  if (b) b.click();
11236
11280
  };
11237
11281
  const closeDetails = () => {
11238
- const d = document.querySelector('[class*="detailsCol"]');
11239
- if (!d || !d.getBoundingClientRect().width) return;
11240
- const c = d.querySelector('button[aria-label="\u5173\u95ED\u8BE6\u60C5"]');
11241
- if (c) c.click();
11242
- };
11243
- let fab = null;
11244
- let scrim = null;
11245
- if (!hostPresent) {
11246
- fab = document.createElement("button");
11247
- fab.type = "button";
11248
- fab.className = "dsh-mobile-drawer-btn";
11249
- fab.setAttribute("aria-label", "\u6253\u5F00\u4F1A\u8BDD\u5217\u8868");
11250
- fab.innerHTML = '<svg viewBox="0 0 24 24"><path d="M4 7h16M4 12h16M4 17h10"/></svg>';
11251
- fab.addEventListener("click", expand);
11252
- scrim = document.createElement("div");
11253
- scrim.className = "dsh-mobile-scrim";
11254
- document.body.appendChild(fab);
11255
- document.body.appendChild(scrim);
11256
- }
11282
+ const panel = document.querySelector("[data-sidebar-right-panel][data-sidebar-right-open]");
11283
+ if (!panel) return;
11284
+ const toggle = panel.querySelector("[data-sidebar-right-toggle]");
11285
+ if (toggle) toggle.click();
11286
+ };
11287
+ const scrim = document.createElement("div");
11288
+ scrim.className = "dsh-mobile-scrim";
11289
+ document.body.appendChild(scrim);
11290
+ document.querySelectorAll(".dsh-mobile-tabbar").forEach((el) => el.remove());
11257
11291
  const tabbar = document.createElement("nav");
11258
11292
  tabbar.className = "dsh-mobile-tabbar";
11259
11293
  tabbar.setAttribute("aria-label", "\u5E95\u90E8\u5BFC\u822A");
11294
+ let tasksActive = 0;
11295
+ let tasksWaiting = 0;
11260
11296
  const tabDefs = [
11261
11297
  {
11262
11298
  id: "sessions",
@@ -11266,11 +11302,10 @@ function MobileRelayOverlay() {
11266
11302
  },
11267
11303
  {
11268
11304
  id: "dock",
11269
- label: "\u529F\u80FD\u575E",
11305
+ label: "\u63D2\u4EF6",
11270
11306
  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>',
11271
11307
  act: () => {
11272
- if (panelNav.open) setPanelOpen(false);
11273
- else openPanel("home");
11308
+ openPanel(tasksActive > 0 || tasksWaiting > 0 ? "runstate" : "home");
11274
11309
  }
11275
11310
  },
11276
11311
  {
@@ -11283,6 +11318,7 @@ function MobileRelayOverlay() {
11283
11318
  }
11284
11319
  }
11285
11320
  ];
11321
+ let tasksBadge = null;
11286
11322
  const tabButtons = tabDefs.map((def) => {
11287
11323
  const b = document.createElement("button");
11288
11324
  b.type = "button";
@@ -11290,6 +11326,12 @@ function MobileRelayOverlay() {
11290
11326
  b.dataset.tab = def.id;
11291
11327
  b.innerHTML = def.icon + "<span>" + def.label + "</span>";
11292
11328
  b.addEventListener("click", () => def.act());
11329
+ if (def.id === "dock") {
11330
+ tasksBadge = document.createElement("span");
11331
+ tasksBadge.className = "dsh-mobile-tab-badge";
11332
+ tasksBadge.style.display = "none";
11333
+ b.appendChild(tasksBadge);
11334
+ }
11293
11335
  tabbar.appendChild(b);
11294
11336
  return b;
11295
11337
  });
@@ -11304,74 +11346,115 @@ function MobileRelayOverlay() {
11304
11346
  }
11305
11347
  };
11306
11348
  const unsubPanel = subscribePanel(syncTabs);
11307
- const place = () => {
11308
- if (!fab) return;
11309
- const vh = window.innerHeight;
11310
- let top = null;
11311
- const g = document.querySelector(".dgfab");
11312
- if (g && !g.classList.contains("dgfab-hide") && g.getBoundingClientRect) {
11313
- const r = g.getBoundingClientRect();
11314
- if (r && r.height > 0 && r.top > 0) {
11315
- top = r.top - fab.offsetHeight - 8;
11316
- if (top < 64) top = r.bottom + 8;
11317
- if (top + fab.offsetHeight > vh - 16) top = null;
11349
+ let runstateGone = false;
11350
+ const pollTasks = () => {
11351
+ if (runstateGone || !tasksBadge || !narrow() || document.visibilityState === "hidden" || !tabbar.isConnected) return;
11352
+ fetch("/dsh-dock/runstate/status", {
11353
+ method: "POST",
11354
+ headers: { "content-type": "application/json" },
11355
+ body: "{}"
11356
+ }).then(async (res) => {
11357
+ if (res.status === 404 || res.status === 405) {
11358
+ runstateGone = true;
11359
+ tasksActive = 0;
11360
+ tasksWaiting = 0;
11361
+ tasksBadge.style.display = "none";
11362
+ return null;
11318
11363
  }
11319
- }
11320
- if (top == null) top = Math.round(vh * 0.38);
11321
- fab.style.top = top + "px";
11364
+ const body = await res.json().catch(() => null);
11365
+ if (!body) return null;
11366
+ const active = body.data && body.data.active || [];
11367
+ const waiting = active.filter((t) => t.approvals && t.approvals.length).length;
11368
+ tasksActive = active.length;
11369
+ tasksWaiting = waiting;
11370
+ if (waiting > 0) {
11371
+ tasksBadge.textContent = String(waiting);
11372
+ tasksBadge.className = "dsh-mobile-tab-badge wait";
11373
+ tasksBadge.style.display = "";
11374
+ } else if (active.length > 0) {
11375
+ tasksBadge.textContent = String(active.length);
11376
+ tasksBadge.className = "dsh-mobile-tab-badge";
11377
+ tasksBadge.style.display = "";
11378
+ } else {
11379
+ tasksBadge.style.display = "none";
11380
+ }
11381
+ }).catch(() => {
11382
+ });
11383
+ };
11384
+ const tasksTimer = setInterval(pollTasks, 3e3);
11385
+ const vv = window.visualViewport || null;
11386
+ const kbdSync = () => {
11387
+ if (!vv) return;
11388
+ const kbd = vv.height > 0 && window.innerHeight - vv.height > 120;
11389
+ document.documentElement.classList.toggle("dsh-dock-kbd", kbd);
11322
11390
  };
11323
11391
  const sync = () => {
11392
+ kbdSync();
11393
+ document.querySelectorAll(".dsh-mobile-tabbar").forEach((el) => {
11394
+ if (el !== tabbar) el.remove();
11395
+ });
11324
11396
  const on = narrow() && !!frameEl() && !dialogOpen();
11325
11397
  const collapsed = sidebarCollapsed();
11326
- if (fab) {
11327
- const showFab = on && collapsed && !panelNav.open;
11328
- fab.style.display = showFab ? "" : "none";
11329
- if (showFab) place();
11330
- }
11398
+ const right = rightOpen();
11331
11399
  if (scrim) scrim.style.display = on && !collapsed ? "" : "none";
11332
- tabbar.style.display = narrow() && !!frameEl() && !panelNav.open ? "" : "none";
11400
+ tabbar.style.display = narrow() && !!frameEl() && !panelNav.open && !right ? "" : "none";
11333
11401
  syncTabs();
11334
11402
  };
11335
11403
  sync();
11404
+ pollTasks();
11336
11405
  const observer = typeof MutationObserver !== "undefined" ? new MutationObserver(sync) : null;
11337
11406
  if (observer) observer.observe(document.documentElement, { attributes: true, attributeFilter: ["data-sidebar-collapsed"], subtree: true });
11338
11407
  const timer = setInterval(sync, 1500);
11339
11408
  const onMq = () => sync();
11340
11409
  if (mq.addEventListener) mq.addEventListener("change", onMq);
11341
11410
  else if (mq.addListener) mq.addListener(onMq);
11342
- window.addEventListener("resize", place);
11411
+ window.addEventListener("resize", kbdSync);
11412
+ if (vv && vv.addEventListener) vv.addEventListener("resize", kbdSync);
11413
+ const onVisible = () => {
11414
+ if (document.visibilityState === "visible") pollTasks();
11415
+ };
11416
+ document.addEventListener("visibilitychange", onVisible);
11343
11417
  const onClick = (e) => {
11344
11418
  if (!narrow()) return;
11345
11419
  const t = e.target;
11346
11420
  if (!t || !t.closest) return;
11347
- if (t.closest(".dsh-mobile-drawer-btn") || t.closest(".dsh-mobile-tabbar")) return;
11421
+ if (t.closest(".dsh-mobile-tabbar")) return;
11348
11422
  const expanded = !!document.querySelector('button[aria-label="\u6536\u8D77\u4FA7\u8FB9\u680F"],button[aria-label="Collapse sidebar"]');
11349
11423
  const col = document.querySelector('[class*="sidebarCol"]');
11350
11424
  const inSidebar = col && col.contains(t);
11351
11425
  if (!expanded && !inSidebar) return;
11352
11426
  if (inSidebar) {
11353
11427
  const row = t.closest('[role="treeitem"]');
11354
- const leaf = row && !row.querySelector('[role="treeitem"]') && row.closest('[role="tree"]');
11428
+ const rowKey = row && row.getAttribute("data-row-key") || "";
11429
+ const sessionRow = rowKey && rowKey.startsWith("session:") || row && !rowKey && !row.querySelector('[role="treeitem"]') && row.closest('[role="tree"]');
11355
11430
  const fresh = t.closest('[class*="newSession"]');
11356
- if (leaf || fresh) setTimeout(() => {
11431
+ if (sessionRow || fresh) setTimeout(() => {
11357
11432
  collapse();
11358
11433
  closeDetails();
11359
11434
  }, 300);
11435
+ else {
11436
+ setTimeout(() => {
11437
+ if (document.querySelector('[role="dialog"]')) collapse();
11438
+ }, 260);
11439
+ }
11360
11440
  return;
11361
11441
  }
11362
- if (t.closest('[role="dialog"],[class*="dockm"],[class*="dgfab"],[class*="dgwin"],[class*="dgame"],[class*="detailsCol"]')) return;
11442
+ if (t.closest('[role="dialog"],[class*="dockm"],[class*="dgfab"],[class*="dgwin"],[class*="dgame"],[data-sidebar-right-panel]')) return;
11363
11443
  collapse();
11364
11444
  };
11365
- if (!hostPresent) document.addEventListener("click", onClick, true);
11445
+ document.addEventListener("click", onClick, true);
11366
11446
  return () => {
11367
- if (!hostPresent) document.removeEventListener("click", onClick, true);
11447
+ document.removeEventListener("click", onClick, true);
11368
11448
  if (observer) observer.disconnect();
11369
11449
  clearInterval(timer);
11450
+ clearInterval(tasksTimer);
11370
11451
  unsubPanel();
11371
11452
  if (mq.removeEventListener) mq.removeEventListener("change", onMq);
11372
11453
  else if (mq.removeListener) mq.removeListener(onMq);
11373
- window.removeEventListener("resize", place);
11374
- if (fab) fab.remove();
11454
+ window.removeEventListener("resize", kbdSync);
11455
+ if (vv && vv.removeEventListener) vv.removeEventListener("resize", kbdSync);
11456
+ document.removeEventListener("visibilitychange", onVisible);
11457
+ document.documentElement.classList.remove("dsh-dock-kbd");
11375
11458
  if (scrim) scrim.remove();
11376
11459
  tabbar.remove();
11377
11460
  if (window.__dshDockMobileDrawer === "client") delete window.__dshDockMobileDrawer;
@@ -11382,10 +11465,16 @@ function MobileRelayOverlay() {
11382
11465
  function MobileRelayHomeStat() {
11383
11466
  const [summary, setSummary] = (0, import_react21.useState)("\u672A\u5F00\u542F\uFF0C\u5F00\u542F\u540E\u53EF\u8FDC\u7A0B\u767B\u5F55");
11384
11467
  (0, import_react21.useEffect)(() => {
11385
- rpc("lan").then((data) => {
11386
- setSummary(data.gatewayActive ? "\u5165\u53E3\u8FD0\u884C\u4E2D \xB7 \u7AEF\u53E3 " + data.gatewayPort : data.accountSet ? "\u8D26\u53F7\u5DF2\u8BBE\u7F6E\uFF0C\u5165\u53E3\u672A\u5F00\u542F" : "\u672A\u5F00\u542F\uFF0C\u5F00\u542F\u540E\u53EF\u8FDC\u7A0B\u767B\u5F55");
11387
- }).catch(() => {
11388
- });
11468
+ const refresh = () => {
11469
+ rpc("lan").then((data) => {
11470
+ const devices = typeof data.devices === "number" && data.devices > 0 ? " \xB7 " + data.devices + " \u53F0\u8BBE\u5907\u5728\u7EBF" : "";
11471
+ setSummary(data.gatewayActive ? "\u5165\u53E3\u8FD0\u884C\u4E2D \xB7 \u7AEF\u53E3 " + data.gatewayPort + devices : data.accountSet ? "\u8D26\u53F7\u5DF2\u8BBE\u7F6E\uFF0C\u5165\u53E3\u672A\u5F00\u542F" : "\u672A\u5F00\u542F\uFF0C\u5F00\u542F\u540E\u53EF\u8FDC\u7A0B\u767B\u5F55");
11472
+ }).catch(() => {
11473
+ });
11474
+ };
11475
+ refresh();
11476
+ const timer = setInterval(refresh, 1e4);
11477
+ return () => clearInterval(timer);
11389
11478
  }, []);
11390
11479
  return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { children: summary });
11391
11480
  }
@@ -11398,9 +11487,9 @@ var feature10 = {
11398
11487
  defaultEnabled: false,
11399
11488
  css: `
11400
11489
  .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)}
11401
- /* \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
11402
- * z \u5E8F 70 < \u906E\u7F69 75 < \u4FA7\u680F 80 < overlayLayer 90\uFF0C\u9762\u677F/\u5F39\u7A97\u6253\u5F00\u65F6\u81EA\u7136\u88AB\u76D6\u3002 */
11403
- @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}
11490
+ /* \u62BD\u5C49\u906E\u7F69\uFF1A\u4FA7\u680F\u6D6E\u5C42\u5C55\u5F00\u65F6\u76D6\u4F4F\u9875\u9762\u3002\u5DE6\u7F18\u6D6E\u52A8\u300C\u62BD\u5C49\u628A\u624B\u300D\u5DF2\u79FB\u9664\u2014\u2014\u4F1A\u8BDD\u5165\u53E3
11491
+ * \u7EDF\u4E00\u8D70\u5E95\u90E8 Tab \u680F\u300C\u4F1A\u8BDD\u300D\u9875\u7B7E\uFF0C\u628A\u624B\u60AC\u6D6E\u5728\u5185\u5BB9\u4E0A\u8FD8\u538B\u8FC7\u8F93\u5165\u533A\uFF08\u7528\u6237\u5B9E\u6D4B\uFF09\u3002 */
11492
+ @media (max-width:700px){.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}
11404
11493
  /* ---- \u4EFF ZCode \u624B\u673A\u7AEF\uFF1A\u5E95\u90E8 Tab \u680F + \u8F93\u5165\u533A\u5438\u9644\u5E95\u90E8 ---- */
11405
11494
  .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}
11406
11495
  .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}
@@ -11408,25 +11497,335 @@ var feature10 = {
11408
11497
  .dsh-mobile-tab.on{color:var(--dsw-alias-label-primary,#e6eaf2)}
11409
11498
  .dsh-mobile-tab.on svg{color:var(--dk-accent,#4d9fff)}
11410
11499
  .dsh-mobile-tab:active{transform:scale(.94)}
11500
+ /* \u300C\u4EFB\u52A1\u300D\u9875\u7B7E\u89D2\u6807\uFF1A\u8FDB\u884C\u4E2D=\u84DD\uFF08\u6570\u91CF\uFF09\uFF0C\u7B49\u5F85\u786E\u8BA4=\u7EA2\uFF08\u6570\u91CF+\u8109\u51B2\uFF09\u2014\u2014\u63A5\u529B\u573A\u666F\u91CC
11501
+ * \u7B49\u5F85\u786E\u8BA4\u662F\u6700\u9700\u8981\u4EBA\u4ECB\u5165\u7684\u72B6\u6001\uFF0C\u4E00\u773C\u53EF\u89C1\uFF1B\u6570\u636E\u6765\u81EA runstate \u5BBF\u4E3B\u8DEF\u7531\u4F4E\u9891\u8F6E\u8BE2\u3002 */
11502
+ .dsh-mobile-tab{position:relative}
11503
+ .dsh-mobile-tab-badge{position:absolute;top:0;right:calc(50% - 26px);box-sizing:border-box;min-width:16px;height:16px;padding:0 4px;border-radius:9px;display:flex;align-items:center;justify-content:center;background:#4d9fff;color:#fff;font-size:10px;font-weight:700;line-height:1;font-variant-numeric:tabular-nums;box-shadow:0 2px 8px rgba(0,0,0,.35);pointer-events:none}
11504
+ .dsh-mobile-tab-badge.wait{background:#ef4444;animation:dsh-badge-pulse 1.2s ease-in-out infinite}
11505
+ @keyframes dsh-badge-pulse{0%,100%{transform:scale(1)}50%{transform:scale(1.18)}}
11506
+ @media (prefers-reduced-motion:reduce){.dsh-mobile-tab-badge.wait{animation:none}}
11411
11507
  /* \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
11412
- * \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
11413
- * \u6EDA\u52A8\u4F53\u7559\u51FA Tab \u680F\u9AD8\u5EA6\u7684\u5185\u8FB9\u8DDD\uFF0C\u907F\u514D\u5185\u5BB9\u88AB Tab \u680F\u906E\u6321\u3002 */
11414
- [class*="scrollBody"]{justify-content:flex-end !important;padding-bottom:calc(72px + env(safe-area-inset-bottom,0px)) !important}
11415
- [class*="scrollBody"]>[class*="composerSeat"]{padding-bottom:6px}
11508
+ * \u624B\u673A\u89C6\u53E3\u4E0B\u8F93\u5165\u5361\u7247\u60AC\u5728\u4E2D\u90E8\u3001\u4E0B\u65B9\u7559\u51FA\u5927\u7247\u7A7A\u767D\u3002\u6539\u7528\u300C\u8F93\u5165\u533A margin-top:auto\u300D
11509
+ * \u8D34\u5E95\uFF0C\u5E76\u7ED9\u6EDA\u52A8\u4F53\u7559\u51FA Tab \u680F\u9AD8\u5EA6\u7684\u5185\u8FB9\u8DDD\uFF0C\u907F\u514D\u5185\u5BB9\u88AB Tab \u680F\u906E\u6321\u3002
11510
+ * \u26A0\uFE0F \u7EDD\u4E0D\u80FD\u7ED9\u6EDA\u52A8\u4F53\u52A0 justify-content:flex-end/center \u8D34\u5E95\uFF1A\u5185\u5BB9\u4F1A\u88AB\u6324\u5230\u6EDA\u52A8\u4F53
11511
+ * \u8D77\u70B9\u4E4B\u5916\uFF0CChrome \u4E0D\u628A\u8D77\u70B9\u65B9\u5411\u6EA2\u51FA\u7B97\u8FDB scrollHeight\uFF08\u624B\u673A\u89C6\u53E3\u5B9E\u6D4B
11512
+ * scrollHeight==clientHeight\u3001maxScroll==0\uFF09\uFF0C\u4F1A\u8BDD\u8BB0\u5F55\u5F7B\u5E95\u6EDA\u4E0D\u52A8\u3001\u9996\u6761\u6D88\u606F\u6C38\u8FDC
11513
+ * \u770B\u4E0D\u5230\u3002\u5BBF\u4E3B\u534A\u90E8\u65E7\u7248\u6CE8\u5165\u91CC\u8FD8\u7559\u7740\u90A3\u6761 flex-end\uFF08\u8981\u91CD\u542F dsh web \u624D\u6D88\u5931\uFF09\uFF0C\u8FD9\u91CC
11514
+ * \u7528\u66F4\u9AD8\u4F18\u5148\u7EA7\u7684\u9009\u62E9\u5668\u663E\u5F0F\u590D\u4F4D\uFF1A\u5237\u65B0\u9875\u9762\u5373\u4FEE\u597D\uFF0C\u4E0D\u5FC5\u7B49\u91CD\u542F\u3002 */
11515
+ [class*="scrollBody"][data-conversation-scroll]{justify-content:flex-start !important;padding-bottom:calc(72px + env(safe-area-inset-bottom,0px)) !important}
11516
+ [class*="scrollBody"]{padding-bottom:calc(72px + env(safe-area-inset-bottom,0px)) !important}
11517
+ [class*="scrollBody"]>[class*="composerSeat"]{margin-top:auto;padding-bottom:6px}
11518
+ /* \u8F93\u5165\u533A\u5DE5\u5177\u884C\u4E0A\u7684 dsh-dock chip\uFF08\u7528\u91CF/\u4F59\u989D\uFF09\uFF1A\u7A84\u5C4F\u4E0B 28cqw \u7684\u5BBD\u5EA6\u4E0A\u9650\u628A\u5B83\u4EEC\u6324\u6210
11519
+ * \u300C\u2026\u300D\u300C\u4F59..\u300D\uFF08\u624B\u673A\u5B9E\u6D4B\uFF09\uFF0C\u65E2\u8BFB\u4E0D\u51FA\u6570\u503C\u53C8\u767D\u5360\u8F93\u5165\u884C\u7A7A\u95F4\u3002\u624B\u673A\u7AEF\u6574\u7EC4\u6536\u8D77\uFF0C\u6570\u503C\u5728
11520
+ * \u5E95\u90E8\u300C\u529F\u80FD\u575E\u300D\u91CC\u770B\uFF08\u7528\u91CF/\u4F59\u989D\u9875\u4FE1\u606F\u66F4\u5168\uFF09\uFF1B\u684C\u9762\u7AEF\u4E0D\u52A8\u3002 */
11521
+ .dockchip-row{display:none}
11416
11522
  /* \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
11417
11523
  * \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
11418
11524
  * \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 */
11419
11525
  [class*="sidebarCol"]:has([class*="collapsed"]){visibility:hidden}
11420
- /* \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 */
11421
- .dsh-mobile-drawer-btn{top:auto !important;bottom:calc(96px + env(safe-area-inset-bottom,0px))}}`,
11526
+ /* \u8F6F\u952E\u76D8\u5F39\u51FA\uFF08visualViewport \u5224\u5B9A\uFF0C\u6302 html.dsh-dock-kbd\uFF09\uFF1ATab \u680F\u6574\u4F53\u8BA9\u4F4D\uFF08\u6253\u5B57\u65F6
11527
+ * \u5B83\u53EA\u4F1A\u6324\u5360\u952E\u76D8\u4E0A\u65B9\u7684\u4E00\u7EBF\u7A7A\u95F4\uFF09\uFF0C\u6EDA\u52A8\u4F53\u7559\u767D\u6536\u7A84\u3002\u9009\u62E9\u5668\u7279\u5F02\u6027\u9AD8\u4E8E\u4E0A\u9762\u7684 72px
11528
+ * \u7559\u767D\u89C4\u5219\uFF0C\u80FD\u538B\u8FC7\u53BB\u3002\u5BBF\u4E3B\u63A5\u7BA1\u671F\u95F4\u7531\u5BBF\u4E3B\u811A\u672C\u540C\u6B65\u7F6E/\u6458\u8FD9\u4E2A\u7C7B\u3002 */
11529
+ html.dsh-dock-kbd .dsh-mobile-tabbar{display:none !important}
11530
+ html.dsh-dock-kbd [class*="scrollBody"]{padding-bottom:12px !important}
11531
+ /* \u529F\u80FD\u575E\u9762\u677F\u5728\u624B\u673A\u7AEF\u62AC\u5230\u539F\u751F\u5F39\u5C42\u4E4B\u4E0A\uFF1A\u4ECE\u4FA7\u680F\u8FDB\u7684\u5B98\u65B9\u63D2\u4EF6\u7BA1\u7406\u9875\u7B49\u539F\u751F\u5F39\u5C42 z \u5E8F\u9AD8\u4E8E
11532
+ * \u9762\u677F\u9ED8\u8BA4\u7684 200\uFF0C\u529F\u80FD\u575E\u5F00\u5728\u4E0B\u9762\u4F1A\u88AB\u76D6\u4F4F\u2014\u2014\u300C\u63D2\u4EF6\u300D\u9875\u7B7E\u70B9\u4E86\u50CF\u6CA1\u53CD\u5E94/\u9732\u51FA\u539F\u9875\u9762\u3002 */
11533
+ [class*="dockm-backdrop"]{z-index:2000 !important}}`,
11422
11534
  View: MobileRelayView,
11423
11535
  HomeStat: MobileRelayHomeStat,
11424
11536
  Overlay: MobileRelayOverlay
11425
11537
  };
11426
11538
 
11539
+ // features/mobile/view.js
11540
+ var import_react22 = __toESM(require("react"), 1);
11541
+ var import_react23 = require("react");
11542
+ var MOBILE_QUERY_NARROW = "(max-width: 820px)";
11543
+ var MOBILE_QUERY_COARSE = "(pointer: coarse) and (hover: none)";
11544
+ var MOBILE_STORE_KEY = "dsh-dock/mobile/v1";
11545
+ var mobilePref = { floating: true };
11546
+ try {
11547
+ if (typeof localStorage !== "undefined") {
11548
+ const raw = localStorage.getItem(MOBILE_STORE_KEY);
11549
+ const obj = raw ? JSON.parse(raw) : null;
11550
+ if (obj && typeof obj === "object" && typeof obj.floating === "boolean") mobilePref.floating = obj.floating;
11551
+ }
11552
+ } catch {
11553
+ }
11554
+ var prefListeners = /* @__PURE__ */ new Set();
11555
+ function notifyPref() {
11556
+ for (const fn of prefListeners) {
11557
+ try {
11558
+ fn();
11559
+ } catch {
11560
+ }
11561
+ }
11562
+ }
11563
+ function floatingShown() {
11564
+ return mobilePref.floating !== false;
11565
+ }
11566
+ function setFloatingShown(value) {
11567
+ mobilePref.floating = value !== false;
11568
+ try {
11569
+ if (typeof localStorage !== "undefined") localStorage.setItem(MOBILE_STORE_KEY, JSON.stringify(mobilePref));
11570
+ } catch {
11571
+ }
11572
+ notifyPref();
11573
+ }
11574
+ function subscribePref(fn) {
11575
+ prefListeners.add(fn);
11576
+ return () => {
11577
+ prefListeners.delete(fn);
11578
+ };
11579
+ }
11580
+ function mobileActive() {
11581
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") return false;
11582
+ try {
11583
+ return window.matchMedia(MOBILE_QUERY_NARROW).matches || window.matchMedia(MOBILE_QUERY_COARSE).matches;
11584
+ } catch {
11585
+ return false;
11586
+ }
11587
+ }
11588
+ function MobileOverlay(props) {
11589
+ const ctx = props && props.ctx;
11590
+ const [active, setActive] = (0, import_react23.useState)(() => mobileActive());
11591
+ const [floating, setFloating] = (0, import_react23.useState)(() => floatingShown());
11592
+ (0, import_react23.useEffect)(() => {
11593
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") return void 0;
11594
+ let mqs = [];
11595
+ try {
11596
+ mqs = [window.matchMedia(MOBILE_QUERY_NARROW), window.matchMedia(MOBILE_QUERY_COARSE)];
11597
+ } catch {
11598
+ return void 0;
11599
+ }
11600
+ const update = () => setActive(mqs.some((mq) => mq.matches));
11601
+ update();
11602
+ for (const mq of mqs) {
11603
+ if (typeof mq.addEventListener === "function") mq.addEventListener("change", update);
11604
+ else if (typeof mq.addListener === "function") mq.addListener(update);
11605
+ }
11606
+ return () => {
11607
+ for (const mq of mqs) {
11608
+ if (typeof mq.removeEventListener === "function") mq.removeEventListener("change", update);
11609
+ else if (typeof mq.removeListener === "function") mq.removeListener(update);
11610
+ }
11611
+ };
11612
+ }, []);
11613
+ (0, import_react23.useEffect)(() => {
11614
+ if (typeof document === "undefined") return void 0;
11615
+ if (active) {
11616
+ document.body.setAttribute("data-dk-mobile", "1");
11617
+ try {
11618
+ const meta = document.querySelector('meta[name="viewport"]');
11619
+ if (meta && !/(^|,)\s*viewport-fit\s*=/.test(meta.content || "")) {
11620
+ meta.setAttribute("content", (meta.content || "width=device-width, initial-scale=1") + ", viewport-fit=cover");
11621
+ }
11622
+ } catch {
11623
+ }
11624
+ } else {
11625
+ document.body.removeAttribute("data-dk-mobile");
11626
+ }
11627
+ return () => {
11628
+ document.body.removeAttribute("data-dk-mobile");
11629
+ };
11630
+ }, [active]);
11631
+ (0, import_react23.useEffect)(() => subscribePref(() => setFloating(floatingShown())), []);
11632
+ const [relayBand, setRelayBand] = (0, import_react23.useState)(() => {
11633
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") return false;
11634
+ try {
11635
+ return window.matchMedia("(max-width: 700px)").matches;
11636
+ } catch {
11637
+ return false;
11638
+ }
11639
+ });
11640
+ (0, import_react23.useEffect)(() => {
11641
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") return void 0;
11642
+ let mq = null;
11643
+ try {
11644
+ mq = window.matchMedia("(max-width: 700px)");
11645
+ } catch {
11646
+ return void 0;
11647
+ }
11648
+ const update = () => setRelayBand(mq.matches);
11649
+ update();
11650
+ if (typeof mq.addEventListener === "function") mq.addEventListener("change", update);
11651
+ else if (typeof mq.addListener === "function") mq.addListener(update);
11652
+ return () => {
11653
+ if (typeof mq.removeEventListener === "function") mq.removeEventListener("change", update);
11654
+ else if (typeof mq.removeListener === "function") mq.removeListener(update);
11655
+ };
11656
+ }, []);
11657
+ if (!active || !floating) return null;
11658
+ const relayChromeActive = typeof window !== "undefined" && window.__dshDockMobileDrawer != null && relayBand;
11659
+ if (relayChromeActive) return null;
11660
+ const onToggle = () => {
11661
+ try {
11662
+ const layout = ctx && ctx.get ? ctx.get("layout") : null;
11663
+ if (layout && typeof layout.toggleSidebar === "function") layout.toggleSidebar();
11664
+ else console.warn("[dsh-dock] \u624B\u673A\u9002\u914D\uFF1Actx.layout.toggleSidebar \u4E0D\u53EF\u7528\uFF08dsh \u7248\u672C\u8FC7\u65E7\uFF1F\uFF09");
11665
+ } catch (err) {
11666
+ console.error("[dsh-dock] \u624B\u673A\u9002\u914D\uFF1A\u5207\u6362\u4FA7\u680F\u5931\u8D25\uFF1A", err);
11667
+ }
11668
+ };
11669
+ return import_react22.default.createElement("button", {
11670
+ type: "button",
11671
+ className: "dkmob-fab",
11672
+ "aria-label": "\u5F00\u5173\u4FA7\u680F",
11673
+ title: "\u5F00\u5173\u4FA7\u680F",
11674
+ onClick: onToggle
11675
+ }, import_react22.default.createElement(
11676
+ "svg",
11677
+ { width: 20, height: 20, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: 1.3, "aria-hidden": true },
11678
+ import_react22.default.createElement("rect", { x: 1.5, y: 2.5, width: 13, height: 11, rx: 2 }),
11679
+ import_react22.default.createElement("line", { x1: 6, y1: 2.5, x2: 6, y2: 13.5 })
11680
+ ));
11681
+ }
11682
+ function useViewportSize() {
11683
+ const [size, setSize] = (0, import_react23.useState)(() => typeof window === "undefined" ? null : { w: window.innerWidth, h: window.innerHeight });
11684
+ (0, import_react23.useEffect)(() => {
11685
+ if (typeof window === "undefined") return void 0;
11686
+ const update = () => setSize({ w: window.innerWidth, h: window.innerHeight });
11687
+ window.addEventListener("resize", update);
11688
+ return () => window.removeEventListener("resize", update);
11689
+ }, []);
11690
+ return size;
11691
+ }
11692
+ function MobileView() {
11693
+ const [active, setActive] = (0, import_react23.useState)(() => mobileActive());
11694
+ const [floating, setFloating] = (0, import_react23.useState)(() => floatingShown());
11695
+ const size = useViewportSize();
11696
+ (0, import_react23.useEffect)(() => {
11697
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") return void 0;
11698
+ let mqs = [];
11699
+ try {
11700
+ mqs = [window.matchMedia(MOBILE_QUERY_NARROW), window.matchMedia(MOBILE_QUERY_COARSE)];
11701
+ } catch {
11702
+ return void 0;
11703
+ }
11704
+ const update = () => setActive(mqs.some((mq) => mq.matches));
11705
+ update();
11706
+ for (const mq of mqs) {
11707
+ if (typeof mq.addEventListener === "function") mq.addEventListener("change", update);
11708
+ else if (typeof mq.addListener === "function") mq.addListener(update);
11709
+ }
11710
+ return () => {
11711
+ for (const mq of mqs) {
11712
+ if (typeof mq.removeEventListener === "function") mq.removeEventListener("change", update);
11713
+ else if (typeof mq.removeListener === "function") mq.removeListener(update);
11714
+ }
11715
+ };
11716
+ }, []);
11717
+ return import_react22.default.createElement(
11718
+ "div",
11719
+ { className: "dkmob-root" },
11720
+ import_react22.default.createElement(
11721
+ "div",
11722
+ { className: "dkmob-row" },
11723
+ import_react22.default.createElement("span", { className: "dkmob-label" }, "\u624B\u673A\u6A21\u5F0F"),
11724
+ import_react22.default.createElement("span", { className: "dkmob-state" + (active ? " on" : "") }, active ? "\u5DF2\u547D\u4E2D" : "\u672A\u547D\u4E2D"),
11725
+ import_react22.default.createElement(
11726
+ "span",
11727
+ { className: "dkmob-dim" },
11728
+ size ? size.w + "\xD7" + size.h + "px" : "",
11729
+ "\uFF08\u2264820px \u5BBD\uFF0C\u6216\u4E3B\u6307\u9488\u4E3A\u89E6\u5C4F\u65E0\u60AC\u505C\u65F6\u547D\u4E2D\uFF1B\u684C\u9762\u628A\u7A97\u53E3\u62D6\u7A84\u4E5F\u4F1A\u547D\u4E2D\uFF0C\u65B9\u4FBF\u8C03\u8BD5\uFF09"
11730
+ )
11731
+ ),
11732
+ import_react22.default.createElement(
11733
+ "div",
11734
+ { className: "dkmob-row" },
11735
+ import_react22.default.createElement("span", { className: "dkmob-label" }, "\u6D6E\u52A8\u4FA7\u680F\u6309\u94AE"),
11736
+ import_react22.default.createElement("button", {
11737
+ type: "button",
11738
+ className: "dock-sw" + (floating ? " on" : ""),
11739
+ role: "switch",
11740
+ "aria-checked": floating,
11741
+ "aria-label": (floating ? "\u9690\u85CF" : "\u663E\u793A") + "\u6D6E\u52A8\u4FA7\u680F\u6309\u94AE",
11742
+ title: floating ? "\u9690\u85CF\u5DE6\u4E0B\u89D2\u7684\u6D6E\u52A8\u4FA7\u680F\u5F00\u5173" : "\u663E\u793A\u5DE6\u4E0B\u89D2\u7684\u6D6E\u52A8\u4FA7\u680F\u5F00\u5173",
11743
+ onClick: () => setFloatingShown(!floating)
11744
+ }),
11745
+ import_react22.default.createElement("span", { className: "dkmob-dim" }, "44px \u5706\u94AE\u56FA\u5B9A\u5728\u5DE6\u4E0B\u89D2\uFF0C\u8C03\u7528 dsh \u5B98\u65B9 toggleSidebar \u5F00\u5408\u7A84\u5C4F\u62BD\u5C49\uFF1B\u4E0D\u9700\u8981\u65F6\u53EF\u5728\u6B64\u5173\u95ED\u3002")
11746
+ ),
11747
+ import_react22.default.createElement(
11748
+ "div",
11749
+ { className: "dkmob-note" },
11750
+ "\u751F\u6548\u4E2D\u7684\u4F18\u5316\uFF1A\u8F93\u5165\u7C7B\u63A7\u4EF6\u5B57\u53F7\u62C9\u5230 16px\uFF08\u907F\u514D iOS \u805A\u7126\u7F29\u653E\u6574\u9875\uFF09\xB7 \u7EAF\u56FE\u6807\u6309\u94AE\u9762\u79EF\u515C\u5E95 \u226536px \xB7 ",
11751
+ "\u53BB\u6389\u70B9\u6309\u9AD8\u4EAE\u4E0E\u53CC\u51FB\u7F29\u653E\u5224\u5B9A \xB7 \u4EE3\u7801\u5757\u6A2A\u5411\u6EDA\u52A8\u3001\u884C\u5185\u4EE3\u7801\u81EA\u52A8\u6362\u884C \xB7 viewport meta \u8865 viewport-fit=cover",
11752
+ "\uFF08standalone \u5168\u5C4F\u65F6\u7ED9\u5706\u89D2/\u5218\u6D77\u7559\u5B89\u5168\u533A\uFF09\u3002\u505C\u7528\u672C\u529F\u80FD\u5373\u5168\u90E8\u8FD8\u539F\u3002"
11753
+ )
11754
+ );
11755
+ }
11756
+ function MobileStat() {
11757
+ const [active, setActive] = (0, import_react23.useState)(() => mobileActive());
11758
+ const [floating, setFloating] = (0, import_react23.useState)(() => floatingShown());
11759
+ (0, import_react23.useEffect)(() => {
11760
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") return void 0;
11761
+ let mqs = [];
11762
+ try {
11763
+ mqs = [window.matchMedia(MOBILE_QUERY_NARROW), window.matchMedia(MOBILE_QUERY_COARSE)];
11764
+ } catch {
11765
+ return void 0;
11766
+ }
11767
+ const update = () => setActive(mqs.some((mq) => mq.matches));
11768
+ update();
11769
+ for (const mq of mqs) {
11770
+ if (typeof mq.addEventListener === "function") mq.addEventListener("change", update);
11771
+ else if (typeof mq.addListener === "function") mq.addListener(update);
11772
+ }
11773
+ return () => {
11774
+ for (const mq of mqs) {
11775
+ if (typeof mq.removeEventListener === "function") mq.removeEventListener("change", update);
11776
+ else if (typeof mq.removeListener === "function") mq.removeListener(update);
11777
+ }
11778
+ };
11779
+ }, []);
11780
+ (0, import_react23.useEffect)(() => subscribePref(() => setFloating(floatingShown())), []);
11781
+ if (!active) return import_react22.default.createElement("span", null, "\u5F53\u524D\u89C6\u53E3\u672A\u547D\u4E2D\u624B\u673A\u5F62\u6001\uFF0C\u6837\u5F0F\u672A\u6CE8\u5165");
11782
+ return import_react22.default.createElement("span", null, "\u624B\u673A\u6A21\u5F0F\u751F\u6548\u4E2D \xB7 \u6D6E\u52A8\u4FA7\u680F\u6309\u94AE" + (floating ? "\u663E\u793A" : "\u5DF2\u9690\u85CF"));
11783
+ }
11784
+ var css6 = [
11785
+ // 浮动侧栏按钮:44px 触控面积(Apple HIG 最低建议),token 取主题变量自动适配亮暗色;
11786
+ // z-index 190 压在功能坞弹层(dockm-backdrop,200)之下,弹层打开时被遮罩盖住不误触。
11787
+ ".dkmob-fab{position:fixed;left:calc(env(safe-area-inset-left,0px) + 62px);bottom:calc(env(safe-area-inset-bottom,0px) + 74px);z-index:190;width:44px;height:44px;border-radius:50%;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary);display:inline-flex;align-items:center;justify-content:center;padding:0;box-shadow:0 4px 14px rgb(0 0 0 / .22);cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;transition:transform .12s var(--ds-ease-in-out),background .15s var(--ds-ease-in-out),color .15s var(--ds-ease-in-out);}",
11788
+ ".dkmob-fab:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary);}",
11789
+ ".dkmob-fab:active{transform:scale(.94);}",
11790
+ // 输入类控件 16px:防 iOS 聚焦自动放大(<16px 的输入框聚焦时 Safari 强制缩放页面)
11791
+ 'body[data-dk-mobile="1"] :is(textarea, input:not([type]), input[type="text"], input[type="search"], input[type="url"], input[type="password"], input[type="number"], input[type="email"], [contenteditable="true"]){font-size:16px !important;}',
11792
+ // 触控基础:去点按高亮、消双击缩放判定
11793
+ 'body[data-dk-mobile="1"] :is(button, [role="button"]){-webkit-tap-highlight-color:transparent;touch-action:manipulation;}',
11794
+ // 纯图标按钮面积兜底:实测窄屏下一批 28×28 的工具钮很难点中;36px 是不引起行高剧变的上限。
11795
+ // 只收「唯一子元素是 svg」的按钮,避免撑坏带文字的行内控件;排除远程访问的抽屉把手
11796
+ // (.dsh-mobile-drawer-btn 贴边设计 30px 宽,被撑到 36 会破坏边缘吸附观感)与本模块 FAB。
11797
+ 'body[data-dk-mobile="1"] button:has(> svg:only-child):not(.dsh-mobile-drawer-btn):not(.dkmob-fab){min-width:36px;min-height:36px;}',
11798
+ // 代码块横向滚动、行内代码换行:窄屏不撑破版面
11799
+ 'body[data-dk-mobile="1"] pre{max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;}',
11800
+ 'body[data-dk-mobile="1"] code{overflow-wrap:anywhere;}',
11801
+ 'body[data-dk-mobile="1"] pre code{overflow-wrap:normal;}',
11802
+ // iOS 横竖屏切换时的字号自动膨胀关掉(:has 挂到 html 上;dsh 自身样式已依赖 :has,基线足够)
11803
+ 'html:has(body[data-dk-mobile="1"]){-webkit-text-size-adjust:100%;text-size-adjust:100%;}',
11804
+ // 功能页自身
11805
+ ".dkmob-root{display:flex;flex-direction:column;gap:10px;color:var(--dsw-alias-label-primary);font-size:13px;line-height:1.6;}",
11806
+ ".dkmob-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}",
11807
+ ".dkmob-label{font-weight:600;flex:none;}",
11808
+ ".dkmob-state{flex:none;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-tertiary);border-radius:999px;padding:1px 10px;font-size:11px;}",
11809
+ ".dkmob-state.on{color:var(--dsw-alias-state-success-primary);border-color:var(--dsw-alias-state-success-primary);}",
11810
+ ".dkmob-dim{color:var(--dsw-alias-label-secondary);font-size:12px;}",
11811
+ ".dkmob-note{color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.7;border-top:1px solid var(--dsw-alias-border-l1);padding-top:10px;}"
11812
+ ].join("\n");
11813
+ var feature11 = {
11814
+ id: "mobile",
11815
+ name: "\u624B\u673A\u9002\u914D",
11816
+ order: 170,
11817
+ accent: "#34d399",
11818
+ description: "\u624B\u673A/\u7A84\u5C4F\u6392\u7248\u4E0E\u89E6\u63A7\u515C\u5E95\uFF1A16px \u8F93\u5165\u9632 iOS \u7F29\u653E\u3001\u56FE\u6807\u6309\u94AE\u89E6\u63A7\u9762\u79EF\u3001\u4EE3\u7801\u5757\u6EDA\u52A8\u3001\u6D6E\u52A8\u4FA7\u680F\u5F00\u5173",
11819
+ defaultEnabled: true,
11820
+ css: css6,
11821
+ Overlay: MobileOverlay,
11822
+ View: MobileView,
11823
+ HomeStat: MobileStat
11824
+ };
11825
+
11427
11826
  // src/client.jsx
11428
- var DOCK_VERSION = "0.12.0";
11429
- var BUILTIN_FEATURES = [feature, feature2, feature3, feature4, feature5, feature6, feature7, feature8, feature9, feature10];
11827
+ var DOCK_VERSION = "0.13.0";
11828
+ var BUILTIN_FEATURES = [feature, feature2, feature3, feature4, feature5, feature6, feature7, feature8, feature9, feature10, feature11];
11430
11829
  var PLANNED_FEATURES = [];
11431
11830
  var PLANNED_NOTES = {};
11432
11831
  var externalDefs = [];
@@ -11633,8 +12032,8 @@ function ensureCss() {
11633
12032
  }
11634
12033
  }
11635
12034
  function useExternalVersion() {
11636
- const [, bump] = import_react22.default.useReducer((n) => n + 1, 0);
11637
- import_react22.default.useEffect(() => {
12035
+ const [, bump] = import_react24.default.useReducer((n) => n + 1, 0);
12036
+ import_react24.default.useEffect(() => {
11638
12037
  externalListeners.add(bump);
11639
12038
  return () => {
11640
12039
  externalListeners.delete(bump);
@@ -11644,44 +12043,44 @@ function useExternalVersion() {
11644
12043
  var lastGeom = { x: null, y: null, w: null, h: null };
11645
12044
  function DockIcon(props) {
11646
12045
  const size = props && props.size || 16;
11647
- return import_react22.default.createElement(
12046
+ return import_react24.default.createElement(
11648
12047
  "svg",
11649
12048
  { width: size, height: size, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: 1.3, "aria-hidden": true },
11650
- import_react22.default.createElement("rect", { x: 2.5, y: 2.5, width: 4.4, height: 4.4, rx: 1.2 }),
11651
- import_react22.default.createElement("rect", { x: 9, y: 2.5, width: 4.4, height: 4.4, rx: 1.2 }),
11652
- import_react22.default.createElement("rect", { x: 2.5, y: 9, width: 4.4, height: 4.4, rx: 1.2 }),
11653
- import_react22.default.createElement("rect", { x: 9, y: 9, width: 4.4, height: 4.4, rx: 1.2 })
12049
+ import_react24.default.createElement("rect", { x: 2.5, y: 2.5, width: 4.4, height: 4.4, rx: 1.2 }),
12050
+ import_react24.default.createElement("rect", { x: 9, y: 2.5, width: 4.4, height: 4.4, rx: 1.2 }),
12051
+ import_react24.default.createElement("rect", { x: 2.5, y: 9, width: 4.4, height: 4.4, rx: 1.2 }),
12052
+ import_react24.default.createElement("rect", { x: 9, y: 9, width: 4.4, height: 4.4, rx: 1.2 })
11654
12053
  );
11655
12054
  }
11656
12055
  function DockEntry(props) {
11657
12056
  const wide = !!props.wide;
11658
- const [open, setOpen] = import_react22.default.useState(panelNav.open);
11659
- import_react22.default.useEffect(() => subscribePanel(() => setOpen(panelNav.open)), []);
11660
- return import_react22.default.createElement("button", {
12057
+ const [open, setOpen] = import_react24.default.useState(panelNav.open);
12058
+ import_react24.default.useEffect(() => subscribePanel(() => setOpen(panelNav.open)), []);
12059
+ return import_react24.default.createElement("button", {
11661
12060
  type: "button",
11662
12061
  className: "docke2-btn" + (open ? " docke2-on" : "") + (wide ? "" : " docke2-rail"),
11663
12062
  title: "\u529F\u80FD\u575E",
11664
12063
  "aria-label": "\u529F\u80FD\u575E",
11665
12064
  "aria-expanded": open,
11666
12065
  onClick: () => setPanelOpen(!open)
11667
- }, import_react22.default.createElement(DockIcon, { size: wide ? 16 : 18 }), wide ? import_react22.default.createElement("span", { className: "docke2-label" }, "\u529F\u80FD\u575E") : null);
12066
+ }, import_react24.default.createElement(DockIcon, { size: wide ? 16 : 18 }), wide ? import_react24.default.createElement("span", { className: "docke2-label" }, "\u529F\u80FD\u575E") : null);
11668
12067
  }
11669
12068
  function DockModal() {
11670
- const [nav, setNav] = import_react22.default.useState({ open: panelNav.open, active: panelNav.active, params: panelNav.params });
11671
- import_react22.default.useEffect(() => subscribePanel(() => setNav({ open: panelNav.open, active: panelNav.active, params: panelNav.params })), []);
12069
+ const [nav, setNav] = import_react24.default.useState({ open: panelNav.open, active: panelNav.active, params: panelNav.params });
12070
+ import_react24.default.useEffect(() => subscribePanel(() => setNav({ open: panelNav.open, active: panelNav.active, params: panelNav.params })), []);
11672
12071
  const open = nav.open || typeof document === "undefined";
11673
12072
  const active = nav.active;
11674
12073
  const setActive = navigatePanel;
11675
12074
  const navParams = nav.params;
11676
- const [, force] = import_react22.default.useReducer((n) => n + 1, 0);
12075
+ const [, force] = import_react24.default.useReducer((n) => n + 1, 0);
11677
12076
  useExternalVersion();
11678
- const [win, setWin] = import_react22.default.useState(() => ({ mode: "normal", x: null, y: null, w: null, h: null }));
11679
- const dlgRef = import_react22.default.useRef(null);
11680
- const contentRef = import_react22.default.useRef(null);
11681
- import_react22.default.useEffect(() => {
12077
+ const [win, setWin] = import_react24.default.useState(() => ({ mode: "normal", x: null, y: null, w: null, h: null }));
12078
+ const dlgRef = import_react24.default.useRef(null);
12079
+ const contentRef = import_react24.default.useRef(null);
12080
+ import_react24.default.useEffect(() => {
11682
12081
  if (lastGeom.w) setWin({ mode: "normal", x: lastGeom.x, y: lastGeom.y, w: lastGeom.w, h: lastGeom.h });
11683
12082
  }, []);
11684
- import_react22.default.useEffect(() => {
12083
+ import_react24.default.useEffect(() => {
11685
12084
  if (open && contentRef.current) contentRef.current.scrollTop = 0;
11686
12085
  }, [active, open]);
11687
12086
  function beginDrag(e, type) {
@@ -11719,13 +12118,13 @@ function DockModal() {
11719
12118
  const mod = isHome ? null : MODULES.find((m) => m.id === active) || MODULES[0];
11720
12119
  const st = mod ? stateOf(mod.id) : null;
11721
12120
  const View = mod ? mod.View : null;
11722
- const viewNode = mod && View ? import_react22.default.createElement(
12121
+ const viewNode = mod && View ? import_react24.default.createElement(
11723
12122
  "div",
11724
12123
  { className: "dockm-view" },
11725
- import_react22.default.createElement(
12124
+ import_react24.default.createElement(
11726
12125
  FeatureBoundary,
11727
12126
  { key: mod.id, label: mod.name },
11728
- import_react22.default.createElement(View, { ctx: ctxRef.current, feature: mod, params: navParams })
12127
+ import_react24.default.createElement(View, { ctx: ctxRef.current, feature: mod, params: navParams })
11729
12128
  )
11730
12129
  ) : null;
11731
12130
  const enabledCount = MODULES.filter((m) => {
@@ -11739,10 +12138,10 @@ function DockModal() {
11739
12138
  width: win.w != null ? win.w : void 0,
11740
12139
  height: win.mode === "min" ? "auto" : win.h != null ? win.h : void 0
11741
12140
  } : null;
11742
- return import_react22.default.createElement(
12141
+ return import_react24.default.createElement(
11743
12142
  "div",
11744
12143
  { className: "dockm-backdrop", onClick: () => setPanelOpen(false) },
11745
- import_react22.default.createElement(
12144
+ import_react24.default.createElement(
11746
12145
  "div",
11747
12146
  {
11748
12147
  className: "dockm-dialog" + (win.mode === "max" ? " dockm-max" : "") + (win.mode === "min" ? " dockm-min" : ""),
@@ -11750,41 +12149,41 @@ function DockModal() {
11750
12149
  ref: dlgRef,
11751
12150
  onClick: (e) => e.stopPropagation()
11752
12151
  },
11753
- import_react22.default.createElement(
12152
+ import_react24.default.createElement(
11754
12153
  "div",
11755
12154
  {
11756
12155
  className: "dockm-head",
11757
12156
  onPointerDown: (e) => beginDrag(e, "move"),
11758
12157
  onDoubleClick: () => setWin((s) => Object.assign({}, s, { mode: s.mode === "max" ? "normal" : "max" }))
11759
12158
  },
11760
- import_react22.default.createElement(DockIcon, null),
11761
- import_react22.default.createElement("span", { className: "dockm-title" }, "\u529F\u80FD\u575E"),
11762
- import_react22.default.createElement("span", { className: "dockm-sub" }, "dsh-dock \xB7 \u4E5F\u53EF\u5728 \u8BBE\u7F6E \u2192 \u529F\u80FD\u575E \u6253\u5F00\u7BA1\u7406\u9875"),
11763
- import_react22.default.createElement(
12159
+ import_react24.default.createElement(DockIcon, null),
12160
+ import_react24.default.createElement("span", { className: "dockm-title" }, "\u529F\u80FD\u575E"),
12161
+ import_react24.default.createElement("span", { className: "dockm-sub" }, "dsh-dock \xB7 \u4E5F\u53EF\u5728 \u8BBE\u7F6E \u2192 \u529F\u80FD\u575E \u6253\u5F00\u7BA1\u7406\u9875"),
12162
+ import_react24.default.createElement(
11764
12163
  "span",
11765
12164
  { className: "dockm-ctrls" },
11766
- import_react22.default.createElement("button", {
12165
+ import_react24.default.createElement("button", {
11767
12166
  type: "button",
11768
12167
  className: "dockm-win",
11769
12168
  title: win.mode === "min" ? "\u8FD8\u539F" : "\u6700\u5C0F\u5316",
11770
12169
  onClick: () => setWin((s) => Object.assign({}, s, { mode: s.mode === "min" ? "normal" : "min" }))
11771
12170
  }, "\u2581"),
11772
- import_react22.default.createElement("button", {
12171
+ import_react24.default.createElement("button", {
11773
12172
  type: "button",
11774
12173
  className: "dockm-win",
11775
12174
  title: win.mode === "max" ? "\u8FD8\u539F" : "\u6700\u5927\u5316",
11776
12175
  onClick: () => setWin((s) => Object.assign({}, s, { mode: s.mode === "max" ? "normal" : "max" }))
11777
12176
  }, win.mode === "max" ? "\u2750" : "\u25A2"),
11778
- import_react22.default.createElement("button", { type: "button", className: "dockm-close", "aria-label": "\u5173\u95ED", title: "\u5173\u95ED", onClick: () => setPanelOpen(false) }, "\u2715")
12177
+ import_react24.default.createElement("button", { type: "button", className: "dockm-close", "aria-label": "\u5173\u95ED", title: "\u5173\u95ED", onClick: () => setPanelOpen(false) }, "\u2715")
11779
12178
  )
11780
12179
  ),
11781
- import_react22.default.createElement(
12180
+ import_react24.default.createElement(
11782
12181
  "div",
11783
12182
  { className: "dockm-body" },
11784
- import_react22.default.createElement(
12183
+ import_react24.default.createElement(
11785
12184
  "nav",
11786
12185
  { className: "dockm-nav", "aria-label": "\u529F\u80FD\u6A21\u5757" },
11787
- import_react22.default.createElement(
12186
+ import_react24.default.createElement(
11788
12187
  "button",
11789
12188
  {
11790
12189
  type: "button",
@@ -11792,10 +12191,10 @@ function DockModal() {
11792
12191
  className: "dockm-nav-item" + (isHome ? " on" : ""),
11793
12192
  onClick: () => setActive("home")
11794
12193
  },
11795
- import_react22.default.createElement("span", { className: "dockm-navhome" }, import_react22.default.createElement(DockIcon, null)),
11796
- import_react22.default.createElement("span", null, "\u9996\u9875")
12194
+ import_react24.default.createElement("span", { className: "dockm-navhome" }, import_react24.default.createElement(DockIcon, null)),
12195
+ import_react24.default.createElement("span", null, "\u9996\u9875")
11797
12196
  ),
11798
- MODULES.map((m) => import_react22.default.createElement(
12197
+ MODULES.map((m) => import_react24.default.createElement(
11799
12198
  "button",
11800
12199
  {
11801
12200
  type: "button",
@@ -11803,42 +12202,42 @@ function DockModal() {
11803
12202
  className: "dockm-nav-item" + (m.id === active ? " on" : ""),
11804
12203
  onClick: () => setActive(m.id)
11805
12204
  },
11806
- import_react22.default.createElement("span", { className: "dockm-dot", style: { background: m.accent } }),
11807
- import_react22.default.createElement("span", null, m.name),
11808
- m.planned ? import_react22.default.createElement("span", { className: "dockm-badge" }, "\u89C4\u5212\u4E2D") : null,
11809
- m.external ? import_react22.default.createElement("span", { className: "dockm-badge" }, "\u5916\u90E8") : null
12205
+ import_react24.default.createElement("span", { className: "dockm-dot", style: { background: m.accent } }),
12206
+ import_react24.default.createElement("span", null, m.name),
12207
+ m.planned ? import_react24.default.createElement("span", { className: "dockm-badge" }, "\u89C4\u5212\u4E2D") : null,
12208
+ m.external ? import_react24.default.createElement("span", { className: "dockm-badge" }, "\u5916\u90E8") : null
11810
12209
  ))
11811
12210
  ),
11812
- import_react22.default.createElement(
12211
+ import_react24.default.createElement(
11813
12212
  "div",
11814
12213
  { className: "dockm-content", ref: contentRef },
11815
- import_react22.default.createElement(
12214
+ import_react24.default.createElement(
11816
12215
  "div",
11817
12216
  { className: "dockm-content-head" },
11818
- import_react22.default.createElement(
12217
+ import_react24.default.createElement(
11819
12218
  "div",
11820
12219
  { className: "dockm-name" },
11821
- isHome ? import_react22.default.createElement("span", { className: "dockm-navhome" }, import_react22.default.createElement(DockIcon, null)) : import_react22.default.createElement("span", { className: "dockm-dot", style: { background: mod.accent } }),
12220
+ isHome ? import_react24.default.createElement("span", { className: "dockm-navhome" }, import_react24.default.createElement(DockIcon, null)) : import_react24.default.createElement("span", { className: "dockm-dot", style: { background: mod.accent } }),
11822
12221
  isHome ? "\u9996\u9875" : mod.name,
11823
- !isHome && mod.planned ? import_react22.default.createElement("span", { className: "dockm-badge" }, "\u89C4\u5212\u4E2D") : null,
11824
- !isHome && mod.external ? import_react22.default.createElement("span", { className: "dockm-badge" }, "\u5916\u90E8\u5305" + (mod.package ? " \xB7 " + mod.package : "")) : null
12222
+ !isHome && mod.planned ? import_react24.default.createElement("span", { className: "dockm-badge" }, "\u89C4\u5212\u4E2D") : null,
12223
+ !isHome && mod.external ? import_react24.default.createElement("span", { className: "dockm-badge" }, "\u5916\u90E8\u5305" + (mod.package ? " \xB7 " + mod.package : "")) : null
11825
12224
  ),
11826
- import_react22.default.createElement(
12225
+ import_react24.default.createElement(
11827
12226
  "div",
11828
12227
  { className: "dockm-desc" },
11829
12228
  isHome ? "\u6240\u6709\u5B50\u529F\u80FD\u603B\u63FD\uFF1A\u8FD0\u884C\u72B6\u6001\u3001\u6982\u8981\u4E0E\u5FEB\u6377\u5F00\u5173\uFF0C\u70B9\u51FB\u5361\u7247\u8FDB\u5165\u5BF9\u5E94\u529F\u80FD\u9875\u3002" : mod.description
11830
12229
  )
11831
12230
  ),
11832
- isHome ? import_react22.default.createElement("div", { className: "dockm-view" }, import_react22.default.createElement(HomeView, { ctx: ctxRef.current, onOpen: setActive, onToggle: force })) : mod.planned ? import_react22.default.createElement("div", { className: "dockm-note" }, PLANNED_NOTES[mod.id] || "\u5F85\u63A5\u5165\uFF1A\u89C1 README \u8DEF\u7EBF\u56FE") : st && st.enabled && viewNode ? viewNode : st && st.error ? import_react22.default.createElement("div", { className: "dockm-note dockm-err" }, "\u529F\u80FD\u51FA\u9519\uFF1A" + st.error) : import_react22.default.createElement("div", { className: "dockm-note" }, "\u8BE5\u529F\u80FD\u5F53\u524D\u4E3A\u505C\u7528\u72B6\u6001\uFF08\u5F00\u5173\u5DF2\u6301\u4E45\u5316\uFF0C\u91CD\u542F\u540E\u4FDD\u6301\uFF09"),
11833
- import_react22.default.createElement(
12231
+ isHome ? import_react24.default.createElement("div", { className: "dockm-view" }, import_react24.default.createElement(HomeView, { ctx: ctxRef.current, onOpen: setActive, onToggle: force })) : mod.planned ? import_react24.default.createElement("div", { className: "dockm-note" }, PLANNED_NOTES[mod.id] || "\u5F85\u63A5\u5165\uFF1A\u89C1 README \u8DEF\u7EBF\u56FE") : st && st.enabled && viewNode ? viewNode : st && st.error ? import_react24.default.createElement("div", { className: "dockm-note dockm-err" }, "\u529F\u80FD\u51FA\u9519\uFF1A" + st.error) : import_react24.default.createElement("div", { className: "dockm-note" }, "\u8BE5\u529F\u80FD\u5F53\u524D\u4E3A\u505C\u7528\u72B6\u6001\uFF08\u5F00\u5173\u5DF2\u6301\u4E45\u5316\uFF0C\u91CD\u542F\u540E\u4FDD\u6301\uFF09"),
12232
+ import_react24.default.createElement(
11834
12233
  "div",
11835
12234
  { className: "dockm-foot" },
11836
- import_react22.default.createElement("span", null, isHome ? "\u529F\u80FD\u575E v" + DOCK_VERSION + " \xB7 \u5171 " + MODULES.length + " \u4E2A\u529F\u80FD\u6A21\u5757\uFF0C" + enabledCount + " \u4E2A\u5DF2\u542F\u7528" : "\u529F\u80FD\u575E v" + DOCK_VERSION + " \xB7 \u65B0\u529F\u80FD\u6309\u8DEF\u7EBF\u56FE\u8FFD\u52A0"),
11837
- !isHome && mod && !mod.planned && st ? import_react22.default.createElement(
12235
+ import_react24.default.createElement("span", null, isHome ? "\u529F\u80FD\u575E v" + DOCK_VERSION + " \xB7 \u5171 " + MODULES.length + " \u4E2A\u529F\u80FD\u6A21\u5757\uFF0C" + enabledCount + " \u4E2A\u5DF2\u542F\u7528" : "\u529F\u80FD\u575E v" + DOCK_VERSION + " \xB7 \u65B0\u529F\u80FD\u6309\u8DEF\u7EBF\u56FE\u8FFD\u52A0"),
12236
+ !isHome && mod && !mod.planned && st ? import_react24.default.createElement(
11838
12237
  "span",
11839
12238
  { className: "dockm-foot-sw" },
11840
- import_react22.default.createElement("span", { className: "dockm-foot-swlabel" + (st.enabled ? " on" : "") }, st.enabled ? "\u5DF2\u542F\u7528" : "\u5DF2\u505C\u7528"),
11841
- import_react22.default.createElement("button", {
12239
+ import_react24.default.createElement("span", { className: "dockm-foot-swlabel" + (st.enabled ? " on" : "") }, st.enabled ? "\u5DF2\u542F\u7528" : "\u5DF2\u505C\u7528"),
12240
+ import_react24.default.createElement("button", {
11842
12241
  type: "button",
11843
12242
  className: "dock-sw" + (st.enabled ? " on" : ""),
11844
12243
  role: "switch",
@@ -11851,11 +12250,11 @@ function DockModal() {
11851
12250
  }
11852
12251
  })
11853
12252
  ) : null,
11854
- !isHome && mod && typeof mod.Chip === "function" ? import_react22.default.createElement(
12253
+ !isHome && mod && typeof mod.Chip === "function" ? import_react24.default.createElement(
11855
12254
  "span",
11856
12255
  { className: "dockm-foot-sw" },
11857
- import_react22.default.createElement("span", { className: "dockm-foot-swlabel" + (chipShown(mod.id) ? " on" : "") }, "\u4F1A\u8BDD\u9875\u5C0F\u63A7\u4EF6"),
11858
- import_react22.default.createElement("button", {
12256
+ import_react24.default.createElement("span", { className: "dockm-foot-swlabel" + (chipShown(mod.id) ? " on" : "") }, "\u4F1A\u8BDD\u9875\u5C0F\u63A7\u4EF6"),
12257
+ import_react24.default.createElement("button", {
11859
12258
  type: "button",
11860
12259
  className: "dock-sw" + (chipShown(mod.id) ? " on" : ""),
11861
12260
  role: "switch",
@@ -11871,30 +12270,30 @@ function DockModal() {
11871
12270
  )
11872
12271
  )
11873
12272
  ),
11874
- win.mode === "normal" ? import_react22.default.createElement("div", { className: "dockm-resize", onPointerDown: (e) => beginDrag(e, "size") }) : null
12273
+ win.mode === "normal" ? import_react24.default.createElement("div", { className: "dockm-resize", onPointerDown: (e) => beginDrag(e, "size") }) : null
11875
12274
  )
11876
12275
  );
11877
12276
  }
11878
12277
  function HomeView(props) {
11879
12278
  const ctx = props && props.ctx;
11880
- const [, force] = import_react22.default.useReducer((n) => n + 1, 0);
12279
+ const [, force] = import_react24.default.useReducer((n) => n + 1, 0);
11881
12280
  useExternalVersion();
11882
12281
  const open = (id) => {
11883
12282
  if (props && typeof props.onOpen === "function") props.onOpen(id);
11884
12283
  };
11885
- return import_react22.default.createElement(
12284
+ return import_react24.default.createElement(
11886
12285
  "div",
11887
12286
  { className: "dockh-grid" },
11888
12287
  allModules().map((m) => {
11889
12288
  const st = stateOf(m.id);
11890
12289
  const enabled = !!(st && st.enabled);
11891
12290
  const Stat = m.HomeStat;
11892
- const statNode = m.planned ? import_react22.default.createElement("span", null, PLANNED_NOTES[m.id] || "\u5F85\u63A5\u5165\uFF1A\u89C1 README \u8DEF\u7EBF\u56FE") : enabled && Stat ? import_react22.default.createElement(
12291
+ const statNode = m.planned ? import_react24.default.createElement("span", null, PLANNED_NOTES[m.id] || "\u5F85\u63A5\u5165\uFF1A\u89C1 README \u8DEF\u7EBF\u56FE") : enabled && Stat ? import_react24.default.createElement(
11893
12292
  FeatureBoundary,
11894
12293
  { key: m.id, label: m.name },
11895
- import_react22.default.createElement(Stat, { ctx })
11896
- ) : import_react22.default.createElement("span", null, "\u5DF2\u505C\u7528\uFF0C\u542F\u7528\u540E\u5728\u6B64\u5C55\u793A\u8FD0\u884C\u6982\u8981");
11897
- return import_react22.default.createElement(
12294
+ import_react24.default.createElement(Stat, { ctx })
12295
+ ) : import_react24.default.createElement("span", null, "\u5DF2\u505C\u7528\uFF0C\u542F\u7528\u540E\u5728\u6B64\u5C55\u793A\u8FD0\u884C\u6982\u8981");
12296
+ return import_react24.default.createElement(
11898
12297
  "div",
11899
12298
  {
11900
12299
  key: m.id,
@@ -11909,21 +12308,21 @@ function HomeView(props) {
11909
12308
  }
11910
12309
  }
11911
12310
  },
11912
- import_react22.default.createElement(
12311
+ import_react24.default.createElement(
11913
12312
  "div",
11914
12313
  { className: "dockh-head" },
11915
- import_react22.default.createElement("span", { className: "dockm-dot", style: { background: m.accent } }),
11916
- import_react22.default.createElement("span", { className: "dockh-name" }, m.name),
11917
- m.external ? import_react22.default.createElement("span", { className: "dockh-badge", title: m.package || void 0 }, "\u5916\u90E8") : null,
12314
+ import_react24.default.createElement("span", { className: "dockm-dot", style: { background: m.accent } }),
12315
+ import_react24.default.createElement("span", { className: "dockh-name" }, m.name),
12316
+ m.external ? import_react24.default.createElement("span", { className: "dockh-badge", title: m.package || void 0 }, "\u5916\u90E8") : null,
11918
12317
  // 状态标识:圆点 + 文字(纯展示,与开关视觉区分)
11919
- import_react22.default.createElement(
12318
+ import_react24.default.createElement(
11920
12319
  "span",
11921
12320
  { className: "dockh-status" + (m.planned ? " plan" : enabled ? "" : " off") },
11922
- import_react22.default.createElement("span", { className: "dockh-sdot" }),
11923
- import_react22.default.createElement("span", null, m.planned ? "\u89C4\u5212\u4E2D" : enabled ? "\u8FD0\u884C\u4E2D" : "\u5DF2\u505C\u7528")
12321
+ import_react24.default.createElement("span", { className: "dockh-sdot" }),
12322
+ import_react24.default.createElement("span", null, m.planned ? "\u89C4\u5212\u4E2D" : enabled ? "\u8FD0\u884C\u4E2D" : "\u5DF2\u505C\u7528")
11924
12323
  ),
11925
12324
  // 启停开关(规划中的功能不显示)
11926
- m.planned ? null : import_react22.default.createElement("button", {
12325
+ m.planned ? null : import_react24.default.createElement("button", {
11927
12326
  type: "button",
11928
12327
  className: "dock-sw" + (enabled ? " on" : ""),
11929
12328
  role: "switch",
@@ -11938,12 +12337,12 @@ function HomeView(props) {
11938
12337
  }
11939
12338
  })
11940
12339
  ),
11941
- import_react22.default.createElement("div", { className: "dockh-desc" }, m.description),
11942
- import_react22.default.createElement("div", { className: "dockh-stat" }, statNode),
11943
- import_react22.default.createElement(
12340
+ import_react24.default.createElement("div", { className: "dockh-desc" }, m.description),
12341
+ import_react24.default.createElement("div", { className: "dockh-stat" }, statNode),
12342
+ import_react24.default.createElement(
11944
12343
  "div",
11945
12344
  { className: "dockh-foot" },
11946
- import_react22.default.createElement("span", { className: "dockh-go" }, "\u67E5\u770B\u8BE6\u60C5 \u2192")
12345
+ import_react24.default.createElement("span", { className: "dockh-go" }, "\u67E5\u770B\u8BE6\u60C5 \u2192")
11947
12346
  )
11948
12347
  );
11949
12348
  })
@@ -11951,16 +12350,16 @@ function HomeView(props) {
11951
12350
  }
11952
12351
  function DockPanel(props) {
11953
12352
  const ctx = ctxRef.current;
11954
- const [, force] = import_react22.default.useReducer((n) => n + 1, 0);
12353
+ const [, force] = import_react24.default.useReducer((n) => n + 1, 0);
11955
12354
  useExternalVersion();
11956
12355
  const toggle = (id) => {
11957
12356
  toggleFeature(id);
11958
12357
  force();
11959
12358
  };
11960
- return import_react22.default.createElement(
12359
+ return import_react24.default.createElement(
11961
12360
  "div",
11962
12361
  { className: "dock-root" },
11963
- import_react22.default.createElement(
12362
+ import_react24.default.createElement(
11964
12363
  "div",
11965
12364
  { className: "dock-intro" },
11966
12365
  "\u529F\u80FD\u575E\uFF08dsh-dock\uFF09\xB7 \u6240\u6709\u5C0F\u529F\u80FD\u96C6\u4E2D\u5728\u8FD9\u4E00\u4E2A\u9762\u677F\u91CC\u7BA1\u7406\u3002v0.4.0 \u8D77\u6BCF\u4E2A\u529F\u80FD\u662F\u72EC\u7ACB\u6A21\u5757\uFF08features/<id>/\uFF09\uFF0C",
@@ -11969,25 +12368,25 @@ function DockPanel(props) {
11969
12368
  allModules().map((f) => {
11970
12369
  const st = stateOf(f.id);
11971
12370
  const View = f.View;
11972
- const viewNode = !f.planned && st.enabled && View ? import_react22.default.createElement(
12371
+ const viewNode = !f.planned && st.enabled && View ? import_react24.default.createElement(
11973
12372
  "div",
11974
12373
  { className: "dock-body" },
11975
- import_react22.default.createElement(
12374
+ import_react24.default.createElement(
11976
12375
  FeatureBoundary,
11977
12376
  { key: f.id, label: f.name },
11978
- import_react22.default.createElement(View, { ctx, feature: f, params: props && props.params })
12377
+ import_react24.default.createElement(View, { ctx, feature: f, params: props && props.params })
11979
12378
  )
11980
12379
  ) : null;
11981
- return import_react22.default.createElement(
12380
+ return import_react24.default.createElement(
11982
12381
  "div",
11983
12382
  { className: "dock-card", key: f.id },
11984
- import_react22.default.createElement(
12383
+ import_react24.default.createElement(
11985
12384
  "div",
11986
12385
  { className: "dock-card-head" },
11987
- import_react22.default.createElement("span", { className: "dock-dot" + (st.error ? " err" : st.enabled ? " on" : "") }),
11988
- import_react22.default.createElement("span", { className: "dock-name" }, f.name),
11989
- import_react22.default.createElement("span", { className: "dock-desc" }, f.description + (f.external ? "\uFF08\u6765\u81EA\u5916\u90E8\u5305" + (f.package ? " " + f.package : "") + "\uFF09" : "")),
11990
- f.planned ? import_react22.default.createElement("span", { className: "dock-badge" }, "\u89C4\u5212\u4E2D") : import_react22.default.createElement("button", {
12386
+ import_react24.default.createElement("span", { className: "dock-dot" + (st.error ? " err" : st.enabled ? " on" : "") }),
12387
+ import_react24.default.createElement("span", { className: "dock-name" }, f.name),
12388
+ import_react24.default.createElement("span", { className: "dock-desc" }, f.description + (f.external ? "\uFF08\u6765\u81EA\u5916\u90E8\u5305" + (f.package ? " " + f.package : "") + "\uFF09" : "")),
12389
+ f.planned ? import_react24.default.createElement("span", { className: "dock-badge" }, "\u89C4\u5212\u4E2D") : import_react24.default.createElement("button", {
11991
12390
  type: "button",
11992
12391
  className: "dock-sw" + (st.enabled ? " on" : ""),
11993
12392
  role: "switch",
@@ -11996,11 +12395,11 @@ function DockPanel(props) {
11996
12395
  title: st.enabled ? "\u505C\u7528\u300C" + f.name + "\u300D" : "\u542F\u7528\u300C" + f.name + "\u300D",
11997
12396
  onClick: () => toggle(f.id)
11998
12397
  }),
11999
- !f.planned && typeof f.Chip === "function" ? import_react22.default.createElement(
12398
+ !f.planned && typeof f.Chip === "function" ? import_react24.default.createElement(
12000
12399
  "span",
12001
12400
  { className: "dockm-foot-sw" },
12002
- import_react22.default.createElement("span", { className: "dockm-foot-swlabel" + (chipShown(f.id) ? " on" : "") }, "\u4F1A\u8BDD\u9875\u5C0F\u63A7\u4EF6"),
12003
- import_react22.default.createElement("button", {
12401
+ import_react24.default.createElement("span", { className: "dockm-foot-swlabel" + (chipShown(f.id) ? " on" : "") }, "\u4F1A\u8BDD\u9875\u5C0F\u63A7\u4EF6"),
12402
+ import_react24.default.createElement("button", {
12004
12403
  type: "button",
12005
12404
  className: "dock-sw" + (chipShown(f.id) ? " on" : ""),
12006
12405
  role: "switch",
@@ -12014,22 +12413,22 @@ function DockPanel(props) {
12014
12413
  })
12015
12414
  ) : null
12016
12415
  ),
12017
- f.planned ? import_react22.default.createElement("div", { className: "dock-body" }, PLANNED_NOTES[f.id] || "\u5F85\u63A5\u5165\uFF1A\u89C1 README \u8DEF\u7EBF\u56FE") : st.error ? import_react22.default.createElement("div", { className: "dock-body dockm-err" }, "\u529F\u80FD\u51FA\u9519\uFF1A" + st.error) : null,
12416
+ f.planned ? import_react24.default.createElement("div", { className: "dock-body" }, PLANNED_NOTES[f.id] || "\u5F85\u63A5\u5165\uFF1A\u89C1 README \u8DEF\u7EBF\u56FE") : st.error ? import_react24.default.createElement("div", { className: "dock-body dockm-err" }, "\u529F\u80FD\u51FA\u9519\uFF1A" + st.error) : null,
12018
12417
  viewNode
12019
12418
  );
12020
12419
  })
12021
12420
  );
12022
12421
  }
12023
12422
  function DockChips(props) {
12024
- const [, force] = import_react22.default.useReducer((n) => n + 1, 0);
12025
- import_react22.default.useEffect(() => subscribeFeatureState(() => force()), []);
12423
+ const [, force] = import_react24.default.useReducer((n) => n + 1, 0);
12424
+ import_react24.default.useEffect(() => subscribeFeatureState(() => force()), []);
12026
12425
  const items = [];
12027
12426
  for (const f of allModules()) {
12028
12427
  if (f.planned || !stateOf(f.id).enabled || !chipShown(f.id) || typeof f.Chip !== "function") continue;
12029
- items.push(import_react22.default.createElement(
12428
+ items.push(import_react24.default.createElement(
12030
12429
  FeatureBoundary,
12031
12430
  { key: f.id, label: f.name },
12032
- import_react22.default.createElement(f.Chip, {
12431
+ import_react24.default.createElement(f.Chip, {
12033
12432
  ctx: props.ctx,
12034
12433
  feature: f,
12035
12434
  session: props.session,
@@ -12039,23 +12438,23 @@ function DockChips(props) {
12039
12438
  ));
12040
12439
  }
12041
12440
  if (items.length === 0) return null;
12042
- return import_react22.default.createElement("div", { className: "dockchip-row" }, items);
12441
+ return import_react24.default.createElement("div", { className: "dockchip-row" }, items);
12043
12442
  }
12044
12443
  function FeatureOverlays() {
12045
- const [, force] = import_react22.default.useReducer((n) => n + 1, 0);
12444
+ const [, force] = import_react24.default.useReducer((n) => n + 1, 0);
12046
12445
  useExternalVersion();
12047
- import_react22.default.useEffect(() => subscribeFeatureState(() => force()), []);
12446
+ import_react24.default.useEffect(() => subscribeFeatureState(() => force()), []);
12048
12447
  const items = [];
12049
12448
  for (const f of allModules()) {
12050
12449
  if (f.planned || !stateOf(f.id).enabled || typeof f.Overlay !== "function") continue;
12051
- items.push(import_react22.default.createElement(
12450
+ items.push(import_react24.default.createElement(
12052
12451
  FeatureBoundary,
12053
12452
  { key: f.id, label: f.name },
12054
- import_react22.default.createElement(f.Overlay, { ctx: ctxRef.current, feature: f })
12453
+ import_react24.default.createElement(f.Overlay, { ctx: ctxRef.current, feature: f })
12055
12454
  ));
12056
12455
  }
12057
12456
  if (items.length === 0) return null;
12058
- return import_react22.default.createElement(import_react22.default.Fragment, null, items);
12457
+ return import_react24.default.createElement(import_react24.default.Fragment, null, items);
12059
12458
  }
12060
12459
  var ctxRef = { current: null };
12061
12460
  function apply(ctx) {
@@ -12066,23 +12465,23 @@ function apply(ctx) {
12066
12465
  if (slots === void 0) return;
12067
12466
  slots.inject("sidebar.footer.action", () => slots.register(
12068
12467
  { name: "sidebar.footer.action", id: "dsh-dock", order: 1, label: "\u529F\u80FD\u575E" },
12069
- (props) => import_react22.default.createElement(DockEntry, props)
12468
+ (props) => import_react24.default.createElement(DockEntry, props)
12070
12469
  ));
12071
12470
  slots.inject("shell.overlay", () => slots.register(
12072
12471
  { name: "shell.overlay", id: "dsh-dock-panel", order: 21, label: "\u529F\u80FD\u575E\u9762\u677F" },
12073
- () => import_react22.default.createElement(DockModal, null)
12472
+ () => import_react24.default.createElement(DockModal, null)
12074
12473
  ));
12075
12474
  slots.inject("shell.overlay", () => slots.register(
12076
12475
  { name: "shell.overlay", id: "dsh-dock-feature-overlays", order: 22, label: "\u529F\u80FD\u575E\u5168\u5C40\u6D6E\u5C42" },
12077
- () => import_react22.default.createElement(FeatureOverlays, null)
12476
+ () => import_react24.default.createElement(FeatureOverlays, null)
12078
12477
  ));
12079
12478
  slots.inject("settings.section", () => slots.register(
12080
12479
  { name: "settings.section", id: "dsh-dock", order: 90, label: "\u529F\u80FD\u575E" },
12081
- (props) => import_react22.default.createElement(DockPanel, props)
12480
+ (props) => import_react24.default.createElement(DockPanel, props)
12082
12481
  ));
12083
12482
  slots.inject("conversation.input.left", () => slots.register(
12084
12483
  { name: "conversation.input.left", id: "dsh-dock-chips", order: 10, label: "\u529F\u80FD\u575E" },
12085
- (zone) => import_react22.default.createElement(DockChips, Object.assign({}, zone, { ctx: ctxRef.current }))
12484
+ (zone) => import_react24.default.createElement(DockChips, Object.assign({}, zone, { ctx: ctxRef.current }))
12086
12485
  ));
12087
12486
  }
12088
12487
  var inject = ["timer"];