/*
 * PlotWatch Standalone — Site-wide styles (Phase 9)
 * Design tokens copied verbatim from the real WordPress theme's
 * --pw-* custom properties (wp-content/themes/astra-child/style.css,
 * confirmed 2026-09-03) — same source checkout.css (Phase 8) already
 * uses, kept self-contained here rather than @import'd, matching that
 * file's own convention.
 */

:root {
    --pw-navy: #040926;
    --pw-navy-tint: #10193f;
    --pw-red: #ff040a;
    --pw-white: #ffffff;
    --pw-cream: #f7f4ef;
    --pw-grey-bg: #f5f6fa;
    --pw-grey-bg-alt: #eef1f8;
    --pw-grey-line: #e1e4ee;
    --pw-grey-text: #6b7280;
    --pw-grey-text-soft: #94a0b8;
    --pw-radius-sm: 8px;
    --pw-radius-md: 14px;
    --pw-radius-lg: 22px;
    --pw-shadow-sm: 0 2px 10px rgba(4,9,38,0.06);
    --pw-shadow-md: 0 14px 34px rgba(4,9,38,0.08);
    --pw-shadow-lg: 0 26px 64px rgba(4,9,38,0.16);
    --pw-container: 1200px;
    --pw-green: #1c8a4b;
    --pw-header-h: 68px;
    --pw-font-display: 'mazzard', 'Inter', sans-serif;
}

* { box-sizing: border-box; }
/* 2026-09-18 (release fix — "page jumps to top" bug): this rule was
   unconditional (`html { scroll-behavior: smooth; }`) — present ONLY in
   standalone, confirmed absent from the real WordPress source entirely.
   Root cause: Plan Finder submit / OTP verify both do a REAL full-page
   navigation (window.location.href = .../?pw_enquiry=&pw_token=#find-
   your-plan, planfinder.js), not an AJAX swap. On a fresh page load, the
   BROWSER'S OWN NATIVE "scroll to the URL's #fragment" step (not
   something any of this project's own JS triggers or can pass an
   explicit `behavior` option to) respects this global CSS default —
   so instead of landing at #find-your-plan instantly, the page visibly
   painted at the top first and then smooth-animated down to it. Gated
   behind a class instead, added by site.js (see there) only AFTER that
   native initial-load scroll has already resolved — so the very same
   desired smooth behavior still applies to a real user click on an
   in-page nav link (Why PlotWatch/Packages/Contact), just not to the
   page's own initial-load landing position. No JS scroll/redirect logic
   was touched — this was a pure CSS timing issue. */
html.pw-smooth-scroll { scroll-behavior: smooth; }
html, body { margin: 0; padding: 0; overflow-x: hidden; }

body.pw-page {
    background: var(--pw-white);
    color: var(--pw-navy);
    font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
    -webkit-font-smoothing: antialiased;
    padding-top: var(--pw-header-h);
}

h1, h2, h3, h4 { font-family: 'Inter', sans-serif; font-weight: 800; color: var(--pw-navy); margin: 0 0 10px; line-height: 1.2; }
p { line-height: 1.65; color: var(--pw-grey-text); margin: 0 0 12px; }
a { color: var(--pw-red); text-decoration: none; }
img { max-width: 100%; display: block; }

/* Accessibility: visible focus state everywhere */
a:focus-visible, button:focus-visible, input:focus-visible, select:focus-visible, textarea:focus-visible {
    outline: 3px solid var(--pw-red);
    outline-offset: 2px;
}
.pw-skip-hidden { position: absolute; left: -9999px; }

.pw-section-inner { max-width: var(--pw-container); margin: 0 auto; padding: 0 20px; }
.pw-section { padding: 64px 0; }
.pw-section-head { max-width: 640px; margin: 0 auto 40px; text-align: center; }
.pw-eyebrow { display: inline-block; font-size: 12px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--pw-red); margin-bottom: 10px; }
.pw-section-head p { margin: 0; }

.pw-btn-primary, .pw-btn-secondary, .pw-link-btn {
    display: inline-flex; align-items: center; justify-content: center; gap: 8px;
    padding: 13px 24px; border-radius: var(--pw-radius-sm); font-weight: 700; font-size: 15px;
    border: none; cursor: pointer; text-decoration: none;
}
.pw-btn-primary { background: var(--pw-red); color: var(--pw-white); }
.pw-btn-primary:hover { filter: brightness(0.92); }
.pw-btn-secondary { background: var(--pw-white); color: var(--pw-navy); border: 1.5px solid var(--pw-grey-line); }
.pw-btn-secondary:hover { background: var(--pw-grey-bg); }
.pw-link-btn { background: none; padding: 0; color: var(--pw-red); font-weight: 600; border: none; }

/* =====================================================================
 * HEADER — reproduced from the real WordPress source verbatim
 * (astra-child/style.css, .pw-redesign-site-header* rules, read fresh
 * for Phase 2 of the UI-fidelity correction). Class names kept as
 * pw-site-* (this project's own established prefix) rather than
 * pw-redesign-* (WordPress's prefix) since these are genuinely
 * different files/classes — only the VISUAL RESULT (colors, spacing,
 * fonts, breakpoints, exact px values) is reproduced, not the source
 * files themselves.
 * ===================================================================== */
.pw-site-header {
    position: fixed; top: 0; left: 0; right: 0; z-index: 100;
    background: rgba(255,255,255,0.88);
    backdrop-filter: saturate(160%) blur(14px);
    -webkit-backdrop-filter: saturate(160%) blur(14px);
    border-bottom: 1px solid rgba(4,9,38,0.06);
    transition: background 0.25s ease, box-shadow 0.25s ease;
}
.pw-site-header.is-scrolled {
    background: rgba(255,255,255,0.98);
    border-bottom-color: var(--pw-grey-line);
    box-shadow: var(--pw-shadow-sm);
}
.pw-site-header-inner {
    padding: 12px 24px;
    display: flex; align-items: center; justify-content: space-between;
    gap: 24px;
    position: relative;
}
.pw-site-logo { display: flex; align-items: center; text-decoration: none !important; flex: 0 1 auto; min-width: 0; overflow: hidden; }
.pw-site-logo img { height: 40px; width: auto; max-width: 100%; display: block; }
.pw-site-nav { display: flex; align-items: center; gap: 26px; }
.pw-site-nav a { position: relative; color: var(--pw-navy); font-weight: 500; font-size: 13.5px; text-decoration: none !important; white-space: nowrap; padding: 4px 0; }
.pw-site-nav a::after {
    content: ""; position: absolute; left: 0; right: 0; bottom: -2px; height: 2px;
    background: var(--pw-red); border-radius: 2px; transform: scaleX(0); transform-origin: center;
    transition: transform 0.25s ease;
}
.pw-site-nav a:hover { color: var(--pw-red); }
.pw-site-nav a:hover::after, .pw-site-nav a.is-active::after { transform: scaleX(1); }
.pw-header-actions { display: flex; align-items: center; gap: 14px; flex: 0 0 auto; }
.pw-header-cart-toggle {
    position: relative; flex: 0 0 auto; width: 40px; height: 40px;
    border: 1px solid var(--pw-grey-line); border-radius: 50%;
    background: var(--pw-white); color: var(--pw-navy);
    display: flex; align-items: center; justify-content: center; font-size: 15px;
    cursor: pointer; text-decoration: none !important;
    transition: border-color 0.2s ease, color 0.2s ease;
}
.pw-header-cart-toggle:hover { border-color: var(--pw-red); color: var(--pw-red); }
.pw-header-cart-badge {
    position: absolute; top: -5px; right: -5px; min-width: 17px; height: 17px; padding: 0 4px;
    border-radius: 999px; background: var(--pw-red); color: var(--pw-white);
    font-size: 10px; font-weight: 800; line-height: 17px; text-align: center;
}
a.pw-nav-cta {
    background: var(--pw-red) !important; color: var(--pw-white) !important;
    border-radius: var(--pw-radius-sm) !important; padding: 11px 22px !important;
    font-weight: 700; font-size: 13.5px; text-decoration: none !important;
    box-shadow: 0 8px 20px rgba(255,4,10,0.28) !important;
    transition: transform 0.25s ease, box-shadow 0.25s ease;
    display: inline-flex; align-items: center; white-space: nowrap;
}
a.pw-nav-cta:hover { transform: translateY(-2px); box-shadow: 0 12px 26px rgba(255,0,0,0.36); color: var(--pw-white) !important; }
.pw-nav-account { color: var(--pw-navy) !important; font-weight: 600; font-size: 13.5px; }
.pw-nav-logout-form { display: inline; }
.pw-nav-toggle {
    display: none; flex-direction: column; justify-content: center; align-items: center; gap: 5px;
    width: 40px; height: 40px; background: transparent; border: 1px solid var(--pw-grey-line);
    border-radius: var(--pw-radius-sm); cursor: pointer; flex: 0 0 auto;
}
.pw-nav-toggle span { display: block; width: 18px; height: 2px; background: var(--pw-navy); transition: transform 0.25s ease, opacity 0.25s ease; }
.pw-nav-toggle[aria-expanded="true"] span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.pw-nav-toggle[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
.pw-nav-toggle[aria-expanded="true"] span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

/* =====================================================================
 * FOOTER — reproduced from the real WordPress source (footer.php +
 * style.css .pw-redesign-site-footer* rules): 3-column grid (brand+
 * social / Reach Us / Quick Links), real social links, real single
 * phone number, second copyright line. id="contact" so every "Contact"
 * nav link's #contact href scrolls here, exactly like the real site.
 * ===================================================================== */
.pw-site-footer { background: var(--pw-navy); color: var(--pw-white); padding: 64px 0 0; margin-top: 40px; }
.pw-footer-grid { max-width: var(--pw-container); margin: 0 auto; padding: 0 24px; display: grid; grid-template-columns: 1.3fr 1fr 1fr; gap: 40px; }
.pw-footer-brand img { height: 34px; margin-bottom: 16px; }
.pw-footer-tagline { color: rgba(255,255,255,0.65); font-size: 13.5px; line-height: 1.6; max-width: 320px; }
.pw-footer-social { display: flex; gap: 12px; margin-top: 18px; }
.pw-footer-social a {
    width: 36px; height: 36px; border-radius: 50%; border: 1px solid rgba(255,255,255,0.2);
    display: flex; align-items: center; justify-content: center; color: var(--pw-white);
    text-decoration: none !important; transition: background 0.2s ease, border-color 0.2s ease;
}
.pw-footer-social a:hover { background: var(--pw-red); border-color: var(--pw-red); }
.pw-footer-heading { color: var(--pw-white); font-size: 14px; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 18px; font-weight: 700; }
.pw-footer-contact-info { list-style: none; margin: 0; padding: 0; }
.pw-footer-contact-info li { display: flex; align-items: flex-start; gap: 10px; margin-bottom: 14px; font-size: 13.5px; color: rgba(255,255,255,0.75); line-height: 1.6; }
.pw-footer-contact-info li i { margin-top: 3px; color: var(--pw-red); flex-shrink: 0; }
.pw-footer-contact-info a { color: rgba(255,255,255,0.75); text-decoration: none !important; }
.pw-footer-contact-info a:hover { color: var(--pw-white); }
.pw-footer-list { list-style: none; margin: 0; padding: 0; }
.pw-footer-list li { margin-bottom: 12px; }
.pw-footer-list a { color: rgba(255,255,255,0.75); font-size: 13.5px; text-decoration: none !important; }
.pw-footer-list a:hover { color: var(--pw-white); }
.pw-site-footer-bottom {
    border-top: 1px solid rgba(255,255,255,0.12); margin-top: 44px; padding: 20px 24px;
    display: flex; justify-content: space-between; flex-wrap: wrap; gap: 8px;
    max-width: var(--pw-container); margin-left: auto; margin-right: auto;
}
.pw-site-footer-bottom span { color: rgba(255,255,255,0.5); font-size: 12px; }

/* ============================= HERO ============================= */
.pw-hero { position: relative; height: 88vh; min-height: 480px; max-height: 780px; overflow: hidden; }
.pw-hero-scene { position: absolute; inset: 0; opacity: 0; transition: opacity 1.2s ease; }
.pw-hero-scene.is-active { opacity: 1; }
.pw-hero-scene-photo { position: absolute; inset: 0; background-size: cover; background-position: center; }
/* 2026-09-18 (release fix): standalone's own gradient (peaking at 0.75
   opacity, no transparent zone at all) was substantially darker than
   the real WordPress source's own .pw-hero-scene-scrim (astra-child/
   style.css:1775-1779) — its exact, current, real value is used here
   verbatim: peaks at 0.36 near the bottom, fully transparent by the
   image's upper half. Ported together with the matching text-shadow
   below (WP's own .pw-redesign-hero-content, style.css:1809-1816) —
   WP's own comment explains why both changed together: "with the
   scrim now much lighter, this shadow is doing most of the legibility
   work instead of a dark background wash." Applying the scrim value
   alone without the shadow would risk exactly the readability problem
   the explicit instruction says to avoid. */
.pw-hero-scene-scrim { position: absolute; inset: 0; background: linear-gradient(0deg, rgba(4,9,38,0.36) 0%, rgba(4,9,38,0.12) 32%, rgba(4,9,38,0) 55%); }
.pw-hero-inner { position: relative; z-index: 2; height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; padding: 0 20px; text-shadow: 0 2px 18px rgba(0,0,0,0.6), 0 1px 4px rgba(0,0,0,0.65); }
.pw-hero-inner h1 { color: var(--pw-white); font-size: clamp(30px, 5.2vw, 56px); max-width: 900px; margin-bottom: 24px; }
.pw-hero-accent { color: var(--pw-red); }
.pw-hero-ctas { display: flex; gap: 14px; flex-wrap: wrap; justify-content: center; }
.pw-hero-progress { position: absolute; bottom: 22px; left: 0; right: 0; display: flex; justify-content: center; gap: 8px; z-index: 2; }
.pw-hero-progress button { width: 8px; height: 8px; border-radius: 50%; border: none; background: rgba(255,255,255,0.4); cursor: pointer; padding: 0; }
.pw-hero-progress button.is-active { background: var(--pw-red); width: 22px; border-radius: 5px; }

/* =====================================================================
 * WHY PLOTWATCH — photo pinned-scroll story (item 4). Reproduced from
 * the real WordPress source (why-plotwatch.php + its .pw-why-story*
 * CSS + initWhyPlotwatchScrollStory() in plotwatch-redesign.js, all
 * read fresh) — same 5 real photos, same mechanic (a tall track +
 * JS-toggled position:fixed/absolute "stage", not a CSS-only trick),
 * same intro banner. .pw-why-progress exists in the markup only to
 * match the real DOM shape — it's display:none in the real site too
 * (hidden per an explicit real decision, not omitted by me).
 * ===================================================================== */
.pw-why-story { position: relative; background: var(--pw-navy); }
.pw-why-intro { position: relative; padding: 48px 24px; display: flex; align-items: center; justify-content: center; overflow: hidden; background: var(--pw-white); }
.pw-why-intro-content { position: relative; z-index: 1; display: flex; align-items: center; justify-content: center; flex-wrap: wrap; gap: 18px; padding: 0 24px; }
.pw-why-intro-content h2 { color: var(--pw-navy); font-family: var(--pw-font-display); font-weight: 700; font-size: clamp(22px, 3.2vw, 36px); line-height: 1.15; margin: 0; }
.pw-why-intro-accent { color: var(--pw-red); }
.pw-why-intro-scroll {
    display: flex; align-items: center; justify-content: center; flex: 0 0 auto;
    width: 40px; height: 40px; border-radius: 50%; background: var(--pw-red); border: 0; color: var(--pw-white);
    font-size: 15px; cursor: pointer; box-shadow: 0 8px 20px -6px rgba(0,0,0,0.3);
    animation: pw-why-intro-scroll-bounce 1.8s ease-in-out infinite;
}
.pw-why-intro-scroll:hover { background: var(--pw-navy); }
@keyframes pw-why-intro-scroll-bounce { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(5px); } }
@media (prefers-reduced-motion: reduce) { .pw-why-intro-scroll { animation: none; } }

.pw-why-story-track { position: relative; height: 500vh; background: var(--pw-navy); }
.pw-why-story-stage { position: absolute; top: 0; left: 0; width: 100%; height: 100vh; overflow: hidden; background: var(--pw-navy); }
.pw-why-scene {
    position: absolute; inset: 0; opacity: 0; visibility: hidden; transform: scale(1.04);
    transition: opacity 0.8s cubic-bezier(0.16,1,0.3,1), transform 0.9s cubic-bezier(0.16,1,0.3,1), visibility 0s linear 0.8s;
}
.pw-why-scene.is-active { opacity: 1; visibility: visible; transform: scale(1); z-index: 2; transition: opacity 0.8s cubic-bezier(0.16,1,0.3,1), transform 0.9s cubic-bezier(0.16,1,0.3,1), visibility 0s linear 0s; }
.pw-why-scene-visual { position: absolute; inset: 0; overflow: hidden; background: var(--pw-navy); }
.pw-why-scene-visual::after { content: ""; position: absolute; inset: 0; z-index: 5; box-shadow: inset 0 0 0 3px var(--pw-red); pointer-events: none; }
.pw-why-scene.is-active .pw-why-scene-visual { animation: pw-why-kenburns 16s ease-out forwards; }
@keyframes pw-why-kenburns { from { transform: scale(1); } to { transform: scale(1.06); } }
.pw-why-scene-photo { position: absolute; inset: 0; display: block; background-color: var(--pw-navy); background-repeat: no-repeat; background-position: center; background-size: cover; transform: scale(1.04); }
/* 2026-09-18 (release fix): this is the "inner-page hero/banner"
   overlay ("Field Inspection" is Why-PlotWatch scene 01) — reduced
   from the real WordPress source's own value (byte-identical
   otherwise: astra-child/style.css:2325-2328, whose own comment there
   says this scrim is intentionally "the primary contrast mechanism"
   for its left-side text) to a modestly lighter one, per explicit
   request. Deliberate deviation from WP parity, not a standalone bug —
   each text element here already carries its own text-shadow
   (.pw-why-scene-number/-label/h3/p, unchanged) as a second layer of
   legibility, so a moderate (not full) reduction was chosen rather
   than matching the hero's much larger cut. Blog/Contact/Packages have
   no equivalent overlay component — nothing to change there. */
