@youtyan/code-viewer 0.6.0 → 0.6.2

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.
package/web/style.css CHANGED
@@ -52,6 +52,7 @@
52
52
  --sidebar-w: 308px;
53
53
  --history-w: 320px;
54
54
  --sidebar-restore-rail-w: 44px;
55
+ --annotation-panel-w: 380px;
55
56
  /* shadows */
56
57
  --shadow-sm: 0 1px 0 rgba(31,35,40,0.04);
57
58
  --shadow-md: 0 3px 6px rgba(140,149,159,0.15);
@@ -397,6 +398,7 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
397
398
  }
398
399
 
399
400
  .global-actions {
401
+ position: relative;
400
402
  margin-left: auto;
401
403
  display: inline-flex;
402
404
  align-items: center;
@@ -425,6 +427,7 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
425
427
  font-size: 13px;
426
428
  transition: background 0.12s, border-color 0.12s;
427
429
  }
430
+ .global-actions #theme svg,
428
431
  .global-icon-action svg {
429
432
  display: block;
430
433
  }
@@ -433,12 +436,68 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
433
436
  background: var(--bg-mute);
434
437
  border-color: var(--border-strong);
435
438
  }
439
+ .global-actions #theme:focus-visible,
436
440
  .global-icon-action:focus-visible {
437
441
  outline: 2px solid var(--accent);
438
442
  outline-offset: 1px;
439
443
  }
444
+ .global-icon-action.copied {
445
+ color: var(--success);
446
+ border-color: var(--success);
447
+ }
448
+ .global-icon-action.failed {
449
+ color: var(--danger);
450
+ border-color: var(--danger);
451
+ }
452
+ .global-icon-action.warn {
453
+ color: var(--attn);
454
+ border-color: var(--attn);
455
+ }
456
+ .goi-feedback {
457
+ position: absolute;
458
+ top: 100%;
459
+ right: 0;
460
+ margin-top: 12px;
461
+ z-index: 70;
462
+ padding: 4px 10px;
463
+ border: 1px solid var(--border);
464
+ border-radius: 6px;
465
+ background: var(--bg);
466
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.16);
467
+ font-size: 12px;
468
+ font-weight: 600;
469
+ white-space: nowrap;
470
+ pointer-events: none;
471
+ animation: gdp-banner-slide 0.15s ease;
472
+ }
473
+ .goi-feedback[hidden] {
474
+ display: none;
475
+ }
476
+ .goi-feedback.copied {
477
+ color: var(--success);
478
+ border-color: var(--success);
479
+ }
480
+ .goi-feedback.failed {
481
+ color: var(--danger);
482
+ border-color: var(--danger);
483
+ }
484
+ .goi-feedback.warn {
485
+ color: var(--attn);
486
+ border-color: var(--attn);
487
+ }
488
+ .ai-context-action {
489
+ width: auto;
490
+ gap: 6px;
491
+ padding: 0 10px;
492
+ }
493
+ .ai-context-label {
494
+ font-size: 11px;
495
+ font-weight: 600;
496
+ white-space: nowrap;
497
+ }
440
498
  #auto-update {
441
499
  width: auto;
500
+ gap: 6px;
442
501
  padding: 0 8px;
443
502
  font-size: 11px;
444
503
  font-weight: 600;
@@ -448,12 +507,6 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
448
507
  border-color: var(--success);
449
508
  color: var(--success);
450
509
  }
451
- #cancel-requests {
452
- width: auto;
453
- padding: 0 8px;
454
- font-size: 11px;
455
- font-weight: 600;
456
- }
457
510
  #cancel-requests.active {
458
511
  color: var(--danger);
459
512
  border-color: var(--danger);
@@ -484,14 +537,7 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
484
537
  line-height: 1;
485
538
  white-space: nowrap;
486
539
  }
487
- #meta .num {
488
- display: inline-flex; gap: 8px;
489
- font-variant-numeric: tabular-nums;
490
- font-size: 12px;
491
- }
492
- #meta .num .add { color: var(--success); font-weight: 600; }
493
- #meta .num .del { color: var(--danger); font-weight: 600; }
494
- #meta .updated-at {
540
+ #meta .chip {
495
541
  display: inline-flex;
496
542
  align-items: center;
497
543
  gap: 4px;
@@ -499,12 +545,40 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
499
545
  background: var(--bg-soft);
500
546
  border: 1px solid var(--border);
501
547
  border-radius: 999px;
502
- padding: 3px 8px;
548
+ padding: 3px 9px;
503
549
  font-size: 11px;
504
550
  line-height: 1;
505
551
  font-variant-numeric: tabular-nums;
506
552
  white-space: nowrap;
507
553
  }
554
+ #meta .chip-files { color: var(--fg); font-weight: 600; }
555
+ #meta .chip-add { color: var(--success); font-weight: 600; border-color: color-mix(in srgb, var(--success) 35%, var(--border)); }
556
+ #meta .chip-del { color: var(--danger); font-weight: 600; border-color: color-mix(in srgb, var(--danger) 35%, var(--border)); }
557
+ #meta .chip-added { color: var(--success); border-color: color-mix(in srgb, var(--success) 35%, var(--border)); }
558
+ #meta .chip-deleted { color: var(--danger); border-color: color-mix(in srgb, var(--danger) 35%, var(--border)); }
559
+ #meta .chip-renamed { color: var(--done); border-color: color-mix(in srgb, var(--done) 35%, var(--border)); }
560
+ #meta .chip-heavy { color: var(--attn); border-color: color-mix(in srgb, var(--attn) 35%, var(--border)); }
561
+ #meta .chip-binary,
562
+ #meta .chip-media { color: var(--fg-muted); }
563
+ #meta .chip-viewed-empty { color: var(--fg-muted); }
564
+ #meta .chip-viewed-partial { color: var(--attn); border-color: color-mix(in srgb, var(--attn) 35%, var(--border)); }
565
+ #meta .chip-viewed-done { color: var(--done); border-color: color-mix(in srgb, var(--done) 35%, var(--border)); }
566
+ #meta .chip-next-unviewed {
567
+ font: inherit;
568
+ cursor: pointer;
569
+ color: var(--accent-emph);
570
+ border-color: color-mix(in srgb, var(--accent-emph) 35%, var(--border));
571
+ }
572
+ #meta .chip-next-unviewed:hover:not(:disabled) {
573
+ background: var(--bg-soft);
574
+ border-color: var(--border-strong);
575
+ }
576
+ #meta .chip-next-unviewed:disabled {
577
+ cursor: default;
578
+ opacity: 0.45;
579
+ color: var(--fg-muted);
580
+ border-color: var(--border);
581
+ }
508
582
  .ref-pickers {
509
583
  display: flex;
510
584
  align-items: center;
@@ -593,6 +667,10 @@ body.gdp-diff-page #repo-target-wrap {
593
667
  }
594
668
  .ref-pickers > button {
595
669
  width: 24px; height: 26px;
670
+ display: inline-flex;
671
+ align-items: center;
672
+ justify-content: center;
673
+ padding: 0;
596
674
  border: 1px solid var(--border);
597
675
  background: var(--bg);
598
676
  color: var(--fg-muted);
@@ -601,6 +679,11 @@ body.gdp-diff-page #repo-target-wrap {
601
679
  font-size: 13px;
602
680
  transition: background 0.12s, color 0.12s;
603
681
  }
