/*
Theme Name: AllCloudHost
Theme URI: https://allcloudhost.net
Author: AllCloudHost
Description: Custom, standalone theme for AllCloudHost — a clean, verifiable-reliability hosting design built for speed. Ships its own shortcode handlers, order-form scripting, and plugin-widget interactivity so it works fully standalone with the ResellersPanel plugin.
Version: 1.3.0
Requires at least: 6.0
Requires PHP: 7.4
Text Domain: allcloudhost
*/

:root{
  --paper:#F6F7F9;
  --paper-raised:#FFFFFF;
  --ink:#14171B;
  --ink-soft:#5B6472;
  --ink-faint:#8A93A3;
  --console-bg:#12151C;
  --console-line:#262B36;
  --console-text:#D8DDE5;
  --line:#E4E7EB;
  --line-strong:#D3D8DE;
  --signal:#00A4A6;
  --signal-ink:#067A7C;
  --signal-dim:rgba(0,164,166,0.09);
  --amber:#B8791C;
  --amber-dim:rgba(184,121,28,0.10);
  --font-body:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
  --font-display:var(--font-body);
  --font-mono:ui-monospace,"SF Mono","Cascadia Code","Roboto Mono",Menlo,Consolas,monospace;
  --radius:10px;
  --radius-sm:8px;
  --radius-pill:999px;
  --shadow-card:0 1px 2px rgba(20,23,27,0.04), 0 8px 24px -12px rgba(20,23,27,0.10);
  --shadow-raised:0 4px 12px -4px rgba(20,23,27,0.14), 0 16px 40px -16px rgba(20,23,27,0.18);
}
*{box-sizing:border-box;}
html{scroll-behavior:smooth;}
/*
 * Reported live via real iPhone screenshots as a broken/cut-off
 * feeling across mobile pages generally, not just one component.
 * Root cause, confirmed via getBoundingClientRect(): nav.primary (the
 * mobile off-canvas menu) sits at `position:fixed; right:0;
 * transform:translateX(100%)` — correct for a slide-in panel — but
 * with nothing clipping it, that permanently off-screen 320px-wide
 * panel still counts toward the document's scrollable width on every
 * single page, all the time, whether the menu is open or not. Result:
 * every mobile page had ~320px of extra horizontal scroll room before
 * this was even touched, which is exactly the kind of "content here
 * and there" feeling that's hard to pin on any one element. Standard,
 * safe fix for this exact off-canvas-nav pattern: clip it at the
 * document level. Doesn't affect the panel's own slide-in animation —
 * overflow:hidden on an ancestor only clips normal document-flow
 * scrolling, not a `position:fixed` element's ability to render when
 * transformed into view, since body/html don't establish a containing
 * block for it (no transform/filter/perspective of their own).
 */
html, body{overflow-x:hidden;}
body{
  margin:0;
  background:var(--paper);
  color:var(--ink);
  font-family:var(--font-body);
  line-height:1.55;
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
}
img{max-width:100%; height:auto;}
a{color:inherit;}
:focus-visible{outline:2px solid var(--signal); outline-offset:2px;}
.wrap{max-width:1152px; margin:0 auto; padding:0 24px;}
h1,h2,h3{font-family:var(--font-display); margin:0; letter-spacing:-0.02em; font-weight:700;}
.mono{font-family:var(--font-mono);}

.screen-reader-text{
  border:0; clip:rect(1px,1px,1px,1px); clip-path:inset(50%);
  height:1px; margin:-1px; overflow:hidden; padding:0; position:absolute;
  width:1px; word-wrap:normal!important;
}

/* ---- status strip ---- */
.status-strip{background:var(--console-bg); color:var(--console-text); font-family:var(--font-mono); font-size:12px;}
.status-strip .wrap{display:flex; align-items:center; gap:20px; padding:8px 24px; flex-wrap:wrap;}
.dot{width:6px; height:6px; border-radius:50%; background:var(--signal); display:inline-block; margin-right:7px;}
.status-strip .sep{color:var(--console-line);}

