/* Shared pipeline-UI styles — the stepped workflow (upload → models → ask), the model panel,
   the stage flow graph, and the detail inspector. Used by BOTH /reranker (the debugger) and
   /testing (RAG vs Agent). Extracted verbatim from reranker.html's inline <style> so the two
   pages cannot drift; page-specific rules stay inline on their own page. */
    /* ── /reranker · step-through pipeline debugger (self-contained) ─────────── */
    .rr { max-width: 1560px; margin: 0 auto; padding: 76px clamp(12px, 3vw, 28px) 80px; } /* 76px clears the fixed .nav */
    .rr__head { display: flex; align-items: baseline; gap: 14px; flex-wrap: wrap; margin-bottom: 4px; }
    .rr__title { font: 600 22px/1.1 var(--sans); color: var(--ink); margin: 0; }
    .rr__sub { color: var(--muted); font: 400 14.5px/1.5 var(--sans); }
    .rr__model { margin-left: auto; color: var(--dim); font: 500 14px/1.1 var(--mono); }
    .rr__model b { color: var(--signal); font-weight: 600; }
    .rr__diag { background: none; color: var(--dim); border: 1px solid var(--line); border-radius: 8px;
                font: 500 12px var(--mono); letter-spacing: .04em; padding: 5px 10px; cursor: pointer;
                white-space: nowrap; transition: color .16s, border-color .16s; }
    .rr__diag:hover { color: var(--signal); border-color: var(--signal-lo); }

    /* the ask input is the primary action — make it unmissable: large, a signal
       border + soft glow (the "armed input" language), and a solid Run button */
    .rr__run { display: flex; gap: 10px; margin: 12px 0 12px; }
    .rr__q { flex: 1; background: var(--bg-2); border: 1.5px solid var(--signal); border-radius: 11px;
             color: var(--ink); font: 400 16.5px/1.35 var(--sans); padding: 15px 16px; outline: none;
             box-shadow: 0 0 0 3px rgba(63, 185, 80, .10); transition: box-shadow .16s, border-color .16s; }
    .rr__q::placeholder { color: var(--muted); }
    .rr__q:focus { border-color: var(--signal); box-shadow: 0 0 0 3px rgba(63, 185, 80, .24); }
    .rr__mselect:focus,
    .rr__field input:focus, .rr__field textarea:focus, .rr__field select:focus {
      border-color: var(--signal); box-shadow: 0 0 0 1px var(--signal-lo); }
    .rr__go { background: var(--signal); color: var(--bg); border: 1.5px solid var(--signal); border-radius: 11px;
              font: 600 15px var(--sans); padding: 0 26px; cursor: pointer; white-space: nowrap;
              transition: filter .16s, opacity .16s; }
    .rr__go:hover:not(:disabled) { filter: brightness(1.08); }
    .rr__go:disabled { opacity: .45; cursor: default; }

    /* stepped layout: upload (1) sits ABOVE ask (2) */
    .rr__step { display: flex; align-items: center; gap: 10px; font: 500 14px/1.1 var(--mono); letter-spacing: .06em;
                text-transform: uppercase; color: var(--ink); margin: 20px 0 10px; }
    .rr__stepnum { display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px;
                   border-radius: 50%; flex: none; border: 1px solid var(--signal); color: var(--signal);
                   font-size: 13px; letter-spacing: 0; }

    /* upload — reuses the shared .dropzone component (same as the Testing page),
       just capped in width + spaced so it doesn't stretch the full 1240px column */
    .rr .dropzone { max-width: 680px; margin: 4px 0 18px; }

    /* models panel — each on-device model + a status light; gates the Ask step */
    .rr__models { display: flex; flex-direction: column; gap: 8px; margin: 0 0 18px; }
    .rr__mrow { display: grid; grid-template-columns: auto 1fr auto; gap: 12px; align-items: center;
                background: var(--bg-2); border: 1px solid var(--line); border-radius: 10px; padding: 10px 14px; }
    .rr__mlight { width: 11px; height: 11px; border-radius: 50%; flex: none; background: var(--dim); }
    .rr__mlight.is-loading { background: var(--steel); animation: rrpulse 1s infinite; }
    .rr__mlight.is-ready { background: var(--signal); box-shadow: 0 0 7px var(--signal); }
    .rr__mlight.is-failed { background: var(--red); }
    /* Deferred — on standby, not loading and not broken (the answer model waits for the first
       question). Solid signal-coloured but UNLIT: distinguishable from a model that is actually
       resident, without reading as a fault the way amber or red would. */
    .rr__mlight.is-deferred { background: var(--signal); opacity: .45; }
    /* "all systems go" cascade: each light pops on in sequence (~1s total). transform/opacity are
       compositor-driven, so the animation stays smooth even while models load on the main thread. */
    .rr__mlight--reveal { animation: rrLightOn .42s cubic-bezier(.34,1.56,.64,1) both; animation-delay: calc(var(--ri, 0) * .22s); }
    @keyframes rrLightOn { 0% { transform: scale(.35); opacity: .2; } 100% { transform: scale(1); opacity: 1; } }
    .rr__minfo { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
    .rr__mname { color: var(--ink); font: 600 14.5px var(--sans); }
    .rr__mstate { color: var(--dim); font: 400 13px/1.4 var(--mono); overflow: hidden; text-overflow: ellipsis; }
    /* per-model download/load progress bar — fills from the % in the status line; collapses when idle/done */
    .rr__mbar { height: 0; opacity: 0; margin-top: 0; border-radius: 2px; background: var(--line); overflow: hidden;
                transition: height .2s, opacity .2s, margin .2s; }
    .rr__mbar.is-on { height: 3px; opacity: 1; margin-top: 5px; }
    .rr__mbar > i { display: block; height: 100%; width: 0; background: var(--signal); border-radius: 2px;
                    transition: width .3s ease; }
    .rr__mbar.is-indeterminate > i { width: 30% !important; animation: rrbarslide 1.1s ease-in-out infinite; }
    @keyframes rrbarslide { 0% { margin-left: -30%; } 100% { margin-left: 100%; } }
    .rr__mselect { background: var(--bg); border: 1px solid var(--line); border-radius: 7px; color: var(--ink);
                   font: 400 14px var(--sans); padding: 7px 10px; outline: none; max-width: 220px; }
    .rr__continuebtn { display: inline-flex; align-items: center; margin: 4px 0 0; background: var(--signal);
                       color: var(--bg); border: 1.5px solid var(--signal); border-radius: 11px; cursor: pointer;
                       font: 600 15px var(--sans); padding: 11px 26px; transition: filter .16s, opacity .16s; }
    .rr__continuebtn:hover:not(:disabled) { filter: brightness(1.08); }
    .rr__continuebtn:disabled { opacity: .4; cursor: default; }
    .rr__hidden { display: none !important; }

    /* uploaded files — one expandable card per ingested file: the summary is the "uploaded" line
       (name + row/byte count); expanding reveals the file's stored rows, one per line */
    .rr__uploaded { width: 100%; max-width: 680px; display: flex; flex-direction: column; gap: 8px; margin: 0 0 16px; }
    details.rr__ufile { border: 1px solid var(--line); border-radius: 10px; background: var(--bg-2); overflow: hidden; }
    .rr__ufile > summary { cursor: pointer; padding: 11px 14px; user-select: none; list-style: none;
                           display: grid; grid-template-columns: auto 1fr auto auto; gap: 10px; align-items: center; }
    .rr__ufile > summary::-webkit-details-marker { display: none; }
    .rr__ufile > summary::after { content: "▸"; color: var(--dim); font-size: 12px; transition: transform .15s; justify-self: end; }
    .rr__ufile[open] > summary::after { transform: rotate(90deg); }
    .rr__ufico { color: var(--signal); width: 17px; height: 17px; flex: none; }
    .rr__ufname { color: var(--ink); font: 600 14px var(--sans); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
    .rr__ufmeta { color: var(--dim); font: 400 12.5px var(--mono); white-space: nowrap; }
    .rr__urows { list-style: none; margin: 0; padding: 4px 8px 10px; max-height: 320px; overflow: auto;
                 border-top: 1px solid var(--line); display: flex; flex-direction: column; gap: 4px; }
    .rr__urow { display: grid; grid-template-columns: 40px 1fr; gap: 8px; align-items: start;
                background: var(--bg); border: 1px solid var(--line); border-radius: 6px; padding: 6px 9px; }
    .rr__urownum { color: var(--dim); font: 600 12px var(--mono); text-align: right; padding-top: 1px; }
    .rr__urowtext { color: var(--ink); font: 400 13px/1.5 var(--sans); white-space: pre-wrap; word-break: break-word; }
    .rr__umore { color: var(--dim); font: 400 12.5px var(--mono); padding: 4px 2px 0; }

    /* step flow: stages STACK down the page; advancing reveals the next and smooth-scrolls it under
       the nav so the previous scrolls out of view. Back = a normal scroll up (see reranker.js).
       scroll-margin-top offsets the 58px fixed nav for scrollIntoView. */
    .rr__stage { scroll-margin-top: 72px; min-height: calc(100vh - 120px);
                 display: flex; flex-direction: column; justify-content: center; align-items: center; }
    /* align-items:center centres the headings and the capped-width boxes; the blocks that are meant
       to span the column opt back in with width:100% (otherwise flex shrinks them to their content) */
    .rr__models, .rr__cfg, .rr__run, .rr__flow, .rr__detail { width: 100%; }
    /* a tall stage (step 3: config + ask + flow + detail) grows past min-height and top-aligns
       naturally; short stages (upload, models) center in the viewport like the home page's scenes */
    .rr__stage:not(.rr__hidden) { animation: rrfade .26s ease; }
    @keyframes rrfade { from { opacity: 0; } to { opacity: 1; } }

    /* config */
    details.rr__cfg { border: 1px solid var(--line); border-radius: 10px; background: var(--bg-2); margin-bottom: 18px; }
    .rr__cfg > summary { cursor: pointer; padding: 10px 14px; color: var(--muted); font: 500 13px var(--sans); user-select: none; }
    .rr__cfggrid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 14px; padding: 4px 14px 16px; }
    .rr__field { display: flex; flex-direction: column; gap: 5px; }
    .rr__field label { color: var(--dim); font: 500 12px/1 var(--mono); text-transform: uppercase; letter-spacing: .04em; }
    .rr__field input, .rr__field textarea, .rr__field select {
      background: var(--bg); border: 1px solid var(--line); border-radius: 7px; color: var(--ink);
      font: 400 14px var(--sans); padding: 8px 10px; outline: none; resize: vertical; }
    .rr__field textarea { min-height: 70px; font: 400 13px/1.5 var(--mono); }
    .rr__field .rr__hint { color: var(--dim); font: 400 12.5px var(--sans); }

    /* the flow of stage nodes — a VERTICAL pipeline */
    /* ── THREE COLUMNS: output · steps · config ────────────────────────────────────────────
       Output first and widest: it is the thing being read, and the steps only exist to explain
       it. minmax(0,·) on every track because the output column contains pre/code that would
       otherwise blow the grid out — a min-content floor of a long unwrapped line makes the whole
       page scroll sideways, which is exactly what the columns were meant to stop.
       The columns are independently scrollable and sticky-topped, so picking step 8 does not
       scroll the config out of reach: the whole point is seeing a knob and its effect together. */
    .rr__cols { display: grid; grid-template-columns: minmax(0, 1.35fr) minmax(0, 0.9fr) minmax(0, 1fr);
                gap: 16px; align-items: start; margin: 8px 0 20px; }
    .rr__col { min-width: 0; display: flex; flex-direction: column; gap: 8px; }
    .rr__col--out .rr__detail, .rr__col--steps .rr__flow, .rr__col--cfg .rr__cfggrid {
      max-height: calc(100vh - 190px); overflow: auto; }
    .rr__colhd { font: 600 11px/1 var(--sans); letter-spacing: .09em; text-transform: uppercase;
                 color: var(--steel); padding: 2px 2px 0; display: flex; gap: 8px; align-items: baseline; }
    .rr__colhd-sub { font-weight: 400; letter-spacing: .02em; text-transform: none; color: var(--dim); }
    /* the steps column drives the other two, so its nodes lose the centred max-width they had
       when the flow was the full page width */
    .rr__col--steps .rr__node { max-width: none; }
    .rr__col--cfg .rr__cfggrid { grid-template-columns: minmax(0, 1fr); padding: 4px 2px 12px;
                                 border: 1px solid var(--line); border-radius: 12px;
                                 background: var(--bg-2); padding: 12px 14px; }
    .rr__cfgnone { color: var(--dim); font: 400 13px var(--sans); border: 1px dashed var(--line);
                   border-radius: 12px; padding: 14px; background: var(--bg-2); }
    .rr__rerun { display: flex; flex-direction: column; gap: 6px; padding: 2px; }
    /* SECONDARY button, and it has to be styled here rather than left to a shared `.btn`.
       It carried class="btn" for a while, which was defined NOWHERE in the site's CSS — so it
       fell through to the browser's default control and rendered as a light-grey box in the
       middle of a near-black panel. The single-use class name is what hid it: nothing else on
       any page used `.btn`, so there was no second occurrence to make the gap obvious.
       Namespaced `rr__` rather than a global `.btn` because pipeline-ui.css is also loaded by
       transform.html and testing.html, and a generic name here reaches both.
       Ghost, not solid: `.rr__go` (solid --signal) is the PRIMARY action, and a second filled
       green button inside the config panel would compete with the Run button beside it. */
    /* Button rows in the config panel (gold labels, configuration). Also had no rule at all, so
       the buttons inherited inline-block flow with only whitespace between them and no wrapping
       behaviour — visible as uneven gaps rather than as an obviously broken control, which is
       why it survived longer than the button above. */
    .rr__cfgio { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }

    .rr__rerunbtn { width: 100%; font: 500 12px var(--mono); letter-spacing: .04em;
                    color: var(--muted); background: var(--bg);
                    border: 1px solid var(--line); border-radius: 8px; padding: 7px 12px;
                    cursor: pointer; transition: color .16s, border-color .16s; }
    .rr__rerunbtn:hover:not(:disabled) { color: var(--signal); border-color: var(--signal-lo); }
    .rr__rerunbtn:focus-visible { outline: 2px solid var(--signal); outline-offset: 2px; }
    .rr__rerunbtn:disabled { opacity: .45; cursor: not-allowed; }
    /* Stale: this step ran under a config that has since changed, or an UPSTREAM step was re-run
       after it. Not an error — it is a result that no longer describes the current settings, and
       saying so is the whole reason single-step re-run is safe to offer. */
    .rr__node.is-stale { border-style: dashed; }
    .rr__node.is-stale .rr__summary::after { content: " · stale"; color: var(--amber, #d08a2a); }
    .rr__cfgall { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
                  gap: 10px 18px; padding: 6px 14px 14px; }
    .rr__cfgall .rr__ck { display: flex; justify-content: space-between; gap: 12px; min-width: 0;
                          border-bottom: 1px dotted var(--line); padding: 4px 0; }
    .rr__cfgall .rr__ck b { font-weight: 500; color: var(--dim); font: 400 12px var(--sans); }
    .rr__cfgall .rr__ck span { font: 500 12px var(--mono, var(--sans)); text-align: right;
                               overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
    .rr__cfgall .rr__ckstage { grid-column: 1 / -1; font: 600 10px/1 var(--sans); letter-spacing: .09em;
                               text-transform: uppercase; color: var(--steel); padding: 10px 0 2px; }
    /* One column under ~1100px: three columns of anything useful stops fitting well before the
       nodes do, and a squeezed output column is worse than a scrolled one. */
    @media (max-width: 1100px) {
      .rr__cols { grid-template-columns: minmax(0, 1fr); }
      .rr__col--out .rr__detail, .rr__col--steps .rr__flow, .rr__col--cfg .rr__cfggrid { max-height: none; }
      .rr__col--cfg .rr__cfggrid { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); }
    }
    .rr__flow { display: flex; flex-direction: column; align-items: center; gap: 0; padding: 4px 2px 16px; }
    .rr__node { width: 100%; max-width: 520px; background: var(--bg-2); border: 1px solid var(--line);
                border-radius: 12px; padding: 10px 14px; cursor: pointer; transition: border-color .12s, transform .12s;
                display: flex; flex-direction: column; gap: 4px; }
    .rr__node:hover { border-color: var(--steel); }
    .rr__node.is-sel { border-color: var(--signal); transform: translateX(2px); }
    .rr__node.is-pending { opacity: .5; }
    .rr__nodetop { display: flex; align-items: baseline; gap: 9px; }
    .rr__dot { width: 8px; height: 8px; border-radius: 50%; background: var(--dim); flex: 0 0 auto; align-self: center; }
    .rr__node.is-running .rr__dot { background: var(--signal); animation: rrpulse 1s infinite; }
    .rr__node.is-done .rr__dot { background: var(--signal); }
    .rr__node.is-error .rr__dot { background: var(--red); }
    .rr__node.is-skipped .rr__dot { background: var(--steel); }
    @keyframes rrpulse { 0%,100% { opacity: 1; } 50% { opacity: .3; } }
    .rr__num { color: var(--dim); font: 600 12px var(--mono); }
    .rr__label { color: var(--ink); font: 600 14px/1.25 var(--sans); }
    .rr__summary { color: var(--muted); font: 400 12.5px/1.4 var(--mono); min-height: 15px; margin-left: 26px; }
    .rr__conn { align-self: center; color: var(--steel); font-size: 16px; line-height: 1; padding: 3px 0; user-select: none; }

    /* detail panel */
    .rr__detail { border: 1px solid var(--line); border-radius: 12px; background: var(--bg-2); padding: 16px 18px; min-height: 120px; }
    .rr__detailhd { display: flex; align-items: baseline; gap: 10px; margin-bottom: 12px; }
    .rr__detailhd h2 { font: 600 15px var(--sans); color: var(--ink); margin: 0; }
    .rr__detailhd .rr__badge { color: var(--muted); font: 500 13px var(--mono); }
    .rr__empty { color: var(--dim); font: 400 14px var(--sans); }
    /* a decision the stage made that the rows themselves can't show — e.g. breadth hitting its
       per-round expansion cap, where what matters is what is NOT in the list below it. */
    .rr__note { color: var(--muted); font: 400 13px var(--sans); line-height: 1.5;
                border-left: 2px solid var(--line); padding: 2px 0 2px 10px; margin-top: 12px; }

    /* passage rows with weight bars */
    .rr__rows { display: flex; flex-direction: column; gap: 7px; }
    .rr__row { display: grid; grid-template-columns: 54px 1fr auto; gap: 10px; align-items: center;
               background: var(--bg); border: 1px solid var(--line); border-radius: 8px; padding: 8px 10px; }
    .rr__row.is-dropped { opacity: .5; }
    .rr__row.is-dropped .rr__rowtext { text-decoration: line-through; }
    .rr__wbar { position: relative; height: 34px; border-radius: 5px; background: var(--flap-bg); overflow: hidden; display: flex; align-items: center; justify-content: center; }
    .rr__wfill { position: absolute; inset: 0 auto 0 0; background: linear-gradient(90deg, var(--signal-lo), var(--signal)); opacity: .32; }
    .rr__wnum { position: relative; font: 700 13px var(--mono); color: var(--ink); }
    .rr__row.is-below .rr__wfill { background: var(--steel); }
    .rr__rowtext { color: var(--ink); font: 400 13.5px/1.45 var(--sans); overflow: hidden; }
    .rr__rowmeta { color: var(--dim); font: 400 12px var(--mono); margin-top: 2px; }
    /* retrieve: how each candidate matched (word / semantic / both) + a keyword (no-similarity) bar */
    .rr__match { display: inline-block; font: 600 11px/1.4 var(--mono); text-transform: uppercase; letter-spacing: .05em;
                 padding: 2px 6px; border-radius: 4px; margin-right: 5px; vertical-align: middle; }
    .rr__match--word { color: var(--muted); border: 1px solid var(--steel); }
    .rr__match--semantic { color: var(--signal); border: 1px solid var(--signal-lo); }
    .rr__match--both { color: var(--bg); background: var(--signal); border: 1px solid var(--signal); }
    .rr__wbar--kw { background: var(--flap-bg); }
    .rr__wbar--kw .rr__wnum { color: var(--dim); font: 600 12px var(--mono); letter-spacing: .05em; }
    .rr__group { color: var(--dim); font: 600 12px var(--mono); text-transform: uppercase; letter-spacing: .05em; margin: 14px 0 7px; }
    pre.rr__pre { background: var(--bg); border: 1px solid var(--line); border-radius: 8px; padding: 12px; color: var(--muted);
                  font: 400 13px/1.6 var(--mono); white-space: pre-wrap; word-break: break-word; max-height: 340px; overflow: auto; }
    .rr__pass { color: var(--signal); } .rr__fail { color: var(--red); }
    .rr__answer { color: var(--ink); font: 400 14px/1.6 var(--sans); white-space: pre-wrap; }
    /* structured answer: emphasized lead sentence, real bullet list, [n] citation chips */
    .rr__answerfmt { color: var(--ink); font: 400 14px/1.65 var(--sans); }
    .rr__answerfmt p { margin: 0 0 10px; }
    .rr__answerfmt p.rr__anslead { font-weight: 600; }
    .rr__anslist { margin: 0 0 10px; padding-left: 22px; }
    .rr__anslist li { margin: 4px 0; }
    .rr__cite { color: var(--signal); font: 600 12.5px var(--mono); padding: 0 2px; white-space: nowrap; }
    .rr__stat { display: inline-flex; gap: 5px; align-items: baseline; margin-right: 16px; }
    .rr__stat b { color: var(--ink); font: 600 15px var(--mono); } .rr__stat span { color: var(--dim); font: 400 12px var(--mono); }

/* segmented filter inside a stage panel (Rerank: kept / dropped / both) */
.rr__filter { display: flex; gap: 6px; margin: 12px 0 2px; flex-wrap: wrap; align-items: center; }
.rr__filterlbl { color: var(--dim); font: 600 11px var(--mono); text-transform: uppercase;
                 letter-spacing: .06em; margin-right: 2px; }
.rr__filterbtn { background: var(--bg); color: var(--muted); border: 1px solid var(--line);
                 border-radius: 7px; font: 600 12px var(--mono); padding: 5px 12px; cursor: pointer;
                 transition: color .14s, background .14s, border-color .14s; }
.rr__filterbtn:hover { color: var(--ink); border-color: var(--steel); }
.rr__filterbtn.is-on { color: var(--bg); background: var(--signal); border-color: var(--signal); }

/* A long result list scrolls inside its own box (~10 rows tall — the exact height is
   measured from the real rows, since a row grows with its text). The inset shadow hints
   there's more below without stealing a row of space. */
.rr__scroll { overflow-y: auto; overscroll-behavior: contain; padding-right: 4px; }
.rr__scroll::-webkit-scrollbar { width: 9px; }
.rr__scroll::-webkit-scrollbar-thumb { background: var(--line); border-radius: 5px; }
.rr__scroll::-webkit-scrollbar-thumb:hover { background: var(--steel); }
.rr__more { color: var(--dim); font: 400 11.5px var(--mono); padding: 5px 2px 0; }
.rr__filternote { color: var(--dim); font: 400 11.5px var(--sans); margin-left: 2px; }


/* Gold-label toggle on a passage row. Sits at the end of the row a person is already reading —
   marking is only reliable at the moment they judge the passage, not on a separate screen. */
.rr__gold {
  align-self: center;
  padding: 2px 8px;
  border: 1px solid var(--rr-line, #d4d4d8);
  border-radius: 999px;
  background: transparent;
  color: var(--rr-muted, #71717a);
  font: inherit;
  font-size: 11px;
  cursor: pointer;
  white-space: nowrap;
}
.rr__gold:hover { border-color: var(--rr-fg, #18181b); color: var(--rr-fg, #18181b); }
.rr__gold.is-on {
  border-color: #16a34a;
  background: #16a34a;
  color: #fff;
}


/* Kept versions — one row each, actions inline. */
.rr__versions { display: flex; flex-direction: column; gap: 6px; margin-top: 8px; }
.rr__version {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 6px 8px; border: 1px solid var(--line); border-radius: 8px; background: var(--bg);
  font-size: 12px;
}
.rr__vlabel { font-weight: 600; }
.rr__vid { opacity: .6; }
.rr__vbtn {
  margin-left: 0; padding: 2px 8px; border: 1px solid var(--line); border-radius: 999px;
  background: transparent; color: inherit; font: inherit; font-size: 11px; cursor: pointer;
}
.rr__vbtn:hover { border-color: currentColor; }
.rr__version .rr__vbtn:first-of-type { margin-left: auto; }