682
+ .ref-pickers > button svg {
683
+ display: block;
684
+ width: 14px;
685
+ height: 14px;
686
+ }
604
687
  .ref-pickers > button:hover {
605
688
  background: var(--accent);
606
689
  color: #fff;
@@ -934,13 +1017,35 @@ body.gdp-diff-page #repo-target-wrap {
934
1017
  @keyframes gdp-spin { to { transform: rotate(360deg); } }
935
1018
 
936
1019
  #status {
937
- width: 8px; height: 8px; border-radius: 50%;
1020
+ display: inline-flex;
1021
+ align-items: center;
1022
+ height: 24px;
1023
+ padding: 0 9px 0 8px;
1024
+ border: 1px solid var(--border);
1025
+ border-radius: 999px;
1026
+ background: color-mix(in srgb, var(--bg) 72%, var(--bg-soft));
1027
+ color: var(--fg-muted);
1028
+ font-size: 11px;
1029
+ font-weight: 600;
1030
+ line-height: 1;
1031
+ white-space: nowrap;
1032
+ }
1033
+ #status::before {
1034
+ content: "";
1035
+ flex: 0 0 auto;
1036
+ width: 6px;
1037
+ height: 6px;
1038
+ margin-right: 6px;
1039
+ border-radius: 50%;
938
1040
  background: var(--fg-subtle);
939
1041
  transition: background 0.2s ease, box-shadow 0.2s ease;
940
1042
  }
941
- #status.live { background: #2ea043; box-shadow: 0 0 0 3px rgba(46,160,67,0.20); }
942
- #status.refreshing { background: #d29922; box-shadow: 0 0 0 3px rgba(210,153,34,0.25); }
943
- #status.error { background: var(--danger); box-shadow: 0 0 0 3px rgba(207,34,46,0.20); }
1043
+ #status.live::before { background: #2ea043; box-shadow: 0 0 0 3px rgba(46,160,67,0.20); }
1044
+ #status.refreshing::before { background: #d29922; box-shadow: 0 0 0 3px rgba(210,153,34,0.25); }
1045
+ #status.error::before { background: var(--danger); box-shadow: 0 0 0 3px rgba(207,34,46,0.20); }
1046
+ #status.live { color: var(--success); }
1047
+ #status.refreshing { color: var(--attn); }
1048
+ #status.error { color: var(--danger); }
944
1049
 
945
1050
  /* ===== Top-edge loading bar (indeterminate) ===== */
946
1051
  #load-bar {
@@ -1130,6 +1235,78 @@ body.gdp-history-page #topbar .ref-pickers {
1130
1235
  flex: 1 1 auto;
1131
1236
  min-width: 0;
1132
1237
  }
1238
+ .history-refresh {
1239
+ position: relative;
1240
+ display: inline-flex;
1241
+ align-items: center;
1242
+ justify-content: center;
1243
+ flex: 0 0 auto;
1244
+ width: auto;
1245
+ min-width: 28px;
1246
+ height: 28px;
1247
+ padding: 0 7px;
1248
+ gap: 4px;
1249
+ border: 1px solid transparent;
1250
+ border-radius: 4px;
1251
+ background: transparent;
1252
+ color: var(--fg-muted);
1253
+ cursor: pointer;
1254
+ }
1255
+ .history-refresh:hover {
1256
+ background: var(--bg);
1257
+ color: var(--fg);
1258
+ }
1259
+ .history-refresh:focus-visible {
1260
+ outline: 2px solid var(--accent);
1261
+ outline-offset: -1px;
1262
+ }
1263
+ .history-refresh[disabled] {
1264
+ cursor: default;
1265
+ opacity: 0.7;
1266
+ }
1267
+ .history-refresh.spinning svg {
1268
+ animation: gdp-spin 0.7s linear infinite;
1269
+ }
1270
+ .history-refresh.has-update {
1271
+ color: var(--accent);
1272
+ border-color: var(--accent);
1273
+ box-shadow: 0 0 0 1px var(--accent-subtle);
1274
+ }
1275
+ .history-refresh.has-update::after {
1276
+ content: "";
1277
+ position: absolute;
1278
+ top: 1px;
1279
+ right: 1px;
1280
+ width: 7px;
1281
+ height: 7px;
1282
+ border-radius: 50%;
1283
+ background: var(--accent);
1284
+ box-shadow: 0 0 0 2px var(--bg-soft);
1285
+ }
1286
+ .history-refresh svg {
1287
+ width: 16px;
1288
+ height: 16px;
1289
+ flex: 0 0 auto;
1290
+ pointer-events: none;
1291
+ }
1292
+ .history-refresh-label {
1293
+ line-height: 1;
1294
+ white-space: nowrap;
1295
+ font-size: 12px;
1296
+ font-weight: 600;
1297
+ }
1298
+ .history-refresh-result {
1299
+ min-width: 0;
1300
+ max-width: 180px;
1301
+ overflow: hidden;
1302
+ text-overflow: ellipsis;
1303
+ white-space: nowrap;
1304
+ line-height: 1;
1305
+ }
1306
+ .history-refresh-result.pending {
1307
+ color: var(--accent);
1308
+ font-weight: 600;
1309
+ }
1133
1310
  .history-filter-wrap {
1134
1311
  position: relative;
1135
1312
  padding: 7px 12px 9px;
@@ -1172,10 +1349,49 @@ body.gdp-history-page #topbar .ref-pickers {
1172
1349
  font: inherit;
1173
1350
  font-size: 13px;
1174
1351
  line-height: 30px;
1175
- padding: 0 11px 0 34px;
1352
+ padding: 0 60px 0 34px;
1176
1353
  outline: none;
1177
1354
  transition: border-color 0.12s ease, background-color 0.12s ease, box-shadow 0.12s ease;
1178
1355
  }
1356
+ .history-filter-clear,
1357
+ .sb-filter-clear,
1358
+ .db-table-filter-clear {
1359
+ position: absolute;
1360
+ z-index: 1;
1361
+ right: 19px;
1362
+ top: 23px;
1363
+ transform: translateY(-50%);
1364
+ height: 22px;
1365
+ min-width: 42px;
1366
+ padding: 0 8px;
1367
+ border: 1px solid var(--border);
1368
+ border-radius: 6px;
1369
+ background: var(--bg);
1370
+ color: var(--fg-muted);
1371
+ font: inherit;
1372
+ font-size: 11px;
1373
+ font-weight: 600;
1374
+ line-height: 20px;
1375
+ cursor: pointer;
1376
+ }
1377
+ .history-filter-clear[hidden],
1378
+ .sb-filter-clear[hidden],
1379
+ .db-table-filter-clear[hidden] {
1380
+ display: none;
1381
+ }
1382
+ .history-filter-clear:hover,
1383
+ .sb-filter-clear:hover,
1384
+ .db-table-filter-clear:hover {
1385
+ color: var(--fg);
1386
+ border-color: var(--accent);
1387
+ background: color-mix(in srgb, var(--accent-muted) 42%, var(--bg));
1388
+ }
1389
+ .history-filter-clear:focus-visible,
1390
+ .sb-filter-clear:focus-visible,
1391
+ .db-table-filter-clear:focus-visible {
1392
+ outline: none;
1393
+ box-shadow: 0 0 0 3px var(--accent-muted);
1394
+ }
1179
1395
  #history-filter:hover,
