/* Generated by Unnati GeoRank — https://georank.co.in
   GeoRank stylesheet — generated from the Design tab. Layout CSS is shared
   across every theme; only the :root tokens above change. Add your own
   overrides in the Advanced CSS box on the Design tab, not here directly —
   this whole file is rewritten every time a theme is applied. */

:root{
  --max-w: 1100px;
  --font: -apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Arial,sans-serif;
  --font-size-base: 17px;
  --line-height-base: 1.7;
  --body-weight: 400;
  --font-heading: Georgia,'Times New Roman',serif;
  --heading-weight: 600;
  --h1-weight: 700;
  --heading-transform: none;
  --heading-tracking: -0.01em;
  --h1-tracking: -0.03em;
  --h2-tracking: -0.02em;
  --text: #12181f;
  --muted: #54626f;
  --bg: #ffffff;
  --surface: #f3f6f9;
  --border: #dbe3ea;
  --accent: #154273;
  --accent-rgb: 21,66,115;
  --accent-dark: #0f3457;
  --radius: 8px;
  --header-bg: #03104f;
  --header-text: #12181f;
  --footer-bg: #f3f6f9;
  --footer-text: #54626f;
  --menu-bg: var(--header-bg);
  --menu-text: var(--header-text);
  --menu-accent: var(--accent);
  --menu-panel-text: var(--menu-text);
  --menu-accent-tint: rgba(0,0,0,.06);
  --header-height: 100px;
  --logo-height: 80px;
  --logo-max-width: 250px;
}

*{box-sizing:border-box;}
html{-webkit-text-size-adjust:100%;}
body{margin:0;font-family:var(--font);font-size:var(--font-size-base);font-weight:var(--body-weight);color:var(--text);background:var(--bg);line-height:var(--line-height-base);}
/* height:auto is load-bearing, not decorative: every inserted <img> carries
   real width/height attributes (see dimAttrsFor()) so the box doesn't jump
   around while the file loads. Pairing max-width:100% with those attributes
   alone is NOT enough to keep the image proportional once it shrinks to fit
   a narrower column — some browsers hold the attribute height as a literal
   pixel value until an explicit height rule tells them otherwise, squashing
   or stretching the image instead of scaling it. height:auto is what makes
   width and height shrink together. Round 41. */
img{max-width:100%;height:auto;display:block;}
a{color:var(--accent);text-decoration:none;}
a:hover{text-decoration:underline;}
.container{max-width:var(--max-w);margin:0 auto;padding:0 20px;}

/* Sitewide heading hierarchy (Round 50 / Typography spec). Previously h1-h6
   carried NO sitewide font-size/weight rule at all — only individual
   components (.hero h1, .section-title, .card h3, etc.) set their own sizes,
   so a heading typed anywhere else fell back to the bare browser default.
   These rules give every heading a real, theme-driven size/weight/tracking
   by default while staying strictly less specific than any existing
   component selector (".hero h1" etc. still wins by specificity, so nothing
   already styled changes). H1 uses --h1-weight/--h1-tracking (one step
   heavier + its own tracking, see georank_build_style_css()); H2 uses
   --h2-tracking; H3-H6 share --heading-weight/--heading-tracking. */
h1,h2,h3,h4,h5,h6,.logo{font-family:var(--font-heading);text-transform:var(--heading-transform);}
h1{font-weight:var(--h1-weight);letter-spacing:var(--h1-tracking);font-size:clamp(28px,4vw + 14px,40px);line-height:1.2;margin:0 0 16px;}
h2{font-weight:var(--heading-weight);letter-spacing:var(--h2-tracking);font-size:clamp(22px,2vw + 14px,30px);line-height:1.25;margin:0 0 14px;}
h3,h4,h5,h6{font-weight:var(--heading-weight);letter-spacing:var(--heading-tracking);}
h3{font-size:clamp(18px,1vw + 14px,22px);line-height:1.3;margin:0 0 12px;}
h4{font-size:18px;line-height:1.35;margin:0 0 10px;}
h5{font-size:16px;line-height:1.4;margin:0 0 8px;}
h6{font-size:14px;line-height:1.4;margin:0 0 8px;}

/* Fallback containment (Round 45) — a heading/paragraph/list typed directly
   into a page's content region (not wrapped in .hero, .container, or one of
   the .georank-* quick-insert blocks, which each already carry their own
   max-width/margin:auto) sits as a direct child of <body> and previously had
   NO width constraint at all — it stretched edge-to-edge, visually
   misaligned/left-hanging against every properly-contained block around it.
   This is exactly the "some blocks left aligned, especially the h1" report:
   nothing in the template ever put a container around bare typed content.
   Scoped to `body > *` so it can never reach inside an already-contained
   block (a .georank-imgtext's own <h3>, a .hero's own <h1>, a <table> inside
   a .georank-panel, etc. are all nested, not direct children of body, so
   this rule never touches them and never double-constrains anything). */
body > h1, body > h2, body > h3, body > h4, body > h5, body > h6,
body > p, body > ul, body > ol, body > blockquote, body > table, body > figure {
  max-width: var(--max-w);
  margin-left: auto;
  margin-right: auto;
  padding-left: 20px;
  padding-right: 20px;
}

/* Header / nav */
.site-header{border-bottom:1px solid var(--border);position:sticky;top:0;background:var(--header-bg);z-index:50;min-height:var(--header-height);}
.header-inner{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;min-height:var(--header-height);padding:10px 20px;gap:10px;}
.logo{font-weight:700;font-size:18px;color:var(--header-text);display:flex;align-items:center;height:var(--logo-height);}
.logo img{height:var(--logo-height);max-width:var(--logo-max-width);width:auto;object-fit:contain;display:block;margin-right:10px;}
.nav-toggle{display:inline-block;background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:8px;font-size:18px;padding:6px 10px;cursor:pointer;}
/* Styles the 3-bar hamburger icon some header.html edits build the button
   from instead of a text character — a no-op (no matching elements) on a
   header.html that still uses the plain "&#9776;" character button. */
.nav-toggle span{display:block;width:18px;height:2px;margin:4px 0;background:var(--text);border-radius:1px;}
.site-nav{display:none;flex-direction:column;gap:4px;width:100%;padding-top:10px;}
.site-nav.open{display:flex;}
/* Round 52 — button-style nav links: rounded, no underline (the sitewide
   a:hover underline never applied here anyway since this is more specific),
   with hover AND the current page sharing one "pressed" look — a translucent
   wash of the menu's own accent color, via a per-preset --menu-accent-tint
   (see georank_nav_menu_style_presets()) rather than a solid fill, so it
   reads as a highlight, not a second button style. aria-current="page" is
   set at runtime by the tiny script georank_nav_active_script() emits right
   after this <nav> — see MARK_NAVACTIVE_START. */
.site-nav a{display:block;padding:10px 12px;color:var(--menu-text);border-bottom:1px solid var(--border);border-radius:8px;font-weight:600;text-decoration:none;}
.site-nav a:hover,.site-nav a[aria-current="page"]{color:var(--menu-accent);background:var(--menu-accent-tint);}

/* Menu Manager (Round 51/52) — one-level-child dropdown, and (Round 52) a
   'heading' item may now also parent children — a non-clickable trigger
   (mega-menu section title on the header, link-column heading on the
   footer). .nav-item-parent wraps any top-level item (link OR heading) that
   actually has visible children (see georank_render_nav_html()); a
   header.html from before this feature has none of these elements at all,
   so all of this is purely additive. Mobile-first default: the submenu is
   just an always-visible indented block under its parent (no accordion JS
   needed — the whole .site-nav is already hidden/shown as one unit by the
   existing hamburger toggle). The desktop media query below turns the
   HEADER's version into a hover/focus dropdown instead — the footer's own
   nav (further down this file) stays always-visible at every width, since a
   footer link column isn't something you'd want hidden behind a hover. */
