@co0ontty/wand 1.18.12 → 1.21.4

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.
Files changed (39) hide show
  1. package/dist/claude-pty-bridge.d.ts +8 -0
  2. package/dist/claude-pty-bridge.js +34 -11
  3. package/dist/cli.js +72 -5
  4. package/dist/ensure-node-pty-helper.d.ts +1 -0
  5. package/dist/ensure-node-pty-helper.js +51 -0
  6. package/dist/git-quick-commit.d.ts +18 -0
  7. package/dist/git-quick-commit.js +381 -0
  8. package/dist/models.d.ts +3 -1
  9. package/dist/models.js +45 -7
  10. package/dist/process-manager.d.ts +6 -8
  11. package/dist/process-manager.js +90 -176
  12. package/dist/prompt-optimizer.d.ts +5 -0
  13. package/dist/prompt-optimizer.js +72 -0
  14. package/dist/pty-text-utils.d.ts +25 -1
  15. package/dist/pty-text-utils.js +158 -2
  16. package/dist/server-session-routes.d.ts +2 -2
  17. package/dist/server-session-routes.js +94 -8
  18. package/dist/server.d.ts +22 -1
  19. package/dist/server.js +138 -16
  20. package/dist/session-logger.d.ts +15 -4
  21. package/dist/session-logger.js +52 -4
  22. package/dist/structured-session-manager.d.ts +12 -2
  23. package/dist/structured-session-manager.js +465 -22
  24. package/dist/tui/index.d.ts +24 -0
  25. package/dist/tui/index.js +138 -0
  26. package/dist/tui/layout.d.ts +25 -0
  27. package/dist/tui/layout.js +198 -0
  28. package/dist/tui/log-bus.d.ts +23 -0
  29. package/dist/tui/log-bus.js +111 -0
  30. package/dist/tui/relative-time.d.ts +4 -0
  31. package/dist/tui/relative-time.js +27 -0
  32. package/dist/tui/session-formatter.d.ts +17 -0
  33. package/dist/tui/session-formatter.js +111 -0
  34. package/dist/types.d.ts +55 -2
  35. package/dist/web-ui/content/scripts.js +1371 -261
  36. package/dist/web-ui/content/styles.css +436 -9
  37. package/dist/web-ui/content/vendor/wterm/wterm.bundle.js +1 -1
  38. package/dist/ws-broadcast.js +74 -12
  39. package/package.json +3 -1
@@ -188,6 +188,10 @@
188
188
  min-height: 100dvh;
189
189
  height: 100vh;
190
190
  height: 100dvh;
191
+ /* 软键盘弹起时由 JS 注入 --app-viewport-height = visualViewport.height,
192
+ 整体 flex column 自动收缩,让底部 input-panel 上移贴键盘上沿;
193
+ 没注入时退回 100dvh 行为。 */
194
+ height: var(--app-viewport-height, 100dvh);
191
195
  line-height: var(--line-height-base);
192
196
  overflow: hidden;
193
197
  }
@@ -236,6 +240,8 @@
236
240
  min-height: 100dvh;
237
241
  height: 100vh;
238
242
  height: 100dvh;
243
+ /* 与 body 同步:键盘弹起时跟随可见视口收缩。 */
244
+ height: var(--app-viewport-height, 100dvh);
239
245
  overflow: hidden;
240
246
  }
241
247
 
@@ -376,8 +382,9 @@
376
382
  /* .sidebar-open class toggled for semantic purposes only; sidebar overlays without resizing main layout */
377
383
  .sidebar-open:not(.sidebar-pinned) .input-panel {
378
384
  opacity: 0;
385
+ visibility: hidden;
379
386
  pointer-events: none;
380
- transition: opacity 0.2s ease;
387
+ transition: opacity 0.2s ease, visibility 0s linear 0.2s;
381
388
  }
382
389
 
383
390
  /* ===== 侧边栏常驻 ===== */
@@ -2230,6 +2237,52 @@
2230
2237
  gap: 8px;
2231
2238
  position: relative;
2232
2239
  }
