prreviewbuddy 0.49.0 → 0.50.1
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/CHANGELOG.md +48 -0
- package/dist/{delete_review-BBjXPfMV.js → delete_review-BIXqUnpx.js} +91 -12
- package/dist/main.js +41 -1
- package/dist/server.js +182 -12
- package/package.json +1 -1
- package/static/help.js +1 -0
- package/static/shell.css +118 -11
- package/static/sidebar.css +250 -34
- package/static/workspace.js +46 -46
package/static/shell.css
CHANGED
|
@@ -318,6 +318,69 @@ body > * { flex: 0 0 auto; }
|
|
|
318
318
|
}
|
|
319
319
|
.prb-change-ref .prb-arrow { color: var(--text-muted); }
|
|
320
320
|
|
|
321
|
+
/* ── Review range ──
|
|
322
|
+
Which commits the review is of. A sibling of `.prb-change-ref`, never a child: that element clips
|
|
323
|
+
to keep the bar on one line, and would cut the panel off. The label is a fact, so it reads as
|
|
324
|
+
part of the bar's state rather than as a control competing with it. */
|
|
325
|
+
.prb-range {
|
|
326
|
+
position: relative;
|
|
327
|
+
flex: none;
|
|
328
|
+
margin-left: -8px;
|
|
329
|
+
}
|
|
330
|
+
.prb-range-summary {
|
|
331
|
+
display: inline-flex;
|
|
332
|
+
align-items: center;
|
|
333
|
+
gap: 5px;
|
|
334
|
+
padding: 2px 9px;
|
|
335
|
+
border: 1px solid var(--border);
|
|
336
|
+
border-radius: 999px;
|
|
337
|
+
color: var(--text-secondary);
|
|
338
|
+
font-size: var(--t-meta);
|
|
339
|
+
white-space: nowrap;
|
|
340
|
+
cursor: pointer;
|
|
341
|
+
user-select: none;
|
|
342
|
+
list-style: none;
|
|
343
|
+
}
|
|
344
|
+
.prb-range-summary::-webkit-details-marker { display: none; }
|
|
345
|
+
.prb-range-summary::after {
|
|
346
|
+
content: '\25BE';
|
|
347
|
+
font-size: 9px; /* the disclosure caret, sized to the mark, not the type scale */
|
|
348
|
+
line-height: 1;
|
|
349
|
+
}
|
|
350
|
+
.prb-range[open] .prb-range-summary::after { content: '\25B4'; }
|
|
351
|
+
.prb-range-summary:hover { color: var(--text-primary); background: var(--surface-2); }
|
|
352
|
+
.prb-range-summary:focus-visible { outline: 2px solid var(--brand-hover); outline-offset: 2px; }
|
|
353
|
+
/* Anchored under the pill and out of flow, so opening it never moves the bar or the review. */
|
|
354
|
+
.prb-range-panel {
|
|
355
|
+
position: absolute;
|
|
356
|
+
top: calc(100% + 8px);
|
|
357
|
+
left: 0;
|
|
358
|
+
z-index: 3;
|
|
359
|
+
width: max-content;
|
|
360
|
+
max-width: min(420px, calc(100vw - 32px));
|
|
361
|
+
padding: 10px 14px;
|
|
362
|
+
border: 1px solid var(--border);
|
|
363
|
+
border-radius: 9px;
|
|
364
|
+
background: var(--surface-raised);
|
|
365
|
+
box-shadow: 0 10px 28px var(--shadow-float);
|
|
366
|
+
font-size: var(--t-meta);
|
|
367
|
+
line-height: var(--lh-body);
|
|
368
|
+
color: var(--text-secondary);
|
|
369
|
+
white-space: normal;
|
|
370
|
+
overflow-wrap: anywhere;
|
|
371
|
+
}
|
|
372
|
+
.prb-range-panel p { margin: 0 0 6px; }
|
|
373
|
+
.prb-range-panel p:last-child { margin-bottom: 0; }
|
|
374
|
+
.prb-range-panel code { font-size: var(--t-code); color: var(--text-primary); }
|
|
375
|
+
.prb-range-panel a { color: var(--brand-hover); }
|
|
376
|
+
/* Phone width: anchored to the pill, the panel ran off the right edge. Here it keeps its place just
|
|
377
|
+
under the pill (static top) but spans the page with the usual 16px gutter. Placed after the base
|
|
378
|
+
rules above, which it overrides at the same specificity. */
|
|
379
|
+
@media (max-width: 600px) {
|
|
380
|
+
.prb-range { position: static; }
|
|
381
|
+
.prb-range-panel { top: auto; left: 16px; right: 16px; margin-top: 8px; width: auto; max-width: none; }
|
|
382
|
+
}
|
|
383
|
+
|
|
321
384
|
.prb-header-stats {
|
|
322
385
|
margin-left: auto;
|
|
323
386
|
display: flex;
|
|
@@ -1506,26 +1569,32 @@ a.prb-rail-item { text-decoration: none; }
|
|
|
1506
1569
|
|
|
1507
1570
|
.prb-ask-header {
|
|
1508
1571
|
display: flex;
|
|
1509
|
-
align-items:
|
|
1572
|
+
align-items: center;
|
|
1510
1573
|
gap: 8px;
|
|
1511
1574
|
padding: 16px 18px 12px;
|
|
1512
1575
|
border-bottom: 1px solid var(--border);
|
|
1513
1576
|
}
|
|
1577
|
+
/* The title and what the next question is about, stacked. It takes the free space, which keeps
|
|
1578
|
+
the two icon controls at the right edge. */
|
|
1579
|
+
.prb-ask-heading {
|
|
1580
|
+
flex: 1;
|
|
1581
|
+
min-width: 0;
|
|
1582
|
+
margin: 0;
|
|
1583
|
+
}
|
|
1514
1584
|
.prb-ask-header h2 {
|
|
1515
1585
|
margin: 0;
|
|
1516
1586
|
font-size: var(--t-section);
|
|
1517
1587
|
font-weight: 600;
|
|
1518
1588
|
color: var(--text-primary);
|
|
1519
1589
|
}
|
|
1590
|
+
/* Never truncated: the theme's name is the whole point of the line, so it wraps however long. */
|
|
1520
1591
|
.prb-ask-scope {
|
|
1521
|
-
margin
|
|
1592
|
+
margin: 2px 0 0;
|
|
1522
1593
|
font-size: var(--t-micro);
|
|
1523
1594
|
color: var(--text-muted);
|
|
1524
|
-
overflow:
|
|
1525
|
-
text-overflow: ellipsis;
|
|
1526
|
-
white-space: nowrap;
|
|
1527
|
-
max-width: 150px;
|
|
1595
|
+
overflow-wrap: anywhere;
|
|
1528
1596
|
}
|
|
1597
|
+
.prb-ask-scope [data-ask-scope] { color: var(--text-secondary); }
|
|
1529
1598
|
|
|
1530
1599
|
.prb-ask-log {
|
|
1531
1600
|
flex: 1;
|
|
@@ -4782,6 +4851,41 @@ a.prb-rail-item { text-decoration: none; }
|
|
|
4782
4851
|
color: var(--text-secondary);
|
|
4783
4852
|
}
|
|
4784
4853
|
.prb-settings-help code { font-size: var(--t-code); color: var(--text-primary); }
|
|
4854
|
+
|
|
4855
|
+
/* ── Help ──
|
|
4856
|
+
Reading, not settings: prose at a readable measure, one topic per section, each with an anchor a
|
|
4857
|
+
place elsewhere in the product can link to. */
|
|
4858
|
+
.prb-help-topic {
|
|
4859
|
+
max-width: 46rem;
|
|
4860
|
+
padding: 20px 0;
|
|
4861
|
+
border-bottom: 1px solid var(--border);
|
|
4862
|
+
font-size: var(--t-body);
|
|
4863
|
+
line-height: var(--lh-body);
|
|
4864
|
+
color: var(--text-secondary);
|
|
4865
|
+
/* Clear of the sticky bars when arrived at by its anchor. */
|
|
4866
|
+
scroll-margin-top: 96px;
|
|
4867
|
+
}
|
|
4868
|
+
.prb-help-topic:first-of-type { padding-top: 4px; }
|
|
4869
|
+
.prb-help-topic:last-of-type { border-bottom: 0; }
|
|
4870
|
+
.prb-help-topic h2 { margin: 0 0 12px; font-size: var(--t-section); font-weight: 600; color: var(--text-primary); }
|
|
4871
|
+
.prb-help-topic h3 { margin: 20px 0 8px; font-size: var(--t-body); font-weight: 600; color: var(--text-primary); }
|
|
4872
|
+
.prb-help-topic p { margin: 0 0 10px; }
|
|
4873
|
+
.prb-help-topic ul { margin: 0 0 10px; padding-left: 20px; }
|
|
4874
|
+
.prb-help-topic li { margin-bottom: 4px; }
|
|
4875
|
+
.prb-help-topic code { font-size: var(--t-code); color: var(--text-primary); }
|
|
4876
|
+
/* A diagram's spacing is its meaning, so it never wraps: a narrow window scrolls it instead. */
|
|
4877
|
+
.prb-help-diagram {
|
|
4878
|
+
margin: 0 0 12px;
|
|
4879
|
+
padding: 12px 14px;
|
|
4880
|
+
overflow-x: auto;
|
|
4881
|
+
border: 1px solid var(--border);
|
|
4882
|
+
border-radius: 8px;
|
|
4883
|
+
background: var(--surface-2);
|
|
4884
|
+
font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, monospace;
|
|
4885
|
+
font-size: var(--t-code);
|
|
4886
|
+
line-height: 1.4;
|
|
4887
|
+
color: var(--text-primary);
|
|
4888
|
+
}
|
|
4785
4889
|
/* Empty until there is something wrong, and it collapses when there is not: an always-present gap
|
|
4786
4890
|
under a field reads as a control that is missing part of itself. */
|
|
4787
4891
|
.prb-settings-error {
|
|
@@ -4991,8 +5095,8 @@ body .prb-body[data-focus='buddy'] .prb-msg-user { max-width: min(90%, 78ch); }
|
|
|
4991
5095
|
.prb-focus-toggle .prb-focus-collapse,
|
|
4992
5096
|
.prb-focus-toggle[aria-pressed='true'] .prb-focus-expand { display: none; }
|
|
4993
5097
|
.prb-focus-toggle[aria-pressed='true'] .prb-focus-collapse { display: block; }
|
|
4994
|
-
/* In the assistant's header it follows the
|
|
4995
|
-
|
|
5098
|
+
/* In the assistant's header it follows the heading, which takes the free space, so the control
|
|
5099
|
+
stays at the right edge beside it. */
|
|
4996
5100
|
.prb-ask-header :is(.prb-focus-toggle, .prb-ask-hide) { align-self: center; }
|
|
4997
5101
|
|
|
4998
5102
|
/* The same control in the light document pane, in the pane's palette. */
|
|
@@ -5061,10 +5165,13 @@ body .prb-body[data-focus='buddy'] .prb-msg-user { max-width: min(90%, 78ch); }
|
|
|
5061
5165
|
width: 24px;
|
|
5062
5166
|
height: 24px;
|
|
5063
5167
|
margin-top: -3px;
|
|
5064
|
-
|
|
5168
|
+
border-radius: 6px;
|
|
5169
|
+
color: var(--pane-ink-muted);
|
|
5065
5170
|
}
|
|
5066
|
-
|
|
5067
|
-
|
|
5171
|
+
/* Copy beside it has the same rest, hover and size (sidebar.css): grey, a soft surface, and purple
|
|
5172
|
+
only while this menu is open, because then it is the AI action in play. */
|
|
5173
|
+
.prb-doc .prb-ask-buddy-trigger:hover { background: rgba(31, 35, 40, 0.07); color: var(--pane-ink-muted); }
|
|
5174
|
+
.prb-doc .prb-ask-buddy-trigger[aria-expanded='true'] { background: rgba(130, 80, 223, 0.1); color: var(--pane-accent-ink); }
|
|
5068
5175
|
.prb-doc .prb-ask-buddy-trigger:focus-visible { outline: 2px solid var(--pane-accent); outline-offset: -2px; }
|
|
5069
5176
|
|
|
5070
5177
|
/* The tooltip Copy uses beside it, so the two icons explain themselves the same way. */
|
package/static/sidebar.css
CHANGED
|
@@ -653,6 +653,51 @@
|
|
|
653
653
|
margin-top: 2px;
|
|
654
654
|
}
|
|
655
655
|
|
|
656
|
+
/* The extension's cards, laid out as the workspace's are: the figure leads and the label sits
|
|
657
|
+
beside it, pinned to the top row so four cards align with or without a note. Only once each
|
|
658
|
+
card has the room: at the sidebar's narrowest a quarter-width card cannot hold "Questions" beside
|
|
659
|
+
its figure, and the stacked card above stays. The grid is the query container because the rule
|
|
660
|
+
only needs its children; nothing else in the panel is contained. Selectors carry the extension
|
|
661
|
+
class, so they outrank the base rules wherever those sit in the file. */
|
|
662
|
+
.pr-helper-extension .pr-helper-overview-stats { container-type: inline-size; }
|
|
663
|
+
|
|
664
|
+
@container (min-width: 400px) {
|
|
665
|
+
.pr-helper-extension .pr-helper-overview-stat {
|
|
666
|
+
display: grid;
|
|
667
|
+
grid-template-columns: auto minmax(0, 1fr);
|
|
668
|
+
grid-template-rows: auto 1fr;
|
|
669
|
+
column-gap: 8px;
|
|
670
|
+
align-items: start;
|
|
671
|
+
padding: 10px 12px;
|
|
672
|
+
text-align: left;
|
|
673
|
+
}
|
|
674
|
+
.pr-helper-extension .pr-helper-overview-stat-value {
|
|
675
|
+
grid-column: 1;
|
|
676
|
+
grid-row: 1 / span 2;
|
|
677
|
+
font-size: 24px;
|
|
678
|
+
font-weight: 300;
|
|
679
|
+
line-height: 1;
|
|
680
|
+
font-variant-numeric: tabular-nums;
|
|
681
|
+
}
|
|
682
|
+
.pr-helper-extension .pr-helper-overview-stat-value-wide { font-size: 15px; }
|
|
683
|
+
.pr-helper-extension .pr-helper-overview-stat-label {
|
|
684
|
+
grid-column: 2;
|
|
685
|
+
grid-row: 1;
|
|
686
|
+
justify-self: start;
|
|
687
|
+
/* Squares the label's cap height with the figure's top. */
|
|
688
|
+
margin-top: 5px;
|
|
689
|
+
}
|
|
690
|
+
.pr-helper-extension .pr-helper-overview-stat-note {
|
|
691
|
+
grid-column: 2;
|
|
692
|
+
grid-row: 2;
|
|
693
|
+
justify-self: start;
|
|
694
|
+
}
|
|
695
|
+
/* Into flow, ahead of the word, now that nothing is centred for it to compensate. */
|
|
696
|
+
.pr-helper-extension .pr-helper-overview-stat-info { position: static; transform: none; }
|
|
697
|
+
/* The whole card lights up as the link, so the arrow only pushed the label off the figure. */
|
|
698
|
+
.pr-helper-extension .pr-helper-overview-stat-arrow { display: none; }
|
|
699
|
+
}
|
|
700
|
+
|
|
656
701
|
/* Explains a capped review, and only ever appears on one. Sits ahead of the 11px label rather
|
|
657
702
|
than beside the value, so it's sized to that row — against the bold number it read as a
|
|
658
703
|
glyph belonging to the count. */
|
|
@@ -895,11 +940,30 @@
|
|
|
895
940
|
.pr-helper-finding-copy {
|
|
896
941
|
position: relative;
|
|
897
942
|
flex-shrink: 0;
|
|
898
|
-
margin-top: -1px;
|
|
899
943
|
opacity: 1;
|
|
900
944
|
font-size: 12px;
|
|
901
945
|
}
|
|
902
946
|
|
|
947
|
+
/* Copy and Ask Buddy are a pair and speak one interaction language, on both surfaces: the same
|
|
948
|
+
24px target and 6px corner, neutral grey at rest, and a soft surface on hover with the icon
|
|
949
|
+
colour left alone. Colour is kept for meaning: purple for an Ask Buddy menu that is open, and
|
|
950
|
+
the app's green or red for what Copy just did (.pr-helper-msg-copy.copied / .failed below). Pulled up 3px so the box centres on the title's first line.
|
|
951
|
+
Doubled class: the chat's .pr-helper-msg-copy rules sit later in this file and would win a tie. */
|
|
952
|
+
.pr-helper-msg-copy.pr-helper-finding-copy {
|
|
953
|
+
justify-content: center;
|
|
954
|
+
width: 24px;
|
|
955
|
+
height: 24px;
|
|
956
|
+
margin-top: -3px;
|
|
957
|
+
padding: 0;
|
|
958
|
+
border-radius: 6px;
|
|
959
|
+
color: var(--color-fg-muted, #57606a);
|
|
960
|
+
}
|
|
961
|
+
.pr-helper-finding-copy:hover:not(.copied):not(.failed) {
|
|
962
|
+
background: rgba(31, 35, 40, 0.07);
|
|
963
|
+
color: var(--color-fg-muted, #57606a);
|
|
964
|
+
}
|
|
965
|
+
.pr-helper-finding-copy:focus-visible { outline: 2px solid #9333ea; outline-offset: -2px; }
|
|
966
|
+
|
|
903
967
|
/* The tooltip grows leftward from the right edge, back over the card rather than out of the pane,
|
|
904
968
|
and stays on one line. The same look, delay and text reset as `.pr-helper-tip`, which it cannot
|
|
905
969
|
reuse: that one pins itself to its positioned row, and this control is its own anchor. */
|
|
@@ -929,10 +993,82 @@
|
|
|
929
993
|
transition-delay: 0.35s;
|
|
930
994
|
}
|
|
931
995
|
|
|
932
|
-
/*
|
|
933
|
-
|
|
996
|
+
/* After a click the bubble carries "Copied" or "Copy failed" and shows without waiting for the
|
|
997
|
+
pointer: below the button rather than beside it, where Ask Buddy sits. */
|
|
934
998
|
.pr-helper-finding-copy.copied::after,
|
|
935
|
-
.pr-helper-finding-copy.failed::after {
|
|
999
|
+
.pr-helper-finding-copy.failed::after { opacity: 1; transition-delay: 0s; }
|
|
1000
|
+
|
|
1001
|
+
/* Ask Buddy on a finding card, in the extension: the sparkle beside Copy, and its menu. Scoped to
|
|
1002
|
+
.pr-helper-extension, which only the extension's root carries: the workspace loads this sheet
|
|
1003
|
+
too, its review document is also a .pr-helper-sidebar, and it styles its own menu in shell.css
|
|
1004
|
+
under .prb-doc. The panel matches the selection popover, which offers the same list. */
|
|
1005
|
+
.pr-helper-extension .prb-ask-buddy { position: relative; flex-shrink: 0; }
|
|
1006
|
+
.pr-helper-extension .prb-ask-buddy-trigger {
|
|
1007
|
+
position: relative;
|
|
1008
|
+
display: inline-flex;
|
|
1009
|
+
align-items: center;
|
|
1010
|
+
justify-content: center;
|
|
1011
|
+
width: 24px;
|
|
1012
|
+
height: 24px;
|
|
1013
|
+
margin-top: -3px;
|
|
1014
|
+
padding: 0;
|
|
1015
|
+
border: 0;
|
|
1016
|
+
border-radius: 6px;
|
|
1017
|
+
background: transparent;
|
|
1018
|
+
color: var(--color-fg-muted, #57606a);
|
|
1019
|
+
cursor: pointer;
|
|
1020
|
+
}
|
|
1021
|
+
.pr-helper-extension .prb-ask-buddy-trigger:hover { background: rgba(31, 35, 40, 0.07); }
|
|
1022
|
+
.pr-helper-extension .prb-ask-buddy-trigger[aria-expanded='true'] { background: rgba(147, 51, 234, 0.1); color: #9333ea; }
|
|
1023
|
+
.pr-helper-extension .prb-ask-buddy-trigger:focus-visible { outline: 2px solid #9333ea; outline-offset: -2px; }
|
|
1024
|
+
.pr-helper-extension .prb-ask-buddy-trigger::after {
|
|
1025
|
+
content: attr(data-tip);
|
|
1026
|
+
position: absolute;
|
|
1027
|
+
top: calc(100% + 6px);
|
|
1028
|
+
right: 0;
|
|
1029
|
+
z-index: 3;
|
|
1030
|
+
padding: 5px 8px;
|
|
1031
|
+
border-radius: 6px;
|
|
1032
|
+
background: #24292f;
|
|
1033
|
+
color: #ffffff;
|
|
1034
|
+
font-size: 11px;
|
|
1035
|
+
font-weight: 400;
|
|
1036
|
+
font-family: inherit;
|
|
1037
|
+
line-height: 1.4;
|
|
1038
|
+
white-space: nowrap;
|
|
1039
|
+
opacity: 0;
|
|
1040
|
+
pointer-events: none;
|
|
1041
|
+
transition: opacity 0.1s;
|
|
1042
|
+
}
|
|
1043
|
+
.pr-helper-extension .prb-ask-buddy-trigger:hover::after,
|
|
1044
|
+
.pr-helper-extension .prb-ask-buddy-trigger:focus-visible::after { opacity: 1; transition-delay: 0.35s; }
|
|
1045
|
+
.pr-helper-extension .prb-ask-buddy-trigger[aria-expanded='true']::after { display: none; }
|
|
1046
|
+
.pr-helper-extension .prb-ask-buddy-panel {
|
|
1047
|
+
position: absolute;
|
|
1048
|
+
top: 26px;
|
|
1049
|
+
right: 0;
|
|
1050
|
+
z-index: 5;
|
|
1051
|
+
width: 240px;
|
|
1052
|
+
max-width: calc(100vw - 48px);
|
|
1053
|
+
padding: 4px;
|
|
1054
|
+
border: 1px solid rgba(0, 0, 0, 0.12);
|
|
1055
|
+
border-radius: 8px;
|
|
1056
|
+
background: #ffffff;
|
|
1057
|
+
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.18);
|
|
1058
|
+
text-align: left;
|
|
1059
|
+
}
|
|
1060
|
+
/* The card whose menu is open comes forward. A dismissed card's opacity makes it its own layer,
|
|
1061
|
+
where the panel's z-index counts only inside the card: the next card's Copy and sparkle painted
|
|
1062
|
+
across the open menu, and the menu was drawn faded. */
|
|
1063
|
+
.pr-helper-extension [data-finding-card]:has(.prb-ask-buddy-trigger[aria-expanded='true']) {
|
|
1064
|
+
position: relative;
|
|
1065
|
+
z-index: 6;
|
|
1066
|
+
opacity: 1;
|
|
1067
|
+
}
|
|
1068
|
+
.pr-helper-extension .prb-ask-buddy-panel .pr-helper-selection-menu-item { display: block; width: 100%; text-align: left; }
|
|
1069
|
+
.pr-helper-extension .prb-ask-buddy-panel .pr-helper-selection-menu-item[disabled] { opacity: 0.5; cursor: default; }
|
|
1070
|
+
/* Arrow keys move focus through these items, so the focus has to show. */
|
|
1071
|
+
.pr-helper-extension .prb-ask-buddy-panel .pr-helper-selection-menu-item:focus-visible { outline: 2px solid #9333ea; outline-offset: -2px; }
|
|
936
1072
|
|
|
937
1073
|
.pr-helper-issue-desc {
|
|
938
1074
|
font-size: 13px;
|
|
@@ -2050,6 +2186,15 @@
|
|
|
2050
2186
|
|
|
2051
2187
|
.pr-helper-markdown a:hover { text-decoration: underline; }
|
|
2052
2188
|
|
|
2189
|
+
/* State, not decoration: it changes what the next question means. Wraps rather than truncates. */
|
|
2190
|
+
.pr-helper-ask-scope {
|
|
2191
|
+
margin: 0 0 6px;
|
|
2192
|
+
font-size: 12px;
|
|
2193
|
+
color: var(--color-fg-muted, #57606a);
|
|
2194
|
+
overflow-wrap: anywhere;
|
|
2195
|
+
}
|
|
2196
|
+
.pr-helper-ask-scope-value { color: var(--color-fg-default, #24292f); }
|
|
2197
|
+
|
|
2053
2198
|
.pr-helper-chat-input-row {
|
|
2054
2199
|
display: flex;
|
|
2055
2200
|
gap: 6px;
|
|
@@ -2133,7 +2278,8 @@
|
|
|
2133
2278
|
|
|
2134
2279
|
/* Deliberately quieter than the chips it reveals: once the reviewer is typing their own
|
|
2135
2280
|
questions, this is a door they may never open again, not a call to action. */
|
|
2136
|
-
.pr-helper-suggestions-toggle
|
|
2281
|
+
.pr-helper-suggestions-toggle,
|
|
2282
|
+
.pr-helper-saved-prompts-toggle {
|
|
2137
2283
|
display: flex;
|
|
2138
2284
|
align-items: center;
|
|
2139
2285
|
gap: 5px;
|
|
@@ -2149,9 +2295,11 @@
|
|
|
2149
2295
|
cursor: pointer;
|
|
2150
2296
|
}
|
|
2151
2297
|
|
|
2152
|
-
.pr-helper-suggestions-toggle:hover
|
|
2298
|
+
.pr-helper-suggestions-toggle:hover,
|
|
2299
|
+
.pr-helper-saved-prompts-toggle:hover { color: #9333ea; }
|
|
2153
2300
|
|
|
2154
|
-
.pr-helper-suggestions-toggle::before
|
|
2301
|
+
.pr-helper-suggestions-toggle::before,
|
|
2302
|
+
.pr-helper-saved-prompts-toggle::before {
|
|
2155
2303
|
content: '';
|
|
2156
2304
|
width: 0;
|
|
2157
2305
|
height: 0;
|
|
@@ -2161,10 +2309,12 @@
|
|
|
2161
2309
|
transition: transform 0.15s ease;
|
|
2162
2310
|
}
|
|
2163
2311
|
|
|
2164
|
-
.pr-helper-suggestions-toggle[aria-expanded='true']::before
|
|
2312
|
+
.pr-helper-suggestions-toggle[aria-expanded='true']::before,
|
|
2313
|
+
.pr-helper-saved-prompts-toggle[aria-expanded='true']::before { transform: rotate(90deg); }
|
|
2165
2314
|
|
|
2166
2315
|
/* Open, the toggle is a label for the list right beneath it rather than a lone control. */
|
|
2167
|
-
.pr-helper-suggestions-toggle[aria-expanded='true']
|
|
2316
|
+
.pr-helper-suggestions-toggle[aria-expanded='true'],
|
|
2317
|
+
.pr-helper-saved-prompts-toggle[aria-expanded='true'] { margin-bottom: 8px; }
|
|
2168
2318
|
|
|
2169
2319
|
.pr-helper-quick-prompts {
|
|
2170
2320
|
display: flex;
|
|
@@ -2187,7 +2337,13 @@
|
|
|
2187
2337
|
.pr-helper-quick-prompt-button:hover { border-color: #9333ea; color: #9333ea; }
|
|
2188
2338
|
|
|
2189
2339
|
.pr-helper-quick-prompts-section-group,
|
|
2190
|
-
|
|
2340
|
+
/* Its own block below the suggestions, not part of their stack: that stack folds away after the
|
|
2341
|
+
first question, and Your prompts stays as the reviewer left it. */
|
|
2342
|
+
.pr-helper-quick-prompts-saved-group { margin-bottom: 8px; }
|
|
2343
|
+
/* .pr-helper-quick-prompts is a flex row, which beats the hidden attribute. */
|
|
2344
|
+
#pr-helper-saved-prompts-list[hidden] { display: none; }
|
|
2345
|
+
/* The count is a quantity, not part of the heading, so it drops the heading's caps and weight. */
|
|
2346
|
+
.pr-helper-saved-prompts-count { font-weight: 600; text-transform: none; letter-spacing: 0; }
|
|
2191
2347
|
|
|
2192
2348
|
/* ── The reviewer's own prompts ──
|
|
2193
2349
|
The chip and its edit control read as one object, so the border and the hover colour belong to
|
|
@@ -2887,7 +3043,9 @@
|
|
|
2887
3043
|
transition: opacity 0.12s;
|
|
2888
3044
|
}
|
|
2889
3045
|
|
|
2890
|
-
.pr-helper-file-item:hover .pr-helper-file-stats
|
|
3046
|
+
.pr-helper-file-item:hover .pr-helper-file-stats,
|
|
3047
|
+
.pr-helper-file-item:focus-within .pr-helper-file-stats,
|
|
3048
|
+
.pr-helper-file-item:has(.pr-helper-file-actions [aria-expanded='true']) .pr-helper-file-stats { opacity: 0; }
|
|
2891
3049
|
|
|
2892
3050
|
/* ── Hover-reveal action buttons ── */
|
|
2893
3051
|
.pr-helper-file-actions {
|
|
@@ -2902,38 +3060,85 @@
|
|
|
2902
3060
|
transition: opacity 0.12s;
|
|
2903
3061
|
}
|
|
2904
3062
|
|
|
2905
|
-
/*
|
|
2906
|
-
|
|
3063
|
+
/* One trigger, the row's "more actions", in the icon language Copy and Ask Buddy use: neutral grey,
|
|
3064
|
+
a soft surface on hover, colour only when it means something. It sits where the +/- stats are,
|
|
3065
|
+
which already give way on hover. Revealed by keyboard focus as well as the pointer, and held
|
|
3066
|
+
while its menu is open, so the menu does not vanish when the pointer leaves the row. */
|
|
3067
|
+
.pr-helper-file-item:hover .pr-helper-file-actions,
|
|
3068
|
+
.pr-helper-file-item:focus-within .pr-helper-file-actions,
|
|
3069
|
+
.pr-helper-file-actions:has([aria-expanded='true']) {
|
|
3070
|
+
opacity: 1;
|
|
3071
|
+
pointer-events: auto;
|
|
3072
|
+
}
|
|
2907
3073
|
|
|
2908
|
-
|
|
2909
|
-
|
|
2910
|
-
|
|
3074
|
+
/* Top right, level with the +/- stats it replaces on hover, rather than centred down a tall row.
|
|
3075
|
+
No transform: one would make the tray its own stacking context, and the next row would paint
|
|
3076
|
+
over the open menu. Raised while open for the same reason. */
|
|
3077
|
+
.pr-helper-file-actions[data-menu] {
|
|
3078
|
+
top: 13px;
|
|
3079
|
+
right: 12px;
|
|
3080
|
+
transform: none;
|
|
3081
|
+
}
|
|
3082
|
+
.pr-helper-file-actions:has([aria-expanded='true']) { z-index: 10; }
|
|
2911
3083
|
|
|
2912
|
-
|
|
2913
|
-
|
|
2914
|
-
|
|
2915
|
-
|
|
3084
|
+
.pr-helper-file-menu-trigger {
|
|
3085
|
+
display: inline-flex;
|
|
3086
|
+
align-items: center;
|
|
3087
|
+
justify-content: center;
|
|
3088
|
+
width: 24px;
|
|
3089
|
+
height: 24px;
|
|
3090
|
+
padding: 0;
|
|
3091
|
+
border: 0;
|
|
3092
|
+
border-radius: 6px;
|
|
3093
|
+
background: transparent;
|
|
3094
|
+
color: var(--color-fg-muted, #57606a);
|
|
3095
|
+
cursor: pointer;
|
|
3096
|
+
}
|
|
3097
|
+
.pr-helper-file-menu-trigger:hover,
|
|
3098
|
+
.pr-helper-file-menu-trigger[aria-expanded='true'] { background: rgba(31, 35, 40, 0.07); }
|
|
3099
|
+
.pr-helper-file-menu-trigger:focus-visible { outline: 2px solid #9333ea; outline-offset: -2px; }
|
|
2916
3100
|
|
|
2917
|
-
|
|
2918
|
-
|
|
2919
|
-
|
|
2920
|
-
|
|
2921
|
-
|
|
3101
|
+
/* The same panel as the selection popover and a card's Ask Buddy menu. */
|
|
3102
|
+
.pr-helper-file-menu {
|
|
3103
|
+
position: absolute;
|
|
3104
|
+
top: 28px;
|
|
3105
|
+
right: 0;
|
|
3106
|
+
z-index: 5;
|
|
3107
|
+
min-width: 160px;
|
|
3108
|
+
padding: 4px;
|
|
3109
|
+
border: 1px solid rgba(0, 0, 0, 0.12);
|
|
3110
|
+
border-radius: 8px;
|
|
3111
|
+
background: #ffffff;
|
|
3112
|
+
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.18);
|
|
3113
|
+
}
|
|
3114
|
+
.pr-helper-file-menu .pr-helper-action-btn {
|
|
3115
|
+
display: block;
|
|
3116
|
+
width: 100%;
|
|
3117
|
+
padding: 7px 10px;
|
|
3118
|
+
border: 0;
|
|
3119
|
+
border-radius: 6px;
|
|
3120
|
+
background: transparent;
|
|
3121
|
+
color: var(--color-fg-default, #24292f);
|
|
3122
|
+
font-family: inherit;
|
|
3123
|
+
font-size: 12px;
|
|
3124
|
+
text-align: left;
|
|
3125
|
+
cursor: pointer;
|
|
3126
|
+
}
|
|
3127
|
+
.pr-helper-file-menu .pr-helper-action-btn:hover:not([disabled]) { background: rgba(147, 51, 234, 0.1); color: #9333ea; }
|
|
3128
|
+
.pr-helper-file-menu .pr-helper-action-btn:focus-visible { outline: 2px solid #9333ea; outline-offset: -2px; }
|
|
3129
|
+
.pr-helper-file-menu .pr-helper-action-btn[disabled] { opacity: 0.5; cursor: default; }
|
|
3130
|
+
|
|
3131
|
+
/* The running state keeps the tray: "Analysing…" and Cancel float over the row's text as one
|
|
3132
|
+
panel, and #fbf7fe is the row's 4% purple hover tint composited over white. */
|
|
3133
|
+
.pr-helper-file-actions-running {
|
|
2922
3134
|
background: #ffffff;
|
|
2923
3135
|
padding: 4px 6px;
|
|
2924
3136
|
border: 1px solid rgba(147, 51, 234, 0.25);
|
|
2925
3137
|
border-radius: 8px;
|
|
2926
3138
|
box-shadow: 0 2px 6px rgba(31, 35, 40, 0.10);
|
|
2927
|
-
/* The tray's default `stretch` left the "Analysing…" label top-aligned in a box the taller
|
|
2928
|
-
Cancel button had grown, so the two read as being on different lines. */
|
|
2929
3139
|
align-items: center;
|
|
2930
3140
|
}
|
|
2931
|
-
|
|
2932
|
-
.pr-helper-file-item:hover .pr-helper-file-actions {
|
|
2933
|
-
opacity: 1;
|
|
2934
|
-
pointer-events: auto;
|
|
2935
|
-
background: #fbf7fe;
|
|
2936
|
-
}
|
|
3141
|
+
.pr-helper-file-item:hover .pr-helper-file-actions-running { background: #fbf7fe; }
|
|
2937
3142
|
|
|
2938
3143
|
/* Opts out of the hover gate above, and must: this is the only indication that a follow-up is
|
|
2939
3144
|
running and the only way to stop it, so a version of it you have to hover to find would leave
|
|
@@ -3365,7 +3570,9 @@
|
|
|
3365
3570
|
border: 2px solid #9333ea;
|
|
3366
3571
|
border-radius: 6px;
|
|
3367
3572
|
pointer-events: none;
|
|
3368
|
-
|
|
3573
|
+
/* Below every floating control (Save for later is 999996, the overlay 999997): a decoration that
|
|
3574
|
+
shared a number painted its border across Save for later. Still above ordinary page content. */
|
|
3575
|
+
z-index: 999995;
|
|
3369
3576
|
/* No dimming wash behind this. It used to carry `box-shadow: 0 0 0 2000px rgba(147,51,234,
|
|
3370
3577
|
0.04)` — a full-page purple tint over everything outside the box, painted above all of
|
|
3371
3578
|
GitHub's own content. At 4% it read as subtle until something saturated sat under it:
|
|
@@ -3912,8 +4119,17 @@
|
|
|
3912
4119
|
flex-direction: column;
|
|
3913
4120
|
min-width: 220px;
|
|
3914
4121
|
padding: 4px;
|
|
4122
|
+
/* With the saved prompts the list is about 375px. position() keeps it inside the window, but a
|
|
4123
|
+
window shorter than the list would cut it off, so there it scrolls instead. 16px is the two
|
|
4124
|
+
8px viewport margins position() leaves. */
|
|
4125
|
+
max-height: calc(100vh - 16px);
|
|
4126
|
+
overflow-y: auto;
|
|
4127
|
+
box-sizing: border-box;
|
|
3915
4128
|
}
|
|
3916
4129
|
|
|
4130
|
+
/* Scrolled, not squashed: a flex column shrinks its items to fit a capped height. */
|
|
4131
|
+
.pr-helper-selection-popover-expanded .pr-helper-selection-menu > * { flex-shrink: 0; }
|
|
4132
|
+
|
|
3917
4133
|
.pr-helper-selection-menu-item {
|
|
3918
4134
|
padding: 7px 10px;
|
|
3919
4135
|
border: none;
|