1180
1396
  .history-filter:hover {
1181
1397
  border-color: var(--border);
@@ -1192,6 +1408,13 @@ body.gdp-history-page #topbar .ref-pickers {
1192
1408
  color: var(--fg-subtle);
1193
1409
  opacity: 1;
1194
1410
  }
1411
+ #history-filter::-webkit-search-decoration,
1412
+ #history-filter::-webkit-search-cancel-button,
1413
+ .history-filter::-webkit-search-decoration,
1414
+ .history-filter::-webkit-search-cancel-button {
1415
+ -webkit-appearance: none;
1416
+ appearance: none;
1417
+ }
1195
1418
  .history-banner {
1196
1419
  margin: 8px 10px 0;
1197
1420
  padding: 6px 10px;
@@ -1237,6 +1460,10 @@ body.gdp-history-page #topbar .ref-pickers {
1237
1460
  background: var(--bg-mute);
1238
1461
  border-left-color: var(--accent);
1239
1462
  }
1463
+ .history-item-fresh {
1464
+ background: color-mix(in srgb, var(--accent-subtle) 55%, transparent);
1465
+ border-left-color: var(--accent);
1466
+ }
1240
1467
  .history-item-worktree {
1241
1468
  background: color-mix(in srgb, var(--bg-soft) 72%, var(--bg-mute));
1242
1469
  color: var(--fg-muted);
@@ -1645,7 +1872,7 @@ body[data-focus-scope="main"] #content {
1645
1872
  font: inherit;
1646
1873
  font-size: 13px;
1647
1874
  line-height: 30px;
1648
- padding: 0 11px 0 34px;
1875
+ padding: 0 60px 0 34px;
1649
1876
  outline: none;
1650
1877
  transition: border-color 0.12s ease, background-color 0.12s ease, box-shadow 0.12s ease;
1651
1878
  }
@@ -1666,6 +1893,11 @@ body[data-focus-scope="main"] #content {
1666
1893
  color: var(--fg-subtle);
1667
1894
  opacity: 1;
1668
1895
  }
1896
+ #sb-filter::-webkit-search-decoration,
1897
+ #sb-filter::-webkit-search-cancel-button {
1898
+ -webkit-appearance: none;
1899
+ appearance: none;
1900
+ }
1669
1901
 
1670
1902
  /* ===== Sidebar resizer (drag right edge to resize) ===== */
1671
1903
  #sidebar-resizer {
@@ -1878,6 +2110,70 @@ body.gdp-history-resizing * {
1878
2110
  background: var(--bg-mute);
1879
2111
  }
1880
2112
 
2113
+ .quick-help-btn {
2114
+ font-weight: 700;
2115
+ }
2116
+ #quick-help-popover {
2117
+ position: fixed;
2118
+ right: 16px;
2119
+ top: calc(var(--global-header-h) + 8px);
2120
+ width: min(420px, calc(100vw - 32px));
2121
+ max-width: calc(100vw - 32px);
2122
+ max-height: min(70vh, 560px);
2123
+ overflow-y: auto;
2124
+ /* Transient popover: must sit above the annotation panel (45). */
2125
+ z-index: 70;
2126
+ padding: 12px;
2127
+ border: 1px solid var(--border);
2128
+ border-radius: 8px;
2129
+ background: var(--bg);
2130
+ box-shadow: var(--shadow);
2131
+ }
2132
+ #quick-help-popover[hidden] { display: none; }
2133
+ .quick-help-head {
2134
+ display: flex;
2135
+ align-items: center;
2136
+ justify-content: space-between;
2137
+ gap: 12px;
2138
+ margin-bottom: 10px;
2139
+ }
2140
+ #quick-help-close {
2141
+ border: 0;
2142
+ background: transparent;
2143
+ color: var(--fg-muted);
2144
+ cursor: pointer;
2145
+ font-size: 18px;
2146
+ line-height: 20px;
2147
+ }
2148
+ #quick-help-popover .gdp-help-group {
2149
+ margin: 0 0 14px;
2150
+ }
2151
+ #quick-help-popover .gdp-help-group h3 {
2152
+ margin: 0 0 6px;
2153
+ font-size: 13px;
2154
+ }
2155
+ #quick-help-popover .gdp-help-group th {
2156
+ width: auto;
2157
+ white-space: nowrap;
2158
+ }
2159
+ .quick-help-foot {
2160
+ position: sticky;
2161
+ bottom: 0;
2162
+ z-index: 1;
2163
+ margin-top: 4px;
2164
+ padding-top: 10px;
2165
+ border-top: 1px solid var(--border);
2166
+ background: var(--bg);
2167
+ }
2168
+ .quick-help-foot a {
2169
+ color: var(--accent);
2170
+ font-size: 12px;
2171
+ text-decoration: none;
2172
+ }
2173
+ .quick-help-foot a:hover {
2174
+ text-decoration: underline;
2175
+ }
2176
+
1881
2177
  body.gdp-help-page #topbar,
1882
2178
  body.gdp-help-page #sidebar,
1883
2179
  body.gdp-help-page #sidebar-resizer {
@@ -2176,7 +2472,7 @@ body.gdp-help-page #content {
2176
2472
 
2177
2473
  #filelist.tree .tree-file {
2178
2474
  display: grid;
2179
- grid-template-columns: 16px 16px minmax(0, 1fr) auto;
2475
+ grid-template-columns: 16px 16px minmax(0, 1fr) auto auto;
2180
2476
  align-items: center;
2181
2477
  gap: 8px;
2182
2478
  padding: var(--sidebar-row-y) 12px var(--sidebar-row-y) var(--lvl-pad, 12px);
@@ -2253,7 +2549,7 @@ body.gdp-help-page #content {
2253
2549
  #filelist { list-style: none; margin: 0; padding: 6px 0 0; }
2254
2550
  #filelist li {
2255
2551
  display: grid;
2256
- grid-template-columns: 16px 1fr auto;
2552
+ grid-template-columns: 16px 1fr auto auto;
2257
2553
  align-items: center;
2258
2554
  gap: 8px;
2259
2555
  padding: calc(var(--sidebar-row-y) + 2px) 14px calc(var(--sidebar-row-y) + 2px) 12px;
@@ -2318,6 +2614,38 @@ body.gdp-help-page #content {
2318
2614
  [data-theme="dark"] .badge.D { background: rgba(248,81,73,0.20); color: var(--danger); }
2319
2615
  [data-theme="dark"] .badge.R { background: rgba(163,113,247,0.20); color: var(--done); }
2320
2616
 
