/*
Theme Name:   GoConsent™
Theme URI:    https://getgoconsent.com
Description:  The official WordPress theme for getgoconsent.com, home of GoConsent™, privacy compliance tools for WordPress. Fast, accessible and private by default.
Author:       RoxxiStudios
Author URI:   https://roxxistudios.com
Version:      1.0.65
Requires at least: 6.2
Tested up to: 7.1
Requires PHP: 7.4
License:      Proprietary
Text Domain:  goconsent-theme

Changelog:
  1.0.65 - 2026-10-26
  - Law and guide pages: "From the blog" in the sidebar lists published posts that link to that page (gcs_posts_linking(), cached until a post changes). New posts appear on the right law pages automatically.
  1.0.64 - 2026-10-26
  - Resources menu: Blog uses a newspaper icon (new 'newspaper' icon) instead of the sparkle.
  1.0.63 - 2026-10-26
  - Sticky spacing: one set of tokens (--site-admin-bar, --site-header-bottom, --site-sticky-top in site-tokens.css). Every sticky item (blog contents, docs sidebar, law and guide sidebar, audit panel, docs steps, sticky splits) stops 32px below the header, and below the WordPress admin bar when signed in; the features jump bar sits right under the header; jump links land at the same line.
  - Phone menu: opening it after scrolling no longer hides the header (scroll lock on <html> only).
  1.0.62 - 2026-10-26
  - Blog posts: table of contents ("On this page") from the post's H2s, sticky on the right on wide screens with the current section highlighted (assets/js/pages/blog.js), collapsible at the top on tablets and phones. Shown when a post has 3+ sections.
  - Blog posts use the site width: text column 780px aligned with the logo, contents beside it.
  1.0.61 - 2026-10-26
  - Blog: Timeline block style (List block): responsive HTML timeline, date beside each event on wider screens, stacked on phones.
  - Blog tables on phones: scroll sideways with the first column held in place.
  1.0.60 - 2026-10-26
  - Blog post elements: block styles Key points, Callout and Warning (Group) and Steps (List), chosen in the editor's Styles panel; styled tables, captions and FAQ Details blocks; blog styles in the editor.
  - FAQ schema for posts: built from the post's Details blocks (question = summary), so page and schema always match.
  1.0.59 - 2026-10-26
  - Main menu: Features, Compare, Free audit, Resources, Pricing. Resources is a disclosure menu (Docs, Guides, Privacy laws, Blog once posts exist, Changelog, Support): click, tap, keyboard and Escape; hover with a mouse; hover/focus without JavaScript; stacked on phones. Highlighted on any of its pages.
  1.0.58 - 2026-10-26
  - Blog: /blog/ list (home.php), posts at /blog/<slug>/ (single.php), topics at /blog/category/<slug>/ (archive.php), partials/blog.php, post-card, blog-topics, pages/blog.css.
  - Blog setup on update: Blog page becomes the posts page; permalinks /blog/%postname%/ (only while no post is published); Uncategorized renamed News.
  - Blog SEO: BlogPosting, Blog, ItemList and breadcrumb schema; og:type article with article:* tags; featured image as social image (1200×630 gcs-social size); empty blog noindex and out of the sitemap; tag, author and date pages noindex; tags out of the sitemap; RSS feed links; no comments.
  - Posts in site search, HTML sitemap, llms.txt and the footer once the first post is published.
  - SEO: one canonical, description, robots, Open Graph and Twitter tag per page. Tags printed outside the theme's block (SmartCrawl's second canonical and description, other plugins' social meta) are removed.
  1.0.57 - 2026-10-26
  - Sitemap: valid lastmod for pages saved without a GMT modified time (Search Console flagged Disclaimer and Refund pages as "Invalid date", year -0001). New gcs_post_lastmod().
  1.0.56 - 2026-10-26
  - Sitemap: the home page is listed when the core page sitemap leaves it out (SmartCrawl drops the static front page); never listed twice.
  - SEO: fuller meta descriptions for 7 docs articles; Support page title.
  1.0.55 - 2026-10-26
  - Law data regenerated from GoConsent 1.0.97: Florida sensitive-data sale rule and notice (§ 501.715); UK analytics exception conditions.
  1.0.54 - 2026-10-26
  - Law data regenerated from GoConsent 1.0.96 (checked against official texts: Delaware, Tennessee, Iowa, Nebraska, Louisiana, Oklahoma, Alabama, Rhode Island and more). gcs_law_fixed() removed.
  - Docs: Consent signals and integrations expanded from the plugin code (Consent Mode defaults, dataLayer event, GPC, GPP, JavaScript API, holding your own scripts, cookie, PHP filters). Policy history documents Restore (Pro 1.0.96).
  1.0.53 - 2026-10-26
  - Support: “Need your download link again?” form (#download). Sends the email to Roxxi API (1.2.18+), which emails the key and a 7-day download link to buyers; the answer is the same for any email.
  - Thank you page: links to the new form.
  1.0.52 - 2026-10-26
  - Buy buttons link to getgoconsent.com/buy/<plan>/, which sends buyers to checkout (Roxxi API, then Stripe). Not indexed: noindex header and robots.txt Disallow. Unknown plans go to Pricing.
  1.0.51 - 2026-10-26
  - Docs: 15 short articles rewritten and expanded (getting started, banner, Your Privacy Choices, scan results, policy updates, requests, cookie-free stats, laws, and six Pro articles), every statement checked against GoConsent and GoConsent Pro 1.0.94. Screenshots and their numbered steps unchanged.
  - Corrected to match the plugin: request reminder is sent when 3 business days are left; Your Privacy Choices copies the Consent ID; “Powered by GoConsent” shows in the banner too (off in free, on with Pro); Requests step 4 wording.
  1.0.50 - 2026-10-26
  - New guide: Consent Management Platform (CMP) for WordPress (when Google requires a certified TCF CMP, Consent Mode, GPP, what regulators expect), with sources.
  - Home page links to every guide under the feature cards.
  - Law pages: meta descriptions say what the page covers; sitemap lastmod and Article dateModified use each page’s own review date.
  - Consent Mode guide: Google’s certified-CMP source link corrected.
  1.0.49 - 2026-10-26
  - In-depth law pages: Delaware DOPPA, Nevada online privacy, Nevada consumer health data, Connecticut consumer health data, GLBA. All 35 law pages now have in-depth content.
  1.0.48 - 2026-10-26
  - In-depth law pages: Vermont, CalOPPA, COPPA, Canada (PIPEDA and Quebec Law 25), Washington My Health My Data.
  1.0.47 - 2026-10-26
  - In-depth law pages: Kentucky, Rhode Island, Oklahoma, Louisiana, Alabama.
  - gcs_law_fixed() in partials/laws-extra.php corrects law data found wrong against the official text (Delaware thresholds, Tennessee citation, Iowa rights, Nebraska and Louisiana opt-out signals, official links for Louisiana, Oklahoma and Alabama). Used by law pages, search and the GPC guide table.
  1.0.46 - 2026-10-26
  - In-depth law pages: Florida, Iowa, Nebraska, Minnesota, Indiana.
  1.0.45 - 2026-10-25
  - In-depth law pages: Utah, Montana, Delaware, New Hampshire, Tennessee.
  1.0.44 - 2026-10-25
  - In-depth law pages: Oregon, Connecticut, New Jersey, Maryland, UK GDPR.
  1.0.43 - 2026-10-25
  - In-depth law pages for CCPA/CPRA, Texas, Colorado, Virginia and GDPR: who has to comply, rights and deadlines, opt-out signals, notices, enforcement and recent actions, plus an FAQ (FAQPage schema) and sources. Each fact is checked against the statute, regulations, regulator pages or court records listed on the page (reviewed October 25, 2026). Content lives in partials/laws-extra.php; the other law pages are unchanged.
  - CCPA opt-out banner guide: corrected. Since January 1, 2026 the California regulations require a business to show whether it processed a visitor's opt-out preference signal (it was optional before).
  1.0.42 - 2026-10-25
  - New Guides section: /guides/ plus four guides, each with "At a glance", sourced sections, how GoConsent handles it, FAQ (FAQPage schema), related laws and docs, and sources: CCPA opt-out banner, Global Privacy Control, Google Consent Mode v2 and GDPR cookie banner. Legal statements are checked against the regulations, regulator reports and Google's pages they cite (reviewed October 25, 2026). Content lives in partials/guides-data.php.
  - The Global Privacy Control guide's table of states is built from the law pages, so the two always agree.
  - Law pages: a Guides list in the sidebar (the GPC guide on every law that requires GPC; CCPA and GDPR guides on theirs).
  - Free audit: "Ten checks, and why each one matters" with links to the matching guide or law, and an FAQ (FAQPage schema). About 140 words before, about 630 now.
  - Features: a row of guide links under Blocking & signals. Footer Learn column: Guides.
  - Guides and comparison pages are in the XML sitemap, the Sitemap page, /llms.txt and site search.
  1.0.41 - 2026-10-25
  - Search: one robots tag per page. WordPress core added a second one (max-image-preview only) next to the theme's.
  - Search: law page titles fit in 65 characters (34 of 36 ran long): "<law>: What It Means for Your Website | GoConsent(TM)" when it fits, else "<law>: Website Requirements", else "<law> | GoConsent(TM)".
  - Search: meta descriptions are at most 160 characters, cut at a word with an ellipsis, so results show them whole. Compare and the comparison pages have shorter hand-written descriptions.
  1.0.40 - 2026-10-25
  - Comparison pages: the "goes further" list, the matches line and the "where they lead" note use the full width under their heading, left-aligned, instead of a narrower centered column. Same on /compare/.
  1.0.39 - 2026-10-25
  - Header no longer flickers on load: the page switches from no-js to js before it first paints, instead of waiting for the deferred site.js. Before, the search button popped in and pushed the menu over on every page, and reveal sections showed, hid and faded back in.
  1.0.38 - 2026-10-25
  - Layout: .wrap--narrow removed, so those sections use the full content width.
  - Stylesheets are plain ASCII: box-drawing section lines, dashes and quotes replaced, so they read cleanly in any editor. The theme name keeps its ™. The breadcrumb arrow is a CSS escape (\203A) and still shows as an arrow in the browser.
  - New Sitemap page at /sitemap/ (the "View Sitemap" footer link): every page on the site for people, grouped as GoConsent, Comparisons, Legal, Docs and Privacy laws, with a link to the XML sitemap. It's built from the same code as the pages it lists, so new docs, laws and comparisons appear on their own; legal pages show only when published. The page is created automatically when the theme updates.
  1.0.37 - 2026-10-25
  - Compare and every one-on-one comparison page: a Free plans / Paid plans switch over the table. Paid compares each plugin's lowest plan for one site with GoConsent Pro Personal: price, traffic limit, Global Privacy Control, proof of consent, policy pages, privacy requests, rules by region, forced branding and IAB TCF, each from the vendor's own pricing page (checked October 25, 2026, sources listed). Cells a vendor doesn't state say "Not stated" and are never counted as a difference.
  - The "goes further" list, matches and "where they lead" note follow the switch. Cookiebot, iubenda and Termly open on Paid; the others open on Free. #free or #paid in the address opens that view.
  - The switch is an accessible tab list (arrow keys, Home, End). Both tables are in the page for search engines; without JavaScript both show and the switch is hidden.
  - One-on-one FAQ adds "How much does GoConsent Pro cost compared with ...?", with the vendor's lowest one-site price.
  - Features: Pro policy pages counted the same way everywhere, from the plugin's own page list: Free builds 4 (Privacy, Cookie, Refund & Returns, Accessibility), Pro adds 13 (Terms & Conditions, Disclaimer and 11 more). The Pro card was "Eleven more" and left out Terms and Disclaimer.
  1.0.36 - 2026-10-24
  - Search: page titles lead with what people search for ("Free WordPress Cookie Consent Plugin" on Home, plus Features, Compare, Audit, Laws and Docs). The theme's title now wins over SmartCrawl's, so there's one source of truth.
  - Headlines: Home, Features and Compare H1s name the product the way people search for it ("WordPress cookie consent plugin", "cookie banner", "tracker blocking").
  - New one-on-one comparison pages at /compare/<plugin>-alternative/ for CookieYes, Complianz, Cookiebot, iubenda, Termly, WPConsent, Real Cookie Banner and Cookie Notice: free plans side by side, where GoConsent goes further, where the other plugin leads, how to switch, FAQ (with FAQPage schema) and sources. Built from the same sourced data as /compare/, now in partials/compare-data.php, so the pages never disagree. Unknown cells ("Not stated") are never counted as a difference.
  - Compare: each plugin name in the table links to its one-on-one page, and a new "GoConsent compared with each plugin" section lists them.
  - The comparison pages are in the docs-and-laws sitemap and /llms.txt.
  1.0.11 - 2026-10-20
  - Changelog page reads every GoConsent release from Roxxi API (/changelog), so it's current the moment Pro is published, not when WordPress.org catches up. Each version shows its release date and the SHA-256 of the package from the signed Release Archive. Changes not in the free version are marked Pro. Falls back to WordPress.org, then the installed plugin; the last good copy is kept if Roxxi API can't be reached.
  1.0.10 - 2026-10-20
  - In step with GoConsent 1.0.75: the Pro account moved to GoConsent's new Account tab. Docs (Install Pro, Your account, See all your sites, Business profile), Pricing FAQ, the thank-you page and /llms.txt say Account instead of Settings.
  - Your account doc: new Get help section for support requests from the Account tab, plus Change plan and Billing. New screenshots: Account tab, Support card, activation, expired license, sites on this license, Settings line.
  - Traffic doc: hover tooltips on every number, slice, bar and row (GoConsent 1.0.75).
  - Features: the My sites card is now "Your account and support". Pricing lists support inside WordPress.
  1.0.09 - 2026-10-19
  - In step with GoConsent 1.0.74: Pricing, Features and docs describe the new Pro evidence scan. New doc: GoConsent Pro > Run an evidence scan, with screenshots of the Scanner tab card and the PDF report.
  - Features: the two alert cards are one card, so the Pro section stays at six cards with the evidence scan.
  - In step with GoConsent 1.0.74 My sites (Business and Agency): Pricing cards for those plans add "All your sites in one dashboard"; new doc GoConsent Pro > See all your sites in one place; Features and /llms.txt mention it.
  - Account tools in GoConsent 1.0.74: doc Sites, renewals and billing covers Renew (same key), Email my license key, Lost your key? and Remove in My sites; Pricing FAQ updated.
  - Every "contact support" link (docs, thank-you, license help, llms.txt) lands on the Support page's form (#contact). GoConsent policy pages link "contact form" there too, so the email address appears only where it's needed.
  - In step with GoConsent 1.0.74 Pro traffic stats: Features (Pro cards and the Traffic section), Pricing, new doc Traffic > Leads and visit sources (Pro) with screenshots of the Traffic tab and the new Dashboard widget, /llms.txt.
  - "Your account": Pricing FAQ "Where's my account?", a note on the thank-you page, the doc renamed Your account (with a screenshot of the license card), a footer link and /llms.txt all say the account lives in WordPress, GoConsent > Settings.
  - Search and social previews of plain pages: shortcodes are filled in and the "Last updated" line is left out (it showed "[goconsent_updated]").
  1.0.08 - 2026-10-19
  - Compare: sources are shown as plain text, not links, so the page doesn't send visitors to other plugins.
  1.0.07 - 2026-10-19
  - Compare: the feature and GoConsent columns stay locked while the other plugins scroll past. On phones the two locked columns are narrower so a rival still fits beside them.
  1.0.06 - 2026-10-19
  - Compare: every column is 30 characters wide, so answers no longer spill out of their cells on phones. The table scrolls sideways on every screen size.
  - Compare: a "Scroll for more" hint with a fade at the right edge. The hint goes away once the table is scrolled; the fade goes at the far end.
  - Compare: the note under the table no longer names a plugin version.
  1.0.05 - 2026-10-19
  - In step with GoConsent 1.0.73: Pricing, Features, Home, Thank you and the Pro docs describe the new Pro features (copy and delete requests, new-tracker and privacy law alerts, monthly report, Consent ID lookup).
  - Features: new Pro section. Pricing: Pro cards list the new features; "Need more features and policy pages? Go Pro."
  - Docs: new articles Copy and delete requests, Alerts and the monthly report, Look up proof of consent, with screenshots.
  - Law pages: "Where GoConsent helps" now includes copy and delete requests where a law gives access and deletion rights.
  - New /llms.txt, built from the site's own features, live prices, docs and law pages, so it stays up to date.
  1.0.04 - 2026-10-19
  - Pricing: Free is one wide row above the Pro plans, with "Need health, kids or SMS policies? Go Pro." between them. The three Pro plans sit side by side.
  1.0.03 - 2026-10-19
  - Spacing pass on every template at 1440, 1180, 1024, 768 and 390px wide.
  - Header: menu items and buttons no longer wrap onto two lines; the phone menu now starts at 1120px.
  - Pricing: plans sit four across on wide screens, two by two on tablets and one per row on phones, with prices lined up and more room above the cards.
  - "How it works" steps: two by two on tablets instead of three and one left over.
  - Policy pages: wide tables scroll inside the page on phones instead of running off the screen.
  1.0.02 - 2026-10-19
  - Pricing: "Need more than 25 sites? Let's talk" under the plans. It opens Support with "Agency or partnership" already picked.
  1.0.01 - 2026-10-19
  - Pricing reads live prices, site counts and Buy links from Roxxi API (GET /prices), cached for an hour. If Roxxi API doesn't answer, the last prices it sent are used, or the built-in 49 / 99 / 199.
  - Appearance > GoConsent Site shows the prices in use and where they came from, with a Refresh prices button. The manual price fields are gone.
  1.0.00 - 2026-10-19
  - First release: Home, Features, Pricing with Buy links, Thank you, Docs with guided screenshots, a page for every privacy law GoConsent checks, Compare, Changelog, Support and the legal pages.
*/

