/* ba-li ported */
/* ═══════════════════════════════════════════════════════════
   Blue Arctic · Shared components
   Announcement bar, header & navigation, mobile drawer,
   footer, cards, chips, reveal utilities. Reused site-wide.
   ═══════════════════════════════════════════════════════════ */

/* ── Announcement bar ──────────────────────────────────── */
.announce {
  /* Variable-driven like .header-dark: a page sets --announce-bg on <body>
     and the bar follows the hero canvas, so announce → header → hero read
     as one surface. Default stays navy. */
  background: var(--announce-bg, var(--navy-950));
  color: #C4D8EA;
  font-size: var(--fs-tiny);
}
.announce-inner { display: flex; justify-content: center; }
.announce-link {
  display: inline-flex;
  align-items: center;
  gap: .65rem;
  padding-block: .55rem;
  color: inherit;
  min-height: var(--announce-h);
  min-width: 0;
  max-width: 100%;
}
.announce-link:hover { text-decoration: none; color: #fff; }
.announce-tag {
  background: rgba(95, 185, 238, .16);
  color: var(--sky-400);
  border: 1px solid rgba(95, 185, 238, .3);
  padding: .1rem .55rem;
  border-radius: var(--r-pill);
  font-weight: 600;
  white-space: nowrap;
}
.announce-arrow { transition: transform var(--dur-fast) var(--ease-out); }
.announce-link:hover .announce-arrow { transform: translateX(3px); }
@media (max-width: 640px) {
  .announce-inner { min-width: 0; }
  .announce-text {
    flex: 0 1 auto;
    min-width: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  .announce-tag, .announce-arrow { flex: none; }
}

/* ── Header ────────────────────────────────────────────── */
.site-header {
  position: sticky;
  top: 0;
  z-index: 100;
  background: rgba(255, 255, 255, .88);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  border-bottom: 1px solid transparent;
  transition: border-color var(--dur-med), box-shadow var(--dur-med);
}
.site-header.is-scrolled {
  border-bottom-color: var(--line);
  box-shadow: 0 6px 24px -18px rgba(8, 25, 45, .25);
}
.header-inner {
  display: flex;
  align-items: center;
  gap: 1.5rem;
  min-height: var(--header-h);
}
.header-logo { flex: none; display: inline-flex; }
/* 28px logo inside the 80px header. Artwork is 563×84 (6.70:1), so 28px
   tall renders ≈188px wide; the header itself stays --header-h. */
.header-logo img { width: 188px; height: 28px; object-fit: contain; }

/* Primary nav */
.primary-nav { flex: 1; display: flex; justify-content: center; }
.nav-list {
  display: flex;
  align-items: center;
  gap: .5rem;
  list-style: none;
  padding: 0;
}
.nav-item { position: relative; }
/* Top-level nav is typographic: a quiet text button with a small radius,
   subtle hover tint, soft neutral open state. .header-dark below inherits
   the same interaction language. */
.nav-link {
  display: inline-flex;
  align-items: center;
  gap: .3rem;
  padding: .5rem .7rem;
  border: 0;
  background: transparent;
  border-radius: var(--r-sm);
  font-weight: 500;
  font-size: .95rem;
  white-space: nowrap;
  color: var(--ink);
  cursor: pointer;
  transition: color var(--dur-fast), background-color var(--dur-fast);
}
.nav-link:hover { color: var(--blue-600); background: rgba(20, 40, 60, .05); }
a.nav-link, a.nav-link:hover { text-decoration: none; }
.nav-caret { transition: transform var(--dur-fast) var(--ease-out); color: var(--ink-3); }
.nav-item.open .nav-caret { transform: rotate(180deg); }
.nav-item.open > .nav-link { color: var(--blue-600); background: var(--frost); }

/* Dropdown panels are navigation, not floating content cards: narrow,
   short, light border, restrained shadow, centered under the trigger. */
.nav-panel {
  position: absolute;
  top: calc(100% + .4rem);
  left: 50%;
  transform: translateX(-50%) translateY(5px);
  min-width: 28rem;
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--r-md);
  box-shadow: 0 4px 12px rgba(8, 25, 45, .05), 0 18px 40px -26px rgba(8, 25, 45, .22);
  padding: .5rem;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity var(--dur-fast) var(--ease-out),
              transform var(--dur-fast) var(--ease-out),
              visibility var(--dur-fast);
}
.nav-item.open .nav-panel {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  transform: translateX(-50%) translateY(0);
}
/* The Hosting panel is the only wide one. 35rem is the width at which its
   three action-bar CTAs still sit on one line; below that they wrap. */
.nav-panel-wide { min-width: 35rem; }
/* It is also the widest panel under the LEFTMOST trigger, so centring it
   pushes its left edge off narrow desktops, so anchor it to the trigger's
   left edge there instead. */
@media (max-width: 1279px) {
  .nav-panel-wide { left: 0; transform: translateX(0) translateY(5px); }
  .nav-item.open .nav-panel-wide { transform: translateX(0) translateY(0); }
  /* Services is fourth in the bar: anchoring its wide panel to the left
     edge would push it off the right of a narrow desktop, so it hangs from
     the trigger's right edge instead. */
  #menuPro.nav-panel-wide { left: auto; right: 0; }
}

.panel-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: .1rem;
  list-style: none;
  padding: 0;
}
.panel-grid-1 { grid-template-columns: 1fr; }

