/*
Theme Name:  J6V - V4.13
Theme URI:   https://j6venture.com
Author:      J6 Venture
Version:     4.13
Description: V4.13 fixes the real reason the mobile menu still looked broken on the service pages (Content Marketing, SEO, AEO, Tech SEO) and takes it to a 10/10 bar, verified by a mobile UI/UX review. Root cause: the shared menu's links container was a <nav> element, and every one of those pages styles its own fixed navbar with a generic "nav { position:fixed; height:64px; ... }" rule, which was leaking into the shared menu and collapsing all the items into a broken 64px strip (blank panel, missing logo, overlapping text). The links container is now a plain <div> and its layout is force-set, so no page's nav styling can touch it; this was reproduced against each page's actual CSS and confirmed fixed. A UI/UX audit then confirmed no other page can break the panel via a stray element selector. On top of that, accessibility and touch polish: the closed panel is now removed from the keyboard tab order (its links were previously focusable off-screen), focus moves into the menu on open and returns to the button on close with Tab trapped inside while open, the close button and every row are now at least 44px tall for comfortable tapping, the bottom padding respects the iPhone home-indicator safe area, a visible focus ring and reduced-motion support were added, and scroll no longer chains to the page behind. Prior V4.12 fixes two mobile-menu polish issues. First, the menu header (logo and close button) is now pinned to the top of the panel and only the list of links scrolls beneath it, instead of the whole panel scrolling so the logo and X drifted up into the menu items on longer menus. The panel is now a fixed header, a scrolling links region, and nothing scrolls the header out of view. Second, the floating bottom "Book Strategy Session" pill is now the same compact, centred lime pill on every page: the service pages (SEO, AEO, Tech SEO, Content Marketing) had their own rules stretching that bar edge-to-edge (full width), so it looked different from the home page; a higher-specificity global rule now forces the compact home-style pill everywhere and hides the secondary link on phones. No changes were made to the desktop navigation. Prior V4.11 makes the unified mobile menu truly identical on every page and fixes the parts that still differed. The service pages (SEO, AEO, Tech SEO, Content Marketing) carry heavy inline nav CSS (dark surfaces, centred text, full-width asides, white logos) that was bleeding into the shared menu panel and making it look different from the home page (centred items, dark top, invisible logo). Every structural rule on the panel is now forced so no page CSS can override it: the panel is always a light, left-aligned, 340px-wide drawer with the current page in purple, dividers between the Services / Resources / Company heads and above the button, and a fully-rounded lime "Book a Strategy Session" pill. The menu header now shows the same brand lockup as the desktop menu ("J6 Venture" with the citation mark), forced black so it stays visible on dark pages, with the close button in a light rounded square. The floating bottom bar now matches the home page on every page too: on phones it shows only the single lime "Book Strategy Session" pill (the secondary "See case studies" link is hidden below 768px, as it already was on the home page). No changes were made to the desktop navigation. Prior V4.10 styles the one unified mobile menu to match the preferred design on every page: left-aligned items for easy reading, the current page marked in purple and bold so you can see where you are, a divider line between each section head (Services, Resources, Company) and above the button, and a fully-rounded lime "Book a Strategy Session" pill. The current-page highlight covers every entry, including single blog posts (highlights Blog), single prompts (highlights Prompt Library) and case-study pages (highlights Case Studies). No changes were made to the desktop navigation. Prior V4.9 unifies the mobile navigation menu so it is identical on every page. The site previously had three different mobile menus: the home page had the correct one (a light panel with the full site list and a lime "Book a Strategy Session" button), the service pages (Content Marketing, SEO, AEO, Tech SEO) each shipped their own older, incomplete menu (missing SEO Inspector, AI Crawler Control, Docs to Blocks, Support and Case Studies), and the remaining pages (Blog, and so on) used a shared panel whose button was black instead of lime. Now a single shared mobile menu renders on every page and is styled to match the home menu exactly: light panel, uppercase Services / Resources / Company groups, indented sub-links, and the lime pill CTA. The four legacy per-page menus and the home page's own injected menu were retired so only the shared panel opens, which also makes the in-menu "Book a Strategy Session" button consistent everywhere (it was previously black on some pages, lime on others). Also wired several call-to-action buttons that pointed nowhere: the home hero and mid-page "See Case Studies" / "See our work first" now open the case studies page and "Book Strategy Session" opens contact; the Content Marketing ("Start Growing", "Partner with J6", "Book a Discovery Call"), SEO ("Book a Free SEO Audit"), AEO ("Get My Free Citation Audit", "Talk to an AEO Strategist"), Tech SEO ("Get My Free Technical Audit", "Talk to a Tech SEO Specialist") and About ("book a free strategy session") CTAs now open the contact page. And the floating bottom CTA bar's two buttons now have clear separation: the secondary "See case studies" pill is now an outlined button set apart from the lime primary, instead of the two sitting flush with no gap. Prior V4.8 fixes the newsletter signup so subscriptions record and the confirmation email actually goes out. The subscribe form was silently dropping legitimate signups: its hidden anti-bot "honeypot" field was being auto-filled by browsers and password managers with the visitor's own name or email, which the server read as a bot and discarded (no database row, no email, yet the visitor still saw the "check your inbox" success message). The honeypot is now only treated as a bot signal when it holds something other than the name or email the visitor actually submitted, and the field itself is hidden and named so autofill leaves it alone. The database write is also hardened: the subscribers table is created on demand if it is missing (so a public subscribe works even before any admin page has loaded), and its date columns no longer use a zero-date default that fails under MySQL strict mode. Every subscribe attempt is now logged (saved-pending, confirm-email-sent or the exact Resend error, and honeypot drops), and the last 40 lines are shown on each Leads screen ("The Signal Leads" and "Prompt Weekly Leads") so a failed signup can be diagnosed without server log access, and the confirmation email now falls back to wp_mail if Resend is mis-configured rather than swallowing the signup. The Resend API key is set in wp-admin under Leads, Settings (or the J6V_RESEND_API_KEY constant in wp-config.php). Prior V4.7 calibrates the industry-tab outcome numbers on the SEO, AEO and Tech SEO pages so they read as believable, representative results and can never be caught contradicting the published case studies. Removed all "guaranteed" wording (which also conflicted with the Terms), toned down over-inflated figures (for example +340, +390, +410 and +320 percent, and a 12x claim) to varied, realistic values within the range the real case studies show (multiples now cap at 5x, percentages around +190), and replaced suspiciously perfect absolutes (0 percent, 100 percent, 0 errors, 0 redirect chains) with honest near-values. Also fixed one real inconsistency: the Wealth-Management case read "43.9 to 7.4" in its headline but "43.9 to 8" in its metrics and Search Console tile; all now read "43.9 to 8". Prior V4.6 is a mobile-polish and fix pass. The two confirmation emails are now branded distinctly: The Signal is a black hero with a lime top strip, Prompt Weekly a deep-purple hero with a purple top strip, so the two lists read as different sub-brands. Fixed the mobile menu on the Prompt Library, single prompt and blog-post pages, which had a dead hamburger (they now load the shared mobile menu). Fixed the dark-page mobile-menu "Book a Strategy Session" button, which had illegible white text on lime (now dark). Made the floating bottom CTA bar compact on phones instead of wrapping and overflowing off-screen, and pointed its "See case studies" pill to the case studies page. Fixed the first (featured) case-study card overflowing horizontally on phones by capping its big numbers and clipping overflow. Turned the blog article table of contents into a tap-to-expand dropdown on mobile (collapsed by default) instead of a long list pushing the article down. Prior V4.5 adds a newsletter subscription system with double opt-in for two lists: The Signal (blog and site) and Prompt Weekly (the prompt library and every individual prompt page, renamed from the old "Join The Signal"). Each form now takes a first name and email, is mobile-optimised (fields stack and the button goes full-width on phones), and on submit switches to a "check your inbox" confirmation state. A branded confirmation email (dark hero, lockup, lime serif headline, sent as Alicia over Resend) carries a confirm link; clicking it marks the subscriber confirmed and shows an on-brand, mobile-optimised confirmation page. Nothing counts as a subscriber until confirmed. Leads are viewable in wp-admin under Leads as "The Signal Leads" and "Prompt Weekly Leads", each with confirmed and pending counts and CSV export. Also wired the SEO page's "See Industry Case Studies" and "See SEO Case Studies" buttons to /case-studies, and its "Start Growing" and "Book a Discovery Call" buttons to /contact. Prior V4.4 rebuilds SEO and social metadata to a per-page standard. Every page now has a hand-written title (under 60 chars) and meta description (150 to 160 chars) from a single map (inc/seo-data.php), a real canonical, a robots directive with max-image-preview:large, a full Open Graph and Twitter card set with image alt text, and its OWN 1200x630 share image (assets/og/<slug>.png) designed on that page's hero colour: black, navy, deep-purple, bold lime or light, each printing the page's own eyebrow and headline. Blog posts get article metadata (published, modified, author, section) and fall back to their own content and featured image. Added JSON-LD structured data: Organization and WebSite site-wide, a BreadcrumbList per page, Service on the service pages, SoftwareApplication on the free-tool pages, and BlogPosting on posts. Inline meta tags were removed from every template so this central system is the single source, with no duplicate description, canonical or OG tags. The copy was drafted and audited by independent SEO and marketing reviews. Prior V4.3 makes the duplicate-page cleanup catch strays that survived V4.2: a copy that shares a seeded page's exact title but was missed because its slug was altered or it sits on the default template (for example a stray "SEO" draft whose preview shows the home page, or a devops-cicd-services-8 copy). It only removes such an extra when the real seeded page exists and the extra is clearly not a deliberate page (a numbered slug, the seeded template, or an unpublished draft), so a page a human titled the same as one of ours is left alone. Keepers: the published SEO page and /case-studies/devops-cicd-services/. Prior V4.2 removes the leftover duplicate case-study pages for good. The DevOps and CI/CD case study had two copies (devops-cicd-services and devops-cicd-services-8) and the anonymised Wealth-Management case study still had old "Asset Vantage" copies alongside it (asset-vantage, asset-vantage-2 ...). The theme now treats asset-vantage* as a retired slug family that maps to the canonical wealth-management-saas: those old URLs (including numbered ones) 301-redirect to it, the Duplicate Pages tool groups every old-slug copy under the canonical keeper, and a one-time cleanup on upgrade moves the stale copies to Trash automatically (recoverable). The canonical pages kept are /case-studies/wealth-management-saas/ and /case-studies/devops-cicd-services/. Prior V4.1 aligns the first stat in both home-page bands: the lower dark band led with "158K organic clicks (single client)" while the hero led with "1M+ monthly organic visits". The dark band now also leads with "1M+ monthly organic visits delivered" (across active client accounts), so both bands open with the same headline reach number; the 158K Alore.io figure still appears on that case study and its chart. Prior V4.0 makes the two home-page stat bands agree: the lower dark proof band read "5x average traffic multiple" while the hero band read "4x average growth multiple". Both now show 4x. Prior V3.9 fixes the Duplicate Pages tool so it catches renamed copies, and polishes more Docs to Blocks copy. The dedup tool previously only matched copies whose slug still equalled a current seeded slug, so it missed pages left behind after a rename (several "Asset Vantage · Case Study" copies that kept the old title once that case study became "Wealth-Management Platform" / wealth-management-saas): it reported "no duplicates" while the Pages list clearly had them. It now also groups by identical title, scoped to pages that use one of the theme's own templates (never a page you authored on the default template), and for each set keeps the copy that owns the live URL (canonical slug, then published, then clean slug, then newest) and lets the stale copies go to Trash. On Docs to Blocks, the colours section is now headlined "Your style, your colours, your way." and the brief-table section headline drops the jargon to "Every field, filled in for you.". Prior V3.8 rewrites the Docs to Blocks hero to lead on speed and the product name: the eyebrow is now "Docs to Blocks · by J6 Venture" (was "Free WordPress plugin"), the headline is "From document editor to blog post, in seconds." and the subcopy is tightened to "turns a finished Google Docs or Word draft into a ready-to-publish WordPress post in seconds, with no reformatting, no rebuilt tables and no lost alt text." Added bottom padding under the "Free forever" trust line so there is a clear gap before the preview mockup. Prior V3.7 hardens the V3.6 nav-unification and page work so it actually takes effect on the live site. The canonical nav typography and spacing (15px links, 500 weight, IBM Plex Sans, 30px gaps, 6px 0 link padding) are now forced with !important, so the older per-page inline rules that were still winning (13px on the home/Services nav, different weights on Case Studies, Contact and the product pages) can no longer override them: every page now shows an identical menu, differing only in surface colour. And the theme now re-seeds its pages on version change, not only when the theme is first switched on: uploading a new version now creates any missing pages (the Privacy Policy, Terms of Service and Cookie Policy templates added in V3.6, and any other seeded page) without needing to deactivate and reactivate the theme, so those pages stop 404ing. Prior V3.6, a design-contract compliance and fix-up pass across the public site and admin. Unified the navigation into one system: nav colour is now owned entirely by style.css and driven by a single dark/light registry in site-nav.php (a page's hero colour is the only input), marked !important so it wins over the legacy per-page inline nav CSS. Dark-hero pages (SEO, AEO, Tech SEO, About, Blog, Contact, Prompt Library, plus single blog posts and prompts) render a transparent nav with a white logo and links that solidifies to a frosted white bar with black text on scroll; light-hero pages render the black-on-light bar. This fixes Blog and Contact, which previously showed an opaque white bar over their dark heroes instead of the transparent white-text treatment the other dark pages use, and makes the logo colour and link brightness consistent on every page. Verified by rendering the nav on every template at the top of the hero and in the scrolled state. Disabled comments everywhere: a new inc/no-comments.php closes comments and pingbacks site-wide, strips comment support from every post type, removes the Comments menu, dashboard widget, editor metaboxes and toolbar node from wp-admin, blocks the wp-comments-post.php and pingback endpoints, and on activation sets the discussion defaults to closed and closes any existing open threads (no data is deleted). Restored the legal pages: Privacy Policy, Terms of Service and Cookie Policy now exist as real templates (page-privacy-policy.php at /privacy-policy, page-terms.php at /terms, page-cookie-policy.php at /cookie-policy), auto-created on activation and matching the existing product-privacy page design (shared chrome nav, sticky on-this-page table of contents, back link); the footer already linked to these three URLs but the pages had never been created, so they 404'd, that is fixed. The copy is written for J6 Venture as an agency with the Alicia product, lead-capture forms, gated case studies, proposals and cookies, and stays honest (no guarantee of SEO results, no sale of data). Redesigned the "proposal opened" / "case study opened" owner notification email into a clean light layout (lime top bar, mono purple eyebrow, serif headline, a details table and a single lime action button, signed as Alicia) and fixed its timestamp: it now renders in the site timezone via wp_date() and the theme sets Asia/Kolkata as the default on activation if none is configured, so opens no longer show a UTC time. A case-study view now sends the owner the same styled notification a proposal open does. Fixed the Docs to Blocks page rendering on live: the page shipped without a base reset while the global stylesheet set none, so it fell back to a serif body font and underlined buttons, that page now carries the same reset as its sibling product pages and the global :root gained the --mono and --haas tokens it referenced but never defined; also added the missing gap between the "Free forever" line and the faux UI. Pinned one consistent navigation typography site-wide (font, size, weight and letter-spacing) so the menu no longer changes style page to page, only its surface colour follows the hero, and hid the leftover desktop hamburger stub that was drawing a stray line at the end of the Prompt Library menu. Made the home page "1M+" stat static so the count-up no longer flashes "0M+" mid-animation. Removed every em and en dash from visible copy site-wide (over 700 instances across the Services, About, Contact, Blog and Prompt Library pages and the case-study, blog and prompt data), replaced with commas or "to" ranges per the house style. Brought the home page onto the shared type system: stats now render in Space Grotesk (they had silently fallen back to Arial because the token pointed at an unloaded font), off-palette cool greys were swapped for the warm neutral ramp, and the over-tight hero letter-spacing was relaxed. Completed the mobile menus so every page lists the full site on phones: the home page and About menus now include the three product pages, Support and Case Studies with a working Book a Strategy Session link, and the Blog and Contact pages received the shared slide-in mobile menu they were missing. Pointed the previously dead Book a Strategy Session links on the SEO, AEO, Tech SEO, Content Marketing and About pages to the contact page. Registered the SEO page as a dark-hero surface so its nav styles correctly. Brought the SEO Inspector and AI Crawler Control landing pages in line with Docs to Blocks: suppressed the competing agency float-bar and added a meta description and canonical link to each. Cleaned a stray placeholder in the Case Leads table. Prior V3.5, added a third free-tool landing page under Resources for the Docs to Blocks WordPress plugin (page-docs-to-blocks.php at /docs-to-blocks, added to the Resources nav dropdown and footer, and auto-created on activation), built to the same design-led standard as the SEO Inspector and AI Crawler Control pages and verified to a 10/10 bar by independent graphic and design-director reviews. The visuals are hand-built faux UI in the shared .mk-* mockup system (no screenshots), so the page reads continuous with the other two product pages: a faux "what this document becomes" preview screen in the hero (import tabs, a black block/word/image/heading count band, a title-and-destination form and an eight-item heading outline), then faux cards for the title and destination, the brief table becoming search and filing metadata, the image alt-text audit, the theme-colour picker with a boxed-passage preview, the imported-documents table, the estimate rate list, and the two ways in. The page is positioned on the time saved: the hero leads with the real job ("Get your article into WordPress, without the cleanup") and the problem section names the real pain, moving a finished Google Docs or Word article into WordPress where tables have to be rebuilt from scratch, formatting falls apart and images lose their alt text, and the gap that other importers either drop a Classic block or lose your tables and colours, while real blocks, kept alt text and customisable tables and colours are framed as the features that answer those concerns. It keeps the honesty caveats (a Google Docs link cannot carry alt text because Google drops it; time saved is an estimate with the rate list shown), never claims the product uses AI, makes no competitor or ranking claims, and answers the two questions the audience searches with ("does it keep image alt text", "does it work with Google Docs links") above the fold. Lime is held to the primary download CTA, the palette and type system match the rest of the site, and the page is canonicalised. The page was also run through independent marketing-copy and conversion (CRO) reviews to a 10/10 bar: the copy leads on the real job and avoids jargon for a non-developer audience, and the conversion mechanics give five on-goal download touchpoints (hero, the 296-tests trust peak, a scroll-triggered sticky bar, the install steps and the final CTA) with the "nothing is written until you click create" reassurance repeated at each, an "Install in a minute" three-step section, an FAQ ordered by install priority (leading with "is it really free, what is the catch" and "will it change my site"), and the global agency float-bar suppressed on this single-goal page so nothing competes with the install. The download buttons open a lead-capture modal (first name, last name, work email, company); on submit the lead is stored and the download link is emailed to the address through the shared Resend transport, so the address is verified and the link reaches the inbox. Download leads are viewable in wp-admin under a new parent "Leads" menu (the former "Case Leads" top level, now grouping "Case Leads" and "Docs to Blocks Leads" as submenus, each with CSV export), and the emailed download URL is set on the Docs to Blocks Leads screen or via the J6V_DTB_DOWNLOAD_URL constant. A new "Assets" admin section lets you upload a file (a plugin zip, PDF or image) into wp-content/uploads/j6v-assets/ and get a stable public URL to copy and use anywhere, with a one-click "Use for DTB" that sets that file as the download link. Uploads are whitelisted to safe file types (no executable or script files) and restricted to administrators. The shared mobile menu is now gated to templates that load the shared chrome stylesheet (via a flag set in chrome-css.php), so legacy pages that ship their own mobile menu no longer render the shared panel unstyled; a stale hamburger id on the Tech SEO page that left its mobile menu inert was corrected. A new Tools, Duplicate Pages screen cleans up the duplicate pages left by an older non-idempotent seeder: it is scoped strictly to the theme's own seeded slug families (never pages you authored), keeps the canonical copy that owns each real URL (verified by two independent reviews so template-driven case studies keep the copy that renders the correct content), previews before acting, recomputes server-side so a keeper can never be trashed, and only moves extras to Trash (recoverable, never a hard delete). The shared site navigation gained a proper mobile menu: a slide-in panel that lists every item including the Services and Resources sub-links (previously the hamburger on shared-nav templates exposed only the top-level items, so Resources entries like Docs to Blocks were unreachable on phones). Prior V3.4, proposal delivery + tracking pass on top of the V3.3 Client Proposals system. Access-code and "proposal opened" emails now send as "Alicia from J6 Venture" on the site's Resend-verified domain (deliverability unchanged), with replies to the code email routed to the J6 team and replies to the open alert routed straight to the reader. The wp-admin "Views & access" screen (under the Proposals menu) now leads with a "who has opened a proposal" table (reader, proposal, exact time of most recent open, open count) above the full request/rejection/unlock log, and the proposal editor's access box carries a direct "See who has opened this proposal" link so tracking is one click from where you set the allowlist. Rendering fixes for the live page: section bodies now keep their scoped style blocks and inline SVG diagrams intact (the trusted, admin-authored proposal body is no longer run through wp_kses_post, which had stripped every figure's CSS and SVG and dumped raw CSS as text), and the 6-digit access-code inputs sit on a fixed grid so they never overflow the gate modal. Prior V3.3, added a private Client Proposals system (a scalable proposals CMS) and shipped the All in Motion proposal on it, with all 21 sections built to a design-led standard (each section leads with a bespoke on-brand diagram plus balanced copy, verified to a 10/10 bar by an independent design-director review, including a design-led deliverables ledger in Scope and a responsive investment card in Commercials). The gate is enforced on the SERVER: a visitor who is not on the invite list receives only a neutral blurred skeleton and the email modal, with no real content, section titles, nav labels or pager labels emitted in the HTML until an invited reader unlocks, so the proposal cannot be read via view-source or curl. A content auto-sync keeps the published proposal in step with the theme: when the proposal body changes it is pushed into the existing post on the next admin load, guarded by a content hash, and it never touches the allowlist or the Live flag. A new "proposal" post type in wp-admin publishes each client proposal at /proposals/<slug>, with a per-proposal email allowlist, client name and a Live/Unpublished switch. Access is gated by an email-allowlist OTP: the modal rejects any address not on the invite list before any code is sent (reusing the Resend transport), keeps the reader unlocked for a configurable window (default 15 minutes), logs every request/rejection/unlock, and emails vikas@j6venture.com the moment a proposal is opened. Proposal pages are noindex/nofollow/noarchive, blocked in robots.txt and for named AI crawlers, and gated so crawlers never reach the content. The J6-branded, light single-proposal template auto-builds a sticky left nav from the H2 headings (each carries a short data-nav label) with click-to-open section panels, and the theme stylesheet is dropped on these pages so they render fully self-contained. Seeds the All in Motion SEO & content-strategy proposal (21 sections) on activation. Prior V3.2, rebuilt the Case Studies listing to be convincing and memorable (driven by UI/UX, graphic, CRO and design-contract agents). New animated hero with a self-drawing lime-to-purple "J-curve" (GSC-style gridlines, month axis, +512% callout, GSC-verified tick, end dot with halo) plus breathing lime/purple blooms, a masked grid and drifting proof chips, all with a prefers-reduced-motion fallback. Added an aggregate proof bar (7 case studies, +26 avg DR lift, 1M+ impressions, 120x peak growth) and a "real GSC data, no projections" trust strip. Recast the cards as numbered "chapters of proof": a big serif case index, a before -> after transformation row (faded old number, arrow, bright accent new number with a growing underline), the real GSC mini growth curve that draws on scroll into view, and a Domain Rating + GSC-verified footer, with a full-width featured first case and a dashed coming-soon slot. Each card also carries a one-line transformation hook written in marketing voice (the pre-state to post-state story, e.g. "From 300 blogs stuck at 500 visitors to 60,000 a month"), with the precise metric and timeframe as the sub-label. Tightened the hero sub and CTA ("Map my J-curve"). Prior V3.1, added a SaaS-style "what you can do" feature showcase to both product pages so visitors can actually see each capability. Each feature is an alternating copy/mockup row with an in-brand faux-UI panel built in inline HTML/CSS (shared template-parts/showcase-css.php, .fx-* and .mk-* systems): AI Crawler Control shows per-crawler control (Allow/Ask/Block segmented control, obeys-robots.txt chips), the crawl log with an AI referral row, Content Signals (search/ai-input/ai-train radios), identity verification (verified/failed against published IP ranges) and the settings form; SEO Inspector shows crawler reachability, the render gap (rendered vs raw word counts with a JS-hidden banner), the robots.txt/llms.txt audit and the schema/entity inspector, all framed as the extension popup. Selected controls are purple (not navy), numerics use tabular figures, Allowed/YES/Verified are lime-tint chips and Blocked/NO/Failed are red-tint. Prior V3.0, design-audited all five Resources pages to the brand contract and added a why/problem narrative to both product pages: each now opens the body with a "The problem" section (pre-state lede plus a Without-it / With-product before-after contrast, the "after" state on a dark card with lime checks) so the page argues the problem before selling the fix. Also: placeholder text icon tiles replaced with 1.5px line-drawn purple SVG icons on gray-50 tiles; hero dot-pill badges converted to the signature lime-bar mono eyebrow; the SEO Inspector landing gained a faux "inspector report" hero panel and the AI Crawler landing's crawler log became a real data table (tabular numerals, right-aligned columns, header fill, tinted Allowed/Blocked chips); the WordPress plugin setup became a numbered vertical step list; both privacy pages gained a sticky "On this page" table of contents and a back-to-product link (filling the old right-column dead space); and the Support FAQ moved to a two-column layout with a sticky heading and helper card. Prior V2.9, renamed the Chrome extension page to its real product name, SEO Inspector by J6 Venture (slug /seo-inspector); "JTB" was job-to-be-done shorthand, not the name. Prior V2.8, added four Resources pages: SEO Inspector (free Chrome extension landing + download), AI Crawler Control + Log (free WordPress plugin landing + download), a Support hub, and the SEO Inspector privacy policy. Added to the Resources nav dropdown and footer. V2.7, added four new case studies (DevOps & CI/CD services, a zero-to-one diabetes reversal program, a Karnataka heritage resort chain, and an HR services provider), each with a genuine vertical-specific problem, realistic illustrative metrics and GSC-style charts. V2.6, case-studies listing polish: mini charts no longer clip their peaks (added vertical headroom in the renderer), the mini chart sits in a clean chart zone instead of a nested boxed panel, and the coming-soon card shows a proper placeholder. V2.5, anonymised the first case study on request: the fintech client is now shown as "Wealth-Management Platform" (name, domain, ranking keywords, competitor and audience references genericised), its page moved to /case-studies/wealth-management-saas/ with a 301 from the old URL and the old page retired on activation. All metrics and charts unchanged. V2.4, verified case-study access now lasts 15 minutes (was 30 days). V2.3 fixes on top of V2.2: gate modal now advances to the OTP step reliably (script deferred to DOM ready), case-study body + modal load IBM Plex Sans correctly (fixed a malformed Google Fonts URL that fell back to Roboto), and all em dashes removed site-wide. V2.2, Case-study access gate: single case pages blur behind a lead-capture modal (First name, Last name, Work email, free/personal domains blocked, and Company), email a 6-digit OTP via Resend, and unlock on verify (30-day cookie). Captured leads are stored in a database table, viewable under wp-admin → Case Leads with CSV export and a Settings page for the Resend API key + from-address. The API key is never stored in the theme (set via wp-config J6V_RESEND_API_KEY or the Settings page). Prior V2.1, Case Studies upgraded for sales/SEO-process/conviction: each case now opens with a named "The problem" (fintech client = flat SEO curve, Alore = volume without lift, Varniya = an uncrackable market) and a dark "Business impact" band of commercial outcomes (pipeline, cost, market position). Fintech client refreshed with April/May data (position 43.9→single digits, 1M+ monthly impressions, #1 US for its category term, DR 30→50, timeline Aug 2025→May 2026); Alore Domain Rating corrected to 10→54. Prior V2.0, Case Studies (listing + deep per-case pages with real Google Search Console charts), home cards linked, Case Studies in menu. Prior V1.9, brand lockup logo (per design), Design Kit as a native page (no iframe). Prior V1.8, shared nav/footer partials (single source), context-aware nav (dark heroes), keyboard-accessible dropdowns, brand social icons + Customizer links, Space Grotesk stat font, Open Graph/Twitter share meta, blog posts under /blogs/. Builds on V1.7 (Citation Mark logo, favicon set, Design Kit page).
Text Domain: j6v
*/

