@co0ontty/wand 1.39.0 → 1.40.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.
@@ -258,9 +258,9 @@
258
258
  min-height: 100dvh;
259
259
  height: 100vh;
260
260
  height: 100dvh;
261
- /* 软键盘弹起时由 JS 注入 --app-viewport-height = visualViewport.height,
262
- 整体 flex column 自动收缩,让底部 input-panel 上移贴键盘上沿;
263
- 没注入时退回 100dvh 行为。 */
261
+ /* JS 注入 --app-viewport-height = visualViewport.height,
262
+ 键盘开关和 iOS 地址栏动画时整体 flex column 跟随可见视口;
263
+ 不支持 visualViewport 时退回 100dvh */
264
264
  height: var(--app-viewport-height, 100dvh);
265
265
  line-height: var(--line-height-base);
266
266
  overflow: hidden;
@@ -310,7 +310,7 @@
310
310
  min-height: 100dvh;
311
311
  height: 100vh;
312
312
  height: 100dvh;
313
- /* 与 body 同步:键盘弹起时跟随可见视口收缩。 */
313
+ /* 与 body 同步:键盘开关时跟随可见视口收缩/恢复。 */
314
314
  height: var(--app-viewport-height, 100dvh);
315
315
  overflow: hidden;
316
316
  }
@@ -547,6 +547,7 @@
547
547
  }
548
548
  .sidebar.pinned.collapsed .sidebar-header-main,
549
549
  .sidebar.pinned.collapsed .sidebar-header-more,
550
+ .sidebar.pinned.collapsed .sidebar-pin-toggle,
550
551
  .sidebar.pinned.collapsed .sidebar-footer {
551
552
  display: none;
552
553
  }
@@ -613,6 +614,24 @@
613
614
  0 4px 10px -3px rgba(120, 88, 56, 0.3),
614
615
  inset 0 1px 0 rgba(255, 255, 255, 0.48);
615
616
  }
617
+ /* 快速新建会话 tile —— 虚线描边 + 加号,区别于实心会话方块 */
618
+ .sidebar-collapsed-tile.add {
619
+ background: rgba(184, 92, 55, 0.06);
620
+ border: 1.5px dashed rgba(184, 92, 55, 0.5);
621
+ color: #a04a2e;
622
+ box-shadow: none;
623
+ margin-top: 2px;
624
+ }
625
+ .sidebar-collapsed-tile.add:hover {
626
+ filter: none;
627
+ transform: translateY(-1px);
628
+ background: rgba(184, 92, 55, 0.12);
629
+ border-color: rgba(184, 92, 55, 0.72);
630
+ box-shadow: 0 3px 8px -3px rgba(184, 92, 55, 0.32);
631
+ }
632
+ .sidebar-collapsed-tile.add:active {
633
+ transform: translateY(0) scale(0.94);
634
+ }
616
635
  /* Active — accent ring + 一层柔和暖投影 + 顶高光。原先 7 层叠加在 36px 小块上
617
636
  糊成一团,精简到 3 层即可表达「升起 + 选中」。 */
618
637
  .sidebar-collapsed-tile.active {
@@ -627,13 +646,6 @@
627
646
  transform: translateY(0) scale(0.94);
628
647
  transition-duration: 0.08s;
629
648
  }
630
- .sidebar-collapsed-empty {
631
- color: var(--text-muted, rgba(89, 58, 32, 0.45));
632
- text-align: center;
633
- font-size: 16px;
634
- padding: 12px 0;
635
- user-select: none;
636
- }
637
649
  /* Hover tooltip bubble for narrow tiles — chat-bubble look */
638
650
  .sidebar-tile-bubble {
639
651
  position: fixed;
@@ -683,6 +695,17 @@
683
695
  .sidebar-collapse-toggle.collapsed {
684
696
  color: var(--primary);
685
697
  }
698
+ /* 常驻(图钉)开关:默认描边态;常驻时图钉「按下」,用 accent 高亮 + 45° 旋转。 */
699
+ .sidebar-pin-toggle {
700
+ flex-shrink: 0;
701
+ transition: background 0.16s ease, color var(--transition-fast),
702
+ transform 0.3s var(--ease-out-expo);
703
+ }
704
+ .sidebar-pin-toggle.pinned {
705
+ background: rgba(197, 101, 61, 0.12);
706
+ color: var(--accent);
707
+ transform: rotate(45deg);
708
+ }
686
709
 
687
710
  /* ===== 侧边栏头部 ===== */
688
711
  .sidebar-header {
@@ -712,11 +735,9 @@
712
735
  flex-shrink: 0;
713
736
  }
714
737
 
715
- /* On desktop pinned mode the close (X) button is redundant the hamburger
716
- toggle in the topbar already opens/closes the sidebar. Hide it to declutter. */
717
- .sidebar.pinned .sidebar-header-actions .sidebar-close {
718
- display: none;
719
- }
738
+ /* The close (X) is the deliberate "hide the sidebar" control on desktop —
739
+ the pin only toggles 常驻 lock and never hides. Keep X visible while docked
740
+ (it's still hidden in the narrow/collapsed strip via the rule above). */
720
741
 
721
742
  .sidebar-header-more {
722
743
  position: relative;
@@ -813,6 +834,8 @@
813
834
  font-weight: 600;
814
835
  color: var(--text-primary);
815
836
  letter-spacing: -0.01em;
837
+ white-space: nowrap;
838
+ flex-shrink: 0;
816
839
  }
817
840
 
818
841
  .session-count {
@@ -1022,6 +1045,8 @@
1022
1045
  opacity: 1;
1023
1046
  pointer-events: auto;
1024
1047
  }
1048
+ /* 常驻(图钉)只在桌面有意义——手机端隐藏这个按钮,避免死按钮。 */
1049
+ .sidebar-pin-toggle { display: none; }
1025
1050
  }
1026
1051
 
1027
1052
  .file-side-panel-header {
@@ -1264,6 +1289,7 @@
1264
1289
  flex: 1;
1265
1290
  min-height: 0;
1266
1291
  overflow-y: auto;
1292
+ -webkit-overflow-scrolling: touch;
1267
1293
  position: relative;
1268
1294
  }
1269
1295
 
@@ -1275,12 +1301,26 @@
1275
1301
 
1276
1302
  /* ===== 会话列表 ===== */
