/* ==========================================================================
   Japonic Trade — v2 stylesheet
   Lean, single file, no framework dependency (no Bootstrap/jQuery).
   ========================================================================== */

:root {
  --navy-900: #0b1626;
  --navy-800: #10203a;
  --navy-700: #16294a;
  --blue-500: #2f6fed;
  --blue-400: #5490ff;
  --gold-500: #e3ab41;
  --gold-400: #f0c46a;
  --gray-50: #f7f8fa;
  --gray-100: #eef1f5;
  --gray-300: #d5dbe3;
  --gray-500: #7c8798;
  --gray-700: #3c4757;
  --white: #ffffff;
  --danger: #e04b4b;
  --success: #2fb380;
  --radius-sm: 8px;
  --radius-md: 14px;
  --radius-lg: 22px;
  --shadow-sm: 0 2px 8px rgba(11, 22, 38, 0.08);
  --shadow-md: 0 8px 24px rgba(11, 22, 38, 0.12);
  --shadow-lg: 0 20px 48px rgba(11, 22, 38, 0.18);
  --container: 1180px;
  --font: "Inter", "Segoe UI", -apple-system, BlinkMacSystemFont, Roboto, Helvetica, Arial, sans-serif;

  /* Theme-aware tokens. These are the ones component rules should use for
     page/card backgrounds and body text so light/dark/system switching
     works site-wide from one place. --white/--gray-* above stay as raw
     color constants (still used directly for things that must always be
     white/light regardless of theme, like text sitting on the permanently
     dark navy header/hero/footer). */
  --page-bg: var(--white);
  --surface: var(--white);
  --surface-alt: var(--gray-50);
  --text-body: var(--gray-700);
  --text-muted: var(--gray-500);
  --heading-color: var(--navy-900);
  --border-subtle: var(--gray-100);
  --border-default: var(--gray-300);

  /* Custom <select> dropdown arrow, drawn the same way in every browser
     instead of each OS's own native chrome (which renders at very
     different widths/heights across platforms and was the main reason
     selects looked "off" next to plain text/number fields in the search
     filter bars). Shared as one variable so every filter bar references
     the same artwork instead of duplicating the data URI. */
  --select-arrow: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath fill='%237c8798' d='M5.5 7.5l4.5 4.5 4.5-4.5' stroke='%237c8798' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}

/* Dark theme — activated by [data-theme="dark"] on <html>, set from
   assets/js/theme.js (persisted choice, or "system" following the OS). */
[data-theme="dark"] {
  --page-bg: #0b1220;
  --surface: #141d30;
  --surface-alt: #0f1728;
  --text-body: #d7dce6;
  --text-muted: #8b96ab;
  --heading-color: #f2f4f8;
  --border-subtle: rgba(255, 255, 255, 0.08);
  --border-default: rgba(255, 255, 255, 0.16);
  --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.28);
  --shadow-md: 0 8px 24px rgba(0, 0, 0, 0.34);
  --shadow-lg: 0 20px 48px rgba(0, 0, 0, 0.45);
  --select-arrow: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath fill='%238b96ab' d='M5.5 7.5l4.5 4.5 4.5-4.5' stroke='%238b96ab' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  color-scheme: dark;
}

* { box-sizing: border-box; }
/* Stop Safari's automatic text-size-adjust ("font boosting"): on both
   iOS and macOS Safari (never Chrome — this is a WebKit-only property/
   behavior), text-dense multi-column layouts can have the browser
   silently inflate font sizes after load to "improve readability" —
   with everything sized in em/rem off that base, the whole page
   (nav, sidebar tables, gallery) appears to grow together, with no
   touch, scroll, or pinch involved. This is very likely what's behind
   the my-car-details.php "page zooms by itself on open" report, since
   that page is unusually text/table-heavy (5 stacked info-card tables)
   and the report reproduces on both Mac and iPhone Safari but never
   Chrome. Fixing the adjustment ratio to 100% does NOT touch pinch-zoom
   or any other accessibility zoom — those are controlled by the
   viewport meta tag and the browser's native zoom gesture, both left
   alone (see the iOS-input-zoom and native-pinch-zoom fixes below/in
   main.js). */
html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; text-size-adjust: 100%; }

/* Suppress the native up/down spin-button control on every number input
   site-wide (bid amount, year/mileage/score filters, admin vehicle
   fields — all typed directly, none used as counters). Left alone,
   that control renders as its own little shadow-DOM box
   (::-webkit-inner-spin-button) squeezed against the text portion,
   which at narrow field widths reads as two separate boxes rather than
   one input. -webkit-appearance:none on the pseudo-elements alone can
   still leave that box's reserved space in some Chrome/Edge versions,
   so it's paired with display:none to fully collapse it, and Firefox's
   built-in stepper is dropped the same way via -moz-appearance. */
input[type="number"] {
  -moz-appearance: textfield;
}
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button {
  -webkit-appearance: none;
  appearance: none;
  margin: 0;
  display: none;
}

.skip-link {
  position: fixed;
  top: 12px;
  left: 12px;
  z-index: 99999;
  padding: 10px 14px;
  border-radius: 8px;
  background: var(--surface);
  color: var(--heading-color);
  font-weight: 700;
  box-shadow: 0 8px 28px rgba(0, 0, 0, .22);
  transform: translateY(-150%);
  transition: transform .2s ease;
}
.skip-link:focus { transform: translateY(0); }

body {
  margin: 0;
  font-family: var(--font);
  color: var(--text-body);
  background: var(--page-bg);
  transition: background-color .2s ease, color .2s ease;
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
}

img { max-width: 100%; display: block; }
a { text-decoration: none; color: inherit; }
ul { list-style: none; margin: 0; padding: 0; }
button { font-family: inherit; cursor: pointer; }

.container {
  width: 100%;
  max-width: var(--container);
  margin: 0 auto;
  padding: 0 24px;
}

.section {
  padding: 88px 0;
}

.section-tight { padding: 56px 0; }

.eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--blue-500);
  margin-bottom: 14px;
}

.eyebrow::before {
  content: "";
  width: 22px;
  height: 2px;
  background: var(--gold-500);
  display: inline-block;
}

.section-head {
  max-width: 640px;
  margin: 0 0 48px;
}

.section-head.center { margin-left: auto; margin-right: auto; text-align: center; }

.section-head h2 {
  font-size: clamp(28px, 3.4vw, 40px);
  line-height: 1.2;
  color: var(--heading-color);
  margin: 0 0 14px;
  font-weight: 800;
}

.section-head p {
  font-size: 16px;
  line-height: 1.7;
  color: var(--text-muted);
  margin: 0;
}

/* ---------- Page header banner (secondary pages) ----------
   Was a full-bleed edge-to-edge band (padding: 88px 0 68px, 52px h1) —
   that worked as a one-off landing-style banner, but now that it's
   sticky (see below) it stayed on screen permanently, so both its
   height AND its full-viewport width made it feel oversized. The
   gradient/glow/rounded-corner treatment now lives on an inner card
   (.page-hero .container) sized to the normal content width instead of
   the outer <section>, so the banner reads as a compact card rather
   than a large full-width strip; the outer section itself only
   contributes a little breathing-room padding. Every page using
   .page-hero (deposits.php, my-bids.php, incomes.php, etc.) picks this
   up automatically — no per-page change needed.

   Sticky, stacked right below the header + account sub-nav
   (--jt-sticky-2, measured by assets/js/main.js) so a member scrolling
   a long list always keeps sight of which page they're on, matching
   the header and sub-nav's own sticky behavior instead of scrolling
   away with the list beneath it.

   No top padding on the outer section — it used to leave a sliver of
   transparent space between the sub-nav and the hero card, through
   which the scrolling list underneath would flash as the page
   scrolled (looked like a glitch). The card now sits flush against
   the sub-nav (square top corners, rounded only at the bottom) so the
   two read as one continuous sticky block instead of a floating card
   with a gap above it. */
.page-hero {
  background: transparent;
  color: var(--white);
  text-align: center;
  padding: 0 0 14px;
  position: sticky;
  top: var(--jt-sticky-2, 78px);
  z-index: 480;
}
.page-hero .container {
  position: relative;
  z-index: 1;
  background: linear-gradient(135deg, var(--navy-900), var(--navy-700));
  border-radius: 0 0 var(--radius-lg) var(--radius-lg);
  box-shadow: var(--shadow-lg);
  padding: 22px 32px;
  overflow: hidden;
}
.page-hero .container::before {
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(60% 100% at 50% 0%, rgba(240,196,106,0.14), transparent 70%);
  pointer-events: none;
}
.page-hero .eyebrow,
.page-hero h1,
.page-hero p,
.page-hero .hero-ctas { position: relative; z-index: 1; }
.page-hero .eyebrow { color: var(--gold-400); justify-content: center; }
.page-hero .eyebrow::before { background: var(--gold-400); }
.page-hero h1 {
  color: var(--white);
  font-size: clamp(24px, 3vw, 34px);
  font-weight: 800;
  line-height: 1.15;
  margin: 0 0 8px;
  text-wrap: balance;
}
.page-hero p {
  color: rgba(255, 255, 255, 0.78);
  max-width: 560px;
  margin: 0 auto;
  font-size: 15px;
  line-height: 1.6;
}
.page-hero .hero-ctas { justify-content: center; margin-top: 14px; }
@media (max-width: 600px) {
  .page-hero { padding: 0 0 10px; }
  .page-hero .container { padding: 18px 20px; border-radius: 0 0 var(--radius-md) var(--radius-md); }
  .page-hero .hero-ctas { flex-direction: column; }
  .page-hero .hero-ctas .btn { width: 100%; }
}

/* ---------- Buttons ---------- */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  padding: 13px 26px;
  border-radius: 999px;
  font-weight: 600;
  font-size: 15px;
  border: 1px solid transparent;
  transition: transform 0.15s ease, box-shadow 0.15s ease, background 0.15s ease, color 0.15s ease;
  white-space: nowrap;
}
.btn:active { transform: translateY(1px); }