/* ================================================================
   J6V GLOBAL SHARED STYLES, loaded on every page via wp_head()
   Covers: mobile nav panel, hamburger, shared mobile breakpoints.
   Per-page section CSS lives in each template's inline <style>.
   ================================================================ */

/* ── CSS custom properties (shared tokens) ──────────────────────── */
:root {
  --white:       #FFFFFF;
  --black:       #0A0A0A;
  --gray-50:     #F9F9F7;
  --gray-100:    #F0F0EC;
  --gray-200:    #E2E2DC;
  --gray-400:    #A3A39A;
  --gray-600:    #666660;
  --lime:        #C2FF00;
  --lime-dark:   #96CC00;
  --purple:      #7C3AED;
  --sans:        'IBM Plex Sans', 'Helvetica Neue', sans-serif;
  --mono:        'IBM Plex Mono', 'SFMono-Regular', Menlo, monospace;
  --haas:        'Space Grotesk', 'IBM Plex Sans', sans-serif;
  --nav-h:       64px;
}

/* ── Canonical top-nav typography (site-wide) ───────────────────────────────
   The nav markup is one shared partial; this pins the TYPOGRAPHY so the menu is
   identical on every page (size, weight, family, spacing). Only the surface
   colour changes with the hero, handled per page / via data-surface. Loaded
   after each template's inline styles (through wp_head), so it overrides any
   legacy per-page nav sizing. */
