@youtyan/code-viewer 0.6.1 → 0.6.3

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
@@ -485,8 +485,19 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
485
485
  color: var(--attn);
486
486
  border-color: var(--attn);
487
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
+ }
488
498
  #auto-update {
489
499
  width: auto;
500
+ gap: 6px;
490
501
  padding: 0 8px;
491
502
  font-size: 11px;
492
503
  font-weight: 600;
@@ -496,12 +507,6 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
496
507
  border-color: var(--success);
497
508
  color: var(--success);
498
509
  }
499
- #cancel-requests {
500
- width: auto;
501
- padding: 0 8px;
502
- font-size: 11px;
503
- font-weight: 600;
504
- }
505
510
  #cancel-requests.active {
506
511
  color: var(--danger);
507
512
  border-color: var(--danger);
@@ -532,14 +537,7 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
532
537
  line-height: 1;
533
538
  white-space: nowrap;
534
539
  }
535
- #meta .num {
536
- display: inline-flex; gap: 8px;
537
- font-variant-numeric: tabular-nums;
538
- font-size: 12px;
539
- }
540
- #meta .num .add { color: var(--success); font-weight: 600; }
541
- #meta .num .del { color: var(--danger); font-weight: 600; }
542
- #meta .updated-at {
540
+ #meta .chip {
543
541
  display: inline-flex;
544
542
  align-items: center;
545
543
  gap: 4px;
@@ -547,12 +545,41 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
547
545
  background: var(--bg-soft);
548
546
  border: 1px solid var(--border);
549
547
  border-radius: 999px;
550
- padding: 3px 8px;
548
+ padding: 3px 9px;
551
549
  font-size: 11px;
552
550
  line-height: 1;
553
551
  font-variant-numeric: tabular-nums;
554
552
  white-space: nowrap;
555
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-error { color: var(--danger); border-color: color-mix(in srgb, var(--danger) 35%, var(--border)); }
562
+ #meta .chip-binary,
563
+ #meta .chip-media { color: var(--fg-muted); }
564
+ #meta .chip-viewed-empty { color: var(--fg-muted); }
565
+ #meta .chip-viewed-partial { color: var(--attn); border-color: color-mix(in srgb, var(--attn) 35%, var(--border)); }
566
+ #meta .chip-viewed-done { color: var(--done); border-color: color-mix(in srgb, var(--done) 35%, var(--border)); }
567
+ #meta .chip-next-unviewed {
568
+ font: inherit;
569
+ cursor: pointer;
570
+ color: var(--accent-emph);
571
+ border-color: color-mix(in srgb, var(--accent-emph) 35%, var(--border));
572
+ }
573
+ #meta .chip-next-unviewed:hover:not(:disabled) {
574
+ background: var(--bg-soft);
575
+ border-color: var(--border-strong);
576
+ }
577
+ #meta .chip-next-unviewed:disabled {
578
+ cursor: default;
579
+ opacity: 0.45;
580
+ color: var(--fg-muted);
581
+ border-color: var(--border);
582
+ }
556
583
  .ref-pickers {
557
584
  display: flex;
558
585
  align-items: center;
@@ -641,6 +668,10 @@ body.gdp-diff-page #repo-target-wrap {
641
668
  }
642
669
  .ref-pickers > button {
643
670
  width: 24px; height: 26px;
671
+ display: inline-flex;
672
+ align-items: center;
673
+ justify-content: center;
674
+ padding: 0;
644
675
  border: 1px solid var(--border);
645
676
  background: var(--bg);
646
677
  color: var(--fg-muted);
@@ -649,6 +680,11 @@ body.gdp-diff-page #repo-target-wrap {
649
680
  font-size: 13px;
650
681
  transition: background 0.12s, color 0.12s;
651
682
  }
683
+ .ref-pickers > button svg {
684
+ display: block;
685
+ width: 14px;
686
+ height: 14px;
687
+ }
652
688
  .ref-pickers > button:hover {
653
689
  background: var(--accent);
654
690
  color: #fff;
@@ -982,13 +1018,35 @@ body.gdp-diff-page #repo-target-wrap {
982
1018
  @keyframes gdp-spin { to { transform: rotate(360deg); } }
983
1019
 
984
1020
  #status {
985
- width: 8px; height: 8px; border-radius: 50%;
1021
+ display: inline-flex;
1022
+ align-items: center;
1023
+ height: 24px;
1024
+ padding: 0 9px 0 8px;
1025
+ border: 1px solid var(--border);
1026
+ border-radius: 999px;
1027
+ background: color-mix(in srgb, var(--bg) 72%, var(--bg-soft));
1028
+ color: var(--fg-muted);
1029
+ font-size: 11px;
1030
+ font-weight: 600;
1031
+ line-height: 1;
1032
+ white-space: nowrap;
1033
+ }
1034
+ #status::before {
1035
+ content: "";
1036
+ flex: 0 0 auto;
1037
+ width: 6px;
1038
+ height: 6px;
1039
+ margin-right: 6px;
1040
+ border-radius: 50%;
986
1041
  background: var(--fg-subtle);
987
1042
  transition: background 0.2s ease, box-shadow 0.2s ease;
988
1043
  }
989
- #status.live { background: #2ea043; box-shadow: 0 0 0 3px rgba(46,160,67,0.20); }
990
- #status.refreshing { background: #d29922; box-shadow: 0 0 0 3px rgba(210,153,34,0.25); }
991
- #status.error { background: var(--danger); box-shadow: 0 0 0 3px rgba(207,34,46,0.20); }
1044
+ #status.live::before { background: #2ea043; box-shadow: 0 0 0 3px rgba(46,160,67,0.20); }
1045
+ #status.refreshing::before { background: #d29922; box-shadow: 0 0 0 3px rgba(210,153,34,0.25); }
1046
+ #status.error::before { background: var(--danger); box-shadow: 0 0 0 3px rgba(207,34,46,0.20); }
1047
+ #status.live { color: var(--success); }
1048
+ #status.refreshing { color: var(--attn); }
1049
+ #status.error { color: var(--danger); }
992
1050
 