.btn-primary {
  background: linear-gradient(135deg, var(--blue-500), #1c4fc4);
  color: var(--white);
  box-shadow: 0 10px 24px rgba(47, 111, 237, 0.35);
}
.btn-primary:hover { box-shadow: 0 14px 30px rgba(47, 111, 237, 0.45); transform: translateY(-1px); }

.btn-gold {
  background: linear-gradient(135deg, var(--gold-400), var(--gold-500));
  color: var(--navy-900);
  box-shadow: 0 10px 24px rgba(227, 171, 65, 0.35);
}
.btn-gold:hover { box-shadow: 0 14px 30px rgba(227, 171, 65, 0.45); transform: translateY(-1px); }

.btn-ghost {
  background: rgba(255, 255, 255, 0.08);
  color: var(--white);
  border-color: rgba(255, 255, 255, 0.35);
  backdrop-filter: blur(6px);
}
.btn-ghost:hover { background: rgba(255, 255, 255, 0.18); }

/* Hero's secondary CTA ("Create Member Account") next to the gold
   "Member Sign In" button — plain white ghost text read as an
   afterthought sitting beside a solid gold button. Recoloring it to
   the same gold used by .btn-gold (text + a gold-tinted border/hover
   instead of plain white) ties the pair together as one deliberate
   two-tier choice — solid gold for the primary action, gold-outline
   for the secondary — rather than "important button + generic button".
   Scoped to .hero-ctas only so every other .btn-ghost site-wide (nav
   menu items, filter-bar Reset, etc.) keeps its original neutral look. */
.hero-ctas .btn-ghost {
  color: var(--gold-400);
  border-color: rgba(240, 196, 106, 0.45);
}
.hero-ctas .btn-ghost:hover {
  background: rgba(240, 196, 106, 0.12);
  border-color: rgba(240, 196, 106, 0.7);
}

.btn-outline {
  /* Was color: var(--navy-800); border-color: var(--gray-300) — both raw,
     theme-fixed colors (not the theme-aware tokens defined at the top of
     this file), so in dark mode the text stayed near-black on a
     near-black background: unreadable. --heading-color/--border-default
     flip to light values under [data-theme="dark"] automatically, fixing
     every .btn-outline button site-wide (including "Talk to Us" on the
     homepage), not just this one. */
  background: transparent;
  color: var(--heading-color);
  border-color: var(--border-default);
}
.btn-outline:hover { border-color: var(--blue-500); color: var(--blue-500); }

.btn-block { width: 100%; }
.btn-sm { padding: 9px 18px; font-size: 13px; }

/* ---------- Forced sign-out notice (single-device login) ---------- */
/* Shown by inc/nav.php at the very top of the page when a page loads
   with ?loggedout=1 — i.e. this device's session was just invalidated
   because the same account signed in on another device. See
   jt_user_session_is_current() (inc/db.php) and the check in
   inc/head.php for the mechanism. Same tinted-background pattern as
   .jt-notice-warn elsewhere in this file (color-mix over --warning),
   so it automatically adapts to dark mode with no separate override. */
.session-notice {
  background: color-mix(in srgb, var(--warning, #d97706) 14%, transparent);
  border-bottom: 1px solid color-mix(in srgb, var(--warning, #d97706) 35%, transparent);
  color: var(--heading-color);
  font-size: 13.5px;
  padding: 10px 0;
}
.session-notice-inner {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 16px;
  position: relative;
  text-align: center;
  padding-right: 28px;
}
.session-notice-close {
  position: absolute;
  right: 0;
  background: none;
  border: none;
  color: inherit;
  font-size: 20px;
  line-height: 1;
  cursor: pointer;
  padding: 0 4px;
}
.session-notice-close:hover { opacity: 0.7; }
/* Permanent scrape-ban logout notice (?accountbanned=1, inc/nav.php) —
   same component as .session-notice above, just tinted with --danger
   instead of --warning since this one isn't a routine event. */
.session-notice-danger {
  background: color-mix(in srgb, var(--danger, #e04b4b) 14%, transparent);
  border-bottom: 1px solid color-mix(in srgb, var(--danger, #e04b4b) 35%, transparent);
}

/* "Acting as {user} — Return to Admin" banner (inc/nav.php, shown while
   $_SESSION['jt_impersonate_admin_id'] is set — see
   api/admin-impersonate-start.php). Same layout skeleton as
   .session-notice above but deliberately sticky (not just top-of-page)
   and with no dismiss button -- unlike those one-off notices, this is
   the only on-page indicator that the current session isn't actually
   the admin's own, so it has to stay visible no matter how far down the
   page the admin scrolls, for as long as the impersonation lasts. */
.jt-impersonate-banner {
  position: sticky;
  top: 0;
  z-index: 60;
  background: color-mix(in srgb, var(--gold-500) 22%, var(--surface));
  border-bottom: 1px solid color-mix(in srgb, var(--gold-500) 45%, transparent);
  color: var(--heading-color);
  font-size: 13.5px;
  padding: 10px 0;
}
.jt-impersonate-banner-inner {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: 12px;
  text-align: center;
}

/* ---------- Top utility bar ---------- */
.topbar {
  background: var(--navy-900);
  color: rgba(255, 255, 255, 0.75);
  font-size: 12.5px;
}
.topbar .container {
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 38px;
}
.topbar-left { display: flex; align-items: center; gap: 8px; }
.topbar-left span { display: inline-flex; align-items: center; gap: 6px; }
.topbar-right { display: flex; align-items: center; gap: 18px; }
.jp-clock { font-variant-numeric: tabular-nums; color: var(--gold-400); font-weight: 600; }
.lang-switch { position: relative; }
.lang-current {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  background: rgba(255, 255, 255, 0.06);
  border: 1px solid rgba(255, 255, 255, 0.16);
  color: rgba(255, 255, 255, 0.85);
  font-size: 12.5px;
  font-weight: 600;
  padding: 5px 10px;
  border-radius: 999px;
  transition: background 0.18s ease, border-color 0.18s ease;
}
.lang-current:hover,
.lang-switch.is-open .lang-current {
  background: rgba(255, 255, 255, 0.14);
  border-color: rgba(255, 255, 255, 0.3);
}
.lang-current .lang-flag { font-size: 14px; line-height: 1; }
.lang-current .chev {
  font-size: 9px;
  opacity: 0.7;
  transition: transform 0.18s ease;
}
.lang-switch.is-open .lang-current .chev { transform: rotate(180deg); }

.lang-menu {
  position: absolute;
  top: calc(100% + 10px);
  right: 0;
  z-index: 9999;
  min-width: 190px;
  max-height: 480px;
  overflow-y: auto;
  background: var(--surface);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-lg);
  padding: 8px;
  display: grid;
  gap: 2px;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transform: translateY(8px);
  transition: opacity 0.18s ease, transform 0.18s ease, visibility 0.18s ease;
}
.lang-menu.is-open { opacity: 1; visibility: visible; pointer-events: auto; transform: translateY(0); }

/* On narrow screens, anchor the menu to the viewport instead of the small
   flag button so it always has room to show every language and stays
   easy to tap. */
@media (max-width: 560px) {
  .lang-menu {
    position: fixed;
    top: 44px;
    right: 12px;
    left: 12px;
    width: auto;
    max-height: min(70vh, 420px);
    grid-template-columns: 1fr 1fr;
  }
}

.lang-option {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  border: none;
  background: transparent;
  color: var(--text-body);
  font-size: 13.5px;
  font-weight: 500;
  text-align: left;
  padding: 9px 10px;
  border-radius: var(--radius-sm);
}
.lang-option .lang-flag { font-size: 15px; line-height: 1; }
.lang-option:hover { background: var(--surface-alt); color: var(--blue-500); }
.lang-option.is-active { background: rgba(47, 111, 237, 0.1); color: var(--blue-500); font-weight: 700; }

/* ---------- Appearance (light/dark/system) switch ---------- */
.theme-switch { position: relative; }
.theme-toggle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  height: 30px;
  background: rgba(255, 255, 255, 0.06);
  border: 1px solid rgba(255, 255, 255, 0.16);
  color: rgba(255, 255, 255, 0.85);
  border-radius: 50%;
  font-size: 13px;
  transition: background 0.18s ease, border-color 0.18s ease;
}
.theme-toggle:hover,
.theme-switch.is-open .theme-toggle {
  background: rgba(255, 255, 255, 0.14);
  border-color: rgba(255, 255, 255, 0.3);
}
.theme-icon { display: none; line-height: 1; }
[data-theme-pref="light"] .theme-icon-light,
[data-theme-pref="dark"] .theme-icon-dark,
[data-theme-pref="system"] .theme-icon-system {
  display: inline-block;
}

.theme-menu {
  position: absolute;
  top: calc(100% + 10px);
  right: 0;
  z-index: 9999;
  min-width: 150px;
  background: var(--surface);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-lg);
  padding: 8px;
  display: grid;
  gap: 2px;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transform: translateY(8px);
  transition: opacity 0.18s ease, transform 0.18s ease, visibility 0.18s ease;
}
.theme-menu.is-open { opacity: 1; visibility: visible; pointer-events: auto; transform: translateY(0); }

.theme-option {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  border: none;
  background: transparent;
  color: var(--text-body);
  font-size: 13.5px;
  font-weight: 500;
  text-align: left;
  padding: 9px 10px;
  border-radius: var(--radius-sm);
}
.theme-icon-inline { font-size: 15px; line-height: 1; }
.theme-option:hover { background: var(--surface-alt); color: var(--blue-500); }
.theme-option.is-active { background: rgba(47, 111, 237, 0.1); color: var(--blue-500); font-weight: 700; }

@media (max-width: 560px) {
  .theme-menu {
    position: fixed;
    top: 44px;
    right: 12px;
    left: 12px;
    width: auto;
  }
}

/* ---------- Nav ---------- */
.site-header {
  position: sticky;
  top: 0;
  z-index: 500;
  background: rgba(11, 22, 38, 0.72);
  backdrop-filter: blur(14px) saturate(140%);
  border-bottom: 1px solid rgba(255, 255, 255, 0.08);
  transition: background 0.25s ease, box-shadow 0.25s ease;
}
.site-header.is-scrolled {
  background: rgba(11, 22, 38, 0.95);
  box-shadow: 0 6px 24px rgba(0,0,0,0.25);
}

/* Account sub-nav (My Profile / My Cars / ...), shown under the header
   on every page once signed in — redesigned equivalent of the legacy
   site's admin-buttons horizontal menu. Sticky right below the header
   (--jt-sticky-1 is the header's own measured height, set by
   assets/js/main.js) so it stays visible — which page you're on —
   while scrolling a long list instead of scrolling away with it. */
.account-nav {
  background: var(--surface-alt);
  border-bottom: 1px solid var(--border-subtle);
  position: sticky;
  top: var(--jt-sticky-1, 78px);
  z-index: 490;
}
.account-nav-inner {
  display: flex;
  align-items: center;
  gap: 8px;
  overflow-x: auto;
  padding: 10px 24px;
  scrollbar-width: none;
}
.account-nav-inner::-webkit-scrollbar { display: none; }
.account-nav-link {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 9px 18px;
  border-radius: 999px;
  font-size: 14px;
  font-weight: 700;
  color: var(--text-muted);
  background: transparent;
  border: 1px solid transparent;
  white-space: nowrap;
  transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.account-nav-link:hover {
  color: var(--heading-color);
  border-color: var(--border-default);
}
.account-nav-link.is-active {
  color: var(--navy-900);
  background: linear-gradient(135deg, var(--gold-400), var(--gold-500));
  border-color: transparent;
}
[data-theme="dark"] .account-nav-link.is-active { color: var(--navy-900); }
.account-nav-icon { font-size: 16px; line-height: 1; }
/* Flag emoji (regional-indicator pairs) render visibly smaller than a
   single emoji glyph at the same font-size on most systems — bump this
   one up so it reads clearly as a flag instead of shrinking away. */
.account-nav-icon-flag { font-size: 20px; }

@media (max-width: 720px) {
  .account-nav-inner { padding: 10px 16px; }
}

.nav {
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 78px;
}

.brand { display: flex; align-items: center; gap: 10px; flex-shrink: 0; }
.brand img { height: 40px; width: auto; }
.brand-fallback {
  font-weight: 800;
  font-size: 20px;
  color: var(--white);
  letter-spacing: -0.01em;
}
.brand-fallback span { color: var(--gold-400); }

/* .primary-nav (the <nav> wrapping .nav-links) used to have no sizing
   rule of its own, so it just grew to fit its content like any block
   element — and translated labels (DE/RU/AR/TR etc. routinely run
   longer than English, plus the flag emoji on Japan Auctions/Korean
   Cars) push that content wider than a lot of desktop viewports.
   Combined with body's overflow-x:hidden, the overflow didn't wrap or
   shrink, it just pushed .nav-actions (Sign In/Register, app badges)
   past the right edge of the viewport and out of the clipped region —
   invisible, not just hard to see.
   A first attempt fixed this with `overflow-x: auto` here, but that
   broke the How to Buy dropdown: per the CSS overflow spec, giving an
   element a non-visible overflow-x with overflow-y left at its default
   (visible) forces overflow-y to become `auto` too (browsers won't let
   you scroll one axis while the other stays truly visible) — and
   .dropdown is an absolutely-positioned child that pops open *below*
   .primary-nav's own box, so it started getting clipped by that
   forced vertical overflow instead of floating freely over the page.
   Fixed properly instead by raising the point where the header
   switches to the mobile hamburger drawer (see the max-width:900px
   nav blocks below, now max-width:1200px) so there's simply always
   enough room above that width for logo + nav links + Sign In/Register
   to sit on one line without needing to shrink/scroll/clip anything —
   no overflow trick on .primary-nav needed at all, and the dropdown
   behaves exactly as it did before. Below that breakpoint, Sign
   In/Register move into the drawer itself (.mobile-only-actions) where
   they're always reachable, and How to Buy's sub-items already have
   their own working tap-to-expand behavior there (.has-dropdown.is-expanded). */

.nav-links {
  display: flex;
  align-items: center;
  gap: 4px;
}

.nav-links > li { position: relative; }

.nav-link {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 10px 13px;
  color: rgba(255, 255, 255, 0.85);
  font-weight: 600;
  font-size: 14.5px;
  border-radius: 999px;
  white-space: nowrap;
  transition: background 0.15s ease, color 0.15s ease;
}
.nav-link:hover, .nav-link.active { background: rgba(255,255,255,0.1); color: var(--white); }
.nav-link .chev { font-size: 10px; opacity: 0.7; transition: transform 0.2s ease; }
.has-dropdown:hover .chev { transform: rotate(180deg); }

.dropdown {
  position: absolute;
  top: calc(100% + 10px);
  left: 0;
  min-width: 220px;
  background: var(--surface);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-lg);
  padding: 10px;
  opacity: 0;
  visibility: hidden;
  transform: translateY(8px);
  transition: opacity 0.18s ease, transform 0.18s ease, visibility 0.18s ease;
}
.has-dropdown:hover .dropdown,
.has-dropdown:focus-within .dropdown {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}
.dropdown a {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 12px;
  border-radius: var(--radius-sm);
  font-size: 14px;
  color: var(--text-body);
  font-weight: 500;
}
.dropdown a:hover { background: var(--surface-alt); color: var(--blue-500); }
.dropdown hr { border: none; border-top: 1px solid var(--border-subtle); margin: 6px 4px; }
.dropdown .dropdown-flags { display: grid; grid-template-columns: 1fr 1fr; gap: 2px; }

.nav-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }

.icon-btn {
  width: 40px;
  height: 40px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: rgba(255,255,255,0.08);
  color: var(--white);
  border: 1px solid rgba(255,255,255,0.14);
}
.icon-btn:hover { background: rgba(255,255,255,0.16); }

.burger {
  display: none;
  width: 42px;
  height: 42px;
  border-radius: 50%;
  border: 1px solid rgba(255,255,255,0.16);
  background: rgba(255,255,255,0.06);
  align-items: center;
  justify-content: center;
  flex-direction: column;
  gap: 4px;
}
.burger span { width: 18px; height: 2px; background: var(--white); border-radius: 2px; transition: transform 0.2s ease, opacity 0.2s ease; }
.burger.is-active span:nth-child(1) { transform: translateY(6px) rotate(45deg); }
.burger.is-active span:nth-child(2) { opacity: 0; }
.burger.is-active span:nth-child(3) { transform: translateY(-6px) rotate(-45deg); }

/* account chip */
.account-chip { position: relative; }
.account-chip-toggle {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 6px 14px 6px 6px;
  border-radius: 999px;
  background: rgba(255,255,255,0.08);
  border: 1px solid rgba(255,255,255,0.14);
  color: var(--white);
  font-weight: 600;
  font-size: 14px;
  cursor: pointer;
}
.account-chip-toggle:hover,
.account-chip.is-open .account-chip-toggle {
  background: rgba(255,255,255,0.16);
  border-color: rgba(255,255,255,0.3);
}
.account-chip-toggle .chev {
  font-size: 11px;
  opacity: 0.7;
  transition: transform 0.15s ease;
}
.account-chip.is-open .account-chip-toggle .chev { transform: rotate(180deg); }
.account-chip .avatar {
  width: 30px; height: 30px; border-radius: 50%;
  background: linear-gradient(135deg, var(--gold-400), var(--gold-500));
  display: flex; align-items: center; justify-content: center;
  color: var(--navy-900); font-weight: 800; font-size: 13px;
  flex-shrink: 0;
}
/* Long "Firstname Lastname" values used to stretch the chip out to fit
   on one line, which — since .nav-actions never shrinks (flex-shrink:0
   above) — squeezed the logo/nav-links instead. Wrapping onto two
   lines (breaking at the space between first/last name) caps the
   chip's width regardless of how long a member's full name is. */
.account-chip-toggle [data-user-name] {
  display: block;
  max-width: 88px;
  white-space: normal;
  line-height: 1.2;
  text-align: left;
  overflow-wrap: break-word;
}
.account-menu {
  position: absolute;
  top: calc(100% + 10px);
  right: 0;
  z-index: 9999;
  min-width: 170px;
  background: var(--surface);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-lg);
  padding: 8px;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transform: translateY(-6px);
  transition: opacity 0.15s ease, transform 0.15s ease, visibility 0.15s ease;
}
.account-menu.is-open { opacity: 1; visibility: visible; pointer-events: auto; transform: translateY(0); }
.account-menu a {
  display: flex;
  align-items: center;
  width: 100%;
  border-radius: var(--radius-sm);
  padding: 10px 12px;
  font-size: 13.5px;
  font-weight: 600;
  color: var(--text-body);
  text-decoration: none;
}
.account-menu a:hover { background: var(--surface-alt); color: var(--blue-500); }
[dir="rtl"] .account-menu { right: auto; left: 0; }

/* ---------- My Car Details: included-accessories checklist (Spare
   Key / Maintenance Book) shown alongside the Shipping table. ---------- */
.jt-ship-included {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 12px;
}
.jt-ship-included .jt-tag { margin: 0; }

/* ---------- My Car Details: gallery view/delete/download actions row —
   one photo list handles viewing, admin deletion, and download, so its
   action buttons sit together directly under the thumbnail strip
   (see .stock-gallery-thumb-wrap / .jt-thumb-select above). ---------- */
.jt-gallery-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 12px;
}

/* ---------- Admin Deposits console ---------- */
.jt-deposits-toolbar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 14px;
  margin-bottom: 18px;
}
.jt-deposits-search {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  /* Explicit rather than the default "stretch" — this container has
     multiple flex-wrap lines once .jt-adv-filters (the "More Filters"
     <details>) wraps onto its own line below the search fields, and
     "stretch" distributing extra cross-axis space across lines is part
     of what makes Safari's known <details>-in-flex reflow bug visible:
     see .jt-adv-filters's own comment for the rest of that fix. */
  align-content: flex-start;
  gap: 10px;
}
.jt-deposits-search .field { margin-bottom: 0; }
/* Text/select fields in this row share one fixed height + border style
   so they line up exactly regardless of type — previously only the text
   input had an explicit width (200px) while selects were left to each
   browser's own auto-sizing, which is what made the row look uneven
   (Make/Model selects narrower or taller than the search box next to
   them, and both looking short next to the pill-shaped Search button). */
.jt-deposits-search .field input,
.jt-deposits-search .field select {
  height: 42px;
  padding: 0 14px;
  font-size: 13.5px;
  line-height: 40px;
  border-radius: var(--radius-sm);
  border: 1.5px solid var(--border-default);
  background-color: var(--surface);
  color: var(--text-body);
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.jt-deposits-search .field input:hover,
.jt-deposits-search .field select:hover { border-color: #aeb8c6; }
.jt-deposits-search .field input:focus,
.jt-deposits-search .field select:focus {
  outline: none;
  border-color: var(--blue-500);
  box-shadow: 0 0 0 4px rgba(47, 111, 237, 0.12);
}
.jt-deposits-search .field input[type="text"],
.jt-deposits-search .field input[type="search"] {
  width: 220px;
  min-width: 160px;
  flex: 1 1 220px;
}
.jt-deposits-search .field select {
  appearance: none;
  -webkit-appearance: none;
  -moz-appearance: none;
  width: 190px;
  flex: 0 1 190px;
  padding-right: 36px;
  background-image: var(--select-arrow);
  background-repeat: no-repeat;
  background-position: right 12px center;
  background-size: 12px;
  cursor: pointer;
  /* The shared 40px line-height above (there to vertically-center plain
     text inputs) makes native <select> boxes render taller than the
     declared 42px height in several browsers — a <select>'s internal
     option text isn't centered via line-height the same way an
     <input>'s is, so that tall line-height was inflating the whole
     control instead. Reverting to the browser's own centering keeps the
     select pinned to the same 42px box as its sibling inputs. */
  line-height: normal;
}
/* Search/Reset (and any other button dropped directly into this row)
   match the fields' height instead of their own shorter .btn-sm default,
   so the whole row sits on one visual baseline. */
.jt-deposits-search > .btn { height: 42px; padding: 0 20px; }
@media (max-width: 640px) {
  .jt-deposits-search .field input[type="text"],
  .jt-deposits-search .field input[type="search"],
  .jt-deposits-search .field select {
    width: 100%;
    flex: 1 1 100%;
  }
  .jt-deposits-search > .btn { flex: 1 1 auto; }
}
.jt-deposits-totals {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
  font-size: 13px;
  color: var(--text-muted);
}
.jt-deposits-toolbar .btn-gold { margin-left: auto; }
.jt-deposits-table td, .jt-deposits-table th { white-space: nowrap; }
.jt-gallery-actions .btn { flex: 1 1 auto; }

/* ---------- Hero ---------- */
.hero {
  position: relative;
  min-height: 92vh;
  display: flex;
  align-items: center;
  background: var(--navy-900);
  overflow: hidden;
}
.hero-slides {
  position: absolute;
  inset: 0;
}
.hero-slide {
  position: absolute;
  inset: 0;
  opacity: 0;
  transition: opacity 1.2s ease;
}
.hero-slide.is-active { opacity: 1; }
.hero-slide img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
/* Model + shipping-route caption for the real delivered-car slides
   (Ferrari 360, McLaren 720S, Huracán, Audi A5, M3 E92, Audi S8 +
   BMW 730Ld) — the generic stock-photo slides above them have no
   caption span at all, so this simply doesn't render for those.
   Own background rather than relying on contrast against the photo,
   since .hero-slides::after's darkening gradient renders on top of
   this (same stacking context, later in source order). */
.hero-slide-caption {
  /* Same gold used for the "Japanese Vehicle Export" highlight in the
     hero h1 (.hero-content h1 em), so the caption pill visually ties
     back to the headline instead of blending into the photo. Text
     switches to navy (same pairing as .btn-gold) since gold is too
     light for white text to read against. */
  position: absolute;
  left: 24px;
  bottom: 28px;
  z-index: 3;
  max-width: min(78%, 420px);
  padding: 7px 14px;
  border-radius: 999px;
  background: linear-gradient(135deg, var(--gold-400), var(--gold-500));
  border: 1px solid rgba(255, 255, 255, 0.35);
  color: var(--navy-900);
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 0.01em;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
@media (max-width: 767px) {
  .hero-slide-caption {
    /* Bottom-anchored positions (even ones tracking the photo's own
       edge via 62.5vw math) ended up overlapping .hero-dots near the
       bottom of the photo. Simplest fix: pin the caption to the
       top-left corner of the photo instead — clear of the dots
       entirely, and still unambiguously "on" the image. */
    left: 12px;
    top: 12px;
    bottom: auto;
    max-width: min(85%, 320px);
    font-size: 12px;
    padding: 6px 12px;
  }
  /* .teaser-media's own top-left corner is already taken by the
     "LIVE NOW" badge, so the top-left placement above (meant for the
     hero carousel's dots layout) collides with it here. Keep this
     caption at the bottom-left instead, on both web and mobile. */
  .teaser-media .hero-slide-caption {
    left: 16px;
    top: auto;
    bottom: 20px;
  }
}
.hero-slides::after {
  /* This is the overlay that actually sits on the slide images
     (.hero-slides wraps .hero-slide img directly) — it was still at
     up to 0.95 opacity even after several passes lightening the
     separate .home-page .hero::after gradient in index.php, which
     is why those earlier changes barely showed: the two overlays
     stack, and this one was doing nearly all of the darkening.
     Cut roughly in half here so the cars are actually visible. */
  content: "";
  position: absolute;
  inset: 0;
  background:
    linear-gradient(180deg, rgba(9,17,31,0.26) 0%, rgba(9,17,31,0.36) 55%, rgba(9,17,31,0.48) 100%),
    linear-gradient(90deg, rgba(9,17,31,0.4) 0%, rgba(9,17,31,0.16) 55%, rgba(9,17,31,0.35) 100%);
  z-index: 1;
}
@media (max-width: 767px) {
  .hero-slides::after {
    /* Per client request: no dark overlay/tint on the photos on
       mobile — they show at full brightness there. Desktop/tablet
       keep the gradient above unchanged. */
    background: none;
  }
}

.hero-content {
  position: relative;
  z-index: 2;
  color: var(--white);
  max-width: 760px;
  padding: 140px 0 100px;
}
.hero-badge {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 9px 18px;
  border-radius: 999px;
  background: rgba(255,255,255,0.1);
  border: 1px solid rgba(255,255,255,0.2);
  font-size: 14px;
  font-weight: 600;
  letter-spacing: 0.04em;
  margin-bottom: 24px;
}
.hero-badge .dot {
  width: 8px; height: 8px; border-radius: 50%; background: var(--success);
  box-shadow: 0 0 0 4px rgba(47,179,128,0.25);
}
/* Two-line variant: "Today's bidding has closed" on top, "Bidding for
   upcoming days is still open" underneath — same pill, stacked text
   instead of one long dashed sentence. Only used for the
   today's-bidding-closed state, not the holiday or open states. */
.hero-badge.is-two-line {
  align-items: flex-start;
  padding: 14px 20px;
  text-align: left;
  font-size: 16px;
}
.hero-badge-lines {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 6px;
  text-align: left;
}
/* line1 and line2 share this exact layout — dot, then gap, then text —
   so both dots line up on the same left edge and both lines of text
   line up right after them. (Previously line 1 had no dot of its own
   and relied on a single shared dot above the two lines, which left
   line 2's text indented further right than line 1's.) */
.hero-badge-line1,
.hero-badge-line2 {
  display: flex;
  align-items: center;
  gap: 7px;
  text-align: left;
}
.hero-badge-line2 {
  font-weight: 500;
  font-size: 14px;
  letter-spacing: 0.02em;
  opacity: 0.9;
}
.hero-badge-line1 .dot,
.hero-badge-line2 .dot {
  width: 8px; height: 8px;
  flex-shrink: 0;
}
/* Holiday / today's-bidding-closed state — see index.php's PHP-computed
   badge text right above the markup this styles. */
.hero-badge.is-closed .dot {
  background: var(--danger);
  box-shadow: 0 0 0 4px rgba(224,75,75,0.25);
}
/* line2's dot stays green (bidding for upcoming days is still open)
   even though the badge overall is in its red "closed" state — higher
   specificity than .hero-badge.is-closed .dot above so it wins. */
.hero-badge.is-closed .hero-badge-line2 .dot {
  background: var(--success);
  box-shadow: 0 0 0 3px rgba(47,179,128,0.25);
}
.hero-badge a { color: inherit; text-decoration: underline; text-underline-offset: 2px; }
.hero-badge a:hover { color: var(--gold-400); }
/* The specific holiday name + dates appended when the badge is showing
   automatically (today falls inside a scheduled jt_auction_calendar_notices
   window) — a touch lighter than the generic message next to it so the
   badge doesn't read as two competing headlines. */
.hero-badge-holiday-name { font-weight: 500; opacity: 0.85; }

/* ---------- Bid countdown ("Bid ends in HH:MM:SS") — shared by
   index.php's hero, auctions.php's listing header, and auction-lot.php's
   bid panel. See assets/js/bid-countdown.js for the ticking logic;
   this file only ever touches .bid-countdown-time, so the data-i18n
   label span renders/translates independently of the ticking digits. */
.bid-countdown {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 13px;
  font-weight: 600;
}
.bid-countdown-time {
  font-variant-numeric: tabular-nums;
  font-weight: 700;
  letter-spacing: 0.02em;
}
/* Default (light-page) look — auctions.php, auction-lot.php. */
.bid-countdown {
  padding: 6px 12px;
  border-radius: 999px;
  background: var(--surface-alt);
  border: 1px solid var(--border-default);
  color: var(--text-body);
}
.bid-countdown-time { color: var(--gold-500); }
/* Hero variant — sits on the dark, photo-backed hero, so it borrows
   the same translucent-white pill treatment as .hero-badge instead of
   the light-page surface colors above. */
.hero-bid-countdown {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 7px 16px;
  border-radius: 999px;
  background: rgba(255,255,255,0.1);
  border: 1px solid rgba(255,255,255,0.2);
  color: var(--white);
  font-size: 13px;
  font-weight: 600;
  margin-top: 10px;
}
.hero-bid-countdown .bid-countdown-time { color: var(--gold-400); }
.hero-content h1 {
  /* Was clamp(34px, 5vw, 58px) — at that size the longer translated
     variants of hero.title_html (German/French/Italian/Spanish are all
     noticeably longer than the English copy) wrapped to 3+ lines inside
     the 640px-wide hero-content box. Smaller cap + a wider box (see
     .hero-content above, 640px -> 760px) keeps this to ~2 lines across
     every language without needing per-language font-size overrides. */
  font-size: clamp(24px, 3.2vw, 36px);
  line-height: 1.2;
  font-weight: 800;
  margin: 0 0 20px;
  letter-spacing: -0.02em;
}
.hero-content h1 em {
  font-style: normal;
  color: var(--gold-400);
}
.hero-content p {
  font-size: 17px;
  line-height: 1.7;
  color: rgba(255,255,255,0.78);
  margin: 0 0 34px;
  max-width: 520px;
}
.hero-ctas { display: flex; gap: 14px; flex-wrap: wrap; margin-bottom: 46px; }

.hero-stats {
  display: flex;
  gap: 36px;
  flex-wrap: wrap;
}
.hero-stats .stat strong {
  display: block;
  font-size: 26px;
  font-weight: 800;
  color: var(--white);
}
.hero-stats .stat span {
  font-size: 13px;
  color: rgba(255,255,255,0.6);
}

.hero-dots {
  position: absolute;
  z-index: 2;
  bottom: 32px;
  left: 50%;
  transform: translateX(-50%);
  display: flex;
  gap: 8px;
}
@media (max-width: 767px) {
  .hero-dots {
    /* Back on the photo, bottom-center, per client request. The photo
       is object-fit:contain anchored to the top of the (much taller)
       hero box (see .home-page .hero-slide img in index.php), so its
       rendered height tracks viewport width (aspect-ratio 8/5 →
       62.5vw) rather than the box's own height — anchor from the top
       with that same math instead of a fixed `bottom` offset so the
       dots stay on the image at any screen width. */
    bottom: auto;
    top: calc(62.5vw - 24px);
  }
}
.hero-dots button {
  width: 26px; height: 4px; border-radius: 4px;
  background: rgba(255,255,255,0.35);
  border: none;
  transition: background 0.2s ease, width 0.2s ease;
}
.hero-dots button.is-active { background: var(--gold-400); width: 40px; }

/* ---------- Trust strip ---------- */
.trust-strip {
  background: var(--surface);
  border-bottom: 1px solid var(--border-subtle);
}
.trust-strip .container {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  padding: 26px 24px;
  flex-wrap: wrap;
}
.trust-item {
  display: flex;
  align-items: center;
  gap: 14px;
  font-size: 17px;
  font-weight: 600;
  color: var(--text-body);
}
.trust-item .ico {
  width: 46px; height: 46px; border-radius: 12px;
  background: var(--surface-alt);
  display: flex; align-items: center; justify-content: center;
  color: var(--blue-500);
  font-size: 20px;
  flex-shrink: 0;
}

/* ---------- Features ---------- */
.features-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 26px;
}
.feature-card {
  background: var(--surface);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-lg);
  padding: 34px 28px;
  box-shadow: var(--shadow-sm);
  transition: box-shadow 0.2s ease, transform 0.2s ease, background-color .2s ease;
}
.feature-card:hover { box-shadow: var(--shadow-md); transform: translateY(-4px); }
.feature-card .icon-wrap {
  width: 64px; height: 64px;
  border-radius: 18px;
  overflow: hidden;
  margin-bottom: 22px;
  background: var(--surface-alt);
}
.feature-card .icon-wrap img { width: 100%; height: 100%; object-fit: cover; }
.feature-card h3 {
  font-size: 20px;
  color: var(--heading-color);
  margin: 0 0 12px;
  font-weight: 700;
}
.feature-card p { margin: 0; font-size: 15px; line-height: 1.7; color: var(--text-muted); }
.feature-card ul { margin-top: 16px; display: flex; flex-direction: column; gap: 10px; }
.feature-card ul li {
  display: flex; align-items: center; gap: 10px;
  font-size: 14px; font-weight: 600; color: var(--text-body);
}
.feature-card ul li::before {
  content: "";
  width: 18px; height: 18px; border-radius: 50%;
  background: rgba(47,111,237,0.12);
  flex-shrink: 0;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232f6fed' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'><polyline points='20 6 9 17 4 12'/></svg>");
  background-repeat: no-repeat;
  background-position: center;
  background-size: 10px;
}

.feature-card-link { display: block; }
.icon-wrap.icon-wrap-emoji {
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 28px;
}

/* ---------- Steps / how it works ---------- */
.steps {
  background: var(--navy-900);
  color: var(--white);
  border-radius: var(--radius-lg);
  padding: 64px 48px;
  position: relative;
  overflow: hidden;
}
.steps::before {
  content: "";
  position: absolute;
  width: 420px; height: 420px;
  background: radial-gradient(circle, rgba(47,111,237,0.35), transparent 70%);
  top: -160px; right: -120px;
}
.steps-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 28px;
  position: relative;
  z-index: 1;
}
.step-card .step-num {
  font-size: 13px;
  font-weight: 800;
  color: var(--gold-400);
  letter-spacing: 0.1em;
  margin-bottom: 14px;
}
.step-card h4 { font-size: 18px; margin: 0 0 10px; font-weight: 700; }
.step-card p { font-size: 14px; line-height: 1.7; color: rgba(255,255,255,0.65); margin: 0; }

/* ---------- Auctions teaser ---------- */
.auction-teaser-grid {
  display: grid;
  grid-template-columns: 1.1fr 0.9fr;
  gap: 40px;
  align-items: center;
}
.teaser-media {
  position: relative;
  border-radius: var(--radius-lg);
  overflow: hidden;
  box-shadow: var(--shadow-lg);
}
.teaser-media img { width: 100%; height: 420px; object-fit: cover; }
.teaser-media .badge-live {
  position: absolute;
  top: 20px; left: 20px;
  background: var(--danger);
  color: var(--white);
  font-size: 12px;
  font-weight: 700;
  padding: 7px 14px;
  border-radius: 999px;
  display: flex; align-items: center; gap: 7px;
}
.teaser-media .badge-live .dot { width: 7px; height: 7px; background: var(--white); border-radius: 50%; animation: pulse 1.4s infinite; }
@keyframes pulse { 0%,100%{opacity:1;} 50%{opacity:0.3;} }

.teaser-copy .checklist { margin: 26px 0 32px; display: flex; flex-direction: column; gap: 14px; }
.teaser-copy .checklist li {
  display: flex; gap: 12px; align-items: flex-start;
  font-size: 15px; color: var(--text-body); font-weight: 500;
}
.teaser-copy .checklist li .tick {
  width: 24px; height: 24px; border-radius: 50%; flex-shrink: 0;
  background: rgba(47,179,128,0.14); color: var(--success);
  display: flex; align-items: center; justify-content: center; font-size: 13px; font-weight: 800;
}

/* ---------- CTA banner ---------- */
.cta-banner {
  background: linear-gradient(135deg, #16294a, #0b1626 60%);
  border-radius: var(--radius-lg);
  padding: 56px 48px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 32px;
  color: var(--white);
  flex-wrap: wrap;
}
.cta-banner h3 { font-size: 28px; margin: 0 0 10px; font-weight: 800; }
.cta-banner p { margin: 0; color: rgba(255,255,255,0.7); max-width: 460px; }
.cta-actions { display: flex; gap: 14px; flex-wrap: wrap; }
/* .cta-banner's background is a fixed dark navy gradient regardless of
   site theme (see the rule above) — but .btn-outline's text color is
   var(--heading-color), which is dark navy in LIGHT mode. That put dark
   text on a dark background inside every closing CTA banner site-wide
   ("Talk to Us", "Sign In", "Auction Guide", etc., across index.php,
   shipping.php, about_us.php, stock_cars.php, and more) — unreadable in
   both light and dark mode, not just dark mode. Scoped override, same
   treatment .btn-ghost already uses for outline buttons that sit on a
   permanently-dark surface (e.g. the hero). */
.cta-banner .btn-outline {
  color: var(--white);
  border-color: rgba(255, 255, 255, 0.35);
}
.cta-banner .btn-outline:hover {
  color: var(--white);
  border-color: var(--white);
  background: rgba(255, 255, 255, 0.08);
}

/* Same bug, different always-dark container: .page-hero .container is a
   fixed dark navy gradient regardless of site theme (see the .page-hero
   rule above), so a .btn-outline placed inside one — e.g. "Create
   Member Account" on auctions.php / auctions_one.php's signed-out gate,
   reported as invisible after just such a click-through — rendered
   dark-navy text on that same dark navy background in light mode.
   Identical fix to .cta-banner .btn-outline just above. */
.page-hero .btn-outline {
  color: var(--white);
  border-color: rgba(255, 255, 255, 0.35);
}
.page-hero .btn-outline:hover {
  color: var(--white);
  border-color: var(--white);
  background: rgba(255, 255, 255, 0.08);
}

/* ---------- Footer ---------- */
.site-footer {
  background: var(--navy-900);
  color: rgba(255,255,255,0.65);
  padding-top: 72px;
}
.footer-grid {
  display: grid;
  grid-template-columns: 1.4fr 1fr 1fr 1fr;
  gap: 40px;
  padding-bottom: 48px;
  border-bottom: 1px solid rgba(255,255,255,0.08);
}
.footer-brand img { height: 36px; margin-bottom: 18px; }
.footer-brand p { font-size: 14px; line-height: 1.7; max-width: 300px; }
.footer-social { display: flex; gap: 10px; margin-top: 20px; }

.app-badges-title { font-size: 12px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: rgba(255,255,255,0.5); margin: 26px 0 10px; }
.app-badges { display: flex; gap: 10px; flex-wrap: wrap; }
.app-badge {
  display: inline-flex; align-items: center; gap: 8px;
  background: #000; border: 1px solid rgba(255,255,255,0.18); border-radius: 10px;
  padding: 7px 14px 7px 12px; transition: transform .15s ease, border-color .15s ease;
}
.app-badge:hover { transform: translateY(-2px); border-color: rgba(255,255,255,0.4); }
.app-badge svg { width: 20px; height: 20px; flex-shrink: 0; fill: #fff; }
.app-badge .app-badge-text { display: flex; flex-direction: column; line-height: 1.15; }
.app-badge .app-badge-eyebrow { font-size: 9px; color: rgba(255,255,255,0.7); text-transform: uppercase; letter-spacing: 0.03em; }
.app-badge .app-badge-name { font-size: 15px; font-weight: 600; color: #fff; font-family: -apple-system, Roboto, sans-serif; }

/* Topbar placement (desktop). Lives in .topbar-right, immediately left
   of the theme/language switches — a slim single-line pair (icon +
   store name only, no "Download on the" eyebrow, no room for that in
   a 38px-tall bar) rather than the official two-line badge layout used
   in the mobile drawer (.app-badges-mobile). Hides itself below the
   1200px mobile-drawer breakpoint since the drawer already carries its
   own full-size copy — see the max-width:1200px block further down. */
.app-badges-nav {
  display: flex;
  flex-direction: row;
  align-items: center;
  flex-shrink: 0;
  gap: 8px;
}
.app-badges-nav .app-badge { padding: 4px 10px 4px 8px; flex-shrink: 0; }
.app-badges-nav .app-badge svg { width: 14px; height: 14px; }
.app-badges-nav .app-badge-eyebrow { display: none; }
.app-badges-nav .app-badge-text { flex-direction: row; }
.app-badges-nav .app-badge-name { font-size: 12px; white-space: nowrap; }

/* Mobile slide-out menu placement — full size, top of the list */
.app-badges-mobile { display: flex; gap: 10px; margin-bottom: 26px; }
.app-badges-mobile .app-badge { flex: 1; justify-content: center; padding: 10px 8px; }
.app-badges-mobile .app-badge-eyebrow,
.app-badges-mobile .app-badge-name { white-space: nowrap; }

.footer-col h5 {
  color: var(--white);
  font-size: 14px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  margin: 0 0 20px;
}
.footer-col ul { display: flex; flex-direction: column; gap: 12px; }
.footer-col a { font-size: 14.5px; }
.footer-col a:hover { color: var(--white); }
.footer-bottom {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 24px 0;
  font-size: 13px;
  flex-wrap: wrap;
  gap: 12px;
}
.footer-bottom .legal-links { display: flex; gap: 20px; }

/* ---------- Modals (auth) ---------- */
.modal-overlay {
  position: fixed;
  inset: 0;
  background: rgba(11,22,38,0.55);
  backdrop-filter: blur(4px);
  display: none;
  align-items: center;
  justify-content: center;
  z-index: 1000;
  padding: 20px;
}
.modal-overlay.is-open { display: flex; }
.modal-card {
  width: 100%;
  max-width: 420px;
  background: var(--surface);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-lg);
  padding: 36px;
  position: relative;
  animation: modalIn 0.22s ease;
}
@keyframes modalIn { from { opacity:0; transform: translateY(10px) scale(0.98);} to {opacity:1; transform: translateY(0) scale(1);} }
/* Wider variant for content that needs more horizontal room than a form
   — currently just banned-ips.php's scrape-evidence table
   (#jt-admin-scrape-evidence-modal). */
.modal-card-wide { max-width: 760px; }
.modal-close {
  position: absolute; top: 18px; right: 18px;
  width: 34px; height: 34px; border-radius: 50%;
  background: var(--surface-alt); border: none; color: var(--text-muted);
  display: flex; align-items: center; justify-content: center; font-size: 16px;
}
.modal-close:hover { background: var(--border-subtle); }
.modal-card h3 { font-size: 22px; color: var(--heading-color); margin: 0 0 6px; font-weight: 800; }
.modal-sub { font-size: 14px; color: var(--text-muted); margin: 0 0 26px; }

.field { margin-bottom: 16px; }
.field label { display: block; font-size: 13px; font-weight: 600; color: var(--text-body); margin-bottom: 7px; }
.field input, .field select {
  width: 100%;
  padding: 12px 14px;
  border-radius: var(--radius-sm);
  border: 1.5px solid var(--border-default);
  font-size: 14.5px;
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
  background: var(--surface);
  color: var(--text-body);
}
.field input:focus, .field select:focus {
  outline: none;
  border-color: var(--blue-500);
  box-shadow: 0 0 0 4px rgba(47,111,237,0.12);
}
/* Locked fields (e.g. My Profile's email — the account's unique
   identifier, not editable after registration) — visually distinct
   from a normal enabled field so it doesn't look like a broken input,
   and no focus ring since there's nothing to focus into. */
.field input[readonly] {
  background: var(--surface-alt);
  color: var(--text-muted);
  cursor: not-allowed;
}
.field input[readonly]:focus {
  outline: none;
  border-color: var(--border-default);
  box-shadow: none;
}
.field-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: 18px; }
.field-row a { font-size: 13px; font-weight: 600; color: var(--blue-500); }

/* Live field validation feedback */
.field { position: relative; }
.field-hint { display: block; font-size: 12px; margin-top: 6px; color: var(--text-muted); min-height: 15px; }
.field.is-invalid input {
  border-color: var(--danger);
  box-shadow: 0 0 0 4px rgba(224,75,75,0.1);
}
.field.is-invalid .field-hint { color: var(--danger); }
.field.is-valid input {
  border-color: var(--success);
}
.field.is-valid .field-hint { color: var(--success); }

/* Standalone status line outside a .field wrapper (e.g. auction-bids.php's
   "Sync App Bids" result message) — same color convention as the
   .field.is-invalid/.is-valid .field-hint rules above, just addressable
   directly since that button's status text isn't inside a form field. */
.field-hint.is-error { color: var(--danger); }
.field-hint.is-success { color: var(--success); }

.form-alert.is-error { animation: alertShake 0.4s ease; }
@keyframes alertShake {
  0%, 100% { transform: translateX(0); }
  20% { transform: translateX(-6px); }
  40% { transform: translateX(5px); }
  60% { transform: translateX(-3px); }
  80% { transform: translateX(2px); }
}
.checkbox-row { display: flex; align-items: center; gap: 8px; font-size: 13.5px; color: var(--text-muted); }

.divider-or {
  display: flex; align-items: center; gap: 14px;
  margin: 22px 0;
  font-size: 12.5px; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.06em;
}
.divider-or::before, .divider-or::after { content:""; flex:1; height:1px; background: var(--border-subtle); }

.btn-google {
  display: flex; align-items: center; justify-content: center; gap: 10px;
  width: 100%; padding: 12px; border-radius: var(--radius-sm);
  border: 1.5px solid var(--border-default); background: var(--surface);
  font-weight: 600; font-size: 14.5px; color: var(--text-body);
}
.btn-google:hover { border-color: var(--text-muted); background: var(--surface-alt); }

.modal-footer-link { text-align: center; margin-top: 22px; font-size: 14px; color: var(--text-muted); }
.modal-footer-link button { color: var(--blue-500); font-weight: 700; background: none; border: none; padding: 0; }

.form-alert {
  display: none;
  font-size: 13.5px;
  padding: 12px 14px;
  border-radius: var(--radius-sm);
  margin-bottom: 18px;
}
.form-alert.is-error { display: block; background: rgba(224,75,75,0.1); color: #b83535; }
.form-alert.is-success { display: block; background: rgba(47,179,128,0.12); color: #1d8e63; }

.btn-loading { position: relative; color: transparent !important; pointer-events: none; }
.btn-loading::after {
  content: "";
  position: absolute;
  width: 18px; height: 18px;
  border-radius: 50%;
  border: 2.5px solid rgba(255,255,255,0.4);
  border-top-color: #fff;
  animation: spin 0.7s linear infinite;
}
.btn-outline.btn-loading::after { border-color: rgba(47,111,237,0.3); border-top-color: var(--blue-500); }
@keyframes spin { to { transform: rotate(360deg); } }

/* ---------- Korean Cars: "What's included in this price?" info box ---------- */
.sc-trigger {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  margin-top: 8px;
  padding: 0;
  border: none;
  background: none;
  color: var(--blue-500);
  font-size: 13px;
  font-weight: 600;
  cursor: pointer;
  text-align: left;
}
.sc-trigger:hover { text-decoration: underline; }
.sc-trigger span[aria-hidden] { font-size: 14px; line-height: 1; }

/* Icon-only variant used inside auctions_one.php's card price line. */
.sc-trigger-sm {
  margin-top: 0;
  margin-left: 6px;
  vertical-align: middle;
  font-size: 15px;
}
.stock-card-price { display: flex; align-items: center; }

.sc-modal-card { max-width: 480px; }
.sc-modal-title { font-size: 19px; color: var(--heading-color); margin: 0 0 16px; font-weight: 800; padding-right: 24px; }

.sc-item-list {
  list-style: none;
  margin: 0 0 22px;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 14px;
}
.sc-item-list li {
  font-size: 15.5px;
  color: var(--text-body);
  line-height: 1.4;
}
.sc-item-subnote {
  display: block;
  margin-top: 3px;
  font-size: 12px;
  color: var(--text-muted);
}

.sc-price-breakdown { border-top: 1px solid var(--border-subtle); padding-top: 18px; }
.sc-price-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 7px 0;
  font-size: 15.5px;
}
.sc-price-label { color: var(--text-muted); font-weight: 600; }
.sc-price-value { color: var(--heading-color); font-weight: 700; }
.sc-divider { border: none; border-top: 1px solid var(--border-subtle); margin: 12px 0; }
.sc-price-row-grand .sc-price-label,
.sc-price-row-grand .sc-price-value { font-size: 17px; color: var(--heading-color); font-weight: 800; }
.sc-vat-notice { font-size: 12px; color: var(--text-muted); line-height: 1.55; margin: 0; }

@media (max-width: 480px) {
  .sc-modal-card { padding: 26px 22px; max-width: 100%; }
  .sc-modal-title { font-size: 17px; }
}

/* ---------- Reservation chat modal ---------- */
.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;
}
.chat-modal-card { display: flex; flex-direction: column; max-height: min(640px, calc(100vh - 32px)); }
.chat-modal-title { margin-bottom: 14px; }
.chat-messages {
  flex: 1; overflow-y: auto; min-height: 220px; max-height: 46vh;
  display: flex; flex-direction: column; gap: 8px;
  padding: 12px; border-radius: 12px; background: var(--surface-alt);
  border: 1px solid var(--border-subtle);
}
.chat-loading, .chat-empty { text-align: center; margin: auto; }
.chat-bubble {
  align-self: flex-start; max-width: 78%;
  background: var(--surface); border: 1px solid var(--border-subtle);
  border-radius: 14px 14px 14px 4px; padding: 8px 12px;
  color: var(--heading-color);
}
.chat-bubble-mine {
  align-self: flex-end;
  background: color-mix(in srgb, var(--gold-500) 20%, var(--surface));
  border-color: var(--gold-500); border-radius: 14px 14px 4px 14px;
}
.chat-bubble-text { font-size: 14px; line-height: 1.45; white-space: pre-wrap; word-break: break-word; color: inherit; }
.chat-bubble-time { font-size: 11px; color: var(--text-muted); margin-top: 4px; text-align: right; }
.chat-input-row { display: flex; gap: 8px; margin-top: 14px; }
.chat-input-row input { flex: 1; }
.chat-error { color: var(--danger); min-height: 15px; margin-top: 8px; }

[dir="rtl"] .chat-bubble { align-self: flex-end; border-radius: 14px 14px 4px 14px; }
[dir="rtl"] .chat-bubble-mine { align-self: flex-start; border-radius: 14px 14px 14px 4px; }
[dir="rtl"] .chat-bubble-time { text-align: left; }

@media (max-width: 480px) {
  .chat-modal-card { padding: 22px 16px; }
  .chat-bubble { max-width: 88%; }
}

/* ---------- Utility banner (config warning) ---------- */
.dev-banner {
  background: #fff4e0;
  color: #7a4a06;
  font-size: 13px;
  text-align: center;
  padding: 9px 16px;
  font-weight: 600;
}

/* ---------- Responsive ---------- */
@media (max-width: 1080px) {
  .features-grid { grid-template-columns: repeat(2, 1fr); }
  .steps-grid { grid-template-columns: repeat(2, 1fr); }
  .footer-grid { grid-template-columns: 1fr 1fr; }
  .auction-teaser-grid { grid-template-columns: 1fr; }
  .teaser-media img { height: 320px; }
}

/* Raised from 900px: at in-between desktop widths, translated nav
   labels (DE/RU/AR/TR etc.) plus the flag emoji don't leave enough
   room for Sign In/Register to stay visible — see the .primary-nav
   comment above for the full story and why this is the fix instead of
   an overflow/scroll trick on the nav row. */
@media (max-width: 1200px) {
  .nav-links, .topbar-left .only-desktop { display: none; }
  .burger { display: inline-flex; }
  .nav-actions .btn { display: none; }
  .app-badges-nav { display: none; }

  .nav-links.is-open {
    display: flex;
    flex-direction: column;
    position: fixed;
    top: 0; right: 0;
    height: 100vh;
    width: min(320px, 84vw);
    background: var(--navy-900);
    padding: 100px 24px 40px;
    gap: 4px;
    box-shadow: -20px 0 50px rgba(0,0,0,0.35);
    z-index: 600;
    align-items: stretch;
    overflow-y: auto;
  }
  .nav-links.is-open .dropdown {
    position: static;
    opacity: 1;
    visibility: visible;
    transform: none;
    box-shadow: none;
    margin-top: 4px;
    display: none;
  }
  .nav-links.is-open .has-dropdown.is-expanded .dropdown { display: block; }
  .nav-links.is-open .nav-link { color: rgba(255,255,255,0.85); justify-content: space-between; }
  .nav-links.is-open .dropdown a { color: rgba(255,255,255,0.75); }
  .nav-links.is-open .dropdown a:hover { background: rgba(255,255,255,0.08); color: #fff; }
  .nav-links.is-open .dropdown hr { border-top-color: rgba(255,255,255,0.1); }

  .nav-scrim {
    display: none;
    position: fixed; inset: 0; background: rgba(0,0,0,0.4); z-index: 490;
  }
  .nav-scrim.is-open { display: block; }

  .mobile-only-actions {
    display: flex;
    flex-direction: column;
    gap: 10px;
    margin-top: 20px;
    padding-top: 20px;
    border-top: 1px solid rgba(255,255,255,0.1);
  }
}
@media (min-width: 1201px) { .mobile-only-actions { display: none; } }

@media (max-width: 720px) {
  .section { padding: 60px 0; }
  .features-grid { grid-template-columns: 1fr; }
  .steps-grid { grid-template-columns: 1fr; }
  .steps { padding: 44px 24px; }
  .footer-grid { grid-template-columns: 1fr; gap: 32px; }
  .cta-banner { flex-direction: column; text-align: center; padding: 40px 28px; }
  .cta-actions { justify-content: center; }
  .hero-content { padding: 120px 0 80px; }
  .hero-stats { gap: 24px; }
  .trust-strip .container { justify-content: center; }
  /* Tokyo time (.topbar-left) stays visible and left-aligned even at
     this width now that it's the only thing over there — used to be
     hidden here and the remaining .topbar-right centered, back when
     .topbar-left held the email address instead. */
}

@media (max-width: 480px) {
  .hero-ctas .btn, .cta-actions .btn { width: 100%; }
  .hero-ctas, .cta-actions { flex-direction: column; }
  .modal-card { padding: 26px 22px; }
}

/* ===== UI modernization layer v2 ===== */
::selection { background: rgba(47,111,237,.28); color: var(--heading-color); }
body { min-height: 100vh; }
.container { width: min(calc(100% - 40px), var(--container)); margin-inline: auto; }
.site-header { transition: background .25s ease, box-shadow .25s ease, transform .25s ease; }
.site-header.is-scrolled { box-shadow: 0 10px 35px rgba(11,22,38,.12); }
.brand img { transition: transform .25s ease; }
.brand:hover img { transform: scale(1.025); }
.nav-link { position: relative; }
.nav-link::after { content:""; position:absolute; left:14px; right:14px; bottom:5px; height:2px; border-radius:3px; background:var(--blue-500); transform:scaleX(0); transition:transform .2s ease; }
.nav-link:hover::after,.nav-link.active::after { transform:scaleX(1); }
.btn { position:relative; overflow:hidden; isolation:isolate; transform:translateZ(0); box-shadow:0 0 0 rgba(0,0,0,0); transition:transform .18s ease, box-shadow .18s ease, background .18s ease, border-color .18s ease; }
.btn:hover { transform:translateY(-2px); box-shadow:0 12px 26px rgba(11,22,38,.16); }
.btn:active { transform:translateY(0) scale(.985); }
.btn-ripple { position:absolute; border-radius:50%; pointer-events:none; transform:translate(-50%,-50%) scale(0); background:rgba(255,255,255,.38); animation:ripple .55s ease-out; z-index:-1; }
@keyframes ripple { to { transform:translate(-50%,-50%) scale(5); opacity:0; } }
.hero-slide img { transform:scale(1.035); transition:transform 6s ease; }
.hero-slide.is-active img { transform:scale(1); }
.hero-content > * { opacity:0; transform:translateY(18px); animation:heroEnter .65s ease forwards; }
.hero-content > *:nth-child(2){animation-delay:.08s}.hero-content > *:nth-child(3){animation-delay:.16s}.hero-content > *:nth-child(4){animation-delay:.24s}.hero-content > *:nth-child(5){animation-delay:.32s}
@keyframes heroEnter { to { opacity:1; transform:none; } }
.reveal { opacity:0; transform:translateY(26px); transition:opacity .65s ease, transform .65s cubic-bezier(.2,.8,.2,1); }
.reveal.is-visible { opacity:1; transform:none; }
.feature-card,.step-card,.teaser-media { will-change:transform; }
.feature-card:hover .icon-wrap img { transform:scale(1.08) rotate(-2deg); }
.icon-wrap img { transition:transform .35s ease; }
.trust-item .ico { transition:transform .2s ease; }
.trust-item:hover .ico { transform:translateY(-2px) scale(1.08); }
.back-to-top { position:fixed; right:22px; bottom:22px; width:46px; height:46px; border:0; border-radius:14px; background:var(--navy-900); color:#fff; box-shadow:var(--shadow-md); opacity:0; visibility:hidden; transform:translateY(12px); transition:.2s ease; z-index:80; font-size:20px; }
.back-to-top.is-visible { opacity:1; visibility:visible; transform:none; }
.back-to-top:hover { transform:translateY(-3px); background:var(--blue-500); }
.modal-overlay { opacity:0; transition:opacity .18s ease; }
.modal-overlay.is-open { opacity:1; }
.modal-card { max-height:min(720px,calc(100vh - 32px)); overflow:auto; }
.field input:hover { border-color:#aeb8c6; }
.site-footer a { transition:color .18s ease, transform .18s ease; }
.footer-social .icon-btn:hover { transform:translateY(-3px); }
@media (max-width:1200px){
 .primary-nav { display:contents; }
 .nav-links { overflow-y:auto; overscroll-behavior:contain; }
 .nav-link::after { display:none; }
}
@media (max-width:600px){
 .container { width:min(calc(100% - 28px),var(--container)); }
 .section { padding-block:64px; }
 .feature-card { padding:26px 22px; }
 .steps { padding:42px 22px; }
 .modal-card { padding:30px 22px; border-radius:18px; }
 .back-to-top { right:14px; bottom:14px; }
}
@media (prefers-reduced-motion:reduce){
 html{scroll-behavior:auto}.reveal,.hero-content>*{opacity:1!important;transform:none!important;animation:none!important;transition:none!important}.hero-slide img{transition:none!important}.btn:hover{transform:none}
}

/* ==========================================================================
   Content pages — About, Rules, Guide, Timeline, Contact, Shipping, Coming-soon
   ========================================================================== */
.value-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; }
.info-card {
  background: var(--surface);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-sm);
  padding: 32px;
}

/* Generic highlighted callout — used on Branches for the "looking for
   us in person" note, reusable anywhere a page needs one soft-emphasis
   box without the weight of a full .info-card. */
.info-note {
  background: var(--surface-alt);
  border: 1px solid var(--border-default);
  border-radius: var(--radius-md);
  padding: 24px 28px;
  margin-top: 12px;
  max-width: 780px;
  margin-left: auto;
  margin-right: auto;
}
.info-note strong { display: block; color: var(--heading-color); font-size: 16px; margin-bottom: 8px; }
.info-note p { margin: 0; color: var(--text-body); line-height: 1.65; }
.info-note p + p { margin-top: 8px; }

/* Danger variant — reused on firebase-status.php when the service
   account itself isn't configured at all (nothing else to check yet). */
.info-note-danger { background: rgba(224,75,75,0.08); border-color: rgba(224,75,75,0.35); }
.info-note-danger strong { color: #b83535; }

/* FAQ accordion — plain <details>/<summary>, no JS required. Grouped
   into .faq-category blocks so more questions can be dropped in later
   without touching this CSS. */
.faq-list { max-width: 820px; margin: 0 auto; }
.faq-category { margin-bottom: 36px; }
.faq-category:last-child { margin-bottom: 0; }
.faq-category-title {
  font-size: 19px;
  font-weight: 800;
  color: var(--heading-color);
  margin: 0 0 14px;
}
.faq-item {
  background: var(--surface);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-sm);
  margin-bottom: 12px;
  overflow: hidden;
}
.faq-item:last-child { margin-bottom: 0; }
.faq-item summary {
  cursor: pointer;
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 18px 22px;
  font-weight: 700;
  font-size: 15.5px;
  color: var(--heading-color);
  transition: background-color 0.15s ease;
}
.faq-item summary::-webkit-details-marker { display: none; }
.faq-item summary::marker { content: ""; }
.faq-item summary::after {
  content: "+";
  flex-shrink: 0;
  font-size: 22px;
  line-height: 1;
  font-weight: 400;
  color: var(--gold-400);
}
.faq-item[open] summary::after { content: "\2212"; }
.faq-item[open] summary { border-bottom: 1px solid var(--border-subtle); }
.faq-item summary:hover { background: var(--surface-alt); }
.faq-answer {
  padding: 16px 22px 20px;
  color: var(--text-muted);
  line-height: 1.65;
}
.faq-answer a { color: var(--blue-500); font-weight: 600; }
@media (max-width: 560px) {
  .faq-item summary { padding: 15px 18px; font-size: 14.5px; }
  .faq-answer { padding: 12px 18px 16px; }
}

/* Centered intro paragraph used at the top of a content page (About Us,
   directly under the sticky .page-hero) — bigger and calmer than body
   copy so it reads as a one-line "who we are" summary rather than a
   regular paragraph, without needing its own <section class="section-head">. */
.lead-text {
  max-width: 680px;
  margin: 0 auto 40px;
  text-align: center;
  font-size: 18px;
  line-height: 1.7;
  color: var(--text-body);
}
@media (max-width: 560px) {
  .lead-text { font-size: 16px; margin-bottom: 28px; }
}

/* Timeline */
.timeline { display: flex; flex-direction: column; gap: 0; max-width: 760px; margin: 0 auto; }
.timeline-item { display: flex; gap: 22px; position: relative; padding-bottom: 36px; }
.timeline-item:last-child { padding-bottom: 0; }
.timeline-marker { display: flex; flex-direction: column; align-items: center; flex-shrink: 0; }
.timeline-dot {
  width: 34px; height: 34px; border-radius: 50%;
  background: var(--navy-800); color: var(--gold-400);
  display: flex; align-items: center; justify-content: center;
  font-weight: 800; font-size: 14px; flex-shrink: 0;
  border: 2px solid var(--gold-400);
}
.timeline-line { flex: 1; width: 2px; background: var(--border-default); margin-top: 6px; min-height: 24px; }
.timeline-item:last-child .timeline-line { display: none; }
.timeline-body { padding-top: 2px; }
.timeline-body .timeline-range {
  display: inline-block; font-size: 12px; font-weight: 700; letter-spacing: 0.06em;
  text-transform: uppercase; color: var(--blue-500); margin-bottom: 4px;
}
.timeline-body h4 { margin: 0 0 6px; font-size: 18px; font-weight: 700; color: var(--heading-color); }
.timeline-body p { margin: 0; font-size: 14.5px; line-height: 1.65; color: var(--text-muted); }
.timeline-note {
  max-width: 760px; margin: 28px auto 0; padding: 14px 18px; border-radius: var(--radius-sm);
  background: var(--surface-alt); color: var(--text-muted); font-size: 13.5px; text-align: center;
}

/* Guide tables */
.guide-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 24px; margin-bottom: 40px; }
.guide-table { width: 100%; border-collapse: collapse; }
.guide-table tr { border-bottom: 1px solid var(--border-subtle); }
.guide-table tr:last-child { border-bottom: none; }
.guide-table td { padding: 10px 8px; font-size: 14px; vertical-align: top; }
.guide-table td:first-child {
  font-weight: 800; color: var(--heading-color); white-space: nowrap; width: 1%; padding-right: 16px;
}
.guide-table td:last-child { color: var(--text-muted); }
.guide-section-title { font-size: 18px; font-weight: 800; color: var(--heading-color); margin: 0 0 14px; }
.guide-note {
  padding: 14px 18px; border-radius: var(--radius-sm); background: var(--surface-alt);
  color: var(--text-muted); font-size: 13.5px;
}

/* Rules */
.rules-section { margin-bottom: 40px; }
.rules-section:last-child { margin-bottom: 0; }
.rules-section h3 {
  font-size: 20px; font-weight: 800; color: var(--heading-color); margin: 0 0 18px;
  padding-bottom: 10px; border-bottom: 2px solid var(--gold-400); display: inline-block;
}
.rules-list { display: flex; flex-direction: column; gap: 14px; counter-reset: rule; }
.rules-list li {
  display: flex; gap: 14px; font-size: 15px; line-height: 1.7; color: var(--text-body);
  counter-increment: rule;
}
.rules-list li::before {
  content: counter(rule);
  flex-shrink: 0; width: 26px; height: 26px; border-radius: 50%;
  background: var(--navy-800); color: var(--gold-400); font-size: 12px; font-weight: 800;
  display: flex; align-items: center; justify-content: center; margin-top: 2px;
}
/* Rule items whose content is more than a single line of text (e.g. the
   Account Deposit rule's IBAN callout) wrap the <span> + any following
   block (like .iban-box) in .rules-li-body. Since .rules-list li is
   itself a flex row (numbered badge + content), without this the badge,
   text, and IBAN box would all sit side by side as separate flex items —
   .rules-li-body groups them into one flex item so the IBAN box stacks
   below the text instead of beside it. */
.rules-li-body { flex: 1 1 auto; min-width: 0; }

/* Deposit-tier table (auction_rules.php's Account Deposit rule) — the
   EUR-deposit -> max-YEN-bid schedule, shown as its own bordered card
   directly under the IBAN box so it reads as a distinct sub-block of
   that rule rather than more prose. Mirrors .country-card/.country-row's
   existing label/value row pattern (border-bottom rows, muted label,
   right-aligned value) rather than a literal <table>, since that
   pattern already collapses cleanly to a single column on narrow
   screens without a separate mobile layout. */
.deposit-tiers {
  margin-top: 12px; border: 1px solid var(--gold-400); border-radius: var(--radius-md);
  overflow: hidden; max-width: 460px; box-shadow: var(--shadow-sm);
}
.deposit-tiers-head {
  background: var(--surface-alt); padding: 10px 16px; font-size: 11px; font-weight: 800;
  letter-spacing: 0.07em; text-transform: uppercase; color: var(--heading-color);
  border-bottom: 1px solid var(--gold-400);
}
.deposit-tiers-intro {
  margin: 0; padding: 10px 16px 0; font-size: 13px; line-height: 1.5; color: var(--text-muted);
}
.deposit-tiers-row {
  display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 11px 16px;
  font-size: 14.5px; border-bottom: 1px solid var(--border-subtle);
}
.deposit-tiers-row:last-child { border-bottom: none; }
.deposit-tiers-row:nth-of-type(even):not(.deposit-tiers-row-head) { background: var(--surface-alt); }
.deposit-tiers-row-head {
  font-size: 11px; font-weight: 800; letter-spacing: 0.05em; text-transform: uppercase;
  color: var(--text-muted); background: transparent !important;
}
.deposit-tiers-row:not(.deposit-tiers-row-head) span:first-child {
  font-weight: 700; color: var(--heading-color); display: flex; align-items: center; gap: 8px;
}
.deposit-tiers-row:not(.deposit-tiers-row-head) span:first-child::before {
  content: ''; width: 8px; height: 8px; border-radius: 50%; background: var(--gold-400); flex-shrink: 0;
}
.deposit-tiers-row:not(.deposit-tiers-row-head) span:last-child {
  font-family: 'Courier New', Courier, monospace; font-weight: 800; font-size: 15px;
  color: var(--heading-color); letter-spacing: 0.02em;
}
.deposit-tiers-note {
  margin: 0; padding: 10px 16px; font-size: 12.5px; line-height: 1.5; color: var(--text-muted);
  background: var(--surface-alt); border-top: 1px solid var(--gold-400);
}
.deposit-tiers-note::before { content: '\24d8\00A0'; font-weight: 700; color: var(--gold-500); }
@media (max-width: 560px) {
  .deposit-tiers { max-width: none; }
  .deposit-tiers-row { font-size: 13.5px; padding: 10px 14px; }
}
/* Inline links inside rule text (e.g. r2's "Auction Guide" link) would
   otherwise be invisible — the base `a { color: inherit; text-decoration:
   none; }` rule (line 124) means an in-text link renders as plain body
   text with no visual cue it's clickable until you hover it. Give
   prose-embedded links here the site's standard interactive-blue accent
   (var(--blue-500), already used for hover states/active nav elsewhere)
   plus an underline so they read as links at a glance. */
.rules-list li a {
  color: var(--blue-500); text-decoration: underline; text-underline-offset: 2px; font-weight: 600;
}
.rules-list li a:hover, .rules-list li a:focus-visible { color: var(--gold-500); }

/* Contact */
.contact-grid { display: grid; grid-template-columns: 1.3fr 1fr; gap: 32px; align-items: start; }
.contact-grid form .field-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.contact-direct-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 20px; }
.contact-direct-head h3 { margin: 0; font-size: 19px; font-weight: 800; color: var(--heading-color); }
.contact-direct { display: flex; flex-direction: column; gap: 18px; }
.contact-direct-item { display: flex; gap: 14px; align-items: flex-start; }
.contact-direct-item .icon-wrap {
  width: 42px; height: 42px; border-radius: 50%; background: var(--surface-alt);
  display: flex; align-items: center; justify-content: center; flex-shrink: 0; font-size: 18px;
}
.contact-direct-item strong { display: block; color: var(--heading-color); font-size: 14px; }
.contact-direct-item span { color: var(--text-muted); font-size: 14px; }

/* IBAN visibility — the account number members actually need to type
   correctly into their own bank's transfer form deserves more weight
   than a plain table row. .iban-value (contact_us.php's info panel)
   bumps size/weight/spacing inline; .iban-box (deposits.php's payment
   card) pulls it out into its own tinted callout with a Copy button,
   since deposits.php is the page members are actually paying from. */
.iban-value { font-family: 'Courier New', Courier, monospace; font-weight: 700; letter-spacing: 0.03em; }
.iban-box {
  background: var(--surface-alt); border: 1px solid var(--gold-400); border-radius: var(--radius-md);
  padding: 14px 16px; margin-bottom: 16px;
}
.iban-box-label {
  display: block; font-size: 11px; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase;
  color: var(--text-muted); margin-bottom: 6px;
}
.iban-box-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.iban-box-value {
  font-family: 'Courier New', Courier, monospace; font-weight: 800; font-size: 19px; letter-spacing: 0.04em;
  color: var(--heading-color); word-break: break-all;
}
.iban-copy-btn { flex-shrink: 0; }
@media (max-width: 560px) {
  .iban-box-value { font-size: 16px; }
}

/* Follow Us — real outline glyphs (see contact_us.php's $jt_ci_social_svg)
   in a refined circular button, distinct from the plain-letter .icon-btn
   the footer uses: a soft shadow and a lift-on-hover instead of just a
   flat color swap reads as more considered/professional. */
.contact-social { margin-top: 24px; padding-top: 20px; border-top: 1px solid var(--border-subtle); }
.contact-social-eyebrow {
  display: block; font-size: 12px; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase;
  color: var(--text-muted); margin-bottom: 14px;
}
.contact-social-icons { display: flex; gap: 12px; }
.contact-social-icon {
  width: 42px; height: 42px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center;
  background: var(--surface-alt); color: var(--heading-color); border: 1px solid var(--border-default);
  box-shadow: var(--shadow-sm); transition: transform 0.15s ease, background 0.15s ease, color 0.15s ease, box-shadow 0.15s ease;
}
.contact-social-icon svg { width: 18px; height: 18px; }
.contact-social-icon:hover {
  background: var(--gold-400); color: var(--navy-900); border-color: var(--gold-400);
  transform: translateY(-3px); box-shadow: var(--shadow-md);
}

/* Shipping by country */
.country-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 22px; }
.country-card {
  background: var(--surface); border: 1px solid var(--border-subtle); border-radius: var(--radius-md);
  box-shadow: var(--shadow-sm); padding: 24px; scroll-margin-top: 110px;
}
.country-card h3 { margin: 0 0 16px; font-size: 19px; font-weight: 800; color: var(--heading-color); }
.country-row { display: flex; justify-content: space-between; gap: 10px; padding: 9px 0; border-bottom: 1px solid var(--border-subtle); font-size: 13.5px; }
.country-row:last-child { border-bottom: none; }
.country-row .label { color: var(--text-muted); font-weight: 600; flex-shrink: 0; }
.country-row .value { color: var(--text-body); text-align: right; }
.country-card.is-other { display: flex; flex-direction: column; justify-content: center; text-align: center; background: var(--navy-900); }
.country-card.is-other h3 { color: #fff; }
.country-card.is-other p { color: rgba(255,255,255,0.65); font-size: 14px; margin: 0 0 16px; }

@media (max-width: 900px) {
  .value-grid { grid-template-columns: 1fr; }
  .guide-grid { grid-template-columns: 1fr; }
  .contact-grid { grid-template-columns: 1fr; }
  .country-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 560px) {
  .country-grid { grid-template-columns: 1fr; }
  .contact-grid form .field-row { grid-template-columns: 1fr; }
  .timeline-item { gap: 14px; }
  .info-card { padding: 22px 18px; }
}

/* ==========================================================================
   RTL support (Arabic)
   ========================================================================== */
[dir="rtl"] { text-align: right; }
[dir="rtl"] .lang-menu { right: auto; left: 0; }
[dir="rtl"] .lang-option { text-align: right; }
[dir="rtl"] .theme-menu { right: auto; left: 0; }
[dir="rtl"] .theme-option { text-align: right; }
[dir="rtl"] .dropdown { left: auto; right: 0; }
[dir="rtl"] .dropdown a { flex-direction: row-reverse; }
[dir="rtl"] .topbar-left,
[dir="rtl"] .topbar-right,
[dir="rtl"] .nav,
[dir="rtl"] .nav-actions,
[dir="rtl"] .hero-ctas,
[dir="rtl"] .cta-actions,
[dir="rtl"] .footer-social,
[dir="rtl"] .checklist li,
[dir="rtl"] .trust-item,
[dir="rtl"] .field-row,
[dir="rtl"] .checkbox-row,
[dir="rtl"] .account-chip,
[dir="rtl"] .app-badges-nav,
[dir="rtl"] .app-badges-mobile,
[dir="rtl"] .modal-footer-link {
  direction: rtl;
}
[dir="rtl"] .nav-links { padding-right: 0; }
[dir="rtl"] .hero-stats,
[dir="rtl"] .features-grid,
[dir="rtl"] .steps-grid,
[dir="rtl"] .footer-grid,
[dir="rtl"] .auction-teaser-grid { direction: rtl; }
[dir="rtl"] .cta-banner { grid-template-columns: auto minmax(0, 1fr); }
[dir="rtl"] .back-to-top { right: auto; left: 22px; }
[dir="rtl"] .modal-close { right: auto; left: 18px; }
[dir="rtl"] .btn .lucide,
[dir="rtl"] .eyebrow::before { order: 2; }
@media (max-width: 600px) {
  [dir="rtl"] .back-to-top { left: 14px; right: auto; }
}
[dir="rtl"] .value-grid,
[dir="rtl"] .guide-grid,
[dir="rtl"] .contact-grid,
[dir="rtl"] .country-grid { direction: rtl; }
[dir="rtl"] .timeline-item,
[dir="rtl"] .rules-list li,
[dir="rtl"] .contact-direct-item,
[dir="rtl"] .country-row { direction: rtl; }
[dir="rtl"] .guide-table td:first-child { padding-right: 0; padding-left: 16px; }
[dir="rtl"] .country-row .value { text-align: left; }
[dir="rtl"] .rules-section h3 { border-bottom-color: var(--gold-400); }

/* ---------- Stock cars: results + table ---------- */
.stock-results-count { font-size: 14px; color: var(--text-muted); margin: 0 0 18px; }
.stock-results-count strong { color: var(--heading-color); }

/* ---------- My Cars: search / filter bar ---------- */
.cars-filter-bar {
  background: var(--surface-alt);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-lg);
  padding: 22px 24px 20px;
  margin-bottom: 22px;
}
.cars-filter-grid {
  display: grid;
  /* A wider minimum (was 170px) so a lone select/date field never gets
     squeezed narrower than a text field sitting next to it — every field
     in the bar now settles on the same handful of practical widths
     instead of drifting to whatever its content happened to need. */
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  gap: 18px 18px;
}
.cars-filter-grid .field { margin-bottom: 0; }
.cars-filter-grid .field label {
  display: block;
  font-size: 11.5px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--text-muted);
  margin-bottom: 8px;
}
/* Text/select/date all share one fixed height + box-sizing so they line
   up exactly, regardless of each browser's own native chrome (a native
   <select>'s OS arrow and a native <input type="date">'s calendar
   segment/icon otherwise each reserve their own, inconsistent amount of
   internal space, which is what was making some fields look narrower or
   "taller" than their neighbors even though the CSS width was already
   100% for all of them). */