/* --- Base --- */

*,
*::before,
*::after {
	box-sizing: border-box;
}

html {
	-webkit-text-size-adjust: 100%;
	scroll-padding-top: var(--site-sticky-top);
}

body {
	margin: 0;
	background: var(--site-bg);
	color: var(--site-text-body);
	font-family: var(--site-font);
	font-size: var(--site-size-md);
	line-height: 1.65;
	-webkit-font-smoothing: antialiased;
	text-rendering: optimizeLegibility;
}

img,
svg,
video {
	max-width: 100%;
	height: auto;
}

a {
	color: var(--site-brand-deep);
	text-underline-offset: 3px;
}

a:hover {
	color: var(--site-brand-darkest);
}

:focus-visible {
	outline: 3px solid var(--site-focus);
	outline-offset: 3px;
	border-radius: 4px;
}

h1,
h2,
h3,
h4 {
	margin: 0 0 0.5em;
	color: var(--site-heading);
	font-weight: 700;
	line-height: 1.15;
	letter-spacing: -0.02em;
}

h1 {
	font-size: var(--site-size-3xl);
}

h2 {
	font-size: var(--site-size-2xl);
}

h3 {
	font-size: var(--site-size-lg);
	letter-spacing: -0.01em;
	line-height: 1.3;
}