993
1051
  /* ===== Top-edge loading bar (indeterminate) ===== */
994
1052
  #load-bar {
@@ -1178,6 +1236,78 @@ body.gdp-history-page #topbar .ref-pickers {
1178
1236
  flex: 1 1 auto;
1179
1237
  min-width: 0;
1180
1238
  }
1239
+ .history-refresh {
1240
+ position: relative;
1241
+ display: inline-flex;
1242
+ align-items: center;
1243
+ justify-content: center;
1244
+ flex: 0 0 auto;
1245
+ width: auto;
1246
+ min-width: 28px;
1247
+ height: 28px;
1248
+ padding: 0 7px;
1249
+ gap: 4px;
1250
+ border: 1px solid transparent;
1251
+ border-radius: 4px;
1252
+ background: transparent;
1253
+ color: var(--fg-muted);
1254
+ cursor: pointer;
1255
+ }
1256
+ .history-refresh:hover {
1257
+ background: var(--bg);
1258
+ color: var(--fg);
1259
+ }
1260
+ .history-refresh:focus-visible {
1261
+ outline: 2px solid var(--accent);
1262
+ outline-offset: -1px;
1263
+ }
1264
+ .history-refresh[disabled] {
1265
+ cursor: default;
1266
+ opacity: 0.7;
1267
+ }
1268
+ .history-refresh.spinning svg {
1269
+ animation: gdp-spin 0.7s linear infinite;
1270
+ }
1271
+ .history-refresh.has-update {
1272
+ color: var(--accent);
1273
+ border-color: var(--accent);
1274
+ box-shadow: 0 0 0 1px var(--accent-subtle);
1275
+ }
1276
+ .history-refresh.has-update::after {
1277
+ content: "";
1278
+ position: absolute;
1279
+ top: 1px;
1280
+ right: 1px;
1281
+ width: 7px;
1282
+ height: 7px;
1283
+ border-radius: 50%;
1284
+ background: var(--accent);
1285
+ box-shadow: 0 0 0 2px var(--bg-soft);
1286
+ }
1287
+ .history-refresh svg {
1288
+ width: 16px;
1289
+ height: 16px;
1290
+ flex: 0 0 auto;
1291
+ pointer-events: none;
1292
+ }
1293
+ .history-refresh-label {
1294
+ line-height: 1;
1295
+ white-space: nowrap;
1296
+ font-size: 12px;
1297
+ font-weight: 600;
1298
+ }
1299
+ .history-refresh-result {
1300
+ min-width: 0;
1301
+ max-width: 180px;
1302
+ overflow: hidden;
1303
+ text-overflow: ellipsis;
1304
+ white-space: nowrap;
1305
+ line-height: 1;
1306
+ }
1307
+ .history-refresh-result.pending {
1308
+ color: var(--accent);
1309
+ font-weight: 600;
1310
+ }
1181
1311
  .history-filter-wrap {
1182
1312
  position: relative;
1183
1313
  padding: 7px 12px 9px;
@@ -1220,10 +1350,49 @@ body.gdp-history-page #topbar .ref-pickers {
1220
1350
  font: inherit;
1221
1351
  font-size: 13px;
1222
1352
  line-height: 30px;
1223
- padding: 0 11px 0 34px;
1353
+ padding: 0 60px 0 34px;
1224
1354
  outline: none;
1225
1355
  transition: border-color 0.12s ease, background-color 0.12s ease, box-shadow 0.12s ease;
1226
1356
  }
1357
+ .history-filter-clear,
1358
+ .sb-filter-clear,
1359
+ .db-table-filter-clear {
1360
+ position: absolute;
1361
+ z-index: 1;
1362
+ right: 19px;
1363
+ top: 23px;
1364
+ transform: translateY(-50%);
1365
+ height: 22px;
1366
+ min-width: 42px;
1367
+ padding: 0 8px;
1368
+ border: 1px solid var(--border);
1369
+ border-radius: 6px;
1370
+ background: var(--bg);
1371
+ color: var(--fg-muted);
1372
+ font: inherit;
1373
+ font-size: 11px;
1374
+ font-weight: 600;
1375
+ line-height: 20px;
1376
+ cursor: pointer;
1377
+ }
1378
+ .history-filter-clear[hidden],
1379
+ .sb-filter-clear[hidden],
1380
+ .db-table-filter-clear[hidden] {
1381
+ display: none;
1382
+ }
1383
+ .history-filter-clear:hover,
1384
+ .sb-filter-clear:hover,
1385
+ .db-table-filter-clear:hover {
1386
+ color: var(--fg);
1387
+ border-color: var(--accent);
1388
+ background: color-mix(in srgb, var(--accent-muted) 42%, var(--bg));
1389
+ }
1390
+ .history-filter-clear:focus-visible,
1391
+ .sb-filter-clear:focus-visible,
1392
+ .db-table-filter-clear:focus-visible {
1393
+ outline: none;
1394
+ box-shadow: 0 0 0 3px var(--accent-muted);
1395
+ }
1227
1396
  #history-filter:hover,
1228
1397
  .history-filter:hover {
1229
1398
  border-color: var(--border);
@@ -1240,6 +1409,13 @@ body.gdp-history-page #topbar .ref-pickers {
1240
1409
  color: var(--fg-subtle);
1241
1410
  opacity: 1;
1242
1411
  }