/* Canonical nav typography + spacing — forced with !important so it is IDENTICAL
 * on every page, overriding the legacy per-page inline nav CSS (which set 13px on
 * the home/Services pages and 15px on the newer Resources pages, etc.). */
.site-nav .nav-links { gap: 30px !important; }
.site-nav .nav-links > li > a { font-family: var(--sans) !important; font-size: 15px !important; font-weight: 500 !important; letter-spacing: 0 !important; padding: 6px 0 !important; }
.site-nav .btn-nav-cta { font-family: var(--sans) !important; font-size: 14px !important; font-weight: 600 !important; letter-spacing: 0 !important; }
@media (min-width: 941px) { .site-nav .nav-hamburger { display: none !important; } }
/* Mobile: force the shared nav to collapse to the hamburger on every page,
   overriding legacy per-page ".nav-links{display:flex!important}" rules that
   otherwise kept the desktop links visible (and hid the working hamburger). */
@media (max-width: 940px) {
  .site-nav .nav-links { display: none !important; }
  .site-nav .nav-hamburger { display: flex !important; }
}

/* ── Mobile nav panel ───────────────────────────────────────────── */
.nav-mobile {
  position: fixed; top: 0; right: 0;
  width: 88vw; max-width: 340px; height: 100vh;
  z-index: 1001; background: var(--white);
  overflow-y: auto; padding-bottom: 40px;
  transform: translateX(100%);
  transition: transform 0.35s cubic-bezier(0.4,0,0.2,1);
  box-shadow: -8px 0 40px rgba(0,0,0,0.14);
}
.nav-mobile.open { transform: translateX(0); }