p {
	margin: 0 0 1em;
}

code,
kbd {
	font-family: var(--site-font-mono);
	font-size: 0.9em;
	padding: 0.1em 0.4em;
	border-radius: 6px;
	background: var(--site-bg-sunken);
	color: var(--site-text);
}

.screen-reader-text {
	position: absolute !important;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip: rect(0, 0, 0, 0);
	white-space: nowrap;
	border: 0;
}

.skip-link {
	position: absolute;
	top: 8px;
	left: 8px;
	z-index: 1000;
	padding: 10px 16px;
	border-radius: var(--site-radius-sm);
	background: var(--site-text);
	color: var(--site-white);
	font-weight: 600;
	transform: translateY(-200%);
}

.skip-link:focus {
	transform: none;
	color: var(--site-white);
}

/* --- Layout --- */

.wrap {
	width: 100%;
	max-width: calc(var(--site-width) + 2 * var(--site-gutter));
	margin: 0 auto;
	padding: 0 var(--site-gutter);
}


.section {
	padding: var(--site-section-space) 0;
}

.section--tinted {
	background: var(--site-bg-tinted);
}

.section--dark {
	background: var(--site-dark-bg);
	color: var(--site-dark-text);
}

.section--dark h2,
.section--dark h3 {
	color: var(--site-white);
}

