/* On production, <body> itself carries the dark background (it's the
 * true page root there). Our .newsite-scope wrapper sits one level
 * *inside* body instead (so the scoping trick doesn't leak onto the
 * rest of the legacy site), which left the real <body> transparent.
 * That's harmless while a section is covering the full viewport, but
 * once .hero-base-auto/section boundaries scroll past the fixed
 * header, whatever's below shows through instead of a solid backdrop
 * -- which reads as page content "colliding" with the header text.
 * Hardcoding the same color here (not by var(), since --bg--black is
 * only defined inside .newsite-scope) fixes it for every ported page. */
/* normalize.css's "html, body { margin: 0; }" reset was scoped to
 * ".newsite-scope { margin: 0; }" along with everything else (see the
 * html/body/:root special-casing note in the migration docs), which
 * left the real <body> tag still carrying the browser's default 8px
 * margin on all four sides. Harmless-looking on its own, but it made
 * every ported page's main content and footer render ~16px narrower
 * than production at any given viewport width (the fixed-position
 * header is unaffected, since fixed elements are positioned against
 * the viewport, not body -- so the header lined up fine while
 * everything below it didn't, which is what made this noticeable). */
body {
  margin: 0;
  background-color: #030304;
}

/* Header/nav are transparent at rest by design (lets the hero background
 * bleed up behind the logo at the very top of the page, matching
 * production). On production, page content never actually reaches the
 * header because every section has its own generous top spacing --
 * that's not guaranteed on a page that's just a long list of rows
 * (e.g. media.html's 57 press-mention entries), so a row can end up
 * scrolled to exactly behind the header with nothing to hide it.
 * nav.js toggles this class once window.scrollY > 4px. */
.newsite-scope .header.header--scrolled {
  background-color: #030304;
}

/* Small corrections on top of the ported new-site CSS.
 *
 * The live site's actual boilerplate includes an inline Webflow reset
 * (`a, .w-dropdown-btn, .w-dropdown-toggle, .w-dropdown-link { color:
 * inherit; text-decoration: inherit; font-size: inherit; }`) that our
 * copied components.css/superantispyware-dev.css don't carry, since we
 * only extracted the <header>/<footer> blocks, not the page's inline
 * <style> boilerplate. Without it, components.css's OWN generic base
 * widget style (.w-dropdown-btn, .w-dropdown-toggle, .w-dropdown-link
 * { color: #222222 }) wins instead, and plain <a> tags fall back to the
 * browser default link-blue. More specific rules elsewhere (e.g.
 * .link-medium--red's #fd4849) still correctly override this by
 * specificity, matching production.
 */
.newsite-scope a,
.newsite-scope .w-dropdown-btn,
.newsite-scope .w-dropdown-toggle,
.newsite-scope .w-dropdown-link {
  color: inherit;
  text-decoration: inherit;
  font-size: inherit;
}

/* Production's real root font-size is fluid (viewport-scaled), not a
 * flat 16px -- this is Webflow's standard responsive-typography setup,
 * copied verbatim from the live site's own CSS. An earlier version of
 * this fix hardcoded `html { font-size: 16px; }` to counteract the
 * legacy CDN's `html { font-size: 10px }` (style1.css), which was a
 * reasonable approximation back when that legacy stylesheet chain was
 * still loaded on these pages -- but it's since been removed entirely
 * (see the "Old legacy stylesheet chain... removed" comment in each
 * ported page's <head>), and a flat 16px only coincidentally matched
 * production near ~1280-1350px viewports. At wider viewports the real
 * value grows well past 16px (18px at 1920px), so a flat root font-size
 * made every rem-based measurement -- container width, padding, type
 * scale -- increasingly too small compared to production the wider the
 * screen got. This replicates the real formula so it tracks exactly. */
html {
  font-size: calc(0.625rem + 0.416667vw);
}
@media screen and (max-width: 1920px) {
  html {
    font-size: calc(0.625rem + 0.416667vw);
  }
}
@media screen and (max-width: 1440px) {
  html {
    font-size: calc(0.812695rem + 0.208117vw);
  }
}
@media screen and (max-width: 479px) {
  html {
    font-size: calc(4.26667vw);
  }
}