1277
1303
  .sessions-list {
1278
- flex: 1;
1304
+ /* Flex column that fills the scroll body so the 历史会话 group can pin to
1305
+ the very bottom (margin-top:auto) when the list is short, yet flow
1306
+ naturally and scroll when it's long. #sessions-panel is display:contents
1307
+ so this is effectively a direct child of the scrolling .sidebar-body. */
1308
+ flex: 1 0 auto;
1279
1309
  min-height: 0;
1280
- overflow-y: auto;
1310
+ display: flex;
1311
+ flex-direction: column;
1312
+ /* No own scroll: .sidebar-body is the scroll container. overflow:visible
1313
+ lets the manage bar's position:sticky bind to .sidebar-body. */
1314
+ overflow: visible;
1281
1315
  padding: 10px 10px 12px;
1282
1316
  }
1283
1317
 
1318
+ /* Unwrap the panel so .sessions-list is a direct flex child of the
1319
+ scrolling .sidebar-body (enables fill + bottom-pin). */
1320
+ #sessions-panel {
1321
+ display: contents;
1322
+ }
1323
+
1284
1324
  .sessions-list:empty::before {
1285
1325
  content: '暂无会话';
1286
1326
  display: flex;
@@ -1292,7 +1332,7 @@
1292
1332
  }
1293
1333
 
1294
1334
  /* ===== 会话分组 ===== */
1295
- .session-group { margin-bottom: 20px; }
1335
+ .session-group { margin-bottom: 14px; }
1296
1336
  .session-group:last-child { margin-bottom: 0; }
1297
1337
 
1298
1338
  /* Legacy .session-manage-bar / .session-manage-toggle / .session-manage-btn
@@ -1370,10 +1410,17 @@
1370
1410
  }
1371
1411
  .claude-history-directory-title {
1372
1412
  font-size: 0.6875rem;
1373
- padding: 6px 8px;
1413
+ padding: 6px 8px 6px 12px;
1374
1414
  opacity: 0.8;
1375
1415
  justify-content: space-between;
1376
1416
  }
1417
+ /* No accent bar on nested directory rows — the 3px bar stays on top-level
1418
+ groups (历史会话 / 已归档) only, so the hierarchy reads as group → folder
1419
+ → items instead of a column of identical orange ticks. The chevron +
1420
+ slight indent already signal the sub-level. */
1421
+ .claude-history-directory-header .claude-history-directory-title::before {
1422
+ display: none;
1423
+ }
1377
1424
  .claude-history-directory-label {
1378
1425
  min-width: 0;
1379
1426
  overflow: hidden;
@@ -1545,8 +1592,8 @@
1545
1592
  min-width: 0;
1546
1593
  display: flex;
1547
1594
  flex-direction: column;
1548
- gap: 4px;
1549
- padding-right: 64px;
1595
+ gap: 3px;
1596
+ padding-right: 60px;
1550
1597
  }
1551
1598
 
