/*!
 * AQELTech_UnifiedReviews - Breeze styles for the unified reviews PDP block.
 *
 * Organic v4.3 redesign (2026-07): re-skin of the v3 navy/gold system onto a
 * warm, rounded "Organic" surface - native-palette tokens (every colour
 * traces to the live Breeze brand navy #014e83 / CTA gold #fdab18 / star
 * gold #e3a008 family, NOT the old solid-navy inverted summary panel), a
 * serif display type role (Georgia stack; self-host a Fraunces/Lora-class
 * webfont later - see project asset pipeline) for headings/titles/author
 * names/the pull-quote, a 3-sub-card aggregate summary (score / breakdown /
 * mentions+quote, each its own tinted panel), mention pills, a gold-tinted
 * quote card, visibly rounder cards (20px/12px radii vs v3's 12px/8px), the
 * REVIEWS.io attribution relocated to the card footer (opposite Helpful,
 * off the report-flag corner), two admin-configurable layouts (list_layout:
 * list|grid-2|grid-3, summary_layout: stacked|sided), and the v4.3 compact
 * "merged stat card" mobile summary. Ease-out motion throughout, respecting
 * prefers-reduced-motion.
 *
 * Design source: reviews-organic-v4-mockup.html (v4.3). That file is a
 * literal CSS re-skin authored against these exact real selectors; frame-
 * scoped `.aqr-frame--mobile` overrides there are reproduced below as real
 * `@media` rules. A few real selectors the mockup does not address (see
 * "Preserved, not part of the Organic re-skin" below) are kept from v3 with
 * only their token references remapped to the new names - dropping them
 * would leave the write-a-review form and two conditionally-rendered card
 * elements unstyled.
 *
 * Plain CSS (Breeze does not compile LESS at runtime). Keyed to the ACTUAL
 * server-rendered markup - every selector below matches a class emitted by
 * AQELTech_UnifiedReviews's product/view/*.phtml templates. Renaming any of
 * these classes here without updating the templates breaks the listing.
 *
 * The horizontal rating-breakdown bar grid sits on the
 * .__aggregate-bar-toggle anchor (the clickable filter link is the real
 * 3-column row wrapper) - styling the outer <li>.__aggregate-bar instead
 * leaves the label/track/count stacked as inline text.
 */

/* ── Shared base ──────────────────────────────────────────────────── */
.aqeltech-unifiedreviews,
.aqeltech-unifiedreviews *,
.aqeltech-unifiedreviews *::before,
.aqeltech-unifiedreviews *::after {
    box-sizing: border-box;
}

.aqeltech-unifiedreviews [hidden] { display: none !important; }

/* Fix 3 (v4.3 live-feedback pass): body scroll lock while the write-review
   modal is open. Necessarily a top-level (non-.aqeltech-unifiedreviews-
   scoped) rule since <body> is an ancestor of this section, not a
   descendant - Breeze/unified-reviews.js's modal controller toggles this
   exact class name on <body> on open/close. */
body.aqeltech-unifiedreviews-modal-open { overflow: hidden; }

/* ==========================================================================
   ORGANIC v4.3 TOKENS (native-palette revision) - every value traces to a
   verified native source: the live brand navy #014e83 (root --brand-color /
   theme @theme__brand-color), its live hover #013f6a, the live CTA gold
   #fdab18 / star gold #e3a008 family, and the v3 tokens this replaces
   (navy-soft/panel/ink/body/line/ok all live-computed on the PDP). WCAG AA
   verified: text pairs >=4.5:1, non-text >=3:1 on every surface they're used
   against (recomputed programmatically against these exact hexes).

   Fix 1 (2026-07 live-feedback pass): the FIRST Organic v4.3 ship over-
   darkened --aqr-accent-strong to #9a6d05 and --aqr-quote-ink to #845d05
   chasing a blanket 4.5:1-everywhere reading - user-visible as "mustard",
   not gold. This pass restores the NATIVE BRIGHT star gold #e3a008 for every
   decorative-with-a-real-text-equivalent consumer (stars/bars/glyphs/form
   stars - see --aqr-accent-strong's own comment below) and computes the
   correct PER-USAGE threshold for the two real-text consumers (the "5.0"
   numeral qualifies as WCAG large text at its clamp() size, so needs only
   3:1; the pull-quote is held to the stricter 4.5:1 since it sits just under
   the large-text size cutoff) rather than over-constraining both to the
   worst case. Three gold-filled controls that carry WHITE text
   (pager-current / guest-btn--primary / form-submit) and two ring/outline
   indicators governed by WCAG 1.4.11 (focus-visible, the pressed histogram
   toggle) are individually re-pointed at --aqr-ink / --aqr-accent instead of
   inheriting the brighter fill - seeing full contrast numbers inline at each
   of those selectors.
   ========================================================================== */
.aqeltech-unifiedreviews {
    /* User batch: the reviews root holds NO background, margin, or padding, and
       no custom font-family - it inherits the theme font and sits flush inside
       the theme's native tab-content wrapper. */
    color: var(--aqr-ink);

    /* User batch: no custom font-family anywhere in the reviews UI - every
       region inherits the active theme font. The --aqr-font* tokens and all
       font-family declarations were removed. */

    /* ---- Surfaces (Modern: WHITE cards floating on a light neutral page) ----
       The blue-gray wash is gone. --aqr-page is the light-neutral backdrop the
       reviews block sits on (mockup body #f7f9fb); every REGION (summary cards,
       Customers-say, spotlight, toolbar, review cards) is a crisp WHITE card on
       top of it - hence --aqr-surface AND --aqr-panel are now both #fff. Field
       chrome (selects/inputs) is white too; progress-bar/track fills use the
       dedicated --aqr-track step so they stay visible on a white card. */
    --aqr-page: #f7f9fb;      /* light-neutral page backdrop behind the cards */
    --aqr-panel: #ffffff;     /* summary sub-card / mentions / sidebar - now white */
    --aqr-surface: #ffffff;   /* review card, select, input, form bg - now white */
    --aqr-track: #eef2f7;     /* progress-bar track / inset field fill on a white card */
    --aqr-quote-bg: #fff6e6;  /* pull-quote card bg - 11% CTA gold tint over white */
    --aqr-line: #e2e8f1;      /* card/region hairline border (mockup card border) */
    --aqr-line-2: #cbd5e2;    /* stronger border: selects, outline chips */

    /* ---- Ink ---- */
    --aqr-ink: #1a3350;       /* headings, card titles, reviewer names */
    /* Round-3 fidelity fix #6: nudged darker (#53667e -> #47586d, ~15%
       darker) - Codex flagged the muted/secondary copy as a hair too light
       against the target's navy hierarchy. Still comfortably AA on every
       surface here (darker only improves contrast over the prior value). */
    --aqr-muted: #47586d;     /* dates, counts, uppercase labels, attribution */
    --aqr-body: #40536b;      /* review body copy */
    /* Fix 1 (2026-07 live-feedback pass): big average numeral + pull-quote
       text. This is REAL text (not exempt), so it cannot simply match the
       bright #e3a008 star gold below - #e3a008 on this token's own
       backgrounds (--aqr-panel behind the numeral, --aqr-quote-bg behind the
       quote) computes to ~1.8:1 / ~2.1:1, nowhere near AA. #8f6905 is the
       brightest gold at the same hue/saturation family as #e3a008 that still
       clears BOTH real thresholds: >=3:1 against --aqr-panel (the numeral is
       clamp(2.6rem..3.1rem)/700 - unambiguously WCAG "large text", 3:1
       suffices there) and the stricter >=4.5:1 against --aqr-quote-bg (the
       pull-quote is 1.15rem/700 = 18.4px, just under the 18.66px large-text
       bold threshold, so it is held to the conservative 4.5:1 normal-text
       bar). Verified: #8f6905 vs panel = 3.95:1, vs quote-bg = 4.67:1 (both
       computed programmatically). This replaces the prior #845d05, which was
       already within ~0.2 of the panel's 4.5:1 ceiling at that hue - i.e.
       #845d05 was close to the brightest possible AA-passing shade if held
       to 4.5:1 everywhere; using the numeral's correct 3:1 large-text floor
       instead is what buys the extra headroom here.
    */
    --aqr-quote-ink: #8f6905;

    /* ---- Brand accent family (navy text/UI vs gold fills) ---- */
    --aqr-accent: #014e83;        /* text-safe - Helpful-default outline, links - live brand navy */
    --aqr-accent-dark: #013f6a;   /* hover/active - live brand hover */
    /* Fix 1 (2026-07 live-feedback pass): restored to the NATIVE BRIGHT
       Breeze star gold #e3a008 (was over-darkened to mustard #9a6d05 by a
       prior AA pass). #e3a008 is used below ONLY for elements that are
       either (a) aria-hidden decorative glyphs/fills with a real adjacent
       text equivalent (aggregate/card stars, bar fill, bar glyph - the
       numeric rating/count is always separately rendered as real text), or
       (b) the form star-rating selector, whose selection state is carried by
       aria-checked for AT users and - as of Fix 3 - a live "N/5 stars" text
       indicator for sighted users, so its fill is likewise a decorated
       state, not the sole state carrier. Every OTHER consumer of this token
       (large gold-filled buttons/pills carrying their own text, and the
       focus-visible/pressed-state rings governed by WCAG 1.4.11 non-text
       contrast) was audited individually and re-pointed at a passing token
       below (--aqr-ink for on-fill text, --aqr-accent for rings) rather than
       inheriting the brighter value, since #e3a008 computes <2.1:1 against
       every real surface in this file (page/surface/panel) and against
       white text - see the individual selectors below for the fix.
    */
    --aqr-accent-strong: #e3a008; /* fill-safe (decorative-with-text-equivalent only) - stars, histogram bar fill, form stars */
    --aqr-accent-soft: rgba(1, 78, 131, .10);
    --aqr-star-empty: #d8dfe9;    /* unfilled star glyph / bar track */

    /* ---- Verified green family (verified / mentions / avatar) ---- */
    --aqr-green-bg: #e7f4ed;
    --aqr-green-ink: #0e7a52;
    --aqr-mention-ink: #0d6e4a;   /* mention-pill ink - shade of green-ink for pill-density text */

    /* ---- Voted (filled) Helpful chip ---- */
    --aqr-voted-fill: #014e83;
    --aqr-voted-ink: #ffffff;

    /* ---- Status ---- */
    --aqr-err: #b91c1c;

    /* ---- Radii (Modern: crisp 14px cards, matches mockup card radius) ---- */
    --aqr-radius: 14px;
    --aqr-radius-sm: 10px;
    --aqr-radius-pill: 999px;
    --aqr-radius-thumb: 12px;

    /* ---- Card padding (mockup: ~22px 24px on a review/summary card) ---- */
    --aqr-card-pad: 1.375rem 1.5rem;

    /* ---- Elevation + motion (Modern: subtle single-layer lift, mockup value) ---- */
    /* Fidelity fix #12: lightened one notch from the prior values (spread
       shortened, alpha reduced) - the previous pair read slightly "dirty"/
       heavy next to the mockup's restrained elevation. */
    --aqr-shadow: 0 1px 2px rgba(16, 24, 40, .04), 0 8px 20px -18px rgba(20, 45, 80, .18);
    --aqr-shadow-hov: 0 2px 4px rgba(16, 24, 40, .06), 0 14px 26px -18px rgba(20, 45, 80, .22);
    --aqr-ease: cubic-bezier(.16, 1, .3, 1);

}

/* User batch: the tab-content table override is removed by request - the
   reviews block now sits inside the theme's native .data.item.content wrapper
   with the theme's own padding/frame, and carries no compensating override. */

/* Fix 1: focus rings are a WCAG 1.4.11 non-text/UI-component contrast case,
   not decoration - #e3a008 (now --aqr-accent-strong) computes <2.1:1 against
   every real surface in this file (page/surface/panel), which would
   silently regress keyboard-focus visibility. --aqr-accent (the live brand
   navy) clears 6.8-8.0:1 against the same surfaces, so the ring stays on
   the navy "text/UI" token instead of the "fill" token, per this file's own
   documented brand-accent-family split above. */
:where(.aqeltech-unifiedreviews) :is(a, button, select, input, textarea):focus-visible {
    outline: 2px solid var(--aqr-accent);
    outline-offset: 2px;
}

/* ==========================================================================
   CANONICAL CARD CHROME (Modern re-skin) - the one white-card recipe every
   region uses. Add `.aqr-card` to any new region container (the pane agents'
   "Customers say" AI card, the "Most helpful / Most critical" spotlight pair,
   etc.) to inherit the exact mockup chrome: white surface, 1px hairline, 14px
   radius, subtle single-layer shadow, ~22/24px padding. The existing region
   containers (gallery / aggregate / toolbar / review card) already carry these
   same four declarations inline via the same tokens, so they stay in sync if a
   token changes. Use `.aqr-card--tight` for a denser pad (toolbar-class rows).
   ========================================================================== */
.aqeltech-unifiedreviews .aqr-card {
    background: var(--aqr-surface);
    border: 1px solid var(--aqr-line);
    border-radius: var(--aqr-radius);
    box-shadow: var(--aqr-shadow);
    padding: var(--aqr-card-pad);
}
/* Round-3 fidelity fix #5: tightened from .9rem - Codex + Fable both flagged
   the toolbar row as a touch tall. */
.aqeltech-unifiedreviews .aqr-card--tight { padding: .7rem 1rem; }

/* ── Header: editorial masthead topline (Wave 7) ──────────────────────────
   Direction A / Editorial: the section reads like a magazine masthead -
   a small-caps kicker + folio on one line, a double rule underneath, then
   the score/breakdown/mentions grid (stacked layout) or nothing (sided
   layout, where the grid moves into the sidebar - see .__body--sided
   below). A second single rule closes the masthead before the photo story
   (added inline in list.phtml, only in the stacked branch). ──────────── */
.aqeltech-unifiedreviews__header {
    display: block;
    margin-bottom: 0;
}

/* Modern re-skin - the masthead is now a single flex row: a large sans
   "Customer reviews" heading + muted "N reviews" on the left, and the navy
   "Write a review" pill pushed to the right (moved here from the toolbar).
   The old uppercase micro-title + newspaper double-rule spine are gone. */
.aqeltech-unifiedreviews__topline {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: .3rem 1rem;
    /* Round-3 fidelity fix #2: tightened from 1.125rem - Codex flagged the
       gap between the "Customer reviews" header row and the summary cards
       as too big. */
    margin-bottom: .75rem;
}

.aqeltech-unifiedreviews__title {

    font-size: 1.375rem;
    font-weight: 800;
    line-height: 1.25;
    letter-spacing: -.01em;
    text-transform: none;
    color: var(--aqr-ink);
    margin: 0;
}

.aqeltech-unifiedreviews__folio {

    font-style: normal;
    font-weight: 400;
    font-size: .875rem;
    color: var(--aqr-muted);
}

/* Navy "Write a review" pill sits at the far right of the masthead row. */
.aqeltech-unifiedreviews__topline-cta { margin-left: auto; }

/* The newspaper spine: a bold rule with a thin hairline riding just under
   it (double-rule) opens the masthead; a single hairline (reused for the
   masthead close + the pre-toolbar divider) is thinner still. */
.aqeltech-unifiedreviews__rule-double,
.aqeltech-unifiedreviews__rule {
    border: 0;
    margin: 0;
}
.aqeltech-unifiedreviews__rule-double {
    border-top: 2px solid var(--aqr-ink);
    position: relative;
    margin-bottom: 6px;
}
.aqeltech-unifiedreviews__rule-double::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    top: 3px;
    border-top: 1px solid var(--aqr-ink);
}
.aqeltech-unifiedreviews__rule { border-top: 1px solid var(--aqr-line-2); }

/* ── Gallery-above section (Wave 5, Part 2) - "Customer photos & videos",
   a horizontally-scrollable rail above the review list/toolbar. Reuses the
   real .review-card__media-button/-thumb thumbnail contract (styled in
   Breeze's review-lightbox.css, which also carries the larger 104x80
   gallery-row-scoped override and the shared .media-play/.media-duration
   video-badge rules) - only the section chrome (label/count/hint row +
   the scrollable rail wrapper) is new here. ─────────────────────────── */
/* Modern re-skin (density pass, fidelity fix #2): the mockup renders this rail
   as an OPEN strip sitting directly on the page background - NO card chrome
   (no border/shadow/surface fill), unlike every other region here. */
.aqeltech-unifiedreviews__gallery {
    background: none;
    border: 0;
    border-radius: 0;
    box-shadow: none;
    padding: 0;
    margin-bottom: 1.25rem;
}
.aqeltech-unifiedreviews__gallery-head {
    display: flex;
    align-items: baseline;
    gap: .6rem;
    /* Round-3 fidelity fix #4: tightened from .625rem - the rail sat a bit
       too far below its "Customer photos & videos" heading. */
    margin-bottom: .4rem;
    flex-wrap: wrap;
}
.aqeltech-unifiedreviews__gallery-lab {

    font-weight: 800;
    font-size: .8125rem;
    color: var(--aqr-ink);
}
/* Fidelity fix #2: replaces the old numeric pill badge - a plain muted
   "N items · from all reviews" caption, matching the mockup exactly. */