.section--tight {
	padding: calc(var(--site-section-space) * 0.6) 0;
}

.section-head {
	max-width: 760px;
	margin: 0 auto 48px;
	text-align: center;
}

.section-head--left {
	margin-left: 0;
	text-align: left;
}

.section-head__lead {
	margin: 0;
	color: var(--site-text-muted);
	font-size: var(--site-size-lg);
	line-height: 1.6;
}

.section--dark .section-head__lead {
	color: var(--site-dark-muted);
}

.eyebrow {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	margin: 0 0 14px;
	color: var(--site-brand-deep);
	font-size: var(--site-size-xs);
	font-weight: 600;
	letter-spacing: 0.12em;
	text-transform: uppercase;
}

.section--dark .eyebrow {
	color: var(--site-green-55);
}

/* --- Buttons --- */

.btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 10px;
	min-height: 48px;
	padding: 0 24px;
	border: 2px solid transparent;
	border-radius: var(--site-radius-pill);
	font: 600 var(--site-size-sm) / 1 var(--site-font);
	text-decoration: none;
	cursor: pointer;
	transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease, transform 0.15s ease;
}

.btn:hover {
	transform: translateY(-1px);
}

.btn--primary {
	background: var(--site-brand);
	color: var(--site-on-brand);
}

