@wenbin_wb/dsh-bridge 2.10.13 → 2.10.15

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/CHANGELOG.md CHANGED
@@ -4,6 +4,41 @@
4
4
 
5
5
  ---
6
6
 
7
+ ## [v2.10.15] - 2026-09-25
8
+
9
+ > 本版为设置页关闭按钮的可用性微调:手机上「✕」更容易点中。
10
+
11
+ ### 🐞 修复
12
+
13
+ - **设置页「✕」触控区偏小**:宿主原生为 28px(本插件移动端曾放到 32px),低于移动端推荐的可点尺寸。现放大到 **40×40**,并把 `top/right` 调整为 4px 使按钮中心与标题/返回行的文字中心基本重合(实测相差 1px);标题右侧 52px 留白仍完整覆盖按钮 44px 的占位,长标题与不可折行超长 token 都不会钻到按钮下面。
14
+
15
+ > ⚠️ 生效说明:纯前端样式调整,刷新页面即可生效,无需重启 dsh。
16
+
17
+ ---
18
+
19
+ ## [v2.10.14] - 2026-09-25
20
+
21
+ > 本版为移动端设置页的体验修复:解决内容被静默裁切、窄屏菜单拥挤、弹窗「✕」位置错乱,以及插件市场的安装确认框被设置弹窗盖住(点「安装」没反应)/ 矮屏下超出屏幕点不到按钮等问题。纯前端样式与交互调整,刷新页面即生效。
22
+
23
+ ### 🐞 修复
24
+
25
+ - **手机设置页内容被静默裁切、页签点不到**:插件此前给设置内容区强制 `overflow-x: hidden`,把宿主本可横向滚动的内容降级成「看不到也滑不出来」(375px 下溢出 42px);第三方设置页(如插件市场)的「已安装」等页签因此完全不可达。现恢复为可滚动,任何设置页的内容至少可达。
26
+ - **窄屏设置菜单拥挤、内容列过窄**:≤480px 改为「分类列表 → 内容页」两级导航,内容列由 277px 提升到 355px(+28%),分类文字由 10.5px 恢复到 15px、触控行 52px;481–767px 保留左侧轨道但放宽到 88px / 11.5px,并去掉会从词中间断字的 `word-break: break-all`。
27
+ - **横屏小屏设置分类末项被切**:导航单元格不再被压缩,并对矮视口单独收紧,6 个分类无需滚动即全部落位(此前末项被切约 7px)。
28
+ - **设置弹窗「✕」位置错乱**:宿主 DOM 中「✕」属于内容区头部、标题属于导航区,此前两者被拆到两行(列表页「✕」在标题上一行、内容页「✕」在返回行下一行)。现「✕」回到面板右上角并与标题/返回行同一行;宿主与第三方的页面操作按钮统一下沉为底部动作栏。
29
+ - **插件市场点「安装」没有反应**:本插件把设置弹窗抬到 `z-index: 10002`,而第三方安装确认框的模态根只有 `1000`;其内部对话框虽被既有规则抬到 `10005`,但 `z-index` 逃不出祖先层叠上下文,整棵子树被盖死。现按「`<body>` 直接子级 + 自带遮罩/含 `role=dialog` 子元素」这一结构特征,把此类浮层抬到设置弹窗之上(仅在设置弹窗打开时生效,不硬编码第三方类名)。
30
+ - **矮屏下安装确认框超出视口、按钮点不到**:该确认框固定 584px 高且 `overflow-y: hidden`,横屏手机(375px 高)下被居中撑开后上下同时被切、底部按钮落到视口外。现约束其不超过视口并允许框内滚动(自限性:正常竖屏下不产生任何视觉变化)。
31
+ - **「远程访问」版本状态行把「检查更新」按钮顶出可视区**:状态行左组补 `flexWrap`/`minWidth:0`,按钮补 `nowrap` + `flexShrink:0`。
32
+ - **设置页内页签被切断却无从得知可以横滑**:Tab 条增加边缘渐隐提示,切换时当前页签自动滚入可视区。
33
+
34
+ ### 🧪 测试
35
+
36
+ - 新增 `test/mobile-settings-narrow-layout.test.mjs`(12 条):断点与产物同步、钻取布局与就绪开关门控、`✕` 同行与让位、第三方模态框层叠与视口约束、跨文件断点一致性等结构断言,并配四套变异自检(共 32 组绕过尝试,全部被拦下)。
37
+
38
+ > ⚠️ 生效说明:纯前端改动,刷新页面即可生效,无需重启 dsh。
39
+
40
+ ---
41
+
7
42
  ## [v2.10.13] - 2026-09-23
8
43
 
9
44
  > 本版为可靠性与兼容性加固:修复 cloudflared 连接器"假死"(进程存活但边缘连接全掉)造成的公网隧道静默失效(新增运行时健康探针与输出落盘);跟随 DSH 0.1.5 的官方目录选择器,让本机访问不再误弹插件的远程抽屉;并修复添加工作区弹窗的状态泄漏卡死。