/* One item pattern: a plain blue glyph (no tile) top-aligned with the bold
   title, description flowing beneath; the whole row is the link. */
.panel-item {
  display: flex;
  align-items: flex-start;
  gap: .8rem;
  padding: .55rem .6rem;
  border-radius: var(--r-sm);
  color: var(--ink);
  transition: background-color var(--dur-fast), color var(--dur-fast);
}
.panel-item:hover,
.panel-item:focus-visible { background: var(--mist); text-decoration: none; }
.panel-item:hover .panel-copy strong,
.panel-item:focus-visible .panel-copy strong { color: var(--blue-700); }
.panel-ico {
  flex: none;
  display: grid;
  place-items: center;
  color: var(--blue-600);
  /* optical nudge so the glyph centers against the title's first line */
  margin-top: .15rem;
}
.panel-ico .ico { width: 22px; height: 22px; }
.panel-copy { display: grid; gap: .15rem; min-width: 0; }
.panel-copy strong { font-size: .95rem; font-weight: 700; line-height: 1.25; color: var(--ink); }
.panel-copy small { font-size: var(--fs-tiny); color: var(--ink-3); line-height: 1.45; }

/* Quiet footer row: one statement or a couple of links, never a promo banner. */
.panel-foot {
  display: flex;
  flex-wrap: wrap;
  gap: .3rem 1.2rem;
  margin-top: .4rem;
  padding: .6rem .75rem;
  border-top: 1px solid var(--line);
  background: var(--mist);
  border-radius: 0 0 calc(var(--r-md) - 1px) calc(var(--r-md) - 1px);
  margin-inline: -0.5rem;
  margin-bottom: -0.5rem;
  padding-inline: 1rem;
}
.panel-foot a {
  display: inline-flex;
  align-items: center;
  gap: .35rem;
  font-size: var(--fs-tiny);
  font-weight: 600;
  color: var(--blue-600);
}
/* An urgent action stays in the bar's blue so the footer reads as one row,
   earning emphasis from weight and the alert glyph, because there is no token for
   an alert colour. */
.panel-foot-urgent { font-weight: 700; }
.panel-foot-urgent .ico { color: var(--blue-600); }

/* Secondary grouping inside a panel: hairline + label, and links lighter
   than .panel-item (smaller, gray hover, no description): applications
   are not products. */
.panel-section {
  margin-top: .3rem;
  padding: .6rem .6rem .15rem;
  border-top: 1px solid var(--line);
}
.panel-section-label {
  margin: 0 0 .45rem;
  font-size: .7rem;
  font-weight: 700;
  letter-spacing: .075em;
  text-transform: uppercase;
  color: var(--ink-3);
}
.panel-apps {
  display: flex;
  flex-wrap: wrap;
  gap: .2rem;
  list-style: none;
  padding: 0;
  margin: 0;
}
.panel-app {
  display: inline-flex;
  align-items: center;
  gap: .4rem;
  padding: .32rem .55rem;
  border-radius: var(--r-sm);
  font-size: var(--fs-tiny);
  font-weight: 600;
  color: var(--ink-2);
  transition: background-color var(--dur-fast), color var(--dur-fast);
}
.panel-app .ico { width: 16px; height: 16px; color: var(--blue-600); flex: none; }
.panel-app:hover,
.panel-app:focus-visible { background: var(--mist); color: var(--ink); text-decoration: none; }

/* Header actions */
.header-actions { display: flex; align-items: center; gap: .6rem; flex: none; }
.btn-header { padding: .7rem 1.45rem; }

/* ── Dark header (homepage dark hero) ──────────────────────
   .header-dark sits on the navy surface so announce bar, header and hero
   read as one dark canvas. Dropdown panels and the mobile drawer stay
   light: they float above it. */
