@wenbin_wb/dsh-bridge 2.10.12 → 2.10.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,209 @@ 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
+ top: 9px !important;
962
+ right: 9px !important;
963
+ width: 32px !important;
964
+ height: 32px !important;
965
+ z-index: 5 !important;
966
+ }
967
+
968
+ /* \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
969
+ \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 */
970
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_panel"]:not([data-dshbr-settings-view="detail"]) > div[class*="VOzbGW_content"] {
971
+ flex: 0 0 auto !important;
972
+ width: 100% !important;
973
+ max-width: 100% !important;
974
+ border-top: 1px solid var(--dsw-alias-border-l2, #e5e7eb) !important;
975
+ }
976
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_panel"]:not([data-dshbr-settings-view="detail"]) div[class*="VOzbGW_options"] {
977
+ display: none !important;
978
+ }
979
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_panel"]:not([data-dshbr-settings-view="detail"]) > nav[class*="VOzbGW_nav"] {
980
+ flex: 1 1 auto !important;
981
+ min-height: 0 !important;
982
+ overflow-y: auto !important;
983
+ overscroll-behavior: contain !important;
984
+ }
985
+
986
+ /* \u8BE6\u60C5\u9875\uFF1A\u6298\u53E0\u5BFC\u822A\u4E3A\u300C\u2039 \u6807\u9898\u300D\u4E00\u884C\uFF0C\u5145\u5F53\u8FD4\u56DE\u5165\u53E3 */
987
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_panel"][data-dshbr-settings-view="detail"] div[class*="VOzbGW_navList"] {
988
+ display: none !important;
989
+ }
990
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_panel"][data-dshbr-settings-view="detail"] > nav[class*="VOzbGW_nav"] {
991
+ flex: 0 0 auto !important;
992
+ overflow: visible !important;
993
+ cursor: pointer !important;
994
+ }
995
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_panel"][data-dshbr-settings-view="detail"] > nav[class*="VOzbGW_nav"]:active {
996
+ background: var(--dsw-alias-interactive-bg-hover, rgba(0, 0, 0, 0.05)) !important;
997
+ }
998
+ /* \u8BE6\u60C5\u9875\u4E5F\u628A\u52A8\u4F5C\u680F\u6C89\u5230\u5E95\u90E8\uFF0C\u4E0E\u5217\u8868\u9875\u4FDD\u6301\u4E00\u81F4\u3002
999
+ \u7528 flex order \u4EA4\u6362 header/options \u7684\u89C6\u89C9\u4F4D\u7F6E\uFF1Aoptions \u4ECD\u662F\u90A3\u4E2A overflow:auto
1000
+ \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 */
1001
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_panel"][data-dshbr-settings-view="detail"] div[class*="VOzbGW_header"] {
1002
+ order: 2 !important;
1003
+ border-top: 1px solid var(--dsw-alias-border-l2, #e5e7eb) !important;
1004
+ }
1005
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_panel"][data-dshbr-settings-view="detail"] div[class*="VOzbGW_options"] {
1006
+ order: 1 !important;
1007
+ }
1008
+
1009
+ /* \u8F68\u9053\u5728\u7A84\u5C4F\u6539\u6210\u6574\u5BBD\u5217\u8868\u5BB9\u5668 */
1010
+ html[data-dshbr-drilldown="ready"] nav[class*="VOzbGW_nav"] {
1011
+ width: 100% !important;
1012
+ min-width: 0 !important;
1013
+ max-width: 100% !important;
1014
+ padding: 10px 12px 12px !important;
1015
+ gap: 4px !important;
1016
+ border-right: none !important;
1017
+ border-bottom: none !important;
1018
+ }
1019
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_navTitle"] {
1020
+ font-size: 17px !important;
1021
+ line-height: 1.3 !important;
1022
+ /* \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
1023
+ \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
1024
+ 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 */
1025
+ overflow-wrap: anywhere !important;
1026
+ /* \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
1027
+ \u6240\u4EE5\u7559\u767D\u5FC5\u987B\u5199\u5728\u8FD9\u4E00\u6761\u4E0A\uFF0C\u4E0D\u80FD\u53EA\u5199\u5728\u524D\u9762\u90A3\u6761\uFF09 */
1028
+ padding: 0 52px 4px 4px !important;
1029
+ }
1030
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_navList"] {
1031
+ flex-direction: column !important;
1032
+ gap: 2px !important;
1033
+ width: 100% !important;
1034
+ min-width: 0 !important;
1035
+ }
1036
+
1037
+ /* \u5217\u8868\u884C\uFF1A\u56FE\u6807\u5DE6\u3001\u6587\u5B57\u53F3\u3001\u884C\u5C3E \u203A \u6307\u793A */
1038
+ html[data-dshbr-drilldown="ready"] nav[class*="VOzbGW_nav"] button[class*="VOzbGW_navCell"],
1039
+ html[data-dshbr-drilldown="ready"] button[class*="VOzbGW_navCell"] {
1040
+ flex-direction: row !important;
1041
+ justify-content: flex-start !important;
1042
+ align-items: center !important;
1043
+ text-align: left !important;
1044
+ width: 100% !important;
1045
+ min-height: 52px !important;
1046
+ padding: 12px 14px !important;
1047
+ gap: 12px !important;
1048
+ border-radius: 12px !important;
1049
+ }
1050
+ html[data-dshbr-drilldown="ready"] nav[class*="VOzbGW_nav"] button[class*="VOzbGW_navCell"]::after {
1051
+ content: '' !important;
1052
+ width: 7px !important;
1053
+ height: 7px !important;
1054
+ margin-left: auto !important;
1055
+ flex: none !important;
1056
+ border-right: 1.7px solid var(--dsw-alias-label-tertiary, #9ca3af) !important;
1057
+ border-bottom: 1.7px solid var(--dsw-alias-label-tertiary, #9ca3af) !important;
1058
+ transform: rotate(-45deg) !important;
1059
+ }
1060
+ html[data-dshbr-drilldown="ready"] nav[class*="VOzbGW_nav"] button[class*="VOzbGW_navCell"] svg {
1061
+ width: 20px !important;
1062
+ height: 20px !important;
1063
+ }
1064
+ html[data-dshbr-drilldown="ready"] span[class*="VOzbGW_navLabel"] {
1065
+ font-size: 15px !important;
1066
+ line-height: 1.35 !important;
1067
+ white-space: normal !important;
1068
+ word-break: normal !important;
1069
+ text-align: left !important;
1070
+ flex: 0 1 auto !important;
1071
+ }
1072
+
1073
+ /* \u8BE6\u60C5\u9875\u8FD4\u56DE\u884C\uFF1A\u2039 \u7BAD\u5934 + \u6807\u9898 */
1074
+ /* \u8BE6\u60C5\u9875\u8FD4\u56DE\u884C\uFF1A\u2039 \u7BAD\u5934 + \u6807\u9898\u3002\u53F3\u4FA7\u540C\u6837\u8981\u7559 52px \u7ED9 \u2715 \u2014\u2014
1075
+ \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
1076
+ \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
1077
+ \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 */
1078
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_panel"][data-dshbr-settings-view="detail"] div[class*="VOzbGW_navTitle"] {
1079
+ display: flex !important;
1080
+ align-items: center !important;
1081
+ overflow-wrap: anywhere !important;
1082
+ padding: 2px 52px 2px 4px !important;
1083
+ }
1084
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_panel"][data-dshbr-settings-view="detail"] div[class*="VOzbGW_navTitle"]::before {
1085
+ content: '' !important;
1086
+ width: 8px !important;
1087
+ height: 8px !important;
1088
+ margin: 0 10px 0 6px !important;
1089
+ flex: none !important;
1090
+ border-left: 2px solid var(--dsw-alias-label-primary, #111827) !important;
1091
+ border-bottom: 2px solid var(--dsw-alias-label-primary, #111827) !important;
1092
+ transform: rotate(45deg) !important;
1093
+ }
1094
+
1095
+ /* 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
1096
+ \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
1097
+ \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
1098
+ \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
1099
+ \u2715 \u7684 relTop \u7531 9 \u53D8\u6210 579\u3001\u5E76\u4E0E\u5E95\u90E8\u52A8\u4F5C\u680F\u91CD\u53E0 837 px\xB2\u3002 */
1100
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_content"] {
1101
+ position: static !important;
1102
+ width: 100% !important;
1103
+ max-width: 100% !important;
1104
+ flex: 1 1 auto !important;
1105
+ }
1106
+ /* 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
1107
+ \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 */
1108
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_header"] {
1109
+ position: static !important;
1110
+ height: auto !important;
1111
+ padding: 8px 10px !important;
1112
+ align-items: center !important;
1113
+ justify-content: flex-end !important;
1114
+ }
1115
+ html[data-dshbr-drilldown="ready"] div[class*="VOzbGW_options"] {
1116
+ padding: 0 12px 16px !important;
1117
+ }
1118
+ }
1119
+
830
1120
  /* \u8FDC\u7A0B\u5DE5\u4F5C\u533A\u9009\u62E9\u5F39\u7A97\u79FB\u52A8\u7AEF/\u684C\u9762\u7AEF\u81EA\u9002\u5E94\u6837\u5F0F */