2617
+ /* Sidebar row marker for files worth a second look before diving in:
2618
+ heavy diffs, binary/media files, or Git commit entries. Same semantics as
2619
+ the diff card header's .size-tag, sized down for dense file list rows. */
2620
+ .kind-tag {
2621
+ width: 14px; height: 14px;
2622
+ display: inline-flex;
2623
+ align-items: center;
2624
+ justify-content: center;
2625
+ border-radius: 3px;
2626
+ font-size: 9px;
2627
+ font-weight: 700;
2628
+ letter-spacing: 0;
2629
+ flex-shrink: 0;
2630
+ }
2631
+ .kind-tag.heavy { background: #fff8c5; color: var(--attn); }
2632
+ .kind-tag.binary { background: #ddf4ff; color: var(--accent-emph); }
2633
+ .kind-tag.submodule,
2634
+ .kind-tag.gitlink {
2635
+ width: auto;
2636
+ min-width: 22px;
2637
+ padding: 0 4px;
2638
+ background: #ddf4ff;
2639
+ color: var(--accent-emph);
2640
+ }
2641
+ [data-theme="dark"] .kind-tag.heavy { background: rgba(210,153,34,0.15); color: var(--attn); }
2642
+ [data-theme="dark"] .kind-tag.binary { background: rgba(56,139,253,0.15); color: var(--accent-emph); }
2643
+ [data-theme="dark"] .kind-tag.submodule,
2644
+ [data-theme="dark"] .kind-tag.gitlink {
2645
+ background: rgba(56,139,253,0.15);
2646
+ color: var(--accent-emph);
2647
+ }
2648
+
2321
2649
  /* ===== Main content area ===== */
2322
2650
  #content {
2323
2651
  margin-left: var(--sidebar-w);
@@ -2340,8 +2668,83 @@ body:not(.gdp-file-detail-page):not(.gdp-history-page) #diff::after {
2340
2668
  display: flex; flex-direction: column; align-items: center; justify-content: center;
2341
2669
  padding: 80px 16px; color: var(--fg-muted); text-align: center;
2342
2670
  }
2343
- .empty .emoji { font-size: 40px; margin-bottom: 8px; }
2671
+ .empty .empty-icon {
2672
+ display: inline-flex;
2673
+ align-items: center;
2674
+ justify-content: center;
2675
+ width: 44px;
2676
+ height: 44px;
2677
+ margin-bottom: 10px;
2678
+ border: 1px solid var(--border);
2679
+ border-radius: 8px;
2680
+ background: var(--bg-soft);
2681
+ color: var(--fg-muted);
2682
+ }
2683
+ .empty .empty-icon .octicon {
2684
+ width: 22px;
2685
+ height: 22px;
2686
+ }
2344
2687
  .empty h2 { color: var(--fg); margin: 0 0 4px; font-size: 18px; font-weight: 600; }
2688
+ .empty.empty-with-actions p {
2689
+ max-width: 440px;
2690
+ margin: 0;
2691
+ line-height: 1.5;
2692
+ }
2693
+ .empty-actions {
2694
+ display: flex;
2695
+ flex-wrap: wrap;
2696
+ justify-content: center;
2697
+ gap: 8px;
2698
+ margin-top: 16px;
2699
+ }
2700
+ .empty-actions[hidden] { display: none; }
2701
+ .empty-action {
2702
+ min-height: 34px;
2703
+ display: inline-flex;
2704
+ align-items: center;
2705
+ justify-content: center;
2706
+ gap: 6px;
2707
+ padding: 0 12px;
2708
+ border: 1px solid var(--border);
2709
+ border-radius: 6px;
2710
+ background: var(--bg);
2711
+ color: var(--fg);
2712
+ font: inherit;
2713
+ font-size: 13px;
2714
+ line-height: 1;
2715
+ text-decoration: none;
2716
+ cursor: pointer;
2717
+ box-shadow: var(--shadow-sm);
2718
+ }
2719
+ .empty-action:hover {
2720
+ border-color: var(--border-strong);
2721
+ background: var(--bg-soft);
2722
+ }
2723
+ .empty-action:focus-visible {
2724
+ outline: 2px solid var(--accent);
2725
+ outline-offset: 2px;
2726
+ }
2727
+ .empty-action-primary {
2728
+ border-color: var(--accent);
2729
+ background: var(--accent);
2730
+ color: var(--fg-onemphasis);
2731
+ }
2732
+ .empty-action-primary:hover {
2733
+ border-color: var(--accent-emph);
2734
+ background: var(--accent-emph);
2735
+ }
2736
+ .empty-action-icon {
2737
+ display: inline-flex;
2738
+ width: 16px;
2739
+ height: 16px;
2740
+ }
2741
+ .empty-action-icon .octicon {
2742
+ width: 16px;
2743
+ height: 16px;
2744
+ }
2745
+ .empty-action.spinning .empty-action-icon {
2746
+ animation: gdp-spin 0.7s linear infinite;
2747
+ }
2345
2748
  .empty.hidden { display: none; }
2346
2749
 
2347
2750
  /* ===== diff2html overrides ===== */
@@ -2618,7 +3021,9 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2618
3021
  user-select: none;
2619
3022
  }
2620
3023
 
2621
- /* Floating "copy @path#start-end" pill shown while lines are selected. */
3024
+ /* Floating "copy @path#start-end" pill shown while lines are selected. Root
3025
+ is a plain div (see line-ref-pill.ts) hosting two buttons: the copy
3026
+ action fills the capsule, the close (×) button overlays its corner. */
2622
3027
  #line-ref-pill {
2623
3028
  position: fixed;
2624
3029
  left: 50%;
@@ -2638,12 +3043,45 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2638
3043
  font: inherit;
2639
3044
  font-size: 13px;
2640
3045
  font-weight: 600;
2641
- cursor: pointer;
2642
3046
  box-shadow: 0 8px 28px rgba(31, 35, 40, 0.35);
2643
3047
  }
2644
3048
  #line-ref-pill:hover {
2645
3049
  filter: brightness(1.1);
2646
3050
  }
3051
+ #line-ref-pill-copy {
3052
+ display: inline-flex;
3053
+ align-items: center;
3054
+ gap: 8px;
3055
+ min-width: 0;
3056
+ padding: 0;
3057
+ border: none;
3058
+ background: none;
3059
+ color: inherit;
3060
+ font: inherit;
3061
+ cursor: pointer;
3062
+ }
3063
+ #line-ref-pill-close {
3064
+ position: absolute;
3065
+ top: -6px;
3066
+ right: -6px;
3067
+ width: 16px;
3068
+ height: 16px;
3069
+ display: inline-flex;
3070
+ align-items: center;
3071
+ justify-content: center;
3072
+ padding: 0;
3073
+ border: 1px solid var(--accent);
3074
+ border-radius: 50%;
3075
+ background: var(--bg);
3076
+ color: var(--fg-muted);
3077
+ font-size: 11px;
3078
+ line-height: 1;
3079
+ cursor: pointer;
3080
+ }
3081
+ #line-ref-pill-close:hover {
3082
+ color: var(--fg);
3083
+ border-color: var(--border-strong);
3084
+ }
2647
3085
  #line-ref-pill svg {
2648
3086
  flex: 0 0 auto;
2649
3087
  }
@@ -2660,6 +3098,21 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2660
3098
  font-size: 12px;
2661
3099
  font-weight: 400;
2662
3100
  }
3101
+ /* Line count badge shown for multi-line selections. Flips to a solid
3102
+ warning chip (var(--attn)) once the selection is large enough that
3103
+ Shift+Click would paste a sizeable chunk of code into the AI prompt. */
3104
+ #line-ref-pill .lrp-count {
3105
+ flex: 0 0 auto;
3106
+ padding: 2px 6px;
3107
+ border-radius: 6px;
3108
+ background: rgba(255, 255, 255, 0.18);
3109
+ font-size: 11px;
3110
+ font-weight: 700;
3111
+ }
3112
+ #line-ref-pill .lrp-count-warn {
3113
+ background: #fff;
3114
+ color: var(--attn);
3115
+ }
2663
3116
  #line-ref-pill.copied {