.site-header.header-dark {
  /* Solid, not glass: glass would show the white body behind the sticky
     header and break the canvas. Colour follows --header-dark-bg on <body>
     (tokens.css), so carbon heroes join the seam without a second theme. */
  background: var(--header-dark-bg, var(--navy-900));
}
.site-header.header-dark.is-scrolled {
  border-bottom-color: rgba(255, 255, 255, .08);
  box-shadow: 0 6px 24px -14px rgba(2, 8, 16, .6);
}
.header-dark .nav-link { color: #DCE8F3; }
.header-dark .nav-link:hover,
.header-dark .nav-item.open > .nav-link { color: #fff; background: rgba(255, 255, 255, .08); }
.header-dark .nav-caret { color: #7A93AB; }
.header-dark .btn-quiet { color: #DCE8F3; }
.header-dark .btn-quiet:hover { color: #fff; background: rgba(255, 255, 255, .08); }
.header-dark .nav-toggle {
  /* Lift the button off the navy hero. */
  background: rgba(255, 255, 255, .05);
  border-color: rgba(255, 255, 255, .42);
  color: #E8F1F9;
}
.header-dark .mobile-nav { border-top-color: rgba(255, 255, 255, .1); }

/* Mobile toggle */
.nav-toggle {
  display: none;
  border: 1px solid var(--line-2);
  background: var(--paper);
  border-radius: var(--r-sm);
  width: 2.6rem;
  height: 2.6rem;
  place-items: center;
  cursor: pointer;
  color: var(--ink);
}
.nav-toggle .nav-toggle-close { display: none; }
.nav-toggle[aria-expanded="true"] .nav-toggle-open { display: none; }
.nav-toggle[aria-expanded="true"] .nav-toggle-close { display: block; }

/* ── Mobile drawer ─────────────────────────────────────── */
.mobile-nav {
  display: none;
  border-top: 1px solid var(--line);
  background: var(--paper);
  max-height: calc(100dvh - var(--header-h));
  overflow-y: auto;
  padding: 1rem var(--container-pad) 2rem;
}
.mobile-nav[data-open="true"] { display: block; }

.m-group { border-bottom: 1px solid var(--line); }
.m-group summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 1rem .25rem;
  font-weight: 600;
  cursor: pointer;
  list-style: none;
}
.m-group summary::-webkit-details-marker { display: none; }
.m-group .m-caret { transition: transform var(--dur-fast); color: var(--ink-3); }
.m-group[open] .m-caret { transform: rotate(180deg); }
.m-group ul { padding: 0 .25rem 1rem; display: grid; gap: .1rem; }
.m-group ul a {
  display: block;
  padding: .55rem .75rem;
  border-radius: var(--r-sm);
  color: var(--ink-2);
  font-size: .95rem;
}
.m-group ul a:hover { background: var(--mist); color: var(--blue-600); text-decoration: none; }
/* Drawer equivalent of .panel-section-label: groups supporting links under
   a heading without turning them into tappable rows. */
.m-label {
  margin: .7rem 0 .15rem;
  padding: .5rem .75rem 0;
  border-top: 1px solid var(--line);
  font-size: .7rem;
  font-weight: 700;
  letter-spacing: .075em;
  text-transform: uppercase;
  color: var(--ink-3);
}
/* Top-level drawer row with no children (Website Care). Same row as a
   <summary>, without the caret. */
.m-link {
  display: block;
  padding: 1rem .25rem;
  border-bottom: 1px solid var(--line);
  font-weight: 600;
  color: var(--ink);
}
.m-link:hover { color: var(--blue-600); text-decoration: none; }

.m-actions { display: grid; gap: .6rem; padding-top: 1.25rem; }

/* Narrow desktop: keep the roomier nav from overflowing */
/* Six top-level items + logo + Login + Get Started do not fit at 992px on
   default metrics, so the bar compresses rather than dropping to the drawer.
   Get Started must stay on screen and .header-inner must not overflow,
   re-measure at 992/1060/1120/1199 before adding another top-level item. */
@media (min-width: 992px) and (max-width: 1199px) {
  .nav-list { gap: .1rem; }
  .nav-link { padding: .5rem .45rem; font-size: .9rem; }
  .header-inner { gap: .5rem; padding-inline: 1.25rem; }
  .header-actions { gap: .4rem; }
  .header-actions .btn { padding-inline: .8rem; }
}

@media (max-width: 991px) {
  .primary-nav { display: none; }
  .header-actions .btn-quiet { display: none; }
  .nav-toggle { display: grid; }
  /* Balance the mobile header: equal optical margins in both gutters. */
  .header-inner { justify-content: space-between; }
  /* Slightly under desktop scale (~26px) so the mark keeps its presence
     without crowding the Get Started button and toggle on phones. */
  .header-logo img { width: 176px; height: auto; }
}
@media (max-width: 480px) {
  .header-actions .btn-header { display: none; }
}

/* Lock body scroll while drawer is open */
body.nav-open { overflow: hidden; }

/* ══ Navigation without JavaScript ══════════════════════
   Progressive enhancement, not a second design. `no-js` is on <html> in the
   markup; head.php removes it before first paint and main.js only leaves it
   off once the menus are actually wired, so these rules apply when scripting
   is disabled, blocked, or fails part-way. Nothing here changes the scripted
   experience: every rule is scoped to .no-js.

   Desktop: the dropdown panels open on hover and on focus-within, so a mouse
   and the keyboard both reach them. The trigger is a <button> that does
   nothing without scripting, but it still takes focus, and focus-within is
   what opens the panel it controls.

   Mobile: the toggle button is the one control that cannot work, so it is
   withdrawn and the drawer is shown in the flow instead. Its sections are
   native <details>, which open and close on their own. That gives a phone a
   complete, collapsed menu rather than no menu at all. */
.no-js .nav-item.has-sub:hover > .nav-panel,
.no-js .nav-item.has-sub:focus-within > .nav-panel {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  transform: translateX(-50%) translateY(0);
}
.no-js .nav-item.has-sub:focus-within > .nav-link,
.no-js .nav-item.has-sub:hover > .nav-link { color: var(--blue-600); background: var(--frost); }
.no-js .header-dark .nav-item.has-sub:focus-within > .nav-link,
.no-js .header-dark .nav-item.has-sub:hover > .nav-link { color: #fff; background: rgba(255, 255, 255, .08); }
.no-js .nav-item.has-sub:hover > .nav-link .nav-caret,
.no-js .nav-item.has-sub:focus-within > .nav-link .nav-caret { transform: rotate(180deg); }

@media (max-width: 1279px) {
  .no-js .nav-item.has-sub:hover > .nav-panel-wide,
  .no-js .nav-item.has-sub:focus-within > .nav-panel-wide { transform: translateX(0) translateY(0); }
}

@media (max-width: 991px) {
  /* The toggle is inert without scripting; leaving it visible offers a
     control that does nothing. */
  .no-js .nav-toggle { display: none; }
  .no-js .mobile-nav { display: block; }
}

/* ── Chips & badges ────────────────────────────────────── */
.chip {
  display: inline-flex;
  align-items: center;
  gap: .45rem;
  padding: .38rem .85rem;
  border-radius: var(--r-pill);
  border: 1px solid var(--line-2);
  background: var(--paper);
  font-size: var(--fs-tiny);
  font-weight: 500;
  color: var(--ink-2);
}
.chip .ico { color: var(--ok-600); }

.badge-pop {
  display: inline-block;
  padding: .3rem .8rem;
  border-radius: var(--r-pill);
  background: var(--blue-600);
  color: #fff;
  font-size: var(--fs-tiny);
  font-weight: 600;
  letter-spacing: .02em;
}

/* ── Generic card ──────────────────────────────────────── */
.card {
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow-soft);
}

/* ── Plans, tabs & offer banner (shared: home + product pages) ── */
.plans-tabs {
  display: inline-flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: .25rem;
  padding: .3rem;
  background: var(--frost);
  border: 1px solid var(--line);
  border-radius: var(--r-pill);
  margin-inline: auto;
}
/* Tabs are a JS enhancement; without JS all panels render stacked
   with their own headings and the tablist is hidden. */
html:not(.js) .plans-tabs { display: none; }

.plans-tab {
  border: 0;
  background: transparent;
  padding: .6rem 1.35rem;
  border-radius: var(--r-pill);
  font-weight: 600;
  font-size: var(--fs-small);
  color: var(--ink-2);
  cursor: pointer;
  transition: background-color var(--dur-fast), color var(--dur-fast), box-shadow var(--dur-fast);
}
.plans-tab:hover { color: var(--ink); }
.plans-tab[aria-selected="true"] {
  background: var(--paper);
  color: var(--blue-600);
  box-shadow: var(--shadow-soft);
}
.plans-tablist-wrap { display: flex; justify-content: center; margin-bottom: 2.5rem; }

/* The panel heading duplicates its tab label, so it is hidden once JS
   upgrades the panels and shown again where they render stacked.
   Scoped to .plans-panel deliberately: pricing.php reuses this class for
   standalone section headings that sit outside any tab, and an unscoped
   `display:none` hides those too. */
.plans-panel-title { margin: 2.5rem 0 1.25rem; }
/* When the tabs are live the tab button already names the panel on screen, so
   this heading is redundant visually, but removing it with display:none took
   it out of the accessibility tree too, leaving the outline jumping h2 -> h4
   across the plan cards. Hiding it visually instead keeps the h3 rung in place
   for screen readers and heading navigation while looking identical. */
.plans-panel .plans-panel-title {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}
html:not(.js) .plans-panel .plans-panel-title {
  position: static;
  width: auto; height: auto;
  margin: 2.5rem 0 1.25rem;
  overflow: visible;
  clip: auto;
  white-space: normal;
}

/* Until home.js upgrades the panels to tabs, JS-capable browsers see
   only the first panel (prevents a pre-init flash of all four). */
.js .plans-panels:not(.tabs-ready) .plans-panel:nth-child(n+2) { display: none; }
.js .plans-panel[hidden] { display: none; }

/* Plan cards */
.plan-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--space-card-gap);
  align-items: stretch;
}
.plan-card {
  position: relative;
  display: flex;
  flex-direction: column;
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  padding: 2rem 1.8rem;
  box-shadow: var(--shadow-soft);
  transition: transform var(--dur-med) var(--ease-out), box-shadow var(--dur-med) var(--ease-out), border-color var(--dur-med);
}
.plan-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-lift); }
.plan-card.is-popular { border-color: var(--blue-500); box-shadow: 0 0 0 1px var(--blue-500), var(--shadow-lift); }
.plan-flag {
  position: absolute;
  top: -0.85rem;
  left: 50%;
  transform: translateX(-50%);
  white-space: nowrap;
}
.plan-name { font-size: 1.2rem; margin-bottom: .2rem; }
.plan-for { font-size: var(--fs-tiny); color: var(--ink-3); min-height: 2.2em; }
.plan-price { display: flex; align-items: baseline; gap: .3rem; margin-top: 1.1rem; }
.plan-price .amount {
  font-family: var(--font-display);
  font-size: 2.35rem;
  font-weight: 800;
  letter-spacing: -0.02em;
}
.plan-price .period { color: var(--ink-3); font-size: var(--fs-small); }
.plan-terms { font-size: var(--fs-tiny); color: var(--ink-3); margin-bottom: 1.2rem; }
.plan-features {
  display: grid;
  gap: .6rem;
  padding-block: 1.35rem;
  font-size: var(--fs-small);
  color: var(--ink-2);
}
.plan-features li { display: flex; gap: .55rem; align-items: flex-start; }
.plan-features .ico { color: var(--ok-600); flex: none; margin-top: .2rem; }
.plan-cta { margin-top: auto; padding-top: .5rem; }
.plan-cta .btn { width: 100%; }
.plan-renewal { margin-top: .7rem; font-size: var(--fs-tiny); color: var(--ink-3); text-align: center; }

