@shiyuphan/follow-me 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/ui/style.css CHANGED
@@ -4,7 +4,7 @@
4
4
  --panel: #f6f7f9;
5
5
  --border: #d8dce2;
6
6
  --text: #1c2026;
7
- --muted: #6a7280;
7
+ --muted: #5f6774;
8
8
  --accent: #2459d6;
9
9
  --accent-text: #ffffff;
10
10
  --add-bg: #e3f6e8;
@@ -12,8 +12,24 @@
12
12
  --del-bg: #fde7e7;
13
13
  --del-text: #8a1c1c;
14
14
  --select-bg: #fff3c4;
15
+ --select-edge: #b38600;
15
16
  --comment-bg: #eef3ff;
17
+ --sev-blocker: #b42318;
18
+ --sev-major: #8a5300;
19
+ --sev-minor: #5f6774;
20
+ --question-bg: #eef1f4;
21
+ --question-edge: #5f6774;
22
+ --tok-comment: #5b6472;
23
+ --tok-keyword: #a8227e;
24
+ --tok-string: #8a4b08;
25
+ --tok-number: #00687d;
26
+ --tok-function: #1a4fc4;
27
+ --tok-type: #6b3fc0;
28
+ --tok-property: #3b5f8f;
29
+ --tok-tag: #b0261e;
16
30
  --font-mono: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
31
+ --gutter: 9ch;
32
+ --sidebar: 300px;
17
33
  }
18
34
 
19
35
  @media (prefers-color-scheme: dark) {
@@ -30,7 +46,21 @@
30
46
  --del-bg: #3a1a1c;
31
47
  --del-text: #ff9b9b;
32
48
  --select-bg: #4a4012;
49
+ --select-edge: #e0b830;
33
50
  --comment-bg: #1b2538;
51
+ --sev-blocker: #ff9b9b;
52
+ --sev-major: #f0b64a;
53
+ --sev-minor: #9aa3b2;
54
+ --question-bg: #222831;
55
+ --question-edge: #8d96a5;
56
+ --tok-comment: #adb5c3;
57
+ --tok-keyword: #ff8fd6;
58
+ --tok-string: #f0c674;
59
+ --tok-number: #5fd8ee;
60
+ --tok-function: #8fb4ff;
61
+ --tok-type: #c3a6ff;
62
+ --tok-property: #9db7d8;
63
+ --tok-tag: #ff9a8f;
34
64
  }
35
65
  }
36
66
 
@@ -63,6 +93,43 @@ body {
63
93
  background: var(--panel);
64
94
  }
65
95
 