.cars-filter-grid .field input,
.cars-filter-grid .field select {
  box-sizing: border-box;
  width: 100%;
  height: 44px;
  padding: 0 14px;
  font-size: 13.5px;
  line-height: 42px;
  border-radius: var(--radius-sm);
  border: 1.5px solid var(--border-default);
  background-color: var(--surface);
  color: var(--text-body);
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.cars-filter-grid .field input::placeholder { color: var(--text-muted); opacity: 0.8; }
.cars-filter-grid .field input:hover,
.cars-filter-grid .field select:hover {
  border-color: #aeb8c6;
}
.cars-filter-grid .field input:focus,
.cars-filter-grid .field select:focus {
  outline: none;
  border-color: var(--blue-500);
  box-shadow: 0 0 0 4px rgba(47, 111, 237, 0.12);
}
/* Custom dropdown arrow, drawn the same way in every browser, instead of
   each OS's own native select chrome (Windows/Chrome renders that
   noticeably narrower and squarer than macOS/Safari, which was the main
   source of the "narrow" selects next to the plain text fields). */
.cars-filter-grid .field select {
  appearance: none;
  -webkit-appearance: none;
  -moz-appearance: none;
  padding-right: 38px;
  background-image: var(--select-arrow);
  background-repeat: no-repeat;
  background-position: right 13px center;
  background-size: 13px;
  cursor: pointer;
  /* The 42px line-height above (meant to vertically-center plain text
     inputs) renders native <select> boxes taller than the declared
     44px height in some browsers — reverting to the browser's own
     centering keeps selects pinned to the same box as their sibling
     inputs/dates. */
  line-height: normal;
}
/* Native date inputs ignore line-height on their inner segments in some
   browsers, which is what made them look shorter/off-center at the same
   declared height as their siblings — this re-centers the calendar icon
   and keeps its clickable target comfortably sized rather than a tiny
   sliver in the corner. */
.cars-filter-grid .field input[type="date"] {
  line-height: normal;
  padding: 0 10px 0 14px;
}
.cars-filter-grid .field input[type="date"]::-webkit-calendar-picker-indicator {
  cursor: pointer;
  opacity: 0.6;
  padding: 6px;
  margin-right: -4px;
  border-radius: 6px;
  transition: opacity 0.15s ease, background-color 0.15s ease;
}
.cars-filter-grid .field input[type="date"]::-webkit-calendar-picker-indicator:hover {
  opacity: 1;
  background-color: var(--surface-alt);
}
.cars-filter-actions {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-top: 18px;
  padding-top: 18px;
  border-top: 1px solid var(--border-subtle);
}
/* Pushes "+ Add Car" to the far right of the row, leaving Search/Reset
   grouped on the left — same auto-margin trick as .jt-deposits-toolbar's
   own "+ Add User" button on the Users page. */
.cars-filter-actions-add { margin-left: auto; }
@media (max-width: 640px) {
  .cars-filter-bar { padding: 18px 16px; }
  .cars-filter-grid { grid-template-columns: 1fr 1fr; gap: 14px; }
  .cars-filter-actions { flex-wrap: wrap; }
  .cars-filter-actions .btn { flex: 1 1 auto; text-align: center; }
  .cars-filter-actions-add { margin-left: 0; }
}
@media (max-width: 420px) {
  .cars-filter-grid { grid-template-columns: 1fr; }
}

/* Dark-mode calendar icon for every native date input site-wide (not
   just the filter bar) — browsers draw this icon in solid black by
   default, which is nearly invisible against a dark theme surface. */
[data-theme="dark"] input[type="date"]::-webkit-calendar-picker-indicator {
  filter: invert(0.85);
}

.stock-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 12px;
  margin-bottom: 4px;
}
.stock-toolbar .stock-results-count { margin-bottom: 0; }
.stock-per-page {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 13.5px;
  color: var(--text-muted);
  font-weight: 600;
}
.stock-per-page-link {
  padding: 4px 10px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border-default);
  color: var(--text-body);
}
.stock-per-page-link:hover { border-color: var(--blue-500); color: var(--blue-500); }
.stock-per-page-link.is-active { background: var(--blue-500); border-color: var(--blue-500); color: #fff; }
/* Thin vertical divider between the List/Grid view buttons and the
   20/50/100 page-size buttons when both live in one .jt-view-toggle
   group (Japan Auctions toolbar) — same group, two different controls. */
.jt-toolbar-sep { width: 1px; height: 18px; background: var(--border-default); margin: 0 2px; }

.jt-badge {
  display: inline-flex;
  align-items: center;
  padding: 3px 10px;
  border-radius: 999px;
  font-size: 12px;
  font-weight: 700;
  white-space: nowrap;
}
.jt-badge-success { background: rgba(34, 197, 94, 0.14); color: #1a9a54; }
.jt-badge-pending { background: rgba(234, 179, 8, 0.16); color: #b5860a; }
.jt-badge-info { background: rgba(47, 111, 237, 0.14); color: #2f6fed; }
.jt-badge-danger { background: rgba(224, 75, 75, 0.14); color: #c33; }
[data-theme="dark"] .jt-badge-success { background: rgba(34, 197, 94, 0.2); color: #4ade80; }
[data-theme="dark"] .jt-badge-pending { background: rgba(234, 179, 8, 0.22); color: #fbbf24; }
[data-theme="dark"] .jt-badge-info { background: rgba(47, 111, 237, 0.22); color: #7ea6ff; }
[data-theme="dark"] .jt-badge-danger { background: rgba(224, 75, 75, 0.22); color: #ff8a8a; }

/* Small inline status tag — like .jt-badge but for a secondary,
   supplementary flag (e.g. "TT" bank-transfer-submitted) shown
   alongside the main Paid/Due badge rather than replacing it. */
.jt-tag {
  display: inline-flex;
  align-items: center;
  margin: 3px 4px 0 0;
  padding: 2px 7px;
  border-radius: 999px;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: .02em;
  white-space: nowrap;
  cursor: default;
}
.jt-tag-info { background: rgba(47, 111, 237, 0.14); color: var(--blue-500); }
[data-theme="dark"] .jt-tag-info { background: rgba(84, 144, 255, 0.2); color: var(--blue-400); }
.jt-tag-danger { background: rgba(224, 75, 75, 0.14); color: var(--danger); }
[data-theme="dark"] .jt-tag-danger { background: rgba(224, 75, 75, 0.22); color: #f28b8b; }
.jt-tag-success { background: rgba(34, 197, 94, 0.14); color: #1a9a54; }
[data-theme="dark"] .jt-tag-success { background: rgba(34, 197, 94, 0.2); color: #4ade80; }
.jt-tag-neutral { background: var(--gray-100); color: var(--text-muted); }
[data-theme="dark"] .jt-tag-neutral { background: rgba(255, 255, 255, 0.08); color: var(--text-muted); }
/* Shipment type / loading port / destination each get their own color
   so they read as distinct pieces of information at a glance instead
   of blending into one run of text. */
.jt-tag-shipment { background: rgba(147, 51, 234, 0.14); color: #9333ea; }
[data-theme="dark"] .jt-tag-shipment { background: rgba(192, 132, 252, 0.2); color: #c084fc; }
.jt-tag-port { background: rgba(47, 111, 237, 0.14); color: var(--blue-500); }
[data-theme="dark"] .jt-tag-port { background: rgba(84, 144, 255, 0.2); color: var(--blue-400); }
.jt-tag-destination { background: rgba(227, 171, 65, 0.18); color: #a3720f; }
[data-theme="dark"] .jt-tag-destination { background: rgba(240, 196, 106, 0.22); color: var(--gold-400); }

/* ---------- My Reservations: status filter chips + admin status select ---------- */
.rsv-status-chips {
  display: flex;
  gap: 8px;
  overflow-x: auto;
  padding: 4px 2px 16px;
  margin-bottom: 6px;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: thin;
}
.rsv-chip {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  padding: 8px 16px;
  border-radius: 999px;
  border: 1.5px solid var(--border-default);
  background: var(--surface);
  color: var(--text-body);
  font-size: 13.5px;
  font-weight: 600;
  white-space: nowrap;
  transition: border-color .15s ease, background .15s ease, color .15s ease;
}
.rsv-chip:hover { border-color: var(--blue-500); color: var(--blue-500); }
.rsv-chip.is-active { background: var(--blue-500); border-color: var(--blue-500); color: #fff; }

.rsv-admin-status-select {
  margin-top: 6px;
  padding: 6px 10px;
  border-radius: var(--radius-sm);
  border: 1.5px solid var(--border-default);
  background: var(--surface);
  color: var(--text-body);
  font-size: 12.5px;
  font-weight: 600;
  max-width: 170px;
}
.rsv-admin-status-select:focus {
  outline: none;
  border-color: var(--blue-500);
  box-shadow: 0 0 0 3px rgba(47,111,237,0.12);
}
.rsv-admin-status-select:disabled { opacity: .6; }

@media (max-width: 640px) {
  .rsv-status-chips { padding-bottom: 12px; }
  .rsv-chip { padding: 7px 13px; font-size: 12.5px; }
}

/* Balance column — legacy always renders the remaining balance in red
   regardless of sign (negative = still owed, zero/positive = settled),
   so this mirrors that convention exactly. */
.balance-due {
  color: #d0021b;
}
[data-theme="dark"] .balance-due {
  color: #ff6b6b;
}

/* RO-RO prepaid / pay-in-your-country freight note. */
.payment-note {
  margin-top: 6px;
  font-size: 11.5px;
  font-style: italic;
  color: var(--text-muted);
}

/* Partial-payment history — a native <details> disclosure (works on
   touch and desktop alike, unlike the legacy page's hover-only reveal)
   listing each payment received so far for a purchase. */
.payment-history { margin-top: 6px; }
.payment-history summary {
  font-size: 11px;
  color: var(--text-muted);
  cursor: pointer;
  list-style: none;
  user-select: none;
}
.payment-history summary::-webkit-details-marker { display: none; }
.payment-history summary::before {
  content: "▸";
  display: inline-block;
  margin-right: 4px;
  font-size: 9px;
  transition: transform 0.15s ease;
}
.payment-history[open] summary::before { transform: rotate(90deg); }
.payment-history summary:hover { color: var(--blue-500); }
.payment-history-list {
  list-style: none;
  margin: 6px 0 0;
  padding: 6px 0 0 4px;
  border-top: 1px dashed var(--border-default);
}
.payment-history-list li {
  display: flex;
  justify-content: space-between;
  gap: 12px;
  font-size: 12px;
  color: var(--text-body);
  padding: 2px 0;
}
.payment-history-date { color: var(--text-muted); }
.payment-history-amount { font-weight: 600; font-variant-numeric: tabular-nums; }

.stock-empty {
  text-align: center;
  padding: 64px 24px;
  background: var(--surface-alt);
  border-radius: var(--radius-lg);
}
.stock-empty h3 { margin: 0 0 10px; color: var(--heading-color); font-size: 20px; }
.stock-empty p { margin: 0 0 22px; color: var(--text-muted); }

/* A holiday/maintenance NOTICE above the auction listing — unlike
   .stock-empty (a big centered "nothing here" block that replaces the
   whole page), this sits above a listing that's still fully rendered
   underneath it, since lots dated for after the closure are already
   real and biddable (see auctions.php's comment at this banner). Same
   amber warning tone as .dev-banner, just scoped to this section
   instead of fixed to the top of the page. */
.jt-holiday-banner {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px 10px;
  margin-bottom: 16px;
  padding: 12px 18px;
  border-radius: var(--radius-sm);
  background: #fff4e0;
  color: #7a4a06;
  font-size: 13.5px;
  font-weight: 600;
}
[data-theme="dark"] .jt-holiday-banner { background: rgba(234, 179, 8, 0.16); color: #fbbf24; }
.jt-holiday-banner-name { font-weight: 500; opacity: 0.9; }

.stock-table {
  width: 100%;
  border-collapse: collapse;
  background: var(--surface);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-lg);
  overflow: hidden;
  box-shadow: var(--shadow-sm);
}
.stock-table th {
  text-align: left;
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--text-muted);
  padding: 14px 16px;
  border-bottom: 1px solid var(--border-subtle);
  background: var(--surface-alt);
}
.stock-table th a { color: inherit; display: inline-flex; align-items: center; gap: 2px; }
.stock-table th a:hover { color: var(--blue-500); }
/* Make / Model header on auctions.php's list view, plus a secondary
   "Sort by Year" link on the same line, pushed to the far right —
   Year no longer has its own column (moved into the row's sub-line
   next to Bid Number), but sorting by it is still needed, so it
   shares this header instead of its own <th>. */
/* justify-content: space-between (the first version of this) pushed
   "Sort by Year" all the way to the far edge of this <th> — which is
   as wide as the Make/Model data column below it (thumbnail + title +
   sub-text), so the gap ended up much bigger than intended. Fixed gap
   instead, so the link sits a modest distance from Make / Model
   regardless of how wide the column happens to be. */
.jt-th-make-model { display: flex; align-items: center; justify-content: flex-start; gap: 24px; }
.jt-th-sub-sort {
  font-size: 11px;
  text-transform: none;
  letter-spacing: normal;
  font-weight: 500;
  white-space: nowrap;
}
.jt-th-sub-sort, .jt-th-sub-sort a { color: var(--text-muted); }
.jt-th-sub-sort:hover { color: var(--blue-500); }
/* Bid Number / Grade on one line, Year / Mileage on the next — see
   the auctions.php list-view row markup (.jt-auction-row-sub wraps
   two .jt-sub-line spans). Only affects rows using this modifier
   class, so the plain single-line .stock-table-sub used elsewhere
   (my-favorites.php, stock_cars.php, etc.) is unaffected. */
.jt-auction-row-sub { display: flex; flex-direction: column; gap: 1px; }
.jt-sub-line { display: block; }
.stock-th-index { width: 1%; padding-right: 8px !important; text-align: center; color: var(--text-muted); font-weight: 700; font-variant-numeric: tabular-nums; }
.stock-table-thumb { position: relative; display: block; width: 108px; height: 78px; border-radius: var(--radius-sm); overflow: hidden; background: var(--surface-alt); transition: box-shadow .15s ease; }
.stock-table-thumb:hover, .stock-table-thumb:focus-visible { box-shadow: 0 0 0 2px var(--blue-500); }
.stock-table-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* Row-number badge overlaid on the thumbnail — only shown on the mobile
   card layout, where the dedicated # column is hidden (see the 700px
   media query below) since stacking it as its own labeled block broke
   onto two lines and cluttered the card. */
.stock-row-badge {
  display: none;
  align-items: center;
  justify-content: center;
  position: absolute;
  top: 8px;
  left: 8px;
  min-width: 24px;
  height: 24px;
  padding: 0 6px;
  border-radius: 999px;
  background: rgba(11, 22, 38, 0.78);
  color: #fff;
  font-size: 12px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  z-index: 1;
}
.stock-table td {
  padding: 12px 16px;
  border-bottom: 1px solid var(--border-subtle);
  font-size: 14px;
  color: var(--text-body);
  vertical-align: middle;
}
.stock-table tr:last-child td { border-bottom: none; }
.stock-table-title { display: block; font-weight: 700; color: var(--heading-color); text-decoration: none; }
.stock-table-title:hover, .stock-table-title:focus-visible { color: var(--blue-500); text-decoration: underline; }
.stock-table-sub { display: block; font-size: 12px; color: var(--text-muted); margin-top: 2px; }
.stock-table td strong { color: var(--heading-color); font-size: 15px; }
.stock-card-price-muted { font-size: 13px; font-weight: 600; color: var(--text-muted); }

/* ---------- One Price Cars: card grid (auctions_one.php) ----------
   A photo-first card grid rather than the Stock Cars table layout —
   these listings come from Encar's own live API (no local DB row to
   sort/paginate cheaply the way Stock Cars can), so a browsable grid
   fits the data better than a dense sortable table. */
.stock-card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(270px, 1fr));
  gap: 20px;
  margin-bottom: 8px;
}
.stock-card {
  display: flex;
  flex-direction: column;
  background: var(--surface-alt);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-lg);
  overflow: hidden;
  text-decoration: none;
  transition: border-color 0.15s ease, transform 0.15s ease;
}
.stock-card:hover, .stock-card:focus-visible {
  border-color: var(--blue-500);
  transform: translateY(-2px);
}
.stock-card-photo {
  position: relative; /* anchors .jt-fav-btn-corner below */
  aspect-ratio: 4 / 3;
  background: var(--surface);
  overflow: hidden;
}
.stock-card-photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.stock-card-nophoto {
  width: 100%;
  height: 100%;
  background: linear-gradient(135deg, var(--surface) 0%, var(--surface-alt) 100%);
}
.stock-card-body { padding: 14px 16px 16px; }
.stock-card-title {
  margin: 0 0 4px;
  font-size: 15px;
  font-weight: 700;
  color: var(--heading-color);
  line-height: 1.3;
}
.stock-card-sub { margin: 0 0 8px; font-size: 12.5px; color: var(--text-muted); }
.stock-card-price { margin: 0; font-size: 16px; }
.stock-card-price strong { color: var(--heading-color); }

/* ---------- Favorites star toggle ----------
   Shared component across every place a favorite button appears:
   card-corner overlay (Japan Auctions / Korean Cars list+grid photos),
   a plain icon button in a table action cell (Japan Auctions table
   view), and a labeled icon+text button next to a detail page's h1
   (auction-lot.php / one-price-car.php). See assets/js/favorites.js
   for the click/toggle behavior — this only styles on/off state via
   the .is-active class it applies. */
.jt-fav-btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  border: 1px solid var(--border-default);
  background: var(--surface);
  color: var(--text-muted);
  border-radius: var(--radius-sm);
  padding: 6px 10px;
  cursor: pointer;
  font-size: 13px;
  line-height: 1;
  transition: border-color 0.15s ease, color 0.15s ease, background 0.15s ease;
}
.jt-fav-btn:hover { border-color: var(--blue-500); color: var(--blue-500); }
.jt-fav-btn:disabled { opacity: 0.6; cursor: default; }
.jt-fav-btn .jt-fav-icon { font-size: 15px; line-height: 1; }
.jt-fav-btn.is-active {
  border-color: #eab308;
  background: rgba(234, 179, 8, 0.12);
  color: #b5860a;
}
[data-theme="dark"] .jt-fav-btn.is-active { background: rgba(234, 179, 8, 0.2); color: #fbbf24; }

/* Card-corner variant: icon-only circle floating over a card's photo. */
.jt-fav-btn-corner {
  position: absolute;
  top: 8px;
  right: 8px;
  width: 32px;
  height: 32px;
  padding: 0;
  justify-content: center;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.92);
  border-color: transparent;
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.18);
  z-index: 2;
}
[data-theme="dark"] .jt-fav-btn-corner { background: rgba(24, 24, 27, 0.85); }
.jt-fav-btn-corner .jt-fav-icon { font-size: 17px; }

/* Labeled variant: detail-page title row, icon + text. */
.jt-detail-title-row {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 12px;
  justify-content: space-between;
}
.jt-detail-title-row h1 { margin: 0; }
.jt-fav-btn-labeled { padding: 8px 14px; }

/* Japan Auctions table view: fav button sits next to the View & Bid
   button / Bidding Closed badge in the same action cell. */
.jt-table-action-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.jt-table-action-row .jt-fav-btn { padding: 6px 8px; }

/* ---------- Korean Cars: filter panel (auctions_one.php) ----------
   Own component rather than reusing .jt-deposits-search /
   .jt-adv-filters-grid (the shared "quick search row + collapsible
   advanced filters" shape used by auctions.php / my-bids.php /
   auction-bids.php). This page only ever has three range filters and
   no quick-search row or <details> toggle, so forcing it into the
   shared classes needed a pile of specificity overrides (see the old
   ".jt-deposits-search > .jt-adv-filters-grid" comments above) and
   still left a real bug: the Apply/Clear button wrapper carried both
   ".field" (from the shared grid, 2-class selector) and its own
   ".jt-adv-filters-apply-group" (1-class selector) — the 2-class
   selector's flex-direction:column always won regardless of source
   order, so the buttons silently stacked instead of sitting side by
   side, and the whole filter row had no card/border of its own since
   it inherited the borderless, transparent quick-search row styling.
   This block is fully self-contained: a bordered, shadowed card with
   its own grid and its own action row, so nothing here can be
   knocked sideways by rules meant for a different page's filter bar,
   and nothing here can knock those other pages sideways either. */
.op-filters {
  background: var(--surface);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-sm);
  padding: 22px 24px;
  margin-bottom: 24px;
}
.op-filters-title {
  margin: 0 0 18px;
  font-size: 13px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--text-muted);
}
.op-filters-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 18px 20px;
}
.op-filter-field {
  display: flex;
  flex-direction: column;
  gap: 8px;
  min-width: 0;
}
.op-filter-field label {
  font-size: 11.5px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  color: var(--text-muted);
}
.op-range-pair { display: flex; align-items: center; gap: 8px; min-width: 0; }
.op-range-pair input {
  min-width: 0;
  flex: 1 1 0;
  width: auto;
  height: 42px;
  padding: 0 12px;
  font-size: 13.5px;
  border-radius: var(--radius-sm);
  border: 1.5px solid var(--border-default);
  background-color: var(--surface);
  color: var(--text-body);
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.op-range-pair input:hover { border-color: #aeb8c6; }
.op-range-pair input:focus {
  outline: none;
  border-color: var(--blue-500);
  box-shadow: 0 0 0 4px rgba(47, 111, 237, 0.12);
}
.op-range-pair span { color: var(--text-muted); font-size: 13px; flex: 0 0 auto; }
/* Brand/Model/Transmission/Fuel Type/Body Type selects — same field
   shell as .op-range-pair input (height/border/radius) so a select
   sitting next to a range-pair field reads as part of the same grid,
   not a mismatched control dropped in. */
.op-filter-field select {
  height: 42px;
  width: 100%;
  padding: 0 36px 0 12px;
  font-size: 13.5px;
  border-radius: var(--radius-sm);
  border: 1.5px solid var(--border-default);
  background-color: var(--surface);
  color: var(--text-body);
  appearance: none;
  -webkit-appearance: none;
  -moz-appearance: none;
  background-image: var(--select-arrow);
  background-repeat: no-repeat;
  background-position: right 12px center;
  background-size: 12px;
  cursor: pointer;
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.op-filter-field select:hover { border-color: #aeb8c6; }
.op-filter-field select:focus {
  outline: none;
  border-color: var(--blue-500);
  box-shadow: 0 0 0 4px rgba(47, 111, 237, 0.12);
}
.op-filter-field select:disabled {
  cursor: not-allowed;
  opacity: 0.55;
  background-color: var(--surface-alt);
}
.op-filters-actions {
  display: flex;
  flex-direction: row;
  justify-content: flex-end;
  gap: 10px;
  margin-top: 20px;
  padding-top: 18px;
  border-top: 1px solid var(--border-subtle);
}
.op-filters-actions .btn { height: 42px; padding: 0 22px; }
@media (max-width: 640px) {
  .op-filters { padding: 18px; }
  .op-filters-grid { grid-template-columns: 1fr 1fr; gap: 16px; }
  .op-filters-actions { flex-direction: row; }
  .op-filters-actions .btn { flex: 1; }
}
@media (max-width: 420px) {
  .op-filters-grid { grid-template-columns: 1fr; }
}

/* Invoice document buttons (Total/Vehicle/Service/Freight) — My Cars
   list + car detail page, each opening invoice.php in a new tab. */
.invoice-btn-group {
  display: flex;
  flex-direction: column;
  gap: 4px;
  margin-top: 8px;
}
.invoice-btn {
  display: inline-block;
  font-size: 11.5px;
  font-weight: 600;
  color: var(--blue-500);
  background: var(--surface);
  border: 1px solid var(--border-default);
  border-radius: var(--radius-sm);
  padding: 4px 10px;
  white-space: nowrap;
  text-align: center;
  transition: background .15s ease, border-color .15s ease;
}
.invoice-btn:hover, .invoice-btn:focus-visible {
  background: var(--surface-alt);
  border-color: var(--blue-500);
}

@media (max-width: 700px) {
  .stock-table thead { display: none; }
  .stock-table, .stock-table tbody, .stock-table tr, .stock-table td { display: block; width: 100%; }
  .stock-table tr {
    margin-bottom: 18px;
    border: 1px solid var(--border-subtle);
    border-radius: var(--radius-md);
    overflow: hidden;
    background: var(--surface);
    box-shadow: var(--shadow-sm);
  }
  .stock-table td { border-bottom: 1px solid var(--border-subtle); padding: 10px 16px; }
  .stock-table td[data-label]:not([data-label=""])::before {
    content: attr(data-label);
    display: block;
    font-size: 11px;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--text-muted);
    margin-bottom: 4px;
  }
  /* The row-index column becomes an overlay badge on the thumbnail
     instead (see .stock-row-badge) — stacking it as its own labeled
     block broke the number onto a second line and added a redundant
     full-width row above every card. */
  .stock-table td.stock-th-index { display: none; }
  .stock-th-photo { padding: 0; }
  .stock-table-thumb { width: 100%; height: 170px; border-radius: 0; }
  .stock-row-badge { display: flex; }
  .stock-th-action { text-align: center; }
}


.stock-pagination {
  display: flex; align-items: center; justify-content: center; gap: 20px;
  margin-top: 40px;
}
.stock-page-link {
  padding: 10px 20px; border-radius: 999px;
  border: 1.5px solid var(--border-default);
  color: var(--text-body); font-weight: 600; font-size: 14px;
}
.stock-page-link:hover { border-color: var(--blue-500); color: var(--blue-500); }
.stock-page-link.is-disabled { opacity: 0.4; pointer-events: none; }
.stock-page-status { font-size: 13.5px; color: var(--text-muted); font-weight: 600; }

/* ---------- Stock car detail page ---------- */
.stock-detail-grid {
  display: grid;
  grid-template-columns: 1.3fr 1fr;
  gap: 32px;
  align-items: start;
}
/* Grid items default to min-width:auto, not 0 — meaning a track can be
   forced wider than its 1.3fr/1fr share if the item's own content has
   a larger intrinsic (min-content) width, and that width is
   recalculated every time a replaced element inside it (an <img>)
   finishes loading. On a car with many photos (my-car-details.php can
   run 40+, admin-uploaded one at a time — unlike auction-lot.php's
   feed-supplied, usually-fewer set) that recalculation happens dozens
   of times in a row as the gallery/thumbnail images load in, and each
   one nudges the column — and the aspect-ratio photo box sized as a
   % of it — a little wider than the last, which is exactly what reads
   as the page "growing itself" with no scroll or gesture involved.
   Confirmed directly: removing this grid's layout stopped the main
   photo from doing it. min-width: 0 is the standard fix — it lets the
   track actually honor its 1.3fr/1fr share instead of expanding to
   fit content, the same way flex items need min-width: 0 for the
   analogous flexbox issue (see .rules-li-body/.op-range-pair/
   .jt-bid-input-wrap elsewhere in this file, all the same fix for the
   same underlying default). */
.stock-detail-grid > * {
  min-width: 0;
}

.stock-gallery-main {
  position: relative;
  border-radius: var(--radius-lg);
  overflow: hidden;
  box-shadow: var(--shadow-md);
  aspect-ratio: 4 / 3;
  background: var(--surface-alt);
}
.stock-gallery-main img { width: 100%; height: 100%; object-fit: cover; display: block; }
.stock-gallery-main.is-zoomable { cursor: zoom-in; }
.stock-gallery-zoom-hint {
  position: absolute;
  right: 12px;
  bottom: 12px;
  width: 34px;
  height: 34px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: rgba(20, 24, 32, 0.55);
  color: #fff;
  font-size: 15px;
  pointer-events: none;
  opacity: 0;
  transform: translateY(4px);
  transition: opacity 0.18s ease, transform 0.18s ease;
}
.stock-gallery-main.is-zoomable:hover .stock-gallery-zoom-hint,
.stock-gallery-main.is-zoomable:focus-visible .stock-gallery-zoom-hint {
  opacity: 1;
  transform: translateY(0);
}

/* ---------- Stock car photo lightbox ---------- */
.stock-lightbox {
  position: fixed;
  inset: 0;
  z-index: 1000;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  background: rgba(10, 12, 16, 0.94);
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.2s ease;
}
.stock-lightbox.is-open { opacity: 1; visibility: visible; }
.stock-lightbox-stage {
  position: relative;
  width: min(92vw, 1100px);
  height: min(78vh, 780px);
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  touch-action: none;
}
#stock-lightbox-img {
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
  cursor: zoom-in;
  user-select: none;
  -webkit-user-drag: none;
  transform-origin: 50% 50%;
  will-change: transform;
}
#stock-lightbox-img.is-zoomed { cursor: grab; }
#stock-lightbox-img.is-panning { cursor: grabbing; }
.stock-lightbox-close,
.stock-lightbox-nav {
  position: absolute;
  border: none;
  background: rgba(255, 255, 255, 0.1);
  color: #fff;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background 0.15s ease;
}
.stock-lightbox-close:hover,
.stock-lightbox-nav:hover { background: rgba(255, 255, 255, 0.22); }
.stock-lightbox-close {
  top: 18px;
  right: 18px;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  font-size: 24px;
  line-height: 1;
  z-index: 2;
}
.stock-lightbox-nav {
  top: 50%;
  transform: translateY(-50%);
  width: 48px;
  height: 48px;
  border-radius: 50%;
  font-size: 26px;
  line-height: 1;
  z-index: 2;
}
.stock-lightbox-prev { left: 14px; }
.stock-lightbox-next { right: 14px; }
.stock-lightbox-footer {
  margin-top: 14px;
  display: flex;
  align-items: center;
  gap: 14px;
  color: rgba(255, 255, 255, 0.75);
  font-size: 13px;
}
.stock-lightbox-counter { font-weight: 700; color: #fff; }

@media (max-width: 640px) {
  .stock-lightbox-nav { width: 40px; height: 40px; font-size: 22px; }
  .stock-lightbox-prev { left: 6px; }
  .stock-lightbox-next { right: 6px; }
  .stock-lightbox-footer { flex-direction: column; gap: 4px; text-align: center; padding: 0 16px; }
}

.stock-gallery-thumbs {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  gap: 8px;
  margin-top: 10px;
}
/* Same min-width:auto grid-item default fixed above for
   .stock-detail-grid, applied here too — this 5-column grid is the
   other place a photo-heavy my-car-details.php car (40+ thumbnails
   loading in one at a time) can keep nudging wider as each thumbnail
   image finishes loading and its intrinsic size gets re-measured.
   Targets direct children generically since the grid item differs by
   page: .stock-gallery-thumb-wrap on my-car-details.php, the bare
   .stock-gallery-thumb button itself on auction-lot.php/stock_car.php
   (see the comment on .stock-gallery-thumb-wrap just below). */
.stock-gallery-thumbs > * {
  min-width: 0;
}
.stock-gallery-thumb-wrap {
  position: relative;
  aspect-ratio: 4 / 3;
}
/* aspect-ratio pinned directly on the button, not just on
   .stock-gallery-thumb-wrap above — my-car-details.php wraps this
   button in that wrap div (it needs position:relative there to host
   the admin badge/checkbox overlays), but auction-lot.php and
   stock_car.php render this button as a bare grid item with no wrap at
   all. Without a definite height from somewhere, `height:100%` here
   can't resolve against .stock-gallery-thumbs' auto-sized grid row, so
   it fell back to each photo's own natural aspect ratio — one unusually
   tall auction-sheet scan (a normal occurrence; the diagram/damage-code
   sheet photo especially) would inflate that whole row's height via
   CSS Grid's default align-items:stretch, visibly stretching every
   other thumbnail in the same row along with it. Setting aspect-ratio
   here directly makes every thumbnail button a fixed 4:3 box regardless
   of its own photo's shape or which page renders it, so this fix covers
   all three pages through this one shared selector. */
.stock-gallery-thumb {
  display: block;
  width: 100%;
  height: 100%;
  aspect-ratio: 4 / 3;
  border: 2px solid transparent;
  border-radius: var(--radius-sm);
  overflow: hidden;
  padding: 0;
  background: var(--surface-alt);
}
.stock-gallery-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.stock-gallery-thumb.is-active { border-color: var(--blue-500); }

/* Auction lot detail — Damage Code Reference, collapsed by default,
   sitting under the photo thumbnails inside .stock-gallery so members
   can cross-check codes on the auction-sheet scan (usually the first
   gallery photo) without leaving the page. Marker/rotation styling
   modeled on .payment-history above; card chrome (border/background)
   is new since this needs to read as a standalone card, not an inline
   toggle like .payment-history or a borderless section like
   .jt-adv-filters. */
.jt-damage-ref {
  margin-top: 16px;
  border: 1px solid var(--border-default);
  border-radius: var(--radius-sm);
  background: var(--surface-alt);
  padding: 12px 16px;
}
.jt-damage-ref summary {
  cursor: pointer;
  font-weight: 700;
  font-size: 14px;
  color: var(--heading-color);
  list-style: none;
  user-select: none;
}
.jt-damage-ref summary::-webkit-details-marker { display: none; }
.jt-damage-ref summary::before {
  content: "▸";
  display: inline-block;
  margin-right: 8px;
  font-size: 11px;
  color: var(--text-muted);
  transition: transform 0.15s ease;
}
.jt-damage-ref[open] summary::before { transform: rotate(90deg); }
.jt-damage-ref summary:hover { color: var(--blue-500); }
.jt-damage-ref-body { margin-top: 12px; }
.jt-damage-ref-body .field-hint { margin: 0 0 10px; }
.jt-damage-ref-body .guide-table { background: var(--surface); border-radius: var(--radius-sm); }
.jt-damage-ref-body .guide-table td { padding: 8px 10px; font-size: 13px; }
.jt-damage-ref-body .guide-note { margin: 12px 0; }

/* AI Inspection Sheet Translation — auction-lot.php, right under
   .jt-damage-ref above (same card chrome). Only rendered at all when
   jt_auction_inspection_translation() (inc/auctions.php) finds a
   non-empty result for this lot's own Firestore vehicle doc — most
   lots won't have one yet, since it's generated on-demand from the
   app, not the web. Pure-CSS tab switching (radio + :checked + general
   sibling combinator) rather than JS. The AI Inspection Issues modal
   further down reuses these same .jt-itr-tab/.jt-itr-panel/.jt-itr-radio
   BASE styles for its own, separate tab group — safe to share styling
   because the actual show/hide toggle rules below are keyed to this
   section's specific #jt-itr-* ids, not the shared classes, and the AI
   Issues modal has its own distinct #jt-aiiss-* ids (see that block
   further down) so the two groups never collide even when both are
   present on the same page at once. */
.jt-itr {
  margin-top: 16px;
  border: 1px solid var(--border-default);
  border-radius: var(--radius-sm);
  background: var(--surface-alt);
  padding: 12px 16px;
}
.jt-itr h4 { margin: 0 0 6px; font-size: 14px; font-weight: 700; color: var(--heading-color); }
.jt-itr .field-hint { margin: 0 0 12px; }
.jt-itr-radio { position: absolute; opacity: 0; width: 0; height: 0; pointer-events: none; }
.jt-itr-tabs { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 12px; }
.jt-itr-tab {
  padding: 5px 14px;
  border-radius: 999px;
  border: 1px solid var(--border-default);
  background: var(--surface);
  cursor: pointer;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.03em;
  color: var(--text-muted);
  transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
.jt-itr-tab:hover { color: var(--heading-color); }
.jt-itr-panel { display: none; font-size: 14px; line-height: 1.65; color: var(--text-body); }
.jt-itr-panel h5 { margin: 14px 0 6px; font-size: 13px; font-weight: 700; color: var(--heading-color); }
.jt-itr-panel h5:first-child { margin-top: 0; }
.jt-itr-panel p { margin: 0 0 10px; }
.jt-itr-panel ul { margin: 0 0 10px 20px; padding: 0; }
.jt-itr-panel li { margin-bottom: 4px; }

/* One static rule per fixed language code (tr/en/de/fr/nl/es/ru) — see
   JT_INSPECTION_TRANSLATION_LANGS in inc/auctions.php for why these ids
   are safe to hardcode rather than generate dynamically. */
#jt-itr-tr:checked ~ .jt-itr-tabs label[for="jt-itr-tr"],
#jt-itr-en:checked ~ .jt-itr-tabs label[for="jt-itr-en"],
#jt-itr-de:checked ~ .jt-itr-tabs label[for="jt-itr-de"],
#jt-itr-fr:checked ~ .jt-itr-tabs label[for="jt-itr-fr"],
#jt-itr-nl:checked ~ .jt-itr-tabs label[for="jt-itr-nl"],
#jt-itr-es:checked ~ .jt-itr-tabs label[for="jt-itr-es"],
#jt-itr-ru:checked ~ .jt-itr-tabs label[for="jt-itr-ru"] {
  background: linear-gradient(135deg, var(--gold-400), var(--gold-500));
  color: #1a1a1a;
  border-color: var(--gold-500);
}
#jt-itr-tr:checked ~ .jt-itr-panel[data-lang="tr"],
#jt-itr-en:checked ~ .jt-itr-panel[data-lang="en"],
#jt-itr-de:checked ~ .jt-itr-panel[data-lang="de"],
#jt-itr-fr:checked ~ .jt-itr-panel[data-lang="fr"],
#jt-itr-nl:checked ~ .jt-itr-panel[data-lang="nl"],
#jt-itr-es:checked ~ .jt-itr-panel[data-lang="es"],
#jt-itr-ru:checked ~ .jt-itr-panel[data-lang="ru"] {
  display: block;
}

/* AI Inspection Issues — button trigger (near the Damage Code Reference
   section) + the modal it opens (further down, near the Estimated Cost
   Calculator modal in the markup). See jt_auction_inspection_ai_issues()
   in inc/auctions.php: a short structured list of AI-detected issues,
   distinct from the free-text AI Inspection Sheet Translation above.
   Modal tab group reuses .jt-itr-tab/.jt-itr-panel/.jt-itr-radio base
   styles (see that block's own comment above) with its own #jt-aiiss-*
   ids. */
/* Shared row for the AI Inspection Report + AI Inspection Sheet
   Translation trigger buttons — side by side per direct request,
   wrapping to two lines on narrow screens rather than each button
   claiming its own full-width row. */
.jt-ai-triggers-row { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 16px; }
.jt-aiiss-trigger { display: inline-flex; align-items: center; gap: 8px; }
.jt-aiiss-count {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 20px;
  height: 20px;
  padding: 0 6px;
  border-radius: 999px;
  background: linear-gradient(135deg, var(--gold-400), var(--gold-500));
  color: #1a1a1a;
  font-size: 11px;
  font-weight: 800;
}
.jt-aiiss-modal-card { max-width: 560px; max-height: 80vh; overflow-y: auto; }
.jt-aiiss-vin { margin: 0 0 12px; font-size: 13px; color: var(--text-body); }
.jt-aiiss-panel ul { margin: 0; padding: 0 0 0 20px; }
.jt-aiiss-panel li { margin-bottom: 8px; font-size: 14px; line-height: 1.55; }

#jt-aiiss-tr:checked ~ .jt-itr-tabs label[for="jt-aiiss-tr"],
#jt-aiiss-en:checked ~ .jt-itr-tabs label[for="jt-aiiss-en"],
#jt-aiiss-de:checked ~ .jt-itr-tabs label[for="jt-aiiss-de"],
#jt-aiiss-fr:checked ~ .jt-itr-tabs label[for="jt-aiiss-fr"],
#jt-aiiss-nl:checked ~ .jt-itr-tabs label[for="jt-aiiss-nl"],
#jt-aiiss-es:checked ~ .jt-itr-tabs label[for="jt-aiiss-es"],
#jt-aiiss-ru:checked ~ .jt-itr-tabs label[for="jt-aiiss-ru"] {
  background: linear-gradient(135deg, var(--gold-400), var(--gold-500));
  color: #1a1a1a;
  border-color: var(--gold-500);
}
#jt-aiiss-tr:checked ~ .jt-itr-panel[data-lang="tr"],
#jt-aiiss-en:checked ~ .jt-itr-panel[data-lang="en"],
#jt-aiiss-de:checked ~ .jt-itr-panel[data-lang="de"],
#jt-aiiss-fr:checked ~ .jt-itr-panel[data-lang="fr"],
#jt-aiiss-nl:checked ~ .jt-itr-panel[data-lang="nl"],
#jt-aiiss-es:checked ~ .jt-itr-panel[data-lang="es"],
#jt-aiiss-ru:checked ~ .jt-itr-panel[data-lang="ru"] {
  display: block;
}

/* Similar Cars — auction-lot.php, right under .jt-damage-ref above (same
   left-column card chrome). Deliberately a plain always-visible <ul>,
   NOT another <details> accordion like .jt-damage-ref — these are
   comparables the member is meant to actually see, not reference
   material tucked away until asked for. */
.jt-similar-cars {
  margin-top: 16px;
  border: 1px solid var(--border-default);
  border-radius: var(--radius-sm);
  background: var(--surface-alt);
  padding: 12px 16px;
}
.jt-similar-cars h4 {
  margin: 0 0 10px;
  font-weight: 700;
  font-size: 14px;
  color: var(--heading-color);
}
.jt-similar-cars-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.jt-similar-cars-item {
  background: var(--surface);
  border-radius: var(--radius-sm);
  padding: 8px 10px;
}
.jt-similar-cars-makemodel {
  display: flex;
  flex-direction: column;
  line-height: 1.3;
}
.jt-similar-cars-makemodel strong { font-size: 13px; color: var(--heading-color); }
.jt-similar-cars-makemodel span { font-size: 13px; color: var(--text-muted); }
.jt-similar-cars-meta {
  margin-top: 4px;
  font-size: 12px;
  color: var(--text-muted);
  line-height: 1.6;
}

/* One Price Cars detail page — Encar readside-enrichment sections
   (warranty/condition badges, dealer contact, underbody photo grid).
   Plain, non-interactive (unlike .stock-gallery-thumbs above), so no
   is-active/click state is needed. */
.op-detail-section { margin-top: 28px; }
.op-detail-section h3 { margin-bottom: 10px; }
.op-badge-row { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 4px; }
.op-dealer-block { font-size: 14px; color: var(--text-muted); line-height: 1.6; }
.op-dealer-block strong { color: var(--text-body); }
.op-underbody-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(110px, 1fr));
  gap: 8px;
  margin-top: 12px;
}
.op-underbody-grid img {
  width: 100%;
  aspect-ratio: 4 / 3;
  object-fit: cover;
  border-radius: var(--radius-sm);
  display: block;
  background: var(--surface-alt);
}

/* Admin-only per-photo delete checkbox, overlaid on its thumbnail — a
   sibling of the thumbnail button (not nested inside it, since a
   checkbox inside a <button> would be invalid and fight the button's
   own click-to-preview handler) positioned via the shared wrap above. */
.jt-thumb-select {
  position: absolute;
  top: 4px;
  right: 4px;
  z-index: 2;
  display: flex;
  background: rgba(20, 24, 32, 0.55);
  border-radius: 4px;
  padding: 3px;
  cursor: pointer;
}
.jt-thumb-select input[type="checkbox"] {
  width: 16px;
  height: 16px;
  margin: 0;
  accent-color: var(--danger);
}

/* "Set as Thumbnail" / current-thumbnail badge — bottom of each admin
   gallery thumb on my-car-details.php (see api/admin-set-thumbnail.php
   and .jt-thumb-select above, which owns the opposite top-right
   corner for the delete checkbox). */
.jt-thumb-badge, .jt-thumb-set-btn {
  position: absolute;
  bottom: 4px;
  left: 4px;
  right: 4px;
  z-index: 2;
  font-size: 10px;
  line-height: 1.3;
  text-align: center;
  border-radius: 4px;
  padding: 3px 4px;
}
.jt-thumb-badge {
  background: rgba(37, 99, 235, 0.9);
  color: #fff;
  font-weight: 700;
  pointer-events: none;
}
.jt-thumb-set-btn {
  background: rgba(20, 24, 32, 0.72);
  color: #fff;
  border: none;
  cursor: pointer;
  opacity: 0;
  transition: opacity 0.15s ease;
}
.stock-gallery-thumb-wrap:hover .jt-thumb-set-btn,
.jt-thumb-set-btn:focus-visible {
  opacity: 1;
}
.jt-thumb-set-btn:disabled { opacity: 1; cursor: default; }

.stock-price-block { text-align: center; margin-bottom: 18px; }
.stock-price-value { font-size: 30px; font-weight: 800; color: var(--heading-color); margin: 4px 0 8px; }

/* Shown on one-price-car.php instead of a price when jt_encar_car_has_price()
   is false — a cold session cache fell back to a price-less lookup, so we
   warn rather than ever show a fabricated near-zero price. */
.jt-notice { border-radius: 10px; padding: 12px 14px; font-size: 13.5px; line-height: 1.5; text-align: left; }
.jt-notice-warn { background: color-mix(in srgb, var(--warning, #d97706) 12%, transparent); border: 1px solid color-mix(in srgb, var(--warning, #d97706) 35%, transparent); color: var(--heading-color); }

@media (max-width: 900px) {
  .stock-detail-grid { grid-template-columns: 1fr; }
}

[dir="rtl"] .stock-table th { text-align: right; }
[dir="rtl"] .stock-table td[data-label]::before { text-align: right; }

/* ---------- Admin car-management (My Cars: Edit Invoice / Edit
   Vehicle / Delete Vehicle / Add Payment modals) ---------- */
.btn-secondary {
  background: var(--surface-alt);
  color: var(--text-body);
  border-color: var(--border-default);
}
.btn-secondary:hover { border-color: var(--text-muted); }
.btn-danger {
  background: var(--danger);
  color: var(--white);
}
.btn-danger:hover { filter: brightness(1.08); transform: translateY(-1px); }
.btn-success {
  background: var(--success);
  color: var(--white);
}
.btn-success:hover { filter: brightness(1.08); transform: translateY(-1px); }

.jt-admin-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  margin-bottom: 8px;
}
.jt-admin-btn {
  font-size: 10.5px;
  font-weight: 700;
  padding: 3px 8px;
  border-radius: 6px;
  border: 1px solid var(--border-default);
  background: var(--surface-alt);
  color: var(--text-body);
  cursor: pointer;
  line-height: 1.6;
}
.jt-admin-btn:hover { border-color: var(--blue-500); color: var(--blue-500); }
.jt-admin-btn-danger { border-color: rgba(224, 75, 75, 0.4); color: var(--danger); }
.jt-admin-btn-danger:hover { border-color: var(--danger); background: rgba(224, 75, 75, 0.1); }
.jt-admin-btn-pay { border-color: rgba(47, 179, 128, 0.4); color: var(--success); }
.jt-admin-btn-pay:hover { border-color: var(--success); background: rgba(47, 179, 128, 0.1); }

.modal-card-lg { max-width: 720px; }

.modal-section-title {
  font-size: 11px; text-transform: uppercase; letter-spacing: .05em; color: var(--text-muted);
  font-weight: 700; margin: 22px 0 10px; padding-bottom: 6px; border-bottom: 1px solid var(--border-subtle);
}
.modal-section-title:first-of-type { margin-top: 4px; }

.field-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 12px 16px;
  margin-bottom: 10px;
}
.field-grid .field { margin-bottom: 0; }
.field textarea {
  width: 100%;
  padding: 12px 14px;
  border-radius: var(--radius-sm);
  border: 1.5px solid var(--border-default);
  font-size: 14.5px;
  font-family: inherit;
  background: var(--surface);
  color: var(--text-body);
  resize: vertical;
}

.jt-admin-section-title {
  font-size: 12px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--text-muted);
  margin: 18px 0 8px;
}
/* Edit Invoice's "auto-calculated from JPY..." note — .field-hint is
   normally a small caption under a single input, but reused here right
   inside .jt-admin-section-title, which otherwise forces bold/uppercase/
   letter-spacing onto anything inside it. Reset those three so the hint
   reads as a normal, calm caption instead of shouting like the heading
   above it. */
.jt-admin-section-title .jt-admin-rate-hint {
  display: block;
  text-transform: none;
  font-weight: 400;
  letter-spacing: normal;
  margin-top: 2px;
}
.jt-admin-radio-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px 16px;
  font-size: 13.5px;
  margin-bottom: 10px;
}
.jt-admin-radio-row-label { font-weight: 600; color: var(--text-body); }
.jt-admin-checkbox-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
  gap: 6px 16px;
  font-size: 13.5px;
  margin: 10px 0;
}
.jt-admin-notify-details { margin: 14px 0; }
.jt-admin-notify-details summary {
  cursor: pointer;
  font-weight: 700;
  font-size: 13.5px;
  color: var(--blue-500);
  margin-bottom: 10px;
}
.jt-admin-credit-list { margin-bottom: 14px; }
.jt-admin-credit-row {
  display: block;
  padding: 8px 10px;
  border: 1px solid var(--border-default);
  border-radius: var(--radius-sm);
  margin-bottom: 6px;
  font-size: 13.5px;
}

/* ---------- Crop the auction-sheet caption text baked into the bottom
   of My Cars photos (my-car-details.php only — stock_car.php shares the
   same .stock-gallery-main/.stock-gallery-thumb/#stock-lightbox markup
   and is left untouched, since its photos aren't captioned).
   clip-path hides the bottom ~11% of the photo's own box, with no
   change to the image's rendered size — unlike a scale() transform, it
   can never make the photo look enlarged/zoomed, which matters here
   since this is the one page-specific rule that visibly differs from
   every other detail page (stock_car.php, auction-lot.php) and was a
   suspect in the Safari "page keeps growing" investigation. (It was
   tested disabled outright as a diagnostic and separately confirmed by
   the user not to affect that report — the real cause turned out to be
   Safari's automatic text-size-adjust — but scale() was still swapped
   for clip-path here because it's strictly the better tool for a crop:
   same visual result, without ever changing the image's apparent
   size/zoom level, and it matches the approach #stock-lightbox already
   uses below for the exact same caption.) To adjust the crop depth: a
   thinner caption strip -> try inset(0 0 6% 0); a taller caption block
   -> try inset(0 0 18% 0). Applies to both the main photo and the
   thumbnail strip; see .jt-cars-table below for the same treatment on
   the My Cars list-page thumbnails. */
.jt-crop-bottom .stock-gallery-main img,
.jt-crop-bottom .stock-gallery-thumb img {
  clip-path: inset(0 0 11% 0);
}

/* Same caption crop, applied to the small thumbnail on the My Cars
   list page (my-cars.php) itself, not just the detail page. Scoped to
   .jt-cars-table (my-cars.php's own class on its <table>, see further
   down) rather than the bare .stock-table-thumb, since that class is
   shared by auctions.php/stock_cars.php/my-favorites.php/my-bids.php
   etc. — auction-feed photos there have no baked-in caption to hide,
   so cropping them would just lose real photo content for no reason. */
.jt-cars-table .stock-table-thumb img {
  clip-path: inset(0 0 11% 0);
}

/* Full-screen lightbox view of the same photos also needs the caption
   cropped — previously it deliberately showed the untouched original
   (see prior version of this comment) but the caption strip was still
   visible there, which defeats the point of hiding it everywhere else.
   Can't reuse the scale-transform trick above: assets/js/main.js's
   lightbox zoom/pan feature drives #stock-lightbox-img's `transform`
   directly via inline style (applyTransform()) on open/zoom/pan, which
   would instantly overwrite any transform set here in CSS. clip-path
   is untouched by that JS, and — unlike transform — clip-path is
   applied in the element's own box before any transform, so it scales
   and pans together with the user's zoom/drag instead of resetting;
   the hidden bottom 11% stays hidden at every zoom level. #stock-lightbox
   only carries .jt-crop-bottom on my-car-details.php (added directly on
   that element there, not inherited from .stock-gallery above, since the
   lightbox sits outside the .stock-gallery wrapper in the markup). */
#stock-lightbox.jt-crop-bottom #stock-lightbox-img {
  clip-path: inset(0 0 11% 0);
}

/* ---------- My Cars: Auction Date column (wider now that it also
   holds the admin-only Consignee button) + Consignee viewer modal ---------- */
.stock-th-date { min-width: 132px; }

.jt-admin-consignee-info {
  font-size: 14px;
  line-height: 1.7;
  margin-bottom: 14px;
}
.jt-admin-consignee-stock { font-weight: 700; color: var(--heading-color); margin-bottom: 6px; }
.jt-admin-consignee-destination {
  font-size: 13.5px;
  padding: 10px 12px;
  border-radius: var(--radius-sm);
  background: var(--surface-alt);
  margin-bottom: 8px;
}
.jt-admin-consignee-destination-value { font-weight: 600; color: var(--heading-color); }
.jt-admin-consignee-move {
  font-size: 13px;
  color: var(--blue-500);
  font-weight: 600;
  min-height: 1em;
  margin-bottom: 8px;
}
.jt-admin-consignee-presets {
  display: flex;
  flex-direction: column;
  gap: 6px;
  max-height: 260px;
  overflow-y: auto;
}
.jt-admin-consignee-preset {
  text-align: left;
  font-size: 13px;
  padding: 9px 12px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border-default);
  background: var(--surface);
  color: var(--text-body);
  cursor: pointer;
}
.jt-admin-consignee-preset:hover { border-color: var(--blue-500); }
.jt-admin-consignee-preset.is-selected { background: var(--danger); border-color: var(--danger); color: var(--white); }
.jt-admin-consignee-preset-move { border-style: dashed; font-style: italic; }