.btn--primary:hover,
.btn--primary:focus-visible {
	background: var(--site-brand-deep);
	color: var(--site-on-brand);
}

.btn--secondary {
	border-color: var(--site-border-strong);
	background: var(--site-surface);
	color: var(--site-text);
}

.btn--secondary:hover,
.btn--secondary:focus-visible {
	border-color: var(--site-text);
	color: var(--site-text);
}

.btn--on-dark {
	background: var(--site-white);
	color: var(--site-text);
}

.btn--on-dark:hover,
.btn--on-dark:focus-visible {
	background: var(--site-brand-tint);
	color: var(--site-text);
}

.btn--large {
	min-height: 56px;
	padding: 0 30px;
	font-size: var(--site-size-md);
}

.btn--block {
	width: 100%;
}

.btn__icon {
	width: 18px;
	height: 18px;
	flex: none;
}

.text-link {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	font-weight: 600;
	text-decoration: none;
}

.text-link:hover {
	text-decoration: underline;
}

.text-link__icon {
	width: 18px;
	height: 18px;
	transition: transform 0.2s ease;
}

.text-link:hover .text-link__icon,
a:hover > .text-link .text-link__icon {
	transform: translateX(3px);
}

.site-main:focus {
	outline: none;
}

/* --- Header --- */

.site-header {
	position: sticky;
	top: var(--site-admin-bar);
	z-index: 100;
	border-bottom: 1px solid transparent;
	background: rgba(255, 255, 255, 0.92);
	-webkit-backdrop-filter: saturate(180%) blur(14px);
	backdrop-filter: saturate(180%) blur(14px);
	transition: border-color 0.2s ease, box-shadow 0.2s ease;
}

.site-header--scrolled {
	border-bottom-color: var(--site-border);
	box-shadow: var(--site-shadow-sm);
}


.site-header__inner {
	display: flex;
	align-items: center;
	gap: 24px;
	min-height: var(--site-header-height);
}

.site-logo {
	display: inline-flex;
	flex: none;
	align-items: center;
}

.site-logo__img {
	display: block;
	width: 168px;
	height: auto;
}

.site-nav {
	display: flex;
	flex: 1;
	align-items: center;
	justify-content: flex-end;
	gap: 6px;
}

.site-nav__list {
	display: flex;
	align-items: center;
	gap: 2px;
	margin: 0 12px 0 0;
	padding: 0;
	list-style: none;
}

.site-nav__link {
	display: inline-flex;
	align-items: center;
	min-height: 44px;
	padding: 0 14px;
	white-space: nowrap;
	border-radius: var(--site-radius-pill);
	color: var(--site-text);
	font-size: var(--site-size-sm);
	font-weight: 500;
	text-decoration: none;
}

.site-nav__link:hover,
.site-nav__link[aria-current="page"] {
	background: var(--site-brand-soft);
	color: var(--site-brand-deep);
}

/* Resources: a disclosure menu (button + list). Opens on click, tap or keyboard; with a
   mouse it also opens on hover. Without JavaScript it opens on hover and focus. */