2240
+
2241
+ /* 顶部细进度条:会话运行中时流动 */
2242
+ .main-header-row::after {
2243
+ content: "";
2244
+ position: absolute;
2245
+ left: 0;
2246
+ right: 0;
2247
+ bottom: 0;
2248
+ height: 2px;
2249
+ pointer-events: none;
2250
+ background: linear-gradient(
2251
+ 90deg,
2252
+ transparent 0%,
2253
+ rgba(var(--accent-rgb, 197, 101, 61), 0.85) 35%,
2254
+ rgba(var(--accent-rgb, 197, 101, 61), 1) 50%,
2255
+ rgba(var(--accent-rgb, 197, 101, 61), 0.85) 65%,
2256
+ transparent 100%
2257
+ );
2258
+ background-size: 220% 100%;
2259
+ background-position: 100% center;
2260
+ opacity: 0;
2261
+ transition: opacity 0.25s ease;
2262
+ }
2263
+ .main-header-row.is-running::after {
2264
+ opacity: 1;
2265
+ animation: topbarProgressFlow 1.6s linear infinite;
2266
+ }
2267
+ .main-header-row.is-permission-blocked::after {
2268
+ background: linear-gradient(
2269
+ 90deg,
2270
+ transparent 0%,
2271
+ rgba(169, 106, 47, 0.85) 35%,
2272
+ rgba(169, 106, 47, 1) 50%,
2273
+ rgba(169, 106, 47, 0.85) 65%,
2274
+ transparent 100%
2275
+ );
2276
+ background-size: 220% 100%;
2277
+ animation-duration: 2.4s;
2278
+ }
2279
+ @keyframes topbarProgressFlow {
2280
+ 0% { background-position: 100% center; }
2281
+ 100% { background-position: -100% center; }
2282
+ }
2283
+ @media (prefers-reduced-motion: reduce) {
2284
+ .main-header-row.is-running::after { animation: none; opacity: 0.7; }
2285
+ }
2233
2286
  .topbar-left {
2234
2287
  display: flex;
2235
2288
  align-items: center;
@@ -2375,6 +2428,18 @@
2375
2428
  }
2376
2429
  .session-status-pill.failed .session-status-dot { background: var(--danger); }
2377
2430
  .session-status-pill.archived { opacity: 0.7; }
2431
+ /* 运行/思考中状态的累计耗时 */
2432
+ .session-status-pill .session-status-elapsed {
2433
+ flex-shrink: 0;
2434
+ margin-left: 4px;
2435
+ padding-left: 6px;
2436
+ border-left: 1px solid currentColor;
2437
+ opacity: 0.75;
2438
+ font-variant-numeric: tabular-nums;
2439
+ font-family: var(--font-mono, monospace);
2440
+ font-size: 0.65rem;
2441
+ letter-spacing: -0.01em;
2442
+ }
2378
2443
 
2379
2444
  /* Current task indicator(动态活动徽标,由 updateTaskDisplay 管理) */