2664
3117
  background: var(--success, #2ea043);
2665
3118
  border-color: var(--success, #2ea043);
@@ -2860,10 +3313,21 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2860
3313
  }
2861
3314
  .gdp-source-loading-content {
2862
3315
  display: flex;
3316
+ flex-wrap: wrap;
2863
3317
  align-items: center;
2864
3318
  gap: 10px;
2865
3319
  min-width: 0;
2866
3320
  }
3321
+ .gdp-source-loading-spinner {
3322
+ display: inline-block;
3323
+ width: 14px;
3324
+ height: 14px;
3325
+ border: 2px solid var(--border);
3326
+ border-top-color: var(--accent);
3327
+ border-radius: 50%;
3328
+ flex: 0 0 auto;
3329
+ animation: gdp-spin 0.8s linear infinite;
3330
+ }
2867
3331
  .gdp-source-loading-title {
2868
3332
  color: var(--fg);
2869
3333
  font-weight: 600;
@@ -2874,6 +3338,12 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2874
3338
  text-overflow: ellipsis;
2875
3339
  white-space: nowrap;
2876
3340
  }
3341
+ .gdp-source-loading-slow-note {
3342
+ flex-basis: 100%;
3343
+ color: var(--fg-subtle);
3344
+ font-size: 12px;
3345
+ font-style: italic;
3346
+ }
2877
3347
  .gdp-source-cancel {
2878
3348
  margin-left: auto;
2879
3349
  }
@@ -3909,6 +4379,11 @@ body.gdp-file-detail-page.gdp-repo-blob-page .sb-filter-wrap::after {
3909
4379
  left: 22px;
3910
4380
  top: 27px;
3911
4381
  }
4382
+ body.gdp-repo-page .sb-filter-clear,
4383
+ body.gdp-file-detail-page.gdp-repo-blob-page .sb-filter-clear {
4384
+ right: 7px;
4385
+ top: 22px;
4386
+ }
3912
4387
  body.gdp-file-detail-page {
3913
4388
  --chrome-h: var(--global-header-h);
3914
4389
  }
@@ -4094,6 +4569,32 @@ body.gdp-file-detail-page #empty {
4094
4569
  font-size: 12px;
4095
4570
  white-space: nowrap;
4096
4571
  }
4572
+
4573
+ /* commit 型で非 browsable (submodule / 非worktree ref) な行。フォルダ/ファイルと
4574
+ 混同されないよう、通常行と別の cursor / アイコン色 / meta chip で区別する。 */
4575
+ .gdp-repo-row-gitlink {
4576
+ cursor: default;
4577
+ }
4578
+ .gdp-repo-row-gitlink:hover {
4579
+ background: var(--bg);
4580
+ }
4581
+ .gdp-repo-row .d2h-icon-wrapper.gdp-repo-row-gitlink-icon {
4582
+ color: var(--attn);
4583
+ background: color-mix(in srgb, var(--attn) 12%, transparent);
4584
+ border-radius: 4px;
4585
+ }
4586
+ .gdp-repo-row .meta.gdp-repo-row-gitlink-badge {
4587
+ display: inline-flex;
4588
+ align-items: center;
4589
+ width: fit-content;
4590
+ color: var(--attn);
4591
+ background: color-mix(in srgb, var(--attn) 10%, transparent);
4592
+ border: 1px solid color-mix(in srgb, var(--attn) 35%, var(--border));
4593
+ border-radius: 999px;
4594
+ padding: 2px 8px;
4595
+ font-size: 11px;
4596
+ line-height: 1.4;
4597
+ }
4097
4598
  .gdp-context-menu {
4098
4599
  position: fixed;
4099
4600
  z-index: 1000;
@@ -4510,19 +5011,133 @@ body.gdp-file-detail-page #empty {
4510
5011
  }
4511
5012
  #content { margin-left: 0; max-width: none; padding-top: calc(var(--chrome-h) + 240px); }
4512
5013
  .controls input[type="search"] { width: 130px; }
5014
+ .app-menu {
5015
+ flex-shrink: 1;
5016
+ min-width: 0;
5017
+ overflow-x: auto;
5018
+ scrollbar-width: thin;
5019
+ }
5020
+ .ai-context-label { display: none; }
5021
+ .ai-context-action { padding: 0; }
5022
+ #status .status-label { display: none; }
5023
+ #status { padding: 0 6px 0 8px; }
5024
+ #status::before { margin-right: 0; }
5025
+ #meta { flex-wrap: wrap; row-gap: 4px; }
5026
+ .d2h-file-header,
5027
+ .d2h-file-header.d2h-sticky-header {
5028
+ height: auto !important;
5029
+ min-height: 82px;
5030
+ flex-wrap: wrap;
5031
+ align-items: center;
5032
+ align-content: center;
5033
+ row-gap: 6px;
5034
+ }
5035
+ .d2h-file-header .d2h-file-name-wrapper {
5036
+ flex: 1 1 calc(100% - 44px);
5037
+ min-width: 160px;
5038
+ order: 1;
5039
+ }
5040
+ .d2h-file-header > .gdp-file-toggle {
5041
+ order: 0;
5042
+ }
5043
+ .d2h-file-header > .d2h-file-collapse {
5044
+ order: 2;
5045
+ margin-left: 0;
5046
+ }
5047
+ .d2h-file-header > .gdp-stat-text {
5048
+ order: 3;
5049
+ margin-left: 0;
5050
+ }
5051
+ .d2h-file-header > .gdp-stat-squares {
5052
+ order: 4;
5053
+ }
5054
+ .d2h-file-header > .gdp-view-file {
5055
+ order: 5;
5056
+ margin-left: auto;
5057
+ }
4513
5058
  body.gdp-history-page #history-panel {
4514
5059
  position: static;
4515
5060
  width: auto;
4516
5061
  border-right: 0;
4517
5062
  border-bottom: 1px solid var(--border);
4518
5063
  }
4519
- body.gdp-history-page #sidebar { left: 0; }
4520
- body.gdp-history-page #history-resizer {
5064
+ body.gdp-history-page #sidebar { left: 0; }
5065
+ body.gdp-history-page #history-resizer {
5066
+ display: none;
5067
+ }
5068
+ body.gdp-history-page main#content,
5069
+ body.gdp-history-page.gdp-sidebar-hidden main#content {
5070
+ margin-left: 0;
5071
+ }
5072
+ }
5073
+
5074
+ @media (max-width: 640px) {
5075
+ body {
5076
+ --topbar-h: 112px;
5077
+ }
5078
+ #global-header {
5079
+ gap: 8px;
5080
+ padding: 0 10px;
5081
+ }
5082
+ #topbar {
5083
+ align-items: flex-start;
5084
+ padding-top: 8px;
5085
+ padding-bottom: 8px;
5086
+ }
5087
+ .brand {
5088
+ flex: 0 0 auto;
5089
+ max-width: 28px;
5090
+ }
5091
+ .brand .title,
5092
+ #project-branch,
5093
+ .global-actions .global-help-link,
5094
+ .product-label {
4521
5095
  display: none;
4522
5096
  }
