@co0ontty/wand 1.30.3 → 1.31.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.
@@ -3842,14 +3842,18 @@
3842
3842
  }
3843
3843
 
3844
3844
  /* ===== 聊天消息列表 ===== */
3845
+ /* overflow-x: hidden 是兜底——任何子级(pre、table、tool-card)的
3846
+ 横向溢出都不应该冒到聊天容器,由它们各自的内部滚动负责。 */
3845
3847
  .chat-messages {
3846
3848
  flex: 1;
3847
3849
  overflow-y: auto;
3850
+ overflow-x: hidden;
3848
3851
  display: flex;
3849
3852
  flex-direction: column-reverse;
3850
3853
  gap: 16px;
3851
3854
  padding: 20px 4px 12px;
3852
3855
  min-height: 0;
3856
+ min-width: 0;
3853
3857
  scrollbar-gutter: stable;
3854
3858
  }
3855
3859
 
@@ -3906,12 +3910,17 @@
3906
3910
  }
3907
3911
 
3908
3912
  /* ===== 聊天消息基础样式 ===== */
3913
+ /* 消息整体宽度跟随屏幕(容器)宽度——长文本自然换行;
3914
+ 内部卡片(tool-use-card / inline-tool / terminal-tool / diff-tool / tool-group)
3915
+ 通过 --chat-card-max-width 单独约束,避免在宽屏下被拉成横向大条。 */
3909
3916
  .chat-message {
3910
3917
  display: flex;
3911
3918
  flex-direction: column;
3912
- max-width: 85%;
3919
+ max-width: 100%;
3920
+ min-width: 0;
3913
3921
  margin: 4px 0;
3914
3922
  transition: opacity 0.2s ease, transform 0.2s var(--ease-out-expo);
3923
+ --chat-card-max-width: 720px;
3915
3924
  }
3916
3925
 
3917
3926
  .chat-message:hover {
@@ -3936,12 +3945,13 @@
3936
3945
 
3937
3946
  .chat-message.assistant {
3938
3947
  align-self: flex-start;
3939
- max-width: 95%;
3948
+ max-width: 100%;
3949
+ width: 100%;
3940
3950
  }
3941
3951
 
3942
3952
  .chat-message.system-info {
3943
3953
  align-self: center;
3944
- max-width: 95%;
3954
+ max-width: 100%;
3945
3955
  width: 100%;
3946
3956
  margin: 10px 0;
3947
3957
  animation: messageFloat 3s ease-in-out infinite;
@@ -4075,13 +4085,16 @@
4075
4085
  font-family: var(--font-mono);
4076
4086
  font-size: 0.8125rem;
4077
4087
  max-width: 100%;
4078
- overflow-wrap: break-word;
4088
+ min-width: 0;
4089
+ overflow-wrap: anywhere;
4079
4090
  word-break: break-word;
4080
4091
  box-shadow: 0 4px 16px rgba(197, 101, 61, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15);
4081
4092
  }
4082
4093
 
4094
+ /* 用户消息默认更紧凑(贴右气泡),上限放宽到 100% 让长 prompt 不再水平
4095
+ 挤压;实际宽度由气泡内容 + word-break 决定。 */
4083
4096
  .chat-message.user {
4084
- max-width: 85%;
4097
+ max-width: 100%;
4085
4098
  }
4086
4099
 
4087
4100
  /* 助手消息气泡 */
@@ -4090,8 +4103,11 @@
4090
4103
  color: var(--text-primary);
4091
4104
  padding: 14px 18px;
4092
4105
  max-width: 100%;
4106
+ min-width: 0;
4093
4107
  white-space: pre-wrap;
4094
4108
  word-wrap: break-word;
4109
+ overflow-wrap: anywhere;
4110
+ word-break: break-word;
4095
4111
  border: 1px solid var(--border-subtle);
4096
4112
  box-shadow: var(--shadow-sm);
4097
4113
  }
@@ -4107,9 +4123,11 @@
4107
4123
  flex-direction: column;
4108
4124
  gap: 2px;
4109
4125
  max-width: 100%;
4126
+ min-width: 0;
4110
4127
  font-size: 0.875rem;
4111
4128
  line-height: var(--line-height-relaxed);
4112
4129
  word-wrap: break-word;
4130
+ overflow-wrap: anywhere;
4113
4131
  color: var(--text-primary);
4114
4132
  }
4115
4133
 
@@ -4129,7 +4147,7 @@
4129
4147
  display: flex;
4130
4148
  flex-direction: column;
4131
4149
  gap: 6px;
4132
- max-width: 95%;
4150
+ max-width: 100%;
4133
4151
  }
4134
4152
  /* user turn 默认 align-self: flex-end(右对齐);多段渲染时强制
4135
4153
  容器内左对齐,否则 subagent 段会被推到右边,border-left 色条断裂。 */
@@ -4186,6 +4204,25 @@
4186
4204
  font-style: italic;
4187
4205
  }
4188
4206
 
4207
+ /* subagent 身份小 tag("勤劳初二 让 侦探猫 [subagent] 帮忙"),让用户一眼知道
4208
+ 这是子代理在说话,不是同一个 AI 突然换了个名字。色调跟 --agent-color 走。 */
4209
+ .chat-handoff-tag {
4210
+ display: inline-block;
4211
+ margin: 0 6px;
4212
+ padding: 1px 6px;
4213
+ font-size: 0.62rem;
4214
+ font-weight: 600;
4215
+ letter-spacing: 0.04em;
4216
+ text-transform: uppercase;
4217
+ color: var(--agent-color, var(--accent));
4218
+ background: color-mix(in srgb, var(--agent-color, var(--accent)) 14%, transparent);
4219
+ border: 1px solid color-mix(in srgb, var(--agent-color, var(--accent)) 32%, transparent);
4220
+ border-radius: 4px;
4221
+ vertical-align: 1px;
4222
+ line-height: 1.4;
4223
+ white-space: nowrap;
4224
+ }
4225
+
4189
4226
  /* subagent 回复气泡(群聊角色完成任务后的发言) */
4190
4227
  .subagent-reply {
4191
4228
  background: color-mix(in srgb, var(--agent-color, var(--accent)) 6%, var(--bg-surface));
@@ -4197,6 +4234,10 @@
4197
4234
  font-size: 0.875rem;
4198
4235
  color: var(--text-primary);
4199
4236
  word-break: break-word;
4237
+ overflow-wrap: anywhere;
4238
+ max-width: 100%;
4239
+ min-width: 0;
4240
+ overflow-x: hidden;
4200
4241
  }
4201
4242
 
4202
4243
  .subagent-reply > :first-child { margin-top: 0; }
@@ -4232,8 +4273,99 @@
4232
4273
  background: rgba(0, 0, 0, 0.04);
4233
4274
  padding: 10px 12px;
4234
4275
  border-radius: 6px;
4235
- overflow-x: auto;
4276
+ overflow-x: hidden;
4277
+ white-space: pre-wrap;
4278
+ word-break: break-word;
4279
+ overflow-wrap: anywhere;
4236
4280
  margin: 8px 0;