2380
2445
  .current-task {
@@ -2495,13 +2560,31 @@
2495
2560
  padding: 12px;
2496
2561
  border-radius: 0;
2497
2562
  box-shadow: none;
2563
+ /* PC 端(Windows 125%/150% 缩放、Linux 1× DPR 等)字符渲染特别敏感:
2564
+ * 1) 默认子像素抗锯齿在彩色终端背景下视觉发虚 → 强制灰度抗锯齿;
2565
+ * 2) 等宽字体的连字(liga/calt)和 kerning 会让 ">=" / "->" 等
2566
+ * 字符相邻时实际宽度变化,破坏 wterm 用 "W" 单字符测出的等宽
2567
+ * 假设,累积下来就是字符错列;
2568
+ * 3) text-rendering: geometricPrecision 让浏览器按字形几何排版,
2569
+ * 不再做 optimizeSpeed 的整数像素吸附,配合下面的整数 row-height
2570
+ * 让网格对齐稳定。 */
2571
+ -webkit-font-smoothing: antialiased;
2572
+ -moz-osx-font-smoothing: grayscale;
2573
+ text-rendering: geometricPrecision;
2574
+ font-variant-ligatures: none;
2575
+ font-feature-settings: "liga" 0, "clig" 0, "calt" 0, "dlig" 0;
2576
+ font-kerning: none;
2498
2577
  --term-fg: #f5eadc;
2499
2578
  --term-bg: transparent;
2500
2579
  --term-cursor: #d67b52;
2501
2580
  --term-font-family: "Geist Mono", "SF Mono", monospace;
2502
2581
  --term-font-size: 13px;
2503
- --term-line-height: 1.5;
2504
- --term-row-height: calc(13px * 1.5);
2582
+ /* 行高直接给整数像素,避免 13×1.5=19.5 的亚像素行:PC 端 1× DPR 时
2583
+ * 浏览器把 19.5 四舍五入成 19 或 20,相邻行的吸附方向不一致就会
2584
+ * 出现错位。20px 是 wterm 既定的 cell 高度基线,移动端高 DPR 也
2585
+ * 完全不变。 */
2586
+ --term-line-height: 1.54;
2587
+ --term-row-height: 20px;
2505
2588
  --term-color-0: #1f1b17;
2506
2589
  --term-color-1: #d27766;
2507
2590
  --term-color-2: #7fa36f;
@@ -4858,6 +4941,7 @@
4858
4941
  overscroll-behavior: contain;
4859
4942
  touch-action: pan-y;
4860
4943
  border-top: 1px solid var(--border-subtle);
4944
+ transition: opacity 0.2s ease, visibility 0s;
4861
4945
  }
4862
4946
 
4863
4947
  .input-composer {
@@ -5215,6 +5299,18 @@
5215
5299
  .input-label { font-size: 0.6875rem; color: var(--text-muted); font-weight: 500; }
5216
5300
  .input-textarea-wrap { position: relative; width: 100%; }
5217
5301
 
5302
+ /* Composer top row: holds todo collapse bar (left) + reply status bar (right) on one line */
5303
+ .composer-top-row {
5304
+ display: flex;
5305
+ align-items: flex-start;
5306
+ gap: 8px;
5307
+ min-width: 0;
5308
+ }
5309
+ .composer-top-row:has(> .todo-progress:not(.hidden)),
5310
+ .composer-top-row:has(> .structured-status-bar) {
5311
+ margin-bottom: 6px;
5312
+ }
5313
+
5218
5314
  /* Todo progress bar */
5219
5315
  .todo-progress {
5220
5316
  margin-bottom: 6px;
@@ -5223,6 +5319,11 @@
5223
5319
  transition: all var(--transition-fast);
5224
5320
  }
5225
5321
  .todo-progress.hidden { display: none; }
5322
+ .composer-top-row > .todo-progress {
5323
+ flex: 1;
5324
+ min-width: 0;
5325
+ margin-bottom: 0;
5326
+ }
5226
5327
  .todo-progress-header {
5227
5328
  display: flex;
5228
5329
  align-items: center;
@@ -5719,7 +5820,7 @@
5719
5820
  background: transparent;
5720
5821
  border: none;
5721
5822
  color: var(--text-primary);
5722
- padding: 8px 10px 3px;
5823
+ padding: 8px 34px 3px 10px;
5723
5824
  outline: none;
5724
5825
  resize: none;
5725
5826
  min-height: 32px;
@@ -5758,6 +5859,16 @@
5758
5859
  padding-bottom: 28px;
5759
5860
  min-height: 60px;
5760
5861
  }
5862
+ /* 终端交互模式下 textarea 设为 readonly,按键透传到 PTY。
5863
+ 视觉上给一个降饱和度 + 斜体 placeholder,让用户感知到"这里
5864
+ 不再录字、键被直接送到终端",避免疑惑为什么打字没字落下来。 */
5865
+ .input-textarea.is-terminal-passthrough {
5866
+ opacity: 0.7;
5867
+ cursor: default;
5868
+ }
5869
+ .input-textarea.is-terminal-passthrough::placeholder {
5870
+ font-style: italic;
5871
+ }
5761
5872
 
5762
5873
  .input-inline-controls {
5763
5874
  }
@@ -5847,6 +5958,148 @@
5847
5958
  transform: scale(0.95);
5848
5959
  }