package/client/client.js CHANGED
@@ -51,6 +51,55 @@ var MOBILE_STYLES_CSS = `
51
51
  --dsh-mobile-safe-bottom: env(safe-area-inset-bottom, 0px);
52
52
  }
53
53
 
54
+ /* \u6302\u5728 <body> \u4E0B\u3001\u81EA\u5E26\u906E\u7F69\u7684\u300C\u6A21\u6001\u6839\u300D\u5FC5\u987B\u80FD\u76D6\u5728\u8BBE\u7F6E\u5F39\u7A97\u4E4B\u4E0A\u3002
55
+ \u2014\u2014 \u8FD9\u662F\u672C\u63D2\u4EF6\u62AC\u9AD8\u8BBE\u7F6E\u5F39\u7A97\u5C42\u53E0\u540E\u5FC5\u987B\u81EA\u5DF1\u8865\u4E0A\u7684\u4E00\u73AF\uFF08\u8C01\u62AC\u7684\u8C01\u8D1F\u8D23\uFF09\u3002
56
+
57
+ \u6545\u969C\u73B0\u8C61\uFF1A\u63D2\u4EF6\u5E02\u573A\u8BBE\u7F6E\u9875\u70B9\u300C\u5B89\u88C5\u300D\u6CA1\u6709\u4EFB\u4F55\u53CD\u5E94\u3002
58
+ \u6839\u56E0\u94FE\uFF1A
59
+ 1) \u672C\u63D2\u4EF6\u628A\u8BBE\u7F6E\u5F39\u7A97\u62AC\u5230 z-index:10002\uFF08\u89C1\u4E0B\u9762 @media \u5757\uFF09\uFF0C\u4EE5\u4FBF\u76D6\u4F4F\u81EA\u5DF1\u6E32\u67D3\u7684
60
+ \u79FB\u52A8\u7AEF\u9876\u680F(9998)/\u62BD\u5C49\u906E\u7F69(9999)\uFF1B
61
+ 2) \u63D2\u4EF6\u5E02\u573A\uFF08dshmarket 1.44.0\uFF09\u7684\u5B89\u88C5\u786E\u8BA4\u6846\u662F\u6302\u5728 <body> \u4E0B\u7684
62
+ div._root_w1urq_2\uFF0Cposition:fixed\uFF0C\u4F46\u53EA\u6709 z-index:1000\uFF1B
63
+ 3) \u8BE5\u6D6E\u5C42\u5185\u90E8\u7684\u5BF9\u8BDD\u6846 div._dialog_w1urq_22 \u867D\u7136\u5E26 role="dialog"\u3001\u88AB\u4E0B\u9762\u7684
64
+ 10005 \u89C4\u5219\u62AC\u8D77\u6765\u4E86\uFF0C**\u4F46 z-index \u65E0\u6CD5\u9003\u51FA\u7956\u5148\u7684\u5C42\u53E0\u4E0A\u4E0B\u6587** \u2014\u2014 \u5916\u5C42\u6A21\u6001\u6839
65
+ \u53EA\u6709 1000\uFF0C\u6574\u68F5\u5B50\u6811\uFF08\u8FDE\u540C\u90A3\u4E2A 10005\uFF09\u4E00\u8D77\u88AB\u8BBE\u7F6E\u5F39\u7A97(10002)\u76D6\u6B7B\uFF1B
66
+ 4) \u7ED3\u679C\uFF1A\u7AD6\u5C4F\u70B9\u5B89\u88C5\u5B8C\u5168\u770B\u4E0D\u5230\u6D6E\u5C42\uFF08\u8BBE\u7F6E\u5F39\u7A97\u7684\u906E\u7F69\u5728 elementFromPoint \u4E0A\u547D\u4E2D\uFF09\uFF1B
67
+ \u6A2A\u5C4F\uFF08\u5BBD\u5EA6 > 767 \u65F6\u672C\u63D2\u4EF6\u6837\u5F0F\u4E0D\u751F\u6548\uFF0C\u8BBE\u7F6E\u5F39\u7A97\u56DE\u843D\u6210\u5BBF\u4E3B\u7684 1000\uFF09\u6D6E\u5C42\u867D\u51FA\u73B0\uFF0C
68
+ \u5374\u4E0E\u9875\u9762\u5185\u5BB9\u4E92\u76F8\u7A7F\u900F\u3001\u663E\u793A\u4E0D\u5B8C\u6574\u3002
69
+
70
+ \u9009\u62E9\u5668\u523B\u610F\u4E0D\u786C\u7F16\u7801\u4EFB\u4F55\u7B2C\u4E09\u65B9\u7C7B\u540D/\u54C8\u5E0C\uFF0C\u53EA\u8BA4\u6A21\u6001\u6839\u7684\u4E24\u4E2A**\u7ED3\u6784\u7279\u5F81**\uFF1A
71
+ \u300Cbody \u7684\u76F4\u63A5\u5B50\u7EA7\u300D+\u300C\u81EA\u5E26\u906E\u7F69\u5B50\u5143\u7D20\uFF08\u6216\u6709 role=dialog \u5B50\u5143\u7D20\uFF09\u300D\u3002
72
+ \u5B9E\u6D4B\u5728\u6253\u5F00\u8BBE\u7F6E\u524D/\u540E/\u70B9\u5B89\u88C5\u540E\u4E09\u4E2A\u9636\u6BB5\uFF0C\u672C\u9875\u9762\u4E0A\u8BE5\u9009\u62E9\u5668**\u53EA\u547D\u4E2D\u5E02\u573A\u90A3\u4E00\u4E2A\u6D6E\u5C42**\uFF0C
73
+ \u65E0\u8BEF\u4F24\uFF1B\u672C\u63D2\u4EF6\u81EA\u5DF1\u7684 #dsh-remote-workspace-modal \u6709 ID \u89C4\u5219(100000)\uFF0C\u4F18\u5148\u7EA7\u66F4\u9AD8\uFF0C
74
+ \u4E0D\u53D7\u5F71\u54CD\u3002\u4EC5\u5728\u8BBE\u7F6E\u5F39\u7A97\u6253\u5F00\u65F6\u751F\u6548\uFF08body:has(...)\uFF09\uFF0C\u628A\u5F71\u54CD\u9762\u538B\u5230\u6700\u5C0F\u3002
75
+
76
+ \u3010\u5DF2\u77E5\u8FB9\u754C\u3011\u5224\u636E\u53EA\u770B\u7ED3\u6784\uFF0C\u65E0\u6CD5\u533A\u5206\u300C\u771F\u6A21\u6001\u300D\u4E0E\u300C\u6070\u597D\u957F\u6210\u8FD9\u6837\u3001\u4E14\u4E0D\u53EF\u5173\u95ED\u7684\u5168\u5C4F
77
+ \u906E\u7F69\u300D\u3002\u82E5\u67D0\u4E2A\u63D2\u4EF6\u5F80 <body> \u4E0B\u6302\u4E00\u4E2A\u5E26 mask \u5B50\u5143\u7D20\u7684\u5168\u5C4F\u5C42\uFF0C\u5B83\u4E5F\u4F1A\u88AB\u62AC\u5230\u8BBE\u7F6E
78
+ \u5F39\u7A97\u4E4B\u4E0A\u5E76\u76D6\u4F4F\u8BBE\u7F6E\u9875\u3002\u8FD9\u662F\u300C\u6A21\u6001\u5C31\u8BE5\u76D6\u5728\u8BBE\u7F6E\u5F39\u7A97\u4E4B\u4E0A\u300D\u7684\u65E2\u5B9A\u53D6\u820D\uFF1A\u5B81\u53EF\u8BA9\u771F\u6A21\u6001
79
+ \u53EF\u89C1\uFF0C\u4E5F\u4E0D\u63A5\u53D7"\u5F39\u4E86\u5374\u70B9\u4E0D\u5230"\u3002\u72EC\u7ACB\u9A8C\u6536\u5DF2\u5B9E\u6D4B\u8BE5\u6784\u9020\u4F1A\u547D\u4E2D\uFF1B\u82E5\u5C06\u6765\u771F\u8E29\u5230\uFF0C
80
+ \u5E94\u6539\u4E3A\u6309\u300C\u8BE5\u6D6E\u5C42\u662F\u5426\u53EF\u5173\u95ED\u300D\u8FDB\u4E00\u6B65\u6536\u7A84\uFF0C\u800C\u4E0D\u662F\u56DE\u9000\u8FD9\u6761\u89C4\u5219\u3002 */
81
+ body:has(div[class*="VOzbGW_overlay"]) > div:has(> div[class*="mask"], > div[role="dialog"]) {
82
+ z-index: 10050 !important;
83
+ }
84
+
85
+ /* \u540C\u4E0A\u573A\u666F\u7684\u7B2C\u4E8C\u4E2A\u72EC\u7ACB\u95EE\u9898\uFF1A\u7B2C\u4E09\u65B9\u6A21\u6001\u5BF9\u8BDD\u6846\u300C\u6BD4\u89C6\u53E3\u8FD8\u9AD8\u300D\u3002
86
+ \u63D2\u4EF6\u5E02\u573A\u7684\u5B89\u88C5\u786E\u8BA4\u6846\u662F\u56FA\u5B9A 584px \u9AD8 + overflow-y:hidden\uFF0C\u5728\u77EE\u89C6\u53E3\uFF08\u6A2A\u5C4F\u624B\u673A
87
+ 320\u2013430px \u9AD8\uFF0C\u4EE5\u53CA 320\xD7480 \u8FD9\u7C7B\u5C0F\u5C4F\uFF09\u91CC\u88AB\u5C45\u4E2D\u6491\u5F00 \u2192 \u4E0A\u4E0B\u540C\u65F6\u88AB\u5207\u6389\uFF0C\u5E95\u90E8
88
+ \u300CCancel / Confirm install\u300D\u843D\u5230\u89C6\u53E3\u4E4B\u5916\uFF0C\u7528\u6237\u70B9\u4E0D\u5230\u3001\u6D41\u7A0B\u8D70\u4E0D\u4E0B\u53BB
89
+ \uFF08\u5B9E\u6D4B 667\xD7375 \u65F6\u5BF9\u8BDD\u6846 rect y=-116 h=608\u3001\u6309\u94AE y=432\uFF1B844\xD7390 \u540C\u6837\uFF09\u3002
90
+
91
+ \u4FEE\u6CD5\u662F\u8BA9\u6A21\u6001\u5BF9\u8BDD\u6846\u4E0D\u8D85\u8FC7\u89C6\u53E3\u5E76\u5141\u8BB8\u5185\u90E8\u6EDA\u52A8\u3002\u8FD9\u6761\u662F**\u81EA\u9650\u6027**\u7684\uFF1A
92
+ max-height \u53EA\u5728\u300C\u89C6\u53E3\u6BD4\u5BF9\u8BDD\u6846\u77EE\u300D\u65F6\u624D\u8D77\u4F5C\u7528 \u2014\u2014 375\xD7667 / 390\xD7844 \u7B49\u6B63\u5E38\u7AD6\u5C4F\u4E0B
93
+ 100dvh-16px(=651/828) > 584\uFF0C\u58F0\u660E\u4E0D\u4EA7\u751F\u4EFB\u4F55\u89C6\u89C9\u53D8\u5316\u3002
94
+ vh \u4E0E dvh \u5404\u5199\u4E00\u904D\uFF1A\u4E0D\u652F\u6301 dvh \u7684\u73AF\u5883\u9000\u56DE vh\uFF1B\u4E24\u6761\u90FD\u5931\u6548\u4E5F\u53EA\u662F\u4FDD\u6301\u539F\u6837\u3002 */
95
+ body:has(div[class*="VOzbGW_overlay"]) > div:has(> div[role="dialog"]) > div[role="dialog"] {
96
+ /* \u7559 32px \u800C\u4E0D\u662F 16px\uFF1A\u8BE5\u5BF9\u8BDD\u6846\u662F content-box + 24px \u7EB5\u5411\u5185\u8FB9\u8DDD\uFF0C
97
+ \u6309\u5185\u5BB9\u76D2\u7B97\u7684 max-height \u4F1A\u518D\u591A\u51FA\u5185\u8FB9\u8DDD\u7684\u8FB9\u6846\u76D2\u9AD8\u5EA6\uFF0C16px \u65F6\u4ECD\u6EA2\u51FA 4px\u3002 */
98
+ max-height: calc(100vh - 32px) !important;
99
+ max-height: calc(100dvh - 32px) !important;
100
+ overflow-y: auto !important;
101
+ }
102
+
54
103
  /* \u65AD\u70B9\u4E0E\u5BBF\u4E3B\u5224\u636E\u5BF9\u9F50\uFF1A\u5BBF\u4E3B\u7528 viewportWidth < 768 \u51B3\u5B9A\u53F3\u4FA7\u680F\u81EA\u52A8\u5168\u5C4F
55
104
  \uFF08dsh-client-ui-sidebar-right/lib/client.js\uFF09\uFF0C\u6545\u79FB\u52A8\u7AEF\u6837\u5F0F\u53D6 <=767px\uFF0C
56
105
  768px \u8D77\u5F7B\u5E95\u4EA4\u8FD8\u684C\u9762\u5E03\u5C40\uFF0C\u907F\u514D"\u6865\u6E32\u67D3\u9876\u680F\u3001\u5BBF\u4E3B\u5374\u672A\u5168\u5C4F"\u7684\u9519\u4F4D\u3002 */
@@ -695,56 +744,91 @@ var MOBILE_STYLES_CSS = `
695
744
  box-shadow: 0 20px 40px rgba(0, 0, 0, 0.25) !important;