4281
+ max-width: 100%;
4282
+ min-width: 0;
4283
+ }
4284
+
4285
+ /* ===== subagent 回复三态折叠 =====
4286
+ preview(默认)→ 限高 ~5 行 + 渐隐 mask + 内部可滚
4287
+ expanded → 拉到一个比较大的上限,内部可滚
4288
+ collapsed → 完全收起,只剩底部一条工具栏,按钮还能再点回来 */
4289
+ .subagent-reply.collapsible {
4290
+ position: relative;
4291
+ padding-right: 14px;
4292
+ padding-bottom: 28px;
4293
+ }
4294
+
4295
+ .subagent-reply-scroll {
4296
+ overflow: hidden;
4297
+ transition: max-height 0.32s var(--ease-out-expo, cubic-bezier(0.16, 1, 0.3, 1));
4298
+ min-width: 0;
4299
+ max-width: 100%;
4300
+ }
4301
+ .subagent-reply-scroll > :first-child { margin-top: 0; }
4302
+ .subagent-reply-scroll > :last-child { margin-bottom: 0; }
4303
+
4304
+ .subagent-reply.collapsible[data-collapse-mode="preview"] .subagent-reply-scroll {
4305
+ max-height: 7.5em; /* ~5 行 */
4306
+ overflow-y: auto;
4307
+ -webkit-mask-image: linear-gradient(to bottom, #000 70%, transparent 100%);
4308
+ mask-image: linear-gradient(to bottom, #000 70%, transparent 100%);
4309
+ }
4310
+
4311
+ .subagent-reply.collapsible[data-collapse-mode="expanded"] .subagent-reply-scroll {
4312
+ max-height: 360px;
4313
+ overflow-y: auto;
4314
+ }
4315
+
4316
+ .subagent-reply.collapsible[data-collapse-mode="collapsed"] {
4317
+ padding-top: 6px;
4318
+ padding-bottom: 26px;
4319
+ }
4320
+ .subagent-reply.collapsible[data-collapse-mode="collapsed"] .subagent-reply-scroll {
4321
+ max-height: 0;
4322
+ overflow: hidden;
4323
+ margin: 0;
4324
+ }
4325
+
4326
+ /* 三态循环按钮:固定在气泡右下角,三种模式下都可见 */
4327
+ .subagent-reply-cycle {
4328
+ position: absolute;
4329
+ right: 8px;
4330
+ bottom: 6px;
4331
+ display: inline-flex;
4332
+ align-items: center;
4333
+ gap: 3px;
4334
+ padding: 2px 8px;
4335
+ font-size: 0.7rem;
4336
+ font-weight: 500;
4337
+ line-height: 1.4;
4338
+ color: var(--agent-color, var(--accent));
4339
+ background: color-mix(in srgb, var(--agent-color, var(--accent)) 8%, var(--bg-surface, #fff));
4340
+ border: 1px solid color-mix(in srgb, var(--agent-color, var(--accent)) 28%, transparent);
4341
+ border-radius: 999px;
4342
+ cursor: pointer;
4343
+ user-select: none;
4344
+ transition: background 0.15s ease, transform 0.1s ease, border-color 0.15s ease;
4345
+ }
4346
+ .subagent-reply-cycle:hover {
4347
+ background: color-mix(in srgb, var(--agent-color, var(--accent)) 16%, var(--bg-surface, #fff));
4348
+ border-color: color-mix(in srgb, var(--agent-color, var(--accent)) 45%, transparent);
4349
+ }
4350
+ .subagent-reply-cycle:active {
4351
+ transform: translateY(1px);
4352
+ }
4353
+ .subagent-reply-cycle-icon {
4354
+ font-size: 0.7rem;
4355
+ line-height: 1;
4356
+ }
4357
+
4358
+ /* 内部滚动条做小一点,别抢戏 */
4359
+ .subagent-reply-scroll::-webkit-scrollbar {
4360
+ width: 6px;
4361
+ height: 6px;
4362
+ }
4363
+ .subagent-reply-scroll::-webkit-scrollbar-thumb {
4364
+ background: color-mix(in srgb, var(--agent-color, var(--accent)) 35%, transparent);
4365
+ border-radius: 3px;
4366
+ }
4367
+ .subagent-reply-scroll::-webkit-scrollbar-track {
4368
+ background: transparent;
4237
4369
  }
4238
4370
 
4239
4371
  /* ===== 消息使用量信息 ===== */
@@ -4345,7 +4477,7 @@
4345
4477
  /* Thinking Card (Deep Thought) */
4346
4478
  .chat-message.thinking {
4347
4479
  align-self: flex-start;
4348
- max-width: 85%;
4480
+ max-width: 100%;
4349
4481
  margin: 4px 0;
4350
4482
  }
4351
4483
 
@@ -4384,7 +4516,7 @@
4384
4516
  /* Prompt Suggestion Card (Pulsing) */
4385
4517
  .chat-message.prompt {
4386
4518
  align-self: center;
4387
- max-width: 85%;
4519
+ max-width: 100%;
4388
4520
  margin: 4px 0;
4389
4521
  }
4390
4522
 
@@ -4467,6 +4599,7 @@
4467
4599
  border-radius: var(--radius-sm);
4468
4600
  overflow: hidden;
4469
4601
  width: 100%;
4602
+ max-width: var(--chat-card-max-width, 720px);
4470
4603
  box-sizing: border-box;
4471
4604
  background: linear-gradient(180deg, rgba(255, 251, 245, 0.88) 0%, rgba(255, 246, 234, 0.72) 100%);
4472
4605
  box-shadow: 0 1px 2px rgba(89, 58, 32, 0.04);
@@ -4874,6 +5007,9 @@
4874
5007
  align-items: baseline;
4875
5008
  gap: 5px;
4876
5009
  margin: 2px 0;
5010
+ width: 100%;
5011
+ max-width: var(--chat-card-max-width, 720px);
5012
+ box-sizing: border-box;
4877
5013
  padding: 3px 8px;
4878
5014
  border-radius: 6px;
4879
5015
  background: rgba(138, 108, 178, 0.04);
@@ -4981,6 +5117,9 @@
4981
5117
  ────────────────────────────────────────────────────────────── */
4982
5118
  .tool-group {
4983
5119
  margin: 4px 0;
5120
+ width: 100%;
5121
+ max-width: var(--chat-card-max-width, 720px);
5122
+ box-sizing: border-box;
4984
5123
  border-radius: var(--radius-sm);
4985
5124
  border: 1px solid var(--border-subtle);
4986
5125
  background: linear-gradient(180deg, rgba(255, 251, 245, 0.85) 0%, rgba(255, 248, 238, 0.7) 100%);
@@ -5106,10 +5245,17 @@
5106
5245
  display: flex;
5107
5246
  flex-direction: column;
5108
5247
  margin: 1px 0;
5248
+ width: 100%;
5249
+ max-width: var(--chat-card-max-width, 720px);
5250
+ box-sizing: border-box;
5109
5251
  border-radius: var(--radius-xs);
5110
5252
  cursor: pointer;
5111
5253
  transition: background 0.16s ease;
5112
5254
  }
5255
+ /* 嵌套在 tool-group-body 里的 inline-tool 撑满父容器即可(父已经限宽) */
5256
+ .tool-group-body > .inline-tool {
5257
+ max-width: 100%;
5258
+ }
5113
5259
  .inline-tool-row {
5114
5260
  display: flex;
5115
5261
  align-items: center;
@@ -5293,6 +5439,9 @@
5293
5439
  ────────────────────────────────────────────────────────────── */
5294
5440
  .inline-terminal {
5295
5441
  margin: 4px 0;
5442
+ width: 100%;
5443
+ max-width: var(--chat-card-max-width, 720px);
5444
+ box-sizing: border-box;
5296
5445
  border: 1px solid rgba(15, 12, 9, 0.6);
5297
5446
  border-radius: var(--radius-sm);
5298
5447
  background: #1f1b17;
@@ -5453,6 +5602,9 @@
5453
5602
  ────────────────────────────────────────────────────────────── */
5454
5603
  .inline-diff {
5455
5604
  margin: 4px 0;
5605
+ width: 100%;
5606
+ max-width: var(--chat-card-max-width, 720px);
5607
+ box-sizing: border-box;
5456
5608
  border: 1px solid var(--border-subtle);
5457
5609
  border-radius: var(--radius-sm);
5458
5610
  overflow: hidden;
@@ -5677,15 +5829,39 @@
5677
5829
  }
5678
5830
 
5679
5831
  /* Markdown Content */
5680
- .markdown-content { color: inherit; white-space: normal; overflow-x: hidden; }
5681
- .markdown-content .code-block pre { overflow-x: auto; }
5682
- .markdown-content p { margin: 0 0 8px 0; }
5832
+ /* min-width:0 让该 flex 子项可以在窄屏下收缩到比内容更窄;
5833
+ overflow-wrap: anywhere + word-break: break-word 兜底超长不可断词(长 URL / 长 ID / 长 token)。 */
5834
+ .markdown-content {
5835
+ color: inherit;
5836
+ white-space: normal;
5837
+ overflow-x: hidden;
5838
+ max-width: 100%;
5839
+ min-width: 0;
5840
+ overflow-wrap: anywhere;
5841
+ word-break: break-word;
5842
+ }
5843
+ /* 代码块:长行强制 wrap,不出现横向滚动条。代码块在窄屏下也保持在
5844
+ 可视范围内,用户不需要拖横滚条才能看到右侧内容。 */
5845
+ .markdown-content .code-block pre {
5846
+ overflow-x: hidden;
5847
+ white-space: pre-wrap;
5848
+ word-break: break-word;
5849
+ overflow-wrap: anywhere;
5850
+ max-width: 100%;
5851
+ min-width: 0;
5852
+ }
5853
+ .markdown-content p { margin: 0 0 8px 0; overflow-wrap: anywhere; word-break: break-word; }
5683
5854
  .markdown-content p:last-child { margin-bottom: 0; }
5684
5855
  .markdown-content strong { font-weight: 600; }
5685
5856
  .markdown-content em { font-style: italic; }
5686
5857
  .markdown-content ul, .markdown-content ol { margin: 8px 0; padding-left: 20px; }
5687
- .markdown-content li { margin: 4px 0; }
5688
- .markdown-content h1, .markdown-content h2, .markdown-content h3 { margin: 16px 0 8px 0; font-weight: 600; }
5858
+ .markdown-content li { margin: 4px 0; overflow-wrap: anywhere; word-break: break-word; }
5859
+ .markdown-content h1, .markdown-content h2, .markdown-content h3 {
5860
+ margin: 16px 0 8px 0;
5861
+ font-weight: 600;
5862
+ overflow-wrap: anywhere;
5863
+ word-break: break-word;
5864
+ }
5689
5865
  .markdown-content h1 { font-size: 1.25rem; }
5690
5866
  .markdown-content h2 { font-size: 1.1rem; }
5691
5867
  .markdown-content h3 { font-size: 1rem; }
@@ -5695,6 +5871,16 @@
5695
5871
  border-left: 3px solid var(--accent);
5696
5872
  background: rgba(197, 101, 61, 0.06);
5697
5873
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
5874
+ overflow-wrap: anywhere;
5875
+ word-break: break-word;
5876
+ }
5877
+ .markdown-content a {
5878
+ overflow-wrap: anywhere;
5879
+ word-break: break-all;
5880
+ }
5881
+ .markdown-content img {
5882
+ max-width: 100%;
5883
+ height: auto;
5698
5884
  }
5699
5885
  .markdown-content code:not(.code-block):not(.code-inline) {
5700
5886
  font-family: var(--font-mono);
@@ -5702,6 +5888,8 @@
5702
5888
  background: rgba(150, 118, 85, 0.12);
5703
5889
  padding: 2px 5px;
5704
5890
  border-radius: 4px;
5891
+ overflow-wrap: anywhere;
5892
+ word-break: break-all;
5705
5893
  }
5706
5894
 
5707
5895
  .markdown-content code.code-inline {
@@ -5710,6 +5898,8 @@
5710
5898
  background: rgba(150, 118, 85, 0.12);
5711
5899
  padding: 2px 5px;
5712
5900
  border-radius: 4px;
5901
+ overflow-wrap: anywhere;
5902
+ word-break: break-all;
5713
5903
  }
5714
5904
  .markdown-content .md-table-wrap {
5715
5905
  margin: 12px 0;
@@ -5721,6 +5911,7 @@
5721
5911
  .markdown-content .md-table {
5722
5912
  border-collapse: collapse;
5723
5913
  width: 100%;
5914
+ table-layout: fixed;
5724
5915
  font-size: 0.8125rem;
5725
5916
  white-space: normal;
5726
5917
  }
@@ -5730,6 +5921,8 @@
5730
5921
  padding: 6px 10px;
5731
5922
  text-align: left;
5732
5923
  vertical-align: top;
5924
+ overflow-wrap: anywhere;
5925
+ word-break: break-word;
5733
5926
  }
5734
5927
  .markdown-content .md-table th {
5735
5928
  background: rgba(150, 118, 85, 0.1);
@@ -5790,7 +5983,12 @@
5790
5983
  .markdown-content pre {
5791
5984
  margin: 0;
5792
5985
  padding: 12px;
5793
- overflow-x: auto;
5986
+ overflow-x: hidden;
5987
+ white-space: pre-wrap;
5988
+ word-break: break-word;
5989
+ overflow-wrap: anywhere;
5990
+ max-width: 100%;
5991
+ min-width: 0;
5794
5992
  }
5795
5993
  .markdown-content pre code {
5796
5994
  font-family: var(--font-mono);
@@ -5799,6 +5997,8 @@
5799
5997
  color: #f5eadc;
5800
5998
  background: transparent;
5801
5999
  padding: 0;
6000
+ max-width: 100%;
6001
+ display: block;
5802
6002
  }
5803
6003
 
5804
6004
  /* Syntax Highlighting */
@@ -5842,15 +6042,110 @@
5842
6042
  align-items: center;
5843
6043
  justify-content: space-between;
5844
6044
  padding: 2px 4px 3px 6px;
5845
- gap: 4px;
6045
+ gap: 3px;
5846
6046
  }
5847
6047
  .input-composer-left {
5848
6048
  display: flex;
5849
6049
  align-items: center;
5850
- gap: 4px;
6050
+ gap: 3px;
5851
6051
  flex-wrap: nowrap;
5852
6052
  flex-shrink: 0;
6053
+ min-width: 0;
6054
+ }
6055
+ /* 会话设置三件套 (mode / model / thinking) 的容器 —— 用极轻的内描边视觉地
6056
+ 把三颗"新会话/会话级配置 pill"框成一个 segmented control,与右侧
6057
+ 开关型 chip (自动批准 / 终端交互) 在认知上分层。 */
6058
+ .composer-pill-group {
6059
+ display: inline-flex;
6060
+ align-items: center;
6061
+ gap: 2px;
6062
+ padding: 1px;
6063
+ border-radius: 11px;
6064
+ background: rgba(197, 101, 61, 0.05);
6065
+ box-shadow: inset 0 0 0 1px rgba(197, 101, 61, 0.08);
6066
+ min-width: 0;
6067
+ }
6068
+ .composer-pill-group .composer-pill {
6069
+ border-color: transparent;
6070
+ background: transparent;
6071
+ }
6072
+ .composer-pill-group .composer-pill:hover {
6073
+ border-color: var(--accent);
6074
+ background-color: rgba(255, 255, 255, 0.75);
6075
+ }
6076
+ .composer-pill-group .composer-pill:focus,
6077
+ .composer-pill-group .composer-pill:focus-visible,
6078
+ .composer-pill-group .composer-pill:focus-within {
6079
+ border-color: var(--accent);
6080
+ background-color: rgba(255, 255, 255, 0.9);
6081
+ }
6082
+
6083
+ /* 三件套(Mode / Model / Thinking)扁平文字版:
6084
+ 去掉边框 / 背景 / chevron,只留纯文字 + · 分隔。点击文字区域弹出原生
6085
+ <select>(桌面端下拉、移动端滚轮选择),由透明的 .composer-text-hidden-select
6086
+ 叠层承载交互。显示文本统一用 raw id(default / claude-sonnet-4-5 / standard…)。 */
6087
+ .composer-text-group {
6088
+ display: inline-flex;
6089
+ align-items: center;
6090
+ gap: 4px;
6091
+ min-width: 0;
6092
+ flex-wrap: nowrap;
6093
+ }
6094
+ .composer-text-pill {
6095
+ position: relative;
6096
+ font-family: var(--font-sans);
6097
+ font-size: 0.7rem;
6098
+ font-weight: 500;
6099
+ line-height: 1;
6100
+ padding: 2px 2px;
6101
+ color: var(--text-secondary);
6102
+ cursor: pointer;
6103
+ transition: color var(--transition-fast);
6104
+ display: inline-flex;
6105
+ align-items: center;
6106
+ justify-content: center;
6107
+ white-space: nowrap;
6108
+ box-sizing: border-box;
6109
+ user-select: none;
6110
+ max-width: 110px;
6111
+ letter-spacing: 0.01em;
6112
+ }
6113
+ .composer-text-pill:hover,
6114
+ .composer-text-pill:focus-within {
6115
+ color: var(--accent);
6116
+ }
6117
+ .composer-text-label {
6118
+ overflow: hidden;
6119
+ text-overflow: ellipsis;
6120
+ max-width: 100%;
5853
6121
  }
6122
+ .composer-text-hidden-select {
6123
+ position: absolute;
6124
+ inset: 0;
6125
+ width: 100%;
6126
+ height: 100%;
6127
+ margin: 0;
6128
+ padding: 0;
6129
+ border: 0;
6130
+ background: transparent;
6131
+ color: transparent;
6132
+ font: inherit;
6133
+ opacity: 0;
6134
+ cursor: pointer;
6135
+ appearance: none;
6136
+ -webkit-appearance: none;
6137
+ }
6138
+ .composer-text-hidden-select:focus { outline: none; }
6139
+ .composer-text-sep {
6140
+ color: var(--text-tertiary, #b5a89a);
6141
+ font-size: 0.7rem;
6142
+ line-height: 1;
6143
+ user-select: none;
6144
+ pointer-events: none;
6145
+ opacity: 0.65;
6146
+ }
6147
+ .chat-model-text-pill { max-width: 110px; }
6148
+ .chat-thinking-text-pill { max-width: 90px; }
5854
6149
 
5855
6150
  /* Permission actions inline in composer bar */
5856
6151
  .permission-actions {
@@ -5913,28 +6208,16 @@
5913
6208
  to { opacity: 1; transform: translateX(0); }
5914
6209
  }
5915
6210
 
5916
- /* Auto-approve indicator */
5917
- .auto-approve-indicator {
5918
- display: inline-flex;
5919
- align-items: center;
5920
- gap: 2px;
5921
- font-size: 0.65rem;
5922
- color: var(--muted);
5923
- cursor: pointer;
5924
- padding: 1px 4px;
5925
- border-radius: 4px;
5926
- transition: color 0.15s, background 0.15s;
5927
- user-select: none;
5928
- white-space: nowrap;
5929
- }
5930
- .auto-approve-indicator:hover {
5931
- background: rgba(255, 255, 255, 0.06);
5932
- }
6211
+ /* 自动批准 chip —— 套用 .composer-pill .composer-pill-chip 的基础外观,
6212
+ 这里只覆盖 active 态的绿色(语义色)。 */
5933
6213
  .auto-approve-indicator.active {
5934
6214
  color: #22c55e;
6215
+ border-color: rgba(34, 197, 94, 0.5);
6216
+ background: rgba(34, 197, 94, 0.12);
5935
6217
  }
5936
6218
  .auto-approve-indicator.active:hover {
5937
- background: rgba(34, 197, 94, 0.1);
6219
+ background: rgba(34, 197, 94, 0.2);
6220
+ border-color: #22c55e;
5938
6221
  }
5939
6222
 
5940
6223
  /* Approval stats badge */
@@ -5947,24 +6230,27 @@
5947
6230
  display: none;
5948
6231
  }
5949
6232
  .approval-stats-divider {
5950
- width: 1px;
6233
+ /* 同行已经全部用 .composer-pill 的统一 gap (3px) 分隔,再加一条 1px 实线分隔
6234
+ 反而显得拥挤。仅保留极细的 spacer 让 stats badge 与左侧 chip 不黏连。 */
6235
+ width: 0;
5951
6236
  height: 16px;
5952
- background: var(--border);
5953
- margin: 0 4px 0 2px;
6237
+ margin: 0 1px;
5954
6238
  }
5955
6239
  .approval-stats-badge {
5956
6240
  display: inline-flex;
5957
6241
  align-items: center;
5958
6242
  gap: 3px;
5959
- padding: 1px 7px 1px 5px;
6243
+ min-height: 22px;
6244
+ padding: 1px 8px;
5960
6245
  border-radius: 10px;
5961
6246
  background: rgba(34, 197, 94, 0.1);
5962
6247
  color: #22c55e;
5963
- font-size: 0.68rem;
6248
+ font-size: 0.625rem;
5964
6249
  font-weight: 600;
5965
6250
  cursor: default;
5966
6251
  transition: background 0.15s;
5967
- line-height: 1.5;
6252
+ line-height: 1;
6253
+ box-sizing: border-box;
5968
6254
  }
5969
6255
  .approval-stats-badge:hover {
5970
6256
  background: rgba(34, 197, 94, 0.18);
@@ -6028,103 +6314,463 @@
6028
6314
  .approval-stats-row-label {
6029
6315
  flex: 1;
6030
6316
  }
6031
- .approval-stats-row-count {
6032
- font-weight: 600;
6033
- color: var(--text-primary, #eee);
6034
- font-variant-numeric: tabular-nums;
6035
- min-width: 20px;
6036
- text-align: right;
6317
+ .approval-stats-row-count {
6318
+ font-weight: 600;
6319
+ color: var(--text-primary, #eee);
6320
+ font-variant-numeric: tabular-nums;
6321
+ min-width: 20px;
6322
+ text-align: right;
6323
+ }
6324
+ .approval-stats-row-total {
6325
+ border-top: 1px solid var(--border);
6326
+ padding-top: 4px;
6327
+ margin-top: 2px;
6328
+ color: #22c55e;
6329
+ }
6330
+ .approval-stats-row-total .approval-stats-row-count {
6331
+ color: #22c55e;
6332
+ }
6333
+
6334
+ /* 终端交互切换按钮 —— 现在套用 .composer-pill .composer-pill-chip 的统一外观,
6335
+ 这里仅保留图标专属的微调(字体大小 / 收紧 padding 让 ⌨ 居中)。 */
6336
+ .composer-interactive-toggle {
6337
+ font-size: 0.75rem;
6338
+ padding: 1px 8px;
6339
+ }
6340
+ .input-composer-right {
6341
+ display: flex;
6342
+ align-items: center;
6343
+ gap: 4px;
6344
+ position: relative;
6345
+ flex: 1;
6346
+ justify-content: flex-end;
6347
+ }
6348
+ /* 旧 #queue-counter pill(v1.30.3 那颗藏在 input-hint 旁的小角标)已下线,
6349
+ 由 .queue-bar(输入框上方独立浮条)接管。queuePulse / queueDotPulse 关键帧
6350
+ 新组件继续复用,保留在下方。 */
6351
+ @keyframes queuePulse {
6352
+ 0%, 100% { opacity: 1; }
6353
+ 50% { opacity: 0.78; }
6354
+ }
6355
+ @keyframes queueDotPulse {
6356
+ 0%, 100% { transform: scale(1); opacity: 1; }
6357
+ 50% { transform: scale(0.7); opacity: 0.55; }
6358
+ }
6359
+
6360
+ /* ─────────────────────────────────────────────────────────────────────
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 翻转。
6369
+ ───────────────────────────────────────────────────────────────────── */
6370
+ .queue-bar-host {
6371
+ display: flex;
6372
+ justify-content: flex-end;
6373
+ padding: 0 6px 6px;
6374
+ position: relative;
6375
+ z-index: 2;
6376
+ pointer-events: none; /* host 自身不挡点击,bar 内子节点 auto */
6377
+ }
6378
+ .queue-bar-host[hidden] { display: none; }
6379
+
6380
+ .queue-bar {
6381
+ pointer-events: auto;
6382
+ 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);
6397
+ animation: queueBarEnter 220ms ease-out both;
6398
+ }
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
+ @keyframes queueBarEnter {
6416
+ from { opacity: 0; transform: translateY(4px) scale(0.98); }
6417
+ to { opacity: 1; transform: translateY(0) scale(1); }
6418
+ }
6419
+
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
+ .queue-bar-list {
6592
+ list-style: none;
6593
+ margin: 0;
6594
+ padding: 6px;
6595
+ display: flex;
6596
+ flex-direction: column;
6597
+ gap: 6px;
6598
+ overflow-y: auto;
6599
+ overscroll-behavior: contain;
6600
+ flex: 1 1 auto;
6601
+ min-height: 0;
6602
+ }
6603
+
6604
+ .queue-bar-item {
6605
+ 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;
6612
+ position: relative;
6613
+ transition: transform 140ms ease-out, box-shadow var(--transition-fast),
6614
+ background var(--transition-fast), border-color var(--transition-fast);
6615
+ will-change: transform;
6616
+ }
6617
+ .queue-bar-item:hover {
6618
+ background: rgba(255, 251, 245, 0.92);
6619
+ border-color: var(--border-default);
6037
6620
  }
6038
- .approval-stats-row-total {
6039
- border-top: 1px solid var(--border);
6040
- padding-top: 4px;
6041
- margin-top: 2px;
6042
- color: #22c55e;
6621
+ .queue-bar-item.dragging {
6622
+ z-index: 5;
6623
+ box-shadow: var(--shadow-lg), 0 0 0 1.5px var(--accent);
6624
+ background: var(--bg-elevated);
6625
+ transition: box-shadow var(--transition-fast); /* dragging 期间禁用 transform 过渡 */
6626
+ cursor: grabbing;
6043
6627
  }
6044
- .approval-stats-row-total .approval-stats-row-count {
6045
- color: #22c55e;
6628
+ .queue-bar-item-sliding {
6629
+ transition: transform 140ms ease-out;
6046
6630
  }
6047
6631
 
6048
- .composer-interactive-toggle {
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;
6049
6641
  display: inline-flex;
6050
6642
  align-items: center;
6051
6643
  justify-content: center;
6052
- width: 22px;
6053
- height: 22px;
6054
- border: 1px solid var(--border-subtle);
6055
6644
  border-radius: 4px;
6056
- background: transparent;
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 {
6057
6655
  color: var(--text-muted);
6058
- font-size: 0.75rem;
6059
- cursor: pointer;
6060
- transition: all var(--transition-fast);
6656
+ background: transparent;
6657
+ }
6658
+
6659
+ .queue-bar-item-index {
6061
6660
  flex-shrink: 0;
6062
- padding: 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;
6671
+ text-align: center;
6063
6672
  }
6064
- .composer-interactive-toggle:hover {
6065
- background: rgba(197, 101, 61, 0.08);
6066
- color: var(--text-secondary);
6067
- border-color: var(--accent);
6673
+
6674
+ .queue-bar-item-text {
6675
+ flex: 1 1 auto;
6676
+ 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;
6689
+ overflow: hidden;
6690
+ white-space: pre-wrap;
6691
+ word-break: break-word;
6692
+ transition: color var(--transition-fast);
6068
6693
  }
6069
- .composer-interactive-toggle.active {
6070
- background: rgba(197, 101, 61, 0.12);
6071
- color: var(--accent);
6072
- border-color: var(--accent);
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;
6073
6699
  }
6074
- .input-composer-right {
6075
- display: flex;
6700
+ .queue-bar-item-text:hover { color: var(--accent); }
6701
+
6702
+ .queue-bar-item-delete {
6703
+ flex-shrink: 0;
6704
+ width: 22px;
6705
+ height: 22px;
6706
+ border: none;
6707
+ background: transparent;
6708
+ cursor: pointer;
6709
+ color: var(--text-muted);
6710
+ border-radius: 6px;
6711
+ display: inline-flex;
6076
6712
  align-items: center;
6077
- gap: 4px;
6078
- position: relative;
6079
- flex: 1;
6080
- justify-content: flex-end;
6713
+ justify-content: center;
6714
+ opacity: 0;
6715
+ transition: opacity var(--transition-fast), color var(--transition-fast),
6716
+ background var(--transition-fast);
6081
6717
  }
6082
- .queue-counter {
6083
- font-size: 0.625rem;
6084
- color: var(--accent);
6085
- background: var(--accent-muted);
6086
- padding: 1px 6px;
6087
- border-radius: 8px;
6088
- white-space: nowrap;
6089
- font-weight: 600;
6090
- animation: queuePulse 1.5s ease-in-out infinite;
6718
+ .queue-bar-item:hover .queue-bar-item-delete,
6719
+ .queue-bar-item:focus-within .queue-bar-item-delete {
6720
+ opacity: 1;
6091
6721
  }
6092
- .queue-counter.hidden { display: none; }
6093
- @keyframes queuePulse {
6094
- 0%, 100% { opacity: 1; }
6095
- 50% { opacity: 0.7; }
6722
+ .queue-bar-item-delete:hover {
6723
+ color: var(--danger);
6724
+ background: var(--danger-muted);
6725
+ }
6726
+
6727
+ /* 窄屏:bar 撑满,preview 隐藏,操作按钮始终显形 */
6728
+ @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; }
6096
6735
  }
6097
6736
 
6098
- /* Queued message in chat view */
6737
+ /* Queued message in chat view:用户最容易"觉得排队没生效"是因为旧版徽章太小。
6738
+ 把气泡本身做出明显的"半成稿"质感(虚线边框 + 错位阴影),徽章放大到正常字号,
6739
+ 让排队这件事在视觉上和"已发出"清楚拉开。 */
6099
6740
  .chat-message.user.queued {
6100
- opacity: 0.7;
6741
+ opacity: 0.92;
6101
6742
  }
6102
6743
  .chat-message.user.queued .chat-message-bubble,
6103
6744
  .chat-message.user.queued .chat-message-content {
6104
- /* 排队气泡用虚线边框 + 浅浅的阴影,让"未发送"状态有触感 */
6105
- box-shadow: 0 0 0 1px rgba(197, 101, 61, 0.25) inset;
6745
+ box-shadow: 0 0 0 1.5px rgba(197, 101, 61, 0.55) inset,
6746
+ 0 1px 0 rgba(197, 101, 61, 0.10);
6747
+ background: linear-gradient(180deg, rgba(255, 245, 235, 0.85) 0%, rgba(255, 235, 220, 0.65) 100%);
6748
+ border-radius: 14px;
6749
+ position: relative;
6106
6750
  }
6107
6751
  .queued-badge {
6108
6752
  display: inline-flex;
6109
6753
  align-items: center;
6110
- gap: 4px;
6111
- font-size: 0.625rem;
6112
- color: var(--accent);
6113
- background: var(--accent-muted);
6114
- padding: 2px 8px;
6754
+ gap: 5px;
6755
+ font-size: 0.75rem;
6756
+ color: #fff;
6757
+ background: linear-gradient(180deg, var(--accent) 0%, #a8522f 100%);
6758
+ padding: 3px 10px 3px 9px;
6115
6759
  border-radius: 999px;
6116
6760
  font-weight: 600;
6117
6761
  margin-top: 6px;
6118
6762
  letter-spacing: 0.04em;
6763
+ box-shadow: 0 2px 6px rgba(197, 101, 61, 0.30);
6119
6764
  animation: queuePulse 1.5s ease-in-out infinite;
6120
6765
  }
6121
6766
  .queued-badge::before {
6122
6767
  content: '';
6123
- width: 6px;
6124
- height: 6px;
6768
+ width: 7px;
6769
+ height: 7px;
6125
6770
  border-radius: 50%;
6126
- background: var(--accent);
6127
- animation: queuePulse 1.5s ease-in-out infinite;
6771
+ background: #fff;
6772
+ box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.45);
6773
+ animation: queueDotPulse 1.0s ease-in-out infinite;
6128
6774
  }
6129
6775
 
6130
6776
  .input-hint {
@@ -6831,36 +7477,125 @@
6831
7477
  .input-inline-controls {
6832
7478
  }
6833
7479
 
6834
- /* Chat mode select pill */
6835
- .chat-mode-select {
7480
+ /* ========================================================================
7481
+ 输入框统一 pill 系统 —— 模式 / 模型 / 思考 / 自动批准 / 终端交互
7482
+ 全部用同一套尺寸 / 字号 / 边框 / hover / focus 表现,避免视觉混乱。
7483
+ 变体:
7484
+ .composer-pill-select → 原生 <select> 形态(右侧 chevron)
7485
+ .composer-pill-chip → 按钮 / 切换状态的 chip(支持 .active 亮态)
7486
+ 现有 .chat-mode-select / .auto-approve-indicator / .composer-interactive-toggle
7487
+ 仍保留作为特定色彩或最大宽度等微调入口。
7488
+ ====================================================================== */
7489
+ .composer-pill {
6836
7490
  font-family: var(--font-sans);
6837
7491
  font-size: 0.625rem;
6838
7492
  font-weight: 500;
6839
- padding: 1px 16px 1px 6px;
7493
+ line-height: 1;
7494
+ min-height: 22px;
7495
+ padding: 1px 8px;
6840
7496
  border-radius: 10px;
6841
7497
  border: 1px solid var(--border-subtle);
6842
7498
  background: rgba(246, 241, 232, 0.7);
6843
7499
  color: var(--text-secondary);
6844
7500
  cursor: pointer;
6845
7501
  transition: all var(--transition-fast);
6846
- min-height: 22px;
6847
- max-width: 90px;
7502
+ display: inline-flex;
7503
+ align-items: center;
7504
+ justify-content: center;
7505
+ gap: 4px;
7506
+ white-space: nowrap;
7507
+ box-sizing: border-box;
7508
+ user-select: none;
7509
+ }
7510
+ .composer-pill:hover {
7511
+ border-color: var(--accent);
7512
+ background-color: rgba(246, 241, 232, 1);
7513
+ }
7514
+ .composer-pill:focus,
7515
+ .composer-pill:focus-visible {
7516
+ border-color: var(--accent);
7517
+ box-shadow: 0 0 0 2px var(--accent-muted);
7518
+ outline: none;
7519
+ }
7520
+ .composer-pill.disabled,
7521
+ .composer-pill[disabled] {
7522
+ opacity: 0.55;
7523
+ cursor: not-allowed;
7524
+ }
7525
+
7526
+ /* select 变体:保留 chevron 背景图与文本截断 */
7527
+ .composer-pill-select {
7528
+ padding: 1px 16px 1px 6px;
7529
+ max-width: 110px;
6848
7530
  overflow: hidden;
6849
7531
  text-overflow: ellipsis;
6850
- white-space: nowrap;
6851
7532
  appearance: none;
6852
7533
  -webkit-appearance: none;
6853
7534
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5' fill='none'%3E%3Cpath d='M1 1l3 3 3-3' stroke='%239a8e82' stroke-width='1.2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
6854
7535
  background-repeat: no-repeat;
6855
7536
  background-position: right 4px center;
7537
+ /* 让 native <select> 在 inline-flex 下表现稳定 */
7538
+ display: inline-block;
7539
+ text-align: left;
6856
7540
  }
6857
- .chat-mode-select:hover {
6858
- border-color: var(--accent);
6859
- background-color: rgba(246, 241, 232, 1);
7541
+
7542
+ /* chip 变体:开关型按钮 / span,无 chevron,可亮态。
7543
+ 字号与 select pill 对齐 (0.625rem),避免同行字号微差。 */
7544
+ .composer-pill-chip {
7545
+ padding: 1px 8px;
7546
+ font-size: 0.625rem;
6860
7547
  }
6861
- .chat-mode-select:focus {
7548
+ .composer-pill-chip.active {
7549
+ background: var(--accent-muted, rgba(197, 101, 61, 0.12));
7550
+ color: var(--accent);
6862
7551
  border-color: var(--accent);
6863
- box-shadow: 0 0 0 2px var(--accent-muted);
7552
+ }
7553
+ .composer-pill-chip.active:hover {
7554
+ background: rgba(197, 101, 61, 0.18);
7555
+ }
7556
+
7557
+ /* 兼容旧类:保留为 alias,仅用于细节微调(如最大宽度) */
7558
+ .chat-mode-select {
7559
+ /* 旧标识,沿用 .composer-pill / .composer-pill-select 的基础风格 */
7560
+ max-width: 78px;
7561
+ }
7562
+ .chat-model-select {
7563
+ max-width: 96px;
7564
+ }
7565
+ .chat-thinking-select {
7566
+ max-width: 86px;
7567
+ }
7568
+
7569
+ /* 思考深度 trigger —— 与 mode / model 同形 pill:相同 border / chevron / 字号。
7570
+ 内部 .chat-thinking-label 显示当前档位,原生 <select> 透明叠层负责交互,
7571
+ 移动端能调起系统滚轮选择,桌面端点击则展开原生菜单。 */
7572
+ .chat-thinking-trigger {
7573
+ position: relative;
7574
+ max-width: 86px;
7575
+ padding-left: 6px;
7576
+ }
7577
+ .chat-thinking-label {
7578
+ overflow: hidden;
7579
+ text-overflow: ellipsis;
7580
+ letter-spacing: 0.01em;
7581
+ }
7582
+ .chat-thinking-hidden-select {
7583
+ position: absolute;
7584
+ inset: 0;
7585
+ width: 100%;
7586
+ height: 100%;
7587
+ margin: 0;
7588
+ padding: 0;
7589
+ border: 0;
7590
+ background: transparent;
7591
+ color: transparent;
7592
+ font: inherit;
7593
+ opacity: 0;
7594
+ cursor: pointer;
7595
+ appearance: none;
7596
+ -webkit-appearance: none;
7597
+ }
7598
+ .chat-thinking-hidden-select:focus {
6864
7599
  outline: none;
6865
7600
  }
6866
7601
 
@@ -6917,25 +7652,66 @@
6917
7652
  }
6918
7653
 
6919
7654
  /* "立即发送":结构化会话流式输出时显示,按下会中断当前回复立即处理新输入。
6920
- 视觉上比 send 弱、比 stop 弱,避免被误点;和 send 之间留一点空气。 */
6921
- .btn-circle-interrupt {
6922
- background: rgba(160, 110, 60, 0.10);
7655
+ v1.30.3 把它做成 28px 圆形 + dashed 边框,结果用户根本注意不到这颗按钮、
7656
+ 误以为"立即发送没效果"。现在升级成 pill(图标 + "立即"文字 + 实色高对比 + 脉动),
7657
+ send 按钮形成"加急/默认"的视觉对位。 */
7658
+ .btn-pill {
7659
+ display: inline-flex;
7660
+ align-items: center;
7661
+ gap: 4px;
7662
+ height: 28px;
7663
+ padding: 0 10px 0 8px;
7664
+ border-radius: 999px;
7665
+ border: none;
7666
+ cursor: pointer;
7667
+ transition: all var(--transition-fast);
7668
+ flex-shrink: 0;
7669
+ font-size: 0.6875rem;
7670
+ font-weight: 600;
7671
+ letter-spacing: 0.02em;
7672
+ white-space: nowrap;
7673
+ }
7674
+ .btn-pill-icon {
7675
+ display: block;
7676
+ flex-shrink: 0;
7677
+ }
7678
+ .btn-pill-label {
7679
+ display: inline;
7680
+ }
7681
+ .btn-pill-interrupt {
7682
+ background: linear-gradient(180deg, rgba(197, 101, 61, 0.18) 0%, rgba(197, 101, 61, 0.10) 100%);
6923
7683
  color: var(--accent);
6924
- margin-right: 2px;
6925
- border: 1px dashed rgba(197, 101, 61, 0.35);
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;
6926
7687
  }
6927
- .btn-circle-interrupt:hover {
6928
- background: var(--accent);
6929
- color: white;
6930
- border-style: solid;
6931
- transform: scale(1.08);
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;
6932
7694
  }
6933
- .btn-circle-interrupt:active {
6934
- transform: scale(0.95);
7695
+ .btn-pill-interrupt:active {
7696
+ transform: translateY(0) scale(0.97);
6935
7697
  }
6936
- .btn-circle-interrupt.hidden {
7698
+ .btn-pill-interrupt.hidden {
6937
7699
  display: none;
6938
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
+ }
6939
7715
 
6940
7716
  /* send 按钮在「排队模式」下退到次要色,让相邻的"立即发送"成为视觉重点。
6941
7717
  不动尺寸 / 圆形,避免 layout shift。 */
@@ -9088,19 +9864,26 @@
9088
9864
 
9089
9865
  /* 平板适配 */
9090
9866
  @media (max-width: 768px) {
9867
+ /* 手机隐藏「固定侧栏」按钮:手机上完整 300px 常驻太占地,
9868
+ 只保留「收起为窄条」按钮,让用户能切到 56px 窄条形态。 */
9091
9869
  .sidebar-pin-toggle { display: none; }
9092
- .sidebar-collapse-toggle { display: none; }
9093
- .sidebar.pinned:not(.open) {
9870
+ /* drawer 模式(pinned 但非窄条)下若未打开,则隐藏到屏幕左侧。
9871
+ 窄条模式(pinned + collapsed)由 .sidebar.pinned.collapsed 的 width:56px
9872
+ 规则常驻显示,不进入这条隐藏分支。 */
9873
+ .sidebar.pinned:not(.collapsed):not(.open) {
9094
9874
  transform: translateX(-100%);
9095
9875
  pointer-events: none;
9096
9876
  opacity: 0;
9097
9877
  }
9098
- .main-layout.sidebar-pinned {
9878
+ /* 与上方对称:drawer 模式下取消 anchored padding;
9879
+ 窄条模式(.sidebar-pinned.sidebar-collapsed)继承全局 56px padding。 */
9880
+ .main-layout.sidebar-pinned:not(.sidebar-collapsed) {
9099
9881
  padding-left: 0;
9100
9882
  }
9101
- .main-layout.sidebar-pinned .floating-sidebar-toggle {
9102
- display: inline-flex;
9103
- }
9883
+ /* drawer 模式(未 anchored)默认就显示 hamburger(继承全局 inline-flex)。
9884
+ 窄条模式(.sidebar-pinned.sidebar-collapsed)由全局
9885
+ `.main-layout.sidebar-pinned .floating-sidebar-toggle{display:none}`
9886
+ 隐藏 hamburger,窄条自身就是入口。 */
9104
9887
  .app-container {
9105
9888
  --layout-main-file-panel-width: 0px;
9106
9889
  }
@@ -9116,7 +9899,7 @@
9116
9899
  .view-toggle { height: 36px; }
9117
9900
  .view-toggle-btn { padding: 0 12px; font-size: 0.75rem; height: 30px; min-height: 30px; }
9118
9901
  .chat-container { padding: 0 12px 12px; }
9119
- .chat-message { max-width: 90%; }
9902
+ .chat-message { max-width: 100%; }
9120
9903
  .thinking-card { padding: 10px 14px; }
9121
9904
  .thinking-content { font-size: 0.8125rem; }
9122
9905
  .tool-picker { grid-template-columns: 1fr; }
@@ -9176,9 +9959,34 @@
9176
9959
  .floating-sidebar-toggle .hamburger-icon { width: 13px; height: 9px; }
9177
9960
 
9178
9961
  .sidebar { top: 0; }
9179
- .sidebar-header { padding: 10px 12px; min-height: 48px; }
9180
- .sidebar-footer-actions { grid-template-columns: repeat(2, 1fr); }
9181
- .sidebar-footer-actions .btn { min-height: 40px; }
9962
+ .sidebar-header { padding: 10px 12px; min-height: 48px; gap: 8px; }
9963
+ /* 收紧 actions 内按钮间距,给主区(logo/标题/计数)腾空间 */
9964
+ .sidebar-header-actions { gap: 4px; }
9965
+ /* 5 个底栏按钮在 2 列布局下最后一颗会单独占满第三行,看着很挤。
9966
+ 手机端统一切到 4 列、隐藏文字、保留图标,更紧凑也对齐统一。 */
9967
+ .sidebar-footer-actions {
9968
+ grid-template-columns: repeat(4, 1fr);
9969
+ gap: 4px;
9970
+ }
9971
+ .sidebar-footer-actions .btn {
9972
+ min-height: 40px;
9973
+ padding: 6px 4px;
9974
+ }
9975
+ .sidebar-footer-actions .btn span { display: none; }
9976
+ .sidebar-footer-actions .btn svg { width: 18px; height: 18px; }
9977
+
9978
+ /* "更多操作"下拉:默认锚在更多按钮右沿向左展开 150px。手机端:
9979
+ · 加大 min-width 让中文项不会两行;
9980
+ · max-width 限制在可见区,防止极窄手机被裁;
9981
+ · 按钮在侧栏靠右,下拉自然贴侧栏右沿;用 right: 0 原值即可。 */
9982
+ .sidebar-header-overflow {
9983
+ min-width: 180px;
9984
+ max-width: calc(100vw - 24px);
9985
+ }
9986
+ .sidebar-header-overflow .overflow-item {
9987
+ padding: 11px 14px;
9988
+ font-size: 0.875rem;
9989
+ }
9182
9990
 
9183
9991
  /* 移动端终端顶栏 - 紧凑 */
9184
9992
  .terminal-header { padding: 5px 8px; min-height: 32px; }
@@ -9328,11 +10136,27 @@
9328
10136
 
9329
10137
  .input-composer-bar {
9330
10138
  padding: 1px 3px 2px 5px;
9331
- gap: 3px;
10139
+ gap: 2px;
9332
10140
  }
9333
10141
 
9334
- .input-composer-left { gap: 3px; }
10142
+ .input-composer-left { gap: 2px; }
9335
10143
  .input-composer-right { gap: 3px; }
10144
+ /* 移动端窄屏:进一步收紧 group 内边距,让 mode/model/thinking 三件套不占额外 padding */
10145
+ .input-composer-left .composer-pill-group {
10146
+ padding: 0;
10147
+ gap: 1px;
10148
+ background: transparent;
10149
+ box-shadow: none;
10150
+ }
10151
+ /* 移动端 chip 字号微缩,与新 desktop chip 0.625rem 对齐基础上再小一点 */
10152
+ .input-composer-left .composer-pill-chip {
10153
+ font-size: 0.6rem;
10154
+ padding: 1px 6px;
10155
+ }
10156
+ /* 移动端三件套 select 最大宽度同步收紧 */
10157
+ .input-composer-left .chat-mode-select { max-width: 64px; }
10158
+ .input-composer-left .chat-model-select { max-width: 78px; }
10159
+ .input-composer-left .chat-thinking-trigger { max-width: 72px; }
9336
10160
 
9337
10161
  /* 移动端会话信息栏 */
9338
10162
  .input-session-info-bar {
@@ -9814,6 +10638,26 @@
9814
10638
  }
9815
10639
  }
9816
10640
 
10641
+ /* ===== 手机竖屏(≤480px)—— 进一步收紧 chat 视图 padding,
10642
+ 并允许 tool-use 卡片头部 wrap,避免在极窄宽度下被裁切。 ===== */
10643
+ @media (max-width: 480px) {
10644
+ .chat-container { padding: 0 6px 8px; }
10645
+ .chat-messages { padding-left: 2px; padding-right: 2px; gap: 12px; }
10646
+ .chat-message { --chat-card-max-width: 100%; }
10647
+ .tool-use-header {
10648
+ flex-wrap: wrap;
10649
+ row-gap: 4px;
10650
+ padding: 8px 12px;
10651
+ }
10652
+ .tool-use-file { max-width: 100%; }
10653
+ .tool-use-body { padding: 10px 12px; }
10654
+ .subagent-reply { padding: 9px 12px; }
10655
+ .markdown-content .code-block { margin: 8px 0; }
10656
+ .markdown-content pre,
10657
+ .markdown-content .code-block pre,
10658
+ .subagent-reply pre { padding: 10px; }
10659
+ }
10660
+
9817
10661
  /* Blank chat mobile optimization */
9818
10662
  .session-kind-badge {
9819
10663
  display: inline-flex;
@@ -10116,12 +10960,13 @@
10116
10960
  align-items: center;
10117
10961
  gap: 6px;
10118
10962
  }
10963
+ /* 此处历史遗留的 .chat-mode-select 全局规则会覆盖上面 .composer-pill 的统一字号 / 边框,
10964
+ 已上移到 .composer-pill / .composer-pill-select 体系;这里只保留 outline / cursor 的兜底,
10965
+ 不再设置 font-size / max-width,避免和 6938 行的统一样式打架。 */
10119
10966
  .chat-mode-select {
10120
- font-size: 0.6875rem;
10121
10967
  font-family: inherit;
10122
10968
  cursor: pointer;
10123
10969
  outline: none;
10124
- max-width: 96px;
10125
10970
  }
10126
10971
  .chat-mode-select:focus {
10127
10972
  border-color: var(--accent);