4523
- body.gdp-history-page main#content,
4524
- body.gdp-history-page.gdp-sidebar-hidden main#content {
5097
+ .app-menu {
5098
+ flex: 1 1 0;
5099
+ min-width: 0;
5100
+ gap: 4px;
5101
+ padding-left: 8px;
5102
+ overflow-x: auto;
5103
+ scrollbar-width: none;
5104
+ }
5105
+ .app-menu::-webkit-scrollbar {
5106
+ display: none;
5107
+ }
5108
+ .app-menu-item {
5109
+ height: 28px;
5110
+ padding: 0 7px;
5111
+ font-size: 13px;
5112
+ }
5113
+ .global-actions {
5114
+ flex: 0 0 auto;
4525
5115
  margin-left: 0;
5116
+ gap: 4px;
5117
+ }
5118
+ #annotations-toggle,
5119
+ #viewer-settings,
5120
+ #doctor-btn,
5121
+ #cancel-requests,
5122
+ #theme {
5123
+ width: 24px;
5124
+ height: 24px;
5125
+ }
5126
+ #auto-update {
5127
+ padding: 0 6px;
5128
+ }
5129
+ }
5130
+
5131
+ @media (max-width: 360px) {
5132
+ .d2h-file-header .d2h-tag {
5133
+ display: none;
5134
+ }
5135
+ .d2h-file-header .d2h-file-name {
5136
+ flex: 1 1 auto;
5137
+ min-width: 72px;
5138
+ }
5139
+ .d2h-file-header .d2h-file-name-wrapper {
5140
+ min-width: 0;
4526
5141
  }
4527
5142
  }
4528
5143
 
@@ -4806,7 +5421,7 @@ body.gdp-file-detail-page #empty {
4806
5421
  right: 0;
4807
5422
  top: var(--chrome-h);
4808
5423
  bottom: 0;
4809
- width: min(380px, calc(100vw - 32px));
5424
+ width: min(var(--annotation-panel-w), calc(100vw - 32px));
4810
5425
  z-index: 45;
4811
5426
  display: flex;
4812
5427
  flex-direction: column;
@@ -4814,6 +5429,24 @@ body.gdp-file-detail-page #empty {
4814
5429
  background: var(--bg);
4815
5430
  box-shadow: var(--shadow-md);
4816
5431
  }
5432
+ #annotation-panel-resizer {
5433
+ position: absolute;
5434
+ left: -4px;
5435
+ top: 0;
5436
+ bottom: 0;
5437
+ width: 8px;
5438
+ cursor: col-resize;
5439
+ touch-action: none;
5440
+ z-index: 1;
5441
+ }
5442
+ #annotation-panel-resizer:hover,
5443
+ body.gdp-annotation-resizing #annotation-panel-resizer {
5444
+ background: var(--accent-muted);
5445
+ }
5446
+ body.gdp-annotation-resizing {
5447
+ cursor: col-resize !important;
5448
+ user-select: none;
5449
+ }
4817
5450
  #annotation-panel[hidden],
4818
5451
  #annotation-detail[hidden] {
4819
5452
  display: none;
@@ -4827,7 +5460,7 @@ body.gdp-database-page #annotation-panel {
4827
5460
  }
4828
5461
  /* Keep code readable next to the panel instead of underneath it. */
4829
5462
  body.annotation-panel-open #content {
4830
- margin-right: min(380px, calc(100vw - 32px));
5463
+ margin-right: min(var(--annotation-panel-w), calc(100vw - 32px));
4831
5464
  }
4832
5465
 
4833
5466
  /* ---- Query History right-panel ---- */
@@ -5130,10 +5763,29 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
5130
5763
  font-size: 12px;
5131
5764
  cursor: pointer;
5132
5765
  font-family: inherit;
5766
+ display: inline-flex;
5767
+ align-items: center;
5768
+ gap: 4px;
5133
5769
  }
5134
5770
  .db-query-history-action:hover {
5135
5771
  background: var(--bg-mute);
5136
5772
  }
5773
+ .db-query-history-action[disabled] {
5774
+ cursor: default;
5775
+ opacity: 0.7;
5776
+ }
5777
+ .db-query-history-action svg {
5778
+ width: 14px;
5779
+ height: 14px;
5780
+ flex: 0 0 auto;
5781
+ }
5782
+ .db-query-history-refresh-result {
5783
+ align-self: center;
5784
+ line-height: 1;
5785
+ }
5786
+ .db-query-history-refresh.spinning svg {
5787
+ animation: gdp-spin 0.7s linear infinite;
5788
+ }
5137
5789
  .db-query-history-danger {
5138
5790
  color: var(--danger, #d32f2f);
5139
5791
  }
@@ -5162,6 +5814,22 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
5162
5814
  padding: 40px 16px;
5163
5815
  font-size: 13px;
5164
5816
  }
5817
+ .db-query-history-detail-meta {
5818
+ display: flex;
5819
+ align-items: center;
5820
+ flex-wrap: wrap;
5821
+ gap: 8px;
5822
+ padding: 6px 8px;
5823
+ margin-bottom: 10px;
5824
+ border: 1px solid var(--border);
5825
+ border-radius: 4px;
5826
+ background: var(--bg-soft);
5827
+ color: var(--fg-muted);
5828
+ font-size: 11px;
5829
+ }
5830
+ .db-query-history-detail-meta .db-query-history-by {
5831
+ color: var(--fg);
5832
+ }
5165
5833
  .db-query-history-detail-actions {
5166
5834
  display: flex;
5167
5835
  gap: 8px;
@@ -5296,10 +5964,15 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
5296
5964
  border-radius: 6px;
5297
5965
  background: var(--bg-soft);
5298
5966
  color: var(--fg-muted);
5299
- font-size: 12px;
5300
- padding: 2px 8px;
5967
+ display: inline-flex;
5968
+ align-items: center;
5969
+ justify-content: center;
5970
+ width: 30px;
5971
+ height: 30px;
5972
+ padding: 0;
5301
5973
  cursor: pointer;
5302
5974
  line-height: 1;
5975
+ flex: 0 0 auto;
5303
5976
  }
5304
5977
  #annotation-player-toggle:hover,
5305
5978
  #annotation-player-prev:hover,
@@ -5309,6 +5982,11 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
5309
5982
  background: var(--bg-mute);
5310
5983
  color: var(--fg);
5311
5984
  }
5985
+ #annotation-player .octicon {
5986
+ display: block;
5987
+ width: 16px;
5988
+ height: 16px;
5989
+ }
5312
5990
  #annotation-player-progress {
5313
5991
  margin-left: auto;
5314
5992
  opacity: .7;
@@ -5431,7 +6109,9 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
5431
6109
  flex: 1;
5432
6110
  display: grid;
5433
6111
  grid-template-columns: 18px minmax(0, 1fr);
6112
+ grid-template-rows: auto auto auto;
5434
6113
  column-gap: 4px;
6114
+ row-gap: 1px;
5435
6115
  text-align: left;
5436
6116
  border: 0;
5437
6117
  background: none;
@@ -5442,7 +6122,7 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
5442
6122
  }