831
1121
  #dsh-remote-workspace-modal {
832
1122
  position: fixed !important;
@@ -1067,6 +1357,21 @@ async function unlockAdmin(rpcCall, password) {
1067
1357
  }
1068
1358
  }
1069
1359
 
1360
+ // client/picker-yield.js
1361
+ var OFFICIAL_WORKSPACE_SEAT = "uiWorkspace";
1362
+ function hasOfficialDirectoryPicker(ctx) {
1363
+ try {
1364
+ if (typeof ctx?.get !== "function") return false;
1365
+ const seat = ctx.get(OFFICIAL_WORKSPACE_SEAT);
1366
+ return typeof seat?.pickDirectory === "function";
1367
+ } catch {
1368
+ return false;
1369
+ }
1370
+ }
1371
+ function shouldYieldToOfficialPicker(facts) {
1372
+ return Boolean(facts?.local) && Boolean(facts?.officialPicker);
1373
+ }
1374
+
1070
1375
  // lib/bridge-rpc-constants.js
1071
1376
  var BRIDGE_RPC_CHANNEL = "/dsh-bridge";
1072
1377
  var BRIDGE_ENDPOINTS = {
@@ -1217,6 +1522,12 @@ if (typeof window !== "undefined") {
1217
1522
  var RESOURCE_URL_COMPAT = installResourceUrlCompat();
1218
1523
  if (typeof window !== "undefined") window.__dshResourceUrlCompat = RESOURCE_URL_COMPAT;
1219
1524
  var MOBILE_MAX_WIDTH = 767;
1525
+ var SETTINGS_DRILLDOWN_MAX_WIDTH = 480;
1526
+ var DRILLDOWN_GATE_ATTR = "data-dshbr-drilldown";
1527
+ var DRILLDOWN_GATE_READY = "ready";
1528
+ var DRILLDOWN_GATE_FLAG = "dshBrDrilldownGate";
1529
+ var SETTINGS_VIEW_ATTR = "data-dshbr-settings-view";
1530
+ var SETTINGS_VIEW_DETAIL = "detail";
1220
1531
  function isLocalEnvironment() {
1221
1532
  if (typeof window === "undefined") return true;
1222
1533
  const host = window.location.hostname || "";
@@ -4080,9 +4391,13 @@ function VersionBanner({ rpcCall }) {
4080
4391
  gap: 8
4081
4392
  }
4082
4393
  },
4394
+ // 左组:版本徽标 + DSH 版本 + 检查更新。
4395
+ // flexWrap + minWidth:0 是必需的:此前只写 display:flex,左组既不能收缩也不能换行,
4396
+ // 会把整行顶到 305px;手机设置页内容列只有 277px,溢出部分被
4397
+ // overflow-x:hidden 静默裁掉(「检查更新」按钮被切一半)。
4083
4398
  React.createElement(
4084
4399
  "div",
4085
- { style: { display: "flex", alignItems: "center", gap: 8 } },
4400
+ { style: { display: "flex", alignItems: "center", gap: 8, flexWrap: "wrap", minWidth: 0 } },
4086
4401
  // 版本状态徽标
4087
4402
  React.createElement(
4088
4403
  "span",
@@ -4138,7 +4453,11 @@ function VersionBanner({ rpcCall }) {
4138
4453
  padding: "0 8px",
4139
4454
  fontSize: 11,
4140
4455
  opacity: loading ? 0.5 : 1,
4141
- gap: 4
4456
+ gap: 4,
4457
+ // 按钮是 inline-flex,文字会成为匿名 flex 项;被挤窄时会把「检查更新」
4458
+ // 折成两行。nowrap + flexShrink:0 保证它整体换行(由父级 flexWrap 负责)。
4459
+ whiteSpace: "nowrap",
4460
+ flexShrink: 0
4142
4461
  },
4143
4462
  onClick: check,
4144
4463
  disabled: loading || upgrading || restarting,
@@ -4430,9 +4749,49 @@ var TABS = [
4430
4749
  { id: "ops", label: "\u8FD0\u7EF4\u76D1\u63A7", icon: Icons.ops }
4431
4750
  ];
4432
4751
  function TabBar({ active, onChange, dots }) {
4752
+ const scrollRef = React.useRef(null);
4753
+ const [edges, setEdges] = React.useState({ left: false, right: false });
4754
+ React.useEffect(() => {
4755
+ const el = scrollRef.current;
4756
+ if (!el) return void 0;
4757
+ const update = () => {
4758
+ const max = el.scrollWidth - el.clientWidth;
4759
+ const left = el.scrollLeft > 1;
4760
+ const right = max > 1 && el.scrollLeft < max - 1;
4761
+ setEdges((prev) => prev.left === left && prev.right === right ? prev : { left, right });
4762
+ };
4763
+ update();
4764
+ el.addEventListener("scroll", update, { passive: true });
4765
+ let observer = null;
4766
+ if (typeof ResizeObserver === "function") {
4767
+ observer = new ResizeObserver(update);
4768
+ observer.observe(el);
4769
+ }
4770
+ return () => {
4771
+ el.removeEventListener("scroll", update);
4772
+ if (observer) observer.disconnect();
4773
+ };
4774
+ }, []);
4775
+ React.useEffect(() => {
4776
+ const el = scrollRef.current;
4777
+ if (!el) return;
4778
+ const target = el.querySelector('[data-dsh-tab-active="true"]');
4779
+ if (!target) return;
4780
+ const elRect = el.getBoundingClientRect();
4781
+ const tabRect = target.getBoundingClientRect();
4782
+ if (tabRect.left < elRect.left) el.scrollLeft -= elRect.left - tabRect.left + 8;
4783
+ else if (tabRect.right > elRect.right) el.scrollLeft += tabRect.right - elRect.right + 8;
4784
+ }, [active]);
4785
+ const maskStops = [];
4786
+ if (edges.left) maskStops.push("transparent 0px", "#000 20px");
4787
+ else maskStops.push("#000 0px");
4788
+ if (edges.right) maskStops.push("#000 calc(100% - 20px)", "transparent 100%");
4789
+ else maskStops.push("#000 100%");
4790
+ const maskImage = `linear-gradient(to right, ${maskStops.join(", ")})`;
4433
4791
  return React.createElement(
4434
4792
  "div",
4435
4793
  {
4794
+ ref: scrollRef,
4436
4795
  className: "dsh-tabbar-container",
4437
4796
  style: {
4438
4797
  display: "flex",
@@ -4444,7 +4803,9 @@ function TabBar({ active, onChange, dots }) {
4444
4803
  maxWidth: "100%",
4445
4804
  flexWrap: "nowrap",
4446
4805
  scrollbarWidth: "none",
4447
- msOverflowStyle: "none"
4806
+ msOverflowStyle: "none",
4807
+ WebkitMaskImage: maskImage,
4808
+ maskImage
4448
4809
  }
4449
4810
  },
4450
4811
  TABS.map(({ id, label, icon: TabIcon }) => {
@@ -4454,6 +4815,7 @@ function TabBar({ active, onChange, dots }) {
4454
4815
  "button",
4455
4816
  {
4456
4817
  key: id,
4818
+ "data-dsh-tab-active": isActive ? "true" : void 0,
4457
4819
  onClick: () => onChange(id),
4458
4820
  style: {
4459
4821
  font: "inherit",
@@ -5289,6 +5651,53 @@ function injectMobileStyles() {
5289
5651
  style.textContent = MOBILE_STYLES_CSS;
5290
5652
  document.head.appendChild(style);
5291
5653
  }
5654
+ function setupSettingsDrilldown() {
5655
+ if (typeof document === "undefined" || typeof window === "undefined") return;
5656
+ const root = document.documentElement;
5657
+ if (root.dataset[DRILLDOWN_GATE_FLAG] === "1") return;
5658
+ root.dataset[DRILLDOWN_GATE_FLAG] = "1";
5659
+ if (typeof window.matchMedia !== "function") return;
5660
+ let narrowQuery;
5661
+ try {
5662
+ narrowQuery = window.matchMedia(`(max-width: ${SETTINGS_DRILLDOWN_MAX_WIDTH}px)`);
5663
+ } catch {
5664
+ return;
5665
+ }
5666
+ if (!narrowQuery) return;
5667
+ const isNarrow = () => narrowQuery.matches === true;
5668
+ const onDocumentClick = (event) => {
5669
+ if (!isNarrow()) return;
5670
+ const target = event.target;
5671
+ if (!target || typeof target.closest !== "function") return;
5672
+ const panel = target.closest('div[class*="VOzbGW_panel"]');
5673
+ if (!panel) return;
5674
+ const nav = panel.querySelector('nav[class*="VOzbGW_nav"]');
5675
+ if (!nav || !nav.contains(target)) return;
5676
+ if (target.closest('button[class*="VOzbGW_navCell"]')) {
5677
+ panel.setAttribute(SETTINGS_VIEW_ATTR, SETTINGS_VIEW_DETAIL);
5678
+ if (nav.scrollTop) nav.scrollTop = 0;
5679
+ return;
5680
+ }
5681
+ if (panel.getAttribute(SETTINGS_VIEW_ATTR) === SETTINGS_VIEW_DETAIL) {
5682
+ panel.removeAttribute(SETTINGS_VIEW_ATTR);
5683
+ }
5684
+ };
5685
+ const syncGate = () => {
5686
+ if (narrowQuery.matches === true) root.setAttribute(DRILLDOWN_GATE_ATTR, DRILLDOWN_GATE_READY);
5687
+ else root.removeAttribute(DRILLDOWN_GATE_ATTR);
5688
+ };
5689
+ try {
5690
+ document.addEventListener("click", onDocumentClick, false);
5691
+ } catch {
5692
+ return;
5693
+ }
5694
+ try {
5695
+ if (typeof narrowQuery.addEventListener === "function") narrowQuery.addEventListener("change", syncGate);
5696
+ else if (typeof narrowQuery.addListener === "function") narrowQuery.addListener(syncGate);
5697
+ } catch {
5698
+ }
5699
+ syncGate();
5700
+ }
5292
5701
  function setupMobileExperience(rpcCall, ctx) {
5293
5702
  if (typeof document === "undefined" || typeof window === "undefined") return;
5294
5703
  injectMobileStyles();
@@ -5941,60 +6350,63 @@ function showRemoteWorkspaceDialog(rpcCall, onWorkspaceAdded, clientCtx, onPicke
5941
6350
  async function switchToWorkspace(wsId, wsPath) {
5942
6351
  if (isSubmitting) return;
5943
6352
  isSubmitting = true;
5944
- statusMessage = `\u6B63\u5728\u5207\u6362\u5DE5\u4F5C\u533A\u2026`;
5945
- isErrorMessage = false;
5946
- render();
5947
- if (typeof onPicked === "function" && wsPath) {
5948
- try {
5949
- onPicked(wsPath);
5950
- } catch (e) {
5951
- }
5952
- }
5953
- let switched = false;
5954
- if (clientCtx?.workspaces?.startSession && wsId) {
5955
- try {
5956
- clientCtx.workspaces.startSession(wsId);
5957
- switched = true;
5958
- } catch (e) {
5959
- console.warn("[dsh-bridge] startSession failed:", e);
6353
+ try {
6354
+ statusMessage = `\u6B63\u5728\u5207\u6362\u5DE5\u4F5C\u533A\u2026`;
6355
+ isErrorMessage = false;
6356
+ render();
6357
+ if (typeof onPicked === "function" && wsPath) {
6358
+ try {
6359
+ onPicked(wsPath);
6360
+ } catch (e) {
6361
+ }
5960
6362
  }
5961
- }
5962
- if (!switched && wsPath) {
5963
- try {
5964
- if (clientCtx?.workspaces?.create) {
5965
- const ws = await clientCtx.workspaces.create({ path: wsPath });
5966
- if (ws?.workspaceId && clientCtx?.workspaces?.startSession) {
5967
- clientCtx.workspaces.startSession(ws.workspaceId);
5968
- switched = true;
5969
- }
6363
+ let switched = false;
6364
+ if (clientCtx?.workspaces?.startSession && wsId) {
6365
+ try {
6366
+ clientCtx.workspaces.startSession(wsId);
6367
+ switched = true;
6368
+ } catch (e) {
6369
+ console.warn("[dsh-bridge] startSession failed:", e);
5970
6370
  }
5971
- if (!switched) {
5972
- const raw = await authRpc(BRIDGE_ENDPOINTS.addRemoteWorkspace, { path: wsPath });
5973
- const res = raw?.value || raw;
5974
- if (res?.workspaceId && clientCtx?.workspaces?.startSession) {
5975
- try {
5976
- clientCtx.workspaces.startSession(res.workspaceId);
6371
+ }
6372
+ if (!switched && wsPath) {
6373
+ try {
6374
+ if (clientCtx?.workspaces?.create) {
6375
+ const ws = await clientCtx.workspaces.create({ path: wsPath });
6376
+ if (ws?.workspaceId && clientCtx?.workspaces?.startSession) {
6377
+ clientCtx.workspaces.startSession(ws.workspaceId);
5977
6378
  switched = true;
5978
- } catch (e) {
5979
6379
  }
5980
6380
  }
5981
- if (!switched && res?.sessionId && clientCtx?.sessions?.open) {
5982
- try {
5983
- clientCtx.sessions.open(res.sessionId);
5984
- switched = true;
5985
- } catch (e) {
6381
+ if (!switched) {
6382
+ const raw = await authRpc(BRIDGE_ENDPOINTS.addRemoteWorkspace, { path: wsPath });
6383
+ const res = raw?.value || raw;
6384
+ if (res?.workspaceId && clientCtx?.workspaces?.startSession) {
6385
+ try {
6386
+ clientCtx.workspaces.startSession(res.workspaceId);
6387
+ switched = true;
6388
+ } catch (e) {
6389
+ }
6390
+ }
6391
+ if (!switched && res?.sessionId && clientCtx?.sessions?.open) {
6392
+ try {
6393
+ clientCtx.sessions.open(res.sessionId);
6394
+ } catch (e) {
6395
+ }
5986
6396
  }
5987
6397
  }
6398
+ } catch (e) {
5988
6399
  }
5989
- } catch (e) {
5990
6400
  }
6401
+ statusMessage = `\u2713 \u5DF2\u5207\u6362\u81F3\u5DE5\u4F5C\u533A\uFF01`;
6402
+ render();
6403
+ setTimeout(() => {
6404
+ closeModal();
6405
+ document.body.classList.remove("dsh-drawer-open");
6406
+ }, 400);
6407
+ } finally {
6408
+ isSubmitting = false;
5991
6409
  }
5992
- statusMessage = `\u2713 \u5DF2\u5207\u6362\u81F3\u5DE5\u4F5C\u533A\uFF01`;
5993
- render();
5994
- setTimeout(() => {
5995
- closeModal();
5996
- document.body.classList.remove("dsh-drawer-open");
5997
- }, 400);
5998
6410
  }
5999
6411
  async function loadDirectory(targetPath) {
6000
6412
  if (isSubmitting) return;
@@ -6089,7 +6501,6 @@ function showRemoteWorkspaceDialog(rpcCall, onWorkspaceAdded, clientCtx, onPicke
6089
6501
  if (!switched && clientCtx?.sessions?.open && res.sessionId) {
6090
6502
  try {
6091
6503
  clientCtx.sessions.open(res.sessionId);
6092
- switched = true;
6093
6504
  } catch (e) {
6094
6505
  console.warn("[dsh-bridge] sessions.open failed:", e);
6095
6506
  }
@@ -6379,6 +6790,7 @@ function setupComposerCollapse() {
6379
6790
  }
6380
6791
  function apply(ctx) {
6381
6792
  window.__dshClientCtx = ctx;
6793
+ setupSettingsDrilldown();
6382
6794
  const rpcCall = (endpoint, payload, signal) => ctx.connection.rpc.call(BRIDGE_RPC_CHANNEL, endpoint, payload, signal);
6383
6795
  window.__dshOpenRemoteWorkspaceModal = (onAdded, onPickDirect, onCancel) => showRemoteWorkspaceDialog(rpcCall, onAdded, ctx, onPickDirect, onCancel);
6384
6796
  setupIosKeyboardAdapter();
@@ -6388,6 +6800,10 @@ function apply(ctx) {
6388
6800
  ctx.slots.inject(
6389
6801
  "conversation.hero.workspace.directoryFlow",
6390
6802
  () => ctx.slots.inject("sidebar.workspaces.directoryFlow", function* () {
6803
+ if (shouldYieldToOfficialPicker({
6804
+ local: isLocalEnvironment(),
6805
+ officialPicker: hasOfficialDirectoryPicker(ctx)
6806
+ })) return;
6391
6807
  yield ctx.slots.register(
6392
6808
  {
6393
6809
  name: "conversation.hero.workspace.directoryFlow",