/* =============================================================
   RevvRider — single.css
   Single-post-only rules: hero, quick summary, TOC, review scores,
   comments, author box, related posts, post navigation, social share.
   ============================================================= */

.rr-single__header{padding-block:40px;background:var(--rr-gray-100);}
.rr-single__hero-content .rr-breadcrumbs{margin-bottom:18px;}
/* .rr-badge defaults to position:absolute for its usual job as an image
   overlay (cards, hero tiles) — in the single-post header it has no media
   box to anchor to, so it must render inline instead, or it escapes to the
   page's initial containing block and floats near the top of the viewport. */
.rr-single__header .rr-badge{position:static;display:inline-block;margin-bottom:14px;}
.rr-single__title{font-size:clamp(28px,4vw,42px);line-height:1.2;margin:0 0 18px;}
.rr-single__meta{display:flex;flex-wrap:wrap;gap:6px;align-items:center;color:var(--rr-gray-600);font-size:14px;margin-bottom:22px;}

/* Static pages (page.php) keep a plain full-bleed hero — only single posts
   use the 50/50 grid below. */
.rr-single__hero{max-height:520px;overflow:hidden;}
.rr-single__hero img{width:100%;height:100%;object-fit:cover;}

/* 50/50 hero: title/meta on the left, featured image on the right.
   object-fit:contain (not cover) is deliberate: not every existing image on
   a real site actually has the 'revvrider-hero' 16:9 size generated for it
   (older uploads, images added before the theme/its image sizes existed) —
   cover would crop those down to fill the box, which is exactly the "image
   isn't fully visible" complaint this section exists to fix. Contain
   guarantees the whole image shows regardless of its actual ratio, at the
   cost of letterboxing (filled by the box's own background) when an
   image's ratio doesn't match the 16:9 box. */
.rr-single__hero-grid{display:grid;grid-template-columns:1fr 1fr;gap:40px;align-items:center;}
.rr-single__hero-content{min-width:0;}
/* White, not gray-100 — .rr-single__header now has a gray-100 background of
   its own, so a same-color media box would blend invisibly into it instead
   of reading as a distinct image frame. */
.rr-single__hero-media{border-radius:var(--rr-radius);overflow:hidden;background:var(--rr-white);aspect-ratio:16/9;}
.rr-single__hero-media img{width:100%;height:100%;object-fit:contain;}
@media (max-width:900px){
	.rr-single__hero-grid{grid-template-columns:1fr;gap:20px;}
}

/* ---------- Content typography ---------- */
/* style.css's global h1-h6 reset gives headings margin:0 on top (only a
   bottom margin), so post-body headings had no breathing room of their own
   above them — they just inherited whatever the previous element's bottom
   margin happened to collapse to. Explicit top margins here, sized larger
   than the paragraph's own bottom margin, guarantee real separation
   regardless of what precedes them (FAQ answer paragraphs directly above a
   question heading were the worst offender). */
.rr-single__content h2{margin:2em 0 .6em;font-size:clamp(26px,3vw,30px);}
.rr-single__content h3{margin:1.7em 0 .5em;font-size:clamp(21px,2.4vw,24px);}
.rr-single__content h4{margin:1.4em 0 .5em;font-size:19px;}
/* h5/h6 otherwise fall back to raw browser UA defaults (~13px/~11px at this
   body size) since style.css's global h1-h6 reset sets no font-size at all —
   too small to read as headings. h5 matches body size but bold; h6 goes
   smaller still, so weight+caps carry the "this is a heading" signal instead
   of size. */
.rr-single__content h5{margin:1.3em 0 .4em;font-size:17px;font-weight:700;}
.rr-single__content h6{margin:1.3em 0 .4em;font-size:15px;font-weight:700;text-transform:uppercase;letter-spacing:.4px;}
.rr-single__content h2:first-child,.rr-single__content h3:first-child,.rr-single__content h4:first-child,.rr-single__content h5:first-child,.rr-single__content h6:first-child{margin-top:0;}
.rr-single__content p{margin:0 0 1.2em;}
/* Sitewide a{color:charcoal} (style.css) makes every link, nav or body text,
   the same dark neutral — fine for nav/UI chrome, but inline links inside
   an article need to stand out from the surrounding prose so readers can
   spot them at a glance. --rr-accent-text, not --rr-accent — plain article
   text on white is exactly the case that color fails AA contrast at (see
   the :root comment in style.css); the underline bar matches it for the
   same reason, so bar and text never mismatch.
   The underline itself is a background-gradient bar, not text-decoration —
   text-decoration has no size/length to transition, so a hover-driven
   "grow" animation needs an actual paintable box to animate instead. It
   sits flush under the baseline via background-position, starts at 0%
   width, and animates open left-to-right on hover (closing the same way on
   mouse-out). The gradient's own color is left untouched between states —
   only background-size transitions here, since a background-image color
   swap can't be eased, it just snaps; keeping one fixed accent-colored bar
   avoids a stray instant color-flip mid-animation. */