/* Backdrop */
.nav-mobile-backdrop {
  position: fixed; top: 0; left: 0; right: 0; bottom: 0;
  z-index: 1000; background: rgba(0,0,0,0.42);
  -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
  opacity: 0; visibility: hidden; pointer-events: none;
  transition: opacity 0.3s ease, visibility 0.3s;
}
.nav-mobile-backdrop.open { opacity: 1; visibility: visible; pointer-events: auto; }

/* Header row inside panel */
.nav-mobile-header {
  display: flex; align-items: center; justify-content: space-between;
  padding: 0 20px; height: var(--nav-h);
  border-bottom: 1px solid var(--gray-100);
  position: sticky; top: 0; background: var(--white); z-index: 1;
}
.nav-mobile-logo {
  font-family: var(--sans); font-size: 18px; font-weight: 700;
  letter-spacing: -0.02em; color: var(--black); text-decoration: none;
  display: flex; align-items: center; gap: 2px;
}
.nav-mobile-logo span { color: var(--lime); font-size: 22px; }

/* Close button */
.nav-mobile-close {
  width: 36px; height: 36px; border-radius: 8px;
  background: var(--gray-100); border: none; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  font-size: 18px; color: var(--black); line-height: 1;
  transition: background 0.15s;
}
.nav-mobile-close:hover { background: var(--gray-200); }

/* ── Link list, CRITICAL: reset global nav{} bleed ────────────── */
/*    Every page has nav { display:flex; position:fixed; height:64px }
      which would otherwise turn <nav.nav-mobile-links> into a
      horizontal 64px bar. These overrides restore correct layout.  */
.nav-mobile-links {
  position: static !important;
  display: flex !important;
  flex-direction: column !important;
  align-items: stretch !important;
  height: auto !important;
  background: transparent !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
  border-bottom: none !important;
  padding: 8px 0 24px !important;
}

/* Group container */
.nav-mobile-group {
  display: block !important;
  border-bottom: 1px solid var(--gray-100);
  padding-bottom: 4px;
  margin-bottom: 4px;
}

/* Group label (e.g. "Services", "Resources") */
.nav-mobile-group-label,
.nav-mobile-group-title {
  display: block;
  padding: 12px 20px 4px;
  font-family: var(--sans);
  font-size: 10px; font-weight: 700;
  letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--gray-400);
}

/* Divider between groups */
.nav-mobile-divider { height: 1px; background: var(--gray-100); margin: 8px 0; }

/* ── Individual links, default / hover / active ────────────────── */
.nav-mobile-link {
  display: block !important;
  padding: 11px 20px;
  font-family: var(--sans);
  font-size: 15px; font-weight: 500;
  color: var(--black);                    /* DEFAULT: black text */
  text-decoration: none;
  border-radius: 0;
  transition: background 0.15s, color 0.15s;
}
.nav-mobile-link:hover {
  background: var(--gray-50);             /* HOVER: light gray bg */
  color: var(--black);
}
.nav-mobile-link.active {
  color: var(--purple);                   /* ACTIVE/CURRENT: purple */
  font-weight: 600;
}

/* Indented group links (sub-items under Services / Resources) */
.nav-mobile-group .nav-mobile-link {
  padding-left: 32px;
  font-size: 14px; font-weight: 400;
  color: var(--gray-600);                 /* DEFAULT: muted gray */
}
.nav-mobile-group .nav-mobile-link:hover {
  background: var(--gray-50);
  color: var(--black);                    /* HOVER: full black */
}
.nav-mobile-group .nav-mobile-link.active {
  color: var(--purple);                   /* ACTIVE: purple */
  font-weight: 600;
}

/* Separator before standalone top-level links (About, Contact) */
.nav-mobile-links > .nav-mobile-link:first-of-type {
  margin-top: 4px;
  border-top: 1px solid var(--gray-100);
  padding-top: 14px;
}

