@youtyan/code-viewer 0.8.7 → 0.8.8

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
@@ -22,6 +22,8 @@
22
22
  --accent-emph: #0550ae;
23
23
  --accent-subtle: #ddf4ff;
24
24
  --accent-muted: #54aeff66;
25
+ /* sidebar tree */
26
+ --tree-guide: color-mix(in srgb, var(--fg-subtle) 22%, transparent);
25
27
  --scope-accent: #bf8700;
26
28
  /* success / danger / attention / done */
27
29
  --success: #1a7f37;
@@ -103,7 +105,21 @@
103
105
  html, body {
104
106
  margin: 0; padding: 0;
105
107
  background: var(--bg); color: var(--fg);
108
+ --ui-font-xs: 10px;
109
+ --ui-font-sm: 11px;
110
+ --ui-font-base: 12px;
111
+ --ui-font-md: 13px;
112
+ --ui-font-lg: 14px;
113
+ --ui-font-title: 15px;
114
+ --ui-control-sm: 28px;
115
+ --ui-control-md: 32px;
116
+ --ui-dense-row-h: 36px;
117
+ --ui-file-header-h: 46px;
118
+ --ui-file-header-wrapped-h: 82px;
119
+ --ui-history-dock-h: 28px;
120
+ --chrome-h: calc(var(--global-header-h) + var(--topbar-h));
106
121
  --code-font-size: 12px;
122
+ --code-line-height: 20px;
107
123
  --markdown-font-size: calc(var(--code-font-size) + 2px);
108
124
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans",
109
125
  Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
@@ -115,9 +131,67 @@ html, body {
115
131
  -moz-osx-font-smoothing: auto;
116
132
  }
117
133
 
118
- body[data-code-font-size="compact"] { --code-font-size: 11.5px; }
119
- body[data-code-font-size="large"] { --code-font-size: 13.5px; }
120
- body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
134
+ body[data-sidebar-font-size="compact"] {
135
+ --global-header-h: 44px;
136
+ --topbar-h: 52px;
137
+ --ui-font-xs: 9px;
138
+ --ui-font-sm: 10px;
139
+ --ui-font-base: 11px;
140
+ --ui-font-md: 12px;
141
+ --ui-font-lg: 13px;
142
+ --ui-font-title: 14px;
143
+ --ui-control-sm: 26px;
144
+ --ui-control-md: 30px;
145
+ --ui-dense-row-h: 34px;
146
+ --ui-file-header-h: 42px;
147
+ --ui-file-header-wrapped-h: 74px;
148
+ --ui-history-dock-h: 26px;
149
+ }
150
+ body[data-sidebar-font-size="large"] {
151
+ --global-header-h: 54px;
152
+ --topbar-h: 62px;
153
+ --ui-font-xs: 11px;
154
+ --ui-font-sm: 12px;
155
+ --ui-font-base: 14px;
156
+ --ui-font-md: 15px;
157
+ --ui-font-lg: 16px;
158
+ --ui-font-title: 17px;
159
+ --ui-control-sm: 32px;
160
+ --ui-control-md: 36px;
161
+ --ui-dense-row-h: 42px;
162
+ --ui-file-header-h: 52px;
163
+ --ui-file-header-wrapped-h: 94px;
164
+ --ui-history-dock-h: 34px;
165
+ }
166
+ body[data-sidebar-font-size="xlarge"] {
167
+ --global-header-h: 60px;
168
+ --topbar-h: 68px;
169
+ --ui-font-xs: 12px;
170
+ --ui-font-sm: 13px;
171
+ --ui-font-base: 15px;
172
+ --ui-font-md: 16px;
173
+ --ui-font-lg: 17px;
174
+ --ui-font-title: 18px;
175
+ --ui-control-sm: 36px;
176
+ --ui-control-md: 40px;
177
+ --ui-dense-row-h: 48px;
178
+ --ui-file-header-h: 58px;
179
+ --ui-file-header-wrapped-h: 104px;
180
+ --ui-history-dock-h: 38px;
181
+ }
182
+
183
+ body[data-code-font-size="compact"] {
184
+ --code-font-size: 11.5px;
185
+ --code-line-height: 19px;
186
+ }
187
+ body[data-code-font-size="large"] {
188
+ --code-font-size: 13.5px;
189
+ --code-line-height: 22px;
190
+ }
191
+ body[data-code-font-size="xlarge"] {
192
+ --code-font-size: 15px;
193
+ --code-line-height: 24px;
194
+ }
121
195
 
122
196
  /* Window scrolls; global header + topbar + sidebar are fixed */
123
197
  #app { display: block; }
@@ -286,7 +360,7 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
286
360
  .brand {
287
361
  display: flex; align-items: center; gap: 8px;
288
362
  font-weight: 600;
289
- font-size: 15px;
363
+ font-size: var(--ui-font-title);
290
364
  color: var(--fg);
291
365
  min-width: 0;
292
366
  max-width: min(40vw, 560px);
@@ -295,8 +369,8 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
295
369
  }
296
370
  .brand:hover { color: var(--fg); text-decoration: none; }
297
371
  .brand-icon {
298
- width: 20px;
299
- height: 20px;
372
+ width: calc(var(--ui-font-title) + 5px);
373
+ height: calc(var(--ui-font-title) + 5px);
300
374
  display: block;
301
375
  border-radius: 5px;
302
376
  }
@@ -307,95 +381,102 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
307
381
  white-space: nowrap;
308
382
  }
309
383
  .project-branch {
384
+ /* Quiet branch indicator next to the brand: a small git-branch icon and
385
+ the mono branch name, no pill. The old bordered chip with a green dot
386
+ read like a notification badge. */
310
387
  display: inline-flex;
311
388
  align-items: center;
312
- height: 24px;
389
+ gap: 4px;
313
390
  flex: 0 1 auto;
391
+ min-width: 0;
314
392
  max-width: min(20vw, 260px);
315
393
  overflow: hidden;
316
- text-overflow: ellipsis;
317
- white-space: nowrap;
318
- padding: 0 8px;
319
- border: 1px solid var(--border);
320
- border-radius: 999px;
321
- background: color-mix(in srgb, var(--bg) 72%, var(--bg-soft));
322
394
  color: var(--fg-muted);
323
- font-family: "Monaspace Neon", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
324
- font-size: 11px;
325
- font-weight: 600;
395
+ font-size: var(--ui-font-sm);
326
396
  line-height: 1;
327
397
  }
328
- .project-branch::before {
329
- content: "";
330
- flex: 0 0 auto;
331
- width: 6px;
332
- height: 6px;
333
- margin-right: 6px;
334
- border-radius: 999px;
335
- background: var(--success);
398
+ .project-branch .goi-icon {
399
+ display: inline-flex;
400
+ flex: none;
401
+ color: var(--fg-subtle);
402
+ }
403
+ .project-branch .goi-icon svg {
404
+ width: 12px;
405
+ height: 12px;
406
+ display: block;
407
+ }
408
+ .project-branch-name {
409
+ min-width: 0;
410
+ overflow: hidden;
411
+ text-overflow: ellipsis;
412
+ white-space: nowrap;
413
+ font-family: "Monaspace Neon", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
414
+ font-weight: 500;
336
415
  }
337
416
 
338
417
  .app-menu {
339
418
  display: flex;
340
419
  align-items: center;
341
- gap: 8px;
420
+ gap: 2px;
342
421
  height: 100%;
343
- margin-left: 0;
344
- padding-left: 18px;
345
- border-left: 1px solid var(--border);
346
422
  flex-shrink: 0;
347
423
  }
348
- .global-help-link {
424
+ .global-icon-link {
425
+ /* Icon-only header links (help page, repository web page): same 28x28
426
+ shell as .global-icon-action so the action cluster reads as one
427
+ consistent row of controls. */
349
428
  display: inline-flex;
350
429
  align-items: center;
351
- height: 28px;
352
- padding: 0 2px;
353
- color: var(--fg-muted);
354
- font-size: 14px;
355
- font-weight: 600;
356
- line-height: 1;
430
+ justify-content: center;
431
+ width: var(--ui-control-sm);
432
+ height: var(--ui-control-sm);
433
+ border: 1px solid var(--border);
434
+ border-radius: 6px;
435
+ background: var(--bg);
436
+ color: var(--fg);
357
437
  text-decoration: none;
358
- white-space: nowrap;
438
+ transition: background 0.12s, border-color 0.12s;
359
439
  }
360
- .global-help-link:hover {
361
- color: var(--accent);
440
+ .global-icon-link:hover {
441
+ background: var(--bg-mute);
442
+ border-color: var(--border-strong);
362
443
  text-decoration: none;
363
444
  }
364
- .global-help-link.active {
365
- color: var(--fg);
445
+ .global-icon-link:focus-visible {
446
+ outline: 2px solid var(--accent);
447
+ outline-offset: 1px;
448
+ }
449
+ .global-icon-link.active {
450
+ color: var(--accent);
451
+ border-color: var(--accent);
452
+ }
453
+ .global-icon-link svg {
454
+ display: block;
366
455
  }
367
456
  .app-menu-item {
368
- position: relative;
457
+ /* Nav items sit one notch below the brand: smaller, muted, and the
458
+ active screen is a soft accent pill instead of an underline tab. */
369
459
  display: inline-flex;
370
460
  align-items: center;
371
- height: 32px;
461
+ height: var(--ui-control-sm);
372
462
  padding: 0 10px;
373
463
  border-radius: 6px;
374
464
  color: var(--fg-muted);
375
- font-size: 15px;
376
- font-weight: 600;
465
+ font-size: var(--ui-font-md);
466
+ font-weight: 500;
377
467
  line-height: 1;
378
468
  text-decoration: none;
379
469
  white-space: nowrap;
380
470
  }
381
471
  .app-menu-item:hover {
382
- color: var(--accent);
472
+ color: var(--fg);
383
473
  background: var(--bg-mute);
384
474
  text-decoration: none;
385
475
  }
386
476
  .app-menu-item.active {
387
- background: var(--bg);
388
- color: var(--fg);
389
- }
390
- .app-menu-item.active::after {
391
- content: "";
392
- position: absolute;
393
- left: 0;
394
- right: 0;
395
- bottom: -9px;
396
- height: 2px;
397
- border-radius: 2px 2px 0 0;
398
- background: var(--blob-tab-active);
477
+ background: var(--accent-subtle);
478
+ color: var(--accent);
479
+ font-weight: 600;
399
480
  }
400
481
 
401
482
  .global-actions {
@@ -403,29 +484,30 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
403
484
  margin-left: auto;
404
485
  display: inline-flex;
405
486
  align-items: center;
406
- gap: 8px;
487
+ gap: 6px;
407
488
  flex: 0 0 auto;
408
489
  }
409
- .product-label {
410
- color: var(--fg-muted);
411
- font-size: 12px;
412
- font-weight: 600;
413
- line-height: 1;
414
- white-space: nowrap;
490
+ .global-actions-sep {
491
+ /* Quiet divider between the view-tool / session / help groups. */
492
+ flex: none;
493
+ width: 1px;
494
+ height: 18px;
495
+ margin: 0 2px;
496
+ background: var(--border);
415
497
  }
416
498
  .global-actions #theme,
417
499
  .global-icon-action {
418
500
  display: inline-flex;
419
501
  align-items: center;
420
502
  justify-content: center;
421
- width: 28px;
422
- height: 28px;
503
+ width: var(--ui-control-sm);
504
+ height: var(--ui-control-sm);
423
505
  border: 1px solid var(--border);
424
506
  background: var(--bg);
425
507
  color: var(--fg);
426
508
  border-radius: 6px;
427
509
  cursor: pointer;
428
- font-size: 13px;
510
+ font-size: var(--ui-font-md);
429
511
  transition: background 0.12s, border-color 0.12s;
430
512
  }
431
513
  .global-actions #theme svg,
@@ -486,23 +568,6 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
486
568
  color: var(--attn);
487
569
  border-color: var(--attn);
488
570
  }
489
- .ai-context-action {
490
- width: auto;
491
- gap: 6px;
492
- padding: 0 10px;
493
- }
494
- .ai-context-label {
495
- font-size: 11px;
496
- font-weight: 600;
497
- white-space: nowrap;
498
- }
499
- #auto-update {
500
- width: auto;
501
- gap: 6px;
502
- padding: 0 8px;
503
- font-size: 11px;
504
- font-weight: 600;
505
- }
506
571
  #auto-update.active {
507
572
  background: var(--success-subtle);
508
573
  border-color: var(--success);
@@ -524,7 +589,7 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
524
589
  #meta {
525
590
  display: flex; align-items: center; gap: 10px;
526
591
  color: var(--fg-muted);
527
- font-size: 12px;
592
+ font-size: var(--ui-font-base);
528
593
  }
529
594
  #meta .ref {
530
595
  display: inline-flex; align-items: center; gap: 4px;
@@ -534,52 +599,59 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
534
599
  padding: 3px 9px;
535
600
  color: var(--fg);
536
601
  font-family: "Monaspace Neon", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
537
- font-size: 11px;
602
+ font-size: var(--ui-font-sm);
538
603
  line-height: 1;
539
604
  white-space: nowrap;
540
605
  }
541
606
  #meta .chip {
607
+ /* Meta chips are READ-ONLY stats: plain text, no pill. The single
608
+ actionable control (.chip-next-unviewed below) keeps a real button
609
+ outline so clickable vs static is obvious at a glance. */
542
610
  display: inline-flex;
543
611
  align-items: center;
544
612
  gap: 4px;
545
613
  color: var(--fg-muted);
546
- background: var(--bg-soft);
547
- border: 1px solid var(--border);
548
- border-radius: 999px;
549
- padding: 3px 9px;
550
- font-size: 11px;
614
+ font-size: var(--ui-font-sm);
551
615
  line-height: 1;
552
616
  font-variant-numeric: tabular-nums;
553
617
  white-space: nowrap;
554
618
  }
555
619
  #meta .chip-files { color: var(--fg); font-weight: 600; }
556
- #meta .chip-add { color: var(--success); font-weight: 600; border-color: color-mix(in srgb, var(--success) 35%, var(--border)); }
557
- #meta .chip-del { color: var(--danger); font-weight: 600; border-color: color-mix(in srgb, var(--danger) 35%, var(--border)); }
558
- #meta .chip-added { color: var(--success); border-color: color-mix(in srgb, var(--success) 35%, var(--border)); }
559
- #meta .chip-deleted { color: var(--danger); border-color: color-mix(in srgb, var(--danger) 35%, var(--border)); }
560
- #meta .chip-renamed { color: var(--done); border-color: color-mix(in srgb, var(--done) 35%, var(--border)); }
561
- #meta .chip-heavy { color: var(--attn); border-color: color-mix(in srgb, var(--attn) 35%, var(--border)); }
562
- #meta .chip-error { color: var(--danger); border-color: color-mix(in srgb, var(--danger) 35%, var(--border)); }
620
+ #meta .chip-add { color: var(--success); font-weight: 600; }
621
+ #meta .chip-del { color: var(--danger); font-weight: 600; }
622
+ #meta .chip-added { color: var(--success); }
623
+ #meta .chip-deleted { color: var(--danger); }
624
+ #meta .chip-renamed { color: var(--done); }
625
+ #meta .chip-heavy { color: var(--attn); }
626
+ #meta .chip-error { color: var(--danger); }
563
627
  #meta .chip-binary,
564
628
  #meta .chip-media { color: var(--fg-muted); }
565
629
  #meta .chip-viewed-empty { color: var(--fg-muted); }
566
- #meta .chip-viewed-partial { color: var(--attn); border-color: color-mix(in srgb, var(--attn) 35%, var(--border)); }
567
- #meta .chip-viewed-done { color: var(--done); border-color: color-mix(in srgb, var(--done) 35%, var(--border)); }
630
+ #meta .chip-viewed-partial { color: var(--attn); }
631
+ #meta .chip-viewed-done { color: var(--done); }
568
632
  #meta .chip-next-unviewed {
569
633
  font: inherit;
634
+ font-size: var(--ui-font-sm);
635
+ font-weight: 600;
636
+ line-height: 1;
570
637
  cursor: pointer;
571
- color: var(--accent-emph);
572
- border-color: color-mix(in srgb, var(--accent-emph) 35%, var(--border));
638
+ color: var(--accent);
639
+ background: var(--bg);
640
+ border: 1px solid color-mix(in srgb, var(--accent) 45%, var(--border));
641
+ border-radius: 999px;
642
+ padding: 3px 10px;
643
+ white-space: nowrap;
573
644
  }
574
645
  #meta .chip-next-unviewed:hover:not(:disabled) {
575
- background: var(--bg-soft);
576
- border-color: var(--border-strong);
646
+ background: var(--accent-subtle);
647
+ border-color: var(--accent);
577
648
  }
578
649
  #meta .chip-next-unviewed:disabled {
579
650
  cursor: default;
580
- opacity: 0.45;
651
+ opacity: 0.5;
581
652
  color: var(--fg-muted);