1552
1599
  .session-title-row {
@@ -2237,11 +2284,18 @@
2237
2284
  .session-status.stopped .session-status-dot { background: var(--warning); }
2238
2285
 
2239
2286
  .session-status.running { background: var(--success-muted); color: var(--success); }
2240
- .session-status.exited { background: rgba(150, 118, 85, 0.1); color: var(--text-tertiary); }
2241
2287
  .session-status.failed { background: var(--danger-muted); color: var(--danger); }
2242
2288
  .session-status.stopped { background: var(--warning-muted); color: var(--warning); }
2243
2289
  .session-status.permission-blocked { background: rgba(240, 165, 0, 0.14); color: #d18b00; }
2244
- .session-status.archived { background: rgba(95, 74, 57, 0.08); color: var(--text-tertiary); }
2290
+ /* Quiet "done" states no filled pill, just a dot + muted text, so a long
2291
+ list of finished sessions doesn't read as a stack of grey boxes. */
2292
+ .session-status.exited,
2293
+ .session-status.archived {
2294
+ background: transparent;
2295
+ color: var(--text-muted);
2296
+ padding-left: 0;
2297
+ padding-right: 0;
2298
+ }
2245
2299
 
2246
2300
  @keyframes status-pulse {
2247
2301
  0%, 100% { opacity: 1; }
@@ -2258,126 +2312,36 @@
2258
2312
  font-weight: 500;
2259
2313
  }
2260
2314
 
2261
- /* ===== Sidebar: docked Claude history region =====
2262
- Lives between .sidebar-body and .sidebar-footer. Collapsed by default
2263
- only a slim header row ("历史消息" + 数字气泡) is visible, so the main
2264
- scrolling area focuses on recent / archived sessions. Expanding it
2265
- grows the region with a 40% max-height cap so it can never eat the
2266
- sessions list above. */
2267
- .sidebar-history-region {
2268
- flex-shrink: 0;
2269
- display: flex;
2270
- flex-direction: column;
2271
- min-height: 0;
2272
- max-height: 40%;
2273
- border-top: 1px solid var(--border-subtle);
2274
- background: rgba(255, 251, 245, 0.66);
2275
- transition: max-height 0.28s var(--ease-out-expo);
2276
- }
2277
-
2278
- .sidebar-history-header {
2279
- display: flex;
2280
- align-items: center;
2281
- justify-content: space-between;
2282
- width: 100%;
2283
- padding: 9px 14px;
2284
- min-height: 38px;
2285
- flex-shrink: 0;
2286
- background: transparent;
2287
- border: none;
2288
- border-radius: 0;
2289
- cursor: pointer;
2290
- text-align: left;
2291
- font-family: var(--font-sans);
2292
- font-size: 0.75rem;
2293
- font-weight: 600;
2294
- letter-spacing: 0.005em;
2295
- color: var(--text-secondary);
2296
- transition: background var(--transition-fast), color var(--transition-fast);
2297
- -webkit-tap-highlight-color: transparent;
2298
- }
2299
-
2300
- .sidebar-history-header:hover {
2301
- background: rgba(150, 118, 85, 0.06);
2302
- color: var(--text-primary);
2303
- }
2304
-
2305
- .sidebar-history-header:active {
2306
- background: rgba(150, 118, 85, 0.1);
2307
- }
2308
-
2309
- .sidebar-history-header.expanded {
2310
- background: rgba(255, 251, 245, 0.85);
2311
- color: var(--text-primary);
2312
- border-bottom: 1px solid var(--border-subtle);
2313
- }
2314
-
2315
- .sidebar-history-label {
2316
- display: inline-flex;
2317
- align-items: center;
2318
- gap: 6px;
2319
- }
2320
-
2321
- .sidebar-history-right {
2322
- display: inline-flex;
2323
- align-items: center;
2324
- gap: 8px;
2325
- flex-shrink: 0;
2326
- }
2327
-
2328
- /* Count bubble — pill shape, tabular numerals, accent-tinted when there
2329
- are items, muted when empty/loading. */
2330
- .history-bubble {
2331
- display: inline-flex;
2332
- align-items: center;
2333
- justify-content: center;
2334
- min-width: 22px;
2335
- height: 18px;
2336
- padding: 0 7px;
2337
- border-radius: 999px;
2338
- background: var(--accent-muted);
2339
- color: var(--accent);
2340
- font-size: 0.6875rem;
2341
- font-weight: 700;
2342
- font-variant-numeric: tabular-nums;
2343
- line-height: 1;
2344
- letter-spacing: 0;
2315
+ /* ===== Sidebar: inline 历史会话 group =====
2316
+ History (older Claude + Codex CLI sessions) is the final collapsible
2317
+ group of #sessions-list same scroll, same idiom as 已归档. No docked
2318
+ region, no 40% cap, no stranded bar above the footer: when the list is
2319
+ short the empty space simply falls below the content, as a list should. */
2320
+ /* Pin the history group to the very bottom of the sidebar (just above the
2321
+ footer). margin-top:auto eats the free space when the list is short;
2322
+ when the list overflows there is no free space, so history simply
2323
+ follows the content and scrolls. Collapsed + minimized by default. */
2324
+ .session-group--history {
2325
+ margin-top: auto;
2326
+ padding-top: 6px;
2345
2327
  }
2346
2328
 
2347
- .history-bubble.empty {
2348
- background: var(--bg-tertiary);
2329
+ /* Toggle header reuses .session-group-title + .claude-history-toggle.
2330
+ The count chip turns into a quiet ellipsis while history is still
2331
+ scanning, then settles to the real number. */
2332
+ .session-history-toggle .history-count.loading {
2333
+ letter-spacing: 0.12em;
2349
2334
  color: var(--text-muted);
2350
- opacity: 0.65;
2351
- }
2352
-
2353
- .history-bubble.loading {
2354
2335
  background: transparent;
2355
- color: var(--text-muted);
2356
- letter-spacing: 0.1em;
2357
- padding: 0 4px;
2358
- font-weight: 600;
2359
- }
2360
-
2361
- .sidebar-history-chevron {
2362
- flex-shrink: 0;
2363
- color: var(--text-muted);
2364
- transition: transform 0.22s var(--ease-out-expo), color var(--transition-fast);
2365
- }
2366
-
2367
- .sidebar-history-header.expanded .sidebar-history-chevron {
2368
- transform: rotate(180deg);
2369
- color: var(--text-secondary);
2336
+ padding-left: 2px;
2337
+ padding-right: 2px;
2370
2338
  }
2371
2339
 
2372
- /* Expanded body — scrollable, capped via parent max-height. */
2373
- .sidebar-history-body {
2374
- flex: 1;
2375
- min-height: 0;
2376
- overflow-y: auto;
2377
- padding: 6px 8px 10px;
2340
+ .session-history-body {
2378
2341
  display: flex;
2379
2342
  flex-direction: column;
2380
2343
  gap: 4px;
2344
+ padding: 2px 0 4px;
2381
2345
  animation: historyBodyFadeIn 0.22s var(--ease-out-expo);
2382
2346
  }
2383
2347
 
@@ -4045,6 +4009,12 @@
4045
4009
  min-height: 0;
4046
4010
  min-width: 0;
4047
4011
  scrollbar-gutter: stable;
4012
+ /* iOS Safari: 聊天到顶 / 到底再用力滑, scroll 会从 .chat-messages 冒到
4013
+ body, 即使父级有 overflow:hidden 也拦不住 (Safari 已知行为)。这一冒
4014
+ 有两个用户可见的副作用: 1) 整页跟着一起被推一帧, 输入框跳动;
4015
+ 2) 偶尔触发地址栏 / 工具栏的折叠动画。contain 把惯性吃在容器内,
4016
+ 保留 iOS 那种橡皮筋反弹手感, 但不向外溢出。 */
4017
+ overscroll-behavior: contain;
4048
4018
  }
4049
4019
 
4050
4020
  /* ===== 历史消息懒加载 ===== */
@@ -9449,11 +9419,16 @@
9449
9419
  transform: scale(0.98);
9450
9420
  }
9451
9421
 
9452
- /* ── Manage bar — Linear-style toolbar ── */
9422
+ /* ── Manage bar ──
9423
+ Normal: a quiet sub-header ("最近的会话记录" + 管理 toggle).
9424
+ Active: the SAME row morphs IN PLACE to a flat selection toolbar —
9425
+ no card, no shadow, no layout jump — and sticks to the top of the
9426
+ scroll so the count + 删除 stay reachable while selecting rows below. */
9453
9427
  .session-manage-bar {
9454
9428
  display: flex;
9455
9429
  align-items: center;
9456
9430
  justify-content: space-between;
9431
+ gap: 8px;
9457
9432
  padding: 4px 4px 4px 10px;
9458
9433
  border-radius: 10px;
9459
9434
  margin-bottom: 10px;
@@ -9469,22 +9444,53 @@
9469
9444
  letter-spacing: 0.005em;
9470
9445
  }
9471
9446
 
9472
- /* Active toolbar — iOS toolbar look: card with hairline + summary + actions */
9473
9447
  .session-manage-bar.active {
9474
- flex-direction: column;
9475
- align-items: stretch;
9476
- gap: 10px;
9477
- padding: 10px 12px;
9478
- background: rgba(255, 255, 255, 0.6);
9479
- border: 1px solid rgba(125, 91, 57, 0.1);
9480
- border-radius: 14px;
9481
- box-shadow: 0 1px 2px rgba(125, 91, 57, 0.03);
9448
+ position: sticky;
9449
+ top: 0;
9450
+ z-index: 6;
9451
+ /* bleed to the list edges and cancel the #sessions-list top padding so
9452
+ the bar sits flush at the scroll top — a flat header, not a card. */
9453
+ margin: -10px -10px 8px;
9454
+ padding: 9px 10px 9px 6px;
9455
+ border-radius: 0;
9456
+ background: rgba(255, 251, 245, 0.94);
9457
+ -webkit-backdrop-filter: saturate(1.2) blur(8px);
9458
+ backdrop-filter: saturate(1.2) blur(8px);
9459
+ border-bottom: 1px solid var(--border-subtle);
9460
+ box-shadow: none;
9461
+ }
9462
+ .session-manage-bar.active:hover {
9463
+ background: rgba(255, 251, 245, 0.94);
9464
+ }
9465
+
9466
+ /* Exit (✕) — the in-place "leave manage mode" affordance on the left. */
9467
+ .session-manage-exit {
9468
+ flex-shrink: 0;
9469
+ display: inline-flex;
9470
+ align-items: center;
9471
+ justify-content: center;
9472
+ width: 26px;
9473
+ height: 26px;
9474
+ padding: 0;
9475
+ border: none;
9476
+ border-radius: 8px;
9477
+ background: transparent;
9478
+ color: var(--text-muted);
9479
+ cursor: pointer;
9480
+ transition: background 0.14s ease, color 0.14s ease;
9481
+ -webkit-tap-highlight-color: transparent;
9482
+ }
9483
+ .session-manage-exit:hover {
9484
+ background: rgba(125, 91, 57, 0.1);
9485
+ color: var(--text-primary);
9482
9486
  }
9483
9487
 
9484
9488
  .session-manage-summary {
9485
9489
  display: inline-flex;
9486
9490
  align-items: center;
9487
- gap: 8px;
9491
+ gap: 6px;
9492
+ min-width: 0;
9493
+ flex: 1;
9488
9494
  font-size: 0.75rem;
9489
9495
  color: var(--text-secondary);
9490
9496
  font-weight: 500;
@@ -9493,33 +9499,29 @@
9493
9499
  display: inline-flex;
9494
9500
  align-items: center;
9495
9501
  justify-content: center;
9496
- min-width: 22px;
9497
- height: 22px;
9498
- padding: 0 7px;
9502
+ min-width: 20px;
9503
+ height: 18px;
9504
+ padding: 0 6px;
9499
9505
  background: var(--accent);
9500
9506
  color: var(--text-inverse);
9501
9507
  font-size: 0.6875rem;
9502
9508
  font-weight: 700;
9503
9509
  border-radius: 999px;
9504
9510
  font-variant-numeric: tabular-nums;
9505
- box-shadow: 0 1px 2px rgba(197, 101, 61, 0.32);
9506
9511
  }
9507
9512
  .session-manage-summary-label {
9508
9513
  color: var(--text-secondary);
9509
9514
  font-weight: 600;
9510
9515
  }
9516
+ .session-manage-summary-label.muted {
9517
+ color: var(--text-muted);
9518
+ font-weight: 500;
9519
+ }
9511
9520
 
9512
9521
  .session-manage-actions {
9513
9522
  display: flex;
9514
9523
  align-items: center;
9515
- gap: 4px;
9516
- flex-wrap: wrap;
9517
- }
9518
- .session-manage-divider {
9519
- width: 1px;
9520
- height: 16px;
9521
- background: rgba(125, 91, 57, 0.16);
9522
- margin: 0 4px;
9524
+ gap: 6px;
9523
9525
  flex-shrink: 0;
9524
9526
  }
9525
9527
 
@@ -9550,73 +9552,53 @@
9550
9552
  opacity: 1;
9551
9553
  }
9552
9554
 
9553
- /* ── Session item — clean card on glass ──
9554
- 克制原则:基础态用 hairline 描边 + 极轻顶部高光让卡片「贴」在侧栏上,
9555
- 不给每张卡都加漂浮投影;hover/active 才升起一层柔和投影。避免多层
9556
- box-shadow 在半透明侧栏里互相叠加显脏。 */
9555
+ /* ── Session item — flat list row, not a floating card ──
9556
+ 克制原则:基础态完全透明,让侧栏读起来是「一列」而不是「一摞卡片」;
9557
+ hover / active 才用填充背景区分。去掉每行的边框/渐变/投影/抬升,
9558
+ 避免在半透明侧栏里多层叠加显脏、以及 hover 抬升导致邻项跳动。 */
9557
9559
  .session-item {
9558
- background: linear-gradient(180deg, rgba(255, 255, 255, 0.55) 0%, rgba(255, 252, 247, 0.38) 100%);
9559
- border: 1px solid rgba(125, 91, 57, 0.08);
9560
- border-radius: 13px;
9561
- padding: 11px 14px;
9562
- margin-bottom: 6px;
9563
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.5);
9564
- transition:
9565
- background 0.2s ease,
9566
- border-color 0.2s ease,
9567
- box-shadow 0.22s ease,
9568
- transform 0.22s var(--ease-out-expo);
9560
+ background: transparent;
9561
+ border: 1px solid transparent;
9562
+ border-radius: 11px;
9563
+ padding: 9px 12px;
9564
+ margin-bottom: 2px;
9565
+ box-shadow: none;
9566
+ transition: background 0.16s ease, border-color 0.16s ease;
9569
9567
  }
9570
9568
  .session-item::before {
9571
9569
  left: 4px;
9572
- top: 10px;
9573
- bottom: 10px;
9570
+ top: 9px;
9571
+ bottom: 9px;
9574
9572
  width: 3px;
9575
9573
  border-radius: 2px;
9576
9574
  background: linear-gradient(180deg, var(--accent), rgba(197, 101, 61, 0.5));
9577
9575
  }
9578
9576
  .session-item:hover {
9579
- background: linear-gradient(180deg, rgba(255, 255, 255, 0.85) 0%, rgba(255, 253, 248, 0.62) 100%);
9580
- border-color: rgba(125, 91, 57, 0.14);
9581
- transform: translateY(-1px);
9582
- box-shadow: 0 4px 12px -4px rgba(125, 91, 57, 0.16);
9583
- }
9584
- .session-item:hover::before {
9585
- opacity: 0.5;
9586
- transform: scaleY(1);
9577
+ background: rgba(125, 91, 57, 0.06);
9578
+ border-color: transparent;
9587
9579
  }
9588
- /* Selected (active)accent ring 用边框表达,再叠一层柔和暖投影 + 顶高光。
9589
- 去掉原先的 6 层叠加(外环/光晕/底影/三向 inset),层数过多在玻璃上显脏。 */
9580
+ /* Left accent bar marks the *active* row only not hover to keep scanning calm. */
9581
+ .session-item:hover::before { opacity: 0; }
9590
9582
  .session-item.active {
9591
- background:
9592
- linear-gradient(180deg, rgba(255, 252, 247, 0.92) 0%, rgba(255, 244, 232, 0.78) 100%);
9593
- border: 1px solid rgba(197, 101, 61, 0.32);
9594
- transform: translateY(-1px);
9595
- backdrop-filter: blur(20px) saturate(180%);
9596
- -webkit-backdrop-filter: blur(20px) saturate(180%);
9597
- box-shadow:
9598
- 0 4px 14px -4px rgba(197, 101, 61, 0.24),
9599
- inset 0 1px 0 rgba(255, 255, 255, 0.7);
9583
+ background: linear-gradient(180deg, rgba(255, 252, 247, 0.92) 0%, rgba(255, 244, 232, 0.74) 100%);
9584
+ border-color: rgba(197, 101, 61, 0.28);
9585
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.55);
9600
9586
  }