.nav-item-parent{position:relative;}
.nav-heading{display:block;padding:10px 12px;color:var(--menu-text);opacity:.6;font-weight:600;font-size:12px;text-transform:uppercase;letter-spacing:.04em;}
/* Hotfix (reported live on a header using this style) — the base
   .nav-heading rule above was written for a small muted section-label, but
   a header-level heading trigger sits directly among real top-nav buttons
   (Home/About/Services/...), so it needs to actually look like one of
   them, not like a dimmed sub-label. Scoped to .site-nav specifically so
   the footer's own heading style (a column title, further down — already
   correctly small-caps to match its own top-level links) is untouched. */
.site-nav .nav-item-parent > .nav-heading{padding:10px 12px;color:var(--menu-text);border-bottom:1px solid var(--border);border-radius:8px;font-weight:600;font-size:inherit;text-transform:none;letter-spacing:normal;opacity:1;}
.site-nav .nav-item-parent > .nav-heading:hover{color:var(--menu-accent);background:var(--menu-accent-tint);}
.nav-submenu{display:flex;flex-direction:column;gap:2px;padding-left:14px;}
.nav-submenu a{display:block;font-size:13px;font-weight:400;opacity:.9;padding:8px 10px;border-radius:6px;text-decoration:none;}
.nav-submenu a:hover,.nav-submenu a[aria-current="page"]{opacity:1;}

/* Menu Manager style presets (Round 51: six; Round 52: +Cloud, +Berry) — the
   .menu-theme-* classes themselves are generated once from
   georank_nav_menu_style_presets() in georank_build_style_css(), rather than
   hand-duplicated here, so the PHP array driving the admin UI and the CSS
   actually applied to a real <nav> can never drift out of sync again (the
   old hand-synced pair is exactly what let the Design > Menu preview show a
   standard/wrong look instead of each preset's real one). */