1412
+ #history-filter::-webkit-search-decoration,
1413
+ #history-filter::-webkit-search-cancel-button,
1414
+ .history-filter::-webkit-search-decoration,
1415
+ .history-filter::-webkit-search-cancel-button {
1416
+ -webkit-appearance: none;
1417
+ appearance: none;
1418
+ }
1243
1419
  .history-banner {
1244
1420
  margin: 8px 10px 0;
1245
1421
  padding: 6px 10px;
@@ -1285,6 +1461,10 @@ body.gdp-history-page #topbar .ref-pickers {
1285
1461
  background: var(--bg-mute);
1286
1462
  border-left-color: var(--accent);
1287
1463
  }
1464
+ .history-item-fresh {
1465
+ background: color-mix(in srgb, var(--accent-subtle) 55%, transparent);
1466
+ border-left-color: var(--accent);
1467
+ }
1288
1468
  .history-item-worktree {
1289
1469
  background: color-mix(in srgb, var(--bg-soft) 72%, var(--bg-mute));
1290
1470
  color: var(--fg-muted);
@@ -1693,7 +1873,7 @@ body[data-focus-scope="main"] #content {
1693
1873
  font: inherit;
1694
1874
  font-size: 13px;
1695
1875
  line-height: 30px;
1696
- padding: 0 11px 0 34px;
1876
+ padding: 0 60px 0 34px;
1697
1877
  outline: none;
1698
1878
  transition: border-color 0.12s ease, background-color 0.12s ease, box-shadow 0.12s ease;
1699
1879
  }
@@ -1714,6 +1894,11 @@ body[data-focus-scope="main"] #content {
1714
1894
  color: var(--fg-subtle);
1715
1895
  opacity: 1;
1716
1896
  }
1897
+ #sb-filter::-webkit-search-decoration,
1898
+ #sb-filter::-webkit-search-cancel-button {
1899
+ -webkit-appearance: none;
1900
+ appearance: none;
1901
+ }
1717
1902
 
1718
1903
  /* ===== Sidebar resizer (drag right edge to resize) ===== */
1719
1904
  #sidebar-resizer {
@@ -1926,6 +2111,70 @@ body.gdp-history-resizing * {
1926
2111
  background: var(--bg-mute);
1927
2112
  }
1928
2113
 
2114
+ .quick-help-btn {
2115
+ font-weight: 700;
2116
+ }
2117
+ #quick-help-popover {
2118
+ position: fixed;
2119
+ right: 16px;
2120
+ top: calc(var(--global-header-h) + 8px);
2121
+ width: min(420px, calc(100vw - 32px));
2122
+ max-width: calc(100vw - 32px);
2123
+ max-height: min(70vh, 560px);
2124
+ overflow-y: auto;
2125
+ /* Transient popover: must sit above the annotation panel (45). */
2126
+ z-index: 70;
2127
+ padding: 12px;
2128
+ border: 1px solid var(--border);
2129
+ border-radius: 8px;
2130
+ background: var(--bg);
2131
+ box-shadow: var(--shadow);
2132
+ }
2133
+ #quick-help-popover[hidden] { display: none; }
2134
+ .quick-help-head {
2135
+ display: flex;
2136
+ align-items: center;
2137
+ justify-content: space-between;
2138
+ gap: 12px;
2139
+ margin-bottom: 10px;
2140
+ }
2141
+ #quick-help-close {
2142
+ border: 0;
2143
+ background: transparent;
2144
+ color: var(--fg-muted);
2145
+ cursor: pointer;
2146
+ font-size: 18px;
2147
+ line-height: 20px;
2148
+ }
2149
+ #quick-help-popover .gdp-help-group {
2150
+ margin: 0 0 14px;
2151
+ }
2152
+ #quick-help-popover .gdp-help-group h3 {
2153
+ margin: 0 0 6px;
2154
+ font-size: 13px;
2155
+ }
2156
+ #quick-help-popover .gdp-help-group th {
2157
+ width: auto;
2158
+ white-space: nowrap;
2159
+ }
2160
+ .quick-help-foot {
2161
+ position: sticky;
2162
+ bottom: 0;
2163
+ z-index: 1;
2164
+ margin-top: 4px;
2165
+ padding-top: 10px;
2166
+ border-top: 1px solid var(--border);
2167
+ background: var(--bg);
2168
+ }
2169
+ .quick-help-foot a {
2170
+ color: var(--accent);
2171
+ font-size: 12px;
2172
+ text-decoration: none;
2173
+ }
2174
+ .quick-help-foot a:hover {
2175
+ text-decoration: underline;
2176
+ }
2177
+
1929
2178
  body.gdp-help-page #topbar,
1930
2179
  body.gdp-help-page #sidebar,
1931
2180
  body.gdp-help-page #sidebar-resizer {
@@ -2224,7 +2473,7 @@ body.gdp-help-page #content {
2224
2473
 
2225
2474
  #filelist.tree .tree-file {
2226
2475
  display: grid;
2227
- grid-template-columns: 16px 16px minmax(0, 1fr) auto;
2476
+ grid-template-columns: 16px 16px minmax(0, 1fr) auto auto;
2228
2477
  align-items: center;
2229
2478
  gap: 8px;
2230
2479
  padding: var(--sidebar-row-y) 12px var(--sidebar-row-y) var(--lvl-pad, 12px);
@@ -2301,7 +2550,7 @@ body.gdp-help-page #content {
2301
2550
  #filelist { list-style: none; margin: 0; padding: 6px 0 0; }
2302
2551
  #filelist li {
2303
2552
  display: grid;
2304
- grid-template-columns: 16px 1fr auto;
2553
+ grid-template-columns: 16px 1fr auto auto;
2305
2554
  align-items: center;
2306
2555
  gap: 8px;
2307
2556
  padding: calc(var(--sidebar-row-y) + 2px) 14px calc(var(--sidebar-row-y) + 2px) 12px;
