
.md-pre{background:var(--panel2,#0d1117);border:1px solid var(--border2,#30363d);padding:.7rem .9rem;overflow:auto;font-size:.85rem;line-height:1.5;white-space:pre}
.md-pre code{background:none;border:none;padding:0}
/* A wide table SCROLLS within itself (display:block + overflow) instead of forcing the
   whole page wider than the viewport — which on mobile squeezed the text into a narrow
   column with the rest of the page off-screen. width:max-content keeps columns natural. */
.md-table{display:block;width:max-content;max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;border-collapse:collapse;margin:.6rem 0}
.md-table th,.md-table td{border:1px solid var(--border2,#30363d);padding:.35rem .55rem;text-align:left;font-size:.9rem;overflow-wrap:break-word}
.md-table th{background:var(--panel,#161b22)}
blockquote{border-left:3px solid var(--border2,#30363d);margin:.6rem 0;padding:.2rem .9rem;color:var(--muted,#8b949e)}

.plan-tags{display:inline-flex;flex-wrap:wrap;gap:var(--sp-1,.25rem);margin-left:.4rem;vertical-align:middle}
.plan-tag.lv-facet-chip{height:1.45rem;padding:0 .55rem;font-size:.7rem;text-decoration:none;gap:var(--sp-1,.25rem)}
a.plan-tag.lv-facet-chip:hover{border-color:var(--muted,#8b949e);color:var(--text-hi,#f0f6fc)}
.plan-tag-filter{margin:.2rem 0 .8rem;font-size:.85rem;color:var(--muted,#8b949e)}
.plan-tag-clear{margin-left:.35rem;font-size:.8rem}
/* Plan-view tag row: label · removable chips · inline add field, all on one line.
   The shared autocomplete field renders its own <label> block, so (exactly as ideas'
   quick-add row does) we hide that label and zero the label margin the global shell
   rule injects — otherwise the add field sits 16px below the chips beside it. */
.plan-tagrow{display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-2,.5rem);margin:.2rem 0 .9rem}
.plan-tagrow-label{color:var(--muted,#8b949e);font-size:.8rem;display:inline-flex;align-items:center;gap:var(--sp-1,.25rem)}
.plan-tagrow-empty{font-size:.8rem}
.plan-tagchip-wrap{display:inline-flex;align-items:center}
.plan-tagdrop{display:inline;margin:0}
.plan-tagdrop button{background:none;border:none;color:var(--muted,#8b949e);cursor:pointer;font-size:.7rem;padding:0 .15rem;line-height:1}
.plan-tagdrop button:hover{color:var(--text-hi,#f0f6fc)}
.plan-tagadd{display:inline-flex;align-items:center;gap:var(--sp-1,.25rem);margin:0}
.plan-tagadd label{margin:0!important}
.plan-tagadd label>span:first-child{display:none}
.plan-tagadd .autocomplete-picker{margin-top:0!important;width:11rem}
.plan-tagadd input{padding:.25rem .5rem!important;font-size:.85rem!important}

.plan-hier h3{font-size:1rem;margin:0 0 .5rem;display:flex;align-items:center;gap:var(--sp-2,.5rem)}
.plan-hier-crumb{margin:.2rem 0 .6rem;font-size:.9rem}
.plan-hier-sub{margin:.2rem 0 .4rem;font-size:.9rem}
.plan-hier-list{margin:.2rem 0 .8rem;padding-left:1.1rem}
.plan-hier-list li{padding:.15rem 0}
.plan-hier-new{display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-2,.5rem);margin:.5rem 0 0}
.plan-hier-new input[type=text]{flex:1;min-width:14rem}
/* The re-parent picker is the SHARED autocomplete field, which renders its own
   <label> BLOCK (caption above the input). Align the row on flex-end so the Save button
   sits level with the input rather than with the caption, and zero the label margin the
   global shell rule (label{margin:1rem 0}) injects — the same fix ideas' quick-add row
   needed, and the same one the tag row above needs. */
.plan-hier-parent{display:flex;align-items:flex-end;flex-wrap:wrap;gap:var(--sp-2,.5rem);margin:.7rem 0 0}
.plan-hier-parent label{margin:0!important}
.plan-hier-parent label>span:first-child{color:var(--muted,#8b949e);font-size:.85rem}
.plan-hier-parent .autocomplete-picker{margin-top:.25rem!important;width:24rem;max-width:100%}
.plan-hier-parent input{padding:.35rem .6rem!important;font-size:.9rem!important}
.plan-subchip.lv-facet-chip{height:1.45rem;padding:0 .55rem;font-size:.7rem;text-decoration:none;margin-left:.35rem}
a.plan-subchip.lv-facet-chip:hover{border-color:var(--muted,#8b949e);color:var(--text-hi,#f0f6fc)}

.plan-block h3{font-size:1rem;margin:0 0 .5rem;display:flex;align-items:center;gap:var(--sp-2,.5rem)}
.plan-block-hdr{margin:.35rem 0 .2rem;font-size:.9rem}
.plan-block-list{margin:.2rem 0 .6rem;padding-left:1.1rem}
.plan-block-list li{padding:.15rem 0}
.plan-block-drop{display:inline;margin:0}
.plan-block-drop button{background:none;border:none;color:var(--muted,#8b949e);cursor:pointer;font-size:.75rem;padding:0 .2rem;line-height:1}
.plan-block-drop button:hover{color:var(--text-hi,#f0f6fc)}
/* Same layout treatment as the hierarchy picker: the shared autocomplete renders its
   own <label> BLOCK, so align on flex-end (Save/Add level with the input, not the
   caption) and zero the label margin the global shell rule injects. */
.plan-block-add{display:flex;align-items:flex-end;flex-wrap:wrap;gap:var(--sp-2,.5rem);margin:.7rem 0 0}
/* The direction radios take the whole line under the picker: each option is a sentence,
   and two sentences side by side get read as one. */
.plan-block-dir{flex-basis:100%;display:flex;flex-direction:column;gap:var(--sp-1,.25rem);border:0;padding:0;margin:.2rem 0 0}
.plan-block-dir legend{padding:0;font-size:.8rem;color:var(--muted,#8b949e)}
.plan-block-dir label{display:flex;align-items:center;gap:var(--sp-2,.5rem);font-size:.85rem;margin:0}
.plan-block-dir input{margin:0}
.plan-block-add label{margin:0!important}
.plan-block-add label>span:first-child{color:var(--muted,#8b949e);font-size:.85rem}
.plan-block-add .autocomplete-picker{margin-top:.25rem!important;width:24rem;max-width:100%}
.plan-block-add input{padding:.35rem .6rem!important;font-size:.9rem!important}
.plan-block-note{font-size:.78rem;margin:.5rem 0 0}

.rv-queue{min-height:2rem;display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:center;gap:var(--sp-2,.5rem);margin:.2rem 0 .7rem;color:var(--muted);font-size:.86rem}
.rv-prev{grid-column:1;justify-self:start}
.rv-count{grid-column:2;text-align:center}
.rv-next{grid-column:3;justify-self:end}
.rv-meta{color:var(--muted);font-size:.85rem;margin:.2rem 0 .6rem}
.rv-body{max-height:none}
.rv-pushback{border:1px solid var(--border2,#30363d);padding:1rem 1.1rem;margin:1rem 0}
.rv-pushback h3{margin:.1rem 0 .5rem;font-size:1.02rem}
.rv-ta{width:100%;box-sizing:border-box;background:var(--panel2,#0d1117);color:var(--text-hi);border:1px solid var(--border2,#30363d);padding:.7rem .8rem;font-size:.92rem;line-height:1.5;resize:vertical}
.rv-ta:focus{outline:none;border-color:var(--primary)}
.rv-actions{display:flex;gap:var(--sp-2,.5rem);align-items:stretch;flex-wrap:wrap;margin-top:.8rem}
/* Push back / Approve are EQUAL-size, side-by-side, and wrap cleanly on mobile (owner
   request): each is a flex child that grows equally from the same basis; the approve button
   sits in its own <form>, so that form is the flex child and its button fills it. */
.rv-actions>.btn,.rv-actions>form{flex:1 1 12rem;margin:0}
.rv-actions>form>.btn{width:100%}
.rv-h{display:flex;align-items:center;gap:var(--sp-2,.5rem);flex-wrap:wrap;margin:.1rem 0 .3rem}
.rv-h a{font-size:1.15rem}
.rv-h i{font-size:1.05rem;flex:none}
.rv-lazy{min-height:1.4rem}
.rv-addressed{border:1px solid #3fb95055;border-left:4px solid #3fb950;background:var(--panel);margin:.2rem 0 1rem;padding:.7rem .95rem}
.rv-addressed-h{font-weight:600;color:var(--text-hi,#f0f6fc);margin:0 0 .35rem;display:flex;align-items:baseline;gap:var(--sp-2,.5rem);flex-wrap:wrap}
.rv-addressed-round{color:var(--muted,#8b949e);font-size:.78rem;font-weight:400}
.rv-addressed-note{white-space:pre-wrap;margin:0;line-height:1.5}
.rv-addressed-prior{margin:.6rem 0 0}
.rv-addressed-prior summary{cursor:pointer;color:var(--muted,#8b949e);font-size:.82rem}
.rv-addressed-prior ul{list-style:none;margin:.4rem 0 0;padding:0}
.rv-addressed-prior li{padding:.35rem 0;border-top:1px solid var(--border2,#30363d)}
.rv-addressed-prior .rv-addressed-round{display:block;margin-bottom:.15rem}

.rv-none{color:var(--muted);font-style:italic}
.rv-testlinks h3{margin:.1rem 0 .3rem;font-size:1.02rem}
.rv-tl-list{list-style:none;margin:.4rem 0 .7rem;padding:0}
.rv-tl-item{display:flex;align-items:center;gap:var(--sp-2,.5rem);padding:.28rem 0;border-bottom:1px solid var(--border2,#30363d)}
.rv-tl-item:last-child{border-bottom:0}
.rv-tl-item a{word-break:break-all}
.rv-tl-url{color:var(--muted);font-size:.8rem;word-break:break-all}
.rv-tl-del{margin:0 0 0 auto;display:inline-flex;align-items:center}
/* The per-link remove ✕ is a proper inline-flex control vertically centered on the row (was a
   baseline-aligned raw text button that sat off-line — owner-reported "remove misaligned"). */
.rv-tl-x{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;height:1.7rem;width:1.7rem;flex:none;line-height:1;background:none;border:0;color:var(--muted);cursor:pointer;font-size:.95rem;padding:0}
.rv-tl-x:hover{color:var(--danger,#f85149)}
.rv-tl-add{display:flex;gap:var(--sp-2,.5rem);flex-wrap:wrap;align-items:stretch}
.rv-tl-add input[type=url]{flex:2 1 16rem;min-width:12rem}
.rv-tl-add input[type=text]{flex:1 1 10rem;min-width:8rem}
/* Inputs + the Add button share one control height (var(--control-h)) so the button aligns
   with the "what it tests" field instead of sitting shorter (owner-reported misalignment).
   box-sizing + a matched min-height make them the same box regardless of font/padding. */
.rv-tl-add input{box-sizing:border-box;min-height:var(--control-h);background:var(--panel2,#0d1117);color:var(--text-hi);border:1px solid var(--border2,#30363d);padding:.5rem .6rem;font-size:.9rem}
.rv-tl-add input:focus{outline:none;border-color:var(--primary)}
.rv-tl-add .btn{min-height:var(--control-h);align-self:stretch}

.rf-menu-intro{margin:.2rem 0 .8rem}
.rf-menu-start{margin:.2rem 0 .9rem}
.rf-menu{list-style:none;padding:0;margin:0}
.rf-menu li{display:flex;align-items:flex-start;gap:var(--sp-2,.5rem);padding:.55rem 0;border-bottom:1px solid var(--border,#21262d)}
.rf-menu li:last-child{border-bottom:0}
.rf-menu-body{flex:1 1 auto;min-width:0}
.rf-menu-head{display:flex;align-items:center;gap:var(--sp-2,.5rem);flex-wrap:wrap}
.rf-menu-sub{margin:.2rem 0 0;font-size:.86rem;max-width:62ch}
.rf-menu-controls{display:flex;gap:var(--sp-2,.5rem);flex-wrap:wrap;align-items:center;margin:.5rem 0 .15rem}
.rf-menu-controls form{margin:0}
.rf-menu-done{font-size:.8rem;color:var(--green-soft,#3fb950)}
/* A finished row recedes without disappearing: you can still see what you decided. */
.rf-menu-doneitem .rf-menu-head>a{color:var(--muted)}
@media (max-width:480px){
  .rf-menu-controls{flex-direction:column;align-items:stretch}
  .rf-menu-controls form,.rf-menu-controls .btn{width:100%}
  .rf-menu-controls .btn{box-sizing:border-box;justify-content:center}
}
.rf-menu-n{flex:none;min-width:1.4rem;height:1.4rem;display:inline-flex;align-items:center;justify-content:center;font-size:.75rem;font-weight:700;color:var(--muted);border:1px solid var(--border,#21262d);border-radius:var(--r-pill,999px)}
.rf-menu-count{display:inline-block;min-width:1.3rem;text-align:center;font-size:.78rem;font-weight:700;color:var(--primary,#3fb950);border:1px solid var(--primary,#3fb950);border-radius:var(--r-pill,999px);padding:.02rem .4rem}
.rf-menu-note,.rf-menu-foot{font-size:.85rem}
.rf-menu-foot{margin-top:.8rem}
.rf-menu-empty{margin:.4rem 0}