96
+ .banner {
97
+ display: flex;
98
+ align-items: center;
99
+ gap: 12px;
100
+ padding: 6px 16px;
101
+ border-bottom: 1px solid var(--border);
102
+ background: var(--comment-bg);
103
+ }
104
+
105
+ .banner[hidden] {
106
+ display: none;
107
+ }
108
+
109
+ .banner span {
110
+ flex: 1;
111
+ }
112
+
113
+ .sessions {
114
+ display: flex;
115
+ gap: 8px;
116
+ font-size: 13px;
117
+ }
118
+
119
+ .sessions[hidden] {
120
+ display: none;
121
+ }
122
+
123
+ .sessions a {
124
+ color: var(--accent);
125
+ }
126
+
127
+ .sessions a[aria-current="page"] {
128
+ color: var(--text);
129
+ font-weight: 600;
130
+ text-decoration: none;
131
+ }
132
+
66
133
  .status {
67
134
  margin-left: auto;
68
135
  color: var(--del-text);
@@ -98,55 +165,81 @@ button.link {
98
165
  .layout {
99
166
  flex: 1;
100
167
  display: grid;
101
- grid-template-columns: 300px 1fr;
168
+ grid-template-columns: var(--sidebar) minmax(0, 1fr) auto;
102
169
  min-height: 0;
103
170
  }
104
171
 
105
- .sidebar {
172
+ .diagram-panel {
173
+ width: 380px;
106
174
  display: flex;
107
175
  flex-direction: column;
108
- border-right: 1px solid var(--border);
176
+ border-left: 1px solid var(--border);
109
177
  background: var(--panel);
110
178
  min-height: 0;
111
179
  }
112
180
 
113
- .commit-list {
114
- list-style: none;
115
- margin: 0;
116
- padding: 0;
117
- overflow-y: auto;
118
- flex: 1;
181
+ .diagram-panel[hidden] {
182
+ display: none;
183
+ }
184
+
185
+ .diagram-panel.collapsed {
186
+ width: auto;
119
187
  }
120
188
 
121
- .commit-list li {
189
+ .diagram-head {
122
190
  display: flex;
191
+ align-items: center;
123
192
  gap: 8px;
124
193
  padding: 8px 12px;
125
- cursor: pointer;
126
- border-left: 3px solid transparent;
194
+ font-size: 13px;
195
+ overflow: hidden;
196
+ white-space: nowrap;
127
197
  }
128
198
 
129
- .commit-list li:hover {
130
- background: var(--bg);
199
+ #diagram-toggle::before {
200
+ content: "▾ ";
131
201
  }
132
202
 
133
- .commit-list li.selected {
134
- background: var(--bg);
135
- border-left-color: var(--accent);
136
- font-weight: 600;
203
+ .diagram-panel.collapsed #diagram-toggle::before {
204
+ content: "◂ ";
137
205
  }
138
206
 
139
- .commit-list .index {
140
- color: var(--muted);
141
- min-width: 2ch;
142
- text-align: right;
207
+ .diagram-body {
208
+ flex: 1;
209
+ overflow: auto;
210
+ padding: 8px 12px 16px;
143
211
  }
144
212
 
145
- .commit-list .title {
213
+ .diagram-panel.collapsed .diagram-body,
214
+ .diagram-panel.collapsed #diagram-from {
215
+ display: none;
216
+ }
217
+
218
+ .diagram-body svg {
219
+ max-width: 100%;
220
+ height: auto;
221
+ }
222
+
223
+ .diagram-error {
224
+ color: var(--del-text);
225
+ white-space: pre-wrap;
226
+ font-size: 12px;
227
+ }
228
+
229
+ .sidebar {
230
+ display: flex;
231
+ flex-direction: column;
232
+ border-right: 1px solid var(--border);
233
+ background: var(--panel);
234
+ min-height: 0;
235
+ }
236
+
237
+ .commit-list {
238
+ list-style: none;
239
+ margin: 0;
240
+ padding: 0;
241
+ overflow-y: auto;
146
242
  flex: 1;
147
- overflow: hidden;
148
- text-overflow: ellipsis;
149
- white-space: nowrap;
150
243
  }
151
244
 
152
245
  .badge {
@@ -167,11 +260,127 @@ button.link {
167
260
  padding: 16px 24px 64px;
168
261
  }
169
262
 
170
- .commit-head h2 {
171
- margin: 0 0 4px;
263
+ .stage {
264
+ position: sticky;
265
+ top: -16px;
266
+ z-index: 2;
267
+ margin: -16px -24px 8px;
268
+ padding: 10px 24px 8px;
269
+ background: var(--bg);
270
+ border-bottom: 1px solid var(--border);
271
+ }
272
+
273
+ .stage h2 {
274
+ margin: 0;
275
+ font-size: 15px;
276
+ overflow: hidden;
277
+ text-overflow: ellipsis;
278
+ white-space: nowrap;
279
+ }
280
+
281
+ .stage h2:focus {
282
+ outline: none;
283
+ }
284
+
285
+ .stage .part {
286
+ font-weight: 400;
287
+ color: var(--muted);
288
+ }
289
+
290
+ .play {
291
+ display: inline-flex;
292
+ align-items: center;
293
+ justify-content: center;
294
+ gap: 6px;
295
+ width: 92px;
296
+ }
297
+
298
+ .play .icon {
299
+ width: 1.2em;
300
+ font-size: 12px;
301
+ text-align: center;
302
+ }
303
+
304
+ .steps,
305
+ .strip {
306
+ margin: 0;
307
+ padding: 0;
308
+ border: none;
309
+ min-inline-size: 0;
310
+ }
311
+
312
+ .steps {
313
+ display: flex;
314
+ gap: 4px;
315
+ }
316
+
317
+ .strip {
318
+ flex: 1 1 160px;
319
+ min-width: 120px;
320
+ display: flex;
321
+ gap: 3px;
322
+ height: 14px;
323
+ }
324
+
325
+ .strip .seg {
326
+ position: relative;
327
+ flex-basis: 0;
328
+ min-width: 6px;
329
+ padding: 0;
330
+ border: none;
331
+ border-radius: 3px;
332
+ background: var(--border);
333
+ overflow: hidden;
334
+ }
335
+
336
+ .strip .seg.here {
337
+ outline: 1px solid var(--accent);
338
+ }
339
+
340
+ .strip .fill {
341
+ position: absolute;
342
+ inset: 0 auto 0 0;
343
+ background: var(--accent);
344
+ }
345
+
346
+ .keys {
347
+ border: 1px solid var(--border);
348
+ border-radius: 8px;
349
+ background: var(--bg);
350
+ color: var(--text);
351
+ padding: 16px 20px;
352
+ min-width: 360px;
353
+ }
354
+
355
+ .keys::backdrop {
356
+ background: rgb(0 0 0 / 0.3);
357
+ }
358
+
359
+ .keys h2 {
360
+ margin: 0 0 8px;
172
361
  font-size: 16px;
173
362
  }
174
363
 
364
+ .keys dl {
365
+ display: grid;
366
+ grid-template-columns: auto 1fr;
367
+ gap: 6px 16px;
368
+ margin: 0 0 12px;
369
+ }
370
+
371
+ .keys dd {
372
+ margin: 0;
373
+ }
374
+
375
+ kbd {
376
+ font: 12px var(--font-mono);
377
+ padding: 1px 5px;
378
+ border: 1px solid var(--border);
379
+ border-bottom-width: 2px;
380
+ border-radius: 4px;
381
+ background: var(--panel);
382
+ }
383
+
175
384
  .message {
176
385
  font-family: var(--font-mono);
177
386
  white-space: pre-wrap;
@@ -236,25 +445,52 @@ button.link {
236
445
  }
237
446
 
238
447
  .dl .gutter {
239
- width: 4ch;
240
- text-align: right;
241
- padding-right: 6px;
448
+ position: relative;
449
+ display: flex;
450
+ flex: none;
451
+ width: var(--gutter);
242
452
  color: var(--muted);
243
453
  user-select: none;
244
454
  }
245
455
 
456
+ .dl .ln {
457
+ width: 50%;
458
+ padding-right: 6px;
459
+ text-align: right;
460
+ }
461
+
462
+ .add-comment {
463
+ position: absolute;
464
+ left: 0;
465
+ top: 0;
466
+ width: 1.6em;
467
+ height: 1.5em;
468
+ padding: 0;
469
+ border: none;
470
+ border-radius: 4px;
471
+ background: var(--accent);
472
+ color: var(--accent-text);
473
+ font: 600 12px / 1.5em var(--font-mono);
474
+ text-align: center;
475
+ opacity: 0;
476
+ }
477
+
478
+ .dl.mine:hover .add-comment,
479
+ .dl.mine:focus-within .add-comment,
480
+ .dl.mine:focus .add-comment {
481
+ opacity: 1;
482
+ }
483
+
484
+ .narration.notice {
485
+ border-left-color: var(--select-edge);
486
+ background: var(--select-bg);
487
+ }
488
+
246
489
  .dl .op {
247
490
  width: 2ch;
248
491
  user-select: none;
249
492
  }
250
493
 
251
- .dl .label {
252
- margin-left: 12px;
253
- font-size: 11px;
254
- color: var(--muted);
255
- font-style: italic;
256
- }
257
-
258
494
  .dl.add.mine {
259
495
  background: var(--add-bg);
260
496
  color: var(--add-text);
@@ -265,19 +501,35 @@ button.link {
265
501
  color: var(--del-text);
266
502
  }
267
503
 
268
- .dl.other {
269
- opacity: 0.4;
504
+ .dl.mine {
505
+ cursor: pointer;
270
506
  }
271
507
 
272
- .dl.mine.pickable {
273
- cursor: pointer;
508
+ .fold {
509
+ display: block;
510
+ width: 100%;
511
+ padding: 1px 10px 1px calc(var(--gutter) + 2ch);
512
+ border: none;
513
+ border-radius: 0;
514
+ border-block: 1px dashed var(--border);
515
+ background: var(--panel);
516
+ color: var(--muted);
517
+ font: inherit;
518
+ text-align: left;
274
519
  }
275
520
 
276
- .dl.picked {
277
- outline: 2px solid var(--accent);
278
- outline-offset: -2px;
521
+ .fold:hover {
522
+ color: var(--accent);
523
+ }
524
+
525
+ .unit-head .scope {
526
+ color: var(--text);
527
+ }
528
+
529
+ .dl.mine.picked {
279
530
  background: var(--select-bg);
280
531
  color: var(--text);
532
+ box-shadow: inset 3px 0 0 var(--select-edge);
281
533
  }
282
534
 
283
535
  .comments {
@@ -322,11 +574,24 @@ textarea {
322
574
  margin-top: 4px;
323
575
  }
324
576
 
577
+ .box .hint {
578
+ align-self: center;
579
+ color: var(--muted);
580
+ font-size: 12px;
581
+ }
582
+
583
+ .diff .box {
584
+ margin: 4px 10px 8px calc(var(--gutter) + 2ch);
585
+ font-family: system-ui, sans-serif;
586
+ }
587
+
325
588
  .done {
326
589
  position: fixed;
327
590
  inset: 0;
328
- display: grid;
329
- place-items: center;
591
+ z-index: 10;
592
+ display: flex;
593
+ align-items: center;
594
+ justify-content: center;
330
595
  background: var(--bg);
331
596
  font-size: 16px;
332
597
  padding: 24px;
@@ -346,9 +611,10 @@ textarea {
346
611
 
347
612
  .player {
348
613
  display: flex;
349
- flex-wrap: wrap;
614
+ flex-wrap: nowrap;
350
615
  align-items: center;
351
- gap: 8px 12px;
616
+ gap: 12px;
617
+ white-space: nowrap;
352
618
  padding: 6px 16px;
353
619
  border-bottom: 1px solid var(--border);
354
620
  background: var(--panel);
@@ -381,51 +647,685 @@ select:disabled {
381
647
  cursor: default;
382
648
  }
383
649
 
384
- .caption {
385
- flex: 1 1 320px;
386
- margin: 0;
650
+ .narration {
651
+ margin: 8px 0;
652
+ padding: 8px 14px;
653
+ border-left: 3px solid var(--accent);
654
+ border-radius: 0 6px 6px 0;
655
+ background: var(--comment-bg);
656
+ font:
657
+ 15px / 1.5 system-ui,
658
+ sans-serif;
659
+ white-space: pre-wrap;
660
+ }
661
+
662
+ .diff .narration {
663
+ margin: 6px 10px;
664
+ }
665
+
666
+ .narration.label {
667
+ border-left-color: var(--border);
668
+ background: var(--panel);
669
+ color: var(--muted);
670
+ font-size: 13px;
671
+ }
672
+
673
+ /* Every token colour keeps 4.5:1 on the page, the add and remove tints and the picked tint. */
674
+ .tok-comment {
675
+ color: var(--tok-comment);
387
676
  font-style: italic;
388
- color: var(--text);
677
+ }
678
+
679
+ .tok-keyword {
680
+ color: var(--tok-keyword);
681
+ }
682
+
683
+ .tok-string {
684
+ color: var(--tok-string);
685
+ }
686
+
687
+ .tok-number {
688
+ color: var(--tok-number);
689
+ }
690
+
691
+ .tok-function {
692
+ color: var(--tok-function);
693
+ }
694
+
695
+ .tok-type {
696
+ color: var(--tok-type);
697
+ }
698
+
699
+ .tok-property {
700
+ color: var(--tok-property);
701
+ }
702
+
703
+ .tok-tag {
704
+ color: var(--tok-tag);
389
705
  }
390
706
 
391
707
  .dl.pending {
392
708
  display: none;
393
709
  }
394
710
 
395
- .dl.gone {
396
- opacity: 0;
397
- max-height: 0;
398
- overflow: hidden;
399
- transition:
400
- opacity 0.5s ease,
401
- max-height 0.3s ease 0.5s;
711
+ .dl.del .text {
712
+ text-decoration: line-through;
402
713
  }
403
714
 
404
- .dl.current {
405
- outline: 2px solid var(--accent);
406
- outline-offset: -2px;
407
- animation: type-in 0.25s steps(16, end);
715
+ .dl.in-chunk,
716
+ .unit.in-chunk .card {
717
+ box-shadow: inset 3px 0 0 var(--accent);
718
+ animation: reveal 0.2s ease-out;
408
719
  }
409
720
 
410
- .dl.gone.current {
411
- opacity: 0.45;
412
- max-height: 2em;
413
- text-decoration: line-through;
721
+ .ph {
722
+ padding: 0 10px 0 calc(var(--gutter) + 2ch);
723
+ color: var(--muted);
724
+ font-style: italic;
725
+ background: var(--panel);
726
+ }
727
+
728
+ .ph.in-chunk {
729
+ box-shadow: inset 3px 0 0 var(--accent);
730
+ }
731
+
732
+ .countdown {
733
+ margin: 6px 0 0;
734
+ color: var(--muted);
735
+ font-size: 13px;
736
+ }
737
+
738
+ .countdown .bar {
739
+ display: block;
740
+ height: 2px;
741
+ margin-top: 4px;
742
+ background: var(--accent);
743
+ transform-origin: left;
744
+ animation: countdown linear forwards;
745
+ }
746
+
747
+ .countdown.paused .bar {
748
+ animation-play-state: paused;
749
+ }
750
+
751
+ @keyframes reveal {
752
+ from {
753
+ opacity: 0;
754
+ }
755
+ to {
756
+ opacity: 1;
757
+ }
414
758
  }
415
759
 
416
- @keyframes type-in {
760
+ @keyframes countdown {
417
761
  from {
418
- clip-path: inset(0 100% 0 0);
762
+ transform: scaleX(1);
419
763
  }
420
764
  to {
421
- clip-path: inset(0 0 0 0);
765
+ transform: scaleX(0);
422
766
  }
423
767
  }
424
768
 
425
769
  @media (prefers-reduced-motion: reduce) {
426
- .dl.current,
427
- .dl.gone {
770
+ .dl.in-chunk,
771
+ .unit.in-chunk .card {
428
772
  animation: none;
429
- transition: none;
430
773
  }
431
774
  }
775
+
776
+ :focus-visible {
777
+ outline: 2px solid var(--accent);
778
+ outline-offset: -2px;
779
+ }
780
+
781
+ .status.error::before {
782
+ content: "⚠ ";
783
+ }
784
+
785
+ body.index {
786
+ display: block;
787
+ height: auto;
788
+ min-height: 100vh;
789
+ padding: 0;
790
+ }
791
+
792
+ .index-main {
793
+ max-width: 880px;
794
+ margin: 0 auto;
795
+ padding: 24px;
796
+ }
797
+
798
+ .index-main h1 {
799
+ font-size: 20px;
800
+ margin: 8px 0 16px;
801
+ }
802
+
803
+ .session-index {
804
+ list-style: none;
805
+ margin: 0;
806
+ padding: 0;
807
+ border: 1px solid var(--border);
808
+ border-radius: 8px;
809
+ }
810
+
811
+ .session-index li {
812
+ display: grid;
813
+ grid-template-columns: 1fr auto;
814
+ gap: 2px 16px;
815
+ padding: 12px 16px;
816
+ border-top: 1px solid var(--border);
817
+ }
818
+
819
+ .session-index li:first-child {
820
+ border-top: none;
821
+ }
822
+
823
+ .session-index .session {
824
+ color: var(--text);
825
+ font-weight: 600;
826
+ text-decoration: none;
827
+ }
828
+
829
+ .session-index .branch {
830
+ color: var(--accent);
831
+ }
832
+
833
+ .session-index .session:hover .branch {
834
+ text-decoration: underline;
835
+ }
836
+
837
+ .session-index .path {
838
+ grid-column: 1 / -1;
839
+ font: 12px var(--font-mono);
840
+ }
841
+
842
+ .mode {
843
+ justify-self: end;
844
+ padding: 0 8px;
845
+ border-radius: 10px;
846
+ font-size: 12px;
847
+ background: var(--comment-bg);
848
+ color: var(--text);
849
+ }
850
+
851
+ .empty {
852
+ margin-top: 15vh;
853
+ text-align: center;
854
+ }
855
+
856
+ .empty a,
857
+ .done-card a {
858
+ color: var(--accent);
859
+ }
860
+
861
+ .empty code,
862
+ .done-card code {
863
+ font-family: var(--font-mono);
864
+ background: var(--panel);
865
+ padding: 1px 6px;
866
+ border-radius: 4px;
867
+ }
868
+
869
+ .done-card {
870
+ width: min(520px, 100%);
871
+ padding: 24px 28px;
872
+ border: 1px solid var(--border);
873
+ border-radius: 10px;
874
+ background: var(--panel);
875
+ text-align: left;
876
+ }
877
+
878
+ .done-card h1 {
879
+ margin: 0 0 4px;
880
+ font-size: 20px;
881
+ }
882
+
883
+ .done-card h1:focus {
884
+ outline: none;
885
+ }
886
+
887
+ .done-card p {
888
+ margin: 8px 0;
889
+ }
890
+
891
+ .done-card .next {
892
+ display: flex;
893
+ align-items: center;
894
+ gap: 8px;
895
+ }
896
+
897
+ #confirm-end .row {
898
+ display: flex;
899
+ gap: 8px;
900
+ }
901
+
902
+ .commit-row {
903
+ display: flex;
904
+ align-items: flex-start;
905
+ gap: 8px;
906
+ width: 100%;
907
+ padding: 6px 12px;
908
+ border: none;
909
+ border-left: 3px solid transparent;
910
+ border-radius: 0;
911
+ background: none;
912
+ color: inherit;
913
+ text-align: left;
914
+ }
915
+
916
+ .commit-row:hover,
917
+ .commit-list li.selected .commit-row {
918
+ background: var(--bg);
919
+ }
920
+
921
+ .commit-list li.selected .commit-row {
922
+ border-left-color: var(--accent);
923
+ }
924
+
925
+ .commit-list .title {
926
+ flex: 1;
927
+ min-width: 0;
928
+ white-space: normal;
929
+ overflow-wrap: anywhere;
930
+ font-size: 13px;
931
+ line-height: 1.35;
932
+ display: -webkit-box;
933
+ -webkit-box-orient: vertical;
934
+ -webkit-line-clamp: 2;
935
+ line-clamp: 2;
936
+ overflow: hidden;
937
+ }
938
+
939
+ .commit-list li.selected .title {
940
+ -webkit-line-clamp: unset;
941
+ line-clamp: none;
942
+ }
943
+
944
+ .commit-list .index,
945
+ .commit-list .mark,
946
+ .commit-list .badge {
947
+ line-height: 1.35;
948
+ margin-top: 1px;
949
+ }
950
+
951
+ .commit-list .index {
952
+ color: var(--muted);
953
+ min-width: 2ch;
954
+ text-align: right;
955
+ font-size: 13px;
956
+ }
957
+
958
+ .commit-list .mark {
959
+ color: var(--accent);
960
+ font-size: 12px;
961
+ }
962
+
963
+ .commits-toggle,
964
+ .rail-tip {
965
+ display: none;
966
+ }
967
+
968
+ @media (max-width: 1199px) {
969
+ :root {
970
+ --sidebar: 240px;
971
+ }
972
+
973
+ .diagram-panel {
974
+ width: 300px;
975
+ }
976
+ }
977
+
978
+ /* Below 900px the sidebar is a rail of numbers; the stage header carries the title. */
979
+ @media (max-width: 899px) {
980
+ :root {
981
+ --sidebar: 56px;
982
+ }
983
+
984
+ .sidebar {
985
+ position: relative;
986
+ z-index: 3;
987
+ }
988
+
989
+ .commits-toggle {
990
+ display: block;
991
+ margin: 6px 4px;
992
+ padding: 2px 0;
993
+ font-size: 11px;
994
+ }
995
+
996
+ .sidebar:not(.open) .commit-row {
997
+ flex-direction: column;
998
+ align-items: center;
999
+ gap: 2px;
1000
+ padding: 6px 0;
1001
+ }
1002
+
1003
+ .sidebar:not(.open) .commit-list .title {
1004
+ position: absolute;
1005
+ width: 1px;
1006
+ height: 1px;
1007
+ overflow: hidden;
1008
+ clip-path: inset(50%);
1009
+ }
1010
+
1011
+ .sidebar:not(.open) .commit-list .index {
1012
+ text-align: center;
1013
+ }
1014
+
1015
+ .sidebar:not(.open) .plan-note,
1016
+ .sidebar:not(.open) .answers {
1017
+ display: none;
1018
+ }
1019
+
1020
+ .sidebar.open {
1021
+ width: 300px;
1022
+ box-shadow: 4px 0 16px rgb(0 0 0 / 0.15);
1023
+ }
1024
+
1025
+ .rail-tip:not([hidden]) {
1026
+ display: block;
1027
+ position: fixed;
1028
+ z-index: 20;
1029
+ max-width: 320px;
1030
+ padding: 4px 8px;
1031
+ border-radius: 4px;
1032
+ background: var(--text);
1033
+ color: var(--bg);
1034
+ font-size: 13px;
1035
+ pointer-events: none;
1036
+ }
1037
+ }
1038
+
1039
+ .comment.question {
1040
+ background: var(--question-bg);
1041
+ box-shadow: inset 3px 0 0 var(--question-edge);
1042
+ }
1043
+
1044
+ .reply {
1045
+ margin: 6px 0 0 14px;
1046
+ padding: 4px 10px;
1047
+ border-left: 2px solid var(--border);
1048
+ }
1049
+
1050
+ .reply.agent {
1051
+ border-left-color: var(--accent);
1052
+ }
1053
+
1054
+ .reply .said {
1055
+ white-space: pre-wrap;
1056
+ }
1057
+
1058
+ .reply-diagram {
1059
+ overflow-x: auto;
1060
+ margin: 6px 0;
1061
+ }
1062
+
1063
+ .reply-diagram svg {
1064
+ max-width: 100%;
1065
+ height: auto;
1066
+ }
1067
+
1068
+ .kind {
1069
+ display: flex;
1070
+ gap: 4px;
1071
+ margin-bottom: 4px;
1072
+ }
1073
+
1074
+ .kind button[aria-pressed="true"] {
1075
+ background: var(--accent);
1076
+ border-color: var(--accent);
1077
+ color: var(--accent-text);
1078
+ }
1079
+
1080
+ .badge.question {
1081
+ background: var(--question-bg);
1082
+ color: var(--text);
1083
+ box-shadow: inset 0 0 0 1px var(--question-edge);
1084
+ }
1085
+
1086
+ .answers {
1087
+ border-top: 1px solid var(--border);
1088
+ padding: 8px 12px;
1089
+ max-height: 45%;
1090
+ overflow-y: auto;
1091
+ }
1092
+
1093
+ .answers[hidden] {
1094
+ display: none;
1095
+ }
1096
+
1097
+ .answer-row {
1098
+ display: block;
1099
+ width: 100%;
1100
+ margin-top: 4px;
1101
+ text-align: left;
1102
+ font-size: 13px;
1103
+ overflow: hidden;
1104
+ text-overflow: ellipsis;
1105
+ white-space: nowrap;
1106
+ }
1107
+
1108
+ .answer-row.done {
1109
+ color: var(--muted);
1110
+ }
1111
+
1112
+ .answer {
1113
+ margin: 8px 10px;
1114
+ padding: 8px 12px;
1115
+ border-radius: 6px;
1116
+ background: var(--comment-bg);
1117
+ box-shadow: inset 3px 0 0 var(--accent);
1118
+ }
1119
+
1120
+ .answer .said {
1121
+ white-space: pre-wrap;
1122
+ }
1123
+
1124
+ .answer .meta {
1125
+ margin-top: 6px;
1126
+ color: var(--muted);
1127
+ font-size: 12px;
1128
+ }
1129
+
1130
+ .answer-actions {
1131
+ display: flex;
1132
+ gap: 8px;
1133
+ margin-top: 8px;
1134
+ }
1135
+
1136
+ .answer.resolved {
1137
+ display: flex;
1138
+ justify-content: space-between;
1139
+ align-items: center;
1140
+ color: var(--muted);
1141
+ background: none;
1142
+ box-shadow: none;
1143
+ padding: 2px 12px;
1144
+ }
1145
+
1146
+ .answers .answer {
1147
+ margin: 6px 0;
1148
+ }
1149
+
1150
+ .quote {
1151
+ margin: 6px 0;
1152
+ padding: 4px 8px;
1153
+ overflow-x: auto;
1154
+ font: 12px / 1.5 var(--font-mono);
1155
+ background: var(--panel);
1156
+ border-radius: 4px;
1157
+ }
1158
+
1159
+ .concern {
1160
+ margin: 6px 10px 8px;
1161
+ padding: 8px 12px;
1162
+ border-radius: 6px;
1163
+ background: var(--panel);
1164
+ border: 1px dashed var(--border);
1165
+ border-left: 4px solid var(--sev, var(--sev-minor));
1166
+ font-family: system-ui, sans-serif;
1167
+ white-space: normal;
1168
+ }
1169
+
1170
+ .diff .concern {
1171
+ margin-left: calc(var(--gutter) + 2ch);
1172
+ max-width: 70ch;
1173
+ }
1174
+
1175
+ .concern.sev-blocker {
1176
+ --sev: var(--sev-blocker);
1177
+ }
1178
+
1179
+ .concern.sev-major {
1180
+ --sev: var(--sev-major);
1181
+ }
1182
+
1183
+ .concern.sev-minor {
1184
+ --sev: var(--sev-minor);
1185
+ }
1186
+
1187
+ .concern.kept {
1188
+ border-style: solid;
1189
+ }
1190
+
1191
+ .concern.pending {
1192
+ display: none;
1193
+ }
1194
+
1195
+ .concern.dismissed {
1196
+ display: flex;
1197
+ justify-content: space-between;
1198
+ gap: 12px;
1199
+ color: var(--muted);
1200
+ border-left-color: var(--border);
1201
+ padding: 2px 12px;
1202
+ }
1203
+
1204
+ .concern-head {
1205
+ display: flex;
1206
+ align-items: center;
1207
+ gap: 8px;
1208
+ font-size: 12px;
1209
+ }
1210
+
1211
+ .concern .who {
1212
+ font-weight: 600;
1213
+ }
1214
+
1215
+ .concern .chip {
1216
+ padding: 0 8px;
1217
+ border: 1px solid var(--sev);
1218
+ border-radius: 10px;
1219
+ color: var(--sev);
1220
+ font-weight: 600;
1221
+ }
1222
+
1223
+ .concern .kind-tag,
1224
+ .concern .verdict {
1225
+ color: var(--muted);
1226
+ }
1227
+
1228
+ .concern .said {
1229
+ margin: 4px 0;
1230
+ }
1231
+
1232
+ .concern .said.mine {
1233
+ color: var(--muted);
1234
+ }
1235
+
1236
+ .concern-actions {
1237
+ display: flex;
1238
+ align-items: center;
1239
+ gap: 8px;
1240
+ margin-top: 6px;
1241
+ }
1242
+
1243
+ .concern .sev-pick {
1244
+ margin-left: auto;
1245
+ color: var(--muted);
1246
+ font-size: 12px;
1247
+ }
1248
+
1249
+ .concern .box {
1250
+ margin: 6px 0;
1251
+ }
1252
+
1253
+ .concern textarea {
1254
+ min-height: 40px;
1255
+ }
1256
+
1257
+ .dl.flagged .gutter::after {
1258
+ content: "";
1259
+ position: absolute;
1260
+ right: 0;
1261
+ top: 3px;
1262
+ bottom: 3px;
1263
+ width: 3px;
1264
+ border-radius: 2px;
1265
+ background: var(--flag);
1266
+ }
1267
+
1268
+ .dl.flag-blocker {
1269
+ --flag: var(--sev-blocker);
1270
+ }
1271
+
1272
+ .dl.flag-major {
1273
+ --flag: var(--sev-major);
1274
+ }
1275
+
1276
+ .dl.flag-minor {
1277
+ --flag: var(--sev-minor);
1278
+ }
1279
+
1280
+ .dot {
1281
+ flex: none;
1282
+ width: 9px;
1283
+ height: 9px;
1284
+ margin-top: 6px;
1285
+ border-radius: 50%;
1286
+ background: var(--sev-minor);
1287
+ }
1288
+
1289
+ .dot.sev-blocker {
1290
+ background: var(--sev-blocker);
1291
+ }
1292
+
1293
+ .dot.sev-major {
1294
+ background: var(--sev-major);
1295
+ }
1296
+
1297
+ .to-decide {
1298
+ color: var(--sev-major);
1299
+ }
1300
+
1301
+ .kind select {
1302
+ margin-left: auto;
1303
+ }
1304
+
1305
+ .done-card.wide {
1306
+ width: min(820px, 100%);
1307
+ }
1308
+
1309
+ .report-head {
1310
+ display: flex;
1311
+ align-items: center;
1312
+ gap: 10px;
1313
+ margin-bottom: 6px;
1314
+ }
1315
+
1316
+ .report-head button {
1317
+ margin-left: auto;
1318
+ }
1319
+
1320
+ .report {
1321
+ margin: 0;
1322
+ max-height: 38vh;
1323
+ overflow: auto;
1324
+ padding: 10px 12px;
1325
+ border: 1px solid var(--border);
1326
+ border-radius: 6px;
1327
+ background: var(--bg);
1328
+ font: 12.5px / 1.5 var(--font-mono);
1329
+ text-align: left;
1330
+ white-space: pre-wrap;
1331
+ }