@@ -2366,6 +2615,38 @@ body.gdp-help-page #content {
2366
2615
  [data-theme="dark"] .badge.D { background: rgba(248,81,73,0.20); color: var(--danger); }
2367
2616
  [data-theme="dark"] .badge.R { background: rgba(163,113,247,0.20); color: var(--done); }
2368
2617
 
2618
+ /* Sidebar row marker for files worth a second look before diving in:
2619
+ heavy diffs, binary/media files, or Git commit entries. Same semantics as
2620
+ the diff card header's .size-tag, sized down for dense file list rows. */
2621
+ .kind-tag {
2622
+ width: 14px; height: 14px;
2623
+ display: inline-flex;
2624
+ align-items: center;
2625
+ justify-content: center;
2626
+ border-radius: 3px;
2627
+ font-size: 9px;
2628
+ font-weight: 700;
2629
+ letter-spacing: 0;
2630
+ flex-shrink: 0;
2631
+ }
2632
+ .kind-tag.heavy { background: #fff8c5; color: var(--attn); }
2633
+ .kind-tag.binary { background: #ddf4ff; color: var(--accent-emph); }
2634
+ .kind-tag.submodule,
2635
+ .kind-tag.gitlink {
2636
+ width: auto;
2637
+ min-width: 22px;
2638
+ padding: 0 4px;
2639
+ background: #ddf4ff;
2640
+ color: var(--accent-emph);
2641
+ }
2642
+ [data-theme="dark"] .kind-tag.heavy { background: rgba(210,153,34,0.15); color: var(--attn); }
2643
+ [data-theme="dark"] .kind-tag.binary { background: rgba(56,139,253,0.15); color: var(--accent-emph); }
2644
+ [data-theme="dark"] .kind-tag.submodule,
2645
+ [data-theme="dark"] .kind-tag.gitlink {
2646
+ background: rgba(56,139,253,0.15);
2647
+ color: var(--accent-emph);
2648
+ }
2649
+
2369
2650
  /* ===== Main content area ===== */
2370
2651
  #content {
2371
2652
  margin-left: var(--sidebar-w);
@@ -2388,8 +2669,83 @@ body:not(.gdp-file-detail-page):not(.gdp-history-page) #diff::after {
2388
2669
  display: flex; flex-direction: column; align-items: center; justify-content: center;
2389
2670
  padding: 80px 16px; color: var(--fg-muted); text-align: center;
2390
2671
  }
2391
- .empty .emoji { font-size: 40px; margin-bottom: 8px; }
2672
+ .empty .empty-icon {
2673
+ display: inline-flex;
2674
+ align-items: center;
2675
+ justify-content: center;
2676
+ width: 44px;
2677
+ height: 44px;
2678
+ margin-bottom: 10px;
2679
+ border: 1px solid var(--border);
2680
+ border-radius: 8px;
2681
+ background: var(--bg-soft);
2682
+ color: var(--fg-muted);
2683
+ }
2684
+ .empty .empty-icon .octicon {
2685
+ width: 22px;
2686
+ height: 22px;
2687
+ }
2392
2688
  .empty h2 { color: var(--fg); margin: 0 0 4px; font-size: 18px; font-weight: 600; }
2689
+ .empty.empty-with-actions p {
2690
+ max-width: 440px;
2691
+ margin: 0;
2692
+ line-height: 1.5;
2693
+ }
2694
+ .empty-actions {
2695
+ display: flex;
2696
+ flex-wrap: wrap;
2697
+ justify-content: center;
2698
+ gap: 8px;
2699
+ margin-top: 16px;
2700
+ }
2701
+ .empty-actions[hidden] { display: none; }
2702
+ .empty-action {
2703
+ min-height: 34px;
2704
+ display: inline-flex;
2705
+ align-items: center;
2706
+ justify-content: center;
2707
+ gap: 6px;
2708
+ padding: 0 12px;
2709
+ border: 1px solid var(--border);
2710
+ border-radius: 6px;
2711
+ background: var(--bg);
2712
+ color: var(--fg);
2713
+ font: inherit;
2714
+ font-size: 13px;
2715
+ line-height: 1;
2716
+ text-decoration: none;
2717
+ cursor: pointer;
2718
+ box-shadow: var(--shadow-sm);
2719
+ }
2720
+ .empty-action:hover {
2721
+ border-color: var(--border-strong);
2722
+ background: var(--bg-soft);
2723
+ }
2724
+ .empty-action:focus-visible {
2725
+ outline: 2px solid var(--accent);
2726
+ outline-offset: 2px;
2727
+ }
2728
+ .empty-action-primary {
2729
+ border-color: var(--accent);
2730
+ background: var(--accent);
2731
+ color: var(--fg-onemphasis);
2732
+ }
2733
+ .empty-action-primary:hover {
2734
+ border-color: var(--accent-emph);
2735
+ background: var(--accent-emph);
2736
+ }
2737
+ .empty-action-icon {
2738
+ display: inline-flex;
2739
+ width: 16px;
2740
+ height: 16px;
2741
+ }
2742
+ .empty-action-icon .octicon {
2743
+ width: 16px;
2744
+ height: 16px;
2745
+ }
2746
+ .empty-action.spinning .empty-action-icon {
2747
+ animation: gdp-spin 0.7s linear infinite;
2748
+ }
2393
2749
  .empty.hidden { display: none; }
2394
2750
 
2395
2751
  /* ===== diff2html overrides ===== */
@@ -4024,6 +4380,11 @@ body.gdp-file-detail-page.gdp-repo-blob-page .sb-filter-wrap::after {
4024
4380
  left: 22px;
4025
4381
  top: 27px;
4026
4382
  }
4383
+ body.gdp-repo-page .sb-filter-clear,
4384
+ body.gdp-file-detail-page.gdp-repo-blob-page .sb-filter-clear {
4385
+ right: 7px;
4386
+ top: 22px;
4387
+ }
4027
4388
  body.gdp-file-detail-page {
4028
4389
  --chrome-h: var(--global-header-h);
4029
4390
  }
@@ -4209,6 +4570,32 @@ body.gdp-file-detail-page #empty {
4209
4570
  font-size: 12px;
4210
4571
  white-space: nowrap;
4211
4572
  }