.menu-theme-dark{--menu-bg:#12141a;--menu-text:#f1f2f5;--menu-accent:#7c9fff;--menu-panel-text:#f1f2f5;--menu-accent-tint:rgba(124,159,255,.18);}
.menu-theme-light{--menu-bg:#ffffff;--menu-text:#1c1f26;--menu-accent:#2454ff;--menu-panel-text:#1c1f26;--menu-accent-tint:rgba(36,84,255,.10);}
.menu-theme-warm{--menu-bg:#fff8f0;--menu-text:#3a2a1c;--menu-accent:#c1622d;--menu-panel-text:#3a2a1c;--menu-accent-tint:rgba(193,98,45,.14);}
.menu-theme-blue{--menu-bg:#ffffff;--menu-text:#15233f;--menu-accent:#2457d6;--menu-panel-text:#15233f;--menu-accent-tint:rgba(36,87,214,.10);}
.menu-theme-green{--menu-bg:#ffffff;--menu-text:#16301f;--menu-accent:#1f8a5f;--menu-panel-text:#16301f;--menu-accent-tint:rgba(31,138,95,.12);}
.menu-theme-gold-brown{--menu-bg:#fdf9f2;--menu-text:#3c2f1e;--menu-accent:#a8752c;--menu-panel-text:#3c2f1e;--menu-accent-tint:rgba(168,117,44,.14);}
.menu-theme-cloud{--menu-bg:#f5f2ec;--menu-text:#ffffff;--menu-accent:#e3b341;--menu-panel-text:#2b2a26;--menu-accent-tint:rgba(227,179,65,.22);}
.menu-theme-berry{--menu-bg:#ffffff;--menu-text:#3a1440;--menu-accent:#b3298e;--menu-panel-text:#3a1440;--menu-accent-tint:rgba(179,41,142,.12);}

/* Round 52 — the footer's own independent menu (.site-footer-nav), sharing
   the exact same tree data model, renderer, and .menu-theme-* palette
   system as the header's nav above, but laid out as always-visible columns
   (a heading item + its children = one column) rather than a hover
   dropdown — the layout a footer "sitemap" link list actually wants, at
   every screen width. A flat top-level item with no children just sits in
   the row on its own, matching a plain one-off footer link. */
/* Round 71 — the footer nav is inserted right before the GEORANK:BIZINFO
   marker in footer.html, which (in the starter template, and in any
   footer.html an admin hasn't heavily hand-edited) sits just OUTSIDE the
   footer's own <div class="container">, as a direct child of <footer
   class="site-footer"> — so it never actually inherited the site's
   .container max-width/centering, and rendered full-bleed edge-to-edge
   instead of lining up with the rest of the page's content column. Rather
   than depend on where the anchor happens to fall in a given footer.html
   (fragile — layouts vary), the nav now caps and centers itself directly,
   using the same var(--max-w) every other content block on the site uses
   (1100px by default, and it stays in sync if that's ever changed from
   Design > Theme) — so it's always centered within the site's normal
   content width regardless of what wraps it. justify-content:center keeps
   a short 2-3 column footer menu centered rather than hugging the left
   edge of that width; the side padding matches .container's own so link
   text never touches the viewport edge on narrower screens. */
.site-footer-nav{display:flex;flex-wrap:wrap;justify-content:center;gap:28px 36px;margin:18px auto 0;max-width:var(--max-w);padding:0 20px;}
.site-footer-nav > a{color:var(--menu-text);font-weight:600;border-radius:6px;padding:2px 4px;margin:-2px -4px;text-decoration:none;}
.site-footer-nav > a:hover,.site-footer-nav > a[aria-current="page"]{color:var(--menu-accent);background:var(--menu-accent-tint);}
.site-footer-nav .nav-item-parent{display:flex;flex-direction:column;gap:6px;min-width:140px;}
.site-footer-nav .nav-item-parent > a,.site-footer-nav .nav-item-parent > .nav-heading{font-weight:700;font-size:13px;text-transform:uppercase;letter-spacing:.03em;opacity:.7;padding:0;color:var(--menu-text);text-decoration:none;}
.site-footer-nav .nav-item-parent > a:hover,.site-footer-nav .nav-item-parent > a[aria-current="page"]{background:none;color:var(--menu-accent);opacity:1;}
.site-footer-nav .nav-submenu{display:flex !important;position:static;flex-direction:column;gap:6px;padding:0;margin-top:2px;border:0;background:none;box-shadow:none;min-width:0;}
.site-footer-nav .nav-submenu::before{content:none;}
.site-footer-nav .nav-submenu a{color:var(--menu-panel-text);opacity:.85;font-weight:400;font-size:13px;padding:2px 4px;margin:-2px -4px;text-decoration:none;}
.site-footer-nav .nav-submenu a:hover,.site-footer-nav .nav-submenu a[aria-current="page"]{opacity:1;color:var(--menu-accent);background:var(--menu-accent-tint);}

/* Hero */
.hero{padding:56px 0 40px;}
.hero-inner{display:flex;flex-direction:column;gap:28px;align-items:center;}
.hero h1{font-size:28px;line-height:1.2;margin:0 0 12px;}
.hero p{color:var(--muted);font-size:16px;margin:0 0 20px;}
.hero-media img{border-radius:var(--radius);border:1px solid var(--border);}
.btn{display:inline-block;background:var(--accent);color:#fff;padding:12px 20px;border-radius:var(--radius);font-weight:700;font-size:14px;border:0;cursor:pointer;}
.btn:hover{background:var(--accent-dark);text-decoration:none;}

/* Sections & cards */
section{padding:36px 0;}
.section-title{font-size:22px;margin:0 0 20px;}
.grid{display:grid;grid-template-columns:1fr;gap:16px;}
.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:20px;}
.card h3{margin:0 0 8px;font-size:16px;}
.card p{margin:0;color:var(--muted);font-size:14px;}

/* ---- Category index auto-listing (Round 66 — Sub-folder / Category Pages) ----
   Renders inside GEORANK:CAT-LIST markers on a category's own index.html,
   regenerated by georank_sync_category_index() whenever a page is added,
   moved, edited, or removed from that folder — never hand-edited. Thumbnail
   fills its card's full width at a 1:1 aspect ratio, so it scales with
   whatever column width the grid below gives it. */
/* Round 67 follow-up: 2 columns on mobile AND tablet (merged — a 512px square
   card reads fine at 2-up even on a narrow phone), 3 on desktop. Same 1024px
   breakpoint used elsewhere in this file. */
.georank-cat-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:20px;margin:24px 0;}
@media(min-width:1024px){.georank-cat-grid{grid-template-columns:repeat(3,1fr);}}
.georank-cat-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;display:flex;flex-direction:column;}
.georank-cat-thumb{display:block;width:100%;aspect-ratio:1/1;overflow:hidden;background:var(--panel-alt,var(--surface));}
.georank-cat-thumb img{width:100%;height:100%;object-fit:cover;display:block;}
.georank-cat-body{padding:16px 18px 18px;flex:1;display:flex;flex-direction:column;}
.georank-cat-body h3{margin:0 0 8px;font-size:16px;}
.georank-cat-body h3 a{color:var(--text);text-decoration:none;}
.georank-cat-body h3 a:hover{color:var(--accent);text-decoration:underline;}
.georank-cat-body p{margin:0 0 14px;color:var(--muted);font-size:14px;flex:1;}
.georank-cat-readmore{align-self:flex-start;font-size:13px;font-weight:600;color:var(--accent);text-decoration:none;}
.georank-cat-readmore:hover{text-decoration:underline;}
.georank-cat-empty{color:var(--muted);font-size:14px;}

/* Footer */
.site-footer{border-top:1px solid var(--border);background:var(--footer-bg);margin-top:40px;padding:28px 0;}
.site-footer p{color:var(--footer-text);font-size:13px;margin:4px 0;}

/* Business Info (auto-synced name/address/contact — footer.html + Contact page) */
.georank-biz-info{max-width:var(--max-w);margin:16px auto;padding:0 20px;font-size:13px;color:var(--muted);}
.georank-biz-info .biz-name{font-weight:700;color:var(--text);margin:0 0 4px;}
.georank-biz-info .biz-address,.georank-biz-info .biz-contact{margin:2px 0;}
.georank-biz-info .biz-contact a{color:inherit;text-decoration:underline;}

/* ---- Rich media: galleries, lightbox, slideshow, image + text overlay ---- */
/* Round 62 — Gallery and Slideshow were full-bleed/edge-to-edge with no
   width option at all since Round 35 (a deliberate choice at the time —
   "a full-bleed gallery/slideshow is a defensible look on its own"). Now
   contained-within-the-theme-frame (max-width:var(--max-w), centered) is
   the default, matching every other block, with an explicit .gr-fullwidth
   opt-in for the old edge-to-edge look — controlled per-block from the
   ✏️ Edit modal's new Width field. Deliberately no side `padding` here
   (unlike capsules/flexgrid/etc.) — these are photo blocks, not text, and
   padding would inset the photos inside their own rounded/clipped edges
   rather than just capping the block's overall width; edge-to-edge on a
   narrow (sub-1100px) viewport is normal for a photo gallery/slideshow. */
.georank-gallery{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;max-width:var(--max-w);margin:20px auto;}
.georank-gallery.gr-fullwidth{max-width:none;}
.georank-gallery a{border-radius:var(--radius);overflow:hidden;display:block;}
.georank-gallery img{width:100%;height:100%;object-fit:cover;aspect-ratio:1/1;transition:transform .2s ease;}
.georank-gallery a:hover img{transform:scale(1.04);}

/* display stays flex at all times; opacity+visibility drive the actual
   show/hide so the pop-in/pop-out has something to transition. The
   visibility transition is delayed on the way in (0s) and deferred on the
   way out (.25s, matching the opacity duration) so the overlay stops
   intercepting clicks/taps only after it has fully faded, not before. */
.georank-lightbox-overlay{position:fixed;inset:0;background:rgba(10,10,14,.92);display:flex;align-items:center;justify-content:center;z-index:9999;padding:24px;opacity:0;visibility:hidden;transition:opacity .25s ease,visibility 0s linear .25s;}
.georank-lightbox-overlay.open{opacity:1;visibility:visible;transition:opacity .25s ease,visibility 0s linear 0s;}
.georank-lightbox-overlay .glb-frame{max-width:100%;transform:scale(.92);transition:transform .25s cubic-bezier(.22,.9,.32,1.2);}
.georank-lightbox-overlay.open .glb-frame{transform:scale(1);}
.georank-lightbox-overlay img{max-width:100%;max-height:88vh;width:auto;height:auto;border-radius:8px;margin:0 auto;display:block;}
.georank-lightbox-overlay .glb-caption{color:#fff;text-align:center;font-size:14px;margin-top:10px;opacity:.85;}
.georank-lightbox-overlay .glb-close,.georank-lightbox-overlay .glb-prev,.georank-lightbox-overlay .glb-next{position:fixed;background:var(--accent);color:#fff;border:0;width:44px;height:44px;border-radius:50%;font-size:20px;cursor:pointer;display:flex;align-items:center;justify-content:center;opacity:.9;}
.georank-lightbox-overlay .glb-close{top:18px;right:18px;}
.georank-lightbox-overlay .glb-prev{left:18px;top:50%;transform:translateY(-50%);}
.georank-lightbox-overlay .glb-next{right:18px;top:50%;transform:translateY(-50%);}
.georank-lightbox-overlay .glb-close:hover,.georank-lightbox-overlay .glb-prev:hover,.georank-lightbox-overlay .glb-next:hover{background:var(--accent-dark);opacity:1;}
/* Auto-applied by georank-media.js to any standalone content image (not a
   gallery thumb, slideshow slide, hero photo or logo) so visitors get a
   tap-to-enlarge affordance without the editor wrapping it in a block. */
.georank-lightbox-zoomable{cursor:zoom-in;transition:opacity .15s ease;}
.georank-lightbox-zoomable:hover{opacity:.92;}

.georank-slideshow{position:relative;border-radius:var(--radius);overflow:hidden;max-width:var(--max-w);margin:20px auto;}
.georank-slideshow.gr-fullwidth{max-width:none;border-radius:0;}
.georank-slideshow .gss-track{position:relative;width:100%;aspect-ratio:16/9;}
.georank-slideshow .gss-slide{position:absolute;inset:0;opacity:0;transition:opacity .5s ease;}
.georank-slideshow .gss-slide.active{opacity:1;}
.georank-slideshow .gss-slide img{width:100%;height:100%;object-fit:cover;}
.georank-slideshow .gss-arrow{position:absolute;top:50%;transform:translateY(-50%);background:var(--accent);color:#fff;border:0;width:38px;height:38px;border-radius:50%;cursor:pointer;font-size:18px;opacity:.9;}
.georank-slideshow .gss-arrow:hover{background:var(--accent-dark);opacity:1;}
.georank-slideshow .gss-prev{left:12px;}
.georank-slideshow .gss-next{right:12px;}
.georank-slideshow .gss-dots{position:absolute;bottom:14px;left:0;right:0;display:flex;justify-content:center;gap:8px;}
.georank-slideshow .gss-dot{width:9px;height:9px;border-radius:50%;background:rgba(255,255,255,.55);border:0;cursor:pointer;padding:0;}
.georank-slideshow .gss-dot.active{background:#fff;}

/* Round 64 — Feature Card Carousel. Distinct from Slideshow (one full-bleed
   photo, opacity-crossfade) and from Capsules/Flexgrid (a static wrapping
   grid, no pagination): this shows several rich content cards (photo + small
   icon + heading, each optionally linking out) at once, with the visible
   count/card width computed by initCardCarousel() at runtime rather than by
   a fixed CSS breakpoint — see georank_template_media_js(). --gcc-gap here
   is only the fallback used before JS finishes its first layout() pass (and
   inside this editor's own static preview, where the runtime script never
   runs — see the content_style override below); once initCardCarousel()
   runs, it sets each card's own width/flex-basis and the track's gap inline. */
.georank-cardcarousel{position:relative;max-width:var(--max-w);margin:20px auto;padding:0 20px;}
.georank-cardcarousel.gr-fullwidth{max-width:none;padding:0;}
.georank-cardcarousel .gcc-viewport{overflow:hidden;}
.georank-cardcarousel .gcc-track{display:flex;gap:20px;transition:transform .5s ease;}
.georank-cardcarousel .gcc-card{flex:0 0 300px;width:300px;}
.georank-cardcarousel .gcc-card-link{display:block;height:100%;text-decoration:none;color:inherit;cursor:pointer;}
.georank-cardcarousel .gcc-card-link.gcc-card-nolink{cursor:default;}
.georank-cardcarousel .gcc-card-photo{display:block;border-radius:var(--radius);overflow:hidden;aspect-ratio:4/3;background:var(--surface);}
.georank-cardcarousel .gcc-card-photo img{width:100%;height:100%;object-fit:cover;display:block;}
.georank-cardcarousel .gcc-card-body{display:block;position:relative;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);margin:-30px 14px 0;padding:18px 46px 16px 18px;box-shadow:0 4px 14px rgba(0,0,0,.08);}
.georank-cardcarousel .gcc-card-icon{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;color:var(--accent);}
.georank-cardcarousel .gcc-card-icon img{width:100%;height:100%;object-fit:contain;}
.georank-cardcarousel .gcc-card-icon svg{width:22px;height:22px;}
.georank-cardcarousel .gcc-card-arrow{position:absolute;top:16px;right:16px;width:30px;height:30px;border:1px dashed var(--border);border-radius:50%;display:flex;align-items:center;justify-content:center;color:var(--text);}
.georank-cardcarousel .gcc-card-heading{display:block;margin:12px 0 0;font-size:16px;font-weight:700;line-height:1.3;}
.georank-cardcarousel .gcc-arrow{position:absolute;top:38%;transform:translateY(-50%);background:var(--accent);color:#fff;border:0;width:38px;height:38px;border-radius:50%;cursor:pointer;font-size:18px;opacity:.9;z-index:2;}
.georank-cardcarousel .gcc-arrow:hover{background:var(--accent-dark);opacity:1;}
.georank-cardcarousel .gcc-prev{left:-6px;}
.georank-cardcarousel .gcc-next{right:-6px;}

/* Image caption — the Media Library's "insert with caption" option wraps the
   image in <figure class="image"><figcaption>, TinyMCE's own default markup
   for a captioned image. Centered by default, matching the image above it. */
figure.image{margin:0 0 20px;text-align:center;}
figure.image img{max-width:100%;height:auto;display:block;margin:0 auto;}
figure.image figcaption{margin-top:8px;font-size:13px;color:var(--muted);text-align:center;}

.georank-overlay{position:relative;border-radius:var(--radius);overflow:hidden;max-width:var(--max-w);margin:20px auto;}
.georank-overlay.gr-fullwidth{max-width:none;margin:20px 0;border-radius:0;}
.georank-overlay img{width:100%;height:auto;display:block;}
/* Heading, description and button are centered by default — both as a block
   (text-align:center) and as flex items (align-items:center), so the button
   sits centered under the text instead of pinned to the left edge. This
   base rule (no .gr-tinted class) is the original full-bleed gradient-wash
   look, completely unchanged — a page saved before Round 63 keeps
   rendering exactly like this forever; .gr-tinted (added only by a fresh
   insert, or an explicit Edit-modal Save — never by migration alone) opts
   into the new framed-card look defined below. */
.georank-overlay-text{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;padding:24px;text-align:center;background:linear-gradient(to top, rgba(0,0,0,.68), rgba(0,0,0,0) 65%);color:#fff;}
.georank-overlay-text h3{margin:0 0 6px;font-size:22px;font-weight:700;color:#fff;}
.georank-overlay-text p{margin:0 0 14px;font-size:14px;opacity:.92;}
.georank-overlay-text .btn{align-self:center;}
/* Round 63 follow-up — the first framed-card attempt covered nearly the
   entire photo at a low default fill, which made the text hard to read on
   a light-colored photo (reported directly). Rebuilt as a bottom-anchored
   strip instead: roughly the bottom 22% of the photo's own height, capped
   at 600px wide so it stays comfortably readable and responsive on mobile
   rather than stretching edge-to-edge on a wide/full-width photo, sitting
   20px up from the photo's bottom edge with its own side gutter. A solid
   tint + matching border from one of 6 presets (data-gr-config.tint,
   applied as a .gr-tint-* class) with an adjustable fill transparency
   (--gr-tint-opacity — set with editor.dom.setStyle(), the same TinyMCE
   style-cache fix used everywhere else a custom property is admin-
   editable; see GR_EDIT_DEFS.overlay) lets an image with a light background
   still get enough contrast for legible text. Only applied when
   .gr-tinted is present — see the non-regression note above.

   Correction #3 (reported after v1.58.0 shipped) — the frame was originally
   given a hard `height:22%` + `overflow:hidden`, sized against the PHOTO'S
   rendered pixel height. That's fine on a wide desktop layout where the
   photo renders tall, but the same photo renders much shorter on a narrow
   window (its aspect ratio is fixed, so a narrower width means a shorter
   height too) — 22% of a short number is a very small box, and up to 200
   characters of description plus a title and button simply cannot fit in
   it; overflow:hidden then silently clipped the button/description rather
   than showing them. Switched `height` to `min-height` (a floor, not a
   ceiling) so the box only ever GROWS to fit real content instead of
   hiding it — 22%-of-photo is still what a short/typical title+description
   renders at, it just no longer clips a longer one on a short/narrow
   photo. The outer `.georank-overlay` still has `overflow:hidden` (a few
   rules up), so an extreme case (near the 200-char cap, on a very short
   photo) is bounded by the photo's own edge rather than spilling past it —
   legibility over rigid adherence to the 20-25% target. Padding is also
   trimmed at narrower widths, per the same report ("some padding
   adjustment to be made" on resize). */
.georank-overlay.gr-tinted .georank-overlay-text{
  inset:auto; left:50%; bottom:20px; transform:translateX(-50%);
  width:calc(100% - 40px); max-width:600px; min-height:max(90px, 22%);
  border-radius:5px; justify-content:center; padding:10px 18px;
  background:rgba(var(--gr-tint-rgb,0,0,0),var(--gr-tint-opacity,.45));
  border:1.5px solid var(--gr-tint-border,rgba(0,0,0,.85));
}
.georank-overlay.gr-tinted .georank-overlay-text h3{font-size:18px;margin:0 0 4px;}
.georank-overlay.gr-tinted .georank-overlay-text p{font-size:13px;margin:0 0 8px;}
@media (max-width:480px){
  .georank-overlay.gr-tinted .georank-overlay-text{padding:8px 12px;bottom:12px;width:calc(100% - 24px);}
  .georank-overlay.gr-tinted .georank-overlay-text h3{font-size:16px;}
  .georank-overlay.gr-tinted .georank-overlay-text p{font-size:12px;margin:0 0 6px;}
}
.georank-overlay.gr-tint-black{--gr-tint-rgb:0,0,0;--gr-tint-border:#000;}
.georank-overlay.gr-tint-accent{--gr-tint-rgb:var(--accent-rgb,79,124,255);--gr-tint-border:var(--accent,#4f7cff);}
.georank-overlay.gr-tint-green{--gr-tint-rgb:27,94,32;--gr-tint-border:#1b5e20;}
.georank-overlay.gr-tint-red{--gr-tint-rgb:183,28,28;--gr-tint-border:#b71c1c;}
.georank-overlay.gr-tint-gold{--gr-tint-rgb:191,143,0;--gr-tint-border:#bf8f00;}
.georank-overlay.gr-tinted.gr-tint-none .georank-overlay-text{background:transparent;border-color:transparent;}

/* Quick-insert content blocks (Files tab sidebar) — imgtext is intentionally
   a fixed row on every screen size, per site-owner preference; the other two
   are mobile-first (stacked on mobile, multi-column from 720px up).
   The media column is a fluid 50/50 split with the text (flex-basis 50%, so
   it scales down smoothly on narrow screens instead of jumping straight to a
   fixed size) capped at max-width 250px mobile / 500px desktop via the media
   query below, so it never overflows or dominates the row on a wide screen
   but still shrinks proportionally on a narrow one (e.g. a 400px-wide screen
   naturally lands around 200px, well under the 250px cap). A small min-width
   keeps it from shrinking to an unreadable sliver on very narrow phones.
   This is a default, not per-site CSS.

   Centering fix (Round 35): this block, and every other multi-column
   quick-insert block below it (capsules, flexgrid, faq, testimonials,
   pricing), lands directly inside the page's MARK_CONTENT_START/END region
   when the admin inserts it — that region is NOT itself wrapped in
   `.container`, only the placeholder hero content the page starts with is.
   Before this round these blocks had no max-width/margin, so on any desktop
   viewport they rendered true edge-to-edge, uncontained and off-center next
   to the properly-contained hero above/below them. Fixed by giving each one
   the same max-width:var(--max-w);margin:Npx auto;padding:0 20px pattern
   `.container` and `.georank-biz-info` already use, so they self-center at
   the site's own content width regardless of what (if anything) wraps them.
   YouTube (`.georank-yt-embed`) and Single Column Panel (`.georank-panel`)
   already did this correctly and needed no change. */
/* Round 42: wrapped in a soft-shadow card (background + radius + a light
   elevation shadow) so this block reads as one distinct unit against
   surrounding page content, instead of the image and text floating loose in
   the page flow. background/radius use the active theme's own --surface and
   --radius tokens (same ones .card/.flexbox/.capsule already use) so it
   adapts correctly across all 8 presets, including Dark Mode, with no new
   color to maintain. The shadow itself is a fixed, theme-independent value —
   nothing else in this codebase varies shadow by theme, and a small dark
   shadow reads fine against every preset's background. */
.georank-imgtext{display:flex;flex-direction:row;align-items:center;gap:20px;max-width:var(--max-w);margin:20px auto;padding:20px;background:var(--surface);border-radius:var(--radius);box-shadow:0 1px 3px rgba(0,0,0,.08),0 4px 12px rgba(0,0,0,.06);}
/* Round 54: photo-on-right option from the new instant setup modal — same
   row-reverse convention .band-imgtext-reverse already uses. */
.georank-imgtext.git-reverse{flex-direction:row-reverse;}
.georank-imgtext .git-media{flex:1 1 50%;max-width:250px;min-width:96px;}
.georank-imgtext .git-media img{width:100%;aspect-ratio:1/1;object-fit:cover;display:block;border-radius:var(--radius);}
.georank-imgtext .git-text{flex:1 1 50%;min-width:0;}
.georank-imgtext .git-text h3{margin:0 0 8px;}
.georank-imgtext .git-text p{margin:0;}

/* Product Info (Round 72) — replaces the old "Image + Text (side-by-side)"
   quick-insert block above (.georank-imgtext, kept as-is here so pages that
   already have one keep rendering/editing exactly as before). Built for
   product details, feature explainers and how-to steps: full-width themed
   band (same .georank-band + palette wrapper as Full-Width Band / Image +
   Headline Band), 2 columns on desktop, and — unlike either of those two
   blocks, which both deliberately never stack — a genuine mobile layout with
   a FIXED stacking order: heading, then photo, then body text, regardless of
   which side the photo is set to at desktop width. A flex row with
   row-reverse (the git-reverse/band-imgtext-reverse convention used above)
   can't do this: reversing the row for "photo right" would also flip which
   element comes first when it wraps to a single column on mobile, putting
   the photo before the heading on a "photo left" block but after it on a
   "photo right" one — an inconsistent, layout-dependent reading order. CSS
   Grid with named areas avoids that entirely: the heading/photo/body are 3
   independent grid items, so the mobile (single-column) area order is fixed
   in the base rule and never changes, while the desktop 2-column rule only
   moves the PHOTO between the left and right column — the heading+body
   column's own internal order (heading above body) is untouched either way. */
.georank-product-inner{display:grid;grid-template-columns:1fr;grid-template-areas:"heading" "media" "body";gap:16px;text-align:left;}
.georank-product-heading{grid-area:heading;margin:0;}
.georank-product-media{grid-area:media;}
.georank-product-media img{width:100%;aspect-ratio:4/3;object-fit:cover;border-radius:var(--radius);display:block;}
.georank-product-body{grid-area:body;}
.georank-product-body p{margin:0 0 12px;max-width:none;text-align:left;opacity:.9;}
.georank-product-body p:last-child{margin-bottom:0;}
@media (min-width:720px){
  .georank-product-inner{grid-template-columns:1fr 1fr;grid-template-areas:"media heading" "media body";align-items:center;gap:16px 40px;}
  .georank-product-inner.gr-product-reverse{grid-template-areas:"heading media" "body media";}
}
/* Round 73 — Width control, same "100% (default) / Full-width" option and
   .gr-fullwidth toggle Gallery/Slideshow/Overlay/Card Carousel already use
   (grWidthFieldHtml, Round 62). The outer .georank-band is always 100%
   viewport-wide already (its background always was, since Round 72) — this
   is specifically about the INNER content (photo + heading + text): default
   ("100%") keeps it capped at the theme's normal content width like every
   other block's text, and "Full-width" is the opt-in for when the photo (or
   a short block) should bleed all the way to the band's own edges instead. */
.georank-band.gr-fullwidth .georank-product-inner{max-width:none;padding:0;}

.georank-capsules{display:flex;flex-direction:column;gap:14px;max-width:var(--max-w);margin:20px auto;padding:0 20px;}
.georank-capsules .capsule{background:var(--surface);border:1px solid var(--border);border-radius:999px;padding:16px 26px;text-align:center;}
.georank-capsules .capsule h4{margin:0 0 6px;}
.georank-capsules .capsule p{margin:0;font-size:14px;}

.georank-flexgrid{display:grid;grid-template-columns:1fr;gap:16px;max-width:var(--max-w);margin:20px auto;padding:0 20px;}
.georank-flexgrid .flexbox{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:18px;}
.georank-flexgrid .flexbox h4{margin:0 0 8px;}
.georank-flexgrid .flexbox p{margin:0;font-size:14px;}

/* FAQ accordion — built on native <details>/<summary>. Rounds 21/22 tried a
   JS-driven <button>/<div> rebuild, then reverted (Round 23) back to plain
   <details>/<summary> after the user reported it working, assumed to have
   been a stale-cache false alarm. It resurfaced again (Round 28) — this
   time fixed by loading TinyMCE's own free/open-source Accordion plugin
   (see tinymce.init()'s plugins/toolbar) and marking every FAQ <details>
   with class="mce-accordion" so the plugin's own vendor-maintained code
   owns the expand/collapse interaction inside the editor, instead of
   depending on the browser's native <summary> click-activation working
   correctly inside a contenteditable region (the thing that was never
   reliable across Rounds 21-23). The class is inert on the live site —
   nothing here targets .mce-accordion — so styling is unchanged. */
.georank-faq{max-width:var(--max-w);margin:20px auto;padding:0 20px;}
.georank-faq details{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);margin-bottom:10px;overflow:hidden;}
.georank-faq summary{list-style:none;cursor:pointer;padding:16px 44px 16px 18px;font-weight:600;position:relative;}
.georank-faq summary::-webkit-details-marker{display:none;}
.georank-faq summary::after{content:"+";position:absolute;right:18px;top:50%;transform:translateY(-50%);font-size:20px;font-weight:400;color:var(--accent);transition:transform .15s ease;}
.georank-faq details[open] summary::after{transform:translateY(-50%) rotate(45deg);}
.georank-faq details p{margin:0;padding:0 18px 16px;color:var(--muted);font-size:14px;}

/* Testimonial / review cards */
.georank-testimonials{display:flex;flex-direction:column;gap:16px;max-width:var(--max-w);margin:20px auto;padding:0 20px;}
.georank-testimonials .testimonial{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:20px;}
.georank-testimonials .testimonial .t-stars{color:var(--accent);font-size:14px;margin:0 0 8px;letter-spacing:2px;}
.georank-testimonials .testimonial .t-quote{margin:0 0 12px;font-style:italic;color:var(--text);}
.georank-testimonials .testimonial .t-quote::before{content:"\201C";}
.georank-testimonials .testimonial .t-quote::after{content:"\201D";}
.georank-testimonials .testimonial .t-name{margin:0;font-weight:700;font-size:14px;}

/* Pricing / plan cards */
.georank-pricing{display:flex;flex-direction:column;gap:16px;max-width:var(--max-w);margin:20px auto;padding:0 20px;}
.georank-pricing .plan{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;text-align:center;}
.georank-pricing .plan.featured{border-color:var(--accent);border-width:2px;}
.georank-pricing .plan h4{margin:0 0 4px;font-size:16px;}
.georank-pricing .plan .plan-price{font-size:28px;font-weight:700;margin:8px 0;color:var(--text);}
.georank-pricing .plan .plan-price span{font-size:13px;font-weight:400;color:var(--muted);}
.georank-pricing .plan ul{list-style:none;margin:14px 0;padding:0;text-align:left;}
.georank-pricing .plan ul li{padding:6px 0 6px 22px;position:relative;font-size:14px;color:var(--muted);border-top:1px solid var(--border);}
.georank-pricing .plan ul li:first-child{border-top:0;}
.georank-pricing .plan ul li::before{content:"\2713";position:absolute;left:0;color:var(--accent);font-weight:700;}
.georank-pricing .plan .btn{margin-top:6px;}

/* CTA Buttons (Round 57) — 1-3 buttons (Call / WhatsApp / a flexible third
   link — normally a Google Maps "Locate Us" button) in one centered row.
   One shared color palette applies to every button in the block (5 choices:
   the live theme accent, or one of 4 fixed brand-independent tones), so the
   row always reads as one cohesive unit rather than mismatched buttons.
   Icons (inline SVG, no external font/CDN — this file's existing convention
   for every icon it uses) keep each button's purpose legible at a glance.
   Fixed colors chosen deliberately dark enough that white button text always
   clears WCAG AA contrast against them (verified: green 7.8:1, blue 11.5:1,
   orange 5.9:1 — all well past the 4.5:1 minimum for normal-size text);
   Light Gray is the one palette that flips to dark text on a light
   background instead, with a subtle border for definition since a light
   button has no shadow of its own to separate it from a white page. */
.georank-cta{max-width:var(--max-w);margin:28px auto;padding:0 20px;text-align:center;}
.georank-cta .cta-inner{display:flex;flex-wrap:wrap;gap:14px;justify-content:center;}
.georank-cta .cta-btn{display:inline-flex;align-items:center;gap:10px;padding:14px 26px;border-radius:var(--radius);font-weight:700;font-size:15px;text-decoration:none;border:0;transition:background .15s ease,transform .15s ease,box-shadow .15s ease;}
.georank-cta .cta-btn:hover{transform:translateY(-2px);box-shadow:0 6px 16px rgba(0,0,0,.14);text-decoration:none;}
.georank-cta .cta-icon{width:20px;height:20px;flex:0 0 auto;display:inline-flex;}
.georank-cta .cta-icon svg{width:100%;height:100%;display:block;}
.georank-cta-theme .cta-btn{background:var(--accent);color:#fff;}
.georank-cta-theme .cta-btn:hover{background:var(--accent-dark);}
.georank-cta-green .cta-btn{background:#1b5e34;color:#fff;}
.georank-cta-green .cta-btn:hover{background:#123f23;}
.georank-cta-blue .cta-btn{background:#123a66;color:#fff;}
.georank-cta-blue .cta-btn:hover{background:#0b2745;}
.georank-cta-orange .cta-btn{background:#a34a12;color:#fff;}
.georank-cta-orange .cta-btn:hover{background:#7c380d;}
.georank-cta-gray .cta-btn{background:#eef0f2;color:#1c1f26;border:1px solid #d8dce2;}
.georank-cta-gray .cta-btn:hover{background:#dfe3e7;}
@media (max-width:480px){
  .georank-cta .cta-btn{flex:1 1 auto;justify-content:center;padding:14px 18px;}
}

/* YouTube embed — paste-a-URL block (admin: Quick-insert panel). Capped at
   600px and centered per the site's layout convention; the inner .yt-frame
   uses the standard responsive-iframe wrapper (padding-top:56.25% = 16:9)
   so the video scales proportionally on any screen instead of overflowing
   on phones, while the iframe's own width/height="560"/"315" attributes
   stay as the nominal default size (overridden by the CSS below, but kept
   as a sane fallback wherever the stylesheet doesn't apply). */
.georank-yt-embed{max-width:600px;margin:24px auto;}
.georank-yt-embed .yt-frame{position:relative;width:100%;padding-top:56.25%;height:0;overflow:hidden;border-radius:var(--radius);background:#000;}
.georank-yt-embed .yt-frame iframe{position:absolute;top:0;left:0;width:100%;height:100%;border:0;}

/* Round 81 — multi-purpose Embed tray (Instagram/Maps/PDF share this generic
   wrapper; YouTube keeps its own older .georank-yt-embed above, completely
   untouched, so every already-published YouTube block keeps looking exactly
   as it always has). */
.georank-embed{max-width:600px;margin:24px auto;}
.ig-frame{width:100%;max-width:400px;margin:0 auto;}
.ig-frame iframe{width:100%;height:600px;border:0;border-radius:var(--radius);}
.maps-frame{position:relative;width:100%;padding-top:56.25%;height:0;overflow:hidden;border-radius:var(--radius);}
.maps-frame iframe{position:absolute;top:0;left:0;width:100%;height:100%;border:0;}
.georank-pdf-embed{max-width:900px;}
.pdf-frame{width:100%;height:80vh;min-height:500px;border-radius:var(--radius);overflow:hidden;border:1px solid var(--border);}
.pdf-frame iframe{width:100%;height:100%;border:0;}
/* Custom Code — deliberately no width/alignment opinion (a pasted embed like
   a form or widget may want full-width, centered, or whatever its own markup
   already specifies), just vertical rhythm consistent with neighboring
   sections. */
.georank-embed-code{margin:24px 0;}

/* Single Column Panel (Files tab quick-insert, below YouTube). Background,
   heading/text color, border color, border width, corner radius and padding
   are all set per-instance by the admin — via one of 3 paired design-palette
   options chosen in the insert modal — and stored as inline style="" on this
   element. color/background/border-color are a matched set so the panel is
   never fighting the active site theme's own --text token for contrast: this
   is the fix for the old bug where only background was admin-set and the
   heading/body text silently inherited the theme's --text color, which could
   be near-invisible against an admin-chosen background (e.g. Dark Mode's
   light --text on this block's own default white background). border-color
   in the class rule below is only a fallback for a panel inserted before
   palettes existed (no inline border-color yet) — every new insert always
   carries one. Border *style*, spacing and heading-margin reset stay a
   normal class rule since they're identical across every panel regardless
   of palette. Default margin/padding are both 10px — margin keeps "auto"
   left/right so the panel stays centered (see the site-build lesson in the
   enhancement notes: replacing the whole margin shorthand with a value that
   has no "auto" component un-centers this block, since it isn't wrapped in
   .container). */
.georank-panel{display:block;box-sizing:border-box;border-style:solid;border-color:var(--border);margin:10px auto;max-width:720px;}
.georank-panel > *:first-child{margin-top:0;}
.georank-panel > *:last-child{margin-bottom:0;}

/* Text Block (Round 57) — the deliberately undecorated quick-insert: a plain
   paragraph with zero background/border/box, for when a Panel's card look
   isn't wanted at all. Only contained to the page's normal reading width, the
   same convention every other --max-w-contained block here already uses
   (Capsules, Flexgrid, FAQ, Testimonials, Pricing) — no colour, radius or
   shadow of its own. */
.georank-text{max-width:var(--max-w);margin:16px auto;padding:0 20px;}
.georank-text > *:first-child{margin-top:0;}
.georank-text > *:last-child{margin-bottom:0;}

/* Full-Width Band (Round 45) — a section whose background spans the entire
   viewport width, breaking out of the site's usual --max-w container, with
   two content modes: text/CTA (centered, still readable-width inside the
   band via .band-inner) and media (a genuinely edge-to-edge image strip).
   This is the "alternating 1100px-contained / full-width" rhythm the user
   asked GeoRank to adopt as a reusable template pattern, not a one-off page
   design — every other block in this file (imgtext, flexgrid, capsules,
   panel, faq...) is itself always --max-w-contained, so up to this round
   there was no way to get a genuinely full-bleed section at all. */
.georank-band{width:100%;padding:48px 0;text-align:center;}
.georank-band .band-eyebrow{font-size:12px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;opacity:.75;margin:0 0 10px;}
.georank-band .band-inner{max-width:var(--max-w);margin:0 auto;padding:0 20px;}
.georank-band .band-inner h2{margin:0 0 10px;}
.georank-band .band-inner p{margin:0 auto 20px;max-width:60ch;opacity:.9;}
.georank-band-dark{background:var(--accent-dark);color:#fff;}
.georank-band-dark .btn{background:#fff;color:var(--accent-dark);}
.georank-band-dark .btn:hover{background:#f0f0f0;}
.georank-band-tint{background:var(--surface);color:var(--text);}
.georank-band-plain{background:transparent;color:var(--text);}
.georank-band-media{padding:0;}
.georank-band-media .band-eyebrow{padding:16px 20px 0;}
.georank-band-media .band-gallery{display:grid;grid-template-columns:repeat(2,1fr);gap:2px;margin-top:16px;}
.georank-band-media .band-gallery img{width:100%;height:220px;object-fit:cover;display:block;}
@media (min-width:720px){
  .georank-band-media .band-gallery{grid-template-columns:repeat(4,1fr);}
  .georank-band-media .band-gallery img{height:280px;}
}
/* Round 54: Logo Grid mode — an alternative to the edge-to-edge cropped
   Photo Strip above, for showcasing multiple brand/partner logos without
   cropping them (a logo's aspect ratio and empty margins are meaningful, so
   object-fit:cover would be wrong here). Wraps into centered rows instead
   of a fixed column grid, since a logo wall can hold anywhere from 2 to a
   dozen marks; --gr-logo-h is set as inline style per block from the setup
   modal ("adjust block height"), with 10px gap on every side matching the
   requested default horizontal margin. Each logo gets its own white tile so
   transparent-background logo files stay legible on a dark band. */
.georank-band-media .band-gallery.band-gallery-logos{display:flex;flex-wrap:wrap;gap:10px;justify-content:center;grid-template-columns:none;}
.georank-band-media .band-gallery.band-gallery-logos img{width:auto;height:var(--gr-logo-h,110px);max-width:100%;object-fit:contain;background:#fff;border-radius:6px;padding:10px;flex:0 0 auto;}

/* Image + Text Band (Round 49) — .georank-imgtext (Round 15+) already never
   stacks on mobile, but centers its image vertically against the text
   column; confirmed live that this leaves the photo visually floating in
   blank space whenever the two columns' heights don't closely match (a
   short caption next to its large image, or vice-versa) — exactly the "gap"
   the user's own reference CSS was working around with a hard line-clamp
   truncation. This variant fixes the same problem for a hero-scale band
   without truncating the copy: top-align the row instead of centering it
   (align-items:flex-start), so a height mismatch always resolves as
   "the shorter column ends early" — normal, expected, the way an ordinary
   article teaser looks — never as the photo floating in empty space either
   above or below it. Deliberately never reflows to a stacked column at any
   width, same fixed-row convention as .georank-imgtext since Round 15 — this
   was never in question this round, only how the photo is SIZED.
   Round 74 — "mobile first" resize: the photo was a fixed 4:3 box that only
   ever changed size at one breakpoint (380px wide below 720px, 440px at
   720px+) — a hard jump, not something that could honestly be called
   responsive. Replaced with a single fluid rule that has no breakpoint at
   all: width:clamp(200px,34vw,500px). Below ~590px viewport width, 34vw is
   under 200px so the clamp floor wins and the photo sits at a flat 200px
   (the small-phone case the user asked for); above ~1470vw-equivalent width
   it's pinned to the 500px ceiling (desktop); in between — the whole
   tablet/small-laptop range — it scales smoothly with the viewport instead
   of snapping. Also squared up (aspect-ratio 1/1, was 4/3) per the request.
   The 500px ceiling is a hard cap regardless of viewport, so this is safe on
   ultra-wide monitors too. */
.band-imgtext-inner{display:flex;flex-direction:row;align-items:flex-start;gap:20px;text-align:left;}
.band-imgtext-inner.band-imgtext-reverse{flex-direction:row-reverse;}
.band-imgtext-media{flex:0 0 auto;width:clamp(200px,34vw,500px);min-width:0;}
.band-imgtext-media img{width:100%;aspect-ratio:1/1;object-fit:cover;border-radius:var(--radius);display:block;}
.band-imgtext-text{flex:1 1 auto;min-width:0;}
.band-imgtext-text .band-eyebrow{margin:0 0 8px;}
.band-imgtext-text h2{margin:0 0 10px;}
.band-imgtext-text p{margin:0 0 16px;max-width:none;text-align:left;opacity:.9;}
.band-imgtext-text p:last-of-type{margin-bottom:16px;}
/* Round 74 — the new single merged text field (replaces separate Eyebrow /
   Heading / Body inputs, see bandImgTextModalInsertBtn below) can hold
   either a short title or a longer description, so it's rendered as a
   flexible paragraph rather than a heading: bolder/larger than ordinary
   body copy so a short title still reads as one, but not sized like an H2,
   so a full sentence or two doesn't look like an oversized headline. */
.band-imgtext-text .band-lead{margin:0 0 16px;font-size:1.15rem;font-weight:600;line-height:1.45;opacity:.95;}
.band-imgtext-text .band-lead:last-child{margin-bottom:0;}
.band-imgtext-text .btn{margin-top:4px;}
@media (min-width:720px){
  .band-imgtext-inner{gap:40px;align-items:center;}
}

/* Back-to-top button (assets/js/georank-media.js adds/removes .visible on
   scroll; toggled sitewide via Setup → Rich Media). */
.georank-backtotop{position:fixed;right:18px;bottom:18px;width:46px;height:46px;border-radius:50%;background:var(--accent);color:#fff;border:0;font-size:20px;line-height:1;cursor:pointer;opacity:0;visibility:hidden;transform:translateY(8px);transition:opacity .2s ease,transform .2s ease,visibility .2s,bottom .2s ease;box-shadow:0 4px 14px rgba(0,0,0,.18);z-index:400;}
.georank-backtotop.visible{opacity:.92;visibility:visible;transform:translateY(0);}
.georank-backtotop:hover{opacity:1;background:var(--accent-dark);}
/* Pushed up when the sticky WhatsApp button (below) is also enabled, so the
   two never overlap — back-to-top stacks directly above it with a clear gap,
   instead of both sitting at the same bottom-right corner. Class is added by
   initWhatsAppFab() in georank_template_media_js(), never by CSS alone,
   since it depends on whether WhatsApp is actually enabled for this site. */
.georank-backtotop.stacked{bottom:82px;}

/* Sticky WhatsApp button (assets/js/georank-media.js adds it at runtime;
   toggled sitewide via Setup -> Rich Media, alongside back-to-top). Always
   visible once enabled rather than gated behind a scroll threshold like
   back-to-top — it's meant to be a persistent contact affordance, not a
   convenience that only shows up once you've scrolled. Fixed brand green
   background (WhatsApp's own official color) rather than a theme token,
   same reasoning as the back-to-top button being unmistakably itself
   regardless of which of the 8 presets is active. */
.georank-whatsapp{position:fixed;right:18px;bottom:18px;width:52px;height:52px;border-radius:50%;background:#25D366;color:#fff;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 14px rgba(0,0,0,.22);z-index:410;text-decoration:none;transition:transform .15s ease,box-shadow .15s ease;}
.georank-whatsapp:hover{transform:scale(1.06);box-shadow:0 6px 18px rgba(0,0,0,.28);}
.georank-whatsapp svg{width:28px;height:28px;}

/* Tablet and up */
@media (min-width: 720px){
  .nav-toggle{display:none;}
  .header-inner{flex-wrap:nowrap;}
  .site-nav{display:flex !important;flex-direction:row;width:auto;padding-top:0;gap:22px;align-items:center;}
  .site-nav a,.site-nav .nav-item-parent > .nav-heading{border-bottom:none;padding:10px 14px;}
  /* Menu Manager (Round 51/52) — desktop turns the header's always-visible
     mobile submenu into a hover/focus dropdown panel instead (the footer's
     own nav is exempted below — .site-footer-nav .nav-submenu forces
     display:flex back on, since a footer link column should never hide
     behind a hover). A 'heading' trigger (Round 52) is a <span>, not an
     <a> — :focus-within still opens it for a keyboard user because the
     span carries tabindex="0" (see georank_render_nav_html()), even though
     it has nothing of its own to activate. */
  .nav-item-parent{display:flex;align-items:center;}
  .nav-item-parent > a,.nav-item-parent > .nav-heading{display:inline-flex;align-items:center;gap:4px;}
  /* Scoped to .site-nav specifically (not the bare .nav-item-parent every
     nav shares) — the dropdown caret only makes sense for the header's
     hover-dropdown UX. The footer's own .nav-item-parent is an always-
     visible column, not a dropdown trigger, so it gets no caret. */
  .site-nav .nav-item-parent > a::after,.site-nav .nav-item-parent > .nav-heading::after{content:'\25BE';font-size:9px;opacity:.65;}
  .nav-submenu{display:none;position:absolute;top:calc(100% + 14px);left:0;flex-direction:column;gap:2px;background:var(--menu-bg);border:1px solid var(--border);border-radius:8px;padding:6px;min-width:190px;box-shadow:0 10px 28px rgba(0,0,0,.14);z-index:80;}
  /* Round 51 fix: the 14px offset above leaves a dead strip between the
     parent link and the panel — moving the pointer straight down through it
     exits `.nav-item-parent:hover` before reaching the submenu, so the menu
     closes before it's clickable. This invisible bridge (a descendant of
     nav-submenu, so it keeps the hover chain alive) fills exactly that gap. */
  .nav-submenu::before{content:'';position:absolute;top:-14px;left:0;right:0;height:14px;}
  .nav-item-parent:hover > .nav-submenu,
  .nav-item-parent:focus-within > .nav-submenu{display:flex;}
  /* Round 52: the dropdown PANEL gets its own resting text color
     (--menu-panel-text) independent of the top bar's (--menu-text) — the
     "Cloud" preset needs white bar text over a dark header but dark text
     over its own cream panel, which a single shared color couldn't do. The
     hover/current tint matches the top bar's for one consistent feel.
     Hotfix: reported live as invisible submenu text on a site whose header
     carries an older, wider ".site-header .site-nav a{color:#fff}"-style
     rule (2 classes) — a rule like that has HIGHER specificity than a bare
     ".nav-submenu a" (1 class) and silently wins, even though it was never
     meant to reach into the dropdown panel. The panel's own background here
     is explicit and always paired with --menu-panel-text for contrast, so
     its text color must never lose to an unrelated broader nav-link rule —
     scoped to .site-nav and pinned with !important so that holds regardless
     of what other nav-text CSS exists now or gets added later. */
  .site-nav .nav-submenu a{color:var(--menu-panel-text) !important;font-size:13px;font-weight:500;opacity:1;padding:8px 10px;border-radius:6px;white-space:nowrap;}
  .site-nav .nav-submenu a:hover,.site-nav .nav-submenu a[aria-current="page"]{background:var(--menu-accent-tint);color:var(--menu-accent) !important;}
  /* .site-footer-nav .nav-submenu{display:flex!important} in the base rules
     above already keeps the footer's columns visible at every width — the
     desktop .nav-submenu{display:none} above is scoped to the header only
     in practice, since !important always wins regardless of source order. */
  .hero h1{font-size:38px;}
  .hero-inner{flex-direction:row;justify-content:space-between;}
  .hero-media{flex-shrink:0;}
  .grid{grid-template-columns:repeat(3,1fr);}
  .georank-gallery{grid-template-columns:repeat(3,1fr);}
  .georank-imgtext .git-media{max-width:500px;}
  /* Round 36: was flex-direction:row + flex:1 on every capsule, forcing the
     whole block into exactly one row no matter how many capsules it held —
     fine at the 2-3 card default, but a 5- or 6-card block (a real site's
     "Why Choose Us" / "Built for Different Project Sizes" section, found
     during the Shri Tiles build) squeezed every capsule down to an
     illegibly narrow sliver instead of wrapping. flex-wrap lets it wrap into
     rows of ~3 (260px basis capped at 320px means 3 comfortably fit inside
     the site's own content width before a 4th wraps); justify-content:center
     keeps a partial last row (1 or 2 leftover capsules) centered instead of
     stretching to fill the row or sitting flush left. A 2-3 card block still
     renders as a single centered row exactly as before — this only changes
     behavior once there are enough capsules to no longer fit comfortably. */
  .georank-capsules{flex-direction:row;flex-wrap:wrap;justify-content:center;}
  .georank-capsules .capsule{flex:1 1 260px;max-width:320px;}
  .georank-flexgrid{grid-template-columns:repeat(var(--cols,3),1fr);}
  .georank-testimonials{flex-direction:row;}
  .georank-testimonials .testimonial{flex:1;}
  .georank-pricing{flex-direction:row;align-items:flex-start;}
  .georank-pricing .plan{flex:1;}
  .georank-pricing .plan.featured{transform:translateY(-8px);}
}

/* ---- App Shell: bottom app tab bar + "More" sheet (Setup -> App-Style Mobile Navigation) ---- */
body{padding-bottom:78px;}
@media (min-width:720px){ body{padding-bottom:0;} }
.gr-tabbar{position:fixed;left:0;right:0;bottom:0;z-index:500;background:var(--surface);border-top:1px solid var(--border);display:flex;justify-content:space-around;padding:6px 4px calc(6px + env(safe-area-inset-bottom));box-shadow:0 -8px 20px -12px rgba(0,0,0,.18);}
@media (min-width:720px){ .gr-tabbar{display:none;} }
.gr-tab{flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;color:var(--muted);font-size:11px;font-weight:700;padding:6px 2px;border-radius:14px;max-width:96px;margin:0 auto;text-decoration:none;}
.gr-tab span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;}
.gr-tab svg{width:22px;height:22px;}
.gr-tab.active{color:var(--accent);}
.gr-tab.active svg{color:var(--accent);}
.gr-more-sheet{position:fixed;inset:0;z-index:600;background:rgba(0,0,0,.45);display:none;}
.gr-more-sheet.open{display:block;}
.gr-more-panel{position:absolute;left:0;right:0;bottom:0;background:var(--surface);border-radius:var(--radius) var(--radius) 0 0;padding:10px 20px calc(24px + env(safe-area-inset-bottom));box-shadow:0 -10px 30px -10px rgba(0,0,0,.3);}
.gr-more-panel .handle{width:40px;height:4px;background:var(--border);border-radius:99px;margin:8px auto 16px;}
.gr-more-panel a{display:flex;align-items:center;gap:12px;padding:13px 4px;font-weight:700;border-bottom:1px solid var(--border);color:var(--text);text-decoration:none;}
.gr-more-panel a:last-child{border-bottom:0;}
.gr-more-panel a svg{width:22px;height:22px;flex:none;color:var(--accent);}

/* GEORANK:THEME-CUSTOM-CSS:START */

/* GEORANK:THEME-CUSTOM-CSS:END */