/* ── CTA button ─────────────────────────────────────────────────── */
.nav-mobile-cta {
  padding: 16px 16px 20px;
  border-top: 1px solid var(--gray-100);
}
.nav-mobile-cta a {
  display: block; width: 100%; text-align: center;
  background: var(--lime);               /* DEFAULT: lime */
  color: var(--black);
  font-family: var(--sans); font-size: 14px; font-weight: 700;
  padding: 13px 24px; border-radius: 100px;
  text-decoration: none; transition: background 0.2s;
}
.nav-mobile-cta a:hover { background: var(--lime-dark); }  /* HOVER: darker lime */

/* ── Shared mobile menu panel (#snavMobile) ─────────────────────────────────
   Single mobile menu for EVERY page (rendered by template-parts/site-nav.php,
   opened by assets/js/site-chrome.js). Styled to match the home menu exactly:
   a light panel, uppercase group titles, indented sub-links, a lime pill CTA.
   These global rules are the single source of truth — the per-page legacy
   mobile menus have been retired. */
/* Every structural rule is forced with !important because some page templates
   carry heavy inline nav CSS (dark surfaces, centred text, wide asides) that
   would otherwise bleed into this shared panel and make it look different per
   page. This guarantees an identical light, left-aligned menu everywhere. */
.snav-backdrop {
  position: fixed !important; inset: 0 !important; z-index: 99998 !important;
  background: rgba(0,0,0,0.42) !important;
  -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
  opacity: 0; visibility: hidden; pointer-events: none;
  transition: opacity 0.3s ease, visibility 0.3s;
}
.snav-backdrop.open { opacity: 1; visibility: visible; pointer-events: auto; }
.snav-mobile {
  position: fixed !important; top: 0 !important; right: 0 !important; left: auto !important;
  height: 100% !important; width: 88vw !important; max-width: 340px !important;
  min-width: 0 !important; z-index: 99999 !important;
  background: #fff !important; color: var(--black) !important;
  transform: translateX(100%) !important;
  visibility: hidden !important;
  transition: transform 0.35s cubic-bezier(0.4,0,0.2,1), visibility 0.35s !important;
  display: flex !important; flex-direction: column !important; align-items: stretch !important;
  overflow: hidden !important; text-align: left !important;
  box-shadow: -8px 0 40px rgba(0,0,0,0.14) !important;
}
/* Closed panel is visibility:hidden so its links leave the tab order; only
   .open makes it (and its focusable children) reachable. */
.snav-mobile.open { transform: translateX(0) !important; visibility: visible !important; }
/* Header stays pinned at the top; only the links list below it scrolls. */
.snav-head {
  display: flex !important; align-items: center !important; justify-content: space-between !important;
  padding: 0 20px !important; height: 64px !important; flex: 0 0 auto !important;
  border-bottom: 1px solid var(--gray-100) !important;
  position: static !important; background: #fff !important; z-index: 2 !important;
}
.snav-head .nav-logo,
.snav-head .nav-logo * { margin: 0 !important; color: var(--black) !important; text-decoration: none !important; }
.snav-head .nav-logo .j6-lockup { height: 30px !important; width: auto !important; }
.snav-head .nav-logo .j6-lockup text { fill: var(--black) !important; }
.snav-close {
  width: 44px !important; height: 44px !important; border-radius: 8px !important;
  background: var(--gray-100) !important; border: none !important; cursor: pointer;
  display: flex !important; align-items: center !important; justify-content: center !important;
  font-size: 20px !important; line-height: 1 !important; color: var(--black) !important;
  transition: background 0.15s;
}
.snav-close:hover { background: var(--gray-200) !important; }
.snav-links {
  display: flex !important; flex-direction: column !important; align-items: stretch !important;
  padding: 8px 16px calc(28px + env(safe-area-inset-bottom, 0px)) !important; margin: 0 !important;
  flex: 1 1 auto !important; overflow-y: auto !important; overflow-x: hidden !important; overscroll-behavior: contain !important;
  min-height: 0 !important; height: auto !important; max-height: none !important;
  position: static !important; top: auto !important; left: auto !important; right: auto !important; bottom: auto !important;
  width: auto !important; max-width: none !important;
  background: transparent !important; -webkit-backdrop-filter: none !important; backdrop-filter: none !important;
  border: 0 !important; box-shadow: none !important; -webkit-overflow-scrolling: touch;
}
.snav-group {
  font-family: var(--sans) !important; font-size: 10px !important; font-weight: 700 !important;
  letter-spacing: 0.12em !important; text-transform: uppercase !important; text-align: left !important;
  color: var(--gray-400) !important; padding: 14px 12px 6px !important; margin: 0;
}
/* Divider line between each section head (Services / Resources / Company). */
.snav-group:not(:first-child) {
  border-top: 1px solid var(--gray-100) !important;
  margin-top: 10px !important; padding-top: 18px !important;
}
/* Divider before the CTA button. */
.snav-div { height: 1px !important; background: var(--gray-100) !important; margin: 14px 12px 4px !important; }
.snav-links a {
  display: block !important; text-align: left !important; text-decoration: none !important;
  border-radius: 8px !important; margin: 0 0 1px !important;
  transition: background 0.15s, color 0.15s;
}
.snav-links a::after { display: none !important; content: none !important; }
.snav-links a.snav-sub {
  padding: 11px 12px 11px 24px !important; min-height: 44px !important;
  display: flex !important; align-items: center !important;
  font-family: var(--sans) !important; font-size: 14px !important; font-weight: 400 !important;
  color: var(--gray-600) !important; background: transparent !important;
}
.snav-links a.snav-sub:hover { background: var(--gray-50) !important; color: var(--black) !important; }
.snav-links a.snav-top {
  padding: 10px 12px !important; min-height: 44px !important;
  display: flex !important; align-items: center !important;
  font-family: var(--sans) !important; font-size: 15px !important; font-weight: 500 !important;
  color: var(--black) !important; background: transparent !important;
}
.snav-links a.snav-top:hover { background: var(--gray-50) !important; }
/* Current page: purple + bold, so the menu shows where you are. */
.snav-links a.snav-sub.is-current,
.snav-links a.snav-top.is-current { color: var(--purple) !important; font-weight: 600 !important; }
.snav-links a.snav-cta {
  display: block !important; margin: 18px 12px 0 !important;
  padding: 17px 28px !important; text-align: center !important; white-space: nowrap !important;
  background: var(--lime) !important; color: var(--black) !important;
  font-family: var(--sans) !important; font-size: 15px !important; font-weight: 700 !important; letter-spacing: 0 !important;
  border-radius: 999px !important; text-decoration: none !important; transition: background 0.2s, transform 0.12s;
}
.snav-links a.snav-cta:hover { background: var(--lime-dark) !important; }
.snav-links a.snav-cta:active { transform: translateY(1px); }
body.snav-lock { overflow: hidden !important; }
/* Visible keyboard focus ring inside the panel. */
.snav-links a:focus-visible, .snav-close:focus-visible {
  outline: 2px solid var(--purple) !important; outline-offset: 2px !important;
}
/* Respect reduced-motion: no slide, just show/hide. */
@media (prefers-reduced-motion: reduce) {
  .snav-mobile, .snav-backdrop { transition: none !important; }
}
@media (min-width: 941px) { .snav-mobile, .snav-backdrop { display: none !important; } }

/* ── V1.7 · Brand mark (Citation Mark) in nav + footer logos ───────────────── */
.nav-logo .j6-mark,
.footer-logo .j6-mark {
  flex: none;
  height: 22px;
  width: auto;
  margin-right: 6px;
  display: block;
}
.footer-logo {
  display: inline-flex;
  align-items: center;
}
/* the mark's J / 6 glyphs render in the display serif */
.j6-mark text {
  font-family: 'Libre Baskerville', 'Times New Roman', serif;
}
@media (max-width: 640px) {
  .nav-logo .j6-mark,
  .footer-logo .j6-mark { height: 20px; }
}

/* ════════════════════════════════════════════════════════════════════
   V1.8 · Shared chrome (nav + footer partials), context-aware nav,
   dropdown a11y, social icons, grotesk stat font.
   These rules use higher specificity (.site-nav / .site-footer) so they
   win over each template's inline base styles, which load before style.css.
   ════════════════════════════════════════════════════════════════════ */

/* Stats/UI grotesk, replaces the never-loaded Neue Haas Grotesk */
:root { --haas: 'Space Grotesk', 'IBM Plex Sans', 'Helvetica Neue', Arial, sans-serif; }

/* ── Context-aware navigation ─────────────────────────────────────── */
.site-nav { transition: background .25s ease, border-color .25s ease, box-shadow .25s ease; }

/* Surface colour is owned HERE, in one place, and marked !important so it wins
 * over the legacy per-page inline nav CSS (which sets its own colours, some with
 * !important). The nav's data-surface attribute (set from the single registry in
 * site-nav.php) and the .scrolled class (added by site-chrome.js past the hero)
 * are the only inputs. Nothing else needs to touch nav colour. */