.aqeltech-unifiedreviews__gallery-count {
    font-size: .78125rem;
    font-weight: 400;
    color: var(--aqr-muted);
    background: none;
    border-radius: 0;
    padding: 0;
    font-variant-numeric: tabular-nums;
}
/* Fidelity fix #2: "See all" link pinned to the right, replaces the old
   "Tap to enlarge" hint text. */
.aqeltech-unifiedreviews__gallery-hint,
.aqeltech-unifiedreviews__gallery-seeall {
    margin-left: auto;
    font-size: .8125rem;
    font-weight: 600;
    color: var(--aqr-accent);
    background: none;
    border: 0;
    padding: 0;
    cursor: pointer;
    text-decoration: none;
}
.aqeltech-unifiedreviews__gallery-seeall:hover,
.aqeltech-unifiedreviews__gallery-seeall:focus-visible { color: var(--aqr-accent-dark); }
.aqeltech-unifiedreviews__gallery-row {
    display: flex;
    gap: .65rem;
    overflow-x: auto;
    padding: .15rem .15rem .5rem;
    scrollbar-width: thin;
}
/* Modern: rail overflow - items beyond the visible cap stay in the DOM (so the
   product-scope lightbox still collects them) but are visually removed; the
   "+N view all" tile opens the viewer at the first hidden item. */
.aqeltech-unifiedreviews__gallery-hidden { display: none; }
.aqeltech-unifiedreviews__gallery-viewall {
    flex: 0 0 auto;
    width: 96px;
    height: 96px;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: .1rem;
    background: var(--aqr-ink);
    color: #fff;
    border: 1px solid var(--aqr-ink);
    border-radius: var(--aqr-radius-thumb);
    cursor: zoom-in;

    transition: transform .16s var(--aqr-ease);
}
.aqeltech-unifiedreviews__gallery-viewall:hover { transform: translateY(-2px); }
.aqeltech-unifiedreviews__gallery-viewall:focus-visible { outline: 2px solid var(--aqr-accent); outline-offset: 2px; }
.aqeltech-unifiedreviews__gallery-viewall-n { font-size: 1.15rem; font-weight: 800; line-height: 1; }
.aqeltech-unifiedreviews__gallery-viewall-lab { font-size: .66rem; font-weight: 600; letter-spacing: .02em; }

@media (max-width: 768px) {
    .aqeltech-unifiedreviews__gallery-row {
        display: grid;
        grid-template-columns: repeat(3, 1fr);
        gap: .55rem;
        overflow: visible;
        padding: .15rem 0 .2rem;
    }
    /* Wave 6 bug fix: was aspect-ratio 4/3 (a rectangle) - the mobile grid
       cell's thumb must stay a SQUARE like every other breakpoint's thumb,
       just responsively sized to the grid column's own width. */
    .aqeltech-unifiedreviews__gallery-row .review-card__media-button {
        width: 100%;
        height: auto;
        aspect-ratio: 1 / 1;
    }
}

/* ── Aggregate: editorial masthead grid (score / breakdown / mentions) ────
   Direction A / Editorial (Wave 7): the three sub-sections are no longer
   tinted panel "cards" - they are hairline-separated columns of a single
   hairline-free grid (newspaper masthead), each introduced by a small-caps
   quiet label. Same <div>/<ul>/<li> structure _aggregate.phtml already
   emits; this is a CSS-only re-skin of the v4.3 Organic panels above. ─── */
/* Modern re-skin - the summary is no longer one tinted panel: it is a row of
   three separate white .aqr-card cells (Score / Breakdown / By feature). The
   wrapper is a bare grid; each cell carries its own .aqr-card chrome. */
.aqeltech-unifiedreviews__summary-trio {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1.32fr) minmax(0, 1fr);
    gap: .875rem;
    padding: 0;
    margin: 0 0 .875rem;
    background: transparent;
    border: 0;
    border-radius: 0;
    box-shadow: none;
    align-items: stretch;
}

/* Each trio cell is a flex column so its label / bars / caption stack with an
   even rhythm inside the card padding. */
.aqeltech-unifiedreviews__summary-card {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    /* Round-3 fidelity fix #1: tightened from .35rem - Codex flagged the
       score card's inter-row gaps (num/stars/count/recommend) as too loose
       once the breakdown card's own height came down. */
    gap: .25rem;
    min-width: 0;
}

/* Round-2 fidelity fix #6: the round-1 pass over-corrected - it shrank BOTH
   axes of --aqr-card-pad (1.375rem 1.5rem) to close the ~30px height gap,
   but the mockup's own score-card padding measures ~22px vertical / ~25px
   horizontal (i.e. close to the ORIGINAL --aqr-card-pad, not tighter). The
   real height driver was row/label density inside the breakdown card (see
   .aggregate-bar-toggle / .aggregate-distribution-lab below), already
   tightened - so horizontal padding is restored close to the mockup's own
   ~25px here, vertical nudged down only slightly. Needs the
   .aqeltech-unifiedreviews ancestor prefix to match the (0,2,0) specificity
   of the shared ".aqeltech-unifiedreviews .aqr-card" padding rule above - a
   bare single-class selector here would lose that fight regardless of
   source order. */
.aqeltech-unifiedreviews .aqeltech-unifiedreviews__summary-card {
    padding: 1.25rem 1.5625rem;
}

/* Round-2 fidelity fix #6: the score card's own content (num/stars/count/
   recommend) is naturally shorter than its CSS-Grid-stretched siblings
   (breakdown/feature), so it was pinning top with dead space below -
   distribute its rows evenly across the full stretched height instead. */
.aqeltech-unifiedreviews__summary-card--score {
    justify-content: space-between;
}

.aqeltech-unifiedreviews__aggregate-distribution-lab {
    background: transparent;
    /* Round-3 fidelity fix #1: tightened again from .5rem, same rationale -
       still chasing the ~243px -> ~225px target. */
    padding: 0 0 .35rem;
    margin: 0;
    display: block;
    font-size: .6875rem;
    font-weight: 700;
    letter-spacing: .13em;
    text-transform: uppercase;
    color: var(--aqr-muted);
}

.aqeltech-unifiedreviews__aggregate-distribution {
    grid-column: 2;
    grid-row: 2 / span 2;
    list-style: none;
    margin: 0;
    padding: 0;
    background: transparent;
    border-radius: 0;
    display: grid;
    gap: 0;
    min-height: 0;
}

.aqeltech-unifiedreviews__aggregate-mentions-lab {
    grid-column: 3;
    grid-row: 1;
    background: transparent;
    padding-top: 0;
    padding-bottom: 1rem;
    margin: 0;
    display: block;
    font-size: .72rem;
    font-weight: 700;
    letter-spacing: .19em;
    text-transform: uppercase;
    color: var(--aqr-muted);
}

.aqeltech-unifiedreviews__aggregate-mentions-list {
    grid-column: 3;
    grid-row: 2;
    list-style: none;
    margin: 0;
    padding: 0;
    background: transparent;
    border-radius: 0;
    display: flex;
    flex-wrap: wrap;
    gap: .5rem;
}

/* Small editorial quote note closing the mentions column (existing
   OwnerMentionsSynthesizer data - a quiet gold-ink note, not the large
   centered pull-quote moment the mockup shows elsewhere in the spread). */
.aqeltech-unifiedreviews__aggregate-quote {
    grid-column: 3;
    grid-row: 3;
    margin: 1rem 0 0;
    padding: .85rem 1rem;
    border-top: 0;
    background: var(--aqr-quote-bg);
    border-radius: var(--aqr-radius-sm);
    position: relative;
    overflow: hidden;
}

.aqeltech-unifiedreviews__aggregate-quote::after { content: none; }

.aqeltech-unifiedreviews__aggregate-num { display: flex; align-items: baseline; gap: .35rem; }

.aqeltech-unifiedreviews__aggregate-avg {

    font-size: clamp(2.5rem, 5vw, 2.9rem);
    font-weight: 800;
    letter-spacing: -.02em;
    line-height: .9;
    color: var(--aqr-ink);
}

.aqeltech-unifiedreviews__aggregate-scale { font-style: normal; font-weight: 400; font-size: .875rem; color: var(--aqr-muted); }
/* Density pass (fidelity fix #7): the score card's flex column already
   carries a .35rem `gap` between these siblings (see .summary-card above) -
   these top-margins were stacking ON TOP of that gap, double-spacing the
   rows and adding to the ~30px-too-tall card. Zeroed here; the flex gap
   alone now carries the rhythm. */
.aqeltech-unifiedreviews__aggregate-count { display: block; font-size: .8125rem; color: var(--aqr-muted); margin-top: 0; }
.aqeltech-unifiedreviews__aggregate-stars { color: var(--aqr-accent-strong); line-height: 0; margin-top: 0; }
/* Round-2 fidelity fix #4: the score card's 5-star row rendered at its native
   120x24 markup size read ~23px tall and over-spread - scaled to the
   mockup's measured ~18px-tall row (proportional scale keeps the star
   glyphs' own internal spacing intact, just denser overall). */
.aqeltech-unifiedreviews__aggregate-stars svg { width: 90px; height: 18px; }

/* Visually-hidden text equivalent for the decorative star SVG. */
.aqeltech-unifiedreviews__sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

.aqeltech-unifiedreviews__aggregate-stars svg polygon { stroke: var(--aqr-star-empty); }

.aqeltech-unifiedreviews__aggregate-verif {
    display: inline-flex;
    align-items: center;
    gap: .35rem;
    margin: .6rem 0 0;
    padding: .3rem .7rem .3rem .55rem;
    border-radius: var(--aqr-radius-pill);
    background: var(--aqr-green-bg);
    color: var(--aqr-green-ink);
    font-size: .8rem;
    font-weight: 700;
}

.aqeltech-unifiedreviews__aggregate-verif svg { width: 13px; height: 13px; flex: none; }

/* Editorial (Wave 7): shown again - the mockup's masthead score column
   leads with the recommend line ("96% recommend this product"), no longer
   hidden as it was under the Organic v4.3 3-card summary. */
.aqeltech-unifiedreviews__aggregate-recommendation {
    display: inline-flex;
    align-items: center;
    /* Round-2 fidelity fix #5: mockup gap is ~7px (was 5.6px). */
    gap: .4375rem;
    align-self: flex-start;
    /* Density pass (fidelity fix #7): same double-spacing fix as the count/
       stars rows above - the score card's flex `gap` already spaces this row
       from its sibling. */
    margin: 0;
    /* Round-2 fidelity fix #5: taller/roomier pill (mockup ~31.5px), was
       reading too compact next to the FILLED thumb glyph below. */
    padding: .5rem 1rem;
    border-radius: var(--aqr-radius-pill);
    background: var(--aqr-green-bg);
    color: var(--aqr-green-ink);

    font-style: normal;
    font-size: .8125rem;
    font-weight: 700;
    line-height: 1;
}
.aqeltech-unifiedreviews__aggregate-recommendation-ico { flex: none; }

.aqeltech-unifiedreviews__aggregate-bar { display: block; margin: 0; }

.aqeltech-unifiedreviews__aggregate-bar-toggle,
.aqeltech-unifiedreviews__aggregate-bar:not(:has(.aqeltech-unifiedreviews__aggregate-bar-toggle)) {
    display: grid;
    grid-template-columns: 3.4rem 1fr 2.5rem;
    align-items: center;
    gap: .625rem;
    /* Round-3 fidelity fix #1: after fixing the real height driver (the
       24px-line-height leak on this row - see below), the naive .08rem
       overshot PAST the ~225px target down to ~195px. Restored to .22rem so
       the 5 rows land near the mockup's own measured height. */
    padding: .22rem .5rem;
    border-radius: var(--aqr-radius-sm);
    margin: 0;
    width: 100%;
    border-radius: 0;
    text-decoration: none;
    color: var(--aqr-body);
    background: transparent;
    border: 0;
    /* Round-3 fidelity fix #1 (the actual root cause): `font: inherit` here
       inherited the UA default 16px/24px (no ancestor sets an explicit
       font-size), NOT the .8125rem/label styling below - so every row's
       real height floor was a fixed 24px line-height no amount of padding
       trimming could touch (rows measured ~26.5px despite .08rem padding).
       Explicit font-size + line-height fixes the actual floor; the nested
       .aggregate-bar-label's own font-size override was inheriting this same
       24px line-height for the identical reason. */
    font: inherit;
    font-size: .8125rem;
    line-height: 1.2;
    cursor: pointer;
    transition: color .16s var(--aqr-ease);
}

.aqeltech-unifiedreviews__aggregate-bar-toggle:hover:not(:disabled) { background: var(--aqr-track); color: var(--aqr-accent); }

/* Fix 1: the pressed-state ring on an interactive filter toggle is a WCAG
   1.4.11 state indicator, not decoration - moved to --aqr-accent (navy) for
   the same reason as the focus-visible ring above; #e3a008 fails 3:1 here. */
.aqeltech-unifiedreviews__aggregate-bar-toggle[aria-pressed="true"] {
    background: var(--aqr-accent-soft);
    box-shadow: none;
    color: var(--aqr-accent);
    font-weight: 700;
}

.aqeltech-unifiedreviews__aggregate-bar-toggle:disabled { cursor: default; opacity: .5; }

.aqeltech-unifiedreviews__aggregate-bar-label {
    display: inline-flex;
    align-items: baseline;
    justify-content: flex-start;
    gap: .28rem;

    font-weight: 600;
    font-size: .8125rem;
    font-variant-numeric: tabular-nums;
    color: var(--aqr-ink);
    white-space: nowrap;
}

/* Fidelity fix #15: uniform weight/ink with the digit (mockup renders "5 star"
   as one evenly-weighted label) - was 400/muted, reading as the digit alone
   being bolded against a lighter word. */
.aqeltech-unifiedreviews__aggregate-bar-word { font-weight: 600; font-size: .8125rem; color: var(--aqr-ink); }
.aqeltech-unifiedreviews__aggregate-bar-glyph { color: var(--aqr-quote-ink); font-size: .68em; }

.aqeltech-unifiedreviews__aggregate-bar-track {
    position: relative;
    display: block;
    height: 8px;
    border-radius: 99px;
    background: var(--aqr-track);
    border: 1px solid var(--aqr-line);
    overflow: hidden;
}

.aqeltech-unifiedreviews__aggregate-bar-fill {
    display: block;
    height: 100%;
    min-width: 0;
    border-radius: 99px;
    background: var(--aqr-accent-strong);
    transition: width .7s var(--aqr-ease);
}

.aqeltech-unifiedreviews__aggregate-bar-count {
    font-variant-numeric: tabular-nums;
    font-weight: 400;
    font-size: .78rem;
    color: var(--aqr-muted);
    text-align: right;
}

/* ── Card 3: BY FEATURE ─────────────────────────────────────────────────
   "BY FEATURE · FROM ALL REVIEWS" label, three Quality/Value/Price gold-bar
   rows (label · bar · numeric value) and a quiet caption. Reuses the shared
   .__aggregate-bar-track / -bar-fill chrome for the bar itself. */
.aqeltech-unifiedreviews__aggregate-feature-lab {
    display: block;
    margin: 0;
    /* Round-3 fidelity fix #1: tightened from .5rem, same rationale as the
       breakdown card's label. */
    padding: 0 0 .35rem;
    font-size: .6875rem;
    font-weight: 700;
    letter-spacing: .13em;
    text-transform: uppercase;
    color: var(--aqr-muted);
}

.aqeltech-unifiedreviews__aggregate-feature-list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: grid;
    gap: 0;
}

.aqeltech-unifiedreviews__aggregate-feature-row {
    display: grid;
    grid-template-columns: 4.25rem 1fr 2rem;
    align-items: center;
    gap: .625rem;
    /* Round-3 fidelity fix #1 (same root cause as .aggregate-bar-toggle
       above): this row never set its own font-size/line-height, so it
       inherited a fixed 24px line-height from further up the tree -
       measured rows were 38px (14px padding + a 24px line box) regardless
       of the smaller .78rem/.875rem label/value font-sizes, which only
       affect font-size, not the inherited fixed line-height. Explicit
       line-height here is unitless, so it now recomputes correctly against
       each child's own (smaller) font-size instead of stayng pinned at 24px. */
    font-size: .8125rem;
    line-height: 1.2;
    /* Restored from an initial .25rem, same overshoot rationale as the
       breakdown row's padding above - .25rem landed noticeably under the
       mockup's own row rhythm once the real 24px-line-height leak was
       fixed. */
    padding: .4375rem 0;
}