582
653
  border-color: var(--border);
654
+ background: transparent;
583
655
  }
584
656
  .ref-pickers {
585
657
  display: flex;
@@ -594,13 +666,15 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
594
666
  flex: 0 0 auto;
595
667
  gap: 8px;
596
668
  width: 220px;
597
- height: 32px;
598
- padding: 0 12px;
599
- border: 1px solid #d1d9e0;
669
+ /* Match the 28px controls around it; theme tokens instead of hardcoded
670
+ light-only colors (the dark override below became redundant). */
671
+ height: var(--ui-control-sm);
672
+ padding: 0 10px;
673
+ border: 1px solid var(--border);
600
674
  border-radius: 6px;
601
- background: #f6f8fa;
675
+ background: var(--bg-soft);
602
676
  color: var(--fg);
603
- font: 500 14px/21px -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
677
+ font: 500 var(--ui-font-md)/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
604
678
  cursor: pointer;
605
679
  transition: border-color 0.12s, background 0.12s, box-shadow 0.12s;
606
680
  }
@@ -608,10 +682,6 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
608
682
  #repo-target-wrap {
609
683
  display: none !important;
610
684
  }
611
- [data-theme="dark"] .ref-selector {
612
- border-color: var(--border);
613
- background: var(--bg-soft);
614
- }
615
685
  .ref-selector:hover {
616
686
  border-color: var(--border-strong);
617
687
  background: var(--bg-soft);
@@ -634,14 +704,14 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
634
704
  flex: 1 1 auto;
635
705
  min-width: 0;
636
706
  width: auto;
637
- height: 30px;
707
+ height: calc(var(--ui-control-md) - 2px);
638
708
  padding: 0;
639
709
  background: transparent;
640
710
  border: 0;
641
711
  color: var(--fg);
642
712
  border-radius: 0;
643
713
  font-family: inherit;
644
- font-size: 14px;
714
+ font-size: var(--ui-font-lg);
645
715
  font-weight: 500;
646
716
  outline: none;
647
717
  cursor: pointer;
@@ -662,13 +732,19 @@ body.gdp-diff-page #repo-target-wrap {
662
732
  display: none !important;
663
733
  }
664
734
  .ref-dots {
735
+ display: inline-flex;
736
+ align-items: center;
665
737
  color: var(--fg-subtle);
666
- font-size: 14px;
667
738
  padding: 0 2px;
668
739
  user-select: none;
669
740
  }
741
+ .ref-dots svg {
742
+ display: block;
743
+ width: 14px;
744
+ height: 14px;
745
+ }
670
746
  .ref-pickers > button {
671
- width: 24px; height: 26px;
747
+ width: var(--ui-control-sm); height: var(--ui-control-sm);
672
748
  display: inline-flex;
673
749
  align-items: center;
674
750
  justify-content: center;
@@ -678,7 +754,7 @@ body.gdp-diff-page #repo-target-wrap {
678
754
  color: var(--fg-muted);
679
755
  border-radius: 6px;
680
756
  cursor: pointer;
681
- font-size: 13px;
757
+ font-size: var(--ui-font-md);
682
758
  transition: background 0.12s, color 0.12s;
683
759
  }
684
760
  .ref-pickers > button svg {
@@ -693,7 +769,7 @@ body.gdp-diff-page #repo-target-wrap {
693
769
  }
694
770
  #ref-reset:hover { background: var(--bg-mute); color: var(--danger); border-color: var(--danger); }
695
771
  #reload-prom {
696
- width: 24px; height: 26px;
772
+ width: var(--ui-control-sm); height: var(--ui-control-sm);
697
773
  margin-left: 6px;
698
774
  }
699
775
  #reload-prom.spinning {
@@ -706,15 +782,10 @@ body.gdp-diff-page #repo-target-wrap {
706
782
  #hide-tests {
707
783
  width: auto !important;
708
784
  padding: 0 8px;
709
- font-size: 11px;
785
+ font-size: var(--ui-font-sm);
710
786
  font-weight: 600;
711
787
  letter-spacing: 0.04em;
712
788
  }
713
- #hide-tests.active {
714
- background: var(--attn);
715
- color: #fff;
716
- border-color: var(--attn);
717
- }
718
789
  .hidden-by-tests,
719
790
  .hidden-by-filter { display: none !important; }
720
791
 
@@ -739,53 +810,64 @@ body.gdp-diff-page #repo-target-wrap {
739
810
  .rp-quick {
740
811
  display: flex;
741
812
  gap: 6px;
742
- padding: 8px 10px 0;
743
- background: var(--bg-soft);
813
+ padding: 10px 10px 0;
814
+ background: var(--bg);
744
815
  }
745
816
  .rp-chip {
746
- flex: 1;
817
+ /* Compact quick-fill pills; .current uses the same tinted-active idiom
818
+ as the topbar toggles and header nav. */
819
+ flex: none;
747
820
  background: var(--bg);
748
821
  border: 1px solid var(--border);
749
- color: var(--fg);
750
- border-radius: 6px;
751
- padding: 5px 10px;
822
+ color: var(--fg-muted);
823
+ border-radius: 999px;
824
+ padding: 3px 10px;
752
825
  font: inherit;
753
- font-size: 12px;
826
+ font-size: 11px;
754
827
  font-family: "Monaspace Neon", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
755
- font-weight: 600;
828
+ font-weight: 500;
756
829
  cursor: pointer;
757
830
  transition: background 0.10s, color 0.10s, border-color 0.10s;
758
831
  }
759
832
  .rp-chip:hover {
833
+ background: var(--bg-soft);
834
+ color: var(--fg);
835
+ border-color: var(--border-strong);
836
+ }
837
+ .rp-chip.current {
838
+ /* The selected value is the ONE strong element in the popover header:
839
+ solid accent with white text, everything else stays quiet. */
760
840
  background: var(--accent);
761
841
  color: #fff;
762
842
  border-color: var(--accent);
843
+ font-weight: 600;
763
844
  }
764
845
 
765
846
  /* Tab bar */
766
847
  .rp-tabs {
767
848
  display: flex;
768
- background: var(--bg-soft);
849
+ gap: 4px;
850
+ background: var(--bg);
769
851
  border-bottom: 1px solid var(--border);
770
- padding: 0 6px;
852
+ padding: 8px 10px;
771
853
  }
772
854
  .rp-tab {
773
855
  background: transparent;
774
856
  border: 0;
857
+ border-radius: 6px;
775
858
  color: var(--fg-muted);
776
- padding: 9px 14px 8px;
859
+ padding: 4px 10px;
777
860
  font: inherit;
778
861
  font-size: 12px;
779
862
  font-weight: 500;
780
863
  cursor: pointer;
781
- border-bottom: 2px solid transparent;
782
- margin-bottom: -1px;
783
- transition: color 0.12s, border-color 0.12s;
864
+ transition: background 0.12s, color 0.12s;
784
865
  }
785
- .rp-tab:hover { color: var(--fg); }
866
+ .rp-tab:hover { color: var(--fg); background: var(--bg-mute); }
786
867
  .rp-tab.active {
868
+ background: var(--accent-subtle);
787
869
  color: var(--accent);
788
- border-bottom-color: var(--accent);
870
+ font-weight: 600;
789
871
  }
790
872
 
791
873
  .rp-search-wrap {
@@ -810,14 +892,18 @@ body.gdp-diff-page #repo-target-wrap {
810
892
  /* Commit item — two-line layout, plenty of room for time/author */
811
893
  .rp-item-commit {
812
894
  display: block;
813
- padding: 8px 14px;
895
+ padding: 6px 12px;
814
896
  cursor: pointer;
815
897
  border-left: 2px solid transparent;
816
898
  transition: background 0.10s, border-color 0.10s;
817
899
  }
818
900
  .rp-item-commit:hover {
819
- background: var(--bg-mute);
820
- border-left-color: var(--accent);
901
+ background: var(--bg-soft);
902
+ }
903
+ /* Hairline separators give the flat list structure. */
904
+ .rp-item-commit + .rp-item-commit,
905
+ .rp-item-ref + .rp-item-ref {
906
+ border-top: 1px solid var(--border);
821
907
  }
822
908
  .rp-item-commit .row1 {
823
909
  display: flex;
@@ -826,6 +912,8 @@ body.gdp-diff-page #repo-target-wrap {
826
912
  margin-bottom: 2px;
827
913
  }
828
914
  .rp-item-commit .sha {
915
+ /* The SHA is the row's identifier: accent mono so the eye can scan the
916
+ column; subject carries weight, meta stays muted. */
829
917
  font-family: "Monaspace Neon", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
830
918
  font-size: 12px;
831
919
  color: var(--accent);
@@ -839,7 +927,8 @@ body.gdp-diff-page #repo-target-wrap {
839
927
  text-overflow: ellipsis;
840
928
  white-space: nowrap;
841
929
  color: var(--fg);
842
- font-size: 12.5px;
930
+ font-size: 13px;
931
+ font-weight: 500;
843
932
  }
844
933
  .rp-item-commit .row2 {
845
934
  display: flex;
@@ -857,15 +946,14 @@ body.gdp-diff-page #repo-target-wrap {
857
946
  /* Branch / tag / special items */
858
947
  .rp-item-ref {
859
948
  display: block;
860
- padding: 7px 14px;
949
+ padding: 6px 12px;
861
950
  cursor: pointer;
862
951
  border-left: 2px solid transparent;
863
952
  transition: background 0.10s, border-color 0.10s;
864
953
  font-size: 12.5px;
865
954
  }
866
955
  .rp-item-ref:hover {
867
- background: var(--bg-mute);
868
- border-left-color: var(--accent);
956
+ background: var(--bg-soft);
869
957
  }
870
958
  .rp-item-ref .row1 {
871
959
  display: grid;
@@ -875,6 +963,7 @@ body.gdp-diff-page #repo-target-wrap {
875
963
  }
876
964
  .rp-item-ref .name {
877
965
  font-family: "Monaspace Neon", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
966
+ font-weight: 500;
878
967
  min-width: 0;
879
968
  overflow: hidden;
880
969
  text-overflow: ellipsis;
@@ -891,12 +980,10 @@ body.gdp-diff-page #repo-target-wrap {
891
980
  font-size: 10px;
892
981
  line-height: 1;
893
982
  font-weight: 600;
894
- text-transform: uppercase;
895
- letter-spacing: 0.06em;
896
983
  color: var(--fg-subtle);
897
984
  background: var(--bg-mute);
898
- padding: 2px 6px;
899
- border-radius: 4px;
985
+ padding: 2px 8px;
986
+ border-radius: 999px;
900
987
  white-space: nowrap;
901
988
  justify-self: end;
902
989
  }
@@ -916,23 +1003,18 @@ body.gdp-diff-page #repo-target-wrap {
916
1003
  /* Currently-selected ref highlight (matches focused input's value) */
917
1004
  #ref-popover .rp-item-commit.current,
918
1005
  #ref-popover .rp-item-ref.current {
919
- background: color-mix(in srgb, var(--accent) 16%, transparent);
1006
+ background: var(--accent-subtle);
920
1007
  border-left-color: var(--accent);
921
1008
  }
922
1009
  #ref-popover .rp-item-commit.current .sha,
923
1010
  #ref-popover .rp-item-commit.current .subject,
924
1011
  #ref-popover .rp-item-ref.current .name {
925
1012
  color: var(--accent);
926
- font-weight: 700;
1013
+ font-weight: 600;
927
1014
  }
928
1015
  #ref-popover .rp-item-ref.current .badge {
929
1016
  background: var(--accent-subtle);
930
- color: var(--accent-emph);
931
- }
932
- .rp-chip.current {
933
- background: var(--accent);
934
- color: #fff;
935
- border-color: var(--accent);
1017
+ color: var(--accent);
936
1018
  }
937
1019
 
938
1020
  .spacer { flex: 1; }
@@ -963,7 +1045,7 @@ body.gdp-diff-page #repo-target-wrap {
963
1045
  border: 1px solid var(--border);
964
1046
  border-radius: 6px;
965
1047
  overflow: hidden;
966
- height: 28px;
1048
+ height: var(--ui-control-sm);
967
1049
  }
968
1050
  .seg button {
969
1051
  border: 0;
@@ -972,42 +1054,48 @@ body.gdp-diff-page #repo-target-wrap {
972
1054
  padding: 0 11px;
973
1055
  cursor: pointer;
974
1056
  font: inherit;
975
- font-size: 12px;
1057
+ font-size: var(--ui-font-base);
976
1058
  font-weight: 500;
977
1059
  transition: background 0.12s, color 0.12s;
978
1060
  }
979
1061
  .seg button + button { border-left: 1px solid var(--border); }
980
1062
  .seg button:hover { background: var(--bg-soft); color: var(--fg); }
981
1063
  .seg button.active {
982
- background: var(--accent);
983
- color: #fff;
1064
+ /* Mode switch uses the same tinted-active idiom as the toggle buttons
1065
+ and the header nav pill (no more solid fill). */
1066
+ background: var(--accent-subtle);
1067
+ color: var(--accent);
1068
+ font-weight: 600;
984
1069
  }
985
1070
  .seg button.active + button,
986
1071
  .seg button + button.active { border-left-color: transparent; }
987
1072
 
988
1073
  .controls > button {
989
1074
  display: inline-flex; align-items: center; justify-content: center;
990
- width: 28px; height: 28px;
1075
+ width: var(--ui-control-sm); height: var(--ui-control-sm);
991
1076
  border: 1px solid var(--border);
992
1077
  background: var(--bg);
993
1078
  color: var(--fg);
994
1079
  border-radius: 6px;
995
1080
  cursor: pointer;
996
- font-size: 13px;
1081
+ font-size: var(--ui-font-md);
997
1082
  transition: background 0.12s, border-color 0.12s;
998
1083
  }
999
1084
  .controls > button:hover { background: var(--bg-soft); border-color: var(--border-strong); }
1000
1085
  .controls > button.active {
1001
- background: var(--accent);
1002
- color: #fff;
1086
+ /* Toggle ON state: tinted accent, consistent with the nav pill and the
1087
+ seg control. State reads from styling, so labels stay neutral. */
1088
+ background: var(--accent-subtle);
1089
+ color: var(--accent);
1003
1090
  border-color: var(--accent);
1091
+ font-weight: 600;
1004
1092
  }
1005
- .controls > button.active:hover { background: var(--accent-emph); border-color: var(--accent-emph); }
1093
+ .controls > button.active:hover { background: color-mix(in srgb, var(--accent) 16%, var(--bg)); border-color: var(--accent); }
1006
1094
  #ignore-ws,
1007
1095
  #syntax-highlight {
1008
1096
  width: auto;
1009
1097
  padding: 0 8px;
1010
- font-size: 11px;
1098
+ font-size: var(--ui-font-sm);
1011
1099
  font-weight: 600;
1012
1100
  letter-spacing: 0.04em;
1013
1101
  }
@@ -1021,13 +1109,13 @@ body.gdp-diff-page #repo-target-wrap {
1021
1109
  #status {
1022
1110
  display: inline-flex;
1023
1111
  align-items: center;
1024
- height: 24px;
1112
+ height: calc(var(--ui-control-sm) - 4px);
1025
1113
  padding: 0 9px 0 8px;
1026
1114
  border: 1px solid var(--border);
1027
1115
  border-radius: 999px;
1028
1116
  background: color-mix(in srgb, var(--bg) 72%, var(--bg-soft));
1029
1117
  color: var(--fg-muted);
1030
- font-size: 11px;
1118
+ font-size: var(--ui-font-sm);
1031
1119
  font-weight: 600;
1032
1120
  line-height: 1;
1033
1121
  white-space: nowrap;
@@ -1173,6 +1261,7 @@ body.gdp-diff-page #repo-target-wrap {
1173
1261
  overflow-y: auto;
1174
1262
  z-index: 31;
1175
1263
  flex-direction: column;
1264
+ font-size: var(--ui-font-base);
1176
1265
  }
1177
1266
  body.gdp-history-page #history-panel { display: flex; }
1178
1267
  body.gdp-history-page #sidebar { left: var(--history-w); }
@@ -1231,7 +1320,7 @@ body.gdp-history-page #topbar .ref-pickers {
1231
1320
  flex: 0 0 auto;
1232
1321
  white-space: nowrap;
1233
1322
  font-weight: 600;
1234
- font-size: 13px;
1323
+ font-size: var(--ui-font-md);
1235
1324
  }
1236
1325
  .history-head .ref-selector {
1237
1326
  flex: 1 1 auto;
@@ -1243,9 +1332,9 @@ body.gdp-history-page #topbar .ref-pickers {
1243
1332
  align-items: center;
1244
1333
  justify-content: center;
1245
1334
  flex: 0 0 auto;
1246
- width: 28px;
1247
- min-width: 28px;
1248
- height: 28px;
1335
+ width: var(--ui-control-sm);
1336
+ min-width: var(--ui-control-sm);
1337
+ height: var(--ui-control-sm);
1249
1338
  padding: 0;
1250
1339
  border: 1px solid transparent;
1251
1340
  border-radius: 4px;
@@ -1292,7 +1381,7 @@ body.gdp-history-page #topbar .ref-pickers {
1292
1381
  display: none;
1293
1382
  line-height: 1;
1294
1383
  white-space: nowrap;
1295
- font-size: 12px;
1384
+ font-size: var(--ui-font-base);
1296
1385
  font-weight: 600;
1297
1386
  }