4573
+
4574
+ /* commit 型で非 browsable (submodule / 非worktree ref) な行。フォルダ/ファイルと
4575
+ 混同されないよう、通常行と別の cursor / アイコン色 / meta chip で区別する。 */
4576
+ .gdp-repo-row-gitlink {
4577
+ cursor: default;
4578
+ }
4579
+ .gdp-repo-row-gitlink:hover {
4580
+ background: var(--bg);
4581
+ }
4582
+ .gdp-repo-row .d2h-icon-wrapper.gdp-repo-row-gitlink-icon {
4583
+ color: var(--attn);
4584
+ background: color-mix(in srgb, var(--attn) 12%, transparent);
4585
+ border-radius: 4px;
4586
+ }
4587
+ .gdp-repo-row .meta.gdp-repo-row-gitlink-badge {
4588
+ display: inline-flex;
4589
+ align-items: center;
4590
+ width: fit-content;
4591
+ color: var(--attn);
4592
+ background: color-mix(in srgb, var(--attn) 10%, transparent);
4593
+ border: 1px solid color-mix(in srgb, var(--attn) 35%, var(--border));
4594
+ border-radius: 999px;
4595
+ padding: 2px 8px;
4596
+ font-size: 11px;
4597
+ line-height: 1.4;
4598
+ }
4212
4599
  .gdp-context-menu {
4213
4600
  position: fixed;
4214
4601
  z-index: 1000;
@@ -4625,6 +5012,50 @@ body.gdp-file-detail-page #empty {
4625
5012
  }
4626
5013
  #content { margin-left: 0; max-width: none; padding-top: calc(var(--chrome-h) + 240px); }
4627
5014
  .controls input[type="search"] { width: 130px; }
5015
+ .app-menu {
5016
+ flex-shrink: 1;
5017
+ min-width: 0;
5018
+ overflow-x: auto;
5019
+ scrollbar-width: thin;
5020
+ }
5021
+ .ai-context-label { display: none; }
5022
+ .ai-context-action { padding: 0; }
5023
+ #status .status-label { display: none; }
5024
+ #status { padding: 0 6px 0 8px; }
5025
+ #status::before { margin-right: 0; }
5026
+ #meta { flex-wrap: wrap; row-gap: 4px; }
5027
+ .d2h-file-header,
5028
+ .d2h-file-header.d2h-sticky-header {
5029
+ height: auto !important;
5030
+ min-height: 82px;
5031
+ flex-wrap: wrap;
5032
+ align-items: center;
5033
+ align-content: center;
5034
+ row-gap: 6px;
5035
+ }
5036
+ .d2h-file-header .d2h-file-name-wrapper {
5037
+ flex: 1 1 calc(100% - 44px);
5038
+ min-width: 160px;
5039
+ order: 1;
5040
+ }
5041
+ .d2h-file-header > .gdp-file-toggle {
5042
+ order: 0;
5043
+ }
5044
+ .d2h-file-header > .d2h-file-collapse {
5045
+ order: 2;
5046
+ margin-left: 0;
5047
+ }
5048
+ .d2h-file-header > .gdp-stat-text {
5049
+ order: 3;
5050
+ margin-left: 0;
5051
+ }
5052
+ .d2h-file-header > .gdp-stat-squares {
5053
+ order: 4;
5054
+ }
5055
+ .d2h-file-header > .gdp-view-file {
5056
+ order: 5;
5057
+ margin-left: auto;
5058
+ }
4628
5059
  body.gdp-history-page #history-panel {
4629
5060
  position: static;
4630
5061
  width: auto;
@@ -4641,6 +5072,76 @@ body.gdp-file-detail-page #empty {
4641
5072
  }
4642
5073
  }
4643
5074
 
5075
+ @media (max-width: 640px) {
5076
+ body {
5077
+ --topbar-h: 112px;
5078
+ }
5079
+ #global-header {
5080
+ gap: 8px;
5081
+ padding: 0 10px;
5082
+ }
5083
+ #topbar {
5084
+ align-items: flex-start;
5085
+ padding-top: 8px;
5086
+ padding-bottom: 8px;
5087
+ }
5088
+ .brand {
5089
+ flex: 0 0 auto;
5090
+ max-width: 28px;
5091
+ }
5092
+ .brand .title,
5093
+ #project-branch,
5094
+ .global-actions .global-help-link,
5095
+ .product-label {
5096
+ display: none;
5097
+ }
5098
+ .app-menu {
5099
+ flex: 1 1 0;
5100
+ min-width: 0;
5101
+ gap: 4px;
5102
+ padding-left: 8px;
5103
+ overflow-x: auto;
5104
+ scrollbar-width: none;
5105
+ }
5106
+ .app-menu::-webkit-scrollbar {
5107
+ display: none;
5108
+ }
5109
+ .app-menu-item {
5110
+ height: 28px;
5111
+ padding: 0 7px;
5112
+ font-size: 13px;
5113
+ }
5114
+ .global-actions {
5115
+ flex: 0 0 auto;
5116
+ margin-left: 0;
5117
+ gap: 4px;
5118
+ }
5119
+ #annotations-toggle,
5120
+ #viewer-settings,
5121
+ #doctor-btn,
5122
+ #cancel-requests,
5123
+ #theme {
5124
+ width: 24px;
5125
+ height: 24px;
5126
+ }
5127
+ #auto-update {
5128
+ padding: 0 6px;
5129
+ }
5130
+ }
5131
+
5132
+ @media (max-width: 360px) {
5133
+ .d2h-file-header .d2h-tag {
5134
+ display: none;
5135
+ }
5136
+ .d2h-file-header .d2h-file-name {
5137
+ flex: 1 1 auto;
5138
+ min-width: 72px;
5139
+ }
5140
+ .d2h-file-header .d2h-file-name-wrapper {
5141
+ min-width: 0;
5142
+ }
5143
+ }
5144
+
4644
5145
  /* ===== File shell (placeholder + loaded card) ===== */