9601
- /* ::before 的左侧高亮条受父级 overflow:hidden 裁切,原来的 box-shadow 光晕
9602
- 根本显示不出来,移除以省一次绘制。 */
9603
9587
  .session-item.active::before {
9604
9588
  opacity: 1;
9605
9589
  transform: scaleY(1);
9606
9590
  }
9607
- /* Multi-select state — quieter glass tint, no accent halo */
9591
+ /* Multi-select state — quieter accent tint */
9608
9592
  .session-item.selected {
9609
- background:
9610
- linear-gradient(180deg, rgba(255, 250, 244, 0.85) 0%, rgba(255, 246, 236, 0.65) 100%);
9611
- border: 1px solid rgba(197, 101, 61, 0.2);
9612
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.6);
9593
+ background: rgba(197, 101, 61, 0.09);
9594
+ border-color: rgba(197, 101, 61, 0.18);
9613
9595
  }
9614
9596
  .session-item.selected::before {
9615
9597
  opacity: 0.7;
9616
9598
  transform: scaleY(1);
9617
9599
  }
9618
9600
  .session-item:active {
9619
- transform: translateY(0) scale(0.99);
9601
+ transform: scale(0.992);
9620
9602
  transition-duration: 0.08s;
9621
9603
  }
9622
9604
 
