@co0ontty/wand 0.3.0 → 0.4.0

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.
@@ -100,7 +100,6 @@
100
100
  /* ===== 布局尺寸 ===== */
101
101
  --sidebar-width: 300px;
102
102
  --file-panel-width: 320px;
103
- --topbar-height: 52px;
104
103
 
105
104
  /* ===== 高级缓动函数 ===== */
106
105
  --ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1);
@@ -121,6 +120,54 @@
121
120
  }
122
121
  }
123
122
 
123
+ /* ===== PWA 独立窗口模式 ===== */
124
+ @media (display-mode: standalone) {
125
+ .floating-sidebar-toggle {
126
+ top: max(10px, env(safe-area-inset-top, 10px));
127
+ }
128
+ .app-container {
129
+ --pwa-top-inset: env(safe-area-inset-top, 0px);
130
+ padding-top: env(safe-area-inset-top, 0px);
131
+ padding-bottom: env(safe-area-inset-bottom, 0px);
132
+ }
133
+ .sidebar-header {
134
+ padding-top: calc(14px + env(safe-area-inset-top, 0px));
135
+ }
136
+ .main-content {
137
+ padding-top: 0;
138
+ }
139
+ }
140
+
141
+ /* iOS Safari PWA fallback (navigator.standalone adds .is-pwa via JS) */
142
+ .is-pwa .floating-sidebar-toggle {
143
+ top: max(10px, env(safe-area-inset-top, 10px));
144
+ }
145
+ .is-pwa .app-container {
146
+ --pwa-top-inset: env(safe-area-inset-top, 0px);
147
+ padding-top: env(safe-area-inset-top, 0px);
148
+ padding-bottom: env(safe-area-inset-bottom, 0px);
149
+ }
150
+ .is-pwa .sidebar-header {
151
+ padding-top: calc(14px + env(safe-area-inset-top, 0px));
152
+ }
153
+
154
+ /* ===== PWA 窗口控件覆盖模式 (Window Controls Overlay) ===== */
155
+ @media (display-mode: window-controls-overlay) {
156
+ .floating-sidebar-toggle {
157
+ top: max(10px, env(titlebar-area-y, 10px));
158
+ left: max(10px, env(titlebar-area-x, 10px));
159
+ }
160
+ }
161
+
162
+ /* ===== 首帧过渡抑制 ===== */
163
+ html.no-transition,
164
+ html.no-transition *,
165
+ html.no-transition *::before,
166
+ html.no-transition *::after {
167
+ transition: none !important;
168
+ animation: none !important;
169
+ }
170
+
124
171
  /* ===== 全局重置 ===== */
125
172
  * { box-sizing: border-box; margin: 0; padding: 0; }
126
173
 
@@ -142,6 +189,8 @@
142
189
  color: var(--text-primary);
143
190
  min-height: 100vh;
144
191
  min-height: 100dvh;
192
+ height: 100vh;
193
+ height: 100dvh;
145
194
  line-height: var(--line-height-base);
146
195
  overflow: hidden;
147
196
  }
@@ -183,8 +232,6 @@
183
232
 
184
233
  /* ===== 应用容器 ===== */
185
234
  .app-container {
186
- --layout-topbar-height: var(--topbar-height);
187
- --layout-sidebar-offset: var(--layout-topbar-height);
188
235
  --layout-main-file-panel-width: var(--file-panel-width);
189
236
  display: flex;
190
237
  flex-direction: column;
@@ -195,107 +242,44 @@
195
242
  overflow: hidden;
196
243
  }
197
244
 