696
745
  background: var(--dsw-alias-bg-layer-1, #ffffff) !important;
697
746
  }
747
+ /* 6.1 481\u2013767px\uFF1A\u4FDD\u7559\u5DE6\u4FA7\u56FE\u6807\u8F68\u9053\u3002
748
+ 78px \u8F68\u9053\u628A "Agent presets"/"Plugin Market" \u6324\u5230\u4E24\u4FA7\u53EA\u5269 ~5px\u3001\u6807\u7B7E\u88AB\u538B\u5230
749
+ 10.5px \u4E14 word-break:break-all \u4F1A\u4ECE\u8BCD\u4E2D\u95F4\u65AD\u5B57\uFF0C\u6545\u653E\u5BBD\u5230 88px / 11.5px\uFF0C
750
+ \u5E76\u6539\u7528 overflow-wrap \u515C\u5E95\uFF08\u6B63\u5E38\u5355\u8BCD\u4E0D\u518D\u88AB\u62C6\uFF09\u3002 */
698
751
  nav[class*="VOzbGW_nav"] {
699
- width: 78px !important;
700
- min-width: 78px !important;
701
- max-width: 78px !important;
702
- padding: 10px 4px !important;
752
+ width: 88px !important;
753
+ min-width: 88px !important;
754
+ max-width: 88px !important;
755
+ padding: 10px 6px !important;
703
756
  box-sizing: border-box !important;
704
757
  border-right: 1px solid var(--dsw-alias-border-l2, #e5e7eb) !important;
705
758
  display: flex !important;
706
759
  flex-direction: column !important;
707
760
  gap: 6px !important;
708
761
  overflow-y: auto !important;
762
+ overscroll-behavior: contain !important;
709
763
  }
710
764
  nav[class*="VOzbGW_nav"] button[class*="VOzbGW_navCell"],
711
765
  button[class*="VOzbGW_navCell"] {
712
- padding: 8px 2px !important;
766
+ padding: 7px 2px !important;
713
767
  display: flex !important;
714
768
  flex-direction: column !important;
715
769
  align-items: center !important;
716
770
  justify-content: center !important;
717
771
  text-align: center !important;
718
772
  height: auto !important;
719
- min-height: 48px !important;
720
- gap: 4px !important;
773
+ min-height: 46px !important;
774
+ /* flex:none\uFF1A\u5355\u5143\u683C\u4E0D\u5F97\u88AB\u538B\u7F29\uFF0C\u5426\u5219\u77EE\u89C6\u53E3\u4E0B\u672B\u9879\u4F1A\u8D34\u7740\u8F68\u9053\u4E0B\u6CBF\u88AB\u5207\u6389 */
775
+ flex: 0 0 auto !important;
776
+ gap: 3px !important;
721
777
  border-radius: 10px !important;
722
778
  }
723
779
  span[class*="VOzbGW_navLabel"] {
724
- font-size: 10.5px !important;
725
- line-height: 1.2 !important;
780
+ font-size: 11.5px !important;
781
+ line-height: 1.25 !important;
726
782
  white-space: normal !important;
727
- word-break: break-all !important;
783
+ word-break: normal !important;
784
+ overflow-wrap: anywhere !important;
728
785
  text-align: center !important;
729
786
  }
787
+
788
+ /* \u77EE\u89C6\u53E3\uFF08\u6A2A\u5C4F\u624B\u673A\uFF09\uFF1A\u538B\u7F29\u8F68\u9053\u5355\u5143\u683C\uFF0C\u4FDD\u8BC1 6 \u4E2A\u5206\u7C7B\u5168\u90E8\u843D\u5728\u9762\u677F\u5185\uFF0C
789
+ \u800C\u4E0D\u662F\u9760 nav \u81EA\u8EAB\u7684 overflow-y \u6EDA\u52A8\u628A\u672B\u9879\u85CF\u8D77\u6765\uFF08\u5F53\u524D\u65E0\u4EFB\u4F55\u53EF\u6EDA\u52A8\u63D0\u793A\uFF09\u3002 */
790
+ @media (max-height: 500px) {
791
+ nav[class*="VOzbGW_nav"] {
792
+ padding: 8px 6px !important;
793
+ gap: 4px !important;
794
+ }
795
+ nav[class*="VOzbGW_nav"] button[class*="VOzbGW_navCell"],
796
+ button[class*="VOzbGW_navCell"] {
797
+ min-height: 40px !important;
798
+ padding: 4px 2px !important;
799
+ }
800
+ div[class*="VOzbGW_navTitle"] {
801
+ font-size: 13px !important;
802
+ line-height: 1.3 !important;
803
+ padding: 0 4px !important;
804
+ }
805
+ }
806
+
730
807
  div[class*="VOzbGW_content"] {
731
808
  flex: 1 1 auto !important;
732
809
  min-width: 0 !important;
733
- width: calc(100% - 78px) !important;
734
- max-width: calc(100% - 78px) !important;
810
+ width: calc(100% - 88px) !important;
811
+ max-width: calc(100% - 88px) !important;
735
812
  display: flex !important;
736
813
  flex-direction: column !important;
737
814
  overflow: hidden !important;
738
815
  }
816
+ /* overflow-x \u5FC5\u987B\u662F auto \u800C\u4E0D\u662F hidden\uFF1A\u5BBF\u4E3B\u539F\u6837\u5F0F\u53EA\u5199\u4E86 overflow-y:auto\uFF0C
817
+ \u6309 CSS Overflow \u89C4\u8303 overflow-x \u4F1A\u8BA1\u7B97\u4E3A auto\uFF08\u53EF\u6A2A\u6ED1\uFF09\u3002\u6B64\u524D\u63D2\u4EF6\u5F3A\u5236
818
+ hidden\uFF0C\u628A\u300C\u53EF\u6EDA\u52A8\u300D\u964D\u7EA7\u6210\u300C\u9759\u9ED8\u88C1\u5207\u300D\u2014\u2014\u6EA2\u51FA\u5185\u5BB9\u65E2\u770B\u4E0D\u5230\u4E5F\u6ED1\u4E0D\u51FA\u6765
819
+ \uFF08\u5B9E\u6D4B 375px \u4E0B\u88C1\u6389 42px\uFF0CPlugin Market \u7684 Installed/Advanced \u4E24\u4E2A Tab
820
+ \u76F4\u63A5\u4E0D\u53EF\u8FBE\uFF09\u3002\u8FD9\u91CC\u6062\u590D\u5BBF\u4E3B\u9ED8\u8BA4\uFF0C\u4FDD\u8BC1\u4EFB\u4F55\u7B2C\u4E09\u65B9\u8BBE\u7F6E\u8282\u7684\u5185\u5BB9\u81F3\u5C11\u53EF\u8FBE\u3002 */
739
821
  div[class*="VOzbGW_options"] {
740
822
  flex: 1 1 auto !important;
741
823
  width: 100% !important;
742
824
  max-width: 100% !important;
825
+ min-width: 0 !important;
743
826
  box-sizing: border-box !important;
744
827
  padding: 0 14px 20px !important;
745
- overflow-x: hidden !important;
828
+ overflow-x: auto !important;
746
829
  overflow-y: auto !important;
747
830
  -webkit-overflow-scrolling: touch !important;
831
+ overscroll-behavior: contain !important;
748
832
  }
749
833
 
750
834
  /* \u8BBE\u7F6E\u4E2D\u5FC3\u9009\u9879\u884C\u624B\u673A\u81EA\u9002\u5E94\uFF08\u5782\u76F4\u6D41\u5F0F\uFF0C\u9632\u6587\u5B57\u5355\u5B57\u6298\u884C\uFF09 */
@@ -754,12 +838,15 @@ var MOBILE_STYLES_CSS = `
754
838
  align-items: stretch !important;
755
839
  gap: 8px !important;
756
840
  width: 100% !important;
841
+ /* min-width:0\uFF1A\u8BA9 flex \u5B50\u9879\u53EF\u4EE5\u771F\u6B63\u6536\u7F29\uFF0C\u800C\u4E0D\u662F\u628A\u7236\u5BB9\u5668\u9876\u5BBD\u540E\u6EA2\u51FA */
842
+ min-width: 0 !important;
757
843
  padding: 12px 0 !important;
758
844
  box-sizing: border-box !important;
759
845
  }
760
846
  div[class*="VOzbGW_options"] div[class*="_rowText"] {
761
847
  width: 100% !important;
762
848
  max-width: 100% !important;
849
+ min-width: 0 !important;
763
850
  }
764
851
  div[class*="VOzbGW_options"] button[class*="_selector"],
765
852
  div[class*="VOzbGW_options"] select,
@@ -827,6 +914,211 @@ var MOBILE_STYLES_CSS = `
827
914
  }