/* Simple bulleted link list (not a component that exists elsewhere on
 * the new site yet -- same type scale/spacing conventions as the rest
 * of the page). */
.newsite-scope .simple-link-list {
  list-style: disc;
  padding-left: 1.25rem;
  display: flex;
  flex-direction: column;
  gap: .75rem;
}

/* On production, the breadcrumb trail (the dimmed current-page item AND
 * the "/" separators between items) is generated at runtime by the
 * Finsweet Attributes breadcrumbs script (data-breadcrumbs on the <ul>)
 * via an injected <style> tag -- it isn't in the static CSS bundle at
 * all. We don't load that script, so we reproduce the same rules
 * statically. Confirmed against the live page's actual injected CSS:
 * `.breadcrumbs-list__item:not(:last-child) div::after { content: "/" }`
 * plus the last-child dim and flex-shrink:0 on non-last items. */
.newsite-scope .breadcrumbs-list__item:last-child {
  color: var(--text--white-60);
}
.newsite-scope .breadcrumbs-list__item:not(:last-child) {
  flex-shrink: 0;
}
.newsite-scope .breadcrumbs-list__item:not(:last-child) div::after {
  content: "/";
  position: absolute;
  transform: translateX(100%);
  right: -.25rem;
}

/* Product release history table (producthistory.html + producthistory.php).
 * Not an existing new-site component -- a simple 3-column
 * date/version/description row, stacking on mobile. */
.newsite-scope .ph-row {
  display: flex;
  gap: 1.5rem;
  padding: 1.5rem 0;
  border-bottom: 1px solid var(--stroke--white-40, hsla(0, 0%, 100%, .4));
}
.newsite-scope .ph-row__date,
.newsite-scope .ph-row__version {
  flex: 0 0 8rem;
}
.newsite-scope .ph-row__data {
  flex: 1;
}
.newsite-scope .ph-header {
  display: flex;
  gap: 1.5rem;
  padding-bottom: 1rem;
}
.newsite-scope .ph-header__date,
.newsite-scope .ph-header__version {
  flex: 0 0 8rem;
}
.newsite-scope .ph-header__data {
  flex: 1;
}
@media screen and (max-width: 479px) {
  .newsite-scope .ph-row {
    flex-direction: column;
    gap: .5rem;
  }
  .newsite-scope .ph-row__date,
  .newsite-scope .ph-row__version {
    flex: none;
  }
  .newsite-scope .ph-header {
    display: none;
  }
}

/* Sitemap page (sitemap.html). Not an existing new-site component --
 * a simple multi-column nested link tree, plus wide single-column
 * sections for the FAQ/Blog lists. */
.newsite-scope .sitemap-row {
  display: flex;
  flex-wrap: wrap;
  gap: 3rem;
  margin-bottom: 3rem;
}
.newsite-scope .sitemap-col {
  flex: 1 1 14rem;
}
.newsite-scope .sitemap-col--wide {
  flex: 1 1 100%;
}
.newsite-scope .sitemap-subheading {
  margin-top: 1rem;
  margin-bottom: .5rem;
}
.newsite-scope .sitemap-list {
  list-style: none;
  padding-left: 0;
  display: flex;
  flex-direction: column;
  gap: .5rem;
}
.newsite-scope .sitemap-list .sitemap-list {
  padding-left: 1.25rem;
  margin-top: .5rem;
}

/* Definitions update history (definitionupdatehistory.html +
 * displaydefinitionhistory.php) -- one date-grouped list of
 * family/items-added rows per database version. */
.newsite-scope .duh-group {
  margin-bottom: 2rem;
  padding-bottom: 1rem;
  border-bottom: 1px solid var(--stroke--white-40);
}
.newsite-scope .duh-group__title {
  margin-bottom: .75rem;
}
.newsite-scope .duh-row {
  display: flex;
  justify-content: space-between;
  gap: 1.5rem;
  padding: .375rem 0;
}
@media screen and (max-width: 479px) {
  .newsite-scope .duh-row {
    flex-direction: column;
    gap: .125rem;
  }
}