.plans-footnote {
  margin-top: 1.75rem;
  text-align: center;
  font-size: var(--fs-small);
  color: var(--ink-2);
}
.plans-footnote + .plans-footnote { margin-top: .5rem; }

/* Support copy under the plan grid: marketing lines, not legal footnotes. */

.plans-honesty {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: .6rem 2rem;
  /* A trust row belongs to the cards above it: band spacing, not section
     spacing, so it never floats between two blocks. */
  margin-top: var(--space-band);
  padding-top: var(--space-band);
  border-top: 1px solid var(--line);
  font-size: var(--fs-small);
  color: var(--ink-2);
}
.plans-honesty span { display: inline-flex; align-items: center; gap: .45rem; }
.plans-honesty strong { color: var(--ink); font-weight: 650; }
.plans-honesty .ico { color: var(--ok-600); }

/* The offer under a plan grid: one line on paper, the conditions one click
   away in a native <details>. Pair with includes/free-trial.php copy. */
.plans-offer { margin: 1.6rem 0 0; display: flex; flex-direction: column; align-items: center; }
.plans-offer summary {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: .3rem 1rem;
  width: max-content;
  max-width: 100%;
  list-style: none;
  cursor: pointer;
  border-radius: 4px;
  text-align: center;
}
.plans-offer summary::-webkit-details-marker { display: none; }
.plans-offer-line { display: inline-flex; align-items: center; gap: .5rem; font-size: var(--fs-body); color: var(--ink-2); }
.plans-offer-line .ico { color: var(--blue-600); flex: none; }
.plans-offer-line strong { color: var(--ink); font-weight: 700; }
.plans-offer-more {
  display: inline-flex;
  align-items: center;
  gap: .35rem;
  font-size: var(--fs-tiny);
  font-weight: 600;
  color: var(--ink-3);
  text-decoration: underline;
  text-underline-offset: .2em;
  text-decoration-color: var(--line-2);
  transition: color var(--dur-fast);
}
.plans-offer-more::after {
  content: "";
  width: .42em;
  height: .42em;
  margin-top: -.25em;
  border-right: 1.5px solid currentColor;
  border-bottom: 1.5px solid currentColor;
  transform: rotate(45deg);
  transition: transform var(--dur-fast) var(--ease-out);
}
.plans-offer[open] .plans-offer-more::after { transform: rotate(-135deg); margin-top: .2em; }
.plans-offer summary:hover .plans-offer-more { color: var(--blue-600); }
.plans-offer-terms { margin: .6rem auto 0; max-width: 40rem; text-align: center; font-size: var(--fs-tiny); line-height: 1.55; color: var(--ink-3); }
.plans-offer-terms a { color: var(--blue-600); font-weight: 600; }

