prreviewbuddy 0.86.6 → 0.87.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/static/shell.css CHANGED
@@ -470,10 +470,20 @@ body > * { flex: 0 0 auto; }
470
470
  .prb-shell {
471
471
  display: grid;
472
472
  grid-template-columns: var(--rail-width) minmax(0, 1fr);
473
+ grid-template-rows: auto minmax(0, 1fr);
473
474
  flex: 1 1 0;
474
475
  min-height: 0;
475
476
  }
476
477
  .prb-shell > * { min-height: 0; }
478
+ /* The application shell is the strip and the rail, and the rail starts directly under the strip on
479
+ every page. What a page says about itself (its context bar, or a review's bar and banners) sits at
480
+ the top of the content column beside the rail, so however tall it is it moves only that column.
481
+ Placed by grid line, never by an offset: the rail spans both rows, the bar takes the first row of
482
+ the last column and the content the second, so the same rules hold when the narrow layout drops
483
+ the rail and the shell is one column. */
484
+ .prb-shell > .prb-rail { grid-column: 1; grid-row: 1 / -1; }
485
+ .prb-shell > .prb-context { grid-column: -2; grid-row: 1; }
486
+ .prb-shell > main { grid-column: -2; grid-row: 2; }
477
487
 
478
488
  /* ── The strip's controls ──
479
489
  Notifications, Settings and Stop server, as icons, in the corner they are reached for from. Icon
@@ -605,6 +615,27 @@ body[data-restarting] .prb-body { opacity: 0.55; pointer-events: none; }
605
615
  .prb-strip-action:hover .prb-unread-dot,
606
616
  .prb-strip-action[aria-current="true"] .prb-unread-dot { border-color: var(--surface-2); }
607
617
  .prb-unread-dot[hidden] { display: none; }
618
+ /* The count beside Runs, on the strip's Runs icon: a digit where the bell has a dot, because how
619
+ much is running is the useful part, and capped at 9+ so it stays the size of the corner. */
620
+ .prb-strip-count {
621
+ position: absolute;
622
+ top: -1px;
623
+ right: -3px;
624
+ min-width: 15px;
625
+ padding: 0 4px;
626
+ border: 2px solid var(--bg);
627
+ border-radius: 999px;
628
+ background: var(--wordmark-accent);
629
+ color: var(--bg);
630
+ font-size: var(--t-pill);
631
+ font-weight: 700;
632
+ line-height: 11px;
633
+ text-align: center;
634
+ font-variant-numeric: tabular-nums;
635
+ }
636
+ .prb-strip-action:hover .prb-strip-count,
637
+ .prb-strip-action[aria-current="true"] .prb-strip-count { border-color: var(--surface-2); }
638
+ .prb-strip-count[hidden] { display: none; }
608
639
 
609
640
  /* Said, never shown. The bell carries the count twice: the digit above, capped at 9+, and this,
610
641
  which is the whole number in words. A screen reader hears one bell that knows how many. */
@@ -623,47 +654,39 @@ body[data-restarting] .prb-body { opacity: 0.55; pointer-events: none; }
623
654
 
624
655
  /* ── The context bar ──
625
656
  What page this is, and the controls belonging to it: the dominant bar on a page that is not a
626
- review, exactly as `.prb-review-bar` is on one. It wraps rather than clips, because what it holds
627
- is a row of controls and not a single ref that must stay on one line. */
657
+ review, exactly as `.prb-review-bar` is on one. Two regions, one border: the title row, the same
658
+ height on every page and the same height as the review bar, and beneath it the controls row of a
659
+ page that has controls. So the title sits at the same place on every page and only the presence
660
+ of controls changes how tall the bar is. It does not scroll because nothing it is in scrolls:
661
+ `main`, the row below it in the shell, is the scroller. */
628
662
  .prb-context {
629
- display: flex;
630
- align-items: center;
631
- flex-wrap: wrap;
632
- gap: 12px 16px;
633
663
  flex: none;
634
- min-height: var(--header-height);
635
- padding: 10px 20px;
636
664
  background: var(--surface);
637
665
  border-bottom: 1px solid var(--border);
638
666
  }