.site-nav__group {
	position: relative;
}

.site-nav__toggle {
	gap: 4px;
	padding-right: 10px;
	border: 0;
	background: none;
	font-family: inherit;
	cursor: pointer;
}

.site-nav__toggle:hover,
.site-nav__toggle[aria-expanded="true"],
.site-nav__link--active {
	background: var(--site-brand-soft);
	color: var(--site-brand-deep);
}

.site-nav__chevron {
	width: 16px;
	height: 16px;
	transition: transform 0.2s ease;
}

.site-nav__toggle[aria-expanded="true"] .site-nav__chevron {
	transform: rotate(180deg);
}

.site-nav__sub {
	position: absolute;
	top: calc(100% + 8px);
	left: -8px;
	z-index: 120;
	display: none;
	width: 310px;
	margin: 0;
	padding: 8px;
	border: 1px solid var(--site-border);
	border-radius: var(--site-radius);
	background: var(--site-surface);
	box-shadow: 0 18px 40px rgba(16, 40, 30, 0.16);
	list-style: none;
}

/* A bridge over the gap, so moving the mouse down to the panel keeps it open. */
.site-nav__sub::before {
	position: absolute;
	inset: -10px 0 auto;
	height: 10px;
	content: "";
}

.site-nav__toggle[aria-expanded="true"] + .site-nav__sub,
.no-js .site-nav__group:hover .site-nav__sub,
.no-js .site-nav__group:focus-within .site-nav__sub {
	display: block;
}

.site-nav__sublink {
	display: flex;
	gap: 12px;
	padding: 10px 12px;
	border-radius: var(--site-radius-sm);
	color: var(--site-text);
	text-decoration: none;
}

.site-nav__sublink:hover,
.site-nav__sublink:focus-visible,
.site-nav__sublink[aria-current="page"] {
	background: var(--site-brand-soft);
}

.site-nav__subicon {
	flex: none;
	width: 20px;
	height: 20px;
	margin-top: 2px;
	color: var(--site-brand);
}

.site-nav__subtitle {
	display: block;
	font-size: var(--site-size-sm);
	font-weight: 600;
}

.site-nav__subtext {
	display: block;
	color: var(--site-text-muted);
	font-size: var(--site-size-xs);
	line-height: 1.4;
}

.site-nav__actions {
	display: flex;
	align-items: center;
	gap: 10px;
}

.site-nav__actions .btn {
	min-height: 44px;
	padding: 0 20px;
	white-space: nowrap;
}

.nav-toggle {
	display: none;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	margin-left: auto;
	border: 1px solid var(--site-border-strong);
	border-radius: var(--site-radius-sm);
	background: var(--site-surface);
	color: var(--site-text);
	cursor: pointer;
}

.nav-toggle__icon {
	width: 22px;
	height: 22px;
}

/* --- Search --- */

.search-toggle {
	display: inline-flex;
	flex: none;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	border: 1px solid var(--site-border-strong);
	border-radius: var(--site-radius-sm);
	background: var(--site-surface);
	color: var(--site-text);
	cursor: pointer;
}

.search-toggle:hover,
.search-toggle[aria-expanded="true"] {
	border-color: var(--site-brand);
	color: var(--site-brand-deep);
}

.search-toggle__icon {
	width: 20px;
	height: 20px;
}

.search-toggle--mobile {
	display: none;
}

.site-search {
	position: absolute;
	top: 100%;
	right: 0;
	left: 0;
	z-index: 101;
	padding: 20px 0 24px;
	border-bottom: 1px solid var(--site-border);
	background: var(--site-surface);
	box-shadow: var(--site-shadow);
}

.site-search[hidden] {
	display: none;
}

.site-search__form {
	margin: 0;
}

.site-search__field {
	display: flex;
	align-items: center;
	gap: 12px;
	height: 56px;
	padding: 0 8px 0 16px;
	border: 2px solid var(--site-brand);
	border-radius: var(--site-radius-sm);
	background: var(--site-surface);
	color: var(--site-text-muted);
}

.site-search__icon {
	flex: none;
	width: 20px;
	height: 20px;
}

.site-search__input {
	flex: 1;
	min-width: 0;
	height: 100%;
	padding: 0;
	border: 0;
	outline: 0;
	background: transparent;
	color: var(--site-text);
	font: inherit;
	font-size: 18px;
	font-weight: 500;
	-webkit-appearance: none;
	appearance: none;
}

.site-search__input::-webkit-search-cancel-button {
	display: none;
}

.site-search__close {
	display: inline-flex;
	flex: none;
	align-items: center;
	justify-content: center;
	min-width: 44px;
	height: 40px;
	padding: 0 8px;
	border: 0;
	border-radius: var(--site-radius-sm);
	background: transparent;
	color: var(--site-text-muted);
	cursor: pointer;
}

.site-search__close:hover {
	background: var(--site-brand-soft);
	color: var(--site-brand-deep);
}

.site-search__esc {
	padding: 2px 7px;
	border: 1px solid var(--site-border);
	border-radius: 6px;
	font-size: 12px;
	font-weight: 500;
}

