prreviewbuddy 0.83.3 → 0.86.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prreviewbuddy",
3
- "version": "0.83.3",
3
+ "version": "0.86.1",
4
4
  "description": "Understand code changes before you approve them. Local branch and pull request reviews with Claude Code or Codex.",
5
5
  "license": "UNLICENSED",
6
6
  "homepage": "https://prreviewbuddy.com",
package/static/help.js CHANGED
@@ -1 +1 @@
1
- import{at as e,d as t,f as n,ft as r,p as i,rt as a,t as o}from"./chunk-DwdwtB9r.js";a(),t(`global`,{}),document.querySelector(`[data-shortcut-table]`)?.replaceChildren(n(document,i(e(navigator)))),o(`/restart`),r(window,()=>window.location.reload());
1
+ import{at as e,d as t,f as n,ft as r,p as i,rt as a,t as o}from"./chunk-DwdwtB9r.js";function s(e,t){if(e.length===0)return-1;if(t)return e.length-1;let n=0;return e.forEach((e,t)=>{e<=120&&(n=t)}),n}var c=new Set([`ArrowDown`,`ArrowUp`,`PageDown`,`PageUp`,`Home`,`End`,` `]);function l(e,t){let n=[...e.querySelectorAll(`.prb-help-contents a[href^="#"]`)],r=n.map(t=>e.getElementById(decodeURIComponent(t.hash.slice(1)))),i=e.defaultView;if(n.length===0||!i)return;let a=r.findIndex(e=>e!==null&&`#${e.id}`===i.location.hash),o=e=>{n.forEach((t,n)=>{n===e?t.setAttribute(`aria-current`,`location`):t.removeAttribute(`aria-current`)})},l=()=>{if(a>=0)return o(a);let n=t.scrollHeight>t.clientHeight?t:e.scrollingElement??e.documentElement,i=Math.max(0,n===t?t.getBoundingClientRect().top:0),c=r.map(e=>e?e.getBoundingClientRect().top-i:1/0),l=n.scrollTop>0&&n.scrollTop+n.clientHeight>=n.scrollHeight-2;o(s(c,l))},u=e=>{let t=r.findIndex(t=>t!==null&&`#${t.id}`===e);t<0||(a=t,o(t))},d=()=>{a<0||(a=-1,l())};e.addEventListener(`click`,e=>{let t=e.target?.closest?.(`a[href^="#"]`);t&&u(t.hash)}),i.addEventListener(`hashchange`,()=>u(i.location.hash)),t.addEventListener(`wheel`,d,{passive:!0}),t.addEventListener(`touchmove`,d,{passive:!0}),t.addEventListener(`pointerdown`,d),e.addEventListener(`keydown`,e=>{c.has(e.key)&&d()}),e.addEventListener(`scroll`,l,{capture:!0,passive:!0}),i.addEventListener(`resize`,l),l()}a(),t(`global`,{}),document.querySelector(`[data-shortcut-table]`)?.replaceChildren(n(document,i(e(navigator)))),o(`/restart`);var u=document.querySelector(`main.prb-help`);u&&l(document,u),r(window,()=>window.location.reload());
package/static/shell.css CHANGED
@@ -173,6 +173,8 @@
173
173
  :root[data-theme='dark'] { color-scheme: dark; }
174
174
 
175
175
  * { box-sizing: border-box; }
176
+ /* No link in the workspace is underlined, at rest or on hover: colour says it is a link. */
177
+ a { text-decoration: none; }
176
178
 