5443
6123
  .annotation-entry-open::before {
5444
6124
  content: counter(annotation-step);
5445
- grid-row: 1 / span 2;
6125
+ grid-row: 1 / span 3;
5446
6126
  color: var(--fg-subtle);
5447
6127
  font-size: 11px;
5448
6128
  line-height: 1.6;
@@ -5470,6 +6150,13 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
5470
6150
  text-overflow: ellipsis;
5471
6151
  white-space: nowrap;
5472
6152
  }
6153
+ .annotation-entry-time {
6154
+ grid-column: 2;
6155
+ display: block;
6156
+ font-size: 10px;
6157
+ color: var(--fg-subtle);
6158
+ white-space: nowrap;
6159
+ }
5473
6160
  /* Per-row actions stay quiet until the row (or the panel item) is hovered,
5474
6161
  so the list reads as content, not as a wall of trash cans. */
5475
6162
  .annotation-session-head .annotation-icon-btn,
@@ -5529,8 +6216,12 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
5529
6216
  font-size: 11px;
5530
6217
  color: var(--fg-subtle);
5531
6218
  }
5532
- #annotation-detail-prev,
5533
- #annotation-detail-next,
6219
+ #annotation-detail-time {
6220
+ flex: none;
6221
+ font-size: 11px;
6222
+ color: var(--fg-subtle);
6223
+ white-space: nowrap;
6224
+ }
5534
6225
  #annotation-detail-close {
5535
6226
  border: 1px solid var(--border);
5536
6227
  border-radius: 6px;
@@ -6039,6 +6730,51 @@ body[data-sidebar-font-size="xlarge"] .db-container {
6039
6730
  padding: 8px;
6040
6731
  border-bottom: 1px solid var(--border);
6041
6732
  }
6733
+ .db-select-row {
6734
+ display: flex;
6735
+ align-items: center;
6736
+ gap: 6px;
6737
+ min-width: 0;
6738
+ }
6739
+ .db-select-row .db-file-select {
6740
+ flex: 1 1 auto;
6741
+ min-width: 0;
6742
+ }
6743
+ .db-refresh-btn {
6744
+ flex: 0 0 auto;
6745
+ width: auto;
6746
+ min-width: 30px;
6747
+ padding: 0 7px;
6748
+ gap: 4px;
6749
+ border: 1px solid var(--border);
6750
+ background: var(--bg);
6751
+ font-weight: 500;
6752
+ }
6753
+ .db-refresh-btn[disabled] {
6754
+ cursor: default;
6755
+ opacity: 0.7;
6756
+ }
6757
+ .db-refresh-btn.spinning svg {
6758
+ animation: gdp-spin 0.7s linear infinite;
6759
+ }
6760
+ .db-refresh-label {
6761
+ line-height: 1;
6762
+ white-space: nowrap;
6763
+ }
6764
+ .db-refresh-result {
6765
+ flex: 0 0 auto;
6766
+ color: var(--fg-subtle);
6767
+ font-size: var(--db-font-xs);
6768
+ white-space: nowrap;
6769
+ }
6770
+ .db-refresh-result.changed {
6771
+ color: var(--accent);
6772
+ font-weight: 600;
6773
+ }
6774
+ .db-grid-refresh-result {
6775
+ align-self: center;
6776
+ line-height: 1;
6777
+ }
6042
6778
 
6043
6779
  /* explorer (redis/es/s3) の第1階層セレクタ (Databases / Indices / Bucket+View)
6044
6780
  を抱える sidebar 内 host。kind が SQL のときは中身が全て hidden になるため
@@ -6092,11 +6828,12 @@ body[data-sidebar-font-size="xlarge"] .db-container {
6092
6828
  }
6093
6829
 
6094
6830
  .db-table-filter-wrap {
6831
+ position: relative;
6095
6832
  padding: 4px 8px;
6096
6833
  }
6097
6834
  .db-table-filter {
6098
6835
  width: 100%;
6099
- padding: 4px 8px 4px 24px;
6836
+ padding: 4px 34px 4px 24px;
6100
6837
  border: 1px solid var(--border);
6101
6838
  border-radius: 6px;
6102
6839
  background: var(--bg);
@@ -6112,6 +6849,22 @@ body[data-sidebar-font-size="xlarge"] .db-container {
6112
6849
  outline-offset: -1px;
6113
6850
  border-color: var(--accent);
6114
6851
  }
6852
+ .db-table-filter-clear {
6853
+ right: 12px;
6854
+ top: 50%;
6855
+ height: 20px;
6856
+ min-width: 24px;
6857
+ padding: 0 5px;
6858
+ border-radius: 5px;
6859
+ display: inline-flex;
6860
+ align-items: center;
6861
+ justify-content: center;
6862
+ }
6863
+ .db-table-filter-clear svg {
6864
+ width: 12px;
6865
+ height: 12px;
6866
+ display: block;
6867
+ }
6115
6868
  .db-table-list {
6116
6869
  flex: 1;
6117
6870
  overflow-y: auto;
@@ -6124,6 +6877,9 @@ body[data-sidebar-font-size="xlarge"] .db-container {
6124
6877
  text-align: center;
6125
6878
  font-size: var(--db-font-md);
6126
6879
  }
6880
+ .db-table-list-empty-actions {
6881
+ margin-top: 10px;
6882
+ }
6127
6883
 
6128
6884
  .db-table-group-header {
6129
6885
  padding: 6px 12px 2px;
@@ -6319,6 +7075,18 @@ body[data-sidebar-font-size="xlarge"] .db-container {
6319
7075
  overflow: hidden;
6320
7076
  background: var(--bg);
6321
7077
  }
7078
+ .db-no-datastores {
7079
+ flex: 1;
7080
+ min-height: 0;
7081
+ }
7082
+ .db-no-datastores[hidden] {
7083
+ display: none !important;
7084
+ }
7085
+ .db-no-datastores-actions {
7086
+ display: flex;
7087
+ justify-content: center;
7088
+ margin-top: 4px;
7089
+ }
6322
7090
 
6323
7091
  /* ---------- Tab bar ---------- */