/* Vendor dispute form (vendordispute.html). components.css/
 * superantispyware-dev.css already ship .checkbox-field/.checkbox-label/
 * .checkbox-custom (used elsewhere on the real site) styled for a real
 * native checkbox hidden under a custom box -- but the real site relies
 * on Webflow's runtime JS to mirror the native :checked state onto
 * .checkbox-custom via a `w--redirected-checked` class, which we don't
 * load. We use a real (not fully hidden) checkbox input positioned over
 * the custom box instead, styled via the standard CSS :checked sibling
 * selector -- no JS needed. .checkbox-grid is a 4-column layout matching
 * the original 4x3 checkbox grid (not an existing new-site component). */
.newsite-scope .checkbox-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 1rem 1.5rem;
}
@media screen and (max-width: 767px) {
  .newsite-scope .checkbox-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}
.newsite-scope .checkbox-real {
  position: absolute;
  width: 1.5rem;
  height: 1.5rem;
  margin: 0;
  opacity: 0;
  cursor: pointer;
  z-index: 1;
}
.newsite-scope .checkbox-real:checked + .checkbox-custom {
  background-color: var(--bg--black);
  background-image: url('/newsite-assets/images/check-bg.svg');
  background-position: 50%;
  background-size: .875rem .875rem;
}

/* Single-column checkbox stack (uninstallsurvey.html) -- same
 * .checkbox-field components as .checkbox-grid, just stacked instead
 * of gridded since this form's list isn't a fixed multi-column set. */
.newsite-scope .checkbox-list {
  display: flex;
  flex-direction: column;
  gap: .75rem;
}

/* Screenshot gallery (tech-screenshots.html). Not an existing new-site
 * component -- a simple 3-column image + caption grid. */
.newsite-scope .screenshot-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 2.5rem 2rem;
}
.newsite-scope .screenshot-item__img {
  width: 100%;
  height: auto;
  border-radius: .5rem;
  margin-bottom: 1rem;
}
@media screen and (max-width: 767px) {
  .newsite-scope .screenshot-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}
@media screen and (max-width: 479px) {
  .newsite-scope .screenshot-grid {
    grid-template-columns: 1fr;
  }
}

/* Two-column "label left, content right" step layout (portablescannertech.html
 * download instructions). Not an existing new-site component. */
.newsite-scope .step-row {
  display: flex;
  gap: 2rem;
  align-items: flex-start;
}
.newsite-scope .step-row__label {
  flex: 0 0 33%;
}
.newsite-scope .step-row__content {
  flex: 1;
}
.newsite-scope .step-row__img {
  max-width: 100%;
  height: auto;
  border-radius: .5rem;
}
@media screen and (max-width: 767px) {
  .newsite-scope .step-row {
    flex-direction: column;
    gap: 1rem;
  }
  .newsite-scope .step-row__label {
    flex: none;
  }
}

/* Process/threat-file name index (processlistpagetemplate.html via
 * displaytemplate.php). Not an existing new-site component -- a plain
 * 4-column link grid replacing the old zebra-striped Bootstrap rows;
 * these lists can run to hundreds of entries so items stay lightweight
 * (text links, no per-item card chrome). */
.newsite-scope .process-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: .75rem 1.5rem;
}
.newsite-scope .process-grid__item {
  color: var(--text--white-80);
  text-decoration: none;
}
.newsite-scope .process-grid__item:hover {
  color: var(--text--white);
  text-decoration: underline;
}
@media screen and (max-width: 767px) {
  .newsite-scope .process-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}
@media screen and (max-width: 479px) {
  .newsite-scope .process-grid {
    grid-template-columns: 1fr;
  }
}

/* Daily threat sample list (threatresearchcenter.html). Not an existing
 * new-site component -- filename/size/date rows with an optional
 * "Related Files" line, replacing the old zebra-striped Bootstrap grid. */