5849
5960
 
5961
+ /* Prompt optimize button — top-right of the input composer */
5962
+ .prompt-optimize-btn {
5963
+ position: absolute;
5964
+ top: 5px;
5965
+ right: 6px;
5966
+ width: 28px;
5967
+ height: 28px;
5968
+ border-radius: 50%;
5969
+ border: 1px solid rgba(197, 101, 61, 0.22);
5970
+ padding: 0;
5971
+ cursor: pointer;
5972
+ display: inline-flex;
5973
+ align-items: center;
5974
+ justify-content: center;
5975
+ background: linear-gradient(135deg, rgba(255, 250, 242, 0.95) 0%, rgba(232, 197, 174, 0.35) 100%);
5976
+ color: var(--accent);
5977
+ z-index: 4;
5978
+ box-shadow: 0 1px 4px rgba(197, 101, 61, 0.10);
5979
+ transition: background var(--transition-fast), color var(--transition-fast), transform var(--transition-fast), box-shadow var(--transition-fast), border-color var(--transition-fast);
5980
+ }
5981
+ .prompt-optimize-btn:hover {
5982
+ background: linear-gradient(135deg, rgba(255, 250, 242, 1) 0%, rgba(232, 197, 174, 0.55) 100%);
5983
+ color: var(--accent-hover);
5984
+ transform: scale(1.12);
5985
+ border-color: rgba(197, 101, 61, 0.35);
5986
+ box-shadow: 0 2px 10px rgba(197, 101, 61, 0.22), 0 0 0 3px rgba(197, 101, 61, 0.06);
5987
+ }
5988
+ .prompt-optimize-btn:active {
5989
+ transform: scale(0.92);
5990
+ box-shadow: 0 1px 3px rgba(197, 101, 61, 0.15);
5991
+ }
5992
+ .prompt-optimize-btn:disabled {
5993
+ cursor: not-allowed;
5994
+ opacity: 0.6;
5995
+ }
5996
+ .prompt-optimize-btn:disabled:hover {
5997
+ transform: none;
5998
+ background: linear-gradient(135deg, rgba(255, 250, 242, 0.95) 0%, rgba(232, 197, 174, 0.35) 100%);
5999
+ box-shadow: 0 1px 4px rgba(197, 101, 61, 0.10);
6000
+ border-color: rgba(197, 101, 61, 0.22);
6001
+ }
6002
+ .prompt-optimize-icon {
6003
+ transition: transform 0.25s ease, opacity 0.2s ease;
6004
+ transform-origin: center;
6005
+ filter: drop-shadow(0 0 1px rgba(197, 101, 61, 0.3));
6006
+ }
6007
+ .prompt-optimize-btn:hover .prompt-optimize-icon {
6008
+ animation: prompt-optimize-twinkle 1.4s ease-in-out infinite;
6009
+ filter: drop-shadow(0 0 3px rgba(197, 101, 61, 0.4));
6010
+ }
6011
+ @keyframes prompt-optimize-twinkle {
6012
+ 0%, 100% { transform: rotate(0deg) scale(1); }
6013
+ 50% { transform: rotate(12deg) scale(1.12); }
6014
+ }
6015
+ .prompt-optimize-spinner {
6016
+ position: absolute;
6017
+ inset: 0;
6018
+ border-radius: 50%;
6019
+ pointer-events: none;
6020
+ opacity: 0;
6021
+ background: conic-gradient(from 0deg, transparent 0deg, var(--accent) 270deg, transparent 360deg);
6022
+ mask: radial-gradient(circle, transparent 10px, black 11px);
6023
+ -webkit-mask: radial-gradient(circle, transparent 10px, black 11px);
6024
+ transition: opacity 0.15s ease;
6025
+ }
6026
+ .prompt-optimize-btn.is-loading {
6027
+ color: var(--accent);
6028
+ background: linear-gradient(135deg, rgba(255, 250, 242, 1) 0%, rgba(232, 197, 174, 0.5) 100%);
6029
+ border-color: rgba(197, 101, 61, 0.4);
6030
+ box-shadow: 0 2px 12px rgba(197, 101, 61, 0.25), 0 0 0 3px rgba(197, 101, 61, 0.08);
6031
+ }
6032
+ .prompt-optimize-btn.is-loading .prompt-optimize-icon {
6033
+ animation: prompt-optimize-pulse 1.1s ease-in-out infinite;
6034
+ }
6035
+ .prompt-optimize-btn.is-loading .prompt-optimize-spinner {
6036
+ opacity: 1;
6037
+ animation: prompt-optimize-spin 0.9s linear infinite;
6038
+ }
6039
+ @keyframes prompt-optimize-spin {
6040
+ to { transform: rotate(360deg); }
6041
+ }
6042
+ @keyframes prompt-optimize-pulse {
6043
+ 0%, 100% { transform: scale(0.88); opacity: 0.8; }
6044
+ 50% { transform: scale(1.15); opacity: 1; }
6045
+ }
6046
+
6047
+ /* 优化中:输入框整体出现柔和的边框光晕 + textarea 区域
6048
+ 的横向流光,文字保持原样,不打扰用户阅读。 */
6049
+ .input-composer.is-optimizing {
6050
+ border-color: rgba(197, 101, 61, 0.42);
6051
+ box-shadow:
6052
+ 0 0 0 2px rgba(197, 101, 61, 0.10),
6053
+ 0 0 18px rgba(197, 101, 61, 0.14);
6054
+ }
6055
+ .input-composer.is-optimizing .input-textarea-wrap::before {
6056
+ content: "";
6057
+ position: absolute;
6058
+ inset: 0;
6059
+ pointer-events: none;
6060
+ background: linear-gradient(
6061
+ 100deg,
6062
+ transparent 0%,
6063
+ transparent 38%,
6064
+ rgba(214, 123, 82, 0.16) 50%,
6065
+ transparent 62%,
6066
+ transparent 100%
6067
+ );
6068
+ background-size: 220% 100%;
6069
+ background-repeat: no-repeat;
6070
+ background-position: 220% 0;
6071
+ animation: prompt-optimize-flow 1.6s linear infinite;
6072
+ z-index: 0;
6073
+ }
6074
+ @keyframes prompt-optimize-flow {
6075
+ from { background-position: 220% 0; }
6076
+ to { background-position: -120% 0; }
6077
+ }
6078
+ .prompt-optimize-btn.is-shake {
6079
+ animation: prompt-optimize-shake 0.4s ease-out;
6080
+ color: var(--danger);
6081
+ }
6082
+ @keyframes prompt-optimize-shake {
6083
+ 0%, 100% { transform: translateX(0); }
6084
+ 20% { transform: translateX(-3px); }
6085
+ 40% { transform: translateX(3px); }
6086
+ 60% { transform: translateX(-2px); }
6087
+ 80% { transform: translateX(2px); }
6088
+ }
6089
+
6090
+ @media (max-width: 720px) {
6091
+ .prompt-optimize-btn {
6092
+ width: 26px;
6093
+ height: 26px;
6094
+ top: 3px;
6095
+ right: 4px;
6096
+ }
6097
+ .prompt-optimize-icon {
6098
+ width: 14px;
6099
+ height: 14px;
6100
+ }
6101
+ }
6102
+
5850
6103
  .attachment-preview {
5851
6104
  display: flex;
5852
6105
  gap: 6px;
@@ -6930,7 +7183,7 @@
6930
7183
 
6931
7184
  .input-textarea {
6932
7185
  min-height: 32px;
6933
- padding: 6px 8px 3px;
7186
+ padding: 6px 30px 3px 8px;
6934
7187
  font-size: 16px;
6935
7188
  line-height: 1.35;
6936
7189
  }
@@ -7256,7 +7509,7 @@
7256
7509
  }