1298
1387
  .history-refresh-result {
@@ -1341,14 +1430,14 @@ body.gdp-history-page #topbar .ref-pickers {
1341
1430
  .history-filter {
1342
1431
  box-sizing: border-box;
1343
1432
  width: 100%;
1344
- height: 32px;
1433
+ height: var(--ui-control-md);
1345
1434
  background: color-mix(in srgb, var(--bg) 78%, var(--bg-soft));
1346
1435
  border: 1px solid var(--border);
1347
1436
  color: var(--fg);
1348
1437
  border-radius: 8px;
1349
1438
  font: inherit;
1350
- font-size: 13px;
1351
- line-height: 30px;
1439
+ font-size: var(--ui-font-md);
1440
+ line-height: calc(var(--ui-control-md) - 2px);
1352
1441
  padding: 0 60px 0 34px;
1353
1442
  outline: none;
1354
1443
  transition: border-color 0.12s ease, background-color 0.12s ease, box-shadow 0.12s ease;
@@ -1432,10 +1521,11 @@ body.gdp-history-page #topbar .ref-pickers {
1432
1521
  gap: 8px;
1433
1522
  padding: 14px 14px 6px;
1434
1523
  background: var(--bg-mute);
1435
- border-top: 1px solid var(--border);
1524
+ /* Only border-bottom: the previous group's last .history-item already
1525
+ ends with border-bottom, so a border-top here would double the line. */
1436
1526
  border-bottom: 1px solid var(--border);
1437
1527
  color: var(--accent);
1438
- font-size: 11.5px;
1528
+ font-size: var(--ui-font-sm);
1439
1529
  font-weight: 700;
1440
1530
  text-transform: uppercase;
1441
1531
  letter-spacing: 0.06em;
@@ -1447,9 +1537,8 @@ body.gdp-history-page #topbar .ref-pickers {
1447
1537
  border-radius: 2px;
1448
1538
  background: var(--accent);
1449
1539
  }
1450
- #history-list > .history-group:first-child,
1451
- .history-list > .history-group:first-child { border-top: 0; }
1452
1540
  .history-item {
1541
+ min-height: var(--ui-dense-row-h);
1453
1542
  padding: 8px 14px;
1454
1543
  cursor: pointer;
1455
1544
  border-left: 3px solid transparent;
@@ -1474,7 +1563,7 @@ body.gdp-history-page #topbar .ref-pickers {
1474
1563
  }
1475
1564
  .history-item .subject {
1476
1565
  display: block;
1477
- font-size: 12.5px;
1566
+ font-size: var(--ui-font-md);
1478
1567
  overflow: hidden;
1479
1568
  text-overflow: ellipsis;
1480
1569
  white-space: nowrap;
@@ -1483,14 +1572,14 @@ body.gdp-history-page #topbar .ref-pickers {
1483
1572
  display: flex;
1484
1573
  gap: 8px;
1485
1574
  color: var(--fg-muted);
1486
- font-size: 11px;
1575
+ font-size: var(--ui-font-sm);
1487
1576
  margin-top: 2px;
1488
1577
  }
1489
1578
  .history-item .sha { font-family: "Monaspace Neon", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace; }
1490
1579
  .history-status {
1491
1580
  padding: 10px 14px;
1492
1581
  color: var(--fg-muted);
1493
- font-size: 12px;
1582
+ font-size: var(--ui-font-base);
1494
1583
  }
1495
1584
  #history-sentinel,
1496
1585
  .history-sentinel { height: 1px; }
@@ -1572,7 +1661,8 @@ body.gdp-history-page #history-commit-info:not([hidden]),
1572
1661
  display: grid;
1573
1662
  grid-template-columns: minmax(260px, 320px) minmax(0, 1fr);
1574
1663
  min-height: calc(100vh - var(--global-header-h) - 92px);
1575
- border-top: 1px solid var(--border);
1664
+ /* No border-top: the sticky header above already supplies the separator
1665
+ (border-bottom), two borders would paint a 2px line. */
1576
1666
  }
1577
1667
  .gdp-file-history-panel {
1578
1668
  min-width: 0;
@@ -1760,7 +1850,7 @@ body[data-focus-scope="main"] #content {
1760
1850
  padding: 13px 14px 10px;
1761
1851
  min-height: var(--sidebar-head-h);
1762
1852
  color: var(--fg);
1763
- font-size: 12px;
1853
+ font-size: var(--ui-font-base);
1764
1854
  font-weight: 600;
1765
1855
  position: sticky; top: 0;
1766
1856
  background: var(--bg-soft);
@@ -1799,8 +1889,8 @@ body[data-focus-scope="main"] #content {
1799
1889
  display: grid;
1800
1890
  place-items: center;
1801
1891
  flex: 0 0 auto;
1802
- width: 26px;
1803
- height: 26px;
1892
+ width: var(--ui-control-sm);
1893
+ height: var(--ui-control-sm);
1804
1894
  border: 1px solid transparent;
1805
1895
  border-radius: 6px;
1806
1896
  background: transparent;
@@ -1827,8 +1917,8 @@ body[data-focus-scope="main"] #content {
1827
1917
  .sb-icon-action svg {
1828
1918
  display: block;
1829
1919
  }
1830
- .sb-view-seg { height: 22px; }
1831
- .sb-view-seg button { padding: 0 8px; font-size: 11px; }
1920
+ .sb-view-seg { height: calc(var(--ui-control-sm) - 6px); }
1921
+ .sb-view-seg button { padding: 0 8px; font-size: var(--ui-font-sm); }
1832
1922
  .sb-filter-wrap {
1833
1923
  position: sticky;
1834
1924
  top: var(--sidebar-head-h);
@@ -1864,14 +1954,14 @@ body[data-focus-scope="main"] #content {
1864
1954
  #sb-filter {
1865
1955
  box-sizing: border-box;
1866
1956
  width: 100%;
1867
- height: 32px;
1957
+ height: var(--ui-control-md);
1868
1958
  background: color-mix(in srgb, var(--bg) 78%, var(--bg-soft));
1869
1959
  border: 1px solid var(--border);
1870
1960
  color: var(--fg);
1871
1961
  border-radius: 8px;
1872
1962
  font: inherit;
1873
- font-size: 13px;
1874
- line-height: 30px;
1963
+ font-size: var(--ui-font-md);
1964
+ line-height: calc(var(--ui-control-md) - 2px);
1875
1965
  padding: 0 60px 0 34px;
1876
1966
  outline: none;
1877
1967
  transition: border-color 0.12s ease, background-color 0.12s ease, box-shadow 0.12s ease;
@@ -2110,9 +2200,6 @@ body.gdp-history-resizing * {
2110
2200
  background: var(--bg-mute);
2111
2201
  }
2112
2202
 
2113
- .quick-help-btn {
2114
- font-weight: 700;
2115
- }
2116
2203
  #quick-help-popover {
2117
2204
  position: fixed;
2118
2205
  right: 16px;
@@ -2361,7 +2448,26 @@ body.gdp-help-page #content {
2361
2448
  overflow: hidden;
2362
2449
  box-sizing: border-box;
2363
2450
  }
2451
+ /* Indent guides: one vertical line under every ancestor dir's chevron
2452
+ center, tiled from the row's own --lvl-pad (12px + depth * 14px, chevron
2453
+ centers land on 20px + k * 14px). The pseudo-element's width limits the
2454
+ tiling to the indent region and collapses to 0 at depth 0, where a row
2455
+ has no ancestor dirs. Works for both the nested renderer and the flat
2456
+ absolute-positioned virtual rows. */
2457
+ #filelist.tree .tree-dir::before,
2458
+ #filelist.tree .tree-file::before {
2459
+ content: "";
2460
+ position: absolute;
2461
+ top: 0;
2462
+ bottom: 0;
2463
+ left: 20px;
2464
+ width: max(0px, calc(var(--lvl-pad, 12px) - 25px));
2465
+ background-image: linear-gradient(90deg, var(--tree-guide) 1px, transparent 1px);
2466
+ background-size: 14px 100%;
2467
+ pointer-events: none;
2468
+ }
2364
2469
  #filelist.tree .tree-dir {
2470
+ position: relative;
2365
2471
  display: grid;
2366
2472
  grid-template-columns: 16px 16px minmax(0, 1fr) 22px;
2367
2473
  align-items: center;
@@ -2372,9 +2478,14 @@ body.gdp-help-page #content {
2372
2478
  font-size: var(--sidebar-dir-font);
2373
2479
  line-height: calc(var(--sidebar-dir-font) + 7px);
2374
2480
  user-select: none;
2375
- border-radius: 6px;
2481
+ border-left: 2px solid transparent;
2482
+ transition: background 0.10s, border-color 0.10s;
2376
2483
  }
2377
2484
  #filelist.tree .tree-dir:hover { background: var(--bg-mute); color: var(--fg); }
2485
+ #filelist.tree .tree-dir.active {
2486
+ background: var(--accent-subtle);
2487
+ border-left-color: var(--accent);
2488
+ }
2378
2489
  #filelist.tree .tree-dir.children-omitted {
2379
2490
  color: var(--fg-muted);
2380
2491
  }
@@ -2400,10 +2511,10 @@ body.gdp-help-page #content {
2400
2511
  padding-top: 4.4px;
2401
2512
  font-weight: 700;
2402
2513
  transition: transform 0.15s, color 0.15s;
2403
- color: #59636e;
2514
+ color: var(--fg-subtle);
2404
2515
  }
2405
2516
  #filelist.tree .tree-dir.collapsed .chev { transform: rotate(-90deg); }
2406
- #filelist.tree .tree-dir:hover .chev { color: #59636e; }
2517
+ #filelist.tree .tree-dir:hover .chev { color: var(--fg-muted); }
2407
2518
  #filelist.tree .tree-dir .chev .octicon {
2408
2519
  display: block;
2409
2520
  width: 12px;
@@ -2456,7 +2567,8 @@ body.gdp-help-page #content {
2456
2567
  background: var(--bg-soft);
2457
2568
  }
2458
2569
  #filelist.tree .tree-dir .dir-icon {
2459
- color: #54aeff;
2570
+ /* Match the repo listing's folder color (.gdp-repo-row .dir-icon). */
2571
+ color: var(--accent);
2460
2572
  flex-shrink: 0;
2461
2573
  width: 16px;
2462
2574
  height: 16px;
@@ -2471,6 +2583,7 @@ body.gdp-help-page #content {
2471
2583
  #filelist.tree .tree-dir.collapsed + .tree-children { display: none; }
2472
2584
 
2473
2585
  #filelist.tree .tree-file {
2586
+ position: relative;
2474
2587
  display: grid;
2475
2588
  grid-template-columns: 16px 16px minmax(0, 1fr) auto auto;
2476
2589
  align-items: center;
@@ -2862,9 +2975,11 @@ body:not(.gdp-file-detail-page):not(.gdp-history-page) #diff::after {
2862
2975
  background: var(--bg-soft);
2863
2976
  border: 1px solid var(--border);
2864
2977
  border-radius: 6px 6px 0 0;
2865
- margin: 0 0 -1px;
2978
+ /* -1px on top/left/right: the header's own border overlaps the wrapper's
2979
+ border instead of painting a 2px band inside it. */
2980
+ margin: -1px -1px 0;
2866
2981
  padding: 6px 8px;
2867
- min-height: 46px;
2982
+ min-height: var(--ui-file-header-h);
2868
2983
  display: flex;
2869
2984
  align-items: center;
2870
2985
  gap: 8px;
@@ -2873,19 +2988,19 @@ body:not(.gdp-file-detail-page):not(.gdp-history-page) #diff::after {
2873
2988
  position: sticky;
2874
2989
  top: var(--chrome-h);
2875
2990
  z-index: 20;
2876
- font-size: 14px;
2877
- line-height: 21px;
2991
+ font-size: var(--ui-font-lg);
2992
+ line-height: 1.5;
2878
2993
  }
2879
2994
  .d2h-file-name-wrapper {
2880
2995
  display: flex; align-items: center; gap: 8px;
2881
2996
  flex: 1; min-width: 0;
2882
- font-size: 14px;
2997
+ font-size: var(--ui-font-lg);
2883
2998
  }
2884
2999
  .d2h-file-name {
2885
3000
  color: var(--fg) !important;
2886
3001
  font-weight: 400;
2887
3002
  font-family: "Monaspace Neon", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
2888
- font-size: 13px;
3003
+ font-size: var(--ui-font-md);
2889
3004
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
2890
3005
  }
2891
3006
  .d2h-icon-wrapper { display: inline-flex; color: var(--fg-muted); }
@@ -2895,13 +3010,13 @@ body:not(.gdp-file-detail-page):not(.gdp-history-page) #diff::after {
2895
3010
  .d2h-lines-added {
2896
3011
  color: var(--success); font-weight: 600;
2897
3012
  font-variant-numeric: tabular-nums;
2898
- font-size: 12px;
3013
+ font-size: var(--ui-font-base);
2899
3014
  font-family: "Monaspace Neon", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
2900
3015
  }
2901
3016
  .d2h-lines-deleted {
2902
3017
  color: var(--danger); font-weight: 600;
2903
3018
  font-variant-numeric: tabular-nums;
2904
- font-size: 12px;
3019
+ font-size: var(--ui-font-base);
2905
3020
  font-family: "Monaspace Neon", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
2906
3021
  }
2907
3022
 
@@ -2922,23 +3037,23 @@ tr.gdp-hunk-row > td {
2922
3037
  white-space: nowrap;
2923
3038
  font-size: 0 !important;
2924
3039
  }
2925
- /* Force the inner div to act as a 20px block. d2h ships
3040
+ /* Force the inner div to act as a single code-line block. d2h ships
2926
3041
  * `.d2h-code-side-line { display: inline-block }`, and inline-blocks
2927
3042
  * sitting next to whitespace text nodes inside a table-cell create a
2928
- * second line box (~20px). Switching to `display: block` leaves only
3043
+ * second line box. Switching to `display: block` leaves only
2929
3044
  * the div in the cell's flow. */
2930
3045
  tr.gdp-hunk-row > td > .d2h-code-line,
2931
3046
  tr.gdp-hunk-row > td > .d2h-code-side-line,
2932
3047
  tr.gdp-hunk-row > td > .gdp-expand-stack {
2933
- /* Stack auto-sizes: 1 button = 20px, 2 buttons (↑+↓) = 40px. */
3048
+ /* Stack auto-sizes with the configured code line height. */
2934
3049
  font-size: var(--code-font-size);
2935
- line-height: 20px;
3050
+ line-height: var(--code-line-height);
2936
3051
  }
2937
3052
  tr.gdp-hunk-row .d2h-code-line,
2938
3053
  tr.gdp-hunk-row .d2h-code-side-line,
2939
3054
  tr.gdp-hunk-row .d2h-code-line-ctn {
2940
- height: 20px !important;
2941
- line-height: 20px !important;
3055
+ height: var(--code-line-height) !important;
3056
+ line-height: var(--code-line-height) !important;
2942
3057
  padding-top: 0 !important;
2943
3058
  padding-bottom: 0 !important;
2944
3059
  overflow: hidden;
@@ -2984,7 +3099,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
2984
3099
  padding: 0 4px !important;
2985
3100
  text-align: center;
2986
3101
  direction: ltr;
2987
- line-height: 20px;
3102
+ line-height: var(--code-line-height);
2988
3103
  white-space: nowrap;
2989
3104
  }
2990
3105
  /* Unified line-num cell holds two numbers (old, new) side-by-side via d2h's
@@ -3012,19 +3127,19 @@ table.d2h-diff-table td.d2h-code-linenumber > .line-num2 {
3012
3127
  }
3013
3128
  table.d2h-diff-table td.d2h-code-linenumber > .line-num1 { float: left; }
3014
3129
  table.d2h-diff-table td.d2h-code-linenumber > .line-num2 { float: right; }
3015
- /* Match GitHub's 20px row height: remove td padding, let line-height fill. */
3130
+ /* Remove td padding and let the configured code line-height fill the row. */
3016
3131
  table.d2h-diff-table td.d2h-cntx,
3017
3132
  table.d2h-diff-table td.d2h-ins,
3018
3133
  table.d2h-diff-table td.d2h-del,
3019
3134
  table.d2h-diff-table td.d2h-info {
3020
3135
  padding: 0 !important;
3021
- line-height: 20px;
3136
+ line-height: var(--code-line-height);
3022
3137
  }
3023
3138
  table.d2h-diff-table .d2h-code-line,