.site-search__x {
	display: none;
	width: 20px;
	height: 20px;
}

.site-search__list {
	max-height: min(60vh, 560px);
	margin: 14px 0 0;
	padding: 0;
	overflow-y: auto;
	border: 1px solid var(--site-border);
	border-radius: var(--site-radius-sm);
	list-style: none;
	overscroll-behavior: contain;
}

.site-search__list[hidden] {
	display: none;
}

.site-search__group {
	padding: 10px 16px 6px;
	background: var(--site-bg);
	color: var(--site-text-muted);
	font-size: 12px;
	font-weight: 600;
	letter-spacing: 0.06em;
	text-transform: uppercase;
}

.site-search__item {
	border-top: 1px solid var(--site-border);
}

.site-search__group + .site-search__item {
	border-top: 0;
}

.site-search__link {
	display: flex;
	align-items: flex-start;
	gap: 14px;
	padding: 12px 16px;
	color: var(--site-text);
	text-decoration: none;
}

.site-search__item.is-active .site-search__link {
	background: var(--site-brand-soft);
}

.site-search__tag {
	flex: none;
	min-width: 44px;
	margin-top: 2px;
	padding: 3px 8px;
	border-radius: var(--site-radius-pill);
	background: var(--site-brand-soft);
	color: var(--site-brand-deep);
	font-size: 11px;
	font-weight: 600;
	text-align: center;
}

.site-search__item.is-active .site-search__tag {
	background: var(--site-surface);
}

.site-search__text {
	display: grid;
	gap: 2px;
	min-width: 0;
}

.site-search__title {
	font-size: 15px;
	font-weight: 600;
}

.site-search__summary {
	color: var(--site-text-muted);
	font-size: 13px;
	line-height: 1.5;
}

.site-search__list mark {
	padding: 0;
	border-radius: 2px;
	background: #c9f0db;
	color: inherit;
}

.site-search__item--all .site-search__link {
	color: var(--site-brand-deep);
	font-size: 14px;
	font-weight: 600;
}

.site-search__none {
	padding: 16px;
	color: var(--site-text-muted);
}

.site-search__hint {
	display: flex;
	gap: 16px;
	margin: 10px 0 0;
	color: var(--site-text-muted);
	font-size: 12px;
}

.search-page__form {
	margin: 0 0 20px;
}

.search-page__go {
	min-height: 40px;
	padding: 0 18px;
}

.search-page__count {
	margin: 0 0 8px;
	color: var(--site-text-muted);
}

.search-page__group {
	margin: 28px 0 10px;
	color: var(--site-text-muted);
	font-size: 13px;
	font-weight: 600;
	letter-spacing: 0.06em;
	text-transform: uppercase;
}

.search-page__list {
	margin: 0;
	padding: 0;
	border: 1px solid var(--site-border);
	border-radius: var(--site-radius-sm);
	list-style: none;
}

.search-page__list li + li {
	border-top: 1px solid var(--site-border);
}

.search-page__item {
	display: grid;
	gap: 2px;
	padding: 14px 16px;
	color: var(--site-text);
	text-decoration: none;
}

.search-page__item:hover {
	background: var(--site-brand-soft);
}

.site-search-shade {
	position: fixed;
	inset: 0;
	z-index: 99;
	background: rgba(22, 35, 29, 0.45);
	opacity: 0;
	visibility: hidden;
	transition: opacity 0.2s ease, visibility 0.2s;
}

.has-search-open .site-search-shade {
	opacity: 1;
	visibility: visible;
}

.no-js .search-toggle {
	display: none;
}

@media (max-width: 1120px) {
	.search-toggle--mobile {
		display: inline-flex;
		margin-left: auto;
	}

	.search-toggle--desktop {
		display: none;
	}

	.search-toggle--mobile + .nav-toggle {
		margin-left: 0;
	}

	.site-header__inner {
		gap: 10px;
	}

	.site-search {
		padding: 12px 0 16px;
	}

	.site-search__esc,
	.site-search__hint {
		display: none;
	}

	.site-search__x {
		display: block;
	}

	.site-search__list {
		max-height: calc(100vh - var(--site-header-bottom) - 110px);
	}

	.site-search__link {
		gap: 10px;
		padding: 12px;
	}
}