.newsite-scope .trc-header {
  display: flex;
  justify-content: space-between;
  gap: 1.5rem;
  padding-bottom: .75rem;
  border-bottom: 1px solid var(--stroke--white-40);
  margin-bottom: .5rem;
}
.newsite-scope .trc-item {
  padding: 1rem 0;
  border-bottom: 1px solid var(--stroke--white-40);
}
.newsite-scope .trc-row {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: baseline;
  gap: .5rem 1.5rem;
}
.newsite-scope .trc-row__file {
  flex: 1 1 auto;
  min-width: 12rem;
}
.newsite-scope .trc-row__size,
.newsite-scope .trc-row__date {
  flex: 0 0 auto;
}
.newsite-scope .trc-row__related {
  margin-top: .5rem;
}
@media screen and (max-width: 479px) {
  .newsite-scope .trc-header {
    display: none;
  }
}

/* Country/region flag list (displaythreatinfo.html). Not an existing
 * new-site component -- a simple flag-icon + country-name row. */
.newsite-scope .country-row {
  display: flex;
  align-items: center;
  gap: .5rem;
  padding-bottom: .375rem;
}
.newsite-scope .country-row__flag {
  width: 20px;
  height: auto;
  flex-shrink: 0;
}

/* Sidebar trust-badge callout (displaythreatinfo.html). Not an existing
 * new-site component -- stacked mini heading + copy blocks in a card. */
.newsite-scope .trust-badge + .trust-badge {
  margin-top: 1.25rem;
}

/* Select-field labels (resellersignup.html, uninstallsurvey.html).
 * .input-label is position:absolute, floating on top of the field --
 * meant to sit as a placeholder-like overlay until Webflow's runtime JS
 * (not loaded here) shrinks/moves it out of the way once the field has a
 * value. A <select> has no "empty" state (the browser always paints the
 * selected option's text immediately), so the label permanently
 * overlapped the select's own text, garbling both. The base CSS already
 * has `.field-relative.for-select { flex-flow: column-reverse }`, clearly
 * meant to stack the label above the select via flex order -- but that's
 * defeated as long as the label is pulled out of flow by position:
 * absolute. Switching it to static lets that existing flex rule do its
 * job: label renders as a normal caption above the select, no JS needed. */
.newsite-scope .input-label.for-select {
  position: static;
  margin-bottom: .5rem;
}

/* White link variant (sitemap.html). The base CSS only ships
 * .link-medium--red -- fine for a handful of inline links in body copy,
 * but sitemap.html is nothing BUT links (238 of them), and a page that's
 * almost entirely red text against the dark background reads as jarring
 * rather than as a design accent. Matches the .process-grid__item
 * treatment already used for processlistpagetemplate.html's threat-name
 * lists (e.g. hijackers.html once that page is migrated to this
 * template): light, understated, brightening on hover. */
.newsite-scope .link-medium.link-medium--white {
  color: var(--text--white-80);
}
.newsite-scope .link-medium.link-medium--white:hover {
  color: var(--text--white);
}

/* Floating labels on text inputs/textareas. Same root cause as the
 * select-field fix above: .input-label is position:absolute, sitting
 * directly on top of the field as a placeholder-like overlay, meant to
 * be shrunk out of the way by Webflow's runtime JS (not loaded here)
 * once the field has a value. Unlike a <select>, a text field's native
 * emptiness IS detectable in plain CSS via :placeholder-shown -- but
 * only once the input actually has a placeholder attribute (even an
 * empty/whitespace one), which these fields don't carry, so the browser
 * never considered them "showing a placeholder" and this rule never
 * matched. Every affected <input>/<textarea> now gets `placeholder=" "`
 * (see each form's markup) specifically so this selector has something
 * to key off. .input already reserves extra top padding (1.25rem vs a
 * plain .38rem bottom) for exactly this shrunk position. */
.newsite-scope .input:not(.is-select):focus + .input-label,
.newsite-scope .input:not(.is-select):not(:placeholder-shown) + .input-label {
  top: .375rem;
  font-size: .688rem;
}

/* .btn-secondary's own base rule (superantispyware-dev.css) sets the same
 * mint-green background as .btn-primary but never sets a text color, so it
 * falls through to whatever the ancestor's white text color is -- unlike
 * .btn-primary, which explicitly sets `color: var(--text--black)` for
 * exactly this background. Matches the nav's "Buy Pro Edition" button. */
.newsite-scope .btn-secondary {
  color: var(--text--black);
}