4645
5146
  .gdp-file-shell {
4646
5147
  background: var(--bg);
@@ -5263,10 +5764,29 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
5263
5764
  font-size: 12px;
5264
5765
  cursor: pointer;
5265
5766
  font-family: inherit;
5767
+ display: inline-flex;
5768
+ align-items: center;
5769
+ gap: 4px;
5266
5770
  }
5267
5771
  .db-query-history-action:hover {
5268
5772
  background: var(--bg-mute);
5269
5773
  }
5774
+ .db-query-history-action[disabled] {
5775
+ cursor: default;
5776
+ opacity: 0.7;
5777
+ }
5778
+ .db-query-history-action svg {
5779
+ width: 14px;
5780
+ height: 14px;
5781
+ flex: 0 0 auto;
5782
+ }
5783
+ .db-query-history-refresh-result {
5784
+ align-self: center;
5785
+ line-height: 1;
5786
+ }
5787
+ .db-query-history-refresh.spinning svg {
5788
+ animation: gdp-spin 0.7s linear infinite;
5789
+ }
5270
5790
  .db-query-history-danger {
5271
5791
  color: var(--danger, #d32f2f);
5272
5792
  }
@@ -5295,6 +5815,22 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
5295
5815
  padding: 40px 16px;
5296
5816
  font-size: 13px;
5297
5817
  }
5818
+ .db-query-history-detail-meta {
5819
+ display: flex;
5820
+ align-items: center;
5821
+ flex-wrap: wrap;
5822
+ gap: 8px;
5823
+ padding: 6px 8px;
5824
+ margin-bottom: 10px;
5825
+ border: 1px solid var(--border);
5826
+ border-radius: 4px;
5827
+ background: var(--bg-soft);
5828
+ color: var(--fg-muted);
5829
+ font-size: 11px;
5830
+ }
5831
+ .db-query-history-detail-meta .db-query-history-by {
5832
+ color: var(--fg);
5833
+ }
5298
5834
  .db-query-history-detail-actions {
5299
5835
  display: flex;
5300
5836
  gap: 8px;
@@ -5429,10 +5965,15 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
5429
5965
  border-radius: 6px;
5430
5966
  background: var(--bg-soft);
5431
5967
  color: var(--fg-muted);
5432
- font-size: 12px;
5433
- padding: 2px 8px;
5968
+ display: inline-flex;
5969
+ align-items: center;
5970
+ justify-content: center;
5971
+ width: 30px;
5972
+ height: 30px;
5973
+ padding: 0;
5434
5974
  cursor: pointer;
5435
5975
  line-height: 1;
5976
+ flex: 0 0 auto;
5436
5977
  }
5437
5978
  #annotation-player-toggle:hover,
5438
5979
  #annotation-player-prev:hover,
@@ -5442,6 +5983,11 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
5442
5983
  background: var(--bg-mute);
5443
5984
  color: var(--fg);
5444
5985
  }
5986
+ #annotation-player .octicon {
5987
+ display: block;
5988
+ width: 16px;
5989
+ height: 16px;
5990
+ }
5445
5991
  #annotation-player-progress {
5446
5992
  margin-left: auto;
5447
5993
  opacity: .7;
@@ -5677,8 +6223,6 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
5677
6223
  color: var(--fg-subtle);
5678
6224
  white-space: nowrap;
5679
6225
  }
5680
- #annotation-detail-prev,
5681
- #annotation-detail-next,
5682
6226
  #annotation-detail-close {
5683
6227
  border: 1px solid var(--border);
5684
6228
  border-radius: 6px;
@@ -6187,6 +6731,51 @@ body[data-sidebar-font-size="xlarge"] .db-container {
6187
6731
  padding: 8px;
6188
6732
  border-bottom: 1px solid var(--border);
6189
6733
  }
6734
+ .db-select-row {
6735
+ display: flex;
6736
+ align-items: center;
6737
+ gap: 6px;
6738
+ min-width: 0;
6739
+ }
6740
+ .db-select-row .db-file-select {
6741
+ flex: 1 1 auto;
6742
+ min-width: 0;
6743
+ }
6744
+ .db-refresh-btn {
6745
+ flex: 0 0 auto;
6746
+ width: auto;
6747
+ min-width: 30px;
6748
+ padding: 0 7px;
6749
+ gap: 4px;
6750
+ border: 1px solid var(--border);
6751
+ background: var(--bg);
6752
+ font-weight: 500;
6753
+ }
6754
+ .db-refresh-btn[disabled] {
6755
+ cursor: default;
6756
+ opacity: 0.7;
6757
+ }
6758
+ .db-refresh-btn.spinning svg {
6759
+ animation: gdp-spin 0.7s linear infinite;
6760
+ }
6761
+ .db-refresh-label {
6762
+ line-height: 1;
6763
+ white-space: nowrap;
6764
+ }
6765
+ .db-refresh-result {
6766
+ flex: 0 0 auto;
6767
+ color: var(--fg-subtle);
6768
+ font-size: var(--db-font-xs);
6769
+ white-space: nowrap;
6770
+ }
6771
+ .db-refresh-result.changed {
6772
+ color: var(--accent);
6773
+ font-weight: 600;
6774
+ }
6775
+ .db-grid-refresh-result {
6776
+ align-self: center;
6777
+ line-height: 1;
6778
+ }
6190
6779
 
