/* report-parts.css: the visual parts the market intelligence report is drawn with (report-parts.js), on the
 * report's own tokens. Built 2026-09-05 from the owner's composition of the layout mockups. */
.rp-tiles{display:grid;gap:10px;grid-template-columns:repeat(var(--cols,4),minmax(0,1fr))}
.rp-tile{background:var(--surface2);border:1px solid var(--line);border-radius:10px;padding:12px 12px 10px;min-height:76px}
.rp-tile .v{font:700 26px/1 var(--disp);color:var(--gold)}.rp-tile.mint .v{color:var(--mint)}.rp-tile.bad .v{color:var(--bad)}.rp-tile.ink .v{color:var(--ink)}.rp-tile.blue .v{color:var(--blue,#6fb3ff)}
.rp-tile .l{font:11px/1.3 var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--ink3);margin-top:6px}
.rp-tile .s{font-size:12px;color:var(--ink2);margin-top:4px}
.rp-tile.big .v{font-size:40px}
.rp-bars{display:grid;gap:7px}
.rp-bar{display:grid;grid-template-columns:minmax(120px,var(--lw,180px)) 1fr auto;gap:10px;align-items:center;font-size:13px}
.rp-bar .l{color:var(--ink2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rp-bar .t{height:10px;background:var(--line2);border-radius:5px;overflow:hidden;position:relative}
.rp-bar .t i{display:block;height:100%;background:var(--gold);border-radius:5px}
.rp-bar.mint .t i{background:var(--mint)}.rp-bar.bad .t i{background:var(--bad)}.rp-bar.blue .t i{background:var(--blue,#6fb3ff)}.rp-bar.purp .t i{background:var(--purp,#b58cff)}.rp-bar.ink .t i{background:var(--ink3)}
.rp-bar .v{font:500 12px var(--mono);color:var(--ink2);white-space:nowrap}
.rp-stack{margin:6px 0}
.rp-stack .t{display:flex;height:16px;border-radius:8px;overflow:hidden;background:var(--line2)}
.rp-stack .t i{display:block;height:100%}
.rp-stack .lg{display:flex;flex-wrap:wrap;gap:6px 14px;margin-top:8px;font-size:12px;color:var(--ink2)}
.rp-stack .lg span::before{content:"";display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:6px;background:var(--c);vertical-align:0}
.rp-ringwrap{display:flex;flex-direction:column;justify-content:center;align-items:center;padding:6px;gap:6px}
.rp-ring-cap{font:11px var(--mono);letter-spacing:.04em;color:var(--ink3);text-align:center;max-width:220px;line-height:1.35}
.rp-ring{display:block;max-width:100%}
.rp-rings{display:grid;grid-template-columns:repeat(var(--rc,3),minmax(0,1fr));gap:10px;align-items:center;justify-items:center}
.rp-dots{display:grid;gap:3px;grid-template-columns:repeat(var(--dc,20),1fr);max-width:var(--dw,420px)}
.rp-dots i{display:block;aspect-ratio:1;border-radius:2px;background:var(--line)}
.rp-dots i.on{background:var(--gold)}.rp-dots.mint i.on{background:var(--mint)}.rp-dots.bad i.on{background:var(--bad)}.rp-dots.blue i.on{background:var(--blue,#6fb3ff)}
.rp-heat{display:grid;gap:4px;font-size:11px}
.rp-heat .r{display:grid;grid-template-columns:var(--hl,140px) repeat(var(--hc,7),1fr);gap:4px;align-items:center}
/* an advertiser's name and what it is, whole, over two lines if it needs them (the layout audit of 28 Sep, P3-10) */
.rp-heat .r .l{color:var(--ink2);font-size:12px;line-height:1.25;overflow-wrap:anywhere}
.rp-heat .r i{display:block;height:20px;border-radius:3px;background:rgba(230,182,84,var(--a,.1));border:1px solid var(--line2)}
.rp-heat .r i.m{background:rgba(67,213,151,var(--a,.1))}
.rp-heat .hd{display:grid;grid-template-columns:var(--hl,140px) repeat(var(--hc,7),1fr);gap:4px;font:10px var(--mono);color:var(--ink3);text-transform:uppercase;letter-spacing:.06em}
.rp-heat .hd span{text-align:center;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
/* r12-hist-left (the owner, 2026-09-09): the charts sit against the left edge, under their own kick line and
   in line with every other block in the section. Centring a fixed-width chart inside a full-width column left
   it floating away from the heading that names it. */
.rp-histwrap{display:flex;justify-content:flex-start;width:100%}
.rp-hist text{font:10px var(--mono);fill:var(--ink3)}
.rp-spark polyline{fill:none;stroke:var(--mint);stroke-width:2}
/* a card's line never paints past its card (the review of the demand round, L7: 9 px over at 1024 px); it scales down */
.rp-card .rp-spark{display:block;max-width:100%;height:auto}
/* reviews round two (2026-09-07): the quote under a theme bar, the 24-month series, the season strip, the momentum chip, the tall table, the rule row, the business drawer */
/* No coloured left borders (standing owner design rule). The quote becomes a plate with a FULL coloured
   border, which is the owner's first option, so the tone still reads at a glance and the shape obeys the rule.
   Two tones the old rule never styled are declared here as well: `bars()` passes the BAR's tone through to its
   quote, and purp and blue were both live and both falling through to nothing. */
.rp-q{grid-column:1/-1;font-size:12.5px;color:var(--ink2);line-height:1.4;padding:6px 9px;border:1px solid var(--line);border-radius:6px;margin:-2px 0 6px}
.rp-q.mint{border-color:rgba(67,213,151,.45)}.rp-q.bad{border-color:rgba(236,118,99,.45)}.rp-q.gold{border-color:var(--gold-line)}.rp-q.ink{border-color:var(--line)}
.rp-q.blue{border-color:rgba(111,179,255,.45)}.rp-q.purp{border-color:rgba(181,140,255,.45)}
.rp-q .rp-q-meta{font:500 11px var(--mono);color:var(--ink3);margin-left:8px;white-space:nowrap}
/* W10 (the owner's ruling D5, 30 Sep 2026): a line with tags says it is an excerpt whose tags describe the whole review; in a
   drawer a word defines, the words (or the sentence) it is listed for are marked, and the note says how many it lists */
.rp-q-excerpt{display:block;margin-top:3px;font:11.5px/1.4 var(--body);color:var(--ink3)}
mark.rp-qsup{background:var(--gold-line);color:inherit;border-radius:3px;padding:0 2px;-webkit-box-decoration-break:clone;box-decoration-break:clone}
.rp-guard-note{margin:2px 0 10px;line-height:1.45}
/* a month nobody read, against a month that earned nothing: the first is a faint band, the second a baseline
   tick. Drawing neither said they were the same, which they are not. */
.rp-series .gap{fill:var(--ink3);opacity:.25}
.rp-series .bar.zero{opacity:.45}
.rp-serieswrap{margin:6px 0 10px}
.rp-series{display:block}
.rp-series .ax{stroke:var(--line);stroke-width:1}
.rp-series .bar{fill:var(--mint);opacity:.85}
.rp-series .rate{fill:none;stroke:var(--gold);stroke-width:2;stroke-linejoin:round}
.rp-series .rate-dot{fill:var(--gold)}
.rp-series .lab{font:10px var(--mono);fill:var(--ink3)}
.rp-season{max-width:560px}
.rp-season .rp-spark{display:block;width:100%;height:auto}
.rp-season-ends{display:flex;justify-content:space-between;font:10.5px var(--mono);color:var(--ink3);letter-spacing:.04em;margin-top:4px}
.rp-chip.rp-momo{text-transform:uppercase;letter-spacing:.06em;font-size:10px}
.rp-chip.ink{color:var(--ink2);border-color:var(--line)}.rp-chip.purp{color:var(--purp,#b58cff);border-color:rgba(181,140,255,.35)}
.rp-tblwrap.rep-tall{max-height:62vh;overflow-y:auto}
.rp-tbl tr.rule td{border-top:2px solid var(--gold-line);border-bottom:2px solid var(--gold-line);color:var(--gold);font-weight:600;background:var(--gold-soft)}
.rp-tbl tr.you td{background:var(--gold-soft);color:var(--gold);font-weight:600}
/* the order's rival in a list drawer or a chapter's table (Jose's note 4 of 30 Sep 2026; report-view.js miRivalOf) */
.rp-tbl tr.rival td{background:rgba(199,146,234,.09)}
.rp-tbl td.you{color:var(--gold);font-weight:600}
.rp-tbl td.bad{color:var(--bad)}
.rp-tbl.rp-reviews td.q,.rp-drawer-scroll .rp-reviews td{white-space:normal;line-height:1.4}
.rp-drawer-panel.wide{width:min(920px,96vw)}
.rp-drawer-scroll.rp-biz{padding:12px 14px;display:block}
.rp-biz .rp-kick{margin-top:16px}
.rp-biz .rp-tiles{margin-top:8px}
.rp-biz .rp-biz-line{font-size:13px;color:var(--ink2);margin:8px 0;line-height:1.5}
.rp-biz .rp-biz-line .rp-chip{vertical-align:middle}
.rp-biz .rp-q{margin:6px 0 8px}
.rp-drawer-empty{font-size:13px;color:var(--ink2);line-height:1.5;padding:10px 0}
.mi-biz{cursor:pointer;border-bottom:1px dotted var(--gold-line)}
.mi-biz:hover,.mi-biz:focus-visible{color:var(--gold);outline:none;border-bottom:1px solid var(--gold)}
.mi-namewrap a.mi-gbp{font:500 10px var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--ink3);border-bottom:0;margin-left:2px}
.mi-namewrap a.mi-gbp:hover{color:var(--gold)}
.mi-roll td.spark{padding-top:2px;padding-bottom:2px}.mi-roll td.spark svg{display:block;width:120px;height:24px}
.mi-roll td.spark .rp-spark polyline{stroke-width:1.5}
.rp-range{position:relative;height:10px;background:var(--line2);border-radius:5px}
.rp-range i{position:absolute;top:0;height:100%;background:var(--gold-soft);border:1px solid var(--gold-line);border-radius:5px}
.rp-range b{position:absolute;top:-3px;width:4px;height:16px;background:var(--mint);border-radius:2px;transform:translateX(-50%)}
.rp-cards{display:grid;gap:10px;grid-template-columns:repeat(var(--cc,3),minmax(0,1fr))}
.rp-card{background:var(--surface2);border:1px solid var(--line);border-radius:10px;padding:12px}
.rp-card .n{font-weight:600;font-size:13.5px;line-height:1.3}
.rp-card .m{font:11px var(--mono);color:var(--ink3);margin-top:4px}
.rp-card .k{font:700 22px var(--disp);color:var(--gold);margin-top:6px}
.rp-card .m.rp-overlap{color:var(--ink2)}
.rp-tl{display:grid;grid-template-columns:repeat(var(--tc,3),1fr);gap:12px;position:relative}
.rp-tl::before{content:"";position:absolute;left:0;right:0;top:14px;height:2px;background:var(--line)}
.rp-tl .ph{position:relative;padding-top:30px}
.rp-tl .ph::before{content:"";position:absolute;left:0;top:8px;width:14px;height:14px;border-radius:50%;background:var(--gold);box-shadow:0 0 0 4px var(--bg)}
.rp-tl .ph h5{margin:0 0 8px;font:700 13px var(--mono);letter-spacing:.08em;color:var(--gold);text-transform:uppercase}
.rp-tl .ph .rp-card{margin-bottom:8px}
.rp-axis{position:relative;height:150px;margin:10px 0 28px;border-bottom:1px solid var(--line)}
.rp-axis .tick{position:absolute;bottom:-18px;transform:translateX(-50%);font:10px var(--mono);color:var(--ink3)}
.rp-axis .b{position:absolute;transform:translate(-50%,-50%);border-radius:50%;background:var(--gold-soft);border:1px solid var(--gold-line);display:flex;align-items:center;justify-content:center;font:600 11px var(--mono);color:var(--ink)}
.rp-axis .b.near{background:var(--mint-soft);border-color:rgba(67,213,151,.4)}
.rp-axis .b span{position:absolute;top:100%;margin-top:4px;white-space:nowrap;font:11px var(--body);color:var(--ink2)}
.rp-chip{display:inline-block;font:500 11px var(--mono);padding:2px 8px;border-radius:999px;border:1px solid var(--line);color:var(--ink2);background:var(--surface2);margin:2px 4px 2px 0;text-decoration:none}
.rp-chip.mint{color:var(--mint);border-color:rgba(67,213,151,.35);background:var(--mint-soft)}.rp-chip.bad{color:var(--bad);border-color:rgba(236,118,99,.35);background:var(--bad-soft)}.rp-chip.gold{color:var(--gold);border-color:var(--gold-line);background:var(--gold-soft)}
/* a chip whose list keeps fewer lines than its figure says how many it keeps (the owner's D8 of 30 Sep 2026; report-parts.js sayKept) */
.rp-chip .rp-kept{color:var(--ink2)}
a.rp-chip:hover{border-color:var(--gold)}
.rp-dot{display:inline-block;width:9px;height:9px;border-radius:50%;background:var(--line);margin-right:4px;vertical-align:-1px}.rp-dot.mint{background:var(--mint)}.rp-dot.bad{background:var(--bad)}.rp-dot.gold{background:var(--gold)}.rp-dot.blue{background:var(--blue,#6fb3ff)}.rp-dot.ink{background:var(--ink3)}.rp-dot.purp{background:var(--purp,#b58cff)}
/* a key's dot for a mark drawn lighter: the 24 month chart's months not read (.rp-series .gap), a year so far (.rp-hist rect.soft) */
.rp-dot.gap{background:var(--ink3);opacity:.25}.rp-dot.soft{opacity:.45}.rp-hist rect.soft{opacity:.45}
/* the key of a stacked bar in equal columns (the layout audit of 28 Sep, A-P2-7), and the season strip's peak under its axis */
.rp-stack.rp-stack-cols .lg{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:6px 14px}
.rp-season-peak{margin:4px 0 0}
.rp-split{display:grid;gap:18px;grid-template-columns:var(--sc,1fr 1fr);align-items:start}
.rp-kick{font:600 11px var(--mono);letter-spacing:.14em;text-transform:uppercase;color:var(--gold);margin:0 0 6px}
.rp-note{font-size:12px;color:var(--ink3)}
/* the tables that must not wrap: fixed layout, one line per cell, the whole value on hover */
.rp-tbl{width:100%;border-collapse:collapse;font-size:13px;table-layout:fixed}
.rp-tbl th{font:600 10.5px var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--ink3);text-align:left;padding:6px 8px;border-bottom:1px solid var(--line);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rp-tbl td{padding:7px 8px;border-bottom:1px solid var(--line2);vertical-align:middle;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rp-tbl td.num,.rp-tbl th.num{text-align:right;font-family:var(--mono);font-size:12px}
.rp-tbl td.rp-empty{color:var(--ink3);text-align:center;white-space:normal}
/* anything that opens a list */
.rp-facet{cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease}
.rp-facet:hover,.rp-facet:focus-visible{outline:none;border-color:var(--gold)!important;box-shadow:0 0 0 2px var(--gold-soft)}
.rp-hist rect.rp-facet:hover,.rp-hist rect.rp-facet:focus-visible,.rp-hist path.rp-facet:hover,.rp-hist path.rp-facet:focus-visible{stroke:var(--gold);stroke-width:2;outline:none}
/* a stacked part's hit area (report-parts.js hist, HIT): on a touch screen or a narrow one only, where a finger needs it */
.rp-hist .rp-hit{display:none}
@media (pointer:coarse),(max-width:560px){.rp-hist .rp-hit{display:inline}}
/* EVERY PART OF A STACKED BAR CAN BE TAPPED (Jose's note 9 of 30 Sep 2026; report-parts.js stackParts, showBreakdown): on a touch
   screen or a narrow one a stack's bar is a band 26 px tall to a finger (its 16 px and 5 px over and under, the layout unmoved),
   and a tap on a stacked bar opens its parts under it, each a row of 44 px with its count and its list */
.rp-stack-bar{display:block}
@media (pointer:coarse),(max-width:560px){.rp-stack-bar{padding:5px 0;margin:-5px 0;cursor:pointer}}
.rp-bd{margin:8px 0 4px;padding:4px 10px 2px;border:1px solid var(--line);border-radius:10px;background:var(--surface2)}
.rp-bd-h{display:flex;justify-content:space-between;align-items:center;gap:8px;font:600 10.5px var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--ink2)}
.rp-bd-x{flex:none;min-width:32px;min-height:32px;border:1px solid transparent;border-radius:8px;background:none;color:var(--ink2);font:400 18px/1 var(--body);cursor:pointer}
.rp-bd-x:hover,.rp-bd-x:focus-visible{border-color:var(--line);color:var(--ink);outline:none}
.rp-bd-row{display:flex;align-items:center;gap:9px;min-height:44px;padding:4px 2px;border-top:1px solid var(--line2);font-size:13px;line-height:1.35;color:var(--ink2)}
.rp-bd-row .sw{flex:none;width:10px;height:10px;border-radius:2px;background:var(--c)}
.rp-bd-row .n{flex:none;min-width:3ch;font:600 13px var(--mono);color:var(--ink);text-align:right}
.rp-bd-row .l{flex:1 1 auto;min-width:0}
.rp-bd-row .go{flex:none;margin-left:auto;font:600 10px var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--gold)}
.rp-bd-row.rp-facet{cursor:pointer;border-radius:6px}
.rp-tile.rp-facet::after,.rp-card.rp-facet::after{content:"open the list";display:block;font:10px var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--gold);opacity:.75;margin-top:6px}
/* the drawer */
/* Above the map's floating window, which sits on <body> at 2147483000 and so is not contained by the map's own
   stacking context. That window already carries business names which open this drawer, so at z-index 60 the
   drawer opened UNDERNEATH the thing that opened it -- and the zip popup now offers a list button through the
   same door. Everything else the report overlays is well below. */
.rp-drawer{position:fixed;inset:0;z-index:2147483600;display:none}
.rp-drawer.on{display:block}
.rp-drawer-veil{position:absolute;inset:0;background:rgba(0,0,0,.55)}
.rp-drawer-panel{position:absolute;top:0;right:0;bottom:0;width:min(720px,94vw);background:var(--surface);border-left:1px solid var(--line);box-shadow:-18px 0 40px rgba(0,0,0,.45);display:flex;flex-direction:column;padding:18px 20px}
.rp-drawer-head{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:10px}
/* shown only when the drawer has somewhere to go back to, so its presence is the affordance */
.rp-drawer-back{align-self:center;flex-shrink:0;padding:6px 10px}
.rp-drawer-head h3{margin:2px 0;font:700 22px/1.1 var(--disp)}
.rp-drawer-kick{font:600 10.5px var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--gold)}
.rp-drawer-count{font:12px var(--mono);color:var(--ink3)}
.rp-drawer-actions{display:flex;gap:6px;flex-shrink:0}
.rp-btn{font:600 12px var(--body);background:var(--gold);color:#1a1405;border:0;border-radius:6px;padding:8px 12px;cursor:pointer}
.rp-btn.ghost{background:transparent;color:var(--ink2);border:1px solid var(--line)}
/* the review lines, read on demand (28 Sep): the line that says they are loading, or could not be, and its Try again */
.rp-lines-status .rp-btn{margin-left:8px;padding:4px 10px;vertical-align:baseline}
.rp-biz-own .rp-lines-status{margin:10px 0}
.rp-drawer-search{width:100%;margin:0 0 10px;background:var(--surface2);color:var(--ink);border:1px solid var(--line);border-radius:8px;padding:8px 10px;font:13px var(--body)}
.rp-drawer-scroll{flex:1;overflow:auto;border:1px solid var(--line);border-radius:8px}
.rp-drawer-scroll .rp-tbl{min-width:560px}
/* the business card's folds and its other reads (audit A of 28 Sep, A-P2-3): the summary first, the rest a click away; the
   reads a list that wraps on a phone, each with a small stacked bar; the towns' table as narrow as a phone */
.rp-biz .rp-biz-fold{margin-top:14px}
.rp-biz-fold-body{margin-top:6px}
.rp-biz-fold .rp-biz-fold{margin-top:8px}
.rp-reads{margin-top:6px}
.rp-read{margin:0 0 10px}
.rp-read-q{font:600 10.5px var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--ink3)}
.rp-read-a{font-size:13px;color:var(--ink2);line-height:1.45}
/* the card's small stacked bar (report-parts.js miniStack), never the services' mini tile, which shares the name "rp-mini" (the
   owner, 28 Sep: this bar's 8 px height, flex row and hidden overflow cut "The offer"'s tiles to 24 px, their counts and
   "open the list" clipped) */
.rp-mini:not(.rp-tile){display:flex;height:8px;max-width:320px;border-radius:4px;overflow:hidden;background:var(--line2);margin:4px 0 3px}
.rp-mini:not(.rp-tile) i{display:block;height:100%}
.rp-drawer-scroll .rp-tbl.rp-towns{min-width:0}
.rp-drawer-scroll .rp-tbl td{white-space:normal}
/* what this report holds about a business (the owner's ruling of 30 Sep 2026: no business card opens empty): a fact a row, its
   label beside its words and its note under them; a chapter's lists a row of chips; one column on a phone */
.rp-facts{display:grid;grid-template-columns:fit-content(36%) minmax(0,1fr);gap:7px 14px;margin:6px 0 2px;font-size:13px;line-height:1.45}
.rp-fact{display:contents}
.rp-facts dt{font:600 10.5px var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--ink3);padding-top:2px}
.rp-facts dd{margin:0;color:var(--ink)}
.rp-fact-v{color:var(--ink)}
.rp-fact-note{display:block;font-size:12px;color:var(--ink3);line-height:1.4;margin-top:1px}
.rp-facts dd .rp-chip{margin:0 6px 5px 0}
@media (max-width:560px){.rp-facts{grid-template-columns:minmax(0,1fr);gap:2px}.rp-facts dd{margin-bottom:8px}}
/* the owner, 2026-09-22 (market parity doc, section 12): a figure's explanation heads its list, inside the scroll */
.rp-drawer-explain{padding:14px 16px 16px;border-bottom:1px solid var(--line);background:var(--surface2)}
body.rp-drawer-open{overflow:hidden}
/* r12-drawer-fullscreen (the owner, 2026-09-09; desktop only, D-9): the flag lives on the DRAWER, so it
   survives navigating in and back out of a business, which swaps the panel's contents. */
.rp-drawer.fs .rp-drawer-panel{width:100vw;max-width:none;border-left:0;box-shadow:none;padding:22px 28px}
/* THE 24 MONTH CHART STOPS GROWING WITH THE WINDOW (the owner, 2026-09-11). It is drawn at 560 by 160 and
   set to width:100% so it fills the side panel instead of sitting in the left two thirds of it. Full
   screen makes that panel the whole viewport, so on a wide monitor the same rule stretched it to about
   1400 by 400: a chart of two dozen bars taking half the screen. Capped here and only here, so the panel
   view is untouched; 820 is still wider than it is drawn, so full screen still buys it room. */
.rp-drawer.fs .rp-series{max-width:820px}
.rp-drawer.fs .rp-drawer-veil{display:none}
.rp-drawer-fs[aria-pressed="true"]{color:var(--gold);border-color:var(--gold)}
/* measured: at 390px full screen buys 16px, at desktop 520px. A button that appears and does nothing is worse
   than no button, so below the width where it pays it is not offered. */
@media (max-width:900px){.rp-drawer-fs{display:none}.rp-drawer.fs .rp-drawer-panel{width:min(720px,94vw)}}
/* the paired bars (claimed over held), the multi tone dot field, the fixed table wrap, the section furniture */
.rp-pairs{gap:9px}
.rp-pair .tt{display:grid;gap:3px}
.rp-pair .t i.ink{background:var(--ink3)}.rp-pair .t i.mint{background:var(--mint)}.rp-pair .t i.gold{background:var(--gold)}.rp-pair .t i.bad{background:var(--bad)}
.rp-dots i.t-gold{background:var(--gold)}.rp-dots i.t-mint{background:var(--mint)}.rp-dots i.t-bad{background:var(--bad)}.rp-dots i.t-blue{background:var(--blue,#6fb3ff)}.rp-dots i.t-ink{background:var(--ink3)}.rp-dots i.t-purp{background:var(--purp,#b58cff)}
.rp-dots i.rp-facet{cursor:pointer}
/* THE WAFFLE'S SCALE (28 Sep, report-parts.js waffleScale): past ten rows a square is several businesses, and a group's
   last square is filled in part for a remainder (--pf, set through the CSSOM), the rest of it in an empty square's colour,
   so its size still reads. A square's tone rides --c. */
.rp-dots i{--c:var(--line)}
.rp-dots i.on{--c:var(--gold)}.rp-dots.mint i.on{--c:var(--mint)}.rp-dots.bad i.on{--c:var(--bad)}.rp-dots.blue i.on{--c:var(--blue,#6fb3ff)}
.rp-dots i.t-gold{--c:var(--gold)}.rp-dots i.t-mint{--c:var(--mint)}.rp-dots i.t-bad{--c:var(--bad)}.rp-dots i.t-blue{--c:var(--blue,#6fb3ff)}.rp-dots i.t-ink{--c:var(--ink3)}.rp-dots i.t-purp{--c:var(--purp,#b58cff)}
.rp-dots i.part,.rp-dots.mint i.part,.rp-dots.bad i.part,.rp-dots.blue i.part{background:linear-gradient(90deg,var(--c) var(--pf,50%),var(--line) var(--pf,50%))}
.rp-dots i.part.off{background:linear-gradient(90deg,var(--line) var(--pf,50%),transparent var(--pf,50%));box-shadow:inset 0 0 0 1px var(--line)}
.rp-dots .rp-dots-per{grid-column:1/-1;margin:6px 0 0;font:500 10.5px var(--mono);letter-spacing:.04em;color:var(--ink3)}
/* the key under a waffle: a button a group, its exact count on it (the keyboard's way to the group's list); every key's dot is
   the colour of its marks (.rp-dot.ink and .rp-dot.purp above, the layout audit of 28 Sep, A-P1-3) */
.rp-legend span.rp-facet{border-radius:4px;padding:1px 3px;margin:-1px -3px}
.rp-tblwrap{overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;background:var(--surface);border:1px solid var(--line2);padding:2px 8px}
.rp-tbl td.rp-facet{cursor:pointer;color:var(--gold)}
.rp-tbl tr.rp-facet{cursor:pointer}.rp-tbl tr.rp-facet:hover td{background:var(--surface2)}
.rp-tbl td .rp-dot{margin-right:6px}
/* a table whose cells are read whole, over two lines if they need them (the layout audit of 28 Sep, P3-10) */
.rp-tbl.rp-wrap td,.rp-tbl.rp-wrap th{white-space:normal;overflow:visible;text-overflow:clip}
/* a long table's "Show all" (report-parts.js showAll): the button on screen, where the rest is on paper */
.rp-showall-print{display:none}
.rp-hero{font:700 26px/1.12 var(--disp);letter-spacing:.01em;margin:0 0 10px;color:var(--ink)}
.rp-hero .em{color:var(--mint)}
.rp-act{font-size:15px;line-height:1.4;color:var(--ink);margin:0 0 12px;max-width:60em}
.rp-act .em{color:var(--mint);font-weight:600}
.rp-legend{display:flex;flex-wrap:wrap;gap:6px 14px;font-size:12px;color:var(--ink2);margin-top:8px}
.rp-small{color:var(--ink3);font-size:12px;margin:6px 0 0}
.rp-chips{display:flex;flex-wrap:wrap;gap:4px 2px;margin-top:8px}
/* the services' mini tile (report-view.js miMini): its label wraps whole, its count, its bar and "open the list" under it; the
   grid's rows as tall as its tallest tile, so every row of tiles is equal (the owner, 28 Sep) */
.rp-tile.rp-mini{padding:10px 12px 12px;min-height:0;display:flex;flex-direction:column}.rp-tile.rp-mini .l{margin-top:0;overflow-wrap:anywhere}.rp-tile.rp-mini .v{font-size:20px;margin-top:4px}.rp-tile.rp-mini .v small{font:500 12px var(--mono);color:var(--ink3);margin-left:4px}
.rp-tile.rp-mini .t{height:8px;background:var(--line2);border-radius:4px;overflow:hidden;margin-top:auto}.rp-tile.rp-mini .t i{display:block;height:100%;background:var(--gold);border-radius:4px}
.rp-tile.rp-mini .v{margin-bottom:8px}
.rp-tiles.rp-minis{grid-auto-rows:1fr}
.rp-heroline{font:700 30px/1 var(--disp);color:var(--ink);margin:0}
.rp-heroline.mint{color:var(--mint)}.rp-heroline.gold{color:var(--gold)}.rp-heroline.bad{color:var(--bad)}.rp-heroline.blue{color:var(--blue,#6fb3ff)}
.rp-herobox{display:flex;flex-direction:column;justify-content:center;gap:4px;padding:8px 10px;border-radius:10px;flex:1 1 180px;min-width:0}
.rp-herobox.rp-facet{border:1px solid var(--line)}
.rp-ringrow{display:flex;align-items:center;gap:14px;flex-wrap:nowrap}
.rp-ringrow .rp-ringwrap{flex:none}
.rp-gap{height:12px}
.rp-ringwrap.rp-facet{border-radius:12px;border:1px solid transparent}
/* the chapter's sections: one per mockup sub chapter, a hairline between */
.mi-sec{margin-top:22px;padding-top:18px;border-top:1px solid var(--line2)}
.mi-sec:first-child{margin-top:0;padding-top:0;border-top:0}
.mi-sec h3{margin:0 0 3px;font:700 17px/1.2 var(--disp);color:var(--ink)}
.mi-sec .sub{font-size:12.5px;color:var(--ink3);margin:0 0 12px;max-width:72em}
.mi-sec .rp-kick{margin-top:14px}
.mi-sec .rp-kick:first-child{margin-top:0}
.mi-sec .rep-explain{margin-top:14px}
.mi-sec .mapcap{margin-top:12px}
.mi-sec .rp-cats{display:grid;grid-template-columns:1fr 1fr;gap:6px 18px;margin-top:12px}
.mi-sec .rp-cats div{font-size:12px;color:var(--ink3)}.mi-sec .rp-cats b{display:block;font:600 10.5px var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--gold)}
#mi-book .rep-card>h2{margin-bottom:12px}
.mi-sigs{margin:14px 0 0;max-width:46em}
.mi-sigs .rp-note{margin-top:8px}
@media (max-width:900px){.mi-sec .rp-cats{grid-template-columns:1fr}}
@media print{
  .rp-tile,.rp-card,.rp-tblwrap,.rp-herobox.rp-facet{background:#fff;border-color:#999}
  .rp-tile .v,.rp-card .n,.rp-card .k,.rp-hero,.rp-act,.rp-heroline,.rp-hero .em,.rp-act .em,.mi-sec h3{color:#111 !important}
  .rp-tile .l,.rp-tile .s,.rp-card .m,.rp-bar .l,.rp-bar .v,.rp-legend,.rp-small,.mi-sec .sub,.rp-note,.rp-stack .lg,.rp-ring-cap,.mi-sec .rp-cats div{color:#333 !important}
  .rp-kick,.mi-sec .rp-cats b,.rp-tl .ph h5{color:#5a4413 !important}
  .rp-bar .t,.rp-stack .t,.rp-range,.rp-mini .t,.rp-dots i{background:#eee;-webkit-print-color-adjust:exact;print-color-adjust:exact}
  .rp-bar .t i,.rp-stack .t i,.rp-dots i.on,.rp-dots i.part,.rp-mini .t i,.rp-pair .t i,.rp-range i,.rp-range b,.rp-heat .r i{-webkit-print-color-adjust:exact;print-color-adjust:exact}
  .rp-dot,.rp-stack .lg span::before{-webkit-print-color-adjust:exact;print-color-adjust:exact}
  .rp-showall .rp-chip.rp-facet,.rp-showall .rp-chip{display:none !important}.rp-showall-print{display:inline;font-size:11px;color:#555}
  /* (the $99 review of 2 Oct 2026, P3: "open the list" and the list drawer's "Filter by any text" printed; on paper a button
     opens nothing, and a drawer is a screen's window) */
  .rp-chip.rp-openlist,.rp-drawer{display:none !important}
  .rp-hist .rp-hit{display:none !important}
  .rp-bd{display:none !important}
  /* (round 2, B4) the ring's own words, its figure and the caption lines inside it, are drawn in the screen's near-white
     (a CSSOM fill of var(--ink) and var(--ink3), which only !important outranks) and printed faded; on paper they take
     ink, and the ring's track goes light under its coloured arc */
  .rp-ring text{fill:#333 !important}
  .rp-ring text:first-of-type{fill:#111 !important}
  .rp-ring circle:first-of-type{stroke:#ddd !important}
  .rp-dot.gap{background:#e6e6e6;opacity:1}
  .rp-dots i{--c:#eee}.rp-dots .rp-dots-per{color:#555}
  .rp-dots i.part,.rp-dots.mint i.part,.rp-dots.bad i.part,.rp-dots.blue i.part{background:linear-gradient(90deg,var(--c) var(--pf,50%),#eee var(--pf,50%))}
  .rp-dots i.part.off{background:linear-gradient(90deg,#eee var(--pf,50%),#fff var(--pf,50%));box-shadow:inset 0 0 0 1px #ccc}
  .rp-tile.rp-facet::after,.rp-card.rp-facet::after,.rp-drawer{display:none !important}
  /* A facet chip used to be hidden outright in print, on the reasoning that a chip is only a way into a list
     and paper has no lists. That stopped being true the moment a chip started CARRYING A FIGURE: making the
     lender pills clickable deleted the whole "financing through" row from the customer's PDF and left its
     gold label standing over nothing. A chip prints as what it says; only its way in is dropped. */
  .rp-chip.rp-facet{display:inline-flex !important;cursor:default;border-style:solid}
  .rp-chip.rp-facet::after{display:none !important}
  /* (the $99's round 3 pre-flight, M1: chipBtn gives "open the list" both classes, so the facet rule above, later and of the
     same weight, printed it again; three classes outrank it) */
  .rp-chip.rp-facet.rp-openlist{display:none !important}
  /* the tone survives on paper: a border prints as content, where a background needs print-color-adjust and is
     dropped by default. Ink-safe hues, since the screen's translucent ones vanish on white. */
  .rp-q{color:#333;border-color:#bbb}
  .rp-q.mint{border-color:#2e9b6d}.rp-q.bad{border-color:#c2543f}.rp-q.gold{border-color:#a8802a}.rp-q.ink{border-color:#999}
  .rp-q.blue{border-color:#3f7fbf}.rp-q.purp{border-color:#7f5fbf}
  mark.rp-qsup{background:none;color:#111;text-decoration:underline;text-decoration-color:#a8802a;text-underline-offset:2px}
  .rp-series .bar{fill:#777}.rp-series .bar.zero{fill:#bbb}.rp-series .gap{fill:#e6e6e6;opacity:1}.rp-series .rate{stroke:#333}.rp-series .lab{fill:#555}.rp-tbl tr.rule td,.rp-tbl tr.you td{background:#f3ead2;color:#5a4413}.rp-tbl tr.rival td{background:#f1e8f7}
  .mi-biz{border-bottom:0}.mi-namewrap a.mi-gbp{display:none}.rp-tblwrap.rep-tall{max-height:none;overflow:visible}
  .rp-tbl th{color:#555;border-color:#999}.rp-tbl td{color:#333;border-color:#ddd}.rp-tbl td.rp-facet{color:#111}
  .mi-sec{border-color:#ddd}
  .rp-chip{color:#333;border-color:#999;background:#fff}
  .rp-hist text,.rp-axis .tick{fill:#555;color:#555}
}
/* a long row of tiles between the tablet and the wide desktop (the quality review of 27 Sep: seven tiles in one row at
   1024 px, each about 90 px wide, their labels broken into four lines) takes four to a row there */
@media (min-width:901px) and (max-width:1180px){.rp-tiles[data-n="5"],.rp-tiles[data-n="6"],.rp-tiles[data-n="7"],.rp-tiles[data-n="8"]{grid-template-columns:repeat(4,minmax(0,1fr))}}
/* the parts set their column count inline as a custom property, which a media rule cannot override; the rule sets the columns themselves */
@media (max-width:900px){.rp-tiles{grid-template-columns:repeat(2,minmax(0,1fr))}.rp-tiles[data-n="3"]{grid-template-columns:repeat(3,minmax(0,1fr))}.rp-tiles[data-n="1"]{grid-template-columns:1fr}.rp-split{grid-template-columns:1fr}.rp-cards{grid-template-columns:1fr}.rp-tl{grid-template-columns:1fr}.rp-rings{grid-template-columns:1fr}.rp-heat .r,.rp-heat .hd{grid-template-columns:100px repeat(var(--hc,7),1fr)}}
@media (max-width:560px){.rp-tile .v{font-size:22px}.rp-tile.big .v{font-size:30px}.rp-tiles[data-n="3"]{gap:6px}.rp-tiles[data-n="3"] .rp-tile{padding:10px 8px 8px}.rp-drawer-head{flex-wrap:wrap}.rp-drawer-actions{width:100%;justify-content:flex-end}.rp-drawer-panel{padding:14px 12px}}
/* ONE SET OF COLUMNS FOR A WHOLE BAR LIST (the quality review of 27 Sep, P1-1). Each row used to size its own three
   columns, so a row with a long value gave its bar less room than the row above it: at 768 px the website software
   bars were 0 px wide and the census bars ran from 0 to 33 px, and no two rows could be compared. The list now owns the
   columns and every row takes them as a subgrid, so every bar in a list starts and ends at the same place and a bar's
   length is its value again. The label column never takes more than a third, the bar never less than 72 px, and the
   value column is as wide as its widest value up to 40% (38% on a phone), wrapping beyond that, which is also what
   keeps a long value from pushing a phone's page sideways (the r33 refutation #1, the QA ledger's L-12). A browser
   without subgrid keeps each row's own columns from the rule at the top of this file. */
.rp-bars{grid-template-columns:minmax(100px,min(var(--lw,180px),42%)) minmax(72px,1fr) fit-content(40%);column-gap:10px}
/* a label longer than its column wraps to a second line; it is never cut short with an ellipsis */
.rp-bars .rp-bar .l{white-space:normal;overflow-wrap:break-word;line-height:1.25}
.rp-bar{grid-column:1/-1;grid-template-columns:subgrid}
.rp-bar .v{white-space:normal;text-align:right;line-height:1.25}
@media (max-width:560px){.rp-bars{grid-template-columns:minmax(72px,34%) minmax(64px,1fr) fit-content(38%)}.rp-bar .v{line-height:1.2;font-size:11px}.rp-bar .l{font-size:12px}}
/* ── THE LONG LISTS (the audit of 28 Sep, A-P1-2 and A-P2-2): the list and reviews drawers on a big market ───────────────── */
/* a hundred rows at a time: under them, how many are on screen and the one button that draws the next hundred */
.rp-more{display:flex;align-items:center;justify-content:space-between;gap:8px 12px;flex-wrap:wrap;padding:10px 12px;border-top:1px solid var(--line2);font:12px var(--mono);color:var(--ink3)}
.rp-more[hidden]{display:none}
.rp-more .rp-more-btn{min-height:36px;padding:8px 14px}
.rp-more .rp-more-btn:focus-visible,.rp-why-btn:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
/* the first of the rows a press drew takes the focus (R-SITE of 28 Sep), and shows it */
.rp-drawer-scroll tr[tabindex="-1"]:focus{outline:none}
.rp-drawer-scroll tr[tabindex="-1"]:focus-visible{outline:2px solid var(--gold);outline-offset:-2px}
/* read by a screen reader, not drawn */
.rp-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
/* the list: its columns as wide as their heads and values need, so no head is cut ("RATI…"); every sortable head a button,
   the order beside it (aria-sort on the head says it to a screen reader) */
.rp-tbl.rp-list{table-layout:auto}
.rp-tbl.rp-list th{overflow:visible;text-overflow:clip}
.rp-sort{background:none;border:0;padding:0;margin:0;font:inherit;letter-spacing:inherit;text-transform:inherit;color:inherit;cursor:pointer;display:inline-flex;align-items:center;gap:5px;white-space:nowrap}
.rp-sort::after{content:"";width:0;height:0;border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid currentColor;opacity:.3}
.rp-list th[aria-sort="ascending"],.rp-list th[aria-sort="descending"]{color:var(--gold)}
.rp-list th[aria-sort="descending"] .rp-sort::after{opacity:1}
.rp-list th[aria-sort="ascending"] .rp-sort::after{border-top:0;border-bottom:5px solid currentColor;opacity:1}
.rp-sort:hover{color:var(--ink)}
.rp-sort:focus-visible{outline:2px solid var(--gold);outline-offset:2px;border-radius:2px}
/* the reviews: the stars whole; the themes a list of two lines at most in the table (the whole list in the cell's title),
   and small chips in a phone's card */
.rp-reviews td.s{overflow:visible;text-overflow:clip;white-space:nowrap}
.rp-stars{white-space:nowrap;letter-spacing:0}
.rp-tclamp{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden;max-height:2.9em;line-height:1.4;font-size:12px;color:var(--ink2)}
.rp-tchip{display:inline}
/* the count line's detail, behind a small "?" */
.rp-why-btn{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;margin-left:6px;padding:0;border:1px solid var(--line);border-radius:50%;background:transparent;color:var(--ink2);cursor:pointer;vertical-align:1px;font:600 11px/1 var(--mono)}
.rp-why-btn::before{content:"?"}
.rp-why-btn[aria-expanded="true"]{border-color:var(--gold);color:var(--gold)}
.rp-why{display:block;margin-top:4px;font:12px/1.45 var(--body);color:var(--ink2);max-width:60em}
.rp-why[hidden]{display:none}
.rp-why-sep{display:none}
.rp-why::first-letter{text-transform:uppercase}
@media (max-width:759px){
  .rp-drawer-scroll .rp-tbl.rp-list,.rp-drawer-scroll .rp-tbl.rp-reviews{min-width:0}
  /* the list on a phone: the name, the zip and the list's own fact; the rest is on the business's card, one tap on the name */
  .rp-list.rp-fewer th,.rp-list.rp-fewer td{display:none}
  .rp-list.rp-fewer th.c-name,.rp-list.rp-fewer td.c-name,.rp-list.rp-fewer th.c-zip,.rp-list.rp-fewer td.c-zip,.rp-list.rp-fewer th.keycol,.rp-list.rp-fewer td.keycol,.rp-list.rp-fewer td.rp-empty{display:table-cell}
  .rp-list.rp-fewer td.c-name{width:60%}
  /* the reviews on a phone: a card each, its date, stars and business on one line, what they said, then its themes */
  .rp-tbl.rp-reviews,.rp-reviews tbody{display:block}
  .rp-reviews thead{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
  .rp-reviews tbody tr{display:grid;grid-template-columns:auto auto minmax(0,1fr);gap:4px 10px;align-items:baseline;padding:10px 12px;border-bottom:1px solid var(--line2)}
  .rp-drawer-scroll .rp-reviews tbody td{display:block;padding:0;border:0;white-space:normal;overflow:visible;text-overflow:clip;text-align:left}
  .rp-reviews td.d{font:11px var(--mono);color:var(--ink3);white-space:nowrap}
  .rp-reviews td.b{font-size:12.5px;color:var(--ink2);overflow-wrap:anywhere}
  .rp-reviews td.q,.rp-reviews td.t,.rp-reviews td.rp-empty{grid-column:1/-1}
  .rp-reviews td.q{font-size:13.5px;line-height:1.45;color:var(--ink)}
  .rp-reviews td.t .rp-tclamp{display:block;max-height:none;-webkit-line-clamp:none;line-clamp:none}
  .rp-tchip{display:inline-block;font:500 10.5px/1.4 var(--mono);padding:0 6px;margin:0 3px 3px 0;border:1px solid var(--line);border-radius:999px;color:var(--ink2);background:var(--surface2);white-space:normal;overflow-wrap:anywhere;vertical-align:1px}
  .rp-tsep{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
}
/* the ads grid and bars on a phone (the layout audit of 28 Sep, item 3): each advertiser's name on a line of its own above its
   cells, so the columns have the width their heads need, and a bar's name whole over two lines */
@media (max-width:560px){.rp-heat .hd,.rp-heat .r{grid-template-columns:repeat(var(--hc,7),1fr)}.rp-heat .hd span:first-child{display:none}.rp-heat .r{row-gap:3px}.rp-heat .r .l{grid-column:1/-1;white-space:normal}.rp-bars.rp-bars-wrap .rp-bar .l{white-space:normal;overflow:visible;text-overflow:clip;line-height:1.25}}