/* dark-hero pages: transparent over the hero, white text/logo */
.site-nav[data-surface="dark"]:not(.scrolled) { background: transparent !important; border-bottom-color: transparent !important; box-shadow: none !important; }
.site-nav[data-surface="dark"]:not(.scrolled) .nav-logo,
.site-nav[data-surface="dark"]:not(.scrolled) .nav-links > li > a { color: #fff !important; }
.site-nav[data-surface="dark"]:not(.scrolled) .nav-chev { color: rgba(255,255,255,0.7) !important; }
.site-nav[data-surface="dark"]:not(.scrolled) .nav-hamburger span { background: #fff !important; }

/* light-hero pages (default): frosted light bar, dark text/logo */
.site-nav:not([data-surface="dark"]):not(.scrolled) .nav-logo,
.site-nav:not([data-surface="dark"]):not(.scrolled) .nav-links > li > a { color: var(--black) !important; }
.site-nav:not([data-surface="dark"]):not(.scrolled) .nav-hamburger span { background: var(--black) !important; }

/* solidified (any surface once scrolled): frosted light bar, dark text */
.site-nav.scrolled {
  background: rgba(255,255,255,0.92) !important;
  -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px);
  border-bottom: 1px solid var(--gray-200) !important;
}
.site-nav.scrolled .nav-logo,
.site-nav.scrolled .nav-links > li > a { color: var(--black) !important; }
.site-nav.scrolled .nav-chev { color: rgba(0,0,0,0.5) !important; }
.site-nav.scrolled .nav-hamburger span { background: var(--black) !important; }

/* dropdowns: keyboard/tap parity with :hover + visible focus */
.site-nav .has-drop.open > .nav-drop,
.site-nav .has-drop:focus-within > .nav-drop { opacity: 1; visibility: visible; transform: none; pointer-events: auto; }
.site-nav a:focus-visible,
.site-nav .btn-nav-cta:focus-visible { outline: 2px solid var(--lime); outline-offset: 3px; border-radius: 4px; }

/* nav CTA, canonical pill spec */
.site-nav .btn-nav-cta {
  display: inline-flex; align-items: center; gap: 6px;
  background: var(--lime); color: var(--black);
  font-family: var(--sans); font-size: 14px; font-weight: 700; letter-spacing: .01em;
  padding: 11px 22px; border-radius: 100px; text-decoration: none;
  transition: background .2s, box-shadow .2s, transform .15s;
}
.site-nav .btn-nav-cta:hover { background: var(--lime-dark); box-shadow: 0 4px 16px rgba(194,255,0,0.25); }
.site-nav .btn-nav-cta:active { transform: scale(0.97); }

/* ── Unified footer (self-sufficient; renders identically on every page) ── */
.site-footer { background: var(--black); color: #fff; padding: 64px 0 40px; }
.site-footer .container { max-width: 1280px; margin: 0 auto; padding: 0 40px; }
.site-footer .footer-top { display: grid; grid-template-columns: 1.4fr 2.6fr; gap: 48px; padding-bottom: 40px; border-bottom: 1px solid rgba(255,255,255,0.08); }
.site-footer .footer-logo { display: inline-flex; align-items: center; color: #fff; font-family: var(--sans); font-size: 18px; font-weight: 700; letter-spacing: -0.02em; text-decoration: none; }
.site-footer .footer-logo span { color: var(--lime); font-size: 22px; }
.site-footer .footer-tagline { color: rgba(255,255,255,0.6); font-size: 14px; line-height: 1.6; margin: 16px 0 0; max-width: 34ch; }
.site-footer .footer-social { display: flex; gap: 8px; margin-top: 22px; flex-wrap: wrap; }
.site-footer .social-link { width: 36px; height: 36px; border-radius: 9px; background: rgba(255,255,255,0.06); display: inline-flex; align-items: center; justify-content: center; color: rgba(255,255,255,0.72); transition: background .15s, color .15s; }
.site-footer .social-link:hover { background: var(--lime); color: var(--black); }
.site-footer .social-link svg { display: block; }
.site-footer .footer-links { display: grid; grid-template-columns: repeat(4, 1fr); gap: 24px; }
.site-footer .footer-col-title { font-family: var(--mono, 'IBM Plex Mono', monospace); font-size: 10px; letter-spacing: .16em; text-transform: uppercase; color: var(--gray-400); margin-bottom: 14px; }
.site-footer .footer-col ul { list-style: none; margin: 0; padding: 0; }
.site-footer .footer-col li { margin-bottom: 9px; }
.site-footer .footer-col a { color: rgba(255,255,255,0.6); font-size: 14px; text-decoration: none; }
.site-footer .footer-col a:hover { color: #fff; }
.site-footer .footer-bottom { display: flex; justify-content: space-between; align-items: center; padding-top: 24px; flex-wrap: wrap; gap: 12px; }
.site-footer .footer-copy { color: rgba(255,255,255,0.4); font-size: 12px; }
.site-footer .footer-bottom-links { display: flex; gap: 20px; }
.site-footer .footer-bottom-links a { color: rgba(255,255,255,0.4); font-size: 12px; text-decoration: none; }
.site-footer .footer-bottom-links a:hover { color: #fff; }
@media (max-width: 900px) {
  .site-footer .footer-top { grid-template-columns: 1fr; gap: 32px; }
  .site-footer .footer-links { grid-template-columns: 1fr 1fr; }
  .site-footer .container { padding: 0 20px; }
}

/* ── Floating CTA bar (global, so every page carries it) ──────────── */
.float-bar { position: fixed; bottom: 32px; left: 50%; transform: translateX(-50%); z-index: 99; display: flex; align-items: center; gap: 8px; background: var(--black); border-radius: 100px; padding: 5px; box-shadow: 0 8px 32px rgba(0,0,0,0.24), 0 0 0 1px rgba(255,255,255,0.05); }
.float-pill { font-family: var(--sans); font-size: 13px; font-weight: 600; padding: 10px 24px; border-radius: 100px; cursor: pointer; text-decoration: none; transition: all 0.2s; white-space: nowrap; }
.float-primary { background: var(--lime); color: var(--black); }
.float-primary:hover { background: var(--lime-dark); }
.float-secondary { color: rgba(255,255,255,0.72); border: 1px solid rgba(255,255,255,0.18); background: rgba(255,255,255,0.04); }
.float-secondary:hover { color: var(--white); border-color: rgba(255,255,255,0.34); background: rgba(255,255,255,0.09); }
/* Mobile: match the home page exactly on EVERY page — a single, compact,
   centered lime "Book Strategy Session" pill. The `body` prefix raises
   specificity so this wins over the service pages' own float-bar rules
   (which stretch the bar edge-to-edge with .float-primary{flex:1}). */
@media (max-width: 768px) {
  body .float-bar {
    left: 50% !important; right: auto !important; transform: translateX(-50%) !important;
    width: auto !important; max-width: calc(100vw - 24px) !important;
    bottom: 16px !important; gap: 0 !important; padding: 5px !important;
  }
  body .float-secondary { display: none !important; }
  body .float-primary {
    flex: 0 0 auto !important; width: auto !important;
    padding: 12px 26px !important; font-size: 13px !important; text-align: center !important;
  }
}

/* Fix: dark-page mobile-menu CTA button had white text on lime (illegible), because
   the broad ".nav-mobile-menu a" colour rule out-specified the button's own colour.
   Force the CTA ink dark, everywhere, with higher specificity. */
.nav-mobile-menu a.nav-mobile-cta,
.nav-mobile a.nav-mobile-cta,
a.nav-mobile-cta { color: var(--black) !important; }

/* ── V1.9 · Brand LOCKUP (canonical website logo) sizing ───────────────────── */
.nav-logo .j6-lockup,
.footer-logo .j6-lockup,
.nav-mobile-logo .j6-lockup,
.site-footer .footer-logo .j6-lockup { height: 30px; width: auto; display: block; }
.j6-lockup text { font-family: 'Libre Baskerville', 'Times New Roman', serif; }
/* the lockup already contains the wordmark, so hide any stray text nodes */
.nav-logo > span, .footer-logo > span, .nav-mobile-logo > span { display: none; }
@media (max-width: 640px) {
  .nav-logo .j6-lockup,
  .footer-logo .j6-lockup,
  .nav-mobile-logo .j6-lockup,
  .site-footer .footer-logo .j6-lockup { height: 26px; }
}

/* ════════════════════════════════════════════════════════════════════
   V2.0 · Case Studies, Google Search Console style chart panels
   ════════════════════════════════════════════════════════════════════ */
.gsc-panel{border:1px solid #E2E2DC;border-radius:14px;background:#fff;overflow:hidden;box-shadow:0 8px 30px rgba(0,0,0,.05)}
.gsc-tiles{display:grid;grid-template-columns:repeat(4,1fr);border-bottom:1px solid #EEEDE9}
.gsc-tile{padding:15px 18px;border-right:1px solid #EEEDE9;position:relative;min-width:0}
.gsc-tile:last-child{border-right:none}
.gsc-tl{display:block;font-size:12px;color:#5f6368;margin-bottom:6px;white-space:nowrap;font-family:var(--sans)}
.gsc-tv{display:block;font-family:var(--haas,'Space Grotesk',sans-serif);font-weight:700;font-size:25px;color:#202124;line-height:1;letter-spacing:-.01em}
.gsc-prev{display:block;font-size:11px;color:#9aa0a6;margin-top:5px;font-family:var(--sans)}
.gsc-tile.sel{background:#faf5ff}
.gsc-tile.sel::after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:3px;background:var(--purple)}
.gsc-tile.sel .gsc-tv{color:var(--purple)}
.gsc-chart{position:relative;padding:8px 0 2px}
.gsc-svg{width:100%;height:auto;display:block}
.gsc-grid{stroke:#F0F0EC;stroke-width:1}
.gsc-yl{fill:#9aa0a6;font-size:11px;font-family:var(--sans);text-anchor:end}
.gsc-xl{fill:#9aa0a6;font-size:10px;font-family:var(--sans)}
.gsc-mark{stroke:#CFCFC9;stroke-width:1;stroke-dasharray:3 3}
.gsc-ax{position:absolute;left:48px;top:10px;font-size:10px;color:#9aa0a6;font-family:var(--sans)}
@media(max-width:620px){ .gsc-tv{font-size:20px} .gsc-tl{font-size:10px} .gsc-tile{padding:12px 12px} }

/* ── Case study pages (listing + single) ─────────────────────────── */
.cs-wrap{max-width:1160px;margin:0 auto;padding:0 40px}
.cs-serif{font-family:'Libre Baskerville',Georgia,serif;font-weight:700;letter-spacing:-.02em;line-height:1.12}
.cs-eyebrow{font-family:var(--mono,'IBM Plex Mono',monospace);font-size:11px;letter-spacing:.2em;text-transform:uppercase;color:var(--purple);display:inline-flex;align-items:center;gap:9px}
.cs-eyebrow::before{content:"";width:16px;height:2px;background:var(--lime);border-radius:2px;flex:none}
.cs-tag{display:inline-flex;align-items:center;font-family:var(--mono,monospace);font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--gray-600);border:1px solid var(--gray-200);border-radius:999px;padding:5px 11px}
.cs-tag.lime{border-color:var(--lime);color:#5a7a00;background:rgba(194,255,0,.08)}
.cs-tag.purple{border-color:var(--purple);color:var(--purple);background:rgba(124,58,237,.06)}

/* single hero */
.cs-hero{background:var(--gray-50);border-bottom:1px solid var(--gray-200);padding:calc(var(--nav-h) + 56px) 0 56px}
.cs-hero .cs-tags{display:flex;gap:8px;flex-wrap:wrap;margin:16px 0}
.cs-hero h1{font-size:clamp(34px,5vw,58px);color:var(--black);margin:8px 0 0}
.cs-hero h1 .it{font-style:italic;font-weight:400;color:var(--purple)}
.cs-hero .sub{color:var(--gray-600);font-size:18px;max-width:64ch;margin:18px 0 0;line-height:1.6}
.cs-hero .big{display:flex;align-items:baseline;gap:16px;margin-top:28px;flex-wrap:wrap}
.cs-hero .big .n{font-family:var(--haas);font-weight:700;font-size:clamp(42px,7vw,72px);color:var(--black);line-height:.9;letter-spacing:-.02em}
.cs-hero .big .n .lime{color:var(--lime-dark)}
.cs-hero .big .l{font-size:14px;color:var(--gray-600);max-width:26ch}
/* the problem (hero band) */
.cs-problem{margin:22px 0 4px;padding:16px 20px;background:#fff;border:1px solid var(--gray-200);border-left:3px solid var(--purple);border-radius:12px;max-width:72ch;display:flex;flex-direction:column;gap:6px}
.cs-problem-tag{font-family:var(--mono,monospace);font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--gray-400)}
.cs-problem-headline{font-family:'Libre Baskerville',Georgia,serif;font-weight:700;font-style:italic;font-size:clamp(20px,2.6vw,26px);color:var(--black);letter-spacing:-.01em}
.cs-problem-line{font-size:15px;color:var(--gray-600);line-height:1.55}
.cs-problem-line b{color:var(--black)}

/* business impact (dark outcome band) */
.cs-sec.cs-biz-sec{background:var(--black);border-bottom:1px solid var(--black)}
.cs-sec.cs-biz-sec .cs-eyebrow{color:var(--lime)}
.cs-sec.cs-biz-sec h2{color:#fff}
.cs-sec.cs-biz-sec h2 .it{color:var(--lime)}
.cs-sec.cs-biz-sec .cs-lead{color:var(--gray-400)}
.cs-biz{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:26px}
.cs-biz-item{display:flex;gap:14px;align-items:flex-start;padding:18px 20px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.10);border-radius:14px}
.cs-biz-mark{flex:none;width:26px;height:26px;display:grid;place-items:center;border-radius:8px;background:var(--lime);color:var(--black);font-weight:700;font-size:14px;line-height:1}
.cs-biz-text{color:#E8E8E4;font-size:15.5px;line-height:1.55}
.cs-biz-text b{color:#fff;font-weight:700}
@media(max-width:820px){.cs-biz{grid-template-columns:1fr}}

/* section rhythm */
.cs-sec{padding:64px 0;border-bottom:1px solid var(--gray-100)}
.cs-sec h2{font-family:'Libre Baskerville',Georgia,serif;font-weight:700;font-size:clamp(24px,3.4vw,34px);letter-spacing:-.02em;color:var(--black);margin:10px 0 8px}
.cs-sec h2 .it{font-style:italic;font-weight:400;color:var(--purple)}
.cs-lead{color:var(--gray-600);font-size:16px;max-width:70ch;line-height:1.65}
.cs-proof-cap{font-family:var(--mono,monospace);font-size:11px;letter-spacing:.06em;color:var(--gray-400);margin-top:12px}

/* metric row */
.cs-metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--gray-200);border:1px solid var(--gray-200);border-radius:14px;overflow:hidden;margin-top:26px}
.cs-metrics .m{background:#fff;padding:22px 20px}
.cs-metrics .m .v{font-family:var(--haas);font-weight:700;font-size:30px;color:var(--black);letter-spacing:-.01em;line-height:1}
.cs-metrics .m .l{font-size:12.5px;color:var(--gray-600);margin-top:8px;line-height:1.45}
@media(max-width:820px){.cs-metrics{grid-template-columns:1fr 1fr}}

/* lists / cards */
.cs-ul{list-style:none;margin:16px 0 0;padding:0;max-width:74ch}
.cs-ul li{position:relative;padding:11px 0 11px 26px;border-bottom:1px solid var(--gray-100);color:var(--gray-600);font-size:15.5px;line-height:1.55}
.cs-ul li::before{content:"";position:absolute;left:2px;top:19px;width:9px;height:9px;border-radius:50%;background:var(--lime)}
.cs-ul li b{color:var(--black)}
.cs-cards{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-top:22px}
@media(max-width:820px){.cs-cards{grid-template-columns:1fr}}
.cs-card{border:1px solid var(--gray-200);border-radius:14px;padding:24px;background:#fff}
.cs-card .t{font-family:'Libre Baskerville',serif;font-weight:700;font-size:18px;color:var(--black);margin-bottom:8px}
.cs-card .d{font-size:14.5px;color:var(--gray-600);line-height:1.6}

/* timeline */
.cs-time{margin-top:22px;border-left:2px solid var(--gray-200);max-width:760px}
.cs-time .row{position:relative;padding:0 0 22px 26px}
.cs-time .row::before{content:"";position:absolute;left:-7px;top:4px;width:12px;height:12px;border-radius:50%;background:var(--lime);border:3px solid #fff;box-shadow:0 0 0 1px var(--gray-200)}
.cs-time .k{font-family:var(--mono,monospace);font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--purple)}
.cs-time .v{color:var(--black);font-size:15.5px;margin-top:3px}

/* DR authority bar */
.cs-dr{display:flex;align-items:center;gap:22px;flex-wrap:wrap;margin-top:20px;border:1px solid var(--gray-200);border-radius:14px;padding:24px;background:#fff}
.cs-dr .chip{text-align:center}
.cs-dr .chip .n{font-family:var(--haas);font-weight:700;font-size:40px;color:var(--black);line-height:1}
.cs-dr .chip .n.up{color:var(--purple)}
.cs-dr .chip .c{font-family:var(--mono,monospace);font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--gray-400);margin-top:6px}
.cs-dr .arrow{font-size:26px;color:var(--lime-dark)}
.cs-dr .meta{flex:1;min-width:200px;font-size:14px;color:var(--gray-600);line-height:1.55}
.cs-dr .meta .kv{font-family:var(--mono,monospace);font-size:11px;color:var(--gray-400);letter-spacing:.08em;text-transform:uppercase;margin-bottom:6px}

/* quote */
.cs-quote{background:var(--purple);color:#fff;border-radius:18px;padding:40px 44px;margin-top:8px}
.cs-quote p{font-family:'Libre Baskerville',serif;font-style:italic;font-size:clamp(20px,2.6vw,28px);line-height:1.4;margin:0}
.cs-quote .a{font-family:var(--mono,monospace);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:rgba(255,255,255,.7);margin-top:18px}

/* cta */
.cs-cta{background:var(--black);color:#fff;text-align:center;padding:72px 24px}
.cs-cta h2{font-family:'Libre Baskerville',serif;font-weight:700;font-size:clamp(28px,4vw,44px);color:#fff}
.cs-cta h2 .it{font-style:italic;font-weight:400;color:#b18cff}
.cs-cta p{color:rgba(255,255,255,.6);max-width:52ch;margin:14px auto 26px}
.cs-btn{display:inline-flex;align-items:center;gap:8px;background:var(--lime);color:#0A0A0A;font-weight:700;font-size:15px;padding:15px 30px;border-radius:100px;text-decoration:none}
.cs-btn:hover{background:var(--lime-dark)}
.cs-btn.ghost{background:transparent;color:#fff;border:1.5px solid rgba(255,255,255,.4);margin-left:10px}

/* listing grid */
.cs-list{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-top:36px}
@media(max-width:860px){.cs-list{grid-template-columns:1fr}}
.cs-item{display:block;border:1px solid var(--gray-200);border-radius:18px;overflow:hidden;background:#fff;text-decoration:none;color:inherit;transition:transform .25s ease,box-shadow .25s ease;position:relative}
.cs-item:hover{transform:translateY(-4px);box-shadow:0 18px 46px rgba(0,0,0,.09)}
.cs-item::before{content:"";position:absolute;top:0;left:0;right:0;height:3px;background:var(--lime);transform:scaleX(0);transform-origin:left;transition:transform .3s ease;z-index:2}
.cs-item:hover::before{transform:scaleX(1)}
.cs-item .pad{padding:26px 26px 8px}
.cs-item .tags{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:14px}
.cs-item .client{font-family:var(--mono,monospace);font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--gray-400)}
.cs-item .stat{font-family:var(--haas);font-weight:700;font-size:44px;color:var(--black);line-height:1;margin:6px 0 6px;letter-spacing:-.02em}
.cs-item .stat.pur{color:var(--purple)} .cs-item .stat.lim{color:#4e6a00}
.cs-item .desc{font-size:14px;color:var(--gray-600);line-height:1.55;min-height:44px}
.cs-item .arrow{position:absolute;top:22px;right:22px;width:40px;height:40px;border-radius:50%;border:1px solid var(--gray-200);display:flex;align-items:center;justify-content:center;color:var(--black);transition:.2s}
.cs-item:hover .arrow{background:var(--lime);border-color:var(--lime)}
.cs-item .chart-mini{border-top:1px solid var(--gray-100);background:var(--gray-50);line-height:0}
/* the mini chart div also carries .gsc-panel (JS hook); strip the full-panel box look */
.cs-item .chart-mini.gsc-panel{border:none;border-radius:0;box-shadow:none;overflow:hidden;background:var(--gray-50)}
.cs-item .chart-mini .gsc-svg{display:block;width:100%;height:auto}
.cs-item .soon-chart{height:116px;border-top:1px solid var(--gray-100);display:flex;align-items:center;justify-content:center;
  background:var(--gray-50);font-family:var(--mono,monospace);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--gray-400)}
.cs-item.soon{opacity:.6;pointer-events:none}
.cs-item.soon .arrow{border-style:dashed}

/* home case cards are now links */
a.case-card{text-decoration:none;color:inherit;display:block}

/* ================================================================
   CASE STUDY ACCESS GATE, lead-capture + OTP modal
   ================================================================ */
/* Blur + lock the page while gated */
html.j6v-gated, body.j6v-gated{overflow:hidden!important}
body.j6v-gated .site-nav,
body.j6v-gated header,
body.j6v-gated main,
body.j6v-gated section,
body.j6v-gated .site-footer,
body.j6v-gated .float-bar{filter:blur(9px);-webkit-filter:blur(9px);pointer-events:none;user-select:none}
.j6v-gate{position:fixed;inset:0;z-index:9999;display:flex;align-items:center;justify-content:center;padding:20px;opacity:1;transition:opacity .4s ease}
.j6v-gate.j6v-gate-hide{opacity:0;pointer-events:none}
.j6v-gate-backdrop{position:absolute;inset:0;background:rgba(10,10,10,.55);backdrop-filter:saturate(120%) blur(2px);-webkit-backdrop-filter:saturate(120%) blur(2px)}
.j6v-gate-card{position:relative;width:100%;max-width:460px;background:#fff;border:1px solid var(--gray-200,#E2E2DC);border-radius:20px;box-shadow:0 30px 80px rgba(10,10,10,.35);padding:34px 32px 28px;font-family:var(--sans,'IBM Plex Sans',sans-serif);animation:j6vGateIn .45s cubic-bezier(.16,1,.3,1)}
@keyframes j6vGateIn{from{opacity:0;transform:translateY(14px) scale(.98)}to{opacity:1;transform:none}}
.j6v-gate-eyebrow{font-family:var(--mono,'IBM Plex Mono',monospace);font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--gray-400,#A3A39A)}
.j6v-gate-h{font-family:'Libre Baskerville',Georgia,serif;font-weight:700;font-size:26px;line-height:1.15;letter-spacing:-.01em;color:var(--black,#0A0A0A);margin:10px 0 8px}
.j6v-gate-h .it{font-style:italic;font-weight:400;color:var(--purple,#7C3AED)}
.j6v-gate-sub{font-size:14.5px;line-height:1.55;color:var(--gray-600,#666660);margin:0 0 20px}
.j6v-gate-sub strong{color:var(--black,#0A0A0A)}
.j6v-gate-form{display:flex;flex-direction:column;gap:12px}
.j6v-gate-row{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.j6v-gate-field{display:flex;flex-direction:column;gap:6px;min-width:0}
.j6v-gate-field span{font-size:12px;font-weight:600;color:var(--gray-600,#666660)}
.j6v-gate-field input{width:100%;font-family:inherit;font-size:15px;color:var(--black,#0A0A0A);background:var(--gray-50,#F9F9F7);border:1px solid var(--gray-200,#E2E2DC);border-radius:11px;padding:12px 14px;outline:none;transition:border-color .15s,box-shadow .15s}
.j6v-gate-field input:focus{border-color:var(--purple,#7C3AED);box-shadow:0 0 0 3px rgba(124,58,237,.14);background:#fff}
.j6v-gate-btn{margin-top:6px;font-family:inherit;font-size:15px;font-weight:600;color:var(--black,#0A0A0A);background:var(--lime,#C2FF00);border:none;border-radius:100px;padding:14px 22px;cursor:pointer;transition:transform .12s,filter .15s}
.j6v-gate-btn:hover{filter:brightness(1.04)}
.j6v-gate-btn:active{transform:translateY(1px)}
.j6v-gate-btn:disabled{opacity:.6;cursor:default}
.j6v-gate-fine{font-size:11.5px;line-height:1.5;color:var(--gray-400,#A3A39A);margin:12px 0 0;text-align:center}
.j6v-gate-err{font-size:13px;color:#b3261e;background:#fdecea;border:1px solid #f7c9c4;border-radius:10px;padding:9px 12px}
.j6v-gate-back{align-self:flex-start;background:none;border:none;color:var(--gray-600,#666660);font-family:var(--mono,monospace);font-size:12px;letter-spacing:.04em;cursor:pointer;padding:0 0 10px}
.j6v-gate-back:hover{color:var(--black,#0A0A0A)}
.j6v-gate-link{background:none;border:none;color:var(--purple,#7C3AED);font:inherit;font-size:11.5px;font-weight:600;cursor:pointer;padding:0;text-decoration:underline}
.j6v-gate-otp{display:grid;grid-template-columns:repeat(6,1fr);gap:8px;margin:4px 0 2px}
.j6v-gate-otp input{width:100%;aspect-ratio:1/1.15;text-align:center;font-family:var(--haas,'Space Grotesk',sans-serif);font-weight:600;font-size:24px;color:var(--black,#0A0A0A);background:var(--gray-50,#F9F9F7);border:1px solid var(--gray-200,#E2E2DC);border-radius:11px;outline:none;transition:border-color .15s,box-shadow .15s}
.j6v-gate-otp input:focus{border-color:var(--purple,#7C3AED);box-shadow:0 0 0 3px rgba(124,58,237,.14);background:#fff}
.j6v-gate-check{width:54px;height:54px;margin:4px 0 4px;display:grid;place-items:center;border-radius:50%;background:var(--lime,#C2FF00);color:var(--black,#0A0A0A);font-size:26px;font-weight:700}
@media(max-width:520px){.j6v-gate-card{padding:26px 20px 22px}.j6v-gate-otp{gap:6px}.j6v-gate-otp input{font-size:20px}}