6191
6780
  /* explorer (redis/es/s3) の第1階層セレクタ (Databases / Indices / Bucket+View)
6192
6781
  を抱える sidebar 内 host。kind が SQL のときは中身が全て hidden になるため
@@ -6240,11 +6829,12 @@ body[data-sidebar-font-size="xlarge"] .db-container {
6240
6829
  }
6241
6830
 
6242
6831
  .db-table-filter-wrap {
6832
+ position: relative;
6243
6833
  padding: 4px 8px;
6244
6834
  }
6245
6835
  .db-table-filter {
6246
6836
  width: 100%;
6247
- padding: 4px 8px 4px 24px;
6837
+ padding: 4px 34px 4px 24px;
6248
6838
  border: 1px solid var(--border);
6249
6839
  border-radius: 6px;
6250
6840
  background: var(--bg);
@@ -6260,6 +6850,22 @@ body[data-sidebar-font-size="xlarge"] .db-container {
6260
6850
  outline-offset: -1px;
6261
6851
  border-color: var(--accent);
6262
6852
  }
6853
+ .db-table-filter-clear {
6854
+ right: 12px;
6855
+ top: 50%;
6856
+ height: 20px;
6857
+ min-width: 24px;
6858
+ padding: 0 5px;
6859
+ border-radius: 5px;
6860
+ display: inline-flex;
6861
+ align-items: center;
6862
+ justify-content: center;
6863
+ }
6864
+ .db-table-filter-clear svg {
6865
+ width: 12px;
6866
+ height: 12px;
6867
+ display: block;
6868
+ }
6263
6869
  .db-table-list {
6264
6870
  flex: 1;
6265
6871
  overflow-y: auto;
@@ -6272,6 +6878,9 @@ body[data-sidebar-font-size="xlarge"] .db-container {
6272
6878
  text-align: center;
6273
6879
  font-size: var(--db-font-md);
6274
6880
  }
6881
+ .db-table-list-empty-actions {
6882
+ margin-top: 10px;
6883
+ }
6275
6884
 
6276
6885
  .db-table-group-header {
6277
6886
  padding: 6px 12px 2px;
@@ -6467,6 +7076,18 @@ body[data-sidebar-font-size="xlarge"] .db-container {
6467
7076
  overflow: hidden;
6468
7077
  background: var(--bg);
6469
7078
  }
7079
+ .db-no-datastores {
7080
+ flex: 1;
7081
+ min-height: 0;
7082
+ }
7083
+ .db-no-datastores[hidden] {
7084
+ display: none !important;
7085
+ }
7086
+ .db-no-datastores-actions {
7087
+ display: flex;
7088
+ justify-content: center;
7089
+ margin-top: 4px;
7090
+ }
6470
7091
 
6471
7092
  /* ---------- Tab bar ---------- */