/* ---- header ---- */
header.site{background:rgba(246,247,249,0.92); backdrop-filter:saturate(180%) blur(10px); border-bottom:1px solid var(--line); position:sticky; top:0; z-index:30;}
header.site .wrap{display:flex; align-items:center; justify-content:space-between; padding:14px 24px; gap:16px;}
.logo{font-family:var(--font-display); font-weight:800; font-size:19px; text-decoration:none; display:flex; align-items:center; gap:8px; color:var(--ink);}
/* Only the plain-text fallback (no custom logo image set) gets the
   accent tick — the actual logo image already has its own mark, so
   this would just look like a redundant second icon next to it. */
a.logo::before{content:""; width:8px; height:20px; border-radius:2px; background:var(--signal); display:inline-block;}
.logo img{max-height:38px; width:auto;}
/*
 * `nav.primary ul` (not scoped to the top-level list only) used to also
 * match the nested .sub-menu WordPress outputs for a parent item with
 * children, turning the dropdown into a flex ROW instead of a panel —
 * confirmed live once the Hosting dropdown was created. Scoped to the
 * direct child `<ul>` only; the sub-menu gets its own rules below.
 */
nav.primary > ul{display:flex; gap:26px; list-style:none; margin:0; padding:0;}
nav.primary a{text-decoration:none; color:var(--ink-soft); font-size:14.5px; font-weight:600;}
nav.primary a:hover, nav.primary .current-menu-item a{color:var(--ink);}
/*
 * Menu was 8 top-level items (some two-word: "SHARED PLANS", "DEDICATED
 * HOSTING") wrapping to two lines at normal desktop widths — confirmed
 * via screenshot, read as cramped/unprofessional. Grouped Shared/VPS/
 * Dedicated under one "Hosting" dropdown (menu hierarchy set via the
 * REST API, same mechanism used for the earlier page cleanup), cutting
 * top-level items from 8 to 6. This styles the dropdown WordPress
 * automatically outputs as a nested `.sub-menu` `<ul>` for that item.
 */
nav.primary li{position:relative;}
nav.primary li.menu-item-has-children > a{display:flex; align-items:center; gap:5px;}
nav.primary li.menu-item-has-children > a::after{content:""; width:7px; height:7px; border-right:1.5px solid currentColor; border-bottom:1.5px solid currentColor; transform:rotate(45deg) translateY(-2px); margin-top:-3px; opacity:.7;}
nav.primary .sub-menu{
	list-style:none; margin:0; padding:8px; display:block;
	position:absolute; top:calc(100% + 12px); left:-8px; min-width:200px;
	background:var(--paper-raised); border:1px solid var(--line); border-radius:var(--radius-sm);
	box-shadow:var(--shadow-raised);
	opacity:0; visibility:hidden; transform:translateY(4px);
	transition:opacity .14s ease, transform .14s ease, visibility 0s linear .14s;
	z-index:40;
}
nav.primary li.menu-item-has-children:hover > .sub-menu,
nav.primary li.menu-item-has-children:focus-within > .sub-menu{
	opacity:1; visibility:visible; transform:translateY(0);
	transition:opacity .14s ease, transform .14s ease;
}
nav.primary .sub-menu li{margin:0;}
nav.primary .sub-menu a{display:block; padding:9px 12px; border-radius:6px; white-space:nowrap; font-weight:500;}
nav.primary .sub-menu a:hover{background:var(--paper); color:var(--ink);}
.header-actions{display:flex; align-items:center; gap:14px;}
.btn{font-family:var(--font-body); font-weight:700; font-size:14.5px; padding:11px 20px; border-radius:var(--radius-sm); text-decoration:none; display:inline-block; border:1px solid transparent; cursor:pointer; transition:transform .12s ease, box-shadow .12s ease, background-color .12s ease;}
/*
 * Reported via PageSpeed: white text on --signal (#00A4A6) measures
 * 3.06:1, under WCAG AA's 4.5:1 minimum at this size/weight (14.5px
 * bold doesn't reach the ~18.66px bold threshold for the relaxed
 * 3:1 "large text" allowance). --signal-ink (#067A7C) is already in
 * the design system as this button's own :hover shade and measures
 * 5.14:1 with white text -- swapped to the resting state instead of
 * inventing a new color; hover now brightens to --signal instead of
 * darkening further, since --signal itself only fails contrast at
 * this specific white-text/small-bold combination, not as a hover
 * flash.
 */