@@ -10169,8 +10151,8 @@
10169
10151
  }
10170
10152
 
10171
10153
  html, body {
10172
- min-height: 100dvh;
10173
- height: auto;
10154
+ min-height: var(--app-viewport-height, 100dvh);
10155
+ height: var(--app-viewport-height, 100dvh);
10174
10156
  }
10175
10157
 
10176
10158
  body {
@@ -10181,9 +10163,9 @@
10181
10163
  .app-container {
10182
10164
  min-height: 100dvh;
10183
10165
  height: 100dvh;
10184
- /* 与 body 同步:键盘弹起时 JS 注入 --app-viewport-height,
10185
- app-container 跟随 visualViewport 收缩,input-panel 自动贴键盘上沿;
10186
- 键盘收起后变量被移除,回到 100dvh,input-panel 自然回到屏幕底部。 */
10166
+ /* 与 body 同步:JS 持续注入 --app-viewport-height,
10167
+ app-container 跟随 visualViewport 收缩/恢复,input-panel 自动贴键盘
10168
+ 上沿或屏幕底部。 */
10187
10169
  height: var(--app-viewport-height, 100dvh);
10188
10170
  overflow: hidden;
10189
10171
  }
@@ -10315,13 +10297,15 @@
10315
10297
  }
10316
10298
 
10317
10299
  .sessions-list {
10318
- display: block;
10319
- flex: 1;
10300
+ /* Match desktop: flex column that fills the scroll body so 历史会话
10301
+ bottom-pins and the manage bar stays sticky. .sidebar-body owns the
10302
+ scroll (and momentum) on mobile, so this stays overflow:visible. */
10303
+ display: flex;
10304
+ flex-direction: column;
10305
+ flex: 1 0 auto;
10320
10306
  min-height: 0;
10321
- overflow-x: hidden;
10322
- overflow-y: auto;
10307
+ overflow: visible;
10323
10308
  padding: 4px;
10324
- -webkit-overflow-scrolling: touch;
10325
10309
  }
10326
10310
 
10327
10311
  /* 移动端会话项 - 紧凑 */
@@ -10740,7 +10724,11 @@
10740
10724
  .file-search-box { padding: 6px 10px 8px; }
10741
10725
  .file-search-icon { left: 20px; }
10742
10726
  .file-search-clear { right: 16px; }
10743
- .file-search-input { min-height: 34px; font-size: 14px; padding: 7px 32px 7px 30px; }
10727
+ /* 16px 兜底 iOS Safari 聚焦自动放大:
10728
+ 即使设了 user-scalable=no, 部分 iOS 版本 (尤其 15 / 16 早期补丁) 仍会
10729
+ 在 input font-size < 16px 时强制 zoom in, 之后回不到原 scale, 用户得
10730
+ 手动双指捏回。所有移动端会被聚焦的 input 都统一到 16px。 */
10731
+ .file-search-input { min-height: 34px; font-size: 16px; padding: 7px 32px 7px 30px; }
10744
10732
  .file-item { padding: 6px 8px; min-height: 32px; }
10745
10733
 
10746
10734
  /* 欢迎页移动端 */
@@ -15317,7 +15305,7 @@
15317
15305
 
15318
15306
  /* ── 快捷提交模态框 ── */
15319
15307
  .quick-commit-modal {
15320
- max-width: 560px;
15308
+ max-width: 540px;
15321
15309
  }
15322
15310
  .quick-commit-modal .modal-body {
15323
15311
  display: flex;
@@ -15325,17 +15313,17 @@
15325
15313
  gap: 12px;
15326
15314
  }
15327
15315
  .qc-files-wrap {
15328
- max-height: 200px;
15316
+ max-height: 190px;
15329
15317
  overflow-y: auto;
15330
- padding: 8px 10px;
15331
- border: 1px solid var(--border-color, rgba(0, 0, 0, 0.08));
15332
- border-radius: 6px;
15333
- background: rgba(255, 255, 255, 0.45);
15318
+ padding: 6px 8px;
15319
+ border: 1px solid rgba(125, 91, 57, 0.10);
15320
+ border-radius: 10px;
15321
+ background: rgba(255, 255, 255, 0.4);
15334
15322
  font-family: var(--font-mono, monospace);
15335
15323
  font-size: 0.78rem;
15336
15324
  display: flex;
15337
15325
  flex-direction: column;
15338
- gap: 2px;
15326
+ gap: 1px;
15339
15327
  }
