@qzsy/dsh-bridge 2.18.0 → 3.0.1
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 +15 -1094
- package/LICENSE +21 -21
- package/README.md +73 -476
- package/client/build.mjs +1 -3
- package/client/client.js +381 -9747
- package/client/index.js +242 -6828
- package/client/locales.mjs +99 -233
- package/cordis.patch.yml +5 -3
- package/lib/config.js +93 -0
- package/lib/data-dir.js +16 -0
- package/lib/dsh-cookie.js +111 -0
- package/lib/gate.js +414 -0
- package/lib/identity.js +23 -0
- package/lib/index.js +303 -3496
- package/lib/saas/tunnel-client.mjs +529 -467
- package/locale/en.json +3 -3
- package/locale/zh.json +3 -3
- package/package.json +15 -70
- package/README.en.md +0 -488
- package/client/host-families.js +0 -442
- package/client/mobile-styles.js +0 -1299
- package/client/mobile-yield.js +0 -219
- package/client/panel-locales.mjs +0 -777
- package/client/picker-yield.js +0 -77
- package/client/resource-url-compat.js +0 -90
- package/client/settings-nav-icon.js +0 -105
- package/client/theme-tokens.js +0 -49
- package/client/tunnel-guard.js +0 -46
- package/client/unlock-manager.js +0 -144
- package/lib/auth/dsh-native-cookie.js +0 -148
- package/lib/auth/login-template.js +0 -516
- package/lib/auth/manager.js +0 -596
- package/lib/bridge-rpc-constants.js +0 -66
- package/lib/bridge-rpc.js +0 -722
- package/lib/cloudflared-manager.mjs +0 -1277
- package/lib/cloudflared-network-args.js +0 -99
- package/lib/cloudflared-process-scan.js +0 -153
- package/lib/compat.js +0 -172
- package/lib/connection-compat.js +0 -115
- package/lib/feishu/comment.js +0 -50
- package/lib/feishu/gateway.js +0 -644
- package/lib/feishu/index.js +0 -432
- package/lib/feishu/lark-bundled.mjs +0 -131929
- package/lib/feishu/markdown.js +0 -148
- package/lib/feishu/node.js +0 -1152
- package/lib/feishu/slash-commands.js +0 -255
- package/lib/platform/account-ops.js +0 -248
- package/lib/platform/activity.js +0 -169
- package/lib/platform/ask-user.js +0 -293
- package/lib/platform/base.js +0 -147
- package/lib/platform/changes-digest.js +0 -93
- package/lib/platform/commands.js +0 -267
- package/lib/platform/config-restore.js +0 -78
- package/lib/platform/conversation-bridge.js +0 -1544
- package/lib/platform/dsh-storage.js +0 -222
- package/lib/platform/index.js +0 -10
- package/lib/platform/instances.js +0 -458
- package/lib/platform/manager.js +0 -130
- package/lib/platform/message-split.js +0 -229
- package/lib/platform/session-catalog.js +0 -405
- package/lib/platform/session-config.js +0 -52
- package/lib/platform/stream-slices.js +0 -21
- package/lib/qq/gateway.js +0 -1107
- package/lib/qq/index.js +0 -561
- package/lib/qq/node.js +0 -1153
- package/lib/qq/qqbot-bundled.mjs +0 -8273
- package/lib/restart-helper.mjs +0 -133
- package/lib/security/log-sanitize.js +0 -50
- package/lib/security/path-validator.js +0 -195
- package/lib/security/rate-limiter.js +0 -93
- package/lib/session-strip.js +0 -100
- package/lib/sse-keepalive.js +0 -115
- package/lib/telegram/gateway.js +0 -643
- package/lib/telegram/index.js +0 -255
- package/lib/telegram/node.js +0 -410
- package/lib/tunnel-client.mjs +0 -537
- package/lib/wechat/gateway.js +0 -1000
- package/lib/wechat/index.js +0 -282
- package/lib/wechat/media.js +0 -302
- package/lib/wechat/node.js +0 -360
- package/llms.txt +0 -36
package/client/mobile-styles.js
DELETED
|
@@ -1,1299 +0,0 @@
|
|
|
1
|
-
// 移动端适配样式(自 client/index.js 拆出的 ~800 行 CSS,T3.5)
|
|
2
|
-
// 由 setupMobileExperience() 注入 <style id="dsh-bridge-mobile-styles">。
|
|
3
|
-
//
|
|
4
|
-
// 【占位符约定】涉及宿主 CSS-module 类名的选择器一律写成 `[class*="__F_<SLOT>__<本地名>"]`,
|
|
5
|
-
// 由 client/host-families.js 在运行时把 `__F_<SLOT>__` 换成宿主真实前缀后再注入:
|
|
6
|
-
// 0.1.x: VOzbGW_overlay / wSkVaW_header / hHd-Xa_root / uV2eYG_card …
|
|
7
|
-
// 0.2.0: wCInkW_overlay / Dc7zOa_header / _2H3hWW_root / RlGAzG_card …
|
|
8
|
-
// 宿主升级重算哈希时不再需要改这份 CSS(探测优先,已核实基线兜底,都拿不到则显式降级告警)。
|
|
9
|
-
// 详见 host-families.js 的 slot 表与 client/index.js 的 refreshHostFamilies()。
|
|
10
|
-
export const MOBILE_STYLES_CSS = `
|
|
11
|
-
/* DSH Bridge 隐藏 Tab 栏原生滚动条并保持平滑滑动 */
|
|
12
|
-
.dsh-tabbar-container {
|
|
13
|
-
scrollbar-width: none !important;
|
|
14
|
-
-ms-overflow-style: none !important;
|
|
15
|
-
}
|
|
16
|
-
.dsh-tabbar-container::-webkit-scrollbar {
|
|
17
|
-
display: none !important;
|
|
18
|
-
width: 0 !important;
|
|
19
|
-
height: 0 !important;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/* DSH Bridge 移动端自适应与触控交互增强样式 */
|
|
23
|
-
:root {
|
|
24
|
-
--dsh-mobile-header-h: 52px;
|
|
25
|
-
--dsh-mobile-safe-top: env(safe-area-inset-top, 0px);
|
|
26
|
-
--dsh-mobile-safe-bottom: env(safe-area-inset-bottom, 0px);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/* 挂在 <body> 下、自带遮罩的「模态根」必须能盖在设置弹窗之上。
|
|
30
|
-
—— 这是本插件抬高设置弹窗层叠后必须自己补上的一环(谁抬的谁负责)。
|
|
31
|
-
|
|
32
|
-
故障现象:插件市场设置页点「安装」没有任何反应。
|
|
33
|
-
根因链:
|
|
34
|
-
1) 本插件把设置弹窗抬到 z-index:10002(见下面 @media 块),以便盖住自己渲染的
|
|
35
|
-
移动端顶栏(9998)/抽屉遮罩(9999);
|
|
36
|
-
2) 插件市场(dshmarket 1.44.0)的安装确认框是挂在 <body> 下的
|
|
37
|
-
div._root_w1urq_2,position:fixed,但只有 z-index:1000;
|
|
38
|
-
3) 该浮层内部的对话框 div._dialog_w1urq_22 虽然带 role="dialog"、被下面的
|
|
39
|
-
10005 规则抬起来了,**但 z-index 无法逃出祖先的层叠上下文** —— 外层模态根
|
|
40
|
-
只有 1000,整棵子树(连同那个 10005)一起被设置弹窗(10002)盖死;
|
|
41
|
-
4) 结果:竖屏点安装完全看不到浮层(设置弹窗的遮罩在 elementFromPoint 上命中);
|
|
42
|
-
横屏(宽度 > 767 时本插件样式不生效,设置弹窗回落成宿主的 1000)浮层虽出现,
|
|
43
|
-
却与页面内容互相穿透、显示不完整。
|
|
44
|
-
|
|
45
|
-
选择器刻意不硬编码任何第三方类名/哈希,只认模态根的两个**结构特征**:
|
|
46
|
-
「body 的直接子级」+「自带遮罩子元素(或有 role=dialog 子元素)」。
|
|
47
|
-
实测在打开设置前/后/点安装后三个阶段,本页面上该选择器**只命中市场那一个浮层**,
|
|
48
|
-
无误伤;本插件自己的 #dsh-remote-workspace-modal 有 ID 规则(100000),优先级更高,
|
|
49
|
-
不受影响。仅在设置弹窗打开时生效(body:has(...)),把影响面压到最小。
|
|
50
|
-
|
|
51
|
-
【已知边界】判据只看结构,无法区分「真模态」与「恰好长成这样、且不可关闭的全屏
|
|
52
|
-
遮罩」。若某个插件往 <body> 下挂一个带 mask 子元素的全屏层,它也会被抬到设置
|
|
53
|
-
弹窗之上并盖住设置页。这是「模态就该盖在设置弹窗之上」的既定取舍:宁可让真模态
|
|
54
|
-
可见,也不接受"弹了却点不到"。独立验收已实测该构造会命中;若将来真踩到,
|
|
55
|
-
应改为按「该浮层是否可关闭」进一步收窄,而不是回退这条规则。 */
|
|
56
|
-
/* ⚠️ 必须排除设置弹窗自身:DSH 0.1.7 起设置弹窗的 overlay 变成了 <body> 的直接子级
|
|
57
|
-
(0.1.5 里它嵌在 #root 内部;0.2.0 依旧如此,只是哈希从 VOzbGW_ 换成 wCInkW_,
|
|
58
|
-
故这里用 __F_SETTINGS__ 占位符而非硬编码),它同样满足「body 子级 + 含 role=dialog
|
|
59
|
-
子元素」,会被本条一并抬到 10050 —— 于是与第三方模态根同层、退化成按 DOM 顺序决胜,
|
|
60
|
-
刚修好的「安装确认框被盖住」就可能复发。:not(...) 把它排除,让设置弹窗继续由
|
|
61
|
-
它自己的 10002 规则定位,本条只抬**其它**顶层模态。 */
|
|
62
|
-
body:has(div[class*="__F_SETTINGS__overlay"]) > div:has(> div[class*="mask"], > div[role="dialog"]):not([class*="__F_SETTINGS__overlay"]) {
|
|
63
|
-
z-index: 10050 !important;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/* 同上场景的第二个独立问题:第三方模态对话框「比视口还高」。
|
|
67
|
-
插件市场的安装确认框是固定 584px 高 + overflow-y:hidden,在矮视口(横屏手机
|
|
68
|
-
320–430px 高,以及 320×480 这类小屏)里被居中撑开 → 上下同时被切掉,底部
|
|
69
|
-
「Cancel / Confirm install」落到视口之外,用户点不到、流程走不下去
|
|
70
|
-
(实测 667×375 时对话框 rect y=-116 h=608、按钮 y=432;844×390 同样)。
|
|
71
|
-
|
|
72
|
-
修法是让模态对话框不超过视口并允许内部滚动。这条是**自限性**的:
|
|
73
|
-
max-height 只在「视口比对话框矮」时才起作用 —— 375×667 / 390×844 等正常竖屏下
|
|
74
|
-
100dvh-16px(=651/828) > 584,声明不产生任何视觉变化。
|
|
75
|
-
vh 与 dvh 各写一遍:不支持 dvh 的环境退回 vh;两条都失效也只是保持原样。 */
|
|
76
|
-
body:has(div[class*="__F_SETTINGS__overlay"]) > div:has(> div[role="dialog"]) > div[role="dialog"] {
|
|
77
|
-
/* 留 32px 而不是 16px:该对话框是 content-box + 24px 纵向内边距,
|
|
78
|
-
按内容盒算的 max-height 会再多出内边距的边框盒高度,16px 时仍溢出 4px。 */
|
|
79
|
-
max-height: calc(100vh - 32px) !important;
|
|
80
|
-
max-height: calc(100dvh - 32px) !important;
|
|
81
|
-
overflow-y: auto !important;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/* 断点与宿主判据对齐:宿主用 viewportWidth < 768 决定右侧栏自动全屏
|
|
85
|
-
(dsh-client-ui-sidebar-right/lib/client.js),故移动端样式取 <=767px,
|
|
86
|
-
768px 起彻底交还桌面布局,避免"桥渲染顶栏、宿主却未全屏"的错位。 */
|
|
87
|
-
@media (max-width: 767px) {
|
|
88
|
-
/* 1. 主框架为 Header 腾出顶部空间。
|
|
89
|
-
|
|
90
|
-
选择器必须限定在布局外壳(dsh-client-ui-layout 的 AppFrame,即
|
|
91
|
-
[data-slot="root"] 的直接子元素)。宿主的 CSS-module 哈希只保证同文件
|
|
92
|
-
内唯一,*="_frame" 是跨包通配:聊天记录容器(dsh-client-ui-chat 的
|
|
93
|
-
.EvIC1a_frame,同样以 _frame 结尾)也会被命中。一旦命中,它被强加
|
|
94
|
-
height:100dvh + overflow:hidden,在手机上被钳到视口高度并裁掉溢出内容:
|
|
95
|
-
外层 [data-conversation-scroll] 已滚到底、内部却还有数千 px 读不到,
|
|
96
|
-
表现为「看不到最新消息」。官方给该容器的规则是 flex:none;height:auto
|
|
97
|
-
(让记录随内容自然增高、由外层统一滚动),与这里冲突,故必须排除。 */
|
|
98
|
-
[data-slot="root"] > div[class*="_frame"] {
|
|
99
|
-
display: grid !important;
|
|
100
|
-
grid-template-columns: 0px minmax(0px, 1fr) minmax(0px, 0px) !important;
|
|
101
|
-
grid-template-rows: minmax(0, 100%) !important;
|
|
102
|
-
width: 100vw !important;
|
|
103
|
-
height: 100dvh !important;
|
|
104
|
-
margin: 0 !important;
|
|
105
|
-
padding-top: var(--dsh-mobile-header-h) !important;
|
|
106
|
-
position: relative !important;
|
|
107
|
-
overflow: hidden !important;
|
|
108
|
-
box-sizing: border-box !important;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/* 宿主 0.1.7 的 frame 是 grid 三列布局(sidebar | center | rightbar),JS 按状态注入
|
|
112
|
-
grid-template-columns;插件把左侧栏抽屉化后 sidebarCol 变成 fixed(脱离 grid 流),
|
|
113
|
-
若不显式指定列位,centerCol 会被自动排进第 1 列(56px 轨道)、rightbarCol 塌陷到
|
|
114
|
-
视口底部 → 右侧栏点开后面板被定位到视口外(用户看到的「按钮消失、右侧栏没出来」)。
|
|
115
|
-
这里显式归位:sidebar 抽屉不占列(第 1 列 0px)、center 占满(第 2 列 1fr)、
|
|
116
|
-
rightbar 保留宿主右侧栏列(第 3 列 0px 折叠,全屏面板 fixed 相对视口、不依赖此列)。 */
|
|
117
|
-
div[class*="_centerCol"] { grid-column: 2 !important; }
|
|
118
|
-
div[class*="_rightbarCol"] { grid-column: 3 !important; }
|
|
119
|
-
div[class*="_overlayLayer"] { grid-column: 1 / -1 !important; }
|
|
120
|
-
|
|
121
|
-
/* 1.1 fixed 全屏面板单独让位:position:fixed 的包含块是 viewport(CSS 2.1 §10.1),
|
|
122
|
-
不跟随上面 frame 的 padding-top,因此顶部 52px 会落进顶栏覆盖区(#41)。
|
|
123
|
-
官方右侧栏在 <768px 自动全屏,这里按 data 属性直接位移容器本身,不依赖宿主
|
|
124
|
-
CSS-module 哈希类名。
|
|
125
|
-
宿主版本差异(0.1.5 vs 0.1.7):0.1.5 的面板自身就是 position:fixed; inset:0
|
|
126
|
-
(相对视口),top 让位直接生效;0.1.7 把面板改成 position:absolute 相对
|
|
127
|
-
rightbarCol 列定位,且宿主已把它放在内容区起点——若插件仍只改 top,会在宿主
|
|
128
|
-
定位之上再叠加 52px(面板被推到视口外,表现为「点开右侧栏按钮消失、面板不
|
|
129
|
-
出来」)。修法:把面板统一强制为 fixed 相对视口 + top:52px 让位,两版宿主
|
|
130
|
-
行为一致。 */
|
|
131
|
-
[data-sidebar-right-panel="fullscreen"] {
|
|
132
|
-
position: fixed !important;
|
|
133
|
-
top: var(--dsh-mobile-header-h, 52px) !important;
|
|
134
|
-
left: 0 !important;
|
|
135
|
-
right: 0 !important;
|
|
136
|
-
bottom: 0 !important;
|
|
137
|
-
width: 100vw !important;
|
|
138
|
-
height: calc(100dvh - var(--dsh-mobile-header-h, 52px)) !important;
|
|
139
|
-
max-height: calc(100dvh - var(--dsh-mobile-header-h, 52px)) !important;
|
|
140
|
-
z-index: 40 !important;
|
|
141
|
-
box-sizing: border-box !important;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/* 2. 顶部原生导航条:100% 还原 DeepSeek App (左侧双横线,右侧(+),中间留白,无多余设置按钮) */
|
|
145
|
-
.dsh-mobile-app-header {
|
|
146
|
-
position: fixed !important;
|
|
147
|
-
top: 0 !important;
|
|
148
|
-
left: 0 !important;
|
|
149
|
-
right: 0 !important;
|
|
150
|
-
height: var(--dsh-mobile-header-h) !important;
|
|
151
|
-
padding-top: var(--dsh-mobile-safe-top) !important;
|
|
152
|
-
background: transparent !important;
|
|
153
|
-
display: flex !important;
|
|
154
|
-
align-items: center !important;
|
|
155
|
-
justify-content: space-between !important;
|
|
156
|
-
padding-left: 16px !important;
|
|
157
|
-
padding-right: 16px !important;
|
|
158
|
-
z-index: 9998 !important;
|
|
159
|
-
box-sizing: border-box !important;
|
|
160
|
-
user-select: none !important;
|
|
161
|
-
pointer-events: none !important;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/* 左侧双横线按钮 (DeepSeek App 原生图标) */
|
|
165
|
-
.dsh-header-menu-btn {
|
|
166
|
-
width: 40px;
|
|
167
|
-
height: 40px;
|
|
168
|
-
border-radius: 50%;
|
|
169
|
-
border: none;
|
|
170
|
-
background: transparent;
|
|
171
|
-
color: var(--dsw-alias-label-primary, #111827);
|
|
172
|
-
display: inline-flex;
|
|
173
|
-
align-items: center;
|
|
174
|
-
justify-content: flex-start;
|
|
175
|
-
cursor: pointer;
|
|
176
|
-
padding: 0;
|
|
177
|
-
transition: opacity 0.15s;
|
|
178
|
-
pointer-events: auto !important;
|
|
179
|
-
}
|
|
180
|
-
.dsh-header-menu-btn:active {
|
|
181
|
-
opacity: 0.6;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/* 右侧 (+) 新建会话按钮 (DeepSeek App 原生图标) */
|
|
185
|
-
.dsh-header-new-btn {
|
|
186
|
-
width: 40px;
|
|
187
|
-
height: 40px;
|
|
188
|
-
border-radius: 50%;
|
|
189
|
-
border: none;
|
|
190
|
-
background: transparent;
|
|
191
|
-
color: var(--dsw-alias-label-primary, #111827);
|
|
192
|
-
display: inline-flex;
|
|
193
|
-
align-items: center;
|
|
194
|
-
justify-content: flex-end;
|
|
195
|
-
cursor: pointer;
|
|
196
|
-
padding: 0;
|
|
197
|
-
transition: opacity 0.15s;
|
|
198
|
-
pointer-events: auto !important;
|
|
199
|
-
}
|
|
200
|
-
.dsh-header-new-btn:active {
|
|
201
|
-
opacity: 0.6;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
/* 中间动态会话标题 (单行居中打点截断,100% 还原原生 App 导航体验) */
|
|
205
|
-
.dsh-mobile-header-title {
|
|
206
|
-
flex: 1 1 auto !important;
|
|
207
|
-
min-width: 0 !important;
|
|
208
|
-
text-align: center !important;
|
|
209
|
-
font-size: 15px !important;
|
|
210
|
-
font-weight: 600 !important;
|
|
211
|
-
color: var(--dsw-alias-label-primary, #111827) !important;
|
|
212
|
-
overflow: hidden !important;
|
|
213
|
-
text-overflow: ellipsis !important;
|
|
214
|
-
white-space: nowrap !important;
|
|
215
|
-
padding: 0 10px !important;
|
|
216
|
-
user-select: none !important;
|
|
217
|
-
pointer-events: none !important;
|
|
218
|
-
letter-spacing: -0.2px !important;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
/* 3. 中间主内容区与输入框 */
|
|
222
|
-
div[class*="_centerCol"] {
|
|
223
|
-
flex: 1 1 100% !important;
|
|
224
|
-
width: 100% !important;
|
|
225
|
-
min-width: 0 !important;
|
|
226
|
-
max-width: 100% !important;
|
|
227
|
-
display: flex !important;
|
|
228
|
-
height: 100% !important;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
div[class*="_detailsCol"],
|
|
232
|
-
div[class*="toggleCluster"],
|
|
233
|
-
div[class*="__F_TOGGLE__toggleCluster"] {
|
|
234
|
-
display: none !important;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
/* 3.0 工作区 Workbench / 任务管理 / 多 Tab 栏移动端自适应适配。
|
|
238
|
-
注:__F_WB__(nArs4W) 与 __F_TOGGLE__(W-zNGW) 这两族只在 0.1.x 采到过;
|
|
239
|
-
0.2.0 的 app.asar 类名映射里已不存在 tabBar/tabList/tabClose/tabBarPlus/toggleCluster
|
|
240
|
-
这些本地名(右侧栏 Tab 改名为 dsh-client-ui-sidebar-right 的 OUqwTW_tabTitle),
|
|
241
|
-
因此这几条在桌面版上不命中。留着不改动旧宿主行为,收敛需另采锚点(见 host-families.js)。 */
|
|
242
|
-
body:not(.dsh-workbench-open) div[class*="__F_WB__panel"],
|
|
243
|
-
body:not(.dsh-workbench-open) div[class*="workbench_panel"],
|
|
244
|
-
body:not(.dsh-workbench-open) div[class*="workbenchPanel"],
|
|
245
|
-
div[class*="__F_WB__panel"][class*="panelHidden"],
|
|
246
|
-
div[class*="workbench_panel"][class*="panelHidden"],
|
|
247
|
-
div[class*="workbenchPanel"][class*="panelHidden"],
|
|
248
|
-
div[class*="panelHidden"] {
|
|
249
|
-
display: none !important;
|
|
250
|
-
visibility: hidden !important;
|
|
251
|
-
pointer-events: none !important;
|
|
252
|
-
width: 0 !important;
|
|
253
|
-
height: 0 !important;
|
|
254
|
-
max-height: 0 !important;
|
|
255
|
-
z-index: -1 !important;
|
|
256
|
-
opacity: 0 !important;
|
|
257
|
-
transform: translateX(105%) !important;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
body.dsh-workbench-open div[class*="__F_WB__panel"]:not([class*="panelHidden"]),
|
|
261
|
-
body.dsh-workbench-open div[class*="workbench_panel"]:not([class*="panelHidden"]),
|
|
262
|
-
body.dsh-workbench-open div[class*="workbenchPanel"]:not([class*="panelHidden"]) {
|
|
263
|
-
display: flex !important;
|
|
264
|
-
visibility: visible !important;
|
|
265
|
-
pointer-events: auto !important;
|
|
266
|
-
top: var(--dsh-mobile-header-h, 52px) !important;
|
|
267
|
-
height: calc(100dvh - var(--dsh-mobile-header-h, 52px)) !important;
|
|
268
|
-
max-height: calc(100dvh - var(--dsh-mobile-header-h, 52px)) !important;
|
|
269
|
-
z-index: 50 !important;
|
|
270
|
-
box-sizing: border-box !important;
|
|
271
|
-
background: var(--dsw-alias-bg-layer-1, #ffffff) !important;
|
|
272
|
-
transform: none !important;
|
|
273
|
-
opacity: 1 !important;
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
/* Tab 栏:横向滑动手势 + 干净的底部边框,杜绝与顶部移动端 Header 重叠 */
|
|
277
|
-
div[class*="__F_WB__tabBar"],
|
|
278
|
-
div[class*="workbench_tabBar"],
|
|
279
|
-
div[class*="tabBar"] {
|
|
280
|
-
min-height: 40px !important;
|
|
281
|
-
height: 40px !important;
|
|
282
|
-
background: var(--dsw-alias-bg-layer-1, #ffffff) !important;
|
|
283
|
-
border-bottom: 1px solid rgba(0, 0, 0, 0.08) !important;
|
|
284
|
-
display: flex !important;
|
|
285
|
-
align-items: center !important;
|
|
286
|
-
justify-content: space-between !important;
|
|
287
|
-
padding: 0 8px !important;
|
|
288
|
-
gap: 6px !important;
|
|
289
|
-
overflow: visible !important;
|
|
290
|
-
box-sizing: border-box !important;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
div[class*="__F_WB__tabList"],
|
|
294
|
-
div[class*="tabList"] {
|
|
295
|
-
display: flex !important;
|
|
296
|
-
align-items: center !important;
|
|
297
|
-
gap: 6px !important;
|
|
298
|
-
flex: 1 1 auto !important;
|
|
299
|
-
min-width: 0 !important;
|
|
300
|
-
overflow-x: auto !important;
|
|
301
|
-
scrollbar-width: none !important;
|
|
302
|
-
-webkit-overflow-scrolling: touch !important;
|
|
303
|
-
}
|
|
304
|
-
div[class*="__F_WB__tabList"]::-webkit-scrollbar,
|
|
305
|
-
div[class*="tabList"]::-webkit-scrollbar {
|
|
306
|
-
display: none !important;
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
/* 单个 Tab 胶囊化,文字超长自动打点,防止 Tab 互相挤压 */
|
|
310
|
-
div[class*="__F_WB__tab"],
|
|
311
|
-
div[class*="workbench_tab"] {
|
|
312
|
-
flex: 0 0 auto !important;
|
|
313
|
-
max-width: 170px !important;
|
|
314
|
-
min-width: 70px !important;
|
|
315
|
-
height: 30px !important;
|
|
316
|
-
padding: 0 8px 0 10px !important;
|
|
317
|
-
border-radius: 6px !important;
|
|
318
|
-
font-size: 12.5px !important;
|
|
319
|
-
display: inline-flex !important;
|
|
320
|
-
align-items: center !important;
|
|
321
|
-
justify-content: space-between !important;
|
|
322
|
-
gap: 6px !important;
|
|
323
|
-
background: var(--dsw-alias-bg-layer-2, #f3f4f6) !important;
|
|
324
|
-
color: var(--dsw-alias-label-secondary, #6b7280) !important;
|
|
325
|
-
cursor: pointer !important;
|
|
326
|
-
user-select: none !important;
|
|
327
|
-
box-sizing: border-box !important;
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
div[class*="__F_WB__tabActive"],
|
|
331
|
-
div[class*="workbench_tabActive"] {
|
|
332
|
-
background: var(--dsw-alias-bg-layer-1, #ffffff) !important;
|
|
333
|
-
color: var(--dsw-alias-label-primary, #111827) !important;
|
|
334
|
-
font-weight: 600 !important;
|
|
335
|
-
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1) !important;
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
span[class*="__F_WB__tabTitle"],
|
|
339
|
-
span[class*="tabTitle"] {
|
|
340
|
-
overflow: hidden !important;
|
|
341
|
-
text-overflow: ellipsis !important;
|
|
342
|
-
white-space: nowrap !important;
|
|
343
|
-
flex: 1 1 auto !important;
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
button[class*="__F_WB__tabClose"],
|
|
347
|
-
button[class*="tabClose"] {
|
|
348
|
-
width: 18px !important;
|
|
349
|
-
height: 18px !important;
|
|
350
|
-
border-radius: 50% !important;
|
|
351
|
-
display: inline-flex !important;
|
|
352
|
-
align-items: center !important;
|
|
353
|
-
justify-content: center !important;
|
|
354
|
-
flex-shrink: 0 !important;
|
|
355
|
-
opacity: 0.6 !important;
|
|
356
|
-
padding: 0 !important;
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
button[class*="__F_WB__tabBarPlus"],
|
|
360
|
-
button[class*="tabBarPlus"] {
|
|
361
|
-
width: 28px !important;
|
|
362
|
-
height: 28px !important;
|
|
363
|
-
border-radius: 50% !important;
|
|
364
|
-
display: inline-flex !important;
|
|
365
|
-
align-items: center !important;
|
|
366
|
-
justify-content: center !important;
|
|
367
|
-
flex-shrink: 0 !important;
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
/* 移动端面板右上角“返回对话 / ✕ 收起”按钮:常驻右侧,醒目且易触达 */
|
|
371
|
-
.dsh-mobile-panel-close-btn {
|
|
372
|
-
margin-left: 8px !important;
|
|
373
|
-
flex: 0 0 auto !important;
|
|
374
|
-
height: 28px !important;
|
|
375
|
-
padding: 0 10px !important;
|
|
376
|
-
border-radius: 14px !important;
|
|
377
|
-
font-size: 12px !important;
|
|
378
|
-
font-weight: 600 !important;
|
|
379
|
-
background: #2563eb !important;
|
|
380
|
-
color: #ffffff !important;
|
|
381
|
-
border: none !important;
|
|
382
|
-
display: inline-flex !important;
|
|
383
|
-
align-items: center !important;
|
|
384
|
-
justify-content: center !important;
|
|
385
|
-
gap: 4px !important;
|
|
386
|
-
cursor: pointer !important;
|
|
387
|
-
user-select: none !important;
|
|
388
|
-
box-shadow: 0 2px 6px rgba(37, 99, 235, 0.28) !important;
|
|
389
|
-
white-space: nowrap !important;
|
|
390
|
-
transition: transform 0.1s, opacity 0.15s !important;
|
|
391
|
-
z-index: 10 !important;
|
|
392
|
-
}
|
|
393
|
-
.dsh-mobile-panel-close-btn:active {
|
|
394
|
-
transform: scale(0.95) !important;
|
|
395
|
-
opacity: 0.85 !important;
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
/* 1.1.1 宿主浮层(智能体团队 / 子智能体下拉):移动端统一退出通道。
|
|
399
|
-
—— 宿主这两处浮层都是**桌面语义的 popover**,自身没有任何关闭控件:桌面靠鼠标移出、
|
|
400
|
-
点浮层外空白或 Esc 收起(团队浮层是 dsh-client-ui-primitives 的
|
|
401
|
-
useDismissOnOutsidePointer + keydown Escape;子智能体下拉是自带的 closeOutside +
|
|
402
|
-
React onKeyDown)。手机上没有 hover,而"点外面"这条唯一退路未必够得着:
|
|
403
|
-
· 团队浮层:上限 680px 已接近整屏,实测 360×803 占 y=91.5..771.5,上下只剩 92/32px;
|
|
404
|
-
· 子智能体下拉:宿主自留 140px,但矮屏 + 多子智能体时同样紧张
|
|
405
|
-
(实测 360×560 + 12 个子智能体 = 328×420 于 y=91.5..511.5,下方只剩 49px)。
|
|
406
|
-
这两段空白在真机上正好落在浏览器地址栏/底部导航条覆盖区,左右 16px 又要跟系统
|
|
407
|
-
返回手势抢 —— 用户"点不到空白",退不出来。这里统一做两件事:
|
|
408
|
-
(1) 收紧高度上限:按**动态视口**再留安全边(vh 行是不支持 dvh 的兜底,只在视口
|
|
409
|
-
真的更矮时生效,正常竖屏无视觉变化),保证浮层不伸到浏览器 UI 底下。
|
|
410
|
-
外层 max(160px, …) 是**下限保护**:数学函数在"视口比保留量还矮"时会把结果钳到
|
|
411
|
-
≤0,而 !important 会赢过宿主自己的兜底 → 浮层被压成 0 高、连按钮一起不可见
|
|
412
|
-
(独立验收实测:80px 视口下计算值就是 0px)。真机上视口 <256px 不可达,这里
|
|
413
|
-
纯属健壮性保护:宁可略高于视口,也不要"整块消失";
|
|
414
|
-
(2) 为 JS 注入的收起按钮(.dsh-mobile-popover-close-btn,见 client/index.js)
|
|
415
|
-
预留顶部 44px 操作带,按钮钉在右上角,在真机可用视口内(实测视口高 ≥176px 时
|
|
416
|
-
浮层顶边仍为正、按钮完整可见且可命中;真机竖/横屏都远高于此)始终落在浮层
|
|
417
|
-
可见区;视口矮到约 176px 以下时宿主会把浮层顶边推到负值、按钮随之出屏,
|
|
418
|
-
属不可达场景,不在本规则的承诺范围内。 */
|
|
419
|
-
[data-team-panel].dsh-bridge-team-panel {
|
|
420
|
-
padding-top: 44px !important;
|
|
421
|
-
max-height: max(160px, min(680px, calc(100vh - 96px))) !important;
|
|
422
|
-
max-height: max(160px, min(680px, calc(100dvh - 96px))) !important;
|
|
423
|
-
}
|
|
424
|
-
/* 子智能体下拉:宿主自己已按 min(560px, 100vh - 140px) 预留 140px,这里只把 vh 换成
|
|
425
|
-
动态视口 —— 否则手机地址栏/底部导航条吃掉的那段会被算进可用高度。 */
|
|
426
|
-
body > div[class*="_menu"].dsh-bridge-subagent-menu {
|
|
427
|
-
padding-top: 44px !important;
|
|
428
|
-
max-height: max(160px, min(560px, calc(100vh - 140px))) !important;
|
|
429
|
-
max-height: max(160px, min(560px, calc(100dvh - 140px))) !important;
|
|
430
|
-
}
|
|
431
|
-
.dsh-mobile-popover-close-btn {
|
|
432
|
-
position: absolute !important;
|
|
433
|
-
top: 8px !important;
|
|
434
|
-
right: 8px !important;
|
|
435
|
-
z-index: 2 !important;
|
|
436
|
-
box-sizing: border-box !important;
|
|
437
|
-
height: 28px !important;
|
|
438
|
-
min-width: 28px !important;
|
|
439
|
-
padding: 0 10px !important;
|
|
440
|
-
border-radius: 14px !important;
|
|
441
|
-
border: 1px solid var(--dsw-alias-border-l2, rgba(127, 127, 127, 0.35)) !important;
|
|
442
|
-
background: var(--dsw-alias-bg-layer-2, rgba(127, 127, 127, 0.16)) !important;
|
|
443
|
-
color: var(--dsw-alias-label-primary, inherit) !important;
|
|
444
|
-
font-size: 12px !important;
|
|
445
|
-
font-weight: 600 !important;
|
|
446
|
-
line-height: 1 !important;
|
|
447
|
-
display: inline-flex !important;
|
|
448
|
-
align-items: center !important;
|
|
449
|
-
justify-content: center !important;
|
|
450
|
-
gap: 4px !important;
|
|
451
|
-
flex: 0 0 auto !important;
|
|
452
|
-
white-space: nowrap !important;
|
|
453
|
-
cursor: pointer !important;
|
|
454
|
-
-webkit-tap-highlight-color: transparent !important;
|
|
455
|
-
transition: transform 0.1s, opacity 0.15s !important;
|
|
456
|
-
}
|
|
457
|
-
.dsh-mobile-popover-close-btn:active {
|
|
458
|
-
transform: scale(0.95) !important;
|
|
459
|
-
opacity: 0.85 !important;
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
/* 3.1 会话对话头部顶栏:移动端防挤压与空间释放优化(严格排除 .dsh-mobile-app-header) */
|
|
463
|
-
div[class*="_centerCol"] header,
|
|
464
|
-
header[class*="__F_CONV__header"] {
|
|
465
|
-
padding: 4px 16px 2px 16px !important;
|
|
466
|
-
position: relative !important;
|
|
467
|
-
overflow: visible !important;
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
div[class*="__F_CONV__titleRow"],
|
|
471
|
-
div[class*="titleRow"] {
|
|
472
|
-
display: flex !important;
|
|
473
|
-
flex-direction: row !important;
|
|
474
|
-
align-items: center !important;
|
|
475
|
-
justify-content: space-between !important;
|
|
476
|
-
gap: 8px !important;
|
|
477
|
-
min-height: 32px !important;
|
|
478
|
-
width: 100% !important;
|
|
479
|
-
box-sizing: border-box !important;
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
/* 移动端将原有嵌入在内容区的长面包屑标题隐藏(已统一提升至顶部导航栏正中),彻底释放第二行空间 */
|
|
483
|
-
nav[class*="__F_CONV__crumbs"],
|
|
484
|
-
nav[class*="crumbs"],
|
|
485
|
-
div[class*="__F_CONV__crumbs"],
|
|
486
|
-
div[class*="crumbs"],
|
|
487
|
-
[class*="__F_CONV__crumbs"] {
|
|
488
|
-
display: none !important;
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
/* 子代理/智能体模式胶囊 (Actions):紧凑圆角胶囊 */
|
|
492
|
-
div[class*="__F_CONV__headerActions"],
|
|
493
|
-
div[class*="headerActions"] {
|
|
494
|
-
flex: 0 0 auto !important;
|
|
495
|
-
display: inline-flex !important;
|
|
496
|
-
align-items: center !important;
|
|
497
|
-
gap: 4px !important;
|
|
498
|
-
margin-left: 0 !important;
|
|
499
|
-
}
|
|
500
|
-
|
|
501
|
-
/* Agent 预设胶囊:本地名历代不一 —— 0.1.x 与 0.2.0 实测都是 _seat
|
|
502
|
-
(cubgiG_seat / _oGoKq_seat),插件早期采到的 trigger 两代都不存在,故两个都收。 */
|
|
503
|
-
button[class*="__F_PRESET__trigger"],
|
|
504
|
-
button[class*="__F_PRESET__seat"],
|
|
505
|
-
button[class*="subagent"] {
|
|
506
|
-
min-height: 26px !important;
|
|
507
|
-
height: 26px !important;
|
|
508
|
-
padding: 2px 8px !important;
|
|
509
|
-
font-size: 11.5px !important;
|
|
510
|
-
line-height: 16px !important;
|
|
511
|
-
border-radius: 13px !important;
|
|
512
|
-
background: var(--dsw-alias-bg-layer-2, rgba(0, 0, 0, 0.04)) !important;
|
|
513
|
-
white-space: nowrap !important;
|
|
514
|
-
flex-shrink: 0 !important;
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
/* Session Log 导出下载按钮 (Utilities):在移动端极简为 28px 圆形纯图标按钮,隐藏长文本,极大释放顶部空间。
|
|
518
|
-
裸本地名 sessionLogButton 兜底是版本无关的(0.1.x 为 nL4_yW_sessionLogButton);
|
|
519
|
-
0.2.0 的 app.asar 里该本地名已不存在(该按钮被移除/改名),故桌面版不适用。 */
|
|
520
|
-
div[class*="__F_CONV__headerUtilities"],
|
|
521
|
-
div[class*="headerUtilities"] {
|
|
522
|
-
flex: 0 0 auto !important;
|
|
523
|
-
margin-left: 4px !important;
|
|
524
|
-
display: inline-flex !important;
|
|
525
|
-
align-items: center !important;
|
|
526
|
-
}
|
|
527
|
-
|
|
528
|
-
button[class*="__F_LOG__sessionLogButton"],
|
|
529
|
-
button[class*="sessionLogButton"] {
|
|
530
|
-
min-width: 28px !important;
|
|
531
|
-
width: 28px !important;
|
|
532
|
-
height: 28px !important;
|
|
533
|
-
padding: 0 !important;
|
|
534
|
-
border-radius: 50% !important;
|
|
535
|
-
display: inline-flex !important;
|
|
536
|
-
align-items: center !important;
|
|
537
|
-
justify-content: center !important;
|
|
538
|
-
flex-shrink: 0 !important;
|
|
539
|
-
border: 1px solid var(--dsw-alias-border-l2, rgba(0, 0, 0, 0.1)) !important;
|
|
540
|
-
background: var(--dsw-alias-bg-layer-2, rgba(0, 0, 0, 0.03)) !important;
|
|
541
|
-
color: var(--dsw-alias-label-secondary, #6b7280) !important;
|
|
542
|
-
margin-left: 0 !important;
|
|
543
|
-
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.03) !important;
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
button[class*="__F_LOG__sessionLogButton"]:hover:not(:disabled),
|
|
547
|
-
button[class*="sessionLogButton"]:hover:not(:disabled) {
|
|
548
|
-
background: var(--dsw-alias-interactive-bg-hover, rgba(0, 0, 0, 0.06)) !important;
|
|
549
|
-
color: var(--dsw-alias-label-primary, #111827) !important;
|
|
550
|
-
}
|
|
551
|
-
|
|
552
|
-
button[class*="__F_LOG__sessionLogButton"] span,
|
|
553
|
-
button[class*="sessionLogButton"] span {
|
|
554
|
-
display: none !important;
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
button[class*="__F_LOG__sessionLogButton"] svg,
|
|
558
|
-
button[class*="sessionLogButton"] svg {
|
|
559
|
-
width: 13px !important;
|
|
560
|
-
height: 13px !important;
|
|
561
|
-
margin: 0 !important;
|
|
562
|
-
}
|
|
563
|
-
|
|
564
|
-
/* 子代理展开菜单在移动端右对齐与宽度自适应。
|
|
565
|
-
注:menu 这个本地名在 0.1.x(cubgiG) 与 0.2.0(_oGoKq) 的 Agent 预设族里都不存在
|
|
566
|
-
(实测),本规则在这两个宿主上不命中;保留是为了不改动旧行为,等采到真实锚点再收敛。 */
|
|
567
|
-
div[class*="__F_PRESET__menu"] {
|
|
568
|
-
max-width: calc(100vw - 32px) !important;
|
|
569
|
-
left: auto !important;
|
|
570
|
-
right: 0 !important;
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
/* 输入框底座:DeepSeek App 居中及底部固定 */
|
|
574
|
-
div[class*="__F_CONV__scrollBody"] {
|
|
575
|
-
padding-bottom: max(16px, env(safe-area-inset-bottom)) !important;
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
/* ── 移动端输入框折叠模式(body.dsh-composer-collapsed)──────────────
|
|
579
|
-
折叠后隐藏吸底输入区,让消息 viewArea 自动伸展到全高,最大化阅读区。
|
|
580
|
-
入口:聊天头部工具栏(Session 下载钮旁)的折叠按钮,或折叠态底部细输入条点它唤回。
|
|
581
|
-
状态持久化到 localStorage。 */
|
|
582
|
-
body.dsh-composer-collapsed div[class*="__F_CONV__composerSeat"] {
|
|
583
|
-
display: none !important;
|
|
584
|
-
}
|
|
585
|
-
body.dsh-composer-collapsed div[class*="__F_CONV__viewArea"] {
|
|
586
|
-
flex: 1 1 auto !important;
|
|
587
|
-
height: auto !important;
|
|
588
|
-
min-height: 0 !important;
|
|
589
|
-
}
|
|
590
|
-
/* 折叠时滚动区底部对齐 safe-area,避免内容被 iPhone 底部横条遮挡 */
|
|
591
|
-
body.dsh-composer-collapsed div[class*="__F_CONV__scrollBody"] {
|
|
592
|
-
padding-bottom: max(16px, env(safe-area-inset-bottom)) !important;
|
|
593
|
-
}
|
|
594
|
-
|
|
595
|
-
/* 折叠输入框按钮:注入在聊天头部工具栏(Session 下载钮旁),
|
|
596
|
-
与 DSH sessionLogButton 同规格(28px 圆形图标钮),视觉与原生一致 */
|
|
597
|
-
.dsh-header-fold-btn {
|
|
598
|
-
min-width: 28px !important;
|
|
599
|
-
width: 28px !important;
|
|
600
|
-
height: 28px !important;
|
|
601
|
-
padding: 0 !important;
|
|
602
|
-
border-radius: 50% !important;
|
|
603
|
-
display: inline-flex !important;
|
|
604
|
-
align-items: center !important;
|
|
605
|
-
justify-content: center !important;
|
|
606
|
-
flex-shrink: 0 !important;
|
|
607
|
-
border: 1px solid var(--dsw-alias-border-l2, rgba(0, 0, 0, 0.1)) !important;
|
|
608
|
-
background: var(--dsw-alias-bg-layer-2, rgba(0, 0, 0, 0.03)) !important;
|
|
609
|
-
color: var(--dsw-alias-label-secondary, #6b7280) !important;
|
|
610
|
-
cursor: pointer !important;
|
|
611
|
-
transition: opacity 0.15s !important;
|
|
612
|
-
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.03) !important;
|
|
613
|
-
-webkit-tap-highlight-color: transparent !important;
|
|
614
|
-
}
|
|
615
|
-
.dsh-header-fold-btn:active {
|
|
616
|
-
opacity: 0.6 !important;
|
|
617
|
-
}
|
|
618
|
-
.dsh-header-fold-btn svg {
|
|
619
|
-
width: 15px !important;
|
|
620
|
-
height: 15px !important;
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
/* 折叠态底部细输入条:点击唤起输入框(位于原输入区位置,sticky 底部) */
|
|
624
|
-
.dsh-composer-collapsed-bar {
|
|
625
|
-
display: none !important;
|
|
626
|
-
position: sticky !important;
|
|
627
|
-
bottom: 0 !important;
|
|
628
|
-
margin: 8px 12px max(8px, env(safe-area-inset-bottom, 0px)) 12px !important;
|
|
629
|
-
padding: 11px 16px !important;
|
|
630
|
-
border-radius: 22px !important;
|
|
631
|
-
background: var(--dsw-alias-bg-layer-2, #f4f4f7) !important;
|
|
632
|
-
border: 1px solid rgba(0, 0, 0, 0.07) !important;
|
|
633
|
-
color: var(--dsw-alias-label-tertiary, #8b93a1) !important;
|
|
634
|
-
font-size: 13.5px !important;
|
|
635
|
-
line-height: 1.4 !important;
|
|
636
|
-
cursor: pointer !important;
|
|
637
|
-
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.04) !important;
|
|
638
|
-
-webkit-tap-highlight-color: transparent !important;
|
|
639
|
-
z-index: 40 !important;
|
|
640
|
-
box-sizing: border-box !important;
|
|
641
|
-
}
|
|
642
|
-
body.dsh-composer-collapsed .dsh-composer-collapsed-bar {
|
|
643
|
-
display: block !important;
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
/* 输入卡片:DeepSeek App 圆角大胶囊造型 */
|
|
647
|
-
div[class*="__F_COMPOSER__card"] {
|
|
648
|
-
border-radius: 26px !important;
|
|
649
|
-
padding: 14px 16px 12px !important;
|
|
650
|
-
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.05) !important;
|
|
651
|
-
border: 1px solid rgba(0, 0, 0, 0.07) !important;
|
|
652
|
-
background: var(--dsw-alias-bg-layer-2, #f4f4f7) !important;
|
|
653
|
-
}
|
|
654
|
-
|
|
655
|
-
/* 输入框底部工具栏:弹性自适应,彻底杜绝权限选择器(Full access)与模型选择器重叠碰撞 */
|
|
656
|
-
div[class*="__F_COMPOSER__row"] {
|
|
657
|
-
display: flex !important;
|
|
658
|
-
align-items: center !important;
|
|
659
|
-
justify-content: space-between !important;
|
|
660
|
-
gap: 6px !important;
|
|
661
|
-
width: 100% !important;
|
|
662
|
-
padding: 2px 2px 4px !important;
|
|
663
|
-
box-sizing: border-box !important;
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
div[class*="__F_COMPOSER__tools"] {
|
|
667
|
-
display: flex !important;
|
|
668
|
-
align-items: center !important;
|
|
669
|
-
gap: 6px !important;
|
|
670
|
-
flex: 0 0 auto !important;
|
|
671
|
-
min-width: 0 !important;
|
|
672
|
-
}
|
|
673
|
-
|
|
674
|
-
div[class*="__F_COMPOSER__modes"] {
|
|
675
|
-
display: flex !important;
|
|
676
|
-
align-items: center !important;
|
|
677
|
-
gap: 4px !important;
|
|
678
|
-
flex: 0 0 auto !important;
|
|
679
|
-
min-width: 0 !important;
|
|
680
|
-
}
|
|
681
|
-
|
|
682
|
-
button[class*="__F_ACCESS__trigger"] {
|
|
683
|
-
flex: 0 0 auto !important;
|
|
684
|
-
min-width: 0 !important;
|
|
685
|
-
}
|
|
686
|
-
|
|
687
|
-
div[class*="__F_COMPOSER__trailing"] {
|
|
688
|
-
display: flex !important;
|
|
689
|
-
align-items: center !important;
|
|
690
|
-
justify-content: flex-end !important;
|
|
691
|
-
gap: 6px !important;
|
|
692
|
-
flex: 1 1 auto !important;
|
|
693
|
-
min-width: 0 !important;
|
|
694
|
-
}
|
|
695
|
-
|
|
696
|
-
div[class*="__F_MODEL__root"] {
|
|
697
|
-
flex: 0 1 auto !important;
|
|
698
|
-
min-width: 0 !important;
|
|
699
|
-
max-width: 180px !important;
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
button[class*="__F_MODEL__trigger"] {
|
|
703
|
-
max-width: 100% !important;
|
|
704
|
-
min-width: 0 !important;
|
|
705
|
-
flex: 1 1 auto !important;
|
|
706
|
-
padding: 0 4px 0 6px !important;
|
|
707
|
-
}
|
|
708
|
-
|
|
709
|
-
span[class*="__F_MODEL__triggerLabel"] {
|
|
710
|
-
overflow: hidden !important;
|
|
711
|
-
text-overflow: ellipsis !important;
|
|
712
|
-
white-space: nowrap !important;
|
|
713
|
-
min-width: 0 !important;
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
/* 4. 原生侧边栏抽屉化 (Drawer) */
|
|
717
|
-
div[class*="_sidebarCol"] {
|
|
718
|
-
position: fixed !important;
|
|
719
|
-
left: 0 !important;
|
|
720
|
-
top: 0 !important;
|
|
721
|
-
bottom: 0 !important;
|
|
722
|
-
height: 100dvh !important;
|
|
723
|
-
width: 290px !important;
|
|
724
|
-
max-width: 82vw !important;
|
|
725
|
-
z-index: 10000 !important;
|
|
726
|
-
background: var(--dsw-alias-bg-layer-1, #ffffff) !important;
|
|
727
|
-
transform: translateX(-105%);
|
|
728
|
-
transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1);
|
|
729
|
-
overflow-y: auto !important;
|
|
730
|
-
border-right: 1px solid rgba(0, 0, 0, 0.06) !important;
|
|
731
|
-
pointer-events: auto !important;
|
|
732
|
-
}
|
|
733
|
-
body.dsh-drawer-open div[class*="_sidebarCol"] {
|
|
734
|
-
transform: translateX(0) !important;
|
|
735
|
-
box-shadow: 4px 0 28px rgba(0, 0, 0, 0.25) !important;
|
|
736
|
-
pointer-events: auto !important;
|
|
737
|
-
}
|
|
738
|
-
|
|
739
|
-
/* 抽屉内部:强制 100% 宽度,无论内部状态如何均正常展开并展示 DSH 自带的顶部收起侧边栏图标 */
|
|
740
|
-
body.dsh-drawer-open div[class*="__F_SIDEBAR__root"] {
|
|
741
|
-
width: 100% !important;
|
|
742
|
-
max-width: 100% !important;
|
|
743
|
-
min-width: 100% !important;
|
|
744
|
-
display: flex !important;
|
|
745
|
-
flex-direction: column !important;
|
|
746
|
-
}
|
|
747
|
-
body.dsh-drawer-open div[class*="__F_SIDEBAR__collapsed"] div[class*="__F_SIDEBAR__regionArea"],
|
|
748
|
-
body.dsh-drawer-open div[class*="__F_SIDEBAR__collapsed"] button[class*="__F_SIDEBAR__newSession"],
|
|
749
|
-
body.dsh-drawer-open div[class*="__F_SIDEBAR__collapsed"] div[class*="__F_WS__root"] {
|
|
750
|
-
display: flex !important;
|
|
751
|
-
visibility: visible !important;
|
|
752
|
-
}
|
|
753
|
-
div[class*="__F_SIDEBAR__logoRow"] {
|
|
754
|
-
display: flex !important;
|
|
755
|
-
align-items: center !important;
|
|
756
|
-
justify-content: space-between !important;
|
|
757
|
-
width: 100% !important;
|
|
758
|
-
padding: 10px 14px 6px 14px !important;
|
|
759
|
-
box-sizing: border-box !important;
|
|
760
|
-
}
|
|
761
|
-
div[class*="__F_SIDEBAR__logoRow"] button[class*="__F_SIDEBAR__toggle"] {
|
|
762
|
-
display: inline-flex !important;
|
|
763
|
-
align-items: center !important;
|
|
764
|
-
justify-content: center !important;
|
|
765
|
-
width: 32px !important;
|
|
766
|
-
height: 32px !important;
|
|
767
|
-
border-radius: 8px !important;
|
|
768
|
-
color: var(--dsw-alias-label-secondary, #6b7280) !important;
|
|
769
|
-
background: transparent !important;
|
|
770
|
-
border: none !important;
|
|
771
|
-
cursor: pointer !important;
|
|
772
|
-
margin-left: auto !important;
|
|
773
|
-
transition: background 0.15s, color 0.15s !important;
|
|
774
|
-
}
|
|
775
|
-
div[class*="__F_SIDEBAR__logoRow"] button[class*="__F_SIDEBAR__toggle"]:active {
|
|
776
|
-
background: var(--dsw-alias-bg-layer-2, rgba(0, 0, 0, 0.06)) !important;
|
|
777
|
-
color: var(--dsw-alias-label-primary, #111827) !important;
|
|
778
|
-
}
|
|
779
|
-
|
|
780
|
-
/* 设置弹窗打开时解除抽屉隐藏限制 */
|
|
781
|
-
div[class*="_sidebarCol"]:has(div[class*="__F_SETTINGS__overlay"]) {
|
|
782
|
-
transform: none !important;
|
|
783
|
-
width: 100vw !important;
|
|
784
|
-
max-width: 100vw !important;
|
|
785
|
-
background: transparent !important;
|
|
786
|
-
box-shadow: none !important;
|
|
787
|
-
pointer-events: none !important;
|
|
788
|
-
}
|
|
789
|
-
|
|
790
|
-
/* 5. 半透明背景遮罩 */
|
|
791
|
-
.dsh-mobile-backdrop {
|
|
792
|
-
position: fixed;
|
|
793
|
-
inset: 0;
|
|
794
|
-
background: rgba(0, 0, 0, 0.4);
|
|
795
|
-
z-index: 9999;
|
|
796
|
-
display: none !important;
|
|
797
|
-
}
|
|
798
|
-
body.dsh-drawer-open .dsh-mobile-backdrop {
|
|
799
|
-
display: block !important;
|
|
800
|
-
pointer-events: auto !important;
|
|
801
|
-
}
|
|
802
|
-
|
|
803
|
-
/* 6. 设置中心全自适应适配 */
|
|
804
|
-
div[class*="__F_SETTINGS__overlay"] {
|
|
805
|
-
position: fixed !important;
|
|
806
|
-
inset: 0 !important;
|
|
807
|
-
width: 100vw !important;
|
|
808
|
-
height: 100dvh !important;
|
|
809
|
-
display: flex !important;
|
|
810
|
-
align-items: center !important;
|
|
811
|
-
justify-content: center !important;
|
|
812
|
-
background: rgba(0, 0, 0, 0.45) !important;
|
|
813
|
-
backdrop-filter: blur(4px) !important;
|
|
814
|
-
-webkit-backdrop-filter: blur(4px) !important;
|
|
815
|
-
z-index: 10002 !important;
|
|
816
|
-
padding: 10px !important;
|
|
817
|
-
box-sizing: border-box !important;
|
|
818
|
-
pointer-events: auto !important;
|
|
819
|
-
}
|
|
820
|
-
div[class*="__F_SETTINGS__panel"] {
|
|
821
|
-
width: 100% !important;
|
|
822
|
-
max-width: 100% !important;
|
|
823
|
-
height: 92dvh !important;
|
|
824
|
-
max-height: 92dvh !important;
|
|
825
|
-
display: flex !important;
|
|
826
|
-
flex-direction: row !important;
|
|
827
|
-
border-radius: 18px !important;
|
|
828
|
-
overflow: hidden !important;
|
|
829
|
-
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.25) !important;
|
|
830
|
-
background: var(--dsw-alias-bg-layer-1, #ffffff) !important;
|
|
831
|
-
}
|
|
832
|
-
/* 6.1 481–767px:保留左侧图标轨道。
|
|
833
|
-
78px 轨道把 "Agent presets"/"Plugin Market" 挤到两侧只剩 ~5px、标签被压到
|
|
834
|
-
10.5px 且 word-break:break-all 会从词中间断字,故放宽到 88px / 11.5px,
|
|
835
|
-
并改用 overflow-wrap 兜底(正常单词不再被拆)。 */
|
|
836
|
-
nav[class*="__F_SETTINGS__nav"] {
|
|
837
|
-
width: 88px !important;
|
|
838
|
-
min-width: 88px !important;
|
|
839
|
-
max-width: 88px !important;
|
|
840
|
-
padding: 10px 6px !important;
|
|
841
|
-
box-sizing: border-box !important;
|
|
842
|
-
border-right: 1px solid var(--dsw-alias-border-l2, #e5e7eb) !important;
|
|
843
|
-
display: flex !important;
|
|
844
|
-
flex-direction: column !important;
|
|
845
|
-
gap: 6px !important;
|
|
846
|
-
overflow-y: auto !important;
|
|
847
|
-
overscroll-behavior: contain !important;
|
|
848
|
-
}
|
|
849
|
-
nav[class*="__F_SETTINGS__nav"] button[class*="__F_SETTINGS__navCell"],
|
|
850
|
-
button[class*="__F_SETTINGS__navCell"] {
|
|
851
|
-
padding: 7px 2px !important;
|
|
852
|
-
display: flex !important;
|
|
853
|
-
flex-direction: column !important;
|
|
854
|
-
align-items: center !important;
|
|
855
|
-
justify-content: center !important;
|
|
856
|
-
text-align: center !important;
|
|
857
|
-
height: auto !important;
|
|
858
|
-
min-height: 46px !important;
|
|
859
|
-
/* flex:none:单元格不得被压缩,否则矮视口下末项会贴着轨道下沿被切掉 */
|
|
860
|
-
flex: 0 0 auto !important;
|
|
861
|
-
gap: 3px !important;
|
|
862
|
-
border-radius: 10px !important;
|
|
863
|
-
}
|
|
864
|
-
span[class*="__F_SETTINGS__navLabel"] {
|
|
865
|
-
font-size: 11.5px !important;
|
|
866
|
-
line-height: 1.25 !important;
|
|
867
|
-
white-space: normal !important;
|
|
868
|
-
word-break: normal !important;
|
|
869
|
-
overflow-wrap: anywhere !important;
|
|
870
|
-
text-align: center !important;
|
|
871
|
-
}
|
|
872
|
-
|
|
873
|
-
/* 矮视口(横屏手机):压缩轨道单元格,保证 6 个分类全部落在面板内,
|
|
874
|
-
而不是靠 nav 自身的 overflow-y 滚动把末项藏起来(当前无任何可滚动提示)。 */
|
|
875
|
-
@media (max-height: 500px) {
|
|
876
|
-
nav[class*="__F_SETTINGS__nav"] {
|
|
877
|
-
padding: 8px 6px !important;
|
|
878
|
-
gap: 4px !important;
|
|
879
|
-
}
|
|
880
|
-
nav[class*="__F_SETTINGS__nav"] button[class*="__F_SETTINGS__navCell"],
|
|
881
|
-
button[class*="__F_SETTINGS__navCell"] {
|
|
882
|
-
min-height: 40px !important;
|
|
883
|
-
padding: 4px 2px !important;
|
|
884
|
-
}
|
|
885
|
-
div[class*="__F_SETTINGS__navTitle"] {
|
|
886
|
-
font-size: 13px !important;
|
|
887
|
-
line-height: 1.3 !important;
|
|
888
|
-
padding: 0 4px !important;
|
|
889
|
-
}
|
|
890
|
-
}
|
|
891
|
-
|
|
892
|
-
div[class*="__F_SETTINGS__content"] {
|
|
893
|
-
flex: 1 1 auto !important;
|
|
894
|
-
min-width: 0 !important;
|
|
895
|
-
width: calc(100% - 88px) !important;
|
|
896
|
-
max-width: calc(100% - 88px) !important;
|
|
897
|
-
display: flex !important;
|
|
898
|
-
flex-direction: column !important;
|
|
899
|
-
overflow: hidden !important;
|
|
900
|
-
}
|
|
901
|
-
/* overflow-x 必须是 auto 而不是 hidden:宿主原样式只写了 overflow-y:auto,
|
|
902
|
-
按 CSS Overflow 规范 overflow-x 会计算为 auto(可横滑)。此前插件强制
|
|
903
|
-
hidden,把「可滚动」降级成「静默裁切」——溢出内容既看不到也滑不出来
|
|
904
|
-
(实测 375px 下裁掉 42px,Plugin Market 的 Installed/Advanced 两个 Tab
|
|
905
|
-
直接不可达)。这里恢复宿主默认,保证任何第三方设置节的内容至少可达。 */
|
|
906
|
-
div[class*="__F_SETTINGS__options"] {
|
|
907
|
-
flex: 1 1 auto !important;
|
|
908
|
-
width: 100% !important;
|
|
909
|
-
max-width: 100% !important;
|
|
910
|
-
min-width: 0 !important;
|
|
911
|
-
box-sizing: border-box !important;
|
|
912
|
-
padding: 0 14px 20px !important;
|
|
913
|
-
overflow-x: auto !important;
|
|
914
|
-
overflow-y: auto !important;
|
|
915
|
-
-webkit-overflow-scrolling: touch !important;
|
|
916
|
-
overscroll-behavior: contain !important;
|
|
917
|
-
}
|
|
918
|
-
|
|
919
|
-
/* 设置中心选项行手机自适应(垂直流式,防文字单字折行) */
|
|
920
|
-
div[class*="__F_SETTINGS__options"] div[class*="_row"] {
|
|
921
|
-
display: flex !important;
|
|
922
|
-
flex-direction: column !important;
|
|
923
|
-
align-items: stretch !important;
|
|
924
|
-
gap: 8px !important;
|
|
925
|
-
width: 100% !important;
|
|
926
|
-
/* min-width:0:让 flex 子项可以真正收缩,而不是把父容器顶宽后溢出 */
|
|
927
|
-
min-width: 0 !important;
|
|
928
|
-
padding: 12px 0 !important;
|
|
929
|
-
box-sizing: border-box !important;
|
|
930
|
-
}
|
|
931
|
-
div[class*="__F_SETTINGS__options"] div[class*="_rowText"] {
|
|
932
|
-
width: 100% !important;
|
|
933
|
-
max-width: 100% !important;
|
|
934
|
-
min-width: 0 !important;
|
|
935
|
-
}
|
|
936
|
-
div[class*="__F_SETTINGS__options"] button[class*="_selector"],
|
|
937
|
-
div[class*="__F_SETTINGS__options"] select,
|
|
938
|
-
div[class*="__F_SETTINGS__options"] input {
|
|
939
|
-
width: 100% !important;
|
|
940
|
-
max-width: 100% !important;
|
|
941
|
-
box-sizing: border-box !important;
|
|
942
|
-
}
|
|
943
|
-
|
|
944
|
-
/* 7. 代码块、表格与徽标自适应 */
|
|
945
|
-
pre, code, pre > code, table {
|
|
946
|
-
max-width: 100% !important;
|
|
947
|
-
overflow-x: auto !important;
|
|
948
|
-
-webkit-overflow-scrolling: touch !important;
|
|
949
|
-
font-size: 12.5px !important;
|
|
950
|
-
}
|
|
951
|
-
|
|
952
|
-
/* 状态徽标与药丸按钮永不折字 */
|
|
953
|
-
span[style*="border-radius: 999"],
|
|
954
|
-
span[style*="border-radius:999"] {
|
|
955
|
-
white-space: nowrap !important;
|
|
956
|
-
flex-shrink: 0 !important;
|
|
957
|
-
min-width: max-content !important;
|
|
958
|
-
}
|
|
959
|
-
|
|
960
|
-
/* 二维码与图片移动端弹性缩放 */
|
|
961
|
-
img[alt="QR"], img[src^="data:image"] {
|
|
962
|
-
max-width: 100% !important;
|
|
963
|
-
box-sizing: border-box !important;
|
|
964
|
-
}
|
|
965
|
-
|
|
966
|
-
/* 8. 确保所有 Popover 弹出菜单、操作气泡、下拉框位于抽屉之上且支持触控交互 */
|
|
967
|
-
div[class*="_portal"],
|
|
968
|
-
div[class*="portal"],
|
|
969
|
-
div[class*="popup"],
|
|
970
|
-
div[class*="dropdown"],
|
|
971
|
-
div[class*="menu"],
|
|
972
|
-
div[role="menu"],
|
|
973
|
-
div[role="dialog"] {
|
|
974
|
-
z-index: 10005 !important;
|
|
975
|
-
pointer-events: auto !important;
|
|
976
|
-
}
|
|
977
|
-
|
|
978
|
-
/* 9. 移动端侧边栏:会话与工作区三点操作按钮始终清晰可见且易于点击 */
|
|
979
|
-
div[class*="sessionRow"] span[class*="rowActions"],
|
|
980
|
-
div[class*="sessionRow"] button[class*="iconButton"],
|
|
981
|
-
div[class*="treeBody"] button[class*="iconButton"] {
|
|
982
|
-
opacity: 0.8 !important;
|
|
983
|
-
display: inline-flex !important;
|
|
984
|
-
visibility: visible !important;
|
|
985
|
-
pointer-events: auto !important;
|
|
986
|
-
}
|
|
987
|
-
div[class*="sessionRow"]:active {
|
|
988
|
-
background: var(--dsw-alias-bg-layer-2, #f3f4f6) !important;
|
|
989
|
-
}
|
|
990
|
-
|
|
991
|
-
/* 全局 overlayLayer 绝不被染黑 */
|
|
992
|
-
div[class*="overlayLayer"],
|
|
993
|
-
div[class*="__F_COMPOSER__overlayAnchor"] {
|
|
994
|
-
background: transparent !important;
|
|
995
|
-
pointer-events: none !important;
|
|
996
|
-
}
|
|
997
|
-
div[class*="overlayLayer"] > * {
|
|
998
|
-
pointer-events: auto !important;
|
|
999
|
-
}
|
|
1000
|
-
}
|
|
1001
|
-
|
|
1002
|
-
/* 6.2 <=480px 手机竖屏:设置中心改为「两级钻取」。
|
|
1003
|
-
侧边轨道在 375px 屏上要吃掉 88px(21% 宽度),内容列只剩 277px,第三方设置节
|
|
1004
|
-
(Plugin Market 的 Tab 条需 470px)必然溢出。改为:分类列表页 ↔ 内容详情页,
|
|
1005
|
-
内容独占整宽(375px 下由 277px 提升到 355px,+28%),标签回到 15px、触控行 52px。
|
|
1006
|
-
|
|
1007
|
-
【整块由 html[data-dshbr-drilldown="ready"] 门控】
|
|
1008
|
-
本块默认把内容区(options)隐藏、只显示分类列表;能不能从列表走进内容,完全
|
|
1009
|
-
取决于 client/index.js 的点击监听器。所以本块不能以「JS 一定在」为无条件前提:
|
|
1010
|
-
开关没打开时本块整体惰性,<=480px 退回 767 块的 88px 图标轨道(窄,但分类与
|
|
1011
|
-
内容都完整可达),不会出现「内容被藏了、又没人能把用户带进去」的死列表。
|
|
1012
|
-
|
|
1013
|
-
开关何时打开(client/index.js 的 setupSettingsDrilldown):
|
|
1014
|
-
- 该函数是 apply() 的第一条语句,早于注入本 CSS 的 injectMobileStyles();
|
|
1015
|
-
- 只有 document.addEventListener('click', …) 成功返回后才打上 ready。
|
|
1016
|
-
因此「本 CSS 已生效、而点击监听器没装上」在可执行路径上不可达;即使将来有人把
|
|
1017
|
-
该调用挪到会抛异常的初始化之后,开关未开也只是退回轨道布局。
|
|
1018
|
-
|
|
1019
|
-
明确未覆盖:无法在脚本内探测「addEventListener 被环境静默丢弃」这类异常 ——
|
|
1020
|
-
要做这种自检就必须在 document 上派发合成 click,而宿主与第三方插件合计有 6 个
|
|
1021
|
-
document 级 click 监听(另有多组 mousedown/pointerdown)会被误触发,得不偿失。
|
|
1022
|
-
插件 JS 完全不执行时本 CSS 也不会注入,同样不会藏内容。
|
|
1023
|
-
|
|
1024
|
-
开关放在 <html> 而非 panel:监听器必须在弹窗出现之前就装好,那时 panel 还不存在。
|
|
1025
|
-
|
|
1026
|
-
panel 上的 data-dshbr-settings-view 只表达「列表页 / 详情页」:
|
|
1027
|
-
- 无该属性(含开关刚打开的首帧)→ 分类列表页
|
|
1028
|
-
- "detail" → 内容详情页 */
|
|
1029
|
-
@media (max-width: 480px) {
|
|
1030
|
-
/* 面板由 767 块的横向轨道布局(row)改为纵向:列表页/详情页都是上下结构。
|
|
1031
|
-
漏掉这一条会让 nav 与 content 并排抢宽度,分类列表被压成 0 宽(实测 options
|
|
1032
|
-
只剩 24px),是本方案最容易漏的关键一步。 */
|
|
1033
|
-
html[data-dshbr-drilldown="ready"] div[class*="__F_SETTINGS__panel"] {
|
|
1034
|
-
flex-direction: column !important;
|
|
1035
|
-
/* ✕ 要绝对定位到面板右上角,必须有定位祖先 */
|
|
1036
|
-
position: relative !important;
|
|
1037
|
-
}
|
|
1038
|
-
|
|
1039
|
-
/* 关闭按钮钉在面板右上角,与标题/返回行同处第一行 —— 这是弹窗的常规约定。
|
|
1040
|
-
之所以要绝对定位:宿主 DOM 里 ✕ 属于 content>header,而标题属于 nav,二者是
|
|
1041
|
-
两棵子树。此前靠 order:-1 把 content 提到 nav 之前,结果 ✕ 落在标题上面一行;
|
|
1042
|
-
详情页反过来,✕ 落到返回行下面一行。绝对定位是唯一能在不注入 DOM 的前提下
|
|
1043
|
-
把两者拉回同一行的办法。 */
|
|
1044
|
-
html[data-dshbr-drilldown="ready"] button[class*="__F_SETTINGS__close"] {
|
|
1045
|
-
position: absolute !important;
|
|
1046
|
-
/* 40×40 触控区(宿主原为 28px):配 top/right 4px 后中心落在 y=24,
|
|
1047
|
-
与标题文字中心(约 23)基本重合;右侧 4+40=44px 的占位仍在标题 52px 留白之内。 */
|
|
1048
|
-
top: 4px !important;
|
|
1049
|
-
right: 4px !important;
|
|
1050
|
-
width: 40px !important;
|
|
1051
|
-
height: 40px !important;
|
|
1052
|
-
z-index: 5 !important;
|
|
1053
|
-
}
|
|
1054
|
-
|
|
1055
|
-
/* 分类列表页:内容区只剩 header(宿主/第三方 action 槽),下沉为底部动作栏。
|
|
1056
|
-
不再用 order:-1 —— 标题回到 DOM 顺序的第一行,顺带让焦点顺序与视觉顺序一致。 */
|
|
1057
|
-
html[data-dshbr-drilldown="ready"] div[class*="__F_SETTINGS__panel"]:not([data-dshbr-settings-view="detail"]) > div[class*="__F_SETTINGS__content"] {
|
|
1058
|
-
flex: 0 0 auto !important;
|
|
1059
|
-
width: 100% !important;
|
|
1060
|
-
max-width: 100% !important;
|
|
1061
|
-
border-top: 1px solid var(--dsw-alias-border-l2, #e5e7eb) !important;
|
|
1062
|
-
}
|
|
1063
|
-
html[data-dshbr-drilldown="ready"] div[class*="__F_SETTINGS__panel"]:not([data-dshbr-settings-view="detail"]) div[class*="__F_SETTINGS__options"] {
|
|
1064
|
-
display: none !important;
|
|
1065
|
-
}
|
|
1066
|
-
html[data-dshbr-drilldown="ready"] div[class*="__F_SETTINGS__panel"]:not([data-dshbr-settings-view="detail"]) > nav[class*="__F_SETTINGS__nav"] {
|
|
1067
|
-
flex: 1 1 auto !important;
|
|
1068
|
-
min-height: 0 !important;
|
|
1069
|
-
overflow-y: auto !important;
|
|
1070
|
-
overscroll-behavior: contain !important;
|
|
1071
|
-
}
|
|
1072
|
-
|
|
1073
|
-
/* 详情页:折叠导航为「‹ 标题」一行,充当返回入口 */
|
|
1074
|
-
html[data-dshbr-drilldown="ready"] div[class*="__F_SETTINGS__panel"][data-dshbr-settings-view="detail"] div[class*="__F_SETTINGS__navList"] {
|
|
1075
|
-
display: none !important;
|
|
1076
|
-
}
|
|
1077
|
-
html[data-dshbr-drilldown="ready"] div[class*="__F_SETTINGS__panel"][data-dshbr-settings-view="detail"] > nav[class*="__F_SETTINGS__nav"] {
|
|
1078
|
-
flex: 0 0 auto !important;
|
|
1079
|
-
overflow: visible !important;
|
|
1080
|
-
cursor: pointer !important;
|
|
1081
|
-
}
|
|
1082
|
-
html[data-dshbr-drilldown="ready"] div[class*="__F_SETTINGS__panel"][data-dshbr-settings-view="detail"] > nav[class*="__F_SETTINGS__nav"]:active {
|
|
1083
|
-
background: var(--dsw-alias-interactive-bg-hover, rgba(0, 0, 0, 0.05)) !important;
|
|
1084
|
-
}
|
|
1085
|
-
/* 详情页也把动作栏沉到底部,与列表页保持一致。
|
|
1086
|
-
用 flex order 交换 header/options 的视觉位置:options 仍是那个 overflow:auto
|
|
1087
|
-
的滚动容器,滚动语义不变(不用 column-reverse,避免滚动原点翻转)。 */
|
|
1088
|
-
html[data-dshbr-drilldown="ready"] div[class*="__F_SETTINGS__panel"][data-dshbr-settings-view="detail"] div[class*="__F_SETTINGS__header"] {
|
|
1089
|
-
order: 2 !important;
|
|
1090
|
-
border-top: 1px solid var(--dsw-alias-border-l2, #e5e7eb) !important;
|
|
1091
|
-
}
|
|
1092
|
-
html[data-dshbr-drilldown="ready"] div[class*="__F_SETTINGS__panel"][data-dshbr-settings-view="detail"] div[class*="__F_SETTINGS__options"] {
|
|
1093
|
-
order: 1 !important;
|
|
1094
|
-
}
|
|
1095
|
-
|
|
1096
|
-
/* 轨道在窄屏改成整宽列表容器 */
|
|
1097
|
-
html[data-dshbr-drilldown="ready"] nav[class*="__F_SETTINGS__nav"] {
|
|
1098
|
-
width: 100% !important;
|
|
1099
|
-
min-width: 0 !important;
|
|
1100
|
-
max-width: 100% !important;
|
|
1101
|
-
padding: 10px 12px 12px !important;
|
|
1102
|
-
gap: 4px !important;
|
|
1103
|
-
border-right: none !important;
|
|
1104
|
-
border-bottom: none !important;
|
|
1105
|
-
}
|
|
1106
|
-
html[data-dshbr-drilldown="ready"] div[class*="__F_SETTINGS__navTitle"] {
|
|
1107
|
-
font-size: 17px !important;
|
|
1108
|
-
line-height: 1.3 !important;
|
|
1109
|
-
/* 不可折行的超长 token(无空格长串)会整块溢出、把文字顶到 ✕ 下面。
|
|
1110
|
-
独立验收实测 81 字符无空格标题时文字右端 823px、与 ✕ 交叠 707px²。
|
|
1111
|
-
overflow-wrap: anywhere 让这种 token 也能断行 —— 留白只管盒内,管不住溢出。 */
|
|
1112
|
-
overflow-wrap: anywhere !important;
|
|
1113
|
-
/* 右侧 52px 给绝对定位的 ✕ 让位(紧邻规则里的声明会被后置同名规则覆盖,
|
|
1114
|
-
所以留白必须写在这一条上,不能只写在前面那条) */
|
|
1115
|
-
padding: 0 52px 4px 4px !important;
|
|
1116
|
-
}
|
|
1117
|
-
html[data-dshbr-drilldown="ready"] div[class*="__F_SETTINGS__navList"] {
|
|
1118
|
-
flex-direction: column !important;
|
|
1119
|
-
gap: 2px !important;
|
|
1120
|
-
width: 100% !important;
|
|
1121
|
-
min-width: 0 !important;
|
|
1122
|
-
}
|
|
1123
|
-
|
|
1124
|
-
/* 列表行:图标左、文字右、行尾 › 指示 */
|
|
1125
|
-
html[data-dshbr-drilldown="ready"] nav[class*="__F_SETTINGS__nav"] button[class*="__F_SETTINGS__navCell"],
|
|
1126
|
-
html[data-dshbr-drilldown="ready"] button[class*="__F_SETTINGS__navCell"] {
|
|
1127
|
-
flex-direction: row !important;
|
|
1128
|
-
justify-content: flex-start !important;
|
|
1129
|
-
align-items: center !important;
|
|
1130
|
-
text-align: left !important;
|
|
1131
|
-
width: 100% !important;
|
|
1132
|
-
min-height: 52px !important;
|
|
1133
|
-
padding: 12px 14px !important;
|
|
1134
|
-
gap: 12px !important;
|
|
1135
|
-
border-radius: 12px !important;
|
|
1136
|
-
}
|
|
1137
|
-
html[data-dshbr-drilldown="ready"] nav[class*="__F_SETTINGS__nav"] button[class*="__F_SETTINGS__navCell"]::after {
|
|
1138
|
-
content: '' !important;
|
|
1139
|
-
width: 7px !important;
|
|
1140
|
-
height: 7px !important;
|
|
1141
|
-
margin-left: auto !important;
|
|
1142
|
-
flex: none !important;
|
|
1143
|
-
border-right: 1.7px solid var(--dsw-alias-label-tertiary, #9ca3af) !important;
|
|
1144
|
-
border-bottom: 1.7px solid var(--dsw-alias-label-tertiary, #9ca3af) !important;
|
|
1145
|
-
transform: rotate(-45deg) !important;
|
|
1146
|
-
}
|
|
1147
|
-
html[data-dshbr-drilldown="ready"] nav[class*="__F_SETTINGS__nav"] button[class*="__F_SETTINGS__navCell"] svg {
|
|
1148
|
-
width: 20px !important;
|
|
1149
|
-
height: 20px !important;
|
|
1150
|
-
}
|
|
1151
|
-
html[data-dshbr-drilldown="ready"] span[class*="__F_SETTINGS__navLabel"] {
|
|
1152
|
-
font-size: 15px !important;
|
|
1153
|
-
line-height: 1.35 !important;
|
|
1154
|
-
white-space: normal !important;
|
|
1155
|
-
word-break: normal !important;
|
|
1156
|
-
text-align: left !important;
|
|
1157
|
-
flex: 0 1 auto !important;
|
|
1158
|
-
}
|
|
1159
|
-
|
|
1160
|
-
/* 详情页返回行:‹ 箭头 + 标题 */
|
|
1161
|
-
/* 详情页返回行:‹ 箭头 + 标题。右侧同样要留 52px 给 ✕ ——
|
|
1162
|
-
本条比基类多一个属性选择器、特异性更高,会**整体覆盖**基类的 padding,
|
|
1163
|
-
所以留白必须在这里再写一遍(漏写时基类的 52px 会被这条的 4px 顶掉,
|
|
1164
|
-
长标题会钻到 ✕ 下面;独立验收实测注入 61 字符标题后交叠 608/707 px²)。 */
|
|
1165
|
-
html[data-dshbr-drilldown="ready"] div[class*="__F_SETTINGS__panel"][data-dshbr-settings-view="detail"] div[class*="__F_SETTINGS__navTitle"] {
|
|
1166
|
-
display: flex !important;
|
|
1167
|
-
align-items: center !important;
|
|
1168
|
-
overflow-wrap: anywhere !important;
|
|
1169
|
-
padding: 2px 52px 2px 4px !important;
|
|
1170
|
-
}
|
|
1171
|
-
html[data-dshbr-drilldown="ready"] div[class*="__F_SETTINGS__panel"][data-dshbr-settings-view="detail"] div[class*="__F_SETTINGS__navTitle"]::before {
|
|
1172
|
-
content: '' !important;
|
|
1173
|
-
width: 8px !important;
|
|
1174
|
-
height: 8px !important;
|
|
1175
|
-
margin: 0 10px 0 6px !important;
|
|
1176
|
-
flex: none !important;
|
|
1177
|
-
border-left: 2px solid var(--dsw-alias-label-primary, #111827) !important;
|
|
1178
|
-
border-bottom: 2px solid var(--dsw-alias-label-primary, #111827) !important;
|
|
1179
|
-
transform: rotate(45deg) !important;
|
|
1180
|
-
}
|
|
1181
|
-
|
|
1182
|
-
/* content/header 必须是 static —— ✕ 是绝对定位的,它的包含块取决于最近的**定位祖先**。
|
|
1183
|
-
本来这个祖先就是 panel(宿主自带 position:relative);但一旦 content 或 header 被
|
|
1184
|
-
任何来源(本块、宿主其它规则、第三方插件)设成 relative/absolute,包含块就会下移,
|
|
1185
|
-
✕ 会从面板右上角跑到内容区里去。独立验收实测:给 content 加 position:relative 后
|
|
1186
|
-
✕ 的 relTop 由 9 变成 579、并与底部动作栏重叠 837 px²。 */
|
|
1187
|
-
html[data-dshbr-drilldown="ready"] div[class*="__F_SETTINGS__content"] {
|
|
1188
|
-
position: static !important;
|
|
1189
|
-
width: 100% !important;
|
|
1190
|
-
max-width: 100% !important;
|
|
1191
|
-
flex: 1 1 auto !important;
|
|
1192
|
-
}
|
|
1193
|
-
/* header 不再当顶栏用:它现在只承载 action 槽,高度随内容(可能是宿主的一个
|
|
1194
|
-
按钮,也可能是多个插件注入的多行按钮),靠 flex 自然撑开,不设固定高度。 */
|
|
1195
|
-
html[data-dshbr-drilldown="ready"] div[class*="__F_SETTINGS__header"] {
|
|
1196
|
-
position: static !important;
|
|
1197
|
-
height: auto !important;
|
|
1198
|
-
padding: 8px 10px !important;
|
|
1199
|
-
align-items: center !important;
|
|
1200
|
-
justify-content: flex-end !important;
|
|
1201
|
-
}
|
|
1202
|
-
html[data-dshbr-drilldown="ready"] div[class*="__F_SETTINGS__options"] {
|
|
1203
|
-
padding: 0 12px 16px !important;
|
|
1204
|
-
}
|
|
1205
|
-
}
|
|
1206
|
-
|
|
1207
|
-
/* 远程工作区选择弹窗移动端/桌面端自适应样式 */
|
|
1208
|
-
#dsh-remote-workspace-modal {
|
|
1209
|
-
position: fixed !important;
|
|
1210
|
-
inset: 0 !important;
|
|
1211
|
-
z-index: 100000 !important;
|
|
1212
|
-
background: rgba(0, 0, 0, 0.65) !important;
|
|
1213
|
-
backdrop-filter: blur(5px) !important;
|
|
1214
|
-
display: flex !important;
|
|
1215
|
-
align-items: center !important;
|
|
1216
|
-
justify-content: center !important;
|
|
1217
|
-
padding: 16px !important;
|
|
1218
|
-
box-sizing: border-box !important;
|
|
1219
|
-
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif !important;
|
|
1220
|
-
color: var(--dsw-alias-label-primary, #111827) !important;
|
|
1221
|
-
}
|
|
1222
|
-
|
|
1223
|
-
.dsh-ws-dialog-card {
|
|
1224
|
-
background: var(--dsw-alias-bg-layer-1, #ffffff) !important;
|
|
1225
|
-
border: 1px solid var(--dsw-alias-border-l1, #e5e7eb) !important;
|
|
1226
|
-
border-radius: 16px !important;
|
|
1227
|
-
width: 100% !important;
|
|
1228
|
-
max-width: 620px !important;
|
|
1229
|
-
max-height: 88vh !important;
|
|
1230
|
-
display: flex !important;
|
|
1231
|
-
flex-direction: column !important;
|
|
1232
|
-
box-shadow: 0 25px 35px -5px rgba(0,0,0,0.3), 0 12px 16px -5px rgba(0,0,0,0.2) !important;
|
|
1233
|
-
overflow: hidden !important;
|
|
1234
|
-
animation: dshModalFadeIn 0.2s ease-out !important;
|
|
1235
|
-
}
|
|
1236
|
-
|
|
1237
|
-
.dsh-ws-chips-scroll {
|
|
1238
|
-
display: flex !important;
|
|
1239
|
-
align-items: center !important;
|
|
1240
|
-
gap: 6px !important;
|
|
1241
|
-
overflow-x: auto !important;
|
|
1242
|
-
white-space: nowrap !important;
|
|
1243
|
-
scrollbar-width: none !important;
|
|
1244
|
-
-ms-overflow-style: none !important;
|
|
1245
|
-
-webkit-overflow-scrolling: touch !important;
|
|
1246
|
-
padding: 2px 0 !important;
|
|
1247
|
-
}
|
|
1248
|
-
.dsh-ws-chips-scroll::-webkit-scrollbar {
|
|
1249
|
-
display: none !important;
|
|
1250
|
-
}
|
|
1251
|
-
|
|
1252
|
-
@media (max-width: 640px) {
|
|
1253
|
-
#dsh-remote-workspace-modal {
|
|
1254
|
-
align-items: flex-end !important;
|
|
1255
|
-
padding: 0 !important;
|
|
1256
|
-
}
|
|
1257
|
-
|
|
1258
|
-
.dsh-ws-dialog-card {
|
|
1259
|
-
max-height: 92dvh !important;
|
|
1260
|
-
height: 92dvh !important;
|
|
1261
|
-
border-bottom-left-radius: 0 !important;
|
|
1262
|
-
border-bottom-right-radius: 0 !important;
|
|
1263
|
-
border-left: none !important;
|
|
1264
|
-
border-right: none !important;
|
|
1265
|
-
border-bottom: none !important;
|
|
1266
|
-
max-width: 100vw !important;
|
|
1267
|
-
width: 100vw !important;
|
|
1268
|
-
margin: 0 !important;
|
|
1269
|
-
animation: dshBottomSheetUp 0.25s cubic-bezier(0.16, 1, 0.3, 1) !important;
|
|
1270
|
-
}
|
|
1271
|
-
|
|
1272
|
-
.dsh-ws-drag-handle {
|
|
1273
|
-
display: block !important;
|
|
1274
|
-
}
|
|
1275
|
-
}
|
|
1276
|
-
|
|
1277
|
-
@keyframes dshModalFadeIn {
|
|
1278
|
-
from { opacity: 0; transform: scale(0.96); }
|
|
1279
|
-
to { opacity: 1; transform: scale(1); }
|
|
1280
|
-
}
|
|
1281
|
-
|
|
1282
|
-
@keyframes dshBottomSheetUp {
|
|
1283
|
-
from { transform: translateY(100%); }
|
|
1284
|
-
to { transform: translateY(0); }
|
|
1285
|
-
}
|
|
1286
|
-
|
|
1287
|
-
/* 深色模式适配已迁移到 client/theme-tokens.js 并改为**无条件注入**:
|
|
1288
|
-
原来这两块在这里,而 injectMobileStyles() 会在 __TAURI__ / __DSH_DESKTOP__ /
|
|
1289
|
-
外部响应式插件存在时直接 return,导致桌面端 Shell 下深色补丁从未生效。
|
|
1290
|
-
这里不再重复定义,避免两处版本漂移。 */
|
|
1291
|
-
|
|
1292
|
-
@media (min-width: 768px) {
|
|
1293
|
-
.dsh-mobile-app-header,
|
|
1294
|
-
.dsh-mobile-backdrop,
|
|
1295
|
-
.dsh-mobile-panel-close-btn {
|
|
1296
|
-
display: none !important;
|
|
1297
|
-
}
|
|
1298
|
-
}
|
|
1299
|
-
`;
|