@co0ontty/wand 1.31.3 → 1.32.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/dist/auth.d.ts +20 -0
- package/dist/auth.js +31 -0
- package/dist/cert.d.ts +17 -2
- package/dist/cert.js +124 -68
- package/dist/config.js +12 -0
- package/dist/server.js +60 -51
- package/dist/tui/commands.js +51 -5
- package/dist/types.d.ts +9 -0
- package/dist/web-ui/content/scripts.js +348 -343
- package/dist/web-ui/content/styles.css +339 -401
- package/dist/ws-broadcast.d.ts +2 -2
- package/dist/ws-broadcast.js +5 -10
- package/package.json +1 -1
|
@@ -515,33 +515,15 @@
|
|
|
515
515
|
transition: width 0.3s var(--ease-out-expo), transform 0.35s var(--ease-out-expo), box-shadow 0.35s ease, opacity 0.25s ease;
|
|
516
516
|
}
|
|
517
517
|
|
|
518
|
-
/*
|
|
518
|
+
/* 窄条(collapsed)状态:不显示 X 关闭按钮。
|
|
519
|
+
窄条只保留「展开」按钮,关闭操作必须先回到全尺寸。
|
|
520
|
+
多塞一层 .sidebar-header-actions 把 specificity 抬到 0,4,0,
|
|
519
521
|
压过文件后段 .sidebar-header-actions .btn-ghost.btn-sm
|
|
520
522
|
与 .drawer-close-btn 的 display: inline-flex 重置规则。 */
|
|
521
|
-
.sidebar.pinned .sidebar-header-actions .sidebar-close {
|
|
522
|
-
display: none;
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
/* 窄条(collapsed)状态:明确不显示 X 关闭按钮。
|
|
526
|
-
虽然 collapsed 当前必然蕴含 pinned(见 isSidebarNarrow),
|
|
527
|
-
上一条 .sidebar.pinned 规则已经能把它藏住,但单独写一条更直观,
|
|
528
|
-
也防止以后允许 drawer 模式下 collapse 时漏掉。
|
|
529
|
-
展开(drawer 模式)下才显示关闭按钮供用户收起侧栏。 */
|
|
530
523
|
.sidebar.collapsed .sidebar-header-actions .sidebar-close {
|
|
531
524
|
display: none;
|
|
532
525
|
}
|
|
533
526
|
|
|
534
|
-
/* 与上方对称:drawer 模式(未 pin)下,X 关闭按钮已能把侧栏关掉,
|
|
535
|
-
再放一个「收起为窄条」按钮会和 X 视觉上重复,且它的行为
|
|
536
|
-
(自动 pin + collapse)也容易让人误以为是关闭。
|
|
537
|
-
只在 pinned 模式保留这颗,drawer 模式下隐藏。
|
|
538
|
-
注意:必须用 .sidebar-header-actions 多嵌一层把 specificity 提到 0,4,0,
|
|
539
|
-
否则会和文件后段 .sidebar-header-actions .btn-ghost.btn-sm (0,3,0) 打平
|
|
540
|
-
而因后定义胜出,导致 drawer 模式下窄条按钮和 X 同时显示。 */
|
|
541
|
-
.sidebar:not(.pinned) .sidebar-header-actions .sidebar-collapse-toggle {
|
|
542
|
-
display: none;
|
|
543
|
-
}
|
|
544
|
-
|
|
545
527
|
/* ===== 侧栏窄条模式(仅 desktop pin 模式生效)===== */
|
|
546
528
|
.sidebar.pinned.collapsed {
|
|
547
529
|
width: var(--sidebar-collapsed-width);
|
|
@@ -553,7 +535,6 @@
|
|
|
553
535
|
}
|
|
554
536
|
.sidebar.pinned.collapsed .sidebar-header-main,
|
|
555
537
|
.sidebar.pinned.collapsed .sidebar-header-more,
|
|
556
|
-
.sidebar.pinned.collapsed .sidebar-pin-toggle,
|
|
557
538
|
.sidebar.pinned.collapsed .sidebar-footer {
|
|
558
539
|
display: none;
|
|
559
540
|
}
|
|
@@ -700,15 +681,6 @@
|
|
|
700
681
|
.sidebar-collapse-toggle.collapsed {
|
|
701
682
|
color: var(--primary);
|
|
702
683
|
}
|
|
703
|
-
/* ===== 图钉按钮 ===== */
|
|
704
|
-
.sidebar-pin-toggle {
|
|
705
|
-
flex-shrink: 0;
|
|
706
|
-
transition: transform 0.3s var(--ease-out-expo), color var(--transition-fast);
|
|
707
|
-
}
|
|
708
|
-
.sidebar-pin-toggle.pinned {
|
|
709
|
-
color: var(--primary);
|
|
710
|
-
transform: rotate(45deg);
|
|
711
|
-
}
|
|
712
684
|
|
|
713
685
|
/* ===== 侧边栏头部 ===== */
|
|
714
686
|
.sidebar-header {
|
|
@@ -2617,6 +2589,11 @@
|
|
|
2617
2589
|
flex: 1;
|
|
2618
2590
|
display: flex;
|
|
2619
2591
|
flex-direction: column;
|
|
2592
|
+
/* min-width: 0 是关键:作为 .main-layout(flex row)的子项,默认
|
|
2593
|
+
min-width:auto 会让 main-content 跟着内部最宽的不可断节点一起撑大,
|
|
2594
|
+
窄屏上结果就是 chat 卡片把布局推宽 → 内容被 overflow:hidden 截掉
|
|
2595
|
+
却又拖不动。这里强制可收缩,配合下游 .chat-* 的 break-word 才有效。 */
|
|
2596
|
+
min-width: 0;
|
|
2620
2597
|
min-height: 0;
|
|
2621
2598
|
overflow: hidden;
|
|
2622
2599
|
background: transparent;
|
|
@@ -3846,6 +3823,7 @@
|
|
|
3846
3823
|
横向溢出都不应该冒到聊天容器,由它们各自的内部滚动负责。 */
|
|
3847
3824
|
.chat-messages {
|
|
3848
3825
|
flex: 1;
|
|
3826
|
+
min-width: 0;
|
|
3849
3827
|
overflow-y: auto;
|
|
3850
3828
|
overflow-x: hidden;
|
|
3851
3829
|
display: flex;
|
|
@@ -4061,14 +4039,21 @@
|
|
|
4061
4039
|
color: var(--text-tertiary);
|
|
4062
4040
|
}
|
|
4063
4041
|
|
|
4064
|
-
/* ===== 消息气泡 =====
|
|
4042
|
+
/* ===== 消息气泡 =====
|
|
4043
|
+
兜底约束:气泡不应超出聊天容器宽度。即便子节点(长 URL、不可断字符串、
|
|
4044
|
+
嵌入元素)想撑宽,也由 max-width / overflow-x 截断或换行。 */
|
|
4065
4045
|
.chat-message-bubble {
|
|
4066
4046
|
padding: 12px 16px;
|
|
4067
4047
|
border-radius: var(--radius-md);
|
|
4068
4048
|
font-size: 0.875rem;
|
|
4069
4049
|
line-height: var(--line-height-relaxed);
|
|
4070
4050
|
word-wrap: break-word;
|
|
4051
|
+
overflow-wrap: anywhere;
|
|
4052
|
+
word-break: break-word;
|
|
4071
4053
|
white-space: pre-wrap;
|
|
4054
|
+
max-width: 100%;
|
|
4055
|
+
min-width: 0;
|
|
4056
|
+
overflow-x: hidden;
|
|
4072
4057
|
box-shadow: var(--shadow-sm);
|
|
4073
4058
|
transition: box-shadow var(--transition-fast);
|
|
4074
4059
|
}
|
|
@@ -4122,13 +4107,20 @@
|
|
|
4122
4107
|
display: flex;
|
|
4123
4108
|
flex-direction: column;
|
|
4124
4109
|
gap: 2px;
|
|
4110
|
+
width: 100%;
|
|
4125
4111
|
max-width: 100%;
|
|
4126
4112
|
min-width: 0;
|
|
4113
|
+
/* overflow-x: hidden 兜底——内部 tool-use-card / inline-terminal /
|
|
4114
|
+
markdown 如果还有不可断超长 token,绝不让它把整张消息推宽。
|
|
4115
|
+
结合 word-break + overflow-wrap,用户看到的永远是换行不是横滚条。 */
|
|
4116
|
+
overflow-x: hidden;
|
|
4127
4117
|
font-size: 0.875rem;
|
|
4128
4118
|
line-height: var(--line-height-relaxed);
|
|
4129
4119
|
word-wrap: break-word;
|
|
4120
|
+
word-break: break-word;
|
|
4130
4121
|
overflow-wrap: anywhere;
|
|
4131
4122
|
color: var(--text-primary);
|
|
4123
|
+
box-sizing: border-box;
|
|
4132
4124
|
}
|
|
4133
4125
|
|
|
4134
4126
|
.chat-message-content > .thinking-inline,
|
|
@@ -4147,7 +4139,10 @@
|
|
|
4147
4139
|
display: flex;
|
|
4148
4140
|
flex-direction: column;
|
|
4149
4141
|
gap: 6px;
|
|
4142
|
+
width: 100%;
|
|
4150
4143
|
max-width: 100%;
|
|
4144
|
+
min-width: 0;
|
|
4145
|
+
box-sizing: border-box;
|
|
4151
4146
|
}
|
|
4152
4147
|
/* user turn 默认 align-self: flex-end(右对齐);多段渲染时强制
|
|
4153
4148
|
容器内左对齐,否则 subagent 段会被推到右边,border-left 色条断裂。 */
|
|
@@ -4159,12 +4154,22 @@
|
|
|
4159
4154
|
display: flex;
|
|
4160
4155
|
flex-direction: column;
|
|
4161
4156
|
align-self: flex-start;
|
|
4157
|
+
width: 100%;
|
|
4158
|
+
max-width: 100%;
|
|
4159
|
+
min-width: 0;
|
|
4160
|
+
box-sizing: border-box;
|
|
4162
4161
|
}
|
|
4163
4162
|
.chat-message.multi-agent .chat-message-segment.subagent {
|
|
4164
4163
|
padding-left: 10px;
|
|
4165
4164
|
margin-left: 6px;
|
|
4166
4165
|
border-left: 2px solid var(--agent-color, var(--border-subtle));
|
|
4167
4166
|
border-radius: 0 4px 4px 0;
|
|
4167
|
+
/* 父 .chat-message-segment 是 width:100%; box-sizing:border-box,padding
|
|
4168
|
+
和 border 已被 border-box 吃掉,但 margin-left:6px 是外间距,会把
|
|
4169
|
+
整段推出父容器 6px 撞屏幕右边。这里把宽度从父宽减掉同等 margin,
|
|
4170
|
+
视觉上左缘内缩 6px、右缘对齐父容器,刚好不溢出。 */
|
|
4171
|
+
width: calc(100% - 6px);
|
|
4172
|
+
max-width: calc(100% - 6px);
|
|
4168
4173
|
}
|
|
4169
4174
|
.chat-message.multi-agent .chat-message-segment.subagent .chat-message-content {
|
|
4170
4175
|
/* 子 agent 段内的气泡稍微弱化背景,区分主线 */
|
|
@@ -4178,13 +4183,19 @@
|
|
|
4178
4183
|
color: var(--agent-color, var(--accent));
|
|
4179
4184
|
}
|
|
4180
4185
|
|
|
4181
|
-
/* "勤劳初二 ↳ 让 侦探猫 帮忙" 分隔提示
|
|
4186
|
+
/* "勤劳初二 ↳ 让 侦探猫 帮忙" 分隔提示
|
|
4187
|
+
注:color-mix() 需要 Chrome/WebView 111+(2023.04)。Android APK 上常有更老
|
|
4188
|
+
的 WebView,会把 color-mix(...) 当作 invalid 整条扔掉,导致背景/边框消失。
|
|
4189
|
+
下面凡是 color-mix 的属性都先写一条 rgba()/纯色 fallback,再被 color-mix
|
|
4190
|
+
覆盖;旧浏览器看到 fallback、新浏览器自动用 color-mix。同一文件里下方
|
|
4191
|
+
.chat-handoff-tag / .subagent-reply / .subagent-reply-cycle 等也是同思路。 */
|
|
4182
4192
|
.chat-handoff {
|
|
4183
4193
|
align-self: flex-start;
|
|
4184
4194
|
margin: 4px 0 2px 4px;
|
|
4185
4195
|
padding: 2px 10px;
|
|
4186
4196
|
font-size: 0.7rem;
|
|
4187
4197
|
color: var(--text-tertiary);
|
|
4198
|
+
background: rgba(197, 101, 61, 0.08);
|
|
4188
4199
|
background: color-mix(in srgb, var(--agent-color, var(--accent)) 8%, transparent);
|
|
4189
4200
|
border-left: 2px solid var(--agent-color, var(--accent));
|
|
4190
4201
|
border-radius: 0 8px 8px 0;
|
|
@@ -4215,7 +4226,9 @@
|
|
|
4215
4226
|
letter-spacing: 0.04em;
|
|
4216
4227
|
text-transform: uppercase;
|
|
4217
4228
|
color: var(--agent-color, var(--accent));
|
|
4229
|
+
background: rgba(197, 101, 61, 0.14);
|
|
4218
4230
|
background: color-mix(in srgb, var(--agent-color, var(--accent)) 14%, transparent);
|
|
4231
|
+
border: 1px solid rgba(197, 101, 61, 0.32);
|
|
4219
4232
|
border: 1px solid color-mix(in srgb, var(--agent-color, var(--accent)) 32%, transparent);
|
|
4220
4233
|
border-radius: 4px;
|
|
4221
4234
|
vertical-align: 1px;
|
|
@@ -4225,7 +4238,9 @@
|
|
|
4225
4238
|
|
|
4226
4239
|
/* subagent 回复气泡(群聊角色完成任务后的发言) */
|
|
4227
4240
|
.subagent-reply {
|
|
4241
|
+
background: rgba(197, 101, 61, 0.06);
|
|
4228
4242
|
background: color-mix(in srgb, var(--agent-color, var(--accent)) 6%, var(--bg-surface));
|
|
4243
|
+
border: 1px solid rgba(197, 101, 61, 0.20);
|
|
4229
4244
|
border: 1px solid color-mix(in srgb, var(--agent-color, var(--accent)) 20%, transparent);
|
|
4230
4245
|
border-radius: 10px;
|
|
4231
4246
|
padding: 10px 14px;
|
|
@@ -4235,6 +4250,10 @@
|
|
|
4235
4250
|
color: var(--text-primary);
|
|
4236
4251
|
word-break: break-word;
|
|
4237
4252
|
overflow-wrap: anywhere;
|
|
4253
|
+
/* box-sizing: border-box 让 padding(14px*2)+border(1px*2) 算进 width:100%,
|
|
4254
|
+
不再外鼓 30px 撑出 subagent 段右边缘。 */
|
|
4255
|
+
box-sizing: border-box;
|
|
4256
|
+
width: 100%;
|
|
4238
4257
|
max-width: 100%;
|
|
4239
4258
|
min-width: 0;
|
|
4240
4259
|
overflow-x: hidden;
|
|
@@ -4244,7 +4263,9 @@
|
|
|
4244
4263
|
.subagent-reply > :last-child { margin-bottom: 0; }
|
|
4245
4264
|
|
|
4246
4265
|
.subagent-reply.error {
|
|
4266
|
+
background: rgba(226, 87, 76, 0.08);
|
|
4247
4267
|
background: color-mix(in srgb, var(--danger, #e2574c) 8%, var(--bg-surface));
|
|
4268
|
+
border-color: rgba(226, 87, 76, 0.35);
|
|
4248
4269
|
border-color: color-mix(in srgb, var(--danger, #e2574c) 35%, transparent);
|
|
4249
4270
|
}
|
|
4250
4271
|
|
|
@@ -4335,8 +4356,11 @@
|
|
|
4335
4356
|
font-size: 0.7rem;
|
|
4336
4357
|
font-weight: 500;
|
|
4337
4358
|
line-height: 1.4;
|
|
4359
|
+
color: var(--accent);
|
|
4338
4360
|
color: var(--agent-color, var(--accent));
|
|
4361
|
+
background: rgba(255, 248, 240, 0.95);
|
|
4339
4362
|
background: color-mix(in srgb, var(--agent-color, var(--accent)) 8%, var(--bg-surface, #fff));
|
|
4363
|
+
border: 1px solid rgba(197, 101, 61, 0.28);
|
|
4340
4364
|
border: 1px solid color-mix(in srgb, var(--agent-color, var(--accent)) 28%, transparent);
|
|
4341
4365
|
border-radius: 999px;
|
|
4342
4366
|
cursor: pointer;
|
|
@@ -4344,7 +4368,9 @@
|
|
|
4344
4368
|
transition: background 0.15s ease, transform 0.1s ease, border-color 0.15s ease;
|
|
4345
4369
|
}
|
|
4346
4370
|
.subagent-reply-cycle:hover {
|
|
4371
|
+
background: rgba(248, 226, 210, 1);
|
|
4347
4372
|
background: color-mix(in srgb, var(--agent-color, var(--accent)) 16%, var(--bg-surface, #fff));
|
|
4373
|
+
border-color: rgba(197, 101, 61, 0.45);
|
|
4348
4374
|
border-color: color-mix(in srgb, var(--agent-color, var(--accent)) 45%, transparent);
|
|
4349
4375
|
}
|
|
4350
4376
|
.subagent-reply-cycle:active {
|
|
@@ -4361,6 +4387,7 @@
|
|
|
4361
4387
|
height: 6px;
|
|
4362
4388
|
}
|
|
4363
4389
|
.subagent-reply-scroll::-webkit-scrollbar-thumb {
|
|
4390
|
+
background: rgba(197, 101, 61, 0.35);
|
|
4364
4391
|
background: color-mix(in srgb, var(--agent-color, var(--accent)) 35%, transparent);
|
|
4365
4392
|
border-radius: 3px;
|
|
4366
4393
|
}
|
|
@@ -4441,10 +4468,15 @@
|
|
|
4441
4468
|
font-size: 0.7rem;
|
|
4442
4469
|
color: var(--text-secondary);
|
|
4443
4470
|
white-space: pre-wrap;
|
|
4471
|
+
overflow-wrap: anywhere;
|
|
4444
4472
|
word-break: break-all;
|
|
4445
4473
|
max-height: 240px;
|
|
4474
|
+
max-width: 100%;
|
|
4475
|
+
min-width: 0;
|
|
4476
|
+
overflow-x: hidden;
|
|
4446
4477
|
overflow-y: auto;
|
|
4447
4478
|
border-top: 1px dashed var(--border-subtle);
|
|
4479
|
+
box-sizing: border-box;
|
|
4448
4480
|
}
|
|
4449
4481
|
.unknown-block.collapsed .unknown-block-body {
|
|
4450
4482
|
display: none;
|
|
@@ -4600,6 +4632,9 @@
|
|
|
4600
4632
|
overflow: hidden;
|
|
4601
4633
|
width: 100%;
|
|
4602
4634
|
max-width: var(--chat-card-max-width, 720px);
|
|
4635
|
+
/* min-width: 0 让卡片不被内部 <pre>/长路径撑出父容器;缺这一行时
|
|
4636
|
+
手机 APK 上长命令 / 长 JSON 会把整张卡片推宽到屏幕外被截掉。 */
|
|
4637
|
+
min-width: 0;
|
|
4603
4638
|
box-sizing: border-box;
|
|
4604
4639
|
background: linear-gradient(180deg, rgba(255, 251, 245, 0.88) 0%, rgba(255, 246, 234, 0.72) 100%);
|
|
4605
4640
|
box-shadow: 0 1px 2px rgba(89, 58, 32, 0.04);
|
|
@@ -4779,8 +4814,12 @@
|
|
|
4779
4814
|
font-family: var(--font-mono);
|
|
4780
4815
|
color: var(--text-secondary);
|
|
4781
4816
|
white-space: pre-wrap;
|
|
4782
|
-
overflow-wrap:
|
|
4817
|
+
overflow-wrap: anywhere;
|
|
4818
|
+
word-break: break-word;
|
|
4783
4819
|
max-height: 400px;
|
|
4820
|
+
max-width: 100%;
|
|
4821
|
+
min-width: 0;
|
|
4822
|
+
overflow-x: hidden;
|
|
4784
4823
|
overflow-y: auto;
|
|
4785
4824
|
line-height: 1.55;
|
|
4786
4825
|
}
|
|
@@ -4795,13 +4834,20 @@
|
|
|
4795
4834
|
font-family: var(--font-mono);
|
|
4796
4835
|
color: var(--text-secondary);
|
|
4797
4836
|
white-space: pre-wrap;
|
|
4798
|
-
|
|
4837
|
+
/* anywhere + break-all 兜底长 token / 长路径 / 长 URL:手机 APK 上
|
|
4838
|
+
遇到不可断字符串时换行,绝不横向溢出。 */
|
|
4839
|
+
overflow-wrap: anywhere;
|
|
4840
|
+
word-break: break-all;
|
|
4799
4841
|
max-height: 320px;
|
|
4842
|
+
max-width: 100%;
|
|
4843
|
+
min-width: 0;
|
|
4844
|
+
overflow-x: hidden;
|
|
4800
4845
|
overflow-y: auto;
|
|
4801
4846
|
line-height: 1.55;
|
|
4802
4847
|
background: rgba(125, 91, 57, 0.035);
|
|
4803
4848
|
border-radius: var(--radius-xs);
|
|
4804
4849
|
padding: 8px 10px;
|
|
4850
|
+
box-sizing: border-box;
|
|
4805
4851
|
}
|
|
4806
4852
|
.tool-use-result-empty {
|
|
4807
4853
|
font-size: 0.75rem;
|
|
@@ -5045,7 +5091,8 @@
|
|
|
5045
5091
|
}
|
|
5046
5092
|
.thinking-inline.expanded .thinking-inline-preview {
|
|
5047
5093
|
white-space: pre-wrap;
|
|
5048
|
-
overflow-wrap:
|
|
5094
|
+
overflow-wrap: anywhere;
|
|
5095
|
+
word-break: break-word;
|
|
5049
5096
|
}
|
|
5050
5097
|
.thinking-inline-action {
|
|
5051
5098
|
flex-shrink: 0;
|
|
@@ -5119,6 +5166,8 @@
|
|
|
5119
5166
|
margin: 4px 0;
|
|
5120
5167
|
width: 100%;
|
|
5121
5168
|
max-width: var(--chat-card-max-width, 720px);
|
|
5169
|
+
/* 同 .tool-use-card:内部嵌套 inline-tool 长路径不能撑爆窄屏父容器。 */
|
|
5170
|
+
min-width: 0;
|
|
5122
5171
|
box-sizing: border-box;
|
|
5123
5172
|
border-radius: var(--radius-sm);
|
|
5124
5173
|
border: 1px solid var(--border-subtle);
|
|
@@ -5247,6 +5296,8 @@
|
|
|
5247
5296
|
margin: 1px 0;
|
|
5248
5297
|
width: 100%;
|
|
5249
5298
|
max-width: var(--chat-card-max-width, 720px);
|
|
5299
|
+
/* 同 .tool-use-card:长路径 / 长查询不能撑爆窄屏父容器。 */
|
|
5300
|
+
min-width: 0;
|
|
5250
5301
|
box-sizing: border-box;
|
|
5251
5302
|
border-radius: var(--radius-xs);
|
|
5252
5303
|
cursor: pointer;
|
|
@@ -5266,6 +5317,8 @@
|
|
|
5266
5317
|
font-family: var(--font-mono);
|
|
5267
5318
|
line-height: 1.45;
|
|
5268
5319
|
border-radius: var(--radius-xs);
|
|
5320
|
+
max-width: 100%;
|
|
5321
|
+
min-width: 0;
|
|
5269
5322
|
transition: background 0.16s ease, color 0.16s ease;
|
|
5270
5323
|
}
|
|
5271
5324
|
.inline-tool:hover .inline-tool-row {
|
|
@@ -5338,6 +5391,9 @@
|
|
|
5338
5391
|
padding: 10px 12px;
|
|
5339
5392
|
margin-top: 6px;
|
|
5340
5393
|
max-height: 320px;
|
|
5394
|
+
max-width: 100%;
|
|
5395
|
+
min-width: 0;
|
|
5396
|
+
overflow-x: hidden;
|
|
5341
5397
|
overflow-y: auto;
|
|
5342
5398
|
scrollbar-width: thin;
|
|
5343
5399
|
scrollbar-color: rgba(125, 91, 57, 0.2) transparent;
|
|
@@ -5358,7 +5414,10 @@
|
|
|
5358
5414
|
line-height: 1.55;
|
|
5359
5415
|
color: var(--text-secondary);
|
|
5360
5416
|
white-space: pre-wrap;
|
|
5417
|
+
overflow-wrap: anywhere;
|
|
5361
5418
|
word-break: break-all;
|
|
5419
|
+
max-width: 100%;
|
|
5420
|
+
min-width: 0;
|
|
5362
5421
|
margin: 0;
|
|
5363
5422
|
}
|
|
5364
5423
|
.inline-tool-error-inline {
|
|
@@ -5441,6 +5500,8 @@
|
|
|
5441
5500
|
margin: 4px 0;
|
|
5442
5501
|
width: 100%;
|
|
5443
5502
|
max-width: var(--chat-card-max-width, 720px);
|
|
5503
|
+
/* 同 .tool-use-card:长命令 / 长输出不能撑爆窄屏父容器。 */
|
|
5504
|
+
min-width: 0;
|
|
5444
5505
|
box-sizing: border-box;
|
|
5445
5506
|
border: 1px solid rgba(15, 12, 9, 0.6);
|
|
5446
5507
|
border-radius: var(--radius-sm);
|
|
@@ -5470,6 +5531,8 @@
|
|
|
5470
5531
|
cursor: pointer;
|
|
5471
5532
|
user-select: none;
|
|
5472
5533
|
position: relative;
|
|
5534
|
+
max-width: 100%;
|
|
5535
|
+
min-width: 0;
|
|
5473
5536
|
}
|
|
5474
5537
|
.term-header:hover {
|
|
5475
5538
|
background:
|
|
@@ -5549,7 +5612,10 @@
|
|
|
5549
5612
|
line-height: 1.55;
|
|
5550
5613
|
margin-bottom: 6px;
|
|
5551
5614
|
white-space: pre-wrap;
|
|
5615
|
+
overflow-wrap: anywhere;
|
|
5552
5616
|
word-break: break-all;
|
|
5617
|
+
max-width: 100%;
|
|
5618
|
+
min-width: 0;
|
|
5553
5619
|
}
|
|
5554
5620
|
.term-prompt {
|
|
5555
5621
|
color: #6ee09a;
|
|
@@ -5562,6 +5628,9 @@
|
|
|
5562
5628
|
padding-top: 8px;
|
|
5563
5629
|
border-top: 1px dashed rgba(255, 255, 255, 0.06);
|
|
5564
5630
|
max-height: 360px;
|
|
5631
|
+
max-width: 100%;
|
|
5632
|
+
min-width: 0;
|
|
5633
|
+
overflow-x: hidden;
|
|
5565
5634
|
overflow-y: auto;
|
|
5566
5635
|
scrollbar-width: thin;
|
|
5567
5636
|
scrollbar-color: rgba(255, 255, 255, 0.15) transparent;
|
|
@@ -5582,7 +5651,10 @@
|
|
|
5582
5651
|
color: #d4c2a3;
|
|
5583
5652
|
line-height: 1.55;
|
|
5584
5653
|
white-space: pre-wrap;
|
|
5654
|
+
overflow-wrap: anywhere;
|
|
5585
5655
|
word-break: break-all;
|
|
5656
|
+
max-width: 100%;
|
|
5657
|
+
min-width: 0;
|
|
5586
5658
|
}
|
|
5587
5659
|
.term-exit {
|
|
5588
5660
|
margin-top: 10px;
|
|
@@ -5604,6 +5676,8 @@
|
|
|
5604
5676
|
margin: 4px 0;
|
|
5605
5677
|
width: 100%;
|
|
5606
5678
|
max-width: var(--chat-card-max-width, 720px);
|
|
5679
|
+
/* 同 .tool-use-card:长路径 / 长 diff 不能撑爆窄屏父容器。 */
|
|
5680
|
+
min-width: 0;
|
|
5607
5681
|
box-sizing: border-box;
|
|
5608
5682
|
border: 1px solid var(--border-subtle);
|
|
5609
5683
|
border-radius: var(--radius-sm);
|
|
@@ -5625,6 +5699,8 @@
|
|
|
5625
5699
|
font-size: 0.8125rem;
|
|
5626
5700
|
cursor: pointer;
|
|
5627
5701
|
transition: background 0.18s ease;
|
|
5702
|
+
max-width: 100%;
|
|
5703
|
+
min-width: 0;
|
|
5628
5704
|
}
|
|
5629
5705
|
.diff-header:hover {
|
|
5630
5706
|
background: rgba(197, 101, 61, 0.04);
|
|
@@ -5700,11 +5776,15 @@
|
|
|
5700
5776
|
display: flex;
|
|
5701
5777
|
gap: 1px;
|
|
5702
5778
|
background: rgba(125, 91, 57, 0.08);
|
|
5779
|
+
max-width: 100%;
|
|
5780
|
+
min-width: 0;
|
|
5703
5781
|
}
|
|
5704
5782
|
.diff-col {
|
|
5705
|
-
flex: 1;
|
|
5783
|
+
flex: 1 1 0;
|
|
5706
5784
|
min-width: 0;
|
|
5785
|
+
max-width: 100%;
|
|
5707
5786
|
background: rgba(255, 253, 248, 0.85);
|
|
5787
|
+
overflow: hidden;
|
|
5708
5788
|
}
|
|
5709
5789
|
.diff-col-half {
|
|
5710
5790
|
flex: 1;
|
|
@@ -5730,7 +5810,12 @@
|
|
|
5730
5810
|
font-size: 0.75rem;
|
|
5731
5811
|
line-height: 1.55;
|
|
5732
5812
|
white-space: pre-wrap;
|
|
5813
|
+
/* 长 token / 长 URL 必须按字符断,否则不可断字符串会撑爆 .diff-col。 */
|
|
5814
|
+
overflow-wrap: anywhere;
|
|
5733
5815
|
word-break: break-all;
|
|
5816
|
+
max-width: 100%;
|
|
5817
|
+
min-width: 0;
|
|
5818
|
+
box-sizing: border-box;
|
|
5734
5819
|
}
|
|
5735
5820
|
.diff-add {
|
|
5736
5821
|
background: rgba(79, 122, 88, 0.08);
|
|
@@ -5820,12 +5905,20 @@
|
|
|
5820
5905
|
margin: 0;
|
|
5821
5906
|
font-size: 0.7rem;
|
|
5822
5907
|
max-height: 600px;
|
|
5908
|
+
max-width: 100%;
|
|
5909
|
+
min-width: 0;
|
|
5910
|
+
overflow-x: hidden;
|
|
5823
5911
|
overflow-y: auto;
|
|
5912
|
+
white-space: pre-wrap;
|
|
5913
|
+
overflow-wrap: anywhere;
|
|
5914
|
+
word-break: break-all;
|
|
5824
5915
|
}
|
|
5825
5916
|
.tool-result-content code {
|
|
5826
5917
|
font-family: var(--font-mono);
|
|
5827
5918
|
white-space: pre-wrap;
|
|
5919
|
+
overflow-wrap: anywhere;
|
|
5828
5920
|
word-break: break-all;
|
|
5921
|
+
max-width: 100%;
|
|
5829
5922
|
}
|
|
5830
5923
|
|
|
5831
5924
|
/* Markdown Content */
|
|
@@ -5901,8 +5994,14 @@
|
|
|
5901
5994
|
overflow-wrap: anywhere;
|
|
5902
5995
|
word-break: break-all;
|
|
5903
5996
|
}
|
|
5997
|
+
/* 表格容器:先让 table-layout:fixed 强制按 100% 收缩,单元格内
|
|
5998
|
+
overflow-wrap:anywhere 会负责换行;只有在内容真的塞不下(比如
|
|
5999
|
+
超长不可断字符串撑爆 fixed 布局)才退回横向滚动,这样大多数情况
|
|
6000
|
+
下用户看到的是换行而不是横滚条。 */
|
|
5904
6001
|
.markdown-content .md-table-wrap {
|
|
5905
6002
|
margin: 12px 0;
|
|
6003
|
+
max-width: 100%;
|
|
6004
|
+
min-width: 0;
|
|
5906
6005
|
overflow-x: auto;
|
|
5907
6006
|
border: 1px solid var(--border);
|
|
5908
6007
|
border-radius: var(--radius-sm);
|
|
@@ -6358,19 +6457,18 @@
|
|
|
6358
6457
|
}
|
|
6359
6458
|
|
|
6360
6459
|
/* ─────────────────────────────────────────────────────────────────────
|
|
6361
|
-
排队消息条(.queue-bar)—— 浮在
|
|
6362
|
-
|
|
6363
|
-
|
|
6364
|
-
|
|
6365
|
-
|
|
6366
|
-
|
|
6367
|
-
|
|
6368
|
-
展开时给 .queue-bar 加 .expanded class,CSS 控制 panel 显形 + chevron 翻转。
|
|
6460
|
+
排队消息条(.queue-bar)—— 浮在 "回复中" 状态条上方,垂直堆叠。
|
|
6461
|
+
交互参考 iOS 通讯录右侧字母选择条:
|
|
6462
|
+
· 默认只展开队首 chip(橙色完整气泡,显示编号 + 文本 + × 删除)
|
|
6463
|
+
· 其他 chip 收成一根小横杠(橙色细线,宽 32px 高 4px)
|
|
6464
|
+
· 鼠标悬到任一横杠 → 该条展开、原本展开的收回横杠
|
|
6465
|
+
· 悬停期间可按住任意位置上下拖拽换序,整条 chip 都是拖拽起手区
|
|
6466
|
+
末尾是独立的 ⚡ 立即按钮:中断当前回复,把队首作为新输入插队发出去。
|
|
6369
6467
|
───────────────────────────────────────────────────────────────────── */
|
|
6370
6468
|
.queue-bar-host {
|
|
6371
6469
|
display: flex;
|
|
6372
6470
|
justify-content: flex-end;
|
|
6373
|
-
padding:
|
|
6471
|
+
padding: 4px 8px 0;
|
|
6374
6472
|
position: relative;
|
|
6375
6473
|
z-index: 2;
|
|
6376
6474
|
pointer-events: none; /* host 自身不挡点击,bar 内子节点 auto */
|
|
@@ -6380,358 +6478,199 @@
|
|
|
6380
6478
|
.queue-bar {
|
|
6381
6479
|
pointer-events: auto;
|
|
6382
6480
|
position: relative;
|
|
6383
|
-
display:
|
|
6384
|
-
|
|
6385
|
-
|
|
6386
|
-
|
|
6387
|
-
max-width: calc(
|
|
6388
|
-
height: 38px;
|
|
6389
|
-
padding: 0;
|
|
6390
|
-
border-radius: 999px;
|
|
6391
|
-
background: linear-gradient(180deg, #fffaf2 0%, #f6ead8 100%);
|
|
6392
|
-
box-shadow:
|
|
6393
|
-
0 0 0 1.2px rgba(197, 101, 61, 0.42),
|
|
6394
|
-
inset 0 1px 0 rgba(255, 255, 255, 0.85),
|
|
6395
|
-
var(--shadow-sm);
|
|
6396
|
-
transition: box-shadow var(--transition-fast), transform var(--transition-fast);
|
|
6481
|
+
display: flex;
|
|
6482
|
+
flex-direction: column;
|
|
6483
|
+
align-items: flex-end;
|
|
6484
|
+
gap: 4px;
|
|
6485
|
+
max-width: min(360px, calc(100vw - 24px));
|
|
6397
6486
|
animation: queueBarEnter 220ms ease-out both;
|
|
6398
6487
|
}
|
|
6399
|
-
.queue-bar:hover {
|
|
6400
|
-
transform: translateY(-1px);
|
|
6401
|
-
box-shadow:
|
|
6402
|
-
0 0 0 1.2px rgba(197, 101, 61, 0.55),
|
|
6403
|
-
inset 0 1px 0 rgba(255, 255, 255, 0.9),
|
|
6404
|
-
var(--shadow-md);
|
|
6405
|
-
}
|
|
6406
|
-
.queue-bar.queue-bar-capacity {
|
|
6407
|
-
box-shadow:
|
|
6408
|
-
0 0 0 1.4px rgba(169, 106, 47, 0.6),
|
|
6409
|
-
inset 0 1px 0 rgba(255, 255, 255, 0.85),
|
|
6410
|
-
var(--shadow-sm);
|
|
6411
|
-
}
|
|
6412
|
-
.queue-bar.queue-bar-inflight {
|
|
6413
|
-
animation: queueBarEnter 220ms ease-out both, queuePulse 1.6s ease-in-out 220ms infinite;
|
|
6414
|
-
}
|
|
6415
6488
|
@keyframes queueBarEnter {
|
|
6416
|
-
from { opacity: 0; transform: translateY(4px) scale(0.
|
|
6489
|
+
from { opacity: 0; transform: translateY(4px) scale(0.96); }
|
|
6417
6490
|
to { opacity: 1; transform: translateY(0) scale(1); }
|
|
6418
6491
|
}
|
|
6419
6492
|
|
|
6420
|
-
.queue-bar-toggle {
|
|
6421
|
-
flex: 1 1 auto;
|
|
6422
|
-
min-width: 0;
|
|
6423
|
-
display: inline-flex;
|
|
6424
|
-
align-items: center;
|
|
6425
|
-
gap: 7px;
|
|
6426
|
-
padding: 0 10px 0 14px;
|
|
6427
|
-
border: none;
|
|
6428
|
-
background: transparent;
|
|
6429
|
-
cursor: pointer;
|
|
6430
|
-
font: inherit;
|
|
6431
|
-
color: var(--text-primary);
|
|
6432
|
-
border-radius: 999px 0 0 999px;
|
|
6433
|
-
text-align: left;
|
|
6434
|
-
}
|
|
6435
|
-
.queue-bar-toggle:focus-visible {
|
|
6436
|
-
outline: 2px solid var(--border-focus);
|
|
6437
|
-
outline-offset: -2px;
|
|
6438
|
-
}
|
|
6439
|
-
.queue-bar-dot {
|
|
6440
|
-
width: 8px;
|
|
6441
|
-
height: 8px;
|
|
6442
|
-
border-radius: 50%;
|
|
6443
|
-
background: var(--accent);
|
|
6444
|
-
flex-shrink: 0;
|
|
6445
|
-
box-shadow: 0 0 0 2px rgba(197, 101, 61, 0.18);
|
|
6446
|
-
}
|
|
6447
|
-
.queue-bar-dot.queue-bar-dot-pulse {
|
|
6448
|
-
animation: queueDotPulse 1.0s ease-in-out infinite;
|
|
6449
|
-
}
|
|
6450
|
-
.queue-bar-count {
|
|
6451
|
-
font-size: 0.75rem;
|
|
6452
|
-
font-weight: 600;
|
|
6453
|
-
color: var(--accent);
|
|
6454
|
-
letter-spacing: 0.02em;
|
|
6455
|
-
flex-shrink: 0;
|
|
6456
|
-
line-height: 1;
|
|
6457
|
-
}
|
|
6458
|
-
.queue-bar-sep {
|
|
6459
|
-
color: var(--text-muted);
|
|
6460
|
-
opacity: 0.55;
|
|
6461
|
-
font-size: 0.7rem;
|
|
6462
|
-
flex-shrink: 0;
|
|
6463
|
-
}
|
|
6464
|
-
.queue-bar-preview {
|
|
6465
|
-
font-size: 0.75rem;
|
|
6466
|
-
color: var(--text-secondary);
|
|
6467
|
-
flex: 1 1 auto;
|
|
6468
|
-
min-width: 0;
|
|
6469
|
-
overflow: hidden;
|
|
6470
|
-
text-overflow: ellipsis;
|
|
6471
|
-
white-space: nowrap;
|
|
6472
|
-
line-height: 1;
|
|
6473
|
-
}
|
|
6474
|
-
.queue-bar-chevron {
|
|
6475
|
-
color: var(--text-tertiary);
|
|
6476
|
-
flex-shrink: 0;
|
|
6477
|
-
transition: transform 180ms ease-out;
|
|
6478
|
-
}
|
|
6479
|
-
.queue-bar.expanded .queue-bar-chevron {
|
|
6480
|
-
transform: rotate(180deg);
|
|
6481
|
-
color: var(--accent);
|
|
6482
|
-
}
|
|
6483
|
-
|
|
6484
|
-
.queue-bar-divider {
|
|
6485
|
-
width: 1px;
|
|
6486
|
-
background: rgba(197, 101, 61, 0.28);
|
|
6487
|
-
margin: 7px 0;
|
|
6488
|
-
flex-shrink: 0;
|
|
6489
|
-
}
|
|
6490
|
-
|
|
6491
|
-
.queue-bar-promote {
|
|
6492
|
-
flex-shrink: 0;
|
|
6493
|
-
display: inline-flex;
|
|
6494
|
-
align-items: center;
|
|
6495
|
-
gap: 5px;
|
|
6496
|
-
padding: 0 14px 0 12px;
|
|
6497
|
-
border: none;
|
|
6498
|
-
cursor: pointer;
|
|
6499
|
-
font: inherit;
|
|
6500
|
-
font-size: 0.75rem;
|
|
6501
|
-
font-weight: 600;
|
|
6502
|
-
color: #fff;
|
|
6503
|
-
background: linear-gradient(180deg, var(--accent) 0%, var(--accent-active) 100%);
|
|
6504
|
-
border-radius: 0 999px 999px 0;
|
|
6505
|
-
letter-spacing: 0.04em;
|
|
6506
|
-
transition: filter var(--transition-fast), transform var(--transition-fast);
|
|
6507
|
-
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.22);
|
|
6508
|
-
}
|
|
6509
|
-
.queue-bar-promote:hover { filter: brightness(1.06); }
|
|
6510
|
-
.queue-bar-promote:active { transform: scale(0.97); }
|
|
6511
|
-
.queue-bar-promote:focus-visible {
|
|
6512
|
-
outline: 2px solid var(--border-focus);
|
|
6513
|
-
outline-offset: 2px;
|
|
6514
|
-
}
|
|
6515
|
-
.queue-bar-promote svg { flex-shrink: 0; }
|
|
6516
|
-
.queue-bar-promote-label { line-height: 1; }
|
|
6517
|
-
|
|
6518
|
-
/* 展开面板:默认折叠(不可见 + 不占空间),加 .expanded 时滑出 */
|
|
6519
|
-
.queue-bar-panel {
|
|
6520
|
-
position: absolute;
|
|
6521
|
-
right: 0;
|
|
6522
|
-
bottom: calc(100% + 8px);
|
|
6523
|
-
width: min(380px, calc(100vw - 24px));
|
|
6524
|
-
max-height: 280px;
|
|
6525
|
-
display: flex;
|
|
6526
|
-
flex-direction: column;
|
|
6527
|
-
background: var(--bg-elevated);
|
|
6528
|
-
border-radius: 14px;
|
|
6529
|
-
box-shadow:
|
|
6530
|
-
0 0 0 1px var(--border-default),
|
|
6531
|
-
var(--shadow-lg);
|
|
6532
|
-
overflow: hidden;
|
|
6533
|
-
opacity: 0;
|
|
6534
|
-
transform: scale(0.96) translateY(4px);
|
|
6535
|
-
transform-origin: bottom right;
|
|
6536
|
-
pointer-events: none;
|
|
6537
|
-
transition: opacity 180ms ease-out, transform 180ms ease-out;
|
|
6538
|
-
}
|
|
6539
|
-
.queue-bar.expanded .queue-bar-panel {
|
|
6540
|
-
opacity: 1;
|
|
6541
|
-
transform: scale(1) translateY(0);
|
|
6542
|
-
pointer-events: auto;
|
|
6543
|
-
}
|
|
6544
|
-
|
|
6545
|
-
.queue-bar-panel-header {
|
|
6546
|
-
display: flex;
|
|
6547
|
-
align-items: center;
|
|
6548
|
-
gap: 8px;
|
|
6549
|
-
padding: 9px 12px;
|
|
6550
|
-
border-bottom: 1px solid var(--border-subtle);
|
|
6551
|
-
background: linear-gradient(180deg, rgba(246, 234, 216, 0.55) 0%, transparent 100%);
|
|
6552
|
-
}
|
|
6553
|
-
.queue-bar-panel-title {
|
|
6554
|
-
font-size: 0.78rem;
|
|
6555
|
-
font-weight: 600;
|
|
6556
|
-
color: var(--text-primary);
|
|
6557
|
-
flex: 1 1 auto;
|
|
6558
|
-
min-width: 0;
|
|
6559
|
-
}
|
|
6560
|
-
.queue-bar-clear,
|
|
6561
|
-
.queue-bar-collapse {
|
|
6562
|
-
display: inline-flex;
|
|
6563
|
-
align-items: center;
|
|
6564
|
-
gap: 3px;
|
|
6565
|
-
padding: 3px 9px;
|
|
6566
|
-
border: 1px solid transparent;
|
|
6567
|
-
background: transparent;
|
|
6568
|
-
cursor: pointer;
|
|
6569
|
-
font: inherit;
|
|
6570
|
-
font-size: 0.7rem;
|
|
6571
|
-
color: var(--text-tertiary);
|
|
6572
|
-
border-radius: 8px;
|
|
6573
|
-
transition: all var(--transition-fast);
|
|
6574
|
-
line-height: 1;
|
|
6575
|
-
}
|
|
6576
|
-
.queue-bar-clear:hover:not([disabled]) {
|
|
6577
|
-
color: var(--danger);
|
|
6578
|
-
background: var(--danger-muted);
|
|
6579
|
-
border-color: rgba(178, 79, 69, 0.25);
|
|
6580
|
-
}
|
|
6581
|
-
.queue-bar-clear[disabled] {
|
|
6582
|
-
opacity: 0.4;
|
|
6583
|
-
cursor: not-allowed;
|
|
6584
|
-
}
|
|
6585
|
-
.queue-bar-collapse:hover {
|
|
6586
|
-
color: var(--accent);
|
|
6587
|
-
background: var(--accent-muted);
|
|
6588
|
-
}
|
|
6589
|
-
.queue-bar-collapse svg { flex-shrink: 0; }
|
|
6590
|
-
|
|
6591
6493
|
.queue-bar-list {
|
|
6592
6494
|
list-style: none;
|
|
6593
6495
|
margin: 0;
|
|
6594
|
-
padding:
|
|
6496
|
+
padding: 0;
|
|
6595
6497
|
display: flex;
|
|
6596
6498
|
flex-direction: column;
|
|
6597
|
-
|
|
6598
|
-
|
|
6599
|
-
|
|
6600
|
-
flex: 1 1 auto;
|
|
6601
|
-
min-height: 0;
|
|
6499
|
+
align-items: flex-end;
|
|
6500
|
+
gap: 3px;
|
|
6501
|
+
width: 100%;
|
|
6602
6502
|
}
|
|
6603
6503
|
|
|
6504
|
+
/* 折叠态 chip:一根小横杠(橙色细线,cursor 提示"可指") */
|
|
6604
6505
|
.queue-bar-item {
|
|
6605
6506
|
display: flex;
|
|
6606
|
-
align-items:
|
|
6607
|
-
|
|
6608
|
-
|
|
6609
|
-
|
|
6610
|
-
|
|
6611
|
-
|
|
6507
|
+
align-items: center;
|
|
6508
|
+
justify-content: flex-end;
|
|
6509
|
+
gap: 0;
|
|
6510
|
+
height: 5px;
|
|
6511
|
+
width: 32px;
|
|
6512
|
+
padding: 0;
|
|
6513
|
+
border: none;
|
|
6514
|
+
border-radius: 999px;
|
|
6515
|
+
background: linear-gradient(180deg, var(--accent) 0%, #a8522f 100%);
|
|
6516
|
+
box-shadow: 0 1px 2px rgba(197, 101, 61, 0.25);
|
|
6517
|
+
color: #fff;
|
|
6518
|
+
cursor: pointer;
|
|
6519
|
+
overflow: hidden;
|
|
6612
6520
|
position: relative;
|
|
6613
|
-
transition:
|
|
6614
|
-
|
|
6521
|
+
transition: width 200ms cubic-bezier(0.2, 0.7, 0.2, 1),
|
|
6522
|
+
height 200ms cubic-bezier(0.2, 0.7, 0.2, 1),
|
|
6523
|
+
padding 200ms cubic-bezier(0.2, 0.7, 0.2, 1),
|
|
6524
|
+
gap 200ms cubic-bezier(0.2, 0.7, 0.2, 1),
|
|
6525
|
+
box-shadow var(--transition-fast),
|
|
6526
|
+
transform 140ms ease-out;
|
|
6615
6527
|
will-change: transform;
|
|
6528
|
+
touch-action: none; /* 防止触屏滚动抢拖拽手势 */
|
|
6616
6529
|
}
|
|
6617
6530
|
.queue-bar-item:hover {
|
|
6618
|
-
|
|
6619
|
-
|
|
6531
|
+
box-shadow: 0 2px 6px rgba(197, 101, 61, 0.42);
|
|
6532
|
+
}
|
|
6533
|
+
|
|
6534
|
+
/* 展开态:完整气泡(橙色填充 + 编号 + 文本 + × 删除) */
|
|
6535
|
+
.queue-bar-item.expanded,
|
|
6536
|
+
.queue-bar-item.dragging {
|
|
6537
|
+
width: auto;
|
|
6538
|
+
max-width: 100%;
|
|
6539
|
+
height: 24px;
|
|
6540
|
+
padding: 0 4px 0 5px;
|
|
6541
|
+
gap: 5px;
|
|
6542
|
+
box-shadow: 0 2px 6px rgba(197, 101, 61, 0.34);
|
|
6543
|
+
cursor: grab;
|
|
6620
6544
|
}
|
|
6621
6545
|
.queue-bar-item.dragging {
|
|
6622
6546
|
z-index: 5;
|
|
6623
|
-
box-shadow:
|
|
6624
|
-
background: var(--bg-elevated);
|
|
6547
|
+
box-shadow: 0 6px 16px rgba(197, 101, 61, 0.45), 0 0 0 1.5px rgba(255, 255, 255, 0.4);
|
|
6625
6548
|
transition: box-shadow var(--transition-fast); /* dragging 期间禁用 transform 过渡 */
|
|
6626
6549
|
cursor: grabbing;
|
|
6627
6550
|
}
|
|
6628
|
-
.queue-bar-item
|
|
6629
|
-
transition: transform 140ms ease-out;
|
|
6630
|
-
}
|
|
6551
|
+
.queue-bar-item.expanded:active { cursor: grabbing; }
|
|
6631
6552
|
|
|
6632
|
-
|
|
6633
|
-
|
|
6634
|
-
|
|
6635
|
-
|
|
6636
|
-
border: none;
|
|
6637
|
-
background: transparent;
|
|
6638
|
-
cursor: grab;
|
|
6639
|
-
color: var(--text-muted);
|
|
6640
|
-
padding: 0;
|
|
6641
|
-
display: inline-flex;
|
|
6642
|
-
align-items: center;
|
|
6643
|
-
justify-content: center;
|
|
6644
|
-
border-radius: 4px;
|
|
6645
|
-
touch-action: none; /* 不让浏览器抢走拖拽手势用作滚动 */
|
|
6646
|
-
transition: color var(--transition-fast), background var(--transition-fast);
|
|
6647
|
-
}
|
|
6648
|
-
.queue-bar-item-drag:hover { color: var(--accent); background: var(--accent-muted); }
|
|
6649
|
-
.queue-bar-item-drag:active { cursor: grabbing; }
|
|
6650
|
-
.queue-bar-item-drag[disabled] {
|
|
6651
|
-
opacity: 0.35;
|
|
6652
|
-
cursor: default;
|
|
6653
|
-
}
|
|
6654
|
-
.queue-bar-item-drag[disabled]:hover {
|
|
6655
|
-
color: var(--text-muted);
|
|
6656
|
-
background: transparent;
|
|
6657
|
-
}
|
|
6553
|
+
/* 单条排队时不能拖排序,但仍可点击 → 立即发送 */
|
|
6554
|
+
.queue-bar-item-single { cursor: pointer; }
|
|
6555
|
+
.queue-bar-item-single.expanded { cursor: pointer; }
|
|
6556
|
+
.queue-bar-item-single.expanded:active { cursor: pointer; }
|
|
6658
6557
|
|
|
6558
|
+
/* sibling 在被拖期间平滑回位 */
|
|
6559
|
+
.queue-bar-item-sliding { transition: transform 160ms cubic-bezier(0.2, 0.7, 0.2, 1); }
|
|
6560
|
+
|
|
6561
|
+
/* chip 内部三件:编号 + 文本 + 删除按钮。默认折叠态全部隐起来。 */
|
|
6659
6562
|
.queue-bar-item-index {
|
|
6660
6563
|
flex-shrink: 0;
|
|
6661
|
-
font-
|
|
6662
|
-
font-
|
|
6663
|
-
|
|
6664
|
-
|
|
6665
|
-
|
|
6666
|
-
|
|
6667
|
-
|
|
6668
|
-
|
|
6669
|
-
|
|
6670
|
-
min-width: 26px;
|
|
6564
|
+
font-size: 0.6rem;
|
|
6565
|
+
font-weight: 700;
|
|
6566
|
+
color: rgba(255, 255, 255, 0.95);
|
|
6567
|
+
background: rgba(255, 255, 255, 0.22);
|
|
6568
|
+
padding: 0 5px;
|
|
6569
|
+
height: 15px;
|
|
6570
|
+
min-width: 15px;
|
|
6571
|
+
border-radius: 999px;
|
|
6572
|
+
line-height: 15px;
|
|
6671
6573
|
text-align: center;
|
|
6574
|
+
letter-spacing: 0.02em;
|
|
6575
|
+
opacity: 0;
|
|
6576
|
+
transform: scale(0.4);
|
|
6577
|
+
transition: opacity 150ms ease, transform 180ms cubic-bezier(0.2, 0.7, 0.2, 1);
|
|
6578
|
+
pointer-events: none;
|
|
6579
|
+
}
|
|
6580
|
+
.queue-bar-item.expanded .queue-bar-item-index,
|
|
6581
|
+
.queue-bar-item.dragging .queue-bar-item-index {
|
|
6582
|
+
opacity: 1;
|
|
6583
|
+
transform: scale(1);
|
|
6672
6584
|
}
|
|
6673
6585
|
|
|
6674
6586
|
.queue-bar-item-text {
|
|
6675
6587
|
flex: 1 1 auto;
|
|
6676
6588
|
min-width: 0;
|
|
6677
|
-
|
|
6678
|
-
|
|
6679
|
-
|
|
6680
|
-
|
|
6681
|
-
font-size: 0.78rem;
|
|
6682
|
-
color: var(--text-primary);
|
|
6683
|
-
text-align: left;
|
|
6684
|
-
padding: 1px 0;
|
|
6685
|
-
line-height: 1.4;
|
|
6686
|
-
display: -webkit-box;
|
|
6687
|
-
-webkit-line-clamp: 2;
|
|
6688
|
-
-webkit-box-orient: vertical;
|
|
6589
|
+
font-size: 0.7rem;
|
|
6590
|
+
color: #fff;
|
|
6591
|
+
line-height: 1;
|
|
6592
|
+
white-space: nowrap;
|
|
6689
6593
|
overflow: hidden;
|
|
6690
|
-
|
|
6691
|
-
|
|
6692
|
-
|
|
6594
|
+
text-overflow: ellipsis;
|
|
6595
|
+
letter-spacing: 0.02em;
|
|
6596
|
+
opacity: 0;
|
|
6597
|
+
transition: opacity 120ms ease 50ms;
|
|
6598
|
+
pointer-events: none;
|
|
6693
6599
|
}
|
|
6694
|
-
.queue-bar-item.expanded .queue-bar-item-text
|
|
6695
|
-
|
|
6696
|
-
|
|
6697
|
-
max-height: 200px;
|
|
6698
|
-
overflow-y: auto;
|
|
6600
|
+
.queue-bar-item.expanded .queue-bar-item-text,
|
|
6601
|
+
.queue-bar-item.dragging .queue-bar-item-text {
|
|
6602
|
+
opacity: 1;
|
|
6699
6603
|
}
|
|
6700
|
-
.queue-bar-item-text:hover { color: var(--accent); }
|
|
6701
6604
|
|
|
6702
6605
|
.queue-bar-item-delete {
|
|
6703
6606
|
flex-shrink: 0;
|
|
6704
|
-
width:
|
|
6705
|
-
height:
|
|
6607
|
+
width: 16px;
|
|
6608
|
+
height: 16px;
|
|
6706
6609
|
border: none;
|
|
6707
|
-
background:
|
|
6610
|
+
background: rgba(255, 255, 255, 0.16);
|
|
6611
|
+
color: #fff;
|
|
6708
6612
|
cursor: pointer;
|
|
6709
|
-
|
|
6710
|
-
border-radius: 6px;
|
|
6613
|
+
border-radius: 999px;
|
|
6711
6614
|
display: inline-flex;
|
|
6712
6615
|
align-items: center;
|
|
6713
6616
|
justify-content: center;
|
|
6617
|
+
padding: 0;
|
|
6714
6618
|
opacity: 0;
|
|
6715
|
-
|
|
6716
|
-
|
|
6619
|
+
pointer-events: none;
|
|
6620
|
+
transition: opacity 120ms ease 70ms, background var(--transition-fast);
|
|
6717
6621
|
}
|
|
6718
|
-
.queue-bar-item
|
|
6719
|
-
.queue-bar-item
|
|
6622
|
+
.queue-bar-item.expanded .queue-bar-item-delete,
|
|
6623
|
+
.queue-bar-item.dragging .queue-bar-item-delete {
|
|
6720
6624
|
opacity: 1;
|
|
6625
|
+
pointer-events: auto;
|
|
6721
6626
|
}
|
|
6722
6627
|
.queue-bar-item-delete:hover {
|
|
6723
|
-
|
|
6724
|
-
|
|
6628
|
+
background: rgba(255, 255, 255, 0.34);
|
|
6629
|
+
}
|
|
6630
|
+
.queue-bar-item-delete svg { flex-shrink: 0; }
|
|
6631
|
+
|
|
6632
|
+
/* ⚡ 立即按钮 —— 独立小圆按钮,跟在列表末尾 */
|
|
6633
|
+
.queue-bar-promote {
|
|
6634
|
+
flex-shrink: 0;
|
|
6635
|
+
width: 24px;
|
|
6636
|
+
height: 24px;
|
|
6637
|
+
padding: 0;
|
|
6638
|
+
border: none;
|
|
6639
|
+
cursor: pointer;
|
|
6640
|
+
color: #fff;
|
|
6641
|
+
background: linear-gradient(180deg, var(--accent) 0%, #a8522f 100%);
|
|
6642
|
+
border-radius: 999px;
|
|
6643
|
+
display: inline-flex;
|
|
6644
|
+
align-items: center;
|
|
6645
|
+
justify-content: center;
|
|
6646
|
+
box-shadow: 0 2px 6px rgba(197, 101, 61, 0.30);
|
|
6647
|
+
transition: transform var(--transition-fast), box-shadow var(--transition-fast),
|
|
6648
|
+
background var(--transition-fast);
|
|
6649
|
+
animation: queuePulse 1.5s ease-in-out infinite;
|
|
6650
|
+
}
|
|
6651
|
+
.queue-bar-promote:hover {
|
|
6652
|
+
transform: translateY(-1px);
|
|
6653
|
+
box-shadow: 0 3px 10px rgba(197, 101, 61, 0.45);
|
|
6654
|
+
}
|
|
6655
|
+
.queue-bar-promote:active { transform: scale(0.94); }
|
|
6656
|
+
.queue-bar-promote:focus-visible {
|
|
6657
|
+
outline: 2px solid var(--border-focus);
|
|
6658
|
+
outline-offset: 2px;
|
|
6659
|
+
}
|
|
6660
|
+
.queue-bar-promote svg { flex-shrink: 0; }
|
|
6661
|
+
.queue-bar-promote-label { display: none; } /* label 留作 aria,视觉不展示 */
|
|
6662
|
+
|
|
6663
|
+
/* 容量满了的视觉提示 —— 整组颜色稍暗 */
|
|
6664
|
+
.queue-bar.queue-bar-capacity .queue-bar-item,
|
|
6665
|
+
.queue-bar.queue-bar-capacity .queue-bar-promote {
|
|
6666
|
+
background: linear-gradient(180deg, #a8522f 0%, #8e4426 100%);
|
|
6725
6667
|
}
|
|
6726
6668
|
|
|
6727
|
-
/* 窄屏:
|
|
6669
|
+
/* 窄屏:max-width 适配视口;横杠加宽方便指 */
|
|
6728
6670
|
@media (max-width: 560px) {
|
|
6729
|
-
.queue-bar-host { padding:
|
|
6730
|
-
.queue-bar { width:
|
|
6731
|
-
.queue-bar-
|
|
6732
|
-
.queue-bar-sep { display: none; }
|
|
6733
|
-
.queue-bar-item-delete { opacity: 1; }
|
|
6734
|
-
.queue-bar-panel { width: calc(100vw - 16px); right: -2px; }
|
|
6671
|
+
.queue-bar-host { padding: 4px 6px 0; }
|
|
6672
|
+
.queue-bar { max-width: calc(100vw - 20px); }
|
|
6673
|
+
.queue-bar-item { width: 40px; height: 6px; }
|
|
6735
6674
|
}
|
|
6736
6675
|
|
|
6737
6676
|
/* Queued message in chat view:用户最容易"觉得排队没生效"是因为旧版徽章太小。
|
|
@@ -6774,11 +6713,15 @@
|
|
|
6774
6713
|
}
|
|
6775
6714
|
|
|
6776
6715
|
.input-hint {
|
|
6777
|
-
font-size: 0.
|
|
6716
|
+
font-size: 0.5rem; /* 8px — 让位给同一行的按钮,桌面端仍清晰可读 */
|
|
6717
|
+
line-height: 1.2;
|
|
6778
6718
|
color: var(--text-muted);
|
|
6779
6719
|
white-space: nowrap;
|
|
6780
6720
|
user-select: none;
|
|
6781
6721
|
opacity: 0.7;
|
|
6722
|
+
max-width: 38ch; /* 防止突然变长的状态文案撑爆右侧区域 */
|
|
6723
|
+
overflow: hidden;
|
|
6724
|
+
text-overflow: ellipsis;
|
|
6782
6725
|
}
|
|
6783
6726
|
|
|
6784
6727
|
/* Session info bar at bottom of input composer */
|
|
@@ -7678,40 +7621,8 @@
|
|
|
7678
7621
|
.btn-pill-label {
|
|
7679
7622
|
display: inline;
|
|
7680
7623
|
}
|
|
7681
|
-
.btn-pill-interrupt
|
|
7682
|
-
|
|
7683
|
-
color: var(--accent);
|
|
7684
|
-
margin-right: 4px;
|
|
7685
|
-
box-shadow: 0 0 0 1px rgba(197, 101, 61, 0.30) inset;
|
|
7686
|
-
animation: interruptPulse 1.8s ease-in-out infinite;
|
|
7687
|
-
}
|
|
7688
|
-
.btn-pill-interrupt:hover {
|
|
7689
|
-
background: linear-gradient(180deg, var(--accent) 0%, #a8522f 100%);
|
|
7690
|
-
color: #fff;
|
|
7691
|
-
box-shadow: 0 3px 10px rgba(197, 101, 61, 0.35);
|
|
7692
|
-
transform: translateY(-1px);
|
|
7693
|
-
animation: none;
|
|
7694
|
-
}
|
|
7695
|
-
.btn-pill-interrupt:active {
|
|
7696
|
-
transform: translateY(0) scale(0.97);
|
|
7697
|
-
}
|
|
7698
|
-
.btn-pill-interrupt.hidden {
|
|
7699
|
-
display: none;
|
|
7700
|
-
}
|
|
7701
|
-
@keyframes interruptPulse {
|
|
7702
|
-
0%, 100% { box-shadow: 0 0 0 1px rgba(197, 101, 61, 0.30) inset, 0 0 0 0 rgba(197, 101, 61, 0.0); }
|
|
7703
|
-
50% { box-shadow: 0 0 0 1px rgba(197, 101, 61, 0.45) inset, 0 0 0 4px rgba(197, 101, 61, 0.12); }
|
|
7704
|
-
}
|
|
7705
|
-
/* 屏宽 < 480 时把"立即"文字藏掉,只剩 » 图标,避免和 send 一起把行挤爆。
|
|
7706
|
-
hover/focus 期间临时回显,让长按移动端用户也能确认按钮含义。 */
|
|
7707
|
-
@media (max-width: 480px) {
|
|
7708
|
-
.btn-pill-interrupt {
|
|
7709
|
-
padding: 0 8px;
|
|
7710
|
-
}
|
|
7711
|
-
.btn-pill-interrupt .btn-pill-label {
|
|
7712
|
-
display: none;
|
|
7713
|
-
}
|
|
7714
|
-
}
|
|
7624
|
+
/* .btn-pill-interrupt 与 @keyframes interruptPulse 已下线:
|
|
7625
|
+
默认行为永远是"排队(气泡)",想插队请点输入框上方那条气泡。 */
|
|
7715
7626
|
|
|
7716
7627
|
/* send 按钮在「排队模式」下退到次要色,让相邻的"立即发送"成为视觉重点。
|
|
7717
7628
|
不动尺寸 / 圆形,避免 layout shift。 */
|
|
@@ -9103,9 +9014,8 @@
|
|
|
9103
9014
|
line-height: 1.5;
|
|
9104
9015
|
}
|
|
9105
9016
|
|
|
9106
|
-
/* Sidebar header icon buttons —
|
|
9017
|
+
/* Sidebar header icon buttons — collapse / more / close — uniform 32×32 ghost */
|
|
9107
9018
|
.sidebar-header-actions .btn-ghost.btn-sm,
|
|
9108
|
-
.sidebar-pin-toggle,
|
|
9109
9019
|
.drawer-close-btn {
|
|
9110
9020
|
width: 32px;
|
|
9111
9021
|
height: 32px;
|
|
@@ -9124,16 +9034,10 @@
|
|
|
9124
9034
|
color 0.16s ease,
|
|
9125
9035
|
transform 0.22s cubic-bezier(0.34, 1.4, 0.64, 1);
|
|
9126
9036
|
}
|
|
9127
|
-
.sidebar-header-actions .btn-ghost.btn-sm:hover
|
|
9128
|
-
.sidebar-pin-toggle:hover {
|
|
9037
|
+
.sidebar-header-actions .btn-ghost.btn-sm:hover {
|
|
9129
9038
|
background: rgba(125, 91, 57, 0.08);
|
|
9130
9039
|
color: var(--text-primary);
|
|
9131
9040
|
}
|
|
9132
|
-
.sidebar-pin-toggle.pinned {
|
|
9133
|
-
background: rgba(197, 101, 61, 0.12);
|
|
9134
|
-
color: var(--accent);
|
|
9135
|
-
transform: rotate(45deg);
|
|
9136
|
-
}
|
|
9137
9041
|
|
|
9138
9042
|
/* Drawer close — same pattern as modal-close (rotate + danger tint) */
|
|
9139
9043
|
.drawer-close-btn {
|
|
@@ -9864,9 +9768,6 @@
|
|
|
9864
9768
|
|
|
9865
9769
|
/* 平板适配 */
|
|
9866
9770
|
@media (max-width: 768px) {
|
|
9867
|
-
/* 手机隐藏「固定侧栏」按钮:手机上完整 300px 常驻太占地,
|
|
9868
|
-
只保留「收起为窄条」按钮,让用户能切到 56px 窄条形态。 */
|
|
9869
|
-
.sidebar-pin-toggle { display: none; }
|
|
9870
9771
|
/* drawer 模式(pinned 但非窄条)下若未打开,则隐藏到屏幕左侧。
|
|
9871
9772
|
窄条模式(pinned + collapsed)由 .sidebar.pinned.collapsed 的 width:56px
|
|
9872
9773
|
规则常驻显示,不进入这条隐藏分支。 */
|
|
@@ -10224,8 +10125,12 @@
|
|
|
10224
10125
|
padding: 0 14px 0 4px;
|
|
10225
10126
|
border-radius: 5px;
|
|
10226
10127
|
}
|
|
10128
|
+
/* 窄屏(手机)保留提示,但用更小字号 + 更紧的宽度上限,避免把发送按钮挤出行外。
|
|
10129
|
+
状态切换("思考中…" / "已加入排队…")能截断成省略号也比整条消失友好。 */
|
|
10227
10130
|
.input-hint {
|
|
10228
|
-
|
|
10131
|
+
font-size: 0.45rem;
|
|
10132
|
+
max-width: 18ch;
|
|
10133
|
+
opacity: 0.6;
|
|
10229
10134
|
}
|
|
10230
10135
|
|
|
10231
10136
|
/* 移动端内联快捷键 - 折叠为展开按钮,展开到独立第二行 */
|
|
@@ -10353,7 +10258,11 @@
|
|
|
10353
10258
|
.chat-container {
|
|
10354
10259
|
min-height: 0;
|
|
10355
10260
|
flex: 1 1 auto;
|
|
10356
|
-
|
|
10261
|
+
/* 注意:这里必须 hidden,不能 auto——内部的 .inline-terminal /
|
|
10262
|
+
.tool-use-card 默认 max-width: 720px,如果 chat-container 允许
|
|
10263
|
+
横向滚动,这些卡片会把整个容器推宽,结果窄屏看到右边内容被屏幕
|
|
10264
|
+
边缘截掉。垂直滚动由内层 .chat-messages (overflow-y: auto) 负责。 */
|
|
10265
|
+
overflow: hidden;
|
|
10357
10266
|
display: none;
|
|
10358
10267
|
flex-direction: column;
|
|
10359
10268
|
}
|
|
@@ -10656,6 +10565,43 @@
|
|
|
10656
10565
|
.markdown-content pre,
|
|
10657
10566
|
.markdown-content .code-block pre,
|
|
10658
10567
|
.subagent-reply pre { padding: 10px; }
|
|
10568
|
+
/* diff 卡片:窄屏下两列 side-by-side 每列只剩 ~160px,旧/新被挤成
|
|
10569
|
+
单字一行的"窄条"几乎不可读。改成垂直堆叠(旧在上,新在下),
|
|
10570
|
+
单列占满屏宽,长行靠 word-break 自然换行,杜绝横向溢出。 */
|
|
10571
|
+
.diff-columns {
|
|
10572
|
+
flex-direction: column;
|
|
10573
|
+
}
|
|
10574
|
+
.diff-col,
|
|
10575
|
+
.diff-col-half,
|
|
10576
|
+
.diff-col-full {
|
|
10577
|
+
flex: 1 1 auto;
|
|
10578
|
+
width: 100%;
|
|
10579
|
+
max-width: 100%;
|
|
10580
|
+
}
|
|
10581
|
+
/* 终端命令头部也放开 wrap,长命令在 preview 里仍 ellipsis,但 dot/toggle
|
|
10582
|
+
之类不会把卡片撑宽。 */
|
|
10583
|
+
.term-header {
|
|
10584
|
+
flex-wrap: wrap;
|
|
10585
|
+
row-gap: 4px;
|
|
10586
|
+
}
|
|
10587
|
+
.diff-header {
|
|
10588
|
+
flex-wrap: wrap;
|
|
10589
|
+
row-gap: 4px;
|
|
10590
|
+
}
|
|
10591
|
+
.diff-path {
|
|
10592
|
+
flex-basis: 100%;
|
|
10593
|
+
order: 99;
|
|
10594
|
+
}
|
|
10595
|
+
/* inline-tool meta(搜索路径等)窄屏给整行,不再贴右挤标题。 */
|
|
10596
|
+
.inline-tool-row {
|
|
10597
|
+
flex-wrap: wrap;
|
|
10598
|
+
row-gap: 2px;
|
|
10599
|
+
}
|
|
10600
|
+
.inline-tool-meta {
|
|
10601
|
+
max-width: 100%;
|
|
10602
|
+
flex-basis: 100%;
|
|
10603
|
+
padding-left: 22px;
|
|
10604
|
+
}
|
|
10659
10605
|
}
|
|
10660
10606
|
|
|
10661
10607
|
/* Blank chat mobile optimization */
|
|
@@ -15753,14 +15699,6 @@
|
|
|
15753
15699
|
/* 附件 pill 缩略图 svg */
|
|
15754
15700
|
.attachment-pill .att-icon > svg { display: block; }
|
|
15755
15701
|
|
|
15756
|
-
/* 排队面板标题 (排队中) —— 现在 icon + text 用 inline-flex 排 */
|
|
15757
|
-
.queue-bar-panel-title {
|
|
15758
|
-
display: inline-flex;
|
|
15759
|
-
align-items: center;
|
|
15760
|
-
gap: 5px;
|
|
15761
|
-
}
|
|
15762
|
-
.queue-bar-panel-title-icon { flex-shrink: 0; }
|
|
15763
|
-
|
|
15764
15702
|
/* 紧凑目录选择器(新建会话时显示的小条)的图标 + 折叠箭头 */
|
|
15765
15703
|
.folder-picker-compact-icon {
|
|
15766
15704
|
display: inline-flex;
|