/* ---------- My Cars: a bit more breathing room + alternating row
   tint, easier to try/revert since it's isolated to .jt-cars-table
   (added only in my-cars.php) rather than touching the shared
   .stock-table used by Stock Cars too. ---------- */
.jt-cars-table td { padding-top: 16px; padding-bottom: 16px; }
.jt-cars-table tbody tr:nth-child(even) { background: var(--surface-alt); }
.jt-cars-table tbody tr:hover { background: rgba(47, 111, 237, 0.06); }
[data-theme="dark"] .jt-cars-table tbody tr:hover { background: rgba(84, 144, 255, 0.1); }

/* ---------- Live Auctions: bid form's live JPY -> customer-currency
   cost estimate (auction-lot.php). This project doesn't use Bootstrap
   (no .alert/.row classes exist elsewhere in this file), so this is a
   small dedicated component rather than borrowing legacy class names
   that were never actually ported here. ---------- */
.jt-bid-estimate {
  background: var(--surface-alt);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-sm);
  padding: 12px 14px;
  margin-bottom: 14px;
  font-size: 13.5px;
}
.jt-bid-estimate-row { display: flex; justify-content: space-between; gap: 12px; padding: 3px 0; color: var(--text-muted); }
.jt-bid-estimate-row strong { color: var(--text-body); }
.jt-bid-estimate-total { margin-top: 4px; padding-top: 8px; border-top: 1px solid var(--border-subtle); font-size: 15px; }
.jt-bid-estimate-total span, .jt-bid-estimate-total strong { color: var(--heading-color); font-weight: 700; }