.rr-single__content a{color:var(--rr-accent-text);text-decoration:none;background-image:linear-gradient(var(--rr-accent-text),var(--rr-accent-text));background-repeat:no-repeat;background-position:0 100%;background-size:0% 2px;padding-bottom:1px;transition:color .2s ease,background-size .25s ease;}
.rr-single__content a:hover{color:var(--rr-charcoal);background-size:100% 2px;}
.rr-single__content ul,.rr-single__content ol{margin:0 0 1.2em;padding-left:1.4em;}
.rr-single__content > *:last-child{margin-bottom:0;}

/* Rank Math's FAQ block (h3.rank-math-question + div.rank-math-answer,
   each pair wrapped in .rank-math-faq-item) ships its own plugin CSS that
   zeroes the question heading's margin — that stylesheet loads after ours
   with the same single-class specificity, so it silently won regardless of
   the h2/h3 rule above and left every FAQ question flush against the
   previous answer. Scoped two classes deep here to outrank it outright, and
   spaced via the wrapper rather than the heading's own margin so it holds
   no matter what Rank Math does to the heading/answer elements directly. */
.rr-single__content .rank-math-faq-item{margin-top:1.7em;}
.rr-single__content .rank-math-faq-item:first-child{margin-top:0;}
.rr-single__content .rank-math-question{margin:0 0 .5em;}
.rr-single__content .rank-math-answer{margin:0;}

/* AI Summarize Buttons plugin ships its own hardcoded inline <style>
   (background:#e7f6ff, title color:#333) that never adapts to dark mode —
   it rendered as a bright light-blue panel regardless of theme, clashing
   against the dark surface everything else on the page switches to. Reuses
   --rr-gray-100/--rr-charcoal rather than new hardcoded colors since both
   already flip to the correct dark values under [data-rr-theme="dark"]. */
[data-rr-theme="dark"] .ai-summarize-buttons-wrapper{background:var(--rr-gray-100);}
[data-rr-theme="dark"] .ai-summarize-title{color:var(--rr-charcoal);}

.rr-social-share{display:flex;gap:8px;}
/* ::after used to draw an identical plain rounded square for every button
   (Facebook, X, Pinterest, copy, print, bookmark) — none recognizable as
   an icon, all indistinguishable from each other. Each gets its own inline
   SVG mask instead, same technique as the nav icons in main.css. */
.rr-social-share__btn{width:34px;height:34px;border-radius:50%;background:var(--rr-gray-100);border:none;cursor:pointer;position:relative;color:var(--rr-charcoal);transition:color .15s ease;}
/* Explicit, not relied-on-by-accident: three of these six are <a> tags
   (Facebook/X/Pinterest) and three are <button>s (copy/print/bookmark) —
   the global a:hover{color:accent} rule only ever reached the <a> ones,
   so half the set silently had no hover feedback at all. Pinterest is
   carved out since it's a fixed-color brand badge (see above), not a
   currentColor mask, so a color-only hover wouldn't do anything to it. */
.rr-social-share__btn:not(.rr-social-share__btn--pinterest):hover{color:var(--rr-accent);}
/* inset:6px (not 8px) — a couple more pixels of icon area makes the
   finer-detail marks (Pinterest's curves especially) render crisper
   instead of muddy at this button's small 34px size. */