6472
7093
  .db-tab-bar {
@@ -6998,6 +7619,10 @@ html[data-theme="dark"] .db-query-highlight span[style] {
6998
7619
  }
6999
7620
 
7000
7621
  .db-schema-header {
7622
+ display: flex;
7623
+ align-items: center;
7624
+ justify-content: space-between;
7625
+ gap: 8px;
7001
7626
  font-size: 14px;
7002
7627
  font-weight: 600;
7003
7628
  color: var(--fg);
@@ -7008,6 +7633,15 @@ html[data-theme="dark"] .db-query-highlight span[style] {
7008
7633
  .db-schema-header:first-child {
7009
7634
  margin-top: 0;
7010
7635
  }
7636
+ .db-schema-header-title {
7637
+ min-width: 0;
7638
+ overflow: hidden;
7639
+ text-overflow: ellipsis;
7640
+ white-space: nowrap;
7641
+ }
7642
+ .db-schema-refresh {
7643
+ flex: 0 0 auto;
7644
+ }
7011
7645
 
7012
7646
  .db-schema-table {
7013
7647
  border-collapse: collapse;
@@ -7078,8 +7712,18 @@ html[data-theme="dark"] .db-schema-table tr.pk-row {
7078
7712
  }
7079
7713
 
7080
7714
  .db-grid-filter-icon {
7081
- font-size: var(--db-font-md);
7082
7715
  flex-shrink: 0;
7716
+ display: inline-flex;
7717
+ align-items: center;
7718
+ justify-content: center;
7719
+ width: 16px;
7720
+ height: 16px;
7721
+ color: var(--fg-muted);
7722
+ }
7723
+ .db-grid-filter-icon svg {
7724
+ display: block;
7725
+ width: 16px;
7726
+ height: 16px;
7083
7727
  }
7084
7728
 
7085
7729
  .db-grid-filter-input {
@@ -7099,18 +7743,84 @@ html[data-theme="dark"] .db-schema-table tr.pk-row {
7099
7743
  border-color: var(--accent);
7100
7744
  }
7101
7745
 
7746
+ .db-grid-filter-actions {
7747
+ display: flex;
7748
+ align-items: center;
7749
+ gap: 6px;
7750
+ flex: 0 0 auto;
7751
+ margin-left: auto;
7752
+ }
7753
+
7102
7754
  .db-grid-filter-clear {
7103
- border: none;
7104
- background: none;
7755
+ flex: 0 0 auto;
7756
+ height: 24px;
7757
+ border-color: color-mix(in srgb, var(--danger) 34%, var(--border));
7758
+ background: color-mix(in srgb, var(--danger) 8%, var(--bg));
7105
7759
  color: var(--fg-muted);
7106
- font-size: 16px;
7107
- cursor: pointer;
7108
- padding: 0 4px;
7109
- line-height: 1;
7760
+ font-size: var(--db-font-sm);
7761
+ padding: 0 8px;
7110
7762
  }
7111
7763
  .db-grid-filter-clear:hover {
7764
+ background: color-mix(in srgb, var(--danger) 14%, var(--bg));
7112
7765
  color: var(--danger);
7113
7766
  }
7767
+ .db-grid-refresh {
7768
+ width: auto;
7769
+ min-width: 30px;
7770
+ height: 24px;
7771
+ padding: 0 8px;
7772
+ border: 1px solid var(--border);
7773
+ border-radius: 4px;
7774
+ background: var(--bg);
7775
+ color: var(--fg-muted);
7776
+ cursor: pointer;
7777
+ display: inline-flex;
7778
+ align-items: center;
7779
+ justify-content: center;
7780
+ gap: 4px;
7781
+ font-size: var(--db-font-base);
7782
+ font-weight: 500;
7783
+ }
7784
+ .db-grid-refresh:hover {
7785
+ color: var(--fg);
7786
+ border-color: var(--accent);
7787
+ background: var(--bg);
7788
+ }
7789
+ .db-grid-refresh.has-filters {
7790
+ border-color: color-mix(in srgb, var(--accent) 56%, var(--border));
7791
+ background: color-mix(in srgb, var(--accent) 10%, var(--bg));
7792
+ color: var(--fg);
7793
+ }
7794
+ .db-grid-refresh.has-filters:hover {
7795
+ background: color-mix(in srgb, var(--accent) 16%, var(--bg));
7796
+ }
7797
+ .db-grid-refresh svg {
7798
+ width: 16px;
7799
+ height: 16px;
7800
+ display: block;
7801
+ flex: 0 0 auto;
7802
+ }
7803
+ .db-grid-refresh-label {
7804
+ line-height: 1;
7805
+ white-space: nowrap;
7806
+ }
7807
+ .db-grid-refresh[disabled] {
7808
+ cursor: default;
7809
+ opacity: 0.7;
7810
+ }
7811
+ .db-grid-refresh.spinning svg {
7812
+ animation: gdp-spin 0.7s linear infinite;
7813
+ }
7814
+
7815
+ @media (max-width: 720px) {
7816
+ .db-grid-refresh {
7817
+ width: 30px;
7818
+ padding: 0;
7819
+ }
7820
+ .db-grid-refresh-label {
7821
+ display: none;
7822
+ }
7823
+ }
7114
7824
 
7115
7825
  /* ---------- Data Grid: Column Filter Row ---------- */
7116
7826
  .db-grid-filter-row-wrap {
@@ -7298,10 +8008,19 @@ html[data-theme="dark"] .db-schema-table tr.pk-row {
7298
8008
 
7299
8009
  /* ---------- Foreign-key related data ---------- */
7300
8010
  .db-grid-header-fk-icon {
8011
+ display: inline-flex;
8012
+ align-items: center;
8013
+ justify-content: center;
7301
8014
  margin-left: 4px;
7302
- font-size: 10px;
8015
+ width: 12px;
8016
+ height: 12px;
7303
8017
  opacity: 0.7;
7304
8018
  }
8019
+ .db-grid-header-fk-icon svg {
8020
+ display: block;
8021
+ width: 12px;
8022
+ height: 12px;
8023
+ }
7305
8024
 
7306
8025
  .db-grid-cell-fk {
7307
8026
  color: var(--accent, var(--link, #2563eb));
@@ -7354,7 +8073,17 @@ html[data-theme="dark"] .db-schema-table tr.pk-row {
7354
8073
 
7355
8074
  .db-related-title {
7356
8075
  flex-shrink: 0;
7357
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
8076
+ display: inline-flex;
8077
+ align-items: center;
8078
+ justify-content: center;
8079
+ width: 16px;
8080
+ height: 16px;
8081
+ color: var(--accent);
8082
+ }
8083
+ .db-related-title svg {
8084
+ display: block;
8085
+ width: 16px;
8086
+ height: 16px;
7358
8087
  }
7359
8088
 
7360
8089
  .db-related-close {
@@ -7464,15 +8193,23 @@ html[data-theme="dark"] .db-schema-table tr.pk-row {
7464
8193
  }
7465
8194
 
7466
8195
  .db-grid-export-toggle {
8196
+ display: inline-flex;
8197
+ align-items: center;
8198
+ justify-content: center;
8199
+ width: 30px;
8200
+ height: 24px;
7467
8201
  border: 1px solid var(--border);
7468
8202
  border-radius: 4px;
7469
8203
  background: var(--bg);
7470
8204
  color: var(--fg-muted);
7471
- font-size: var(--db-font-md);
7472
- line-height: 1;
7473
- padding: 3px 7px;
8205
+ padding: 0;
7474
8206
  cursor: pointer;
7475
8207
  }
8208
+ .db-grid-export-toggle svg {
8209
+ display: block;
8210
+ width: 16px;
8211
+ height: 16px;
8212
+ }
7476
8213
  .db-grid-export-toggle:hover {
7477
8214
  color: var(--fg);
7478
8215
  border-color: var(--accent);
@@ -9210,6 +9947,15 @@ body.db-resizing {
9210
9947
  font-size: var(--db-font-sm);
9211
9948
  line-height: 1.5;
9212
9949
  }
9950
+ .db-pane-empty-actions {
9951
+ display: flex;
9952
+ flex-wrap: wrap;
9953
+ justify-content: center;
9954
+ gap: 8px;
9955
+ }
9956
+ .db-pane-empty-actions[hidden] {
9957
+ display: none;
9958
+ }
9213
9959
 
9214
9960
  /* ---------- Elasticsearch explorer ---------- */
9215
9961
  .es-explorer {