7257
7510
 
7258
7511
  .input-composer { border-radius: 8px; }
7259
- .input-textarea { min-height: 28px; padding: 5px 6px 2px; font-size: 16px; }
7512
+ .input-textarea { min-height: 28px; padding: 5px 28px 2px 6px; font-size: 16px; }
7260
7513
 
7261
7514
  .btn-circle { width: 28px; height: 28px; min-width: 28px; }
7262
7515
 
@@ -9871,20 +10124,22 @@
9871
10124
  100% { background-position: 100% center; }
9872
10125
  }
9873
10126
 
9874
- /* ── 结构化会话状态条(输入框右上角) ── */
10127
+ /* ── 结构化会话状态条(与 todo 折叠栏共处一行,靠右) ── */
9875
10128
  .structured-status-bar {
9876
10129
  display: flex;
9877
10130
  align-items: center;
9878
10131
  justify-content: flex-end;
9879
10132
  gap: 5px;
9880
- margin: 0 4px 2px 0;
9881
- padding: 0;
10133
+ margin: 0;
10134
+ margin-left: auto;
10135
+ padding: 4px 8px;
9882
10136
  background: transparent;
9883
10137
  border: none;
9884
10138
  font-size: 0.6875rem;
9885
10139
  color: var(--text-muted);
9886
10140
  transition: all 0.3s ease;
9887
10141
  overflow: hidden;
10142
+ flex-shrink: 0;
9888
10143
  }