.rr-social-share__btn::after{content:'';position:absolute;inset:6px;background-color:currentColor;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:contain;mask-size:contain;}
.rr-social-share__btn--facebook::after{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='black'%3E%3Cpath d='M22 12.06C22 6.48 17.52 2 12 2S2 6.48 2 12.06c0 5.02 3.66 9.18 8.44 9.94v-7.03H7.9v-2.91h2.54V9.84c0-2.5 1.49-3.89 3.77-3.89 1.09 0 2.24.2 2.24.2v2.46h-1.26c-1.24 0-1.63.77-1.63 1.56v1.88h2.78l-.44 2.91h-2.34v7.03C18.34 21.24 22 17.08 22 12.06z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='black'%3E%3Cpath d='M22 12.06C22 6.48 17.52 2 12 2S2 6.48 2 12.06c0 5.02 3.66 9.18 8.44 9.94v-7.03H7.9v-2.91h2.54V9.84c0-2.5 1.49-3.89 3.77-3.89 1.09 0 2.24.2 2.24.2v2.46h-1.26c-1.24 0-1.63.77-1.63 1.56v1.88h2.78l-.44 2.91h-2.34v7.03C18.34 21.24 22 17.08 22 12.06z'/%3E%3C/svg%3E");}
/* Real X (formerly Twitter) wordmark path, not a generic crossed-lines "X". */
.rr-social-share__btn--twitter::after{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='black'%3E%3Cpath d='M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='black'%3E%3Cpath d='M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z'/%3E%3C/svg%3E");}
/* Back to the shared currentColor mask, same as every other icon here — a
   fixed-brand-color badge (this used to be a solid red circle) stood out
   as the one colored icon in an otherwise monochrome row. This is the
   actual Pinterest logomark (the "P" is carved into the blob silhouette
   itself, same as the real brand icon) filled solid like the Facebook/X
   marks above, rather than the earlier hand-drawn circle+P — it reads as
   the genuine Pinterest shape even rendered in a single flat color. */
.rr-social-share__btn--pinterest::after{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='black'%3E%3Cpath d='M12.017 0C5.396 0 0 5.396 0 12.017c0 5.081 3.163 9.422 7.627 11.174-.105-.949-.199-2.403.041-3.439.219-.937 1.406-5.957 1.406-5.957s-.359-.72-.359-1.781c0-1.663.967-2.911 2.168-2.911 1.024 0 1.518.769 1.518 1.688 0 1.029-.653 2.567-.992 3.992-.285 1.193.6 2.165 1.775 2.165 2.128 0 3.768-2.245 3.768-5.487 0-2.861-2.063-4.869-5.008-4.869-3.41 0-5.409 2.562-5.409 5.199 0 1.033.394 2.143.889 2.741.099.12.112.225.084.345-.09.375-.293 1.199-.334 1.363-.053.225-.172.271-.402.165-1.495-.69-2.433-2.878-2.433-4.646 0-3.776 2.748-7.252 7.92-7.252 4.158 0 7.392 2.967 7.392 6.923 0 4.135-2.607 7.462-6.233 7.462-1.214 0-2.354-.629-2.752-1.398l-.749 2.848c-.269 1.045-.994 2.352-1.494 3.146 1.125.345 2.319.535 3.554.535 6.607 0 11.985-5.365 11.985-11.985C24.014 5.396 18.629.026 12.017.026L12.017 0z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='black'%3E%3Cpath d='M12.017 0C5.396 0 0 5.396 0 12.017c0 5.081 3.163 9.422 7.627 11.174-.105-.949-.199-2.403.041-3.439.219-.937 1.406-5.957 1.406-5.957s-.359-.72-.359-1.781c0-1.663.967-2.911 2.168-2.911 1.024 0 1.518.769 1.518 1.688 0 1.029-.653 2.567-.992 3.992-.285 1.193.6 2.165 1.775 2.165 2.128 0 3.768-2.245 3.768-5.487 0-2.861-2.063-4.869-5.008-4.869-3.41 0-5.409 2.562-5.409 5.199 0 1.033.394 2.143.889 2.741.099.12.112.225.084.345-.09.375-.293 1.199-.334 1.363-.053.225-.172.271-.402.165-1.495-.69-2.433-2.878-2.433-4.646 0-3.776 2.748-7.252 7.92-7.252 4.158 0 7.392 2.967 7.392 6.923 0 4.135-2.607 7.462-6.233 7.462-1.214 0-2.354-.629-2.752-1.398l-.749 2.848c-.269 1.045-.994 2.352-1.494 3.146 1.125.345 2.319.535 3.554.535 6.607 0 11.985-5.365 11.985-11.985C24.014 5.396 18.629.026 12.017.026L12.017 0z'/%3E%3C/svg%3E");}
.rr-social-share__btn--copy::after{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M9 15l6-6M8 12l-2.5 2.5a3 3 0 104.24 4.24L12 16.5M16 12l2.5-2.5a3 3 0 10-4.24-4.24L12 7.5'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M9 15l6-6M8 12l-2.5 2.5a3 3 0 104.24 4.24L12 16.5M16 12l2.5-2.5a3 3 0 10-4.24-4.24L12 7.5'/%3E%3C/svg%3E");}
/* Three plain stacked rects (paper feed, printer body, output tray) instead
   of the old single fragmented path — reads as a clean printer at small
   sizes instead of an ambiguous scribble. */
.rr-social-share__btn--print::after{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linejoin='round'%3E%3Crect x='6' y='2.5' width='12' height='6'/%3E%3Crect x='3.5' y='8.5' width='17' height='7' rx='1'/%3E%3Crect x='7' y='13.5' width='10' height='8'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linejoin='round'%3E%3Crect x='6' y='2.5' width='12' height='6'/%3E%3Crect x='3.5' y='8.5' width='17' height='7' rx='1'/%3E%3Crect x='7' y='13.5' width='10' height='8'/%3E%3C/svg%3E");}
.rr-social-share__btn--bookmark::after{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='black'%3E%3Cpath d='M6 3h12v18l-6-4.5L6 21z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='black'%3E%3Cpath d='M6 3h12v18l-6-4.5L6 21z'/%3E%3C/svg%3E");}
.rr-social-share__btn.is-bookmarked{color:var(--rr-accent);}

/* ---------- Quick Summary ---------- */
.rr-quick-summary{display:flex;gap:24px;align-items:center;background:var(--rr-gray-100);padding:24px;margin-block:24px;border-left:4px solid var(--rr-accent);}
.rr-quick-summary__score{flex-shrink:0;width:88px;height:88px;border-radius:50%;background:#fff;display:flex;flex-direction:column;align-items:center;justify-content:center;font-family:var(--rr-font-heading);}
.rr-quick-summary__score-value{font-size:28px;line-height:1;}
.rr-quick-summary__score-max{font-size:12px;color:var(--rr-gray-600);}
.rr-quick-summary__body h2{font-size:18px;text-transform:uppercase;margin-bottom:6px;}

/* ---------- Table of Contents ---------- */
.rr-toc{background:var(--rr-gray-100);padding:20px 24px;margin:0 0 24px;}
/* line-height:1 — the button's default "normal" line-height padded more
   space below the text baseline than above it (font descender metrics),
   so align-items:center still looked bottom-heavy; a 1:1 line box removes
   that extra leading and centers the text and chevron evenly. */
.rr-toc__title{width:100%;font:inherit;font-size:16px;line-height:1;text-transform:uppercase;margin-bottom:10px;display:flex;align-items:center;justify-content:space-between;cursor:pointer;background:none;border:none;color:inherit;padding:0;text-align:left;}
/* Nothing on the title signaled this is a collapsible accordion, not just a
   label — a chevron makes that affordance obvious at a glance. It reads off
   single.js's own aria-expanded attribute (already toggled there on click)
   rather than a separate CSS class, so the icon's rotated state can never
   drift out of sync with the actual list visibility. */
.rr-toc__title::after{content:'';width:14px;height:14px;flex-shrink:0;margin-left:12px;background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:contain;mask-size:contain;transition:transform .2s ease;}
.rr-toc__title[aria-expanded="false"]::after{transform:rotate(-90deg);}
/* Collapsing the list doesn't remove it from the DOM (display:none via JS),
   but the title's own margin-bottom survives regardless — without this it
   left a dead gray strip (the .rr-toc background, no content) between the
   title and whatever follows the collapsed widget. */
.rr-toc__title[aria-expanded="false"]{margin-bottom:0;}
/* list-style:none — numbers are rendered as explicit .rr-toc__number text
   (built in single.js) so "1.2"-style parent.child labels can be shown,
   which native <ol> counters can't produce across nested lists on their
   own; the native marker would just be a second, redundant "1." next to it. */
.rr-toc ol{list-style:none;margin:0;padding-left:0;}
.rr-toc__list > li{margin-bottom:6px;}
/* .rr-toc .rr-toc__sublist (two classes), not .rr-toc__sublist alone —
   ".rr-toc ol" above is a class+type selector, which outranks a single
   class selector regardless of which is declared later, so the plain
   ".rr-toc__sublist{margin-left:22px}" this replaced was silently losing
   to ".rr-toc ol{margin:0}" and the indent never actually rendered. */
.rr-toc .rr-toc__sublist{margin:6px 0 6px 22px;}
.rr-toc__sublist li{margin-bottom:4px;}
/* margin-right (not just min-width) — min-width alone only guarantees a gap
   for numbers shorter than 1.6em; "11.5" and similar wider two-digit labels
   fill that width exactly and end up flush against the link text with no
   visible space at all. */
.rr-toc__number{display:inline-block;min-width:1.6em;margin-right:4px;font-weight:600;color:var(--rr-gray-600);}
.rr-toc a{color:var(--rr-charcoal);}
.rr-toc a.is-active{color:var(--rr-accent-text);font-weight:700;}
.rr-toc__number + a.is-active{color:var(--rr-accent-text);}

/* ---------- Review scores ---------- */
.rr-review-scores{margin-block:32px;padding-top:24px;border-top:1px solid var(--rr-gray-100);}
.rr-review-scores__list{list-style:none;margin:0 0 24px;padding:0;display:flex;flex-direction:column;gap:10px;}
.rr-review-scores__row{display:grid;grid-template-columns:140px 1fr 40px;align-items:center;gap:12px;}
.rr-review-scores__bar{height:8px;background:var(--rr-gray-100);border-radius:4px;overflow:hidden;}
.rr-review-scores__bar span{display:block;height:100%;background:var(--rr-accent);}
.rr-review-verdict{margin-top:20px;padding:16px 20px;background:var(--rr-gray-100);}

/* ---------- Tags / links / nav ---------- */
.rr-tags{margin-block:24px;font-size:14px;}
.rr-tags a{display:inline-block;padding:6px 12px;background:var(--rr-gray-100);margin:2px;}
.rr-page-links{margin-block:20px;}
.rr-post-nav{display:flex;justify-content:space-between;gap:20px;padding-block:24px;border-top:1px solid var(--rr-gray-100);border-bottom:1px solid var(--rr-gray-100);margin-block:32px;}
.rr-post-nav__prev,.rr-post-nav__next{flex:1;}
.rr-post-nav__next{text-align:right;}
.rr-post-nav__label{display:block;font-size:12px;text-transform:uppercase;color:var(--rr-gray-600);}
.rr-post-nav__title{font-weight:600;}

/* ---------- Author box ---------- */
.rr-author-box{display:flex;gap:16px;padding:24px;background:var(--rr-gray-100);margin-block:24px;}
/* width/height/object-fit pinned explicitly — get_avatar()'s local-upload
   path (custom avatar plugins, etc.) isn't guaranteed to return a square
   source image the way Gravatar's own URLs are, so border-radius:50% alone
   rendered an oval whenever the source wasn't 1:1. */
.rr-author-box__avatar{width:80px;height:80px;object-fit:cover;border-radius:50%;flex-shrink:0;}
.rr-author-box__name{margin:0 0 6px;}
.rr-author-box__bio{margin:0;color:var(--rr-gray-600);}

/* ---------- Related ---------- */
.rr-related-posts{margin-block:32px;padding-top:24px;border-top:1px solid var(--rr-gray-100);}

/* ---------- Comments ---------- */
.rr-comments{margin-block:32px;padding-top:24px;border-top:1px solid var(--rr-gray-100);}
.rr-comments__list{list-style:none;margin:0;padding:0;}
.rr-comments__list .children{list-style:none;margin-left:48px;}
.comment-body{padding:16px 0;border-bottom:1px solid var(--rr-gray-100);}
.comment-form input[type="text"],.comment-form input[type="email"],.comment-form input[type="url"],.comment-form textarea{width:100%;padding:12px;border:1px solid var(--rr-gray-300);margin-bottom:12px;}

/* ---------- Print ---------- */
@media print{
	.rr-masthead,.rr-topbar,.rr-footer,.rr-sidebar,.rr-social-share,.rr-bottom-nav,.rr-ad-slot,.rr-progress-bar,.rr-comments,.rr-related-posts{display:none !important;}
}