@media (max-width: 1120px) {
	.nav-toggle {
		display: inline-flex;
	}

	.site-nav {
		position: fixed;
		inset: var(--site-header-bottom) 0 auto 0;
		flex-direction: column;
		align-items: stretch;
		max-height: calc(100vh - var(--site-header-bottom));
		padding: 16px var(--site-gutter) 24px;
		overflow-y: auto;
		border-bottom: 1px solid var(--site-border);
		background: var(--site-surface);
		box-shadow: var(--site-shadow);
	}

	.site-nav:not(.site-nav--open) {
		display: none;
	}

	/* Dark layer over the page while the menu is open (tap it to close). */
	.site-nav-shade {
		position: fixed;
		inset: 0;
		z-index: 99;
		background: rgba(22, 35, 29, 0.55);
		opacity: 0;
		visibility: hidden;
		transition: opacity 0.2s ease, visibility 0.2s;
	}

	.has-nav-open .site-nav-shade {
		opacity: 1;
		visibility: visible;
	}

	/* Lock page scroll on <html> only: hiding overflow on <body> too makes <body> the
	   scroll container, and the sticky header then scrolls away with the page. */
	.has-nav-open {
		overflow: hidden;
	}

	.site-nav__list {
		flex-direction: column;
		align-items: stretch;
		margin: 0 0 12px;
	}

	.site-nav__link {
		min-height: 48px;
		border-radius: var(--site-radius-sm);
		font-size: var(--site-size-md);
	}

	.site-nav__toggle {
		justify-content: space-between;
		width: 100%;
		padding-right: 14px;
	}

	.site-nav__sub {
		position: static;
		width: auto;
		padding: 4px 0 4px 8px;
		border: 0;
		box-shadow: none;
	}

	.site-nav__sub::before {
		content: none;
	}

	.no-js .site-nav__sub {
		display: block;
	}

	.site-nav__actions {
		flex-direction: column;
		align-items: stretch;
	}

	.site-nav__actions .btn {
		min-height: 52px;
	}
}

/* --- Footer --- */

.site-footer {
	padding: 72px 0 40px;
	background: var(--site-dark-bg);
	color: var(--site-dark-muted);
	font-size: var(--site-size-sm);
}

.site-footer a {
	color: var(--site-dark-text);
	text-decoration: none;
}

.site-footer a:hover {
	color: var(--site-white);
	text-decoration: underline;
}

.site-footer__top {
	display: flex;
	flex-wrap: wrap;
	gap: 40px;
	justify-content: space-between;
	padding-bottom: 48px;
	border-bottom: 1px solid var(--site-dark-border);
}

.site-footer__brand {
	flex: 1 1 280px;
	max-width: 360px;
}

.site-footer__logo {
	display: block;
	width: 170px;
	margin-bottom: 16px;
}

.site-footer__social {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	margin: 20px 0 0;
	padding: 0;
	list-style: none;
}

.site-footer__social a {
	display: grid;
	width: 40px;
	height: 40px;
	place-items: center;
	border: 1px solid var(--site-dark-border);
	border-radius: 10px;
	color: var(--site-dark-text);
}

.site-footer__social a:hover,
.site-footer__social a:focus-visible {
	border-color: var(--site-white);
	color: var(--site-white);
	text-decoration: none;
}

.site-footer__cols {
	display: flex;
	flex: 2 1 480px;
	flex-wrap: wrap;
	gap: 32px;
	justify-content: space-between;
}

.site-footer__col {
	flex: 1 1 140px;
	min-width: 0;
}

.site-footer__heading {
	margin: 0 0 14px;
	color: var(--site-white);
	font-size: var(--site-size-sm);
	font-weight: 600;
	letter-spacing: 0;
}

.site-footer__list {
	display: grid;
	gap: 10px;
	margin: 0;
	padding: 0;
	list-style: none;
}

.site-footer__bottom {
	display: flex;
	flex-wrap: wrap;
	gap: 12px 24px;
	justify-content: space-between;
	padding-top: 28px;
	font-size: var(--site-size-xs);
}

.site-footer__bottom p {
	margin: 0;
}

/* --- Prose (page and doc content) --- */

.prose {
	color: var(--site-text-body);
}

.prose h2 {
	margin-top: 1.8em;
	font-size: var(--site-size-xl);
}

.prose h3 {
	margin-top: 1.5em;
}

.prose ul,
.prose ol {
	padding-left: 1.3em;
}

.prose li {
	margin-bottom: 0.4em;
}

.prose table {
	width: 100%;
	margin: 1.5em 0;
	border-collapse: collapse;
	font-size: var(--site-size-sm);
}

@media (max-width: 760px) {
	/* Wide tables (GoConsent's policy tables, for example) scroll inside the
	   column instead of pushing the page sideways. */
	.prose table {
		display: block;
		overflow-x: auto;
		-webkit-overflow-scrolling: touch;
	}

	.prose th,
	.prose td {
		min-width: 140px;
	}
}

.prose th,
.prose td {
	padding: 10px 12px;
	border-bottom: 1px solid var(--site-border);
	text-align: left;
	vertical-align: top;
}

.prose th {
	color: var(--site-text);
	font-weight: 600;
}

.prose > :first-child {
	margin-top: 0;
}

/* --- Reveal on scroll --- */

.reveal {
	opacity: 0;
	transform: translateY(14px);
	transition: opacity 0.6s ease, transform 0.6s ease;
}

.reveal--in,
.no-js .reveal {
	opacity: 1;
	transform: none;
}

@media (prefers-reduced-motion: reduce) {
	*,
	*::before,
	*::after {
		transition: none !important;
		animation: none !important;
		scroll-behavior: auto !important;
	}

	.reveal {
		opacity: 1;
		transform: none;
	}

	.btn:hover {
		transform: none;
	}
}