828
915
  }
829
916
 
917
+ /* 6.2 <=480px \u624B\u673A\u7AD6\u5C4F\uFF1A\u8BBE\u7F6E\u4E2D\u5FC3\u6539\u4E3A\u300C\u4E24\u7EA7\u94BB\u53D6\u300D\u3002
918
+ \u4FA7\u8FB9\u8F68\u9053\u5728 375px \u5C4F\u4E0A\u8981\u5403\u6389 88px\uFF0821% \u5BBD\u5EA6\uFF09\uFF0C\u5185\u5BB9\u5217\u53EA\u5269 277px\uFF0C\u7B2C\u4E09\u65B9\u8BBE\u7F6E\u8282
919
+ \uFF08Plugin Market \u7684 Tab \u6761\u9700 470px\uFF09\u5FC5\u7136\u6EA2\u51FA\u3002\u6539\u4E3A\uFF1A\u5206\u7C7B\u5217\u8868\u9875 \u2194 \u5185\u5BB9\u8BE6\u60C5\u9875\uFF0C
920
+ \u5185\u5BB9\u72EC\u5360\u6574\u5BBD\uFF08375px \u4E0B\u7531 277px \u63D0\u5347\u5230 355px\uFF0C+28%\uFF09\uFF0C\u6807\u7B7E\u56DE\u5230 15px\u3001\u89E6\u63A7\u884C 52px\u3002
921
+
922
+ \u3010\u6574\u5757\u7531 html[data-dshbr-drilldown="ready"] \u95E8\u63A7\u3011
923
+ \u672C\u5757\u9ED8\u8BA4\u628A\u5185\u5BB9\u533A\uFF08options\uFF09\u9690\u85CF\u3001\u53EA\u663E\u793A\u5206\u7C7B\u5217\u8868\uFF1B\u80FD\u4E0D\u80FD\u4ECE\u5217\u8868\u8D70\u8FDB\u5185\u5BB9\uFF0C\u5B8C\u5168
924
+ \u53D6\u51B3\u4E8E client/index.js \u7684\u70B9\u51FB\u76D1\u542C\u5668\u3002\u6240\u4EE5\u672C\u5757\u4E0D\u80FD\u4EE5\u300CJS \u4E00\u5B9A\u5728\u300D\u4E3A\u65E0\u6761\u4EF6\u524D\u63D0\uFF1A
925
+ \u5F00\u5173\u6CA1\u6253\u5F00\u65F6\u672C\u5757\u6574\u4F53\u60F0\u6027\uFF0C<=480px \u9000\u56DE 767 \u5757\u7684 88px \u56FE\u6807\u8F68\u9053\uFF08\u7A84\uFF0C\u4F46\u5206\u7C7B\u4E0E
926
+ \u5185\u5BB9\u90FD\u5B8C\u6574\u53EF\u8FBE\uFF09\uFF0C\u4E0D\u4F1A\u51FA\u73B0\u300C\u5185\u5BB9\u88AB\u85CF\u4E86\u3001\u53C8\u6CA1\u4EBA\u80FD\u628A\u7528\u6237\u5E26\u8FDB\u53BB\u300D\u7684\u6B7B\u5217\u8868\u3002
927
+
928
+ \u5F00\u5173\u4F55\u65F6\u6253\u5F00\uFF08client/index.js \u7684 setupSettingsDrilldown\uFF09\uFF1A
929
+ - \u8BE5\u51FD\u6570\u662F apply() \u7684\u7B2C\u4E00\u6761\u8BED\u53E5\uFF0C\u65E9\u4E8E\u6CE8\u5165\u672C CSS \u7684 injectMobileStyles()\uFF1B
930
+ - \u53EA\u6709 document.addEventListener('click', \u2026) \u6210\u529F\u8FD4\u56DE\u540E\u624D\u6253\u4E0A ready\u3002
931
+ \u56E0\u6B64\u300C\u672C CSS \u5DF2\u751F\u6548\u3001\u800C\u70B9\u51FB\u76D1\u542C\u5668\u6CA1\u88C5\u4E0A\u300D\u5728\u53EF\u6267\u884C\u8DEF\u5F84\u4E0A\u4E0D\u53EF\u8FBE\uFF1B\u5373\u4F7F\u5C06\u6765\u6709\u4EBA\u628A
932
+ \u8BE5\u8C03\u7528\u632A\u5230\u4F1A\u629B\u5F02\u5E38\u7684\u521D\u59CB\u5316\u4E4B\u540E\uFF0C\u5F00\u5173\u672A\u5F00\u4E5F\u53EA\u662F\u9000\u56DE\u8F68\u9053\u5E03\u5C40\u3002
933
+
934
+ \u660E\u786E\u672A\u8986\u76D6\uFF1A\u65E0\u6CD5\u5728\u811A\u672C\u5185\u63A2\u6D4B\u300CaddEventListener \u88AB\u73AF\u5883\u9759\u9ED8\u4E22\u5F03\u300D\u8FD9\u7C7B\u5F02\u5E38 \u2014\u2014
935
+ \u8981\u505A\u8FD9\u79CD\u81EA\u68C0\u5C31\u5FC5\u987B\u5728 document \u4E0A\u6D3E\u53D1\u5408\u6210 click\uFF0C\u800C\u5BBF\u4E3B\u4E0E\u7B2C\u4E09\u65B9\u63D2\u4EF6\u5408\u8BA1\u6709 6 \u4E2A
936
+ document \u7EA7 click \u76D1\u542C\uFF08\u53E6\u6709\u591A\u7EC4 mousedown/pointerdown\uFF09\u4F1A\u88AB\u8BEF\u89E6\u53D1\uFF0C\u5F97\u4E0D\u507F\u5931\u3002
937
+ \u63D2\u4EF6 JS \u5B8C\u5168\u4E0D\u6267\u884C\u65F6\u672C CSS \u4E5F\u4E0D\u4F1A\u6CE8\u5165\uFF0C\u540C\u6837\u4E0D\u4F1A\u85CF\u5185\u5BB9\u3002
938
+
939
+ \u5F00\u5173\u653E\u5728 <html> \u800C\u975E panel\uFF1A\u76D1\u542C\u5668\u5FC5\u987B\u5728\u5F39\u7A97\u51FA\u73B0\u4E4B\u524D\u5C31\u88C5\u597D\uFF0C\u90A3\u65F6 panel \u8FD8\u4E0D\u5B58\u5728\u3002
940
+
941
+ panel \u4E0A\u7684 data-dshbr-settings-view \u53EA\u8868\u8FBE\u300C\u5217\u8868\u9875 / \u8BE6\u60C5\u9875\u300D\uFF1A
942
+ - \u65E0\u8BE5\u5C5E\u6027\uFF08\u542B\u5F00\u5173\u521A\u6253\u5F00\u7684\u9996\u5E27\uFF09\u2192 \u5206\u7C7B\u5217\u8868\u9875
943
+ - "detail" \u2192 \u5185\u5BB9\u8BE6\u60C5\u9875 */
944
+ @media (max-width: 480px) {
945
+ /* \u9762\u677F\u7531 767 \u5757\u7684\u6A2A\u5411\u8F68\u9053\u5E03\u5C40\uFF08row\uFF09\u6539\u4E3A\u7EB5\u5411\uFF1A\u5217\u8868\u9875/\u8BE6\u60C5\u9875\u90FD\u662F\u4E0A\u4E0B\u7ED3\u6784\u3002
946
+ \u6F0F\u6389\u8FD9\u4E00\u6761\u4F1A\u8BA9 nav \u4E0E content \u5E76\u6392\u62A2\u5BBD\u5EA6\uFF0C\u5206\u7C7B\u5217\u8868\u88AB\u538B\u6210 0 \u5BBD\uFF08\u5B9E\u6D4B options
947
+ \u53EA\u5269 24px\uFF09\uFF0C\u662F\u672C\u65B9\u6848\u6700\u5BB9\u6613\u6F0F\u7684\u5173\u952E\u4E00\u6B65\u3002 */
948
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_panel"] {
949
+ flex-direction: column !important;
950
+ /* \u2715 \u8981\u7EDD\u5BF9\u5B9A\u4F4D\u5230\u9762\u677F\u53F3\u4E0A\u89D2\uFF0C\u5FC5\u987B\u6709\u5B9A\u4F4D\u7956\u5148 */
951
+ position: relative !important;
952
+ }
953
+
954
+ /* \u5173\u95ED\u6309\u94AE\u9489\u5728\u9762\u677F\u53F3\u4E0A\u89D2\uFF0C\u4E0E\u6807\u9898/\u8FD4\u56DE\u884C\u540C\u5904\u7B2C\u4E00\u884C \u2014\u2014 \u8FD9\u662F\u5F39\u7A97\u7684\u5E38\u89C4\u7EA6\u5B9A\u3002
955
+ \u4E4B\u6240\u4EE5\u8981\u7EDD\u5BF9\u5B9A\u4F4D\uFF1A\u5BBF\u4E3B DOM \u91CC \u2715 \u5C5E\u4E8E content>header\uFF0C\u800C\u6807\u9898\u5C5E\u4E8E nav\uFF0C\u4E8C\u8005\u662F
956
+ \u4E24\u68F5\u5B50\u6811\u3002\u6B64\u524D\u9760 order:-1 \u628A content \u63D0\u5230 nav \u4E4B\u524D\uFF0C\u7ED3\u679C \u2715 \u843D\u5728\u6807\u9898\u4E0A\u9762\u4E00\u884C\uFF1B
957
+ \u8BE6\u60C5\u9875\u53CD\u8FC7\u6765\uFF0C\u2715 \u843D\u5230\u8FD4\u56DE\u884C\u4E0B\u9762\u4E00\u884C\u3002\u7EDD\u5BF9\u5B9A\u4F4D\u662F\u552F\u4E00\u80FD\u5728\u4E0D\u6CE8\u5165 DOM \u7684\u524D\u63D0\u4E0B
958
+ \u628A\u4E24\u8005\u62C9\u56DE\u540C\u4E00\u884C\u7684\u529E\u6CD5\u3002 */
959
+ html[data-dshbr-drilldown="ready"] button[class*="VOzbGW_close"] {
960
+ position: absolute !important;
961
+ /* 40\xD740 \u89E6\u63A7\u533A\uFF08\u5BBF\u4E3B\u539F\u4E3A 28px\uFF09\uFF1A\u914D top/right 4px \u540E\u4E2D\u5FC3\u843D\u5728 y=24\uFF0C
962
+ \u4E0E\u6807\u9898\u6587\u5B57\u4E2D\u5FC3\uFF08\u7EA6 23\uFF09\u57FA\u672C\u91CD\u5408\uFF1B\u53F3\u4FA7 4+40=44px \u7684\u5360\u4F4D\u4ECD\u5728\u6807\u9898 52px \u7559\u767D\u4E4B\u5185\u3002 */
963
+ top: 4px !important;
964
+ right: 4px !important;
965
+ width: 40px !important;
966
+ height: 40px !important;
967
+ z-index: 5 !important;
968
+ }
969
+
970
+ /* \u5206\u7C7B\u5217\u8868\u9875\uFF1A\u5185\u5BB9\u533A\u53EA\u5269 header\uFF08\u5BBF\u4E3B/\u7B2C\u4E09\u65B9 action \u69FD\uFF09\uFF0C\u4E0B\u6C89\u4E3A\u5E95\u90E8\u52A8\u4F5C\u680F\u3002
971
+ \u4E0D\u518D\u7528 order:-1 \u2014\u2014 \u6807\u9898\u56DE\u5230 DOM \u987A\u5E8F\u7684\u7B2C\u4E00\u884C\uFF0C\u987A\u5E26\u8BA9\u7126\u70B9\u987A\u5E8F\u4E0E\u89C6\u89C9\u987A\u5E8F\u4E00\u81F4\u3002 */
972
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_panel"]:not([data-dshbr-settings-view="detail"]) > div[class*="VOzbGW_content"] {
973
+ flex: 0 0 auto !important;
974
+ width: 100% !important;
975
+ max-width: 100% !important;
976
+ border-top: 1px solid var(--dsw-alias-border-l2, #e5e7eb) !important;
977
+ }
978
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_panel"]:not([data-dshbr-settings-view="detail"]) div[class*="VOzbGW_options"] {
979
+ display: none !important;
980
+ }
981
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_panel"]:not([data-dshbr-settings-view="detail"]) > nav[class*="VOzbGW_nav"] {
982
+ flex: 1 1 auto !important;
983
+ min-height: 0 !important;
984
+ overflow-y: auto !important;
985
+ overscroll-behavior: contain !important;
986
+ }
987
+
988
+ /* \u8BE6\u60C5\u9875\uFF1A\u6298\u53E0\u5BFC\u822A\u4E3A\u300C\u2039 \u6807\u9898\u300D\u4E00\u884C\uFF0C\u5145\u5F53\u8FD4\u56DE\u5165\u53E3 */
989
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_panel"][data-dshbr-settings-view="detail"] div[class*="VOzbGW_navList"] {
990
+ display: none !important;
991
+ }
992
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_panel"][data-dshbr-settings-view="detail"] > nav[class*="VOzbGW_nav"] {
993
+ flex: 0 0 auto !important;
994
+ overflow: visible !important;
995
+ cursor: pointer !important;
996
+ }
997
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_panel"][data-dshbr-settings-view="detail"] > nav[class*="VOzbGW_nav"]:active {
998
+ background: var(--dsw-alias-interactive-bg-hover, rgba(0, 0, 0, 0.05)) !important;
999
+ }
1000
+ /* \u8BE6\u60C5\u9875\u4E5F\u628A\u52A8\u4F5C\u680F\u6C89\u5230\u5E95\u90E8\uFF0C\u4E0E\u5217\u8868\u9875\u4FDD\u6301\u4E00\u81F4\u3002
1001
+ \u7528 flex order \u4EA4\u6362 header/options \u7684\u89C6\u89C9\u4F4D\u7F6E\uFF1Aoptions \u4ECD\u662F\u90A3\u4E2A overflow:auto
1002
+ \u7684\u6EDA\u52A8\u5BB9\u5668\uFF0C\u6EDA\u52A8\u8BED\u4E49\u4E0D\u53D8\uFF08\u4E0D\u7528 column-reverse\uFF0C\u907F\u514D\u6EDA\u52A8\u539F\u70B9\u7FFB\u8F6C\uFF09\u3002 */
1003
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_panel"][data-dshbr-settings-view="detail"] div[class*="VOzbGW_header"] {
1004
+ order: 2 !important;
1005
+ border-top: 1px solid var(--dsw-alias-border-l2, #e5e7eb) !important;
1006
+ }
1007
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_panel"][data-dshbr-settings-view="detail"] div[class*="VOzbGW_options"] {
1008
+ order: 1 !important;
1009
+ }
1010
+
1011
+ /* \u8F68\u9053\u5728\u7A84\u5C4F\u6539\u6210\u6574\u5BBD\u5217\u8868\u5BB9\u5668 */
1012
+ html[data-dshbr-drilldown="ready"] nav[class*="VOzbGW_nav"] {
1013
+ width: 100% !important;
1014
+ min-width: 0 !important;
1015
+ max-width: 100% !important;
1016
+ padding: 10px 12px 12px !important;
1017
+ gap: 4px !important;
1018
+ border-right: none !important;
1019
+ border-bottom: none !important;
1020
+ }
1021
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_navTitle"] {
1022
+ font-size: 17px !important;
1023
+ line-height: 1.3 !important;
1024
+ /* \u4E0D\u53EF\u6298\u884C\u7684\u8D85\u957F token\uFF08\u65E0\u7A7A\u683C\u957F\u4E32\uFF09\u4F1A\u6574\u5757\u6EA2\u51FA\u3001\u628A\u6587\u5B57\u9876\u5230 \u2715 \u4E0B\u9762\u3002
1025
+ \u72EC\u7ACB\u9A8C\u6536\u5B9E\u6D4B 81 \u5B57\u7B26\u65E0\u7A7A\u683C\u6807\u9898\u65F6\u6587\u5B57\u53F3\u7AEF 823px\u3001\u4E0E \u2715 \u4EA4\u53E0 707px\xB2\u3002
1026
+ overflow-wrap: anywhere \u8BA9\u8FD9\u79CD token \u4E5F\u80FD\u65AD\u884C \u2014\u2014 \u7559\u767D\u53EA\u7BA1\u76D2\u5185\uFF0C\u7BA1\u4E0D\u4F4F\u6EA2\u51FA\u3002 */
1027
+ overflow-wrap: anywhere !important;
1028
+ /* \u53F3\u4FA7 52px \u7ED9\u7EDD\u5BF9\u5B9A\u4F4D\u7684 \u2715 \u8BA9\u4F4D\uFF08\u7D27\u90BB\u89C4\u5219\u91CC\u7684\u58F0\u660E\u4F1A\u88AB\u540E\u7F6E\u540C\u540D\u89C4\u5219\u8986\u76D6\uFF0C
1029
+ \u6240\u4EE5\u7559\u767D\u5FC5\u987B\u5199\u5728\u8FD9\u4E00\u6761\u4E0A\uFF0C\u4E0D\u80FD\u53EA\u5199\u5728\u524D\u9762\u90A3\u6761\uFF09 */
1030
+ padding: 0 52px 4px 4px !important;
1031
+ }
1032
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_navList"] {
1033
+ flex-direction: column !important;
1034
+ gap: 2px !important;
1035
+ width: 100% !important;
1036
+ min-width: 0 !important;
1037
+ }
1038
+
1039
+ /* \u5217\u8868\u884C\uFF1A\u56FE\u6807\u5DE6\u3001\u6587\u5B57\u53F3\u3001\u884C\u5C3E \u203A \u6307\u793A */
1040
+ html[data-dshbr-drilldown="ready"] nav[class*="VOzbGW_nav"] button[class*="VOzbGW_navCell"],
1041
+ html[data-dshbr-drilldown="ready"] button[class*="VOzbGW_navCell"] {
1042
+ flex-direction: row !important;
1043
+ justify-content: flex-start !important;
1044
+ align-items: center !important;
1045
+ text-align: left !important;
1046
+ width: 100% !important;
1047
+ min-height: 52px !important;
1048
+ padding: 12px 14px !important;
1049
+ gap: 12px !important;
1050
+ border-radius: 12px !important;
1051
+ }
1052
+ html[data-dshbr-drilldown="ready"] nav[class*="VOzbGW_nav"] button[class*="VOzbGW_navCell"]::after {
1053
+ content: '' !important;
1054
+ width: 7px !important;
1055
+ height: 7px !important;
1056
+ margin-left: auto !important;
1057
+ flex: none !important;
1058
+ border-right: 1.7px solid var(--dsw-alias-label-tertiary, #9ca3af) !important;
1059
+ border-bottom: 1.7px solid var(--dsw-alias-label-tertiary, #9ca3af) !important;
1060
+ transform: rotate(-45deg) !important;
1061
+ }
1062
+ html[data-dshbr-drilldown="ready"] nav[class*="VOzbGW_nav"] button[class*="VOzbGW_navCell"] svg {
1063
+ width: 20px !important;
1064
+ height: 20px !important;
1065
+ }
1066
+ html[data-dshbr-drilldown="ready"] span[class*="VOzbGW_navLabel"] {
1067
+ font-size: 15px !important;
1068
+ line-height: 1.35 !important;
1069
+ white-space: normal !important;
1070
+ word-break: normal !important;
1071
+ text-align: left !important;
1072
+ flex: 0 1 auto !important;
1073
+ }
1074
+
1075
+ /* \u8BE6\u60C5\u9875\u8FD4\u56DE\u884C\uFF1A\u2039 \u7BAD\u5934 + \u6807\u9898 */
1076
+ /* \u8BE6\u60C5\u9875\u8FD4\u56DE\u884C\uFF1A\u2039 \u7BAD\u5934 + \u6807\u9898\u3002\u53F3\u4FA7\u540C\u6837\u8981\u7559 52px \u7ED9 \u2715 \u2014\u2014
1077
+ \u672C\u6761\u6BD4\u57FA\u7C7B\u591A\u4E00\u4E2A\u5C5E\u6027\u9009\u62E9\u5668\u3001\u7279\u5F02\u6027\u66F4\u9AD8\uFF0C\u4F1A**\u6574\u4F53\u8986\u76D6**\u57FA\u7C7B\u7684 padding\uFF0C
1078
+ \u6240\u4EE5\u7559\u767D\u5FC5\u987B\u5728\u8FD9\u91CC\u518D\u5199\u4E00\u904D\uFF08\u6F0F\u5199\u65F6\u57FA\u7C7B\u7684 52px \u4F1A\u88AB\u8FD9\u6761\u7684 4px \u9876\u6389\uFF0C
1079
+ \u957F\u6807\u9898\u4F1A\u94BB\u5230 \u2715 \u4E0B\u9762\uFF1B\u72EC\u7ACB\u9A8C\u6536\u5B9E\u6D4B\u6CE8\u5165 61 \u5B57\u7B26\u6807\u9898\u540E\u4EA4\u53E0 608/707 px\xB2\uFF09\u3002 */
1080
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_panel"][data-dshbr-settings-view="detail"] div[class*="VOzbGW_navTitle"] {
1081
+ display: flex !important;
1082
+ align-items: center !important;
1083
+ overflow-wrap: anywhere !important;
1084
+ padding: 2px 52px 2px 4px !important;
1085
+ }
1086
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_panel"][data-dshbr-settings-view="detail"] div[class*="VOzbGW_navTitle"]::before {
1087
+ content: '' !important;
1088
+ width: 8px !important;
1089
+ height: 8px !important;
1090
+ margin: 0 10px 0 6px !important;
1091
+ flex: none !important;
1092
+ border-left: 2px solid var(--dsw-alias-label-primary, #111827) !important;
1093
+ border-bottom: 2px solid var(--dsw-alias-label-primary, #111827) !important;
1094
+ transform: rotate(45deg) !important;
1095
+ }
1096
+
1097
+ /* content/header \u5FC5\u987B\u662F static \u2014\u2014 \u2715 \u662F\u7EDD\u5BF9\u5B9A\u4F4D\u7684\uFF0C\u5B83\u7684\u5305\u542B\u5757\u53D6\u51B3\u4E8E\u6700\u8FD1\u7684**\u5B9A\u4F4D\u7956\u5148**\u3002
1098
+ \u672C\u6765\u8FD9\u4E2A\u7956\u5148\u5C31\u662F panel\uFF08\u5BBF\u4E3B\u81EA\u5E26 position:relative\uFF09\uFF1B\u4F46\u4E00\u65E6 content \u6216 header \u88AB
1099
+ \u4EFB\u4F55\u6765\u6E90\uFF08\u672C\u5757\u3001\u5BBF\u4E3B\u5176\u5B83\u89C4\u5219\u3001\u7B2C\u4E09\u65B9\u63D2\u4EF6\uFF09\u8BBE\u6210 relative/absolute\uFF0C\u5305\u542B\u5757\u5C31\u4F1A\u4E0B\u79FB\uFF0C
1100
+ \u2715 \u4F1A\u4ECE\u9762\u677F\u53F3\u4E0A\u89D2\u8DD1\u5230\u5185\u5BB9\u533A\u91CC\u53BB\u3002\u72EC\u7ACB\u9A8C\u6536\u5B9E\u6D4B\uFF1A\u7ED9 content \u52A0 position:relative \u540E
1101
+ \u2715 \u7684 relTop \u7531 9 \u53D8\u6210 579\u3001\u5E76\u4E0E\u5E95\u90E8\u52A8\u4F5C\u680F\u91CD\u53E0 837 px\xB2\u3002 */
1102
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_content"] {
1103
+ position: static !important;
1104
+ width: 100% !important;
1105
+ max-width: 100% !important;
1106
+ flex: 1 1 auto !important;
1107
+ }
1108
+ /* header \u4E0D\u518D\u5F53\u9876\u680F\u7528\uFF1A\u5B83\u73B0\u5728\u53EA\u627F\u8F7D action \u69FD\uFF0C\u9AD8\u5EA6\u968F\u5185\u5BB9\uFF08\u53EF\u80FD\u662F\u5BBF\u4E3B\u7684\u4E00\u4E2A
1109
+ \u6309\u94AE\uFF0C\u4E5F\u53EF\u80FD\u662F\u591A\u4E2A\u63D2\u4EF6\u6CE8\u5165\u7684\u591A\u884C\u6309\u94AE\uFF09\uFF0C\u9760 flex \u81EA\u7136\u6491\u5F00\uFF0C\u4E0D\u8BBE\u56FA\u5B9A\u9AD8\u5EA6\u3002 */
1110
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_header"] {
1111
+ position: static !important;
1112
+ height: auto !important;
1113
+ padding: 8px 10px !important;
1114
+ align-items: center !important;
1115
+ justify-content: flex-end !important;
1116
+ }
1117
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_options"] {
1118
+ padding: 0 12px 16px !important;
1119
+ }
1120
+ }
1121
+
830
1122
  /* \u8FDC\u7A0B\u5DE5\u4F5C\u533A\u9009\u62E9\u5F39\u7A97\u79FB\u52A8\u7AEF/\u684C\u9762\u7AEF\u81EA\u9002\u5E94\u6837\u5F0F */