3024
3139
  table.d2h-diff-table .d2h-code-side-line {
3025
3140
  padding: 0 !important;
3026
3141
  width: auto !important;
3027
- line-height: 20px;
3142
+ line-height: var(--code-line-height);
3028
3143
  }
3029
3144
  table.d2h-diff-table .d2h-code-line-prefix {
3030
3145
  display: inline-block;
@@ -3060,9 +3175,8 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3060
3175
  user-select: none;
3061
3176
  }
3062
3177
 
3063
- /* Floating "copy @path#start-end" pill shown while lines are selected. Root
3064
- is a plain div (see line-ref-pill.ts) hosting two buttons: the copy
3065
- action fills the capsule, the close (×) button overlays its corner. */
3178
+ /* Floating selection action bar. AI reference copy and repository-web
3179
+ actions are visually separated so their payloads are unambiguous. */
3066
3180
  #line-ref-pill {
3067
3181
  position: fixed;
3068
3182
  left: 50%;
@@ -3071,34 +3185,101 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3071
3185
  z-index: 400;
3072
3186
  display: inline-flex;
3073
3187
  align-items: center;
3074
- gap: 8px;
3075
- max-width: min(680px, calc(100vw - 48px));
3188
+ gap: 4px;
3189
+ max-width: min(1040px, calc(100vw - 48px));
3076
3190
  white-space: nowrap;
3077
- padding: 9px 16px;
3078
- border: 1px solid var(--accent);
3079
- border-radius: 999px;
3080
- background: var(--accent);
3081
- color: #fff;
3191
+ padding: 4px;
3192
+ border: 1px solid var(--border-strong);
3193
+ border-radius: 11px;
3194
+ background: var(--bg);
3195
+ color: var(--fg);
3082
3196
  font: inherit;
3083
- font-size: 13px;
3197
+ font-size: var(--ui-font-base);
3084
3198
  font-weight: 600;
3085
3199
  box-shadow: 0 8px 28px rgba(31, 35, 40, 0.35);
3086
3200
  }
3087
- #line-ref-pill:hover {
3088
- filter: brightness(1.1);
3089
- }
3090
3201
  #line-ref-pill-copy {
3091
3202
  display: inline-flex;
3092
3203
  align-items: center;
3093
3204
  gap: 8px;
3094
3205
  min-width: 0;
3095
- padding: 0;
3206
+ min-height: var(--ui-control-sm);
3207
+ padding: 0 10px;
3096
3208
  border: none;
3097
- background: none;
3098
- color: inherit;
3209
+ border-radius: 7px;
3210
+ background: var(--accent);
3211
+ color: #fff;
3212
+ font: inherit;
3213
+ cursor: pointer;
3214
+ }
3215
+ #line-ref-pill-copy:hover {
3216
+ background: var(--accent-emph);
3217
+ }
3218
+ #line-ref-pill-copy:focus-visible {
3219
+ outline: 2px solid var(--accent);
3220
+ outline-offset: 2px;
3221
+ }
3222
+ #line-ref-pill-copy.copied {
3223
+ background: var(--success);
3224
+ }
3225
+ #line-ref-pill-copy.failed {
3226
+ background: var(--danger);
3227
+ }
3228
+ #line-ref-pill-github-actions {
3229
+ display: inline-flex;
3230
+ align-items: stretch;
3231
+ flex: 0 0 auto;
3232
+ overflow: hidden;
3233
+ min-height: var(--ui-control-sm);
3234
+ border: 1px solid var(--border);
3235
+ border-radius: 7px;
3236
+ background: var(--bg-soft);
3237
+ }
3238
+ #line-ref-pill-github-actions[hidden] {
3239
+ display: none;
3240
+ }
3241
+ #line-ref-pill-github-open,
3242
+ #line-ref-pill-github-copy {
3243
+ display: inline-flex;
3244
+ align-items: center;
3245
+ justify-content: center;
3246
+ min-height: var(--ui-control-sm);
3247
+ border: 0;
3248
+ background: transparent;
3249
+ color: var(--fg);
3099
3250
  font: inherit;
3251
+ text-decoration: none;
3252
+ }
3253
+ #line-ref-pill-github-open {
3254
+ gap: 6px;
3255
+ padding: 0 10px;
3256
+ }
3257
+ #line-ref-pill-github-copy {
3258
+ gap: 6px;
3259
+ width: auto;
3260
+ padding: 0 10px;
3261
+ border-left: 1px solid var(--border);
3100
3262
  cursor: pointer;
3101
3263
  }
3264
+ #line-ref-pill-github-open:hover,
3265
+ #line-ref-pill-github-copy:hover {
3266
+ background: var(--bg-mute);
3267
+ color: var(--fg);
3268
+ text-decoration: none;
3269
+ }
3270
+ #line-ref-pill-github-open:focus-visible,
3271
+ #line-ref-pill-github-copy:focus-visible {
3272
+ outline: 2px solid var(--accent);
3273
+ outline-offset: -3px;
3274
+ }
3275
+ #line-ref-pill-github-copy.copied {
3276
+ color: var(--success);
3277
+ background: color-mix(in srgb, var(--success) 10%, transparent);
3278
+ }
3279
+ #line-ref-pill-github-copy.failed {
3280
+ color: #fff;
3281
+ background: var(--danger);
3282
+ }
3102
3283
  #line-ref-pill-close {
3103
3284
  position: absolute;
3104
3285
  top: -6px;
@@ -3109,7 +3290,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3109
3290
  align-items: center;
3110
3291
  justify-content: center;
3111
3292
  padding: 0;
3112
- border: 1px solid var(--accent);
3293
+ border: 1px solid var(--border-strong);
3113
3294
  border-radius: 50%;
3114
3295
  background: var(--bg);
3115
3296
  color: var(--fg-muted);
@@ -3126,6 +3307,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3126
3307
  }
3127
3308
  #line-ref-pill .lrp-label {
3128
3309
  flex: 0 0 auto;
3310
+ font-weight: 700;
3129
3311
  }
3130
3312
  #line-ref-pill .lrp-ref {
3131
3313
  overflow: hidden;
@@ -3134,7 +3316,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3134
3316
  border-radius: 6px;
3135
3317
  background: rgba(255, 255, 255, 0.18);
3136
3318
  font-family: "Monaspace Neon", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
3137
- font-size: 12px;
3319
+ font-size: var(--ui-font-sm);
3138
3320
  font-weight: 400;
3139
3321
  }
3140
3322
  /* Line count badge shown for multi-line selections. Flips to a solid
@@ -3152,10 +3334,6 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3152
3334
  background: #fff;
3153
3335
  color: var(--attn);
3154
3336
  }
3155
- #line-ref-pill.copied {
3156
- background: var(--success, #2ea043);
3157
- border-color: var(--success, #2ea043);
3158
- }
3159
3337
  #line-ref-pill.pop {
3160
3338
  animation: lrp-pop 0.22s ease-out;
3161
3339
  }
@@ -3172,8 +3350,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3172
3350
  #line-ref-pill[hidden] {
3173
3351
  display: none;
3174
3352
  }
3175
- /* Stack height = number of buttons * 20px. With 1 button = 20px row,
3176
- * with 2 (↑+↓) = 40px row, matching GitHub. */
3353
+ /* Stack height follows the configured code line height. */
3177
3354
  .gdp-expand-stack {
3178
3355
  display: flex;
3179
3356
  flex-direction: column;
@@ -3185,9 +3362,9 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3185
3362
  -webkit-appearance: none;
3186
3363
  display: grid;
3187
3364
  place-items: center;
3188
- flex: 0 0 20px;
3365
+ flex: 0 0 var(--code-line-height);
3189
3366
  width: 100%;
3190
- height: 20px;
3367
+ height: var(--code-line-height);
3191
3368
  min-height: 0;
3192
3369
  border: 0;
3193
3370
  background: var(--accent-subtle);
@@ -3213,7 +3390,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3213
3390
  margin-left: auto;
3214
3391
  display: inline-flex;
3215
3392
  gap: 8px;
3216
- font-size: 12px;
3393
+ font-size: var(--ui-font-base);
3217
3394
  font-weight: 600;
3218
3395
  font-variant-numeric: tabular-nums;
3219
3396
  }
@@ -3226,15 +3403,15 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3226
3403
  appearance: none;
3227
3404
  display: grid;
3228
3405
  place-items: center;
3229
- width: 28px;
3230
- height: 28px;
3406
+ width: var(--ui-control-sm);
3407
+ height: var(--ui-control-sm);
3231
3408
  border: 1px solid transparent;
3232
3409
  background: transparent;
3233
3410
  color: var(--fg-muted);
3234
3411
  border-radius: 6px;
3235
3412
  padding: 0 8px;
3236
3413
  cursor: pointer;
3237
- flex: 0 0 28px;
3414
+ flex: 0 0 var(--ui-control-sm);
3238
3415
  }
3239
3416
  .gdp-file-header-icon:hover {
3240
3417
  color: var(--fg);
@@ -3279,10 +3456,10 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3279
3456
  text-decoration: none;
3280
3457
  }
3281
3458
  .gdp-btn-sm {
3282
- height: 28px;
3459
+ height: var(--ui-control-sm);
3283
3460
  padding: 0 10px;
3284
- font-size: 12px;
3285
- line-height: 26px;
3461
+ font-size: var(--ui-font-base);
3462
+ line-height: calc(var(--ui-control-sm) - 2px);
3286
3463
  }
3287
3464
  .gdp-btn:hover {
3288
3465
  background: var(--bg-mute);
@@ -3299,8 +3476,8 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3299
3476
  opacity: 0.65;
3300
3477
  }
3301
3478
  .d2h-file-collapse-input {
3302
- width: 13px;
3303
- height: 13px;
3479
+ width: calc(var(--ui-font-sm) + 2px);
3480
+ height: calc(var(--ui-font-sm) + 2px);
3304
3481
  margin: 0;
3305
3482
  accent-color: var(--accent);
3306
3483
  }
@@ -3314,8 +3491,8 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3314
3491
  }
3315
3492
  .gdp-stat-squares .sq {
3316
3493
  display: inline-block;
3317
- width: 8px;
3318
- height: 8px;
3494
+ width: calc(var(--ui-font-sm) - 3px);
3495
+ height: calc(var(--ui-font-sm) - 3px);
3319
3496
  border-radius: 2px;
3320
3497
  background: #d0d7de; /* fallback / neutral */
3321
3498
  }
@@ -3532,7 +3709,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3532
3709
  table-layout: auto;
3533
3710
  font-family: "Monaspace Neon", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
3534
3711
  font-size: var(--code-font-size);
3535
- line-height: 20px;
3712
+ line-height: var(--code-line-height);
3536
3713
  }
3537
3714
  .gdp-source-table tr.gdp-source-line-target {
3538
3715
  background: var(--line-hit-bg);
@@ -3593,13 +3770,16 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3593
3770
  align-items: center;
3594
3771
  justify-content: space-between;
3595
3772
  gap: 12px;
3596
- margin: 12px;
3597
- padding: 14px;
3598
- border: 1px dashed var(--border-strong);
3773
+ margin: 12px 14px;
3774
+ padding: 10px 14px;
3775
+ border: 1px dashed var(--border);
3599
3776
  border-radius: 8px;
3600
3777
  background: var(--bg);
3601
3778
  transition: background 0.14s ease, border-color 0.14s ease, box-shadow 0.14s ease;
3602
3779
  }