.aqeltech-unifiedreviews__aggregate-feature-label {
    font-size: .78rem;
    font-weight: 700;
    letter-spacing: .05em;
    text-transform: uppercase;
    color: var(--aqr-body);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.aqeltech-unifiedreviews__aggregate-feature-value {
    font-variant-numeric: tabular-nums;
    font-weight: 800;
    font-size: .875rem;
    color: var(--aqr-ink);
    text-align: right;
}

.aqeltech-unifiedreviews__aggregate-feature-note {
    /* Round-3 fidelity fix #1: tightened top margin from .625rem. */
    margin: .4rem 0 0;
    font-size: .75rem;
    line-height: 1.45;
    color: var(--aqr-muted);
}

/* ── Full-width "Customers say" AI card ─────────────────────────────────
   Sparkle + heading + AI provenance, a summary paragraph, a row of
   sentiment-coloured topic chips (green/amber/red) and a caption. Carries
   .aqr-card chrome from the shared rule; this only lays out the internals. */
.aqeltech-unifiedreviews__customers-say {
    margin: 0 0 .875rem;
    display: flex;
    flex-direction: column;
    gap: .75rem;
}

.aqeltech-unifiedreviews__customers-say-head {
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: .5rem .75rem;
}

.aqeltech-unifiedreviews__customers-say-title {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    font-size: .8125rem;
    font-weight: 800;
    color: var(--aqr-ink);
}

/* Fidelity fix #5: navy (not amber/gold) sparkle, matching the mockup's
   measured #40536b (this file's own --aqr-body ink token). */
.aqeltech-unifiedreviews__customers-say-spark { color: var(--aqr-body); flex: none; }

.aqeltech-unifiedreviews__customers-say-prov {
    margin-left: auto;
    font-size: .71875rem;
    color: var(--aqr-muted);
}

.aqeltech-unifiedreviews__customers-say-body {
    margin: 0;
    font-size: .90625rem;
    line-height: 1.55;
    color: var(--aqr-body);
}

.aqeltech-unifiedreviews__customers-say-note {
    margin: 0;
    font-size: .71875rem;
    line-height: 1.5;
    color: var(--aqr-muted);
}

/* Sentiment topic chips (reuse of the owner-mention themes). */
.aqeltech-unifiedreviews__topics {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-wrap: wrap;
    gap: .5rem;
}

.aqeltech-unifiedreviews__topic {
    display: inline-flex;
    align-items: center;
    gap: .375rem;
    padding: .4375rem .8125rem;
    border-radius: var(--aqr-radius-pill);
    border: 1px solid transparent;
    font-size: .8125rem;
    font-weight: 600;
    line-height: 1;
}

.aqeltech-unifiedreviews__topic-count { font-size: .6875rem; font-weight: 600; opacity: .85; }
/* Fidelity fix #15: mockup renders topic chip text lowercase. */
.aqeltech-unifiedreviews__topic-label { text-transform: lowercase; }

.aqeltech-unifiedreviews__topic--positive { background: var(--aqr-green-bg); color: var(--aqr-green-ink); }
.aqeltech-unifiedreviews__topic--neutral  { background: var(--aqr-quote-bg); color: var(--aqr-quote-ink); }
.aqeltech-unifiedreviews__topic--negative { background: #fdecec; color: var(--aqr-err); }

/* ==========================================================================
   SPOTLIGHT PAIR (Modern re-skin) - "Most helpful positive / Most critical".
   Two compact white cards side by side above the toolbar. Chrome comes from
   the shared .aqr-card rule (white surface / hairline / 14px radius / subtle
   shadow); this only lays out the pair + the internals and tightens the pad
   to the mockup's 18px/22px. Stacks on narrow. Filter-invariant - SSR-only,
   never AJAX-swapped (see list.phtml / _spotlight.phtml).
   ========================================================================== */
.aqeltech-unifiedreviews__spotlight {
    display: flex;
    flex-wrap: wrap;
    gap: .875rem;
    margin: 0 0 1.25rem;
}
/* Scoped with the block root so the padding override out-specifies the shared
   `.aqeltech-unifiedreviews .aqr-card` rule (0,2,0) - mockup uses a denser
   18px/22px pad than the default card pad. */
.aqeltech-unifiedreviews .aqeltech-unifiedreviews__spotlight-card {
    flex: 1 1 320px;
    /* Cap at half-width so a pair fills the row but a SOLO card (e.g. no
       critical review in the data) stays one column instead of stretching
       full-width. Mobile falls back to full-width stacked. */
    max-width: calc(50% - .44rem);
    min-width: 0;
    padding: 1.125rem 1.375rem; /* 18px 22px */
}
/* Round-2 fidelity fix #2: when only ONE spotlight side has qualifying data
   (e.g. no "most critical" review), the half-width cap above leaves a dead
   empty right column - go full-width for a solo card instead. The paired
   case (both siblings present) is untouched: :only-child never matches then. */
.aqeltech-unifiedreviews .aqeltech-unifiedreviews__spotlight-card:only-child {
    max-width: 100%;
}
@media (max-width: 600px) {
    .aqeltech-unifiedreviews .aqeltech-unifiedreviews__spotlight-card { max-width: 100%; }
}
.aqeltech-unifiedreviews__spotlight-kicker {
    font-size: .6875rem;        /* 11px */
    font-weight: 700;
    letter-spacing: .14em;
    text-transform: uppercase;
    margin-bottom: .625rem;
}
.aqeltech-unifiedreviews__spotlight-card--positive .aqeltech-unifiedreviews__spotlight-kicker {
    color: var(--aqr-green-ink);
}
.aqeltech-unifiedreviews__spotlight-card--critical .aqeltech-unifiedreviews__spotlight-kicker {
    color: var(--aqr-err);
}
.aqeltech-unifiedreviews__spotlight-head {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: .5rem;
}
.aqeltech-unifiedreviews__spotlight-stars {
    display: inline-flex;
    flex: none;
    line-height: 0;
    color: var(--aqr-accent-strong); /* gold fill; empty track = SVG transparent over --aqr-star-empty backing */
}
.aqeltech-unifiedreviews__spotlight-stars svg { display: block; }
.aqeltech-unifiedreviews__spotlight-title {
    font-size: .8125rem;        /* 13px */
    font-weight: 700;
    color: var(--aqr-ink);
    line-height: 1.3;
}
.aqeltech-unifiedreviews__spotlight-quote {
    margin: .5rem 0 .625rem;
    font-size: .84375rem;       /* 13.5px */
    line-height: 1.6;
    color: var(--aqr-body);
}
.aqeltech-unifiedreviews__spotlight-meta {
    font-size: .75rem;          /* 12px */
    color: var(--aqr-muted);
    line-height: 1.45;
}

/* ── Trio responsive + sided-sidebar collapse ──────────────────────────── */
.aqeltech-unifiedreviews__sidebar .aqeltech-unifiedreviews__summary-trio,
.aqeltech-unifiedreviews__aggregate--sided {
    grid-template-columns: 1fr;
}

@media (max-width: 860px) {
    .aqeltech-unifiedreviews__summary-trio { grid-template-columns: 1fr; }
}

/* Mentions: editorial chip pills - outline + italic serif, echoing the
   masthead's typographic voice instead of the Organic filled-green pill.
   SAME markup (row > label + dots + count); the dots element stays hidden. */
.aqeltech-unifiedreviews__aggregate-mention-row {
    display: inline-flex;
    align-items: baseline;
    gap: .35rem;
    background: #fff;
    color: var(--aqr-ink);
    border: 1px solid var(--aqr-line-2);
    border-radius: var(--aqr-radius-pill);
    padding: .32rem .75rem;
    grid-template-columns: unset;
}

.aqeltech-unifiedreviews__aggregate-mention-row:hover { border-color: var(--aqr-accent); color: var(--aqr-accent); }
.aqeltech-unifiedreviews__aggregate-mention-label { font-style: italic; font-weight: 400; font-size: .85rem; color: inherit; white-space: nowrap; }
.aqeltech-unifiedreviews__aggregate-mention-dots { display: none; }
.aqeltech-unifiedreviews__aggregate-mention-count { font-variant-numeric: tabular-nums; font-size: .72rem; font-weight: 600; color: var(--aqr-muted); white-space: nowrap; }

.aqeltech-unifiedreviews__aggregate-quote-text {

    font-style: italic;
    margin: 0;
    font-size: .92rem;
    font-weight: 400;
    line-height: 1.4;
    color: var(--aqr-quote-ink);
    position: relative;
    z-index: 1;
}

.aqeltech-unifiedreviews__aggregate-quote-author { margin: .4rem 0 0; font-size: .76rem; color: var(--aqr-muted); position: relative; z-index: 1; }

/* ── Summary layout variant: "sided" (aqeltech_unifiedreviews/pdp/summary_layout)
   New wrapper elements (.__body--sided / __sidebar / __main) added in
   list.phtml, gated behind the config field - the aggregate's three
   sub-panels collapse into a single vertical stack inside a sticky ~320px
   left sidebar; the review grid fills the right side. "stacked" (today's
   layout, full-width summary above the list) is completely untouched. ── */
.aqeltech-unifiedreviews__body--sided {
    display: grid;
    grid-template-columns: 320px 1fr;
    column-gap: 2rem;
    align-items: start;
}

.aqeltech-unifiedreviews__sidebar { position: sticky; top: 1.25rem; }

/* Sidebar column (~320px) reuses the single-column stacking already proven
   at the mobile breakpoint's ~326px available width - standalone rule so
   the mobile media-query block below stays untouched by this variant. */
.aqeltech-unifiedreviews__aggregate--sided { grid-template-columns: 1fr; row-gap: 0; }

.aqeltech-unifiedreviews__aggregate--sided .aqeltech-unifiedreviews__aggregate-score,
.aqeltech-unifiedreviews__aggregate--sided .aqeltech-unifiedreviews__aggregate-distribution,
.aqeltech-unifiedreviews__aggregate--sided .aqeltech-unifiedreviews__aggregate-mentions-list,
.aqeltech-unifiedreviews__aggregate--sided .aqeltech-unifiedreviews__aggregate-quote {
    grid-row: auto;
}

/* Editorial hairlines run LEFT on the 3-col desktop grid; the sided
   sidebar's single column reflows them to a TOP hairline between sections
   instead (same idea as the mobile collapse further below). */
.aqeltech-unifiedreviews__aggregate--sided .aqeltech-unifiedreviews__aggregate-score,
.aqeltech-unifiedreviews__aggregate--sided .aqeltech-unifiedreviews__aggregate-distribution-lab,
.aqeltech-unifiedreviews__aggregate--sided .aqeltech-unifiedreviews__aggregate-mentions-lab {
    border-left: 0;
    padding-left: 0;
    margin-left: 0;
}
.aqeltech-unifiedreviews__aggregate--sided .aqeltech-unifiedreviews__aggregate-distribution-lab,
.aqeltech-unifiedreviews__aggregate--sided .aqeltech-unifiedreviews__aggregate-mentions-lab {
    border-top: 1px solid var(--aqr-line-2);
    padding-top: .85rem;
    margin-top: .85rem;
}

/* Sub-blocks carry explicit grid-column:2/3 for the 3-col desktop layout;
   collapsing grid-template-columns to 1fr alone does not clear those
   explicit line references (they'd generate clipped implicit columns to the
   right) - reset grid-column on every sub-block explicitly. */
.aqeltech-unifiedreviews__aggregate--sided .aqeltech-unifiedreviews__aggregate-distribution-lab,
.aqeltech-unifiedreviews__aggregate--sided .aqeltech-unifiedreviews__aggregate-distribution,
.aqeltech-unifiedreviews__aggregate--sided .aqeltech-unifiedreviews__aggregate-mentions-lab,
.aqeltech-unifiedreviews__aggregate--sided .aqeltech-unifiedreviews__aggregate-mentions-list,
.aqeltech-unifiedreviews__aggregate--sided .aqeltech-unifiedreviews__aggregate-quote {
    grid-column: 1;
}

.aqeltech-unifiedreviews__aggregate--sided .aqeltech-unifiedreviews__aggregate-mentions-lab { grid-row: auto; }

/* ── Toolbar: one white-card row (search · pills · sort) + a subtle
   "Showing N reviews" line beneath it. Card chrome comes from the shared
   .aqr-card / .aqr-card--tight classes on the element (see _filters.phtml);
   this only lays out the internals. ──────────────────────────────────── */
.aqeltech-unifiedreviews__toolbar {
    display: block;
    margin: 0;
}

/* Fidelity fix #3: "Showing N reviews" moves OUT of the toolbar card to a
   standalone muted line on the page background beneath it (mockup) - was
   fattening the card to ~104px; the card itself now targets ~64px. */
.aqeltech-unifiedreviews__toolbar-count {
    margin: .5rem 0 1.25rem;

    font-weight: 400;
    font-size: .8125rem;
    color: var(--aqr-muted);
}
.aqeltech-unifiedreviews__filters { display: flex; flex-wrap: wrap; align-items: center; gap: .55rem; margin-left: 0; }
.aqeltech-unifiedreviews__filter-clear { font-size: .82rem; font-weight: 700; color: var(--aqr-accent); text-decoration: underline; text-underline-offset: 2px; cursor: pointer; background: none; border: 0; padding: 0; }
.aqeltech-unifiedreviews__filter-clear:hover { color: var(--aqr-accent-dark); }

/* Search: a rounded pill input that grows to fill the row, with a magnifier
   submit button tucked inside on the left. The GET form, name="q", hidden
   filter mirrors, and the submit button (core.js's submit hook) are unchanged
   - only the layout/chrome is restyled. */
.aqeltech-unifiedreviews__search-form { flex: 1 1 240px; min-width: 190px; margin: 0; }
.aqeltech-unifiedreviews__search-field { position: relative; display: flex; align-items: center; width: 100%; }
.aqeltech-unifiedreviews__search-submit {
    position: absolute;
    left: .3rem;
    top: 50%;
    transform: translateY(-50%);
    z-index: 1;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.8rem;
    height: 1.8rem;
    padding: 0;
    margin: 0;
    border: 0;
    background: none;
    color: var(--aqr-muted);
    border-radius: var(--aqr-radius-pill);
    cursor: pointer;
    transition: color .16s var(--aqr-ease);
}
.aqeltech-unifiedreviews__search-submit:hover { color: var(--aqr-accent); }
.aqeltech-unifiedreviews__search-submit:focus-visible { outline: 2px solid var(--aqr-accent); outline-offset: 2px; }
.aqeltech-unifiedreviews__search-icon { display: block; }
.aqeltech-unifiedreviews__search-input {
    width: 100%;
    font: inherit;
    font-size: .875rem;
    line-height: 1.4;
    color: var(--aqr-ink);
    background: var(--aqr-surface);
    border: 1px solid var(--aqr-line-2);
    border-radius: var(--aqr-radius-pill);
    /* Density pass (fidelity fix #9): compacted from .5rem to ~.4rem vertical
       padding to hit the mockup's ~34-35px control height. */
    padding: .4rem .95rem .4rem 2.35rem;
    margin: 0;
    height: auto;
    box-shadow: none;
    transition: border-color .16s var(--aqr-ease), box-shadow .16s var(--aqr-ease);
}
.aqeltech-unifiedreviews__search-input::placeholder { color: var(--aqr-muted); opacity: 1; }
.aqeltech-unifiedreviews__search-input:focus,
.aqeltech-unifiedreviews__search-input:focus-visible {
    outline: none;
    border-color: var(--aqr-accent);
    box-shadow: 0 0 0 3px var(--aqr-accent-soft);
}

/* Filter pills (Verified only / With photos·videos): bordered white pills,
   navy-filled when active. Still <a data-aqeltech-filter role=switch> links -
   only the visual switched from the old track/knob toggle to a mockup pill. */
.aqeltech-unifiedreviews__pill {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    font-size: .8125rem;
    font-weight: 600;
    color: var(--aqr-muted);
    background: var(--aqr-surface);
    border: 1px solid var(--aqr-line-2);
    border-radius: var(--aqr-radius-pill);
    /* Density pass (fidelity fix #9): compacted from .45rem to hit the
       mockup's ~34px pill height. */
    padding: .34rem .85rem;
    text-decoration: none;
    white-space: nowrap;
    cursor: pointer;
    transition: color .16s var(--aqr-ease), background-color .16s var(--aqr-ease), border-color .16s var(--aqr-ease);
}
.aqeltech-unifiedreviews__pill:hover { color: var(--aqr-accent); border-color: var(--aqr-accent); }
.aqeltech-unifiedreviews__pill:focus-visible { outline: 2px solid var(--aqr-accent); outline-offset: 2px; }
.aqeltech-unifiedreviews__pill.is-active {
    color: #fff;
    background: var(--aqr-accent);
    border-color: var(--aqr-accent);
}
.aqeltech-unifiedreviews__pill.is-active:hover { color: #fff; background: var(--aqr-accent-dark); border-color: var(--aqr-accent-dark); }

/* Modern re-skin - "Write a review" is the block's PRIMARY CTA, so it is the
   brand navy per the mockup (white-on-navy #014e83 ~7:1, passes AA), NOT the
   old gold-on-ink. Shared by the PDP masthead (list.phtml), the My Reviews
   account page, and the order-view review prompt (all reference this class as
   their primary pill). Logged-in only on the PDP; guests keep the __guest CTA. */
.aqeltech-unifiedreviews__write-review-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: .4rem;
    font: inherit;
    font-size: .875rem;
    font-weight: 600;
    color: #fff;
    background: var(--aqr-accent);
    border: 1.5px solid var(--aqr-accent);
    border-radius: var(--aqr-radius-pill);
    /* Density pass (fidelity fix #8): compacted from .6rem to a ~38px pill,
       matching the mockup (was ~46px). */
    padding: .4375rem 1.3rem;
    cursor: pointer;
    text-decoration: none;
    transition: background-color .16s var(--aqr-ease), border-color .16s var(--aqr-ease), color .16s var(--aqr-ease);
}
.aqeltech-unifiedreviews__write-review-btn:hover {
    background: var(--aqr-accent-dark);
    border-color: var(--aqr-accent-dark);
    color: #fff;
}
.aqeltech-unifiedreviews__write-review-btn:focus-visible { outline: 2px solid var(--aqr-accent); outline-offset: 2px; }

/* Sort / Source selects. The "Sort" label sits inline before its select and
   is pushed to the right edge of the row. Rounded-rect (not pill) select to
   match the mockup's Sort control. */
.aqeltech-unifiedreviews__select-field { display: inline-flex; align-items: center; gap: .4rem; }
.aqeltech-unifiedreviews__select-field-lab { font-size: .8125rem; font-weight: 500; text-transform: none; letter-spacing: normal; color: var(--aqr-muted); }
.aqeltech-unifiedreviews__select-wrap { position: relative; display: inline-flex; }

.aqeltech-unifiedreviews__select {
    appearance: none;
    -webkit-appearance: none;
    font: inherit;
    font-size: .8125rem;
    font-weight: 500;
    color: var(--aqr-ink);
    background: var(--aqr-surface);
    border: 1px solid var(--aqr-line-2);
    /* Round-3 fidelity fix #5: tighter rectangle radius (was 8px) - Codex +
       Fable both flagged the Sort control as chunkier than target. */
    border-radius: 6px;
    /* Round-3 fidelity fix #5: shorter box + tighter chevron gutter (was
       .34rem .../1.9rem, a loose "fatter" control next to the target). */
    padding: .25rem 1.5rem .25rem .6rem;
    cursor: pointer;
    transition: border-color .16s var(--aqr-ease);
}

/* Fix 1: hover/focus border on the Sort/Source selects is a state
   indicator (WCAG 1.4.11), and for :focus-visible it is REDUNDANT with the
   generic outline rule above but for :hover there is no outline fallback at
   all - moved to --aqr-accent (navy, 6.8-8.0:1) rather than the fill-only
   #e3a008 gold (<2.1:1 against every real surface here). */
.aqeltech-unifiedreviews__select:hover { border-color: var(--aqr-accent); }
.aqeltech-unifiedreviews__select:focus-visible { border-color: var(--aqr-accent); }

/* Tranche 1 fix #2: the active Breeze theme ships a Tailwind-forms-style
   `select:not([multiple])` base rule (specificity 0,1,1) that injects its OWN
   background-image caret AND a 2.5rem right gutter, layered UNDER our custom
   .__select-chev SVG it read as a chunky DOUBLE-chevron. This descendant
   selector (.__select-wrap .__select = 0,2,0) outranks that base rule to kill
   the framework caret and reclaim the compact right gutter, leaving the single
   small .__select-chev caret below as the only glyph. */
.aqeltech-unifiedreviews__select-wrap .aqeltech-unifiedreviews__select {
    background-image: none;
    padding-right: 1.5rem;
}

.aqeltech-unifiedreviews__select-chev {
    position: absolute;
    /* Round-3 fidelity fix #5: tightened alongside the select's own reduced
       right padding above. */
    right: .5rem;
    top: 50%;
    transform: translateY(-50%) rotate(90deg);
    pointer-events: none;
    color: var(--aqr-muted);
    width: 10px;
    height: 10px;
}

/* ── Review list + cards ──────────────────────────────────────────────── */
.aqeltech-unifiedreviews__list {
    list-style: none;
    margin: 0 0 1.8rem;
    padding: 0;
    display: grid;
    gap: 1rem;
    align-items: stretch;
}

.aqeltech-unifiedreviews__list[aria-busy="true"] { opacity: .55; transition: opacity .16s var(--aqr-ease); }

.aqeltech-unifiedreviews__item { margin: 0; }

/* ── List-layout variants (aqeltech_unifiedreviews/pdp/list_layout) ──────
   Single-column is the grid's own implicit default (no modifier needed);
   --grid-2 (default config value) and --grid-3 opt into N-per-row; --single-
   col is the explicit `list` config option. Mobile collapse for all three
   lives in the real @media block at the bottom of this file. ──────────── */
.aqeltech-unifiedreviews__list--grid-2 { grid-template-columns: repeat(2, 1fr); }
.aqeltech-unifiedreviews__list--grid-3 { grid-template-columns: repeat(3, 1fr); }
.aqeltech-unifiedreviews__list--single-col { grid-template-columns: 1fr; }

/* grid-3 cards are too narrow (~250px on a 1280-wide viewport) for the
   desktop avatar-beside-content layout - reuse the same stacked treatment
   used at mobile width (avatar/name/date row ABOVE content, full-width).
   Standalone so the base mobile card rules stay untouched. */
.aqeltech-unifiedreviews__list--grid-3 .aqeltech-unifiedreviews__card { grid-template-columns: 1fr; }
.aqeltech-unifiedreviews__list--grid-3 .aqeltech-unifiedreviews__card-meta { flex-flow: row wrap; align-items: center; gap: .5rem .75rem; }
.aqeltech-unifiedreviews__list--grid-3 .aqeltech-unifiedreviews__card-actions { flex-wrap: wrap; row-gap: .5rem; }

/* Modern single-column review card (mockup: full-width, header row with the
   author identity on the left and the star/numeric rating pinned right - NOT
   the old 2-col avatar-sidebar grid). */
.aqeltech-unifiedreviews__card {
    position: relative;
    height: 100%;
    display: flex;
    flex-direction: column;
    padding: var(--aqr-card-pad);
    background: var(--aqr-surface);
    border: 1px solid var(--aqr-line);
    border-radius: var(--aqr-radius);
    box-shadow: var(--aqr-shadow);
    transition: box-shadow .2s var(--aqr-ease), transform .2s var(--aqr-ease);
}

.aqeltech-unifiedreviews__card:hover { box-shadow: var(--aqr-shadow-hov); transform: translateY(-1px); }

/* Header row: identity (avatar + name/date/verified) left, rating right. */
.aqeltech-unifiedreviews__card-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: .75rem;
    flex-wrap: wrap;
}
.aqeltech-unifiedreviews__card-person { display: flex; align-items: center; gap: .75rem; min-width: 0; }

.aqeltech-unifiedreviews__card-avatar {
    width: 42px;
    height: 42px;
    border-radius: 50%;
    flex: none;
    display: grid;
    place-items: center;
    /* Round-3 fidelity fix #8: the prior 10% tint read as washed-out neutral
       slate rather than a visible blue disc - boosted to 18% so the brand
       navy tint actually registers (initials were already navy via
       var(--aqr-accent), unchanged). */
    background: rgba(1, 78, 131, .18);
    color: var(--aqr-accent);
    font-weight: 700;

    font-size: .875rem;
}

.aqeltech-unifiedreviews__card-who { display: flex; flex-direction: column; min-width: 0; }
.aqeltech-unifiedreviews__card-author { margin: 0; font-weight: 700; font-size: .875rem; line-height: 1.3; color: var(--aqr-ink); }
.aqeltech-unifiedreviews__card-idline { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; margin-top: 2px; }
.aqeltech-unifiedreviews__card-date { margin: 0; font-size: .78rem; color: var(--aqr-muted); }

/* Rating group pinned to the right of the header row. */
.aqeltech-unifiedreviews__card-rating { display: flex; align-items: center; gap: .5rem; flex: none; }

/* Source-provider mark + report-flag. Wave 8: Report is now placed INLINE in
   the .card-actions row, immediately after Helpful (approved v3 mockup
   placement - see unified-reviews-redesign-v3.html's `.ur-flag` sitting
   right next to `.ur-vote`), instead of an absolutely-positioned top-right
   corner icon. Visual order is driven by the `order` property below (Vote,
   then Report, then the source mark last) rather than DOM order, so
   Breeze/unified-reviews.js's existing `button.closest('[data-role="review-
   actions"]')` wiring and _card.phtml's DOM order (vote, source, report)
   stay completely unchanged - only where each ends up sitting in the flex
   row moves. The source mark keeps margin-left:auto so it still pins to the
   end of the row on every breakpoint. */
.aqeltech-unifiedreviews__card-vote { order: 1; }
.aqeltech-unifiedreviews__card-report { order: 2; }
.aqeltech-unifiedreviews__card-criteria-toggle { order: 3; }
/* Tranche 1 fix #3: the provider (REVIEWS.io) colophon returns to the review
   card's BOTTOM-RIGHT CORNER (absolute, against the position:relative
   .__card), where the user wants it, not inline in the footer actions row.
   It stays a descendant of [data-role="review-actions"] in the DOM (so
   Breeze's report/vote closest() wiring is untouched), but is lifted out of
   the flex flow and pinned to the corner. Kept tasteful/muted via the
   grayscale+opacity+size treatment below. The actions row gets right-padding
   (only on cards that actually carry a source, via :has()) so Helpful/Report/
   "Ratings by feature" never collide with the corner mark. */
.aqeltech-unifiedreviews__card-source {
    position: absolute;
    /* Explicit lengths, NOT var(--aqr-card-pad): that token is a two-value
       "vertical horizontal" padding shorthand (1.375rem 1.5rem), which is
       invalid for the single-value right/bottom props and would be dropped
       (leaving the mark stranded at its old in-flow spot). These match the
       card's own inset so it sits flush in the bottom-right corner. */
    right: 1.5rem;
    bottom: 1.375rem;
    margin: 0;
    display: inline-flex;
    align-items: center;
    line-height: 0;
}
.aqeltech-unifiedreviews__card:has(.aqeltech-unifiedreviews__card-source) .aqeltech-unifiedreviews__card-actions {
    padding-right: 4.75rem;
}
/* User batch: in a single-column list the source mark reserves a 36px-min box
   so the corner logo has vertical breathing room on the wider single card. */
.aqeltech-unifiedreviews__list--single-col .aqeltech-unifiedreviews__card-source {
    min-height: 36px;
}
.aqeltech-unifiedreviews__card-source img,
.aqeltech-unifiedreviews__card-source svg {
    /* Round-3 fidelity fix #7: ~70% size (was 1rem) + grayscale + reduced
       opacity - demoted from "loudest thing on the card" to a quiet
       attribution mark, per Fable's review. */
    height: .7rem;
    width: auto;
    display: block;
    filter: grayscale(1);
    opacity: .6;
}

/* Modern: Report is now a plain muted inline TEXT button in the footer row
   (mockup) instead of the old top-right corner flag icon. It stays a
   descendant of [data-role="review-actions"] so Breeze/unified-reviews.js's
   button.closest('[data-role="review-actions"]') report wiring is intact, and
   keeps the [data-role] icon/label pairs (only the "reported" check icon is
   carried now - the default state shows a bare "Report" word, no icon). */
.aqeltech-unifiedreviews__card-report {
    display: inline-flex;
    align-items: center;
    gap: .3rem;
    padding: .375rem .5rem;
    font: inherit;
    font-size: .78rem;
    font-weight: 600;
    color: var(--aqr-muted);
    background: none;
    border: 0;
    border-radius: var(--aqr-radius-pill);
    cursor: pointer;
    transition: color .16s var(--aqr-ease), background-color .16s var(--aqr-ease);
}

.aqeltech-unifiedreviews__card-report:hover,
.aqeltech-unifiedreviews__card-report:focus-visible { color: var(--aqr-err); outline: none; }
.aqeltech-unifiedreviews__card-report svg { width: 13px; height: 13px; flex: none; }

/* "Reported" end state - a QUIET green chip (same green-family tokens the
   Verified badge uses for a "confirmed" signal). [disabled] means EXACTLY
   "already reported" (applyReportedState() only disables on a confirmed
   report), so it's safe to give it a dedicated look; the icon/label pairs
   toggle via the [hidden] attribute (see _card.phtml). */
.aqeltech-unifiedreviews__card-report[disabled] {
    color: var(--aqr-green-ink);
    background: var(--aqr-green-bg);
    cursor: default;
}
.aqeltech-unifiedreviews__card-report-label { font-size: .76rem; font-weight: 700; white-space: nowrap; }

.aqeltech-unifiedreviews__card-stars { display: block; color: var(--aqr-accent-strong); line-height: 0; }
.aqeltech-unifiedreviews__card-stars svg { display: block; }
/* Round-3 fidelity fix #3: the per-card star row rendered at its native
   100x20 markup size read a touch oversized next to the target's more
   restrained rating cluster - scaled down to the same 84x16 ratio the
   spotlight cards already use elsewhere in this file. */
.aqeltech-unifiedreviews__card-stars svg { width: 84px; height: 16px; }
/* Modern: numeric rating paired with the star row (see _card.phtml header). */
.aqeltech-unifiedreviews__card-rating-num {

    font-weight: 800;
    /* Round-3 fidelity fix #3: trimmed a touch alongside the star row. */
    font-size: .875rem;
    line-height: 1;
    color: var(--aqr-ink);
    font-variant-numeric: tabular-nums;
}
/* Modern: "Liked / Could be better" inline tag rows (see _card.phtml). Latent
   today - no store review carries pros/cons - styled for when the write form
   populates them: a coloured leading marker + bold label + inline value, one
   pair per line. */
.aqeltech-unifiedreviews__card-highlights { margin: .35rem 0 .7rem; font-size: .88rem; }
.aqeltech-unifiedreviews__card-highlights dt { display: inline; font-weight: 700; color: var(--aqr-ink); }
.aqeltech-unifiedreviews__card-highlights dt::before { content: "+ "; font-weight: 800; color: var(--aqr-green-ink); }
.aqeltech-unifiedreviews__card-highlight-lab--better::before { content: "\2212 "; color: var(--aqr-muted); }
.aqeltech-unifiedreviews__card-highlights dt::after { content: ":\00a0"; }
.aqeltech-unifiedreviews__card-highlights dd { display: inline; margin: 0; color: var(--aqr-muted); }
.aqeltech-unifiedreviews__card-highlights dd::after { content: ""; display: block; margin-bottom: .3rem; }

.aqeltech-unifiedreviews__card-verified {
    display: inline-flex;
    align-items: center;
    gap: .3125rem;
    margin: 0;
    padding: 3px 9px;
    border-radius: var(--aqr-radius-pill);
    font-size: .656rem;
    font-weight: 700;
    letter-spacing: .05em;
    text-transform: uppercase;
    white-space: nowrap;
    background: var(--aqr-green-bg);
    color: var(--aqr-green-ink);
}

.aqeltech-unifiedreviews__card-verified svg { width: 11px; height: 11px; flex: none; }
.aqeltech-unifiedreviews__card-title { font-size: 1.03rem; font-weight: 700; color: var(--aqr-ink); margin: .875rem 0 .375rem; line-height: 1.35; }
.aqeltech-unifiedreviews__card-body { margin: 0; color: var(--aqr-body); line-height: 1.65; max-width: 76ch; font-size: .9063rem; }

/* Wave 3A Fix B (revised): 3-line clamp, standard -webkit-line-clamp pattern
   (needs display:-webkit-box alongside it - this is the widely-supported
   form, including current Firefox/Safari, not just Chromium). This is the
   NO-JS fallback state AND the initial-paint state before core.js measures:
   the "Read more" toggle (a child of this paragraph, see _card.phtml) stays
   `hidden` until JS confirms real overflow, so without JS a long review
   simply clamps at 3 lines with the browser's own ellipsis and no visible
   affordance - never a mid-word cut visible to the user either way, because
   JS never even reveals the toggle until it has word-boundary-truncated the
   text to fit.
   `--measuring` is a transient, JS-only state (core.js's
   truncateReadMoreText()) used ONLY while binary-searching the exact
   truncated length against the real rendered width - same three
   declarations as `--expanded` under a different name so the "already
   expanded, skip re-measuring" check in core.js can't be confused by it.
   `--expanded` (added by core.js on "Read more" click) lifts the clamp back
   to the natural height for the full, untruncated text. */
.aqeltech-unifiedreviews__card-body {
    display: -webkit-box;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
.aqeltech-unifiedreviews__card-body--expanded,
.aqeltech-unifiedreviews__card-body--measuring {
    display: block;
    -webkit-line-clamp: unset;
    overflow: visible;
}

/* Organic v4.3 idiom: same link-style text button as .filter-clear /
   .empty-clear elsewhere in this sheet (underline, accent ink, no
   border/background) rather than a new button style. INLINE (not
   inline-block/block) so it flows as part of the same last visible line as
   the truncated text it follows ("…text Read more") instead of dropping to
   a separate line below; the small left margin is breathing room from the
   text's own trailing ellipsis space, not a block gap. */
.aqeltech-unifiedreviews__card-readmore {
    display: inline;
    margin-left: .15rem;
    padding: 0;
    border: 0;
    background: none;
    color: var(--aqr-accent);
    font-weight: 700;
    font-size: .85rem;
    text-decoration: underline;
    text-underline-offset: 2px;
    white-space: nowrap;
    cursor: pointer;
}
.aqeltech-unifiedreviews__card-readmore:hover,
.aqeltech-unifiedreviews__card-readmore:focus-visible { color: var(--aqr-accent-strong); outline: none; }

/* Photo rail: class names already styled by Breeze's own review-lightbox.css
   (.review-card__media / -button / -thumb), loaded on the same page via
   aqeltech_unifiedreviews_breeze_assets.xml - not duplicated here. Only the
   layout nudge for when the rail sits inside a review card lives here.
   Wave 6 (ref6 polish): 1rem, not the odd one-off .85rem this used to be -
   matches the SAME top-margin rhythm as this card's other after-body
   sections (.card-highlights / .card-recommendation, both 1rem), so the
   media row reads as one more tidy, consistently-spaced block in the
   card's flow rather than sitting slightly closer than its neighbours. */
.aqeltech-unifiedreviews__card .review-card__media { margin-top: 1rem; }

/* Fidelity fix #13: quiet caption sitting above the card's own photo rail. */
.aqeltech-unifiedreviews__card-media-caption {
    margin: 1rem 0 .5rem;
    font-size: .78rem;
    color: var(--aqr-muted);
}
.aqeltech-unifiedreviews__card-media-caption + .review-card__media { margin-top: 0; }

/* Preserved, not part of the Organic re-skin (no mockup coverage - real
   markup still conditionally renders these, so they stay styled rather
   than orphaned; token references only, remapped to the new v4.3 names). */
.aqeltech-unifiedreviews__card-highlights {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: .75rem;
    margin: 1rem 0 0;
}

.aqeltech-unifiedreviews__card-highlights dt { font-weight: 700; font-size: .75rem; letter-spacing: .05em; text-transform: uppercase; color: var(--aqr-accent); margin-bottom: .2rem; }
.aqeltech-unifiedreviews__card-highlights dd { margin: 0 0 .5rem; color: var(--aqr-body); font-size: .92rem; line-height: 1.55; }

.aqeltech-unifiedreviews__card-recommendation {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    margin: 1rem 0 0;
    font-weight: 600;
    font-size: .9rem;
    color: var(--aqr-green-ink);
}

/* Wave 3C, Part B: per-criterion "Details" progressive-disclosure affordance.
   Source-agnostic - only ever rendered when the row actually has
   rating_votes (see _card.phtml), so external/synced reviews never show it. */
/* Modern: "Ratings by feature" disclosure now lives IN the footer actions row
   (mockup) as a navy inline text button with a caret; its panel expands below
   the row (id-linked via aria-controls - core.js's toggle handler is DOM-
   position agnostic). Only rendered when the row has rating_votes. */
.aqeltech-unifiedreviews__card-criteria-toggle {
    display: inline-flex;
    align-items: center;
    gap: .375rem;
    font: inherit;
    font-size: .78rem;
    font-weight: 600;
    color: var(--aqr-accent);
    background: none;
    border: 0;
    padding: .375rem .5rem;
    cursor: pointer;
}

.aqeltech-unifiedreviews__card-criteria-toggle:hover { color: var(--aqr-accent-dark); }
.aqeltech-unifiedreviews__card-criteria-toggle:focus-visible { outline: 2px solid var(--aqr-accent); outline-offset: 2px; }
.aqeltech-unifiedreviews__card-criteria-caret { font-size: .625rem; line-height: 1; transition: transform .16s var(--aqr-ease); }
.aqeltech-unifiedreviews__card-criteria-toggle[aria-expanded="true"] .aqeltech-unifiedreviews__card-criteria-caret { transform: rotate(180deg); }

.aqeltech-unifiedreviews__card-criteria-panel {
    display: flex;
    flex-direction: column;
    gap: .4rem;
    margin: .6rem 0 0;
    padding: .75rem .9rem;
    background: var(--aqr-panel);
    border: 1px solid var(--aqr-line);
    border-radius: var(--aqr-radius-sm);
}

.aqeltech-unifiedreviews__card-criteria-row { display: grid; grid-template-columns: 5rem 1fr; align-items: center; gap: .6rem; }
.aqeltech-unifiedreviews__card-criteria-row dt { font-size: .82rem; font-weight: 600; color: var(--aqr-ink); margin: 0; }
.aqeltech-unifiedreviews__card-criteria-row dd { display: flex; align-items: center; gap: .5rem; margin: 0; }

.aqeltech-unifiedreviews__card-criteria-bar {
    display: inline-block;
    flex: 1 1 auto;
    height: .4rem;
    background: var(--aqr-line);
    border-radius: 999px;
    overflow: hidden;
}

.aqeltech-unifiedreviews__card-criteria-bar-fill {
    display: block;
    height: 100%;
    background: var(--aqr-accent-strong);
    border-radius: 999px;
}

.aqeltech-unifiedreviews__card-criteria-value { font-size: .78rem; font-weight: 600; color: var(--aqr-muted); flex: 0 0 auto; }

/* Wave 8 (M4): admin-defined custom-question answers on the review card.
   Styled to read as a sibling of the per-criterion "Details" panel above -
   the SAME tinted sub-card (--aqr-panel + --aqr-line hairline + --aqr-radius-sm),
   the SAME 5rem label column, and the SAME label type role (--aqr-ink, 600).
   A RATING answer reuses the criteria bar/value classes verbatim in the
   markup (aqeltech-unifiedreviews__card-criteria-bar / -bar-fill / -value),
   so its gold progress-bar + "N/5" chip inherit the criteria styling above
   with no override here; only the container, label, row and text-answer
   value need their own rules. Theme font inherited - no font-family set. */
.aqeltech-unifiedreviews__review-questions {
    display: flex;
    flex-direction: column;
    gap: .4rem;
    margin: .75rem 0 0;
    padding: .75rem .9rem;
    background: var(--aqr-panel);
    border: 1px solid var(--aqr-line);
    border-radius: var(--aqr-radius-sm);
}

.aqeltech-unifiedreviews__review-question--rating {
    display: grid;
    grid-template-columns: 5rem 1fr;
    align-items: center;
    gap: .6rem;
}

.aqeltech-unifiedreviews__review-question--text {
    display: flex;
    flex-direction: column;
    gap: .2rem;
}

.aqeltech-unifiedreviews__review-question-label { font-size: .82rem; font-weight: 600; color: var(--aqr-ink); margin: 0; }

.aqeltech-unifiedreviews__review-question-value { display: flex; align-items: center; gap: .5rem; margin: 0; }

.aqeltech-unifiedreviews__review-question-text { font-size: .82rem; line-height: 1.5; color: var(--aqr-ink); margin: 0; }

.aqeltech-unifiedreviews__card-actions { display: flex; align-items: center; gap: .375rem; margin-top: 1rem; padding-top: 0; }

.aqeltech-unifiedreviews__card-vote {
    display: inline-flex;
    align-items: center;
    gap: .5rem;
    font: inherit;
    font-size: .8125rem;
    font-weight: 600;
    color: var(--aqr-accent);
    background: var(--aqr-surface);
    border: 1px solid var(--aqr-line-2);
    border-radius: var(--aqr-radius-pill);
    /* Density pass (fidelity fix #11): a touch shorter, matching the mockup's
       measured ~31px Helpful control. */
    padding: .34375rem .9375rem;
    cursor: pointer;
    transition: border-color .16s var(--aqr-ease), color .16s var(--aqr-ease), background-color .16s var(--aqr-ease);
}

.aqeltech-unifiedreviews__card-vote:hover { border-color: var(--aqr-accent-dark); color: var(--aqr-accent-dark); background: var(--aqr-accent-soft); }

/* Fidelity fix #11: the mockup keeps the VOTED state WHITE with a navy
   outline/text - NOT a solid navy fill (was --aqr-voted-fill / -ink, a
   filled-navy-with-white-text look the mockup does not use). */
.aqeltech-unifiedreviews__card-vote[aria-pressed="true"],
.aqeltech-unifiedreviews__card-vote--voted {
    background: var(--aqr-surface);
    border-color: var(--aqr-accent);
    color: var(--aqr-accent);
    font-weight: 700;
}

.aqeltech-unifiedreviews__card-vote[aria-pressed="true"]:hover,
.aqeltech-unifiedreviews__card-vote--voted:hover { background: var(--aqr-accent-soft); border-color: var(--aqr-accent-dark); color: var(--aqr-accent-dark); }

/* Belt-and-braces: SSR hydration sets BOTH aria-pressed="true" and this
   class; the live-vote JS only ever toggles the --voted class (see
   unified-reviews.js handleHelpfulClick) - the two selectors above must
   always resolve to the identical highlighted look. */
.aqeltech-unifiedreviews__card-vote--voted svg { color: var(--aqr-accent); }
.aqeltech-unifiedreviews__card-vote[disabled] { cursor: not-allowed; opacity: .65; }
.aqeltech-unifiedreviews__card-vote svg { width: 15px; height: 15px; flex: none; }
.aqeltech-unifiedreviews__card-vote-sep { opacity: .55; }
.aqeltech-unifiedreviews__card-vote-n { font-variant-numeric: tabular-nums; }

.aqeltech-unifiedreviews__visually-hidden {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

/* ── Empty state ──────────────────────────────────────────────────────── */
.aqeltech-unifiedreviews__empty { padding: 2.4rem 1.6rem; text-align: center; background: var(--aqr-surface); border: 1.5px dashed var(--aqr-line-2); border-radius: var(--aqr-radius); }
.aqeltech-unifiedreviews__empty svg { width: 30px; height: 30px; color: var(--aqr-muted); opacity: .6; }
.aqeltech-unifiedreviews__empty-text { display: block; margin: .7rem 0 .35rem; font-size: 1.05rem; font-weight: 700; color: var(--aqr-ink); }
.aqeltech-unifiedreviews__empty-hint { margin: 0 0 1rem; font-size: .85rem; color: var(--aqr-muted); }
.aqeltech-unifiedreviews__empty-clear { font-weight: 700; color: var(--aqr-accent); background: none; border: 0; cursor: pointer; text-decoration: underline; text-underline-offset: 2px; font-size: .88rem; }

/* ── Pager ────────────────────────────────────────────────────────────── */
.aqeltech-unifiedreviews__pager { margin-top: 1.4rem; }
/* Wave 3A Fix C: centered horizontally (was unset -> flex-start, the
   reported left-aligned bug). flex-wrap:wrap already above centers each
   wrapped row independently too, so mobile (where the item count overflows
   one row) centers for free with this same rule - no separate @media
   override needed. */
.aqeltech-unifiedreviews__pager-list { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: .4rem; list-style: none; margin: 0; padding: 0; }

.aqeltech-unifiedreviews__pager-link {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: .25rem;
    min-width: 2.3rem;
    height: 2.3rem;
    padding: 0 .65rem;
    border: 1.5px solid var(--aqr-line-2);
    border-radius: var(--aqr-radius-pill);
    color: var(--aqr-body);
    text-decoration: none;
    font-weight: 700;
    line-height: 1;
    background: var(--aqr-surface);
    transition: border-color .16s var(--aqr-ease), background-color .16s var(--aqr-ease), color .16s var(--aqr-ease);
}

/* Fix 1: this rule sets outline:none, making border-color the SOLE focus
   indicator for non-current pager links (no generic-outline fallback here)
   - must itself pass WCAG 1.4.11, so it stays on --aqr-accent (navy) rather
   than the fill-only #e3a008 gold. */
.aqeltech-unifiedreviews__pager-link:hover,
.aqeltech-unifiedreviews__pager-link:focus-visible { border-color: var(--aqr-accent); color: var(--aqr-accent); outline: none; }

/* Fix 1: the current-page pill fills with the bright #e3a008 gold; white
   text on that fill is ~2.3:1 (fails AA), so the label switches to
   --aqr-ink (dark navy), which clears ~5.7:1 on the same fill. */
.aqeltech-unifiedreviews__pager-link--current { background: var(--aqr-accent-strong); border-color: var(--aqr-accent-strong); color: var(--aqr-ink); cursor: default; }
.aqeltech-unifiedreviews__pager-ellipsis { padding: 0 .3rem; color: var(--aqr-muted); }

/* ── Infinite paging (aqeltech_unifiedreviews/pdp/paging_mode = infinite) ──
   Applied by core.js's infinite-paging controller, never server-rendered:
   with JavaScript off none of these classes is ever added, so the numbered
   pager above renders and behaves exactly as it always has.

   The pager is VISUALLY hidden, not removed - the `?rp=N` anchor chain has to
   stay in the document for crawlers and stays in the tab order for keyboard
   users. Hiding it with the standard clip-rect technique (rather than
   display:none/visibility:hidden, which would drop it from both) preserves
   both. :focus-within then brings it fully back the moment a keyboard user
   tabs into it, so nobody is ever stuck operating a control they cannot see. */
.aqeltech-unifiedreviews__pager--infinite {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

.aqeltech-unifiedreviews__pager--infinite:focus-within {
    position: static;
    width: auto;
    height: auto;
    margin: 1.4rem 0 0;
    overflow: visible;
    clip: auto;
    white-space: normal;
}

.aqeltech-unifiedreviews__infinite { display: flex; flex-direction: column; align-items: center; gap: .8rem; margin-top: 1.4rem; }

/* Full-width, 1px tall rather than 0 - a zero-area target is not reliably
   reported as intersecting across engines. aria-hidden in the markup, so it is
   never announced; it exists only to be observed. */
.aqeltech-unifiedreviews__infinite-sentinel { width: 100%; height: 1px; }

.aqeltech-unifiedreviews__load-more {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: 2.6rem;
    padding: 0 1.5rem;
    border: 1.5px solid var(--aqr-accent);
    border-radius: var(--aqr-radius-pill);
    background: var(--aqr-surface);
    color: var(--aqr-accent);
    font-weight: 700;
    line-height: 1;
    text-decoration: none;
    cursor: pointer;
    transition: background-color .16s var(--aqr-ease), color .16s var(--aqr-ease);
}

.aqeltech-unifiedreviews__load-more:hover,
.aqeltech-unifiedreviews__load-more:focus-visible { background: var(--aqr-accent); color: #fff; }

.aqeltech-unifiedreviews__load-more--loading,
.aqeltech-unifiedreviews__load-more[aria-disabled="true"] { opacity: .6; cursor: progress; }

/* ── Guest-gated write-a-review ──────────────────────────────────────── */
.aqeltech-unifiedreviews__guest {
    scroll-margin-top: 16px;
    display: grid;
    grid-template-columns: 1.2fr 1fr;
    gap: 2rem;
    align-items: center;
    background: var(--aqr-surface);
    border: 1px solid var(--aqr-line);
    border-radius: var(--aqr-radius);
    padding: 1.8rem 2rem;
    box-shadow: var(--aqr-shadow);
    margin-top: 1.8rem;
}

/* Tranche 1 fix #4: guest write-review slide-down. The guest CTA now lives
   just below the masthead topline and is HIDDEN by default, revealed by the
   header "Write a review" button (guests get this slide instead of the modal
   logged-in users get). Progressive enhancement: the collapse is opt-in via
   the --collapsible modifier that Breeze/unified-reviews.js adds on init, so
   with JavaScript OFF the block stays fully visible and the sign-in CTA is
   never lost. .is-open (toggled on click) animates the max-height/opacity
   slide. */
.aqeltech-unifiedreviews__guest--collapsible {
    overflow: hidden;
    max-height: 0;
    opacity: 0;
    visibility: hidden;
    margin-top: 0;
    margin-bottom: 0;
    padding-top: 0;
    padding-bottom: 0;
    border-top-width: 0;
    border-bottom-width: 0;
    transition: max-height .3s var(--aqr-ease), opacity .24s var(--aqr-ease),
                margin .3s var(--aqr-ease), padding .3s var(--aqr-ease),
                visibility 0s linear .3s;
}
/* User batch fix: the open slide is driven by an exact measured max-height set
   inline by unified-reviews.js (guest.scrollHeight), so the ease runs across
   the true content distance - no 640px overshoot dead-time (the "lag"). The
   640px here is only a no-inline fallback. margin-bottom gives the panel a real
   gap from the card below (it was sticking flush against it). */
.aqeltech-unifiedreviews__guest--collapsible.is-open {
    max-height: 640px;
    opacity: 1;
    visibility: visible;
    margin-top: 1rem;
    margin-bottom: 1.8rem;
    padding-top: 1.8rem;
    padding-bottom: 1.8rem;
    border-top-width: 1px;
    border-bottom-width: 1px;
    transition: max-height .3s var(--aqr-ease), opacity .28s var(--aqr-ease),
                margin .3s var(--aqr-ease), padding .3s var(--aqr-ease),
                visibility 0s;
}

.aqeltech-unifiedreviews__guest-title { font-size: 1.25rem; font-weight: 700; letter-spacing: -.01em; color: var(--aqr-ink); margin: 0; }
.aqeltech-unifiedreviews__guest-copy { font-size: .9rem; color: var(--aqr-body); margin: .6rem 0 1.1rem; max-width: 48ch; line-height: 1.55; }
.aqeltech-unifiedreviews__guest-cta { display: flex; gap: .65rem; flex-wrap: wrap; }

.aqeltech-unifiedreviews__guest-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: .5rem;
    font-size: .9rem;
    font-weight: 700;
    border-radius: var(--aqr-radius-pill);
    padding: .75rem 1.35rem;
    cursor: pointer;
    text-decoration: none;
    border: 1.5px solid transparent;
    transition: background-color .18s var(--aqr-ease), border-color .18s var(--aqr-ease), color .18s var(--aqr-ease), transform .12s var(--aqr-ease);
}

.aqeltech-unifiedreviews__guest-btn:active { transform: translateY(1px); }
/* Fix 1: same dark-ink-on-bright-gold swap as the pager pill above - white
   text on #e3a008 fails AA (~2.3:1); --aqr-ink clears ~5.7:1. The :hover
   state already swaps the fill to the navy --aqr-accent-dark, where white
   text passes comfortably, so only the resting (non-hover) label changes. */
.aqeltech-unifiedreviews__guest-btn--primary { background: var(--aqr-accent-strong); border-color: var(--aqr-accent-strong); color: var(--aqr-ink); }
.aqeltech-unifiedreviews__guest-btn--primary:hover { background: var(--aqr-accent-dark); border-color: var(--aqr-accent-dark); color: #fff; }
.aqeltech-unifiedreviews__guest-btn--ghost { background: var(--aqr-surface); border-color: var(--aqr-line-2); color: var(--aqr-accent); }
.aqeltech-unifiedreviews__guest-btn--ghost:hover { border-color: var(--aqr-accent); background: var(--aqr-accent-soft); }

.aqeltech-unifiedreviews__guest-steps { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: .85rem; }
.aqeltech-unifiedreviews__guest-step { display: flex; gap: .7rem; align-items: flex-start; }

.aqeltech-unifiedreviews__guest-step-n {
    flex: none;
    width: 1.6rem;
    height: 1.6rem;
    border-radius: 50%;
    background: var(--aqr-green-bg);
    color: var(--aqr-green-ink);
    font-weight: 700;
    font-size: .78rem;
    display: grid;
    place-items: center;
    margin-top: .05rem;
    font-variant-numeric: tabular-nums;
}

.aqeltech-unifiedreviews__guest-step b { display: block; color: var(--aqr-ink); font-size: .85rem; }
.aqeltech-unifiedreviews__guest-step span { font-size: .8rem; color: var(--aqr-muted); }

/* ── "Write a Review" form v5 (Wave 5, logged-in customers) ──────────────
   Aligned to user-approved reference image #12 - LAYOUT ONLY, the
   reference's purple is replaced by the Organic v4.3 native navy/gold
   tokens throughout. Single-column, CENTERED top section (derived overall
   stars/sentiment, required criteria row, recommend chip), then left-
   aligned Title/Review/pros-cons-pair/media/Submit - the 2-column grid the
   old (nickname + rating) form used is gone; there is no more field that
   needs a 2-up layout at the top level (pros/cons pair separately below,
   scoped to their OWN row wrapper, not the form's outer grid). ────────── */
.aqeltech-unifiedreviews__form {
    margin-top: 0;
    display: flex;
    flex-direction: column;
    gap: 1.1rem;
    max-width: 30rem;
    padding: clamp(1.5rem, 4vw, 2.1rem);
    background: var(--aqr-panel);
    border: 1px solid var(--aqr-line);
    border-radius: var(--aqr-radius);
}

.aqeltech-unifiedreviews__form-title {
    margin: 0 0 .1rem;

    font-size: 1.3rem;
    font-weight: 700;
    color: var(--aqr-ink);
    text-align: center;
}

/* ── Modern 4-step rework (artifact #p3/#p4) ──────────────────────────────
   The write-review form is a stack of numbered steps on the white modal
   surface. Each step carries a numbered badge + heading and is separated from
   the previous one by a hairline top rule; the first step has none (it follows
   the form title). Gold stays decorative-only per the design system, so the
   step NUMBER (informational text) is navy-on-white, never gold. ─────────── */
/* Artifact rework: the write-review modal is a white card whose shadow lives
   on the dialog (below); the stepped form itself is just the padded content
   column (no border/fill/shadow of its own, fills the ~553px dialog). */
.aqeltech-unifiedreviews__form--stepped {
    gap: 1.35rem;
    max-width: none;
    padding: 2rem 2.6rem 1.6rem;
    background: transparent;
    border: 0;
    border-radius: 0;
}

/* Header: muted uppercase eyebrow, a larger LEFT-aligned title, then a product
   chip (thumb + name + SKU). */
.aqeltech-unifiedreviews__form-eyebrow {
    margin: 0 0 .5rem;
    font-size: .6875rem;
    font-weight: 700;
    letter-spacing: .14em;
    text-transform: uppercase;
    color: var(--aqr-muted);
}
.aqeltech-unifiedreviews__form--stepped .aqeltech-unifiedreviews__form-title {
    text-align: left;
    font-size: 1.7rem;
    font-weight: 800;
    letter-spacing: -.01em;
    line-height: 1.5;
    margin: 0 0 .875rem;
}
.aqeltech-unifiedreviews__form-product {
    display: flex;
    align-items: center;
    gap: .875rem;
    padding: 12px 14px;
    background: #f4f6fa;
    border: 1px solid var(--aqr-line);
    border-radius: 9px;
    margin: 0 0 .25rem;
}
.aqeltech-unifiedreviews__form-product-thumb {
    flex: none;
    display: grid;
    place-items: center;
    width: 56px;
    height: 56px;
    overflow: hidden;
    border-radius: 7px;
    background: #e6ebf3;
    color: var(--aqr-accent);
    line-height: 0;
}
.aqeltech-unifiedreviews__form-product-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.aqeltech-unifiedreviews__form-product-info { display: flex; flex-direction: column; gap: .15rem; min-width: 0; }
.aqeltech-unifiedreviews__form-product-name { font-size: .9375rem; font-weight: 700; color: var(--aqr-ink); }
.aqeltech-unifiedreviews__form-product-meta { font-size: .8125rem; color: var(--aqr-muted); }

.aqeltech-unifiedreviews__form-step {
    display: flex;
    flex-direction: column;
    gap: .85rem;
    padding-top: 1.6rem;
    border-top: 1px solid var(--aqr-line);
}
.aqeltech-unifiedreviews__form-step:first-of-type {
    padding-top: 0;
    border-top: 0;
}
/* Step header ROW: left "N · LABEL" eyebrow, right muted hint, baseline-aligned
   (no filled circle badge, no white number-in-disc). */
.aqeltech-unifiedreviews__form-step-head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: .75rem;
}
.aqeltech-unifiedreviews__form-step-eyebrow {
    display: inline-flex;
    align-items: baseline;
    font-size: .75rem;
    font-weight: 700;
    letter-spacing: .16em;
    text-transform: uppercase;
    color: var(--aqr-ink);
}
.aqeltech-unifiedreviews__form-step-num {
    font-weight: 700;
    color: var(--aqr-ink);
    font-variant-numeric: tabular-nums;
}
.aqeltech-unifiedreviews__form-step-num::after {
    content: "·";
    margin: 0 .5em;
    color: var(--aqr-ink);
}
.aqeltech-unifiedreviews__form-step-heading {
    font-size: .75rem;
    font-weight: 700;
    letter-spacing: .16em;
    text-transform: uppercase;
    color: var(--aqr-ink);
}
.aqeltech-unifiedreviews__form-step-hint {
    flex: none;
    font-size: .78125rem;
    font-weight: 400;
    letter-spacing: 0;
    text-transform: none;
    color: var(--aqr-muted);
}
/* Retired: circle-badge modifier (kept as an unused alias for safety). */
.aqeltech-unifiedreviews__form-step-optional {
    margin-left: auto;
    font-size: .72rem;
    font-weight: 600;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: var(--aqr-muted);
}
.aqeltech-unifiedreviews__form-step-body {
    display: flex;
    flex-direction: column;
    gap: .9rem;
}

/* Header field labels (TITLE / REVIEW / question labels): uppercase, letter-
   spaced, navy, sitting above their input. */
.aqeltech-unifiedreviews__form-field-label {
    font-size: .75rem;
    font-weight: 700;
    letter-spacing: .1em;
    text-transform: uppercase;
    color: var(--aqr-ink);
    margin-bottom: .125rem;
}
.aqeltech-unifiedreviews__form-question-optional {
    font-style: italic;
    font-weight: 400;
    letter-spacing: 0;
    text-transform: none;
    color: var(--aqr-muted);
    margin-left: .4em;
}
/* Review textarea: fixed 110px, no resize (base textarea rule already sets
   resize:none). The helper + counter share one row beneath it. */
.aqeltech-unifiedreviews__form-input--detail { height: 110px; min-height: 110px; line-height: 1.6; }
.aqeltech-unifiedreviews__form-detail-foot {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: .75rem;
    margin-top: .375rem;
}
.aqeltech-unifiedreviews__form-detail-foot .aqeltech-unifiedreviews__form-charcount {
    align-self: auto;
    margin-top: 0;
    font-size: .71875rem;
}

.aqeltech-unifiedreviews__form-field { display: flex; flex-direction: column; gap: .45rem; }

.aqeltech-unifiedreviews__form-label { font-weight: 600; font-size: .9rem; color: var(--aqr-ink); }

.aqeltech-unifiedreviews__form-input {
    width: 100%;
    box-sizing: border-box;
    padding: .6875rem .875rem;
    font: inherit;
    font-size: .95rem;
    color: var(--aqr-ink);
    background: var(--aqr-surface);
    border: 1px solid var(--aqr-line-2);
    border-radius: var(--aqr-radius-sm);
    transition: border-color .16s var(--aqr-ease), box-shadow .16s var(--aqr-ease);
}

.aqeltech-unifiedreviews__form-input:focus { outline: none; border-color: var(--aqr-accent); box-shadow: 0 0 0 3px var(--aqr-accent-soft); }
.aqeltech-unifiedreviews__form-input::placeholder { color: var(--aqr-muted); opacity: 1; }
/* Wave 6: non-resizable - covers every textarea sharing this class (review
   detail, pros "What did you like?", cons "What could be better?", and any
   future one) in a single rule. */
textarea.aqeltech-unifiedreviews__form-input { resize: none; min-height: 5.5rem; line-height: 1.6; }
.aqeltech-unifiedreviews__form-help { font-size: .8rem; color: var(--aqr-muted); }
.aqeltech-unifiedreviews__form-field--checkbox { flex-direction: row; align-items: center; gap: .6rem; }
.aqeltech-unifiedreviews__form-checkbox { width: 1.15rem; height: 1.15rem; accent-color: var(--aqr-accent); }
.aqeltech-unifiedreviews__form-file-error { color: var(--aqr-err); font-size: .82rem; }
/* Change #13: select/radio/checkbox custom review questions. The <select>
   reuses the shared .aqeltech-unifiedreviews__form-input look; radio/checkbox
   groups get their own compact stacked-option layout. */
.aqeltech-unifiedreviews__form-input--select { appearance: auto; cursor: pointer; }
.aqeltech-unifiedreviews__form-question-options { display: flex; flex-direction: column; gap: .5rem; }
.aqeltech-unifiedreviews__form-question-option {
    display: flex;
    align-items: center;
    gap: .5rem;
    font-size: .9rem;
    color: var(--aqr-ink);
    cursor: pointer;
}
.aqeltech-unifiedreviews__form-question-option input[type="radio"],
.aqeltech-unifiedreviews__form-question-option input[type="checkbox"] {
    width: 1.05rem;
    height: 1.05rem;
    accent-color: var(--aqr-accent);
    flex: none;
}
.aqeltech-unifiedreviews__form-preview { display: flex; flex-wrap: wrap; gap: .5rem; }
.aqeltech-unifiedreviews__form-status { margin: 0; font-weight: 600; }
.aqeltech-unifiedreviews__form-status[data-state="error"] { color: var(--aqr-err); }
.aqeltech-unifiedreviews__form-status[data-state="ok"] { color: var(--aqr-green-ink); }

/* Live character counter under the Review textarea (image #12's
   "0 characters"), right-aligned below the field like the reference. */
.aqeltech-unifiedreviews__form-charcount {
    align-self: flex-end;
    margin-top: -.25rem;
    font-size: .78rem;
    color: var(--aqr-muted);
    font-variant-numeric: tabular-nums;
}

/* Modern 4-step rework: the side-by-side pros/cons pair is retired - Step 3
   now holds admin-defined TEXT questions instead, so the old .form-row--pair
   grid is gone. */

/* Fix 1: same dark-ink-on-bright-gold swap as the pager pill / guest CTA
   above. :hover already swaps to the navy --aqr-accent-dark, so white text
   returns there (passes comfortably); only the resting fill's label moves
   to --aqr-ink. */
/* Wave 5: full-width Submit (image #12), no longer a grid-positioned item -
   the form is a single flex column now, so a plain width:100% is enough. */
.aqeltech-unifiedreviews__form-submit {
    width: 100%;
    text-align: center;
    background: var(--aqr-accent-strong);
    color: var(--aqr-ink);
    border: 0;
    padding: .85rem 1.9rem;
    font-size: 1rem;
    font-weight: 700;
    border-radius: var(--aqr-radius-pill);
    cursor: pointer;
    box-shadow: 0 8px 18px -8px var(--aqr-accent-soft);
    transition: background-color .15s var(--aqr-ease), transform .1s var(--aqr-ease), box-shadow .15s var(--aqr-ease);
}

.aqeltech-unifiedreviews__form-submit:hover { background: var(--aqr-accent-dark); color: #fff; }
.aqeltech-unifiedreviews__form-submit:active { transform: translateY(1px); }
.aqeltech-unifiedreviews__form-submit:focus-visible { outline: 3px solid var(--aqr-accent-soft); outline-offset: 2px; }

.aqeltech-unifiedreviews__form-stars { display: inline-flex; gap: .3rem; }

/* Wave 10a - Thank-You confirmation panel (submit-success state). Shares the
   modal-dialog chrome; centered, matching the form's own design language and
   the active theme font (--aqr-font-display inherits it). */
.aqeltech-unifiedreviews__thankyou {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    gap: .85rem;
    padding: .5rem 0 .25rem;
}
.aqeltech-unifiedreviews__thankyou-icon { color: var(--aqr-green-ink); line-height: 0; }
.aqeltech-unifiedreviews__thankyou-icon svg { width: 56px; height: 56px; }
.aqeltech-unifiedreviews__thankyou-title {
    margin: 0;

    font-size: 1.3rem;
    font-weight: 700;
    color: var(--aqr-ink);
}
.aqeltech-unifiedreviews__thankyou-title:focus { outline: none; }
.aqeltech-unifiedreviews__thankyou-title:focus-visible { outline: 3px solid var(--aqr-accent-soft); outline-offset: 3px; border-radius: var(--aqr-radius-sm); }
.aqeltech-unifiedreviews__thankyou-body {
    margin: 0;
    max-width: 22rem;
    font-size: .95rem;
    line-height: 1.6;
    color: var(--aqr-muted);
}
.aqeltech-unifiedreviews__thankyou-card {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: .35rem;
    width: 100%;
    box-sizing: border-box;
    padding: .85rem 1rem;
    background: var(--aqr-surface);
    border: 1px solid var(--aqr-line);
    border-radius: var(--aqr-radius-sm);
}
.aqeltech-unifiedreviews__thankyou-rating { display: inline-flex; align-items: center; gap: .5rem; }
.aqeltech-unifiedreviews__thankyou-stars { color: var(--aqr-accent-strong); line-height: 0; }
.aqeltech-unifiedreviews__thankyou-stars svg { width: 100px; height: 20px; }
.aqeltech-unifiedreviews__thankyou-rating-value {
    font-weight: 700;
    color: var(--aqr-ink);
    font-variant-numeric: tabular-nums;
}
.aqeltech-unifiedreviews__thankyou-rating-value:empty { display: none; }
.aqeltech-unifiedreviews__thankyou-review-title {
    margin: 0;
    font-weight: 600;
    color: var(--aqr-ink);
}
.aqeltech-unifiedreviews__thankyou-review-title:empty { display: none; }
.aqeltech-unifiedreviews__thankyou-again { margin-top: .25rem; }

/* Fix 3 (v4.3 live-feedback pass): verified live (via the browser's own
   cascade, not a static grep - the earlier static check for this exact
   theme rule produced a false negative) that Swissup Breeze ships a
   "label button" rule (default.css, for datepicker-trigger-style buttons)
   forcing padding, background, color, every font property, and border to
   inherit or reset, each with its own !important. The Rating field's star
   group is - correctly, per the mount-point fix above - now a real
   descendant of that field's label element, so these three properties need
   their own !important to win: color and font-size were being silently
   forced to inherit (stars rendered as small 16px navy glyphs instead of
   large gold ones), padding was forced to 0. Every other property in this
   rule (background, border, line-height, cursor, transition) is unaffected
   by the theme rule and is left as plain, non-!important CSS. Matches this
   file's existing precedent for !important ([hidden] and reduced-motion
   above). */
.aqeltech-unifiedreviews__form-star {
    background: none;
    border: 0;
    padding: 0 .05rem !important;
    font-size: 1.9rem !important;
    line-height: 1;
    cursor: pointer;
    color: var(--aqr-star-empty) !important;
    transition: color .1s var(--aqr-ease), transform .1s var(--aqr-ease);
}

.aqeltech-unifiedreviews__form-star.is-active { color: var(--aqr-accent-strong) !important; }
.aqeltech-unifiedreviews__form-star:hover { transform: scale(1.1); }
.aqeltech-unifiedreviews__form-star:focus-visible { outline: 2px solid var(--aqr-accent); outline-offset: 2px; border-radius: .125rem; }

/* Wave 6: the derived-overall big star row + sentiment word block that
   used to live here (.form-overall / -stars-row / -star / -sentiment) is
   REMOVED - the markup and core.js's DOM-painting code that targeted it
   are both gone (see _form.phtml / core.js's own Wave 6 comments); the
   criteria stars below are now the form's sole rating display+input. */

/* Modern 4-step rework (Step 1 "Rate this product"): the criteria render as
   full-width star ROWS - each criterion's label on the left, its 32px star
   input on the right - always expanded, no collapse control. */
.aqeltech-unifiedreviews__form-criteria-group {
    display: flex;
    flex-direction: column;
    gap: .5rem;
}

.aqeltech-unifiedreviews__form-criteria-entry {
    display: flex;
    flex-direction: row;
    align-items: center;
    justify-content: flex-start;
    gap: 1.5rem;
}

/* Artifact: UPPERCASE letter-spaced label on the left with the stars starting
   immediately to its right (a fixed min-width keeps the star columns aligned
   across Quality/Value/Price). */
.aqeltech-unifiedreviews__form-criteria-label {
    min-width: 4.75rem;
    font-size: .78125rem;
    font-weight: 700;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--aqr-ink);
}

/* The native <select> fallback for a criterion stays visible (and usable)
   until initCriteriaStars() enhances it - scoped here so
   only an enhanced field's OWN select hides, not every select on the form. */
.aqeltech-unifiedreviews__form-criteria-entry:has(.aqeltech-unifiedreviews__form-stars) select[data-role="review-criteria-input"] {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

/* Artifact: 24px star glyphs, ~12px apart, on a 32px tap target. */
.aqeltech-unifiedreviews__form-stars--criteria { gap: .75rem; }
.aqeltech-unifiedreviews__form-stars--criteria .aqeltech-unifiedreviews__form-star {
    font-size: 1.5rem !important;
    padding: .25rem !important;
}

/* Modern: the Recommend toggle now sits at the top of Step 2 (left-aligned in
   the step body); its old centered-chip modifier is retired. */

/* WS5 #12: explicit Yes/No segmented control - two REAL radio inputs (both
   name="recommend", values "1"/"0"), each wrapped in its own pill-shaped
   <label> so the whole pill is clickable, not just the small radio dot.
   Reuses the pill shape of .form-submit (var(--aqr-radius-pill)) at a
   smaller scale, same visual language as the retired auto-recommend chip.
   Swissup Breeze's "label button" reset (default.css) forces a *button*
   descendant of a <label> to inherit/reset padding/background/border/font/
   color with !important (the same theme rule .form-star/the old
   .form-recommend-chip already fought) - these are plain <label>+<input>
   elements, not buttons, so that reset does not apply here and no
   !important is needed for this rule. */
.aqeltech-unifiedreviews__form-recommend-options {
    display: inline-flex;
    flex-wrap: wrap;
    gap: .5rem;
}

.aqeltech-unifiedreviews__form-recommend-option {
    display: inline-flex;
    align-items: center;
    gap: .5rem;
    font-size: .875rem;
    font-weight: 600;
    line-height: 1.2;
    color: var(--aqr-body);
    background: #fff;
    border: 1px solid var(--aqr-line-2);
    border-radius: var(--aqr-radius-pill);
    padding: .625rem 1.125rem;
    cursor: pointer;
    transition: background-color .15s var(--aqr-ease), border-color .15s var(--aqr-ease), color .15s var(--aqr-ease);
}

.aqeltech-unifiedreviews__form-recommend-input {
    width: 1.05rem;
    height: 1.05rem;
    accent-color: var(--aqr-accent);
}

.aqeltech-unifiedreviews__form-recommend-option:has(.aqeltech-unifiedreviews__form-recommend-input:checked) {
    color: var(--aqr-accent-dark);
    background: var(--aqr-accent-soft);
    border-color: var(--aqr-accent);
}

.aqeltech-unifiedreviews__form-recommend-option:hover { border-color: var(--aqr-accent); }
.aqeltech-unifiedreviews__form-recommend-option:has(.aqeltech-unifiedreviews__form-recommend-input:focus-visible) {
    outline: 2px solid var(--aqr-accent);
    outline-offset: 2px;
}

/* Modern: step separation is handled by each .form-step's own top rule, so the
   old single .form-divider is retired. */

/* ── Write-a-review MODAL (Fix 3) ─────────────────────────────────────────
   [hidden] is already handled by the shared `.aqeltech-unifiedreviews
   [hidden] { display:none !important }` rule at the top of this file (the
   modal root is a descendant of .aqeltech-unifiedreviews) - this only
   defines the OPEN appearance. Kept in its natural DOM position (inside
   .aqeltech-unifiedreviews, not portalled to <body>) specifically so it
   keeps inheriting the --aqr-* custom properties defined on that ancestor;
   position:fixed positions against the viewport regardless of DOM nesting
   as long as no ancestor sets transform/filter/perspective (verified none
   of this module's own ancestors do - confirmed empirically on the live
   page that the dialog covers/centers on the full viewport). ─────────── */
.aqeltech-unifiedreviews__modal {
    position: fixed;
    inset: 0;
    z-index: 1200;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 1.5rem;
}

.aqeltech-unifiedreviews__modal-overlay {
    position: absolute;
    inset: 0;
    background: rgba(20, 45, 80, .55);
}

.aqeltech-unifiedreviews__modal-dialog {
    position: relative;
    z-index: 1;
    width: 100%;
    max-width: 46rem;
    max-height: calc(100vh - 3rem);
    overflow-y: auto;
    border-radius: var(--aqr-radius);
}

/* Wave 5: the write-review dialog shrinks to match the form's own new
   single-column max-width (30rem) - same "dialog matches its content"
   pattern the report dialog below already established (32rem). Without
   this the dialog frame would stay 46rem (sized for the old 2-col form)
   while the form itself renders narrower inside it, off-center. */
/* Artifact: the write-review dialog IS the white card - the shadow/radius/fill
   live here so BOTH the form and the thank-you state (siblings inside) sit on
   one clean white surface; the stepped form above is transparent padding. */
.aqeltech-unifiedreviews__modal-dialog--centered {
    max-width: 553px;
    background: #fff;
    box-shadow: 0 1px 2px rgba(20, 45, 80, .06), 0 12px 28px -20px rgba(20, 45, 80, .25);
}
.aqeltech-unifiedreviews__modal-dialog--centered .aqeltech-unifiedreviews__thankyou { padding: 2rem 2.6rem 2.25rem; }

/* Footer: hairline-topped Cancel (left, muted text button) + Submit (right,
   auto-width deep-blue pill). Submit is disabled at opacity .55 until all three
   criteria ratings are set (core.js's submit gate toggles [disabled]). */
.aqeltech-unifiedreviews__form-foot {
    display: flex;
    align-items: center;
    gap: .75rem;
    margin-top: .25rem;
    padding-top: 1.25rem;
    border-top: 1px solid var(--aqr-line);
}
.aqeltech-unifiedreviews__form-cancel {
    background: none;
    border: 0;
    padding: .5rem .25rem;
    font: inherit;
    font-size: .8125rem;
    font-weight: 600;
    color: var(--aqr-muted);
    cursor: pointer;
    transition: color .15s var(--aqr-ease);
}
.aqeltech-unifiedreviews__form-cancel:hover { color: var(--aqr-ink); }
.aqeltech-unifiedreviews__form-cancel:focus-visible { outline: 2px solid var(--aqr-accent); outline-offset: 2px; border-radius: var(--aqr-radius-sm); }
.aqeltech-unifiedreviews__form-foot .aqeltech-unifiedreviews__form-submit {
    width: auto;
    margin-left: auto;
    padding: .6875rem 1.5rem;
    font-size: .875rem;
    font-weight: 600;
    color: #fff;
    background: var(--aqr-accent);
    box-shadow: none;
}
.aqeltech-unifiedreviews__form-foot .aqeltech-unifiedreviews__form-submit:hover { background: var(--aqr-accent-dark); color: #fff; }
.aqeltech-unifiedreviews__form-foot .aqeltech-unifiedreviews__form-submit[disabled] {
    opacity: .55;
    cursor: not-allowed;
    background: var(--aqr-accent);
    color: #fff;
    transform: none;
}
.aqeltech-unifiedreviews__form--stepped .aqeltech-unifiedreviews__form-status { margin: .75rem 0 0; }
.aqeltech-unifiedreviews__form--stepped .aqeltech-unifiedreviews__form-status:empty { margin: 0; }

.aqeltech-unifiedreviews__modal-close {
    position: absolute;
    top: .9rem;
    right: .9rem;
    z-index: 2;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.1rem;
    height: 2.1rem;
    padding: 0;
    color: var(--aqr-muted);
    background: var(--aqr-surface);
    border: 1px solid var(--aqr-line);
    border-radius: 999px;
    cursor: pointer;
    transition: background-color .16s var(--aqr-ease), color .16s var(--aqr-ease);
}
.aqeltech-unifiedreviews__modal-close:hover,
.aqeltech-unifiedreviews__modal-close:focus-visible {
    color: var(--aqr-err);
    background: var(--aqr-panel);
    outline: none;
}
.aqeltech-unifiedreviews__modal-close svg { width: 16px; height: 16px; }

/* ── Report-a-review MODAL (Wave 2) ───────────────────────────────────────
   Reuses .aqeltech-unifiedreviews__modal/-overlay/-dialog/-close AND
   .aqeltech-unifiedreviews__form/-title/-field/-label/-input/-status
   verbatim from the write-review modal above - same [hidden] handling,
   same focus-trap engine, same tokens; only the report-specific CONTENT
   below (reason fieldset, counter, Cancel/Submit row) is new. Narrower
   than the write-review dialog (46rem) since a reason list + one textarea
   needs far less width - single-column, not the 2-col form grid. ────── */
.aqeltech-unifiedreviews__report-dialog { max-width: 32rem; }

.aqeltech-unifiedreviews__report-form {
    grid-template-columns: 1fr;
    max-width: none;
}

.aqeltech-unifiedreviews__report-reasons {
    grid-column: 1 / -1;
    display: flex;
    flex-direction: column;
    gap: .5rem;
    margin: 0;
    padding: 0;
    border: 0;
}

.aqeltech-unifiedreviews__report-reasons legend { padding: 0; margin-bottom: .2rem; }

.aqeltech-unifiedreviews__report-reason {
    display: flex;
    align-items: center;
    gap: .55rem;
    padding: .5rem .7rem;
    background: var(--aqr-surface);
    border: 1.5px solid var(--aqr-line);
    border-radius: var(--aqr-radius-sm);
    font-size: .92rem;
    color: var(--aqr-ink);
    cursor: pointer;
    transition: border-color .16s var(--aqr-ease), background-color .16s var(--aqr-ease);
}

.aqeltech-unifiedreviews__report-reason:has(input:checked) {
    border-color: var(--aqr-accent);
    background: var(--aqr-accent-soft);
}

.aqeltech-unifiedreviews__report-reason:has(input:focus-visible) {
    outline: 3px solid var(--aqr-accent-soft);
    outline-offset: 1px;
}

.aqeltech-unifiedreviews__report-reason input {
    width: 1.1rem;
    height: 1.1rem;
    flex: none;
    accent-color: var(--aqr-accent);
}

.aqeltech-unifiedreviews__report-counter {
    align-self: flex-end;
    font-size: .8rem;
    color: var(--aqr-muted);
    font-variant-numeric: tabular-nums;
}

.aqeltech-unifiedreviews__report-actions {
    grid-column: 1 / -1;
    display: flex;
    align-items: center;
    gap: .75rem;
}

.aqeltech-unifiedreviews__report-cancel {
    background: none;
    color: var(--aqr-muted);
    border: 1.5px solid var(--aqr-line-2);
    padding: .78rem 1.4rem;
    font-size: 1rem;
    font-weight: 600;
    border-radius: var(--aqr-radius-pill);
    cursor: pointer;
    transition: color .15s var(--aqr-ease), border-color .15s var(--aqr-ease), background-color .15s var(--aqr-ease);
}

.aqeltech-unifiedreviews__report-cancel:hover { color: var(--aqr-ink); border-color: var(--aqr-accent); background: var(--aqr-surface); }
.aqeltech-unifiedreviews__report-cancel:focus-visible { outline: 3px solid var(--aqr-accent-soft); outline-offset: 2px; }

/* The Submit button reuses .aqeltech-unifiedreviews__form-submit as-is
   (same gold-fill CTA as "Submit review") - its `grid-column: 1 / -1;
   justify-self: start` is harmless here since .report-actions (also
   grid-column: 1/-1) is itself a flex row, not a grid, so Submit simply
   flows after Cancel with no extra sizing side effects. */

/* ── Drag-and-drop dropzone (Fix 3; Wave 6: unified photo+video) ─────────
   The <label> (data-role="review-media-dropzone" as of Wave 6 - was two
   separate review-photo-dropzone/review-video-dropzone labels) keeps
   native click-to-browse with zero JS; the real <input type=file> is
   stretched over it at opacity:0 (still focusable/keyboard-operable - Tab
   + Enter/Space opens the native picker) so only the icon + hint text are
   visible, matching the Organic surface tokens. ─────────────────────────── */
.aqeltech-unifiedreviews__dropzone {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: .5rem;
    min-height: 5.5rem;
    padding: 1rem 1.2rem;
    text-align: center;
    background: var(--aqr-surface);
    border: 1.5px dashed var(--aqr-line-2);
    border-radius: var(--aqr-radius-sm);
    cursor: pointer;
    transition: border-color .16s var(--aqr-ease), background-color .16s var(--aqr-ease);
}
.aqeltech-unifiedreviews__dropzone:hover,
.aqeltech-unifiedreviews__dropzone.is-dragover {
    border-color: var(--aqr-accent);
    background: var(--aqr-accent-soft);
}
.aqeltech-unifiedreviews__dropzone:has(.aqeltech-unifiedreviews__dropzone-input:focus-visible) {
    outline: 2px solid var(--aqr-accent);
    outline-offset: 2px;
}
.aqeltech-unifiedreviews__dropzone-input {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    margin: 0;
    padding: 0;
    opacity: 0;
    cursor: pointer;
}
.aqeltech-unifiedreviews__dropzone-hint {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: .35rem;
    color: var(--aqr-muted);
    pointer-events: none;
}
.aqeltech-unifiedreviews__dropzone-hint svg { color: var(--aqr-accent); }
.aqeltech-unifiedreviews__dropzone-copy { font-size: .85rem; font-weight: 600; }

/* Artifact (Photos & videos step): a single dashed DROPZONE CARD - camera +
   video icons, a bold drag line, a muted caps line, and a solid deep-blue
   "Browse files" pill, all inside the same
   <label data-role="review-media-dropzone"> + overlaid
   <input data-role="review-media-input"> the JS routes by MIME. */
.aqeltech-unifiedreviews__dropzone--card {
    flex-direction: column;
    min-height: 0;
    padding: 1.375rem;
    align-self: stretch;
    background: #f4f6fa;
    border: 1px dashed var(--aqr-line-2);
    border-radius: 9px;
}
.aqeltech-unifiedreviews__dropzone--card .aqeltech-unifiedreviews__dropzone-hint {
    gap: .5rem;
    color: var(--aqr-ink);
}
.aqeltech-unifiedreviews__dropzone-icons {
    display: inline-flex;
    align-items: center;
    gap: .625rem;
    color: var(--aqr-ink);
}
.aqeltech-unifiedreviews__dropzone-title {
    font-size: .9375rem;
    font-weight: 600;
    color: var(--aqr-ink);
}
.aqeltech-unifiedreviews__dropzone-sub {
    font-size: .78125rem;
    font-weight: 400;
    color: var(--aqr-muted);
}
.aqeltech-unifiedreviews__dropzone-browse {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    margin-top: .375rem;
    padding: .5625rem 1.5rem;
    font-size: .84375rem;
    font-weight: 600;
    color: #fff;
    background: var(--aqr-accent);
    border-radius: var(--aqr-radius-pill);
}
.aqeltech-unifiedreviews__dropzone--card:hover .aqeltech-unifiedreviews__dropzone-browse,
.aqeltech-unifiedreviews__dropzone--card.is-dragover .aqeltech-unifiedreviews__dropzone-browse {
    background: var(--aqr-accent-dark);
}

/* Caps counters below the dropzone ("0 OF 6 PHOTOS / 0 OF 3 VIDEOS"). */
.aqeltech-unifiedreviews__form-media-counts {
    display: flex;
    flex-wrap: wrap;
    gap: 1.25rem;
    margin-top: .25rem;
}
.aqeltech-unifiedreviews__form-media-count {
    font-size: .71875rem;
    font-weight: 700;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--aqr-muted);
}

/* Wave 6 - unified dropzone: renderPhotoPreview()/renderVideoPreview()
   still independently clear+rebuild only their OWN [data-role="review-
   photo-preview"]/[data-role="review-video-preview"] span's children
   (unchanged) - display:contents unwraps each span's own box so those
   children flow into ONE shared flex row on the wrapping
   [data-role="review-media-preview-row"] span, giving a single unified
   preview line (photo thumbs + video thumbs with their play badge) without
   touching either render function. */
.aqeltech-unifiedreviews__form-preview-row {
    display: flex;
    flex-wrap: wrap;
    gap: .5rem;
}
.aqeltech-unifiedreviews__form-preview-row .aqeltech-unifiedreviews__form-preview {
    display: contents;
}

.aqeltech-unifiedreviews__form-preview-item {
    position: relative;
    display: inline-flex;
    line-height: 0;
}
.aqeltech-unifiedreviews__form-preview-item img,
.aqeltech-unifiedreviews__form-preview-item video {
    display: block;
    width: 72px;
    height: 72px;
    object-fit: cover;
    border-radius: var(--aqr-radius-thumb);
    border: 1px solid var(--aqr-line);
}
/* Wave 5, Part 2 - video preview items get a gold-accent border (echoes
   the gallery/card play-badge's video signal without reusing gold as a
   fill - see review-lightbox.css's fill-safety comment on .media-play__c)
   plus a small duration readout under the thumb, populated once the
   browser decodes the local blob's metadata (core.js's renderVideoPreview()). */
.aqeltech-unifiedreviews__form-preview-item--video video {
    border: 2px solid var(--aqr-accent-strong);
}
.aqeltech-unifiedreviews__form-preview-duration {
    display: block;
    margin-top: .2rem;
    font-size: .7rem;
    color: var(--aqr-muted);
    text-align: center;
    font-variant-numeric: tabular-nums;
}
.aqeltech-unifiedreviews__form-preview-remove {
    position: absolute;
    top: -.4rem;
    right: -.4rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.3rem;
    height: 1.3rem;
    padding: 0;
    font-size: .85rem;
    line-height: 1;
    color: #fff;
    background: var(--aqr-err);
    border: 2px solid var(--aqr-surface);
    border-radius: 999px;
    cursor: pointer;
}
.aqeltech-unifiedreviews__form-preview-remove:hover { background: #931414; }

/* Lightbox (#review-lightbox, reviews/lightbox.phtml) is NOT styled in this
   file - it is a separate real partial styled by Breeze's own
   review-lightbox.css (loaded via aqeltech_unifiedreviews_breeze_assets.xml),
   which this redesign also re-skins. See that file for the Organic pass. */

/* ── Responsive: single consolidated mobile breakpoint ────────────────────
   The Organic v4.3 mockup's frame-scoped `.aqr-frame--mobile` overrides
   collapse here into one real @media rule (rather than the v3 file's split
   900px/768px breakpoints): the v4.1/v4.2 mockup revision notes repeatedly
   key the aggregate mobile-collapse fix specifically to 768px, and a split
   breakpoint would produce a broken intermediate viewport (768-900px) where
   the summary is already in compact mobile mode while the card grid is
   still multi-column desktop mode. Consolidating avoids that and matches
   both tested viewports (1280 desktop / 390 mobile) either way. ────────── */
@media (max-width: 768px) {
    /* Editorial (Wave 7): the masthead stacks to ONE column under the
       double rule - same top-hairline-between-sections treatment the
       "sided" desktop sidebar variant already uses (see .__aggregate--sided
       above), full score -> breakdown -> mentions, nothing merged/hidden. */
    .aqeltech-unifiedreviews__aggregate {
        grid-template-columns: 1fr;
        row-gap: .875rem;
        padding: 0;
    }
    .aqeltech-unifiedreviews__aggregate-score {
        grid-column: 1; grid-row: 1;
        border-left: 0; padding-left: 0; margin-left: 0;
        gap: 0; min-height: 0;
    }
    .aqeltech-unifiedreviews__aggregate-avg { font-size: 2.6rem; }
    .aqeltech-unifiedreviews__aggregate-distribution-lab {
        display: block;
        grid-column: 1; grid-row: 2;
        border-left: 0; padding-left: 0; margin-left: 0;
        border-top: 0;
        padding-top: 0; margin-top: 0;
    }
    .aqeltech-unifiedreviews__aggregate-distribution { grid-column: 1; grid-row: 3; align-self: auto; min-height: 0; }
    .aqeltech-unifiedreviews__aggregate-bar-label { font-size: .8rem; }
    .aqeltech-unifiedreviews__aggregate-bar-count { font-size: .74rem; }
    .aqeltech-unifiedreviews__aggregate-mentions-lab {
        grid-column: 1; grid-row: 4;
        border-left: 0; padding-left: 0; margin-left: 0;
        border-top: 1px solid var(--aqr-line-2);
        padding-top: 1.3rem; margin-top: 1.3rem;
    }
    .aqeltech-unifiedreviews__aggregate-mentions-list { grid-column: 1; grid-row: 5; flex-wrap: wrap; overflow: visible; }
    .aqeltech-unifiedreviews__aggregate-mention-row { flex: initial; }
    .aqeltech-unifiedreviews__aggregate-quote { grid-column: 1; grid-row: 6; margin-top: 1rem; padding: .8rem .9rem; }
    .aqeltech-unifiedreviews__aggregate-quote-text { font-size: .9rem; }

    /* list_layout: multi-column grids collapse to one column below 768px -
       a 2-or-3 column grid at this width would produce unreasonably narrow
       cards; NOT present in the mockup (its mobile/desktop panes are
       separate DOM instances that never had to solve this), added here for
       the real single-page responsive contract. */
    .aqeltech-unifiedreviews__list--grid-2,
    .aqeltech-unifiedreviews__list--grid-3 { grid-template-columns: 1fr; }

    /* summary_layout: sided safety net - a fixed 320px sidebar would leave
       ~70px for main content at 390w. Not demonstrated in the mockup
       (never shown at mobile width); collapses to a single stacked column,
       matching every other multi-column feature in this file having a
       mobile fallback. Desktop "sided" behaviour is completely unaffected. */
    .aqeltech-unifiedreviews__body--sided { grid-template-columns: 1fr; }
    .aqeltech-unifiedreviews__sidebar { position: static; }

    .aqeltech-unifiedreviews__card { grid-template-columns: 1fr; }
    .aqeltech-unifiedreviews__card-meta { flex-flow: row wrap; align-items: center; gap: .5rem .75rem; }
    .aqeltech-unifiedreviews__card-meta-row { padding-right: 0; }
    .aqeltech-unifiedreviews__guest { grid-template-columns: 1fr; gap: 1.4rem; padding: 1.5rem 1.6rem; }
    /* Artifact: the write-review modal fills the phone as a single-column,
       full-height bottom SHEET (its steps already stack); the footer pins to
       the bottom of the scroll area. */
    .aqeltech-unifiedreviews__modal:has(.aqeltech-unifiedreviews__modal-dialog--centered) {
        align-items: flex-end;
        padding: 0;
    }
    .aqeltech-unifiedreviews__modal-dialog--centered {
        max-width: 100%;
        max-height: 94vh;
        border-radius: 16px 16px 0 0;
    }
    .aqeltech-unifiedreviews__form--stepped { padding: 1.5rem 1.25rem 1.25rem; }
    .aqeltech-unifiedreviews__modal-dialog--centered .aqeltech-unifiedreviews__thankyou { padding: 1.75rem 1.25rem 2rem; }
    .aqeltech-unifiedreviews__form-foot {
        position: sticky;
        bottom: 0;
        margin: .25rem -1.25rem 0;
        padding: 1rem 1.25rem;
        background: #fff;
    }
    .aqeltech-unifiedreviews__filters { margin-left: 0; width: 100%; }
    .aqeltech-unifiedreviews__pager-link--prev .aqeltech-unifiedreviews__pager-text,
    .aqeltech-unifiedreviews__pager-link--next .aqeltech-unifiedreviews__pager-text { display: none; }

    /* Fix 3: modal fills more of the narrow viewport rather than keeping
       the desktop 1.5rem outer gutter. */
    .aqeltech-unifiedreviews__modal { padding: .75rem; }
    .aqeltech-unifiedreviews__modal-dialog { max-height: calc(100vh - 1.5rem); }
}

@media (prefers-reduced-motion: reduce) {
    .aqeltech-unifiedreviews *,
    .aqeltech-unifiedreviews *::before,
    .aqeltech-unifiedreviews *::after {
        transition: none !important;
    }
}

/* ==========================================================================
   Wave 10b - Order-View "write a review" prompt.

   Rendered under the customer's order detail page (sales_order_view) by
   Block\Order\ReviewPrompt / templates/order/review-prompt.phtml. A single
   Organic surface card listing eligible line-item products, each with the
   shared .__write-review-btn pill (styled above) as its CTA. Tokens only -
   theme font throughout (--aqr-font-display inherits), no custom font.
   ========================================================================== */
.aqeltech-unifiedreviews__order-prompt {
    margin: 1.75rem 0 0;
    padding: 1.4rem 1.5rem;
    background: var(--aqr-surface);
    border: 1px solid var(--aqr-line);
    border-radius: var(--aqr-radius);
    box-shadow: var(--aqr-shadow);
    color: var(--aqr-body);
    font: inherit;
}

.aqeltech-unifiedreviews__order-prompt-head {
    margin-bottom: 1.1rem;
}

.aqeltech-unifiedreviews__order-prompt-title {
    margin: 0 0 .35rem;

    font-size: 1.25rem;
    font-weight: 700;
    line-height: 1.2;
    color: var(--aqr-ink);
}

.aqeltech-unifiedreviews__order-prompt-intro {
    margin: 0;
    font-size: .9rem;
    color: var(--aqr-muted);
}

.aqeltech-unifiedreviews__order-prompt-list {
    margin: 0;
    padding: 0;
    list-style: none;
}

.aqeltech-unifiedreviews__order-prompt-item {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: .75rem 1.25rem;
    padding: .9rem 0;
    border-top: 1px solid var(--aqr-line-2);
}

.aqeltech-unifiedreviews__order-prompt-item:first-child {
    border-top: 0;
    padding-top: 0;
}

.aqeltech-unifiedreviews__order-prompt-name {
    flex: 1 1 12rem;
    min-width: 0;
    font-size: .95rem;
    font-weight: 600;
    color: var(--aqr-ink);
}

.aqeltech-unifiedreviews__order-prompt-cta {
    flex: 0 0 auto;
    text-decoration: none;
}

/* LayoutPreview follow-up: `star_style` = boxed. Applied to the STATIC
   .form-criteria-group wrapper (_form.phtml) rather than the JS-generated
   .form-stars group itself (initCriteriaStars() in core.js is out of scope
   here), so this targets the .form-star buttons as a descendant selector -
   each star glyph sits inside its own filled, rounded square instead of the
   plain unboxed glyph above. !important on background/padding matches this
   file's existing precedent (see .form-star's own comment) for winning
   against Swissup Breeze's "label button" reset. */
.aqeltech-unifiedreviews__form-stars--boxed .aqeltech-unifiedreviews__form-star {
    display: inline-flex !important;
    align-items: center;
    justify-content: center;
    width: 2.25rem;
    height: 2.25rem;
    padding: 0 !important;
    background: var(--aqr-track) !important;
    border: 1px solid var(--aqr-line);
    border-radius: var(--aqr-radius-sm);
}

.aqeltech-unifiedreviews__form-stars--boxed .aqeltech-unifiedreviews__form-star.is-active {
    background: var(--aqr-accent-soft) !important;
    border-color: var(--aqr-accent-strong);
}

/* ==========================================================================
   COMPANY REVIEWS WIDGET (CMS embed) - widget/company-reviews.phtml
   --------------------------------------------------------------------------
   Deliberately lives in THIS file, not in breeze/company-page.css: that
   stylesheet is pulled in by the company page's own layout handle only, so a
   widget dropped on an arbitrary CMS page would never receive it. This file
   is loaded site-wide by breeze_default.xml.

   Nothing here re-styles an existing component: the badge is a plain
   `.aqr-card` and every value inside it is an existing `__aggregate-*`. All
   this adds is the compact horizontal arrangement the embed needs (the page's
   own score card is a stretched column in a 3-up grid, which reads as dead
   space when it stands alone) plus one specificity repair, below.
   ========================================================================== */
.aqeltech-unifiedreviews__widget-company { margin: 0 0 1.5rem; }

/* Needs the .aqeltech-unifiedreviews ancestor prefix to reach the (0,2,0)
   specificity of the shared ".aqeltech-unifiedreviews .aqr-card" rule it
   sits beside - a bare single-class selector would lose that fight on
   `display` regardless of source order.

   width:fit-content is what makes this a BADGE rather than a full-bleed
   panel: a block-level flex container would stretch to the CMS column and
   trail ~700px of dead white to the right of the score. max-width keeps it
   from ever exceeding its container, and flex-wrap still collapses it to a
   stack when the container is too narrow for one row. */
.aqeltech-unifiedreviews .aqeltech-unifiedreviews__widget-badge {
    display: flex;
    flex-flow: row wrap;
    align-items: center;
    gap: .5rem 1.75rem;
    width: fit-content;
    max-width: 100%;
    margin: 0 0 1rem;
}

/* min-width:0 on both columns: without it the flex items refuse to shrink
   below their content width and the badge overflows its container at narrow
   widths instead of wrapping. */
.aqeltech-unifiedreviews__widget-badge-score,
.aqeltech-unifiedreviews__widget-badge-meta {
    display: flex;
    flex-direction: column;
    gap: .2rem;
    min-width: 0;
}

.aqeltech-unifiedreviews__widget-foot { margin: 0; }

/* Specificity repair, and the reason this embed cannot just inherit the pill.
   The theme's CMS prose rule -
     :where(.cms-no-route, .cms-page-view) .main :where(a:not(...):not(.action))
   - repaints every <a> inside CMS content with the prose link colour. Its
   :where() parts contribute nothing, so it computes to (0,1,0): the SAME
   specificity as the shared `.aqeltech-unifiedreviews__write-review-btn`
   rule, and default.css loads after this file, so source order handed it the
   win. Measured live: the CTA rendered rgba(29,78,216,.85) on the pill's own
   rgb(1,78,131) fill - navy text on navy, effectively unreadable. Nothing is
   wrong on the company page (its body class is not .cms-page-view), which is
   exactly why this only shows up on the embed.

   (0,2,0) via the widget-scope ancestor wins on specificity rather than order,
   and is scoped to this widget so no other surface's link colour moves.
   :visited is included because the theme's rule matches it too. */
.aqeltech-unifiedreviews__widget-company .aqeltech-unifiedreviews__write-review-btn,
.aqeltech-unifiedreviews__widget-company .aqeltech-unifiedreviews__write-review-btn:link,
.aqeltech-unifiedreviews__widget-company .aqeltech-unifiedreviews__write-review-btn:visited,
.aqeltech-unifiedreviews__widget-company .aqeltech-unifiedreviews__write-review-btn:hover,
.aqeltech-unifiedreviews__widget-company .aqeltech-unifiedreviews__write-review-btn:focus-visible {
    color: #fff;
}