/* ---------- Live Auctions: Estimated Cost Calculator (i)-button +
   modal (auction-lot.php) — the "Your bid" label row gets its own flex
   wrapper just for this trigger, and the modal reuses .sc-modal-card's
   sizing/padding (Korean Cars' Service Charge modal) rather than
   defining a third variant of the same "narrow centered modal" look.
   ---------- */
.jt-field-label-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 7px; }
.jt-field-label-row label { margin-bottom: 0; }
.jt-cost-calc-trigger {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  height: 30px;
  border-radius: 50%;
  border: none;
  /* Solid gold fill instead of a subtle outline — the previous version
     (muted text on a near-invisible border) was hard to spot next to the
     bid field, especially in dark mode where --surface-alt and
     --border-subtle are both close to the page background. Reuses the
     site's existing --gold-500/--gold-400 brand tokens (already the
     hover accent elsewhere) rather than a new one-off color, and a solid
     fill with a dark icon reads clearly against both a white and a
     navy-dark background without needing separate per-theme colors for
     the icon itself. */
  background: var(--gold-500);
  color: var(--navy-900);
  font-size: 19px;
  line-height: 1;
  cursor: pointer;
  flex-shrink: 0;
  box-shadow: var(--shadow-sm);
  transition: background 0.15s ease, transform 0.15s ease;
}
.jt-cost-calc-trigger:hover { background: var(--gold-400); transform: scale(1.07); }
[data-theme="dark"] .jt-cost-calc-trigger { background: var(--gold-400); }
[data-theme="dark"] .jt-cost-calc-trigger:hover { background: var(--gold-500); }