198
- /* ===== 顶栏组件 ===== */
199
- .topbar {
200
- display: flex;
201
- align-items: center;
202
- justify-content: space-between;
203
- gap: 12px;
204
- min-height: var(--topbar-height);
205
- padding: 0 16px;
206
- background: rgba(255, 251, 245, 0.85);
207
- border-bottom: 1px solid var(--border-subtle);
208
- backdrop-filter: blur(24px) saturate(180%);
209
- flex-shrink: 0;
210
- position: sticky;
211
- top: 0;
212
- z-index: 100;
213
- transition: border-color var(--transition-fast), background var(--transition-fast);
214
- }
215
-
216
- .topbar::before {
217
- content: '';
218
- position: absolute;
219
- top: 0;
220
- left: 0;
221
- right: 0;
222
- height: 1px;
223
- background: linear-gradient(90deg, transparent, rgba(197, 101, 61, 0.1), transparent);
224
- opacity: 0;
225
- transition: opacity var(--transition-fast);
226
- }
227
-
228
- .topbar:hover::before {
229
- opacity: 1;
230
- }
231
-
232
- /* ===== 顶栏左侧区域 ===== */
233
- .topbar-left {
234
- display: flex;
235
- align-items: center;
236
- gap: 8px;
237
- min-width: 0;
238
- }
239
-
240
- .topbar-logo {
241
- display: flex;
242
- align-items: center;
243
- gap: 8px;
244
- }
245
-
246
- .topbar-logo-icon {
247
- width: 28px;
248
- height: 28px;
249
- background: linear-gradient(145deg, #d4785a 0%, #b8573a 50%, #a04a2e 100%);
250
- border-radius: var(--radius-xs);
251
- display: flex;
252
- align-items: center;
253
- justify-content: center;
254
- font-size: 12px;
255
- color: white;
256
- font-weight: 800;
257
- box-shadow: 0 2px 8px rgba(184, 92, 55, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.2);
258
- letter-spacing: -0.02em;
259
- flex-shrink: 0;
260
- transition: transform var(--transition-fast), box-shadow var(--transition-fast);
261
- }
262
-
263
- .topbar-logo-icon:hover {
264
- transform: scale(1.05);
265
- box-shadow: 0 4px 12px rgba(184, 92, 55, 0.35), inset 0 1px 0 rgba(255, 255, 255, 0.25);
266
- }
267
-
268
- /* ===== 汉堡菜单按钮 ===== */
269
- .sidebar-toggle-btn {
270
- position: relative;
271
- width: 32px;
272
- height: 32px;
273
- padding: 0 !important;
245
+ /* ===== 浮动侧栏切换按钮 ===== */
246
+ .floating-sidebar-toggle {
247
+ position: fixed;
248
+ top: max(10px, env(safe-area-inset-top, 10px));
249
+ left: 10px;
250
+ z-index: 200;
251
+ width: 34px;
252
+ height: 34px;
253
+ padding: 0;
274
254
  display: flex;
275
255
  align-items: center;
276
256
  justify-content: center;
277
- background: transparent !important;
278
- border: none !important;
279
- border-radius: var(--radius-xs) !important;
257
+ background: rgba(255, 251, 245, 0.85);
258
+ border: 1px solid var(--border-subtle);
259
+ border-radius: var(--radius-sm);
280
260
  cursor: pointer;
261
+ backdrop-filter: blur(16px) saturate(180%);
262
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
281
263
  transition: all var(--transition-fast);
282
264
  }
283
265
 
284
- .sidebar-toggle-btn:hover {
285
- background: rgba(150, 118, 85, 0.08) !important;
266
+ .floating-sidebar-toggle:hover {
267
+ background: rgba(255, 251, 245, 0.95);
268
+ box-shadow: 0 3px 12px rgba(0, 0, 0, 0.1);
286
269
  }
287
270
 
288
- .sidebar-toggle-btn.active {
289
- background: rgba(197, 101, 61, 0.12) !important;
271
+ .floating-sidebar-toggle.active {
272
+ background: rgba(197, 101, 61, 0.1);
273
+ border-color: rgba(197, 101, 61, 0.2);
290
274
  }
291
275
 
292
- .sidebar-toggle-btn:active {
293
- transform: scale(0.95);
276
+ .floating-sidebar-toggle:active {
277
+ transform: scale(0.92);
294
278
  }
295
279
 
296
280
  .hamburger-icon {
297
- width: 18px;
298
- height: 14px;
281
+ width: 16px;
282
+ height: 12px;
299
283
  position: relative;
300
284
  display: flex;
301
285
  flex-direction: column;
@@ -308,188 +292,45 @@
308
292
  height: 2px;
309
293
  background: var(--text-secondary);
310
294
  border-radius: var(--radius-full);
311
- transition: transform 0.3s var(--ease-out-expo), opacity 0.2s ease, background 0.15s ease, width 0.2s ease;
295
+ transition: transform 0.3s var(--ease-out-expo), opacity 0.2s ease, background 0.15s ease;
312
296
  transform-origin: center;
313
297
  }
314
298
 
315
- .sidebar-toggle-btn:hover .hamburger-icon span {
299
+ .floating-sidebar-toggle:hover .hamburger-icon span {
316
300
  background: var(--text-primary);
317
301
  }
318
302
 
319
- .sidebar-toggle-btn.active .hamburger-icon span:nth-child(1) {
320
- transform: translateY(6px) rotate(45deg);
321
- width: 100%;
303
+ .floating-sidebar-toggle.active .hamburger-icon span:nth-child(1) {
304
+ transform: translateY(5px) rotate(45deg);
322
305
  }
323
306
 
324
- .sidebar-toggle-btn.active .hamburger-icon span:nth-child(2) {
307
+ .floating-sidebar-toggle.active .hamburger-icon span:nth-child(2) {
325
308
  opacity: 0;
326
309
  transform: scaleX(0);
327
- width: 100%;
328
310
  }
329
311
 
330
- .sidebar-toggle-btn.active .hamburger-icon span:nth-child(3) {
331
- transform: translateY(-6px) rotate(-45deg);
332
- width: 100%;
312
+ .floating-sidebar-toggle.active .hamburger-icon span:nth-child(3) {
313
+ transform: translateY(-5px) rotate(-45deg);
333
314
  }
334
315
 
335
- .status-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--text-muted); }
336
- .status-dot.active { background: var(--success); box-shadow: 0 0 8px var(--success); }
337
-
338
- /* Topbar center session title */
339
- .topbar-center {
340
- flex: 1;
341
- min-width: 0;
342
- display: flex;
343
- align-items: center;
344
- justify-content: center;
345
- gap: 8px;
346
- overflow: hidden;
347
- }
348
-
349
- .topbar-session-meta {
350
- min-width: 0;
316
+ .topbar-logo-icon {
317
+ width: 22px;
318
+ height: 22px;
319
+ background: linear-gradient(145deg, #d4785a 0%, #b8573a 50%, #a04a2e 100%);
320
+ border-radius: var(--radius-xs);
351
321
  display: flex;
352
322
  align-items: center;
353
323
  justify-content: center;
354
- gap: 8px;
355
- overflow: hidden;
356
- }
357
-
358
- .topbar-title {
359
- font-size: 0.75rem;
360
- font-weight: 600;
361
- color: var(--text-secondary);
362
- white-space: nowrap;
363
- overflow: hidden;
364
- text-overflow: ellipsis;
365
- max-width: 300px;
366
- font-family: var(--font-mono);
367
- }
368
-
369
- .topbar-terminal-info {
370
- flex-shrink: 0;
371
- white-space: nowrap;
372
- }
373
-
374
- .topbar-spacer {
375
- height: 6px;
376
- flex-shrink: 0;
377
- }
378
-
379
- @media (max-width: 768px) {
380
- .topbar-session-meta {
381
- max-width: 100%;
382
- }
383
-
384
- .topbar-terminal-info {
385
- font-size: 0.5625rem;
386
- }
387
- }
388
-
389
- @media (max-width: 640px) {
390
- .topbar-center {
391
- justify-content: flex-start;
392
- }
393
-
394
- .topbar-session-meta {
395
- justify-content: flex-start;
396
- gap: 6px;
397
- }
398
- }
399
-
400
- @media (max-width: 390px) {
401
- .topbar-terminal-info {
402
- display: none;
403
- }
404
- }
405
-
406
- .topbar-right {
407
- display: flex;
408
- align-items: center;
409
- gap: 4px;
410
- flex-shrink: 0;
411
- min-width: 0;
412
- }
413
-
414
- /* ===== 顶栏新建会话按钮 ===== */
415
- .topbar-new-btn {
416
- display: inline-flex;
417
- align-items: center;
418
- gap: 6px;
419
- font-family: var(--font-sans);
420
- font-size: 0.8125rem;
421
- font-weight: 600;
324
+ font-size: 10px;
422
325
  color: white;
423
- background: linear-gradient(135deg, var(--accent) 0%, #a95130 100%);
424
- border: none;
425
- border-radius: var(--radius-full);
426
- padding: 0 16px;
427
- height: 34px;
428
- cursor: pointer;
429
- transition: all 0.25s var(--ease-out-expo);
430
- box-shadow: 0 2px 8px rgba(197, 101, 61, 0.25), inset 0 1px 0 rgba(255, 255, 255, 0.15);
431
- white-space: nowrap;
432
- position: relative;
433
- overflow: hidden;
434
- }
435
-
436
- .topbar-new-btn::before {
437
- content: '';
438
- position: absolute;
439
- inset: 0;
440
- background: linear-gradient(135deg, rgba(255,255,255,0.2) 0%, transparent 50%);
441
- opacity: 0;
442
- transition: opacity 0.25s ease;
443
- }
444
-
445
- .topbar-new-btn::after {
446
- content: '';
447
- position: absolute;
448
- top: 50%;
449
- left: 50%;
450
- width: 0;
451
- height: 0;
452
- border-radius: 50%;
453
- background: rgba(255, 255, 255, 0.3);
454
- transform: translate(-50%, -50%);
455
- transition: width 0.6s ease, height 0.6s ease;
456
- }
457
-
458
- .topbar-new-btn:hover {
459
- background: linear-gradient(135deg, var(--accent-hover) 0%, #b85c37 100%);
460
- box-shadow: 0 4px 16px rgba(197, 101, 61, 0.35), inset 0 1px 0 rgba(255, 255, 255, 0.2);
461
- transform: translateY(-1px) scale(1.02);
462
- }
463
-
464
- .topbar-new-btn:hover::before {
465
- opacity: 1;
466
- }
467
-
468
- .topbar-new-btn:active {
469
- transform: translateY(0) scale(0.98);
470
- box-shadow: 0 2px 6px rgba(197, 101, 61, 0.2);
471
- }
472
-
473
- .topbar-new-btn:active::after {
474
- width: 200px;
475
- height: 200px;
476
- }
477
-
478
- .topbar-new-btn:focus-visible {
479
- outline: 2px solid var(--accent);
480
- outline-offset: 3px;
481
- }
482
-
483
- .topbar-new-btn svg {
484
- width: 14px;
485
- height: 14px;
326
+ font-weight: 800;
327
+ box-shadow: 0 1px 4px rgba(184, 92, 55, 0.25), inset 0 1px 0 rgba(255, 255, 255, 0.2);
328
+ letter-spacing: -0.02em;
486
329
  flex-shrink: 0;
487
- transition: transform 0.3s var(--ease-spring);
488
330
  }
489
331
 
490
- .topbar-new-btn:hover svg {
491
- transform: rotate(90deg) scale(1.1);
492
- }
332
+ .status-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--text-muted); }
333
+ .status-dot.active { background: var(--success); box-shadow: 0 0 8px var(--success); }
493
334
 
494
335
  .main-layout {
495
336
  display: flex;
@@ -499,14 +340,17 @@
499
340
  padding-left: 0;
500
341
  transition: padding-left var(--transition-normal);
501
342
  }
502
- .main-layout.sidebar-open {
503
- padding-left: min(var(--sidebar-width), calc(100vw - 20px));
343
+ /* .sidebar-open class toggled for semantic purposes only; sidebar overlays without resizing main layout */
344
+ .sidebar-open .input-panel {
345
+ opacity: 0;
346
+ pointer-events: none;
347
+ transition: opacity 0.2s ease;
504
348
  }
505
349
 
506
350
  /* ===== 抽屉背景遮罩 ===== */
507
351
  .drawer-backdrop {
508
352
  position: fixed;
509
- top: var(--layout-sidebar-offset);
353
+ top: 0;
510
354
  left: 0;
511
355
  right: 0;
512
356
  bottom: 0;
@@ -527,7 +371,7 @@
527
371
  /* ===== 侧边栏组件 ===== */
528
372
  .sidebar {
529
373
  position: fixed;
530
- top: var(--layout-sidebar-offset);
374
+ top: 0;
531
375
  left: 0;
532
376
  bottom: 0;
533
377
  z-index: 25;
@@ -574,6 +418,23 @@
574
418
  flex: 1;
575
419
  }
576
420
 
421
+ .sidebar-header-actions {
422
+ display: flex;
423
+ align-items: center;
424
+ gap: 4px;
425
+ flex-shrink: 0;
426
+ }
427
+
428
+ .sidebar-logout {
429
+ color: var(--text-muted);
430
+ opacity: 0.7;
431
+ transition: opacity var(--transition-fast), color var(--transition-fast);
432
+ }
433
+ .sidebar-logout:hover {
434
+ opacity: 1;
435
+ color: var(--text-secondary);
436
+ }
437
+
577
438
  .sidebar-title {
578
439
  font-size: 0.875rem;
579
440
  font-weight: 600;
@@ -879,7 +740,6 @@
879
740
  }
880
741
 
881
742
  .sidebar-intro {
882
- padding: 12px 14px 0;
883
743
  font-size: 0.75rem;
884
744
  color: var(--text-secondary);
885
745
  flex-shrink: 0;
@@ -907,6 +767,65 @@
907
767
  .session-group { margin-bottom: 20px; }
908
768
  .session-group:last-child { margin-bottom: 0; }
909
769
 
770
+ .session-manage-bar {
771
+ display: flex;
772
+ align-items: center;
773
+ justify-content: space-between;
774
+ margin-bottom: 12px;
775
+ }
776
+
777
+ .session-manage-bar.active {
778
+ flex-direction: column;
779
+ align-items: stretch;
780
+ gap: 8px;
781
+ padding: 10px 12px;
782
+ border: 1px solid var(--border-subtle);
783
+ border-radius: var(--radius-md);
784
+ background: var(--bg-surface);
785
+ }
786
+
787
+ .session-manage-summary {
788
+ font-size: 0.75rem;
789
+ color: var(--text-secondary);
790
+ font-weight: 600;
791
+ }
792
+
793
+ .session-manage-actions {
794
+ display: flex;
795
+ flex-wrap: wrap;
796
+ gap: 8px;
797
+ }
798
+
799
+ .session-manage-toggle,
800
+ .session-manage-btn {
801
+ border: 1px solid var(--border-subtle);
802
+ background: var(--bg-surface);
803
+ color: var(--text-primary);
804
+ border-radius: var(--radius-md);
805
+ padding: 6px 10px;
806
+ font-size: 0.75rem;
807
+ font-weight: 600;
808
+ cursor: pointer;
809
+ }
810
+
811
+ .session-manage-btn.compact {
812
+ padding: 4px 8px;
813
+ font-size: 0.6875rem;
814
+ margin-left: 8px;
815
+ }
816
+
817
+ .session-manage-btn.danger,
818
+ .session-manage-toggle.danger {
819
+ color: #c84636;
820
+ border-color: rgba(200, 70, 54, 0.25);
821
+ background: rgba(200, 70, 54, 0.06);
822
+ }
823
+
824
+ .session-manage-btn:disabled {
825
+ opacity: 0.45;
826
+ cursor: not-allowed;
827
+ }
828
+
910
829
  .session-group-title {
911
830
  padding: 6px 8px 12px;
912
831
  font-size: 0.6875rem;
@@ -927,132 +846,297 @@
927
846
  border-radius: var(--radius-full);
928
847
  }
929
848
 
849
+ /* ===== Claude 历史会话 ===== */
850
+ .claude-history-toggle {
851
+ cursor: pointer;
852
+ user-select: none;
853
+ transition: color 0.15s ease;
854
+ }
855
+ .claude-history-toggle:hover {
856
+ color: var(--text-primary);
857
+ }
858
+ .claude-history-toggle .chevron {
859
+ display: inline-block;
860
+ transition: transform 0.2s ease;
861
+ font-size: 0.625rem;
862
+ margin-right: 2px;
863
+ }
864
+ .claude-history-toggle .history-count {
865
+ font-size: 0.625rem;
866
+ font-weight: 500;
867
+ color: var(--text-muted);
868
+ background: var(--bg-inset);
869
+ padding: 1px 6px;
870
+ border-radius: var(--radius-full);
871
+ margin-left: 4px;
872
+ }
873
+ .claude-history-loading {
874
+ padding: 12px 8px;
875
+ color: var(--text-muted);
876
+ font-size: 0.8125rem;
877
+ text-align: center;
878
+ }
879
+ .claude-history-directory-header {
880
+ margin-top: 6px;
881
+ cursor: pointer;
882
+ user-select: none;
883
+ }
884
+ .claude-history-directory-header .chevron {
885
+ font-size: 0.6rem;
886
+ margin-right: 2px;
887
+ }
888
+ .claude-history-directory-title {
889
+ font-size: 0.6rem;
890
+ padding: 4px 8px 4px;
891
+ opacity: 0.7;
892
+ justify-content: space-between;
893
+ }
894
+ .claude-history-directory-label {
895
+ min-width: 0;
896
+ overflow: hidden;
897
+ text-overflow: ellipsis;
898
+ white-space: nowrap;
899
+ }
900
+ .claude-history-directory-clear-btn {
901
+ opacity: 0.9;
902
+ flex-shrink: 0;
903
+ }
904
+ .claude-history-preview {
905
+ overflow: hidden;
906
+ text-overflow: ellipsis;
907
+ white-space: nowrap;
908
+ }
909
+ .claude-history-item {
910
+ opacity: 0.8;
911
+ }
912
+ .claude-history-item:hover {
913
+ opacity: 1;
914
+ }
915
+
930
916
  /* ===== 会话卡片项 ===== */
931
917
  .session-item {
932
918
  width: 100%;
933
919
  text-align: left;
934
920
  background: var(--bg-surface);
935
- border: 1px solid var(--border-subtle);
936
- border-radius: var(--radius-lg);
921
+ border: 1px solid transparent;
922
+ border-radius: var(--radius-md);
937
923
  color: var(--text-primary);
938
- padding: 14px 16px;
924
+ padding: 10px 12px;
939
925
  cursor: pointer;
940
- transition: all 0.3s var(--ease-out-expo);
926
+ transition: all 0.2s ease;
941
927
  font-family: var(--font-sans);
942
- margin-bottom: 10px;
943
- box-shadow: var(--shadow-xs);
928
+ margin-bottom: 4px;
944
929
  position: relative;
945
930
  overflow: hidden;
946
- backdrop-filter: blur(8px);
947
931
  }
948
932
 
949
933
  .session-item::before {
950
934
  content: '';
951
935
  position: absolute;
952
936
  left: 0;
953
- top: 0;
954
- bottom: 0;
955
- width: 4px;
956
- background: linear-gradient(180deg, var(--accent), var(--accent-hover));
937
+ top: 4px;
938
+ bottom: 4px;
939
+ width: 3px;
940
+ background: var(--accent);
957
941
  opacity: 0;
958
942
  transform: scaleY(0);
959
- transition: all 0.3s var(--ease-out-expo);
943
+ transition: all 0.2s ease;
960
944
  border-radius: var(--radius-full);
961
945
  }
962
946
 
963
- .session-item::after {
964
- content: '';
947
+ .session-item-row {
948
+ position: relative;
949
+ z-index: 1;
950
+ }
951
+
952
+ .session-item-content {
953
+ position: relative;
954
+ z-index: 2;
955
+ background: inherit;
956
+ transition: transform 0.3s var(--ease-out-expo);
957
+ will-change: transform;
958
+ }
959
+
960
+ .session-item.swiped .session-item-content {
961
+ transform: translateX(-72px);
962
+ }
963
+
964
+ .session-manage-check {
965
+ display: inline-flex;
966
+ align-items: center;
967
+ justify-content: center;
968
+ flex-shrink: 0;
969
+ width: 22px;
970
+ height: 22px;
971
+ margin-right: 8px;
972
+ position: relative;
973
+ }
974
+
975
+ .session-manage-check input {
965
976
  position: absolute;
966
977
  inset: 0;
967
- background: radial-gradient(circle at 50% 0%, rgba(197, 101, 61, 0.06) 0%, transparent 70%);
968
978
  opacity: 0;
969
- transition: opacity 0.3s ease;
979
+ cursor: pointer;
970
980
  }
971
981
 
972
- .session-item:hover::after {
973
- opacity: 1;
982
+ .session-manage-check span {
983
+ width: 18px;
984
+ height: 18px;
985
+ border-radius: 6px;
986
+ border: 1px solid var(--border-subtle);
987
+ background: var(--bg-surface);
988
+ display: inline-flex;
989
+ align-items: center;
990
+ justify-content: center;
991
+ }
992
+
993
+ .session-manage-check input:checked + span {
994
+ background: var(--accent);
995
+ border-color: var(--accent);
996
+ }
997
+
998
+ .session-manage-check input:checked + span::after {
999
+ content: "✓";
1000
+ color: #fff;
1001
+ font-size: 0.75rem;
1002
+ font-weight: 700;
1003
+ }
1004
+
1005
+ .session-item.selected {
1006
+ border-color: rgba(197, 101, 61, 0.35);
1007
+ background: rgba(197, 101, 61, 0.08);
1008
+ }
1009
+
1010
+ .session-item.selected::before {
1011
+ opacity: 0.7;
1012
+ transform: scaleY(1);
974
1013
  }
975
1014
 
976
1015
  .session-item-row {
977
1016
  display: flex;
978
1017
  align-items: flex-start;
979
- justify-content: space-between;
980
- gap: 12px;
981
- position: relative;
982
- z-index: 1;
1018
+ }
1019
+
1020
+ .session-delete-zone {
1021
+ display: none;
1022
+ }
1023
+
1024
+ .session-delete-btn {
1025
+ display: none;
1026
+ }
1027
+
1028
+ @keyframes session-delete-collapse {
1029
+ to {
1030
+ max-height: 0;
1031
+ opacity: 0;
1032
+ margin-bottom: 0;
1033
+ padding-top: 0;
1034
+ padding-bottom: 0;
1035
+ border-width: 0;
1036
+ }
1037
+ }
1038
+
1039
+ .session-item.deleting {
1040
+ animation: session-delete-collapse 0.3s ease-out forwards;
1041
+ overflow: hidden;
1042
+ max-height: 120px;
1043
+ pointer-events: none;
983
1044
  }
984
1045
 
985
1046
  .session-main {
986
1047
  min-width: 0;
987
- flex: 1;
988
1048
  display: flex;
989
1049
  flex-direction: column;
990
- gap: 6px;
1050
+ gap: 3px;
1051
+ padding-right: 64px;
991
1052
  }
992
1053
 
993
1054
  /* ===== 会话操作按钮 ===== */
994
1055
  .session-actions {
1056
+ position: absolute;
1057
+ right: 0;
1058
+ top: 0;
995
1059
  display: inline-flex;
996
1060
  align-items: center;
997
- gap: 6px;
1061
+ gap: 2px;
998
1062
  flex-shrink: 0;
999
- opacity: 0;
1000
- transform: translateX(8px);
1001
- transition: all 0.25s var(--ease-out-expo);
1002
- }
1003
-
1004
- .session-item:hover .session-actions {
1005
- opacity: 1;
1006
- transform: translateX(0);
1007
1063
  }
1008
1064
 
1009
1065
  .session-action-btn {
1010
- width: 32px;
1011
- height: 32px;
1012
- min-height: 32px;
1013
- min-width: 32px;
1066
+ width: 28px;
1067
+ height: 28px;
1068
+ min-height: 28px;
1069
+ min-width: 28px;
1014
1070
  padding: 0;
1015
- border-radius: var(--radius-md);
1071
+ border-radius: var(--radius-full);
1016
1072
  display: flex;
1017
1073
  align-items: center;
1018
1074
  justify-content: center;
1019
- font-size: 0.875rem;
1020
- background: var(--bg-surface);
1021
- border: 1px solid var(--border-subtle);
1022
- transition: all 0.25s var(--ease-spring);
1023
- color: var(--text-secondary);
1075
+ font-size: 0.8125rem;
1076
+ background: transparent;
1077
+ border: none;
1078
+ transition: all 0.2s ease;
1079
+ color: var(--text-muted);
1080
+ cursor: pointer;
1024
1081
  }
1025
1082
 
1026
1083
  .session-action-btn:hover {
1027
- background: var(--accent-muted);
1028
- border-color: var(--accent);
1084
+ background: rgba(150, 118, 85, 0.1);
1029
1085
  color: var(--accent);
1030
- transform: scale(1.12);
1031
- box-shadow: 0 4px 12px rgba(197, 101, 61, 0.25);
1032
1086
  }
1033
1087
 
1034
1088
  .session-action-btn:active {
1035
- transform: scale(0.95);
1089
+ transform: scale(0.9);
1036
1090
  transition-duration: 0.1s;
1037
1091
  }
1038
1092
 
1093
+ .session-action-btn svg {
1094
+ flex-shrink: 0;
1095
+ }
1096
+
1097
+ /* Delete icon button in actions */
1098
+ .session-action-btn.delete-btn:hover {
1099
+ background: rgba(231, 76, 60, 0.08);
1100
+ color: #d35244;
1101
+ }
1102
+
1103
+ /* PC: hover to show action buttons */
1104
+ @media (hover: hover) {
1105
+ .session-item .session-actions {
1106
+ opacity: 0;
1107
+ transition: opacity 0.15s ease;
1108
+ }
1109
+ .session-item:hover .session-actions,
1110
+ .session-item.active .session-actions,
1111
+ .session-item.swiped .session-actions {
1112
+ opacity: 1;
1113
+ }
1114
+ /* Running sessions always show resume */
1115
+ .session-item .session-actions:has(.session-action-btn[data-action="resume"]) {
1116
+ opacity: 1;
1117
+ }
1118
+ }
1119
+
1120
+ @media (hover: none) {
1121
+ .session-item .session-actions {
1122
+ opacity: 1;
1123
+ }
1124
+ }
1125
+
1039
1126
  /* ===== 会话卡片交互效果 ===== */
1040
1127
  .session-item:hover {
1041
- background: rgba(255, 252, 248, 0.98);
1042
- border-color: var(--accent-soft);
1043
- transform: translateY(-3px);
1044
- box-shadow: var(--shadow-md);
1128
+ background: rgba(150, 118, 85, 0.06);
1129
+ border-color: var(--border-subtle);
1045
1130
  }
1046
1131
 
1047
1132
  .session-item:hover::before {
1048
- opacity: 1;
1133
+ opacity: 0.5;
1049
1134
  transform: scaleY(1);
1050
1135
  }
1051
1136
 
1052
1137
  .session-item.active {
1053
- background: linear-gradient(135deg, rgba(241, 214, 194, 0.5) 0%, rgba(255, 247, 239, 0.9) 100%);
1054
- border-color: var(--accent);
1055
- box-shadow: 0 4px 16px rgba(197, 101, 61, 0.15);
1138
+ background: rgba(197, 101, 61, 0.08);
1139
+ border-color: rgba(197, 101, 61, 0.2);
1056
1140
  }
1057
1141
 
1058
1142
  .session-item.active::before {
@@ -1061,7 +1145,7 @@
1061
1145
  }
1062
1146
 
1063
1147
  .session-item:active {
1064
- transform: scale(0.98);
1148
+ transform: scale(0.99);
1065
1149
  transition-duration: 0.1s;
1066
1150
  }
1067
1151
 
@@ -1148,6 +1232,27 @@
1148
1232
  background: rgba(255, 251, 245, 0.7);
1149
1233
  }
1150
1234
 
1235
+ .sidebar-footer-actions {
1236
+ display: flex;
1237
+ justify-content: center;
1238
+ gap: 4px;
1239
+ }
1240
+
1241
+ .sidebar-footer-actions .btn {
1242
+ flex: 1;
1243
+ display: inline-flex;
1244
+ align-items: center;
1245
+ justify-content: center;
1246
+ gap: 4px;
1247
+ font-size: 0.75rem;
1248
+ color: var(--text-secondary);
1249
+ }
1250
+
1251
+ .sidebar-footer-actions .btn:hover {
1252
+ color: var(--text-primary);
1253
+ background: var(--bg-tertiary);
1254
+ }
1255
+
1151
1256
  .sidebar-meta {
1152
1257
  display: flex;
1153
1258
  flex-direction: row;
@@ -1467,30 +1572,43 @@
1467
1572
 
1468
1573
  .terminal-container.active {
1469
1574
  display: flex;
1575
+ align-items: stretch;
1470
1576
  }
1471
1577
 
1472
- .terminal-container:focus-within {
1473
- border-color: rgba(197, 101, 61, 0.5);
1474
- box-shadow:
1475
- inset 0 1px 0 rgba(255, 255, 255, 0.08),
1476
- 0 8px 32px rgba(0, 0, 0, 0.4),
1477
- 0 0 0 2px rgba(197, 101, 61, 0.15);
1578
+ .terminal-container > #output {
1579
+ flex: 1;
1580
+ min-height: 0;
1581
+ position: relative;
1478
1582
  }
1479
1583
 
1480
- .terminal-container .xterm {
1584
+ .terminal-container > #output .xterm {
1481
1585
  position: absolute;
1482
1586
  top: 0;
1483
1587
  left: 0;
1484
1588
  right: 0;
1485
1589
  bottom: 0;
1486
- padding: 6px;
1590
+ }
1591
+
1592
+ .terminal-container > #output .xterm-viewport {
1593
+ background: transparent !important;
1487
1594
  }
1488
1595
 
1489
1596
  .terminal-container .xterm-viewport {
1490
1597
  background: transparent !important;
1491
1598
  }
1492
1599
 
1493
- /* ===== 终端缩放手柄 ===== */
1600
+ .terminal-container .xterm {
1601
+ padding: 0;
1602
+ }
1603
+
1604
+ .terminal-container:focus-within {
1605
+ border-color: rgba(197, 101, 61, 0.5);
1606
+ box-shadow:
1607
+ inset 0 1px 0 rgba(255, 255, 255, 0.08),
1608
+ 0 8px 32px rgba(0, 0, 0, 0.4),
1609
+ 0 0 0 2px rgba(197, 101, 61, 0.15);
1610
+ }
1611
+
1494
1612
  .terminal-resize-handle {
1495
1613
  position: absolute;
1496
1614
  bottom: 3px;
@@ -1654,6 +1772,50 @@
1654
1772
  padding: 0 3px;
1655
1773
  }
1656
1774
 
1775
+ .terminal-scale-overlay-divider {
1776
+ width: 1px;
1777
+ height: 14px;
1778
+ background: rgba(245, 234, 220, 0.2);
1779
+ margin: 0 2px;
1780
+ }
1781
+
1782
+ .terminal-jump-bottom {
1783
+ position: absolute;
1784
+ right: 14px;
1785
+ bottom: 18px;
1786
+ display: inline-flex;
1787
+ align-items: center;
1788
+ justify-content: center;
1789
+ gap: 6px;
1790
+ min-width: 78px;
1791
+ height: 32px;
1792
+ padding: 0 12px;
1793
+ border: 1px solid rgba(255, 255, 255, 0.1);
1794
+ border-radius: 999px;
1795
+ background: rgba(24, 20, 17, 0.72);
1796
+ color: rgba(255, 247, 239, 0.92);
1797
+ box-shadow: 0 10px 24px rgba(0, 0, 0, 0.28);
1798
+ backdrop-filter: blur(10px);
1799
+ cursor: pointer;
1800
+ z-index: 13;
1801
+ opacity: 0;
1802
+ transform: translateY(8px);
1803
+ pointer-events: none;
1804
+ transition: opacity 0.18s ease, transform 0.18s ease, background 0.18s ease, border-color 0.18s ease;
1805
+ }
1806
+ .terminal-jump-bottom.visible {
1807
+ opacity: 1;
1808
+ transform: translateY(0);
1809
+ pointer-events: auto;
1810
+ }
1811
+ .terminal-jump-bottom:hover {
1812
+ background: rgba(38, 30, 24, 0.84);
1813
+ border-color: rgba(214, 123, 82, 0.28);
1814
+ }
1815
+ .terminal-jump-bottom:active {
1816
+ transform: translateY(1px);
1817
+ }
1818
+
1657
1819
  /* Terminal interactive mode indicator */
1658
1820
  .terminal-container.interactive {
1659
1821
  border-color: rgba(79, 122, 88, 0.5);
@@ -1812,151 +1974,93 @@
1812
1974
  }
1813
1975
 
1814
1976
  /* Keyboard toggle button and popup */
1815
- .keyboard-toggle-btn {
1816
- width: 36px;
1817
- height: 36px;
1818
- border-radius: 8px;
1819
- border: 1px solid rgba(125, 91, 57, 0.2);
1820
- background: rgba(255, 255, 255, 0.7);
1821
- color: var(--text-secondary);
1822
- cursor: pointer;
1977
+ /* ===== 内联快捷键 ===== */
1978
+ /* Desktop: show inline keys directly, hide toggle button and strip */
1979
+ .inline-shortcuts-wrap {
1823
1980
  display: flex;
1824
1981
  align-items: center;
1825
- justify-content: center;
1826
- transition: all 0.15s ease;
1827
- flex-shrink: 0;
1828
- -webkit-tap-highlight-color: transparent;
1829
- user-select: none;
1830
1982
  position: relative;
1983
+ flex-shrink: 0;
1831
1984
  }
1832
- .keyboard-toggle-btn:hover {
1833
- border-color: var(--accent-soft);
1834
- background: rgba(255, 255, 255, 0.9);
1835
- color: var(--text-primary);
1836
- }
1837
- .keyboard-toggle-btn:active {
1838
- background: var(--accent-soft);
1839
- border-color: var(--accent);
1840
- color: white;
1841
- transform: scale(0.95);
1842
- }
1843
- .keyboard-toggle-btn.active {
1844
- background: var(--accent-soft);
1845
- border-color: var(--accent);
1846
- color: white;
1847
- }
1848
- .keyboard-toggle-btn.hidden {
1985
+ .shortcuts-toggle {
1849
1986
  display: none;
1850
1987
  }
1851
-
1852
- /* Keyboard popup panel */
1853
- .keyboard-popup {
1854
- position: fixed;
1855
- bottom: calc(var(--keyboard-offset, 0px) + 160px);
1856
- right: 12px;
1857
- background: rgba(255, 252, 245, 0.98);
1858
- border: 1px solid rgba(125, 91, 57, 0.25);
1859
- border-radius: 12px;
1860
- padding: 10px;
1861
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
1862
- z-index: 2000;
1863
- display: flex;
1864
- flex-direction: column;
1865
- gap: 8px;
1866
- min-width: 180px;
1867
- }
1868
- .keyboard-popup.hidden {
1988
+ .inline-shortcuts-strip {
1869
1989
  display: none;
1870
1990
  }
1871
- .keyboard-popup-row {
1991
+ .inline-shortcuts-inline {
1872
1992
  display: flex;
1873
- gap: 6px;
1874
- justify-content: center;
1875
- }
1876
- .keyboard-popup-row.modifiers {
1877
- justify-content: flex-start;
1993
+ align-items: center;
1994
+ gap: 3px;
1995
+ flex-shrink: 0;
1878
1996
  }
1879
- .keyboard-popup-row.actions {
1880
- flex-wrap: wrap;
1997
+
1998
+ .shortcut-sep {
1999
+ color: var(--text-muted);
2000
+ font-size: 0.625rem;
2001
+ opacity: 0.5;
2002
+ margin: 0 1px;
2003
+ user-select: none;
1881
2004
  }
1882
2005
 
1883
- /* Popup keyboard keys */
1884
- .kp-key {
1885
- min-width: 40px;
1886
- height: 32px;
1887
- border-radius: 6px;
1888
- border: 1px solid rgba(125, 91, 57, 0.25);
1889
- background: rgba(255, 255, 255, 0.85);
1890
- color: var(--text-secondary);
1891
- font-size: 0.8rem;
2006
+ .shortcut-key {
2007
+ height: 20px;
2008
+ min-width: 20px;
2009
+ border-radius: 3px;
2010
+ border: 1px solid rgba(125, 91, 57, 0.12);
2011
+ background: rgba(255, 255, 255, 0.5);
2012
+ color: var(--text-muted);
2013
+ font-size: 0.5625rem;
1892
2014
  font-family: var(--font-mono);
1893
2015
  font-weight: 500;
1894
2016
  cursor: pointer;
1895
- display: flex;
2017
+ display: inline-flex;
1896
2018
  align-items: center;
1897
2019
  justify-content: center;
1898
- transition: all 0.15s ease;
1899
- padding: 0 8px;
2020
+ transition: all 0.12s ease;
2021
+ padding: 0 4px;
1900
2022
  flex-shrink: 0;
1901
2023
  -webkit-tap-highlight-color: transparent;
1902
2024
  user-select: none;
2025
+ line-height: 1;
1903
2026
  }
1904
- .kp-key:hover {
1905
- border-color: var(--accent-soft);
1906
- background: rgba(255, 255, 255, 0.95);
1907
- color: var(--text-primary);
2027
+
2028
+ .shortcut-key:hover {
2029
+ border-color: rgba(125, 91, 57, 0.3);
2030
+ background: rgba(255, 255, 255, 0.85);
2031
+ color: var(--text-secondary);
1908
2032
  }
1909
- .kp-key:active {
2033
+
2034
+ .shortcut-key:active {
1910
2035
  background: var(--accent-soft);
1911
2036
  border-color: var(--accent);
1912
2037
  color: white;
1913
- transform: scale(0.95);
2038
+ transform: scale(0.93);
1914
2039
  }
1915
- .kp-key.active {
1916
- background: var(--accent-soft);
2040
+
2041
+ .shortcut-key.active {
2042
+ background: rgba(197, 101, 61, 0.15);
1917
2043
  border-color: var(--accent);
1918
- color: white;
1919
- box-shadow: 0 0 0 2px rgba(197, 101, 61, 0.15);
1920
- }
1921
- .kp-action {
1922
- min-width: 50px;
1923
- flex: 1;
2044
+ color: var(--accent);
1924
2045
  }
1925
- .kp-escape {
1926
- color: #c07070;
2046
+
2047
+ .shortcut-key.shortcut-dir {
2048
+ min-width: 18px;
2049
+ padding: 0 2px;
2050
+ font-size: 0.625rem;
1927
2051
  }
1928
- .kp-escape:hover {
1929
- color: #a05050;
2052
+
2053
+ .shortcut-key[data-key="escape"] {
2054
+ color: #b06060;
1930
2055
  }
1931
- .kp-key[data-key="enter"] {
2056
+ .shortcut-key[data-key="enter"] {
1932
2057
  color: #4a7c59;
1933
2058
  }
1934
- .kp-key[data-key="ctrl_enter"] {
2059
+ .shortcut-key[data-key="ctrl_enter"] {
1935
2060
  color: var(--accent);
1936
2061
  font-weight: 600;
1937
2062
  }
1938
2063
 
1939
- /* Direction keys grid layout - cross shape */
1940
- .kp-dir-grid {
1941
- display: flex;
1942
- flex-direction: column;
1943
- align-items: center;
1944
- gap: 4px;
1945
- }
1946
- .kp-dir-up {
1947
- display: flex;
1948
- justify-content: center;
1949
- }
1950
- .kp-dir-lr {
1951
- display: flex;
1952
- gap: 4px;
1953
- }
1954
- .kp-dir {
1955
- min-width: 36px;
1956
- height: 36px;
1957
- font-size: 1rem;
1958
- }
1959
-
1960
2064
  /* Mobile keyboard overlap compensation */
1961
2065
  @media (max-width: 640px) {
1962
2066
  .mini-keyboard {
@@ -1998,6 +2102,7 @@
1998
2102
  gap: 16px;
1999
2103
  padding: 20px 4px 12px;
2000
2104
  min-height: 0;
2105
+ scrollbar-gutter: stable;
2001
2106
  }
2002
2107
 
2003
2108
  /* ===== 消息动画 ===== */
@@ -3151,7 +3256,7 @@
3151
3256
  .token-type { color: #d5a35b; }
3152
3257
 
3153
3258
  .input-panel {
3154
- padding: 8px 12px;
3259
+ padding: 6px 10px;
3155
3260
  flex-shrink: 0;
3156
3261
  z-index: 26;
3157
3262
  overscroll-behavior: contain;
@@ -3161,7 +3266,7 @@
3161
3266
  .input-composer {
3162
3267
  background: rgba(255, 255, 255, 0.85);
3163
3268
  border: 1px solid var(--border-default);
3164
- border-radius: 16px;
3269
+ border-radius: 14px;
3165
3270
  transition: border-color var(--transition-fast), box-shadow var(--transition-fast), background var(--transition-fast);
3166
3271
  overflow: hidden;
3167
3272
  position: relative;
@@ -3169,34 +3274,125 @@
3169
3274
  }
3170
3275
  .input-composer:focus-within {
3171
3276
  border-color: var(--accent);
3172
- box-shadow: 0 0 0 3px var(--accent-muted), 0 0 24px rgba(197, 101, 61, 0.1);
3277
+ box-shadow: 0 0 0 2px var(--accent-muted), 0 0 16px rgba(197, 101, 61, 0.08);
3173
3278
  background: rgba(255, 255, 255, 0.98);
3174
3279
  }
3175
3280
  .input-composer-bar {
3176
3281
  display: flex;
3177
3282
  align-items: center;
3178
3283
  justify-content: space-between;
3179
- padding: 3px 5px 5px 8px;
3180
- gap: 6px;
3284
+ padding: 2px 4px 3px 6px;
3285
+ gap: 4px;
3286
+ }
3287
+ .input-composer-left {
3288
+ display: flex;
3289
+ align-items: center;
3290
+ gap: 4px;
3291
+ flex-wrap: nowrap;
3292
+ flex-shrink: 0;
3293
+ }
3294
+
3295
+ /* Permission actions inline in composer bar */
3296
+ .permission-actions {
3297
+ display: inline-flex;
3298
+ align-items: center;
3299
+ gap: 4px;
3300
+ animation: permission-fade-in 0.2s ease-out;
3301
+ }
3302
+ .permission-actions.hidden {
3303
+ display: none;
3304
+ }
3305
+ .permission-actions-divider {
3306
+ width: 1px;
3307
+ height: 16px;
3308
+ background: var(--border);
3309
+ margin: 0 2px;
3310
+ }
3311
+ .permission-actions-label {
3312
+ font-size: 0.7rem;
3313
+ color: #d18b00;
3314
+ max-width: 180px;
3315
+ overflow: hidden;
3316
+ text-overflow: ellipsis;
3317
+ white-space: nowrap;
3318
+ }
3319
+ .btn-permission {
3320
+ font-size: 0.65rem;
3321
+ padding: 1px 8px;
3322
+ border-radius: 4px;
3323
+ border: 1px solid transparent;
3324
+ cursor: pointer;
3325
+ line-height: 1.4;
3326
+ font-weight: 500;
3327
+ transition: background 0.15s, border-color 0.15s;
3328
+ }
3329
+ .btn-permission:disabled {
3330
+ opacity: 0.5;
3331
+ cursor: not-allowed;
3332
+ }
3333
+ .btn-permission-approve {
3334
+ background: rgba(240, 165, 0, 0.15);
3335
+ color: #d18b00;
3336
+ border-color: rgba(240, 165, 0, 0.3);
3337
+ }
3338
+ .btn-permission-approve:hover:not(:disabled) {
3339
+ background: rgba(240, 165, 0, 0.25);
3340
+ }
3341
+ .btn-permission-deny {
3342
+ background: transparent;
3343
+ color: var(--text-muted);
3344
+ border-color: var(--border);
3345
+ }
3346
+ .btn-permission-deny:hover:not(:disabled) {
3347
+ background: rgba(220, 50, 50, 0.08);
3348
+ color: var(--danger);
3349
+ border-color: rgba(220, 50, 50, 0.3);
3350
+ }
3351
+ @keyframes permission-fade-in {
3352
+ from { opacity: 0; transform: translateX(-4px); }
3353
+ to { opacity: 1; transform: translateX(0); }
3354
+ }
3355
+
3356
+ .composer-interactive-toggle {
3357
+ display: inline-flex;
3358
+ align-items: center;
3359
+ justify-content: center;
3360
+ width: 22px;
3361
+ height: 22px;
3362
+ border: 1px solid var(--border-subtle);
3363
+ border-radius: 4px;
3364
+ background: transparent;
3365
+ color: var(--text-muted);
3366
+ font-size: 0.75rem;
3367
+ cursor: pointer;
3368
+ transition: all var(--transition-fast);
3369
+ flex-shrink: 0;
3370
+ padding: 0;
3371
+ }
3372
+ .composer-interactive-toggle:hover {
3373
+ background: rgba(197, 101, 61, 0.08);
3374
+ color: var(--text-secondary);
3375
+ border-color: var(--accent);
3181
3376
  }
3182
- .input-composer-left {
3183
- display: flex;
3184
- align-items: center;
3185
- gap: 6px;
3186
- flex-wrap: wrap;
3377
+ .composer-interactive-toggle.active {
3378
+ background: rgba(197, 101, 61, 0.12);
3379
+ color: var(--accent);
3380
+ border-color: var(--accent);
3187
3381
  }
3188
3382
  .input-composer-right {
3189
3383
  display: flex;
3190
3384
  align-items: center;
3191
- gap: 6px;
3385
+ gap: 4px;
3192
3386
  position: relative;
3387
+ flex: 1;
3388
+ justify-content: flex-end;
3193
3389
  }
3194
3390
  .queue-counter {
3195
- font-size: 0.6875rem;
3391
+ font-size: 0.625rem;
3196
3392
  color: var(--accent);
3197
3393
  background: var(--accent-muted);
3198
- padding: 2px 8px;
3199
- border-radius: 10px;
3394
+ padding: 1px 6px;
3395
+ border-radius: 8px;
3200
3396
  white-space: nowrap;
3201
3397
  font-weight: 600;
3202
3398
  animation: queuePulse 1.5s ease-in-out infinite;
@@ -3208,27 +3404,28 @@
3208
3404
  }
3209
3405
 
3210
3406
  .input-hint {
3211
- font-size: 0.625rem;
3407
+ font-size: 0.5625rem;
3212
3408
  color: var(--text-muted);
3213
3409
  white-space: nowrap;
3214
3410
  user-select: none;
3411
+ opacity: 0.7;
3215
3412
  }
3216
3413
 
3217
3414
  /* Session info bar at bottom of input composer */
3218
3415
  .input-session-info-bar {
3219
3416
  display: flex;
3220
3417
  align-items: center;
3221
- gap: 6px;
3222
- padding: 6px 10px;
3223
- background: rgba(245, 240, 230, 0.6);
3418
+ gap: 5px;
3419
+ padding: 3px 8px;
3420
+ background: rgba(245, 240, 230, 0.5);
3224
3421
  border-top: 1px solid var(--border-subtle);
3225
- font-size: 0.75rem;
3422
+ font-size: 0.6875rem;
3226
3423
  color: var(--text-secondary);
3227
3424
  }
3228
3425
  .session-cwd-display {
3229
3426
  font-weight: 500;
3230
3427
  color: var(--text-primary);
3231
- max-width: 200px;
3428
+ max-width: 180px;
3232
3429
  overflow: hidden;
3233
3430
  text-overflow: ellipsis;
3234
3431
  white-space: nowrap;
@@ -3243,6 +3440,30 @@
3243
3440
  color: var(--border-default);
3244
3441
  opacity: 0.6;
3245
3442
  }
3443
+ .claude-session-id-badge {
3444
+ font-family: var(--font-mono);
3445
+ font-size: 0.6875rem;
3446
+ color: var(--text-muted);
3447
+ background: rgba(150, 118, 85, 0.1);
3448
+ padding: 2px 6px;
3449
+ border-radius: 4px;
3450
+ cursor: pointer;
3451
+ user-select: none;
3452
+ transition: all var(--transition-fast);
3453
+ border: 1px solid transparent;
3454
+ }
3455
+ .claude-session-id-badge:hover {
3456
+ color: var(--accent);
3457
+ background: rgba(197, 101, 61, 0.1);
3458
+ border-color: rgba(197, 101, 61, 0.2);
3459
+ }
3460
+ .claude-session-id-badge:active {
3461
+ transform: scale(0.95);
3462
+ }
3463
+ .claude-session-id-badge.copied {
3464
+ color: var(--success);
3465
+ background: rgba(106, 165, 76, 0.1);
3466
+ }
3246
3467
 
3247
3468
  .input-row { display: flex; gap: 8px; align-items: flex-end; max-width: 100%; }
3248
3469
  .input-field { flex: 1; display: flex; flex-direction: column; gap: 6px; min-width: 0; max-width: 100%; }
@@ -3782,14 +4003,14 @@
3782
4003
  .input-textarea {
3783
4004
  --input-max-height: 120px;
3784
4005
  font-family: var(--font-mono);
3785
- font-size: 0.875rem;
4006
+ font-size: 0.8125rem;
3786
4007
  background: transparent;
3787
4008
  border: none;
3788
4009
  color: var(--text-primary);
3789
- padding: 10px 12px 4px;
4010
+ padding: 8px 10px 3px;
3790
4011
  outline: none;
3791
4012
  resize: none;
3792
- min-height: 36px;
4013
+ min-height: 32px;
3793
4014
  max-height: var(--input-max-height);
3794
4015
  width: 100%;
3795
4016
  overflow-y: hidden;
@@ -3832,26 +4053,25 @@
3832
4053
  /* Chat mode select pill */
3833
4054
  .chat-mode-select {
3834
4055
  font-family: var(--font-sans);
3835
- font-size: 0.6875rem;
4056
+ font-size: 0.625rem;
3836
4057
  font-weight: 500;
3837
- padding: 2px 8px;
3838
- border-radius: 12px;
4058
+ padding: 1px 16px 1px 6px;
4059
+ border-radius: 10px;
3839
4060
  border: 1px solid var(--border-subtle);
3840
4061
  background: rgba(246, 241, 232, 0.7);
3841
4062
  color: var(--text-secondary);
3842
4063
  cursor: pointer;
3843
4064
  transition: all var(--transition-fast);
3844
- min-height: 24px;
3845
- max-width: 100px;
4065
+ min-height: 22px;
4066
+ max-width: 90px;
3846
4067
  overflow: hidden;
3847
4068
  text-overflow: ellipsis;
3848
4069
  white-space: nowrap;
3849
4070
  appearance: none;
3850
4071
  -webkit-appearance: none;
3851
- padding-right: 18px;
3852
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' fill='none'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%239a8e82' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
4072
+ 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");
3853
4073
  background-repeat: no-repeat;
3854
- background-position: right 5px center;
4074
+ background-position: right 4px center;
3855
4075
  }
3856
4076
  .chat-mode-select:hover {
3857
4077
  border-color: var(--accent);
@@ -3865,9 +4085,9 @@
3865
4085
 
3866
4086
  /* Circular action buttons */
3867
4087
  .btn-circle {
3868
- width: 34px;
3869
- height: 34px;
3870
- min-width: 34px;
4088
+ width: 28px;
4089
+ height: 28px;
4090
+ min-width: 28px;
3871
4091
  border-radius: 50%;
3872
4092
  border: none;
3873
4093
  display: inline-flex;
@@ -3881,11 +4101,11 @@
3881
4101
  .btn-circle-send {
3882
4102
  background: linear-gradient(180deg, var(--accent) 0%, #a8522f 100%);
3883
4103
  color: white;
3884
- box-shadow: 0 2px 8px rgba(197, 101, 61, 0.3);
4104
+ box-shadow: 0 1px 6px rgba(197, 101, 61, 0.25);
3885
4105
  }
3886
4106
  .btn-circle-send:hover {
3887
4107
  transform: scale(1.08);
3888
- box-shadow: 0 4px 12px rgba(197, 101, 61, 0.4);
4108
+ box-shadow: 0 3px 10px rgba(197, 101, 61, 0.35);
3889
4109
  }
3890
4110
  .btn-circle-send:active {
3891
4111
  transform: scale(0.95);
@@ -4023,6 +4243,41 @@
4023
4243
  linear-gradient(180deg, rgba(255, 246, 235, 0.85), rgba(255, 251, 245, 0.85));
4024
4244
  }
4025
4245
 
4246
+ .boot-loading {
4247
+ min-height: 100vh;
4248
+ display: flex;
4249
+ align-items: center;
4250
+ justify-content: center;
4251
+ padding: 24px;
4252
+ }
4253
+
4254
+ .boot-loading-card {
4255
+ display: flex;
4256
+ align-items: center;
4257
+ gap: 12px;
4258
+ padding: 16px 18px;
4259
+ border: 1px solid var(--border-subtle);
4260
+ border-radius: 16px;
4261
+ background: var(--surface-elevated);
4262
+ box-shadow: var(--shadow-sm);
4263
+ color: var(--text-secondary);
4264
+ }
4265
+
4266
+ .boot-loading-spinner {
4267
+ width: 18px;
4268
+ height: 18px;
4269
+ flex-shrink: 0;
4270
+ border: 2px solid rgba(197, 101, 61, 0.16);
4271
+ border-top-color: var(--accent);
4272
+ border-radius: 999px;
4273
+ animation: loginSpin 0.8s linear infinite;
4274
+ }
4275
+
4276
+ .boot-loading-text {
4277
+ font-size: 0.9375rem;
4278
+ font-weight: 500;
4279
+ }
4280
+
4026
4281
  .login-logo { display: flex; align-items: center; justify-content: center; gap: 10px; margin-bottom: 8px; }
4027
4282
 
4028
4283
  .login-logo-icon {
@@ -4036,10 +4291,10 @@
4036
4291
 
4037
4292
  .login-logo-text { font-size: 1.6rem; font-weight: 600; letter-spacing: -0.02em; }
4038
4293
  .login-subtitle { color: var(--text-muted); font-size: 0.875rem; }
4039
- .login-body { padding: 24px; }
4040
- .login-card-loading .login-body { padding-top: 20px; padding-bottom: 28px; }
4041
- .login-hint { font-size: 0.8125rem; color: var(--text-secondary); margin-bottom: 20px; line-height: 1.6; }
4042
- .login-muted { margin: 4px 0 0; font-size: 0.75rem; color: var(--text-muted); line-height: 1.5; }
4294
+ .login-body { padding: 22px 24px 24px; }
4295
+ .login-card-loading .login-body { padding-top: 18px; padding-bottom: 24px; }
4296
+ .login-hint { font-size: 0.8125rem; color: var(--text-secondary); margin-bottom: 16px; line-height: 1.5; }
4297
+ .login-muted { margin: 4px 0 0; font-size: 0.75rem; color: var(--text-muted); line-height: 1.45; }
4043
4298
  .login-status {
4044
4299
  display: flex;
4045
4300
  align-items: flex-start;
@@ -4056,16 +4311,6 @@
4056
4311
  border-radius: 999px;
4057
4312
  animation: loginSpin 0.8s linear infinite;
4058
4313
  }
4059
- .login-tip {
4060
- font-size: 0.75rem;
4061
- color: var(--warning);
4062
- background: rgba(255, 244, 230, 0.92);
4063
- border: 1px solid rgba(169, 106, 47, 0.18);
4064
- border-radius: var(--radius-md);
4065
- padding: 10px 12px;
4066
- margin-bottom: 18px;
4067
- line-height: 1.55;
4068
- }
4069
4314
  .password-field {
4070
4315
  position: relative;
4071
4316
  display: flex;
@@ -4125,56 +4370,55 @@
4125
4370
  line-height: 1.5;
4126
4371
  }
4127
4372
  .session-modal .modal-body {
4128
- padding-top: 18px;
4373
+ padding-top: 16px;
4129
4374
  }
4130
4375
  .session-modal .field:last-of-type {
4131
- margin-bottom: 18px;
4376
+ margin-bottom: 14px;
4132
4377
  }
4133
4378
  .mode-cards {
4134
4379
  display: flex;
4135
4380
  flex-wrap: wrap;
4136
- gap: 8px;
4137
- justify-content: center;
4381
+ gap: 6px;
4138
4382
  }
4139
4383
  .mode-card {
4140
- flex: 0 1 calc(33.333% - 6px);
4384
+ flex: 1 1 0;
4385
+ min-width: 0;
4141
4386
  display: flex;
4142
4387
  flex-direction: column;
4143
4388
  align-items: center;
4144
- gap: 2px;
4145
- padding: 12px 6px;
4389
+ gap: 1px;
4390
+ padding: 8px 4px;
4146
4391
  border: 1.5px solid rgba(125, 91, 57, 0.15);
4147
- border-radius: 12px;
4392
+ border-radius: 10px;
4148
4393
  background: rgba(255, 255, 255, 0.55);
4149
4394
  cursor: pointer;
4150
- transition: border-color var(--transition-fast), box-shadow var(--transition-fast), background var(--transition-fast), transform var(--transition-fast);
4395
+ transition: border-color var(--transition-fast), box-shadow var(--transition-fast), background var(--transition-fast);
4151
4396
  text-align: center;
4152
4397
  outline: none;
4153
4398
  }
4154
4399
  .mode-card:hover {
4155
4400
  border-color: rgba(197, 101, 61, 0.35);
4156
4401
  background: rgba(255, 255, 255, 0.8);
4157
- transform: translateY(-1px);
4158
4402
  }
4159
4403
  .mode-card.active {
4160
4404
  border-color: var(--accent);
4161
4405
  background: rgba(255, 247, 239, 0.95);
4162
- box-shadow: 0 0 0 2px var(--accent-muted), 0 2px 8px rgba(197, 101, 61, 0.1);
4406
+ box-shadow: 0 0 0 1.5px var(--accent-muted);
4163
4407
  }
4164
4408
  .mode-card:focus-visible {
4165
4409
  border-color: var(--accent);
4166
- box-shadow: 0 0 0 2px var(--accent-muted);
4410
+ box-shadow: 0 0 0 1.5px var(--accent-muted);
4167
4411
  }
4168
4412
  .mode-card-label {
4169
- font-size: 0.8125rem;
4413
+ font-size: 0.75rem;
4170
4414
  font-weight: 600;
4171
4415
  color: var(--text-primary);
4172
4416
  line-height: 1.3;
4173
4417
  }
4174
4418
  .mode-card-desc {
4175
- font-size: 0.6875rem;
4419
+ font-size: 0.625rem;
4176
4420
  color: var(--text-muted);
4177
- line-height: 1.4;
4421
+ line-height: 1.3;
4178
4422
  }
4179
4423
  .mode-card.active .mode-card-label {
4180
4424
  color: var(--accent);
@@ -4256,6 +4500,9 @@
4256
4500
  .modal {
4257
4501
  width: 100%;
4258
4502
  max-width: 540px;
4503
+ max-height: 90vh;
4504
+ display: flex;
4505
+ flex-direction: column;
4259
4506
  background: rgba(255, 251, 245, 0.98);
4260
4507
  border: 1px solid rgba(150, 118, 85, 0.22);
4261
4508
  border-radius: 20px;
@@ -4280,9 +4527,9 @@
4280
4527
  }
4281
4528
 
4282
4529
  .modal-title { font-size: 1.0625rem; font-weight: 600; color: var(--text-primary); letter-spacing: -0.01em; }
4283
- .modal-body { padding: 22px; overflow: hidden; }
4284
- .modal-body .field { margin-bottom: 18px; }
4285
- .modal-body .field:last-of-type { margin-bottom: 20px; }
4530
+ .modal-body { padding: 22px; overflow-y: auto; flex: 1 1 auto; min-height: 0; }
4531
+ .modal-body .field { margin-bottom: 14px; }
4532
+ .modal-body .field:last-of-type { margin-bottom: 16px; }
4286
4533
  .field-hint {
4287
4534
  margin-top: 6px;
4288
4535
  font-size: 0.75rem;
@@ -4363,7 +4610,7 @@
4363
4610
  cursor: pointer;
4364
4611
  }
4365
4612
 
4366
- .suggestions-wrap { position: sticky; }
4613
+ .suggestions-wrap { position: relative; }
4367
4614
 
4368
4615
  .suggestions {
4369
4616
  position: absolute;
@@ -4393,6 +4640,36 @@
4393
4640
  .suggestion-item:hover { background: rgba(232, 197, 174, 0.34); }
4394
4641
  .suggestion-item small { display: block; font-size: 0.6875rem; color: var(--text-muted); margin-top: 2px; }
4395
4642
 
4643
+ .recent-paths-bubbles {
4644
+ display: flex;
4645
+ flex-wrap: wrap;
4646
+ gap: 5px;
4647
+ margin-top: 6px;
4648
+ }
4649
+ .recent-paths-bubbles:empty { display: none; }
4650
+ .recent-path-bubble {
4651
+ display: inline-flex;
4652
+ align-items: center;
4653
+ padding: 2px 10px;
4654
+ background: rgba(232, 197, 174, 0.18);
4655
+ border: 1px solid var(--border-default);
4656
+ border-radius: 999px;
4657
+ color: var(--text-secondary);
4658
+ font-family: var(--font-mono);
4659
+ font-size: 0.6875rem;
4660
+ cursor: pointer;
4661
+ transition: background var(--transition-fast), border-color var(--transition-fast);
4662
+ white-space: nowrap;
4663
+ max-width: 180px;
4664
+ overflow: hidden;
4665
+ text-overflow: ellipsis;
4666
+ }
4667
+ .recent-path-bubble:hover {
4668
+ background: rgba(232, 197, 174, 0.4);
4669
+ border-color: var(--border-hover, var(--border-default));
4670
+ color: var(--text-primary);
4671
+ }
4672
+
4396
4673
  .error-message {
4397
4674
  font-size: 0.75rem;
4398
4675
  color: var(--danger);
@@ -4508,20 +4785,12 @@
4508
4785
  /* 平板适配 */
4509
4786
  @media (max-width: 768px) {
4510
4787
  .app-container {
4511
- --layout-topbar-height: 50px;
4512
- --layout-sidebar-offset: var(--layout-topbar-height);
4513
4788
  --layout-main-file-panel-width: 0px;
4514
4789
  }
4515
4790
 
4516
- .topbar {
4517
- padding: 6px 12px;
4518
- min-height: var(--layout-topbar-height);
4519
- gap: 8px;
4520
- }
4521
- .topbar-center { display: none; }
4522
4791
  .sidebar {
4523
4792
  width: min(300px, calc(100vw - 20px));
4524
- top: var(--layout-sidebar-offset);
4793
+ top: 0;
4525
4794
  }
4526
4795
  .terminal-container { margin: 0 12px 12px; min-height: 0; }
4527
4796
  .btn { min-height: 40px; }
@@ -4535,8 +4804,8 @@
4535
4804
  .thinking-content { font-size: 0.8125rem; }
4536
4805
  .tool-picker { grid-template-columns: 1fr; }
4537
4806
  /* 平板触摸优化 - 44px触摸区域 */
4538
- .session-item { min-height: 52px; padding: 11px 12px; }
4539
- .session-action-btn { width: 34px; height: 34px; min-width: 34px; min-height: 34px; }
4807
+ .session-item { min-height: 48px; padding: 10px 12px; }
4808
+ .session-action-btn { width: 32px; height: 32px; min-width: 32px; min-height: 32px; }
4540
4809
  .tree-item { min-height: 44px; padding: 8px 12px; }
4541
4810
  .folder-picker-item { min-height: 44px; }
4542
4811
  }
@@ -4555,8 +4824,6 @@
4555
4824
  }
4556
4825
 
4557
4826
  .app-container {
4558
- --layout-topbar-height: 40px;
4559
- --layout-sidebar-offset: var(--layout-topbar-height);
4560
4827
  --layout-main-file-panel-width: 0px;
4561
4828
  }
4562
4829
 
@@ -4576,58 +4843,17 @@
4576
4843
  overflow: hidden;
4577
4844
  }
4578
4845
 
4579
- /* 移动端顶栏 - 紧凑版 */
4580
- .topbar {
4581
- position: sticky;
4582
- top: 0;
4583
- z-index: 30;
4584
- align-items: center;
4585
- gap: 4px;
4586
- min-height: var(--layout-topbar-height);
4587
- padding: 4px 8px;
4588
- padding-top: max(4px, env(safe-area-inset-top, 0px));
4589
- }
4590
-
4591
- .topbar-left { display: flex; gap: 4px; }
4592
- .topbar-center { display: none; }
4593
- .topbar-right {
4594
- display: flex;
4595
- gap: 4px;
4596
- align-items: center;
4597
- }
4598
-
4599
- .topbar-logo-icon { width: 22px; height: 22px; font-size: 10px; border-radius: 6px; }
4600
-
4601
- /* 移动端按钮 - 紧凑触摸区域 */
4602
- .topbar .btn-sm,
4603
- .topbar .topbar-btn {
4604
- height: 36px;
4605
- min-height: 36px;
4606
- min-width: 36px;
4607
- padding: 0 8px;
4608
- font-size: 0.6875rem;
4846
+ /* 移动端浮动按钮 */
4847
+ .floating-sidebar-toggle {
4848
+ width: 30px;
4849
+ height: 30px;
4850
+ top: max(8px, env(safe-area-inset-top, 8px));
4851
+ left: 8px;
4609
4852
  border-radius: 6px;
4610
4853
  }
4854
+ .floating-sidebar-toggle .hamburger-icon { width: 13px; height: 9px; }
4611
4855
 
4612
- /* 移动端 PWA 安装按钮 */
4613
- .topbar #pwa-install-button {
4614
- color: var(--accent);
4615
- }
4616
- .topbar #pwa-install-button svg {
4617
- width: 14px;
4618
- height: 14px;
4619
- }
4620
- .topbar .btn-icon,
4621
- .topbar .topbar-btn.square {
4622
- width: 36px;
4623
- height: 36px;
4624
- min-width: 36px;
4625
- min-height: 36px;
4626
- padding: 0;
4627
- border-radius: 6px;
4628
- }
4629
- .sidebar-toggle-btn { width: 36px; height: 36px; min-width: 36px; min-height: 36px; border-radius: 6px; }
4630
- .hamburger-icon { width: 14px; height: 10px; }
4856
+ .sidebar { top: 0; }
4631
4857
 
4632
4858
  /* 移动端终端顶栏 - 紧凑 */
4633
4859
  .terminal-header { padding: 5px 8px; min-height: 32px; }
@@ -4687,7 +4913,7 @@
4687
4913
  }
4688
4914
 
4689
4915
  .sidebar {
4690
- top: var(--layout-sidebar-offset);
4916
+ top: 0;
4691
4917
  width: min(260px, calc(100vw - 12px));
4692
4918
  max-height: none;
4693
4919
  border-bottom: none;
@@ -4742,8 +4968,8 @@
4742
4968
  /* 移动端输入面板 - 紧凑 */
4743
4969
  .input-panel {
4744
4970
  z-index: 30;
4745
- padding: 6px 8px;
4746
- padding-bottom: calc(8px + env(safe-area-inset-bottom, 0px) + var(--keyboard-offset, 0px));
4971
+ padding: 4px 6px;
4972
+ padding-bottom: calc(6px + env(safe-area-inset-bottom, 0px) + var(--keyboard-offset, 0px));
4747
4973
  flex: 0 0 auto;
4748
4974
  margin-top: auto;
4749
4975
  background: linear-gradient(180deg, rgba(246, 241, 232, 0) 0%, rgba(246, 241, 232, 0.82) 20%, rgba(246, 241, 232, 0.94) 100%);
@@ -4751,33 +4977,33 @@
4751
4977
  }
4752
4978
 
4753
4979
  .input-textarea {
4754
- padding-bottom: 6px;
4980
+ padding-bottom: 4px;
4755
4981
  }
4756
4982
 
4757
4983
  .input-session-info-bar {
4758
- padding-bottom: calc(4px + env(safe-area-inset-bottom, 0px));
4984
+ padding: 2px 6px;
4985
+ padding-bottom: calc(3px + env(safe-area-inset-bottom, 0px));
4986
+ font-size: 0.625rem;
4759
4987
  }
4760
4988
 
4761
4989
  .input-composer {
4762
- border-radius: 12px;
4990
+ border-radius: 10px;
4763
4991
  }
4764
4992
 
4765
4993
  .input-composer-bar {
4766
- padding: 2px 4px 4px 6px;
4767
- gap: 4px;
4994
+ padding: 1px 3px 2px 5px;
4995
+ gap: 3px;
4768
4996
  }
4769
4997
 
4770
4998
  .input-composer-left { gap: 3px; }
4771
- .input-composer-right { gap: 4px; }
4999
+ .input-composer-right { gap: 3px; }
4772
5000
 
4773
5001
  /* 移动端会话信息栏 */
4774
5002
  .input-session-info-bar {
4775
- padding: 4px 8px;
4776
- font-size: 0.6875rem;
4777
5003
  flex-wrap: wrap;
4778
5004
  }
4779
5005
  .session-cwd-display {
4780
- max-width: 120px;
5006
+ max-width: 100px;
4781
5007
  }
4782
5008
 
4783
5009
  .input-row { flex-direction: column; align-items: stretch; gap: 6px; max-width: 100%; }
@@ -4808,13 +5034,13 @@
4808
5034
  }
4809
5035
 
4810
5036
  .btn-circle {
4811
- width: 32px;
4812
- height: 32px;
5037
+ width: 26px;
5038
+ height: 26px;
4813
5039
  border-radius: 50%;
4814
5040
  }
4815
5041
  .btn-circle-send svg, .btn-circle-stop svg {
4816
- width: 14px;
4817
- height: 14px;
5042
+ width: 12px;
5043
+ height: 12px;
4818
5044
  }
4819
5045
 
4820
5046
  /* 防止iOS自动缩放 */
@@ -4824,48 +5050,79 @@
4824
5050
  }
4825
5051
 
4826
5052
  .input-textarea {
4827
- min-height: 36px;
4828
- padding: 8px;
5053
+ min-height: 32px;
5054
+ padding: 6px 8px 3px;
4829
5055
  font-size: 16px;
4830
5056
  line-height: 1.35;
4831
5057
  }
4832
5058
 
4833
5059
  .chat-mode-select {
4834
- max-width: 70px;
5060
+ max-width: 65px;
4835
5061
  font-size: 0.5625rem;
4836
- height: 28px;
4837
- min-height: 28px;
4838
- padding: 0 4px;
5062
+ height: 22px;
5063
+ min-height: 22px;
5064
+ padding: 0 14px 0 4px;
4839
5065
  border-radius: 5px;
4840
5066
  }
4841
5067
  .input-hint {
4842
5068
  display: none;
4843
5069
  }
4844
5070
 
4845
- /* 键盘弹出按钮 - 紧凑 */
4846
- .keyboard-toggle-btn {
4847
- width: 28px;
4848
- height: 28px;
4849
- padding: 0;
4850
- border-radius: 5px;
5071
+ /* 移动端内联快捷键 - 折叠为左右滑动条 */
5072
+ .inline-shortcuts-inline {
5073
+ display: none;
4851
5074
  }
4852
- .keyboard-toggle-btn svg {
4853
- width: 14px;
4854
- height: 14px;
5075
+ .inline-shortcuts-wrap {
5076
+ flex-shrink: 1;
5077
+ min-width: 0;
5078
+ overflow: hidden;
4855
5079
  }
4856
- .keyboard-popup {
4857
- padding: 6px;
4858
- gap: 4px;
4859
- border-radius: 8px;
4860
- right: 8px;
4861
- bottom: calc(var(--keyboard-offset, 0px) + 140px);
4862
- min-width: 160px;
5080
+ .shortcuts-toggle {
5081
+ display: inline-flex;
5082
+ align-items: center;
5083
+ justify-content: center;
5084
+ width: 22px;
5085
+ height: 22px;
5086
+ border: none;
5087
+ border-radius: 50%;
5088
+ background: transparent;
5089
+ color: var(--text-muted);
5090
+ font-size: 1rem;
5091
+ font-weight: 700;
5092
+ cursor: pointer;
5093
+ flex-shrink: 0;
5094
+ transition: all 0.15s ease;
5095
+ -webkit-tap-highlight-color: transparent;
5096
+ line-height: 1;
4863
5097
  }
4864
- .kp-key {
4865
- min-width: 36px;
4866
- height: 32px;
4867
- font-size: 0.625rem;
4868
- border-radius: 5px;
5098
+ .shortcuts-toggle.active {
5099
+ color: var(--accent);
5100
+ }
5101
+ .inline-shortcuts-strip {
5102
+ display: none;
5103
+ overflow-x: auto;
5104
+ -webkit-overflow-scrolling: touch;
5105
+ scrollbar-width: none;
5106
+ align-items: center;
5107
+ gap: 3px;
5108
+ flex: 1;
5109
+ min-width: 0;
5110
+ }
5111
+ .inline-shortcuts-strip::-webkit-scrollbar {
5112
+ display: none;
5113
+ }
5114
+ .inline-shortcuts-wrap.expanded .inline-shortcuts-strip {
5115
+ display: flex;
5116
+ }
5117
+ .inline-shortcuts-strip .shortcut-key {
5118
+ height: 22px;
5119
+ min-width: 22px;
5120
+ font-size: 0.5625rem;
5121
+ padding: 0 4px;
5122
+ flex-shrink: 0;
5123
+ }
5124
+ .inline-shortcuts-strip .shortcut-key.shortcut-dir {
5125
+ min-width: 20px;
4869
5126
  }
4870
5127
 
4871
5128
  /* 小键盘 FAB */
@@ -5045,10 +5302,6 @@
5045
5302
  /* iPhone 14/15 等标准屏幕 (390px - 420px) - 使用基础移动端样式,略微调整 */
5046
5303
  @media (min-width: 391px) and (max-width: 420px) {
5047
5304
  /* 继承 max-width: 640px 的样式,此处仅做微调 */
5048
- .topbar {
5049
- padding: 4px 10px;
5050
- min-height: 40px;
5051
- }
5052
5305
 
5053
5306
  .terminal-container {
5054
5307
  margin: 0 6px 6px;
@@ -5064,37 +5317,13 @@
5064
5317
  /* iPhone SE 等小屏幕 (<= 390px) */
5065
5318
  @media (max-width: 390px) {
5066
5319
  /* 继承 max-width: 640px 的样式,此处仅做小屏微调 */
5067
- .app-container {
5068
- --layout-topbar-height: 38px;
5069
- --layout-sidebar-offset: var(--layout-topbar-height);
5320
+ .floating-sidebar-toggle {
5321
+ width: 26px;
5322
+ height: 26px;
5323
+ top: max(6px, env(safe-area-inset-top, 6px));
5324
+ left: 6px;
5070
5325
  }
5071
-
5072
- .topbar {
5073
- padding: 3px 6px;
5074
- min-height: var(--layout-topbar-height);
5075
- gap: 3px;
5076
- }
5077
-
5078
- .topbar-logo-icon { width: 20px; height: 20px; font-size: 9px; border-radius: 5px; }
5079
-
5080
- .topbar .btn-sm,
5081
- .topbar .topbar-btn {
5082
- height: 32px;
5083
- min-height: 32px;
5084
- min-width: 32px;
5085
- padding: 0 6px;
5086
- font-size: 0.625rem;
5087
- border-radius: 5px;
5088
- }
5089
- .topbar .btn-icon,
5090
- .topbar .topbar-btn.square {
5091
- width: 32px;
5092
- height: 32px;
5093
- min-width: 32px;
5094
- min-height: 32px;
5095
- border-radius: 5px;
5096
- }
5097
- .sidebar-toggle-btn { width: 32px; height: 32px; min-width: 32px; min-height: 32px; }
5326
+ .floating-sidebar-toggle .hamburger-icon { width: 11px; height: 8px; }
5098
5327
 
5099
5328
  .terminal-header { padding: 4px 6px; min-height: 28px; }
5100
5329
  .terminal-title-text { font-size: 0.6875rem; }
@@ -5113,10 +5342,10 @@
5113
5342
  padding-bottom: calc(6px + env(safe-area-inset-bottom, 0px));
5114
5343
  }
5115
5344
 
5116
- .input-composer { border-radius: 10px; }
5117
- .input-textarea { min-height: 32px; padding: 6px; font-size: 15px; }
5345
+ .input-composer { border-radius: 8px; }
5346
+ .input-textarea { min-height: 28px; padding: 5px 6px 2px; font-size: 15px; }
5118
5347
 
5119
- .btn-circle { width: 28px; height: 28px; }
5348
+ .btn-circle { width: 24px; height: 24px; min-width: 24px; }
5120
5349
 
5121
5350
  .session-item {
5122
5351
  padding: 6px 8px;
@@ -5124,7 +5353,7 @@
5124
5353
  }
5125
5354
  .session-action-btn { width: 28px; height: 28px; min-width: 28px; min-height: 28px; }
5126
5355
 
5127
- .sidebar { top: var(--layout-sidebar-offset); width: min(240px, calc(100vw - 10px)); }
5356
+ .sidebar { top: 0; width: min(240px, calc(100vw - 10px)); }
5128
5357
 
5129
5358
  .modal { max-height: 80vh; }
5130
5359
  .modal-header { padding: 8px 10px; min-height: 36px; }
@@ -5136,26 +5365,16 @@
5136
5365
 
5137
5366
  /* iPad Mini 等平板 (641px - 768px) */
5138
5367
  @media (min-width: 641px) and (max-width: 768px) {
5139
- .app-container {
5140
- --layout-topbar-height: 52px;
5141
- --layout-sidebar-offset: var(--layout-topbar-height);
5142
- }
5143
-
5144
- .topbar {
5145
- min-height: var(--layout-topbar-height);
5146
- padding: 8px 14px;
5147
- }
5148
-
5149
5368
  .sidebar {
5150
- top: var(--layout-sidebar-offset);
5369
+ top: 0;
5151
5370
  width: min(320px, calc(100vw - 40px));
5152
5371
  }
5153
5372
 
5154
5373
  .session-item {
5155
- min-height: 56px;
5156
- padding: 12px;
5374
+ min-height: 52px;
5375
+ padding: 11px 12px;
5157
5376
  }
5158
- .session-action-btn { width: 36px; height: 36px; min-width: 36px; min-height: 36px; }
5377
+ .session-action-btn { width: 34px; height: 34px; min-width: 34px; min-height: 34px; }
5159
5378
 
5160
5379
  .btn { min-height: 42px; }
5161
5380
  .btn-sm { min-height: 36px; }
@@ -5166,20 +5385,14 @@
5166
5385
 
5167
5386
  /* 横屏模式优化 */
5168
5387
  @media (max-height: 420px) and (orientation: landscape) {
5169
- .app-container {
5170
- --layout-topbar-height: 40px;
5171
- --layout-sidebar-offset: var(--layout-topbar-height);
5172
- }
5173
-
5174
- .topbar {
5175
- min-height: var(--layout-topbar-height);
5176
- padding: 6px 10px;
5388
+ .floating-sidebar-toggle {
5389
+ width: 28px;
5390
+ height: 28px;
5391
+ top: 6px;
5392
+ left: 6px;
5177
5393
  }
5178
5394
 
5179
- .sidebar { top: var(--layout-sidebar-offset); }
5180
-
5181
- .topbar-logo-icon { width: 20px; height: 20px; font-size: 9px; }
5182
- .topbar-new-btn { height: 30px; padding: 0 12px; font-size: 0.72rem; }
5395
+ .sidebar { top: 0; }
5183
5396
 
5184
5397
  .terminal-container {
5185
5398
  min-height: 55vh;