15340
15328
  .qc-empty {
15341
15329
  color: var(--text-muted);
@@ -15346,30 +15334,45 @@
15346
15334
  .qc-file-row {
15347
15335
  display: flex;
15348
15336
  align-items: center;
15349
- gap: 8px;
15350
- line-height: 1.5;
15337
+ gap: 9px;
15338
+ line-height: 1.6;
15339
+ padding: 1px 2px;
15340
+ border-radius: 5px;
15341
+ }
15342
+ .qc-file-row:hover {
15343
+ background: rgba(125, 91, 57, 0.06);
15351
15344
  }
15352
- .qc-flag {
15345
+ /* Single-letter status badge, VS Code style */
15346
+ .qc-file-badge {
15353
15347
  flex-shrink: 0;
15354
- width: 24px;
15355
- text-align: center;
15356
- font-weight: 700;
15357
- color: var(--text-muted);
15348
+ width: 17px;
15349
+ height: 17px;
15350
+ display: inline-flex;
15351
+ align-items: center;
15352
+ justify-content: center;
15353
+ border-radius: 4px;
15354
+ font-size: 0.66rem;
15355
+ font-weight: 800;
15358
15356
  letter-spacing: 0;
15357
+ line-height: 1;
15358
+ font-family: var(--font-sans);
15359
15359
  }
15360
- .qc-flag-add { color: rgba(60, 160, 90, 0.95); }
15361
- .qc-flag-mod { color: rgba(220, 150, 30, 0.95); }
15362
- .qc-flag-del { color: rgba(200, 70, 70, 0.95); }
15363
- .qc-flag-ren { color: rgba(110, 130, 200, 0.95); }
15364
- .qc-flag-untracked { color: rgba(140, 140, 140, 0.95); }
15360
+ .qc-badge-add { color: rgba(34, 128, 66, 0.98); background: rgba(60, 160, 90, 0.16); }
15361
+ .qc-badge-mod { color: rgba(170, 110, 14, 0.98); background: rgba(220, 150, 30, 0.16); }
15362
+ .qc-badge-del { color: rgba(190, 56, 56, 0.98); background: rgba(200, 70, 70, 0.15); }
15363
+ .qc-badge-ren { color: rgba(78, 100, 188, 0.98); background: rgba(110, 130, 200, 0.16); }
15364
+ .qc-badge-untracked { color: rgba(34, 128, 66, 0.95); background: rgba(60, 160, 90, 0.12); }
15365
+ .qc-badge-ignored,
15366
+ .qc-badge-other { color: var(--text-muted); background: rgba(120, 120, 120, 0.12); }
15365
15367
  .qc-file-path {
15366
- color: var(--text-secondary);
15367
15368
  overflow: hidden;
15368
15369
  text-overflow: ellipsis;
15369
15370
  white-space: nowrap;
15370
15371
  flex: 1 1 auto;
15371
15372
  min-width: 0;
15372
15373
  }
15374
+ .qc-file-dir { color: var(--text-muted); }
15375
+ .qc-file-name { color: var(--text-primary); font-weight: 500; }
15373
15376
  .qc-submodule-badge {
15374
15377
  flex-shrink: 0;
15375
15378
  padding: 1px 6px;
@@ -15381,20 +15384,12 @@
15381
15384
  letter-spacing: 0.02em;
15382
15385
  white-space: nowrap;
15383
15386
  }
15384
- .qc-switch {
15385
- flex-shrink: 0;
15386
- display: inline-flex;
15387
- align-items: center;
15388
- cursor: pointer;
15389
- }
15390
- .qc-message-row,
15391
- .qc-tag-row {
15387
+ .qc-message-row {
15392
15388
  display: flex;
15393
15389
  flex-direction: column;
15394
- gap: 4px;
15390
+ gap: 6px;
15395
15391
  }
15396
- .qc-message-row.hidden,
15397
- .qc-tag-row.hidden {
15392
+ .qc-message-row.hidden {
15398
15393
  display: none;
15399
15394
  }
15400
15395
  .qc-message-header {
@@ -15402,68 +15397,75 @@
15402
15397
  align-items: center;
15403
15398
  justify-content: space-between;
15404
15399
  gap: 8px;
15405
- flex-wrap: wrap;
15406
15400
  }
15407
- .qc-ai-controls {
15408
- display: inline-flex;
15409
- align-items: center;
15410
- justify-content: flex-end;
15411
- gap: 7px;
15412
- margin-left: auto;
15413
- flex: 0 0 auto;
15401
+ .qc-message-label {
15402
+ margin-bottom: 0;
15414
15403
  }
15415
- .qc-ai-tag-toggle {
15404
+ /* AI generate button: icon + text */
15405
+ .qc-ai-btn {
15416
15406
  display: inline-flex;
15417
15407
  align-items: center;
15418
- gap: 6px;
15419
- min-height: 30px;
15420
- padding: 3px 7px 3px 9px;
15421
- border: 1px solid rgba(125, 91, 57, 0.12);
15422
- border-radius: 999px;
15423
- background: rgba(255, 255, 255, 0.58);
15424
- color: var(--text-muted);
15425
- font-size: 0.74rem;
15426
- font-weight: 700;
15427
- line-height: 1;
15428
- user-select: none;
15429
- cursor: pointer;
15430
- transition: background 0.16s ease, border-color 0.16s ease, color 0.16s ease, box-shadow 0.16s ease;
15431
- }
15432
- .qc-ai-tag-toggle:hover {
15433
- background: rgba(255, 255, 255, 0.82);
15434
- border-color: rgba(125, 91, 57, 0.20);
15408
+ gap: 5px;
15409
+ color: var(--accent);
15435
15410
  }
15436
- .qc-ai-tag-toggle:has(.switch-toggle:checked) {
15437
- color: rgba(170, 79, 42, 0.98);
15438
- background: linear-gradient(180deg, #fff8f1 0%, #fff1e3 100%);
15439
- border-color: rgba(197, 101, 61, 0.32);
15440
- box-shadow: 0 1px 4px rgba(197, 101, 61, 0.10);
15411
+ .qc-ai-btn svg {
15412
+ color: var(--accent);
15413
+ flex-shrink: 0;
15441
15414
  }
15442
- .qc-ai-tag-toggle:has(.switch-toggle:disabled) {
15443
- cursor: default;
15444
- opacity: 0.68;
15415
+ .qc-ai-btn:disabled {
15416
+ opacity: 0.5;
15417
+ cursor: not-allowed;
15418
+ color: var(--text-muted);
15445
15419
  }
15446
- .qc-ai-tag-label {
15447
- white-space: nowrap;
15420
+ .qc-ai-btn:disabled svg { color: var(--text-muted); }
15421
+ .qc-message-input {
15422
+ resize: vertical;
15423
+ min-height: 68px;
15424
+ font-family: var(--font-mono, monospace);
15425
+ font-size: 0.84rem;
15426
+ line-height: 1.55;
15448
15427
  }
15449
- .qc-switch--compact .switch-slider {
15450
- width: 34px;
15451
- min-width: 34px;
15452
- height: 20px;
15453
- border-radius: 999px;
15428
+
15429
+ /* Tag field — single line: [Tag] [version input] */
15430
+ .qc-tag-field {
15431
+ display: flex;
15432
+ align-items: center;
15433
+ gap: 10px;
15454
15434
  }
15455
- .qc-switch--compact .switch-slider::after {
15456
- width: 16px;
15457
- height: 16px;
15435
+ .qc-tag-field-label {
15436
+ flex-shrink: 0;
15437
+ width: 2.4em;
15438
+ font-size: 0.7rem;
15439
+ font-weight: 700;
15440
+ letter-spacing: 0.06em;
15441
+ text-transform: uppercase;
15442
+ color: var(--accent);
15458
15443
  }
15459
- .qc-switch--compact .switch-toggle:checked + .switch-slider::after {
15460
- transform: translateX(14px);
15444
+ .qc-tag-field.is-off .qc-tag-field-label {
15445
+ color: var(--text-muted);
15461
15446
  }
15462
- .qc-message-row textarea {
15463
- resize: vertical;
15464
- min-height: 56px;
15447
+ .qc-tag-field-input {
15448
+ flex: 1 1 auto;
15449
+ min-width: 0;
15465
15450
  font-family: var(--font-mono, monospace);
15466
- font-size: 0.85rem;
15451
+ font-size: 0.82rem;
15452
+ }
15453
+ /* "Commit only" state: show the suggested tag greyed, as a non-editable preview. */
15454
+ .qc-tag-field-input:disabled {
15455
+ color: var(--text-muted);
15456
+ background: rgba(125, 91, 57, 0.04);
15457
+ border-color: rgba(125, 91, 57, 0.08);
15458
+ cursor: default;
15459
+ box-shadow: none;
15460
+ }
15461
+ .qc-tag-field-note {
15462
+ flex-shrink: 0;
15463
+ font-size: 0.7rem;
15464
+ font-weight: 600;
15465
+ color: var(--text-muted);
15466
+ padding: 2px 8px;
15467
+ border-radius: 999px;
15468
+ background: rgba(125, 91, 57, 0.08);
15467
15469
  }
15468
15470
  .quick-commit-modal .worktree-merge-actions {
15469
15471
  display: flex;
@@ -15478,21 +15480,17 @@
15478
15480
  flex-direction: column;
15479
15481
  gap: 14px;
15480
15482
  }
15483
+ /* Flat sections — no nested cards. Sections are just grouped rows,
15484
+ separated by a hairline divider rather than boxed in their own card. */
15481
15485
  .qc-section {
15482
15486
  display: flex;
15483
15487
  flex-direction: column;
15484
- gap: 10px;
15485
- padding: 12px 14px;
15486
- background: rgba(255, 255, 255, 0.6);
15487
- border: 1px solid rgba(125, 91, 57, 0.10);
15488
- border-radius: 14px;
15489
- box-shadow: 0 1px 2px rgba(125, 91, 57, 0.04);
15488
+ gap: 12px;
15490
15489
  }
15490
+ /* The repo/sync block sits below a divider instead of inside its own card. */
15491
15491
  .qc-section--repo {
15492
- background: linear-gradient(180deg, rgba(255, 250, 244, 0.7) 0%, rgba(255, 247, 238, 0.7) 100%);
15493
- }
15494
- .qc-section--empty {
15495
- background: rgba(245, 245, 245, 0.5);
15492
+ padding-top: 16px;
15493
+ border-top: 1px solid rgba(125, 91, 57, 0.12);
15496
15494
  }
15497
15495
  .qc-section-head {
15498
15496
  display: flex;
@@ -15501,14 +15499,14 @@
15501
15499
  gap: 8px;
15502
15500
  }
15503
15501
  .qc-section-title {
15504
- font-size: 0.78rem;
15502
+ font-size: 0.72rem;
15505
15503
  font-weight: 700;
15506
15504
  text-transform: uppercase;
15507
- letter-spacing: 0.06em;
15508
- color: var(--text-muted);
15505
+ letter-spacing: 0.07em;
15506
+ color: var(--text-secondary);
15509
15507
  }
15510
15508
  .qc-section-meta {
15511
- font-size: 0.75rem;
15509
+ font-size: 0.74rem;
15512
15510
  color: var(--text-muted);
15513
15511
  font-family: var(--font-mono, monospace);
15514
15512
  overflow: hidden;
@@ -15527,55 +15525,46 @@
15527
15525
  .qc-section-actions--secondary {
15528
15526
  justify-content: space-between;
15529
15527
  }
15530
-
15531
- /* Empty state */
15532
- .qc-empty-state {
15533
- display: flex;
15534
- align-items: center;
15535
- gap: 12px;
15536
- padding: 6px 4px;
15528
+ /* Groups the Commit split-button + standalone Push button in the footer. */
15529
+ .qc-action-group {
15530
+ display: inline-flex;
15531
+ align-items: stretch;
15532
+ gap: 8px;
15537
15533
  }
15538
- .qc-empty-icon {
15539
- flex-shrink: 0;
15540
- width: 32px;
15541
- height: 32px;
15542
- border-radius: 50%;
15543
- background: rgba(60, 160, 90, 0.14);
15544
- color: rgba(40, 130, 70, 0.95);
15545
- display: flex;
15534
+
15535
+ /* Small "工作区干净" badge shown inline in the modal subtitle. */
15536
+ .qc-clean-badge {
15537
+ display: inline-flex;
15546
15538
  align-items: center;
15547
- justify-content: center;
15548
- font-weight: 700;
15549
- font-size: 1rem;
15550
- }
15551
- .qc-empty-title {
15552
- font-size: 0.9rem;
15539
+ gap: 3px;
15540
+ margin-left: 8px;
15541
+ padding: 1px 8px;
15542
+ border-radius: 999px;
15543
+ font-size: 0.7rem;
15553
15544
  font-weight: 600;
15554
- color: var(--text-primary);
15555
- }
15556
- .qc-empty-sub {
15557
- font-size: 0.78rem;
15558
- color: var(--text-muted);
15545
+ color: rgba(40, 130, 70, 0.95);
15546
+ background: rgba(60, 160, 90, 0.12);
15547
+ border: 1px solid rgba(60, 160, 90, 0.22);
15548
+ vertical-align: 1px;
15559
15549
  }
15550
+ .qc-clean-badge svg { flex-shrink: 0; }
15560
15551
 
15561
- /* HEAD card (last commit info) */
15552
+ /* HEAD a plain inline line (no nested box). */
15562
15553
  .qc-head-card {
15563
15554
  display: flex;
15564
15555
  align-items: center;
15565
- gap: 10px;
15566
- padding: 8px 12px;
15567
- background: rgba(255, 255, 255, 0.7);
15568
- border: 1px solid rgba(125, 91, 57, 0.08);
15569
- border-radius: 10px;
15570
- min-height: 36px;
15556
+ gap: 8px;
15571
15557
  }
15572
15558
  .qc-head-label {
15573
15559
  flex-shrink: 0;
15574
- font-size: 0.7rem;
15560
+ font-size: 0.66rem;
15575
15561
  font-weight: 700;
15576
- letter-spacing: 0.05em;
15562
+ letter-spacing: 0.06em;
15577
15563
  color: var(--text-muted);
15578
15564
  text-transform: uppercase;
15565
+ padding: 1px 6px;
15566
+ border-radius: 5px;
15567
+ background: rgba(125, 91, 57, 0.08);
15579
15568
  }
15580
15569
  .qc-head-text {
15581
15570
  flex: 1 1 auto;
@@ -15620,11 +15609,6 @@
15620
15609
  color: rgba(160, 90, 50, 0.95);
15621
15610
  border-color: rgba(180, 100, 60, 0.28);
15622
15611
  }
15623
- .qc-chip--tag {
15624
- background: rgba(140, 100, 200, 0.14);
15625
- color: rgba(110, 70, 180, 0.95);
15626
- border-color: rgba(140, 100, 200, 0.28);
15627
- }
15628
15612
  .qc-chip--warn {
15629
15613
  background: rgba(220, 150, 30, 0.14);
15630
15614
  color: rgba(180, 110, 20, 0.95);
@@ -15636,16 +15620,34 @@
15636
15620
  border-color: rgba(60, 160, 90, 0.24);
15637
15621
  }
15638
15622
 
15623
+ /* "为当前提交打 Tag" button (icon + text, balances the push button) */
15624
+ .qc-tag-head-btn {
15625
+ display: inline-flex;
15626
+ align-items: center;
15627
+ gap: 5px;
15628
+ }
15629
+ .qc-tag-head-btn svg { flex-shrink: 0; opacity: 0.8; }
15630
+ .qc-tag-head-btn.is-open {
15631
+ background: rgba(140, 100, 200, 0.12);
15632
+ border-color: rgba(140, 100, 200, 0.28);
15633
+ color: rgba(96, 60, 160, 0.98);
15634
+ }
15635
+
15639
15636
  /* Tag HEAD inline drawer */
15640
15637
  .qc-tag-head-panel {
15641
15638
  display: flex;
15642
15639
  flex-direction: column;
15643
15640
  gap: 8px;
15644
- padding: 10px 12px;
15641
+ padding: 11px 12px;
15645
15642
  background: rgba(255, 255, 255, 0.85);
15646
15643
  border: 1px solid rgba(140, 100, 200, 0.18);
15647
15644
  border-radius: 10px;
15648
15645
  }
15646
+ .qc-tag-head-hint {
15647
+ font-size: 0.74rem;
15648
+ color: var(--text-muted);
15649
+ line-height: 1.4;
15650
+ }
15649
15651
  .qc-tag-head-row {
15650
15652
  display: flex;
15651
15653
  gap: 6px;
@@ -15728,7 +15730,7 @@
15728
15730
  all: unset;
15729
15731
  display: flex;
15730
15732
  flex-direction: column;
15731
- gap: 1px;
15733
+ gap: 2px;
15732
15734
  padding: 8px 10px;
15733
15735
  border-radius: 8px;
15734
15736
  cursor: pointer;
@@ -15738,12 +15740,26 @@
15738
15740
  background: rgba(197, 101, 61, 0.08);
15739
15741
  }
15740
15742
  .qc-dropdown-item.is-selected {
15741
- background: rgba(197, 101, 61, 0.12);
15743
+ background: rgba(197, 101, 61, 0.10);
15742
15744
  }
15743
15745
  .qc-dropdown-item.is-disabled {
15744
15746
  opacity: 0.5;
15745
15747
  cursor: not-allowed;
15746
15748
  }
15749
+ .qc-dropdown-item-main {
15750
+ display: flex;
15751
+ align-items: center;
15752
+ gap: 6px;
15753
+ }
15754
+ .qc-dropdown-check {
15755
+ flex-shrink: 0;
15756
+ width: 13px;
15757
+ height: 13px;
15758
+ display: inline-flex;
15759
+ align-items: center;
15760
+ justify-content: center;
15761
+ color: var(--accent);
15762
+ }
15747
15763
  .qc-dropdown-item-title {
15748
15764
  font-size: 0.84rem;
15749
15765
  font-weight: 600;
@@ -15753,6 +15769,7 @@
15753
15769
  font-size: 0.72rem;
15754
15770
  color: var(--text-muted);
15755
15771
  line-height: 1.4;
15772
+ padding-left: 19px;
15756
15773
  }
15757
15774
 
15758
15775
  @media (max-width: 720px) {
@@ -15760,12 +15777,11 @@
15760
15777
  .topbar-git-badge { padding: 0 8px; font-size: 0.7rem; }
15761
15778
  .quick-commit-modal { max-width: 95vw; }
15762
15779
  .qc-files-wrap { max-height: 160px; }
15763
- .qc-section { padding: 10px 12px; }
15764
15780
  .qc-dropdown-menu { min-width: 180px; }
15765
- .qc-ai-controls {
15766
- width: 100%;
15767
- justify-content: flex-end;
15768
- }
15781
+ .qc-section-actions--secondary { flex-wrap: wrap; gap: 8px; }
15782
+ .qc-section-actions--secondary .qc-tag-head-btn { flex: 1 1 auto; justify-content: center; }
15783
+ /* Keep the commit footer one row, but let the two button groups share width. */
15784
+ .qc-action-group { flex: 1 1 auto; justify-content: flex-end; }
15769
15785
  }
15770
15786
 
15771
15787
  /* ============================================================ */