6324
7092
  .db-tab-bar {
@@ -6850,6 +7618,10 @@ html[data-theme="dark"] .db-query-highlight span[style] {
6850
7618
  }
6851
7619
 
6852
7620
  .db-schema-header {
7621
+ display: flex;
7622
+ align-items: center;
7623
+ justify-content: space-between;
7624
+ gap: 8px;
6853
7625
  font-size: 14px;
6854
7626
  font-weight: 600;
6855
7627
  color: var(--fg);
@@ -6860,6 +7632,15 @@ html[data-theme="dark"] .db-query-highlight span[style] {
6860
7632
  .db-schema-header:first-child {
6861
7633
  margin-top: 0;
6862
7634
  }
7635
+ .db-schema-header-title {
7636
+ min-width: 0;
7637
+ overflow: hidden;
7638
+ text-overflow: ellipsis;
7639
+ white-space: nowrap;
7640
+ }
7641
+ .db-schema-refresh {
7642
+ flex: 0 0 auto;
7643
+ }
6863
7644
 
6864
7645
  .db-schema-table {
6865
7646
  border-collapse: collapse;
@@ -6930,8 +7711,18 @@ html[data-theme="dark"] .db-schema-table tr.pk-row {
6930
7711
  }
6931
7712
 
6932
7713
  .db-grid-filter-icon {
6933
- font-size: var(--db-font-md);
6934
7714
  flex-shrink: 0;
7715
+ display: inline-flex;
7716
+ align-items: center;
7717
+ justify-content: center;
7718
+ width: 16px;
7719
+ height: 16px;
7720
+ color: var(--fg-muted);
7721
+ }
7722
+ .db-grid-filter-icon svg {
7723
+ display: block;
7724
+ width: 16px;
7725
+ height: 16px;
6935
7726
  }
6936
7727
 
6937
7728
  .db-grid-filter-input {
@@ -6951,18 +7742,84 @@ html[data-theme="dark"] .db-schema-table tr.pk-row {
6951
7742
  border-color: var(--accent);
6952
7743
  }
6953
7744
 
7745
+ .db-grid-filter-actions {
7746
+ display: flex;
7747
+ align-items: center;
7748
+ gap: 6px;
7749
+ flex: 0 0 auto;
7750
+ margin-left: auto;
7751
+ }
7752
+
6954
7753
  .db-grid-filter-clear {
6955
- border: none;
6956
- background: none;
7754
+ flex: 0 0 auto;
7755
+ height: 24px;
7756
+ border-color: color-mix(in srgb, var(--danger) 34%, var(--border));
7757
+ background: color-mix(in srgb, var(--danger) 8%, var(--bg));
6957
7758
  color: var(--fg-muted);
6958
- font-size: 16px;
6959
- cursor: pointer;
6960
- padding: 0 4px;
6961
- line-height: 1;
7759
+ font-size: var(--db-font-sm);
7760
+ padding: 0 8px;
6962
7761
  }
6963
7762
  .db-grid-filter-clear:hover {
7763
+ background: color-mix(in srgb, var(--danger) 14%, var(--bg));
6964
7764
  color: var(--danger);
6965
7765
  }
7766
+ .db-grid-refresh {
7767
+ width: auto;
7768
+ min-width: 30px;
7769
+ height: 24px;
7770
+ padding: 0 8px;
7771
+ border: 1px solid var(--border);
7772
+ border-radius: 4px;
7773
+ background: var(--bg);
7774
+ color: var(--fg-muted);
7775
+ cursor: pointer;
7776
+ display: inline-flex;
7777
+ align-items: center;
7778
+ justify-content: center;
7779
+ gap: 4px;
7780
+ font-size: var(--db-font-base);
7781
+ font-weight: 500;
7782
+ }
7783
+ .db-grid-refresh:hover {
7784
+ color: var(--fg);
7785
+ border-color: var(--accent);
7786
+ background: var(--bg);
7787
+ }
7788
+ .db-grid-refresh.has-filters {
7789
+ border-color: color-mix(in srgb, var(--accent) 56%, var(--border));
7790
+ background: color-mix(in srgb, var(--accent) 10%, var(--bg));
7791
+ color: var(--fg);
7792
+ }
7793
+ .db-grid-refresh.has-filters:hover {
7794
+ background: color-mix(in srgb, var(--accent) 16%, var(--bg));
7795
+ }
7796
+ .db-grid-refresh svg {
7797
+ width: 16px;
7798
+ height: 16px;
7799
+ display: block;
7800
+ flex: 0 0 auto;
7801
+ }
7802
+ .db-grid-refresh-label {
7803
+ line-height: 1;
7804
+ white-space: nowrap;
7805
+ }
7806
+ .db-grid-refresh[disabled] {
7807
+ cursor: default;
7808
+ opacity: 0.7;
7809
+ }
7810
+ .db-grid-refresh.spinning svg {
7811
+ animation: gdp-spin 0.7s linear infinite;
7812
+ }
7813
+
7814
+ @media (max-width: 720px) {
7815
+ .db-grid-refresh {
7816
+ width: 30px;
7817
+ padding: 0;
7818
+ }
7819
+ .db-grid-refresh-label {
7820
+ display: none;
7821
+ }
7822
+ }
6966
7823
 
6967
7824
  /* ---------- Data Grid: Column Filter Row ---------- */
6968
7825
  .db-grid-filter-row-wrap {
@@ -7150,10 +8007,19 @@ html[data-theme="dark"] .db-schema-table tr.pk-row {
7150
8007
 
7151
8008
  /* ---------- Foreign-key related data ---------- */
7152
8009
  .db-grid-header-fk-icon {
8010
+ display: inline-flex;
8011
+ align-items: center;
8012
+ justify-content: center;
7153
8013
  margin-left: 4px;
7154
- font-size: 10px;
8014
+ width: 12px;
8015
+ height: 12px;
7155
8016
  opacity: 0.7;
7156
8017
  }
8018
+ .db-grid-header-fk-icon svg {
8019
+ display: block;
8020
+ width: 12px;
8021
+ height: 12px;
8022
+ }
7157
8023
 
7158
8024
  .db-grid-cell-fk {
7159
8025
  color: var(--accent, var(--link, #2563eb));
@@ -7206,7 +8072,17 @@ html[data-theme="dark"] .db-schema-table tr.pk-row {
7206
8072
 
7207
8073
  .db-related-title {
7208
8074
  flex-shrink: 0;
7209
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
8075
+ display: inline-flex;
8076
+ align-items: center;
8077
+ justify-content: center;
8078
+ width: 16px;
8079
+ height: 16px;
8080
+ color: var(--accent);
8081
+ }
8082
+ .db-related-title svg {
8083
+ display: block;
8084
+ width: 16px;
8085
+ height: 16px;
7210
8086
  }
7211
8087
 
7212
8088
  .db-related-close {
@@ -7316,15 +8192,23 @@ html[data-theme="dark"] .db-schema-table tr.pk-row {
7316
8192
  }
7317
8193
 
7318
8194
  .db-grid-export-toggle {
8195
+ display: inline-flex;
8196
+ align-items: center;
8197
+ justify-content: center;
8198
+ width: 30px;
8199
+ height: 24px;
7319
8200
  border: 1px solid var(--border);
7320
8201
  border-radius: 4px;
7321
8202
  background: var(--bg);
7322
8203
  color: var(--fg-muted);
7323
- font-size: var(--db-font-md);
7324
- line-height: 1;
7325
- padding: 3px 7px;
8204
+ padding: 0;
7326
8205
  cursor: pointer;
7327
8206
  }
8207
+ .db-grid-export-toggle svg {
8208
+ display: block;
8209
+ width: 16px;
8210
+ height: 16px;
8211
+ }
7328
8212
  .db-grid-export-toggle:hover {
7329
8213
  color: var(--fg);
7330
8214
  border-color: var(--accent);
@@ -9062,6 +9946,15 @@ body.db-resizing {
9062
9946
  font-size: var(--db-font-sm);
9063
9947
  line-height: 1.5;
9064
9948
  }
9949
+ .db-pane-empty-actions {
9950
+ display: flex;
9951
+ flex-wrap: wrap;
9952
+ justify-content: center;
9953
+ gap: 8px;
9954
+ }
9955
+ .db-pane-empty-actions[hidden] {
9956
+ display: none;
9957
+ }
9065
9958
 
9066
9959
  /* ---------- Elasticsearch explorer ---------- */
9067
9960
  .es-explorer {