.pw-why-scene-scrim { position: absolute; inset: 0; background: linear-gradient(90deg, rgba(4,9,38,0.5) 0%, rgba(4,9,38,0.28) 24%, rgba(4,9,38,0.1) 46%, rgba(4,9,38,0) 62%); pointer-events: none; }
.pw-why-scene-content { position: absolute; z-index: 3; left: 5vw; bottom: 9vh; max-width: 480px; color: var(--pw-white); }
.pw-why-scene-number { display: block; font-family: var(--pw-font-display); font-size: 26px; font-weight: 800; color: var(--pw-red); margin-bottom: 8px; text-shadow: 0 1px 6px rgba(0,0,0,0.85); }
.pw-why-scene-label { display: block; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.07em; color: rgba(255,255,255,0.9); margin-bottom: 12px; text-shadow: 0 1px 6px rgba(0,0,0,0.85); }
.pw-why-scene-content h3 { color: #ffffff; font-family: var(--pw-font-display); font-size: clamp(34px, 4.4vw, 56px); font-weight: 700; line-height: 1.12; margin: 0 0 16px; text-shadow: 0 2px 18px rgba(0,0,0,0.65), 0 1px 4px rgba(0,0,0,0.7); }
.pw-why-scene-accent { color: var(--pw-red); }
.pw-why-scene-content p { font-size: 16px; line-height: 1.6; color: rgba(255,255,255,0.92); font-weight: 400; margin: 0; text-shadow: 0 1px 8px rgba(0,0,0,0.75); }
.pw-why-progress { display: none; }

@media (max-width: 900px) { .pw-why-intro { padding: 32px 20px; } .pw-why-intro-scroll { width: 34px; height: 34px; } }
@media (max-width: 640px) {
    .pw-why-scene-content { left: 6vw; right: 6vw; bottom: 8vh; max-width: none; }
    /* 2026-09-21 (mobile fix, revised): direct per-scene background-image
       rules using the data-scene attribute already on .pw-why-scene —
       replaces an earlier version that read the mobile URL from a CSS
       custom property set inline via style="--pw-why-mobile-photo:...".
       That indirection couldn't be confirmed reliable and added a moving
       part with no real benefit over a plain, direct rule per scene (the
       same mechanism the desktop background-image already uses
       successfully) — five explicit rules below, one per real scene.
       background-size:contain (not cover): the full portrait mobile
       photo is always visible with no left/right crop — the mobile
       photos were shot specifically for this frame, unlike the desktop
       landscape crops "cover" is still correct for.
       transform/animation reset to none: .pw-why-scene-photo's own base
       rule has a permanent scale(1.04), and .pw-why-scene.is-active
       .pw-why-scene-visual runs a further scale(1.06) Ken Burns
       animation — both are extra zoom on top of "cover"'s own crop,
       which "contain" doesn't need and would otherwise still crop into
       the image. */
    .pw-why-scene-photo { background-size: contain !important; transform: none !important; }
    .pw-why-scene.is-active .pw-why-scene-visual { animation: none !important; transform: none !important; }
    .pw-why-scene[data-scene="1"] .pw-why-scene-photo { background-image: url(/assets/images/why-scene-mobile-1.webp) !important; }
    .pw-why-scene[data-scene="2"] .pw-why-scene-photo { background-image: url(/assets/images/why-scene-mobile-2.webp) !important; }
    .pw-why-scene[data-scene="3"] .pw-why-scene-photo { background-image: url(/assets/images/why-scene-mobile-3.webp) !important; }
    .pw-why-scene[data-scene="4"] .pw-why-scene-photo { background-image: url(/assets/images/why-scene-mobile-4.webp) !important; }
    .pw-why-scene[data-scene="5"] .pw-why-scene-photo { background-image: url(/assets/images/why-scene-mobile-5.webp) !important; }
}

/* =====================================================================
 * WHY PLOTWATCH — risk map (item 5). Reproduced from the real
 * why-plotwatch-editorial.php + its .pw-why-map* CSS: an 8-point
 * compass grid (CSS Grid named areas) around a central plot SVG icon,
 * not a plain 4-column card grid.
 * ===================================================================== */
.pw-why-map {
    position: relative; max-width: 860px; margin: 16px auto 0;
    display: grid; grid-template-columns: minmax(0,1fr) auto minmax(0,1fr);
    grid-template-areas: "top-left top top-right" "left center right" "bottom-left bottom bottom-right";
    align-items: center; justify-items: center; column-gap: 16px; row-gap: 10px;
}
.pw-why-map::before { content: ""; position: absolute; z-index: 0; background: var(--pw-grey-line); left: 50%; top: 6%; bottom: 6%; width: 1px; transform: translateX(-50%); }
/* 2026-09-18 (release fix): the matching ::after horizontal divider
   (top:50%, spanning the full width through the center Plot graphic)
   was removed per explicit request — confirmed present with the exact
   same value in the real WordPress source (astra-child/style.css:2956-
   2962) too, so this is a deliberate visual deviation from strict WP
   parity, not a standalone-only bug. The vertical divider above is
   untouched, and no new border/separator was added in its place. */
.pw-why-map-item { position: relative; z-index: 1; max-width: 190px; text-align: center; padding: 4px; }
.pw-why-map-item--top { grid-area: top; }
.pw-why-map-item--left { grid-area: left; }
.pw-why-map-item--right { grid-area: right; }
.pw-why-map-item--bottom { grid-area: bottom; }
.pw-why-map-item--top-left { grid-area: top-left; }
.pw-why-map-item--top-right { grid-area: top-right; }
.pw-why-map-item--bottom-left { grid-area: bottom-left; }
.pw-why-map-item--bottom-right { grid-area: bottom-right; }
.pw-why-map-item-head { display: flex; align-items: center; justify-content: center; gap: 7px; margin-bottom: 3px; }
.pw-why-map-number { font-family: var(--pw-font-display); font-size: 15px; font-weight: 700; letter-spacing: 0.04em; color: var(--pw-red); line-height: 1; }
.pw-why-map-icon { font-size: 14px; color: var(--pw-navy); line-height: 1; }
.pw-why-map-item h3 { color: var(--pw-navy); font-size: 14.5px; font-weight: 700; margin: 0; line-height: 1.2; }
.pw-why-map-item p { color: var(--pw-grey-text); font-size: 12px; line-height: 1.38; margin: 0; }
.pw-why-map-center { grid-area: center; position: relative; z-index: 1; width: 104px; display: flex; flex-direction: column; align-items: center; gap: 6px; }
.pw-why-map-plot-svg { display: block; width: 100%; height: auto; overflow: visible; }
.pw-why-map-plot-label { font-family: var(--pw-font-display); font-size: 10px; font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase; color: var(--pw-navy); }
.pw-why-map-plot-shape { fill: var(--pw-grey-bg); stroke: var(--pw-red); stroke-width: 2.5; stroke-dasharray: 5 4; stroke-linejoin: round; }
.pw-why-map-plot-pin { fill: var(--pw-red); stroke: var(--pw-white); stroke-width: 1.5; }
@media (max-width: 640px) {
    .pw-why-map {
        grid-template-columns: 1fr; grid-template-areas: "top" "top-left" "top-right" "left" "center" "right" "bottom-left" "bottom-right" "bottom";
        row-gap: 22px;
    }
    .pw-why-map::before, .pw-why-map::after { display: none; }
    .pw-why-map-item { max-width: none; }
}

/* ============================= HOW IT WORKS ============================= */
.pw-step-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
.pw-step-card { background: var(--pw-white); border: 1px solid var(--pw-grey-line); border-radius: var(--pw-radius-md); padding: 26px; box-shadow: var(--pw-shadow-sm); position: relative; }
/* 2026-09-18 (release fix): color was var(--pw-grey-bg-alt) — a
   background-grey value misused as a text color, reading as nearly
   invisible light grey. The real WordPress source's own equivalent
   element (.pw-redesign-how-step-number, astra-child/style.css:2737-
   2754) has this exact same history documented in its own code
   comment: "reported twice before finding this root cause" — a
   translucent/pale attempt at red also read as grey there, and the
   real, live fix is this specific solid light-red tint, not the
   stronger --pw-red brand variable. Using that same real value here
   rather than substituting --pw-red, since --pw-red would NOT match
   the real, already-battle-tested design this is restoring. */
.pw-step-number { position: absolute; top: 18px; right: 20px; font-size: 30px; font-weight: 800; color: #ffb3ae; }
.pw-step-icon { width: 44px; height: 44px; border-radius: 50%; background: var(--pw-navy); color: var(--pw-white); display: flex; align-items: center; justify-content: center; margin-bottom: 16px; }
.pw-step-card h3 { font-size: 17px; margin-bottom: 6px; }
.pw-step-card p { font-size: 14px; margin: 0; }

/* ============================= PACKAGES TEASER (Home) ============================= */
.pw-packages-teaser { background: var(--pw-grey-bg); }
.pw-packages-preview { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 14px; margin-bottom: 28px; }
.pw-packages-preview .pw-pkg-chip { background: var(--pw-white); border-radius: var(--pw-radius-md); padding: 18px; text-align: center; box-shadow: var(--pw-shadow-sm); }
.pw-packages-preview .pw-pkg-chip strong { display: block; font-size: 15px; margin-bottom: 4px; }
.pw-packages-preview .pw-pkg-chip span { font-size: 13px; color: var(--pw-grey-text-soft); }
.pw-loading-note { text-align: center; color: var(--pw-grey-text-soft); }
.pw-packages-teaser-cta { text-align: center; }

/* ============================= REVIEWS ============================= */
.pw-review-carousel { overflow: hidden; }
.pw-review-track { display: flex; gap: 20px; transition: transform 0.6s ease; }
.pw-review-card { flex: 0 0 calc(33.333% - 14px); background: var(--pw-white); border: 1px solid var(--pw-grey-line); border-radius: var(--pw-radius-md); padding: 24px; box-shadow: var(--pw-shadow-sm); }
.pw-review-text { font-size: 14px; color: var(--pw-navy); min-height: 120px; }
.pw-review-meta { display: flex; align-items: center; gap: 10px; margin: 14px 0 8px; }
.pw-review-avatar { width: 34px; height: 34px; border-radius: 50%; background: var(--pw-navy); color: var(--pw-white); display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 14px; }
.pw-review-name { font-weight: 700; font-size: 14px; }
.pw-review-product { display: flex; align-items: center; gap: 8px; font-size: 12.5px; color: var(--pw-grey-text-soft); }
.pw-review-dots { display: flex; justify-content: center; gap: 8px; margin-top: 22px; }
.pw-review-dots button { width: 8px; height: 8px; border-radius: 50%; border: none; background: var(--pw-grey-line); cursor: pointer; padding: 0; }
.pw-review-dots button.is-active { background: var(--pw-red); }
.pw-review-more-link { text-align: center; margin-top: 16px; font-size: 14px; }

/* ============================= FINAL CTA ============================= */
.pw-final-cta { position: relative; padding: 80px 0; text-align: center; overflow: hidden; background: var(--pw-navy); }
.pw-final-cta-bg { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; opacity: 0.28; }
/* 2026-09-21 (mobile fix): object-fit:contain instead of the inherited .pw-final-cta-bg cover — same left/right-crop issue as the hero/why-story mobile photos, fixed the same way. Scoped to this element only (class only ever applies to the mobile-only leaves image), so the desktop canopy's own object-fit:cover is untouched. */
.pw-final-cta-bg-mobile { display: none; object-fit: contain; }
.pw-final-cta .pw-section-inner { position: relative; z-index: 1; }
.pw-final-cta h2 { color: var(--pw-white); font-size: clamp(26px, 4vw, 40px); }
.pw-final-cta-accent { color: var(--pw-red); }
.pw-final-cta p { color: rgba(255,255,255,0.75); max-width: 560px; margin: 0 auto 24px; }
.pw-final-cta-ctas { display: flex; gap: 14px; justify-content: center; flex-wrap: wrap; }
.pw-final-cta .pw-btn-secondary { background: transparent; color: var(--pw-white); border-color: rgba(255,255,255,0.35); }

/* =====================================================================
 * AUTH PAGES (Login/Register/Forgot/Reset) — items 10-13. Reproduced
 * from the REAL plotwatch-system plugin's own design (assets/css/
 * style.css, read fresh) — a completely separate visual system from
 * the marketing homepage above: dark navy-to-blue gradient card over a
 * real full-bleed aerial-farmland photo, Poppins font, red #dc2626
 * accent (not --pw-red/#ff040a — a genuinely different real red used
 * only here, confirmed in the real source, not a typo). No shared
 * header/footer on these pages, matching the real site exactly (its
 * own auth-layout.php never calls get_header()/get_footer() at all).
 * ===================================================================== */
body.pw-auth-page {
    position: relative;
    min-height: 100vh;
    margin: 0;
    background: linear-gradient(rgba(0,0,0,0.55), rgba(0,0,0,0.55)), url('/assets/images/auth-bg.png');
    background-size: cover;
    background-position: center;
    font-family: 'Poppins', sans-serif;
}
body.pw-auth-page::after {
    content: "";
    position: absolute;
    top: 30px; left: 40px;
    width: 260px; height: 74px;
    background: url('/assets/images/plotwatch-logo-mark.png') no-repeat;
    background-size: contain;
}
@media (max-width: 640px) {
    body.pw-auth-page::after { display: none; }
}
.pw-auth-wrapper { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 20px; position: relative; z-index: 2; }
.pw-auth-card {
    background: linear-gradient(135deg, #0f172a, #1e3a8a);
    padding: 50px 40px;
    border-radius: 20px;
    width: 100%;
    max-width: 420px;
    box-shadow: 0 30px 80px rgba(0,0,0,.25);
    text-align: center;
    color: #ffffff;
    position: relative;
    z-index: 10;
}
@media (max-width: 640px) { .pw-auth-card { padding: 35px 20px; } }
.pw-auth-logo { width: 120px; margin-bottom: 20px; }
.pw-auth-card h2, .pw-auth-card h1 { margin: 0 0 25px; font-size: 24px; font-weight: 600; color: #dc2626; }
.pw-auth-form input {
    width: 100%; box-sizing: border-box; font-family: inherit;
    padding: 14px; margin-bottom: 15px;
    border: 1px solid rgba(255,255,255,0.3); border-radius: 10px; font-size: 14px;
    background: rgba(255,255,255,0.1); color: #ffffff;
}
.pw-auth-form input::placeholder { color: rgba(255,255,255,0.7); }
.pw-auth-form input:focus { outline: none; border-color: #ffffff; box-shadow: 0 0 0 3px rgba(255,255,255,0.2); }
.pw-auth-form label { display: block; text-align: left; font-size: 13px; font-weight: 500; margin-bottom: 6px; color: rgba(255,255,255,0.85); }
.pw-input-group { position: relative; }
.pw-input-group input { padding-right: 44px; }
.pw-eye { position: absolute; right: 15px; top: 18px; cursor: pointer; user-select: none; }
.pw-auth-btn, .pw-auth-form button {
    width: 100%; padding: 14px; background: #dc2626; color: #ffffff; border: none; border-radius: 10px;
    font-weight: 600; font-family: 'Poppins', sans-serif; font-size: 15px; cursor: pointer;
}
.pw-auth-btn:hover, .pw-auth-form button:hover { background: #b91c1c; }
.pw-forgot { text-align: right; margin-bottom: 15px; }
.pw-forgot a { font-size: 13px; color: #ffffff; text-decoration: none; }
.pw-switch { margin-top: 20px; font-size: 14px; color: #ffffff; }
.pw-switch a { color: #dc2626; font-weight: 600; text-decoration: none; }
.pw-auth-error, .pw-error { background: #ffe6e6; color: #b30000; padding: 12px; border-radius: 8px; margin-bottom: 15px; text-align: center; font-weight: 500; font-size: 14px; }
.pw-auth-success, .pw-success { background: #e6ffed; color: #006b2e; padding: 12px; border-radius: 8px; margin-bottom: 15px; text-align: center; font-weight: 500; font-size: 14px; }

/* ============================= PLAN FINDER / OTP ============================= */
.pw-planfinder { max-width: 520px; margin: 50px auto 80px; padding: 0 20px; }
.pw-planfinder-card { background: var(--pw-white); border: 1px solid var(--pw-grey-line); border-radius: var(--pw-radius-lg); padding: 34px 28px; box-shadow: var(--pw-shadow-md); }
.pw-planfinder-card h1 { font-size: 22px; }
.pw-planfinder-intro { font-size: 14px; }
.pw-planfinder-form .pw-checkout-field { display: flex; flex-direction: column; gap: 6px; font-size: 13px; font-weight: 600; margin-bottom: 16px; }
.pw-planfinder-form input, .pw-planfinder-form select, .pw-planfinder-form textarea {
    font: inherit; font-weight: 400; padding: 11px 12px; border: 1px solid var(--pw-grey-line); border-radius: var(--pw-radius-sm); background: var(--pw-grey-bg);
}
.pw-planfinder-form input:focus, .pw-planfinder-form select:focus, .pw-planfinder-form textarea:focus { outline: none; border-color: var(--pw-red); background: var(--pw-white); }
.pw-planfinder-form button { width: 100%; }
.pw-checkout-required { color: var(--pw-red); }
.pw-checkout-status { padding: 10px 12px; border-radius: var(--pw-radius-sm); font-size: 13px; margin: 12px 0; }
.pw-checkout-status.is-error { background: #fdeaea; color: #b91c1c; }
.pw-checkout-status.is-success { background: #e7f6ed; color: var(--pw-green); }
.pw-checkout-status.is-info { background: var(--pw-grey-bg-alt); color: var(--pw-navy); }

/* ============================= CONTACT ============================= */
.pw-contact-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-bottom: 44px; }
.pw-contact-card { background: var(--pw-white); border: 1px solid var(--pw-grey-line); border-radius: var(--pw-radius-md); padding: 22px; text-align: center; box-shadow: var(--pw-shadow-sm); }
.pw-contact-card i { font-size: 24px; color: var(--pw-red); margin-bottom: 10px; display: block; }
.pw-contact-card h3 { font-size: 15px; margin-bottom: 4px; }
.pw-contact-card p { font-size: 13px; margin-bottom: 12px; }
.pw-contact-form-wrap { max-width: 560px; margin: 0 auto 30px; background: var(--pw-grey-bg); border-radius: var(--pw-radius-lg); padding: 30px; }
.pw-contact-form-wrap h2 { font-size: 18px; }
.pw-checkout-field-full { grid-column: 1 / -1; }
.pw-contact-enquiry-cta { text-align: center; font-size: 14px; }

/* ============================= BLOG ============================= */
.pw-blog-empty { text-align: center; color: var(--pw-grey-text-soft); padding: 40px 0; }
.pw-blog-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 22px; }
.pw-blog-card { display: block; background: var(--pw-white); border: 1px solid var(--pw-grey-line); border-radius: var(--pw-radius-md); overflow: hidden; box-shadow: var(--pw-shadow-sm); }
.pw-blog-card img, .pw-blog-card-noimage { width: 100%; height: 170px; object-fit: cover; background: var(--pw-grey-bg-alt); display: flex; align-items: center; justify-content: center; color: var(--pw-grey-text-soft); font-size: 26px; }
.pw-blog-card-body { padding: 18px; }
.pw-blog-category { display: inline-block; font-size: 11px; font-weight: 700; text-transform: uppercase; color: var(--pw-red); margin-bottom: 6px; }
.pw-blog-card h3 { font-size: 16px; color: var(--pw-navy); margin-bottom: 6px; }
.pw-blog-card p { font-size: 13px; margin-bottom: 10px; }
.pw-blog-card-date { font-size: 12px; color: var(--pw-grey-text-soft); }
.pw-blog-article-inner { max-width: 760px; margin: 0 auto; }
.pw-blog-article-image { width: 100%; border-radius: var(--pw-radius-md); margin-bottom: 20px; max-height: 420px; object-fit: cover; }
.pw-blog-article-meta { display: flex; gap: 12px; align-items: center; font-size: 13px; color: var(--pw-grey-text-soft); margin-bottom: 8px; }
.pw-blog-article-body { font-size: 15.5px; line-height: 1.75; color: var(--pw-navy); }
.pw-blog-article-body img { border-radius: var(--pw-radius-sm); margin: 16px 0; }

/* ============================= DASHBOARD ============================= */
.pw-stat-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-bottom: 32px; }
.pw-stat-card { background: var(--pw-white); border: 1px solid var(--pw-grey-line); border-radius: var(--pw-radius-md); padding: 20px; box-shadow: var(--pw-shadow-sm); text-align: center; }
.pw-stat-card i { font-size: 20px; color: var(--pw-red); margin-bottom: 8px; display: block; }
.pw-stat-value { display: block; font-size: 26px; font-weight: 800; color: var(--pw-navy); }
.pw-stat-label { font-size: 12.5px; color: var(--pw-grey-text-soft); }
.pw-dashboard-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
.pw-dashboard-panel { background: var(--pw-white); border: 1px solid var(--pw-grey-line); border-radius: var(--pw-radius-md); padding: 22px; box-shadow: var(--pw-shadow-sm); }
.pw-dashboard-panel h2 { font-size: 16px; margin-bottom: 14px; }
.pw-dashboard-empty { color: var(--pw-grey-text-soft); font-size: 13.5px; }
.pw-dashboard-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 10px 0; border-bottom: 1px solid var(--pw-grey-bg-alt); font-size: 13.5px; }
.pw-dashboard-row:last-child { border-bottom: none; }
.pw-dashboard-row-sub { display: block; font-size: 12px; color: var(--pw-grey-text-soft); }
.pw-badge { background: var(--pw-grey-bg-alt); color: var(--pw-navy); font-size: 11.5px; font-weight: 700; padding: 4px 10px; border-radius: 999px; white-space: nowrap; }

/* =====================================================================
 * Responsive — breakpoints per Phase 9 Step 18:
 * 320 / 360 / 375 / 390 / 414 / 768 / 1024 / 1280 / 1440+
 * ===================================================================== */
@media (max-width: 1024px) {
    /* Real WordPress header switches to the hamburger menu at 1024px,
       not a narrower "mobile" breakpoint — measured there against the
       real header's own content width (7 nav links + logo + cart +
       CTA), reproduced exactly rather than guessed at a smaller width. */
    .pw-site-nav {
        position: absolute; top: 100%; left: 0; right: 0;
        background: var(--pw-white); border-bottom: 1px solid var(--pw-grey-line); box-shadow: var(--pw-shadow-md);
        flex-direction: column; align-items: stretch; gap: 0; padding: 8px 24px 16px;
        display: none; max-height: calc(100vh - 68px); overflow-y: auto;
    }
    .pw-site-nav.is-open { display: flex; }
    .pw-site-nav a { padding: 13px 0; border-bottom: 1px solid var(--pw-grey-line); }
    .pw-site-nav a:last-child { border-bottom: 0; }
    .pw-site-nav a::after { display: none; }
    .pw-nav-toggle { display: flex; }
    .pw-risk-grid { grid-template-columns: repeat(2, 1fr); }
    .pw-step-grid { grid-template-columns: repeat(2, 1fr); }
    .pw-contact-grid { grid-template-columns: repeat(2, 1fr); }
    .pw-blog-grid { grid-template-columns: repeat(2, 1fr); }
    .pw-dashboard-grid { grid-template-columns: 1fr; }
    .pw-review-card { flex: 0 0 calc(50% - 10px); }
    .pw-footer-grid { grid-template-columns: 1fr 1fr; }
}

@media (max-width: 640px) {
    .pw-section { padding: 44px 0; }
    .pw-risk-grid, .pw-step-grid, .pw-contact-grid, .pw-blog-grid, .pw-stat-grid { grid-template-columns: 1fr; }
    .pw-review-card { flex: 0 0 100%; }
    .pw-hero { height: 82vh; }
    /* 2026-09-21 (mobile fix, revised): direct per-scene background-image
       rules using the data-scene attribute already on .pw-hero-scene —
       replaces an earlier version that read the mobile URL from a CSS
       custom property set inline via style="--pw-hero-mobile-photo:...".
       That indirection couldn't be confirmed reliable and added a moving
       part with no real benefit over a plain, direct rule per scene (the
       same mechanism the desktop background-image already uses
       successfully) — eight explicit rules below, one per real scene.
       background-size:contain (not cover): the mobile photos are
       portrait shots whose aspect ratio doesn't reliably match .pw-hero's
       own viewport-height-driven box across real device sizes — "cover"
       was cropping the left/right edges on devices where the box is
       proportionally narrower than the photo. "contain" always shows the
       full photo; any letterbox band shows the added background-color
       below rather than a gap. */
    .pw-hero-scene-photo { background-size: contain !important; background-color: var(--pw-navy); }
    .pw-hero-scene[data-scene="1"] .pw-hero-scene-photo { background-image: url(/assets/images/hero-problem-mobile-1.webp) !important; }
    .pw-hero-scene[data-scene="2"] .pw-hero-scene-photo { background-image: url(/assets/images/hero-problem-mobile-2.webp) !important; }
    .pw-hero-scene[data-scene="3"] .pw-hero-scene-photo { background-image: url(/assets/images/hero-problem-mobile-3.webp) !important; }
    .pw-hero-scene[data-scene="4"] .pw-hero-scene-photo { background-image: url(/assets/images/hero-problem-mobile-4.webp) !important; }
    .pw-hero-scene[data-scene="5"] .pw-hero-scene-photo { background-image: url(/assets/images/hero-problem-mobile-5.webp) !important; }
    .pw-hero-scene[data-scene="6"] .pw-hero-scene-photo { background-image: url(/assets/images/hero-problem-mobile-6.webp) !important; }
    .pw-hero-scene[data-scene="7"] .pw-hero-scene-photo { background-image: url(/assets/images/hero-problem-mobile-7.webp) !important; }
    .pw-hero-scene[data-scene="8"] .pw-hero-scene-photo { background-image: url(/assets/images/hero-problem-mobile-8.webp) !important; }
    .pw-hero-ctas { flex-direction: column; width: 100%; }
    .pw-hero-ctas .pw-btn-primary, .pw-hero-ctas .pw-btn-secondary { width: 100%; }
    .pw-final-cta-ctas { flex-direction: column; }
    /* 2026-09-21 (mobile fix): swap the desktop canopy for the mobile leaves decoration. */
    .pw-final-cta-bg-desktop { display: none; }
    .pw-final-cta-bg-mobile { display: block; }
    .pw-footer-grid { grid-template-columns: 1fr; }
    .pw-auth-card, .pw-planfinder-card { padding: 26px 20px; }
    .pw-contact-form-wrap { padding: 20px; }
}

@media (max-width: 480px) {
    .pw-site-header-inner { padding: 10px 16px; gap: 10px; }
    .pw-header-actions { gap: 8px; }
    .pw-header-actions a.pw-nav-cta { padding: 9px 14px !important; font-size: 12.5px; }
    .pw-site-logo img { height: 30px; }
    .pw-header-cart-toggle, .pw-nav-toggle { width: 34px; height: 34px; }
}

@media (max-width: 375px) {
    .pw-site-logo img { height: 24px; }
    .pw-header-actions { gap: 6px; }
    h1 { font-size: 22px; }
    .pw-hero-inner h1 { font-size: 26px; }
}

/* =====================================================================
 * EMBEDDED PLAN FINDER (Item 7) + CHECKOUT OVERLAY (Items 17-18) —
 * reproduced verbatim from the real WordPress source: plotwatch-system's
 * enquiry-form.php / enquiry-otp.php / enquiry-results.php own markup,
 * and astra-child/style.css's .pw-enquiry-*, .pw-redesign-btn-*,
 * .pw-redesign-section-eyebrow, .pw-redesign-recommended-badge,
 * .pw-redesign-packages-scroll*, .pw-checkout-* rule blocks (all read
 * fresh 2026-09-08 for this correction). Exact real values (colors,
 * spacing, breakpoints) — not redesigned, not invented. Namespaced
 * exactly as the real source (pw-redesign-* / pw-checkout-* class names
 * kept as-is) since this whole section is a direct, faithful port
 * rather than a re-skinned equivalent.
 * ===================================================================== */

.tooltip { position: relative; display: inline-block; opacity: 1; }
.tooltip i { font-size: 14px; }
.tooltip .tooltiptext {
    visibility: hidden; width: max-content; background-color: #000; color: #fff; text-align: center;
    border-radius: 4px; padding: 3px 5px; position: absolute; z-index: 1; font-size: 12px;
    text-transform: none; max-width: 200px; top: 0%; left: 50%; transform: translate(-50%, -100%);
}
.tooltip:hover .tooltiptext { visibility: visible; }

.pw-redesign-section-eyebrow {
    display: inline-flex; align-items: center; gap: 8px; color: var(--pw-red); font-weight: 600;
    letter-spacing: 0.08em; text-transform: uppercase; font-size: 12px; margin-bottom: 16px;
}
.pw-redesign-section-eyebrow::before { content: ""; width: 16px; height: 2px; background: var(--pw-red); border-radius: 2px; }

.pw-redesign-btn-primary, .pw-redesign-btn-secondary { font-family: var(--pw-font-display) !important; }
.pw-redesign-btn-primary {
    display: inline-flex; align-items: center; justify-content: center;
    background: var(--pw-red) !important; color: var(--pw-white) !important;
    padding: 15px 30px; border-radius: var(--pw-radius-sm); font-weight: 700; font-size: 15px;
    text-decoration: none !important; transition: transform 0.25s ease, box-shadow 0.25s ease;
    box-shadow: 0 12px 28px rgba(255,4,10,0.22) !important; white-space: nowrap; border: 0; cursor: pointer;
}
.pw-redesign-btn-primary:hover { transform: translateY(-2px); box-shadow: 0 16px 36px rgba(255,4,10,0.3) !important; color: var(--pw-white) !important; }
.pw-redesign-btn-secondary {
    display: inline-flex; align-items: center; justify-content: center; background: var(--pw-white);
    border: 1.5px solid var(--pw-grey-line); color: var(--pw-navy) !important;
    padding: 15px 30px; border-radius: var(--pw-radius-sm); font-weight: 600; font-size: 15px;
    text-decoration: none !important; transition: border-color 0.25s ease, background 0.25s ease, transform 0.25s ease; white-space: nowrap; cursor: pointer;
}
.pw-redesign-btn-secondary:hover { border-color: var(--pw-navy); background: var(--pw-grey-bg); transform: translateY(-2px); }

.pw-redesign-recommended-badge {
    display: inline-block; background: var(--pw-red); color: var(--pw-white); font-size: 10px; font-weight: 700;
    letter-spacing: 0.04em; text-transform: uppercase; padding: 3px 10px; border-radius: 20px; margin-bottom: 8px;
    box-shadow: 0 6px 16px rgba(255,0,0,0.35);
}

.pw-redesign-packages-scroll { max-width: var(--pw-container); margin: 0 auto; overflow-x: auto; border-radius: var(--pw-radius-lg); box-shadow: var(--pw-shadow-lg); -webkit-overflow-scrolling: touch; }
.pw-redesign-packages-scroll-hint { display: block; text-align: center; font-size: 12px; color: var(--pw-grey-text); margin: 14px 0 0; transition: opacity 0.3s ease; }
.pw-redesign-packages-scroll-hint.is-hidden { opacity: 0; }

/* ---- Plan-finder form + OTP shared card ---- */
.pw-enquiry-section { background: radial-gradient(120% 140% at 15% 0%, #0a1440 0%, var(--pw-navy) 55%); padding: 56px 24px; }
@media (min-width: 901px) {
    .pw-enquiry-section { min-height: 100vh; display: flex; flex-direction: column; justify-content: center; }
}
/* 2026-09-18 (release fix): max-width widened from the real WordPress
   source's own 1080px (astra-child/style.css:4892, byte-identical
   otherwise) to 1200px — the whole card is horizontally centered
   (margin:0 auto), so a wider card shifts its own left edge (where the
   text content starts, in normal flow) further left without touching
   the delicate text/form absolute-positioning split documented below,
   per explicit request that the left content start slightly more
   toward the left. Deliberate deviation from strict WP parity. */
.pw-enquiry-form-card { position: relative; width: 100%; max-width: 1200px; margin: 0 auto; min-height: 560px; background: none; box-shadow: none; border-radius: 0; padding: 0; text-align: left; }
.pw-enquiry-form-card .pw-redesign-section-eyebrow, .pw-enquiry-form-card h2, .pw-enquiry-subtitle,
.pw-enquiry-form-card .pw-enquiry-form-error, .pw-enquiry-callout { position: relative; z-index: 2; }
.pw-enquiry-form-card .pw-redesign-section-eyebrow { max-width: 480px; color: var(--pw-red); margin-bottom: 20px; }
.pw-enquiry-form-card h2 { max-width: 480px; color: var(--pw-white) !important; font-family: var(--pw-font-display) !important; font-size: clamp(30px, 3.4vw, 42px); line-height: 1.2; font-weight: 700; margin: 0 0 18px; }
.pw-enquiry-subtitle { max-width: 42ch; color: rgba(216,226,245,0.92); font-size: 16.5px; line-height: 1.65; margin: 0; }
.pw-enquiry-form-card .pw-enquiry-form-error { max-width: 480px; margin-top: 20px; }
.pw-enquiry-form-error { background: #fff0f0; color: var(--pw-red); border-radius: var(--pw-radius-sm); padding: 10px 14px; font-size: 13.5px; font-weight: 600; }
.pw-enquiry-otp-input { letter-spacing: 0.3em; font-size: 20px !important; font-weight: 700; text-align: center; }

.pw-enquiry-form-banner { grid-column: 1 / -1; max-width: 480px; margin: 0 0 4px; border-radius: var(--pw-radius-sm); padding: 10px 14px; font-size: 13.5px; font-weight: 600; line-height: 1.5; }
.pw-enquiry-form-banner--error { background: #fff0f0; color: var(--pw-red); }
.pw-enquiry-form-banner--success { background: #eefaf1; color: #1a7a3e; }
.pw-enquiry-form-banner--info { background: var(--pw-grey-bg-alt); color: var(--pw-navy); }
.pw-enquiry-otp-countdown { grid-column: 1 / -1; color: var(--pw-grey-text-soft); font-size: 13px; font-weight: 600; margin: -6px 0 4px; min-height: 16px; }
.pw-enquiry-otp-expired { grid-column: 1 / -1; }

.pw-enquiry-otp-wrap { position: absolute; z-index: 1; top: 0; right: 0; width: 540px; max-width: 100%; background: var(--pw-white); border-radius: var(--pw-radius-lg); box-shadow: var(--pw-shadow-lg); padding: 30px 28px; }
.pw-enquiry-otp-wrap .pw-enquiry-form { position: static; width: auto; max-width: none; background: none; border-radius: 0; box-shadow: none; padding: 0; margin-top: 0; }
.pw-enquiry-otp-resend-form { grid-column: 1 / -1; margin-top: 4px; }
@media (max-width: 900px) { .pw-enquiry-otp-wrap { position: static; width: auto; max-width: none; margin-top: 24px; } }
.pw-enquiry-otp-resend-btn { background: none; border: none; padding: 0; color: var(--pw-red); font-size: 13.5px; font-weight: 700; cursor: pointer; text-decoration: underline; }
.pw-enquiry-otp-resend-btn:hover:not(:disabled) { color: var(--pw-navy); }
.pw-enquiry-otp-resend-btn:disabled { color: var(--pw-grey-text-soft); cursor: default; text-decoration: none; }

.pw-enquiry-callout { max-width: 480px; display: flex; align-items: center; gap: 14px; margin-top: 28px; padding-top: 24px; border-top: 1px solid rgba(255,255,255,0.14); }
.pw-enquiry-callout-icon { flex: 0 0 auto; width: 40px; height: 40px; border-radius: 50%; background: rgba(255,255,255,0.08); color: var(--pw-white); display: flex; align-items: center; justify-content: center; font-size: 15px; }
.pw-enquiry-callout-text { color: rgba(198,209,235,0.78); font-size: 13.5px; line-height: 1.5; }
.pw-enquiry-callout-text a { display: inline-block; margin-top: 2px; color: var(--pw-white) !important; font-weight: 700; font-size: 14.5px; text-decoration: none !important; }
.pw-enquiry-callout-text a:hover { color: var(--pw-red) !important; }

/* 2026-09-18 (release fix): width widened from the real WordPress
   source's own 480px (astra-child/style.css:5159, byte-identical
   otherwise) to 540px, per explicit request for wider/more comfortable
   input boxes — every field inside already uses width:100% (see
   .pw-enquiry-field input/select below), so this one change widens
   Full Name/Mobile/Plot Size/District together. .pw-enquiry-otp-wrap
   above matched to the same 540px for visual consistency between the
   two right-side white cards. Deliberate deviation from strict WP
   parity; field names/validation/grid-columns/OTP flow unchanged. */
.pw-enquiry-form { position: absolute; z-index: 1; top: 0; right: 0; width: 540px; max-width: 100%; display: grid; grid-template-columns: 1fr 1fr; gap: 16px 14px; text-align: left; background: var(--pw-white); border-radius: var(--pw-radius-lg); box-shadow: var(--pw-shadow-lg); padding: 30px 28px; }
.pw-enquiry-form-heading, .pw-enquiry-field-other, .pw-enquiry-submit { grid-column: 1 / -1; }
.pw-enquiry-form-heading { color: var(--pw-navy) !important; font-family: var(--pw-font-display) !important; font-size: 19px; font-weight: 700; margin: 0 0 4px; }
@media (max-width: 900px) {
    .pw-enquiry-form-card { min-height: 0; }
    .pw-enquiry-form-card .pw-redesign-section-eyebrow, .pw-enquiry-form-card h2, .pw-enquiry-subtitle,
    .pw-enquiry-form-card .pw-enquiry-form-error, .pw-enquiry-callout { max-width: none; }
    .pw-enquiry-form-card .pw-enquiry-form-error { margin-top: 12px; }
    .pw-enquiry-form { position: static; width: auto; grid-template-columns: 1fr; margin-top: 24px; }
}
.pw-enquiry-field label { display: block; color: var(--pw-navy); font-size: 13.5px; font-weight: 700; margin-bottom: 6px; }
.pw-enquiry-field label span { color: var(--pw-red); }
.pw-enquiry-field input, .pw-enquiry-field select {
    width: 100%; padding: 12px 14px; border: 1.5px solid var(--pw-grey-line); border-radius: 10px;
    font-family: inherit; font-size: 15px; color: var(--pw-navy); background: var(--pw-grey-bg-alt);
    transition: border-color 0.2s ease, background 0.2s ease, box-shadow 0.2s ease;
}
.pw-enquiry-field select {
    -webkit-appearance: none; -moz-appearance: none; appearance: none; padding-right: 40px;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none' stroke='%23040926' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='5 8 10 13 15 8'/%3E%3C/svg%3E");
    background-repeat: no-repeat; background-position: right 14px center; background-size: 16px;
}
/* The searchable proxy input added by initLocationSearch() in
   planfinder.js for the Plot Location field — direct port of the real
   .pw-location-search-input rule in the WordPress theme's style.css
   (astra-child, :5265-5271). .pw-enquiry-field input above already
   covers border/padding/font/background (it's a real sibling <input>
   inside the same .pw-enquiry-field wrapper); this just adds the same
   dropdown-style chevron the <select> it visually replaces had. */
.pw-location-search-input {
    padding-right: 40px !important;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none' stroke='%23040926' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='5 8 10 13 15 8'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 14px center;
    background-size: 16px;
}

.pw-enquiry-field input:focus, .pw-enquiry-field select:focus { outline: none; border-color: var(--pw-red); background: var(--pw-white); box-shadow: 0 0 0 4px rgba(255,0,0,0.08); }
.pw-enquiry-field-hint { display: block; margin-top: 6px; color: var(--pw-grey-text-soft); font-size: 11.5px; line-height: 1.4; }
.pw-enquiry-plot-size { display: flex; align-items: center; gap: 10px; border: 1.5px solid var(--pw-grey-line); border-radius: 10px; background: var(--pw-grey-bg-alt); padding: 0 16px; transition: border-color 0.2s ease, background 0.2s ease, box-shadow 0.2s ease; }
.pw-enquiry-plot-size:focus-within { border-color: var(--pw-red); background: var(--pw-white); box-shadow: 0 0 0 4px rgba(255,0,0,0.08); }
.pw-enquiry-plot-size input { border: 0 !important; padding: 11px 0 !important; flex: 1; }
.pw-enquiry-plot-size input:focus { border: 0 !important; }
.pw-enquiry-plot-size span { color: var(--pw-grey-text); font-size: 13.5px; font-weight: 600; white-space: nowrap; }
.pw-enquiry-submit { width: 100%; margin-top: 6px; padding: 13px 24px !important; font-size: 14.5px; }

/* ---- Not-serviceable message ---- */
.pw-enquiry-unavailable-card { max-width: 620px; margin: 0 auto; background: var(--pw-white); border-radius: var(--pw-radius-lg); box-shadow: var(--pw-shadow-lg); padding: 48px 40px; text-align: center; }
.pw-enquiry-unavailable-card h2 { color: var(--pw-navy); font-size: clamp(22px, 2.6vw, 28px); font-weight: 700; margin: 10px 0 16px; }
.pw-enquiry-unavailable-card > p { color: var(--pw-grey-text); font-size: 15px; line-height: 1.65; margin: 0 0 28px; }
.pw-enquiry-assist { border-top: 1px solid var(--pw-grey-line); padding-top: 26px; }
.pw-enquiry-assist strong { display: block; color: var(--pw-navy); font-size: 15px; margin-bottom: 6px; }
.pw-enquiry-assist p { color: var(--pw-grey-text); font-size: 14px; margin: 0 0 20px; }
.pw-enquiry-actions { display: flex; flex-wrap: wrap; justify-content: center; gap: 14px; }
.pw-enquiry-thankyou { background: #f0fff4; color: #1a7f37; border-radius: var(--pw-radius-sm); padding: 16px 20px; font-size: 14.5px; font-weight: 600; text-align: center; }
@media (max-width: 640px) {
    .pw-enquiry-unavailable-card { padding: 34px 22px; }
    .pw-enquiry-actions { flex-direction: column; }
    .pw-enquiry-actions .pw-redesign-btn-primary, .pw-enquiry-actions .pw-redesign-btn-secondary { width: 100%; }
}

/* ---- Serviceable: plans head ---- */
.pw-enquiry-section:has(.pw-enquiry-plans-head) { background: var(--pw-white); }
.pw-enquiry-plans-head { text-align: center; max-width: 700px; margin: 0 auto 24px; }
.pw-enquiry-back-link { display: inline-flex; align-items: center; gap: 6px; margin-bottom: 18px; color: var(--pw-grey-text); font-size: 13px; font-weight: 600; text-decoration: none !important; }
.pw-enquiry-back-link:hover { color: var(--pw-red); }
.pw-enquiry-back-link i { font-size: 11px; }
.pw-enquiry-plans-head h2 { color: var(--pw-navy); font-size: clamp(26px, 3vw, 34px); font-weight: 700; margin: 10px 0 20px; }
.pw-enquiry-property-summary { display: flex; flex-wrap: wrap; justify-content: center; align-items: center; gap: 6px 18px; font-size: 14px; color: var(--pw-grey-text); }
.pw-enquiry-property-summary strong { color: var(--pw-navy); font-size: 16px; width: 100%; }
.pw-enquiry-property-summary i { color: var(--pw-red); margin-right: 4px; }

/* 2026-09-18 (release fix): INR/USD toggle — added by
   initEnquiryCurrencyToggle() in planfinder.js, was entirely missing
   from standalone. Ported verbatim from the real WordPress source
   (astra-child/style.css:5462-5495), appended into .pw-enquiry-plans-
   head above, same place the real source's own JS inserts it. One
   value changed: font-family uses a concrete 'Inter', sans-serif
   stack instead of the real source's var(--pw-font-body) — that
   specific variable was never defined in this project's own :root
   block (only --pw-font-display was carried over), so the literal
   stack is used instead of introducing a new global variable for one
   rule. Visually identical either way. */
.pw-enquiry-currency-toggle { display: inline-flex; margin-top: 20px; border: 1.5px solid var(--pw-grey-line); border-radius: 999px; padding: 3px; gap: 3px; }
.pw-enquiry-currency-toggle button { border: 0; background: none; padding: 7px 18px; border-radius: 999px; font-family: 'Inter', sans-serif; font-size: 13px; font-weight: 700; color: var(--pw-grey-text); cursor: pointer; transition: background 0.2s ease, color 0.2s ease; }
.pw-enquiry-currency-toggle button.is-active { background: var(--pw-navy); color: var(--pw-white); }
.pw-enquiry-currency-note { max-width: 420px; margin: 10px auto 0; color: var(--pw-grey-text-soft); font-size: 12px; font-style: italic; }

/* ---- Comparison "legend" grid (package identity/price/deliverables/CTA) ---- */
.pw-enquiry-legend { position: relative; max-width: 1500px; margin: 24px auto 0; border: 1px solid var(--pw-grey-line); border-radius: var(--pw-radius-lg); box-shadow: var(--pw-shadow-lg); overflow: hidden; overflow-x: auto; }
.pw-enquiry-legend::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, var(--pw-navy) 0%, var(--pw-red) 100%); z-index: 3; }
.pw-enquiry-legend-grid { display: grid; grid-template-columns: minmax(170px, 1.3fr) repeat(5, 1fr); min-width: 820px; background: var(--pw-white); }
.pw-enquiry-legend-corner { display: flex; align-items: center; padding: 12px 16px; font-family: var(--pw-font-display); font-size: 11.5px; font-weight: 700; color: var(--pw-grey-text) !important; text-transform: uppercase; letter-spacing: 0.03em; background: var(--pw-white); border-bottom: 2px solid var(--pw-grey-line); }
.pw-enquiry-legend-corner i { color: var(--pw-red); margin-right: 6px; }
.pw-enquiry-legend-pkg { position: relative; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; padding: 14px 8px 12px; background: linear-gradient(135deg, #0a1440 0%, var(--pw-navy) 100%); color: var(--pw-white); border-bottom: 3px solid var(--pw-navy); }
.pw-enquiry-legend-pkg .pw-redesign-recommended-badge { margin-bottom: 6px; }
.pw-enquiry-legend-pkg-name { display: block; font-family: var(--pw-font-display); font-weight: 700; font-size: 13px; line-height: 1.3; }
.pw-enquiry-legend-pkg-tagline { display: block; color: rgba(255,255,255,0.68); font-size: 9.5px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.03em; margin-top: 3px; }
.pw-enquiry-legend-price-cell { display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; padding: 11px 3px 8px; background: var(--pw-white); border-bottom: 1px solid var(--pw-grey-line); border-left: 1px solid var(--pw-grey-line); }
.pw-enquiry-legend-price { color: var(--pw-navy); font-family: var(--pw-font-display); font-size: 20px; font-weight: 800; line-height: 1.2; }
.pw-enquiry-legend-price-note { display: block; color: var(--pw-grey-text); font-size: 10.5px; font-weight: 500; margin-top: 2px; }
.pw-enquiry-legend-gst-note { display: block; color: var(--pw-grey-text-soft); font-size: 9.5px; font-weight: 500; margin-top: 3px; }
.pw-enquiry-legend-action-cell { display: flex; flex-direction: column; gap: 6px; padding: 10px 10px 14px; background: var(--pw-white); border-bottom: 1px solid var(--pw-grey-line); border-left: 1px solid var(--pw-grey-line); }
.pw-enquiry-legend-action-cell .pw-enquiry-subscribe-btn, .pw-enquiry-legend-action-cell .pw-enquiry-contact-form, .pw-enquiry-legend-action-cell .pw-enquiry-contact-form button { width: 100%; margin: 0; }
.pw-enquiry-legend-action-cell .pw-redesign-btn-primary, .pw-enquiry-legend-action-cell .pw-redesign-btn-secondary { padding: 9px 12px; font-size: 12.5px; width: 100%; }
.pw-enquiry-legend-action-cell .pw-redesign-btn-secondary { border-color: var(--pw-grey-line); color: var(--pw-navy) !important; }
.pw-enquiry-legend-action-cell .pw-redesign-btn-secondary:hover { border-color: var(--pw-navy); background: var(--pw-grey-bg); }

.pw-enquiry-cart-inline-trigger { display: flex; align-items: center; justify-content: center; gap: 5px; padding: 4px 0; background: none; border: 0; color: var(--pw-navy); font-size: 12px; font-weight: 600; cursor: pointer; transition: color 0.2s ease; }
.pw-enquiry-cart-inline-trigger i { color: var(--pw-red); font-size: 11px; }
.pw-enquiry-cart-inline-trigger:hover { color: var(--pw-red); }
.pw-enquiry-addons-banner { display: flex; align-items: center; justify-content: space-between; gap: 20px; max-width: 1500px; margin: 18px auto 0; padding: 18px 28px; background: linear-gradient(135deg, #0a1440 0%, var(--pw-navy) 100%); border-radius: var(--pw-radius-lg); box-shadow: var(--pw-shadow-md); }
.pw-enquiry-addons-banner-text { display: flex; align-items: center; gap: 14px; color: var(--pw-white); }
.pw-enquiry-addons-banner-text > i { flex: 0 0 auto; color: var(--pw-red); font-size: 22px; }
.pw-enquiry-addons-banner-text strong { display: block; font-family: var(--pw-font-display); font-size: 14.5px; font-weight: 700; }
.pw-enquiry-addons-banner-text span { display: block; color: rgba(255,255,255,0.72); font-size: 12.5px; font-weight: 500; line-height: 1.4; margin-top: 2px; }
.pw-enquiry-addons-banner-btn.pw-enquiry-cart-inline-trigger { flex: 0 0 auto; width: auto; padding: 12px 26px; background: var(--pw-red); color: var(--pw-white); font-family: var(--pw-font-display); font-size: 13px; letter-spacing: 0.02em; border-radius: var(--pw-radius-sm); white-space: nowrap; }
.pw-enquiry-addons-banner-btn.pw-enquiry-cart-inline-trigger i { color: var(--pw-white); }
.pw-enquiry-addons-banner-btn.pw-enquiry-cart-inline-trigger:hover { background: var(--pw-navy); color: var(--pw-white); }
@media (max-width: 640px) {
    .pw-enquiry-addons-banner { flex-direction: column; align-items: stretch; text-align: center; padding: 18px 20px; }
    .pw-enquiry-addons-banner-text { flex-direction: column; text-align: center; }
    .pw-enquiry-addons-banner-btn.pw-enquiry-cart-inline-trigger { width: 100%; }
}

/* 2026-09-18 (release fix): added gap:8px — this element is display:flex
   with its icon (<i>) and label text as two flex items separated only
   by a single literal space character in the markup (confirmed
   byte-identical to the real WordPress source's own template, plugin/
   templates/enquiry-results.php:350 — that source has this exact same
   "icon/text stuck together" issue too, since a bare space between
   flex items doesn't reliably render as a consistent visual gap). An
   explicit gap is the standard fix and doesn't require touching the
   PHP markup at all. */
.pw-enquiry-legend-label { display: flex; align-items: flex-start; gap: 8px; padding: 11px 16px; font-size: 12.5px; font-weight: 600; line-height: 1.4; color: var(--pw-navy) !important; background: var(--pw-white) !important; border-bottom: 1px solid var(--pw-grey-line); }
.pw-enquiry-legend-label .pw-enquiry-compare-row-icon { margin-top: 1px; flex: 0 0 auto; }
.pw-enquiry-legend-cell { display: flex; align-items: center; justify-content: center; padding: 11px 8px; background: var(--pw-white) !important; border-bottom: 1px solid var(--pw-grey-line); border-left: 1px solid var(--pw-grey-line); }
.pw-enquiry-legend-alt.pw-enquiry-legend-label, .pw-enquiry-legend-alt.pw-enquiry-legend-cell { background: var(--pw-grey-bg) !important; }
.pw-enquiry-legend-label:hover, .pw-enquiry-legend-grid .pw-enquiry-legend-cell:hover { background: rgba(4,9,38,0.05) !important; }
.pw-enquiry-legend-cell .pw-enquiry-compare-icon { transition: transform 0.18s ease; }
.pw-enquiry-legend-cell:hover .pw-enquiry-compare-icon { transform: scale(1.15); }
.pw-enquiry-included-included i { color: #1a7f37; }
/* 2026-09-18 (release fix): was #c7cad6 (grey). The real WordPress
   source's own equivalent rule (astra-child/style.css:5669-5671) uses
   var(--pw-red) — the existing PlotWatch red variable, confirmed
   present in this file already (--pw-red: #ff040a) — not a new/
   invented shade. Green checkmarks above are unchanged. */
.pw-enquiry-included-not-included i { color: var(--pw-red); }
@media (max-width: 640px) {
    .pw-enquiry-legend-corner, .pw-enquiry-legend-label { font-size: 11px; padding: 9px 10px; }
    .pw-enquiry-legend-pkg { padding: 10px 6px; }
    .pw-enquiry-legend-pkg-name { font-size: 11px; }
    .pw-enquiry-legend-pkg-tagline { font-size: 8.5px; }
    .pw-enquiry-legend-price { font-size: 16px; }
    .pw-enquiry-legend-price-cell, .pw-enquiry-legend-action-cell { padding-left: 6px; padding-right: 6px; }
    .pw-enquiry-legend-action-cell .pw-redesign-btn-primary, .pw-enquiry-legend-action-cell .pw-redesign-btn-secondary { padding: 8px 6px; font-size: 11px; }
}

/* ---- Optional Add-ons floating cart ---- */
.pw-enquiry-cart { display: none; position: fixed; top: 76px; right: 24px; width: 340px; max-width: calc(100vw - 32px); max-height: calc(100vh - 100px); overflow-y: auto; background: var(--pw-white); border: 1px solid var(--pw-grey-line); border-radius: var(--pw-radius-lg); box-shadow: var(--pw-shadow-lg); padding: 22px 20px; z-index: 150; }
.pw-enquiry-cart.is-open { display: block; animation: pwCartIn 0.18s ease; }
@keyframes pwCartIn { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: translateY(0); } }
.pw-enquiry-cart-head { position: relative; display: flex; align-items: center; gap: 14px; margin-bottom: 20px; padding-bottom: 18px; padding-right: 26px; border-bottom: 1px solid var(--pw-grey-line); }
.pw-enquiry-cart-close { position: absolute; top: -4px; right: -4px; width: 26px; height: 26px; border: 0; border-radius: 50%; background: var(--pw-grey-bg); color: var(--pw-grey-text); display: flex; align-items: center; justify-content: center; font-size: 11px; cursor: pointer; }
.pw-enquiry-cart-close:hover { background: var(--pw-grey-line); color: var(--pw-navy); }
.pw-enquiry-cart-side-trigger { position: fixed; top: 50%; left: 0; transform: translateY(-50%); z-index: 140; display: flex; flex-direction: column; align-items: center; gap: 6px; padding: 14px 8px; border: 0; border-radius: 0 var(--pw-radius-md) var(--pw-radius-md) 0; background: var(--pw-navy); color: var(--pw-white); font-family: var(--pw-font-display); font-size: 11px; font-weight: 700; letter-spacing: 0.02em; text-transform: uppercase; cursor: pointer; box-shadow: var(--pw-shadow-md); transition: background 0.2s ease, padding-left 0.2s ease; }
.pw-enquiry-cart-side-trigger span { writing-mode: vertical-rl; transform: rotate(180deg); }
.pw-enquiry-cart-side-trigger:hover { background: var(--pw-red); padding-left: 12px; }
@media (max-width: 640px) { .pw-enquiry-cart-side-trigger { display: none; } }
.pw-enquiry-cart-icon { flex: 0 0 auto; width: 42px; height: 42px; border-radius: 50%; background: var(--pw-navy); color: var(--pw-white); display: flex; align-items: center; justify-content: center; font-size: 16px; }
.pw-enquiry-cart-head h3 { color: var(--pw-navy); font-family: var(--pw-font-display); font-size: 15.5px; font-weight: 700; margin: 0 0 2px; }
.pw-enquiry-cart-head p { color: var(--pw-grey-text-soft); font-size: 11.5px; margin: 0; }
.pw-enquiry-cart-list { display: flex; flex-direction: column; gap: 10px; }
.pw-enquiry-cart-item { position: relative; display: flex; align-items: center; gap: 10px; padding: 12px; border: 1.5px solid var(--pw-grey-line); border-radius: var(--pw-radius-sm); cursor: pointer; transition: border-color 0.2s ease, background 0.2s ease; }
.pw-enquiry-cart-item:has(.pw-enquiry-cart-item-input:checked) { border-color: var(--pw-red); background: rgba(255,4,10,0.04); }
.pw-enquiry-cart-item.is-unavailable { cursor: not-allowed; opacity: 0.6; }
.pw-enquiry-cart-item-input { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; }
.pw-enquiry-cart-item-check { flex: 0 0 auto; width: 20px; height: 20px; border-radius: 50%; border: 1.5px solid var(--pw-grey-line); display: flex; align-items: center; justify-content: center; color: transparent; font-size: 10px; transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease; }
.pw-enquiry-cart-item-input:checked ~ .pw-enquiry-cart-item-check { background: var(--pw-red); border-color: var(--pw-red); color: var(--pw-white); }
.pw-enquiry-cart-item-input:focus-visible ~ .pw-enquiry-cart-item-check { outline: 2px solid var(--pw-navy); outline-offset: 2px; }
.pw-enquiry-cart-item-name { flex: 1 1 auto; color: var(--pw-navy); font-weight: 600; font-size: 13px; line-height: 1.35; }
.pw-enquiry-cart-item-price { flex: 0 0 auto; color: var(--pw-red); font-weight: 700; font-size: 13px; white-space: nowrap; }
.is-unavailable .pw-enquiry-cart-item-price { color: var(--pw-grey-text-soft); font-weight: 500; font-style: italic; }
.pw-enquiry-cart-total { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-top: 18px; padding-top: 16px; border-top: 1px dashed var(--pw-grey-line); }
.pw-enquiry-cart-total span { color: var(--pw-grey-text); font-size: 13px; font-weight: 600; }
.pw-enquiry-addons-total-amount { color: var(--pw-navy); font-family: var(--pw-font-display); font-size: 22px; font-weight: 800; }
.pw-enquiry-addons-note { max-width: 560px; margin: 10px 0 0; color: var(--pw-grey-text-soft); font-size: 12px; }

/* ---- Checkout overlay/modal (Items 17-18) ---- */
.pw-checkout-overlay { position: fixed; inset: 0; z-index: 300; display: none; align-items: flex-start; justify-content: center; padding: 40px 20px; overflow-y: auto; background: rgba(4,9,38,0.72); }
.pw-checkout-overlay.is-open { display: flex; }
body.pw-checkout-open { overflow: hidden; }
.pw-checkout-panel { position: relative; width: 100%; max-width: 980px; margin: auto; background: var(--pw-white); border-radius: var(--pw-radius-lg); box-shadow: var(--pw-shadow-lg); }
.pw-checkout-panel .pw-checkout-main { border-radius: var(--pw-radius-lg) 0 0 var(--pw-radius-lg); }
.pw-checkout-panel .pw-checkout-sidebar { border-radius: 0 var(--pw-radius-lg) var(--pw-radius-lg) 0; }
.pw-checkout-close { position: absolute; top: 16px; right: 16px; z-index: 2; width: 36px; height: 36px; border-radius: 50%; border: 0; background: var(--pw-grey-bg); color: var(--pw-navy); font-size: 14px; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.2s ease, color 0.2s ease; }
.pw-checkout-close:hover { background: var(--pw-red); color: var(--pw-white); }
.pw-checkout-body { display: grid; grid-template-columns: 1.5fr 1fr; }
.pw-checkout-body .pw-checkout-main { padding: 32px 36px; border-right: 1px solid var(--pw-grey-line); }
.pw-checkout-main h2 { color: var(--pw-navy); font-family: var(--pw-font-display); font-size: 24px; font-weight: 700; margin: 4px 0 28px; }
.pw-checkout-body .pw-checkout-section { padding: 22px 0; border-bottom: 1px solid var(--pw-grey-line); }
.pw-checkout-body .pw-checkout-section:first-of-type { padding-top: 0; }
.pw-checkout-body .pw-checkout-section:last-of-type { border-bottom: 0; padding-bottom: 0; }
.pw-checkout-section-compact { padding-bottom: 14px; }
.pw-checkout-required { color: var(--pw-red); }
.pw-checkout-section h3 { display: flex; align-items: center; gap: 8px; color: var(--pw-navy); font-family: var(--pw-font-display); font-size: 13.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.03em; margin: 0 0 16px; }
.pw-checkout-section h3 i { color: var(--pw-red); font-size: 13px; }
.pw-checkout-detail-list { margin: 0; display: grid; grid-template-columns: 1fr 1fr; gap: 14px 20px; }
.pw-checkout-detail-row dt { color: var(--pw-grey-text-soft); font-size: 11.5px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.03em; margin: 0 0 3px; }
.pw-checkout-detail-row dd { color: var(--pw-navy); font-size: 14.5px; font-weight: 600; margin: 0; word-break: break-word; }
.pw-checkout-gst-note { color: var(--pw-grey-text-soft); font-size: 12px; margin: 6px 0 0; }
.pw-checkout-plan-card { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 10px 16px; padding: 16px 18px; background: var(--pw-grey-bg); border: 1px solid var(--pw-grey-line); border-radius: var(--pw-radius-md); }
.pw-checkout-plan-card-info { display: flex; flex-direction: column; gap: 3px; }
.pw-checkout-plan-card-name { color: var(--pw-navy); font-family: var(--pw-font-display); font-size: 17px; font-weight: 700; }
.pw-checkout-plan-card-tagline { color: var(--pw-grey-text-soft); font-size: 12.5px; }
.pw-checkout-plan-card-price { color: var(--pw-red); font-family: var(--pw-font-display); font-size: 22px; font-weight: 800; white-space: nowrap; }
.pw-checkout-addon-row { display: flex; align-items: center; gap: 10px; padding: 10px 0; border-bottom: 1px solid var(--pw-grey-line); }
.pw-checkout-addon-row:last-child { border-bottom: 0; padding-bottom: 0; }
.pw-checkout-addon-name { flex: 1 1 auto; color: var(--pw-navy); font-size: 14px; font-weight: 600; }
.pw-checkout-addon-price { flex: 0 0 auto; color: var(--pw-navy); font-size: 14px; font-weight: 700; }
.pw-checkout-addon-remove { flex: 0 0 auto; width: 26px; height: 26px; border-radius: 50%; border: 0; background: var(--pw-grey-bg); color: var(--pw-grey-text); font-size: 11px; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.2s ease, color 0.2s ease; }
.pw-checkout-addon-remove:hover { background: var(--pw-red); color: var(--pw-white); }
.pw-checkout-addons-picker { margin-top: 14px; padding-top: 14px; border-top: 1px dashed var(--pw-grey-line); }
.pw-checkout-addons-picker-label { color: var(--pw-grey-text-soft); font-size: 11.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.03em; margin: 0 0 8px; }
.pw-checkout-addon-row-picker .pw-checkout-addon-price { color: var(--pw-grey-text-soft); font-weight: 500; }
.pw-checkout-addon-add { flex: 0 0 auto; width: 26px; height: 26px; border-radius: 50%; border: 0; background: var(--pw-grey-bg); color: var(--pw-navy); font-size: 11px; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.2s ease, color 0.2s ease; }
.pw-checkout-addon-add:hover:not(:disabled) { background: var(--pw-navy); color: var(--pw-white); }
.pw-checkout-addon-add:disabled { opacity: 0.4; cursor: not-allowed; }
.pw-checkout-addons-empty { color: var(--pw-grey-text-soft); font-size: 13.5px; font-style: italic; margin: 0; }
.pw-checkout-address-note { color: var(--pw-grey-text-soft); font-size: 12.5px; margin: 0 0 14px; }
.pw-checkout-address-fields { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 16px; }
.pw-checkout-address-fields-2col { grid-template-columns: 1fr 1fr; }
.pw-checkout-field-full { grid-column: 1 / -1; }
.pw-checkout-body .pw-checkout-field { display: block; color: var(--pw-grey-text-soft); font-size: 11.5px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.03em; }
.pw-checkout-body .pw-checkout-field input, .pw-checkout-body .pw-checkout-field textarea { display: block; width: 100%; margin-top: 6px; padding: 10px 12px; border: 1px solid var(--pw-grey-line); border-radius: var(--pw-radius-sm); font-family: inherit; font-size: 14px; font-weight: 500; color: var(--pw-navy); text-transform: none; letter-spacing: normal; box-sizing: border-box; resize: vertical; }
.pw-checkout-body .pw-checkout-field input:focus, .pw-checkout-body .pw-checkout-field textarea:focus { outline: none; border-color: var(--pw-navy); }
.pw-checkout-detail-list-readonly { margin-top: 20px; }
.pw-checkout-readonly-note { display: block; color: var(--pw-grey-text-soft); font-size: 10.5px; font-weight: 500; text-transform: none; letter-spacing: normal; margin-top: 2px; }
.pw-checkout-panel .pw-checkout-sidebar { padding: 40px 32px; background: var(--pw-grey-bg); position: sticky; top: 0; align-self: start; max-height: 100vh; overflow-y: auto; }
.pw-checkout-sidebar h3 { color: var(--pw-navy); font-family: var(--pw-font-display); font-size: 15px; font-weight: 700; margin: 0 0 20px; }
.pw-checkout-summary-item { display: flex; flex-direction: column; gap: 3px; padding: 12px 0; border-bottom: 1px solid var(--pw-grey-line); }
.pw-checkout-summary-item:first-child { padding-top: 0; }
.pw-checkout-summary-label { color: var(--pw-grey-text-soft); font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.02em; }
.pw-checkout-summary-value { color: var(--pw-navy); font-family: var(--pw-font-display); font-size: 16px; font-weight: 700; }
.pw-checkout-summary-subtotal { border-bottom: 0; }
.pw-checkout-summary-divider { height: 2px; background: var(--pw-navy); margin: 4px 0 14px; }
.pw-checkout-summary-total { border-bottom: 0; padding-top: 0; padding-bottom: 0; }
.pw-checkout-summary-total .pw-checkout-summary-label { color: var(--pw-navy); font-size: 13px; }
.pw-checkout-summary-total .pw-checkout-summary-value { color: var(--pw-red); font-size: 26px; font-weight: 800; }
.pw-checkout-panel .pw-checkout-status { margin: 16px 0 0; padding: 12px 14px; border-radius: var(--pw-radius-sm); font-size: 13px; font-weight: 600; text-align: center; }
.pw-checkout-panel .pw-checkout-status.is-success { background: #f0fff4; color: #1a7f37; }
.pw-checkout-panel .pw-checkout-status.is-error { background: #fff0f0; color: var(--pw-red); }
.pw-checkout-panel .pw-checkout-status.is-info { background: #f2f4fb; color: var(--pw-navy); }
.pw-checkout-pay-btn { display: block; width: 100%; margin-top: 20px; text-align: center; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pw-checkout-pay-btn:disabled { opacity: 0.55; cursor: not-allowed; }
.pw-checkout-privacy-note { color: var(--pw-grey-text-soft); font-size: 11px; line-height: 1.5; text-align: center; margin: 14px 0 0; }
.pw-checkout-secure-note { display: flex; align-items: center; justify-content: center; gap: 6px; color: var(--pw-grey-text-soft); font-size: 12px; margin: 10px 0 0; }
@media (max-width: 1024px) {
    .pw-checkout-body .pw-checkout-main, .pw-checkout-panel .pw-checkout-sidebar { padding: 32px 28px; }
}
@media (max-width: 767px) {
    .pw-checkout-overlay { padding: 0; align-items: stretch; }
    .pw-checkout-panel { max-width: none; min-height: 100%; border-radius: 0; }
    .pw-checkout-body { grid-template-columns: 1fr; }
    .pw-checkout-panel .pw-checkout-main, .pw-checkout-panel .pw-checkout-sidebar { border-radius: 0; }
    .pw-checkout-body .pw-checkout-main { padding: 56px 20px 24px; border-right: 0; border-bottom: 1px solid var(--pw-grey-line); }
    .pw-checkout-detail-list { grid-template-columns: 1fr; gap: 12px; }
    .pw-checkout-address-fields { grid-template-columns: 1fr; gap: 14px; }
    .pw-checkout-addon-remove, .pw-checkout-addon-add { width: 36px; height: 36px; font-size: 13px; }
    .pw-checkout-addon-row { padding: 12px 0; gap: 12px; }
    .pw-checkout-panel .pw-checkout-sidebar { padding: 24px 20px 32px; position: static; max-height: none; }
}

/* =====================================================================
 * CUSTOMER DASHBOARD (Item 16) — reproduced from the real WordPress
 * source: plotwatch-system's templates/layout.php (sidebar/topbar
 * shell) + customer-dashboard-home.php/dashboard.php/add-property.php/
 * profile.php + that plugin's own assets/css/style.css (.pw-app,
 * .pw-sidebar, .pw-stats-grid, .pw-property-summary-card, etc. — all
 * read fresh 2026-09-08). Originally matched the real WordPress
 * dashboard's own Poppins/red-#dc2626 system verbatim — superseded by
 * explicit instruction (2026-09-21, "internal UI needs professional
 * design"): every authenticated role (Customer/Super Admin/Engineer/
 * Operation) now uses the SAME font stack as the public marketing site
 * (var(--pw-font-display) for headings/buttons, Inter for body text)
 * instead of Poppins, so the logged-in app reads as the same product as
 * the homepage. Login/register/forgot/reset pages (.pw-auth-page) are
 * deliberately NOT touched here — they still match the real WordPress
 * auth pages' own Poppins design, which this change was never asked to
 * revisit.
 * ===================================================================== */
body.pw-app-body { margin: 0; background: #f1f5f9; }
.pw-app-body, .pw-app-body * { font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; }
.pw-app-body h1, .pw-app-body h2, .pw-app-body h3, .pw-app-body h4,
.pw-app-body button, .pw-app-body .pw-btn, .pw-app-body .pw-btn-secondary { font-family: var(--pw-font-display); }
.pw-app-body button, .pw-app-body input[type="submit"] { cursor: pointer; }
.pw-app-body input[type="text"], .pw-app-body input[type="number"], .pw-app-body input[type="date"],
.pw-app-body input[type="email"], .pw-app-body input[type="url"], .pw-app-body select, .pw-app-body textarea {
    font-family: inherit;
}

.pw-app { display: flex; min-height: 100vh; background: #f1f5f9; }

.pw-sidebar { width: 260px; background: #0f172a; color: #fff; padding: 30px 20px; position: fixed; height: 100vh; z-index: 1000; transition: 0.3s; }
.pw-logo { text-align: center; }
.pw-logo img { width: 140px; margin-bottom: 40px; }
.pw-sidebar nav a { display: flex; align-items: center; gap: 10px; padding: 12px 15px; color: #cbd5e1; text-decoration: none !important; border-radius: 8px; margin-bottom: 10px; transition: 0.3s; }
.pw-sidebar nav a:hover, .pw-sidebar nav a.active { background: #1e293b; color: #fff; }
.pw-sidebar-toggle { position: absolute; top: 20px; right: -14px; background: #dc2626; color: #fff; width: 30px; height: 30px; border-radius: 50%; display: flex; align-items: center; justify-content: center; cursor: pointer; box-shadow: 0 4px 12px rgba(220,38,38,0.4); transition: 0.2s; }
.pw-sidebar-toggle:hover { transform: scale(1.1); background: #b91c1c; }
.pw-sidebar-toggle svg { transition: 0.3s; }
.pw-sidebar.collapsed .pw-sidebar-toggle svg { transform: rotate(180deg); }
.pw-sidebar.collapsed { width: 70px; }
.pw-sidebar.collapsed nav a .pw-text { display: none; }

.pw-main { margin-left: 260px; flex: 1; min-width: 0; display: flex; flex-direction: column; position: relative; z-index: 1100; transition: 0.3s; }
/* Pre-existing systemic bug, not introduced this round: a flex item's
   default min-width is "auto" (its content's min-content size), so
   without min-width:0 .pw-main could never shrink below whatever wide
   content (tables, stat-grids) it held — invisible in a document-level
   overflow check only because body{overflow-x:hidden} silently clips
   it instead of showing a scrollbar. Affects every dashboard page at
   mobile widths, confirmed independent of today's toolbar/tabs/badge
   changes by reproducing it on an untouched page (customer-dashboard). */
.pw-main.expanded { margin-left: 70px; }
.pw-header { display: flex; justify-content: space-between; align-items: center; padding: 20px 40px; background: #fff; box-shadow: 0 2px 10px rgba(0,0,0,.05); }
.pw-username { font-weight: 600; }
.pw-logout { color: #dc2626; text-decoration: none; font-weight: 600; background: none; border: 0; font-size: 14px; font-family: var(--pw-font-display); }
.pw-nav-logout-form { display: inline; }
.pw-mobile-menu { display: none; font-size: 22px; cursor: pointer; }
.pw-content { padding: 40px; }

@media (max-width: 768px) {
    .pw-sidebar { transform: translateX(-100%); position: fixed; z-index: 999; }
    .pw-sidebar.open { transform: translateX(0); }
    .pw-main { margin-left: 0; }
    .pw-mobile-menu { display: block; }
}

/* ---- Buttons (real dashboard system — separate from .pw-btn-primary/-secondary above) ---- */
.pw-btn, .pw-app-body button[type="submit"], .pw-app-body input[type="submit"] {
    background: linear-gradient(135deg, #dc2626, #b91c1c); color: #fff; border: none;
    padding: 12px 22px; border-radius: 10px; font-weight: 600; font-size: 14px;
    font-family: var(--pw-font-display); cursor: pointer; transition: all 0.25s ease;
    box-shadow: 0 6px 16px rgba(220,38,38,0.25);
}
.pw-btn:hover { background: linear-gradient(135deg, #b91c1c, #991b1b); transform: translateY(-2px); box-shadow: 0 10px 22px rgba(220,38,38,0.35); }
.pw-btn:active { transform: scale(0.97); }
.pw-small-btn { padding: 8px 14px; font-size: 12px; border-radius: 8px; }

/* ---- Page title ---- */
.pw-page-title, .pw-property-detail-card h2, .pw-profile-card h2 {
    color: #dc2626; font-weight: 700; font-size: 28px; letter-spacing: 0.3px; margin: 0 0 30px;
}

/* ---- Property add / detail / profile cards + shared form styling ---- */
.pw-property-card, .pw-property-detail-card, .pw-profile-card {
    background: #fff; padding: 40px; border-radius: 18px; box-shadow: 0 15px 40px rgba(0,0,0,.08); max-width: 1200px; margin: auto;
}
.pw-profile-card { padding: 45px; border-radius: 20px; box-shadow: 0 20px 50px rgba(0,0,0,.08); max-width: 900px; }
.pw-grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; margin-bottom: 25px; }
.pw-grid-3 .full, .pw-grid-3 .pw-checkout-field-full { grid-column: 1 / -1; }
.pw-property-form label, .pw-profile-form label { font-weight: 600; font-size: 13px; margin-bottom: 6px; display: block; color: #374151; }
.pw-property-form label.required::after { content: " *"; color: #dc2626; }
.pw-property-form input, .pw-property-form select, .pw-property-form textarea,
.pw-property-detail-card input, .pw-property-detail-card textarea, .pw-profile-form input {
    width: 100%; padding: 12px; border: 1px solid #e5e7eb; border-radius: 10px; font-size: 14px; font-family: inherit; transition: 0.3s; box-sizing: border-box;
}
.pw-property-form textarea { resize: vertical; min-height: 100px; }
.pw-property-form input:focus, .pw-property-form select:focus, .pw-property-form textarea:focus,
.pw-property-detail-card input:focus, .pw-property-detail-card textarea:focus, .pw-profile-form input:focus {
    outline: none; border-color: #dc2626; box-shadow: 0 0 0 3px rgba(220,38,38,0.15);
}
.pw-success-box { background: #dcfce7; color: #166534; padding: 12px; border-radius: 8px; }

/* ---- Toast ---- */
.pw-toast { position: fixed; top: 20px; right: 20px; background: #2ecc71; color: #fff; padding: 14px 20px; border-radius: 8px; font-size: 14px; z-index: 9999; box-shadow: 0 5px 15px rgba(0,0,0,0.2); animation: pwToastIn 0.5s ease, pwToastOut 0.5s ease 3s forwards; }
.pw-toast.success { background: #27ae60; }
@keyframes pwToastIn { from { transform: translateX(120%); opacity: 0; } to { transform: translateX(0); opacity: 1; } }
@keyframes pwToastOut { to { opacity: 0; transform: translateX(120%); } }

/* ---- Top bar / back link (property detail + modify) ---- */
.pw-top-bar { display: flex; justify-content: space-between; align-items: center; margin-bottom: 25px; position: relative; }
.pw-back-link { text-decoration: none; font-size: 22px; font-weight: 700; color: #e63946; transition: 0.2s; }
.pw-back-link:hover { color: #c1121f; }

/* ---- Dashboard home: stats / analytics / filter / property progress ---- */
.pw-dashboard { position: relative; }
.pw-dashboard-grid { display: grid; grid-template-columns: 2fr 1fr; gap: 20px; margin-top: 20px; align-items: start; }
.pw-stats-grid { display: grid; grid-template-columns: repeat(6, 1fr); gap: 15px; margin-bottom: 25px; }
.pw-stat-card { padding: 18px; border-radius: 12px; color: #fff; font-weight: 600; min-height: 90px; display: flex; flex-direction: column; justify-content: center; box-shadow: 0 5px 12px rgba(0,0,0,0.08); }
.pw-stat-card.blue { background: #3b82f6; } .pw-stat-card.green { background: #10b981; } .pw-stat-card.orange { background: #f59e0b; }
.pw-stat-card.purple { background: #8b5cf6; } .pw-stat-card.pink { background: #ec4899; } .pw-stat-card.red { background: #ef4444; }
.pw-stat-number { font-size: 24px; font-weight: 700; }
.pw-stat-label { opacity: .9; margin-top: 5px; font-size: 14px; }
.pw-dash-box { background: #fff; padding: 25px; border-radius: 12px; box-shadow: 0 3px 12px rgba(0,0,0,0.05); }
/* Real WordPress rule (style.css, "DASH BOX HEIGHT" section, read fresh
   and traced through the cascade for this audit) — caps each of the 3
   home-dashboard boxes (Visit Analytics/Upcoming Visits/Property
   Progress) at 320px with an internal scrollbar once content overflows,
   confirmed via the real source's own later comment describing exactly
   this rule and a separate .pw-dash-box-full class (superadmin-only,
   not used by the customer dashboard) that undoes it elsewhere. Was
   previously missing here entirely, letting these boxes grow unbounded. */
.pw-dash-box { max-height: 320px; overflow: auto; }
.pw-dash-box h3 { color: #ef4444; font-weight: 700; border-left: 4px solid #ef4444; padding-left: 10px; margin: 0 0 20px; font-size: 16px; }
.pw-property-progress { margin-bottom: 20px; }
.pw-property-title { font-weight: 600; margin-bottom: 8px; color: #333; }
.scroll-box { margin-top: 20px; }

/* 2026-09-18 (Stage 1 admin system) — new, standalone-only: the
   Superadmin/Engineer/Operation dashboards' read-only listing tables
   and the Users tab's search/filter bar. No real WordPress source to
   compare against for these specific classes (this task's own spec:
   "use the existing PlotWatch visual language where appropriate" —
   reuses the same tokens/spacing/radius every other dashboard panel
   already uses, not a new design system). */
.pw-admin-table-wrap { background: #fff; border-radius: 12px; box-shadow: 0 3px 12px rgba(0,0,0,0.05); overflow-x: auto; margin-top: 16px; }
.pw-admin-table { width: 100%; border-collapse: collapse; font-size: 13.5px; min-width: 600px; }
.pw-admin-table th, .pw-admin-table td { padding: 10px 14px; text-align: left; border-bottom: 1px solid var(--pw-grey-line); white-space: nowrap; }
.pw-admin-table th { background: var(--pw-grey-bg-alt); color: var(--pw-navy); font-weight: 700; }
.pw-admin-table td a { color: var(--pw-red); font-weight: 600; text-decoration: none; }
.pw-admin-table tr:last-child td { border-bottom: 0; }
.pw-admin-filter-form { display: flex; flex-wrap: wrap; gap: 10px; margin: 14px 0; }
.pw-admin-filter-form input, .pw-admin-filter-form select { padding: 9px 12px; border: 1.5px solid var(--pw-grey-line); border-radius: 8px; font-family: inherit; font-size: 13.5px; }
@media (max-width: 640px) {
    .pw-admin-table { font-size: 12px; }
    .pw-admin-filter-form { flex-direction: column; align-items: stretch; }
}

/* .pw-dash-box-full — real WordPress source's own class (confirmed via
   direct read of superadmin-*.php templates): undoes .pw-dash-box's
   320px scroll cap for the Superadmin tabs' own boxes (Dashboard's
   Recent Enquiries, Enquiries detail, Pricing/Reviews/Blog panels),
   none of which should ever be clipped/scrolled the way the customer
   dashboard's small analytics boxes are. */
.pw-dash-box-full { max-height: none; overflow: visible; }

/* 2026-09-18 (Step 2 Super Admin rebuild) — Dashboard/Enquiries/Pricing/
   Reviews/Blog tab UI, reproducing the real WordPress Super Admin's own
   .pw-admin-* / .pw-enq-* / .pw-detail-* / .pw-tab-* / .pw-price-* / .pw-review-
   admin-* class names (confirmed present in the real templates by
   direct read; their exact colour values weren't extracted, so these
   reuse this app's existing tokens/spacing rather than guessing the
   real plugin's own stylesheet). */
.pw-admin-card-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 16px; flex-wrap: wrap; margin-bottom: 6px; }
.pw-admin-card-head h3 { margin-bottom: 4px; }
.pw-admin-card-head p { margin: 0; font-size: 13px; }
.pw-admin-toolbar { display: flex; flex-wrap: wrap; gap: 10px; margin: 14px 0; align-items: center; }
/* The generic input[type="text"]{width:100%} rule makes the search
   box claim the toolbar's full flex-row width, forcing the status
   select/Filter button onto their own wrapped line. Scope the search
   input to grow/shrink like a normal flex item instead. */
body.pw-app-body .pw-admin-toolbar input[type="text"] { flex: 1 1 220px; width: auto; min-width: 0; }
body.pw-app-body .pw-admin-toolbar select { flex: 0 1 220px; width: auto; }

/* Canonical Super Admin BUTTON system — one shared shape (height/
   padding/radius/font) for every button in the admin, no matter which
   of the two historical class names (.pw-btn from Stage 1's shared
   dashboard shell, .pw-admin-btn from Step 2's own admin-only work) a
   given call site uses. Audit finding: these previously disagreed on
   red shade (#ff040a brand red vs an unrelated #dc2626/#b91c1c
   Tailwind-red gradient), padding (11px/22px vs 9px/16px), and radius
   — the classic "different button styles on different pages" problem.
   Consolidated here into ONE definition per semantic role instead of
   renaming every PHP call site (lower risk, same visual result).
   ".pw-admin-btn-remove" specifically used to be a bare underlined text
   link with no border/background at all (Deactivate/Delete/Remove) —
   now a real danger-styled button matching the others' shape. */
.pw-btn, .pw-admin-btn, .pw-admin-btn-primary,
.pw-admin-btn-ghost, .pw-admin-btn-remove {
    -webkit-appearance: none; -moz-appearance: none; appearance: none;
    display: inline-flex; align-items: center; justify-content: center; gap: 6px;
    min-height: 40px; padding: 0 22px; border-radius: var(--pw-radius-sm);
    font-weight: 600; font-size: 13.5px; font-family: var(--pw-font-display);
    cursor: pointer; text-decoration: none; box-sizing: border-box;
    transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease, transform 0.1s ease;
}
.pw-btn, .pw-admin-btn, .pw-admin-btn-primary {
    background: var(--pw-red); color: #fff; border: none; box-shadow: none;
}
.pw-btn:hover, .pw-admin-btn:hover, .pw-admin-btn-primary:hover { background: #d60309; }
.pw-btn:active, .pw-admin-btn:active, .pw-admin-btn-primary:active { transform: scale(0.97); }
.pw-admin-btn-ghost { background: #fff; color: var(--pw-navy); border: 1.5px solid var(--pw-grey-line); }
.pw-admin-btn-ghost:hover { background: var(--pw-grey-bg); border-color: var(--pw-grey-text-soft); }
.pw-admin-btn-remove { background: #fff; color: var(--pw-danger, #dc2626); border: 1.5px solid #fecaca; }
.pw-admin-btn-remove:hover { background: var(--pw-danger-soft, #fee2e2); border-color: var(--pw-danger, #dc2626); }
.pw-admin-row-actions { white-space: nowrap; }
.pw-inline-form { display: inline; }
.pw-admin-section-gap { margin-top: 20px; }
.pw-admin-pagination { display: flex; gap: 6px; margin-top: 16px; flex-wrap: wrap; }
.pw-admin-pagination a { display: inline-block; min-width: 34px; text-align: center; padding: 7px 10px; border-radius: 8px; background: #fff; border: 1.5px solid var(--pw-grey-line); color: var(--pw-navy); font-weight: 600; font-size: 13px; text-decoration: none; }
.pw-admin-pagination a.is-current { background: var(--pw-red); border-color: var(--pw-red); color: #fff; }
.pw-admin-pagination a:hover { border-color: var(--pw-red); color: var(--pw-red); }
.pw-admin-table td[colspan] { text-align: center; color: var(--pw-grey-text-soft); padding: 30px 16px; font-size: 13.5px; }

/* Enquiry status badges */
.pw-enq-code { font-weight: 700; color: var(--pw-navy); }
.pw-price-cell { font-weight: 700; color: var(--pw-navy); white-space: nowrap; }
.pw-enq-view-btn { color: var(--pw-red); font-weight: 600; text-decoration: none; }
.pw-enq-status { display: inline-block; padding: 4px 10px; border-radius: 999px; font-size: 11.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.03em; background: #e5e7eb; color: #374151; }
.pw-enq-status-new { background: #dbeafe; color: #1d4ed8; }
.pw-enq-status-service-area-request { background: #fee2e2; color: #b91c1c; }
.pw-enq-status-plans-viewed { background: #fef3c7; color: #92400e; }
.pw-enq-status-contact-requested { background: #ede9fe; color: #6d28d9; }
.pw-enq-status-payment-pending { background: #fef3c7; color: #92400e; }
.pw-enq-status-payment-successful { background: #d1fae5; color: #047857; }
.pw-enq-status-subscription-active { background: #dcfce7; color: #166534; }
.pw-enq-status-payment-failed { background: #fee2e2; color: #b91c1c; }
.pw-enq-status-cancelled { background: #e5e7eb; color: #4b5563; }

/* Enquiry detail view */
.pw-detail-back { display: inline-block; margin-bottom: 16px; color: var(--pw-red); font-weight: 600; text-decoration: none; }
.pw-detail-head { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 10px; margin-bottom: 18px; }
.pw-detail-head h2 { margin: 0; }
.pw-detail-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
.pw-detail-section { background: var(--pw-grey-bg-alt); border-radius: 12px; padding: 16px 18px; }
.pw-detail-section h4 { margin: 0 0 10px; font-size: 13px; color: var(--pw-navy); text-transform: uppercase; letter-spacing: 0.04em; }
.pw-detail-row { display: flex; justify-content: space-between; gap: 10px; padding: 6px 0; border-bottom: 1px dashed var(--pw-grey-line); font-size: 13.5px; }
.pw-detail-row:last-child { border-bottom: 0; }
.pw-detail-row span:first-child { color: var(--pw-grey-text); }
@media (max-width: 900px) { .pw-detail-grid { grid-template-columns: 1fr; } }

/* Pricing tab — sub-tab switcher + price grid */
/* True segmented control (one grey pill-shaped track, no gaps between
   segments) instead of 3 separate pill buttons floating side by side. */
.pw-tabs {
    display: inline-flex; gap: 3px; margin-bottom: 20px; flex-wrap: wrap;
    background: #eef0f5; border-radius: 999px; padding: 4px; max-width: 100%;
}
.pw-tab-btn {
    display: inline-block; padding: 9px 20px; border-radius: 999px; border: none; background: transparent;
    color: var(--pw-grey-text); font-weight: 600; font-size: 13.5px; cursor: pointer;
    transition: background 0.15s ease, color 0.15s ease, box-shadow 0.15s ease;
}
/* display:inline-block above also makes this class render correctly
   when used on a real <a> tab (Operation's Assign Package/Assign
   Visits tabs — real page navigation, not the JS-toggled <button>
   version elsewhere) — same look either way. */
.pw-tab-btn:hover { color: var(--pw-navy); background: rgba(255,255,255,0.6); }
.pw-tab-btn.is-active { background: #fff; color: var(--pw-red); font-weight: 700; box-shadow: var(--pw-shadow-sm); }
/* -webkit-appearance/appearance reset — a plain <button> can otherwise
   retain a faint native chrome (border/background) in some browsers
   even with border:none/background set, which is what made this read
   as "still a default browser button" despite the rule above already
   existing. The container gets a visible border too, so the whole
   segmented-control shape reads clearly even at a glance/low contrast. */
.pw-tabs {
    -webkit-appearance: none; appearance: none; border: 1px solid var(--pw-grey-line);
}
.pw-tab-btn {
    -webkit-appearance: none; -moz-appearance: none; appearance: none; outline: none;
}
.pw-tab-panel[hidden] { display: none; }
.pw-price-table th { white-space: normal; }
/* Distinct sizing-only overrides — the canonical input/select/textarea
   rule (further down, scoped under body.pw-app-body) already
   supplies the shared padding/border/radius/font every form control in
   the admin uses; these keep only what's genuinely special about a
   price-grid cell (narrow) or an inline table-header dropdown (compact,
   auto-width) rather than re-declaring the same visual values a third
   time in a third place. */
.pw-price-input input { min-width: 90px; }
.pw-addon-head-cell { min-width: 220px; }
body.pw-app-body select.pw-mode-select {
    display: inline-block; width: auto; margin-top: 6px; text-transform: none; font-weight: 500;
    padding: 5px 8px; border-radius: 6px; font-size: 12.5px; min-height: 30px;
}
.pw-admin-remove-label { display: block; margin-top: 8px; font-weight: 400; text-transform: none; letter-spacing: normal; font-size: 12px; color: var(--pw-danger, #b91c1c); }
.pw-admin-remove-label input { width: auto; vertical-align: middle; }
.pw-admin-new-addon { margin-top: 24px; padding: 16px 18px; border: 1px dashed var(--pw-grey-line); border-radius: 10px; }
.pw-admin-new-addon h4 { margin: 0 0 4px; font-size: 13.5px; }
.pw-admin-new-addon p { margin: 0 0 10px; font-size: 12.5px; }
.pw-admin-new-addon input { max-width: 360px; }
.pw-districts-textarea { line-height: 1.6; }
.pw-pricing-save-bar { display: flex; justify-content: space-between; align-items: center; gap: 16px; flex-wrap: wrap; margin-top: 24px; padding-top: 16px; border-top: 1px solid var(--pw-grey-line); }
.pw-pricing-save-note { font-size: 12.5px; color: var(--pw-grey-text); }

/* Reviews tab */
.pw-review-admin-block {
    border: 1px solid var(--pw-grey-line); border-radius: var(--pw-radius-md); box-shadow: var(--pw-shadow-sm);
    padding: 18px 20px; margin-bottom: 16px; background: #fff; transition: box-shadow 0.15s ease, border-color 0.15s ease;
}
.pw-review-admin-block:hover { box-shadow: var(--pw-shadow-md); border-color: var(--pw-grey-text-soft); }
.pw-review-admin-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 20px; }
/* Blog's "Write New Post" form and each Reviews card stack plain
   <label> fields directly (unlike Add/Edit User, which uses .pw-grid-3
   and already gets its 16px gap from that grid) — with nothing but the
   base 6px label margin between them, one field's input sat only 6px
   above the next field's label, reading as a single compressed block
   rather than a "proper vertical form layout". Widened to real
   breathing room between each field group; unrelated to Add/Edit
   User's own spacing, which this selector list doesn't touch. */
.pw-review-admin-block label, .pw-admin-card-head + form label, .pw-dash-box-full > form > label { display: block; font-weight: 600; font-size: 13px; margin-bottom: 22px; color: #374151; }
.pw-review-admin-block input, .pw-review-admin-block textarea,
.pw-dash-box-full > form input[type="text"], .pw-dash-box-full > form textarea, .pw-dash-box-full > form select {
    margin-top: 8px;
}

/* Blog tab */
.pw-admin-current-image { display: flex; align-items: center; gap: 12px; margin: 12px 0; }
.pw-admin-current-image img { border-radius: 8px; }
.pw-admin-current-image label { font-weight: 400 !important; display: inline-flex !important; align-items: center; gap: 6px; margin: 0 !important; }
.pw-admin-current-image input { width: auto !important; }

/* Add User / Edit User — Save + Cancel sit together, same shared
   button system as everywhere else in the admin. */
.pw-form-actions { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; margin-top: 8px; }

/* Blog featured-image upload — a cosmetic-only "drop zone" look around
   the existing plain <input type="file">; the file input itself, its
   name="pw_post_image", and the server-side validation in
   ImageUpload::storeBlogImage() are completely unchanged — this is
   presentation only. The filename readout and image preview are drawn
   by a small inline script (reviewTemplateScript()-style convention
   already used elsewhere in this file) using the browser's own
   FileReader on the SAME input, not a new upload mechanism. */
.pw-file-drop {
    position: relative; border: 1.5px dashed var(--pw-grey-line); border-radius: var(--pw-radius-md);
    padding: 20px; text-align: center; background: #fafbfd; transition: border-color 0.15s ease, background 0.15s ease;
}
.pw-file-drop:hover, .pw-file-drop.has-file { border-color: var(--pw-red); background: #fff5f5; }
.pw-file-drop input[type="file"] { position: absolute; inset: 0; opacity: 0; cursor: pointer; min-height: 100%; }
.pw-file-drop-hint { font-size: 13px; color: var(--pw-grey-text); pointer-events: none; }
.pw-file-drop-hint strong { color: var(--pw-navy); }
.pw-file-drop-preview { max-width: 160px; max-height: 100px; border-radius: 8px; margin-top: 10px; pointer-events: none; display: none; }
.pw-file-drop-name { font-size: 12.5px; color: var(--pw-navy); font-weight: 600; margin-top: 8px; pointer-events: none; display: none; }

@media (max-width: 640px) {
    .pw-admin-toolbar { flex-direction: column; align-items: stretch; }
    .pw-review-admin-row { grid-template-columns: 1fr; }
}

.pw-timeline { display: flex; align-items: center; gap: 10px; flex-wrap: nowrap; overflow-x: auto; padding-bottom: 5px; }
.pw-step { position: relative; padding: 8px 12px; border-radius: 20px; font-size: 12px; font-weight: 600; background: #e5e7eb; color: #444; flex-shrink: 0; }
.pw-step span { white-space: nowrap; }
.pw-step.green { background: #22c55e; color: #fff; }
.pw-step.purple { background: #8b5cf6; color: #fff; }
.pw-step.gray { background: #e5e7eb; }
.pw-step:after { content: "\2192"; margin-left: 10px; color: #999; }
.pw-step:last-child:after { display: none; }
.pw-visit-list-modern { display: flex; flex-direction: column; gap: 12px; }
.pw-visit-item { display: flex; justify-content: space-between; align-items: center; padding: 12px 15px; background: #f9fafb; border-radius: 8px; border: 1px solid #eee; transition: .2s; }
.pw-visit-item:hover { background: #f3f4f6; }
.pw-visit-left { font-weight: 700; color: #111; }
.pw-visit-right { color: #555; font-weight: 600; }
/* Real values traced through the WordPress stylesheet's own cascade for
   this audit: .pw-donut-grid/.pw-donut-card canvas are each declared
   TWICE in the real source (once under a "VISIT ANALYTICS" comment,
   once under a later "OPERATION DASHBOARD" comment) with different
   values and equal specificity — the LATER declaration in source order
   wins in every browser regardless of which dashboard renders it, so
   these are the values that actually reach the screen: a fluid 4-column
   grid with 30px gaps, and a fixed (non-responsive, non-aspect-ratio)
   110x110px canvas. Previously this used an earlier-looking but
   non-winning set of values (10px gap, 130px canvas). */
.pw-donut-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 30px; margin-top: 25px; align-items: center; justify-content: space-around; }
.pw-donut-card { text-align: center; }
.pw-donut-card canvas { width: 110px !important; height: 110px !important; display: block; margin: auto; }

/* Operation Member phase — Assign Package's add-on checkbox list and the
   dashboard-home "Engineers" workload cards. No real WordPress stylesheet
   rule exists for either (assign-package.php/operation-dashboard-home.php
   use ad-hoc inline-ish markup with no dedicated class), so these are new,
   minimal, and deliberately styled like this file's own existing
   .pw-visit-item/.pw-donut-card rather than inventing a new visual system. */
.pw-addon-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 10px; margin-top: 10px; }
.pw-addon-item { display: flex; align-items: center; gap: 8px; padding: 10px 12px; background: #f9fafb; border-radius: 8px; border: 1px solid #eee; font-size: 13.5px; }
.pw-engineer-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 12px; }
.pw-donut-title { margin-top: 10px; font-weight: 600; color: #444; }
.pw-filter-bar { display: flex; justify-content: flex-end; margin-bottom: 20px; }
.pw-filter-btn { background: var(--pw-red); color: #fff; border: none; padding: 10px 18px; border-radius: 8px; cursor: pointer; font-weight: 600; font-family: var(--pw-font-display); }
.pw-filter-modal { display: none; position: absolute; top: 60px; right: 20px; background: transparent; z-index: 999; }
.pw-filter-box { background: #fff; padding: 25px; width: 300px; border-radius: 10px; box-shadow: 0 10px 30px rgba(0,0,0,.15); }
.pw-filter-box h3 { margin: 0 0 20px; }
.pw-filter-box label { font-size: 13px; font-weight: 600; margin-bottom: 5px; display: block; }
.pw-filter-box select, .pw-filter-box input { width: 100%; padding: 10px; border-radius: 6px; border: 1px solid #ddd; margin-bottom: 15px; font-family: inherit; box-sizing: border-box; }
.pw-filter-actions { display: flex; justify-content: space-between; }
/* Real WordPress "RADIO BUTTON FIX" rule (style.css) — backs the
   Active-Subscription Yes/No filter control on the dashboard's filter
   modal. That control is non-functional in the real source itself (its
   handler reads $_GET['active'] but the radio inputs submit as
   'active_subscription' — a real, pre-existing no-op in WordPress, not
   something to silently "fix" here) — this only reproduces its
   appearance, faithfully including that it does nothing. */
.pw-radio-group { display: flex; gap: 15px; margin-top: 10px; }
.pw-radio-group label { display: flex; align-items: center; gap: 6px; font-size: 14px; cursor: pointer; }
.pw-radio-group input[type="radio"] { accent-color: #dc2626; cursor: pointer; }
.pw-reset { background: #eee; padding: 10px 15px; border-radius: 6px; text-decoration: none; color: #333; }
.pw-apply { background: var(--pw-red); color: #fff; border: none; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-family: var(--pw-font-display); }

/* ---- My Properties: card grid + status/subscription badges ---- */
.pw-property-card-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 25px; }
.pw-property-summary-card { position: relative; background: #fff; padding: 28px 18px 14px; border-radius: 14px; border: 1px solid #eef2f7; box-shadow: 0 8px 20px rgba(0,0,0,0.06); text-decoration: none !important; color: #111827; transition: .25s ease; border-left: 2px solid transparent; }
.pw-property-summary-card:hover { transform: translateY(-4px); box-shadow: 0 12px 28px rgba(0,0,0,0.08); border-color: #e5e7eb; }
.pw-property-summary-card.pw-sub-active { border-left: 5px solid #22c55e; background: #ecfdf5; border-color: #bbf7d0; }
.pw-property-summary-card.pw-sub-expired { border-left: 5px solid #ef4444; background: #fef2f2; border-color: #fecaca; }
.pw-card-top { display: flex; justify-content: flex-start; gap: 10px; margin-bottom: 4px; }
.pw-property-id { font-size: 12px; font-weight: 600; color: #6b7280; }
.pw-location { font-size: 13px; color: #6b7280; margin-top: 2px; }
.pw-property-summary-card h3 { font-size: 18px; font-weight: 600; color: #0f172a; margin: 0 0 2px; }
.pw-sub-status { position: absolute; top: 8px; left: 14px; font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: .6px; }
.pw-sub-status.pw-sub-active { color: #15803d; } .pw-sub-status.pw-sub-expired { color: #b91c1c; }
.pw-status-badge { position: absolute; top: 10px; right: 10px; display: inline-block; padding: 6px 14px; font-size: 12px; font-weight: 600; border-radius: 20px; white-space: nowrap; }
/* 2026-09-21 (layout fix): this class was designed for exactly one
   context — a badge pinned to the top-right corner of a relatively-
   positioned property-summary card (Customer's My Properties). Reused
   later for status columns inside plain admin tables (Engineer's visits
   list, Operation's properties/assign-visits tables), where there is no
   positioned card ancestor for it to anchor to — so position:absolute
   escapes all the way up to the nearest positioned ancestor in the
   whole page, rendering the badge over the global header instead of in
   its table cell. Badges inside a table are never meant to float
   free-form like a card corner-badge, so this resets them back to a
   normal inline element without touching the card usage at all. */
.pw-admin-table .pw-status-badge,
.pw-admin-table-wrap .pw-status-badge { position: static; display: inline-flex; top: auto; right: auto; }
.pw-status-pending { background: #fef3c7; color: #92400e; }
.pw-status-warning { background: #dbeafe; color: #1e40af; }
.pw-status-completed { background: #dcfce7; color: #166534; }
.pw-status-active { background: #e0f2fe; color: #0369a1; }
.pw-status-overdue { background: #fee2e2; color: #b91c1c; }
/* Engineer's own visits list uses this exact class name (engineer-dashboard.php:238), distinct from the property-status ".pw-status-warning" — same blue, different literal status vocabulary (visit_status vs property.status). */
.pw-status-scheduled { background: #dbeafe; color: #1e40af; }

/* ---- Single property: action-card grid (Modify + visit cards) ---- */
.pw-property-actions { display: grid; grid-template-columns: repeat(4, 1fr); gap: 20px; margin-top: 25px; }
.pw-action-card { height: 110px; border-radius: 14px; display: flex; flex-direction: column; justify-content: center; align-items: center; text-align: center; font-weight: 600; text-decoration: none !important; font-size: 15px; box-shadow: 0 8px 20px rgba(0,0,0,0.08); color: #111827; }
.pw-card-property { background: #f97316; color: #fff; }
.pw-card-pending { background: #e5e7eb; color: #374151; }
.pw-card-scheduled { background: #3b82f6; color: #fff; }
.pw-card-next { background: #facc15; color: #111827; }
.pw-card-completed { background: #22c55e; color: #fff; }

@media (max-width: 1000px) { .pw-property-actions { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 768px) {
    .pw-stats-grid { grid-template-columns: repeat(3, 1fr); }
    .pw-dashboard-grid { grid-template-columns: 1fr; }
    .pw-donut-grid { grid-template-columns: repeat(2, 1fr); }
    .pw-grid-3 { grid-template-columns: 1fr; }
    .pw-content { padding: 20px; }
    .pw-property-card, .pw-property-detail-card, .pw-profile-card { padding: 24px; }
}
@media (max-width: 600px) {
    .pw-stats-grid { grid-template-columns: repeat(2, 1fr); }
    .pw-property-actions { grid-template-columns: repeat(2, 1fr); }
}
/* Real WordPress "SMALL MOBILE" @media(max-width:480px) step — was
   missing here, leaving the 6 stat cards stuck at 2-per-row on narrow
   phones instead of collapsing to a single column like the source. */
@media (max-width: 480px) {
    .pw-stats-grid { grid-template-columns: 1fr; }
}

/* =====================================================================
 * BLOG (Items 14-15) — reproduced from the real WordPress source:
 * astra-child/template-parts/homepage/blog.php's [plotwatch_blog]
 * shortcode (listing) + astra-child/single.php (article), and that
 * theme's own .pw-redesign-blog-* style.css rules (all read fresh
 * 2026-09-08). Real class names kept as-is (this whole section is a
 * direct port, same reasoning as the plan-finder/checkout section
 * above) — .pw-blog-* (Phase 9's own, simpler, now-superseded classes)
 * left orphaned in this file per this project's usual convention.
 * ===================================================================== */
.pw-redesign-blog-page { padding-top: 0; }
.pw-redesign-blog-page:not(.pw-redesign-blog-single-page) > * { width: 100vw; position: relative; left: 50%; margin-left: -50vw; }

.pw-redesign-blog-hero { background: radial-gradient(120% 140% at 15% 0%, #0a1440 0%, var(--pw-navy) 55%); padding: 76px 24px 64px; text-align: center; }
.pw-redesign-blog-hero .pw-redesign-section-inner { max-width: 720px; margin: 0 auto; }
.pw-redesign-blog-hero .pw-redesign-section-eyebrow { color: var(--pw-red); justify-content: center; }
.pw-redesign-blog-hero h1 { color: var(--pw-white); font-size: clamp(28px, 3.6vw, 42px); font-weight: 700; letter-spacing: -0.01em; line-height: 1.24; margin: 0 0 14px; }
.pw-redesign-blog-hero p { color: rgba(216,226,245,0.82); font-size: 16.5px; line-height: 1.65; margin: 0; }

.pw-redesign-blog-listing { background: var(--pw-grey-bg); padding: 64px 24px 88px; }
.pw-redesign-blog-listing .pw-redesign-section-inner { max-width: var(--pw-container); margin: 0 auto; }
.pw-redesign-blog-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 30px; }
.pw-redesign-blog-card { background: var(--pw-white); border-radius: var(--pw-radius-md); overflow: hidden; box-shadow: var(--pw-shadow-md); display: flex; flex-direction: column; transition: transform 0.25s ease, box-shadow 0.25s ease; }
.pw-redesign-blog-card:hover { transform: translateY(-4px); box-shadow: var(--pw-shadow-lg); }
.pw-redesign-blog-card-image { display: block; aspect-ratio: 16 / 10; background: var(--pw-grey-bg-alt); overflow: hidden; }
.pw-redesign-blog-card-image img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform 0.4s ease; }
.pw-redesign-blog-card:hover .pw-redesign-blog-card-image img { transform: scale(1.05); }
.pw-redesign-blog-card-image-fallback { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; }
.pw-redesign-blog-card-image-fallback i { font-size: 30px; color: var(--pw-grey-text-soft); }
.pw-redesign-blog-card-body { padding: 22px 22px 24px; display: flex; flex-direction: column; gap: 10px; flex: 1 1 auto; }
.pw-redesign-blog-card-category { display: inline-flex; align-self: flex-start; background: rgba(255,4,10,0.08); color: var(--pw-red); font-size: 11.5px; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; padding: 5px 10px; border-radius: 20px; }
.pw-redesign-blog-card-title { font-size: 19px; font-weight: 700; line-height: 1.35; margin: 0; }
.pw-redesign-blog-card-title a { color: var(--pw-navy); text-decoration: none; }
.pw-redesign-blog-card-title a:hover { color: var(--pw-red); }
.pw-redesign-blog-card-excerpt { color: var(--pw-grey-text); font-size: 14.5px; line-height: 1.65; margin: 0; flex: 1 1 auto; }
.pw-redesign-blog-card-meta { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-top: 6px; padding-top: 14px; border-top: 1px solid var(--pw-grey-line); }
.pw-redesign-blog-card-date { color: var(--pw-grey-text-soft); font-size: 12.5px; }
.pw-redesign-blog-card-readmore { color: var(--pw-red); font-weight: 700; font-size: 13.5px; text-decoration: none; white-space: nowrap; }
.pw-redesign-blog-card-readmore i { margin-left: 4px; }
.pw-redesign-blog-card-readmore:hover { text-decoration: underline; }
.pw-redesign-blog-empty { text-align: center; padding: 60px 20px; color: var(--pw-grey-text); }
.pw-redesign-blog-empty i { font-size: 30px; color: var(--pw-grey-text-soft); margin-bottom: 12px; display: block; }
.pw-redesign-blog-pagination { display: flex; align-items: center; justify-content: center; gap: 22px; margin-top: 48px; }
.pw-redesign-blog-page-link { color: var(--pw-navy); font-weight: 700; font-size: 14px; text-decoration: none; padding: 10px 18px; border: 1.5px solid var(--pw-grey-line); border-radius: var(--pw-radius-sm); transition: border-color 0.2s ease, color 0.2s ease; }
.pw-redesign-blog-page-link:hover { border-color: var(--pw-red); color: var(--pw-red); }
.pw-redesign-blog-page-current { color: var(--pw-grey-text-soft); font-size: 13px; }

@media (max-width: 1024px) { .pw-redesign-blog-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 640px) {
    .pw-redesign-blog-grid { grid-template-columns: 1fr; }
    .pw-redesign-blog-hero { padding: 56px 20px 48px; }
    .pw-redesign-blog-listing { padding: 44px 18px 60px; }
}

/* ---- Article (single post) ---- */
.pw-redesign-blog-single-page { background: var(--pw-white); padding-bottom: 90px; }
.pw-redesign-blog-article-inner { max-width: 760px; margin: 0 auto; padding: 56px 24px 0; }
.pw-redesign-blog-article-head { text-align: left; margin-bottom: 28px; }
.pw-redesign-blog-back { display: inline-flex; align-items: center; color: var(--pw-grey-text); font-size: 13.5px; font-weight: 600; text-decoration: none; margin-bottom: 18px; }
.pw-redesign-blog-back:hover { color: var(--pw-red); }
.pw-redesign-blog-article-head .pw-redesign-blog-card-category { margin-bottom: 14px; }
.pw-redesign-blog-article-head h1 { color: var(--pw-navy); font-size: clamp(26px, 3.6vw, 38px); font-weight: 700; letter-spacing: -0.01em; line-height: 1.28; margin: 0 0 14px; }
.pw-redesign-blog-article-meta { color: var(--pw-grey-text-soft); font-size: 13.5px; }
.pw-redesign-blog-article-image { border-radius: var(--pw-radius-lg); overflow: hidden; margin: 0 0 36px; box-shadow: var(--pw-shadow-md); }
.pw-redesign-blog-article-image img { width: 100%; height: auto; display: block; }
.pw-redesign-blog-article-content { color: #35405a; font-size: 17px; line-height: 1.85; }
.pw-redesign-blog-article-content > * + * { margin-top: 22px; }
.pw-redesign-blog-article-content h2, .pw-redesign-blog-article-content h3, .pw-redesign-blog-article-content h4 { color: var(--pw-navy); font-family: var(--pw-font-display) !important; font-weight: 700; line-height: 1.35; margin-top: 38px; }
.pw-redesign-blog-article-content h2 { font-size: 25px; }
.pw-redesign-blog-article-content h3 { font-size: 21px; }
.pw-redesign-blog-article-content h4 { font-size: 18px; }
.pw-redesign-blog-article-content a { color: var(--pw-red); text-decoration: underline; text-underline-offset: 2px; }
.pw-redesign-blog-article-content ul, .pw-redesign-blog-article-content ol { padding-left: 22px; }
.pw-redesign-blog-article-content li + li { margin-top: 8px; }
.pw-redesign-blog-article-content blockquote { border-left: 3px solid var(--pw-red); background: var(--pw-grey-bg); padding: 16px 22px; border-radius: 0 var(--pw-radius-sm) var(--pw-radius-sm) 0; color: var(--pw-navy); font-style: italic; }
.pw-redesign-blog-article-content img { max-width: 100%; height: auto; border-radius: var(--pw-radius-md); display: block; }
.pw-redesign-blog-article-content figure { margin: 0; }
.pw-redesign-blog-article-content figcaption { color: var(--pw-grey-text-soft); font-size: 13px; text-align: center; margin-top: 8px; }
.pw-redesign-blog-article-content pre, .pw-redesign-blog-article-content code { background: var(--pw-grey-bg); border-radius: var(--pw-radius-sm); font-size: 14px; }
.pw-redesign-blog-article-content pre { padding: 16px 18px; overflow-x: auto; }
.pw-redesign-blog-article-content code { padding: 2px 6px; }
.pw-redesign-blog-article-footer { margin-top: 52px; padding-top: 28px; border-top: 1px solid var(--pw-grey-line); }
@media (max-width: 640px) { .pw-redesign-blog-article-inner { padding: 40px 18px 0; } }

/* =====================================================================
 * FLOATING WHATSAPP BUTTON + FLOATING VIDEOS — ported verbatim from the
 * real WordPress theme's own style.css (astra-child, lines 4546-4801,
 * read fresh). Homepage-only (Layout::page() only renders this markup
 * when $activeNav === 'home'), same values, same class names, nothing
 * invented or redesigned.
 * ===================================================================== */
.pw-redesign-floating-videos {
    position: fixed;
    right: 18px;
    top: 74%;
    transform: translateY(-50%);
    z-index: 60;
    display: flex;
    flex-direction: column;
    gap: 14px;
}

.pw-redesign-floating-video-bubble {
    position: relative;
    display: block;
    width: 148px;
    height: 148px;
    border-radius: 10px;
    overflow: hidden;
    background: none;
    border: 0;
    padding: 0;
    cursor: pointer;
    box-shadow: 0 8px 20px -6px rgba(4,9,38,0.45);
    transition: transform 0.2s ease;
}

.pw-redesign-floating-video-bubble:hover { transform: scale(1.04); }

.pw-redesign-floating-video-bubble video {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}

.pw-redesign-floating-video-play {
    position: absolute;
    top: 12px;
    right: 12px;
    width: 32px;
    height: 32px;
    border-radius: 50%;
    background: var(--pw-red);
    color: var(--pw-white);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 10px;
    pointer-events: none;
}

.pw-redesign-floating-video-label {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    padding: 18px 9px 8px;
    background: linear-gradient(0deg, rgba(4,9,38,0.9) 0%, transparent 100%);
    color: var(--pw-white);
    font-size: 11px;
    font-weight: 700;
    line-height: 1.25;
    text-align: left;
    pointer-events: none;
}

.pw-redesign-floating-videos-close {
    display: flex;
    align-items: center;
    justify-content: center;
    position: absolute;
    top: -12px;
    right: -8px;
    width: 24px;
    height: 24px;
    border-radius: 50%;
    background: rgba(4,9,38,0.8);
    color: var(--pw-white);
    border: 0;
    padding: 0;
    font-size: 10px;
    cursor: pointer;
    z-index: 1;
    transition: background 0.2s ease;
}

.pw-redesign-floating-videos-close:hover { background: var(--pw-red); }

.pw-redesign-floating-videos.is-hidden,
.pw-redesign-floating-videos.is-auto-hidden { display: none; }

@media (max-width: 640px) {
    .pw-redesign-floating-videos {
        right: 10px;
        top: 62%;
        bottom: auto;
        transform: translateY(-50%);
        gap: 8px;
        z-index: 9999;
    }
    .pw-redesign-floating-videos-close { top: -10px; right: -6px; width: 20px; height: 20px; font-size: 9px; }
    .pw-redesign-floating-video-bubble { width: 96px; height: 96px; }
    .pw-redesign-floating-video-play { top: 6px; right: 6px; width: 20px; height: 20px; font-size: 8px; }
    .pw-redesign-floating-video-label { font-size: 8px; padding: 10px 5px 4px; }
}

@media (max-width: 360px) {
    .pw-redesign-floating-videos { right: 8px; }
    .pw-redesign-floating-video-bubble { width: 84px; height: 84px; }
}

.pw-redesign-video-modal {
    position: fixed;
    inset: 0;
    z-index: 200;
    display: none;
    align-items: center;
    justify-content: center;
    padding: 24px;
}

.pw-redesign-video-modal.is-open { display: flex; }

.pw-redesign-video-modal-backdrop { position: absolute; inset: 0; background: rgba(4,9,38,0.92); }

.pw-redesign-video-modal-inner { position: relative; z-index: 1; width: 100%; max-width: 860px; }

.pw-redesign-video-modal-player {
    display: block;
    width: 100%;
    max-height: 82vh;
    border-radius: var(--pw-radius-lg);
    box-shadow: 0 40px 100px -20px rgba(0,0,0,0.6);
    background: #000;
}

.pw-redesign-video-modal-close {
    position: absolute;
    top: -44px;
    right: 0;
    width: 36px;
    height: 36px;
    border-radius: 50%;
    background: rgba(255,255,255,0.12);
    border: 1px solid rgba(255,255,255,0.3);
    color: var(--pw-white);
    font-size: 16px;
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
}

.pw-redesign-video-modal-close:hover { background: var(--pw-red); border-color: var(--pw-red); }

.pw-redesign-whatsapp-button {
    position: fixed;
    left: 20px;
    bottom: 20px;
    z-index: 60;
    width: 56px;
    height: 56px;
    border-radius: 50%;
    background: #25d366;
    color: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 28px;
    box-shadow: 0 10px 24px -6px rgba(0,0,0,0.4);
    transition: transform 0.2s ease;
}

.pw-redesign-whatsapp-button:hover { transform: scale(1.06); color: #fff; }

@media (max-width: 640px) {
    .pw-redesign-whatsapp-button { width: 50px; height: 50px; font-size: 24px; left: 14px; bottom: 14px; }
}

/* =====================================================================
 * VISIT REPORT — ported verbatim from the real WordPress source's own
 * inline <style> block (plotwatch-system/templates/visit-reports.php,
 * lines 178-334, read fresh). Real values, same class names — the real
 * page keeps this CSS inline in the template rather than in the
 * plugin's main stylesheet; this project's own convention is to keep
 * all page CSS in this one file instead, so it lives here (same
 * organizational choice already made for every other page), with no
 * visual value changed.
 * ===================================================================== */
.pw-report-container { width: 100%; max-width: 1100px; margin: 10px auto 40px auto; background: #ffffff; border-radius: 8px; box-shadow: 0 8px 25px rgba(0,0,0,0.08); padding: 30px; }
/* Real values from the plugin's main style.css:3673-3687 (cascade-final block). */
.pw-red-title { color: #dc2626; font-weight: 700; letter-spacing: 0.3px; }
.pw-red-text { color: #dc2626; font-weight: 600; }
.pw-property-id { margin-top: 6px; font-size: 15px; color: #777; }

.pw-gallery { width: 100%; margin-top: 20px; }
.pw-swiper { width: 100%; }
.pw-gallery img, .pw-gallery video { width: 100%; max-height: 500px; object-fit: contain; border-radius: 6px; background: #f5f5f5; }
.pw-gallery .swiper-slide { display: flex; align-items: center; justify-content: center; background: #f5f5f5; }
.pw-gallery .swiper-pagination { margin-top: 12px; text-align: center; }
.pw-gallery .swiper-pagination-bullet { width: 10px; height: 10px; background: #bbb; opacity: 1; }
.pw-gallery .swiper-pagination-bullet-active { background: #1e73be; transform: scale(1.2); }
.pw-gallery .swiper-wrapper { width: 100%; }

.pw-visit-details { display: flex; justify-content: space-between; margin-top: 25px; padding-top: 15px; border-top: 1px solid #eee; }
.pw-visit-details .pw-detail { flex: 1; }
.pw-visit-details .pw-detail label { font-size: 13px; color: #888; display: block; }
.pw-visit-details .pw-detail p { font-size: 16px; font-weight: 600; margin-top: 5px; }

.pw-comment { margin-top: 25px; background: #f7f7f7; padding: 18px; border-radius: 6px; }
.pw-comment label { font-size: 13px; color: #666; display: block; margin-bottom: 5px; }
.pw-comment p { font-size: 15px; line-height: 1.6; }

/* Real values from the plugin's main style.css (not the template's own
   inline block) — style.css:2077-2099, read fresh. */
.pw-inspection-report { margin-top: 25px; background: #f9fafb; padding: 20px; border-radius: 10px; }
.pw-report-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px; }
.pw-report-grid label { font-size: 12px; color: #666; display: block; }
.pw-report-grid span { font-weight: 600; font-size: 14px; }

@media (max-width: 768px) {
    .pw-report-container { padding: 20px; }
    .pw-gallery img, .pw-gallery video { height: 260px; }
    .pw-visit-details { flex-direction: column; gap: 12px; }
    .pw-report-grid { grid-template-columns: 1fr; }
}
.pw-gallery .swiper-slide { width: 100% !important; display: flex; justify-content: center; }

/* =================================================================
   SUPER ADMIN — complete visual redesign.

   Layout::dashboardPage() is the ONE shared shell every dashboard
   renders through — customer, Engineer, Operation, AND Super Admin —
   so every rule below that touches a class also used outside this
   controller (.pw-sidebar, .pw-header, .pw-main, .pw-content,
   .pw-stat-card, .pw-dash-box, .pw-btn, .pw-toast, .pw-page-title,
   .pw-property-detail-card, .pw-grid-3, .pw-top-bar/.pw-back-link) is
   scoped under "body.pw-app-body" — the one new body class
   AdminController::page() passes and nothing else ever does (see
   Layout::dashboardPage()'s own docblock). Nothing here can ever
   change the customer/Engineer/Operation dashboards' appearance.

   Classes that were ALREADY admin-only before this task (.pw-admin-*,
   .pw-enq-*, .pw-detail-*, .pw-tab-*, .pw-price-*, .pw-review-admin-*,
   .pw-districts-textarea, .pw-mode-select — confirmed unused outside
   AdminController by search) are refined directly, unscoped, since
   there is no customer-facing rule they could collide with.
   ================================================================= */

body.pw-app-body {
    background: #f5f7fb;
    overflow-x: hidden; /* safety net — nothing here should ever cause page-level horizontal scroll; wide content (tables) scrolls in its own .pw-admin-table-wrap instead */
    /* Super Admin's own navy — a LOCAL override of the site-wide
       --pw-navy/--pw-navy-tint custom properties, declared only on this
       body class. CSS custom properties cascade by inheritance, so
       every var(--pw-navy) used anywhere in the admin's own CSS below
       (and there are many) now resolves to this deeper navy instead of
       the marketing site's #040926 — without touching the :root
       definition the homepage/login/customer dashboard still use. */
    --pw-navy: #0d1628;
    --pw-navy-tint: #16223f;
    /* One new token, defined ONLY inside this body class (never on
       :root) so it can't leak into or collide with anything customer-
       facing — a restrained "premium ERP" accent per the requested
       navy/red/white/gold direction, used sparingly (Administrator
       badge, a couple of small dividers/accents below), never as a
       wholesale palette replacement for the existing red brand accent. */
    --pw-gold: #b8860b;
    --pw-gold-soft: #fdf6e3;
    /* Semantic status tokens — the design system's Success/Warning/
       Danger colors, defined once here instead of the raw hex values
       previously scattered inline across badges/buttons/toasts. */
    --pw-success: #16a34a;
    --pw-success-soft: #dcfce7;
    --pw-warning: #d97706;
    --pw-warning-soft: #fef3c7;
    --pw-danger: #dc2626;
    --pw-danger-soft: #fee2e2;
}

/* Canonical Super Admin FORM CONTROL system — one shared height/
   padding/border/radius/font/focus-state for every text input, select,
   and textarea in the admin. Audit finding: the Add/Edit User form's
   Role/Status <select> elements had NO width/padding/border/radius
   rule at all anywhere in this file (the old .pw-property-detail-card
   rule listed "input, textarea" but never "select"), so they rendered
   as bare, unstyled native dropdowns sitting next to fully-styled text
   inputs in the same row — a real, visible inconsistency, not a
   cosmetic guess. This one rule fixes that AND replaces at least 5
   near-duplicate per-context input/textarea declarations that
   disagreed slightly on padding/radius/font-size (Pricing's price
   cells, Reviews' fields, Blog's form, the toolbar filters, Add/Edit
   User) — consolidated per this task's own "one authoritative rule"
   instruction. Contexts that are genuinely different in SIZE (the
   narrow price-grid cells, the compact inline zone-mode dropdown) keep
   their own small, higher-specificity override for just that
   difference, declared near their own section above. */
body.pw-app-body input[type="text"],
body.pw-app-body input[type="email"],
body.pw-app-body input[type="number"],
body.pw-app-body input[type="date"],
body.pw-app-body input[type="file"],
body.pw-app-body select,
body.pw-app-body textarea {
    width: 100%; box-sizing: border-box; min-height: 40px; padding: 9px 13px;
    border: 1px solid var(--pw-grey-line); border-radius: var(--pw-radius-sm);
    font-size: 13.5px; font-family: inherit; color: var(--pw-navy);
    background: #fff; transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
body.pw-app-body textarea { min-height: 90px; padding-top: 10px; resize: vertical; }
/* <select> specifically keeps a native OS-drawn dropdown arrow/chrome
   in most browsers even after background/border/radius are overridden
   — the classic reason a <select> still LOOKS like a "default browser
   control" even though it technically has custom styling applied.
   appearance:none removes that, and this draws one consistent custom
   arrow back in with a plain CSS background-image (no extra asset). */
body.pw-app-body select {
    -webkit-appearance: none; -moz-appearance: none; appearance: none;
    padding-right: 34px; cursor: pointer;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%236b7280' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
    background-repeat: no-repeat; background-position: right 13px center;
}
body.pw-app-body input[type="text"]:focus,
body.pw-app-body input[type="email"]:focus,
body.pw-app-body input[type="number"]:focus,
body.pw-app-body input[type="date"]:focus,
body.pw-app-body select:focus,
body.pw-app-body textarea:focus {
    outline: none; border-color: var(--pw-red); box-shadow: 0 0 0 3px rgba(255,4,10,0.08);
}
body.pw-app-body label { display: block; font-weight: 600; font-size: 13px; margin-bottom: 6px; color: #374151; }
body.pw-app-body label.required::after { content: " *"; color: var(--pw-red); }

/* ROOT CAUSE of "icons render as empty squares" on staging: this
   codebase's Stage-1 base rule ".pw-app-body, .pw-app-body * {
   font-family:'Poppins',...}" (site.css, ~line 971) uses a UNIVERSAL
   selector, so it applies to every element inside the admin shell —
   including every "<i class="fa fa-...">" icon tag. That rule and Font
   Awesome's own ".fa { font-family: FontAwesome; ... }" rule (in
   font-awesome.min.css, loaded BEFORE site.css) have EQUAL CSS
   specificity (one class each); the Poppins rule, being later in the
   cascade, wins — so every icon element actually computes to
   font-family: Poppins, not FontAwesome, and the browser can't find
   the icon's Private-Use-Area glyph in Poppins, falling back to its
   generic "missing glyph" tofu/box character. Confirmed by comparing
   the deployed site.css and font-awesome.min.css byte-for-byte
   (identical) and confirming every icon glyph's codepoint (e.g.
   fa-tachometer -> \f0e4) is present and correct in the deployed FA
   file — the font asset and class names were never the problem.
   Fixed with the standard, Font-Awesome-recommended remedy: reassert
   FontAwesome specifically on icon elements, scoped to the Super Admin
   shell only (this bug does not currently affect the customer/
   Engineer/Operation dashboards, which don't use any .fa icons yet). */
body.pw-app-body .fa {
    font-family: 'FontAwesome' !important;
    font-style: normal; font-weight: normal; line-height: 1;
}
/* .pw-enquiry-form-error is reused here for every validation/CSRF error
   banner (its own base rule — customer-facing Plan Finder form — is
   already token-driven and fine to reuse as-is); this adds only a
   left accent bar so it reads with the same visual weight as a toast,
   without touching the base rule the Plan Finder itself uses. */
body.pw-app-body .pw-enquiry-form-error { border-left: 3px solid var(--pw-danger); margin: 0 0 16px; }

/* ---- Sidebar ---- */
body.pw-app-body .pw-sidebar {
    background: linear-gradient(180deg, var(--pw-navy) 0%, var(--pw-navy-tint) 100%);
    padding: 28px 16px;
    display: flex;
    flex-direction: column;
}
body.pw-app-body .pw-logo { margin-bottom: 8px; position: relative; padding-bottom: 22px; }
body.pw-app-body .pw-logo img { width: 128px; margin-bottom: 0; }
body.pw-app-body .pw-logo::after {
    content: ""; position: absolute; left: 50%; bottom: 0; transform: translateX(-50%);
    width: 36px; height: 2px; background: var(--pw-gold); border-radius: 2px; opacity: 0.85;
}
body.pw-app-body .pw-sidebar nav { display: flex; flex-direction: column; gap: 2px; margin-top: 6px; }
body.pw-app-body .pw-sidebar nav a {
    display: flex; align-items: center; gap: 12px; padding: 11px 14px;
    color: #aab3cc; font-size: 13.5px; font-weight: 500; border-radius: 10px;
    margin-bottom: 2px; border-left: 3px solid transparent;
    transition: background 0.2s ease, color 0.2s ease, border-color 0.2s ease;
}
/* Icons: inline SVG (AdminController::icon()) — replaced Font Awesome
   here after the webfont proved unreliable for these specific icons on
   staging even with the correct font-family cascade fix in place (see
   the ".fa" rule below, kept for any other FA usage elsewhere, but no
   longer load-bearing for the sidebar/stat-cards/Quick Actions). Inline
   SVG has no font file to fetch and no @font-face to resolve, so it
   can't fail the same way. Fixed-width slot keeps every icon's visual
   center aligned regardless of which shape it is; "currentColor" in
   each SVG's own stroke/fill means it automatically takes this same
   color the sidebar link text already uses — no separate icon color
   was introduced. */
body.pw-app-body .pw-sidebar nav a .pw-icon {
    display: inline-flex; align-items: center; justify-content: center;
    width: 20px; flex: 0 0 20px; opacity: 0.85;
}
body.pw-app-body .pw-sidebar nav a .pw-icon svg { width: 16px; height: 16px; display: block; }
body.pw-app-body .pw-sidebar nav a:hover .pw-icon,
body.pw-app-body .pw-sidebar nav a.active .pw-icon { opacity: 1; }
body.pw-app-body .pw-sidebar nav a:hover { background: rgba(255,255,255,0.06); color: #fff; }
body.pw-app-body .pw-sidebar nav a.active {
    background: rgba(255,4,10,0.16); color: #fff; border-left-color: var(--pw-red); font-weight: 600;
}
/* Settings is system/configuration, not a day-to-day operational tab —
   a thin divider sets it apart, same "professional section hierarchy"
   idea as before, now attribute-matched on tab=settings instead of the
   removed role= links. */
body.pw-app-body .pw-sidebar nav a[href*="tab=settings"] {
    margin-top: 10px; padding-top: 17px; border-top: 1px solid rgba(255,255,255,0.09);
}
body.pw-app-body .pw-sidebar-toggle { background: var(--pw-red); box-shadow: 0 4px 12px rgba(255,4,10,0.35); }
body.pw-app-body .pw-sidebar-toggle:hover { background: #c60308; }

/* ---- Main / header ---- */
body.pw-app-body .pw-main { background: #f5f7fb; }
/* Header — reduced to ~70px total height (was ~76-84px depending on
   content), fixed via min-height + zero vertical padding instead of
   guessing a padding value that happens to add up right. */
body.pw-app-body .pw-header {
    min-height: 70px; padding: 0 32px; border-bottom: 1px solid var(--pw-grey-line); box-shadow: none;
    background: #fff;
}
body.pw-app-body .pw-header > div:not(.pw-mobile-menu) {
    display: flex; align-items: center; gap: 10px; font-size: 13.5px; color: var(--pw-grey-text);
}
body.pw-app-body .pw-username { color: var(--pw-navy); font-weight: 700; font-size: 14.5px; }
/* Logout — smaller, premium chip rather than a full-size secondary
   button (it's a low-frequency action, not a page-level CTA). */
body.pw-app-body .pw-nav-logout-form .pw-logout {
    display: inline-flex; align-items: center; gap: 6px; padding: 6px 14px;
    border: 1.5px solid var(--pw-grey-line); border-radius: 999px; color: var(--pw-navy);
    font-weight: 600; font-size: 12.5px; transition: all 0.2s ease;
}
body.pw-app-body .pw-nav-logout-form .pw-logout:hover { background: #fff0f0; border-color: var(--pw-red); color: var(--pw-red); }
body.pw-app-body .pw-content { padding: 32px; max-width: 1440px; margin: 0 auto; width: 100%; box-sizing: border-box; }

/* ---- Page title / cards / stat cards / dash boxes (scoped overrides on top of the shared base rules) ---- */
/* Audit finding: .pw-page-title/.pw-property-detail-card h2's own base
   rule (shared with the customer dashboard) colors headings #dc2626 —
   an off-brand red shade AND the wrong role for a heading in a design
   where red is meant to mean "primary action", not "page title". Every
   heading in the admin is unified to navy here instead. */
body.pw-app-body .pw-page-title,
body.pw-app-body .pw-property-detail-card h2 { color: var(--pw-navy); }
body.pw-app-body .pw-page-title { font-size: 28px; font-weight: 700; margin-bottom: 22px; letter-spacing: 0; }
body.pw-app-body .pw-property-detail-card {
    padding: 28px; border-radius: var(--pw-radius-md); box-shadow: var(--pw-shadow-sm); border: 1px solid var(--pw-grey-line); max-width: none;
}
body.pw-app-body .pw-property-detail-card h2 { font-size: 19px; }
body.pw-app-body .pw-grid-3 { gap: 16px; }
/* "Edit User"/"Password" sub-headings reuse .pw-enquiry-form-heading —
   a class whose OWN base rule (customer-facing Plan Finder form) sets
   font-family to the marketing display font with !important. Originally
   overridden back to Poppins here to match the (then-Poppins) admin
   shell; now the admin shell itself uses the same display font (see
   .pw-app-body's own font-family rule), so this override would otherwise
   be the one inconsistent element — updated to match rather than removed
   outright, since some later rule could still re-introduce the same
   leak/mismatch this was originally guarding against. */
body.pw-app-body .pw-enquiry-form-heading {
    font-family: var(--pw-font-display) !important; color: var(--pw-navy) !important;
    font-size: 14px !important; text-transform: uppercase; letter-spacing: 0.04em;
    margin: 28px 0 14px !important;
}
body.pw-app-body .pw-stats-grid { grid-template-columns: repeat(5, 1fr); gap: 16px; }
/* Premium stat cards: the old versions were solid, brightly-colored
   tiles (blue/orange/green/purple/red backgrounds) — every card here
   is now a plain white card with a small colored icon chip as the only
   accent, matching the "white cards, subtle shadow, small colored
   icon" spec instead of a wall of bright color. */
body.pw-app-body .pw-stat-card {
    display: flex; flex-direction: column; gap: 10px;
    border-radius: var(--pw-radius-md); box-shadow: var(--pw-shadow-sm); min-height: 108px;
    background: #fff !important; color: var(--pw-navy); border: 1px solid var(--pw-grey-line);
    padding: 20px 22px;
}
body.pw-app-body .pw-stat-icon {
    display: inline-flex; align-items: center; justify-content: center;
    width: 36px; height: 36px; border-radius: 10px;
    background: #eff3ff; color: #3b82f6;
}
body.pw-app-body .pw-stat-icon svg { width: 18px; height: 18px; display: block; }
body.pw-app-body .pw-stat-card.blue .pw-stat-icon { background: #eff3ff; color: #3b82f6; }
body.pw-app-body .pw-stat-card.green .pw-stat-icon { background: #ecfdf5; color: #10b981; }
body.pw-app-body .pw-stat-card.orange .pw-stat-icon { background: #fffbeb; color: #f59e0b; }
body.pw-app-body .pw-stat-card.purple .pw-stat-icon { background: #f5f3ff; color: #8b5cf6; }
body.pw-app-body .pw-stat-card.pink .pw-stat-icon { background: #fdf2f8; color: #ec4899; }
body.pw-app-body .pw-stat-card.red .pw-stat-icon { background: #fef2f2; color: #ef4444; }
body.pw-app-body .pw-stat-number { font-size: 28px; font-weight: 700; color: var(--pw-navy); line-height: 1; }
body.pw-app-body .pw-stat-label { color: var(--pw-grey-text); opacity: 1; font-size: 13px; font-weight: 600; }
body.pw-app-body .pw-dash-box {
    border-radius: var(--pw-radius-md); box-shadow: var(--pw-shadow-sm); border: 1px solid var(--pw-grey-line); padding: 22px 24px;
}
/* Section titles: 18-20px, normal case — a real heading, not a tiny
   uppercase eyebrow label (which is what this used to be at 15px). */
body.pw-app-body .pw-dash-box h3 {
    color: var(--pw-navy); border-left: none; padding-left: 0; font-size: 18px; font-weight: 700;
    text-transform: none; letter-spacing: 0; margin-bottom: 16px;
}
body.pw-app-body .pw-admin-card-head h3 { font-size: 18px; font-weight: 700; color: var(--pw-navy); }
body.pw-app-body .pw-admin-card-head p { font-size: 13.5px; color: var(--pw-grey-text); }
body.pw-app-body .pw-top-bar { margin-bottom: 20px; }
body.pw-app-body .pw-back-link { color: var(--pw-grey-text); font-size: 18px; }
body.pw-app-body .pw-back-link:hover { color: var(--pw-red); }

/* ---- Buttons ----
   .pw-btn's OWN base rule (shared with the customer dashboard) already
   gives it a red gradient/shadow; this scoped override wins there (see
   the canonical button block above .pw-admin-btn* for the full-height/
   padding system every admin button now shares). Audit finding fixed
   here: .pw-btn-secondary previously had NO background override under
   this scope, so on a "pw-btn pw-btn-secondary" element (Send Password
   Reset / Cancel edit), .pw-btn's higher-specificity red background
   always won — a "secondary" button that visually looked identical to
   the primary one. Both rules now have equal (body.pw-app-body + one
   class) specificity, and .pw-btn-secondary is declared after .pw-btn
   in the cascade, so it correctly wins on an element carrying both. */
body.pw-app-body .pw-btn {
    background: var(--pw-red); box-shadow: none; border-radius: var(--pw-radius-sm); padding: 0 22px; min-height: 40px; font-size: 13.5px;
}
body.pw-app-body .pw-btn:hover { background: #d60309; transform: none; box-shadow: 0 6px 16px rgba(255,4,10,0.25); }
body.pw-app-body .pw-btn-secondary {
    background: #fff; color: var(--pw-navy); border: 1.5px solid var(--pw-grey-line);
    border-radius: var(--pw-radius-sm); padding: 0 22px; min-height: 40px; font-size: 13.5px; box-shadow: none;
}
body.pw-app-body .pw-btn-secondary:hover { background: var(--pw-grey-bg); border-color: var(--pw-grey-text-soft); transform: none; box-shadow: none; }
body.pw-app-body .pw-toast { border-radius: var(--pw-radius-sm); box-shadow: var(--pw-shadow-md); }

/* ---- Admin-only components (already isolated — refined directly) ---- */
.pw-admin-card-head { margin-bottom: 4px; }
.pw-admin-card-head h2.pw-page-title { margin-bottom: 4px; }
/* border-radius only — NOT "overflow:hidden" here: the base Stage-1
   rule for this class sets "overflow-x: auto" (the mechanism that lets
   a wide table scroll horizontally inside its own box on small
   screens, per this task's own requirement); an "overflow: hidden"
   shorthand on a later, equal-specificity rule would silently kill
   that X-axis scrolling instead of just clipping the rounded corners.
   overflow-x:auto already clips content to the rounded corners in
   every current browser, so no second overflow declaration is needed. */
.pw-admin-table-wrap { border: 1px solid var(--pw-grey-line); border-radius: var(--pw-radius-md); box-shadow: none; }
.pw-admin-table th { font-size: 13px; font-weight: 700; text-transform: none; letter-spacing: 0; color: var(--pw-navy); background: #f8f9fc; }
.pw-admin-table td, .pw-admin-table th { padding: 14px 16px; }
.pw-admin-table td { font-size: 13.5px; color: var(--pw-navy); border-bottom: 1px solid var(--pw-grey-line); }
.pw-admin-table tbody tr { transition: background 0.15s ease; }
.pw-admin-table tbody tr:hover { background: #fafbff; }
.pw-admin-table tbody tr:last-child td { border-bottom: 0; }

/* User table + badges (Users module enhancement) */
/* Name/email were reported running together with no visible separation
   at all on staging. flex-direction:column SHOULD stack these two
   spans, but a <span> is an inline element by nature — belt-and-braces
   here: both children are also forced to their own block box directly
   (a block-level element unconditionally starts a new line in every
   browser, independent of whichever layout mode the parent uses), so
   this can't silently fail to separate them regardless of flex support
   nuances. gap raised from 2px (barely visible) to a real 4px. */
.pw-user-cell { display: flex; flex-direction: column; gap: 4px; white-space: normal; }
.pw-user-cell-name, .pw-user-cell-email { display: block; }
.pw-user-cell-name { font-weight: 700; color: var(--pw-navy); font-size: 13.5px; }
.pw-user-cell-email { color: var(--pw-grey-text); font-size: 12px; word-break: break-word; }
.pw-user-form-card { max-width: 900px; }
.pw-field-error { display: block; color: var(--pw-danger, var(--pw-red)); font-size: 12px; font-weight: 600; margin-top: 5px; }

.pw-role-badge {
    display: inline-block; padding: 4px 11px; border-radius: 999px; font-size: 11.5px; font-weight: 700;
    text-transform: uppercase; letter-spacing: 0.03em; white-space: nowrap; background: #e5e7eb; color: #374151;
}
.pw-role-customer { background: #dbeafe; color: #1d4ed8; }
.pw-role-engineer { background: #dcfce7; color: #166534; }
.pw-role-operation_member { background: #fef3c7; color: #92400e; }
/* Administrator gets the gold accent (the one deliberate, restrained
   use of --pw-gold on a badge) — the highest-privilege role reads as
   visibly distinct from the other three at a glance in the Users table. */
.pw-role-administrator { background: var(--pw-gold-soft, #fdf6e3); color: var(--pw-gold, #b8860b); border: 1px solid rgba(184,134,11,0.25); }

.pw-status-badge { display: inline-flex; align-items: center; gap: 6px; padding: 4px 12px; border-radius: 999px; font-size: 12px; font-weight: 700; white-space: nowrap; }
.pw-status-active { background: var(--pw-success-soft, #dcfce7); color: var(--pw-success, #166534); }
.pw-status-inactive { background: var(--pw-danger-soft, #fee2e2); color: var(--pw-danger, #b91c1c); }
.pw-status-warning { background: var(--pw-warning-soft, #fef3c7); color: var(--pw-warning, #92400e); }

/* Dashboard — Quick Actions */
.pw-quick-actions { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; margin: 4px 0 24px; }
.pw-quick-action {
    display: flex; align-items: center; gap: 12px; background: #fff; border: 1px solid var(--pw-grey-line);
    border-radius: var(--pw-radius-md); padding: 16px 18px; text-decoration: none; box-shadow: var(--pw-shadow-sm);
    transition: transform 0.15s ease, box-shadow 0.15s ease, border-color 0.15s ease;
}
.pw-quick-action:hover { transform: translateY(-2px); box-shadow: var(--pw-shadow-md); border-color: rgba(255,4,10,0.25); }
.pw-quick-action-icon {
    display: inline-flex; align-items: center; justify-content: center; width: 38px; height: 38px; flex: 0 0 38px;
    border-radius: 10px; background: var(--pw-gold-soft, #fdf6e3); color: var(--pw-gold, #b8860b);
}
.pw-quick-action-icon svg { width: 18px; height: 18px; display: block; }
.pw-quick-action-label { font-weight: 700; font-size: 13px; color: var(--pw-navy); }

/* ---- Responsive: 1920 / 1440 / 1366 / 768 / 414 / 390 / 360 ---- */
@media (min-width: 1600px) {
    body.pw-app-body .pw-content { max-width: 1600px; }
}
@media (max-width: 1024px) {
    body.pw-app-body .pw-stats-grid { grid-template-columns: repeat(3, 1fr); }
    .pw-quick-actions { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 768px) {
    body.pw-app-body .pw-content { padding: 18px; }
    body.pw-app-body .pw-header { padding: 14px 18px; }
    body.pw-app-body .pw-stats-grid { grid-template-columns: repeat(2, 1fr); }
    .pw-admin-card-head { flex-direction: column; align-items: stretch; }
    .pw-admin-card-head > a.pw-admin-btn { text-align: center; }
    .pw-admin-toolbar { flex-direction: column; align-items: stretch; }
    .pw-admin-toolbar input, .pw-admin-toolbar select, .pw-admin-toolbar button, .pw-admin-toolbar a { width: 100%; box-sizing: border-box; text-align: center; flex: none; }
    /* Beats the unconditional (higher-specificity, desktop-row) flex
       rule above by matching its exact selector — needed because
       flex-grow:1 on a column-direction flex item stretches its
       height, not its width, and would otherwise blow up this input
       to fill the toolbar's whole vertical space on mobile. */
    body.pw-app-body .pw-admin-toolbar input[type="text"] { flex: none; width: 100%; }
    body.pw-app-body .pw-admin-toolbar select { flex: none; width: 100%; }
    .pw-admin-row-actions { display: flex; flex-direction: column; gap: 8px; align-items: flex-start; }
    .pw-admin-row-actions form.pw-inline-form { width: 100%; }
    .pw-admin-row-actions form.pw-inline-form button { width: 100%; }
}
@media (max-width: 480px) {
    /* .pw-detail-grid and .pw-review-admin-row already collapse to 1
       column at 900px/640px respectively (declared with their own base
       rule above) — both were needlessly re-declared here too; removed
       as genuinely dead/duplicate CSS rather than left in "just in case". */
    body.pw-app-body .pw-stats-grid { grid-template-columns: 1fr; }
    body.pw-app-body .pw-property-detail-card { padding: 18px; }
    .pw-quick-actions { grid-template-columns: 1fr; }
}
/* Touch targets + tight layout on small phones (414/390/360) */
@media (max-width: 420px) {
    .pw-btn, .pw-btn-secondary, .pw-admin-btn, .pw-admin-btn-ghost, .pw-admin-btn-remove, .pw-admin-btn-primary {
        min-height: 44px;
    }
    body.pw-app-body .pw-header { min-height: 62px; padding: 0 16px; }
    body.pw-app-body .pw-header > div:not(.pw-mobile-menu) { font-size: 12.5px; }
    body.pw-app-body .pw-content { padding: 14px; }
    body.pw-app-body .pw-page-title { font-size: 20px; }
    body.pw-app-body .pw-stat-card { padding: 14px 16px; min-height: 84px; }
    body.pw-app-body .pw-stat-number { font-size: 23px; }
    body.pw-app-body .pw-dash-box h3, body.pw-app-body .pw-admin-card-head h3 { font-size: 16px; }
    .pw-quick-action { padding: 13px 14px; }
    .pw-admin-table th, .pw-admin-table td { padding: 10px 12px; }
    .pw-user-cell-name, .pw-user-cell-email { font-size: 12px; }
    .pw-role-badge, .pw-status-badge { font-size: 10.5px; padding: 3px 9px; }
    /* 3-segment tab bar (Pricing) is the tightest fit at this width —
       tighter padding keeps "Package Prices"/"Add-on Rates"/"Districts"
       on one row rather than wrapping mid-pill. */
    .pw-tabs { padding: 3px; gap: 2px; width: 100%; }
    .pw-tab-btn { padding: 8px 10px; font-size: 12px; flex: 1 1 auto; }
}
/* 320/360/375 — the narrowest phones this was checked against. */
@media (max-width: 360px) {
    body.pw-app-body .pw-content { padding: 12px; }
    body.pw-app-body .pw-stat-card { padding: 12px 14px; }
    body.pw-app-body .pw-page-title { font-size: 18px; }
}

/* Mobile off-canvas sidebar — a dim backdrop behind the sidebar while
   it's open, pure CSS (:has()), so no change to Layout::dashboardPage()'s
   shared JS/markup was needed (that file is used by every dashboard —
   customer/Engineer/Operation included — so its toggle behavior was
   deliberately left untouched; this backdrop is added purely via a
   scoped selector that reads the existing ".open" class, nothing more).
   Tapping the dimmed area doesn't itself close the sidebar (no new JS
   was added to keep this change CSS-only), but the existing hamburger
   toggle and any nav-link navigation both already close it as before. */
@media (max-width: 768px) {
    body.pw-app-body:has(.pw-sidebar.open)::after {
        content: ""; position: fixed; inset: 0; background: rgba(4,9,38,0.45); z-index: 998;
    }
}