667
+ /* Title at the workspace's left edge on every page, never in the list's centred column: it names the
668
+ page, and the page is the whole column. Actions (Mark all read) take the right of the row. A fixed
669
+ height, not a minimum, so a row of actions can never make one page's title row taller. */
670
+ .prb-context-primary {
671
+ display: flex;
672
+ align-items: center;
673
+ gap: 16px;
674
+ box-sizing: border-box;
675
+ height: var(--header-height);
676
+ padding: 0 20px;
677
+ container-type: inline-size;
678
+ }
639
679
  .prb-context .prb-page-title { margin: 0; }
680
+ /* The reviews and runs toolbars sit over the list they govern, so this row takes the list's own
681
+ gutters (`.prb-shell > .prb-index`) and the search's edges are the cards' edges at every width. */
682
+ .prb-context-secondary {
683
+ --list-gutter: max(24px, calc((100% - 960px) / 2 + 24px));
684
+ padding: 12px var(--list-gutter);
685
+ border-top: 1px solid var(--border);
686
+ }
640
687
  /* The controls came up from the top of the page's own column, so the margins that spaced them from
641
688
  the content below them belong to that column, not to this bar. */
642
- .prb-context .prb-index-controls,
643
- .prb-context .prb-settings-back { margin-bottom: 0; }
644
- /* The reviews toolbar shares the list's column rather than the window's right edge.
645
- The bar is full-bleed and the list is a 960px column centred in the space beside the rail, so
646
- right-aligning the controls put them over nothing they govern: the search began past the middle
647
- of the page while the cards below started far to its left. Centring them in the space the title
648
- leaves is not the same thing either -- the title eats the left side, the rail shifts the column
649
- right, and the group lands short of the list by half the rail.
650
- So the title is given the rail's own width and the group the column's, from the same two numbers
651
- the layout below already uses. The search spans the column, so its edges are the cards' edges
652
- at every width wide enough to have a rail. */
653
- /* Scoped with :has() and not by a body class: all three workspace pages share `prb-index-body`,
654
- and only this bar holds the list's controls. */
655
- .prb-context:has(.prb-index-controls) { padding-left: 0; padding-right: 0; column-gap: 0; }
656
- .prb-context:has(.prb-index-controls) .prb-page-title { flex: none; box-sizing: border-box; width: var(--rail-width); padding-left: 20px; }
657
- .prb-context .prb-index-controls {
658
- flex: 1 1 320px;
659
- box-sizing: border-box;
660
- max-width: 960px;
661
- margin: 0 auto;
662
- padding: 0 24px;
663
- }
664
- /* Two rows: the search on its own, the filters below it. Search is how a reviewer finds a review and
665
- the filters refine what it found, so the search takes the column's whole width rather than
666
- competing with three dropdowns for it, and the filters sit together under its left edge. */
689
+ .prb-context .prb-index-controls { margin-bottom: 0; }
667
690
  .prb-context .prb-index-search { flex: 1 1 100%; padding: 6px 10px; font-size: var(--t-meta); }
668
691
  .prb-context-controls {
669
692
  display: flex;
@@ -671,6 +694,22 @@ body[data-restarting] .prb-body { opacity: 0.55; pointer-events: none; }
671
694
  gap: 12px;
672
695
  margin-left: auto;
673
696
  }
697
+ .prb-context-controls .prb-index-select { flex: none; }
698
+ /* Where the title row cannot hold the title, the unread line and Mark all read, the line goes and
699
+ the button stays: the button is the action, and the line says what the dot on the bell already
700
+ says. 270px is where "Nothing unread", the longest the line gets, stops fitting (a window under
701
+ about 310px). Visually hidden rather than removed, because it is the live region a screen reader
702
+ hears. */
703
+ @container (max-width: 270px) {
704
+ .prb-context-controls .prb-index-count {
705
+ position: absolute;
706
+ width: 1px;
707
+ height: 1px;
708
+ margin: -1px;
709
+ overflow: hidden;
710
+ clip-path: inset(50%);
711
+ }
712
+ }
674
713
 
