*{box-sizing:border-box;margin:0;padding:0}
:root{
  --brand:#C42010;--brand-deep:#7a1409;
  --maroon:#9e1c0c;--maroon-deep:#5f0f06;
  --gold:#C9821A;--gold-soft:#fdf6ea;--amber:#C9821A;
  --ink:#171b22;--muted:#6f7886;
  --paper:#fff;--bg:#f4f2ef;--line:#e7e2da;
  --radius:16px;--radius-sm:11px;--shadow:0 1px 2px rgba(0,0,0,.04);--maxw:1180px;
}
/* NOTE: no global `scroll-behavior:smooth` — on the root element it animates every
   mouse-wheel tick, making wheel scrolling feel slow/uneven (thumb dragging is
   unaffected). Left off intentionally for native, responsive scrolling. */
/* The production body carries Tailwind's `overflow-x-hidden`, which computes
   overflow-y:auto and turns <body> into a scroll container — that breaks the
   sticky nav (it scrolls away). Fix: move the horizontal-overflow guard to
   <html> (the natural scroll container, where overflow-x:hidden does NOT break
   sticky) and make <body> overflow:visible so it is no longer a scroll
   container. (overflow:clip would also work but is unsupported in some engines.)
   This stylesheet only loads when showroom_active?, so it is showroom-scoped;
   body.showroom outspecifies the single-class Tailwind `overflow-x-hidden`. */
html{overflow-x:hidden}
body.showroom{overflow:visible}
/* Body is flex-col min-h-screen; let <main> absorb extra height so the footer
   sits at the bottom on short pages (no leftover gap below it). */
body.showroom > main{flex:1 0 auto}
body{font-family:'Inter',system-ui,sans-serif;background:var(--bg);color:var(--ink);-webkit-font-smoothing:antialiased;line-height:1.5}
a{color:inherit;text-decoration:none}
.wrap{max-width:var(--maxw);margin:0 auto;padding:0 20px}