.jt-cc-reference {
  border-bottom: 1px solid var(--border-subtle);
  padding-bottom: 14px;
  margin-bottom: 14px;
}
.jt-cc-row { display: flex; justify-content: space-between; gap: 12px; padding: 3px 0; font-size: 14px; color: var(--text-muted); }
.jt-cc-row-editable { align-items: center; }
.jt-cc-row-editable label { margin-bottom: 0; }
.jt-cc-tax-input-wrap {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  border: 1px solid var(--border-default);
  border-radius: var(--radius-sm);
  background: var(--surface);
  padding: 2px 8px;
}
.jt-cc-tax-input-wrap input {
  width: 46px;
  border: none;
  background: transparent;
  padding: 4px 0;
  text-align: right;
  font-size: 14px;
  font-weight: 600;
  color: var(--text-body);
}
.jt-cc-tax-input-wrap input:focus { outline: none; box-shadow: none; }
.jt-cc-tax-input-wrap span { font-size: 13px; color: var(--text-muted); }
.jt-cc-row strong { color: var(--text-body); font-weight: 600; }
.jt-cc-breakdown {
  background: var(--surface-alt);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-sm);
  padding: 12px 14px;
}
.jt-cc-row-total { margin-top: 4px; padding-top: 8px; border-top: 1px solid var(--border-subtle); font-size: 16px; }
.jt-cc-row-total span, .jt-cc-row-total strong { color: var(--heading-color); font-weight: 800; }
.jt-cc-note {
  margin: 16px 0 0;
  padding-top: 14px;
  border-top: 1px solid var(--border-subtle);
  font-size: 12.5px;
  font-style: italic;
  color: var(--text-muted);
}
.jt-cc-empty-hint { margin: 14px 0 0; font-size: 13px; color: var(--text-muted); text-align: center; }
.jt-cc-for-bidder { margin: -8px 0 14px; font-size: 13px; color: var(--text-muted); text-align: center; font-weight: 600; }
.jt-cc-fallback-note {
  margin: 12px 0 0;
  padding: 10px 12px;
  border-radius: var(--radius-sm);
  background: color-mix(in srgb, var(--warning-color, #b8860b) 12%, transparent);
  border: 1px solid color-mix(in srgb, var(--warning-color, #b8860b) 30%, transparent);
  font-size: 12.5px;
  color: var(--text-body);
}

/* ---------- Live Auctions: bid input in "thousands of yen" convention
   (auction-lot.php) — a single input-group look (¥ prefix, ,000
   suffix) instead of a bare <input>, so the shorthand reads clearly
   rather than looking like a typo. ---------- */
/* Wraps .jt-bid-input-wrap + the (i) cost-calc trigger side by side — the
   button lives outside the bordered/rounded input-group box itself
   (rather than as a flex child inside it) so its circular shape and
   gold fill don't get clipped by the group's own overflow:hidden and
   border-radius. */
.jt-bid-input-row { display: flex; align-items: center; gap: 8px; }
.jt-bid-input-row .jt-bid-input-wrap { flex: 1; min-width: 0; }
.jt-bid-input-wrap {
  display: flex;
  align-items: center;
  border: 1px solid var(--border-default);
  border-radius: var(--radius-sm);
  background: var(--surface);
  overflow: hidden;
}
.jt-bid-input-wrap .jt-bid-input-prefix,
.jt-bid-input-wrap .jt-bid-input-suffix {
  padding: 0 10px;
  font-size: 14px;
  font-weight: 600;
  color: var(--text-muted);
  white-space: nowrap;
}
.jt-bid-input-wrap input {
  flex: 1;
  min-width: 0;
  border: none;
  border-radius: 0;
  padding: 10px 4px;
  background: transparent;
}
.jt-bid-input-wrap input:focus { outline: none; box-shadow: none; }
/* This is a type="number" input too — picks up the global spin-button
   suppression above, so the bid box next to the ¥ prefix stays one
   clean field instead of growing a stepper control on the right. */
.field.is-invalid .jt-bid-input-wrap { border-color: var(--danger); }
.field.is-valid .jt-bid-input-wrap { border-color: var(--success); }

/* ---------- Live Auctions: My Bids / All Bids status badge + scope
   toggle (my-bids.php, auction-bids.php) ---------- */
.jt-badge-muted { background: rgba(148, 163, 184, 0.18); color: var(--text-muted); }
[data-theme="dark"] .jt-badge-muted { background: rgba(148, 163, 184, 0.22); color: #cbd5e1; }
.jt-bids-scope-toggle { display: flex; gap: 6px; margin-left: auto; }

/* ---------- Live Auctions / My Bids / All Bids: collapsible "More
   Filters" advanced filter panel (year/price/mileage/transmission/
   fuel type/body type/score) — sits inside the same .jt-deposits-search
   flex row as the primary search fields, but always takes the full
   row width so its grid doesn't get squeezed next to them. ---------- */
/* flex: 1 1 100% (not just flex-basis) + an explicit width, because
   Safari has a real, reported bug where a <details> flex item's box
   isn't correctly resized when its content toggles open — the .field
   grid below then paints at its natural size without the surrounding
   .jt-deposits-search row (and the page content after it) reflowing to
   make room, which is exactly what "More Filters overlapping the page"
   looks like. This alone doesn't fully work around Safari's bug (see
   the forced-reflow-on-toggle JS in main.js for the rest of the fix),
   but it removes any ambiguity in how wide/how much this box should
   grow/shrink to, which is what a flex-basis-only declaration leaves
   Safari to guess at. min-width: 0 stops it from ever overflowing the
   row on a narrow (mobile) viewport the way a flex item's default
   min-width: auto can. */
.jt-adv-filters { flex: 1 1 100%; width: 100%; min-width: 0; margin-top: 2px; }
.jt-adv-filters summary {
  cursor: pointer;
  font-size: 13px;
  font-weight: 600;
  color: var(--text-muted);
  padding: 4px 0;
  user-select: none;
}
.jt-adv-filters summary:hover { color: var(--text-body); }
.jt-adv-filters-grid {
  display: grid;
  /* Was 160px — a touch too tight for the range-pair fields (two number
     inputs plus a dash), which is what made those specific cells look
     squeezed while the single-input fields next to them had room to
     spare. */
  grid-template-columns: repeat(auto-fill, minmax(190px, 1fr));
  gap: 14px 16px;
  margin-top: 12px;
  padding: 16px;
  background: var(--surface-alt);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-sm);
}
.jt-adv-filters-grid .field { margin-bottom: 0; display: flex; flex-direction: column; gap: 7px; min-width: 0; }
.jt-adv-filters-grid .field label {
  font-size: 11.5px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  color: var(--text-muted);
}
/* Single short-value fields (Max Mileage, Min Score) don't need to
   stretch to fill a full grid column the way a range pair or a
   long-option select does — capping their width and left-aligning them
   in their cell (grid items stretch to fill by default) keeps them
   visually proportional to the number they actually hold. */
.jt-adv-filters-grid .field-narrow {
  max-width: 130px;
  justify-self: start;
}
@media (max-width: 640px) {
  .jt-adv-filters-grid .field-narrow { max-width: none; justify-self: stretch; }
}
/* Higher specificity than the pre-existing ".jt-deposits-search .field
   input/select" rule above — every field here shares that same fixed
   height/border/radius so the "More Filters" panel reads as one
   continuous, consistent grid rather than a mix of sizes. */
.jt-deposits-search .jt-adv-filters-grid .field input,
.jt-deposits-search .jt-adv-filters-grid .field select {
  width: 100%;
  height: 42px;
  padding: 0 14px;
  font-size: 13.5px;
  line-height: 40px;
  /* Neutralizes ".jt-deposits-search .field select { flex: 0 1 190px; }"
     (meant to size the Make/Model selects in the row-direction top
     search bar, where flex-basis controls width) — that same rule also
     matches selects here since they're still descendants of
     .jt-deposits-search, but each .field in THIS grid is a
     column-direction flex container, where flex-basis controls HEIGHT
     instead. That's what was inflating Transmission/Fuel Type/Body Type
     to ~190px tall. Resetting flex here removes the leak. */
  flex: none;
}
.jt-deposits-search .jt-adv-filters-grid .field select {
  appearance: none;
  -webkit-appearance: none;
  -moz-appearance: none;
  padding-right: 36px;
  background-image: var(--select-arrow);
  background-repeat: no-repeat;
  background-position: right 12px center;
  background-size: 12px;
  cursor: pointer;
  /* Same fix as .jt-deposits-search .field select above: the 40px
     line-height meant for text inputs was making Transmission/Fuel
     Type/Body Type render visibly taller than the year/price/mileage
     number fields next to them. */
  line-height: normal;
}
/* Number-input spinner is hidden globally now (see the input[type="number"]
   rule near the top of this file) — no scoped override needed here. */
/* Real root cause of the Min/Max range-pair inputs overlapping each other
   (Year, Start Price, Mileage, Engine — reported on both auctions.php and
   sold-cars.php, and in Chrome as well as Safari, so it was never actually
   a Safari-only bug). The ".field input" rule right above sets
   `flex: none` (flex-grow:0 flex-shrink:0 flex-basis:auto) + `width: 100%`
   on every input in this grid, including the two inputs inside a
   .jt-range-pair. With flex-basis:auto, that 100% width IS used as each
   input's flex basis, and flex-shrink:0 means neither input is allowed to
   shrink to make room for the other — so both the Min and Max input each
   demand 100% of their shared row and render on top of one another. This
   rule wins over it (one more class = higher specificity) and restores
   `flex: 1 1 0` + `width: auto` so the two inputs actually share the row
   side by side, as .jt-range-pair input further down already intends for
   every other context. */
.jt-deposits-search .jt-adv-filters-grid .field .jt-range-pair input {
  /* The inputs now sit one level deeper, inside a .jt-range-input column
     (see below — added for the MIN/MAX caption + card grouping), so
     they're no longer direct flex children of .jt-range-pair themselves;
     `flex` has nothing to do here any more, and the input should simply
     fill the width of its own .jt-range-input column. */
  width: 100%;
  min-width: 0;
}
.jt-adv-filters-apply { align-self: flex-end; }
/* auctions_one.php's filter bar has no primary/quick-search row and no
   <details> wrapper — .jt-adv-filters-grid sits directly inside
   .jt-deposits-search (a flex row) as its only child. Without an
   explicit flex-basis it was sizing to its grid content's natural width
   instead of the full row, which is what made it render narrow/squeezed
   against the row's own padding instead of spanning cleanly like it
   does everywhere else (auctions.php etc. get this for free via the
   .jt-adv-filters wrapper class, which only applies inside a <details>). */
.jt-deposits-search > .jt-adv-filters-grid { flex: 1 1 100%; }
/* auctions_one.php also has a "Clear" link next to Apply, which the
   pre-existing single-button ".jt-adv-filters-apply .btn { width:100% }"
   rule would stack full-width on top of each other — side by side reads
   better for two actions. */
.jt-adv-filters-apply-group { display: flex; flex-direction: row; gap: 8px; }
.jt-adv-filters-apply-group .btn { width: auto; flex: 1; }
.jt-adv-filters-apply .btn { height: 42px; padding: 0 22px; width: 100%; }
.jt-range-pair { display: flex; align-items: flex-end; gap: 8px; min-width: 0; }
.jt-range-pair input { min-width: 0; flex: 1; width: auto; }
.jt-range-pair span { color: var(--text-muted); font-size: 13px; flex: 0 0 auto; }
/* "Pro" grouped look for the four range-pair fields (Year / Start Price /
   Mileage / Engine): wrapping each pair in a bordered card, with the
   field's own label reading as the card's heading, makes it visually
   obvious the Min and Max inputs belong to one range instead of looking
   like two unrelated fields sitting side by side. */
.jt-adv-filters-grid .jt-range-group {
  background: var(--surface);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-sm);
  padding: 10px 12px 11px;
}
.jt-adv-filters-grid .jt-range-group label { margin-bottom: 1px; }
/* Each Min/Max input gets its own mini column: a small caption above the
   box so it still reads "Min"/"Max" once the placeholder is gone (i.e.
   after the user has typed a value into it), with align-items:flex-end
   on .jt-range-pair (above) keeping the two input boxes level with each
   other even though the dash between them has no caption row of its own. */
.jt-range-input { display: flex; flex-direction: column; gap: 4px; flex: 1 1 0; min-width: 0; }
.jt-range-pair .jt-range-input-tag {
  font-size: 10px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--text-muted);
  opacity: 0.8;
}
.jt-range-dash { padding-bottom: 11px; }
@media (max-width: 640px) {
  .jt-adv-filters-grid { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 420px) {
  .jt-adv-filters-grid { grid-template-columns: 1fr; }
}

/* ---------- Live Auctions: mini thumbnail on the list grid ---------- */
.jt-auction-row-media { display: flex; align-items: center; gap: 12px; }
.jt-auction-thumb-link {
  display: block;
  flex-shrink: 0;
  border-radius: 8px;
  transition: box-shadow .15s ease;
}
.jt-auction-thumb-link:hover, .jt-auction-thumb-link:focus-visible { box-shadow: 0 0 0 2px var(--blue-500); }
.jt-auction-thumb {
  /* Was a 76x76 square — car photos are naturally wider than tall, so
     a square crop was cutting off more of the car than a rectangular
     one needs to. 4:3 is close to the source photos' own proportions
     (see jt_auction_lot_thumbnail_url()'s doc comment), so object-fit:
     cover barely has to crop anything at this ratio. */
  width: 108px;
  height: 76px;
  flex-shrink: 0;
  object-fit: cover;
  border-radius: 8px;
  background: var(--surface-muted, #f0f0f0);
  border: 1px solid var(--border-color, #e2e2e2);
  display: block;
}
@media (max-width: 640px) {
  .jt-auction-thumb { width: 80px; height: 56px; }
}

/* ---------- Live Auctions: grid-card view (auctions.php, alternative
   to the default table — toggled via the .jt-view-toggle buttons in
   the results toolbar). Reuses .stock-card/.stock-card-grid, the same
   card component auctions_one.php (Korean Cars) already uses, so the
   two listing pages share one visual language. */
.jt-auction-card-prices {
  display: flex;
  flex-direction: column;
  gap: 2px;
  margin: 0 0 6px;
  font-size: 12.5px;
  color: var(--text-muted);
}
.jt-auction-card-prices strong { color: var(--heading-color); }
.jt-auction-card-cta,
.jt-auction-card .jt-badge {
  margin-top: 8px;
}

/* auction-lot.php's Similar Cars section: auct_lots_sold has no usable
   photo data (confirmed empty/placeholder pic_urls for these archived
   rows), and there's no working detail page to link to either (these
   lot_ids belong to auct_lots_sold, a separate id-space from auct_lots,
   which is what auction-lot.php itself queries) — so these cards are
   plain info panels, not clickable links to nowhere. Drops the
   hover/pointer affordance .stock-card normally has as a link. */
.jt-auction-card-grid-nophoto .jt-auction-card {
  cursor: default;
}
.jt-auction-card-grid-nophoto .jt-auction-card:hover,
.jt-auction-card-grid-nophoto .jt-auction-card:focus-visible {
  border-color: var(--border-subtle);
  transform: none;
}

/* ---------- Live Auctions: Ask-about-this-car Q&A thread
   (auction-lot.php, member + admin views) — simple stacked message
   bubbles, no chat-widget library, consistent with this project's
   "small dedicated component" approach elsewhere on this page. ---------- */
.jt-qa-thread { display: flex; flex-direction: column; gap: 14px; margin-bottom: 4px; }
.jt-qa-item { display: flex; flex-direction: column; gap: 6px; }
.jt-qa-bubble {
  border-radius: var(--radius-sm);
  padding: 10px 12px;
  font-size: 13.5px;
  line-height: 1.5;
}
.jt-qa-question { background: var(--surface-alt); border: 1px solid var(--border-subtle); color: var(--text-body); }
.jt-qa-answer { background: rgba(47, 111, 237, 0.08); border: 1px solid rgba(47, 111, 237, 0.18); color: var(--text-body); }
[data-theme="dark"] .jt-qa-answer { background: rgba(84, 144, 255, 0.12); border-color: rgba(84, 144, 255, 0.25); }
.jt-qa-meta { font-size: 11.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.03em; color: var(--text-muted); margin-bottom: 3px; }
.jt-qa-answer-form { display: flex; flex-direction: column; gap: 8px; margin-top: 2px; }
.jt-qa-answer-form textarea { resize: vertical; }

/* ---------- Admin Analytics (analytics.php / analytics-user.php) —
   day-by-day view chart, drawn as a plain inline SVG (no charting
   library, consistent with this project's "no CDN grab-bag" head.php
   comment and its strict same-origin CSP). ---------- */
.jt-analytics-legend { display: flex; gap: 16px; margin: 4px 0 14px; flex-wrap: wrap; }
.jt-analytics-legend-item { display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; color: var(--text-muted); }
.jt-analytics-swatch { width: 10px; height: 10px; border-radius: 2px; display: inline-block; }
.jt-analytics-swatch-auction { background: var(--blue-500); }
.jt-analytics-swatch-korean { background: var(--gold-500); }
.jt-analytics-chart-wrap { width: 100%; overflow-x: auto; }
.jt-analytics-chart { width: 100%; height: 200px; min-width: 360px; display: block; }
.jt-analytics-bar-auction { fill: var(--blue-500); }
.jt-analytics-bar-korean { fill: var(--gold-500); }
.jt-analytics-axis-label { font-size: 8px; fill: var(--text-muted); }
.jt-analytics-axis-line { stroke: var(--border-default); stroke-width: 1; }

/* "Online" status dot — analytics.php's list column + analytics-user.php's
   Live Status card. Green/gray only, no text-color dependency, so it
   reads at a glance regardless of language (see jt_analytics_is_online()'s
   doc comment in inc/analytics.php for what "online" actually means —
   a recency heuristic, not true live presence). */
.jt-online-dot {
  display: inline-block;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  margin-right: 6px;
  vertical-align: middle;
}
.jt-online-dot.is-online { background: var(--success); box-shadow: 0 0 0 3px rgba(47, 179, 128, 0.18); }
.jt-online-dot.is-offline { background: var(--gray-300); }
[data-theme="dark"] .jt-online-dot.is-offline { background: var(--gray-500); }

/* The customer list (analytics.php) packs 10 columns into one table —
   table-layout:fixed + wrapping headers keeps abbreviated column titles
   ("Auction Seen", "Last 2Q", ...) readable on two lines instead of
   forcing the table wider than the page or truncating silently. Scoped
   to this specific table (not .stock-table generally) since every other
   .stock-table on the site has few enough columns that natural wrapping
   was never an issue. */
.jt-analytics-list-table { table-layout: fixed; }
.jt-analytics-list-table th {
  white-space: normal;
  word-break: break-word;
  line-height: 1.3;
  vertical-align: bottom;
}
.jt-analytics-list-table th:last-child,
.jt-analytics-list-table td:last-child { width: 64px; }

/* ---------- Homepage "What our customers say" — live Google reviews
   (index.php, data from inc/google-reviews.php). ---------- */

/* Fractional star rating (e.g. 4.7/5), not just whole/half steps: two
   identical rows of plain-text ★ characters stacked on top of each other
   — a muted background row plus a gold foreground row clipped to
   rating/5 of its own width via inline style="width:...%" (set server-
   side in jt_google_reviews_star_html()). No icon font or SVG sprite
   needed, consistent with this project's "no CDN grab-bag" approach
   elsewhere (see inc/head.php's own doc comment). */
.jt-star-rating {
  position: relative;
  display: inline-block;
  font-size: 17px;
  line-height: 1;
  letter-spacing: 2px;
  vertical-align: middle;
}
.jt-star-rating-bg { color: var(--border-subtle); }
.jt-star-rating-fg {
  position: absolute;
  inset: 0;
  overflow: hidden;
  white-space: nowrap;
  color: var(--gold-500);
}

.jt-reviews-summary {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  margin-top: 10px;
  flex-wrap: wrap;
  font-size: 15px;
}
.jt-reviews-summary strong { font-size: 20px; color: var(--heading-color); }
.jt-reviews-summary-count { color: var(--text-muted); font-size: 13.5px; }

/* Auto-sliding strip of review cards (right-to-left) instead of a
   static grid — plain CSS keyframe animation, no JS/library needed.
   index.php renders the review list TWICE back-to-back inside
   .jt-reviews-track (the second copy marked aria-hidden so screen
   readers don't hear every review twice); the animation slides the
   whole track left by exactly 50% of its own width, so the moment the
   first copy has scrolled fully off, the (identical) second copy is
   sitting exactly where the first one started — a seamless loop with
   no jump/reset visible. .jt-reviews-marquee's mask fades the two
   edges so cards don't appear to hard-cut in and out. direction:ltr is
   forced on the track (rather than inheriting the page's dir) so the
   physical slide direction stays consistent even on the Arabic (RTL)
   translation — this is a motion effect, not text, so it isn't
   mirrored the way reading order is elsewhere on the site. */
.jt-reviews-marquee {
  overflow: hidden;
  margin: 28px 0 24px;
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 4%, #000 96%, transparent);
  mask-image: linear-gradient(90deg, transparent, #000 4%, #000 96%, transparent);
}
.jt-reviews-track {
  display: flex;
  direction: ltr;
  gap: 18px;
  width: max-content;
  animation: jt-reviews-scroll 45s linear infinite;
}
.jt-reviews-marquee:hover .jt-reviews-track,
.jt-reviews-marquee:focus-within .jt-reviews-track {
  animation-play-state: paused;
}
@keyframes jt-reviews-scroll {
  from { transform: translateX(0); }
  to { transform: translateX(-50%); }
}
@media (prefers-reduced-motion: reduce) {
  .jt-reviews-track { animation: none; }
}
.jt-review-card {
  background: var(--surface-alt);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-lg);
  padding: 16px 18px 18px;
  display: flex;
  flex-direction: column;
  gap: 10px;
  flex: 0 0 300px;
  width: 300px;
}
.jt-review-card-head { display: flex; align-items: center; gap: 10px; }
.jt-review-avatar {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  object-fit: cover;
  flex-shrink: 0;
  background: var(--surface);
}
.jt-review-avatar-fallback {
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  font-size: 16px;
  color: var(--text-muted);
  border: 1px solid var(--border-subtle);
}
.jt-review-author { font-weight: 700; font-size: 13.5px; color: var(--heading-color); }
.jt-review-time { font-size: 12px; color: var(--text-muted); }
.jt-review-text {
  margin: 2px 0 0;
  font-size: 13.5px;
  line-height: 1.55;
  color: var(--text-body);
  /* Long reviews stay readable in a fixed-height card grid rather than
     stretching one card far taller than its neighbours. */
  display: -webkit-box;
  -webkit-line-clamp: 6;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.jt-reviews-cta {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 12px;
}
.jt-google-logo {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  border-radius: 50%;
  background: var(--surface-alt);
  border: 1px solid var(--border-subtle);
  font-weight: 700;
  font-size: 15px;
  color: var(--blue-500);
}

/* ==========================================================
   iOS Safari: prevent automatic viewport zoom on form focus
   ==========================================================
   Diagnostic/fix requested directly, scoped narrowly on purpose:
   iOS Safari auto-zooms the whole page when a form control with a
   computed font-size under 16px receives focus. Several fields on
   this site (filter bars, admin modals, etc.) are set well under
   that — 12/13/13.5/14px — so any of them on a page under 767px
   wide is a candidate for that behavior. This does NOT touch
   touch-action, body zoom, or the viewport meta tag (user-scalable/
   maximum-scale) — those would mask the symptom and disable
   legitimate pinch-zoom accessibility for every visitor, not just
   fix this. Scoped to mobile widths only so desktop input sizing is
   completely unaffected. */
@media screen and (max-width: 767px) {
  input,
  select,
  textarea {
    font-size: 16px !important;
  }
}

/* ==========================================================================
   PartsLink — VIN parts-catalog search (partslink.php / partslink-buy.php /
   auction-lot.php shortcut button). See inc/partslink.php for the data
   layer these classes decorate.
   ========================================================================== */

.jt-pl24-balance-card {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  background: var(--surface);
  border: 1px solid var(--border-default);
  border-radius: var(--radius-md);
  padding: 16px 20px;
  margin-bottom: 24px;
}
.jt-pl24-balance-label { display: block; font-size: 13px; color: var(--text-muted); }
.jt-pl24-balance-count { display: block; font-size: 28px; font-weight: 700; color: var(--heading-color); line-height: 1.2; }

.jt-pl24-unavailable {
  background: rgba(224, 75, 75, 0.1);
  border: 1px solid rgba(224, 75, 75, 0.3);
  color: #c33;
  border-radius: var(--radius-md);
  padding: 16px 20px;
}

.jt-pl24-search-form {
  background: var(--surface);
  border: 1px solid var(--border-default);
  border-radius: var(--radius-md);
  padding: 20px;
  margin-bottom: 20px;
}
.jt-pl24-search-form label { display: block; font-weight: 600; color: var(--heading-color); margin-bottom: 8px; }
.jt-pl24-search-row { display: flex; gap: 10px; flex-wrap: wrap; }
.jt-pl24-search-row input {
  flex: 1 1 260px;
  padding: 12px 14px;
  border: 1px solid var(--border-default);
  border-radius: var(--radius-sm);
  background: var(--surface-alt);
  color: var(--heading-color);
  font-family: monospace;
  letter-spacing: 0.5px;
  text-transform: uppercase;
}
.jt-pl24-brand-row { margin-top: 12px; font-size: 14px; color: var(--text-muted); }
.jt-pl24-brand-row strong { color: var(--heading-color); }
.jt-pl24-hint { margin: 10px 0 0; font-size: 13px; color: var(--text-muted); }

.jt-pl24-progress {
  display: flex;
  align-items: center;
  gap: 14px;
  background: var(--surface-alt);
  border-radius: var(--radius-md);
  padding: 16px 20px;
  margin-bottom: 20px;
  color: var(--heading-color);
}
.jt-pl24-spinner {
  width: 22px;
  height: 22px;
  border: 3px solid var(--border-default);
  border-top-color: var(--gold-500);
  border-radius: 50%;
  animation: jt-pl24-spin 0.8s linear infinite;
  flex-shrink: 0;
}
@keyframes jt-pl24-spin { to { transform: rotate(360deg); } }

.jt-pl24-error {
  background: rgba(224, 75, 75, 0.1);
  border: 1px solid rgba(224, 75, 75, 0.3);
  color: #c33;
  border-radius: var(--radius-md);
  padding: 14px 18px;
  margin-bottom: 20px;
}

.jt-pl24-result {
  background: var(--surface);
  border: 1px solid var(--border-default);
  border-radius: var(--radius-md);
  padding: 20px;
  margin-bottom: 28px;
}
.jt-pl24-result-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 10px;
  margin-bottom: 14px;
}
.jt-pl24-result-header h3 { margin: 0; color: var(--heading-color); }
.jt-pl24-lang-row { display: flex; gap: 6px; flex-wrap: wrap; }
.jt-pl24-lang-btn {
  border: 1px solid var(--border-default);
  background: var(--surface-alt);
  color: var(--heading-color);
  border-radius: 999px;
  padding: 6px 14px;
  font-size: 13px;
  font-weight: 600;
  cursor: pointer;
}
.jt-pl24-lang-btn.is-active { background: var(--gold-500); border-color: var(--gold-500); color: #1a1300; }
.jt-pl24-pdf-frame {
  width: 100%;
  height: 70vh;
  min-height: 420px;
  border: 1px solid var(--border-default);
  border-radius: var(--radius-sm);
  margin-bottom: 14px;
  background: var(--surface-alt);
}

.jt-pl24-history-title { color: var(--heading-color); margin: 28px 0 14px; }

.jt-pl24-plans-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 18px;
}
.jt-pl24-plan-card {
  position: relative;
  background: var(--surface);
  border: 1px solid var(--border-default);
  border-radius: var(--radius-md);
  padding: 22px 18px;
  text-align: center;
}
.jt-pl24-plan-card.is-featured { border-color: var(--gold-500); box-shadow: 0 0 0 2px rgba(227, 171, 65, 0.25); }
.jt-pl24-plan-badge {
  position: absolute;
  top: -11px;
  left: 50%;
  transform: translateX(-50%);
  background: var(--gold-500);
  color: #1a1300;
  font-size: 11px;
  font-weight: 700;
  padding: 4px 12px;
  border-radius: 999px;
  white-space: nowrap;
}
.jt-pl24-plan-card h3 { margin: 6px 0 10px; color: var(--heading-color); }
.jt-pl24-plan-credits { font-size: 15px; color: var(--text-muted); margin-bottom: 6px; }
.jt-pl24-plan-price { font-size: 26px; font-weight: 700; color: var(--heading-color); margin-bottom: 16px; }

@media (max-width: 640px) {
  .jt-pl24-search-row { flex-direction: column; }
  .jt-pl24-search-row input,
  .jt-pl24-search-row button { width: 100%; }
}

/* ===== Dry Ice Cleaning — marketing page + booking wizard ===== */

.dryice-hero {
  text-align: center;
  /* Unlike most .page-hero usages (a bare h1), this page stacks an
     eyebrow + h1 + CTA, and the default .page-hero is sticky (stays
     pinned near the top while scrolling) — on this page that made the
     hero visibly "cover too much space" before the visitor could even
     see the packages below. Not worth sticking around while scrolling
     for a marketing page, so drop the sticky behavior and tighten the
     padding instead. */
  position: static;
}
.dryice-hero .container { padding: 16px 28px; }
.dryice-hero h1 { margin-bottom: 4px; }
.dryice-hero .hero-ctas { margin-top: 10px; }
@media (max-width: 600px) {
  .dryice-hero .container { padding: 14px 18px; }
}
.dryice-intro {
  max-width: 760px;
  margin: 0 auto;
  text-align: center;
  font-size: 16px;
  line-height: 1.8;
  color: var(--text-muted);
}

.dryice-badges {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 16px;
  margin-top: 32px;
}
.dryice-badge {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
  text-align: center;
  padding: 20px 14px;
  background: var(--surface);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-md);
  font-size: 13.5px;
  font-weight: 600;
  color: var(--text-body);
}
.dryice-badge .ico { font-size: 28px; }

.dryice-packages-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: 22px;
  margin-top: 8px;
}
.dryice-package-card {
  position: relative;
  display: flex;
  flex-direction: column;
  background: var(--surface);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-md);
  padding: 26px 22px 22px;
  transition: box-shadow .2s ease, transform .2s ease;
}
.dryice-package-card:hover { box-shadow: var(--shadow-md); transform: translateY(-4px); }
.dryice-package-card.is-popular { border-color: var(--gold-500); border-width: 2px; }
.dryice-popular-tag {
  position: absolute;
  top: -12px;
  left: 50%;
  transform: translateX(-50%);
  background: linear-gradient(135deg, var(--gold-400), var(--gold-500));
  color: #1a1300;
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .04em;
  padding: 5px 14px;
  border-radius: 999px;
  white-space: nowrap;
}
.dryice-package-num {
  font-size: 13px;
  font-weight: 800;
  color: var(--gold-500);
  letter-spacing: .06em;
  margin-bottom: 4px;
}
.dryice-package-card h3 { margin: 0 0 10px; color: var(--heading-color); font-size: 19px; }
.dryice-package-desc { margin: 0 0 18px; font-size: 14px; line-height: 1.7; color: var(--text-muted); flex: 1 1 auto; }
.dryice-package-price { display: flex; align-items: baseline; gap: 8px; margin-bottom: 6px; }
.dryice-package-price .amount { font-size: 28px; font-weight: 800; color: var(--heading-color); }
.dryice-package-price .dur { font-size: 13px; color: var(--text-muted); }
.dryice-package-deposit { font-size: 12.5px; color: var(--text-muted); margin-bottom: 18px; }

/* Booking wizard */
.dryice-steps {
  display: flex;
  gap: 8px;
  list-style: none;
  margin: 0 0 28px;
  padding: 0;
}
.dryice-steps li {
  flex: 1 1 0;
  text-align: center;
  padding: 10px 8px;
  border-radius: var(--radius-sm);
  background: var(--surface);
  border: 1px solid var(--border-subtle);
  font-size: 12.5px;
  font-weight: 700;
  color: var(--text-muted);
}
.dryice-steps li.is-active { background: var(--gold-500); border-color: var(--gold-500); color: #1a1300; }

.dryice-step { display: none; max-width: 640px; margin: 0 auto; }
.dryice-step.is-active { display: block; }
.dryice-step h2 { margin: 0 0 18px; font-size: 20px; color: var(--heading-color); }

.dryice-service-options { display: flex; flex-direction: column; gap: 10px; margin-bottom: 20px; }
.dryice-service-option {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 14px 16px;
  border: 1.5px solid var(--border-default);
  border-radius: var(--radius-sm);
  cursor: pointer;
  transition: border-color .15s ease, background .15s ease;
}
.dryice-service-option:hover { border-color: var(--gold-500); }
.dryice-service-option.is-selected { border-color: var(--gold-500); background: color-mix(in srgb, var(--gold-500) 8%, var(--surface)); }
.dryice-service-option input { margin: 0; }
.dryice-service-option-body { display: flex; flex-direction: column; gap: 3px; }
.dryice-service-option-body .name { font-weight: 700; color: var(--heading-color); font-size: 15px; }
.dryice-service-option-body .meta { font-size: 13px; color: var(--text-muted); }

.dryice-slot-picker label { display: block; font-size: 13px; font-weight: 600; margin-bottom: 7px; color: var(--text-body); }
.dryice-slot-picker input[type="date"] {
  padding: 11px 14px;
  border: 1.5px solid var(--border-default);
  border-radius: var(--radius-sm);
  background: var(--surface);
  color: var(--text-body);
  font-size: 14px;
  margin-bottom: 18px;
}
.dryice-slots { display: flex; flex-wrap: wrap; gap: 8px; min-height: 44px; }
.dryice-slot-btn {
  padding: 9px 16px;
  border: 1.5px solid var(--border-default);
  border-radius: var(--radius-sm);
  background: var(--surface);
  color: var(--text-body);
  font-size: 13.5px;
  font-weight: 600;
  cursor: pointer;
  transition: border-color .15s ease, background .15s ease, color .15s ease;
}
.dryice-slot-btn:hover { border-color: var(--gold-500); }
.dryice-slot-btn.is-selected { background: var(--gold-500); border-color: var(--gold-500); color: #1a1300; }
.dryice-slots-loading, .dryice-slots-empty { color: var(--text-muted); font-size: 13.5px; margin: 0; }

/* Extras step (Rental Car, Coating, ...) — skipped entirely by the
   wizard's JS for a service with no extras mapped (e.g. Engine Bay
   Cleaning), see assets/js/dryice-book.js's hasExtras()/nextStep(). */
.dryice-extras-list { display: flex; flex-direction: column; gap: 12px; margin-bottom: 6px; }
.dryice-extra-card {
  border: 1.5px solid var(--border-default);
  border-radius: var(--radius-sm);
  background: var(--surface);
  padding: 14px 16px;
  transition: border-color .15s ease;
}
.dryice-extra-card:hover { border-color: var(--gold-500); }
.dryice-extra-main { display: flex; align-items: center; gap: 14px; }
.dryice-extra-name { font-weight: 700; color: var(--heading-color); font-size: 15px; flex: 1 1 auto; }
.dryice-extra-price { font-size: 14px; color: var(--text-body); white-space: nowrap; }
.dryice-extra-vat {
  font-size: 10.5px;
  font-weight: 600;
  color: var(--text-muted);
  background: var(--surface-alt, var(--surface));
  border: 1px solid var(--border-subtle);
  border-radius: 999px;
  padding: 2px 8px;
  margin-left: 4px;
}
/* Extras are one-per-booking add-ons (e.g. a single rental car), not a
   stackable quantity, so this is a checkbox toggle rather than the
   +/- stepper it used to be -- the native checkbox is visually hidden
   and a styled box + label stand in for it, same trick used by the
   service-charge/other checkbox-style controls elsewhere on the site. */
.dryice-extra-toggle { display: flex; align-items: center; gap: 8px; cursor: pointer; white-space: nowrap; user-select: none; }
.dryice-extra-checkbox { position: absolute; opacity: 0; width: 1px; height: 1px; }
.dryice-extra-toggle-box {
  width: 22px;
  height: 22px;
  flex: 0 0 auto;
  border: 1.5px solid var(--border-default);
  border-radius: var(--radius-sm);
  background: var(--surface);
  position: relative;
  transition: border-color .15s ease, background .15s ease;
}
.dryice-extra-toggle-box::after {
  content: "";
  position: absolute;
  top: 3px;
  left: 6px;
  width: 6px;
  height: 11px;
  border: solid #1a1300;
  border-width: 0 2px 2px 0;
  transform: rotate(45deg);
  opacity: 0;
  transition: opacity .1s ease;
}
.dryice-extra-checkbox:checked ~ .dryice-extra-toggle-box { border-color: var(--gold-500); background: var(--gold-500); }
.dryice-extra-checkbox:checked ~ .dryice-extra-toggle-box::after { opacity: 1; }
.dryice-extra-checkbox:focus-visible ~ .dryice-extra-toggle-box { outline: 2px solid var(--gold-500); outline-offset: 2px; }
.dryice-extra-toggle-label { font-size: 13px; font-weight: 600; color: var(--text-body); }
.dryice-extra-card:has(.dryice-extra-checkbox:checked) { border-color: var(--gold-500); }
.dryice-extra-desc { margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--border-subtle); font-size: 12.5px; line-height: 1.6; color: var(--text-muted); }

.dryice-summary-extras { margin: 6px 0; padding: 8px 0; border-top: 1px dashed var(--border-subtle); border-bottom: 1px dashed var(--border-subtle); font-size: 13px; color: var(--text-muted); }

.dryice-step-actions { display: flex; justify-content: space-between; gap: 12px; margin-top: 24px; }

/* Before/After comparison sliders (dry-ice-cleaning.php's "See the
   Difference" section) -- see assets/js/dryice-compare.js for how
   --dryice-compare-pos gets updated. */
.dryice-compare-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 28px;
  margin-top: 8px;
}
.dryice-compare-frame {
  position: relative;
  aspect-ratio: 16 / 9;
  border-radius: var(--radius-lg);
  overflow: hidden;
  box-shadow: var(--shadow-md);
  background: var(--surface-alt, #10151f);
  user-select: none;
  -webkit-user-select: none;
}
.dryice-compare-img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  pointer-events: none;
}
.dryice-compare-before-wrap {
  position: absolute;
  inset: 0;
  overflow: hidden;
  clip-path: inset(0 calc(100% - var(--dryice-compare-pos, 50%)) 0 0);
}
.dryice-compare-before-wrap .dryice-compare-img { position: absolute; inset: 0; }
.dryice-compare-divider {
  position: absolute;
  top: 0;
  bottom: 0;
  left: var(--dryice-compare-pos, 50%);
  width: 3px;
  margin-left: -1.5px;
  background: #fff;
  box-shadow: 0 0 0 1px rgba(0, 0, 0, .25);
  pointer-events: none;
}
.dryice-compare-handle {
  position: absolute;
  top: 50%;
  left: var(--dryice-compare-pos, 50%);
  width: 44px;
  height: 44px;
  margin-left: -22px;
  margin-top: -22px;
  border-radius: 50%;
  background: #fff;
  color: #1a1300;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 1px;
  box-shadow: var(--shadow-md);
  pointer-events: none;
}
.dryice-compare-handle-arrows { transform: scaleX(1.1); }
.dryice-compare-badge {
  position: absolute;
  top: 14px;
  padding: 5px 12px;
  border-radius: 999px;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: #fff;
  background: rgba(11, 22, 38, .68);
  backdrop-filter: blur(2px);
  pointer-events: none;
}
.dryice-compare-badge-before { left: 14px; }
.dryice-compare-badge-after { right: 14px; background: rgba(227, 171, 65, .92); color: #1a1300; }
.dryice-compare-range {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  opacity: 0;
  cursor: ew-resize;
  -webkit-appearance: none;
  appearance: none;
}
.dryice-compare-range:focus-visible ~ .dryice-compare-handle,
.dryice-compare-frame:has(.dryice-compare-range:focus-visible) .dryice-compare-handle {
  box-shadow: 0 0 0 3px var(--gold-500), var(--shadow-md);
}
@media (max-width: 760px) {
  .dryice-compare-grid { grid-template-columns: 1fr; gap: 20px; }
}

.dryice-honeypot { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }

.dryice-summary-box {
  background: var(--surface-alt, var(--surface));
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-sm);
  padding: 14px 16px;
  margin: 6px 0 18px;
  font-size: 13.5px;
  line-height: 1.7;
  color: var(--text-body);
}

.dryice-confirm-panel {
  max-width: 560px;
  margin: 0 auto;
  text-align: center;
}
.dryice-confirm-panel .icon-wrap {
  width: 64px;
  height: 64px;
  margin: 0 auto 18px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  font-size: 30px;
  background: var(--surface);
  border: 1px solid var(--border-subtle);
}
.dryice-confirm-panel h2 { margin: 0 0 12px; color: var(--heading-color); }
.dryice-confirm-panel p { color: var(--text-muted); line-height: 1.7; margin-bottom: 20px; }
.dryice-confirm-summary {
  background: var(--surface);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-sm);
  padding: 16px 18px;
  margin-bottom: 20px;
  text-align: left;
  display: flex;
  flex-direction: column;
  gap: 8px;
  font-size: 14px;
}
.dryice-confirm-summary strong { display: inline-block; min-width: 70px; color: var(--heading-color); }

@media (max-width: 900px) {
  .dryice-badges { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 640px) {
  .dryice-badges { grid-template-columns: 1fr; }
  .dryice-packages-grid { grid-template-columns: 1fr; }
  .dryice-steps li { font-size: 11px; padding: 8px 4px; }
}