675
714
  /* ── Stop-server dialog ── */
676
715
  .prb-dialog {
@@ -938,10 +977,11 @@ a.prb-author:hover .prb-author-name { color: var(--text-primary); }
938
977
 
939
978
  /* ── Three-pane body ── */
940
979
  .prb-body {
941
- /* Positioned, for Buddy AI's edge tab, which hangs off this box's right edge at its top. */
980
+ /* Positioned, for the assistant's overlay at narrow widths. */
942
981
  position: relative;
943
982
  display: grid;
944
983
  grid-template-columns: var(--rail-width) minmax(0, 1fr) var(--ask-width);
984
+ grid-template-rows: auto minmax(0, 1fr);
945
985
  /* Whatever the banners above did not take, and `0` rather than `auto` as the basis: the height
946
986
  comes from the space left over, never from the content. With `auto` the browser measures the
947
987
  panes first, which is how a pane full of findings ends up deciding how tall the shell is. */
@@ -957,6 +997,19 @@ a.prb-author:hover .prb-author-name { color: var(--text-primary); }
957
997
  * `min-height: auto` on a grid item made every pane as tall as its content and the whole page went
958
998
  * rigid. `.prb-ask` already carried its own copy of this line, which was the clue. */
959
999
  .prb-body > * { min-height: 0; }
1000
+ /* The review's header (its bar and banners) is the first row of the columns right of the rail, as a
1001
+ workspace page's context bar is (see `.prb-shell`): it spans the document and the assistant, and
1002
+ pushes down only them. The rail spans both rows from directly under the strip. The panes take the
1003
+ second row and are placed into its columns in order. Where the rail is not drawn (focus mode, the
1004
+ narrow layout) the body is one column and the header spans it. */
1005
+ .prb-body > .prb-review-head { grid-column: 2 / -1; grid-row: 1; min-width: 0; }
1006
+ .prb-body > .prb-rail { grid-column: 1; grid-row: 1 / -1; }
1007
+ .prb-body > .prb-doc,
1008
+ .prb-body > .prb-ask { grid-row: 2; }
1009
+ /* Buddy AI's edge tab and, at narrow widths, the assistant's overlay are positioned against the
1010
+ panes' row rather than the whole body, so neither covers the header. An absolutely positioned
1011
+ grid child takes the area its lines name as its containing block. */
1012
+ .prb-body > .prb-ask-tab { grid-row: 2; grid-column: 1 / -1; }
960
1013
  /* No `data-ask` means "whatever fits" — wide viewports show the assistant, narrow ones do not.
961
1014
  The attribute appears only once the reviewer states a preference, and from then on it wins. */
962
1015
  .prb-body[data-ask='closed'] { grid-template-columns: var(--rail-width) minmax(0, 1fr) 0; }
@@ -974,8 +1027,32 @@ a.prb-author:hover .prb-author-name { color: var(--text-primary); }
974
1027
  overflow-y: auto;
975
1028
  padding: 18px 0 18px;
976
1029
  }
977
- /* Everything that is not this review sits at the bottom, out of the reading path. */
1030
+ /* Three parts, in one order on every page: the places, this review's section (review pages only),
1031
+ the foot. The places and the foot keep their size; the section takes what is left and scrolls on
1032
+ its own, so a long review path never pushes Runs or Collapse sidebar out of the window. The rail
1033
+ still scrolls as a whole if the places and the foot alone are taller than it. */
1034
+ .prb-rail-places,
1035
+ .prb-rail-foot { flex: none; }
978
1036
  .prb-rail-foot { margin-top: auto; }
1037
+ .prb-rail-context {
1038
+ flex: 1 1 auto;
1039
+ min-height: 0;
1040
+ overflow-y: auto;
1041
+ overscroll-behavior: contain;
1042
+ }
1043
+ .prb-rail-places + .prb-rail-context { margin-top: 22px; padding-top: 18px; border-top: 1px solid var(--border); }
1044
+ /* The foot is anchored to the bottom by its auto margin, whatever is above it and however short.
1045
+ The rule between groups sets a fixed margin and is more specific than `.prb-rail-foot`, so it had
1046
+ been winning and leaving the foot wherever the rows above it ended. The gap it kept is now the
1047
+ least space above the foot, held by whatever precedes it, which an auto margin cannot hold. */
1048
+ .prb-rail > .prb-rail-group.prb-rail-foot { margin-top: auto; padding-top: 18px; border-top: 1px solid var(--border); }
1049
+ .prb-rail > :has(+ .prb-rail-foot) { margin-bottom: 22px; }
1050
+ /* The page with no places (the offline preview) starts with the section, with nothing to rule off. */
1051
+ .prb-rail-context-title { margin: 0; }
1052
+ /* KISS, the section's last group, is set apart by space alone: it belongs to this review as much as
1053
+ the rows above it, and a rule would say it did not. The same in every state, so sliding a Compact
1054
+ sidebar out does not move it. */
1055
+ .prb-rail-context > .prb-rail-group { margin-top: 12px; }
979
1056
  a.prb-rail-item { text-decoration: none; }
980
1057
  .prb-rail-item:disabled { opacity: 0.6; cursor: default; }
981
1058
  /* Operational, and it ends every open review rather than this one. It stays quiet — the
@@ -1142,15 +1219,25 @@ a.prb-rail-item { text-decoration: none; }
1142
1219
  }
1143
1220
  :root[data-sidebar-compact][data-sidebar-peek] .prb-rail {
1144
1221
  width: var(--rail-full-width);
1222
+ overflow-x: hidden;
1145
1223
  box-shadow: 8px 0 24px var(--shadow-float);
1146
1224
  }
1225
+ /* The rows are laid out at the width they will end at from the first frame, inside the rail's one
1226
+ pixel of border, so the growing edge only uncovers them. Laid out at the passing width instead,
1227
+ "Review path" and "PR context" wrapped to two lines part-way and every row below dropped. */
1228
+ :root[data-sidebar-compact][data-sidebar-peek] .prb-rail > * { width: calc(var(--rail-full-width) - 1px); }
1147
1229
 
1148
- /* Compact: every row is its icon, named in a tooltip beside it on hover and keyboard focus. The
1149
- tooltip is the row's own label, moved out to the right, so the name a screen reader hears is
1150
- the one it always heard. What has no icon (headings, the numbered review path, the folds, the
1151
- counts) waits for Expanded. The rail lets the tooltips out past its edge, and sits above the
1152
- pane beside it so they draw over it. */
1230
+ /* Compact: every row is its icon. What has no icon (headings, the numbered review path, the folds,
1231
+ most counts) waits for the sidebar to slide out, which resting the pointer on it or tabbing into
1232
+ it does at once, so a row's name is never shown any other way. It is still the row's name for a
1233
+ screen reader: the label stays in the row, only undrawn. Neither the rail nor its section
1234
+ scrolls in the 56px strip, where a scrollbar would take a third of it. */
1153
1235
  :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail { overflow: visible; }
1236
+ /* The section keeps the height it has when slid out, so the foot stays on screen however short the
1237
+ window and no row moves when the sidebar slides out. It clips vertically only, which `clip` can do
1238
+ and `hidden` cannot, so the corner marks are never cut at its side, and rows past its end are
1239
+ reached by sliding the sidebar out (pointer or Tab), where it scrolls. */
1240
+ :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-context { overflow-x: visible; overflow-y: clip; }
1154
1241
  :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-item {
1155
1242
  position: relative;
1156
1243
  justify-content: center;
@@ -1159,66 +1246,81 @@ a.prb-rail-item { text-decoration: none; }
1159
1246
  padding: 9px 0;
1160
1247
  border-left-width: 0;
1161
1248
  }
1162
- :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-item .prb-rail-label {
1249
+ /* Undrawn, not removed: the label is still the row's name, and New review's. */
1250
+ :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-item .prb-rail-label,
1251
+ :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-new-review-label {
1163
1252
  position: absolute;
1164
- top: 50%;
1165
- left: calc(100% + 6px);
1166
- transform: translateY(-50%);
1167
- padding: 5px 8px;
1168
- border-radius: 6px;
1169
- background: var(--text-primary);
1170
- color: var(--bg);
1171
- font-size: var(--t-micro);
1172
- font-weight: 500;
1173
- line-height: 1.4;
1253
+ width: 1px;
1254
+ height: 1px;
1255
+ overflow: hidden;
1256
+ clip-path: inset(50%);
1174
1257
  white-space: nowrap;
1175
- opacity: 0;
1176
- pointer-events: none;
1177
- z-index: 1;
1178
1258
  }
1179
- :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-item .prb-rail-label * { color: inherit; font: inherit; }
1180
- :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-item:hover .prb-rail-label,
1181
- :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-item:focus-visible .prb-rail-label { opacity: 1; transition: opacity 0.1s 0.35s; }
1182
1259
  :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-count,
1183
1260
  :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-selected,
1184
1261
  :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-twisty,
1185
1262
  :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-heading,
1186
- :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-subhead,
1187
1263
  :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-path { display: none; }
1188
- :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-body { margin: 0; border-left: 0; }
1189
- :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-body .prb-rail-item { padding-left: 0; }
1190
- :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-group + .prb-rail-group { margin-top: 12px; padding-top: 12px; }
1191
- /* New review is the square + at the top, its name and shortcut in the strip's own tooltip. */
1192
- :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-new { padding: 0 10px 10px; }
1193
- :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-new-review { position: relative; justify-content: center; width: 36px; padding: 0; }
1194
- :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-new-review-label,
1195
- :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-new-review-key { display: none; }
1196
- :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-new-review[data-tip]::after {
1197
- content: attr(data-tip);
1264
+ /* The Review path row keeps its height, undrawn, so the icons under it are already where the
1265
+ expanded rows will be and sliding out moves nothing up or down. Hidden this way it is out of the
1266
+ tab order and the accessibility tree, as `display: none` had it; tabbing into the rail peeks it,
1267
+ which draws the row again before focus can reach it. One line, clipped: wrapped in the narrow
1268
+ strip it would be a line taller than the row it stands in for. */
1269
+ :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-subhead { visibility: hidden; overflow: hidden; }
1270
+ :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-subhead .prb-rail-heading { display: block; white-space: nowrap; }
1271
+ /* The section's heading keeps its height undrawn for the same reason, so the review's icons are
1272
+ already where they will be when the sidebar slides out. */
1273
+ :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-heading.prb-rail-context-title { display: block; visibility: hidden; overflow: hidden; white-space: nowrap; }
1274
+ /* The count beside Runs is the one count Compact keeps, as a mark on the icon's corner: work going
1275
+ on is the thing a reader with the sidebar folded most needs to see. Unread has the bell's dot. */
1276
+ :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-count.prb-rail-running:not([hidden]) {
1277
+ display: block;
1198
1278
  position: absolute;
1199
- top: 50%;
1200
- left: calc(100% + 6px);
1201
- transform: translateY(-50%);
1202
- padding: 5px 8px;
1203
- border-radius: 6px;
1204
- background: var(--text-primary);
1279
+ top: 3px;
1280
+ left: calc(50% + 2px);
1281
+ min-width: 15px;
1282
+ padding: 0 4px;
1283
+ border: 2px solid var(--bg);
1284
+ border-radius: 999px;
1285
+ background: var(--wordmark-accent);
1205
1286
  color: var(--bg);
1206
- font-size: var(--t-micro);
1207
- font-weight: 500;
1208
- line-height: 1.4;
1209
- white-space: nowrap;
1210
- opacity: 0;
1211
- pointer-events: none;
1212
- z-index: 1;
1287
+ font-size: var(--t-pill);
1288
+ line-height: 11px;
1289
+ text-align: center;
1213
1290
  }
1214
- :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-new-review[data-tip]:hover::after,
1215
- :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-new-review[data-tip]:focus-visible::after { opacity: 1; transition: opacity 0.1s 0.35s; }
1291
+ /* Issues and Questions keep their indicator too, on the same corner as Runs, but quiet: what is
1292
+ left is a fact about the review, not an alert. The same element as Expanded, so the figure, the
1293
+ zero and the tick are whatever the expanded row says. Absolute, so no icon or row moves. The ring
1294
+ is the row's own background, so it separates the mark from the icon on every row state. */
1295
+ :root[data-sidebar-compact]:not([data-sidebar-peek]) :is([data-view-nav='issues'], [data-view-nav='questions']) .prb-rail-count {
1296
+ display: block;
1297
+ position: absolute;
1298
+ top: 3px;
1299
+ left: calc(50% + 1px);
1300
+ min-width: 13px;
1301
+ padding: 0 2px;
1302
+ border-radius: 999px;
1303
+ background: var(--surface-2);
1304
+ box-shadow: 0 0 0 1px var(--rail-mark-ring, var(--bg));
1305
+ color: var(--text-secondary);
1306
+ font-size: var(--t-pill);
1307
+ font-weight: 600;
1308
+ line-height: 13px;
1309
+ text-align: center;
1310
+ }
1311
+ :root[data-sidebar-compact]:not([data-sidebar-peek]) :is([data-view-nav='issues'], [data-view-nav='questions']) .prb-rail-count-done { color: var(--success); font-weight: 700; }
1312
+ :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-item:hover { --rail-mark-ring: var(--surface-hover); }
1313
+ :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-item[aria-current='true'] { --rail-mark-ring: var(--brand-muted); }
1314
+ :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-body { margin-left: 0; border-left: 0; }
1315
+ :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-body .prb-rail-item { padding-left: 0; }
1316
+ /* New review is the square + at the top; sliding out shows its name and shortcut beside it. */
1317
+ :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-rail-new { padding: 0 10px 10px; }
1318
+ :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-new-review { justify-content: center; width: 36px; padding: 0; }
1319
+ :root[data-sidebar-compact]:not([data-sidebar-peek]) .prb-new-review-key { display: none; }
1216
1320
 
1217
1321
  /* Hidden: the strip's square New review stands in, as it does whenever the rail is not drawn. Send
1218
1322
  feedback belongs to the sidebar and goes with it; the strip has no copy of it at any width. */
1219
1323
  :root[data-sidebar-hidden] .prb-strip .prb-strip-new-review { display: flex; }
1220
- /* The page title is set in the rail's column, so it keeps its own width while that column narrows. */
1221
- :root:is([data-sidebar-compact], [data-sidebar-hidden]) .prb-context:has(.prb-index-controls) .prb-page-title { width: auto; }
1222
1324
  /* The pages under a review type (Issues, Questions, Files, PR context) and the links at the foot
1223
1325
  share the group rows' white, so the grey themes in the review path read as their own list.
1224
1326
  Weight still separates these from the group rows above them. Must come after `.prb-rail-item`:
@@ -2933,6 +3035,7 @@ a.prb-guide-pick { text-decoration: none; }
2933
3035
  .prb-body:not([data-ask='open']),
2934
3036
  .prb-body[data-ask='open'] { grid-template-columns: minmax(0, 1fr); }
2935
3037
  .prb-rail { display: none; }
3038
+ .prb-body > .prb-review-head { grid-column: 1 / -1; }
2936
3039
  .prb-strip .prb-strip-new-review { display: flex; }
2937
3040
  /* No sidebar fits at this width, so Show sidebar would bring back nothing. */
2938
3041
  :root[data-sidebar-hidden] .prb-strip .prb-sidebar-restore { display: none; }
@@ -2951,11 +3054,6 @@ a.prb-guide-pick { text-decoration: none; }
2951
3054
  width: min(var(--ask-width), 100%);
2952
3055
  }
2953
3056
  .pr-helper-sidebar.prb-pane { padding: 20px 18px 48px; }
2954
- /* No rail here, so there is no column beside it for the toolbar to share: the bar goes back to a
2955
- title and a row of controls, each taking the width it needs. */
2956
- .prb-context:has(.prb-index-controls) { padding-left: 20px; padding-right: 20px; column-gap: 16px; }
2957
- .prb-context:has(.prb-index-controls) .prb-page-title { width: auto; padding-left: 0; }
2958
- .prb-context .prb-index-controls { max-width: none; padding: 0; }
2959
3057
  }
2960
3058
 
2961
3059
  /* Phone width. Both bars were one fixed-height row of things that could not shrink, so below about
@@ -5543,21 +5641,6 @@ span.prb-arch-location:hover { text-decoration: none; }
5543
5641
  ground the rail and header have. It reuses `.prb-index` for the column and `.prb-field` for the
5544
5642
  controls; what is here is only the vertical rhythm of stacked sections and the two things a form
5545
5643
  has that no other page in this product has, a save and something to say about it. */
5546
- /* The way out, where a way out goes: top left of the content, above the first section, rather than
5547
- among the version and the feedback link where it reads as chrome. The caret is the same one the
5548
- rail uses for "All reviews", so the two say the same thing in the same shape. */
5549
- .prb-settings-back {
5550
- display: inline-block;
5551
- margin-bottom: 14px;
5552
- padding: 5px 10px 5px 8px;
5553
- border: 1px solid var(--border);
5554
- border-radius: 8px;
5555
- color: var(--text-secondary);
5556
- font-size: var(--t-meta);
5557
- text-decoration: none;
5558
- }
5559
- .prb-settings-back:hover { color: var(--text-primary); border-color: var(--border-strong); }
5560
- .prb-settings-back:focus-visible { outline: 2px solid var(--brand-hover); outline-offset: 2px; }
5561
5644
  .prb-settings-section {
5562
5645
  padding: 20px 0;
5563
5646
  border-bottom: 1px solid var(--border);
@@ -5854,7 +5937,8 @@ select.prb-addreview-control {
5854
5937
 
5855
5938
  /* ── Notifications ── */
5856
5939
 
5857
- .prb-rail-unread { color: var(--wordmark-accent); font-weight: 700; }
5940
+ .prb-rail-unread,
5941
+ .prb-rail-running { color: var(--wordmark-accent); font-weight: 700; }
5858
5942
 
5859
5943
  .prb-notifications {
5860
5944
  list-style: none;
@@ -6001,6 +6085,7 @@ a.prb-notification-open:focus-visible { outline: 2px solid var(--brand-hover); o
6001
6085
  and without depending on this block staying last. */
6002
6086
  body .prb-body[data-focus] { grid-template-columns: minmax(0, 1fr); }
6003
6087
  body .prb-body[data-focus] .prb-rail { display: none; }
6088
+ body .prb-body[data-focus] > .prb-review-head { grid-column: 1 / -1; }
6004
6089
  /* The rail's New review goes with it, so the strip's square one stands in, as below 860px. */
6005
6090
  body:has(.prb-body[data-focus]) .prb-strip .prb-strip-new-review { display: flex; }
6006
6091
  /* Focus is left from the pane it expanded, so Show sidebar would bring back nothing here. */