3780
+ .gdp-upload-panel:hover {
3781
+ border-color: var(--border-strong);
3782
+ }
3603
3783
  .gdp-upload-panel.dragging {
3604
3784
  border-color: var(--accent);
3605
3785
  background: var(--accent-subtle);
@@ -3611,12 +3791,13 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3611
3791
  .gdp-upload-error {
3612
3792
  min-height: 18px;
3613
3793
  color: var(--danger);
3614
- font-size: 12px;
3794
+ font-size: var(--ui-font-base);
3615
3795
  line-height: 18px;
3616
3796
  }
3617
3797
  .gdp-upload-copy {
3618
3798
  min-width: 0;
3619
3799
  color: var(--fg-muted);
3800
+ font-size: var(--ui-font-base);
3620
3801
  overflow: hidden;
3621
3802
  text-overflow: ellipsis;
3622
3803
  white-space: nowrap;
@@ -3757,7 +3938,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3757
3938
  min-height: 0;
3758
3939
  font-family: "Monaspace Neon", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
3759
3940
  font-size: var(--code-font-size);
3760
- line-height: 20px;
3941
+ line-height: var(--code-line-height);
3761
3942
  cursor: text;
3762
3943
  }
3763
3944
  .gdp-source-virtual-spacer {
@@ -3773,8 +3954,8 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3773
3954
  .gdp-source-virtual-row {
3774
3955
  display: grid;
3775
3956
  grid-template-columns: minmax(50px, max-content) minmax(0, 1fr);
3776
- height: 20px;
3777
- line-height: 20px;
3957
+ height: var(--code-line-height);
3958
+ line-height: var(--code-line-height);
3778
3959
  }
3779
3960
  .gdp-source-virtual-line-number {
3780
3961
  position: sticky;
@@ -3793,7 +3974,7 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3793
3974
  padding: 0 12px;
3794
3975
  color: var(--fg);
3795
3976
  white-space: pre;
3796
- min-height: 20px;
3977
+ min-height: var(--code-line-height);
3797
3978
  }
3798
3979
  .gdp-source-virtual-line-code.hljs {
3799
3980
  background: var(--bg);
@@ -3915,6 +4096,13 @@ table.d2h-diff-table td.d2h-code-side-linenumber {
3915
4096
  .gdp-file-detail-header .gdp-create-dir {
3916
4097
  flex-shrink: 0;
3917
4098
  }
4099
+ .gdp-repo-web-link {
4100
+ flex: 0 0 auto;
4101
+ gap: 6px;
4102
+ }
4103
+ .gdp-repo-web-link svg {
4104
+ display: block;
4105
+ }
3918
4106
  .gdp-file-detail-meta {
3919
4107
  display: flex;
3920
4108
  align-items: center;
@@ -4484,6 +4672,7 @@ body.gdp-file-detail-page #empty {
4484
4672
  width: 100%;
4485
4673
  min-width: 0;
4486
4674
  margin: 0;
4675
+ font-size: var(--ui-font-md);
4487
4676
  }
4488
4677
  .gdp-repo-header,
4489
4678
  .gdp-repo-toolbar {
@@ -4504,7 +4693,10 @@ body.gdp-file-detail-page #empty {
4504
4693
  cursor: default;
4505
4694
  }
4506
4695
  .gdp-repo-file-list {
4507
- border-top: 0;
4696
+ /* The wrapper (.d2h-file-wrapper) supplies the card outline and shadow;
4697
+ an inner border here painted a 2px band on three sides. */
4698
+ border: 0;
4699
+ box-shadow: none;
4508
4700
  border-radius: 0 0 6px 6px;
4509
4701
  padding: 0;
4510
4702
  overflow: hidden;
@@ -4514,9 +4706,10 @@ body.gdp-file-detail-page #empty {
4514
4706
  grid-template-columns: 28px minmax(0, 1fr) minmax(150px, 220px) 80px;
4515
4707
  column-gap: 8px;
4516
4708
  align-items: center;
4517
- min-height: 34px;
4709
+ min-height: var(--ui-control-md);
4518
4710
  padding: 0 14px;
4519
- border-top: 1px solid var(--border);
4711
+ /* No border-top: the wrapper's card border is right above; two borders
4712
+ would paint a 2px band when there is no upload panel. */
4520
4713
  border-bottom: 1px solid var(--border);
4521
4714
  background: var(--bg-soft);
4522
4715
  }
@@ -4530,8 +4723,9 @@ body.gdp-file-detail-page #empty {
4530
4723
  background: transparent;
4531
4724
  color: var(--fg-muted);
4532
4725
  font: inherit;
4533
- font-size: 12px;
4726
+ font-size: var(--ui-font-sm);
4534
4727
  font-weight: 600;
4728
+ letter-spacing: 0.02em;
4535
4729
  text-align: left;
4536
4730
  cursor: pointer;
4537
4731
  line-height: 20px;
@@ -4550,13 +4744,14 @@ body.gdp-file-detail-page #empty {
4550
4744
  align-items: center;
4551
4745
  column-gap: 8px;
4552
4746
  width: 100%;
4553
- min-height: 42px;
4747
+ min-height: var(--ui-dense-row-h);
4554
4748
  border: 0;
4555
4749
  border-bottom: 1px solid var(--border);
4556
4750
  background: var(--bg);
4557
4751
  color: var(--fg);
4558
4752
  padding: 0 14px;
4559
4753
  font: inherit;
4754
+ font-size: var(--ui-font-md);
4560
4755
  text-align: left;
4561
4756
  cursor: pointer;
4562
4757
  }
@@ -4571,7 +4766,9 @@ body.gdp-file-detail-page #empty {
4571
4766
  }
4572
4767
  .gdp-repo-row .dir-icon,
4573
4768
  .gdp-repo-list-shell .d2h-file-name-wrapper .dir-icon {
4574
- color: #54aeff;
4769
+ /* Theme-aware folder blue: deep link-blue in light mode, soft blue in
4770
+ dark mode (previously a single hardcoded mid-blue for both). */
4771
+ color: var(--accent);
4575
4772
  flex-shrink: 0;
4576
4773
  width: 16px;
4577
4774
  height: 16px;
@@ -4592,20 +4789,22 @@ body.gdp-file-detail-page #empty {
4592
4789
  .gdp-repo-row .kind {
4593
4790
  justify-self: end;
4594
4791
  color: var(--fg-muted);
4595
- font-size: 12px;
4792
+ font-size: var(--ui-font-base);
4596
4793
  }
4597
4794
  .gdp-repo-row .meta {
4598
4795
  overflow: hidden;
4599
4796
  text-overflow: ellipsis;
4600
4797
  white-space: nowrap;
4601
4798
  color: var(--fg-muted);
4602
- font-size: 12px;
4799
+ font-size: var(--ui-font-base);
4800
+ font-variant-numeric: tabular-nums;
4603
4801
  }
4604
4802
  .gdp-repo-row .size {
4605
4803
  justify-self: end;
4606
4804
  min-width: 0;
4607
4805
  color: var(--fg-muted);
4608
- font-size: 12px;
4806
+ font-size: var(--ui-font-base);
4807
+ font-variant-numeric: tabular-nums;
4609
4808
  white-space: nowrap;
4610
4809
  }
4611
4810
 
@@ -4805,7 +5004,7 @@ body.gdp-file-detail-page #empty {
4805
5004
  }
4806
5005
 
4807
5006
  .d2h-tag {
4808
- font-size: 10px;
5007
+ font-size: var(--ui-font-xs);
4809
5008
  font-weight: 600;
4810
5009
  text-transform: uppercase;
4811
5010
  letter-spacing: 0.04em;
@@ -4838,7 +5037,7 @@ body.gdp-file-detail-page #empty {
4838
5037
  /* match GitHub Primer exactly */
4839
5038
  font-family: "Monaspace Neon", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
4840
5039
  font-size: 12px;
4841
- line-height: 20px;
5040
+ line-height: var(--code-line-height);
4842
5041
  color: var(--fg);
4843
5042
  tab-size: 4;
4844
5043
  -moz-tab-size: 4;
@@ -4849,7 +5048,7 @@ body.gdp-file-detail-page #empty {
4849
5048
  .d2h-code-line, .d2h-code-side-line, .d2h-code-line-ctn, .d2h-code-side-emptyplaceholder {
4850
5049
  font-family: inherit !important;
4851
5050
  font-size: var(--code-font-size) !important;
4852
- line-height: 20px !important;
5051
+ line-height: var(--code-line-height) !important;
4853
5052
  font-weight: 400 !important;
4854
5053
  }
4855
5054
  /* Force the line wrappers (NOT the inner highlighted spans) to use Primer's
@@ -5085,7 +5284,7 @@ body.gdp-file-detail-page #empty {
5085
5284
  display: inline-flex;
5086
5285
  align-items: center;
5087
5286
  gap: 6px;
5088
- font-size: 12px;
5287
+ font-size: var(--ui-font-base);
5089
5288
  color: var(--fg-muted);
5090
5289
  cursor: pointer;
5091
5290
  }
@@ -5102,6 +5301,105 @@ body.gdp-file-detail-page #empty {
5102
5301
  [data-theme="dark"] ::-webkit-scrollbar-thumb { border-color: var(--bg); }
5103
5302
 
5104
5303
  /* ===== Responsive ===== */
5304
+ @media (max-width: 1440px) {
5305
+ #topbar {
5306
+ gap: 8px;
5307
+ padding-inline: 12px;
5308
+ }
5309
+ #meta {
5310
+ flex: 0 1 auto;
5311
+ min-width: 0;
5312
+ gap: 6px;
5313
+ }
5314
+ #meta .chip-added,
5315
+ #meta .chip-deleted,
5316
+ #meta .chip-renamed,
5317
+ #meta .chip-heavy,
5318
+ #meta .chip-binary,
5319
+ #meta .chip-media,
5320
+ #meta .chip-updated {
5321
+ display: none;
5322
+ }
5323
+ #topbar .ref-pickers {
5324
+ flex: 1 1 auto;
5325
+ min-width: 0;
5326
+ margin-left: 0;
5327
+ gap: 6px;
5328
+ }
5329
+ #topbar .ref-selector {
5330
+ flex: 1 1 clamp(140px, 16vw, 220px);
5331
+ width: clamp(140px, 16vw, 220px);
5332
+ min-width: 140px;
5333
+ }
5334
+ #topbar .spacer {
5335
+ display: none;
5336
+ }
5337
+ #topbar .controls {
5338
+ flex: 0 0 auto;
5339
+ }
5340
+ }
5341
+
5342
+ @media (max-width: 1100px) {
5343
+ #global-header {
5344
+ gap: 10px;
5345
+ padding-inline: 12px;
5346
+ }
5347
+ .app-menu-item {
5348
+ padding-inline: 7px;
5349
+ }
5350
+ .global-actions {
5351
+ gap: 4px;
5352
+ }
5353
+ .global-actions-sep {
5354
+ margin-inline: 0;
5355
+ }
5356
+ }
5357
+
5358
+ @media (max-width: 1050px) {
5359
+ #meta .chip-viewed {
5360
+ display: none;
5361
+ }
5362
+ }
5363
+
5364
+ @media (min-width: 901px) and (max-width: 1100px) {
5365
+ .d2h-file-header,
5366
+ .d2h-file-header.d2h-sticky-header {
5367
+ height: auto !important;
5368
+ min-height: var(--ui-file-header-wrapped-h);
5369
+ flex-wrap: wrap;
5370
+ align-items: center;
5371
+ align-content: center;
5372
+ row-gap: 6px;
5373
+ }
5374
+ .d2h-file-header .d2h-file-name-wrapper {
5375
+ flex: 1 1 calc(100% - 44px);
5376
+ min-width: 160px;
5377
+ order: 1;
5378
+ }
5379
+ .d2h-file-header > .gdp-file-toggle {
5380
+ order: 0;
5381
+ }
5382
+ .d2h-file-header > .d2h-file-collapse {
5383
+ order: 2;
5384
+ margin-left: 0;
5385
+ }
5386
+ .d2h-file-header > .gdp-stat-text {
5387
+ order: 3;
5388
+ margin-left: 0;
5389
+ }
5390
+ .d2h-file-header > .gdp-stat-squares {
5391
+ order: 4;
5392
+ }
5393
+ .d2h-file-header > .gdp-preview-file {
5394
+ order: 5;
5395
+ margin-left: auto;
5396
+ }
5397
+ .d2h-file-header > .gdp-view-file {
5398
+ order: 6;
5399
+ margin-left: 0;
5400
+ }
5401
+ }
5402
+
5105
5403
  @media (max-width: 900px) {
5106
5404
  #sidebar {
5107
5405
  position: static;
@@ -5127,7 +5425,7 @@ body.gdp-file-detail-page #empty {
5127
5425
  .d2h-file-header,
5128
5426
  .d2h-file-header.d2h-sticky-header {
5129
5427
  height: auto !important;
5130
- min-height: 82px;
5428
+ min-height: var(--ui-file-header-wrapped-h);
5131
5429
  flex-wrap: wrap;
5132
5430
  align-items: center;
5133
5431
  align-content: center;
@@ -5152,10 +5450,14 @@ body.gdp-file-detail-page #empty {
5152
5450
  .d2h-file-header > .gdp-stat-squares {
5153
5451
  order: 4;
5154
5452
  }
5155
- .d2h-file-header > .gdp-view-file {
5453
+ .d2h-file-header > .gdp-preview-file {
5156
5454
  order: 5;
5157
5455
  margin-left: auto;
5158
5456
  }
5457
+ .d2h-file-header > .gdp-view-file {
5458
+ order: 6;
5459
+ margin-left: 0;
5460
+ }
5159
5461
  body.gdp-history-page #history-panel {
5160
5462
  position: static;
5161
5463
  width: auto;
@@ -5606,11 +5908,11 @@ body.query-history-panel-open #content {
5606
5908
  display: flex;
5607
5909
  align-items: stretch;
5608
5910
  gap: 0;
5609
- min-height: 28px;
5911
+ min-height: var(--ui-history-dock-h);
5610
5912
  border-top: 1px solid var(--border);
5611
5913
  background: var(--bg-soft);
5612
5914
  flex-shrink: 0;
5613
- font-size: 12px;
5915
+ font-size: var(--ui-font-base);
5614
5916
  }
5615
5917
  .db-history-dock-tab {
5616
5918
  appearance: none;
@@ -5691,7 +5993,7 @@ body.query-history-panel-open #content {
5691
5993
  border-radius: 4px;
5692
5994
  background: var(--bg);
5693
5995
  color: var(--fg);
5694
- font-size: 12px;
5996
+ font-size: var(--ui-font-base);
5695
5997
  cursor: pointer;
5696
5998
  font-family: inherit;
5697
5999
  }
@@ -5732,7 +6034,7 @@ body.query-history-panel-open #content {
5732
6034
  color: var(--fg-muted);
5733
6035
  text-align: center;
5734
6036
  padding: 40px 16px;
5735
- font-size: 13px;
6037
+ font-size: var(--ui-font-md);
5736
6038
  }
5737
6039
  .db-session-log-detail-actions {
5738
6040
  display: flex;
@@ -5760,12 +6062,12 @@ body.query-history-panel-open #content {
5760
6062
  display: flex;
5761
6063
  gap: 8px;
5762
6064
  align-items: center;
5763
- font-size: 11px;
6065
+ font-size: var(--ui-font-sm);
5764
6066
  color: var(--fg-muted);
5765
6067
  }
5766
6068
  .db-session-log-badge {
5767
6069
  font-weight: 600;
5768
- font-size: 10px;
6070
+ font-size: var(--ui-font-xs);
5769
6071
  padding: 1px 6px;
5770
6072
  border-radius: 999px;
5771
6073
  border: 1px solid transparent;
@@ -5781,20 +6083,20 @@ body.query-history-panel-open #content {
5781
6083
  color: var(--danger, #cf222e);
5782
6084
  }
5783
6085
  .db-session-log-kind {
5784
- font-size: 10px;
6086
+ font-size: var(--ui-font-xs);
5785
6087
  text-transform: uppercase;
5786
6088
  letter-spacing: 0.05em;
5787
6089
  color: var(--fg-subtle);
5788
6090
  }
5789
6091
  .db-session-log-time {
5790
- font-size: 11px;
6092
+ font-size: var(--ui-font-sm);
5791
6093
  }
5792
6094
  .db-session-log-stats {
5793
- font-size: 11px;
6095
+ font-size: var(--ui-font-sm);
5794
6096
  }
5795
6097
  .db-session-log-entry-title {
5796
6098
  margin-top: 4px;
5797
- font-size: 12px;
6099
+ font-size: var(--ui-font-base);
5798
6100
  font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
5799
6101
  white-space: nowrap;
5800
6102
  overflow: hidden;
@@ -5805,7 +6107,7 @@ body.query-history-panel-open #content {
5805
6107
  border-radius: 4px;
5806
6108
  background: var(--bg);
5807
6109
  border: 1px solid var(--border);
5808
- font-size: 12px;
6110
+ font-size: var(--code-font-size);
5809
6111
  font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
5810
6112
  white-space: pre-wrap;
5811
6113
  word-break: break-word;
@@ -5829,7 +6131,7 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
5829
6131
  .db-session-log-message {
5830
6132
  padding: 8px;
5831
6133
  border-radius: 4px;
5832
- font-size: 12px;
6134
+ font-size: var(--ui-font-base);
5833
6135
  font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
5834
6136
  white-space: pre-wrap;
5835
6137
  word-break: break-word;
@@ -5861,7 +6163,7 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
5861
6163
  border-radius: 4px;
5862
6164
  background: var(--bg);
5863
6165
  color: var(--fg);
5864
- font-size: 12px;
6166
+ font-size: var(--ui-font-base);
5865
6167
  cursor: pointer;
5866
6168
  font-family: inherit;
5867
6169
  display: inline-flex;
@@ -5913,7 +6215,7 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
5913
6215
  color: var(--fg-muted);
5914
6216
  text-align: center;
5915
6217
  padding: 40px 16px;
5916
- font-size: 13px;
6218
+ font-size: var(--ui-font-md);
5917
6219
  }
5918
6220
  .db-query-history-detail-meta {
5919
6221
  display: flex;
@@ -5926,7 +6228,7 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
5926
6228
  border-radius: 4px;
5927
6229
  background: var(--bg-soft);
5928
6230
  color: var(--fg-muted);
5929
- font-size: 11px;
6231
+ font-size: var(--ui-font-sm);
5930
6232
  }
5931
6233
  .db-query-history-detail-meta .db-query-history-by {
5932
6234
  color: var(--fg);
@@ -5957,22 +6259,22 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
5957
6259
  display: flex;
5958
6260
  gap: 8px;
5959
6261
  align-items: center;
5960
- font-size: 11px;
6262
+ font-size: var(--ui-font-sm);
5961
6263
  color: var(--fg-muted);
5962
6264
  }
5963
6265
  .db-query-history-by {
5964
6266
  font-weight: 600;
5965
- font-size: 10px;
6267
+ font-size: var(--ui-font-xs);
5966
6268
  }
5967
6269
  .db-query-history-time {
5968
- font-size: 11px;
6270
+ font-size: var(--ui-font-sm);
5969
6271
  }
5970
6272
  .db-query-history-stats {
5971
- font-size: 11px;
6273
+ font-size: var(--ui-font-sm);
5972
6274
  }
5973
6275
  .db-query-history-entry-title {
5974
6276
  margin-top: 4px;
5975
- font-size: 12px;
6277
+ font-size: var(--ui-font-base);
5976
6278
  font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
5977
6279
  white-space: nowrap;
5978
6280
  overflow: hidden;
@@ -5986,7 +6288,7 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
5986
6288
  border-radius: 4px;
5987
6289
  background: var(--bg);
5988
6290
  border: 1px solid var(--border);
5989
- font-size: 12px;
6291
+ font-size: var(--code-font-size);
5990
6292
  font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
5991
6293
  white-space: pre-wrap;
5992
6294
  word-break: break-all;
@@ -5996,7 +6298,7 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
5996
6298
  }
5997
6299
  .db-query-history-body {
5998
6300
  margin-top: 8px;
5999
- font-size: 12px;
6301
+ font-size: var(--ui-font-base);
6000
6302
  color: var(--fg-muted);
6001
6303
  }
6002
6304
  .db-query-history-actions {
@@ -6006,7 +6308,7 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
6006
6308
  }
6007
6309
  .db-query-history-truncated {
6008
6310
  margin-top: 4px;
6009
- font-size: 11px;
6311
+ font-size: var(--ui-font-sm);
6010
6312
  color: var(--fg-muted);
6011
6313
  text-align: center;
6012
6314
  }
@@ -6187,6 +6489,21 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
6187
6489
  color: var(--fg-subtle);
6188
6490
  white-space: nowrap;
6189
6491
  }
6492
+ .annotation-session-count {
6493
+ flex: none;
6494
+ border: 1px solid var(--border);
6495
+ border-radius: 999px;
6496
+ background: var(--bg);
6497
+ color: var(--fg-muted);
6498
+ font-size: 10px;
6499
+ font-weight: 600;
6500
+ line-height: 1;
6501
+ padding: 2px 6px;
6502
+ }
6503
+ .annotation-session.active .annotation-session-count {
6504
+ border-color: var(--accent);
6505
+ color: var(--accent);
6506
+ }
6190
6507
  .annotation-entries {
6191
6508
  list-style: none;
6192
6509
  margin: 0;
@@ -6222,16 +6539,34 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
6222
6539
  min-width: 0;
6223
6540
  }
6224
6541
  .annotation-entry-open::before {
6542
+ /* Step number rendered as a chip so the reading order is scannable.
6543
+ Neutral by default, accent-tinted inside the active session, solid
6544
+ accent on the currently open entry. */
6225
6545
  content: counter(annotation-step);
6226
6546
  grid-row: 1 / span 3;
6227
- color: var(--fg-subtle);
6228
- font-size: 11px;
6229
- line-height: 1.6;
6547
+ align-self: start;
6548
+ margin-top: 5px;
6549
+ width: 18px;
6550
+ height: 18px;
6551
+ box-sizing: border-box;
6552
+ border: 1px solid var(--border);
6553
+ border-radius: 50%;
6554
+ background: var(--bg-soft);
6555
+ color: var(--fg-muted);
6556
+ font-size: 10px;
6557
+ font-weight: 600;
6558
+ line-height: 16px;
6230
6559
  text-align: center;
6231
6560
  }
6232
- .annotation-entries li.active .annotation-entry-open::before {
6561
+ .annotation-session.active .annotation-entry-open::before {
6562
+ border-color: var(--accent);
6563
+ background: var(--accent-subtle);
6233
6564
  color: var(--accent);
6234
- font-weight: 600;
6565
+ }
6566
+ .annotation-entries li.active .annotation-entry-open::before {
6567
+ border-color: var(--accent);
6568
+ background: var(--accent);
6569
+ color: #fff;
6235
6570
  }
6236
6571
  .annotation-entry-location {
6237
6572
  grid-column: 2;
@@ -6314,8 +6649,18 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
6314
6649
  white-space: nowrap;
6315
6650
  }
6316
6651
  #annotation-detail-step {
6652
+ /* Matches the step chips on the inline comment boxes so the reader can
6653
+ tell at a glance which walkthrough step is open. */
6654
+ flex: none;
6655
+ border: 1px solid var(--accent);
6656
+ border-radius: 999px;
6657
+ background: var(--accent-subtle);
6658
+ color: var(--accent);
6317
6659
  font-size: 11px;
6318
- color: var(--fg-subtle);
6660
+ font-weight: 600;
6661
+ line-height: 1;
6662
+ padding: 3px 8px;
6663
+ white-space: nowrap;
6319
6664
  }
6320
6665
  #annotation-detail-time {
6321
6666
  flex: none;
@@ -6395,10 +6740,47 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
6395
6740
  border-left-color: var(--attn);
6396
6741
  box-shadow: 0 0 0 1px var(--attn) inset;
6397
6742
  }
6398
- .gdp-annotation-inline-title {
6399
- display: block;
6743
+ .gdp-annotation-inline-head {
6744
+ display: flex;
6745
+ align-items: center;
6746
+ gap: 8px;
6400
6747
  margin-bottom: 6px;
6401
6748
  }
6749
+ .gdp-annotation-inline-title {
6750
+ flex: 1;
6751
+ min-width: 0;
6752
+ }
6753
+ .gdp-annotation-step {
6754
+ /* Step chip on the inline comment box: shows "n/total" so the
6755
+ walkthrough order is visible right inside the code, and doubles as
6756
+ the button that opens the entry in the detail dock. */
6757
+ flex: none;
6758
+ border: 1px solid var(--accent);
6759
+ border-radius: 999px;
6760
+ background: var(--accent-subtle);
6761
+ color: var(--accent);
6762
+ font-family: inherit;
6763
+ font-size: 11px;
6764
+ font-weight: 600;
6765
+ line-height: 1;
6766
+ padding: 3px 8px;
6767
+ cursor: pointer;
6768
+ }
6769
+ .gdp-annotation-step:hover {
6770
+ background: var(--accent);
6771
+ color: #fff;
6772
+ }
6773
+ .gdp-annotation-row.active .gdp-annotation-step,
6774
+ .gdp-db-annotation-inline.active .gdp-annotation-step {
6775
+ border-color: var(--attn);
6776
+ color: var(--attn);
6777
+ background: transparent;
6778
+ }
6779
+ .gdp-annotation-row.active .gdp-annotation-step:hover,
6780
+ .gdp-db-annotation-inline.active .gdp-annotation-step:hover {
6781
+ background: var(--attn);
6782
+ color: #fff;
6783
+ }
6402
6784
  .gdp-annotation-inline-body pre {
6403
6785
  max-width: 100%;
6404
6786
  overflow-x: auto;
@@ -6440,8 +6822,8 @@ html[data-theme="dark"] .db-session-log-sql span[style] {
6440
6822
  border-color: var(--danger);
6441
6823
  }
6442
6824
  .gdp-annotation-inline-copy {
6443
- float: right;
6444
- margin-left: 8px;
6825
+ flex: none;
6826
+ margin-left: auto;
6445
6827
  }
6446
6828
  .annotation-edit-form {
6447
6829
  display: flex;
@@ -6599,7 +6981,7 @@ body.gdp-journal-page #load-bar {
6599
6981
  align-items: center;
6600
6982
  gap: 10px;
6601
6983
  padding: 10px 14px;
6602
- border-bottom: 1px solid var(--border);
6984
+ border-bottom: 1px solid var(--border-muted);
6603
6985
  background: var(--bg-soft);
6604
6986
  }
6605
6987
 
@@ -6647,7 +7029,7 @@ body.gdp-journal-page #load-bar {
6647
7029
  .journal-related,
6648
7030
  .journal-task-editor {
6649
7031
  min-width: 0;
6650
- border-right: 1px solid var(--border);
7032
+ border-right: 1px solid var(--border-muted);
6651
7033
  background: var(--bg-soft);
6652
7034
  overflow: auto;
6653
7035
  }
@@ -6655,7 +7037,7 @@ body.gdp-journal-page #load-bar {
6655
7037
  .journal-related,
6656
7038
  .journal-task-editor {
6657
7039
  border-right: 0;
6658
- border-left: 1px solid var(--border);
7040
+ border-left: 1px solid var(--border-muted);
6659
7041
  background: var(--bg);
6660
7042
  }
6661
7043
 
@@ -6670,7 +7052,7 @@ body.gdp-journal-page #load-bar {
6670
7052
 
6671
7053
  .journal-calendar-head {
6672
7054
  padding: 12px;
6673
- border-bottom: 1px solid var(--border);
7055
+ border-bottom: 1px solid var(--border-muted);
6674
7056
  }
6675
7057
 
6676
7058
  .journal-calendar-head button,
@@ -7027,9 +7409,11 @@ body.gdp-journal-page #load-bar {
7027
7409
  flex: 0 0 auto;
7028
7410
  max-width: 160px;
7029
7411
  min-height: 22px;
7030
- border: 1px solid var(--border);
7412
+ /* Borderless pill: the enclosing .journal-label-editor already draws the
7413
+ field frame, so a bordered chip inside it reads as a double border. */
7414
+ border: 0;
7031
7415
  border-radius: 999px;
7032
- background: var(--bg-soft);
7416
+ background: var(--bg-mute);
7033
7417
  color: var(--fg-muted);
7034
7418
  cursor: pointer;
7035
7419
  font: inherit;
@@ -7044,7 +7428,6 @@ body.gdp-journal-page #load-bar {
7044
7428
 
7045
7429
  .journal-label-editor-quick-chip:hover,
7046
7430
  .journal-label-editor-quick-chip:focus-visible {
7047
- border-color: var(--accent);
7048
7431
  background: var(--accent-subtle);
7049
7432
  color: var(--accent);
7050
7433
  outline: none;
@@ -7204,8 +7587,8 @@ body.gdp-journal-page #load-bar {
7204
7587
  "labels labels labels";
7205
7588
  gap: 10px;
7206
7589
  padding: 10px 12px;
7207
- border-bottom: 1px solid var(--border);
7208
- background: var(--bg-soft);
7590
+ border-bottom: 1px solid var(--border-muted);
7591
+ background: var(--bg);
7209
7592
  }
7210
7593
 
7211
7594
  .journal-task-toolbar input {
@@ -7621,15 +8004,17 @@ body.gdp-journal-page #load-bar {
7621
8004
  min-width: 980px;
7622
8005
  display: grid;
7623
8006
  grid-template-columns: repeat(5, minmax(180px, 1fr));
7624
- gap: 10px;
8007
+ gap: 12px;
7625
8008
  }
7626
8009
 
7627
8010
  .journal-task-column {
7628
8011
  min-width: 0;
7629
8012
  min-height: 360px;
7630
- border: 1px solid var(--border);
8013
+ /* Border stays 1px (transparent) so the drop-target accent border does
8014
+ not shift the column box when it appears. */
8015
+ border: 1px solid transparent;
7631
8016
  border-radius: 8px;
7632
- background: var(--bg-soft);
8017
+ background: transparent;
7633
8018
  overflow: hidden;
7634
8019
  }
7635
8020
 
@@ -7638,12 +8023,48 @@ body.gdp-journal-page #load-bar {
7638
8023
  background: var(--accent-subtle);
7639
8024
  }
7640
8025
 
8026
+ /* Linear-style quiet column header: status dot + muted label + count pill,
8027
+ no box or divider line. The dot color comes from the column's status
8028
+ class, so no JS change is needed. */
7641
8029
  .journal-task-column-head {
7642
8030
  min-height: 36px;
7643
- padding: 8px 10px;
7644
- border-bottom: 1px solid var(--border);
7645
- background: var(--bg);
8031
+ padding: 8px 10px 6px;
8032
+ font-size: 12px;
8033
+ color: var(--fg-muted);
8034
+ }
8035
+
8036
+ .journal-task-column-head strong {
8037
+ min-width: 0;
8038
+ display: inline-flex;
8039
+ align-items: center;
8040
+ gap: 7px;
7646
8041
  font-size: 12px;
8042
+ font-weight: 600;
8043
+ }
8044
+
8045
+ .journal-task-column-head strong::before {
8046
+ content: "";
8047
+ flex: 0 0 auto;
8048
+ width: 8px;
8049
+ height: 8px;
8050
+ border-radius: 999px;
8051
+ background: var(--fg-subtle);
8052
+ }
8053
+
8054
+ .journal-task-column-todo .journal-task-column-head strong::before {
8055
+ background: var(--accent);
8056
+ }
8057
+
8058
+ .journal-task-column-doing .journal-task-column-head strong::before {
8059
+ background: var(--attn);
8060
+ }
8061
+
8062
+ .journal-task-column-blocked .journal-task-column-head strong::before {
8063
+ background: var(--danger);
8064
+ }
8065
+
8066
+ .journal-task-column-done .journal-task-column-head strong::before {
8067
+ background: var(--success);
7647
8068
  }
7648
8069
 
7649
8070
  .journal-task-column-head span {
@@ -7660,13 +8081,12 @@ body.gdp-journal-page #load-bar {
7660
8081
  .journal-task-card {
7661
8082
  position: relative;
7662
8083
  width: calc(100% - 16px);
7663
- min-height: 96px;
7664
8084
  display: flex;
7665
8085
  flex-direction: column;
7666
8086
  gap: 6px;
7667
8087
  margin: 8px;
7668
- padding: 9px;
7669
- border: 1px solid var(--border);
8088
+ padding: 10px 12px;
8089
+ border: 1px solid var(--border-muted);
7670
8090
  border-radius: 8px;
7671
8091
  background: var(--bg);
7672
8092
  color: var(--fg);
@@ -7716,15 +8136,27 @@ body.gdp-journal-page #load-bar {
7716
8136
  .journal-task-card.compact {
7717
8137
  width: 100%;
7718
8138
  margin: 0 0 8px;
7719
- min-height: 78px;
7720
8139
  }
7721
8140
 
7722
- .journal-task-card:hover,
8141
+ /* Stable-box hover: only border color and shadow change, never the box
8142
+ dimensions. Selected keeps the accent frame. */
8143
+ .journal-task-card:hover {
8144
+ border-color: var(--border-strong);
8145
+ box-shadow: var(--shadow-md);
8146
+ }
8147
+
7723
8148
  .journal-task-card.selected {
7724
8149
  border-color: var(--accent);
7725
8150
  box-shadow: 0 0 0 1px var(--accent-subtle);
7726
8151
  }
7727
8152
 
8153
+ /* The status pill repeats the column title on the board; hide it there.
8154
+ Compact cards (related-tasks panel on the log tab) keep it, since they
8155
+ are shown outside the board context. */
8156
+ .journal-task-board .journal-task-card .journal-task-status {
8157
+ display: none;
8158
+ }
8159
+
7728
8160
  .journal-task-card.dragging:hover,
7729
8161
  .journal-task-card.dragging.selected {
7730
8162
  border-color: var(--accent);
@@ -7781,7 +8213,9 @@ body.gdp-journal-page #load-bar {
7781
8213
  color: var(--fg-subtle);
7782
8214
  cursor: grab;
7783
8215
  line-height: 1;
7784
- opacity: 0.7;
8216
+ /* Hidden until the card is hovered: pointer-drag on the card body still
8217
+ works, so this only declutters the resting board. */
8218
+ opacity: 0;
7785
8219
  touch-action: none;
7786
8220
  transition:
7787
8221
  background 0.14s ease,
@@ -7821,6 +8255,8 @@ body.gdp-journal-page #load-bar {
7821
8255
  .journal-task-claim {
7822
8256
  display: inline-flex;
7823
8257
  align-items: center;
8258
+ /* Cards are flex-column, so without this the pills stretch full-width. */
8259
+ align-self: flex-start;
7824
8260
  max-width: 100%;
7825
8261
  min-height: 18px;
7826
8262
  padding: 0 6px;
@@ -7907,10 +8343,34 @@ body.journal-task-editor-resizing * {
7907
8343
  flex-wrap: wrap;
7908
8344
  }
7909
8345
 
7910
- .journal-markdown-toolbar button {
8346
+ /* The shared ".journal-markdown-toolbar button" rule above gives every
8347
+ button in the toolbar its own border. Restore the segmented control's
8348
+ own look inside the toolbar (its container already draws the frame),
8349
+ otherwise seg buttons render a second border inside the seg border. */
8350
+ .journal-markdown-toolbar .seg button {
8351
+ border: 0;
8352
+ }
8353
+
8354
+ .journal-markdown-toolbar .seg button + button {
8355
+ border-left: 1px solid var(--border);
8356
+ }
8357
+
8358
+ /* Format buttons (B / ` / [] / >) read calmer as ghost icon buttons, in
8359
+ the .sb-icon-action idiom, instead of four more bordered boxes. Direct
8360
+ children only, so the .seg rules above stay in charge of mode buttons. */
8361
+ .journal-markdown-toolbar > button {
7911
8362
  min-width: 30px;
7912
8363
  padding: 0 8px;
7913
8364
  font-weight: 600;
8365
+ border-color: transparent;
8366
+ background: transparent;
8367
+ color: var(--fg-muted);
8368
+ }
8369
+
8370
+ .journal-markdown-toolbar > button:hover {
8371
+ border-color: transparent;
8372
+ background: var(--bg-mute);
8373
+ color: var(--fg);
7914
8374
  }
7915
8375
 
7916
8376
  .journal-editor-mode {
@@ -7921,9 +8381,11 @@ body.journal-task-editor-resizing * {
7921
8381
  min-height: 180px;
7922
8382
  max-height: 360px;
7923
8383
  overflow: auto;
7924
- border: 1px solid var(--border);
8384
+ /* Reading pane, not a form field: recessed fill instead of a second
8385
+ bordered box under the bordered textarea. */
8386
+ border: 0;
7925
8387
  border-radius: 6px;
7926
- background: var(--bg);
8388
+ background: var(--bg-soft);
7927
8389
  font-size: 13px;
7928
8390
  line-height: 1.5;
7929
8391
  padding: 8px 10px;
@@ -8060,10 +8522,14 @@ body.journal-task-editor-resizing * {
8060
8522
 
8061
8523
  .db-root,
8062
8524
  .db-container {
8063
- --db-font-sm: 11px;
8064
- --db-font-base: 12px;
8065
- --db-font-md: 13px;
8066
- --db-font-mono: 13px;
8525
+ --db-font-sm: var(--ui-font-sm);
8526
+ --db-font-base: var(--ui-font-base);
8527
+ --db-font-md: var(--ui-font-md);
8528
+ --db-font-mono: var(--ui-font-md);
8529
+ }
8530
+
8531
+ .db-root {
8532
+ font-size: var(--db-font-base);
8067
8533
  }
8068
8534
 
8069
8535
  .db-container {
@@ -8079,27 +8545,6 @@ body.journal-task-editor-resizing * {
8079
8545
  overflow: hidden;
8080
8546
  font-size: var(--db-font-base);
8081
8547
  }
8082
- body[data-sidebar-font-size="compact"] .db-root,
8083
- body[data-sidebar-font-size="compact"] .db-container {
8084
- --db-font-sm: 10px;
8085
- --db-font-base: 11px;
8086
- --db-font-md: 12px;
8087
- --db-font-mono: 12px;
8088
- }
8089
- body[data-sidebar-font-size="large"] .db-root,
8090
- body[data-sidebar-font-size="large"] .db-container {
8091
- --db-font-sm: 12px;
8092
- --db-font-base: 14px;
8093
- --db-font-md: 15px;
8094
- --db-font-mono: 14px;
8095
- }
8096
- body[data-sidebar-font-size="xlarge"] .db-root,
8097
- body[data-sidebar-font-size="xlarge"] .db-container {
8098
- --db-font-sm: 13px;
8099
- --db-font-base: 15px;
8100
- --db-font-md: 16px;
8101
- --db-font-mono: 15px;
8102
- }
8103
8548
  .db-upper-area {
8104
8549
  display: flex;
8105
8550
  flex: 1;
@@ -13051,3 +13496,740 @@ body.db-resizing {
13051
13496
  .doctor-badge[data-level="warn"] {
13052
13497
  background: var(--attn, #9a6700);
13053
13498
  }
13499
+
13500
+ /* ==========================================================================
13501
+ Datastore page — premium glass theme
13502
+ データストアページ (.db-root) 全体にスコープした装飾レイヤ。
13503
+ 既存トークン (--bg/--fg/--accent ...) から color-mix で導出するため、
13504
+ ライト/ダーク両テーマに自動追従する。状態変化で box dimensions が
13505
+ 動かないよう、hover/active は background / box-shadow / color のみで
13506
+ 表現する (padding/border の変更禁止)。
13507
+ ========================================================================== */
13508
+ .db-root {
13509
+ /* ガラス面の下に敷くキャンバス。ごく薄い色相のグラデーション。 */
13510
+ background:
13511
+ radial-gradient(
13512
+ 1100px 480px at 88% -12%,
13513
+ color-mix(in srgb, var(--done) 14%, transparent),
13514
+ transparent 62%
13515
+ ),
13516
+ radial-gradient(
13517
+ 900px 520px at -8% 112%,
13518
+ color-mix(in srgb, var(--accent) 16%, transparent),
13519
+ transparent 58%
13520
+ ),
13521
+ radial-gradient(
13522
+ 700px 420px at -6% -10%,
13523
+ color-mix(in srgb, var(--accent) 9%, transparent),
13524
+ transparent 60%
13525
+ ),
13526
+ linear-gradient(
13527
+ 180deg,
13528
+ color-mix(in srgb, var(--bg-soft) 60%, var(--bg)) 0%,
13529
+ var(--bg) 46%
13530
+ );
13531
+ /* ガラス素材の共通レシピ */
13532
+ --db-glass-bg: color-mix(in srgb, var(--bg) 76%, transparent);
13533
+ --db-glass-bg-strong: color-mix(in srgb, var(--bg) 90%, transparent);
13534
+ --db-glass-border: color-mix(in srgb, var(--border) 62%, transparent);
13535
+ --db-glass-blur: blur(18px) saturate(1.45);
13536
+ --db-glass-shadow:
13537
+ 0 1px 2px color-mix(in srgb, var(--fg) 6%, transparent),
13538
+ 0 8px 24px -12px color-mix(in srgb, var(--fg) 22%, transparent);
13539
+ --db-focus-ring: 0 0 0 3px color-mix(in srgb, var(--accent) 24%, transparent);
13540
+ }
13541
+
13542
+ /* ----- スリムなスクロールバー (ページ内のガラス質感を揃える) ----- */
13543
+ .db-root ::-webkit-scrollbar {
13544
+ width: 10px;
13545
+ height: 10px;
13546
+ }
13547
+ .db-root ::-webkit-scrollbar-thumb {
13548
+ background: color-mix(in srgb, var(--fg) 18%, transparent);
13549
+ border: 3px solid transparent;
13550
+ border-radius: 999px;
13551
+ background-clip: padding-box;
13552
+ }
13553
+ .db-root ::-webkit-scrollbar-thumb:hover {
13554
+ background: color-mix(in srgb, var(--fg) 32%, transparent);
13555
+ border: 3px solid transparent;
13556
+ background-clip: padding-box;
13557
+ }
13558
+ .db-root ::-webkit-scrollbar-track,
13559
+ .db-root ::-webkit-scrollbar-corner {
13560
+ background: transparent;
13561
+ }
13562
+
13563
+ /* ----- 最上段のタブバー (db / s3 / +) : フローティングピル ----- */
13564
+ .db-root .db-tabs-bar {
13565
+ background: transparent;
13566
+ border-bottom: 1px solid var(--db-glass-border);
13567
+ align-items: center;
13568
+ min-height: 40px;
13569
+ }
13570
+ .db-root .db-tabs-list {
13571
+ gap: 2px;
13572
+ padding: 4px 8px;
13573
+ /* 「+」を最後のタブの直後に寄せるため、中身の幅だけ取る (溢れたら
13574
+ この中で横スクロール)。flex:1 だと「+」が右端に吸い寄せられる。 */
13575
+ flex: 0 1 auto;
13576
+ min-width: 0;
13577
+ }
13578
+ .db-root .db-tabs-chip {
13579
+ border-right: none;
13580
+ border-radius: 8px;
13581
+ margin: 0;
13582
+ padding: 4px 8px 4px 12px;
13583
+ /* 非アクティブも「タブのかたまり」に見えるよう、うっすらした面と
13584
+ 輪郭を常時表示する (完全透明だとテキストの羅列に見える)。 */
13585
+ background: color-mix(in srgb, var(--fg) 4%, transparent);
13586
+ border: 1px solid var(--db-glass-border);
13587
+ transition:
13588
+ background-color 0.15s ease,
13589
+ box-shadow 0.15s ease,
13590
+ color 0.15s ease;
13591
+ }
13592
+ .db-root .db-tabs-chip:hover {
13593
+ background: color-mix(in srgb, var(--fg) 7%, transparent);
13594
+ }
13595
+ .db-root .db-tabs-chip.active {
13596
+ background: var(--db-glass-bg-strong);
13597
+ border-bottom: 1px solid var(--db-glass-border);
13598
+ margin-bottom: 0;
13599
+ box-shadow:
13600
+ inset 0 -2px 0 var(--accent),
13601
+ var(--db-glass-shadow);
13602
+ font-weight: 600;
13603
+ }
13604
+ .db-root .db-tabs-chip.drop-target {
13605
+ background: color-mix(in srgb, var(--accent) 12%, transparent);
13606
+ }
13607
+ .db-root .db-tabs-chip-close {
13608
+ border-radius: 6px;
13609
+ }
13610
+ /* 「+」はタブと混同しないよう、破線のゴーストボタンにする。 */
13611
+ .db-root .db-tabs-new-btn {
13612
+ border: 1px dashed color-mix(in srgb, var(--fg) 25%, transparent);
13613
+ border-radius: 8px;
13614
+ margin: 4px 8px 4px 4px;
13615
+ align-self: center;
13616
+ min-height: 26px;
13617
+ background: transparent;
13618
+ color: var(--fg-muted);
13619
+ transition:
13620
+ background-color 0.15s ease,
13621
+ border-color 0.15s ease,
13622
+ color 0.15s ease;
13623
+ }
13624
+ .db-root .db-tabs-new-btn:hover {
13625
+ background: color-mix(in srgb, var(--accent) 8%, transparent);
13626
+ border-color: color-mix(in srgb, var(--accent) 45%, transparent);
13627
+ color: var(--accent);
13628
+ }
13629
+
13630
+ /* ----- サイドバー: ガラス面 ----- */
13631
+ .db-root .db-sidebar {
13632
+ background: var(--db-glass-bg);
13633
+ -webkit-backdrop-filter: var(--db-glass-blur);
13634
+ backdrop-filter: var(--db-glass-blur);
13635
+ border-right: 1px solid var(--db-glass-border);
13636
+ }
13637
+ .db-root .db-toolbar,
13638
+ .db-root .db-icon-toolbar,
13639
+ .db-root .db-prefs-bar,
13640
+ .db-root .db-explorer-sidebar-slot {
13641
+ border-bottom-color: var(--db-glass-border);
13642
+ background: transparent;
13643
+ }
13644
+
13645
+ /* ----- 入力コントロール: ガラスの入力面 + ソフトなフォーカスリング ----- */
13646
+ .db-root .db-file-select,
13647
+ .db-root .db-table-filter,
13648
+ .db-root .s3-bucket-select,
13649
+ .db-root .s3-sort-select,
13650
+ .db-root .s3-search-input,
13651
+ .db-root .s3-edit-textarea,
13652
+ .db-root .s3-new-object-key {
13653
+ border: 1px solid var(--db-glass-border);
13654
+ border-radius: 8px;
13655
+ background: var(--db-glass-bg-strong);
13656
+ box-shadow: inset 0 1px 2px color-mix(in srgb, var(--fg) 4%, transparent);
13657
+ transition:
13658
+ border-color 0.15s ease,
13659
+ box-shadow 0.15s ease,
13660
+ background-color 0.15s ease;
13661
+ }
13662
+ .db-root .db-file-select:hover,
13663
+ .db-root .s3-bucket-select:hover,
13664
+ .db-root .s3-sort-select:hover,
13665
+ .db-root .s3-search-input:hover {
13666
+ border-color: color-mix(in srgb, var(--border-strong) 70%, transparent);
13667
+ }
13668
+ .db-root .db-file-select:focus,
13669
+ .db-root .db-table-filter:focus,
13670
+ .db-root .s3-bucket-select:focus,
13671
+ .db-root .s3-sort-select:focus,
13672
+ .db-root .s3-search-input:focus,
13673
+ .db-root .s3-edit-textarea:focus,
13674
+ .db-root .s3-new-object-key:focus {
13675
+ outline: none;
13676
+ border-color: var(--accent);
13677
+ box-shadow:
13678
+ inset 0 1px 2px color-mix(in srgb, var(--fg) 4%, transparent),
13679
+ var(--db-focus-ring);
13680
+ }
13681
+
13682
+ /* ----- ボタン: 丸みと立体感。primary はアクセントのグラデーション ----- */
13683
+ .db-root .db-btn {
13684
+ border: 1px solid var(--db-glass-border);
13685
+ border-radius: 8px;
13686
+ background: var(--db-glass-bg-strong);
13687
+ box-shadow: 0 1px 2px color-mix(in srgb, var(--fg) 6%, transparent);
13688
+ transition:
13689
+ background-color 0.15s ease,
13690
+ border-color 0.15s ease,
13691
+ box-shadow 0.15s ease,
13692
+ color 0.15s ease;
13693
+ }
13694
+ .db-root .db-btn:hover {
13695
+ background: var(--bg);
13696
+ border-color: color-mix(in srgb, var(--border-strong) 70%, transparent);
13697
+ box-shadow: 0 2px 6px color-mix(in srgb, var(--fg) 10%, transparent);
13698
+ }
13699
+ .db-root .db-btn:focus-visible {
13700
+ outline: none;
13701
+ box-shadow:
13702
+ 0 1px 2px color-mix(in srgb, var(--fg) 6%, transparent),
13703
+ var(--db-focus-ring);
13704
+ }
13705
+ .db-root .db-btn-primary,
13706
+ .db-root .db-btn.db-btn-primary {
13707
+ border-color: color-mix(in srgb, var(--accent-emph) 80%, transparent);
13708
+ background: linear-gradient(
13709
+ 180deg,
13710
+ color-mix(in srgb, var(--accent) 92%, #ffffff 8%) 0%,
13711
+ var(--accent-emph) 100%
13712
+ );
13713
+ color: #ffffff;
13714
+ box-shadow:
13715
+ 0 1px 2px color-mix(in srgb, var(--accent-emph) 45%, transparent),
13716
+ 0 6px 16px -8px color-mix(in srgb, var(--accent) 55%, transparent);
13717
+ }
13718
+ .db-root .db-btn-primary:hover,
13719
+ .db-root .db-btn.db-btn-primary:hover {
13720
+ background: linear-gradient(
13721
+ 180deg,
13722
+ var(--accent) 0%,
13723
+ var(--accent-emph) 100%
13724
+ );
13725
+ border-color: var(--accent-emph);
13726
+ }
13727
+
13728
+ /* ----- セグメントコントロール: ガラスのトラック + 浮き上がる選択片 ----- */
13729
+ .db-root .seg {
13730
+ border: 1px solid var(--db-glass-border);
13731
+ border-radius: 9px;
13732
+ background: color-mix(in srgb, var(--fg) 5%, transparent);
13733
+ padding: 2px;
13734
+ height: auto;
13735
+ overflow: visible;
13736
+ }
13737
+ .db-root .seg button {
13738
+ border-radius: 7px;
13739
+ padding: 3px 11px;
13740
+ transition:
13741
+ background-color 0.15s ease,
13742
+ box-shadow 0.15s ease,
13743
+ color 0.15s ease;
13744
+ }
13745
+ .db-root .seg button + button {
13746
+ border-left: none;
13747
+ }
13748
+ .db-root .seg button:hover {
13749
+ background: color-mix(in srgb, var(--fg) 6%, transparent);
13750
+ }
13751
+ .db-root .seg button.active {
13752
+ background: var(--db-glass-bg-strong);
13753
+ color: var(--fg);
13754
+ font-weight: 600;
13755
+ box-shadow:
13756
+ inset 0 0 0 1px var(--db-glass-border),
13757
+ 0 1px 3px color-mix(in srgb, var(--fg) 14%, transparent);
13758
+ }
13759
+
13760
+ /* ----- サイドバーのテーブルリスト: 丸みのある行 ----- */
13761
+ .db-root .db-table-item {
13762
+ border-left: none;
13763
+ border-radius: 8px;
13764
+ margin: 1px 6px;
13765
+ padding: 4px 6px 4px 11px; /* 旧 border-left 3px 分を padding に移し位置不変 */
13766
+ transition:
13767
+ background-color 0.12s ease,
13768
+ box-shadow 0.12s ease;
13769
+ }
13770
+ .db-root .db-table-item:hover {
13771
+ background: color-mix(in srgb, var(--fg) 5%, transparent);
13772
+ }
13773
+ .db-root .db-table-item.active {
13774
+ background: color-mix(in srgb, var(--accent) 12%, transparent);
13775
+ box-shadow: inset 2px 0 0 var(--accent);
13776
+ font-weight: 600;
13777
+ }
13778
+ .db-root .db-table-node {
13779
+ border-bottom-color: var(--db-glass-border);
13780
+ }
13781
+
13782
+ /* ----- S3: サイドバースロット ----- */
13783
+ .db-root .s3-sidebar-slot {
13784
+ padding: 10px;
13785
+ gap: 10px;
13786
+ }
13787
+ .db-root .s3-object-status {
13788
+ padding: 0 2px;
13789
+ min-height: 18px;
13790
+ font-size: 10.5px;
13791
+ letter-spacing: 0.02em;
13792
+ color: var(--fg-subtle);
13793
+ }
13794
+ .db-root .s3-object-status.warn {
13795
+ background: color-mix(in srgb, var(--attn) 12%, transparent);
13796
+ color: var(--attn);
13797
+ border-radius: 6px;
13798
+ padding: 2px 6px;
13799
+ }
13800
+
13801
+ /* ----- S3: オブジェクトリストをカード列に ----- */
13802
+ .db-root .s3-object-list {
13803
+ margin: 0;
13804
+ padding: 4px 2px;
13805
+ border-top: 1px solid var(--db-glass-border);
13806
+ }
13807
+ .db-root .s3-object-item {
13808
+ border-left: none;
13809
+ border-bottom: none;
13810
+ border-radius: 8px;
13811
+ padding: 7px 10px;
13812
+ margin: 1px 0;
13813
+ transition:
13814
+ background-color 0.12s ease,
13815
+ box-shadow 0.12s ease;
13816
+ }
13817
+ .db-root .s3-object-item:hover {
13818
+ background: color-mix(in srgb, var(--fg) 5%, transparent);
13819
+ }
13820
+ .db-root .s3-object-item.active {
13821
+ background: color-mix(in srgb, var(--accent) 10%, transparent);
13822
+ box-shadow:
13823
+ inset 0 0 0 1px color-mix(in srgb, var(--accent) 30%, transparent),
13824
+ inset 2px 0 0 var(--accent);
13825
+ }
13826
+ .db-root .s3-object-more-btn {
13827
+ margin: 4px 0 0;
13828
+ border: 1px solid var(--db-glass-border);
13829
+ border-radius: 8px;
13830
+ background: var(--db-glass-bg-strong);
13831
+ transition:
13832
+ background-color 0.15s ease,
13833
+ box-shadow 0.15s ease;
13834
+ }
13835
+ .db-root .s3-object-more-btn:hover {
13836
+ background: var(--bg);
13837
+ box-shadow: 0 2px 6px color-mix(in srgb, var(--fg) 10%, transparent);
13838
+ }
13839
+
13840
+ /* ----- S3: Explorer ツリーも同じ丸みの行に ----- */
13841
+ .db-root .s3-tree {
13842
+ margin: 0;
13843
+ padding: 4px 2px;
13844
+ border-top: 1px solid var(--db-glass-border);
13845
+ }
13846
+ .db-root .s3-tree .tree-dir {
13847
+ border-radius: 8px;
13848
+ }
13849
+ .db-root .s3-tree .tree-file {
13850
+ border-left: none;
13851
+ border-radius: 8px;
13852
+ padding-right: 10px;
13853
+ transition:
13854
+ background-color 0.12s ease,
13855
+ box-shadow 0.12s ease;
13856
+ }
13857
+ .db-root .s3-tree .tree-file.active {
13858
+ background: color-mix(in srgb, var(--accent) 10%, transparent);
13859
+ box-shadow:
13860
+ inset 0 0 0 1px color-mix(in srgb, var(--accent) 30%, transparent),
13861
+ inset 2px 0 0 var(--accent);
13862
+ }
13863
+
13864
+ /* ----- S3: kind バッジに微かな発光 ----- */
13865
+ .db-root .s3-kind-badge {
13866
+ height: 17px;
13867
+ letter-spacing: 0.04em;
13868
+ box-shadow: 0 1px 2px color-mix(in srgb, var(--fg) 6%, transparent);
13869
+ }
13870
+
13871
+ /* ----- S3: プレビューペイン。ヘッダを浮いたガラスカードに ----- */
13872
+ .db-root .s3-explorer,
13873
+ .db-root .db-main-content {
13874
+ background: transparent;
13875
+ }
13876
+ .db-root .s3-preview-pane {
13877
+ padding: 12px 14px;
13878
+ gap: 12px;
13879
+ }
13880
+ .db-root .s3-preview-header {
13881
+ border: 1px solid var(--db-glass-border);
13882
+ border-radius: 12px;
13883
+ background: var(--db-glass-bg-strong);
13884
+ -webkit-backdrop-filter: var(--db-glass-blur);
13885
+ backdrop-filter: var(--db-glass-blur);
13886
+ box-shadow: var(--db-glass-shadow);
13887
+ padding: 12px 16px;
13888
+ }
13889
+ .db-root .s3-preview-title {
13890
+ font-size: 13px;
13891
+ letter-spacing: 0.01em;
13892
+ }
13893
+ .db-root .s3-preview-body {
13894
+ flex: 1;
13895
+ min-height: 0;
13896
+ overflow: auto;
13897
+ border: 1px solid var(--db-glass-border);
13898
+ border-radius: 12px;
13899
+ background: var(--db-glass-bg-strong);
13900
+ box-shadow: var(--db-glass-shadow);
13901
+ padding: 16px;
13902
+ }
13903
+
13904
+ /* ----- ホバーのキーツールチップ: ガラスカード ----- */
13905
+ /* tooltip は document.body 直下に attach されるため .db-root の変数を
13906
+ 継承しない。各 var() にフォールバックを明示する。 */
13907
+ .s3-key-tooltip {
13908
+ background: var(--db-glass-bg-strong, color-mix(in srgb, var(--bg) 90%, transparent));
13909
+ -webkit-backdrop-filter: var(--db-glass-blur, blur(18px) saturate(1.45));
13910
+ backdrop-filter: var(--db-glass-blur, blur(18px) saturate(1.45));
13911
+ border: 1px solid var(--db-glass-border, color-mix(in srgb, var(--border) 62%, transparent));
13912
+ border-radius: 10px;
13913
+ box-shadow:
13914
+ 0 4px 12px color-mix(in srgb, var(--fg) 10%, transparent),
13915
+ 0 16px 40px -12px color-mix(in srgb, var(--fg) 30%, transparent);
13916
+ }
13917
+ .s3-key-tooltip .s3-key-tooltip-image {
13918
+ border-radius: 6px;
13919
+ }
13920
+ .s3-key-tooltip .s3-key-tooltip-meta {
13921
+ border-top-color: var(--db-glass-border);
13922
+ }
13923
+
13924
+ /* ----- ビュー切替タブ (Table / Query / ER ...) : ピルタブ ----- */
13925
+ .db-root .db-tab-bar {
13926
+ background: transparent;
13927
+ border-bottom: 1px solid var(--db-glass-border);
13928
+ gap: 2px;
13929
+ padding: 4px 10px;
13930
+ align-items: center;
13931
+ }
13932
+ .db-root .db-tab {
13933
+ border-bottom: none;
13934
+ margin-bottom: 0;
13935
+ border-radius: 8px;
13936
+ padding: 5px 14px;
13937
+ transition:
13938
+ background-color 0.15s ease,
13939
+ box-shadow 0.15s ease,
13940
+ color 0.15s ease;
13941
+ }
13942
+ .db-root .db-tab:hover {
13943
+ background: color-mix(in srgb, var(--fg) 6%, transparent);
13944
+ }
13945
+ .db-root .db-tab.active {
13946
+ background: var(--db-glass-bg-strong);
13947
+ box-shadow:
13948
+ inset 0 0 0 1px var(--db-glass-border),
13949
+ inset 0 -2px 0 var(--accent),
13950
+ var(--db-glass-shadow);
13951
+ font-weight: 600;
13952
+ }
13953
+
13954
+ /* ----- アイコンボタン / ツールボタンも丸みを統一 ----- */
13955
+ .db-root .db-icon-btn,
13956
+ .db-root .db-refresh-btn,
13957
+ .db-root .db-connection-action {
13958
+ border-radius: 8px;
13959
+ border-color: var(--db-glass-border);
13960
+ background: var(--db-glass-bg-strong);
13961
+ transition:
13962
+ background-color 0.15s ease,
13963
+ border-color 0.15s ease,
13964
+ box-shadow 0.15s ease,
13965
+ color 0.15s ease;
13966
+ }
13967
+ .db-root .db-icon-btn:hover,
13968
+ .db-root .db-refresh-btn:hover,
13969
+ .db-root .db-connection-action:hover {
13970
+ border-color: color-mix(in srgb, var(--border-strong) 70%, transparent);
13971
+ box-shadow: 0 2px 6px color-mix(in srgb, var(--fg) 10%, transparent);
13972
+ }
13973
+ .db-root .db-tool-btn {
13974
+ border-radius: 8px;
13975
+ border-color: var(--db-glass-border);
13976
+ transition:
13977
+ background-color 0.15s ease,
13978
+ box-shadow 0.15s ease,
13979
+ color 0.15s ease;
13980
+ }
13981
+
13982
+ /* ==========================================================================
13983
+ Datastore page — aurora & glow boost
13984
+ ガラステーマの上に「気分が上がる」演出層を重ねる。ゆっくり漂うオーロラ
13985
+ 背景と、アクティブ要素へのグロー。色はすべてテーマトークン由来で
13986
+ ライト/ダークに追従。レイアウトに影響する寸法は一切変更しない。
13987
+ ========================================================================== */
13988
+
13989
+ /* ----- 漂うオーロラ。キャンバス (::before) を stacking context の最背面に ----- */
13990
+ .db-root {
13991
+ position: relative;
13992
+ isolation: isolate;
13993
+ }
13994
+ .db-root::before {
13995
+ content: "";
13996
+ position: absolute;
13997
+ inset: -12%;
13998
+ z-index: -1;
13999
+ pointer-events: none;
14000
+ background:
14001
+ radial-gradient(
14002
+ 38% 42% at 82% 4%,
14003
+ color-mix(in srgb, var(--done) 20%, transparent),
14004
+ transparent 70%
14005
+ ),
14006
+ radial-gradient(
14007
+ 36% 42% at 6% 98%,
14008
+ color-mix(in srgb, var(--accent) 22%, transparent),
14009
+ transparent 70%
14010
+ ),
14011
+ radial-gradient(
14012
+ 26% 30% at 2% 2%,
14013
+ color-mix(in srgb, var(--success) 12%, transparent),
14014
+ transparent 70%
14015
+ ),
14016
+ radial-gradient(
14017
+ 30% 34% at 98% 90%,
14018
+ color-mix(in srgb, var(--attn) 10%, transparent),
14019
+ transparent 70%
14020
+ );
14021
+ animation: db-aurora-drift 30s ease-in-out infinite alternate;
14022
+ will-change: transform;
14023
+ }
14024
+ @keyframes db-aurora-drift {
14025
+ from {
14026
+ transform: translate3d(-1.5%, -1%, 0) scale(1);
14027
+ }
14028
+ to {
14029
+ transform: translate3d(1.5%, 1.5%, 0) scale(1.05);
14030
+ }
14031
+ }
14032
+ @media (prefers-reduced-motion: reduce) {
14033
+ .db-root::before {
14034
+ animation: none;
14035
+ }
14036
+ }
14037
+
14038
+ /* ----- アクティブなタブ/チップにアクセントのグロー ----- */
14039
+ .db-root .db-tabs-chip.active {
14040
+ box-shadow:
14041
+ inset 0 0 0 1px var(--db-glass-border),
14042
+ inset 0 -2px 0 var(--accent),
14043
+ 0 0 18px -6px color-mix(in srgb, var(--accent) 55%, transparent),
14044
+ var(--db-glass-shadow);
14045
+ }
14046
+ .db-root .db-tab.active {
14047
+ box-shadow:
14048
+ inset 0 0 0 1px var(--db-glass-border),
14049
+ inset 0 -2px 0 var(--accent),
14050
+ 0 0 18px -6px color-mix(in srgb, var(--accent) 55%, transparent),
14051
+ var(--db-glass-shadow);
14052
+ }
14053
+
14054
+ /* ----- primary ボタン: 光沢 + 強めの発光 ----- */
14055
+ .db-root .db-btn-primary,
14056
+ .db-root .db-btn.db-btn-primary {
14057
+ text-shadow: 0 1px 1px color-mix(in srgb, #000000 22%, transparent);
14058
+ box-shadow:
14059
+ inset 0 1px 0 color-mix(in srgb, #ffffff 28%, transparent),
14060
+ 0 1px 2px color-mix(in srgb, var(--accent-emph) 45%, transparent),
14061
+ 0 8px 20px -6px color-mix(in srgb, var(--accent) 60%, transparent);
14062
+ }
14063
+
14064
+ /* ----- テーブルアイコン: アクセント→パープルのグラデーション ----- */
14065
+ .db-root .db-table-icon {
14066
+ background: linear-gradient(
14067
+ 150deg,
14068
+ var(--accent) 0%,
14069
+ color-mix(in srgb, var(--done) 70%, var(--accent)) 100%
14070
+ );
14071
+ box-shadow: 0 2px 8px -2px color-mix(in srgb, var(--accent) 60%, transparent);
14072
+ }
14073
+ .db-root .db-table-item[data-type="view"] .db-table-icon {
14074
+ background: linear-gradient(
14075
+ 150deg,
14076
+ var(--scope-accent) 0%,
14077
+ color-mix(in srgb, var(--attn) 70%, var(--scope-accent)) 100%
14078
+ );
14079
+ box-shadow: 0 2px 8px -2px color-mix(in srgb, var(--scope-accent) 60%, transparent);
14080
+ }
14081
+
14082
+ /* ----- データグリッド: ガラス化 + 選択/ホバーのグロー ----- */
14083
+ .db-root .db-grid-filter-bar {
14084
+ background: transparent;
14085
+ border-bottom: 1px solid var(--db-glass-border);
14086
+ }
14087
+ .db-root .db-grid-filter-input {
14088
+ border: 1px solid var(--db-glass-border);
14089
+ border-radius: 8px;
14090
+ background: var(--db-glass-bg-strong);
14091
+ transition:
14092
+ border-color 0.15s ease,
14093
+ box-shadow 0.15s ease;
14094
+ }
14095
+ .db-root .db-grid-filter-input:focus {
14096
+ outline: none;
14097
+ border-color: var(--accent);
14098
+ box-shadow: var(--db-focus-ring);
14099
+ }
14100
+ .db-root .db-grid-header-wrap {
14101
+ background: var(--db-glass-bg);
14102
+ -webkit-backdrop-filter: var(--db-glass-blur);
14103
+ backdrop-filter: var(--db-glass-blur);
14104
+ border-bottom: 1px solid var(--db-glass-border);
14105
+ }
14106
+ .db-root .db-grid-header-cell {
14107
+ transition:
14108
+ background-color 0.12s ease,
14109
+ box-shadow 0.12s ease;
14110
+ }
14111
+ .db-root .db-grid-header-cell:hover {
14112
+ background: color-mix(in srgb, var(--fg) 5%, transparent);
14113
+ }
14114
+ .db-root .db-grid-header-cell.sorted {
14115
+ background: color-mix(in srgb, var(--accent) 10%, transparent);
14116
+ box-shadow: inset 0 -2px 0 var(--accent);
14117
+ }
14118
+ .db-root .db-grid-header-cell.sorted .db-grid-header-label {
14119
+ color: var(--accent);
14120
+ }
14121
+ .db-root .db-grid-row.alt {
14122
+ background: color-mix(in srgb, var(--fg) 3%, transparent);
14123
+ }
14124
+ .db-root .db-grid-row:hover {
14125
+ background: color-mix(in srgb, var(--accent) 7%, transparent);
14126
+ }
14127
+ .db-root .db-grid-row.selected {
14128
+ background: color-mix(in srgb, var(--accent) 13%, transparent) !important;
14129
+ outline: none;
14130
+ box-shadow:
14131
+ inset 2px 0 0 var(--accent),
14132
+ inset 0 0 0 1px color-mix(in srgb, var(--accent) 30%, transparent);
14133
+ }
14134
+ .db-root .db-grid-rownum-header,
14135
+ .db-root .db-grid-rownum {
14136
+ background: transparent;
14137
+ }
14138
+ .db-root .db-grid-status {
14139
+ background: transparent;
14140
+ border-top: 1px solid var(--db-glass-border);
14141
+ letter-spacing: 0.02em;
14142
+ }
14143
+
14144
+ /* ----- クエリ履歴 / ログ dock: ガラス + ピルタブ ----- */
14145
+ .db-root .db-history-pane {
14146
+ background: var(--db-glass-bg);
14147
+ -webkit-backdrop-filter: var(--db-glass-blur);
14148
+ backdrop-filter: var(--db-glass-blur);
14149
+ border-top: 1px solid var(--db-glass-border);
14150
+ }
14151
+ .db-root .db-history-dock {
14152
+ background: transparent;
14153
+ border-top: 1px solid var(--db-glass-border);
14154
+ gap: 2px;
14155
+ padding: 2px 8px;
14156
+ align-items: center;
14157
+ }
14158
+ .db-root .db-history-dock-tab {
14159
+ border-radius: 7px;
14160
+ padding: 3px 12px;
14161
+ transition:
14162
+ background-color 0.15s ease,
14163
+ box-shadow 0.15s ease,
14164
+ color 0.15s ease;
14165
+ }
14166
+ .db-root .db-history-dock-tab:hover {
14167
+ background: color-mix(in srgb, var(--fg) 6%, transparent);
14168
+ }
14169
+ .db-root .db-history-dock.open .db-history-dock-tab.active {
14170
+ box-shadow:
14171
+ inset 0 0 0 1px var(--db-glass-border),
14172
+ inset 0 -2px 0 var(--accent),
14173
+ 0 0 14px -6px color-mix(in srgb, var(--accent) 50%, transparent);
14174
+ background: var(--db-glass-bg-strong);
14175
+ }
14176
+
14177
+ /* ----- 詳細/関連パネルの境界をヘアラインに ----- */
14178
+ .db-root .db-grid-detail-panel,
14179
+ .db-root .db-related-panel {
14180
+ border-color: var(--db-glass-border);
14181
+ }
14182
+
14183
+ /* ----- グリッド UX: セル詳細パネルと列フィルタ ----- */
14184
+ .db-root .db-grid-detail-panel {
14185
+ border-top: 1px solid var(--db-glass-border);
14186
+ background: var(--db-glass-bg);
14187
+ -webkit-backdrop-filter: var(--db-glass-blur);
14188
+ backdrop-filter: var(--db-glass-blur);
14189
+ }
14190
+ .db-root .db-grid-detail-header {
14191
+ background: transparent;
14192
+ border-bottom: 1px solid var(--db-glass-border);
14193
+ padding: 6px 12px;
14194
+ gap: 8px;
14195
+ }
14196
+ .db-root .db-grid-detail-title {
14197
+ flex: 1;
14198
+ min-width: 0;
14199
+ overflow: hidden;
14200
+ text-overflow: ellipsis;
14201
+ white-space: nowrap;
14202
+ letter-spacing: 0.01em;
14203
+ }
14204
+ .db-root .db-grid-detail-content {
14205
+ padding: 12px 16px;
14206
+ }
14207
+ .db-root .db-grid-detail-json {
14208
+ border: 1px solid var(--db-glass-border);
14209
+ border-radius: 8px;
14210
+ background: var(--db-glass-bg-strong);
14211
+ padding: 10px 12px;
14212
+ }
14213
+ /* 列ごとのフィルタ入力。未フォーカス時は淡く、フォーカスでリング。 */
14214
+ .db-root .db-grid-col-filter {
14215
+ border: 1px solid transparent;
14216
+ border-radius: 6px;
14217
+ background: color-mix(in srgb, var(--fg) 4%, transparent);
14218
+ transition:
14219
+ background-color 0.15s ease,
14220
+ border-color 0.15s ease,
14221
+ box-shadow 0.15s ease;
14222
+ }
14223
+ .db-root .db-grid-col-filter:hover {
14224
+ background: var(--db-glass-bg-strong);
14225
+ border-color: var(--db-glass-border);
14226
+ }
14227
+ .db-root .db-grid-col-filter:focus {
14228
+ outline: none;
14229
+ background: var(--db-glass-bg-strong);
14230
+ border-color: var(--accent);
14231
+ box-shadow: var(--db-focus-ring);
14232
+ }
14233
+ .db-root .db-grid-filter-spacer {
14234
+ background: transparent;
14235
+ }