@media (max-width: 900px) {
  .plan-grid { grid-template-columns: 1fr; max-width: 26rem; margin-inline: auto; }
}

/* ── 30-day trial band (shared: home + web-hosting) ────── */
.trial-band {
  /* Licensed accent art (accent-arctic-flow) far beneath a ~93% navy
     overlay: texture, never wallpaper. */
  background:
    radial-gradient(800px 380px at 88% -30%, rgba(95, 185, 238, .18), transparent 60%),
    linear-gradient(120deg, rgba(12, 29, 46, .93), rgba(8, 20, 32, .96)),
    url(../images/stock/accent-arctic-flow-1600.jpg) center / cover no-repeat,
    linear-gradient(120deg, var(--navy-900), var(--navy-950));
  border-radius: var(--r-xl);
  color: #A8BFD3;
  padding: clamp(2.25rem, 5vw, 3.5rem);
  display: grid;
  grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr);
  gap: clamp(1.75rem, 4vw, 3.5rem);
  align-items: center;
  overflow: hidden;
}
.trial-band h2 { color: #F4F9FD; margin-bottom: .8rem; }
.trial-band .lead { color: #A8BFD3; font-size: var(--fs-lead); }
.trial-cta { margin-top: 1.75rem; display: flex; flex-wrap: wrap; align-items: center; gap: 1rem; }
.trial-renewal {
  font-size: var(--fs-small);
  color: #9DB4C9;
  max-width: 20rem;
  line-height: 1.5;
}
.trial-renewal strong { color: #E8F1F9; }
/* Trial path: a three-stop route on a glass card, same node-and-line
   grammar as the migration path. Scoped as `.trial-band .trial-path` so
   this padding beats base.css's `ol[role="list"] { padding: 0 }`. */
.trial-band .trial-path {
  position: relative;
  display: grid;
  gap: 2.35rem;
  background: rgba(255, 255, 255, .05);
  border: 1px solid rgba(255, 255, 255, .12);
  border-radius: var(--r-xl);
  /* The border should frame the content, not touch it: timeline inset from
     the left edge, even air around. */
  padding: 2.9rem 3rem 2.9rem 2.75rem;
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  font-size: var(--fs-small);
}
.trial-stop { position: relative; display: flex; gap: 1.15rem; }
.trial-stop-marker {
  flex: none;
  position: relative;
  width: .8rem;
  height: .8rem;
  margin-top: .3rem;
  border-radius: 50%;
  background: var(--sky-400);
  box-shadow: 0 0 0 4px rgba(95, 185, 238, .18);
}
/* connecting line between stops */
.trial-stop:not(:last-child) .trial-stop-marker::after {
  content: "";
  position: absolute;
  left: 50%;
  top: calc(100% + 7px);
  transform: translateX(-50%);
  width: 2px;
  height: 3rem;
  background: linear-gradient(180deg, rgba(95, 185, 238, .5), rgba(95, 185, 238, .12));
  border-radius: 1px;
}
.trial-stop strong { display: block; color: #F4F9FD; font-family: var(--font-display); font-weight: 700; letter-spacing: -0.01em; margin-bottom: .4rem; }
.trial-stop small { display: block; font-size: var(--fs-tiny); color: #9DB4C9; line-height: 1.6; max-width: 23rem; }
@media (max-width: 900px) {
  .trial-band { grid-template-columns: 1fr; }
}

/* ── Footer ────────────────────────────────────────────── */
.site-footer {
  background: var(--navy-950);
  color: #9DB4C9;
  padding-block: clamp(3.5rem, 6vw, 5rem) 2rem;
  font-size: var(--fs-small);
}
.footer-top {
  display: grid;
  grid-template-columns: minmax(16rem, 1.15fr) 2.6fr;
  gap: clamp(2.5rem, 5vw, 5rem);
  padding-bottom: 3rem;
  border-bottom: 1px solid rgba(157, 180, 201, .16);
}
.footer-brand img { width: 181px; height: 27px; object-fit: contain; }
.footer-tag { margin-top: 1.15rem; line-height: 1.65; max-width: 24rem; }
/* Contact block: icon column + copy column so labels, links and sub-lines
   align on one left edge. */
.footer-contact { display: grid; gap: .95rem; margin-top: 1.6rem; }
.footer-contact li {
  display: grid;
  grid-template-columns: 1.1rem minmax(0, 1fr);
  column-gap: .65rem;
  align-items: start;
  line-height: 1.5;
}
.footer-contact .ico { color: var(--sky-400); margin-top: .3rem; }
.footer-contact a { color: #D7E5F1; font-weight: 500; overflow-wrap: anywhere; }
.footer-hours {
  display: block;
  margin-top: .1rem;
  font-size: var(--fs-tiny);
  color: #7A93AB;
}
.footer-social { display: flex; gap: .5rem; margin-top: 1.5rem; }
.footer-social a {
  display: grid;
  place-items: center;
  width: 2.35rem;
  height: 2.35rem;
  border-radius: var(--r-sm);
  border: 1px solid rgba(157, 180, 201, .2);
  color: #B9CBDD;
  transition: color var(--dur-fast), border-color var(--dur-fast), background-color var(--dur-fast);
}
.footer-social a:hover { color: #fff; border-color: var(--sky-400); background: rgba(95, 185, 238, .1); }

.footer-cols {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 2.25rem 2rem;
}
.footer-col h2 {
  font-family: var(--font-body);
  font-size: var(--fs-tiny);
  font-weight: 600;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: #E8F1F9;
  margin-bottom: 1rem;
}
.footer-col ul { display: grid; gap: .55rem; }
/* Vertical padding pulled back with a matching negative margin: the visible
   rhythm is unchanged, but each link's hit box is 27px tall, clearing the
   24px minimum in WCAG 2.2 SC 2.5.8 on a phone. */
.footer-col a { display: inline-block; padding: .25rem 0; margin: -.25rem 0; color: #9DB4C9; }
.footer-col a:hover { color: #fff; }

.footer-bottom {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: .5rem 2rem;
  justify-content: space-between;
  padding-top: 1.75rem;
  font-size: var(--fs-tiny);
  line-height: 1.6;
  color: #7A93AB;
}
/* Let the tagline wrap at the separators, never mid-phrase */
.footer-note span { white-space: nowrap; }

@media (max-width: 900px) {
  .footer-top { grid-template-columns: 1fr; }
  .footer-cols { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 901px) and (max-width: 1100px) {
  .footer-cols { grid-template-columns: repeat(3, 1fr); }
}
@media (min-width: 1101px) {
  .footer-cols { grid-template-columns: repeat(3, 1fr); }
}

/* ── Scroll reveal (progressive enhancement) ───────────── */
/* Content is fully visible without JS; the .js gate applies the initial
   hidden state only when main.js runs. */
.js .reveal {
  opacity: 0;
  transform: translateY(18px);
  transition: opacity var(--dur-slow) var(--ease-out), transform var(--dur-slow) var(--ease-out);
}
.js .reveal.in { opacity: 1; transform: none; }
@media (prefers-reduced-motion: reduce) {
  .js .reveal { opacity: 1; transform: none; }
}

/* ── FAQ (native disclosure) ───────────────────────────── */
.faq-list { display: grid; gap: .75rem; max-width: 50rem; margin-inline: auto; }
.faq-item {
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--r-md);
  box-shadow: var(--shadow-soft);
}
.faq-item summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  padding: 1.1rem 1.3rem;
  font-weight: 600;
  color: var(--ink);
  cursor: pointer;
  list-style: none;
}
.faq-item summary::-webkit-details-marker { display: none; }
.faq-item summary:hover { color: var(--blue-600); }
.faq-item summary:hover .ico { color: var(--blue-600); }
.faq-item summary .ico { flex: none; color: var(--ink-3); transition: transform var(--dur-fast) var(--ease-out); }
.faq-item[open] summary .ico { transform: rotate(180deg); }
.faq-item[open] summary { color: var(--blue-600); }
.faq-body { padding: 0 1.3rem 1.2rem; font-size: var(--fs-small); color: var(--ink-2); }
.faq-body p + p { margin-top: .7rem; }
.faq-body a { font-weight: 600; }

/* ═══════════════════════════════════════════════════════════
   Cookie consent
   Banner is non-modal and bottom-anchored; the preferences
   dialog is a true modal. Both ship hidden and are revealed
   by consent.js, so a JS failure leaves no trace.
   ═══════════════════════════════════════════════════════════ */

.cc-banner {
  position: fixed;
  z-index: 190;         /* under the header (200) so the skip link still wins */
  left: var(--container-pad);
  right: var(--container-pad);
  bottom: var(--container-pad);
  max-width: 46rem;
  margin-inline: auto;
  padding: var(--sp-5);
  background: var(--paper);
  border: 1px solid var(--line-2);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow-panel);
  opacity: 0;
  transform: translateY(.75rem);
  transition: opacity var(--dur-med) var(--ease-out),
              transform var(--dur-med) var(--ease-out);
}
.cc-banner.is-in { opacity: 1; transform: none; }
.cc-banner[hidden] { display: none; }

.cc-banner-title {
  font-family: var(--font-display);
  font-size: var(--fs-h4);
  line-height: var(--lh-head);
  margin: 0 0 var(--sp-2);
}
.cc-banner-copy p {
  margin: 0;
  font-size: var(--fs-small);
  line-height: 1.6;
  color: var(--ink-2);
}
.cc-banner-actions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-2);
  margin-top: var(--sp-4);
}
/* Accept and decline sit at the same size and weight of prominence. */
.cc-banner-actions .btn { flex: 1 1 auto; }
.cc-banner-actions .cc-link-btn { flex: 0 0 auto; }

/* ── Preferences dialog ──────────────────────────────────── */

.cc-overlay {
  position: fixed;
  inset: 0;
  z-index: 210;
  display: grid;
  /* Explicit track: an auto track sizes to the dialog's max-content, which
     makes the dialog's own width:min(...,100%) resolve against that instead
     of the viewport and overflow on narrow screens. */
  grid-template-columns: minmax(0, 1fr);
  align-content: center;
  padding: var(--container-pad);
  background: rgba(8, 20, 32, .55);
  opacity: 0;
  transition: opacity var(--dur-fast) var(--ease-out);
}
.cc-overlay.is-in { opacity: 1; }
.cc-overlay[hidden] { display: none; }
body.cc-locked { overflow: hidden; }

.cc-modal {
  width: min(40rem, 100%);
  min-width: 0;
  justify-self: center;
  max-height: min(85vh, 46rem);
  display: flex;
  flex-direction: column;
  background: var(--paper);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow-panel);
}
.cc-modal:focus { outline: none; }

.cc-modal-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-4);
  padding: var(--sp-5);
  border-bottom: 1px solid var(--line);
}
.cc-modal-head h2 {
  font-family: var(--font-display);
  font-size: var(--fs-h4);
  margin: 0;
}
.cc-close {
  flex: none;
  display: grid;
  place-items: center;
  width: 2.25rem;
  height: 2.25rem;
  border: 1px solid var(--line-2);
  border-radius: var(--r-pill);
  background: var(--paper);
  color: var(--ink-2);
  cursor: pointer;
  transition: background-color var(--dur-fast) var(--ease-out),
              color var(--dur-fast) var(--ease-out);
}
.cc-close:hover { background: var(--frost); color: var(--ink); }

.cc-modal-body {
  padding: var(--sp-5);
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
}
.cc-modal-lede {
  margin: 0 0 var(--sp-5);
  font-size: var(--fs-small);
  color: var(--ink-2);
}

.cc-cat + .cc-cat { margin-top: var(--sp-4); }
.cc-cat {
  padding: var(--sp-4);
  border: 1px solid var(--line);
  border-radius: var(--r-md);
  background: var(--paper);
}
.cc-cat--locked { background: var(--mist); }
.cc-cat-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-4);
  margin-bottom: var(--sp-2);
}
.cc-cat-head h3 {
  font-size: var(--fs-body);
  font-weight: 700;
  margin: 0;
}
.cc-cat-head label { cursor: pointer; }
.cc-cat p {
  margin: 0;
  font-size: var(--fs-small);
  line-height: 1.6;
  color: var(--ink-2);
}
.cc-always {
  flex: none;
  font-size: var(--fs-tiny);
  font-weight: 600;
  color: var(--ink-3);
}