177
179
  html, body {
178
180
  height: 100%;
@@ -758,7 +760,7 @@ body[data-server-stopped] .prb-shell { opacity: 0.55; pointer-events: none; }
758
760
  .prb-author::before { content: 'by'; color: var(--text-muted); }
759
761
  .prb-author-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
760
762
  .prb-author-handle { color: var(--text-muted); }
761
- a.prb-author:hover .prb-author-name { color: var(--text-primary); text-decoration: underline; }
763
+ a.prb-author:hover .prb-author-name { color: var(--text-primary); }
762
764
 
763
765
  .prb-pr-empty, .prb-pr-provenance, .prb-pr-truncated {
764
766
  font-size: var(--t-body);
@@ -775,7 +777,7 @@ a.prb-author:hover .prb-author-name { color: var(--text-primary); text-decoratio
775
777
  margin-bottom: 26px;
776
778
  }
777
779
  .prb-pr-provenance a { color: var(--brand); font-weight: 400; text-decoration: none; }
778
- .prb-pr-provenance a:hover { text-decoration: underline; }
780
+ .prb-pr-provenance a:hover { opacity: 0.8; }
779
781
  .prb-pr-title { color: var(--pane-ink); }
780
782
  .prb-pr-counts, .prb-pr-provenance time { color: var(--pane-ink-faint); font-size: var(--t-meta); }
781
783
 
@@ -846,7 +848,7 @@ a.prb-author:hover .prb-author-name { color: var(--text-primary); text-decoratio
846
848
  }
847
849
  .prb-pr-comment-meta { display: flex; gap: 8px; align-items: baseline; font-size: var(--t-meta); }
848
850
  .prb-pr-comment-meta a { color: var(--brand); font-weight: 400; text-decoration: none; }
849
- .prb-pr-comment-meta a:hover { text-decoration: underline; }
851
+ .prb-pr-comment-meta a:hover { opacity: 0.8; }
850
852
  .prb-pr-comment-meta time { color: var(--pane-ink-faint); }
851
853
  /* Someone else's words, rendered as the Markdown they wrote rather than as one flat block. Light
852
854
  pane, so literals throughout: see pane_palette.test.ts. */
@@ -1829,6 +1831,36 @@ a.prb-rail-item { text-decoration: none; }
1829
1831
  .pr-helper-explain-simply-button:disabled { opacity: 0.55; cursor: default; }
1830
1832
  .pr-helper-explain-simply-button:disabled:hover { background: transparent; }
1831
1833
 
1834
+ /* What a finished turn offers under its answer: Reconcile with findings, or a reconcile's Accept all.
1835
+ Quiet, the size of the answer's own meta, so a long conversation does not read as a column of
1836
+ buttons; the one sentence beside it says what the action is for. */
1837
+ .prb-turn-actions {
1838
+ display: flex;
1839
+ flex-wrap: wrap;
1840
+ align-items: baseline;
1841
+ gap: 4px 10px;
1842
+ margin: -2px 0 10px;
1843
+ }
1844
+ .prb-turn-reconcile,
1845
+ .prb-turn-accept-all {
1846
+ padding: 3px 10px;
1847
+ border: 1px solid var(--border);
1848
+ border-radius: 8px;
1849
+ background: transparent;
1850
+ color: var(--text-secondary);
1851
+ font: inherit;
1852
+ font-size: var(--t-micro);
1853
+ cursor: pointer;
1854
+ }
1855
+ .prb-turn-accept-all { border-color: var(--brand-hover); color: var(--text-primary); font-weight: 600; }
1856
+ .prb-turn-reconcile:hover:not(:disabled),
1857
+ .prb-turn-accept-all:hover:not(:disabled) { border-color: var(--border-strong); color: var(--text-primary); }
1858
+ .prb-turn-reconcile:focus-visible,
1859
+ .prb-turn-accept-all:focus-visible { outline: 2px solid var(--brand-hover); outline-offset: 2px; }
1860
+ .prb-turn-reconcile:disabled,
1861
+ .prb-turn-accept-all:disabled { opacity: 0.55; cursor: default; }
1862
+ .prb-turn-help { margin: 0; color: var(--text-secondary); font-size: var(--t-micro); }
1863
+
1832
1864
  /* ── The reviewer's own prompts ──
1833
1865
  A strip between the assistant's header and its conversation: reachable without scrolling the
1834
1866
  log, and out of the composer, which is already carrying the scope, the field and the button.
@@ -2244,12 +2276,10 @@ a.prb-rail-item { text-decoration: none; }
2244
2276
  color: inherit;
2245
2277
  font: inherit;
2246
2278
  font-weight: 400;
2247
- text-decoration: underline;
2248
- text-decoration-color: var(--brand);
2249
- text-underline-offset: 3px;
2279
+ color: var(--pane-accent);
2250
2280
  cursor: pointer;
2251
2281
  }
2252
- .prb-doc-note-link:hover { color: var(--pane-ink); text-decoration-thickness: 2px; }
2282
+ .prb-doc-note-link:hover { color: var(--pane-ink); }
2253
2283
 
2254
2284
  .prb-doc-note {
2255
2285
  margin: 0 0 14px;
@@ -2396,25 +2426,21 @@ a.prb-rail-item { text-decoration: none; }
2396
2426
  /* Everything that is not the primary action. Text, not a box: as bordered buttons these competed
2397
2427
  with Update review and the panel read as four equal choices.
2398
2428
 
2399
- Resting at full contrast with a brand underline, which is where they used to arrive only on
2400
- hover. Muted grey on a grey rule was quiet to the point of being scenery: half of these are the
2401
- only way to do the thing the sentence beside them is describing, and a control nobody can see is
2402
- not restraint. Hover thickens the rule instead, so pointing at one still answers. */
2429
+ Resting in the link colour, not muted grey. Grey was quiet to the point of being scenery: half of
2430
+ these are the only way to do the thing the sentence beside them is describing, and a control
2431
+ nobody can see is not restraint. Hover takes them to the primary ink, so pointing at one answers. */
2403
2432
  .prb-fresh-quiet {
2404
2433
  padding: 2px 0;
2405
2434
  border: 0;
2406
2435
  background: none;
2407
- color: var(--text-primary);
2436
+ color: var(--link);
2408
2437
  font: inherit;
2409
2438
  font-size: var(--t-micro);
2410
- text-decoration: underline;
2411
- text-decoration-color: var(--brand);
2412
- text-underline-offset: 3px;
2413
2439
  /* It sits inside a sentence now, so it sits on that sentence's baseline. */
2414
2440
  vertical-align: baseline;
2415
2441
  cursor: pointer;
2416
2442
  }
2417
- .prb-fresh-quiet:hover:not(:disabled) { text-decoration-thickness: 2px; }
2443
+ .prb-fresh-quiet:hover:not(:disabled) { color: var(--text-primary); }
2418
2444
  .prb-fresh-quiet:disabled { opacity: 0.55; cursor: default; }
2419
2445
 
2420
2446
  /* Dismissal, at the end of the row it dismisses. An icon rather than the word `Close`, because it
@@ -2601,17 +2627,14 @@ a.prb-rail-item { text-decoration: none; }
2601
2627
  .prb-update-alt > summary,
2602
2628
  .prb-fresh-more > summary {
2603
2629
  display: inline-block;
2604
- color: var(--text-primary);
2605
- text-decoration: underline;
2606
- text-decoration-color: var(--brand);
2607
- text-underline-offset: 3px;
2630
+ color: var(--link);
2608
2631
  cursor: pointer;
2609
2632
  list-style: none;
2610
2633
  }
2611
2634
  .prb-update-alt > summary::-webkit-details-marker,
2612
2635
  .prb-fresh-more > summary::-webkit-details-marker { display: none; }
2613
2636
  .prb-update-alt > summary:hover,
2614
- .prb-fresh-more > summary:hover { text-decoration-thickness: 2px; }
2637
+ .prb-fresh-more > summary:hover { color: var(--text-primary); }
2615
2638
  /* Only this one announces itself as expandable. `Start a new review` reads as an action beside
2616
2639
  `Check review status` and a caret would advertise the disclosure rather than the choice; `More
2617
2640
  details` has nothing to offer except opening, so it says so. */
@@ -3092,7 +3115,7 @@ a.prb-guide-pick { text-decoration: none; }
3092
3115
  opacity: 0.8;
3093
3116
  cursor: pointer;
3094
3117
  }
3095
- .prb-code-deletion-toggle:hover { opacity: 1; text-decoration: underline; }
3118
+ .prb-code-deletion-toggle:hover { opacity: 1; }
3096
3119
  .prb-code-deleted { background: rgba(248, 81, 73, 0.1); }
3097
3120
  .prb-code-deleted .prb-code-num { box-shadow: inset 2px 0 0 #cf222e; color: #a40e26; }
3098
3121
  .prb-code-deleted .prb-code-line { color: #6e7781; }
@@ -3105,7 +3128,6 @@ a.prb-guide-pick { text-decoration: none; }
3105
3128
  background: none;
3106
3129
  font: inherit;
3107
3130
  color: #57606a;
3108
- text-decoration: underline;
3109
3131
  cursor: pointer;
3110
3132
  }
3111
3133
  .prb-code-long-toggle:hover { color: #1f2328; }
@@ -4380,7 +4402,7 @@ a.prb-guide-pick { text-decoration: none; }
4380
4402
  .prb-arch-trail { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; min-height: 26px; font-size: var(--t-meta); color: #57606a; }
4381
4403
  .prb-arch-crumb { padding: 3px 0; border: 0; background: none; font: inherit; color: inherit; }
4382
4404
  button.prb-arch-crumb { color: #7e22ce; cursor: pointer; }
4383
- button.prb-arch-crumb:hover { text-decoration: underline; }
4405
+ button.prb-arch-crumb:hover { opacity: 0.8; }
4384
4406
  button.prb-arch-crumb:focus-visible { outline: 2px solid #9333ea; outline-offset: 1px; }
4385
4407
  .prb-arch-crumb[aria-current] { font-weight: 600; color: #1f2328; }
4386
4408
  .prb-arch-crumb-sep { color: #8c959f; }
@@ -4419,7 +4441,7 @@ button.prb-arch-crumb:focus-visible { outline: 2px solid #9333ea; outline-offset
4419
4441
  cursor: pointer;
4420
4442
  overflow-wrap: anywhere;
4421
4443
  }
4422
- .prb-arch-location:hover { text-decoration: underline; }
4444
+ .prb-arch-location:hover { opacity: 0.8; }
4423
4445
  .prb-arch-location:focus-visible { outline: 2px solid #9333ea; outline-offset: 1px; }
4424
4446
  span.prb-arch-location { color: #57606a; cursor: default; }
4425
4447
  span.prb-arch-location:hover { text-decoration: none; }
@@ -4658,7 +4680,7 @@ span.prb-arch-location:hover { text-decoration: none; }
4658
4680
  text-align: left;
4659
4681
  cursor: pointer;
4660
4682
  }
4661
- .prb-map-goto:hover { text-decoration: underline; }
4683
+ .prb-map-goto:hover { opacity: 0.8; }
4662
4684
 
4663
4685
  .prb-map-edges {
4664
4686
  position: absolute;
@@ -5418,7 +5440,7 @@ span.prb-arch-location:hover { text-decoration: none; }
5418
5440
  cursor: pointer;
5419
5441
  }
5420
5442
  .prb-kiss-location:hover { background: rgba(147, 51, 234, 0.14); }
5421
- .prb-kiss-location:hover .pr-helper-path-name { text-decoration: underline; }
5443
+ .prb-kiss-location:hover .pr-helper-path-name { opacity: 0.8; }
5422
5444
  /* The filename is a block, so the two markers that qualify it need a line of their own to share
5423
5445
  with it rather than one each above and below it. Baseline-aligned: they are small caps beside
5424
5446
  ordinary text and should sit on its line, not be centred against its box. */
@@ -5638,7 +5660,6 @@ select.prb-addreview-control {
5638
5660
  /* Clear of the sticky bars when arrived at by its anchor. */
5639
5661
  scroll-margin-top: 96px;
5640
5662
  }
5641
- .prb-help-topic:first-of-type { padding-top: 4px; }
5642
5663
  .prb-help-topic:last-of-type { border-bottom: 0; }
5643
5664
  .prb-help-topic h2 { margin: 0 0 12px; font-size: var(--t-section); font-weight: 600; color: var(--text-primary); }
5644
5665
  .prb-help-topic h3 { margin: 20px 0 8px; font-size: var(--t-body); font-weight: 600; color: var(--text-primary); }
@@ -5646,13 +5667,89 @@ select.prb-addreview-control {
5646
5667
  .prb-help-topic ul { margin: 0 0 10px; padding-left: 20px; }
5647
5668
  .prb-help-topic li { margin-bottom: 4px; }
5648
5669
  .prb-help-topic code { font-size: var(--t-code); color: var(--text-primary); }
5670
+ /* Welcome: a small capitalised label over the line the product stands on, and the principles as
5671
+ three short statements, each named in the primary ink and explained in the secondary. */
5672
+ .prb-help-topic .prb-help-eyebrow {
5673
+ margin: 0 0 6px;
5674
+ font-size: var(--t-micro);
5675
+ font-weight: 600;
5676
+ letter-spacing: 0.06em;
5677
+ text-transform: uppercase;
5678
+ color: var(--text-tertiary, var(--text-secondary));
5679
+ }
5680
+ .prb-help-topic h3.prb-help-eyebrow { margin-top: 24px; margin-bottom: 10px; }
5681
+ .prb-help-topic .prb-help-headline { margin: 0 0 14px; font-size: var(--t-title); line-height: 1.3; }
5682
+ .prb-help-principles { display: grid; gap: 12px; margin: 0; }
5683
+ .prb-help-principles dt { font-weight: 600; color: var(--text-primary); }
5684
+ .prb-help-principles dd { margin: 2px 0 0; }
5685
+ .prb-help-tour { margin-top: 20px; }
5686
+ /* An action, not a reference: it starts something, so it looks like the tour's own Next. */
5687
+ /* Through `.prb-help-topic a`, whose link colour would otherwise be drawn on the button's own purple. */
5688
+ .prb-help-topic a.prb-help-tour-action {
5689
+ display: inline-block;
5690
+ padding: 5px 12px;
5691
+ border-radius: 8px;
5692
+ background: var(--brand);
5693
+ color: var(--on-brand);
5694
+ font-weight: 600;
5695
+ }
5696
+ .prb-help-topic a.prb-help-tour-action:hover { background: var(--brand-hover); }
5649
5697
  .prb-help-topic a { color: var(--link); }
5650
- /* The topic index: links in a wrapping row, above the first topic and ruled off from it. */
5651
- .prb-help-contents { padding: 16px 0; border-bottom: 1px solid var(--border); }
5652
- .prb-help-contents ul { display: flex; flex-wrap: wrap; gap: 6px 20px; margin: 0; padding: 0; list-style: none; }
5653
- .prb-help-contents a { font-size: var(--t-body); color: var(--text-secondary); text-decoration: none; }
5654
- .prb-help-contents a:hover { color: var(--text-primary); text-decoration: underline; }
5655
- .prb-help-contents + .prb-help-topic { padding-top: 20px; }
5698
+ /* Wider than the 960px every other page keeps, by the index's column, so the topics keep the
5699
+ measure they had when the index sat above them. */
5700
+ .prb-shell > .prb-help {
5701
+ padding-inline: max(24px, calc((100% - 1200px) / 2 + 24px));
5702
+ container-type: inline-size;
5703
+ }
5704
+ /* The topics, and their index in a column beside them that stays in view while they scroll. The
5705
+ index comes first in the document and is placed second here. */
5706
+ .prb-help-layout {
5707
+ display: grid;
5708
+ grid-template-columns: minmax(0, 1fr) 208px;
5709
+ column-gap: 32px;
5710
+ align-items: start;
5711
+ }
5712
+ .prb-help-layout > .prb-page-panel { grid-column: 1; grid-row: 1; }
5713
+ .prb-help-contents {
5714
+ grid-column: 2;
5715
+ grid-row: 1;
5716
+ position: sticky;
5717
+ /* The pane's own top padding is the gap, at rest and stuck alike, so the index never jumps. */
5718
+ top: 0;
5719
+ max-height: calc(100dvh - 160px);
5720
+ overflow-y: auto;
5721
+ padding: 4px 0;
5722
+ }
5723
+ .prb-help-contents ul { margin: 0; padding: 0; list-style: none; border-left: 1px solid var(--border); }
5724
+ /* The rail's mark for where you are: a brand rule on the left and the tinted ground, here over the
5725
+ list's own rule so the mark sits on the track it moves along. */
5726
+ .prb-help-contents a {
5727
+ display: block;
5728
+ margin-left: -1px;
5729
+ padding: 5px 10px 5px 14px;
5730
+ border-left: 2px solid transparent;
5731
+ border-radius: 0 6px 6px 0;
5732
+ font-size: var(--t-meta);
5733
+ line-height: 1.4;
5734
+ color: var(--text-secondary);
5735
+ text-decoration: none;
5736
+ }
5737
+ .prb-help-contents a:hover { color: var(--text-primary); background: var(--surface-hover); }
5738
+ .prb-help-contents a[aria-current] {
5739
+ border-left-color: var(--brand);
5740
+ background: var(--brand-muted);
5741
+ color: var(--text-primary);
5742
+ font-weight: 500;
5743
+ }
5744
+ .prb-help-contents a:focus-visible { outline: 2px solid var(--brand-hover); outline-offset: -2px; }
5745
+ /* Too narrow for a column beside the prose: the index goes back above the topics, as a wrapping
5746
+ row, and stops following the scroll. After the rules above, which it overrides. */
5747
+ @container (max-width: 760px) {
5748
+ .prb-help-layout { display: block; }
5749
+ .prb-help-contents { position: static; max-height: none; margin: 0 0 16px; padding: 0; }
5750
+ .prb-help-contents ul { display: flex; flex-wrap: wrap; gap: 4px; border-left: 0; }
5751
+ .prb-help-contents a { margin-left: 0; padding: 4px 10px; border-left: 0; border-radius: 6px; }
5752
+ }
5656
5753
  /* A diagram's spacing is its meaning, so it never wraps: a narrow window scrolls it instead. */
5657
5754
  .prb-help-diagram {
5658
5755
  margin: 0 0 12px;
@@ -5815,7 +5912,7 @@ a.prb-notification-open:focus-visible { outline: 2px solid var(--brand-hover); o
5815
5912
  .prb-toast[data-kind='updated'] { border-left-color: var(--brand); }
5816
5913
  .prb-toast-text { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
5817
5914
  .prb-toast-open { flex: none; color: var(--wordmark-accent); font-weight: 600; text-decoration: none; }
5818
- .prb-toast-open:hover { text-decoration: underline; text-underline-offset: 2px; }
5915
+ .prb-toast-open:hover { opacity: 0.8; }
5819
5916
  .prb-toast-close {
5820
5917
  flex: none;
5821
5918
  width: 24px;
@@ -6474,7 +6571,6 @@ select.prb-addreview-control { padding-right: 32px; }
6474
6571
  color: var(--link);
6475
6572
  font: inherit;
6476
6573
  font-size: var(--t-micro);
6477
- text-decoration: underline;
6478
6574
  cursor: pointer;
6479
6575
  }
6480
6576
  .prb-addreview-retry { margin-left: calc(1em + 8px); }
@@ -6486,6 +6582,18 @@ select.prb-addreview-control { padding-right: 32px; }
6486
6582
  .prb-addreview code,
6487
6583
  .prb-addreview pre { font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, monospace; }
6488
6584
 
6585
+ /* A finding's readable reference (I3, Q2): the name a feedback draft and the author's reply use for
6586
+ it. Quiet beside the title, monospaced so I1 and I12 read as labels rather than words, and level
6587
+ with the title's first line. */
6588
+ .prb-doc .pr-helper-finding-ref {
6589
+ flex: none;
6590
+ margin-top: 1px;
6591
+ font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, monospace;
6592
+ font-size: var(--t-micro);
6593
+ line-height: 18px;
6594
+ color: var(--pane-ink-muted);
6595
+ }
6596
+
6489
6597
  /* ── Feedback selection ──
6490
6598
  Choosing the Issues and Questions to raise with the author. The checkboxes ship on every card
6491
6599
  and show only while the body carries the mode, so entering it is a stylesheet change, as the
@@ -6562,7 +6670,7 @@ select.prb-addreview-control { padding-right: 32px; }
6562
6670
  }
6563
6671
  .prb-selection-goto[hidden] { display: none; }
6564
6672
  .prb-selection-sep { color: var(--pane-ink-faint); white-space: pre; }
6565
- .prb-selection-goto:hover [data-feedback-goto-label] { text-decoration: underline; }
6673
+ .prb-selection-goto:hover [data-feedback-goto-label] { opacity: 0.8; }
6566
6674
  .prb-selection-spacer { flex: 1; }
6567
6675
  .prb-selection-button {
6568
6676
  padding: 6px 12px;
@@ -6739,3 +6847,85 @@ select.prb-addreview-control { padding-right: 32px; }
6739
6847
  .prb-runs-count { padding: 8px 10px; }
6740
6848
  .prb-runs-count dd { font-size: var(--t-section); }
6741
6849
  }
6850
+
6851
+
6852
+ /* ── Guided tour ──
6853
+ A modal dialog as big as the window, so everything under it is inert; the spotlight's shadow is
6854
+ the dim, and the card sits beside whatever the spotlight is on. Positions are set by tour.ts. */
6855
+ .prb-tour {
6856
+ position: fixed;
6857
+ inset: 0;
6858
+ width: 100%;
6859
+ height: 100%;
6860
+ max-width: none;
6861
+ max-height: none;
6862
+ margin: 0;
6863
+ padding: 0;
6864
+ border: 0;
6865
+ background: transparent;
6866
+ overflow: hidden;
6867
+ color: var(--text-primary);
6868
+ font: inherit;
6869
+ }
6870
+ .prb-tour::backdrop { background: transparent; }
6871
+ /* No target to light: the welcome, or a stop this layout does not draw. The whole page dims. */
6872
+ .prb-tour[data-spotless] { background: var(--backdrop); }
6873
+ .prb-tour-spot {
6874
+ position: fixed;
6875
+ border-radius: 10px;
6876
+ outline: 2px solid var(--brand);
6877
+ outline-offset: 0;
6878
+ box-shadow: 0 0 0 200vmax var(--backdrop);
6879
+ pointer-events: none;
6880
+ }
6881
+ .prb-tour-card {
6882
+ position: fixed;
6883
+ box-sizing: border-box;
6884
+ padding: 20px 22px 18px;
6885
+ border: 1px solid var(--border);
6886
+ border-radius: 12px;
6887
+ background: var(--surface-raised);
6888
+ box-shadow: 0 12px 32px var(--shadow-float);
6889
+ }
6890
+ .prb-tour[data-welcome] .prb-tour-card { padding: 26px 28px 22px; }
6891
+ .prb-tour-count {
6892
+ margin: 0 0 8px;
6893
+ font-size: var(--t-meta);
6894
+ font-weight: 600;
6895
+ letter-spacing: 0.04em;
6896
+ text-transform: uppercase;
6897
+ color: var(--brand-hover);
6898
+ }
6899
+ .prb-tour-title { margin: 0 0 8px; font-size: var(--t-section); font-weight: 650; line-height: 1.3; }
6900
+ .prb-tour[data-welcome] .prb-tour-title { font-size: 20px; }
6901
+ .prb-tour-text p { margin: 0 0 8px; font-size: var(--t-body); line-height: var(--lh-body); color: var(--text-secondary); }
6902
+ .prb-tour-actions { display: flex; align-items: center; gap: 8px; margin-top: 16px; }
6903
+ .prb-tour-actions button {
6904
+ padding: 7px 14px;
6905
+ border-radius: 8px;
6906
+ border: 1px solid var(--border);
6907
+ background: var(--surface-2);
6908
+ color: var(--text-primary);
6909
+ font: inherit;
6910
+ font-size: var(--t-body);
6911
+ cursor: pointer;
6912
+ }
6913
+ .prb-tour-actions button:hover { border-color: var(--border-strong); }
6914
+ .prb-tour-actions button:focus-visible { outline: 2px solid var(--brand-hover); outline-offset: 2px; }
6915
+ .prb-tour-actions .prb-tour-skip {
6916
+ margin-right: auto;
6917
+ padding-left: 0;
6918
+ padding-right: 0;
6919
+ border-color: transparent;
6920
+ background: transparent;
6921
+ color: var(--text-secondary);
6922
+ }
6923
+ .prb-tour-actions .prb-tour-skip:hover { border-color: transparent; color: var(--text-primary); }
6924
+ .prb-tour-actions .prb-tour-next {
6925
+ border-color: var(--brand);
6926
+ background: var(--brand);
6927
+ color: var(--on-brand);
6928
+ font-weight: 600;
6929
+ }
6930
+ .prb-tour-actions .prb-tour-next:hover { border-color: var(--brand-hover); background: var(--brand-hover); }
6931
+ .prb-tour-actions button[hidden] { display: none; }
@@ -218,7 +218,7 @@
218
218
  cursor: pointer;
219
219
  }
220
220
 
221
- .pr-helper-cancel-button:hover { color: #cf222e; text-decoration: underline; }
221
+ .pr-helper-cancel-button:hover { color: #cf222e; }
222
222
 
223
223
  /* ── Brand mark + thinking dots (waiting/finalizing phase) ── */
224
224
  .pr-helper-brand-mark {
@@ -809,7 +809,7 @@
809
809
  cursor: pointer;
810
810
  }
811
811
 
812
- .pr-helper-author-context-toggle:hover { text-decoration: underline; }
812
+ .pr-helper-author-context-toggle:hover { opacity: 0.8; }
813
813
 
814
814
  /* The heading and, once the description is open, its Show less. While open the row sticks to the
815
815
  top of whatever the review scrolls in, so a long description never has to be read to its end to
@@ -838,7 +838,7 @@
838
838
  color: #9333ea;
839
839
  text-decoration: none;
840
840
  }
841
- .pr-helper-author-context-github:hover { text-decoration: underline; }
841
+ .pr-helper-author-context-github:hover { opacity: 0.8; }
842
842
  .pr-helper-author-context[data-expanded] .pr-helper-author-context-head {
843
843
  position: sticky;
844
844
  /* A sticky element stops at its scroller's padding edge, leaving that padding as a strip the
@@ -936,7 +936,7 @@
936
936
  cursor: pointer;
937
937
  }
938
938
 
939
- .pr-helper-why-link:hover { text-decoration: underline; }
939
+ .pr-helper-why-link:hover { opacity: 0.8; }
940
940
 
941
941
  /* The author's words behind a stated motive, closed: the summary above usually says the same. */
942
942
  .pr-helper-why-source { margin: 4px 0 0; }
@@ -949,7 +949,7 @@
949
949
  width: fit-content;
950
950
  }
951
951
 
952
- .pr-helper-why-source > summary:hover { text-decoration: underline; }
952
+ .pr-helper-why-source > summary:hover { opacity: 0.8; }
953
953
 
954
954
  /* The three narrative sections end here; the verdict and the path are a different kind of block,
955
955
  so the gap before each is wider than the gaps between the sections. */
@@ -1404,7 +1404,7 @@
1404
1404
  text-decoration: none;
1405
1405
  }
1406
1406
 
1407
- .pr-helper-issue-discussion-link:hover { text-decoration: underline; }
1407
+ .pr-helper-issue-discussion-link:hover { opacity: 0.8; }
1408
1408
 
1409
1409
  .pr-helper-issue-loc {
1410
1410
  display: block;
@@ -1412,7 +1412,7 @@
1412
1412
  margin-top: 6px;
1413
1413
  }
1414
1414
 
1415
- .pr-helper-issue-loc:hover .pr-helper-path-name { text-decoration: underline; }
1415
+ .pr-helper-issue-loc:hover .pr-helper-path-name { opacity: 0.8; }
1416
1416
 
1417
1417
  /* A file the finding rests on that this change does not touch. Sits under the anchored location
1418
1418
  and must not be mistaken for one: no line number, and the words are on the row.
@@ -1426,7 +1426,7 @@
1426
1426
  font-size: 11.5px;
1427
1427
  opacity: 0.75;
1428
1428
  }
1429
- .prb-file-related:hover .pr-helper-path-name { text-decoration: underline; }
1429
+ .prb-file-related:hover .pr-helper-path-name { opacity: 0.8; }
1430
1430
 
1431
1431
  /* ── Questions tab ── */
1432
1432
  /* Deliberately reuses .pr-helper-issue-header/-title/-badges/-desc/-loc from the Issues tab
@@ -1501,7 +1501,7 @@
1501
1501
  cursor: pointer;
1502
1502
  white-space: nowrap;
1503
1503
  }
1504
- .pr-helper-simple-explanation-more:hover { text-decoration: underline; }
1504
+ .pr-helper-simple-explanation-more:hover { opacity: 0.8; }
1505
1505
  .pr-helper-simple-explanation-more:focus-visible { outline: 2px solid #9333ea; outline-offset: 2px; border-radius: 2px; }
1506
1506
 
1507
1507
  .pr-helper-question-importance-badge {
@@ -1613,7 +1613,7 @@
1613
1613
  }
1614
1614
 
1615
1615
  .pr-helper-question-jump { text-decoration: none; }
1616
- .pr-helper-question-jump:hover { color: #7c3aed; text-decoration: underline; }
1616
+ .pr-helper-question-jump:hover { color: #7c3aed; }
1617
1617
 
1618
1618
  /* Same button geometry as .pr-helper-explain-simply-button (the sidebar's existing outlined
1619
1619
  secondary), but neutral rather than purple: purple is spoken for by the primary action
@@ -1978,7 +1978,7 @@
1978
1978
  text-align: left;
1979
1979
  }
1980
1980
 
1981
- .pr-helper-guide-start-cta:hover { color: #7c3aed; text-decoration: underline; }
1981
+ .pr-helper-guide-start-cta:hover { color: #7c3aed; }
1982
1982
 
1983
1983
  .pr-helper-guide-section-actions {
1984
1984
  display: flex;
@@ -2000,7 +2000,7 @@
2000
2000
  cursor: pointer;
2001
2001
  }
2002
2002
 
2003
- .pr-helper-guide-uncomplete:hover { color: var(--color-fg-default, #24292f); text-decoration: underline; }
2003
+ .pr-helper-guide-uncomplete:hover { color: var(--color-fg-default, #24292f); }
2004
2004
 
2005
2005
  .pr-helper-guide-summary {
2006
2006
  font-size: 14px;
@@ -2048,9 +2048,9 @@
2048
2048
  margin: 0 -8px;
2049
2049
  }
2050
2050
 
2051
- /* Underline only the filename on hover — dragging an underline through the directory and focus
2052
- prose would make the whole three-line row look like one long link. */
2053
- .pr-helper-guide-file:hover .pr-helper-path-name { text-decoration: underline; }
2051
+ /* Dim only the filename on hover: dimming the directory and focus prose too would make the whole
2052
+ three-line row look like one long link. */
2053
+ .pr-helper-guide-file:hover .pr-helper-path-name { opacity: 0.8; }
2054
2054
 
2055
2055
  .pr-helper-guide-file-focus {
2056
2056
  font-size: 12px;
@@ -2497,7 +2497,7 @@
2497
2497
  text-decoration: none;
2498
2498
  }
2499
2499
 
2500
- .pr-helper-markdown a:hover { text-decoration: underline; }
2500
+ .pr-helper-markdown a:hover { opacity: 0.8; }
2501
2501
 
2502
2502
  /* GitHub's HTML in a description (github_html.ts). A table scrolls on its own, as on GitHub, so a
2503
2503
  bot's wide walkthrough never pushes the sidebar sideways. */
@@ -2541,7 +2541,7 @@
2541
2541
  padding: 2px 0 6px;
2542
2542
  cursor: pointer;
2543
2543
  }
2544
- .prb-md-mermaid-toggle:hover { text-decoration: underline; }
2544
+ .prb-md-mermaid-toggle:hover { opacity: 0.8; }
2545
2545
  .prb-md-mermaid-error {
2546
2546
  margin: 0 0 6px;
2547
2547
  font-size: 12px;
@@ -3782,7 +3782,7 @@
3782
3782
  white-space: nowrap;
3783
3783
  }
3784
3784
 
3785
- .pr-helper-nav-overlay-close:hover { color: #1f2328; text-decoration: underline; }
3785
+ .pr-helper-nav-overlay-close:hover { color: #1f2328; }
3786
3786
 
3787
3787
  .pr-helper-nav-overlay-progress {
3788
3788
  margin-top: 2px;
@@ -4374,7 +4374,7 @@
4374
4374
  cursor: pointer;
4375
4375
  }
4376
4376
 
4377
- .pr-helper-save-bar-label-done:hover { text-decoration: underline; }
4377
+ .pr-helper-save-bar-label-done:hover { opacity: 0.8; }
4378
4378
 
4379
4379
  /* ── Selected-text → Assistant ──
4380
4380
  Mounted on document.body, not inside the sidebar: the sidebar is a scrolling, clipped
@@ -5474,6 +5474,21 @@
5474
5474
  .pr-helper-reassessment-evidence .pr-helper-issue-loc { margin-top: 2px; }
5475
5475
  /* Muted, not alarming: an unverified suggestion is still a reasoned one, and can still be accepted. */
5476
5476
  .pr-helper-reassessment-unverified { margin: 2px 0 0; font-size: 11px; font-style: italic; color: #9a6700; }
5477
+ /* A status accepted from later evidence, or suggested: the answer as the evidence gives it, then the
5478
+ words it rests on, quoted as pasted, ruled like a comment's evidence because it is someone's claim. */
5479
+ .pr-helper-reassessment-answer { margin: 2px 0 0; font-size: 12px; line-height: 1.5; }
5480
+ .pr-helper-reassessment-quote {
5481
+ margin: 4px 0 0;
5482
+ padding: 2px 0 2px 8px;
5483
+ border-left: 2px solid rgba(15, 23, 42, 0.18);
5484
+ font-size: 11px;
5485
+ line-height: 1.5;
5486
+ color: var(--color-fg-muted, #57606a);
5487
+ white-space: pre-wrap;
5488
+ overflow-wrap: anywhere;
5489
+ }
5490
+ .pr-helper-reassessment-basis { margin: 4px 0 0; font-size: 11px; color: var(--color-fg-muted, #57606a); }
5491
+ .pr-helper-reassessment-contradicts { margin: 2px 0 0; font-size: 11px; font-style: italic; color: #9a6700; }
5477
5492
  /* A finding's status history reuses the grade history's disclosure and steps. The quote is the
5478
5493
  evidence as it read when the decision was made, which may no longer be what the thread says. */
5479
5494
  .pr-helper-status-step-headline { font-weight: 600; }
@@ -5521,7 +5536,7 @@
5521
5536
  color: #6b21a8;
5522
5537
  cursor: pointer;
5523
5538
  }
5524
- .pr-helper-reassessment-more:hover { text-decoration: underline; }
5539
+ .pr-helper-reassessment-more:hover { opacity: 0.8; }
5525
5540
  .pr-helper-reassessment-accept:focus-visible,
5526
5541
  .pr-helper-reassessment-keep:focus-visible,
5527
5542
  .pr-helper-reassessment-more:focus-visible { outline: 2px solid #9333ea; outline-offset: 2px; }
@@ -5574,7 +5589,6 @@
5574
5589
  font-size: 10px;
5575
5590
  color: var(--color-accent-fg, #0969da);
5576
5591
  cursor: pointer;
5577
- text-decoration: underline;
5578
5592
  }
5579
5593
 
5580
5594
  /* History row. Same geometry as .pr-helper-history-delta, and for the same reason it carries no
@@ -5671,7 +5685,6 @@
5671
5685
  font-size: 11px;
5672
5686
  color: var(--color-accent-fg, #0969da);
5673
5687
  cursor: pointer;
5674
- text-decoration: underline;
5675
5688
  }
5676
5689
 
5677
5690
  /*
@@ -5929,7 +5942,7 @@
5929
5942
  .pr-helper-extension .prb-selection-count { margin: 0; font-size: 12px; font-weight: 600; color: #1f2328; }
5930
5943
  .pr-helper-extension .prb-selection-goto { padding: 0; border: 0; background: none; color: #7e22ce; font: inherit; font-weight: 400; cursor: pointer; }
5931
5944
  .pr-helper-extension .prb-selection-goto[hidden] { display: none; }
5932
- .pr-helper-extension .prb-selection-goto:hover [data-feedback-goto-label] { text-decoration: underline; }
5945
+ .pr-helper-extension .prb-selection-goto:hover [data-feedback-goto-label] { opacity: 0.8; }
5933
5946
  .pr-helper-extension .prb-selection-sep { color: #8c959f; white-space: pre; }
5934
5947
  .pr-helper-extension .prb-selection-spacer { flex: 1; }
5935
5948
  .pr-helper-extension .prb-selection-button {