9889
10144
 
9890
10145
  .structured-status-bar .status-bar-dot {
@@ -10425,4 +10680,176 @@
10425
10680
  }
10426
10681
  }
10427
10682
 
10683
+ /* ── 顶栏 git 徽章 ── */
10684
+ .topbar-git-slot {
10685
+ display: inline-flex;
10686
+ align-items: center;
10687
+ }
10688
+ .topbar-git-slot:empty {
10689
+ display: none;
10690
+ }
10691
+ .topbar-git-badge {
10692
+ display: inline-flex;
10693
+ align-items: center;
10694
+ gap: 5px;
10695
+ height: 32px;
10696
+ padding: 0 10px;
10697
+ font-family: var(--font-sans);
10698
+ font-size: 0.72rem;
10699
+ font-weight: 500;
10700
+ color: var(--text-secondary);
10701
+ background: transparent;
10702
+ border: 1px solid transparent;
10703
+ border-radius: var(--radius-sm);
10704
+ cursor: pointer;
10705
+ white-space: nowrap;
10706
+ transition: all var(--transition-fast);
10707
+ box-sizing: border-box;
10708
+ line-height: 1;
10709
+ }
10710
+ .topbar-git-badge:hover {
10711
+ background: rgba(255, 255, 255, 0.5);
10712
+ color: var(--text-primary);
10713
+ }
10714
+ .topbar-git-badge:active {
10715
+ transform: scale(0.96);
10716
+ }
10717
+ .topbar-git-icon {
10718
+ flex-shrink: 0;
10719
+ opacity: 0.85;
10720
+ }
10721
+ .topbar-git-branch {
10722
+ font-family: var(--font-mono, monospace);
10723
+ font-weight: 600;
10724
+ max-width: 12em;
10725
+ overflow: hidden;
10726
+ text-overflow: ellipsis;
10727
+ }
10728
+ .topbar-git-count {
10729
+ color: var(--accent);
10730
+ font-weight: 700;
10731
+ font-family: var(--font-mono, monospace);
10732
+ }
10733
+ .topbar-git-clean {
10734
+ color: rgba(60, 160, 90, 0.85);
10735
+ font-weight: 700;
10736
+ font-size: 0.78rem;
10737
+ }
10738
+
10739
+ /* ── 快捷提交模态框 ── */
10740
+ .quick-commit-modal {
10741
+ max-width: 560px;
10742
+ }
10743
+ .quick-commit-modal .modal-body {
10744
+ display: flex;
10745
+ flex-direction: column;
10746
+ gap: 12px;
10747
+ }
10748
+ .qc-files-wrap {
10749
+ max-height: 200px;
10750
+ overflow-y: auto;
10751
+ padding: 8px 10px;
10752
+ border: 1px solid var(--border-color, rgba(0, 0, 0, 0.08));
10753
+ border-radius: 6px;
10754
+ background: rgba(255, 255, 255, 0.45);
10755
+ font-family: var(--font-mono, monospace);
10756
+ font-size: 0.78rem;
10757
+ display: flex;
10758
+ flex-direction: column;
10759
+ gap: 2px;
10760
+ }
10761
+ .qc-empty {
10762
+ color: var(--text-muted);
10763
+ padding: 6px 0;
10764
+ text-align: center;
10765
+ font-style: italic;
10766
+ }
10767
+ .qc-file-row {
10768
+ display: flex;
10769
+ align-items: center;
10770
+ gap: 8px;
10771
+ line-height: 1.5;
10772
+ }
10773
+ .qc-flag {
10774
+ flex-shrink: 0;
10775
+ width: 24px;
10776
+ text-align: center;
10777
+ font-weight: 700;
10778
+ color: var(--text-muted);
10779
+ letter-spacing: 0;
10780
+ }
10781
+ .qc-flag-add { color: rgba(60, 160, 90, 0.95); }
10782
+ .qc-flag-mod { color: rgba(220, 150, 30, 0.95); }
10783
+ .qc-flag-del { color: rgba(200, 70, 70, 0.95); }
10784
+ .qc-flag-ren { color: rgba(110, 130, 200, 0.95); }
10785
+ .qc-flag-untracked { color: rgba(140, 140, 140, 0.95); }
10786
+ .qc-file-path {
10787
+ color: var(--text-secondary);
10788
+ overflow: hidden;
10789
+ text-overflow: ellipsis;
10790
+ white-space: nowrap;
10791
+ flex: 1 1 auto;
10792
+ min-width: 0;
10793
+ }
10794
+ .qc-submodule-badge {
10795
+ flex-shrink: 0;
10796
+ padding: 1px 6px;
10797
+ border-radius: 8px;
10798
+ background: rgba(140, 100, 200, 0.16);
10799
+ color: rgba(110, 70, 180, 0.95);
10800
+ font-size: 0.68rem;
10801
+ font-weight: 600;
10802
+ letter-spacing: 0.02em;
10803
+ white-space: nowrap;
10804
+ }
10805
+ .qc-checkbox-row {
10806
+ display: flex;
10807
+ align-items: center;
10808
+ gap: 8px;
10809
+ font-size: 0.85rem;
10810
+ color: var(--text-primary);
10811
+ cursor: pointer;
10812
+ user-select: none;
10813
+ }
10814
+ .qc-checkbox-row input[type="checkbox"] {
10815
+ width: 16px;
10816
+ height: 16px;
10817
+ cursor: pointer;
10818
+ }
10819
+ .qc-message-row,
10820
+ .qc-tag-row {
10821
+ display: flex;
10822
+ flex-direction: column;
10823
+ gap: 4px;
10824
+ }
10825
+ .qc-message-row.hidden,
10826
+ .qc-tag-row.hidden {
10827
+ display: none;
10828
+ }
10829
+ .qc-message-header {
10830
+ display: flex;
10831
+ align-items: center;
10832
+ justify-content: space-between;
10833
+ gap: 8px;
10834
+ }
10835
+ .qc-message-row textarea {
10836
+ resize: vertical;
10837
+ min-height: 56px;
10838
+ font-family: var(--font-mono, monospace);
10839
+ font-size: 0.85rem;
10840
+ }
10841
+ .quick-commit-modal .worktree-merge-actions {
10842
+ display: flex;
10843
+ justify-content: flex-end;
10844
+ gap: 8px;
10845
+ margin-top: 4px;
10846
+ }
10847
+
10848
+ @media (max-width: 720px) {
10849
+ .topbar-git-branch { max-width: 8em; }
10850
+ .topbar-git-badge { padding: 0 8px; font-size: 0.7rem; }
10851
+ .quick-commit-modal { max-width: 95vw; }
10852
+ .qc-files-wrap { max-height: 160px; }
10853
+ }
10854
+
10428
10855
  /* 结束标记 */