/* Switch: a real checkbox, sized to the full track so the hit target and
   the focus ring follow the control rather than a decorative span. */
.cc-switch { position: relative; flex: none; width: 2.75rem; height: 1.5rem; }
.cc-switch input {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  opacity: 0;
  cursor: pointer;
  z-index: 1;
}
.cc-switch-track {
  position: absolute;
  inset: 0;
  border-radius: var(--r-pill);
  background: var(--line-2);
  transition: background-color var(--dur-fast) var(--ease-out);
}
.cc-switch-track::after {
  content: "";
  position: absolute;
  top: .1875rem;
  left: .1875rem;
  width: 1.125rem;
  height: 1.125rem;
  border-radius: 50%;
  background: var(--paper);
  box-shadow: 0 1px 3px rgba(8, 25, 45, .3);
  transition: transform var(--dur-fast) var(--ease-out);
}
.cc-switch input:checked ~ .cc-switch-track { background: var(--blue-600); }
.cc-switch input:checked ~ .cc-switch-track::after { transform: translateX(1.25rem); }
.cc-switch input:focus-visible ~ .cc-switch-track {
  outline: 2px solid var(--blue-500);
  outline-offset: 2px;
}

.cc-table-wrap { overflow-x: auto; }
.cc-table {
  width: 100%;
  min-width: 20rem;
  margin-top: var(--sp-3);
  border-collapse: collapse;
  font-size: var(--fs-tiny);
}
.cc-table th,
.cc-table td {
  padding: .4rem .5rem;
  text-align: left;
  border-top: 1px solid var(--line);
  color: var(--ink-2);
}
.cc-table th { font-weight: 600; color: var(--ink); }