831
1123
  #dsh-remote-workspace-modal {
832
1124
  position: fixed !important;
@@ -1232,6 +1524,12 @@ if (typeof window !== "undefined") {
1232
1524
  var RESOURCE_URL_COMPAT = installResourceUrlCompat();
1233
1525
  if (typeof window !== "undefined") window.__dshResourceUrlCompat = RESOURCE_URL_COMPAT;
1234
1526
  var MOBILE_MAX_WIDTH = 767;
1527
+ var SETTINGS_DRILLDOWN_MAX_WIDTH = 480;
1528
+ var DRILLDOWN_GATE_ATTR = "data-dshbr-drilldown";
1529
+ var DRILLDOWN_GATE_READY = "ready";
1530
+ var DRILLDOWN_GATE_FLAG = "dshBrDrilldownGate";
1531
+ var SETTINGS_VIEW_ATTR = "data-dshbr-settings-view";
1532
+ var SETTINGS_VIEW_DETAIL = "detail";
1235
1533
  function isLocalEnvironment() {
1236
1534
  if (typeof window === "undefined") return true;
1237
1535
  const host = window.location.hostname || "";
@@ -4095,9 +4393,13 @@ function VersionBanner({ rpcCall }) {
4095
4393
  gap: 8
4096
4394
  }
4097
4395
  },
4396
+ // 左组:版本徽标 + DSH 版本 + 检查更新。
4397
+ // flexWrap + minWidth:0 是必需的:此前只写 display:flex,左组既不能收缩也不能换行,
4398
+ // 会把整行顶到 305px;手机设置页内容列只有 277px,溢出部分被
4399
+ // overflow-x:hidden 静默裁掉(「检查更新」按钮被切一半)。
4098
4400
  React.createElement(
4099
4401
  "div",
4100
- { style: { display: "flex", alignItems: "center", gap: 8 } },
4402
+ { style: { display: "flex", alignItems: "center", gap: 8, flexWrap: "wrap", minWidth: 0 } },
4101
4403
  // 版本状态徽标
4102
4404
  React.createElement(
4103
4405
  "span",
@@ -4153,7 +4455,11 @@ function VersionBanner({ rpcCall }) {
4153
4455
  padding: "0 8px",
4154
4456
  fontSize: 11,
4155
4457
  opacity: loading ? 0.5 : 1,
4156
- gap: 4
4458
+ gap: 4,
4459
+ // 按钮是 inline-flex,文字会成为匿名 flex 项;被挤窄时会把「检查更新」
4460
+ // 折成两行。nowrap + flexShrink:0 保证它整体换行(由父级 flexWrap 负责)。
4461
+ whiteSpace: "nowrap",
4462
+ flexShrink: 0
4157
4463
  },
4158
4464
  onClick: check,
4159
4465
  disabled: loading || upgrading || restarting,
@@ -4445,9 +4751,49 @@ var TABS = [
4445
4751
  { id: "ops", label: "\u8FD0\u7EF4\u76D1\u63A7", icon: Icons.ops }
4446
4752
  ];
4447
4753
  function TabBar({ active, onChange, dots }) {
4754
+ const scrollRef = React.useRef(null);
4755
+ const [edges, setEdges] = React.useState({ left: false, right: false });
4756
+ React.useEffect(() => {
4757
+ const el = scrollRef.current;
4758
+ if (!el) return void 0;
4759
+ const update = () => {
4760
+ const max = el.scrollWidth - el.clientWidth;
4761
+ const left = el.scrollLeft > 1;
4762
+ const right = max > 1 && el.scrollLeft < max - 1;
4763
+ setEdges((prev) => prev.left === left && prev.right === right ? prev : { left, right });
4764
+ };
4765
+ update();
4766
+ el.addEventListener("scroll", update, { passive: true });
4767
+ let observer = null;
4768
+ if (typeof ResizeObserver === "function") {
4769
+ observer = new ResizeObserver(update);
4770
+ observer.observe(el);
4771
+ }
4772
+ return () => {
4773
+ el.removeEventListener("scroll", update);
4774
+ if (observer) observer.disconnect();
4775
+ };
4776
+ }, []);
4777
+ React.useEffect(() => {
4778
+ const el = scrollRef.current;
4779
+ if (!el) return;
4780
+ const target = el.querySelector('[data-dsh-tab-active="true"]');
4781
+ if (!target) return;
4782
+ const elRect = el.getBoundingClientRect();
4783
+ const tabRect = target.getBoundingClientRect();
4784
+ if (tabRect.left < elRect.left) el.scrollLeft -= elRect.left - tabRect.left + 8;
4785
+ else if (tabRect.right > elRect.right) el.scrollLeft += tabRect.right - elRect.right + 8;
4786
+ }, [active]);
4787
+ const maskStops = [];
4788
+ if (edges.left) maskStops.push("transparent 0px", "#000 20px");
4789
+ else maskStops.push("#000 0px");
4790
+ if (edges.right) maskStops.push("#000 calc(100% - 20px)", "transparent 100%");
4791
+ else maskStops.push("#000 100%");
4792
+ const maskImage = `linear-gradient(to right, ${maskStops.join(", ")})`;
4448
4793
  return React.createElement(
4449
4794
  "div",
4450
4795
  {
4796
+ ref: scrollRef,
4451
4797
  className: "dsh-tabbar-container",
4452
4798
  style: {
4453
4799
  display: "flex",
@@ -4459,7 +4805,9 @@ function TabBar({ active, onChange, dots }) {
4459
4805
  maxWidth: "100%",
4460
4806
  flexWrap: "nowrap",
4461
4807
  scrollbarWidth: "none",
4462
- msOverflowStyle: "none"
4808
+ msOverflowStyle: "none",
4809
+ WebkitMaskImage: maskImage,
4810
+ maskImage
4463
4811
  }
4464
4812
  },
4465
4813
  TABS.map(({ id, label, icon: TabIcon }) => {
@@ -4469,6 +4817,7 @@ function TabBar({ active, onChange, dots }) {
4469
4817
  "button",
4470
4818
  {
4471
4819
  key: id,
4820
+ "data-dsh-tab-active": isActive ? "true" : void 0,
4472
4821
  onClick: () => onChange(id),
4473
4822
  style: {
4474
4823
  font: "inherit",
@@ -5304,6 +5653,53 @@ function injectMobileStyles() {
5304
5653
  style.textContent = MOBILE_STYLES_CSS;
5305
5654
  document.head.appendChild(style);
5306
5655
  }
5656
+ function setupSettingsDrilldown() {
5657
+ if (typeof document === "undefined" || typeof window === "undefined") return;
5658
+ const root = document.documentElement;
5659
+ if (root.dataset[DRILLDOWN_GATE_FLAG] === "1") return;
5660
+ root.dataset[DRILLDOWN_GATE_FLAG] = "1";
5661
+ if (typeof window.matchMedia !== "function") return;
5662
+ let narrowQuery;
5663
+ try {
5664
+ narrowQuery = window.matchMedia(`(max-width: ${SETTINGS_DRILLDOWN_MAX_WIDTH}px)`);
5665
+ } catch {
5666
+ return;
5667
+ }
5668
+ if (!narrowQuery) return;
5669
+ const isNarrow = () => narrowQuery.matches === true;
5670
+ const onDocumentClick = (event) => {
5671
+ if (!isNarrow()) return;
5672
+ const target = event.target;
5673
+ if (!target || typeof target.closest !== "function") return;
5674
+ const panel = target.closest('div[class*="VOzbGW_panel"]');
5675
+ if (!panel) return;
5676
+ const nav = panel.querySelector('nav[class*="VOzbGW_nav"]');
5677
+ if (!nav || !nav.contains(target)) return;
5678
+ if (target.closest('button[class*="VOzbGW_navCell"]')) {
5679
+ panel.setAttribute(SETTINGS_VIEW_ATTR, SETTINGS_VIEW_DETAIL);
5680
+ if (nav.scrollTop) nav.scrollTop = 0;
5681
+ return;
5682
+ }
5683
+ if (panel.getAttribute(SETTINGS_VIEW_ATTR) === SETTINGS_VIEW_DETAIL) {
5684
+ panel.removeAttribute(SETTINGS_VIEW_ATTR);
5685
+ }
5686
+ };
5687
+ const syncGate = () => {
5688
+ if (narrowQuery.matches === true) root.setAttribute(DRILLDOWN_GATE_ATTR, DRILLDOWN_GATE_READY);
5689
+ else root.removeAttribute(DRILLDOWN_GATE_ATTR);
5690
+ };
5691
+ try {
5692
+ document.addEventListener("click", onDocumentClick, false);
5693
+ } catch {
5694
+ return;
5695
+ }
5696
+ try {
5697
+ if (typeof narrowQuery.addEventListener === "function") narrowQuery.addEventListener("change", syncGate);
5698
+ else if (typeof narrowQuery.addListener === "function") narrowQuery.addListener(syncGate);
5699
+ } catch {
5700
+ }
5701
+ syncGate();
5702
+ }
5307
5703
  function setupMobileExperience(rpcCall, ctx) {
5308
5704
  if (typeof document === "undefined" || typeof window === "undefined") return;
5309
5705
  injectMobileStyles();
@@ -5997,7 +6393,6 @@ function showRemoteWorkspaceDialog(rpcCall, onWorkspaceAdded, clientCtx, onPicke
5997
6393
  if (!switched && res?.sessionId && clientCtx?.sessions?.open) {
5998
6394
  try {
5999
6395
  clientCtx.sessions.open(res.sessionId);
6000
- switched = true;
6001
6396
  } catch (e) {
6002
6397
  }
6003
6398
  }
@@ -6108,7 +6503,6 @@ function showRemoteWorkspaceDialog(rpcCall, onWorkspaceAdded, clientCtx, onPicke
6108
6503
  if (!switched && clientCtx?.sessions?.open && res.sessionId) {
6109
6504
  try {
6110
6505
  clientCtx.sessions.open(res.sessionId);
6111
- switched = true;
6112
6506
  } catch (e) {
6113
6507
  console.warn("[dsh-bridge] sessions.open failed:", e);
6114
6508
  }
@@ -6398,6 +6792,7 @@ function setupComposerCollapse() {
6398
6792
  }
6399
6793
  function apply(ctx) {
6400
6794
  window.__dshClientCtx = ctx;
6795
+ setupSettingsDrilldown();
6401
6796
  const rpcCall = (endpoint, payload, signal) => ctx.connection.rpc.call(BRIDGE_RPC_CHANNEL, endpoint, payload, signal);
6402
6797
  window.__dshOpenRemoteWorkspaceModal = (onAdded, onPickDirect, onCancel) => showRemoteWorkspaceDialog(rpcCall, onAdded, ctx, onPickDirect, onCancel);
6403
6798
  setupIosKeyboardAdapter();