.btn-primary{background:var(--signal-ink); color:#fff;}
.btn-primary:hover{background:var(--signal);}
.btn-ghost{color:var(--ink-soft); font-size:14.5px; font-weight:600; text-decoration:none;}
.btn-ghost:hover{color:var(--ink);}
.btn-outline{border:1px solid var(--line-strong); background:var(--paper-raised); color:var(--ink);}
.btn-outline:hover{border-color:var(--ink-faint);}

/* mobile nav toggle */
.menu-toggle{display:none; background:none; border:0; padding:8px; margin:-8px; cursor:pointer; align-items:center; justify-content:center;}
.menu-toggle span, .menu-toggle span::before, .menu-toggle span::after{
  content:""; display:block; width:22px; height:2px; background:var(--ink); border-radius:2px; position:relative; transition:transform .2s ease, opacity .2s ease;
}
.menu-toggle span::before{position:absolute; top:-7px;}
.menu-toggle span::after{position:absolute; top:7px;}
.nav-open .menu-toggle span{background:transparent;}
.nav-open .menu-toggle span::before{top:0; transform:rotate(45deg);}
.nav-open .menu-toggle span::after{top:0; transform:rotate(-45deg);}

/* ---- hero ---- */
.hero{padding:64px 0 56px;}
.hero .wrap{display:grid; grid-template-columns:1.05fr 0.95fr; gap:56px; align-items:center;}
.eyebrow{font-family:var(--font-mono); font-size:12px; color:var(--signal-ink); text-transform:uppercase; letter-spacing:.07em; margin-bottom:14px; display:block; font-weight:600;}
.hero h1{font-size:clamp(32px,4.4vw,54px); font-weight:800; line-height:1.05;}
.hero p.lead{font-size:18px; color:var(--ink-soft); max-width:46ch; margin:20px 0 30px;}
.hero-ctas{display:flex; gap:14px; margin-bottom:6px; flex-wrap:wrap;}
.hero-ctas .btn{padding:13px 24px; font-size:15.5px;}
@media (prefers-reduced-motion:reduce){*{animation-duration:.001s!important; animation-iteration-count:1!important; transition-duration:.001s!important;}}

/* ---- console ---- */
.console{background:var(--console-bg); color:var(--console-text); border-radius:14px; padding:0; overflow:hidden; font-family:var(--font-mono); font-size:13px; box-shadow:var(--shadow-raised);}
.console-bar{display:flex; align-items:center; gap:8px; padding:12px 18px; border-bottom:1px solid var(--console-line); color:#8892A4;}
.console-bar .dot{margin:0 2px 0 0; width:6px; height:6px;}
.console-body{padding:18px 20px 20px;}
.console-row{display:flex; justify-content:space-between; align-items:baseline; padding:9px 0; border-bottom:1px solid var(--console-line);}
.console-row:last-child{border-bottom:none;}
.console-label{color:#8892A4;}
.console-value{color:var(--console-text); font-weight:600;}
.console-value.good{color:#3DDBDD;}

/* ---- section shell ---- */
section{padding:56px 0;}
.section-head{max-width:620px; margin-bottom:32px;}
.section-head .eyebrow{margin-bottom:10px;}
.section-head h2, .section-head h1{font-size:clamp(24px,3vw,32px); font-weight:800;}
.section-head p{color:var(--ink-soft); margin-top:10px; font-size:15.5px;}

/* ---- plans ---- */
.plans-grid{display:grid; grid-template-columns:repeat(3,1fr); gap:20px;}
.plan-card{background:var(--paper-raised); border:1px solid var(--line); border-radius:var(--radius); position:relative; box-shadow:var(--shadow-card); transition:transform .15s ease, box-shadow .15s ease;}
.plan-card:hover{transform:translateY(-2px); box-shadow:var(--shadow-raised);}
.plan-ticket-head{display:flex; justify-content:space-between; align-items:center; padding:16px 20px; border-bottom:1px solid var(--line);}
/* #8A93A3 (--ink-faint) measures 3.1:1 against this card's white
   background -- fails WCAG AA's 4.5:1 minimum for this 11px text.
   --ink-faint's only other use is a hover border (.btn-outline:hover),
   where the more lenient 3:1 non-text threshold already applies and
   still passes -- scoped this override to just .plan-code rather than
   darkening the shared token. #5C6470 measures 5.98:1. */
.plan-code{font-family:var(--font-mono); font-size:11px; color:#5C6470; letter-spacing:.04em;}
.plan-card.featured .plan-code{color:var(--signal-ink);}
.plan-name{font-family:var(--font-display); font-weight:800; font-size:19px; padding:18px 20px 0;}
.plan-price{padding:6px 20px 18px; display:flex; align-items:baseline; gap:6px;}
.plan-price .num{font-family:var(--font-display); font-size:34px; font-weight:800;}
.plan-price .per{color:var(--ink-soft); font-size:13.5px;}
.plan-specs{list-style:none; margin:0; padding:0 20px 20px; font-size:14px;}
.plan-specs li{padding:9px 0; border-top:1px solid var(--line); display:flex; justify-content:space-between; color:var(--ink-soft);}
.plan-specs li span.v{color:var(--ink); font-weight:600; font-family:var(--font-mono); font-size:13px;}
.plan-cta{display:block; text-align:center; margin:0 20px 20px;}
.plan-card.featured{border-color:var(--signal); box-shadow:0 0 0 1.5px var(--signal), var(--shadow-raised);}
.featured-tag{position:absolute; top:-11px; left:20px; background:var(--signal); color:#fff; font-family:var(--font-mono); font-size:10.5px; padding:4px 10px; border-radius:var(--radius-pill); letter-spacing:.05em; font-weight:700;}
.more-hosting{margin-top:20px; padding-top:20px; border-top:1px solid var(--line); display:flex; gap:28px; flex-wrap:wrap; font-size:14px;}
.more-hosting a{text-decoration:none; color:var(--ink-soft); display:flex; gap:6px;}
.more-hosting a:hover{color:var(--ink);}
.more-hosting .v{font-family:var(--font-mono); color:var(--ink); font-weight:600;}

/* ---- migration ---- */
.migration{background:var(--paper-raised); border-top:1px solid var(--line); border-bottom:1px solid var(--line);}
.mig-grid{display:grid; grid-template-columns:repeat(3,1fr); gap:28px; margin-top:8px;}
.mig-step{padding-top:18px; border-top:2px solid var(--signal);}
.mig-step .num{font-family:var(--font-mono); font-size:13px; color:var(--signal-ink); display:block; margin-bottom:10px; font-weight:700;}
.mig-step h3{font-size:16.5px; margin-bottom:8px; font-weight:700;}
.mig-step p{color:var(--ink-soft); font-size:14.5px; margin:0;}

/* ---- control panel ---- */
.cp-grid{display:grid; grid-template-columns:1fr 1fr; gap:48px; align-items:center;}
.cp-features{list-style:none; margin:22px 0 0; padding:0; display:grid; grid-template-columns:1fr 1fr; gap:14px 20px;}
.cp-features li{font-size:14.5px; display:flex; gap:10px; align-items:flex-start;}
.cp-features li::before{content:"✓"; color:var(--signal); font-weight:700; font-family:var(--font-mono);}
.cp-panel{background:var(--console-bg); border-radius:var(--radius); padding:22px; font-family:var(--font-mono); font-size:12.5px; color:var(--console-text); box-shadow:var(--shadow-raised);}
.cp-panel .title{color:#8892A4; margin-bottom:12px;}
.cp-panel .tree div{padding:3px 0 3px 14px;}
.cp-panel .tree .d1{padding-left:0; color:#8892A4;}

/* ---- blog cards (teaser + archive) ---- */
.blog-grid{display:grid; grid-template-columns:repeat(3,1fr); gap:22px;}
/*
 * /blogs/ build (2026-08-03): the homepage teaser only ever shows 3
 * hand-picked recent posts, so a text-only card reads fine there —
 * but reusing this same card for a real 153-post archive with no
 * thumbnail felt sparse next to the image-heavy blog theme it's
 * replacing. Confirmed live: every sampled post has a featured image
 * set, so has_post_thumbnail() isn't gating out most of the grid —
 * padding moved off .post-card onto .post-card-body so the image can
 * bleed to the card's own edges instead of sitting inset.
 */
.post-card{background:var(--paper-raised); border:1px solid var(--line); border-radius:var(--radius); overflow:hidden; text-decoration:none; color:var(--ink); display:flex; flex-direction:column; box-shadow:var(--shadow-card); transition:transform .15s ease, box-shadow .15s ease;}
.post-card:hover{transform:translateY(-2px); box-shadow:var(--shadow-raised);}
.post-card-thumb{aspect-ratio:16/9; background:var(--paper); overflow:hidden;}
.post-card-thumb img{width:100%; height:100%; object-fit:cover; display:block;}
.post-card-body{padding:20px;}
/*
 * Reported via PageSpeed (73lekhhc49 re-run): #B8791C (--amber) on this
 * card's white background measures 3.63:1, under WCAG AA's 4.5:1 minimum
 * -- this text is 11px/600, not large enough to qualify for the 3:1
 * large-text threshold. This label used to sit inside an <a> (before the
 * allcloudhost_category_names() nested-anchor fix), which is why this
 * wasn't caught in the first contrast pass. --amber itself is left alone
 * since it's also used as a border color on .header_notice (line ~378),
 * where the lower UI-component contrast threshold doesn't apply the same
 * way; #8B5A15 is a darker shade of the same hue, scoped to just this
 * label, measured at 5.88:1.
 */
.post-card .cat{font-family:var(--font-mono); font-size:11px; color:#8B5A15; text-transform:uppercase; letter-spacing:.05em; font-weight:600;}
.post-card h3{font-size:17px; margin:10px 0 8px; line-height:1.3; font-weight:700;}
.post-card p{color:var(--ink-soft); font-size:14px; margin:0;}
.post-card .read{display:inline-block; margin-top:14px; font-size:13px; font-weight:700; color:var(--signal-ink);}

/* ---- faq ---- */
.faq-list{border-top:1px solid var(--line);}
.faq-item{border-bottom:1px solid var(--line); padding:6px 0;}
.faq-q{width:100%; text-align:left; background:none; border:none; cursor:pointer; padding:16px 0; font-size:16px; font-weight:700; font-family:var(--font-body); color:var(--ink); display:flex; justify-content:space-between; align-items:center; gap:16px;}
.faq-icon{font-family:var(--font-mono); color:var(--signal); font-size:18px; flex-shrink:0; transition:transform .2s ease;}
.faq-a{color:var(--ink-soft); font-size:14.5px; max-width:70ch; margin:0; max-height:0; overflow:hidden; transition:max-height .25s ease, margin .25s ease;}
.faq-item.is-open .faq-a{max-height:400px; margin:0 0 16px;}
.faq-item.is-open .faq-icon{transform:rotate(45deg);}

/* ---- generic page / post content (renders plugin shortcodes, WP core content) ---- */
.page-title, .post-title{font-size:clamp(26px,4vw,38px); font-weight:800; margin-bottom:24px;}
.page-body, .post-body{font-size:15.5px; line-height:1.7;}
/*
 * the ResellersPanel plugin's vendor theme shortcode markup (#script-banner and dozens
 * like it) was written assuming the browser default box-sizing:
 * content-box — e.g. #script-banner-plan-features is width:550px plus
 * its own padding, meant to sit beside a 400px-wide image inside a
 * 950px container with 28px of horizontal padding, which only adds up
 * (550+400=950, fitting exactly) under content-box, where padding is
 * added on top of the declared width rather than eating into it. Our
 * own global `*{box-sizing:border-box}` reset (intentional and correct
 * for this theme's own design) silently shrank that available content
 * width by the padding amount everywhere inside plugin-shortcode
 * markup, causing widths to no longer add up — confirmed live via
 * getBoundingClientRect(): the plan-features box and the banner image
 * ended up overlapping by exactly 28px, matching #script-banner's
 * left+right padding. Rather than rewrite the vendor theme's box model
 * assumptions across its entire ported stylesheet, reverting to the
 * box-sizing this content was actually written for.
 */
.page-body, .page-body *, .post-body, .post-body *{box-sizing:content-box;}
/*
 * the vendor theme's original site wrapped all page content in
 * #wrapper_fixed { position:relative }, and a lot of its
 * plugin-shortcode CSS uses position:absolute with top/left/right
 * values tuned assuming THAT was the nearest positioned ancestor
 * (e.g. .script-banner-price: position:absolute; top:110px; right:400px,
 * meant to land inside its banner, not at the top of the page).
 * Confirmed live: without any position:relative ancestor at all, that
 * price block rendered near the very top of the page instead of inside
 * its banner — this is the "structure broken on every page" report, not
 * a one-off. This theme's page.php/post templates never had an
 * equivalent wrapper, so .page-body/.post-body — the direct equivalent
 * of #wrapper_fixed, everything plugin-rendered lives inside it — needs
 * position:relative too, restoring a sitewide anchor for any
 * absolutely-positioned plugin element that doesn't have a closer one of
 * its own (some do, e.g. #script-banner itself now does, for its own
 * .script-banner-price — the nearest positioned ancestor always wins, so
 * this is a safe, non-conflicting fallback for everything else).
 */
.page-body, .post-body{position:relative;}
/*
 * .page-body/.post-body directly contain float:left plugin elements
 * (#script-banner, #domain-search-area-4, etc.) with no clearfix of
 * their own, so — same float-collapse mechanism as the #script-banner
 * height bug, but at the outer wrapper level this time — .page-body's
 * own height collapses to ~0, and the footer (the next thing in the
 * page template after it) renders immediately after, visually
 * overlapping the still-visible-but-uncounted floated content.
 * Confirmed via screenshot: the footer rendering on top of a plan-
 * comparison table partway down a hosting-articles page. Standard
 * clearfix via ::after rather than overflow:hidden here specifically —
 * this wrapper can contain arbitrary plugin/page content of any shape,
 * and overflow:hidden would risk clipping something that's SUPPOSED to
 * overflow (a dropdown, a tooltip), whereas ::after clearing floats
 * has no such risk.
 */
.page-body::after, .post-body::after{content:""; display:table; clear:both;}
/*
 * the vendor theme's original #wrapper_fixed was exactly 1000px wide, narrow
 * enough that #domain-search-area-4 (a 1000px-wide float) left no room
 * for anything to fit beside it, so the next section (.script-main-text)
 * was forced below it purely by width math, without needing an explicit
 * clear. This theme's .page-body is wider, leaving just enough leftover
 * horizontal space for .script-main-text to wrap narrowly beside the
 * float instead of starting below it — confirmed via screenshot: the
 * "First-Rate WordPress Web Hosting Services" paragraph squeezed into a
 * narrow column beside the domain-search widget instead of appearing as
 * its own section underneath. Fixed by clearing it explicitly instead of
 * relying on a container-width coincidence that no longer holds.
 */
.script-main-text{clear:both;}
.page-body table, .post-body table{width:100%; border-collapse:collapse; margin:20px 0; font-size:14px;}
.page-body th, .page-body td, .post-body th, .post-body td{border:1px solid var(--line); padding:10px 12px; text-align:left;}
.page-body iframe, .post-body iframe{max-width:100%;}
.page-body h2, .post-body h2{font-family:var(--font-display); font-size:24px; margin:32px 0 12px; font-weight:800;}
.page-body h3, .post-body h3{font-family:var(--font-display); font-size:19px; margin:24px 0 10px; font-weight:700;}
.page-body ul, .post-body ul{padding-left:20px;}
.page-body a, .post-body a{color:var(--signal-ink); text-decoration:underline; text-decoration-color:var(--line-strong); text-underline-offset:2px;}
.page-body a:hover, .post-body a:hover{text-decoration-color:currentColor;}
.post-meta{color:var(--ink-soft); font-size:13px; margin-bottom:24px;}
.post-thumb{margin-bottom:28px; border-radius:var(--radius); overflow:hidden;}
.post-thumb img{display:block; width:100%;}

/* ---- breadcrumbs ----
 * Requested hidden sitewide (desktop + mobile) -- the "Home / Page
 * Title" trail read as generic template chrome rather than custom
 * enterprise UI. header.php still renders #crumbs on every non-front
 * page (kept in the DOM for internal linking/crawlability), this one
 * rule just stops it from painting -- no per-page or per-viewport
 * exceptions to track since the markup itself isn't viewport-gated.
 */
.breadcrumbs-wrap{display:none;}
#crumbs{font-size:13px; color:var(--ink-soft);}
#crumbs a{color:var(--ink-soft); text-decoration:none;}
#crumbs a:hover{color:var(--ink);}
#crumbs .current{color:var(--ink); font-weight:600;}

/* ---- ported the ResellersPanel plugin's vendor theme content shortcodes ----
   Used inside existing Page content ([button], [link], [order_btn],
   etc. — see inc/shortcodes.php). Styled to match .btn/.btn-outline
   above rather than the vendor theme's own look. */
.rpwp-button{font-family:var(--font-body); font-weight:700; font-size:14.5px; padding:11px 20px; border-radius:var(--radius-sm); text-decoration:none; display:inline-block; border:1px solid transparent; background:var(--signal); color:#fff;}
.rpwp-button:hover{background:var(--signal-ink);}
.rpwp-button.green{background:var(--signal); color:#fff;}
.rpwp-button.lightblue{background:var(--paper-raised); color:var(--ink); border-color:var(--line-strong);}
.rpwp_link{color:var(--signal-ink); text-decoration:underline;}
.rpwp_link:hover{color:var(--ink);}
.rpwp-orderbtn{display:inline-flex; align-items:center; gap:10px; background:var(--console-bg); color:var(--console-text); border-radius:var(--radius); padding:8px 8px 8px 16px; font-family:var(--font-mono); font-size:13px;}
.rpwp-orderbtn .rpwp-button{margin:0;}
.rpwp-sep{border-top:1px solid var(--line); margin:24px 0;}
.header_notice{background:var(--amber-dim); border:1px solid var(--amber); border-radius:var(--radius-sm); padding:12px 16px; font-size:14px;}
.rpwp_resizable_tab{border:1px solid var(--line); border-radius:var(--radius); padding:16px; margin:12px 0;}
.rpwp_resizable_tab.small{max-width:320px;}
.rpwp_resizable_tab.big{max-width:640px;}
.rpwp_category_header{font-family:var(--font-display); font-size:20px; margin:28px 0 12px; font-weight:800;}
.rpwp-right-column{float:right; width:48%;}
.rpwp-left-column{float:left; width:48%;}
.rpwp-column-clear{clear:both;}

/* ---- pagination ---- */
.nav-links{display:flex; gap:16px; font-family:var(--font-mono); font-size:14px;}
.nav-links a{text-decoration:none; color:var(--ink); border:1px solid var(--line); padding:8px 14px; border-radius:var(--radius-sm);}

/* ---- footer ---- */
footer.site{background:var(--ink); color:#B7C0CC; padding:48px 0 28px;}
.foot-grid{display:grid; grid-template-columns:1.3fr repeat(5, 1fr) 1.3fr; gap:28px 20px;}
footer.site .foot-heading{font-family:var(--font-mono); font-size:11.5px; color:#7C8798; text-transform:uppercase; letter-spacing:.06em; margin:0 0 14px;}
footer.site ul{list-style:none; margin:0; padding:0;}
footer.site li{margin-bottom:9px; font-size:14px;}
footer.site a{text-decoration:none; color:#B7C0CC;}
footer.site a:hover{color:#fff;}
/*
 * Phone numbers wrapped mid-string ("UK +44-20-3695-" / "1294" on the
 * next line) once the footer grew from 4 columns to 7 — the "Talk to
 * us" column got much narrower and 14px sans-serif text doesn't fit
 * "UK +44-20-3695-1294" on one line at that width. Widened this column
 * above (1.3fr, matching the brand column) and set it in the mono font
 * at a smaller size with nowrap — matches the design system's own
 * "numbers/stats use IBM Plex Mono" convention (see CLAUDE.md) and mono
 * digits are narrower than the body sans-serif at the same size, so
 * this fits without wrapping rather than just hiding the overflow.
 */
.foot-phones{font-family:var(--font-mono); font-size:12.5px;}
.foot-phones li{white-space:nowrap;}
/*
 * Reported via PageSpeed: #6C7688 on the footer's #14171B background
 * measures 3.92:1, under WCAG AA's 4.5:1 minimum for this text size.
 * #8B95A6 (the same color .foot-grid p already uses on this same
 * background, confirmed at 5.95:1) passes -- reused rather than
 * inventing a third footer text shade.
 */
.foot-bottom{margin-top:40px; padding-top:20px; border-top:1px solid #262E3F; display:flex; justify-content:space-between; font-size:12.5px; color:#8B95A6; font-family:var(--font-mono); flex-wrap:wrap; gap:10px;}

/* ---- responsive ---- */
@media (max-width:860px){
  .hero .wrap{grid-template-columns:1fr;}
  .plans-grid, .blog-grid, .mig-grid{grid-template-columns:1fr;}
  .cp-grid{grid-template-columns:1fr;}
  .cp-features{grid-template-columns:1fr;}
  .foot-grid{grid-template-columns:1fr 1fr 1fr; gap:28px 24px;}
}

@media (max-width:760px){
  .menu-toggle{display:flex;}
  nav.primary{
    position:fixed; top:0; right:0; height:100vh; width:min(320px,86vw);
    background:var(--paper-raised); box-shadow:-16px 0 40px rgba(20,23,27,0.16);
    transform:translateX(100%); transition:transform .25s ease;
    padding:88px 28px 28px; z-index:20; overflow-y:auto;
  }
  .nav-open nav.primary{transform:translateX(0);}
  nav.primary > ul{flex-direction:column; gap:4px;}
  nav.primary a{display:block; padding:12px 0; font-size:16px; border-bottom:1px solid var(--line);}
  /*
   * The Hosting dropdown's hover/focus-based reveal (desktop) doesn't
   * work on touch — tapping the link just navigates instead of opening
   * it. Simplest reliable mobile pattern: show the sub-menu inline,
   * indented, always expanded, instead of trying to replicate a
   * hover-only interaction without adding new JS.
   */
  nav.primary .sub-menu{
    position:static; opacity:1; visibility:visible; transform:none;
    box-shadow:none; border:0; border-radius:0; padding:0 0 0 16px;
    background:transparent; min-width:0; transition:none;
  }
  nav.primary .sub-menu a{padding:10px 0; font-size:15px; border-bottom:1px solid var(--line);}
  nav.primary li.menu-item-has-children > a::after{display:none;}
  .nav-scrim{display:none; position:fixed; inset:0; background:rgba(20,23,27,0.4); z-index:15;}
  .nav-open .nav-scrim{display:block;}
  /* Hide only the compact header bar's Client Login (nav.primary carries
     its own copy inside the slide-out panel for mobile) — scoped to the
     direct child of .wrap so it doesn't also hide the one inside nav. */
  .wrap > .header-actions .btn-ghost{display:none;}
  nav.primary .header-actions{display:block; margin-top:24px; padding-top:16px; border-top:1px solid var(--line);}
  header.site .wrap{padding:12px 20px;}
  .status-strip .wrap{padding:7px 20px;}
  .status-strip .sep, .status-strip span:nth-child(3), .status-strip span:nth-child(5){display:none;}
  .hero{padding:40px 0 44px;}
  .hero-ctas{flex-direction:column; align-items:stretch;}
  .hero-ctas .btn{text-align:center;}
  section{padding:44px 0;}
  .foot-grid{grid-template-columns:1fr;}
  .foot-bottom{flex-direction:column; align-items:flex-start; gap:6px;}
}

@media (min-width:761px){
  nav.primary .header-actions{display:none;}
}
