@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.
@@ -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
- /* 多塞一层 .sidebar-header-actions 把 specificity 抬到 0,4,0,
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: break-word;
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
- overflow-wrap: break-word;
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: break-word;
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)—— 浮在 .input-composer 上方,靠 .queue-bar-host
6362
- 右对齐到对话框右下角。结构:
6363
- .queue-bar (折叠条 row)
6364
- .queue-bar-toggle (● 排队 N · 预览 ⌃)
6365
- .queue-bar-divider
6366
- .queue-bar-promote (⚡ 立即)
6367
- .queue-bar-panel (展开后下拉的消息列表,默认隐)
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: 0 6px 6px;
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: inline-flex;
6384
- align-items: stretch;
6385
- gap: 0;
6386
- width: 340px;
6387
- max-width: calc(100% - 4px);
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.98); }
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: 6px;
6496
+ padding: 0;
6595
6497
  display: flex;
6596
6498
  flex-direction: column;
6597
- gap: 6px;
6598
- overflow-y: auto;
6599
- overscroll-behavior: contain;
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: flex-start;
6607
- gap: 6px;
6608
- padding: 8px 8px 8px 4px;
6609
- background: var(--bg-surface);
6610
- border: 1px solid var(--border-subtle);
6611
- border-radius: 10px;
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: transform 140ms ease-out, box-shadow var(--transition-fast),
6614
- background var(--transition-fast), border-color var(--transition-fast);
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
- background: rgba(255, 251, 245, 0.92);
6619
- border-color: var(--border-default);
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: var(--shadow-lg), 0 0 0 1.5px var(--accent);
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-sliding {
6629
- transition: transform 140ms ease-out;
6630
- }
6551
+ .queue-bar-item.expanded:active { cursor: grabbing; }
6631
6552
 
6632
- .queue-bar-item-drag {
6633
- flex-shrink: 0;
6634
- width: 18px;
6635
- height: 28px;
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-family: var(--font-mono);
6662
- font-size: 0.65rem;
6663
- font-weight: 600;
6664
- color: var(--accent);
6665
- background: var(--accent-muted);
6666
- padding: 3px 6px;
6667
- border-radius: 6px;
6668
- line-height: 1;
6669
- margin-top: 1px;
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
- border: none;
6678
- background: transparent;
6679
- cursor: pointer;
6680
- font: inherit;
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
- white-space: pre-wrap;
6691
- word-break: break-word;
6692
- transition: color var(--transition-fast);
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
- display: block;
6696
- -webkit-line-clamp: unset;
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: 22px;
6705
- height: 22px;
6607
+ width: 16px;
6608
+ height: 16px;
6706
6609
  border: none;
6707
- background: transparent;
6610
+ background: rgba(255, 255, 255, 0.16);
6611
+ color: #fff;
6708
6612
  cursor: pointer;
6709
- color: var(--text-muted);
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
- transition: opacity var(--transition-fast), color var(--transition-fast),
6716
- background var(--transition-fast);
6619
+ pointer-events: none;
6620
+ transition: opacity 120ms ease 70ms, background var(--transition-fast);
6717
6621
  }
6718
- .queue-bar-item:hover .queue-bar-item-delete,
6719
- .queue-bar-item:focus-within .queue-bar-item-delete {
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
- color: var(--danger);
6724
- background: var(--danger-muted);
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
- /* 窄屏:bar 撑满,preview 隐藏,操作按钮始终显形 */
6669
+ /* 窄屏:max-width 适配视口;横杠加宽方便指 */
6728
6670
  @media (max-width: 560px) {
6729
- .queue-bar-host { padding: 0 4px 6px; }
6730
- .queue-bar { width: 100%; }
6731
- .queue-bar-preview { display: none; }
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.5625rem;
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
- background: linear-gradient(180deg, rgba(197, 101, 61, 0.18) 0%, rgba(197, 101, 61, 0.10) 100%);
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 — pin / more / close — uniform 32×32 ghost */
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
- display: none;
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
- overflow: auto;
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;