/* NAV */
.nav{background:var(--brand);position:sticky;top:0;z-index:40}
.nav .wrap{display:flex;align-items:center;gap:28px;height:62px}
.nav img.logo{height:33px;width:auto;display:block}
.nav .links{display:flex;gap:24px;margin-left:8px}
.nav .links a{color:#ffd9d2;font-weight:600;font-size:14px;padding:6px 2px;border-bottom:2px solid transparent}
.nav .links a:hover{color:#fff}.nav .links a.active{color:#fff;border-bottom-color:#fff}
.nav .user{margin-left:auto;display:flex;align-items:center;gap:9px;color:#fff;font-weight:600;font-size:14px}
.nav .user .av{width:32px;height:32px;border-radius:50%;background:#ffe7e2;color:var(--brand);display:grid;place-items:center;font-weight:800}
.burger{display:none;margin-left:auto;background:transparent;border:0;cursor:pointer;padding:8px}
.burger span{display:block;width:24px;height:2px;background:#fff;margin:5px 0;border-radius:2px}

/* COMPACT HERO (detail) */
.crumb{font-size:13px;color:var(--muted);margin:14px 2px 0}
.crumb a:hover{color:var(--brand)}.crumb .sep{opacity:.5;margin:0 6px}
.hero{margin-top:8px;border-radius:18px;overflow:hidden;display:grid;grid-template-columns:1.15fr .85fr;
  background:linear-gradient(125deg,var(--maroon),var(--maroon-deep));color:#fff;box-shadow:0 12px 30px rgba(94,15,6,.2)}
.hero .left{padding:22px 30px 24px;display:flex;flex-direction:column;justify-content:center}
/* Classic showroom only: wraps every hero element ABOVE the source citation (see
   .hero .source-line below). margin-block:auto centers THIS wrapper -- not `.left` itself --
   in whatever free space the flex column has, so the citation can follow it as a plain flex
   item pinned to the bottom of the card without un-centering the rest of the hero content.
   With auto top+bottom margins present, the auto margins claim all the free space themselves,
   so `.hero .left`'s own justify-content:center becomes a no-op here (kept because it's still
   what centers the modern showroom hero, which has no .hero-content wrapper at all). */
.hero .left .hero-content{margin-block:auto}
.badge{display:inline-flex;align-items:center;gap:7px;background:rgba(255,255,255,.16);
  border:1px solid rgba(255,255,255,.3);color:#fff;border-radius:30px;padding:5px 13px;
  font-size:11px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;width:fit-content}
.badge::before{content:"";width:6px;height:6px;border-radius:50%;background:#ffd591}
.hero h1{font-family:'Archivo';font-weight:900;font-size:clamp(25px,3.2vw,37px);line-height:1;letter-spacing:-.6px;margin-top:9px}
.hero h1 .body-style{display:block;color:#ffd591;font-size:.66em;margin-top:1px}
.vinline{display:flex;align-items:center;gap:10px;margin-top:13px;flex-wrap:wrap}
.vinline .vin{font-family:'JetBrains Mono';font-weight:700;font-size:clamp(16px,2.6vw,21px);letter-spacing:.14em;
  background:rgba(0,0,0,.22);border:1px solid rgba(255,255,255,.18);padding:8px 14px;border-radius:9px}
.vinline button{background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.28);color:#fff;
  border-radius:9px;padding:9px 12px;font-size:13px;font-weight:600;cursor:pointer}
.vinline button:hover{background:rgba(255,255,255,.24)}
/* Icon-only hero controls (⧉ copy / 🖨 print): bigger glyph + tighter padding so
   the tap target matches the favorite star's 20px SVG (all three ~40px tall). */
.vinline button.icon-btn{font-size:18px;line-height:20px;padding:9px 11px}
.pills{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px}
.pill{background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.26);border-radius:9px;padding:6px 11px}
.pill .v{font-family:'JetBrains Mono';font-weight:700;font-size:14px}
.pill .k{font-size:10px;text-transform:uppercase;letter-spacing:.12em;color:#ffcfc7;margin-top:2px}
/* Classic showroom confidence line (promoted out of the spec grid, web_features.
   classic_confidence_reason_display): label+value match .pill's tokens so it reads as part of
   the same hero chip family; the reason wraps onto its own line since it is prose, not a chip. */
.confidence-note{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;margin-top:10px}
.confidence-note .cf-label{font-size:10px;text-transform:uppercase;letter-spacing:.12em;color:#ffcfc7}
.confidence-note .cf-value{font-family:'JetBrains Mono';font-weight:700;font-size:15px}
.confidence-note .cf-reason{flex-basis:100%;font-size:13px;color:rgba(255,255,255,.82);line-height:1.4}
/* Source citation (vehicle_features.classic_source_citations): a plain flex item AFTER
   .hero-content (see above), so it sits at the true bottom of the hero card -- flush with
   the card's bottom padding whenever the image panel makes the row taller than the text,
   since .hero-content's own auto margins absorb that slack, not this element. The fixed
   margin-top is only a MINIMUM gap for the common case where there's no slack to absorb
   (text and image are about the same height); it never fights the auto-margin centering
   above it, since a negative/zero free space just zeroes those auto margins out. align-self:
   flex-end keeps it clear of the image panel, which is a separate grid column -- there is
   nothing to overlap on desktop; on the ≤900px stacked layout it just follows the rest of
   .left in flow. Color matches the hero's existing muted-on-maroon convention
   (.confidence-note .cf-reason above), since no dedicated token exists for it. */
.hero .source-line{margin-top:14px;align-self:flex-end;text-align:right;max-width:100%;
  font-size:11px;line-height:1.4;color:rgba(255,255,255,.75)}
.hero .right{position:relative;background:#fff;display:flex;align-items:center;justify-content:center;padding:16px}
/* When an actual image is shown, fill the whole panel edge-to-edge (no padding);
   the no-image frame keeps its padded surround. */
.hero .right:not(.no-image){padding:0}
.hero .right img{width:100%;height:100%;object-fit:cover;display:block}
/* Clickable hero image -> opens the lightbox. */
.hero .right .hero-img{cursor:zoom-in}
.hero .right .hero-img-hint{position:absolute;bottom:10px;right:10px;background:rgba(0,0,0,.6);
  color:#fff;font-size:12px;font-weight:600;padding:4px 9px;border-radius:7px;pointer-events:none;letter-spacing:.01em}
/* web_features.showroom_hero_image_3x2: render the image in a fixed 3:2 box,
   center-cropped (cover), trimming top/bottom whitespace of square renders so
   the car fills the panel. aspect-ratio is inherently responsive, so this one
   rule covers desktop + mobile and supersedes the mobile contain override below.
   High specificity (.right.r32:not(.no-image) img) intentionally beats both the
   base `.hero .right img` and the mobile `.hero .right:not(.no-image) img` rules.
   The panel centers any vertical slack (flex align-items:center) as clean white. */
.hero .right.r32:not(.no-image) img{width:100%;aspect-ratio:3/2;height:auto;max-height:none;object-fit:cover;display:block}
/* no-image frame */
.hero .right .frame{width:100%;min-height:150px;border:2px dashed #e3c08a;border-radius:12px;
  background:repeating-linear-gradient(45deg,#fffdf8,#fffdf8 12px,#fdf4e4 12px,#fdf4e4 24px);
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:7px;color:#a9772e;text-align:center;padding:14px}
/* The frame's display:flex above overrides the [hidden] attribute's display:none,
   so re-assert it with matching specificity — otherwise an assigned image and the
   no-image frame would both show. */
.hero .right .frame[hidden]{display:none}
.hero .right .frame svg{width:40px;height:40px;opacity:.7}
.hero .right .frame .t{font-weight:700;color:#8a5e12}
.hero .right .frame .s{font-size:13px;color:#b58a4a}
.hero .right .addimg{margin-top:6px;background:var(--gold);color:#fff;border:0;border-radius:8px;padding:8px 14px;font-weight:700;font-size:13px;cursor:pointer}
/* No-image state: warm the surround so the striped/gold frame reads the same on
   modern (red) pages as it does on classic (whose .right is already #fff8f0). */
.hero .right.no-image{background:#fff8f0}

/* ERA: CLASSIC OVERRIDES */
.era-classic .hero{background:linear-gradient(125deg,var(--maroon),var(--maroon-deep));box-shadow:0 12px 30px rgba(94,15,6,.2)}
.era-classic .hero .right{background:#fff8f0}
.era-classic .badge{background:rgba(201,130,26,.22);border-color:rgba(201,130,26,.55);color:#ffd591}
.era-classic .badge::before{background:var(--gold)}
.era-classic .hero h1 .body-style{color:var(--gold)}
.era-classic .card h2::before{background:var(--gold)}
.era-classic .vintable .val{color:var(--gold)}
.era-classic .vintable tr:hover td{background:var(--gold-soft)}

/* DECODE BAR */
.decodebar{background:var(--paper);border:1px solid var(--line);border-radius:14px;margin-top:16px;
  padding:14px 18px;display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.decodebar label{font-weight:700;font-size:15px}
.decodebar input{flex:1;min-width:200px;font-family:'JetBrains Mono';font-size:15px;letter-spacing:.1em;
  padding:11px 14px;border:1.5px solid var(--line);border-radius:10px;text-transform:uppercase}
.decodebar input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(196,32,16,.12)}
.decodebar button{background:var(--brand);color:#fff;border:0;border-radius:10px;padding:11px 22px;font-weight:700;font-size:15px;cursor:pointer}

/* ADS */
.ad{position:relative;display:flex;align-items:center;justify-content:center;text-align:center;background:#fff;
  border:1px dashed #d4cdc2;color:#a89f93;border-radius:12px;font-family:'JetBrains Mono';font-size:12px;letter-spacing:.1em}
.ad::before{content:"Advertisement";position:absolute;top:7px;left:0;right:0;font-size:9px;opacity:.6;letter-spacing:.18em}
.ad-lead{height:96px;margin-top:16px}.ad-inline{height:260px;margin:20px 0}
.ad-rail{min-height:600px;position:sticky;top:78px}

/* DETAIL GRID + CARDS */
/* minmax(0,1fr) (not 1fr) so a fixed-width descendant — e.g. an ad slot filled
   with a wide banner — can't expand the column past the viewport and stretch the
   cards. Paired with .ad-zone overflow containment below. */
.grid{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:22px;margin-top:22px;align-items:start}
/* Belt-and-suspenders: clip any oversized ad creative to its slot so a wide
   banner can't trigger horizontal page scroll. overflow-x:clip (not hidden) so
   it creates no scroll container — sticky .ad-rail and vertical ad expansion
   keep working. Correctly-sized mobile ads (<= column width) are unaffected. */
.ad-zone{max-width:100%;overflow-x:clip}
/* mobile_ad_lite (body.mobile-ad-lite): on phones, hide the desktop-only sidebar
   ad slots (their showAds() is also skipped in JS, so nothing loads) and the
   Ezoic outstream video ad — the heaviest, most intrusive mobile format. */
@media (max-width:900px){
  body.mobile-ad-lite .ad-zone-desktop-only{display:none!important}
  body.mobile-ad-lite #ez-video-container,
  body.mobile-ad-lite #ez-video-outstream-wrap,
  body.mobile-ad-lite [id^="ez-video-outstream"]{display:none!important}
}
.card{background:var(--paper);border:1px solid var(--line);border-radius:16px;padding:24px;box-shadow:var(--shadow)}
.card + .card{margin-top:20px}
.card h2{font-family:'Archivo';font-weight:800;font-size:18px;display:flex;align-items:center;gap:10px;margin-bottom:18px}
.card h2::before{content:"";width:4px;height:20px;border-radius:2px;background:var(--brand)}
/* "This VIN also matches" card now renders below .decodebar rather than after another .card,
   so it never picks up the `.card + .card` gap above -- without its own margin it sits flush
   against the decode bar's border. */
.alternate-decodes{margin-top:20px}
/* Square bullets for both the alternate-make list and .alternate-year-decodes. The page-wide
   reset (line 1) zeroes ul margin/padding, so an explicit left indent is required for the
   bullets to be visible at all. */
.alternate-decodes ul{list-style:square;margin:8px 0 0;padding-left:20px}
.alternate-decodes ul li{margin-top:4px}
.alternate-decodes ul li:first-child{margin-top:0}
.vintable{width:100%;border-collapse:collapse}
.vintable th{text-align:left;font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);font-weight:700;padding:0 10px 12px}
.vintable td{padding:14px 10px;border-top:1px solid var(--line);vertical-align:middle}
.vintable .pos{font-weight:600}.vintable .val{font-family:'JetBrains Mono';font-weight:700;font-size:17px;color:var(--brand)}
.vintable .dec{font-weight:600}.vintable tr:hover td{background:#fbf3f1}
.specs{display:grid;grid-template-columns:1fr 1fr;gap:0 28px}
.spec{display:flex;justify-content:space-between;gap:14px;padding:12px 0;border-bottom:1px solid var(--line)}
.spec .k{color:var(--muted);font-weight:500;font-size:14px}
/* min-width:0 overrides the flex-item default of min-width:auto, which sizes
   a flex item's shrink floor to its CONTENT's own intrinsic width -- for a
   <select> (possible_trims_display's cross-trim union dropdown, up to
   VISIBLE_TRIMS_LIMIT-many candidates' worth of long option text, e.g.
   "Ruby Red Metallic Tinted Clear Coat/Magnetic Metallic") that intrinsic
   width can be wide enough to push the whole row past the viewport at
   ~400px, even though the select itself already has max-width:100%: without
   this, its containing .v flex item refuses to shrink below that content
   width in the first place, so max-width:100% has nothing narrower to clamp
   against. Harmless for a plain-text .v (mobile regression check, round 5):
   text simply wraps under real shrink pressure instead of forcing the row
   wider, and desktop never applies shrink pressure at all since .specs'
   grid columns are wide enough to fit every value unconstrained. */
.spec .v{font-weight:700;text-align:right;font-size:15px;min-width:0}
.spec .v.mono{font-family:'JetBrains Mono';font-weight:600}
/* Multi-value spec fields (Exterior Color, Interior Trim) render a <select> of
   the available options. Style it as an obvious, contained dropdown — the bare
   native control read as plain text and wasn't recognizable as interactive,
   especially on mobile Safari. width:100% (paired with the .spec .v min-width
   fix above) makes the select actually FILL, rather than just cap at, its
   cell's available width; text-overflow/white-space/overflow clip a selected
   option label too long to fit rather than widening the control past it. The
   option list itself is unchanged -- every option is still fully visible (and
   unclipped) once the dropdown is opened. */
.showroom-spec-select{font:inherit;font-size:14px;font-weight:600;color:var(--ink);text-align:left;
  background:#fff;border:1px solid var(--line);border-radius:8px;padding:7px 30px 7px 11px;width:100%;max-width:100%;
  text-overflow:ellipsis;white-space:nowrap;overflow:hidden;
  cursor:pointer;appearance:none;-webkit-appearance:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%238a5e12' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 10px center}
.showroom-spec-select:hover{border-color:var(--brand)}
.showroom-spec-select:focus-visible{outline:2px solid var(--brand);outline-offset:1px}
/* Possible Trims card (design doc §3.2): the hero "not encoded" badge + the
   candidate list. flex-wrap + min-width:0 on every row keep this safe down to
   a 320-400px viewport with no horizontal overflow, mirroring how the Colors
   Offered card's own (inline-styled) two-tone list wraps. */
.hero h1 .trim-ambiguous-badge{display:block;color:#ffd591;font-size:.5em;font-weight:600;margin-top:4px;text-decoration:underline;cursor:pointer}
.era-classic .hero h1 .trim-ambiguous-badge{color:var(--gold)}
.possible-trims-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px}
.possible-trim{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:6px 14px;
  border:1px solid var(--line);border-radius:10px;padding:10px 14px;min-width:0}
.possible-trim.is-selected{border-color:var(--brand);background:#fbf3f1}
.possible-trim .trim-name{font-weight:700;flex:1 1 auto;min-width:0}
.possible-trim .trim-diffs{color:var(--muted);font-size:13px;flex:2 1 100%;min-width:0;word-break:break-word}
.possible-trim .selected-tag{color:var(--brand);font-weight:600;font-size:12px;margin-left:6px}
.possible-trim .trim-select-link{color:var(--brand);font-weight:700;font-size:13px;white-space:nowrap;text-decoration:none}
.possible-trim .trim-select-link:hover{text-decoration:underline}
.rail .card{margin-bottom:18px}
/* Related Vehicles list: each entry is a bordered, hover-highlighted link card
   matching the page's card aesthetic (rounded, --line border, brand hover).
   A square thumbnail (vehicle image, or the Safari-logo placeholder) sits left
   of the title/trim/VIN block. */
.related-vehicle{display:flex;align-items:center;gap:12px;padding:12px 14px;border:1px solid var(--line);
  border-radius:12px;text-decoration:none;color:var(--ink);transition:border-color .15s,background .15s}
.related-vehicle + .related-vehicle{margin-top:10px}
.related-vehicle:hover{border-color:var(--brand);background:#fbf3f1}
.related-vehicle .thumb{flex:0 0 auto;width:56px;height:56px;border-radius:8px;object-fit:cover;
  background:var(--bg);border:1px solid var(--line)}
.related-vehicle .thumb-placeholder{display:grid;place-items:center}
.related-vehicle .thumb-placeholder img{width:60%;height:60%;opacity:.45}
.related-vehicle .info{min-width:0}
.related-vehicle .title{font-weight:700;font-size:14px;line-height:1.35}
.related-vehicle .sub{font-size:13px;color:var(--muted);margin-top:2px}
.related-vehicle .vin{font-family:'JetBrains Mono';font-size:12px;color:var(--muted);margin-top:4px;letter-spacing:.02em;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.btn{display:flex;align-items:center;justify-content:center;gap:9px;width:100%;padding:13px;border-radius:11px;
  font-weight:700;font-size:14px;cursor:pointer;border:1px solid var(--line);background:#fff;color:var(--ink);margin-bottom:10px}
.btn:last-child{margin-bottom:0}.btn.primary{background:var(--brand);border-color:var(--brand);color:#fff}
.btn.dark{background:var(--ink);border-color:var(--ink);color:#fff}.btn:hover{border-color:var(--muted)}
/* Inline ghost button (auto-width) for secondary CTAs like "View API Docs". */
.btn-ghost{display:inline-flex;align-items:center;gap:8px;padding:11px 18px;border:1px solid var(--line);
  border-radius:11px;font-weight:700;font-size:14px;color:var(--ink);background:#fff;cursor:pointer}
.btn-ghost:hover{border-color:var(--brand);color:var(--brand)}
.recall{border-left:3px solid var(--amber);background:var(--gold-soft);padding:12px 14px;border-radius:0 8px 8px 0}
.recall .rc{font-family:'JetBrains Mono';font-weight:700;color:#8a5e12;font-size:13px}
.recall .rt{font-size:13px;color:#5a4a2a;margin-top:4px;line-height:1.4}
.recall + .recall{margin-top:10px}
/* Recalls card: count line + subscriber-gated upsell */
.recall-meta{display:flex;justify-content:space-between;align-items:baseline;gap:10px;margin-bottom:12px}
.recall-meta .rn{font-family:'Archivo';font-weight:800;font-size:16px}
.recall-meta .rs{font-size:12px;color:var(--muted)}
.recall-gate{background:var(--gold-soft);border:1px solid #f0e0c2;border-radius:12px;padding:22px 16px;text-align:center}
.recall-gate svg{width:34px;height:34px;color:var(--gold);margin-bottom:8px}
.recall-gate .gt{font-family:'Archivo';font-weight:800;font-size:16px;color:var(--ink);margin-bottom:6px}
.recall-gate .gs{font-size:13px;color:var(--muted);line-height:1.45;margin-bottom:14px}
.recall-gate .gbtn{display:inline-block;background:var(--ink);color:#fff;border-radius:10px;padding:10px 20px;font-weight:700;font-size:14px;cursor:pointer}
.recall-gate .gbtn:hover{opacity:.92}
/* Separate the stacked gate CTAs (View Plans + the PR#287 ad-unlock button),
   which otherwise wrap in the 320px rail and butt up against each other. */
.recall-gate .gbtn + .gbtn{margin-top:10px}
/* Garage Maroon accent for the rewarded-ad recall unlock button. */
.recall-gate .gbtn.ez-recall-unlock{background:var(--maroon)}
/* Clickable recall -> detail popup */
.recall-clickable{cursor:pointer;transition:background .12s,box-shadow .12s}
.recall-clickable:hover{background:#fbe9dd}
.recall-clickable:focus-visible{outline:2px solid var(--brand);outline-offset:2px}
.recall-clickable .recall-more{display:block;margin-top:7px;font-size:12px;font-weight:700;color:var(--brand)}
.recall-modal{position:fixed;inset:0;background:rgba(0,0,0,.6);display:flex;align-items:center;justify-content:center;padding:20px;z-index:60}
.recall-modal[hidden]{display:none}
.recall-modal-card{background:var(--paper);border-radius:16px;max-width:640px;width:100%;max-height:85vh;overflow:auto;padding:28px;position:relative;box-shadow:0 20px 60px rgba(0,0,0,.3)}
.recall-modal-close{position:absolute;top:12px;right:14px;background:transparent;border:0;font-size:20px;color:var(--muted);cursor:pointer;line-height:1;padding:4px}
.recall-modal-close:hover{color:var(--ink)}
.rm-head{border-bottom:1px solid var(--line);padding-bottom:14px;margin-bottom:4px;padding-right:24px}
.rm-num{font-family:'JetBrains Mono';font-weight:700;color:var(--brand);font-size:14px}
.rm-comp{font-family:'Archivo';font-weight:800;font-size:20px;line-height:1.15;margin-top:4px}
.rm-date{font-size:13px;color:var(--muted);margin-top:5px}
.rm-sec{margin-top:16px}
.rm-label{font-size:11px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);margin-bottom:5px}
.rm-sec p{font-size:14px;line-height:1.55;color:var(--ink)}
@media print{.recall-modal{display:none!important}}

/* HERO IMAGE LIGHTBOX — full-resolution view of the assigned vehicle image. */
.img-modal{position:fixed;inset:0;background:rgba(0,0,0,.85);display:flex;align-items:center;justify-content:center;padding:20px;z-index:70}
.img-modal[hidden]{display:none}
.img-modal-inner{position:relative;display:flex;flex-direction:column;align-items:center;gap:12px;max-width:96vw;max-height:92vh}
.img-modal-inner img{max-width:96vw;max-height:86vh;width:auto;height:auto;object-fit:contain;border-radius:10px;box-shadow:0 20px 60px rgba(0,0,0,.5);background:#fff}
.img-modal-close{position:absolute;top:-44px;right:0;background:rgba(0,0,0,.6);border:0;color:#fff;font-size:20px;line-height:1;width:36px;height:36px;border-radius:50%;cursor:pointer}
.img-modal-close:hover{background:rgba(0,0,0,.8)}
.img-modal-cap{color:#fff;font-size:14px;text-align:center}
@media (max-width:760px){.img-modal-close{top:0;right:0}}
@media print{.img-modal{display:none!important}}
.info-row{display:flex;justify-content:space-between;padding:11px 0;border-bottom:1px solid var(--line);font-size:14px}
.info-row:last-of-type{border-bottom:0}.info-row .k{color:var(--muted)}.info-row .v{font-weight:700}
.note{background:var(--gold-soft);border:1px solid #f0e0c2;border-radius:10px;padding:13px 14px;font-size:13px;color:#7a5a1e;line-height:1.5;margin-top:6px}
.note b{color:#5f4513}

/* DASHBOARD */
.dashhead{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;flex-wrap:wrap;margin-top:18px}
.dashhead h1{font-family:'Archivo';font-weight:900;font-size:clamp(26px,3.4vw,36px);letter-spacing:-.5px}
.dashhead p{color:var(--muted);margin-top:4px}
.dashhead .acts{display:flex;gap:10px}
.dashhead .acts .btn{width:auto;margin:0;padding:11px 18px}
.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-top:22px}
.stat{background:var(--paper);border:1px solid var(--line);border-radius:16px;padding:20px;box-shadow:var(--shadow)}
.stat .ico{width:42px;height:42px;border-radius:11px;display:grid;place-items:center;font-size:20px;margin-bottom:14px}
.stat .lbl{color:var(--muted);font-size:13px;font-weight:600}
.stat .num{font-family:'Archivo';font-weight:900;font-size:30px;margin-top:2px;line-height:1}
.stat .sub{font-size:12px;color:var(--brand);font-weight:600;margin-top:6px}
.dashgrid{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:22px;align-items:start;margin-top:22px}
.favhead{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}
.favhead h2{font-family:'Archivo';font-weight:800;font-size:18px}
.favhead .count{color:var(--muted);font-size:14px}
.fav{display:flex;align-items:center;gap:16px;padding:14px;border:1px solid var(--line);border-radius:14px;margin-top:12px}
.fav:hover{border-color:#d8cfc2;background:#fffdfb}
.fav .thumb{width:64px;height:48px;border-radius:10px;flex-shrink:0;display:grid;place-items:center;background:var(--gold-soft);color:var(--gold);font-size:20px;overflow:hidden}
.fav .thumb img{width:100%;height:100%;object-fit:cover}
.fav .meta{flex:1;min-width:0}
.fav .title{font-weight:700}
.fav .vin{font-family:'JetBrains Mono';font-size:12px;color:var(--muted);margin-top:2px}
.fav .added{font-size:12px;color:#a39a8d;margin-top:2px}
.fav .del{background:transparent;border:0;color:#c0392b;font-size:18px;cursor:pointer;padding:6px}

/* HOME */
.home-hero{margin-top:8px;border-radius:18px;overflow:hidden;color:#fff;text-align:center;padding:42px 24px 40px;
  background:radial-gradient(120% 130% at 50% -10%,var(--maroon),var(--maroon-deep) 70%);position:relative}
.home-hero .trust{display:flex;gap:24px;justify-content:center;flex-wrap:wrap;color:#ffd9d2;font-size:13px;font-weight:600;margin-bottom:16px}
.home-hero .trust span{display:inline-flex;align-items:center;gap:7px}
.home-hero h1{font-family:'Archivo';font-weight:900;font-size:clamp(28px,4.6vw,46px);letter-spacing:-.8px;line-height:1.02}
.home-hero .sub{color:#ffd591;font-weight:600;font-size:clamp(14px,2vw,18px);margin-top:8px}
.home-search{display:flex;gap:10px;max-width:660px;margin:24px auto 0}
.home-search input{flex:1;font-family:'JetBrains Mono';font-size:16px;letter-spacing:.08em;padding:15px 18px;border:0;border-radius:12px;text-transform:uppercase;background:#fff;color:var(--ink)}
.home-search input::placeholder{color:var(--muted);text-transform:none;letter-spacing:normal}
.home-search input:focus{outline:3px solid rgba(255,255,255,.5)}
.home-search button{background:#fff;color:var(--brand);border:0;border-radius:12px;padding:15px 26px;font-weight:800;font-size:16px;cursor:pointer;box-shadow:0 6px 18px rgba(0,0,0,.25)}
.home-search button:hover{background:#fff0ed}
.home-hint{color:#ffc9bf;font-size:12px;margin-top:10px}
.blog-head{text-align:center;margin-top:42px}
.blog-head h2{font-family:'Archivo';font-weight:900;font-size:clamp(24px,3.4vw,34px)}
.blog-head p{color:var(--muted);max-width:560px;margin:8px auto 0}
.featured{display:grid;grid-template-columns:.85fr 1.15fr;margin-top:26px;border:1px solid var(--line);border-radius:18px;overflow:hidden;background:var(--paper);box-shadow:var(--shadow)}
.featured .img{min-height:240px;background:linear-gradient(160deg,#2a2f36,#11141a);display:flex;align-items:flex-end;padding:22px;color:#fff}
.featured .img .tag{font-family:'Archivo';font-weight:900;font-size:20px;line-height:1.1;text-transform:uppercase;letter-spacing:.02em}
.featured .body{padding:28px}
.featured .kicker{font-size:13px;color:var(--muted);margin-bottom:10px}
.featured h3{font-family:'Archivo';font-weight:800;font-size:24px;margin-bottom:10px}
.featured p{color:#4b5460;font-size:15px}
.featured .cta{display:flex;align-items:center;gap:20px;margin-top:20px;flex-wrap:wrap}
.featured .cta .read{background:var(--brand);color:#fff;border:0;border-radius:10px;padding:12px 20px;font-weight:700;cursor:pointer}
.featured .cta .all{color:var(--brand);font-weight:700}
.posts{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:18px}
.post{background:var(--paper);border:1px solid var(--line);border-radius:14px;overflow:hidden}
.post .img{height:120px;background:linear-gradient(160deg,#7a1409,#c42010)}
.post .pb{padding:16px}
.post .pk{font-size:12px;color:var(--muted)}
.post h4{font-family:'Archivo';font-weight:700;font-size:16px;margin-top:6px}

footer{margin:46px 0 30px;text-align:center;color:var(--muted);font-size:13px}

/* RESPONSIVE */
@media (max-width:900px){
  .grid,.dashgrid{grid-template-columns:minmax(0,1fr)}
  .ad-rail{position:static;min-height:280px}
  .hero{grid-template-columns:1fr}.hero .right{order:-1;min-height:150px}
  /* Stacked single-column hero: the grid no longer stretches .right to .left's
     height, so the desktop edge-to-edge object-fit:cover would crop the vehicle
     (only a partial shows). On mobile, show the WHOLE image contained inside the
     hero instead — let it size to its natural ratio at full width, capped so a
     tall/square render can't dominate the screen, and contain (not cover) so the
     full vehicle is visible. White letterboxing blends with the images' white
     backgrounds. The no-image frame is excluded so it keeps its padded height. */
  .hero .right:not(.no-image){min-height:0;padding:0;background:#fff}
  .hero .right:not(.no-image) img{height:auto;max-height:60vh;object-fit:contain}
  /* iOS Safari hero-image expansion fix (mobile only; desktop r32 unchanged).
     Putting aspect-ratio:3/2 on the flex .right with an IN-FLOW <img> still let
     WebKit size the box from the image's intrinsic height (the image stayed in
     normal flow). Definitive fix: a universally-supported padding-ratio box
     (height:0 + padding-bottom:66.667% = 3:2, no reliance on aspect-ratio) with
     the image taken OUT OF FLOW (position:absolute; inset:0). An out-of-flow
     image cannot contribute to its container's height, so nothing can expand it;
     overflow:hidden clips the cover crop. display:block drops flex so no
     intrinsic re-sizing path remains. */
  .hero .right.r32:not(.no-image){display:block;position:relative;aspect-ratio:auto;height:0;padding:0 0 66.667%;overflow:hidden}
  .hero .right.r32:not(.no-image) img{position:absolute;inset:0;width:100%;height:100%;min-height:0;max-height:none;aspect-ratio:auto;object-fit:cover}
  .stats{grid-template-columns:1fr 1fr}
  .featured{grid-template-columns:1fr}.featured .img{min-height:160px}
  .posts{grid-template-columns:1fr}
}
@media (max-width:760px){
  .burger{display:block}
  /* Burger opens a stacked menu (logo + burger stay on the top bar; links AND
     the account actions wrap below it), so every account link stays reachable
     on mobile. The header expands rather than overlaying. */
  .nav .links,.nav .user{display:none}
  .nav.open .wrap{height:auto;flex-wrap:wrap;padding-bottom:10px}
  .nav.open .links,.nav.open .user{display:flex;flex-direction:column;width:100%;gap:0;margin-left:0;align-items:stretch}
  .nav.open .links{order:3}
  .nav.open .user{order:4;position:static;padding-top:4px}
  .nav.open .links a{padding:12px 0;border-bottom:1px solid rgba(255,255,255,.15)}
  .nav.open .user .av{display:none}
  .nav.open .user > a{padding:12px 0;border-bottom:1px solid rgba(255,255,255,.15)}
  .nav.open .user .user-links{display:flex;position:static;flex-direction:column;background:transparent;border:0;box-shadow:none;padding:0;min-width:0}
  .nav.open .user .user-links a,.nav.open .user .user-links button{color:#fff;padding:12px 0;border-bottom:1px solid rgba(255,255,255,.15);border-radius:0}
  .nav.open .user .user-links a:hover,.nav.open .user .user-links button:hover{background:transparent;color:#ffd9d2}
  .specs{grid-template-columns:1fr}
  .card{padding:18px}
  .dashhead .acts{width:100%}.dashhead .acts .btn{flex:1}
  .vintable thead{display:none}
  .vintable,.vintable tbody,.vintable tr,.vintable td{display:block;width:100%}
  .vintable tr{border:1px solid var(--line);border-radius:12px;padding:6px 14px;margin-bottom:12px}
  .vintable tr:hover td{background:transparent}
  .vintable td{border-top:0;padding:7px 0;display:flex;justify-content:space-between;align-items:center}
  .vintable td::before{content:attr(data-label);color:var(--muted);font-size:12px;text-transform:uppercase;letter-spacing:.08em;font-weight:600}
}

/* ACCESSIBILITY + PRINT */
@media (prefers-reduced-motion:reduce){*{scroll-behavior:auto;transition:none!important}}
:focus-visible{outline:2px solid var(--brand);outline-offset:2px}
@media print{
  /* Drop chrome + non-content UI: nav, footer, hero image, ads, all interactive
     controls (decode bar, copy/share/favorite, rail action buttons, modal). */
  .nav, .site-footer, .burger,
  .hero .right,
  .decodebar, .ad, .ad-zone, .recall-modal,
  .related-vehicles,
  .vinline button, .rail .btn{display:none!important}

  /* Ink-friendly: white background, black text, no shadows/round corners. */
  body{background:#fff;color:#000}
  body.showroom > main, .wrap{max-width:100%;padding:0}
  .hero{grid-template-columns:1fr;background:#fff;color:#000;box-shadow:none;border:1px solid #ccc;border-radius:0;margin:0 0 10px}
  .hero .left{padding:12px 14px}
  .hero h1,.hero h1 .body-style,.crumb,.blurb,.badge,.pill .k,.pill .v,
  .confidence-note .cf-label,.confidence-note .cf-value,.confidence-note .cf-reason,
  .hero .source-line{color:#000}
  .badge{background:#fff;border-color:#999}
  .vinline .vin{background:#fff;color:#000;border-color:#999}
  .pill{background:#fff;border-color:#ccc}

  /* Tighten layout to optimise space: single column, compact cards. */
  /* `.grid` collides with Tailwind's .grid utility (loaded after showroom.css);
     scope with body.showroom to outspecify it and force a single print column. */
  body.showroom .grid{display:block;margin-top:10px}
  body.showroom .grid > div, body.showroom .rail{display:block;width:auto}
  .rail .card,.card{box-shadow:none;border:1px solid #ddd;border-radius:0;padding:12px;margin:0 0 10px;break-inside:avoid;page-break-inside:avoid}
  .card h2{margin-bottom:8px}
  .card h2::before{display:none}
  .specs{gap:0 18px}
  .spec{padding:6px 0}
  .vintable td{padding:7px 8px}
  @page{margin:12mm}

  /* decode_page_print_options polish, keyed off the `.print-options` marker
     class the showroom VIN partials put on main.wrap when the
     web_features.decode_page_print_options switch is on. Switch OFF -> no
     marker class -> the rules above apply unchanged (breadcrumb prints, hero
     image hidden). */
  .print-options .crumb{display:none!important}

  /* Show the hero vehicle image on the printed report. Only the with-image
     panel is un-hidden (`:not(.no-image)`): the "No factory image on file"
     frame stays dropped by the `.hero .right` rule above, so no-image VINs
     print exactly as before. The overrides below neutralise BOTH the ≤900px
     stacked-hero rules (paper width falls under that breakpoint: order:-1,
     60vh cap) and the r32 padding-ratio box with its out-of-flow absolute
     image (same specificity, later in source -> these win), printing the
     image in flow after the hero text, contained at its natural ratio. */
  .print-options .hero .right:not(.no-image){display:block!important;order:0;position:static;height:auto;min-height:0;padding:0 0 8px;overflow:visible;background:#fff}
  .print-options .hero .right:not(.no-image) img{position:static;display:block;width:auto;max-width:100%;height:auto;max-height:3.2in;min-height:0;aspect-ratio:auto;object-fit:contain;margin:0 auto}
  .print-options .hero .hero-img-hint{display:none!important}
  /* A with-image panel whose <img> 404s at runtime reveals the no-image .frame
     via the hero_image partial's onerror handler, which the server-side
     .no-image class guard above can't see. Keep the placeholder frame out of
     print unconditionally — when the image loaded fine the frame is [hidden]
     anyway, and the server-side no-image panel is already display:none. */
  .print-options .hero .right .frame{display:none!important}

  /* Factory Colors Offered card (progressive-disclosure pagination, native <details>/<summary>):
     product decision (Richard) is to OMIT this card from printed reports entirely rather than try
     to force its collapsed content open. A prior attempt overrode `display` on the <details>'
     children directly, but current Chrome/Firefox/Safari hide closed <details> content via the
     ::details-content pseudo-element (content-visibility:hidden), not via a plain UA display:none
     on the children -- overriding display alone left checkVisibility() false and the content
     still didn't print (verified directly in Chrome with print media emulated). Rather than add a
     beforeprint/afterprint JS handler to force `open` (the actual cross-browser fix for
     REVEALING it), the simpler and more reliable choice is to not print the card at all: hiding
     an entire element via `display:none` in print has none of the ::details-content complication.
     Scoped to `.colors-offered-card` (not `.card`) so no other card's print behaviour changes. */
  .colors-offered-card{display:none!important}
}

/* Factory Colors Offered card: APPROXIMATE swatch chip (ShowroomHelper#color_swatch_chip),
   derived from the color's NAME, never a measured chip/RGB value -- see
   docs/color_name_swatches.md. A visible border on every chip (not just a subtle one) so a
   white/ivory swatch still reads as a chip against the card's own light background instead of
   disappearing into it. */
.color-swatch-chip{display:inline-block;flex:none;width:14px;height:14px;border-radius:4px;
  border:1px solid rgba(0,0,0,.35);vertical-align:middle}

/* Showroom additions beyond style-guide §7 (from the approved classic mockup) */
.blurb{margin-top:10px;color:#ffe2dc;font-size:13.5px;max-width:56ch;font-style:italic;line-height:1.45}
.era-classic .blurb{color:#ffe2dc}
.decodebar .hint{flex-basis:100%;font-size:12px;color:var(--muted)}
.card.classic h2::before{background:var(--gold)}
@media print{ .blurb{color:#000} }

/* API promo (home) — highlights the developer API (revenue) with a code sample */
.api-promo{margin-top:46px}
.api-code{margin-top:24px;background:linear-gradient(160deg,#2a2f36,#11141a);border-radius:18px;
  padding:24px;color:#cfd4db;box-shadow:var(--shadow);overflow:hidden}
.api-code-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:16px}
.api-code-head .api-title{font-family:'Archivo';font-weight:800;font-size:16px;color:#fff}
.api-badges{display:flex;gap:8px}
.pillb{font-weight:700;font-size:11px;letter-spacing:.06em;border-radius:30px;padding:4px 11px;color:#fff}
.pillb.get{background:#16a34a}
.pillb.json{background:#2563eb}
.api-grid{display:grid;grid-template-columns:1fr 1fr;gap:22px}
.api-label{font-size:11px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:#9aa3b0;margin-bottom:8px}
.api-code pre{margin:0;overflow-x:auto;background:rgba(0,0,0,.25);border:1px solid rgba(255,255,255,.08);border-radius:10px;padding:14px}
.api-code pre code{font-family:'JetBrains Mono';font-size:12.5px;line-height:1.55;white-space:pre}
.api-code pre.req code{color:#7ee0a6}
.api-code pre.resp code{color:#7fb6ff}
.api-cta{display:flex;gap:12px;justify-content:center;margin-top:22px;flex-wrap:wrap}
.api-cta .btn{width:auto;margin:0;padding:13px 24px}
@media (max-width:760px){ .api-grid{grid-template-columns:1fr} }

/* API DOCS page — parameter / rate-limit / status tables + doc helpers.
   .docs-table is a new (collision-free) name; other rules are scoped under
   .docs-page so they never touch shared showroom classes. */
.docs-page .docs-nav{display:flex;flex-wrap:wrap;gap:8px}
.docs-page .docs-nav a{font-size:13px;font-weight:600;color:var(--muted);padding:6px 12px;
  border:1px solid var(--line);border-radius:30px;background:var(--paper)}
.docs-page .docs-nav a:hover{border-color:var(--brand);color:var(--brand)}
.docs-page .docs-lead{color:var(--muted);margin-bottom:14px}
.docs-page .method-pill{display:inline-block;font-weight:700;font-size:11px;letter-spacing:.06em;
  border-radius:30px;padding:4px 11px;color:#fff;margin-left:8px;vertical-align:middle}
.docs-page .method-pill.get{background:#16a34a}
.docs-page .method-pill.post{background:#2563eb}
.docs-page .docs-subhead{font-family:'Archivo';font-weight:800;font-size:14px;color:var(--ink);margin:18px 0 8px}
.docs-page .level-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-top:8px}
.docs-page .level-card{border:1px solid var(--line);border-radius:12px;padding:16px;background:var(--paper)}
.docs-page .level-card h3{font-family:'Archivo';font-weight:800;font-size:15px;margin-bottom:4px}
.docs-page .level-card .lvl-note{font-size:13px;color:var(--muted);margin-bottom:8px}
.docs-page .level-card ul{margin:0 0 0 18px;font-size:14px;color:var(--ink)}
.docs-page .level-card li{margin:4px 0}
.docs-page .status-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.docs-page .status-row{border:1px solid var(--line);border-radius:10px;padding:12px 14px;background:var(--paper)}
.docs-page .status-row .code{font-family:'JetBrains Mono';font-weight:700;font-size:13px}
.docs-page .status-row .code.ok{color:#16a34a}
.docs-page .status-row .code.err{color:#dc2626}
.docs-page .status-row p{font-size:13px;color:var(--muted);margin-top:4px}
.docs-page .docs-warn{display:flex;gap:10px;border:1px solid #f3d98a;background:var(--gold-soft);
  border-radius:12px;padding:14px;margin-top:14px}
.docs-page .docs-warn h4{font-weight:700;font-size:13px;color:#8a5e12}
.docs-page .docs-warn p{font-size:13px;color:#7a5510;margin-top:2px}
.docs-table{width:100%;border-collapse:collapse;font-size:14px}
.docs-table th{text-align:left;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);padding:0 10px 10px}
.docs-table td{padding:10px;border-top:1px solid var(--line);vertical-align:top}
.docs-table td code{font-family:'JetBrains Mono';font-size:12.5px;color:var(--brand)}
@media (max-width:760px){ .docs-page .level-grid,.docs-page .status-grid{grid-template-columns:1fr} }

/* Rich site footer (ported from the production footer, restyled for showroom).
   Scoped under .site-footer so it overrides the minimal §7 footer{} rule. */
.site-footer{margin:56px 0 0;background:linear-gradient(180deg,#1b1f27,#0f1216);
  color:#cfd4db;border-top:4px solid var(--brand);text-align:left;font-size:15px}
.site-footer .wrap{padding:48px 20px 28px}
.ft-grid{display:grid;grid-template-columns:2fr 1fr 1fr;gap:32px}
.ft-brand .ft-logo{height:38px;width:auto;display:block;margin-bottom:14px}
.ft-brand p{color:#9aa3b0;max-width:48ch;line-height:1.5;margin-bottom:16px}
.ft-col h3{font-family:'Archivo';font-weight:800;font-size:12px;letter-spacing:.12em;
  text-transform:uppercase;color:#fff;margin-bottom:14px}
.ft-col ul{list-style:none;display:flex;flex-direction:column;gap:9px}
.ft-col a{color:#9aa3b0}
.ft-col a:hover{color:#fff}
.ft-bottom{margin-top:32px;border-top:1px solid #2a2f3a;padding-top:20px;
  display:flex;justify-content:center;align-items:center;gap:16px;flex-wrap:wrap}
.ft-bottom p{color:#7b828e;font-size:13px;margin:0}
@media (max-width:760px){ .ft-grid{grid-template-columns:1fr;gap:24px} }

/* NAV USER DROPDOWN */
.nav .user{position:relative;cursor:pointer}
.nav .user .user-links{display:none;position:absolute;right:0;top:calc(100% + 8px);background:#fff;border:1px solid var(--line);border-radius:12px;padding:6px;min-width:180px;box-shadow:0 12px 30px rgba(0,0,0,.12);flex-direction:column;z-index:50}
.nav .user.open .user-links{display:flex}
.nav .user.has-menu:focus-visible{outline:2px solid #fff;outline-offset:2px;border-radius:8px}
.nav .user .user-links a,.nav .user .user-links button{color:var(--ink);font-weight:600;font-size:14px;padding:9px 12px;border-radius:8px}
.nav .user .user-links a:hover,.nav .user .user-links button:hover{background:var(--bg)}
/* Sign out renders as a button_to (real DELETE form); style it like the links. */
.nav .user .user-links form{margin:0}
.nav .user .user-links button{display:block;width:100%;text-align:left;background:none;border:0;cursor:pointer;font-family:inherit}

/* DASHBOARD */
.dashhead{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin:32px 0 24px}
.dashhead h1{font-size:28px;font-weight:800;line-height:1.2}
.dashhead p{color:var(--muted);margin-top:4px}
.acts{display:flex;gap:10px;flex-shrink:0}
.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:32px}
.stat{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:22px;display:flex;flex-direction:column;gap:10px}
.stat .ico{width:44px;height:44px;border-radius:12px;display:grid;place-items:center;font-size:22px}
.stat .lbl{font-size:13px;color:var(--muted);font-weight:600;text-transform:uppercase;letter-spacing:.04em}
.stat .num{font-size:32px;font-weight:800;line-height:1}
.dashgrid{display:grid;grid-template-columns:1fr 320px;gap:24px;align-items:start}
.favhead{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px}
.favhead h2{font-size:18px;font-weight:800}
.favhead .count{font-size:13px;color:var(--muted);font-weight:600}
.fav{display:flex;gap:14px;padding:14px 0;border-bottom:1px solid var(--line)}
.fav:last-child{border-bottom:none}
.fav .thumb{width:56px;height:56px;border-radius:10px;background:var(--gold-soft);display:grid;place-items:center;font-size:22px;flex-shrink:0;overflow:hidden}
.fav .thumb img{width:100%;height:100%;object-fit:cover}
.fav .meta .title{font-weight:700;font-size:15px;line-height:1.3}
.fav .meta .vin{font-family:'JetBrains Mono',monospace;font-size:12px;color:var(--muted);margin-top:2px}
.fav .meta .added{font-size:12px;color:var(--muted);margin-top:2px}
.rail .card + *{margin-top:16px}
@media(max-width:900px){.stats{grid-template-columns:repeat(2,1fr)}.dashgrid{grid-template-columns:1fr}}
@media(max-width:600px){.stats{grid-template-columns:1fr}.dashhead{flex-direction:column}.acts{width:100%}.acts a{flex:1;text-align:center}}

/* ARCHIVE landing */
.archive-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin:18px 0}
.archive-stats .stat .num{font-size:26px}
.archive-years{margin-top:22px}
.archive-legend{display:flex;gap:18px;color:var(--muted);font-size:13px;font-weight:600;margin:6px 0 4px}
.archive-legend .dot,.era-band .dot{display:inline-block;width:9px;height:9px;border-radius:50%;vertical-align:middle;margin-right:6px}
.archive-legend .dot.modern,.era-band .dot.modern{background:var(--brand)}
.archive-legend .dot.classic,.era-band .dot.classic{background:var(--gold)}
.era-band{display:flex;align-items:center;gap:0;margin:26px 0 8px;font-family:'Archivo';font-weight:800;
  font-size:12px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}
.era-band::after{content:"";flex:1;height:1px;background:var(--line);margin-left:12px}
.decade{margin:14px 0}
.decade h3{font-family:'Archivo';font-weight:800;font-size:15px;color:var(--ink);margin-bottom:8px;display:flex;align-items:baseline;gap:8px}
.decade h3 .dcount{font-family:'Inter';font-weight:600;font-size:12px;color:var(--muted)}
.year-chips{display:flex;flex-wrap:wrap;gap:10px}
.year-chip{display:flex;flex-direction:column;align-items:center;justify-content:center;min-width:80px;
  padding:10px 12px;background:var(--paper);border:1px solid var(--line);border-radius:12px;box-shadow:var(--shadow);transition:border-color .12s,transform .12s}
.year-chip:hover{border-color:var(--brand);transform:translateY(-1px)}
.year-chip .yr{font-family:'Archivo';font-weight:900;font-size:18px;color:var(--ink);line-height:1}
.year-chip .ct{font-size:11px;color:var(--muted);margin-top:3px}
.year-chip.classic{border-color:#ecd9b0;background:var(--gold-soft)}
.year-chip.classic:hover{border-color:var(--gold)}
.year-chip.classic .yr{color:#8a5e12}
.make-grid{display:flex;flex-wrap:wrap;gap:10px;margin-top:8px}
.make-chip{display:inline-flex;align-items:baseline;gap:8px;padding:10px 14px;background:var(--paper);
  border:1px solid var(--line);border-radius:30px;box-shadow:var(--shadow);font-weight:700}
.make-chip:hover{border-color:var(--brand)}
.make-chip .ct{font-weight:600;font-size:12px;color:var(--muted)}
.sample-vin{padding:16px}
.sample-vin .label{font-weight:700;font-size:14px;color:var(--ink)}
.sample-vin .mono{font-family:'JetBrains Mono',monospace;font-size:12px;color:var(--muted);margin-top:6px}
.sample-vin:hover{border-color:var(--brand)}
@media (max-width:760px){ .archive-stats{grid-template-columns:1fr 1fr} }
/* ARCHIVE sub-page helpers */
.pill-nav{display:inline-flex;align-items:center;padding:8px 16px;background:var(--paper);border:1px solid var(--line);
  border-radius:30px;font-size:13px;font-weight:600;color:var(--ink);box-shadow:var(--shadow);transition:border-color .12s}
.pill-nav:hover{border-color:var(--brand);color:var(--brand)}
.make-chip.classic{border-color:#ecd9b0;background:var(--gold-soft);color:#8a5e12}
.make-chip.classic:hover{border-color:var(--gold)}
.make-chip.active-chip{border-color:var(--brand);background:var(--brand);color:#fff}
.make-chip.active-chip:hover{border-color:var(--brand-deep)}
/* Informational (non-link) model chip: a classic year recognized by the decoder
   that has no stored example VINs to browse yet. */
.make-chip.static{cursor:default}
.make-chip.static:hover{border-color:#ecd9b0}
.badge-classic{display:inline-flex;align-items:center;padding:1px 7px;background:var(--gold-soft);
  border:1px solid #ecd9b0;border-radius:20px;font-size:11px;font-weight:700;color:#8a5e12;margin-left:6px;vertical-align:middle}
.badge-trim{display:inline-flex;align-items:center;padding:1px 7px;background:#f0f4ff;
  border:1px solid #c7d7ff;border-radius:20px;font-size:11px;font-weight:700;color:#3b5bdb;margin-left:6px;vertical-align:middle}
.classic-item{border-color:#ecd9b0;background:var(--gold-soft)}
.classic-item:hover{border-color:var(--gold)}

/* BLOG index — scoped to .blog-index so it never overrides the home page's
   .featured/.posts blog styling (which is defined earlier and used on Home). */
.blog-index .featured{display:flex;flex-direction:column;border-radius:16px;overflow:hidden;background:var(--paper);border:1px solid var(--line);box-shadow:var(--shadow);margin-bottom:24px;transition:box-shadow .15s}
.blog-index .featured:hover{box-shadow:0 6px 32px rgba(0,0,0,.10)}
.blog-index .featured .feat-img img{width:100%;max-height:320px;object-fit:cover;display:block}
.blog-index .featured .feat-body{padding:28px 28px 24px}
.blog-index .featured .feat-body h2{font-family:'Archivo';font-weight:900;font-size:clamp(20px,3vw,30px);line-height:1.15;margin:8px 0 10px;color:var(--ink)}
.blog-index .featured .feat-excerpt{color:var(--muted);font-size:16px;line-height:1.6;margin-bottom:14px}
.blog-index .featured .feat-meta{font-size:12px;color:var(--muted);font-weight:600;display:flex;gap:6px;align-items:center}
.blog-index .posts{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin:20px 0}
.blog-index .post-card{display:flex;flex-direction:column;overflow:hidden;text-decoration:none;transition:box-shadow .15s,transform .12s}
.blog-index .post-card:hover{box-shadow:0 6px 28px rgba(0,0,0,.10);transform:translateY(-1px)}
.blog-index .post-card .post-img img{width:100%;height:180px;object-fit:cover;display:block}
.blog-index .post-card .post-body{padding:18px;flex:1;display:flex;flex-direction:column}
.blog-index .post-card .post-body h3{font-family:'Archivo';font-weight:800;font-size:16px;line-height:1.3;margin:6px 0 8px;color:var(--ink);flex:1}
.blog-index .post-card .post-excerpt{font-size:13px;color:var(--muted);line-height:1.5;margin-bottom:10px;flex:1}
.blog-index .post-card .post-meta{font-size:11px;color:var(--muted);font-weight:600;display:flex;gap:4px;align-items:center}
.blog-index .pager{display:flex;gap:8px;justify-content:center;margin:28px 0}
@media(max-width:800px){.blog-index .posts{grid-template-columns:repeat(2,1fr)}}
@media(max-width:540px){.blog-index .posts{grid-template-columns:1fr}.blog-index .featured .feat-body{padding:18px}}

/* BLOG show — article body prose */
.article-body{font-size:16px;line-height:1.7;color:var(--ink)}
.article-body h2{font-family:'Archivo';font-weight:800;font-size:22px;margin:24px 0 10px}
.article-body h3{font-family:'Archivo';font-weight:700;font-size:18px;margin:18px 0 8px}
.article-body p{margin:0 0 14px}.article-body a{color:var(--brand);font-weight:600}
.article-body ul,.article-body ol{margin:0 0 14px 22px}.article-body li{margin:4px 0}
.article-body img{max-width:100%;border-radius:12px;margin:14px 0}
/* Blog article images: cap displayed size at 500x500, aspect ratio preserved. Scoped to the blog show page (.blog-index) so shared .article-body pages (privacy/terms/about) are untouched. */
.blog-index .article-body img{max-width:min(100%,500px);max-height:500px;width:auto;height:auto}
.article-body pre{background:#11141a;color:#cfd4db;border-radius:10px;padding:14px;overflow-x:auto;font-family:'JetBrains Mono';font-size:13px}
.article-body code{font-family:'JetBrains Mono'}

/* CLASSICS page */
.classic-intro p{margin-bottom:10px}
.classic-chips{display:flex;flex-wrap:wrap;gap:10px;margin-top:10px}
.classic-chip{display:flex;flex-direction:column;padding:10px 14px;background:var(--gold-soft);border:1px solid #ecd9b0;border-radius:12px;box-shadow:var(--shadow);transition:border-color .12s,transform .12s;text-decoration:none}
.classic-chip:hover{border-color:var(--gold);transform:translateY(-1px)}
.classic-chip-vin{font-family:'JetBrains Mono';font-weight:700;font-size:13px;color:#8a5e12;letter-spacing:.08em}
.classic-chip-label{font-size:11px;color:var(--muted);margin-top:2px}
.classic-chip-static{cursor:default}
.classic-chip-static:hover{transform:none;border-color:#ecd9b0}
.classic-mfr-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:8px}
.classic-mfr-card{background:var(--gold-soft);border:1px solid #ecd9b0;border-radius:12px;padding:14px}
.classic-mfr-card strong{display:block;font-family:'Archivo';font-weight:800;font-size:14px;color:#7a5010;margin-bottom:8px}
.classic-mfr-header{display:flex;justify-content:space-between;align-items:baseline;gap:8px;margin-bottom:8px}
.classic-mfr-badge{display:inline-block;background:rgba(201,130,26,.18);border:1px solid #ecd9b0;border-radius:20px;padding:2px 9px;font-size:11px;font-weight:700;color:#8a5e12}
.classic-mfr-detail{display:flex;gap:8px;font-size:13px;margin-bottom:4px}
.classic-mfr-detail .k{color:var(--muted);font-weight:600;min-width:46px}
.classic-mfr-detail .v{color:var(--ink);font-weight:500}
.classic-mfr-detail .v.mono{font-family:'JetBrains Mono';font-size:12px}
.classic-tech-list{margin:6px 0 0 14px;list-style:disc;color:var(--muted);font-size:13px;line-height:1.8}
@media(max-width:760px){.classic-mfr-grid{grid-template-columns:1fr 1fr}}
@media(max-width:540px){.classic-mfr-grid{grid-template-columns:1fr}}

/* CLASSICS COVERAGE MATRIX — chunked year-by-manufacturer tables. */
.classic-matrix-hint{color:var(--muted);font-size:13px;margin:-6px 0 14px}
/* Each table scrolls horizontally inside its own box so it never overflows the
   page on narrow screens. */
.classic-matrix-wrap{overflow-x:auto;margin:0 0 18px;border:1px solid var(--line);border-radius:12px}
.classic-matrix-wrap:last-child{margin-bottom:0}
.classic-matrix{border-collapse:collapse;width:100%;font-size:13px}
.classic-matrix th,.classic-matrix td{padding:7px 8px;text-align:center;border-bottom:1px solid var(--line);white-space:nowrap}
.classic-matrix tbody tr:last-child th,.classic-matrix tbody tr:last-child td{border-bottom:0}
.classic-matrix thead th{background:var(--paper);border-bottom:2px solid var(--line);
  font-family:'Archivo';font-weight:800;color:var(--ink);vertical-align:bottom}
.classic-matrix .cm-mfr{display:block}
.classic-matrix .cm-mfr-sub{display:block;font-size:10px;font-weight:600;color:var(--muted);
  text-transform:uppercase;letter-spacing:.06em;margin-top:2px}
.classic-matrix .cm-corner{text-align:left;color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.06em}
.classic-matrix .cm-yr-row{text-align:left;font-family:'JetBrains Mono';font-weight:700;color:var(--muted);background:var(--paper)}
.classic-matrix .cm-year{font:inherit;font-family:'JetBrains Mono';font-weight:700;font-size:13px;color:#8a5e12;
  background:var(--gold-soft);border:1px solid #ecd9b0;border-radius:8px;padding:5px 9px;min-width:54px;cursor:pointer}
.classic-matrix .cm-year:hover,.classic-matrix .cm-year:focus-visible{border-color:var(--gold);background:#fbe6c8;outline:none}
.classic-matrix .cm-empty{color:#d8c7a4}
/* Shared year-cell tooltip (appended to <body>). */
.cm-tooltip{position:fixed;z-index:80;max-width:340px;background:#2b211a;color:#fff;border-radius:10px;
  padding:10px 12px;box-shadow:0 12px 30px rgba(0,0,0,.28);pointer-events:none;font-size:13px}
.cm-tooltip[hidden]{display:none}
.cm-tip-h{font-weight:800;font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:#ffd591;margin-bottom:5px}
.cm-tip-b{line-height:1.5}

/* DATA downloads page */
.data-downloads{display:grid;grid-template-columns:repeat(2,1fr);gap:20px;margin-top:22px}
.data-card{display:flex;flex-direction:column;gap:14px}
.data-card h2{margin-bottom:6px}
.data-card-top{flex:1}
.data-card-desc{color:var(--muted);font-size:14px;line-height:1.5;margin-top:4px}
.data-card-action{margin-top:4px}
.data-card-action .btn{width:100%}
.data-locked{color:var(--muted);cursor:not-allowed;background:#f5f3f0;border-color:var(--line)}
.data-info-row{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-top:20px}
.data-quality-list{margin:8px 0 0 18px;list-style:disc;color:var(--muted);font-size:14px;line-height:1.9}
@media(max-width:760px){.data-downloads{grid-template-columns:1fr}.data-info-row{grid-template-columns:1fr}}

/* PHASE 3: PRICING PLANS */
.plan-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:20px;margin-top:24px;align-items:start}
/* Real purchasable tiers (web_features.real_plans_grid): six cards lay out 3x2. */
.plan-grid.real-plans-grid{grid-template-columns:repeat(3,1fr)}
/* Launch "subscriptions coming soon" notice — shown when no purchasable plans exist (Chargebee migration-only state). */
.plan-coming-soon{max-width:560px;margin:24px auto 0;text-align:center}
.plan-coming-soon h2{justify-content:center}
.plan-coming-soon h2::before{display:none}
.plan-coming-soon p{color:var(--muted)}
.plan-card{background:var(--paper);border:1px solid var(--line);border-radius:16px;overflow:hidden;box-shadow:var(--shadow);display:flex;flex-direction:column}
.plan-card-header{padding:22px 20px 18px;border-bottom:1px solid var(--line)}
.plan-card-header h3{font-family:'Archivo';font-weight:800;font-size:18px}
.plan-card-price{margin-top:10px}
.plan-card-price .amount{font-family:'Archivo';font-weight:900;font-size:32px;color:var(--ink)}
.plan-card-price .period{font-size:14px;color:var(--muted)}
.plan-card-price .free{font-family:'Archivo';font-weight:900;font-size:28px;color:var(--muted)}
.plan-card-desc{font-size:13px;color:var(--muted);margin-top:6px;line-height:1.45}
.plan-card-features{padding:16px 20px;flex:1}
.plan-feature{display:flex;align-items:flex-start;gap:8px;padding:5px 0;font-size:13px;color:var(--ink)}
.plan-feature svg{flex-shrink:0;color:#2a9d2a;margin-top:1px}
.plan-cta{padding:16px 20px;border-top:1px solid var(--line)}
.plan-cta .btn{margin-bottom:0}
.plan-highlight{border:2px solid var(--brand);box-shadow:0 4px 18px rgba(196,32,16,.12)}
.plan-highlight .plan-card-header{background:linear-gradient(135deg,#fff5f4,#fff)}
.plan-badge{display:inline-block;background:var(--brand);color:#fff;font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;padding:3px 10px;border-radius:20px;margin-top:8px}
.plan-current-label{display:flex;align-items:center;justify-content:center;gap:6px;padding:11px;border-radius:11px;border:2px solid #2a9d2a;color:#2a9d2a;font-weight:700;font-size:14px}
.plan-savings{font-size:12px;color:#2a9d2a;font-weight:600;margin-top:4px}
.plan-annual-note{font-size:12px;color:var(--muted);margin-top:3px}
.plan-period-toggle{display:flex;gap:0;background:var(--paper);border:1px solid var(--line);border-radius:10px;overflow:hidden;width:fit-content;margin:18px auto 0}
.plan-period-toggle a{padding:8px 22px;font-size:14px;font-weight:600;color:var(--muted)}
.plan-period-toggle a.active{background:var(--brand);color:#fff}
.plan-faq{margin-top:42px}
.plan-faq h2{font-family:'Archivo';font-weight:900;font-size:clamp(22px,2.8vw,28px);margin-bottom:20px}
.plan-faq-item{padding:16px 0;border-bottom:1px solid var(--line)}
.plan-faq-item h3{font-weight:700;font-size:15px;margin-bottom:6px}
.plan-faq-item p{font-size:14px;color:var(--muted);line-height:1.55}
/* The compound .real-plans-grid selector must repeat in the media rules — its
   (0,2,0) base rule otherwise outweighs the single-class responsive overrides. */
@media(max-width:900px){.plan-grid,.plan-grid.real-plans-grid{grid-template-columns:1fr 1fr}}
@media(max-width:600px){.plan-grid,.plan-grid.real-plans-grid{grid-template-columns:1fr}}

/* PHASE 3: SUBSCRIPTION/BILLING */
.sub-status-card{background:var(--paper);border:1px solid var(--line);border-radius:16px;padding:24px;box-shadow:var(--shadow);margin-top:22px}
.sub-plan-name{font-family:'Archivo';font-weight:900;font-size:26px}
.sub-plan-desc{color:var(--muted);font-size:14px;margin-top:2px}
.sub-price{font-family:'Archivo';font-weight:900;font-size:28px;color:var(--brand);margin-top:10px}
.sub-price span{font-size:15px;color:var(--muted);font-weight:600}
.sub-status-badge{display:inline-block;background:#e8f8e8;color:#1a7a1a;border:1px solid #b2ddb2;border-radius:20px;padding:4px 14px;font-size:13px;font-weight:700;margin-top:8px}
.sub-renewal{font-size:13px;color:var(--muted);margin-top:4px}
.sub-usage-section{margin-top:22px}
.sub-usage-section h2{font-family:'Archivo';font-weight:800;font-size:16px;margin-bottom:14px}
.sub-usage-bar{background:var(--line);border-radius:6px;height:8px;overflow:hidden;margin-top:8px}
.sub-usage-fill{height:8px;border-radius:6px;background:var(--brand)}
.sub-usage-label{font-size:12px;color:var(--muted);margin-top:5px}
.sub-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:22px}
.sub-actions .btn{width:auto;padding:11px 20px;margin-bottom:0}
.sub-no-plan{text-align:center;padding:40px 20px}
.sub-no-plan h2{font-family:'Archivo';font-weight:900;font-size:24px;margin-top:16px}
.sub-no-plan p{color:var(--muted);font-size:15px;margin-top:8px;max-width:480px;margin-left:auto;margin-right:auto}
.sub-no-plan .btn{display:inline-flex;width:auto;padding:13px 28px;margin:20px auto 0}
.sub-annual-save{background:var(--gold-soft);border:1px solid #f0e0c2;border-radius:12px;padding:18px 20px;margin-top:22px}
.sub-annual-save h3{font-weight:700;font-size:15px;color:#7a5a1e}
.sub-annual-save p{font-size:14px;color:#8a6a2e;margin-top:4px;line-height:1.5}
@media(max-width:760px){.sub-actions{flex-direction:column}.sub-actions .btn{width:100%}}

/* PHASE 3 TASK 2: Profile + API Keys + Usage */
/* Profile page */
.sh-profile-fields{display:flex;flex-direction:column;gap:14px}
.sh-field-pair{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.sh-field{display:flex;flex-direction:column;gap:5px}
.sh-field-label{font-size:13px;font-weight:600;color:var(--ink)}
.sh-field-input{padding:10px 13px;border:1.5px solid var(--line);border-radius:10px;font-size:15px;font-family:inherit;background:var(--paper);color:var(--ink)}
.sh-field-input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(196,32,16,.1)}
.sh-field-hint{font-size:12px;color:var(--muted)}
.sh-profile-actions{display:flex;gap:10px;flex-wrap:wrap}
.sh-danger-zone h2::before{background:#c53030!important}
/* Checkbox row */
.sh-checkbox-row{display:flex;align-items:flex-start;gap:10px}
.sh-checkbox{width:16px;height:16px;margin-top:2px;flex-shrink:0;accent-color:var(--brand)}
/* API key row */
.sh-key-row{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;padding:14px 0;border-bottom:1px solid var(--line)}
.sh-key-row:last-child{border-bottom:none}
.sh-key-row-info{flex:1;min-width:0}
.sh-key-row-name{font-weight:700;font-size:15px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.sh-key-row-meta{margin-top:5px;display:flex;flex-wrap:wrap;gap:14px;font-size:12px;color:var(--muted)}
.sh-key-row-actions{display:flex;gap:8px;flex-shrink:0;align-items:center}
.sh-key-prefix{font-family:'JetBrains Mono';font-size:12px;background:var(--bg);padding:3px 7px;border-radius:6px;color:var(--ink)}
.sh-key-badge{font-size:11px;font-weight:700;padding:2px 9px;border-radius:20px}
.sh-key-badge.active{background:#e8f8e8;color:#1a7a1a}
.sh-key-badge.revoked{background:#fdecea;color:#c53030}
/* Key code display block */
.sh-key-code-block{display:flex;align-items:center;gap:10px;background:#11141a;border-radius:10px;padding:12px 14px;overflow-x:auto}
.sh-key-mono{font-family:'JetBrains Mono';font-size:13px;color:#4ade80;word-break:break-all;flex:1}
/* Account disabled state */
.sh-account-disabled-notice{background:#fdecea;border:1px solid #f5c6c6;border-radius:10px;padding:12px 14px;font-size:13px;color:#c53030;margin-bottom:14px}
.sh-form-disabled{opacity:.5;pointer-events:none}
/* Reveal page */
.sh-reveal-warning h2::before{background:#d97706!important}
/* Usage two-column layout */
.sh-usage-two-col{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-top:20px;margin-bottom:40px}
@media(max-width:760px){.sh-field-pair{grid-template-columns:1fr}.sh-usage-two-col{grid-template-columns:1fr}.sh-key-row{flex-direction:column}.sh-key-row-actions{flex-direction:row}}

/* ===== Auth (Devise) showroom cards — Phase 3 Task 4 (unique names) ===== */
.auth-wrap{max-width:460px;margin:40px auto 56px;padding:0 20px}
.auth-card{background:var(--paper);border:1px solid var(--line);border-radius:16px;box-shadow:var(--shadow);overflow:hidden}
.auth-card .auth-head{background:var(--brand);padding:22px 30px;text-align:center}
.auth-card .auth-head img{height:38px;width:auto}
.auth-card .auth-body{padding:28px 30px}
.auth-card h1{font-family:'Archivo','Inter',sans-serif;font-weight:900;font-size:24px;color:var(--ink);margin-bottom:6px;text-align:center}
.auth-card .auth-sub{color:var(--muted);font-size:14px;margin-bottom:20px;text-align:center}
.auth-field{margin-bottom:15px}
.auth-field label{display:block;font-size:13px;font-weight:600;color:var(--ink);margin-bottom:6px}
.auth-field input[type=email],.auth-field input[type=password],.auth-field input[type=text]{width:100%;padding:11px 14px;border:1.5px solid var(--line);border-radius:10px;font-size:15px;background:#fff;color:var(--ink)}
.auth-field input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(196,32,16,.12)}
.auth-field .auth-hint{display:block;margin-top:5px;font-size:12px;color:var(--muted)}
.auth-field-pair{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.auth-row{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px;font-size:14px;gap:10px;flex-wrap:wrap}
.auth-check{display:flex;align-items:center;gap:8px;color:var(--ink)}
.auth-check input{width:16px;height:16px;accent-color:var(--brand)}
.auth-card .btn{width:100%;margin-top:6px;justify-content:center}
.auth-links{margin-top:18px;padding-top:16px;border-top:1px solid var(--line);font-size:14px;display:flex;flex-direction:column;gap:9px;text-align:center}
.auth-links a{color:var(--brand);font-weight:600}
.auth-links a:hover{text-decoration:underline}
.auth-errors{background:var(--gold-soft);border:1px solid #f0e0c2;border-radius:10px;padding:12px 14px;font-size:13px;color:#7a5a1e;margin-bottom:16px}
.auth-errors h2{font-size:14px;font-weight:700;margin-bottom:6px;color:#7a5a1e}
.auth-errors ul{margin:0;padding-left:18px}
.auth-errors li{margin:2px 0}
.auth-danger{margin-top:20px;padding-top:16px;border-top:1px solid var(--line)}
.auth-danger h3{font-size:14px;font-weight:700;color:var(--ink);margin-bottom:8px}
.auth-danger p{font-size:13px;color:var(--muted);margin-bottom:10px}
@media(max-width:760px){.auth-field-pair{grid-template-columns:1fr}}

/* ── Camera VIN Scanner (Phase 3) ─────────────────────────────────── */
.scanner-card{background:#0d1117;border-color:#1f2733}
.scanner-card .relative .bg-black,.scanner-card video{background:#000}
.scanner-controls{background:#141a22;border-top:1px solid #1f2733;padding:22px 16px}
.scanner-action-btn{margin:0}
.scanner-action-btn+.scanner-action-btn{margin-top:12px}
.scanner-limit{display:inline-flex;align-items:center;background:var(--gold-soft);color:#7a5a1e;border:1px solid #f0e0c2;border-radius:999px;padding:7px 14px;font-size:13px;font-weight:600}
.scanner-limit-unlimited{background:#e9f7ec;color:#1f7a35;border-color:#bfe6c8}
.scanner-tips h2{font-size:17px}
.scanner-tips-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:14px}
.scanner-tip{background:var(--bg);border:1px solid var(--line);border-radius:12px;padding:14px 16px}
.scanner-tip h4{font-size:14px;font-weight:700;color:var(--ink);margin-bottom:4px}
.scanner-tip p{font-size:13px;color:var(--muted);line-height:1.5}
.scanner-upsell .scanner-upsell-lead{font-size:15px;color:var(--muted);line-height:1.6;margin-bottom:22px}
.scanner-upsell-grid{display:grid;grid-template-columns:1fr 1fr;gap:18px}
.scanner-upsell-plan{position:relative;background:var(--bg);border:1px solid var(--line);border-radius:14px;padding:24px}
.scanner-upsell-featured{border:2px solid var(--brand);background:#fff}
.scanner-upsell-badge{position:absolute;top:-11px;right:16px;background:var(--brand);color:#fff;font-size:11px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;padding:4px 10px;border-radius:999px}
.scanner-upsell-plan h3{font-size:19px;font-weight:800;color:var(--ink);margin-bottom:6px}
.scanner-upsell-price{font-size:26px;font-weight:900;color:var(--brand);margin-bottom:4px}
.scanner-upsell-featured .scanner-upsell-price{color:var(--brand-deep)}
.scanner-upsell-sub{font-size:13px;color:var(--muted);margin-bottom:16px}
.scanner-upsell-feats{list-style:none;padding:0;margin:0 0 18px}
.scanner-upsell-feats li{position:relative;padding-left:24px;font-size:14px;color:var(--ink);margin:8px 0;line-height:1.4}
.scanner-upsell-feats li::before{content:"\2713";position:absolute;left:0;top:0;color:#1f7a35;font-weight:800}
.scanner-upsell-signin{margin-top:22px;padding-top:18px;border-top:1px solid var(--line);text-align:center}
.scanner-upsell-signin p{font-size:14px;color:var(--muted);margin-bottom:12px}
.scanner-upsell-signin .btn{width:auto;display:inline-flex;padding:11px 22px}
@media(max-width:760px){.scanner-tips-grid{grid-template-columns:1fr}.scanner-upsell-grid{grid-template-columns:1fr}}

/* ══════════════════════════════════════════════════════════════════════════
   ARCHIVE LANDING REDESIGN (Phase: new mockup). All rules scoped under
   .archive-v2 so the mockup's bare class names (.hero/.decodebar/.legend/
   .stats/.make/.chip/.section/.year/.years/.recent/.promo/.secnav etc.) do
   NOT clobber the shared showroom classes from earlier phases. Source of
   truth: /Users/rbrown/Downloads/decodethis-archive-redesign.html. Layout
   chrome (:root/*/html/body/.wrap/.nav/.burger/.site-footer) and real ads
   (.ad*) intentionally NOT re-added here.
   ══════════════════════════════════════════════════════════════════════════ */

/* HERO */
.archive-v2 .crumb{font-size:13px;color:var(--muted);margin:14px 2px 0}
.archive-v2 .crumb a:hover{color:var(--brand)}.archive-v2 .crumb .sep{opacity:.5;margin:0 6px}
.archive-v2 .hero{margin-top:8px;border-radius:18px;color:#fff;padding:26px 30px;
  background:linear-gradient(125deg,var(--brand),var(--brand-deep));box-shadow:0 12px 30px rgba(122,20,9,.2)}
/* Year listing: a single model year IS one era, so the page flips the archive-v2
   hero via the documented era flag (§3.4) — modern years stay brand red, classic
   (pre-1981) years go maroon/gold. Reuses existing tokens; introduces no new colors. */
.archive-v2.era-classic .hero{background:linear-gradient(125deg,var(--maroon),var(--maroon-deep));box-shadow:0 12px 30px rgba(94,15,6,.2)}
.archive-v2.era-classic .chip .k{color:#ffd591}
.archive-v2 .hero h1{font-family:'Archivo';font-weight:900;font-size:clamp(26px,3.6vw,38px);letter-spacing:-.6px;line-height:1}
.archive-v2 .hero .sub{color:#ffd9d2;margin-top:8px;font-size:15px;max-width:64ch}
.archive-v2 .chips{display:flex;gap:8px;flex-wrap:wrap;margin-top:16px}
.archive-v2 .chip{background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.26);border-radius:9px;padding:7px 12px}
.archive-v2 .chip .v{font-family:'Archivo';font-weight:800;font-size:15px}
.archive-v2 .chip .k{font-size:10px;text-transform:uppercase;letter-spacing:.12em;color:#ffcfc7;margin-top:1px}

/* DECODE BAR (with validator) */
.archive-v2 .decodebar{background:var(--paper);border:1px solid var(--line);border-radius:14px;margin-top:16px;padding:14px 18px}
.archive-v2 .decodebar .row{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.archive-v2 .decodebar label{font-weight:700;font-size:15px;display:flex;align-items:center;gap:7px}
.archive-v2 .decodebar input{flex:1;min-width:200px;font-family:'JetBrains Mono';font-size:15px;letter-spacing:.1em;
  padding:11px 14px;border:1.5px solid var(--line);border-radius:10px;text-transform:uppercase}
.archive-v2 .decodebar input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(196,32,16,.12)}
.archive-v2 .decodebar button{background:var(--brand);color:#fff;border:0;border-radius:10px;padding:11px 22px;font-weight:700;font-size:15px;cursor:pointer}
.archive-v2 .decodebar button:disabled{opacity:.5;cursor:not-allowed}
.archive-v2 #vinIndicator{font-size:12px;margin-top:8px;min-height:1rem}
.archive-v2 .ok{color:#16a34a}.archive-v2 .bad{color:var(--brand)}.archive-v2 .dim{color:var(--muted)}

/* SECTION NAV (sticky under the 62px nav). Not scoped under .archive-v2 so the
   _section_nav partial can render as a direct child of the page-spanning
   #main-content — sticky needs a tall containing block to stay pinned. */
.secnav{position:sticky;top:62px;z-index:30;background:rgba(244,242,239,.93);backdrop-filter:blur(8px);
  border-bottom:1px solid var(--line);margin-top:18px}
.secnav .wrap{display:flex;gap:8px;padding:11px 20px;overflow-x:auto}
.secnav a{flex:none;font-weight:700;font-size:14px;color:var(--ink);background:#fff;border:1px solid var(--line);border-radius:20px;padding:8px 15px}
.secnav a:hover{border-color:var(--brand);color:var(--brand)}

/* SECTION HEADERS */
.archive-v2 .section{scroll-margin-top:132px;padding-top:38px}
.archive-v2 .shead{margin-bottom:18px}
.archive-v2 .shead h2{font-family:'Archivo';font-weight:900;font-size:clamp(22px,3vw,30px);letter-spacing:-.4px}
.archive-v2 .shead p{color:var(--muted);margin-top:4px}

/* YEAR TOOLBAR */
.archive-v2 .toolbar{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:16px}
.archive-v2 .tabs{display:inline-flex;background:#fff;border:1px solid var(--line);border-radius:11px;padding:4px}
.archive-v2 .tabs button{border:0;background:transparent;font-family:'Inter';font-weight:700;font-size:14px;color:var(--muted);padding:8px 16px;border-radius:8px;cursor:pointer}
.archive-v2 .tabs button[aria-selected="true"]{background:var(--brand);color:#fff}
.archive-v2 .tabs button[aria-selected="true"][data-era="classic"]{background:var(--gold)}
.archive-v2 .yearsearch{position:relative;flex:1;min-width:150px;max-width:260px}
.archive-v2 .yearsearch input{width:100%;padding:9px 12px 9px 32px;border:1px solid var(--line);border-radius:10px;font-size:14px}
.archive-v2 .yearsearch input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(196,32,16,.12)}
.archive-v2 .yearsearch .ic{position:absolute;left:11px;top:50%;transform:translateY(-50%);color:var(--muted)}
.archive-v2 .legend{display:flex;gap:16px;margin-left:auto;font-size:12px;color:var(--muted);font-weight:600}
.archive-v2 .legend span{display:inline-flex;align-items:center;gap:6px}
.archive-v2 .legend .dot{width:10px;height:10px;border-radius:3px}.archive-v2 .legend .dot.c{background:var(--gold)}.archive-v2 .legend .dot.m{background:var(--brand)}
.archive-v2 .jump{display:flex;gap:8px;overflow-x:auto;margin-bottom:18px;padding-bottom:2px}
.archive-v2 .jump a{flex:none;font-weight:700;font-size:13px;color:var(--ink);background:#fff;border:1px solid var(--line);border-radius:20px;padding:6px 13px}
.archive-v2 .jump a:hover{border-color:var(--brand);color:var(--brand)}.archive-v2 .jump a.hide{display:none}

/* DECADES + YEAR CHIPS */
.archive-v2 .decade{scroll-margin-top:150px;padding-top:18px}
.archive-v2 .decade .dhead{display:flex;align-items:baseline;gap:12px;margin-bottom:12px}
.archive-v2 .decade .dhead h3{font-family:'Archivo';font-weight:900;font-size:20px}
.archive-v2 .decade .dhead .c{color:var(--muted);font-size:13px;font-weight:600}
.archive-v2 .years{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:10px}
.archive-v2 .year{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;padding:15px 8px;
  border:1px solid var(--line);border-top:3px solid var(--brand);border-radius:12px;background:var(--paper);
  color:var(--ink);box-shadow:var(--shadow);transition:transform .12s,box-shadow .12s,border-color .12s,background .12s}
.archive-v2 .year .y{font-family:'Archivo';font-weight:800;font-size:21px;line-height:1}
.archive-v2 .year .tag{font-family:'Inter';font-weight:700;font-size:9.5px;letter-spacing:.12em;text-transform:uppercase}
.archive-v2 .year:hover{transform:translateY(-2px);box-shadow:0 8px 18px rgba(0,0,0,.1)}
.archive-v2 .year.classic{border-top-color:var(--gold)}.archive-v2 .year.classic .tag{color:var(--gold)}
.archive-v2 .year.classic:hover{border-color:var(--gold);background:var(--gold-soft)}
.archive-v2 .year.modern{border-top-color:var(--brand)}.archive-v2 .year.modern .tag{color:var(--brand)}
.archive-v2 .year.modern:hover{border-color:var(--brand);background:#fbf3f1}
.archive-v2 .year.hide{display:none}.archive-v2 .decade.hide{display:none}
.archive-v2 .empty{display:none;text-align:center;color:var(--muted);padding:40px 0}.archive-v2 .empty.show{display:block}

/* MAKES */
.archive-v2 .makes{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:14px}
.archive-v2 .make{background:var(--paper);border:1px solid var(--line);border-radius:14px;padding:18px;text-align:center;
  box-shadow:var(--shadow);transition:transform .12s,box-shadow .12s,border-color .12s,background .12s}
.archive-v2 .make:hover{transform:translateY(-2px);box-shadow:0 8px 18px rgba(0,0,0,.08);border-color:var(--brand);background:#fbf3f1}
.archive-v2 .make .lw{height:46px;display:grid;place-items:center;margin-bottom:10px}
.archive-v2 .make .lw img{max-height:46px;max-width:90%;object-fit:contain}
.archive-v2 .make .lw .mono{display:none;font-family:'Archivo';font-weight:900;font-size:24px;color:var(--muted)}
.archive-v2 .make .nm{font-weight:700}

/* PROMO (first-party CTA, not an ad slot) */
.archive-v2 .promo{background:linear-gradient(125deg,var(--brand),var(--brand-deep));color:#fff;border-radius:18px;padding:32px;text-align:center;margin-top:38px}
.archive-v2 .promo h3{font-family:'Archivo';font-weight:900;font-size:24px}
.archive-v2 .promo p{color:#ffd9d2;margin:8px auto 0;max-width:58ch}
.archive-v2 .promo .btns{display:flex;gap:12px;justify-content:center;margin-top:18px;flex-wrap:wrap}
.archive-v2 .promo .b1{background:#fff;color:var(--brand);font-weight:700;border-radius:10px;padding:11px 20px;border:0}
.archive-v2 .promo .b2{background:transparent;color:#fff;border:1px solid rgba(255,255,255,.6);border-radius:10px;padding:11px 20px;font-weight:700}

/* RECENT */
.archive-v2 .recent{display:grid;grid-template-columns:repeat(auto-fill,minmax(244px,1fr));gap:16px}
.archive-v2 .rcard{background:var(--paper);border:1px solid var(--line);border-radius:14px;padding:18px;box-shadow:var(--shadow);
  transition:transform .12s,box-shadow .12s,border-color .12s}
.archive-v2 .rcard:hover{transform:translateY(-2px);box-shadow:0 8px 18px rgba(0,0,0,.08);border-color:var(--brand)}
.archive-v2 .rcard .top{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}
.archive-v2 .rcard .yr{font-family:'Archivo';font-weight:800;font-size:13px;padding:3px 10px;border-radius:20px}
.archive-v2 .rcard .yr.modern{background:#fbe6e2;color:var(--brand)}.archive-v2 .rcard .yr.classic{background:var(--gold-soft);color:#8a5e12}
.archive-v2 .rcard .new{font-size:11px;font-weight:600;color:var(--muted)}
.archive-v2 .rcard h3{font-family:'Archivo';font-weight:800;font-size:17px;line-height:1.15}
.archive-v2 .rcard .trim{font-size:13px;color:var(--muted);margin-top:2px}
.archive-v2 .rcard .vin{font-family:'JetBrains Mono';font-size:12px;color:var(--muted);border-top:1px solid var(--line);margin-top:14px;padding-top:11px}
.archive-v2 .viewall{text-align:center;margin-top:22px}
.archive-v2 .viewall a{display:inline-block;background:var(--brand);color:#fff;font-weight:700;border-radius:11px;padding:13px 24px}

/* STATS BAND (dark) */
.archive-v2 .stats-band{background:linear-gradient(135deg,#171b22,#0e1116);color:#fff;border-radius:18px;padding:40px;margin-top:38px}
.archive-v2 .stats-band h2{font-family:'Archivo';font-weight:900;font-size:26px;text-align:center}
.archive-v2 .stats-band .sub{color:#9aa3af;text-align:center;margin-top:6px}
.archive-v2 .statgrid{display:grid;grid-template-columns:repeat(4,1fr);gap:24px;text-align:center;margin-top:26px}
.archive-v2 .statgrid .n{font-family:'Archivo';font-weight:900;font-size:clamp(24px,3vw,34px);color:#ff7a5c}
.archive-v2 .statgrid .l{color:#9aa3af;font-size:14px;margin-top:4px}

/* RESPONSIVE */
@media (max-width:900px){.archive-v2 .statgrid{grid-template-columns:repeat(2,1fr)}}
@media (max-width:760px){
  .archive-v2 .legend{width:100%;margin-left:0;order:3}
  .archive-v2 .years{grid-template-columns:repeat(auto-fill,minmax(80px,1fr))}
  .archive-v2 .hero{padding:22px}
}