.cc-modal-foot {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: var(--sp-2);
  padding: var(--sp-5);
  border-top: 1px solid var(--line);
}

/* ── Mobile ──────────────────────────────────────────────── */

@media (max-width: 40rem) {
  .cc-banner {
    left: 0;
    right: 0;
    bottom: 0;
    max-height: 85vh;
    overflow-y: auto;
    border-radius: var(--r-lg) var(--r-lg) 0 0;
    border-left: 0;
    border-right: 0;
    border-bottom: 0;
  }
  /* Full-width rows with a comfortable touch target on small screens. */
  .cc-banner-actions .btn { flex: 1 1 100%; min-height: 2.75rem; }
  .cc-overlay { padding: 0; align-content: end; }
  .cc-modal {
    width: 100%;
    max-height: 92vh;
    border-radius: var(--r-lg) var(--r-lg) 0 0;
  }
  .cc-modal-foot .btn { flex: 1 1 100%; min-height: 2.75rem; }
}

@media (prefers-reduced-motion: reduce) {
  .cc-banner,
  .cc-overlay,
  .cc-switch-track,
  .cc-switch-track::after { transition: none; }
  .cc-banner { transform: none; }
}

@media (forced-colors: active) {
  .cc-banner,
  .cc-modal { border: 1px solid CanvasText; }
  .cc-switch-track { background: ButtonFace; border: 1px solid ButtonText; }
  .cc-switch input:checked ~ .cc-switch-track { background: Highlight; }
}


/* ── Disabled buttons look disabled ── */
.btn:disabled,
.btn[aria-disabled="true"] {
  opacity: .55;
  cursor: not-allowed;
  box-shadow: none;
  transform: none;
}
