/* =====================================================================
   GOV-THEME.CSS
   Department of Heritage Telangana — modern Government of Telangana
   visual refresh. Presentation-layer only: no markup logic, no data
   bindings are affected by this file. Loaded AFTER every legacy/vendor
   stylesheet (in <head> and again just before </body>) so it always
   wins the cascade without needing to touch the old CSS files.
   ===================================================================== */

/* ---------- 1. Design tokens ---------- */
:root {
    --tg-navy: #0a2647;
    --tg-blue-900: #0c2f57;
    --tg-blue-800: #0e3d6e;
    --tg-blue-700: #10538f;
    --tg-blue-600: #1668b8;
    --tg-blue-500: #2f80d8;
    --tg-blue-100: #dce9f7;
    --tg-blue-50: #f2f7fc;
    --tg-gold: #e8a933;
    --tg-gold-dark: #c98a1c;
    --tg-ink: #1b2733;
    --tg-ink-soft: #4c5b6c;
    /* Darkened from #6b7c8d, which measured 4.29:1 on white - below the
       4.5:1 WCAG AA floor for the small text it is used on (photo
       credits, designations, card descriptions). Now 5.53:1. */
    --tg-muted: #566b7d;
    --tg-border: #e2e9f1;
    --tg-white: #ffffff;
    --tg-bg: #ffffff;
    /* Supporting accents, referenced from telangana.gov.in department
       sites' shared design system — used sparingly for meaning (org
       tiers, category tags), never as large section backgrounds. */
    --tg-teal: #2f7a72;
    --tg-teal-50: #e9f4f2;
    --tg-rose: #c1466b;
    --tg-rose-50: #faedf1;
    --tg-slate: #4c5b9a;
    --tg-slate-50: #eef0f8;
    --tg-terracotta: #b85c38;
    --tg-terracotta-50: #faf0ea;
    --tg-radius-lg: 18px;
    --tg-radius: 14px;
    --tg-radius-sm: 9px;
    --tg-shadow-sm: 0 2px 10px rgba(10, 38, 71, .06);
    --tg-shadow: 0 10px 28px rgba(10, 38, 71, .10);
    --tg-shadow-lg: 0 20px 48px rgba(10, 38, 71, .16);
    /* Ubuntu for headings, Mulish for body - the pairing used across
       telanganarising2047.org (h1 Ubuntu 700, h2/h3 Ubuntu 500, body and
       buttons Mulish 400/16px). Both masters load the two families; the
       old Poppins/Inter names stay in the stack as the first fallback so
       nothing reflows to a system font if a font request fails.

       Note on weights: Ubuntu ships 300/400/500/700 and has no 600. This
       file sets font-weight 600 in 22 places, and CSS font matching
       resolves a missing 600 upward, so those render at 700. That suits
       the reference (its headings are 500 and 700, never 600) but it does
       make headings a touch heavier than under Poppins, which had a real
       600. Mulish is variable and covers 400-700 exactly. */
    --tg-font-heading: 'Ubuntu', 'Poppins', 'Segoe UI', sans-serif;
    --tg-font-body: 'Mulish', 'Inter', 'Segoe UI', sans-serif;
    --tg-ease-out: cubic-bezier(.16, 1, .3, 1);
    --tg-ease-spring: cubic-bezier(.34, 1.56, .64, 1);
    /* One vertical rhythm for every full-width band on the page. Each
       section used to set its own padding (24/10, 44/44, 34/34, 32/0,
       62/64...), so the page scrolled with an uneven beat. Applied in
       section 14 at the end of this file. */
    --tg-section-y: clamp(36px, 4.6vw, 60px);
    --tg-section-x: clamp(14px, 4vw, 40px);
    /* ---- Gradients ----
       `--grad-deep` is a three-layer stack, not a single ramp, because a
       lone two-stop linear-gradient over this much area reads flat and
       banded. Painted back to front:
         3. a six-stop diagonal ramp, near-black navy -> blue-700 -> a deep
            teal at the far corner, so the band has depth along its length
         2. a teal bloom rising from the bottom-right, which keeps the cold
            end of the ramp from going grey
         1. a gold bloom from the top-left, the theme accent, tying the band
            to the gold rules used on headings and buttons
       All three are colour-stopped from the palette above; nothing new is
       introduced, so the band still reads as the same design system. */
    --grad-deep:
        radial-gradient(1150px 420px at 10% -20%, rgba(232, 169, 51, .22), transparent 62%),
        radial-gradient(900px 400px at 92% 118%, rgba(47, 122, 114, .34), transparent 64%),
        linear-gradient(118deg, #06182f 0%, #0a2647 22%, #0c3560 44%, #0e3d6e 62%, #10538f 82%, #145f79 100%);
    /* Top-edge rule shared by the page banner and the scheme banner */
    --grad-accent: linear-gradient(90deg, var(--tg-gold), var(--tg-blue-500), var(--tg-gold));
    /* `--grad-shell` is the light counterpart to --grad-deep and is built
       the same way, for the same reason: one flat white across the full
       width of a masthead reads as a blank strip, and a single two-stop
       ramp bands visibly at that size. Painted back to front:
         3. a four-stop diagonal ramp, pure white at the brand end falling
            to a cool blue-50 at the navigation end, so the bar has a
            direction rather than sitting inert
         2. a blue bloom off the top-right, which keeps the cold end from
            going grey behind the menu
         1. a gold bloom rising from the bottom-left, the same accent
            --grad-deep opens with, sitting directly behind the emblems
       Every stop is drawn from the palette above; the masthead reads as
       the daylight version of the dark bands rather than a new theme. */
    --grad-shell:
        radial-gradient(760px 300px at 5% 132%, rgba(232, 169, 51, .26), transparent 66%),
        radial-gradient(700px 300px at 90% -34%, rgba(47, 128, 216, .18), transparent 64%),
        linear-gradient(102deg, #ffffff 0%, #fdfeff 30%, #f2f7fc 68%, #e7f0fb 100%);
    /* The jali lattice from the About band, restruck in navy for a light
       ground. Same motif, same 72px tile - the masthead and that section
       are the two places the pattern appears, so they have to match. */
    --jali-light: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='72' height='72' viewBox='0 0 72 72'%3E%3Cg fill='none' stroke='%230a2647' stroke-width='1' opacity='0.055'%3E%3Ccircle cx='36' cy='36' r='24'/%3E%3Ccircle cx='0' cy='0' r='24'/%3E%3Ccircle cx='72' cy='0' r='24'/%3E%3Ccircle cx='0' cy='72' r='24'/%3E%3Ccircle cx='72' cy='72' r='24'/%3E%3C/g%3E%3C/svg%3E");
}

/* ---------- 2. Base / typography ---------- */
html {
    scroll-behavior: smooth;
}

body {
    font-family: var(--tg-font-body) !important;
    background-color: var(--tg-bg) !important;
    color: var(--tg-ink) !important;
    -webkit-font-smoothing: antialiased;
    /* legacy homestyle.css sets a 7px body margin that leaves a gap
       around the whole page, including under the header */
    margin: 0 !important;
}

h1, h2, h3, h4, h5, h6,
.h1, .h2, .h3, .h4, .h5, .h6 {
    font-family: var(--tg-font-heading) !important;
    color: var(--tg-navy) !important;
    font-weight: 700 !important;
    letter-spacing: 0 !important;
    line-height: 1.3 !important;
}

p, li, td, th, label, span {
    color: var(--tg-ink-soft);
}

a {
    color: var(--tg-blue-600);
}

    a:hover {
        color: var(--tg-blue-800);
    }

::selection {
    background: var(--tg-blue-100);
    color: var(--tg-navy);
}

a:focus-visible, button:focus-visible, .nav-link:focus-visible {
    outline: 3px solid var(--tg-gold);
    outline-offset: 2px;
}

/* ---------- 3. Generic content sections (works site-wide without
   touching each page's markup) ---------- */
.container, .container-fluid {
    padding-top: 2px;
    padding-bottom: 8px;
}

.white-box,
.container.white-box {
    background: var(--tg-white);
    border: 1px solid var(--tg-border);
    border-radius: var(--tg-radius-lg);
    box-shadow: var(--tg-shadow-sm);
    padding: 36px clamp(18px, 4vw, 48px) !important;
    margin: 28px auto !important;
}

section.section {
    background: var(--tg-white);
    border: 1px solid var(--tg-border);
    border-radius: var(--tg-radius);
    box-shadow: var(--tg-shadow-sm);
    padding: 28px clamp(16px, 4vw, 34px);
    margin-bottom: 24px;
}

    section.section h2 {
        font-size: clamp(21px, 2vw, 26px) !important;
        letter-spacing: -.018em !important;
        line-height: 1.2 !important;
        padding-bottom: 12px;
        margin-bottom: 16px !important;
        border-bottom: 3px solid var(--tg-gold);
        display: inline-block;
    }

/* Page-level heading pattern used across content pages */
.container > h2, .container > h3,
.white-box > h2, .white-box > h3 {
    font-size: clamp(22px, 2.2vw, 28px) !important;
    letter-spacing: -.018em !important;
    line-height: 1.2 !important;
    padding-bottom: 12px;
    margin-bottom: 20px !important;
    border-bottom: 3px solid var(--tg-gold);
    display: inline-block;
}

/* ---------- 3a. Section headings centred site-wide ----------
   These headings were `display: inline-block` so their gold rule would
   only span the words rather than the whole column - but an inline-block
   still sits wherever the text flow puts it, i.e. hard left.

   `width: fit-content` shrink-wraps the box to its text, which gives the
   auto margins something to centre. Setting `text-align: center` alone
   would only centre the text *inside* a full-width box, and switching to
   plain `display: block` would stretch the gold rule across the entire
   container and turn it into a divider.

   Scoped to the standing heading patterns. The Heritage Partner Scheme
   banner is deliberately excluded: its eyebrow, body copy and button are
   a left-aligned set, so centring only its <h2> would break that column. */
section.section h2,
.container > h2, .container > h3,
.white-box > h2, .white-box > h3,
.container.whitebox span[id$="lblname"],
.about-heading {
    display: block;
    width: -moz-fit-content;
    width: fit-content;
    max-width: 100%;
    margin-left: auto !important;
    margin-right: auto !important;
    text-align: center;
}

.container h6 {
    color: var(--tg-blue-700) !important;
    text-transform: uppercase;
    letter-spacing: .04em !important;
    font-size: 14px !important;
    margin-top: 20px;
}

/* Simple reusable page banner (opt-in: add class="page-banner" to a
   wrapper div at the top of a content page). In use on 16 content pages.

   The horizontal padding stays on the banner itself rather than moving to
   an inner wrapper: every one of those 16 pages puts its <h1>/<p> as
   direct children, so zeroing the sides here would run their text into
   the edge of the band. Pages that want a measured column instead add
   `.page-banner-inner` around their content (see below) - opt-in, so the
   other fifteen are untouched. */
.page-banner {
    background: var(--grad-deep);
    color: #fff;
    border-radius: var(--tg-radius-lg);
    /* Vertical padding cut roughly in half (was 34-64px top, 26-46px
       bottom). The band is a title strip, not a hero: at 64px top on a
       desktop it was pushing the page's actual content most of the way
       down the first screen. Horizontal padding is untouched - only the
       height was the problem. */
    padding: clamp(20px, 3vw, 32px) clamp(18px, 5vw, 48px) clamp(18px, 2.6vw, 26px);
    margin: 10px auto 18px;
    box-shadow: var(--tg-shadow);
    position: relative;
    overflow: hidden;
}

    /* Diagonal sheen. The gold wash that used to live here is now one of
       the layers inside --grad-deep, so this is free to do the job it was
       really standing in for: a soft light break across the band, which
       stops the large flat area from looking like printed card. */
    .page-banner::after {
        content: "";
        position: absolute;
        inset: 0;
        background: linear-gradient(104deg, rgba(255, 255, 255, .10) 0%, rgba(255, 255, 255, .03) 34%, transparent 58%);
        pointer-events: none;
    }

    .page-banner::before {
        content: "";
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        height: 4px;
        background: var(--grad-accent);
        z-index: 1;
    }

/* Optional measured column inside a banner, for pages whose banner holds
   more than a heading and one line of copy. */
.page-banner-inner {
    position: relative;
    z-index: 1;
    max-width: 1180px;
    margin: 0 auto;
}

/* ---- Breadcrumb, for the top of a page banner ----
   Scoped to .page-banner rather than a single page, so any of the other
   banner pages can drop the same <nav> in and inherit this.

   The first four declarations are undoing Bootstrap: its .breadcrumb is
   a light grey pill (background #e9ecef, 12px/16px padding, a bottom
   margin and a radius), which on a navy banner reads as a stray grey
   block rather than a trail. Everything below that is the trail itself. */
.page-banner .breadcrumb {
    background: none !important;
    padding: 0 !important;
    /* 10px, was 16px - part of the same trim to the band's height */
    margin: 0 0 10px !important;
    border-radius: 0 !important;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px;
    font-family: var(--tg-font-body);
    font-size: 13px;
    line-height: 1.4;
}

    .page-banner .breadcrumb a {
        color: rgba(255,255,255,.72);
        text-decoration: none;
        transition: color .2s var(--tg-ease-out);
    }

    .page-banner .breadcrumb a:hover,
    .page-banner .breadcrumb a:focus-visible {
        color: var(--tg-gold);
        text-decoration: underline;
    }

    /* aria-hidden on the separator, so it is decoration only - the trail
       still reads correctly with it removed from the accessibility tree */
    .page-banner .breadcrumb .sep {
        color: rgba(255,255,255,.38);
        font-size: 15px;
        line-height: 1;
    }

    .page-banner .breadcrumb .current {
        color: #fff;
        font-weight: 600;
    }

    /* Lift the banner's own content above ::after. Both pseudo-elements are
       absolutely positioned, so without this they paint over in-flow text
       and the sheen sits on top of the heading rather than behind it. */
    .page-banner > * {
        position: relative;
        z-index: 1;
    }

    .page-banner h1, .page-banner h2, .page-banner h3 {
        color: #fff !important;
        margin: 0 0 6px !important;
        border: none !important;
    }

    .page-banner p {
        color: rgba(255,255,255,.85);
        margin: 0;
        max-width: 60ch;
        /* The legacy sheets set line-height: 30px, which at this 16px size
           is 1.875 - so a two-line lede stood 60px tall on its own, the
           single biggest contributor to the band's height after padding.
           1.5 brings that to 48px without crowding the text. */
        line-height: 1.5;
    }

/* ---------- 4. Buttons ---------- */
.btn, .button, a.button,
input[type="submit"], input[type="button"] {
    font-family: var(--tg-font-body) !important;
    border-radius: 999px !important;
    font-weight: 600 !important;
    letter-spacing: .01em;
    transition: transform .3s var(--tg-ease-spring), box-shadow .25s var(--tg-ease-out), background-color .2s var(--tg-ease-out) !important;
}

.btn-primary, .btn-default, a.button,
input[type="submit"] {
    background: var(--tg-blue-700) !important;
    border-color: var(--tg-blue-700) !important;
    color: #fff !important;
    box-shadow: var(--tg-shadow-sm);
}

    .btn-primary:hover, .btn-default:hover, a.button:hover,
    input[type="submit"]:hover {
        background: var(--tg-blue-800) !important;
        border-color: var(--tg-blue-800) !important;
        transform: translateY(-3px) scale(1.02);
        box-shadow: var(--tg-shadow);
        color: #fff !important;
    }

    .btn-primary:active, .btn-default:active, a.button:active,
    input[type="submit"]:active {
        transform: translateY(0) scale(.97);
    }

.back-btn {
    background: var(--tg-white) !important;
    color: var(--tg-blue-700) !important;
    border: 1px solid var(--tg-blue-700) !important;
}

    .back-btn:hover {
        background: var(--tg-blue-700) !important;
        color: #fff !important;
    }

/* ---------- 5. Cards (photo/event/officials/publications) ---------- */
.card, .contact-card, .mg-blog-post-3 {
    background: var(--tg-white);
    border: 1px solid var(--tg-border) !important;
    border-radius: var(--tg-radius) !important;
    box-shadow: var(--tg-shadow-sm) !important;
    transition: transform .35s var(--tg-ease-spring), box-shadow .3s var(--tg-ease-out) !important;
}

    .card:hover, .main-image-card:hover, .mg-blog-post-3:hover {
        box-shadow: var(--tg-shadow-lg) !important;
        transform: translateY(-6px);
    }

.card-header, .contact-header {
    background: var(--tg-blue-700) !important;
    color: #fff !important;
    border-radius: var(--tg-radius) var(--tg-radius) 0 0 !important;
    border-bottom: none !important;
    font-family: var(--tg-font-heading);
}

    .card-header h4, .card-header h5, .card-header .mb-0 {
        color: #fff !important;
    }

.contact-header {
    padding: 14px 20px;
    display: flex;
    align-items: center;
    gap: 10px;
    font-weight: 700;
}

.contact-body {
    padding: 18px 20px;
}

.contact-item {
    display: flex;
    align-items: flex-start;
    gap: 12px;
    padding: 8px 0;
}

.text-primary {
    color: var(--tg-blue-700) !important;
}

/* Officials / staff portraits */
.official-photo, .mins img {
    border-radius: 50% !important;
    border: 4px solid var(--tg-blue-50) !important;
    box-shadow: var(--tg-shadow-sm);
}

.official-name, .mi {
    color: var(--tg-navy) !important;
    font-weight: 700 !important;
}

.official-designation {
    color: var(--tg-muted) !important;
}

/* Photo gallery / event cards */
.gallery-grid {
    row-gap: 6px;
}

.main-image-card {
    border-radius: var(--tg-radius) !important;
    box-shadow: var(--tg-shadow-sm);
    transition: box-shadow .3s var(--tg-ease-out), transform .35s var(--tg-ease-spring);
}

    .main-image-card:hover {
        transform: translateY(-6px);
        box-shadow: var(--tg-shadow-lg);
    }

.image-wrapper, .gallery-main-img, .gallery-group-img {
    border-radius: var(--tg-radius) !important;
}

.image-wrapper {
    overflow: hidden;
}

.image-view-hint {
    position: absolute;
    top: 12px;
    right: 12px;
    z-index: 2;
    width: 34px;
    height: 34px;
    border-radius: 50%;
    background: rgba(10,38,71,.55);
    color: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 13px;
    opacity: 0;
    transform: translateY(-6px);
    transition: opacity .25s var(--tg-ease-out), transform .25s var(--tg-ease-out), background-color .2s var(--tg-ease-out);
}

.main-image-card:hover .image-view-hint {
    opacity: 1;
    transform: translateY(0);
    background: var(--tg-gold);
    color: var(--tg-navy);
}

.gallery-main-img, .gallery-group-img {
    transition: transform .5s var(--tg-ease-out) !important;
}

.main-image-link:hover .gallery-main-img,
.main-image-card:hover .gallery-group-img {
    transform: scale(1.08) !important;
}

.caption-overlay {
    background: linear-gradient(to top, rgba(10,38,71,.88), rgba(10,38,71,0)) !important;
    padding: 22px 12px 12px !important;
    font-family: var(--tg-font-body);
}

.gallery-header, .group-header {
    text-align: center;
    /* bottom margin removed to match the other section headers */
    margin: 8px 0 0;
}

    .gallery-header h2, .group-header {
        color: var(--tg-navy) !important;
        border-bottom: 3px solid var(--tg-gold) !important;
        display: inline-block;
        padding-bottom: 10px;
        font-weight: 700 !important;
    }

/* ---------- 6. Tables & GridViews ---------- */
table {
    border-collapse: separate !important;
    border-spacing: 0;
    width: 100%;
}

.table, .officers-table, .officer-table, table[cellpadding] {
    background: var(--tg-white);
    border-radius: var(--tg-radius-sm);
    overflow: hidden;
    box-shadow: var(--tg-shadow-sm);
}

table thead th, .table thead th {
    background: var(--tg-blue-700) !important;
    color: #fff !important;
    border-color: var(--tg-blue-700) !important;
    font-weight: 600 !important;
    text-transform: uppercase;
    font-size: 13px;
    letter-spacing: .03em;
}

/* ASP.NET GridView renders its Header/Row/Footer/Pager styles as inline
   style="background-color:#xxxxxx" attributes on <tr>/<th> — CSS classes
   can't reach those, so re-map the handful of legacy colors used across
   the GridViews site-wide by matching the inline style text itself. This
   re-themes every GridView (Museums, Directors, Excavations, etc.)
   without editing each page's markup. */
[style*="fd7e14" i], [style*="f95c39" i] {
    background-color: var(--tg-blue-700) !important;
    color: #fff !important;
    border-color: var(--tg-blue-700) !important;
}

[style*="1C5E55" i], [style*="1c5e55" i] {
    background-color: var(--tg-blue-900) !important;
    color: #fff !important;
}

[style*="E3EAEB" i] {
    background-color: var(--tg-blue-50) !important;
}

[style*="666666" i]:is(td, tr, th) {
    background-color: var(--tg-navy) !important;
    color: #fff !important;
}

/* Keep a plain blue/white alternation for GridViews that didn't set an
   AlternatingRowStyle at all */
table tr:nth-child(even) td {
    background: var(--tg-blue-50);
}

table td, .table td, table th {
    border-color: var(--tg-border) !important;
    padding: 10px 14px !important;
    vertical-align: middle !important;
}

table tr:hover td {
    background: var(--tg-blue-100) !important;
}

/* ---------- 7. Header / top utility bar ---------- */
header.mg-headwidget {
    background: var(--tg-white);
    box-shadow: 0 2px 10px rgba(10,38,71,.08);
}

.region.region-header-top.skips,
.skips {
    background: var(--tg-navy) !important;
    border-bottom: none !important;
}

/* ---------- 7a. Top utility bar ---------- */
/* The bar's height was never set by this padding. A legacy sheet puts
   `line-height: 30px` on the links in this region, and since line-height
   inherits, every item in the bar was a 30px-tall box holding 12px text -
   the skip pill came out at 36px (30 + 4 padding + 2 border) and drove
   the whole bar to 52px. Padding and icon sizes barely moved it.

   A unitless 1.4 here re-inherits down the tree and lets the items
   collapse to their content, which is what actually shortens the bar:
   52px -> ~30px. */
.topbar,
.topbar a,
.topbar span,
.topbar div {
    line-height: 1.4;
}

.topbar {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 6px 22px;
    padding: 4px clamp(12px, 4vw, 40px);
    font-size: 12px;
    max-width: 1600px;
    margin: 0 auto;
}

.topbar-left,
.topbar-right {
    display: flex;
    align-items: center;
    gap: 18px;
    flex-wrap: wrap;
}

.topbar-skip {
    color: rgba(255,255,255,.85) !important;
    text-decoration: none !important;
    border: 1px solid rgba(255,255,255,.28);
    border-radius: 999px;
    padding: 2px 11px;
    transition: background-color .2s var(--tg-ease-out), border-color .2s var(--tg-ease-out);
}

    .topbar-skip:hover,
    .topbar-skip:focus-visible {
        background: rgba(255,255,255,.14);
        border-color: var(--tg-gold);
        color: #fff !important;
    }

.topbar-date {
    color: rgba(255,255,255,.7) !important;
    font-weight: 500;
}

.topbar-contact {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    color: rgba(255,255,255,.85) !important;
    text-decoration: none !important;
    transition: color .2s var(--tg-ease-out);
}

    .topbar-contact i {
        color: var(--tg-gold);
        font-size: 12px;
    }

    .topbar-contact:hover {
        color: #fff !important;
    }

/* Social icons as subtle round chips */
.topbar .mg-social.info-right {
    display: flex;
    align-items: center;
    gap: 7px;
    margin: 0;
    padding: 0;
    list-style: none;
}

    .topbar .mg-social.info-right li {
        margin: 0;
        padding: 0;
        float: none;
        list-style: none;
    }

    /* style.css sets .mg-social li span.icon-soci to a floated 35px box;
       cleared here so the chips sit correctly in the flex row */
    .topbar .mg-social.info-right .icon-soci,
    .topbar .mg-social.info-right li span.icon-soci {
        display: block !important;
        float: none !important;
        width: auto !important;
        height: auto !important;
        line-height: normal !important;
        background: transparent !important;
        border-radius: 0 !important;
        margin: 0 !important;
    }

        /* 24px, down from 26px, and no lower: this bar is hidden below
           768px (homestyle2.css: `.skips { display: none }` from 240-767px),
           so the smallest screen that ever shows these chips is a 768px
           tablet - a touch device. 24px is the minimum tap target, so the
           saving stops here. The bar's height comes from .topbar-skip at
           23px anyway, not from these. */
        .topbar .mg-social.info-right .icon-soci a {
            display: flex;
            align-items: center;
            justify-content: center;
            width: 24px;
            height: 24px;
            border-radius: 50%;
            background: rgba(255,255,255,.12);
            color: #fff !important;
            font-size: 12px;
            transition: background-color .2s var(--tg-ease-out), transform .3s var(--tg-ease-spring);
        }

            .topbar .mg-social.info-right .icon-soci a:hover {
                background: var(--tg-gold);
                color: var(--tg-navy) !important;
                transform: translateY(-2px);
            }

/* NOTE: this block never actually applies. homestyle2.css hides the whole
   bar from 240-767px (`.skips { display: none }`), so nothing below 768px
   renders it. Left as-is rather than deleted - it is pre-existing, and it
   would come back into play if that rule were ever removed. */
@media (max-width: 767px) {
    .topbar {
        justify-content: center;
        gap: 8px 16px;
        font-size: 12px;
    }

    .topbar-left,
    .topbar-right {
        justify-content: center;
        gap: 14px;
    }

    /* the address is the first thing to overflow a phone screen */
    .topbar-contact:first-child span {
        display: none;
    }
}

    .region.region-header-top.skips a,
    .region.region-header-top.skips span,
    .region.region-header-top.skips i,
    .skips .fa-solid, .skips .fa {
        color: rgba(255,255,255,.9) !important;
    }

    .region.region-header-top.skips a:hover {
        color: var(--tg-gold) !important;
    }

.mg-social.info-right li .icon-soci a {
    color: rgba(255,255,255,.9) !important;
}

.header {
    display: flex;
    align-items: center;
    gap: 14px;
    /* bottom padding and margin held at 5px so the wordmark sits tight
       to the navigation below it */
    padding: 8px clamp(12px, 4vw, 40px) 5px;
    background: var(--tg-white);
    flex-wrap: wrap;
    margin: 0 0 5px;
    /* homestyle2.css draws `border-bottom: 1px solid #1f2f7a` here */
    border: none !important;
}

/* Kill the stray vertical space the legacy markup leaves between the
   brand block and the menu bar */
.header + .mg-menu-full,
.brandbar .mg-menu-full {
    margin-top: 0 !important;
}

header.mg-headwidget .clearfix {
    display: none;
}

.header-left {
    display: flex;
    align-items: center;
    /* logos sit flush against each other; homestyle2.css sets gap: 8px */
    gap: 0 !important;
}

    /* The two crests are wrapped in a single home link, so the anchor - not
       .header-left - is now what lays them out in a row. */
    .header-brand-link {
        display: flex;
        align-items: center;
        gap: 0;
        text-decoration: none !important;
    }

    /* Capped at 100px on purpose: tslogo.png is a 100x100 source, so
       anything larger upscales it and the emblem goes soft. Every
       breakpoint below stays at or under that ceiling. */
    .header-left img.f, .header-left img.s {
        width: 88px !important;
        height: 88px !important;
        object-fit: contain;
    }

    /* Telangana Rising mark is portrait (205x246), so it is sized by
       height with width left to follow, rather than squared off like
       the state emblem */
    /* Matched to the emblem's height above, and matched on height only -
       sized by height with the width left to follow, rather than squared
       off, so neither mark is stretched to fit a common box. */
    .header-left img.rising {
        height: 88px !important;
        width: auto !important;
        object-fit: contain;
    }

    .header-left img.rising + img.f {
        padding-left: 0;
        margin-left: 0;
        border-left: none;
    }

/* The three brand lines sit as one tight block: zero margins and a
   compact line-height, so no stray space collects under the wordmark.
   The global h1-h6 rule sets line-height 1.3, hence the overrides. */
.header-center {
    line-height: 1.2;
}

.header-center h1 {
    font-size: clamp(18px, 2.4vw, 26px) !important;
    color: var(--tg-navy) !important;
    margin: 0 !important;
    line-height: 1.2 !important;
}

.header-center h2 {
    font-size: 15px !important;
    color: var(--tg-blue-600) !important;
    font-weight: 500 !important;
    margin: 0 !important;
    line-height: 1.25 !important;
}

.header-center h4 {
    font-size: 13px !important;
    color: var(--tg-muted) !important;
    font-weight: 500 !important;
    margin: 0 !important;
    line-height: 1.25 !important;
}

    /* last line must not contribute trailing space */
    .header-center > *:last-child {
        margin-bottom: 0 !important;
        padding-bottom: 0 !important;
    }

/* ---------- 7b. Brand bar: emblem + department name beside the nav ----------
   On large screens the brand block and the navigation share a single
   sticky row, which reclaims roughly 60px of vertical space and reads
   closer to a modern government portal. Below 1200px it falls back to
   the original stacked order automatically. */
/* Lowered from 1200px to 992px so the brand block and the menu keep sharing
   one row when the page is zoomed. Browser zoom shrinks the CSS viewport - at
   125% a 1280px screen reports ~1024px - so a 1200px floor dropped the header
   back to the stacked layout as soon as anyone zoomed in. The 992-1199 band
   below scales the brand down to pay for it. */
@media (min-width: 992px) {
    .brandbar {
        display: flex;
        align-items: stretch;
        background: var(--tg-white);
        box-shadow: 0 4px 18px rgba(10, 38, 71, .14);
        position: sticky;
        top: 0;
        z-index: 999;
    }

        /* Brand block stays white; the nav beside it carries the navy.

           This max-width is only the floor of the chain - three later
           rules override it with !important, so the cap that actually
           applies is 46% above 1500px, 44% from 1200-1499px and 42% from
           992-1199px. The brand block needs ~437px to hold both crests
           plus the longest wordmark line ("Youth Advancement, Tourism and
           Culture Department", 303px at 11px) without wrapping, which all
           three of those clear once the crests are matched at 72px. */
        .brandbar .header {
            background: var(--tg-white);
            flex: 0 0 auto;
            max-width: 42%;
            padding: 10px clamp(14px, 2vw, 26px) 5px;
            gap: 12px;
            align-items: center;
            /* the brand block shares a flex row with the nav here, so the
               stacked layout's bottom margin would push it out of line */
            margin-bottom: 0;
        }

            .brandbar .header .header-left img.f,
            .brandbar .header .header-left img.s {
                width: 62px !important;
                height: 62px !important;
            }

            .brandbar .header .header-left img.rising {
                height: 62px !important;
                width: auto !important;
            }

            .brandbar .header .header-left img.rising + img.f {
                padding-left: 0;
            }

        /* Bronze rather than navy for the department name, matching the
           warmer heritage direction the HPS banner moved to. Measures
           7.9:1 on the white brand bar - past AA, and past AAA too. */
        .brandbar .header-center h1 {
            color: #5b5110 !important;
            font-size: 17px !important;
            line-height: 1.2 !important;
        }

        .brandbar .header-center h2 {
            color: var(--tg-blue-600) !important;
            font-size: 11.5px !important;
            margin: 1px 0 0 !important;
        }

        /* 10.5px, down from 11px. In Mulish this line measures 277px against
           a 283px column at 1200px - six pixels of slack, and the font loads
           with display=swap, so the fallback face paints first and can be
           wider than that. The half-pixel buys ~13px and keeps the line from
           wrapping during the swap. */
        .brandbar .header-center h4 {
            color: var(--tg-muted) !important;
            font-size: 10.5px !important;
        }

        /* Nav fills the rest of the row and keeps the navy gradient, so
           the bar reads as white brand block + coloured menu block */
        .brandbar .mg-menu-full {
            flex: 1 1 auto;
            border-bottom: none !important;
            box-shadow: none !important;
            position: static !important;
            display: flex;
            align-items: center;
            min-width: 0;
            border-radius: 0;
            border-top: none;
            border-left: none;
        }

            .brandbar .mg-menu-full .navbar,
            .brandbar .mg-menu-full .container-fluid,
            .brandbar .mg-menu-full .navbar-collapse,
            .brandbar .mg-menu-full .d-md-block {
                width: 100%;
            }

            .brandbar .mg-menu-full #menu-primary {
                justify-content: flex-end;
                width: 100%;
            }

            .brandbar .navbar-wp .navbar-nav > li > a.nav-link,
            .brandbar .navbar-wp .navbar-nav > li > a.has-submenu {
                font-size: 12.8px;
                padding: 9px 10px !important;
            }
}

@media (min-width: 1500px) {
    .brandbar .header-center h1 {
        font-size: 19px !important;
    }

    .brandbar .navbar-wp .navbar-nav > li > a.nav-link,
    .brandbar .navbar-wp .navbar-nav > li > a.has-submenu {
        font-size: 13.5px;
        padding: 10px 13px !important;
    }
}

/* ---------- 7c. Overflow "More" menu (priority-plus navigation) ----------
   Items that don't fit beside the brand block are moved into this panel
   by js/nav-overflow.js. Submenus nested inside it render inline as a
   grouped list rather than a floating sub-panel, so nothing can spill
   off-screen. */
li.nav-more {
    list-style: none;
    display: flex;
    align-items: center;
}

/* Icon toggle that opens the drawer */
.nav-more-toggle {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 38px;
    height: 34px;
    margin-left: 4px;
    padding: 0;
    background: transparent;
    border: 1px solid var(--tg-border);
    border-radius: 8px;
    cursor: pointer;
    transition: background-color .2s var(--tg-ease-out), border-color .2s var(--tg-ease-out);
}

    .nav-more-toggle:hover,
    .nav-more-toggle[aria-expanded="true"] {
        background: var(--tg-blue-700);
        border-color: var(--tg-blue-700);
    }

        .nav-more-toggle:hover .nav-more-bars span,
        .nav-more-toggle[aria-expanded="true"] .nav-more-bars span {
            background: #fff;
        }

.nav-more-bars {
    display: flex;
    flex-direction: column;
    gap: 4px;
    width: 17px;
}

    .nav-more-bars span {
        display: block;
        height: 2px;
        border-radius: 2px;
        background: var(--tg-navy);
        transition: transform .28s var(--tg-ease-out), opacity .2s var(--tg-ease-out);
    }

/* Bars morph to an X while the drawer is open */
.nav-more-toggle[aria-expanded="true"] .nav-more-bars span:nth-child(1) {
    transform: translateY(6px) rotate(45deg);
}

.nav-more-toggle[aria-expanded="true"] .nav-more-bars span:nth-child(2) {
    opacity: 0;
}

.nav-more-toggle[aria-expanded="true"] .nav-more-bars span:nth-child(3) {
    transform: translateY(-6px) rotate(-45deg);
}

/* --- Right-side drawer. Appended to <body> by the script, so no
   ancestor's overflow or stacking context can clip it. --- */
.nav-more-backdrop {
    position: fixed;
    inset: 0;
    background: rgba(10, 38, 71, .45);
    opacity: 0;
    visibility: hidden;
    transition: opacity .3s var(--tg-ease-out), visibility .3s;
    z-index: 1090;
}

.nav-more-drawer {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    width: min(330px, 86vw);
    background: var(--tg-white);
    box-shadow: -12px 0 36px rgba(10, 38, 71, .22);
    transform: translateX(100%);
    transition: transform .34s var(--tg-ease-out);
    z-index: 1100;
    display: flex;
    flex-direction: column;
    overflow: hidden;
}

    .nav-more-drawer:focus {
        outline: none;
    }

body.nav-more-open .nav-more-backdrop {
    opacity: 1;
    visibility: visible;
}

body.nav-more-open .nav-more-drawer {
    transform: translateX(0);
}

/* Page must not scroll behind the open drawer */
body.nav-more-open {
    overflow: hidden;
}

.nav-more-drawer-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 16px 18px;
    background: var(--tg-navy);
    flex-shrink: 0;
}

.nav-more-drawer-title {
    color: #fff;
    font-family: var(--tg-font-heading);
    font-weight: 600;
    font-size: 15px;
    letter-spacing: .03em;
    text-transform: uppercase;
}

.nav-more-close {
    background: transparent;
    border: none;
    color: #fff;
    font-size: 28px;
    line-height: 1;
    width: 34px;
    height: 34px;
    border-radius: 8px;
    cursor: pointer;
    transition: background-color .2s var(--tg-ease-out);
}

    .nav-more-close:hover {
        background: rgba(255,255,255,.16);
        color: var(--tg-gold);
    }

ul.nav-more-list {
    list-style: none;
    margin: 0 !important;
    padding: 10px !important;
    overflow-y: auto;
    flex: 1 1 auto;
    -webkit-overflow-scrolling: touch;
}

    /* Items moved in become full-width rows */
    ul.nav-more-list > li {
        display: block !important;
        width: 100% !important;
        float: none !important;
        position: static !important;
        border: none !important;
    }

        ul.nav-more-list > li + li {
            border-top: 1px solid var(--tg-border) !important;
        }

        ul.nav-more-list > li > a {
            display: block !important;
            width: auto !important;
            color: var(--tg-navy) !important;
            background: transparent !important;
            font-weight: 600 !important;
            font-size: 14.5px !important;
            padding: 13px 14px !important;
            border-radius: 8px;
            white-space: normal !important;
            text-decoration: none !important;
            transition: background-color .2s var(--tg-ease-out), color .2s var(--tg-ease-out), padding-left .2s var(--tg-ease-out);
        }

            ul.nav-more-list > li > a::after {
                display: none !important;
            }

            ul.nav-more-list > li > a:hover,
            ul.nav-more-list > li > a:focus {
                background: var(--tg-blue-50) !important;
                color: var(--tg-blue-700) !important;
                padding-left: 20px !important;
            }

/* A moved item's own submenu renders inline as an indented group.
   SmartMenus writes inline style="display:none" on these, which an
   !important declaration overrides. */
ul.nav-more-list ul,
ul.nav-more-list ul.dropdown-menu {
    display: block !important;
    position: static !important;
    float: none !important;
    box-shadow: none !important;
    border: none !important;
    background: var(--tg-blue-50) !important;
    border-radius: 8px !important;
    margin: 0 4px 8px !important;
    padding: 4px !important;
    min-width: 0 !important;
    max-width: 100% !important;
    width: auto !important;
    max-height: none !important;
    overflow: visible !important;
    top: auto !important;
    left: auto !important;
    right: auto !important;
    list-style: none;
}

    ul.nav-more-list ul li {
        display: block !important;
        width: 100% !important;
        float: none !important;
        border: none !important;
    }

    ul.nav-more-list ul a {
        display: block !important;
        color: var(--tg-ink-soft) !important;
        font-size: 13.5px !important;
        font-weight: 500 !important;
        padding: 9px 14px !important;
        white-space: normal !important;
        border-radius: 6px;
        text-decoration: none !important;
    }

        ul.nav-more-list ul a:hover,
        ul.nav-more-list ul a:focus {
            background: #fff !important;
            color: var(--tg-blue-700) !important;
        }

/* Carets are meaningless once a submenu is rendered inline */
ul.nav-more-list .dropdown-arrow,
ul.nav-more-list .sub-arrow {
    display: none !important;
}

@media (prefers-reduced-motion: reduce) {
    .nav-more-drawer,
    .nav-more-backdrop,
    .nav-more-bars span {
        transition: none !important;
    }
}

/* The measurement the script relies on only means something if items
   keep their natural width and genuinely overflow the bar */
@media (min-width: 992px) {
    ul#menu-primary {
        flex-wrap: nowrap !important;
        overflow: visible !important;
    }

        ul#menu-primary > li {
            flex: 0 0 auto !important;
        }
}

/* ---------- 8. Navigation ---------- */
.mg-menu-full {
    /* Same white as the brand block above it, so header and menu read as
       one continuous surface; a hairline keeps them scannable as bands */
    background: var(--tg-white) !important;
    border-bottom: none !important;
    border-top: none !important;
    position: sticky;
    top: 0;
    z-index: 999;
    box-shadow: 0 3px 14px rgba(10, 38, 71, .10);
}

/* The <nav class="navbar-wp"> INSIDE .mg-menu-full carries its own dark
   background in the legacy sheets, which paints over the wrapper above:
     css/default.css  .mg-headwidget .navbar-wp { background: #202f5b }
     homestyle2.css   .mg-headwidget .navbar-wp { background: #194081 }
   Both are cleared here so the white wrapper is what actually shows. */
.mg-headwidget .navbar-wp,
.mg-headwidget.center .navbar-wp,
.mg-headwidget.trans .navbar-wp,
.mg-menu-full .navbar-wp,
.navbar-wp {
    background: transparent !important;
    border: none !important;
}

/* Same sheets fill the nav links on hover with #1151d3 */
.mg-headwidget .navbar-wp .navbar-nav > li > a:hover,
.mg-headwidget .navbar-wp .navbar-nav > li > a:focus,
.mg-headwidget .navbar-wp .navbar-nav > .active > a,
.mg-headwidget .navbar-wp .navbar-nav > .active > a:hover,
.mg-headwidget .navbar-wp .navbar-nav > .active > a:focus {
    background: transparent !important;
    color: var(--tg-blue-700) !important;
}

.mg-menu-full .navbar,
.mg-menu-full .navbar-wp {
    padding-top: 0 !important;
    padding-bottom: 0 !important;
    min-height: 0 !important;
}

.navbar-wp .navbar-nav > li > a.nav-link,
.navbar-wp .navbar-nav > li > a.has-submenu {
    color: var(--tg-navy) !important;
    /* Nav takes the heading face, as on telanganarising2047.org, where the
       menu is Ubuntu rather than the body Mulish. Without this the links
       simply inherited body copy. */
    font-family: var(--tg-font-heading);
    font-weight: 600 !important;
    font-size: 13.5px;
    padding: 11px 13px !important;
    letter-spacing: .01em;
    line-height: 1.25;
    transition: background-color .2s var(--tg-ease-out), color .2s var(--tg-ease-out);
    position: relative;
    display: flex;
    align-items: center;
    gap: 5px;
}

/* Let the bar breathe a little on very wide screens without getting tall */
@media (min-width: 1400px) {
    .navbar-wp .navbar-nav > li > a.nav-link,
    .navbar-wp .navbar-nav > li > a.has-submenu {
        font-size: 14px;
        padding: 12px 16px !important;
    }
}

    .navbar-wp .navbar-nav > li > a.nav-link::after,
    .navbar-wp .navbar-nav > li > a.has-submenu::after {
        content: "";
        position: absolute;
        left: 13px;
        right: 13px;
        bottom: 6px;
        height: 2px;
        /* gold, so it stays visible once the item fills with blue */
        background: var(--tg-gold);
        transform: scaleX(0);
        transform-origin: left;
        transition: transform .3s var(--tg-ease-out);
    }

    .navbar-wp .navbar-nav > li > a.nav-link:hover::after,
    .navbar-wp .navbar-nav > li > a.has-submenu:hover::after,
    .navbar-wp .navbar-nav > li > a.nav-link:focus-visible::after,
    .navbar-wp .navbar-nav > li > a.has-submenu:focus-visible::after {
        transform: scaleX(1);
    }

    /* Background stays white on hover; only the label colour changes,
       with the underline sweeping in as the movement cue */
    .navbar-wp .navbar-nav > li > a.nav-link:hover,
    .navbar-wp .navbar-nav > li > a.has-submenu:hover,
    .navbar-wp .navbar-nav > li > a.nav-link:focus-visible,
    .navbar-wp .navbar-nav > li > a.has-submenu:focus-visible,
    .navbar-wp .navbar-nav > li.active > a {
        background: transparent !important;
        color: var(--tg-blue-700) !important;
    }

.navbar-wp .dropdown-menu,
.navbar-nav .dropdown-menu,
ul.dropdown-menu {
    background: #fff !important;
    border: none !important;
    border-radius: var(--tg-radius-sm) !important;
    box-shadow: var(--tg-shadow-lg) !important;
    padding: 8px !important;
    margin-top: 0 !important;
    border-top: 3px solid var(--tg-gold) !important;
}

/* Submenu links.
   homestyle2.css line 224 sets `.navbar-wp .dropdown-menu > li > a`
   { background-color: rgb(84 43 0); color: #fff !important; }
   That selector is specificity 0,2,2 — higher than a plain
   `.navbar-wp .dropdown-menu a` (0,2,1) — so its !important white text
   survives any weaker override, giving white-on-white once the brown
   background is cleared. The `> li > a` form below matches it exactly
   and, loading later, wins the tie. */
.mg-menu-full .navbar-wp .dropdown-menu > li > a,
.navbar-wp .dropdown-menu > li > a,
.navbar-wp .dropdown-menu a,
.navbar-nav .dropdown-menu a,
ul.dropdown-menu li a,
ul.dropdown-menu .menu-item a {
    color: var(--tg-navy) !important;
    background: transparent !important;
    border-radius: 8px;
    display: block;
    padding: 10px 14px !important;
    font-weight: 500 !important;
    font-size: 14px;
    text-decoration: none !important;
    white-space: nowrap;
    transition: background-color .2s var(--tg-ease-out), color .2s var(--tg-ease-out), padding-left .2s var(--tg-ease-out);
}

    .navbar-wp .dropdown-menu a:hover,
    .navbar-wp .dropdown-menu a:focus,
    .navbar-nav .dropdown-menu a:hover,
    ul.dropdown-menu li a:hover,
    ul.dropdown-menu li a:focus {
        background: var(--tg-blue-50) !important;
        color: var(--tg-blue-700) !important;
        padding-left: 20px !important;
    }

/* ---- Dropdown open animation ----
   The panel had no entrance of its own: SmartMenus toggles `display`, so
   a submenu simply appeared. A CSS animation (not a transition) is what
   works here - transitions cannot run on a display:none -> block change,
   whereas an animation replays every time the element is shown, which is
   exactly the SmartMenus show/hide cycle.

   Transform is safe to use: SmartMenus positions these with inline
   top/left, so nothing it sets is being overwritten. */
@keyframes tgDropdownIn {
    from {
        opacity: 0;
        transform: translateY(-9px);
    }

    to {
        opacity: 1;
        transform: none;
    }
}

@keyframes tgDropdownItemIn {
    from {
        opacity: 0;
        transform: translateX(-6px);
    }

    to {
        opacity: 1;
        transform: none;
    }
}

.navbar-wp .dropdown-menu,
.navbar-nav .dropdown-menu {
    animation: tgDropdownIn .24s var(--tg-ease-out);
}

/* Items follow the panel in sequence. `backwards` fill keeps each one
   hidden through its delay instead of flashing at full opacity first.
   Capped at six - no submenu on this site is longer, and an uncapped
   stagger would leave later items lagging noticeably. */
.navbar-wp .dropdown-menu > li,
.navbar-nav .dropdown-menu > li {
    animation: tgDropdownItemIn .26s var(--tg-ease-out) backwards;
}

.navbar-wp .dropdown-menu > li:nth-child(1) { animation-delay: .05s; }
.navbar-wp .dropdown-menu > li:nth-child(2) { animation-delay: .09s; }
.navbar-wp .dropdown-menu > li:nth-child(3) { animation-delay: .13s; }
.navbar-wp .dropdown-menu > li:nth-child(4) { animation-delay: .17s; }
.navbar-wp .dropdown-menu > li:nth-child(5) { animation-delay: .21s; }
.navbar-wp .dropdown-menu > li:nth-child(n+6) { animation-delay: .25s; }

@media (prefers-reduced-motion: reduce) {
    .navbar-wp .dropdown-menu,
    .navbar-nav .dropdown-menu,
    .navbar-wp .dropdown-menu > li,
    .navbar-nav .dropdown-menu > li {
        animation: none !important;
    }
}

.navbar-toggler .burger-line {
    background: var(--tg-navy);
}

.mobilehomebtn {
    color: var(--tg-navy) !important;
}

/* ---------- 9. Hero / slideshow ---------- */
.mg-fea-area {
    padding: 0 !important;
    margin: 0 !important;
    border-top: 4px solid;
    border-image: none;
}

/* homestyle.css gives .swiper `margin: 2px auto`, the last stray gap
   between the menu and the hero */
.mg-fea-area .swiper,
.mg-fea-area .homeSwiper {
    margin: 0 !important;
}

.mg-fea-area .overlay {
    position: relative;
    /* style.css sets `padding: 30px 0 0` and homestyle.css `5px 0 0`,
       both of which push the hero away from the menu */
    padding: 0 !important;
    margin: 0 !important;
}

.homeSwiper, .homeSwiper .slider-img {
    height: min(78vh, 640px) !important;
}

.homeSwiper::after {
    content: "";
    position: absolute;
    inset: 0;
    background: linear-gradient(0deg, rgba(10,38,71,.82) 0%, rgba(10,38,71,.25) 45%, rgba(10,38,71,.1) 100%);
    pointer-events: none;
    z-index: 1;
}

.swiper-slide {
    position: relative;
}

.swiper-button-next, .swiper-button-prev {
    background: rgba(10,38,71,.55) !important;
    width: 44px !important;
    height: 44px !important;
    border-radius: 50%;
    color: #fff !important;
    z-index: 3;
}

    .swiper-button-next:after, .swiper-button-prev:after {
        font-size: 18px !important;
    }

.swiper-pagination-bullet-active {
    background: var(--tg-gold) !important;
}

.swiper-pagination {
    z-index: 3;
}

/* ---------- 9a. Per-slide monument title ----------
   Names the monument on each slide. Anchored bottom-RIGHT because the
   fixed .hero-caption owns the bottom-left (max-width 780px), and lifted
   clear of the pagination bullets that sit bottom-centre.

   Only the clean photographs carry one. The legacy banner artwork
   (HP1 / HP5) already has its title burned into the image, so a chip
   there would print the monument name twice.

   Swiper runs loop:true, which clones slides - the title is a child of
   the slide, so each clone carries its own correct caption. */
.slide-title {
    position: absolute;
    right: clamp(14px, 4vw, 46px);
    bottom: clamp(56px, 9vh, 96px);
    z-index: 3;
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    gap: 3px;
    max-width: min(48vw, 400px);
    padding: 11px clamp(13px, 1.4vw, 18px);
    text-align: right;
    border-right: 3px solid var(--tg-gold);
    border-radius: 5px 11px 11px 5px;
    background: linear-gradient(to left, rgba(4,16,31,.66), rgba(4,16,31,.26));
    -webkit-backdrop-filter: blur(7px);
    backdrop-filter: blur(7px);
    /* the slide itself is the link target on some pages - never swallow
       a click meant for the slider */
    pointer-events: none;
}

    .slide-title strong {
        font-family: var(--tg-font-heading);
        /* Scaled up towards the 35px/600 white hero titles used on
           tourism.telangana.gov.in (tgtdc.in), where the destination name is
           the loudest thing on the slide. Capped at 28px rather than 35px
           because this hero also carries a caption block and two CTAs, which
           theirs does not - at 35px the two would compete. */
        font-size: clamp(15px, 2vw, 28px);
        font-weight: 700;
        line-height: 1.18;
        letter-spacing: -.012em;
        color: #fff;
        text-shadow: 0 1px 14px rgba(0,0,0,.5);
    }

    .slide-title em {
        font-style: normal;
        font-size: clamp(10.5px, 1vw, 13px);
        letter-spacing: .03em;
        color: rgba(255,255,255,.82);
        text-shadow: 0 1px 10px rgba(0,0,0,.5);
    }

/* Slides in from the right once its slide becomes the active one. With
   effect:fade every slide is stacked, so this keys off the class Swiper
   already toggles rather than any custom JS. */
.homeSwiper .swiper-slide .slide-title {
    opacity: 0;
    transform: translateX(14px);
    transition: opacity .6s var(--tg-ease-out), transform .6s var(--tg-ease-out);
}

.homeSwiper .swiper-slide-active .slide-title {
    opacity: 1;
    transform: none;
    transition-delay: .28s;
}

@media (max-width: 767px) {
    /* The hero caption fills the lower band on a phone, so the title
       moves to the top of the frame instead of stacking on top of it. */
    .slide-title {
        top: clamp(12px, 3vh, 22px);
        bottom: auto;
        right: 12px;
        max-width: 62vw;
        padding: 8px 12px;
    }
}

@media (prefers-reduced-motion: reduce) {
    .homeSwiper .swiper-slide .slide-title {
        opacity: 1;
        transform: none;
        transition: none;
    }
}

/* Hero caption overlay, sits above the fade slides and the scrim */
.hero-caption {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 2;
    padding: 0 clamp(20px, 6vw, 72px) clamp(48px, 8vh, 88px);
    max-width: 780px;
    pointer-events: none;
}

    .hero-caption > * {
        pointer-events: auto;
    }

/* The caption belongs to the opening frame only - motion.js hides it for
   the rest of the rotation and brings it back when the loop returns to the
   first slide. Faded rather than display:none so the change reads as part
   of the transition; visibility takes it out of the tab order and the
   accessibility tree once the fade has finished. */
.hero-caption.is-hidden {
    opacity: 0;
    visibility: hidden;
    transition: opacity .45s var(--tg-ease-out), visibility 0s linear .45s;
}

.hero-caption {
    transition: opacity .45s var(--tg-ease-out);
}

.WEL {
    font-family: var(--tg-font-heading) !important;
    background: none !important;
    color: #fff !important;
    font-size: clamp(26px, 4.2vw, 46px) !important;
    font-weight: 700 !important;
    padding: 0 !important;
    margin: 0 0 14px !important;
    letter-spacing: -.01em !important;
    text-align: left !important;
    text-transform: none !important;
    line-height: 1.15 !important;
    text-shadow: 0 2px 18px rgba(0,0,0,.35);
}

.hero-sub {
    color: rgba(255,255,255,.88);
    font-size: clamp(14px, 1.6vw, 17px);
    max-width: 56ch;
    margin: 0 0 26px;
    line-height: 1.6;
    text-shadow: 0 1px 8px rgba(0,0,0,.35);
}

.hero-cta {
    display: flex;
    gap: 14px;
    flex-wrap: wrap;
}

.hero-btn-primary {
    background: var(--tg-gold) !important;
    border-color: var(--tg-gold) !important;
    color: var(--tg-navy) !important;
}

    .hero-btn-primary:hover {
        background: var(--tg-gold-dark) !important;
        border-color: var(--tg-gold-dark) !important;
        color: #fff !important;
    }

.hero-btn-ghost {
    background: rgba(255,255,255,.12) !important;
    border: 1.5px solid rgba(255,255,255,.7) !important;
    color: #fff !important;
    backdrop-filter: blur(2px);
}

    .hero-btn-ghost:hover {
        background: #fff !important;
        color: var(--tg-navy) !important;
        border-color: #fff !important;
    }

@media (max-width: 600px) {
    .hero-caption {
        padding: 0 18px 32px;
    }
}

/* ---------- 9b. Quick links (home page) ---------- */
.quicklinks-section {
    padding: 24px clamp(14px, 4vw, 40px) 10px;
    background: linear-gradient(180deg, var(--tg-white) 0%, var(--tg-blue-50) 100%);
}

.quicklinks-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
    gap: 16px;
}

.quicklink-card {
    background: var(--tg-white);
    border: 1px solid var(--tg-border);
    border-radius: var(--tg-radius);
    box-shadow: var(--tg-shadow-sm);
    padding: 22px 14px;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 10px;
    text-align: center;
    text-decoration: none !important;
    color: var(--tg-navy) !important;
    font-weight: 600;
    font-size: 14px;
    transition: transform .35s var(--tg-ease-spring), box-shadow .3s var(--tg-ease-out), background-color .25s var(--tg-ease-out);
}

    .quicklink-card:hover {
        transform: translateY(-6px) scale(1.03);
        box-shadow: var(--tg-shadow);
        background: var(--tg-blue-700);
        color: #fff !important;
        border-color: var(--tg-blue-700);
    }

        .quicklink-card:hover .quicklink-icon {
            background: var(--tg-gold);
            color: var(--tg-navy);
        }

.quicklink-icon {
    width: 52px;
    height: 52px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--tg-blue-50);
    color: var(--tg-blue-700);
    font-size: 20px;
    transition: background-color .18s ease, color .18s ease, transform .18s ease;
}

.quicklink-card:hover .quicklink-icon {
    transform: scale(1.08) rotate(-4deg);
}

/* Alternate gradient rhythm down the home page so each section reads as
   a distinct band instead of one long flat scroll, while staying inside
   the same navy/blue/gold family for a cohesive premium look. */
.about-section {
    background: linear-gradient(135deg, var(--tg-blue-50) 0%, var(--tg-white) 60%) !important;
}

.publications-section {
    background: linear-gradient(135deg, var(--tg-white) 0%, var(--tg-blue-50) 100%) !important;
}

.gallery {
    background: linear-gradient(160deg, var(--tg-blue-50) 0%, var(--tg-blue-100) 100%);
    border-radius: var(--tg-radius-lg);
    margin: 0 clamp(0px, 2vw, 12px) 24px;
}

/* Officials cards */
.official-card {
    background: var(--tg-white);
    border: 1px solid var(--tg-border);
    border-radius: var(--tg-radius);
    box-shadow: var(--tg-shadow-sm);
    padding: 26px 16px;
    height: 100%;
    transition: transform .35s var(--tg-ease-spring), box-shadow .3s var(--tg-ease-out);
}

    .official-card:hover {
        transform: translateY(-6px);
        box-shadow: var(--tg-shadow);
    }

    .official-card:hover .official-photo {
        transform: scale(1.06);
    }

.official-photo {
    transition: transform .35s var(--tg-ease-spring);
}

/* ---------- 9c. Home page: Museums Division ---------- */
.museums-section {
    background: linear-gradient(160deg, var(--tg-white) 0%, var(--tg-blue-50) 55%, var(--tg-white) 100%);
    /* Bottom space removed: this section used to add 32px here on top of
       the 8px the generic .container-fluid rule contributes, leaving a
       40px dead gap under "View all museums". The Photo Gallery section
       below carries its own top padding, so the seam stays clean. */
    padding: 32px clamp(14px, 4vw, 40px) 0;
}

    .museums-section .container-fluid {
        padding-bottom: 0;
    }

.museum-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 18px;
    max-width: 1100px;
    margin: 0 auto;
}

.museum-card {
    background: var(--tg-white);
    border: 1px solid var(--tg-border);
    border-radius: var(--tg-radius);
    box-shadow: var(--tg-shadow-sm);
    overflow: hidden;
    display: flex;
    flex-direction: column;
    text-decoration: none !important;
    transition: transform .35s var(--tg-ease-spring), box-shadow .3s var(--tg-ease-out), border-color .2s var(--tg-ease-out);
}

    .museum-card:hover {
        transform: translateY(-6px);
        box-shadow: var(--tg-shadow-lg);
        border-color: var(--tg-blue-500);
    }

.museum-card-media {
    height: 150px;
    background-size: cover;
    background-position: center;
    background-color: var(--tg-blue-50);
    transition: transform .5s var(--tg-ease-out);
}

.museum-card:hover .museum-card-media {
    transform: scale(1.06);
}

.museum-card-media-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 34px;
    color: var(--tg-blue-700);
    background: linear-gradient(135deg, var(--tg-blue-50), var(--tg-blue-100));
}

.museum-card:hover .museum-card-media-icon {
    color: #fff;
    background: linear-gradient(135deg, var(--tg-blue-600), var(--tg-blue-800));
}

.museum-card-media-icon.icon-teal {
    background: linear-gradient(135deg, var(--tg-teal-50), #d3e9e6);
    color: var(--tg-teal);
}

.museum-card:hover .museum-card-media-icon.icon-teal {
    background: linear-gradient(135deg, var(--tg-teal), #1f5750);
}

.museum-card-media-icon.icon-terracotta {
    background: linear-gradient(135deg, var(--tg-terracotta-50), #f2ddd0);
    color: var(--tg-terracotta);
}

.museum-card:hover .museum-card-media-icon.icon-terracotta {
    background: linear-gradient(135deg, var(--tg-terracotta), #8a4227);
}

.museum-card-body {
    padding: 18px 20px 22px;
    display: flex;
    flex-direction: column;
    gap: 8px;
}

.museum-card-name {
    font-family: var(--tg-font-heading);
    font-weight: 600;
    color: var(--tg-navy);
    font-size: 15.5px;
}

.museum-card-desc {
    color: var(--tg-muted);
    font-size: 13px;
    line-height: 1.55;
}

/* ---------- 9e. Photo Highlights mosaic ----------
   Redesigned as a curated editorial mosaic on a dark "gallery wall".

   Why dark: photographs read as framed works against a deep ground the
   way a museum actually hangs them, and it gives the page a moment of
   contrast between two light sections. Every inherited colour that
   assumed a light background is re-stated below, so nothing is left
   navy-on-navy.

   Why asymmetric: the old grid was `auto-fit minmax(140px)` over seven
   equal 4:3 tiles, so on a wide screen all seven collapsed into one thin
   strip and no image was more important than any other. A fixed 4-column
   mosaic with one 2x2 feature tile and two wide base tiles fills the
   grid exactly at seven items and gives the eye a route through it.

   The layout is driven entirely by :nth-child, so the markup is
   untouched - tiles can be reordered in the .aspx without new classes. */
.photo-highlights {
    background:
        radial-gradient(120% 90% at 12% 0%, rgba(47,128,216,.20), transparent 60%),
        radial-gradient(90% 80% at 100% 100%, rgba(232,169,51,.14), transparent 55%),
        linear-gradient(165deg, #0a2647 0%, #071c34 55%, #0a2647 100%);
    padding: clamp(38px, 5vw, 62px) clamp(14px, 4vw, 40px) clamp(42px, 5vw, 64px);
}

/* --- Heading + lead re-stated for the dark ground --- */
.photo-highlights .mg-sec-title h5,
.photo-highlights .publications-heading {
    color: #fff !important;
}

.photo-highlights .section-lead {
    color: rgba(255,255,255,.74) !important;
    max-width: 620px;
}

.photo-mosaic {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    /* Rows drive tile height now, so .photo-tile no longer sets an
       aspect-ratio - a 2x2 tile has to be free to be twice as tall. */
    grid-auto-rows: clamp(112px, 12.5vw, 166px);
    gap: clamp(10px, 1.1vw, 15px);
    max-width: 1160px;
    margin: 0 auto;
}

/* feature tile: two columns wide, two rows tall */
.photo-mosaic > .photo-tile:nth-child(1) {
    grid-column: span 2;
    grid-row: span 2;
}

/* the two base tiles run wide to close the grid off cleanly */
.photo-mosaic > .photo-tile:nth-child(6),
.photo-mosaic > .photo-tile:nth-child(7) {
    grid-column: span 2;
}

.photo-tile {
    position: relative;
    display: block;
    height: 100%;
    border-radius: var(--tg-radius);
    overflow: hidden;
    background: #08203b;
    /* A hairline ring keeps a dark photo from bleeding into the dark
       section behind it. */
    box-shadow: 0 0 0 1px rgba(255,255,255,.10), 0 8px 22px rgba(0,0,0,.30);
    transition: box-shadow .45s var(--tg-ease-out), transform .45s var(--tg-ease-out);
}

    .photo-tile img {
        width: 100%;
        height: 100%;
        object-fit: cover;
        display: block;
        /* Settles from a hair over-scale so the crop breathes on hover
           without the 1.1 lurch the old rule had. */
        transform: scale(1.015);
        transition: transform .7s var(--tg-ease-out), filter .5s var(--tg-ease-out);
    }

    .photo-tile:hover,
    .photo-tile:focus-visible {
        transform: translateY(-4px);
        box-shadow: 0 0 0 1px rgba(232,169,51,.55), 0 18px 40px rgba(0,0,0,.45);
    }

        .photo-tile:hover img,
        .photo-tile:focus-visible img {
            transform: scale(1.075);
        }

    .photo-tile:focus-visible {
        outline: 3px solid var(--tg-gold);
        outline-offset: 3px;
    }

/* Scrim: sized to the text rather than washing the whole frame, so more
   of the photograph stays visible than under the old 90% flood. */
.photo-tile::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    height: 62%;
    background: linear-gradient(to top,
        rgba(4,16,31,.92) 0%,
        rgba(4,16,31,.55) 45%,
        rgba(4,16,31,0) 100%);
    pointer-events: none;
    transition: opacity .45s var(--tg-ease-out);
}

.photo-tile:hover::after {
    opacity: .88;
}

.photo-tile-label {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 2;
    padding: 14px clamp(12px, 1.4vw, 18px);
    color: #fff;
    /* Up from 12px - the old label was too small to carry a monument
       name, which is the one piece of information the tile owes you. */
    font-size: 14px;
    font-weight: 600;
    letter-spacing: -.005em;
    line-height: 1.3;
    text-align: left;
    text-shadow: 0 1px 12px rgba(0,0,0,.55);
    transform: translateY(4px);
    transition: transform .45s var(--tg-ease-out);
}

/* Gold rule that draws in under the label on hover - the affordance that
   tells you the tile is a link into the gallery. */
.photo-tile-label::after {
    content: "";
    display: block;
    width: 26px;
    height: 2px;
    margin-top: 8px;
    background: var(--tg-gold);
    transform: scaleX(0);
    transform-origin: left center;
    transition: transform .45s var(--tg-ease-out);
}

.photo-tile:hover .photo-tile-label,
.photo-tile:focus-visible .photo-tile-label {
    transform: translateY(0);
}

    .photo-tile:hover .photo-tile-label::after,
    .photo-tile:focus-visible .photo-tile-label::after {
        transform: scaleX(1);
    }

/* The feature tile carries a larger label to match its weight. */
.photo-mosaic > .photo-tile:nth-child(1) .photo-tile-label {
    font-size: clamp(16px, 1.7vw, 20px);
    padding: 18px clamp(14px, 1.6vw, 24px);
}

/* Button re-stated for the dark ground */
.photo-highlights .btn-primary {
    background: var(--tg-gold) !important;
    border-color: var(--tg-gold) !important;
    color: var(--tg-navy) !important;
    font-weight: 700;
}

    .photo-highlights .btn-primary:hover,
    .photo-highlights .btn-primary:focus {
        background: #f2bc51 !important;
        border-color: #f2bc51 !important;
        color: var(--tg-navy) !important;
    }

/* --- Mosaic responsive steps --- */
@media (max-width: 900px) {
    .photo-mosaic {
        grid-template-columns: repeat(2, 1fr);
        grid-auto-rows: clamp(110px, 19vw, 150px);
    }
    /* feature stays a feature, just across the full two columns */
    .photo-mosaic > .photo-tile:nth-child(1) {
        grid-column: span 2;
        grid-row: span 2;
    }

    .photo-mosaic > .photo-tile:nth-child(6),
    .photo-mosaic > .photo-tile:nth-child(7) {
        grid-column: span 1;
    }
}

@media (max-width: 520px) {
    .photo-mosaic {
        grid-template-columns: 1fr 1fr;
        grid-auto-rows: 132px;
    }
    /* On a phone a 2x2 feature eats the whole viewport, so it drops to a
       single wide band and the rest tile two-up. */
    .photo-mosaic > .photo-tile:nth-child(1) {
        grid-column: span 2;
        grid-row: span 1;
    }

    .photo-tile-label {
        font-size: 13px;
        padding: 11px 12px;
    }
}

/* ---------- 9d. Home page: Heritage Partner Scheme banner ---------- */
.hps-banner {
    /* Navy -> bronze. Warmer than the previous navy -> blue-700 ramp and
       closer to the theme's gold accent, which suits a heritage banner. */
    background-color: var(--tg-navy);
    background-image: linear-gradient(341deg, var(--tg-navy), #735a35);
    /* Flat 40px sides (was clamp(14px, 4vw, 40px)) - full padding is now
       held at every width rather than easing down on narrow screens. */
    padding: 34px 40px;
    position: relative;
    overflow: hidden;
}

    .hps-banner::before {
        content: "";
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        height: 4px;
        background: var(--grad-accent);
        z-index: 2;
    }

    /* ---- Diagonal corner line-work ----
       Matches the treatment on telanganarising2047.org (the second band on
       /global-summit-telangana-2025 and the "investment evolution" band on
       /investments - both lay the same 930x790 pattern-bg.webp over a dark
       panel via a ::before). Sampled: plain white line-work at 135deg,
       peak alpha 22/255, ~1-1.7% coverage, and - the part that matters -
       gathered into two wedges, top-right and bottom-left, rather than
       spread evenly.

       An earlier version of this put a repeating-linear-gradient straight
       into the element's background. That gave uniform hairlines across
       the whole panel, which reads as fine stripes and not as the sweeping
       corner line-work of the original. The lines now live here and are
       masked into the same two corners.

       Rebuilt rather than linking their file: no request, no external
       dependency, and it scales to any band height without tiling seams.

       The mask is the only part that is not universally supported. If a
       browser ignores it the lines simply cover the whole panel - i.e. it
       degrades to the previous behaviour, never to a broken layout. */
    .hps-banner::after {
        content: "";
        position: absolute;
        inset: 0;
        z-index: 0;
        pointer-events: none;
        background-image: repeating-linear-gradient(135deg,
            rgba(255, 255, 255, .09) 0 1px,
            transparent 1px 26px);
        -webkit-mask-image:
            radial-gradient(125% 135% at 100% 0%, #000 0 28%, transparent 62%),
            radial-gradient(125% 135% at 0% 100%, #000 0 28%, transparent 62%);
        mask-image:
            radial-gradient(125% 135% at 100% 0%, #000 0 28%, transparent 62%),
            radial-gradient(125% 135% at 0% 100%, #000 0 28%, transparent 62%);
    }

    /* The banner's own content has to clear ::after, which is positioned
       and would otherwise paint over it. */
    .hps-banner > .container-fluid {
        position: relative;
        z-index: 1;
    }

.hps-banner-inner {
    max-width: 1100px;
    margin: 0 auto;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 32px;
}

.hps-banner-text {
    flex: 1 1 420px;
    max-width: 620px;
}

.hps-eyebrow {
    color: var(--tg-gold);
    font-size: 12.5px;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .06em;
}

.hps-banner-text h2 {
    color: #fff !important;
    margin: 8px 0 12px !important;
    border: none !important;
}

.hps-banner-text p {
    color: rgba(255,255,255,.82);
    font-size: 14.5px;
    line-height: 1.7;
    margin: 0 0 20px;
}

.hps-btn {
    background: var(--tg-gold) !important;
    border-color: var(--tg-gold) !important;
    color: var(--tg-navy) !important;
}

    .hps-btn:hover {
        background: var(--tg-gold-dark) !important;
        border-color: var(--tg-gold-dark) !important;
        color: #fff !important;
    }

.hps-banner-stats {
    display: flex;
    gap: 24px;
    flex-shrink: 0;
}

.hps-stat {
    background: rgba(255,255,255,.08);
    border: 1px solid rgba(255,255,255,.18);
    border-radius: var(--tg-radius);
    padding: 20px 26px;
    text-align: center;
    min-width: 130px;
}

.hps-stat-num {
    display: block;
    font-family: var(--tg-font-heading);
    font-size: 30px;
    font-weight: 700;
    color: #fff;
}

.hps-stat-label {
    display: block;
    font-size: 12px;
    color: rgba(255,255,255,.75);
    margin-top: 4px;
}

@media (max-width: 600px) {
    .hps-banner-stats {
        width: 100%;
        justify-content: center;
    }
}

/* ---------- 10. Home page: about / officials / publications ---------- */
/* About section: a dark monument backdrop, three layers deep —
     1. jali lattice (interlocking circles, a recurring Deccan motif),
        an inline SVG data URI so it costs no extra request
     2. a navy wash heavy enough to guarantee text contrast
     3. a real monument photograph
   The photo is the small thumbnail on purpose: under a 93% wash its
   softness is invisible, and it saves ~350KB over the full-size file. */
.about-section {
    position: relative;
    overflow: hidden;
    background-color: var(--tg-navy) !important;
    background-image:
        url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='72' height='72' viewBox='0 0 72 72'%3E%3Cg fill='none' stroke='%23ffffff' stroke-width='1' opacity='0.10'%3E%3Ccircle cx='36' cy='36' r='24'/%3E%3Ccircle cx='0' cy='0' r='24'/%3E%3Ccircle cx='72' cy='0' r='24'/%3E%3Ccircle cx='0' cy='72' r='24'/%3E%3Ccircle cx='72' cy='72' r='24'/%3E%3C/g%3E%3C/svg%3E"),
        linear-gradient(115deg, rgba(10,38,71,.97) 0%, rgba(10,38,71,.93) 45%, rgba(16,83,143,.90) 100%),
        url("../images/drive-gallery/thumbs/taramathi-monuments.jpg") !important;
    background-repeat: repeat, no-repeat, no-repeat;
    background-size: 72px 72px, cover, cover;
    background-position: center, center, center;
    color: rgba(255,255,255,.9) !important;
    padding: 44px clamp(14px, 4vw, 40px) !important;
    border-radius: var(--tg-radius-lg);
    margin: 0 auto;
}

    /* gold wash top-left, echoing the page-banner accent */
    .about-section::before {
        content: "";
        position: absolute;
        top: -90px;
        left: -90px;
        width: 340px;
        height: 340px;
        border-radius: 50%;
        background: radial-gradient(circle, rgba(232,169,51,.22), transparent 68%);
        pointer-events: none;
    }

    /* thin gold rule across the top edge */
    .about-section::after {
        content: "";
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        height: 3px;
        background: linear-gradient(90deg, var(--tg-gold), var(--tg-blue-500), transparent);
        pointer-events: none;
    }

    .about-section > .row {
        position: relative;
        z-index: 1;
    }

/* ---- Text inverted for the dark backdrop ---- */
.about-section .about-text,
.about-section .about-heading {
    color: #fff !important;
}

.about-section .about-heading,
.about-section .about-heading span {
    color: #fff !important;
}

.about-section .justify-text {
    color: rgba(255,255,255,.86) !important;
    line-height: 1.75;
}

/* Officials cards stay white — they read as lifted panels against the
   dark field, and their own text keeps its dark-on-light contrast */
.about-section .official-card {
    background: rgba(255,255,255,.97);
    border-color: rgba(255,255,255,.35);
    box-shadow: 0 14px 34px rgba(0,0,0,.28);
}

.about-section .official-photo {
    border-color: rgba(255,255,255,.6) !important;
}

.about-heading span {
    display: inline-block;
    padding-bottom: 8px;
    border-bottom: 3px solid var(--tg-gold);
}

/* ---- Staggered text reveal for the About block ----
   Each line rises in turn once the section scrolls into view. The
   heading's gold rule sweeps out from the left as it lands. Elements
   only start hidden after motion.js has tagged the section, so with
   JS unavailable the text simply renders normally. */
.about-section.reveal .about-eyebrow,
.about-section.reveal .about-heading,
.about-section.reveal .justify-text,
.about-section.reveal .about-cta {
    opacity: 0;
    transform: translateY(20px);
    transition: opacity .7s var(--tg-ease-out), transform .7s var(--tg-ease-out);
}

.about-section.reveal.in-view .about-eyebrow {
    opacity: 1;
    transform: none;
}

.about-section.reveal.in-view .about-heading {
    opacity: 1;
    transform: none;
    transition-delay: .05s;
}

.about-section.reveal.in-view .justify-text:nth-of-type(1) {
    opacity: 1;
    transform: none;
    transition-delay: .22s;
}

.about-section.reveal.in-view .justify-text:nth-of-type(2) {
    opacity: 1;
    transform: none;
    transition-delay: .36s;
}

/* Last in, after the copy it follows from */
.about-section.reveal.in-view .about-cta {
    opacity: 1;
    transform: none;
    transition-delay: .50s;
}

.about-section.reveal .about-heading span {
    transform: scaleX(0);
    /* Grows out from the middle now that the heading is centred - a
       left-origin sweep under centred text reads as misaligned. */
    transform-origin: center;
    transition: transform .6s var(--tg-ease-out) .35s;
    border-bottom-color: var(--tg-gold);
}

.about-section.reveal.in-view .about-heading span {
    transform: scaleX(1);
}

/* The section itself must NOT also fade in as a block — the generic
   .reveal treatment is cancelled here so only its children animate.
   (The officials cards keep their own .reveal stagger from motion.js.) */
.about-section.reveal {
    opacity: 1 !important;
    transform: none !important;
}

@media (prefers-reduced-motion: reduce) {
    .about-section.reveal .about-eyebrow,
    .about-section.reveal .about-heading,
    .about-section.reveal .justify-text,
    .about-section.reveal .about-cta,
    .about-section.reveal .about-heading span {
        opacity: 1 !important;
        transform: none !important;
        transition: none !important;
    }
}

/* ---------- 10a. About section: premium pass ----------
   Presentation only - no markup, controls or content touched. */

/* --- Measure ---
   The band is full-bleed, like the Heritage Partner Scheme banner and the
   Museums band below it. Those two cap their content: .hps-banner-inner
   and .museum-grid are both `max-width: 1100px; margin: 0 auto`. This row
   was never capped, so it kept growing with the viewport while they
   stayed put - and the wider the window (or the further the page is
   zoomed out) the further apart they drifted. Measured at a 2560 viewport:

     .museum-grid / .hps-banner-inner   723 -> 1823
     .about-section > .row               25 -> 2520

   Inside the row the same width pulled the block apart. The eyebrow,
   heading and CTA are centred on the text panel (rules below), while the
   copy is pinned left at its 64ch measure, so the two axes separated by
   221px at 1920 and 408px at 2560 - the heading floating out to the right
   of the paragraphs it heads.

   1130 = 1100 + the 15px gutter the row's negative margins carry on each
   side, so the columns' content edges land on 1100 and line up with the
   bands below. Gated on min-width rather than applied outright: below it
   the cap cannot bind, and the auto margins would only cancel those
   negative gutters and inset the panel by 15px a side on phones. */
@media (min-width: 1240px) {
    .about-section > .row {
        max-width: 1130px;
        margin-left: auto;
        margin-right: auto;
    }
}

/* The text column and the officials grid are siblings of very different
   heights, so the copy used to sit top-aligned against three tall cards.
   Centring it balances the two halves. */
.about-section .about-text {
    display: flex;
    flex-direction: column;
    justify-content: center;
}

/* The copy used to sit straight onto the monument photograph behind the
   section. Even under the existing wash that is the hardest reading on
   the page, so the text now gets its own panel: a frosted card with a
   gold spine. It lifts the copy off the photo, gives the column an edge
   to align to, and lets the backdrop stay visible around it. */
.about-section .text-container {
    background: linear-gradient(150deg, rgba(255,255,255,.11), rgba(255,255,255,.04));
    border: 1px solid rgba(255,255,255,.17);
    border-left: 3px solid var(--tg-gold);
    border-radius: var(--tg-radius-lg);
    padding: 32px clamp(20px, 2.5vw, 36px);
    -webkit-backdrop-filter: blur(9px);
    backdrop-filter: blur(9px);
    box-shadow: 0 18px 44px rgba(0,0,0,.24);
}

/* Eyebrow above the heading, matching .mus-eyebrow / .hps-eyebrow used by
   the two sections below this one. Centred, because the About heading is
   centred by the site-wide section-heading rule (3a). */
.about-section .about-eyebrow {
    display: block;
    text-align: center;
    color: var(--tg-gold);
    font-family: var(--tg-font-body);
    font-size: 12.5px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .13em;
    margin-bottom: 8px;
}

.about-section .about-heading {
    margin-bottom: 18px !important;
    /* stays centred, in line with the site-wide section-heading rule */
    font-size: clamp(23px, 2.4vw, 30px) !important;
    letter-spacing: -.02em;
}

/* Deliberately a ghost button, not the gold one used in the hero and the
   Heritage Partner Scheme banner. The HPS banner sits immediately below
   this section with a solid gold CTA; two filled gold buttons a screen
   apart would compete, and the scheme is the louder call of the two. This
   one stays quiet at rest and picks up the gold only on hover. */
/* Shrink-wrapped flex box with auto side margins - the same way the
   site-wide section headings are centred in rule 3a - so the button lands
   on the heading's axis without the parent needing text-align. */
.about-section .about-cta {
    display: flex;
    width: -moz-fit-content;
    width: fit-content;
    align-items: center;
    gap: 9px;
    margin: 22px auto 0;
    padding: 11px 26px;
    background: rgba(255,255,255,.10) !important;
    border: 1.5px solid rgba(255,255,255,.55) !important;
    color: #fff !important;
    font-size: 14.5px;
    -webkit-backdrop-filter: blur(2px);
    backdrop-filter: blur(2px);
}

.about-section .about-cta i {
    font-size: 12px;
    transition: transform .3s var(--tg-ease-spring);
}

.about-section .about-cta:hover,
.about-section .about-cta:focus-visible {
    background: var(--tg-gold) !important;
    border-color: var(--tg-gold) !important;
    color: var(--tg-navy) !important;
}

    .about-section .about-cta:hover i {
        transform: translateX(4px);
    }

/* --- Leadership column --- */
.about-section .about-people {
    display: flex;
    flex-direction: column;
}

/* --- Leadership rail --- */
.about-section .about-people .container-fluid {
    padding: 0;
}

.about-section .about-people-rail {
    display: flex;
    flex-direction: column;
    gap: 14px;
    width: 100%;
    max-width: 420px;
    margin: 0 auto;
}

.about-section .about-people-rail > .official-card {
    /* auto, not `1 1 0`: the main axis is vertical here, so a 0 basis
       would set the cards' HEIGHT and stretch them to fill the rail.
       `height` is released for the same reason - .official-card carries
       `height: 100%`, which used to resolve against the col-md-4 grid
       column it sat in and now has no such parent. */
    flex: 0 0 auto;
    height: auto;
}

/* Stacked, each card is a photo beside its name rather than a portrait
   with the name underneath. Three portrait cards down a rail run to
   ~800px; the row form brings that to ~350px, which sits against the
   narrative column instead of towering over it. */
.about-section .about-people-rail > .official-card {
    flex-direction: row;
    align-items: center;
    text-align: left;
    gap: 15px;
    padding: 18px 16px !important;
}

    .about-section .about-people-rail > .official-card .official-photo {
        width: 78px !important;
        height: 78px !important;
        margin-bottom: 0;
        flex-shrink: 0;
    }

    /* Beside the photo now, so it takes the remaining width rather than
       the full card. min-width:0 lets a long designation wrap instead of
       forcing the flex row wider than the card. */
    .about-section .about-people-rail > .official-card .official-meta {
        flex: 1 1 auto;
        width: auto;
        min-width: 0;
    }

    .about-section .about-people-rail > .official-card .official-designation {
        max-width: none;
    }

/* --- Equal halves ---
   The text panel is the taller of the two and sets the row height; the
   rail used to sit centred inside it at its own content height (492 vs
   376 at a 1920 viewport), so the band read as one full-height card
   beside a short floating stack. The rail now fills the column and the
   three portraits share that height between them, which is what makes
   the two sides finish on the same line.

   Side by side only. Below 992px the columns are stacked, so there is no
   opposite half to match and the rail goes back to its content height. */
@media (min-width: 992px) {
    .about-section .about-people > .container-fluid {
        display: flex;
        flex: 1 1 auto;
        min-height: 0;
    }

    .about-section .about-people-rail {
        flex: 1 1 auto;
    }

        /* `1 1 0` here, not the `0 0 auto` these cards carry below: on a
           vertical main axis a 0 basis is exactly what makes the three
           divide the rail's height evenly instead of stacking at their
           own. */
        .about-section .about-people-rail > .official-card {
            flex: 1 1 0;
        }
}

/* One card above the next, down a single rail. This replaces the Bootstrap
   row of col-md-4 columns the cards used to sit in, so the grid gutters no
   longer fight the card padding.

   Capped and centred: the column is ~517px at 1440, which is wider than a
   stacked card wants to be. */

.about-section .official-card {
    text-align: center;
}

.about-section .about-heading span {
    padding-bottom: 10px;
}

/* Justified, as requested. I had switched this to ragged-right because
   justification in a narrow column opens "rivers" of white space between
   words; keeping it justified, the two settings below are what stop that
   from being bad:

     hyphens: auto     lets long words break, so the browser has somewhere
                       to take up slack instead of stretching word gaps
     text-align-last   leaves the final line of each paragraph ranged left
                       rather than stretched across the full measure

   The measure is also widened from 54ch: justification needs a longer line
   to distribute slack across, and a narrow justified column is exactly the
   case that produces rivers. */
.about-section .justify-text {
    text-align: justify !important;
    text-align-last: left;
    -webkit-hyphens: auto;
    -ms-hyphens: auto;
    hyphens: auto;
    font-size: 15.5px !important;
    line-height: 1.82 !important;
    max-width: 64ch;
    /* Centred, not left-pinned: the eyebrow, heading and CTA are all
       shrink-wrapped and centred in this panel, so a left-pinned measure
       put the copy on a different axis from everything around it. */
    margin-left: auto;
    margin-right: auto;
    margin-bottom: 16px !important;
}

/* --- Officials cards --- */
.about-section .official-card {
    border-radius: var(--tg-radius-lg);
    padding: 30px 18px 26px !important;
    height: 100%;
    display: flex;
    flex-direction: column;
    align-items: center;
    /* keeps all three cards' text baselines in line even when one
       designation wraps to an extra line */
    justify-content: flex-start;
    transition: transform .4s var(--tg-ease-spring), box-shadow .35s var(--tg-ease-out);
}

.about-section .official-card:hover {
    transform: translateY(-7px);
    box-shadow: 0 22px 46px rgba(0,0,0,.34);
}

/* A gold ring instead of the pale blue-50 border: on a navy field the
   original border was almost invisible, so the portraits read as
   floating cut-outs rather than framed photographs. */
.about-section .official-photo {
    width: 116px !important;
    height: 116px !important;
    object-fit: cover !important;
    object-position: top center;
    border-radius: 50% !important;
    border: 3px solid #fff !important;
    /* warm stone ring rather than gold, matching the hover state */
    box-shadow: 0 0 0 3px rgb(212 206 196 / 85%), 0 10px 24px rgba(10,38,71,.28) !important;
    margin-bottom: 16px;
    transition: transform .4s var(--tg-ease-spring), box-shadow .35s var(--tg-ease-out);
}

.about-section .official-card:hover .official-photo {
    transform: scale(1.05);
    /* warm grey ring on hover instead of the gold one */
    box-shadow: 0 0 0 4px #a09b93, 0 14px 30px rgba(10,38,71,.34) !important;
}

.about-section .official-name,
.about-section .official-card .mi {
    font-family: var(--tg-font-heading) !important;
    font-size: 16px !important;
    line-height: 1.3 !important;
    letter-spacing: -.01em;
    margin-bottom: 6px;
}

/* Fills the card, so the gold hairline below is the same width on all
   three cards. Left to shrink-wrap its own text the wrapper comes out
   175/176/177px across the three, and the rules no longer line up. */
.about-section .official-meta {
    width: 100%;
}

/* Designation is supporting information - stepped down and given a gold
   hairline above it so the name clearly owns the card. */
.about-section .official-designation {
    font-size: 12.5px !important;
    line-height: 1.5 !important;
    color: var(--tg-ink-soft) !important;
    padding-top: 9px;
    border-top: 1px solid rgba(232,169,51,.45);
    width: 100%;
    max-width: 210px;
}

/* The 5/7 split is carried by col-lg-*, so the two columns stack below
   992px on their own. Only the rhythm between the stacked blocks and the
   top alignment are left to set here. */
@media (max-width: 991px) {
    .about-section .about-text {
        margin-bottom: 30px;
    }

    /* Stacked, each column is full width, so there is no taller neighbour
       left to centre against. */
    .about-section .about-people {
        justify-content: flex-start;
    }
}

@media (max-width: 767px) {
    .about-section .justify-text {
        max-width: none;
    }

    .about-section .official-photo {
        width: 96px !important;
        height: 96px !important;
    }
}

@media (max-width: 575px) {
    /* The rail is already a stack of row cards at every width, so a phone
       only needs the photo and padding stepped down. */
    .about-section .about-people-rail {
        gap: 12px;
        max-width: none;
    }

    .about-section .about-people-rail > .official-card {
        padding: 16px !important;
    }

        .about-section .about-people-rail > .official-card .official-photo {
            width: 68px !important;
            height: 68px !important;
        }
}

.publications-section {
    background: linear-gradient(135deg, var(--tg-white) 0%, var(--tg-blue-50) 100%) !important;
    color: var(--tg-ink) !important;
    border-top: 1px solid var(--tg-border);
    border-bottom: 1px solid var(--tg-border);
    padding: 30px clamp(14px, 4vw, 40px) !important;
}

.publications-title, .mg-sec-title {
    text-align: center;
    /* Bottom margin removed. Spacing below a section header is now left to
       the section's own padding and to whatever follows it, so headers sit
       tight to their content instead of carrying their own gap. */
    margin-bottom: 0 !important;
    /* Kills the legacy 2px blue rule under the header block, which came
       from two separate stylesheets and survived removing the gold
       underline off the <h5> itself:
         css/style.css:1782   border-width: 0 0 2px 0; border-style: solid
         css/default.css:280  border-color: #1151d3
       Overridden here rather than edited there, so the vendor sheets stay
       untouched and this file remains the single source of theme truth. */
    border: 0 !important;
}

/* Section headings carry themselves typographically now. The 3px gold
   border-bottom that used to sit under them was dropped: as a full-width
   rule under every heading it read as a dated divider and competed with
   the card borders below it. Presence comes from scale, weight and
   optical tracking instead. */
.publications-heading, .mg-sec-title h5 {
    color: var(--tg-navy) !important;
    /* Scaled up: with no underline and no border the heading has to carry
       the section on presence alone, and 29px was too close to body copy
       to read as a section break. */
    font-size: clamp(25px, 2.8vw, 35px) !important;
    font-weight: 700 !important;
    /* Negative tracking keeps large type from looking loose - the detail
       that separates a premium heading from a default browser one, and it
       matters more the larger the type gets. */
    letter-spacing: -.022em !important;
    line-height: 1.14 !important;
    display: block;
    padding-bottom: 0;
    border-bottom: 0 !important;
}

/* ---------- 3b. Section header rhythm ----------
   The section headers carry no bottom margin any more, so the space under
   them is supplied by whatever follows instead. This keeps the headers
   flush as asked while stopping the heading from colliding with the copy
   or grid directly beneath it. */
.mg-sec-title + .section-lead,
.publications-title + .section-lead,
.section-lead {
    margin-top: 14px !important;
    font-size: 15.5px;
    line-height: 1.65;
}

.mg-sec-title + .museum-grid,
.mg-sec-title + .photo-mosaic,
.mg-sec-title + .nav-tabs,
.mg-sec-title + .row,
.mg-sec-title + .gallery-grid,
.publications-title + .row,
.section-lead + .museum-grid,
.section-lead + .photo-mosaic {
    margin-top: 28px;
}

.gallery {
    padding: 30px clamp(14px, 4vw, 40px) !important;
}

.nav-tabs {
    border-bottom: 2px solid var(--tg-border) !important;
    gap: 6px;
}

    .nav-tabs .nav-link {
        border: none !important;
        border-radius: var(--tg-radius-sm) var(--tg-radius-sm) 0 0 !important;
        color: var(--tg-muted) !important;
        font-weight: 600 !important;
    }

        .nav-tabs .nav-link.active {
            background: var(--tg-blue-700) !important;
            color: #fff !important;
        }

/* ---------- 11. Footer ---------- */
footer.footer {
    /* was 40px - the gap above the footer is removed so it sits directly
       against the last content section, which carries its own bottom
       padding from the section rhythm in section 14 */
    margin-top: 0;
}

footer.footer .overlay {
    background: var(--tg-navy) !important;
}

.mg-footer-widget-area {
    padding: 46px clamp(14px, 4vw, 40px) 18px !important;
}

    /* No underline. The gold border-bottom that used to sit here is gone,
       and with it the two properties that only existed to serve it:
       `display: inline-block`, which shrink-wrapped the heading so the
       rule spanned the words rather than the column, and the 10px
       padding-bottom that held the rule off the text. The bottom margin
       alone now sets the gap to the list below. */
    .mg-footer-widget-area h5 {
        color: #fff !important;
        font-size: 15px !important;
        text-transform: uppercase;
        letter-spacing: .05em;
        display: block;
        padding-bottom: 0;
        margin-bottom: 16px !important;
    }

    .mg-footer-widget-area p, .mg-footer-widget-area .textwidget p {
        color: rgba(255,255,255,.78) !important;
    }

    .mg-footer-widget-area a {
        color: rgba(255,255,255,.82) !important;
        text-decoration: none;
    }

        .mg-footer-widget-area a:hover {
            color: var(--tg-gold) !important;
        }

    .mg-footer-widget-area iframe {
        border-radius: var(--tg-radius-sm);
        width: 100%;
    }

.mg-footer-copyright {
    background: var(--tg-blue-900) !important;
    color: rgba(255,255,255,.85) !important;
    padding: 14px 0 !important;
}

    .mg-footer-copyright p {
        color: rgba(255,255,255,.85) !important;
        margin: 0 !important;
        font-size: 13.5px;
    }

.ta_upscr {
    background: var(--tg-blue-700) !important;
    color: #fff !important;
    border-radius: 50%;
}

/* ---------- 12. Responsive ---------- */
@media (max-width: 991px) {
    .header {
        justify-content: center;
        text-align: center;
    }

    .header-center h1 {
        font-size: 19px !important;
    }

    /* Matched heights. Below 992px the brand block is stacked above the
       nav rather than sharing a row with it, so it has the full width and
       can carry a larger pair than the desktop bar can. */
    .header-left img.f, .header-left img.s {
        width: 72px !important;
        height: 72px !important;
    }

    .header-left img.rising {
        height: 72px !important;
        width: auto !important;
    }

    .mg-menu-full {
        position: static;
    }

    /* Mobile drawer: dark navbar text becomes navy on the white panel,
       full-width rows with clear separators and comfortable tap targets */
    .navbar-wp .navbar-nav > li > a.nav-link,
    .navbar-wp .navbar-nav > li > a.has-submenu {
        color: var(--tg-navy) !important;
        padding: 13px 14px !important;
        font-size: 14.5px;
        justify-content: space-between;
        border-radius: 8px;
    }

        .navbar-wp .navbar-nav > li > a.nav-link::after,
        .navbar-wp .navbar-nav > li > a.has-submenu::after {
            display: none;
        }

        .navbar-wp .navbar-nav > li > a.nav-link:hover,
        .navbar-wp .navbar-nav > li > a.has-submenu:hover {
            background: var(--tg-blue-700) !important;
            color: #fff !important;
        }

    .navbar-wp .navbar-nav > li + li {
        border-top: 1px solid var(--tg-border);
    }

    .navbar-collapse {
        background: #fff;
        border-radius: var(--tg-radius);
        margin-top: 8px;
        box-shadow: var(--tg-shadow-lg);
        padding: 8px;
        max-height: 72vh;
        overflow-y: auto;
        -webkit-overflow-scrolling: touch;
    }

    /* Nested dropdowns render inline inside the drawer rather than as a
       floating panel, so they can't run off-screen on a phone */
    .navbar-wp .dropdown-menu,
    ul.dropdown-menu {
        box-shadow: none !important;
        border-top: none !important;
        background: var(--tg-blue-50) !important;
        border-radius: 8px !important;
        margin: 2px 0 6px !important;
        padding: 4px !important;
        width: 100% !important;
        min-width: 0 !important;
        max-width: 100% !important;
        position: static !important;
    }

        .navbar-wp .dropdown-menu a,
        ul.dropdown-menu li a {
            white-space: normal;
            font-size: 13.5px;
            padding: 10px 14px !important;
        }

    .mobilehomebtn {
        font-size: 18px;
    }

    .homeSwiper, .homeSwiper .slider-img {
        height: 420px !important;
    }
}

@media (max-width: 600px) {
    .homeSwiper, .homeSwiper .slider-img {
        height: 360px !important;
    }
}

@media (max-width: 767px) {
    .white-box, .container.white-box {
        padding: 22px 16px !important;
        margin: 16px auto !important;
    }

    section.section {
        padding: 18px;
    }

    .mg-footer-widget-area {
        text-align: center;
    }

    .contact-item {
        flex-direction: column;
    }

    /* Wide data tables (GridViews with fixed pixel widths, the Protected
       Monuments matrix, etc.) get horizontal scroll instead of overflowing
       the viewport or squashing illegibly. */
    table {
        display: block;
        overflow-x: auto;
        -webkit-overflow-scrolling: touch;
    }

    .info-item-body .info-item-photo {
        float: none;
        width: 100%;
        max-width: 100%;
        height: 200px;
        margin: 0 0 14px;
    }

    .museum-grid, .photo-mosaic {
        gap: 12px;
    }

    .hero-cta .btn {
        width: 100%;
        text-align: center;
    }
}

/* ---------- 11b. Detail pages (excavation/museum/conservation/heritage
   site record pages) ---------- */
.container.whitebox,
.detail-card {
    background: var(--tg-white) !important;
    border: 1px solid var(--tg-border) !important;
    border-radius: var(--tg-radius-lg) !important;
    box-shadow: var(--tg-shadow-sm) !important;
    padding: 32px clamp(16px, 4vw, 40px) !important;
    margin: 24px auto !important;
}

.detail-title,
.container.whitebox span[id$="lblname"] {
    display: block;
    font-family: var(--tg-font-heading) !important;
    color: var(--tg-navy) !important;
    font-size: 24px !important;
    padding-bottom: 12px;
    margin-bottom: 16px !important;
    border-bottom: 3px solid var(--tg-gold);
}

.image-gallery {
    background: var(--tg-blue-50) !important;
    border-radius: var(--tg-radius);
    padding: 18px !important;
}

    .image-gallery img {
        border-radius: var(--tg-radius-sm) !important;
        border: none !important;
        box-shadow: var(--tg-shadow-sm) !important;
    }

.mySwiper, .swiper.mySwiper {
    width: 100% !important;
    max-width: 720px;
    height: 420px !important;
    margin: 0 auto;
    border-radius: var(--tg-radius) !important;
    box-shadow: var(--tg-shadow-sm);
}

/* ---------- 11c. Photo gallery archive page ---------- */
.pg-wrap {
    max-width: 1400px;
    margin: 0 auto 40px;
    padding: 0 clamp(12px, 3vw, 28px);
}

.pg-filters {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin: 8px 0 26px;
}

.pg-filter {
    background: var(--tg-white);
    border: 1px solid var(--tg-border);
    border-radius: 999px;
    padding: 8px 16px;
    font-family: var(--tg-font-body);
    font-size: 13.5px;
    font-weight: 600;
    color: var(--tg-navy);
    cursor: pointer;
    transition: background-color .2s var(--tg-ease-out), border-color .2s var(--tg-ease-out), color .2s var(--tg-ease-out), transform .3s var(--tg-ease-spring);
}

    .pg-filter span {
        display: inline-block;
        margin-left: 6px;
        padding: 1px 7px;
        border-radius: 999px;
        background: var(--tg-blue-50);
        color: var(--tg-blue-700);
        font-size: 11.5px;
    }

    .pg-filter:hover {
        border-color: var(--tg-blue-500);
        transform: translateY(-2px);
    }

    .pg-filter.is-active {
        background: var(--tg-blue-700);
        border-color: var(--tg-blue-700);
        color: #fff;
    }

        .pg-filter.is-active span {
            background: rgba(255,255,255,.22);
            color: #fff;
        }

.pg-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
    gap: 18px;
}

.pg-card {
    margin: 0;
    background: var(--tg-white);
    border: 1px solid var(--tg-border);
    border-radius: var(--tg-radius);
    overflow: hidden;
    box-shadow: var(--tg-shadow-sm);
    transition: transform .35s var(--tg-ease-spring), box-shadow .3s var(--tg-ease-out);
}

    .pg-card[hidden] {
        display: none;
    }

    .pg-card:hover {
        transform: translateY(-5px);
        box-shadow: var(--tg-shadow-lg);
    }

    .pg-card > a {
        display: block;
        overflow: hidden;
        aspect-ratio: 4 / 3;
    }

    .pg-card img {
        width: 100%;
        height: 100%;
        object-fit: cover;
        display: block;
        transition: transform .5s var(--tg-ease-out);
    }

    .pg-card:hover img {
        transform: scale(1.07);
    }

    .pg-card figcaption {
        padding: 12px 14px 14px;
        display: flex;
        flex-direction: column;
        gap: 3px;
    }

.pg-card-title {
    font-family: var(--tg-font-heading);
    font-weight: 600;
    font-size: 14px;
    color: var(--tg-navy);
}

.pg-card-meta {
    font-size: 12px;
    color: var(--tg-muted);
}

.pg-empty {
    text-align: center;
    color: var(--tg-muted);
    padding: 40px 0;
}

@media (max-width: 600px) {
    .pg-grid {
        grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
        gap: 12px;
    }

    .pg-card figcaption {
        padding: 10px;
    }

    .pg-card-title {
        font-size: 13px;
    }
}

/* ---------- 12a. Organization structure chart ----------
   The chart is a vector SVG, so it stays crisp at any size. It is wide by
   nature, so on narrow screens it scrolls horizontally inside its own
   container rather than shrinking the labels past legibility. */
.org-figure {
    margin: 22px 0 0;
    background: var(--tg-white);
    border: 1px solid var(--tg-border);
    border-radius: var(--tg-radius);
    box-shadow: var(--tg-shadow-sm);
    overflow: hidden;
}

    .org-figure > img {
        display: block;
        width: 100%;
        min-width: 900px;
        height: auto;
    }

    .org-figure figcaption {
        padding: 12px 18px;
        font-size: 13px;
        color: var(--tg-muted);
        border-top: 1px solid var(--tg-border);
        background: var(--tg-blue-50);
    }

/* wrapper that actually scrolls, so the caption stays put */
.org-figure {
    display: flex;
    flex-direction: column;
}

@media (max-width: 980px) {
    .org-figure > img {
        overflow-x: auto;
    }

    .org-figure {
        overflow-x: auto;
    }

        .org-figure figcaption {
            position: sticky;
            left: 0;
        }
}

/* ---------- 12b. Accordion / detail-card component (native <details>,
   no JS dependency) used for rich reference content such as excavation
   write-ups, museum write-ups, and the historical directors archive. */
.info-list {
    display: flex;
    flex-direction: column;
    gap: 12px;
    margin: 24px 0;
}

.info-item {
    background: var(--tg-white);
    border: 1px solid var(--tg-border);
    border-radius: var(--tg-radius);
    box-shadow: var(--tg-shadow-sm);
    overflow: hidden;
}

.info-item > summary {
    list-style: none;
    cursor: pointer;
    padding: 16px 20px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    font-family: var(--tg-font-heading);
    font-weight: 600;
    color: var(--tg-navy);
    transition: background-color .2s var(--tg-ease-out);
}

    .info-item > summary::-webkit-details-marker {
        display: none;
    }

    .info-item > summary:hover {
        background: var(--tg-blue-50);
    }

    .info-item > summary::after {
        content: "\002B";
        font-size: 20px;
        color: var(--tg-blue-700);
        flex-shrink: 0;
        transition: transform .3s var(--tg-ease-spring);
    }

.info-item[open] > summary::after {
    transform: rotate(135deg);
}

.info-item[open] > summary {
    border-bottom: 1px solid var(--tg-border);
    background: var(--tg-blue-50);
}

.info-item-body {
    padding: 18px 22px 22px;
    color: var(--tg-ink-soft);
    font-size: 14.5px;
    line-height: 1.7;
}

    .info-item-body .info-item-photo {
        width: 100%;
        max-width: 420px;
        height: 220px;
        object-fit: cover;
        border-radius: var(--tg-radius-sm);
        float: right;
        margin: 0 0 12px 18px;
        box-shadow: var(--tg-shadow-sm);
    }

/* Attributed photo (licensed image + credit line) */
.info-item-figure {
    float: right;
    width: 100%;
    max-width: 420px;
    margin: 0 0 14px 20px;
}

    .info-item-figure img {
        width: 100%;
        height: 220px;
        object-fit: cover;
        border-radius: var(--tg-radius-sm);
        box-shadow: var(--tg-shadow-sm);
        display: block;
    }

    .info-item-figure figcaption {
        font-size: 11.5px;
        color: var(--tg-muted);
        line-height: 1.45;
        margin-top: 6px;
    }

        .info-item-figure figcaption a {
            color: var(--tg-blue-600);
        }

    .info-item-body p {
        margin: 0 0 12px;
    }

    .info-item-body p:last-child {
        margin-bottom: 0;
    }

    .info-item-body h4 {
        font-size: 14px !important;
        color: var(--tg-blue-700) !important;
        text-transform: uppercase;
        letter-spacing: .03em;
        margin: 16px 0 6px !important;
    }

    .info-item-body .visitor-info {
        margin-top: 14px;
        padding-top: 14px;
        border-top: 1px dashed var(--tg-border);
        font-size: 13.5px;
        color: var(--tg-muted);
    }

.info-item-sub {
    font-weight: 400;
    font-size: 12.5px;
    color: var(--tg-muted);
    display: block;
    margin-top: 2px;
}

.info-item-title {
    display: flex;
    flex-direction: column;
}

/* Sizing and rhythm for .section-lead live in the section-header block
   (3b) so the header/lead spacing is defined in one place. Only the
   colour and measure are set here. */
.section-lead {
    color: var(--tg-muted);
    max-width: 70ch;
    margin-bottom: 20px;
}

/* ---------- 12c. Slideshow motion: Ken Burns + staged text reveal ----------
   Same technique the telangana.gov.in department template uses — a slow
   scale/pan on the active slide image plus a staggered caption reveal.
   Driven purely by the .swiper-slide-active class Swiper already sets,
   so no extra library and no change to the existing Swiper config. */
.homeSwiper .swiper-slide img.slider-img {
    transform: scale(1.02);
    transition: none;
}

.homeSwiper .swiper-slide-active img.slider-img {
    animation: tgKenBurns 7s ease-out forwards;
}

@keyframes tgKenBurns {
    0% {
        transform: scale(1.02) translate3d(0, 0, 0);
    }

    100% {
        transform: scale(1.14) translate3d(-1.2%, -1%, 0);
    }
}

/* Staged caption reveal — each element rises in sequence on slide change.
   The "Government of Telangana" eyebrow that used to lead this sequence is
   gone from the markup, so the three that remain move up a step rather
   than opening on a dead .15s. */
.hero-caption > .WEL,
.hero-caption > .hero-sub,
.hero-caption > .hero-cta {
    opacity: 0;
    transform: translateY(24px);
    animation: tgRiseIn .9s var(--tg-ease-out) forwards;
}

.hero-caption > .WEL {
    animation-delay: .15s;
}

.hero-caption > .hero-sub {
    animation-delay: .3s;
}

.hero-caption > .hero-cta {
    animation-delay: .45s;
}

@keyframes tgRiseIn {
    to {
        opacity: 1;
        transform: translateY(0);
    }
}

/* motion.js toggles .replay on slide change to restart the sequence */
.hero-caption.replay > .WEL,
.hero-caption.replay > .hero-sub,
.hero-caption.replay > .hero-cta {
    animation-name: tgRiseIn;
}

.mg-sec-title h5,
.publications-heading,
.gallery-header h2 {
    position: relative;
}

/* .mg-sec-title h5 was listed here to sweep in a gold underline; that
   underline has been removed from the heading, so the sweep no longer
   has anything to animate. The About heading keeps its own rule. */
.reveal.in-view .about-heading span {
    animation: tgUnderline .8s var(--tg-ease-out) .2s both;
}

@keyframes tgUnderline {
    from {
        background-size: 0 3px;
    }

    to {
        background-size: 100% 3px;
    }
}

@media (prefers-reduced-motion: reduce) {
    .homeSwiper .swiper-slide-active img.slider-img,
    .hero-caption > .WEL,
    .hero-caption > .hero-sub,
    .hero-caption > .hero-cta {
        animation: none !important;
        opacity: 1;
        transform: none;
    }
}

/* ---------- 12d. Gallery section: scale settle + shine sweep ----------
   Replaces the previous AOS flip-left. Two distinct effects:
     on scroll  - the image settles from a slight over-scale, staggered
                  across the row
     on hover   - a diagonal gold shine sweeps across, the image pushes
                  in, the caption slides up from the base, and a gold
                  frame draws in
   Scoped to .gallery-curtain so the DB-driven gallery.aspx and
   events.aspx pages keep their own simpler treatment.

   --- Premium pass ---
   Presentation only: the Repeaters, HyperLink controls and Eval
   bindings in home.aspx are untouched, as is the Bootstrap tab JS.

   Three structural faults were fixed:

   1. .main-image-card IS the Bootstrap column (col-md-3), so putting
      radius/shadow/overflow on it decorated the gutter rather than the
      picture - cards visually touched and the "frame" sat away from the
      image edge. All card decoration moved inwards to .image-wrapper.

   2. homestyle.css pins .gallery-main-img to a fixed height:450px. In a
      ~280px column that crops every photo to a tall portrait regardless
      of its real shape, which is what made the grid look ragged. The
      wrapper now owns a uniform 4:3 box and the image covers it.

   3. The caption only appeared on hover, so on any touch device - where
      there is no hover - the artwork titles were unreachable. Captions
      are now permanent, with the hover adding emphasis rather than
      being the only way to read them. */
.gallery-curtain .main-image-card {
    position: relative;
    /* was hidden: it clipped the lifted card's shadow at the column edge */
    overflow: visible;
    box-shadow: none !important;
    border-radius: 0 !important;
}

    /* the lift moves to the wrapper, so the column no longer transforms */
    .gallery-curtain .main-image-card:hover {
        transform: none;
        box-shadow: none !important;
    }

.gallery-curtain .main-image-link {
    display: block;
    position: relative;
    text-decoration: none !important;
}

/* --- the card itself --- */
.gallery-curtain .image-wrapper {
    position: relative;
    /* Square (was 5/4, and 4/3 before that). Driven by the source images
       rather than by taste: some uploads are 1000x1600 portraits, and
       object-fit: cover crops whatever does not fit.

       At ~390px wide, a 1000x1600 image scales to 619px tall, so the
       share of it that survives the crop is:
           4/3 box (292px) -> 47%
           5/4 box (312px) -> 50%
           1/1 box (390px) -> 63%
       A square box also keeps the tiles taller, which is the direction
       this section was already going, and costs landscape sources the
       same 63% on width rather than height. A portrait box would preserve
       more still, but would then crop the landscape majority badly. */
    aspect-ratio: 1 / 1;
    overflow: hidden;
    border-radius: var(--tg-radius) !important;
    background: var(--tg-blue-50);
    box-shadow: 0 1px 2px rgba(10,38,71,.07), 0 10px 26px rgba(10,38,71,.10);
    transition: transform .45s var(--tg-ease-spring), box-shadow .45s var(--tg-ease-out);
}

.gallery-curtain .main-image-card:hover .image-wrapper,
.gallery-curtain .main-image-link:focus-visible .image-wrapper {
    transform: translateY(-6px);
    box-shadow: 0 1px 2px rgba(10,38,71,.09), 0 22px 46px rgba(10,38,71,.20);
}

.gallery-curtain .main-image-link:focus-visible {
    outline: 3px solid var(--tg-gold);
    outline-offset: 4px;
    border-radius: var(--tg-radius);
}

/* Beats the fixed 450px in homestyle.css so the wrapper's 4:3 box wins. */
.gallery-curtain .gallery-main-img {
    width: 100% !important;
    height: 100% !important;
    object-fit: cover !important;
    display: block;
    border-radius: 0 !important;
}

/*
 * NOTE: an earlier version hid each tile with `clip-path: inset(100% 0 0 0)`
 * until .in-view arrived. That made the images vanish outright whenever the
 * observer never fired — most obviously for the Events tab, whose cards start
 * inside a hidden tab pane and so have no box for IntersectionObserver to
 * measure. Nothing here may hide content now: the scroll-in effect is a
 * scale settle only, so its worst failure is a slightly zoomed image rather
 * than a blank grid. The distinctive motion lives in the hover treatment.
 */
/* A gallery tile is never allowed to be hidden, whatever motion.js puts
   on it. This is the Events-tab bug, and it is worth spelling out because
   the note above only half-fixed it:

   motion.js tags every .main-image-card with `.reveal .fx-up`, and for
   staggered items it also sets inline `animation-delay` plus
   `animation-fill-mode: backwards`. Visibility for `.fx-up` is therefore
   animation-driven, not transition-driven. The Events tiles start inside
   `#videos`, a tab pane that is `display: none` until the tab is clicked,
   so their animation cannot run - and `backwards` fill pins them at the
   keyframe's opening value, `opacity: 0`.

   The 3s safety net in motion.js does add `.in-view` to them (they
   measure 0x0, so it recognises them as unmeasurable), but that only
   helps the transition-driven path. With `.fx-up` the card stayed at
   opacity 0 and the Events tab rendered empty.

   Rather than special-case the tab, the whole reveal treatment is dropped
   for these tiles. The section keeps its motion: the image still settles
   from a slight over-scale below, and the hover treatment is untouched -
   both are transform-only and cannot hide anything. */
.gallery-curtain .main-image-card.reveal,
.gallery-curtain .main-image-card.reveal.in-view {
    opacity: 1 !important;
    transform: none !important;
    animation: none !important;
}

.gallery-curtain .main-image-card.reveal .gallery-main-img {
    transform: scale(1.12);
    transition: transform 1s var(--tg-ease-out);
}

.gallery-curtain .main-image-card.reveal.in-view .gallery-main-img {
    transform: scale(1);
}

/* diagonal shine, parked off the left edge until hover */
.gallery-curtain .image-wrapper::after {
    content: "";
    position: absolute;
    top: 0;
    left: -70%;
    width: 55%;
    height: 100%;
    z-index: 3;
    pointer-events: none;
    background: linear-gradient(100deg,
        rgba(255,255,255,0) 0%,
        rgba(255,255,255,.10) 40%,
        rgba(232,169,51,.42) 50%,
        rgba(255,255,255,.10) 60%,
        rgba(255,255,255,0) 100%);
    transform: skewX(-18deg);
    transition: left .75s var(--tg-ease-out);
}

.gallery-curtain .main-image-card:hover .image-wrapper::after {
    left: 125%;
}

.gallery-curtain .main-image-card:hover .gallery-main-img,
.gallery-curtain .main-image-link:focus-visible .gallery-main-img {
    /* eased back from 1.09 - with the crop now uniform, a smaller push
       reads as considered rather than jumpy */
    transform: scale(1.06);
}

/* ---------- 12d-i. GALLERY section shell + segmented tabs ----------
   The Photo Gallery section directly above this one is dark, so this
   section stays light - a white-cube room after the photo wall - rather
   than stacking two dark bands back to back. */
.gallery-curtain {
    background: linear-gradient(180deg, #f6f9fc 0%, #fff 45%, #f6f9fc 100%);
    padding: clamp(38px, 5vw, 62px) clamp(14px, 4vw, 40px) clamp(42px, 5vw, 64px) !important;
}

/* ---- Section header ---- */
.gal-head {
    text-align: center;
    max-width: 720px;
    margin: 0 auto;
}

.gal-eyebrow {
    display: block;
    color: var(--tg-gold-dark);
    font-family: var(--tg-font-body);
    font-size: 12.5px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .13em;
    margin-bottom: 7px;
}

.gal-head .section-lead {
    margin-left: auto;
    margin-right: auto;
    text-align: center;
}

/* Default Bootstrap tabs read as browser chrome. Rebuilt as a segmented
   control: a shrink-wrapped pill rail centred under the heading. */
.gallery-curtain .nav-tabs {
    display: flex;
    width: -moz-fit-content;
    width: fit-content;
    margin: 10px auto 32px !important;
    padding: 5px;
    gap: 4px !important;
    border: 0 !important;
    border-radius: 999px;
    background: var(--tg-blue-50);
    box-shadow: inset 0 1px 3px rgba(10,38,71,.08);
}

    .gallery-curtain .nav-tabs .nav-item {
        margin: 0 !important;
    }

    .gallery-curtain .nav-tabs .nav-link {
        border: 0 !important;
        border-radius: 999px !important;
        padding: 9px clamp(20px, 2.4vw, 30px) !important;
        /* beats the inline font-size:18px on the anchors - 18px sat too
           heavy for a two-item control */
        font-size: 15.5px !important;
        font-weight: 600 !important;
        color: var(--tg-ink-soft) !important;
        background: transparent !important;
        transition: color .3s var(--tg-ease-out), background-color .3s var(--tg-ease-out), box-shadow .3s var(--tg-ease-out);
    }

        .gallery-curtain .nav-tabs .nav-link:hover {
            color: var(--tg-navy) !important;
            background: rgba(255,255,255,.75) !important;
        }

        .gallery-curtain .nav-tabs .nav-link.active {
            background: linear-gradient(135deg, var(--tg-navy), var(--tg-blue-700)) !important;
            color: #fff !important;
            box-shadow: 0 4px 14px rgba(10,38,71,.28);
        }

        .gallery-curtain .nav-tabs .nav-link:focus-visible {
            outline: 3px solid var(--tg-gold);
            outline-offset: 2px;
        }

@media (max-width: 575px) {
    .gallery-curtain .image-wrapper {
        /* One across on a phone, so the tile is already full width - 4:3
           keeps it from running past the fold. Bounded at 575px to line up
           with the col-sm-6 breakpoint above rather than 480. */
        aspect-ratio: 4 / 3;
    }
}

/* Caption is permanent - see fault 3 above. The hover deepens the scrim
   and draws a gold rule under the title instead of revealing the text. */
.gallery-curtain .caption-overlay {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 6;
    opacity: 1;
    transform: none;
    padding: 30px clamp(12px, 1.3vw, 16px) 12px !important;
    background: linear-gradient(to top,
        rgba(4,16,31,.93) 0%,
        rgba(4,16,31,.58) 52%,
        rgba(4,16,31,0) 100%) !important;
    color: #fff !important;
    font-size: 13.5px;
    font-weight: 600;
    line-height: 1.35;
    text-align: left;
    text-shadow: 0 1px 10px rgba(0,0,0,.5);
    transition: padding-bottom .4s var(--tg-ease-out);
}

.gallery-curtain .caption-overlay::after {
    content: "";
    display: block;
    width: 26px;
    height: 2px;
    margin-top: 8px;
    background: var(--tg-gold);
    transform: scaleX(0);
    transform-origin: left center;
    transition: transform .45s var(--tg-ease-out);
}

.gallery-curtain .main-image-card:hover .caption-overlay::after,
.gallery-curtain .main-image-link:focus-visible .caption-overlay::after {
    transform: scaleX(1);
}

/* Gold frame draws in on hover. Moved from .main-image-card (the
   column) to the wrapper so it hugs the picture, not the gutter.
   ::after on the wrapper is already the shine sweep, so this takes
   ::before - both sit inside the wrapper's overflow:hidden box. */
.gallery-curtain .image-wrapper::before {
    content: "";
    position: absolute;
    inset: 0;
    border: 2px solid transparent;
    border-radius: var(--tg-radius);
    pointer-events: none;
    z-index: 5;
    transition: border-color .35s var(--tg-ease-out);
}

.gallery-curtain .main-image-card:hover .image-wrapper::before,
.gallery-curtain .main-image-link:focus-visible .image-wrapper::before {
    border-color: var(--tg-gold);
}

@media (prefers-reduced-motion: reduce) {
    .gallery-curtain .main-image-card.reveal,
    .gallery-curtain .main-image-card.reveal .gallery-main-img,
    .gallery-curtain .caption-overlay {
        clip-path: none !important;
        transform: none !important;
        opacity: 1 !important;
        transition: none !important;
    }

    .gallery-curtain .image-wrapper::after {
        display: none;
    }
}

/* ---------- 13. Motion system ----------
   Framer-Motion-equivalent scroll reveal + spring easing, built with plain
   CSS + IntersectionObserver (see js/motion.js) since this project is
   jQuery/WebForms, not React. Progressive enhancement: elements are only
   hidden once JS has actually tagged them, so nothing depends on the
   script to be readable — and prefers-reduced-motion skips it entirely. */
.reveal {
    opacity: 0;
    transform: translateY(28px);
    transition: opacity .7s var(--tg-ease-out), transform .7s var(--tg-ease-out);
    will-change: opacity, transform;
}

.reveal.in-view {
    opacity: 1;
    transform: none;
}

/* --- Text variant ---
   A shorter, shallower rise than the component reveal. Body copy entering
   on the same 28px travel as a whole card reads as heavy and draws the eye
   away from the content itself, so text moves less and settles faster. */
.reveal-soft {
    transform: translateY(16px);
    transition-duration: .55s;
}

    .reveal-soft.in-view {
        transform: none;
    }

/* --- Media variant ---
   Images settle from a slight over-scale as well as rising, which reads as
   the picture coming into focus rather than sliding in. */
.reveal-media {
    transform: translateY(14px) scale(1.03);
    transition-duration: .75s;
}

    .reveal-media.in-view {
        transform: none;
    }

@media (prefers-reduced-motion: reduce) {
    .reveal,
    .reveal-soft,
    .reveal-media {
        opacity: 1 !important;
        transform: none !important;
        transition: none !important;
    }
}

/* ---------- 14. Section rhythm ----------
   Placed last so it settles the vertical spacing for every full-width
   band regardless of what each section set for itself earlier in this
   file (.gallery-curtain in particular sets its padding !important).

   Horizontal padding is unified too, with one deliberate exception:
   .hps-banner keeps its flat 40px sides rather than the responsive
   clamp, because that was an explicit design decision.

   Note this restores bottom spacing on .museums-section, which had been
   zeroed. The zeroing was a fix for a 40px double-gap (section padding
   stacking on .container-fluid padding); that stacking is neutralised
   below instead, so the gap it was avoiding no longer occurs. */
.quicklinks-section,
.about-section,
.museums-section,
.photo-highlights,
.gallery-curtain,
.publications-section,
.hps-banner {
    padding-top: var(--tg-section-y) !important;
    padding-bottom: var(--tg-section-y) !important;
}

.quicklinks-section,
.about-section,
.museums-section,
.photo-highlights,
.gallery-curtain,
.publications-section {
    padding-left: var(--tg-section-x) !important;
    padding-right: var(--tg-section-x) !important;
}

/* The generic .container-fluid rule adds 2px/8px of its own, which is
   what stacked onto the section padding and broke the rhythm. Zeroed
   inside these bands so the section alone owns the spacing. */
.quicklinks-section > .container-fluid,
.about-section > .container-fluid,
.museums-section > .container-fluid,
.photo-highlights > .container-fluid,
.gallery-curtain > .container-fluid,
.publications-section > .container-fluid {
    padding-top: 0;
    padding-bottom: 0;
}

/* ---------- 15. Form controls ----------
   The admin pages (19 of them, on usermaster) are almost entirely data
   entry, but only input[type=submit|button] had ever been themed - text
   fields, selects, textareas and file pickers were still browser default
   against a modern page. Purely presentational: ASP.NET renders TextBox
   as <input>, DropDownList as <select>, FileUpload as <input type=file>
   and validators as <span>, so styling the rendered elements leaves every
   server control, binding and postback untouched. */
input[type="text"],
input[type="email"],
input[type="password"],
input[type="number"],
input[type="tel"],
input[type="url"],
input[type="search"],
input[type="date"],
input[type="time"],
input[type="datetime-local"],
textarea,
select,
.form-control {
    width: 100%;
    max-width: 100%;
    padding: 10px 13px;
    font-family: var(--tg-font-body);
    font-size: 14.5px;
    line-height: 1.45;
    color: var(--tg-ink);
    background-color: var(--tg-white);
    border: 1px solid var(--tg-border);
    border-radius: var(--tg-radius-sm);
    box-shadow: inset 0 1px 2px rgba(10, 38, 71, .04);
    transition: border-color .2s var(--tg-ease-out), box-shadow .2s var(--tg-ease-out), background-color .2s var(--tg-ease-out);
}

    /* A visible focus ring is the single most important accessibility
       affordance on a form - keyboard users have no other cue. */
    input[type="text"]:focus,
    input[type="email"]:focus,
    input[type="password"]:focus,
    input[type="number"]:focus,
    input[type="tel"]:focus,
    input[type="url"]:focus,
    input[type="search"]:focus,
    input[type="date"]:focus,
    input[type="time"]:focus,
    input[type="datetime-local"]:focus,
    textarea:focus,
    select:focus,
    .form-control:focus {
        outline: none;
        border-color: var(--tg-blue-600);
        background-color: var(--tg-white);
        box-shadow: 0 0 0 3px rgba(47, 128, 216, .18);
    }

    input[type="text"]:disabled,
    input[type="text"][readonly],
    textarea:disabled,
    textarea[readonly],
    select:disabled,
    .form-control:disabled,
    .form-control[readonly] {
        background-color: var(--tg-blue-50);
        color: var(--tg-muted);
        cursor: not-allowed;
    }

    ::placeholder {
        color: #93a3b3;
        opacity: 1;
    }

textarea, textarea.form-control {
    min-height: 110px;
    resize: vertical;
}

/* Native arrow removed for a consistent control across browsers */
select, select.form-control {
    appearance: none;
    -webkit-appearance: none;
    -moz-appearance: none;
    padding-right: 38px;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='%23566b7d' d='M1.4 0 6 4.6 10.6 0 12 1.4 6 7.4 0 1.4z'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 13px center;
    background-size: 11px;
}

/* File pickers: the button half is styled, the field keeps its own box */
input[type="file"] {
    width: 100%;
    padding: 8px 10px;
    font-family: var(--tg-font-body);
    font-size: 14px;
    color: var(--tg-ink-soft);
    background: var(--tg-blue-50);
    border: 1px dashed var(--tg-border);
    border-radius: var(--tg-radius-sm);
}

    input[type="file"]::file-selector-button {
        margin-right: 12px;
        padding: 8px 16px;
        font-family: var(--tg-font-body);
        font-weight: 600;
        font-size: 13.5px;
        color: #fff;
        background: var(--tg-blue-700);
        border: none;
        border-radius: var(--tg-radius-sm);
        cursor: pointer;
        transition: background-color .2s var(--tg-ease-out);
    }

    input[type="file"]::file-selector-button:hover {
        background: var(--tg-blue-800);
    }

    input[type="file"]:focus-visible {
        outline: 3px solid var(--tg-gold);
        outline-offset: 2px;
    }

input[type="checkbox"], input[type="radio"] {
    width: 16px;
    height: 16px;
    accent-color: var(--tg-blue-700);
    vertical-align: middle;
    margin-right: 6px;
    cursor: pointer;
}

/* Form labels. .lbl is the class the existing admin pages already use. */
label, .lbl {
    display: inline-block;
    margin-bottom: 6px;
    font-family: var(--tg-font-body);
    font-weight: 600;
    font-size: 13.5px;
    color: var(--tg-ink) !important;
    letter-spacing: .005em;
}

/* ASP.NET validators render inline style="color:Red" on a <span>, which
   a class cannot reach - matched on the inline style itself, the same
   technique section 6 uses for GridView row colours. Red text alone is
   also a colour-only signal, so it gets an icon and a tinted chip. */
span[style*="color:Red" i],
span[style*="color: Red" i],
.validation-error {
    display: inline-block;
    margin-top: 5px;
    padding: 4px 10px 4px 8px;
    font-size: 12.5px !important;
    font-weight: 600;
    color: #b42318 !important;
    background: #fef3f2;
    border-left: 3px solid #d92d20;
    border-radius: 4px;
}

    span[style*="color:Red" i]::before,
    span[style*="color: Red" i]::before,
    .validation-error::before {
        content: "\26A0";
        margin-right: 6px;
    }

/* Vertical rhythm for stacked fields in the admin forms */
.form-group, .form-row > [class*="col-"] {
    margin-bottom: 16px;
}

@media (max-width: 767px) {
    /* 16px is the threshold below which iOS Safari zooms the viewport on
       focus, which throws the layout off on every tap into a field. */
    input[type="text"],
    input[type="email"],
    input[type="password"],
    input[type="number"],
    input[type="tel"],
    input[type="url"],
    input[type="search"],
    input[type="date"],
    textarea,
    select,
    .form-control {
        font-size: 16px;
    }
}

/* ---------- 16. Header wrap, toggler focus, responsive hardening ---------- */

/* --- Department name stays on one line ---
   "Department of Heritage Telangana" wrapped to two lines as soon as the
   available width tightened, which happens on browser zoom: zooming in
   shrinks the viewport in CSS pixels, so the brand block narrows while the
   type size holds. Kept to a single line from tablet up; phones are allowed
   to wrap, because there the line genuinely cannot fit. */
.header-center h1 {
    white-space: nowrap;
}

@media (max-width: 575px) {
    .header-center h1 {
        white-space: normal;
    }
}

@media (min-width: 1200px) {
    /* a little more of the row for the wordmark now that the marks are
       larger; the nav keeps its priority-plus overflow, so what it loses
       here folds into the "More" drawer rather than breaking */
    .brandbar .header {
        max-width: 46% !important;
    }
}

/* --- Mobile menu toggler ---
   After a click the button kept a filled block behind it: the focus state
   persists after a mouse press, and both the legacy sheets and Bootstrap's
   own rules paint a background/ring on :focus. Cleared for pointer input
   and given a proper ring for keyboard users only, so the affordance is
   kept where it is actually needed. */
.navbar-toggler,
.navbar-toggler:hover,
.navbar-toggler:focus,
.navbar-toggler:active,
.navbar-toggler:focus:not(:focus-visible) {
    background-color: transparent !important;
    background-image: none !important;
    border-color: transparent !important;
    box-shadow: none !important;
    outline: none !important;
    -webkit-tap-highlight-color: transparent;
}

    /* keyboard users still get a clear target */
    .navbar-toggler:focus-visible {
        outline: 3px solid var(--tg-gold) !important;
        outline-offset: 3px;
        border-radius: 6px;
    }

/* --- Responsive hardening --- */

/* Nothing may push the page sideways. A single overflowing element causes
   the whole document to scroll horizontally on a phone, which is one of the
   most common and most damaging mobile faults. */
html, body {
    max-width: 100%;
    overflow-x: hidden;
}

img, video, iframe, embed, object {
    max-width: 100%;
}

img {
    height: auto;
}

/* Wide data tables scroll inside their own box instead of stretching the
   page. .table-responsive is Bootstrap's own wrapper; the others are the
   containers the GridViews actually render into on this site. */
.table-responsive,
.white-box .table-wrap,
.container.whitebox .table-wrap {
    width: 100%;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
}

/* Long unbroken strings - email addresses, URLs, reference numbers - are a
   frequent source of overflow in government content. */
p, li, td, th, dd, dt, .card-body, .museum-card-desc, .official-designation {
    overflow-wrap: break-word;
    word-wrap: break-word;
}

/* Embedded maps and video keep their aspect instead of a fixed pixel height */
.mg-footer-widget-area iframe,
.white-box iframe {
    width: 100%;
    max-width: 100%;
    border: 0;
}

@media (max-width: 767px) {
    .mg-footer-widget-area iframe {
        height: 200px;
    }

    /* Touch targets: 44px is the accessibility floor for a tap area. */
    .navbar-nav > li > a.nav-link,
    .navbar-nav > li > a.has-submenu,
    .mobilehomebtn {
        min-height: 44px;
        display: flex;
        align-items: center;
    }
}

/* ---------- 17. Museums Division carousel ----------
   The grid became a single continuous horizontal strip. Swiper owns the
   track; these rules size the slides and keep the card visuals intact. */
.museum-swiper {
    /* Swiper clips its track, which would cut the cards' drop shadows off
       at the top and bottom - padding gives the shadow somewhere to live. */
    padding: 6px 2px 10px;
    overflow: hidden;
}

    /* NOTE: this block previously forced `transition-timing-function:
       linear !important`, left over from when the rail was a continuous
       ticker. With paged autoplay that !important fought Swiper's own
       per-transition timing: the wrapper was left with a CSSTransition
       permanently in "running" state, and a running transition's value
       beats the inline transform Swiper writes. The wrapper therefore
       never actually moved, transitionend never fired, and Swiper stayed
       stuck with animating=true - which silently blocks every later
       slideNext(). That is why the rail neither scrolled nor autoplayed.
       Swiper now owns its own timing. */
    .museum-swiper .swiper-wrapper {
        align-items: stretch;
    }

    /* No fixed width here: slidesPerView (4 on desktop, stepping down by
       breakpoint) computes the slide width, and a hard px value would
       override it and break the 4-up layout. */
    .museum-swiper .swiper-slide {
        height: auto;
        display: flex;
    }

        .museum-swiper .swiper-slide > .museum-card {
            width: 100%;
        }

/* motion.js tags .museum-card as a reveal target, but slides sitting outside
   the visible track may never trip the IntersectionObserver, which would
   leave cards stuck at opacity 0. Inside the carousel the reveal is waived -
   the same reasoning already applied to the gallery's hidden tab panes. */
.museum-swiper .museum-card.reveal {
    opacity: 1 !important;
    transform: none !important;
}



/* ---------- 18. Header bottom space ----------
   Closes the gap under the brand block so the navigation sits directly
   beneath "Youth Advancement, Tourism and Culture Department". */
.header {
    padding-bottom: 0 !important;
    margin-bottom: 0 !important;
}

    .header-center,
    .header-center h4 {
        margin-bottom: 0 !important;
        padding-bottom: 0 !important;
    }

/* the legacy markup leaves an empty row between the brand block and the
   nav on the stacked layout */
.brandbar + .clearfix,
header.mg-headwidget .header + .clearfix {
    display: none !important;
}

/* ---------- 19. Museums Division - editorial card carousel ----------
   Rebuilt on the pattern used by the Events & Activities block on
   tgagros.telangana.gov.in: eyebrow over a centred heading with the track
   controls ranged right, a horizontal card rail, a scroll-progress bar and
   a centred "view all" action.

   Each card carries its own --accent, rotated through the supporting
   palette already defined in section 1 (teal / rose / slate / gold /
   terracotta), and that one variable drives the category chip, the meta
   line and the top rule - so a card is recoloured from one place. */
.mus-head-row {
    position: relative;
    display: flex;
    align-items: flex-end;
    justify-content: center;
    gap: 16px;
}

.mus-eyebrow {
    display: block;
    text-align: center;
    color: var(--tg-gold);
    font-family: var(--tg-font-body);
    font-size: 12.5px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .13em;
    margin-bottom: 7px;
}

.mus-controls {
    position: absolute;
    right: 0;
    bottom: 2px;
    display: flex;
    gap: 8px;
}

.mus-nav {
    width: 40px;
    height: 40px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    border: 1px solid var(--tg-border);
    background: var(--tg-white);
    color: var(--tg-navy);
    font-size: 15px;
    cursor: pointer;
    box-shadow: var(--tg-shadow-sm);
    transition: background-color .25s var(--tg-ease-out), color .25s var(--tg-ease-out), transform .25s var(--tg-ease-out);
}

    .mus-nav:hover {
        background: var(--tg-navy);
        color: #fff;
        transform: translateY(-2px);
    }

    .mus-nav:focus-visible {
        outline: 3px solid var(--tg-gold);
        outline-offset: 2px;
    }

/* --- card --- */
.mus-card {
    position: relative;
    display: flex;
    flex-direction: column;
    width: 100%;
    height: 100%;
    background: var(--tg-white);
    border: 1px solid var(--tg-border);
    border-radius: var(--tg-radius);
    overflow: hidden;
    text-decoration: none !important;
    box-shadow: var(--tg-shadow-sm);
    transition: transform .4s var(--tg-ease-spring), box-shadow .35s var(--tg-ease-out);
}

    /* accent rule along the top edge - the card's colour identity */
    .mus-card::before {
        content: "";
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        height: 3px;
        background: var(--accent, var(--tg-gold));
        z-index: 3;
    }

    .mus-card:hover,
    .mus-card:focus-visible {
        transform: translateY(-6px);
        box-shadow: var(--tg-shadow-lg);
    }

    .mus-card:focus-visible {
        outline: 3px solid var(--tg-gold);
        outline-offset: 3px;
    }

.mus-img {
    position: relative;
    display: block;
    aspect-ratio: 16 / 10;
    overflow: hidden;
    background: var(--tg-blue-50);
}

    .mus-img img {
        width: 100%;
        height: 100%;
        object-fit: cover;
        display: block;
        transition: transform .6s var(--tg-ease-out);
    }

    .mus-card:hover .mus-img img {
        transform: scale(1.06);
    }

/* the one museum with no photograph yet keeps a tinted icon panel */
.mus-img-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    background: color-mix(in srgb, var(--accent, var(--tg-gold)) 14%, #fff);
}

    .mus-img-icon i {
        font-size: 40px;
        color: var(--accent, var(--tg-gold));
        opacity: .85;
    }

.mus-tag {
    position: absolute;
    top: 11px;
    left: 11px;
    z-index: 2;
    padding: 4px 11px;
    border-radius: 999px;
    background: var(--accent, var(--tg-gold));
    color: #fff;
    font-size: 10.5px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .07em;
    box-shadow: 0 2px 8px rgba(10,38,71,.28);
}

.mus-body {
    display: flex;
    flex-direction: column;
    gap: 5px;
    padding: 15px 16px 18px;
}

.mus-meta {
    color: var(--accent, var(--tg-gold));
    font-size: 11.5px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .07em;
}

.mus-name {
    font-family: var(--tg-font-heading);
    font-size: 16.5px;
    font-weight: 700;
    line-height: 1.25;
    letter-spacing: -.012em;
    color: var(--tg-navy);
}

.mus-desc {
    font-size: 13px;
    line-height: 1.55;
    color: var(--tg-muted);
}

/* --- scroll progress --- */
.mus-progress-track {
    height: 3px;
    margin: 24px auto 0;
    max-width: 1100px;
    background: var(--tg-border);
    border-radius: 999px;
    overflow: hidden;
}

.mus-progress-fill {
    width: 0;
    height: 100%;
    background: linear-gradient(90deg, var(--tg-gold), var(--tg-blue-500));
    border-radius: 999px;
    transition: width .25s var(--tg-ease-out);
}

/* Anything inside the rail must never start hidden: slides parked outside
   the visible track may never trip the IntersectionObserver in motion.js,
   which would strand them at opacity 0. */
.museum-swiper .reveal,
.museum-swiper .reveal-media {
    opacity: 1 !important;
    transform: none !important;
}

.museum-swiper .swiper-slide > .mus-card {
    width: 100%;
}

@media (max-width: 767px) {
    .mus-controls {
        position: static;
        justify-content: center;
        margin-top: 14px;
    }

    .mus-head-row {
        flex-direction: column;
        align-items: center;
    }
}

/* ---------- 20. Header height ----------
   Trimmed the brand row: the marks were driving the height, so they set
   the floor and the padding around them comes down to meet it. */
.header {
    padding-top: 4px !important;
    padding-bottom: 0 !important;
}

@media (min-width: 1200px) {
    .brandbar .header {
        padding-top: 4px !important;
        padding-bottom: 2px !important;
    }

    /* The two crests are matched on height, and only on height. tslogo.png
       is square (100x100); the Rising mark now sourced from
       telanganarising2047.org is 300x289, near-square but not exactly, so
       it keeps `width: auto` and lands at 57x55 against the emblem's
       55x55. Forcing equal widths would stretch it.

       (The mark was 205x246 when it was served locally - noticeably
       portrait. The remote one is proportionally wider, which comes out
       of the wordmark column; see the note on .brandbar .header.)

       This block is the one that decides the marks' size on a desktop: it
       is the last of the three that match at >=1200px, so the base rule
       and the >=992px rule are both overridden here. */
    .brandbar .header .header-left img.rising,
    .brandbar .header .header-left img.f,
    .brandbar .header .header-left img.s {
        height: 55px !important;
    }

    .brandbar .header .header-left img.rising {
        width: auto !important;
    }

    .brandbar .header .header-left img.f,
    .brandbar .header .header-left img.s {
        width: 55px !important;
    }
}

/* ---------- 21. Museums rail: neutralise the legacy .swiper rules ----------
   homestyle.css styles `.swiper` globally for the hero slideshow:

       .swiper { height: 500px; border-radius: 10px; margin: 2px auto;
                 box-shadow: 0 6px 20px rgba(0,0,0,.1); }
       .swiper-slide { text-align: center; }
       .swiper-slide img { width: 100%; height: 100%; object-fit: cover; }

   Those are unscoped, so they also landed on the museums rail: it was being
   forced to 500px tall, which stretched every card to ~484px and left the
   4-up row looking broken even though Swiper had initialised and autoplay
   was running. Reset here rather than in homestyle.css, so the hero keeps
   the sizing it depends on. */
.swiper.museum-swiper {
    height: auto !important;
    margin: 0 !important;
    border-radius: 0 !important;
    box-shadow: none !important;
}

    .museum-swiper .swiper-slide {
        text-align: left;
        height: auto !important;
    }

    /* the card sets its own 16:10 media box; the blanket rule above would
       otherwise stretch the photo to the full slide height */
    .museum-swiper .swiper-slide img {
        width: 100%;
        height: 100%;
        object-fit: cover;
    }

/* ---------- 22. Museums rail at 5-up ----------
   Five across leaves each card ~200px instead of ~264px, so the type and
   padding come down to match. Without this the name wraps to three or four
   lines and the card stops being scannable. */
@media (min-width: 1200px) {
    .mus-body {
        padding: 13px 13px 15px;
        gap: 4px;
    }

    .mus-name {
        font-size: 14.5px;
        line-height: 1.28;
    }

    .mus-desc {
        font-size: 12px;
        line-height: 1.5;
    }

    .mus-meta {
        font-size: 10.5px;
    }

    .mus-tag {
        top: 9px;
        left: 9px;
        padding: 3px 9px;
        font-size: 9.5px;
    }
}

/* Descriptions run to different lengths, so they are clamped to keep the
   row of cards visually even. Cards still stretch to a common height. */
.mus-desc {
    display: -webkit-box;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

.mus-name {
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

/* The whole card is the link target. Swiper sets `cursor: grab` on the
   wrapper, which would otherwise hide the fact that a card is clickable. */
.mus-card {
    cursor: pointer;
}

    .museum-swiper .swiper-slide .mus-card,
    .museum-swiper .swiper-slide .mus-card * {
        /* a drag must not swallow the click on the anchor */
        -webkit-user-select: none;
        user-select: none;
    }

/* ---------- 23. Museums rail: no-JS / pre-init fallback ----------
   Swiper's own CSS sets `.swiper-slide { width: 100% }`, and ONLY the
   JavaScript replaces that with a computed per-slide width. So if the init
   does not run - script blocked, a JS error earlier in the page, or simply
   before init completes - the rail renders exactly one museum per view.

   Swiper adds `.swiper-initialized` to the container once it has taken
   over, so these rules target the un-initialised state only: five across
   without any JavaScript, and automatically stood down the moment Swiper
   starts writing its own inline widths. */
.museum-swiper:not(.swiper-initialized) .swiper-wrapper {
    display: flex;
    gap: 18px;
}

.museum-swiper:not(.swiper-initialized) .swiper-slide {
    flex: 0 0 auto;
    width: calc((100% - (4 * 18px)) / 5);
}

@media (max-width: 1199.98px) {
    .museum-swiper:not(.swiper-initialized) .swiper-slide {
        width: calc((100% - (3 * 18px)) / 4);
    }
}

@media (max-width: 991.98px) {
    .museum-swiper:not(.swiper-initialized) .swiper-slide {
        width: calc((100% - (2 * 18px)) / 3);
    }
}

@media (max-width: 767.98px) {
    .museum-swiper:not(.swiper-initialized) .swiper-slide {
        width: calc((100% - 16px) / 2);
    }
}

@media (max-width: 575.98px) {
    .museum-swiper:not(.swiper-initialized) .swiper-slide {
        width: 84%;
    }
}

/* Un-initialised the rail cannot scroll, so let it scroll natively rather
   than clipping the museums that overflow. */
.museum-swiper:not(.swiper-initialized) {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: thin;
}

/* ---------- 24. Museums Division row (replaces the Swiper rail) ----------
   Autoplay and slide animation are gone, so the carousel is gone with them:
   a library that only earned its keep by auto-advancing was pure risk once
   that requirement was dropped. This is a plain scroll-snapping CSS row -
   it cannot fail to initialise, needs no JavaScript to lay out, and shows
   four museums at a time at desktop width.

   Supersedes sections 17, 19 (rail parts), 21, 22 and 23, whose
   .museum-swiper selectors no longer match anything. */
.museum-row {
    display: grid;
    grid-auto-flow: column;
    /* four across, accounting for the three gaps between them */
    grid-auto-columns: calc((100% - (3 * 18px)) / 4);
    gap: 18px;
    overflow-x: auto;
    overscroll-behavior-x: contain;
    scroll-snap-type: x mandatory;
    -webkit-overflow-scrolling: touch;
    /* room for the cards' lift/shadow, which would otherwise be clipped */
    padding: 6px 2px 14px;
    margin-top: 26px;
    scrollbar-width: thin;
    scrollbar-color: var(--tg-border) transparent;
}

    .museum-row > .mus-card {
        scroll-snap-align: start;
        height: 100%;
    }

    /* A slim scrollbar reads as an affordance; the default chrome one is
       heavy enough to unbalance the row. */
    .museum-row::-webkit-scrollbar {
        height: 6px;
    }

    .museum-row::-webkit-scrollbar-track {
        background: transparent;
    }

    .museum-row::-webkit-scrollbar-thumb {
        background: var(--tg-border);
        border-radius: 999px;
    }

    .museum-row:hover::-webkit-scrollbar-thumb {
        background: #c7d3e0;
    }

/* The ladder moves down a step with the base: 4 across at >=1200, then 3.
   The old 991.98 block set 3 as well, so it is folded into this one rather
   than left as a duplicate - 3 across now carries from 1199.98 down to the
   767.98 block below, which is exactly what it did before. */
@media (max-width: 1199.98px) {
    .museum-row {
        grid-auto-columns: calc((100% - (2 * 18px)) / 3);
    }
}

@media (max-width: 767.98px) {
    .museum-row {
        grid-auto-columns: calc((100% - 16px) / 2);
        gap: 16px;
    }
}

@media (max-width: 575.98px) {
    .museum-row {
        grid-auto-columns: 82%;
        gap: 14px;
    }
}

/* Cards in the row must never start hidden: motion.js tags images inside
   <main>, and a card scrolled out of view may never trip the observer. */
.museum-row .reveal,
.museum-row .reveal-media,
.museum-row img {
    opacity: 1 !important;
    transform: none !important;
}

/* disabled state for the row's arrows (start / end of scroll) */
.mus-nav:disabled {
    opacity: .35;
    cursor: default;
    box-shadow: none;
}

    .mus-nav:disabled:hover {
        background: var(--tg-white);
        color: var(--tg-navy);
        transform: none;
    }

/* ---------- 25. Footer ----------
   Rebuilt as three equal columns. The old markup had real defects, not just
   dated styling:
     - a malformed  target="_blank&quot;"  attribute on the About link
     - <iframe width="600" height="230">, which overflowed the column on
       any screen narrower than 600px
     - a hardcoded "2025" copyright, already a year out of date
     - a fourth widget column permanently display:none, leaving a hole in a
       4-across grid
     - inline background-color:darkgoldenrod fighting the theme
     - link lists marked up as <p>, and e-mail/phone as plain text
   The rebuild uses <nav>/<ul>/<address>, makes the address actionable
   (mailto:/tel:), and drops the dead column. */
.footer-grid {
    display: grid;
    /* four equal columns: About / Quick Links / Important Links / Contact */
    grid-template-columns: repeat(4, 1fr);
    gap: clamp(16px, 2.2vw, 36px);
    max-width: 1240px;
    margin: 0 auto;
}

.footer-col h5 {
    /* the shared .mg-footer-widget-area h5 rule supplies colour and size;
       only rhythm is set here */
    margin-bottom: 18px !important;
}

.footer-lede {
    max-width: 34ch;
    font-size: 13.5px;
    line-height: 1.7;
}

/* --- link list --- */
.footer-links,
.footer-contact,
.footer-social {
    list-style: none;
    margin: 0;
    padding: 0;
}

.footer-links li {
    margin-bottom: 9px;
}

.footer-links a {
    position: relative;
    display: inline-block;
    font-size: 13.5px;
    padding-left: 15px;
    transition: color .25s var(--tg-ease-out), transform .25s var(--tg-ease-out);
}

    /* chevron marks these as navigation without needing an icon font */
    .footer-links a::before {
        content: "";
        position: absolute;
        left: 0;
        top: 50%;
        width: 5px;
        height: 5px;
        margin-top: -3px;
        border-right: 2px solid var(--tg-gold);
        border-bottom: 2px solid var(--tg-gold);
        transform: rotate(-45deg);
        opacity: .75;
        transition: opacity .25s var(--tg-ease-out);
    }

    .footer-links a:hover {
        transform: translateX(3px);
    }

        .footer-links a:hover::before {
            opacity: 1;
        }

/* --- address + contact --- */
.footer-address {
    font-style: normal;
    font-size: 13.5px;
    line-height: 1.7;
    color: rgba(255,255,255,.78);
    margin-bottom: 14px;
}

.footer-org {
    display: block;
    font-weight: 600;
    color: #fff;
    margin-bottom: 4px;
}

.footer-contact li {
    display: flex;
    align-items: flex-start;
    gap: 9px;
    margin-bottom: 9px;
    font-size: 13.5px;
    /* long e-mail addresses must not push the column wide */
    overflow-wrap: anywhere;
}

.footer-contact i {
    color: var(--tg-gold);
    margin-top: 3px;
    flex: 0 0 auto;
}

/* --- social --- */
.footer-social {
    display: flex;
    gap: 10px;
    margin-top: 18px;
}

.footer-social a {
    width: 38px;
    height: 38px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    background: rgba(255,255,255,.08);
    border: 1px solid rgba(255,255,255,.16);
    color: #fff !important;
    font-size: 15px;
    transition: background-color .25s var(--tg-ease-out), transform .25s var(--tg-ease-out), border-color .25s var(--tg-ease-out);
}

    .footer-social a:hover {
        background: var(--tg-gold);
        border-color: var(--tg-gold);
        color: var(--tg-navy) !important;
        transform: translateY(-3px);
    }

    .footer-social a:focus-visible {
        outline: 3px solid var(--tg-gold);
        outline-offset: 3px;
    }

/* --- map ---
   Replaces the old fixed width="600" height="230" attributes: the frame
   holds a 16:9 box and the iframe fills it, so it can never overflow. */
.footer-map-frame {
    position: relative;
    width: 100%;
    aspect-ratio: 16 / 9;
    margin-top: 16px;
    border-radius: var(--tg-radius-sm);
    overflow: hidden;
    border: 1px solid rgba(255,255,255,.16);
}

    .footer-map-frame iframe {
        position: absolute;
        inset: 0;
        width: 100% !important;
        height: 100% !important;
        border: 0;
        display: block;
    }

/* --- copyright bar --- */
.footer-copy-row {
    max-width: 1240px;
    margin: 0 auto;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 6px 18px;
}

.footer-credit {
    font-size: 12.5px !important;
    color: rgba(255,255,255,.6) !important;
}

/* The four columns stay on ONE row for as long as they can be read. Below
   768px four columns would be ~90px wide each, which is narrower than the
   link text, so that is the point they stack rather than any earlier. */
@media (max-width: 767.98px) {
    .footer-grid {
        grid-template-columns: repeat(2, 1fr);
    }

    /* the map makes this column the tallest, so it spans the full width
       rather than leaving a ragged gap beside a short link list */
    .footer-reach {
        grid-column: 1 / -1;
    }
}

@media (max-width: 600px) {
    .footer-grid {
        grid-template-columns: 1fr;
    }

    .footer-copy-row {
        justify-content: center;
        text-align: center;
    }
}

/* ---------- 26. Menu toggler: colour pinned in every state ----------
   The toggler was reported changing colour after being clicked. Measured in
   isolation the button itself does not change - background, border, shadow
   and outline are identical before and after, focused or not - so the cause
   is a rule in one of the sheets not present in that test, most likely keyed
   to [aria-expanded="true"], :active, or Bootstrap's own .collapsed class
   that gets toggled on click.

   Rather than chase which one, the state is pinned: the bars keep one colour
   and the button keeps no background in every combination of hover, focus,
   active, expanded and collapsed. --fa-style-family is irrelevant here; this
   is purely the three <span class="burger-line"> bars. */
.navbar-toggler .burger-line,
.navbar-toggler:hover .burger-line,
.navbar-toggler:focus .burger-line,
.navbar-toggler:active .burger-line,
.navbar-toggler.collapsed .burger-line,
.navbar-toggler[aria-expanded="true"] .burger-line,
.navbar-toggler[aria-expanded="false"] .burger-line {
    background-color: var(--tg-navy) !important;
    /* the legacy sheet animates these into an X on expand - that transform
       is intentional and is left alone; only the colour is pinned */
    opacity: 1;
}

    /* the middle bar is deliberately hidden while the X is showing */
    .navbar-toggler[aria-expanded="true"] .burger-line:nth-child(2) {
        opacity: 0 !important;
    }

.navbar-toggler,
.navbar-toggler:hover,
.navbar-toggler:focus,
.navbar-toggler:active,
.navbar-toggler.collapsed,
.navbar-toggler[aria-expanded="true"],
.navbar-toggler[aria-expanded="false"],
.navbar-toggler:focus:not(:focus-visible) {
    background: transparent !important;
    background-color: transparent !important;
    background-image: none !important;
    border-color: transparent !important;
    box-shadow: none !important;
    -webkit-tap-highlight-color: transparent;
}

    /* keyboard users keep a visible target */
    .navbar-toggler:focus-visible {
        outline: 3px solid var(--tg-gold) !important;
        outline-offset: 3px;
        border-radius: 6px;
    }

.navbar-toggler .burger {
    background: none !important;
}

/* ---------- 27. animate.css-equivalent scroll effects ----------
   Matches the motion signature used on skltghu.ac.in, which runs WOW.js +
   animate.css: fadeInUp on most blocks, fadeInLeft/fadeInRight on paired
   side-by-side content, fadeIn on imagery - all 1s, ease, fill both.

   Reproduced on the existing IntersectionObserver in js/motion.js rather
   than by adding WOW.js and animate.css. That avoids ~70KB and a third
   animation system on the page, and keeps the two behaviours this project
   already relies on: prefers-reduced-motion support, and the 3s safety net
   that force-reveals anything the observer misses so content can never be
   stranded invisible.

   animate.css translates by 100% of the element's own box. That is fine on
   a marketing page but on long government content it makes tall blocks
   travel a very long way; these use a fixed 40px, which reads the same at
   normal reading speed without the lurch. */
@keyframes tgFadeInUp {
    from {
        opacity: 0;
        transform: translate3d(0, 40px, 0);
    }

    to {
        opacity: 1;
        transform: none;
    }
}

@keyframes tgFadeInLeft {
    from {
        opacity: 0;
        transform: translate3d(-40px, 0, 0);
    }

    to {
        opacity: 1;
        transform: none;
    }
}

@keyframes tgFadeInRight {
    from {
        opacity: 0;
        transform: translate3d(40px, 0, 0);
    }

    to {
        opacity: 1;
        transform: none;
    }
}

@keyframes tgFadeIn {
    from {
        opacity: 0;
    }

    to {
        opacity: 1;
    }
}

/* An element carrying an fx- class opts out of the transition-based reveal
   and is driven by the keyframes instead; the two must not both run. */
.reveal.fx-up,
.reveal.fx-left,
.reveal.fx-right,
.reveal.fx-in {
    opacity: 0;
    transform: none;
    transition: none;
}

    /* `opacity: 1` is set on the in-view state itself and the animation runs
       WITHOUT a fill mode, deliberately.

       animate.css uses fill:both, which holds the first keyframe until the
       animation starts - and if the animation never runs at all (blocked,
       unsupported, or interrupted) it holds opacity:0 forever and the
       content is silently lost. Declaring the resting state as visible and
       letting the keyframes only decorate the arrival means the worst case
       is a missing animation rather than missing content, which is the same
       rule the rest of this motion system follows. */
    .reveal.fx-up.in-view {
        opacity: 1;
        animation: tgFadeInUp 1s ease;
    }

    .reveal.fx-left.in-view {
        opacity: 1;
        animation: tgFadeInLeft 1s ease;
    }

    .reveal.fx-right.in-view {
        opacity: 1;
        animation: tgFadeInRight 1s ease;
    }

    .reveal.fx-in.in-view {
        opacity: 1;
        animation: tgFadeIn 1s ease;
    }

@media (prefers-reduced-motion: reduce) {
    .reveal.fx-up,
    .reveal.fx-left,
    .reveal.fx-right,
    .reveal.fx-in,
    .reveal.fx-up.in-view,
    .reveal.fx-left.in-view,
    .reveal.fx-right.in-view,
    .reveal.fx-in.in-view {
        opacity: 1 !important;
        transform: none !important;
        animation: none !important;
    }
}

/* ---------- 28. Toggler: distinct open state ----------
   Reported as "turning black" after a click. Measured with every stylesheet
   the page loads, nothing about the button changes on click - the bars stay
   rgb(10,38,71) throughout and no element in the header is black.

   The likely explanation is that --tg-navy (#0a2647) simply reads as black,
   and the X shape the bars form when open makes that darkness more obvious
   than three separate lines did. So the open state is now given the gold
   accent: unmistakably not black, and it doubles as a clearer signal that
   the menu is open. */
.navbar-toggler[aria-expanded="true"] .burger-line {
    background-color: var(--tg-gold) !important;
}

/* a slightly lighter blue on press, so the control acknowledges the tap
   without ever painting a filled block behind itself */
.navbar-toggler:active .burger-line {
    background-color: var(--tg-blue-700) !important;
}

/* ---------- 29. Additional entrance effects (aptourismhotels.in) ----------
   That site runs Elementor's entrance animations - 34 elements, with
   fadeInUp dominant (21 of 34, the same as skltghu.ac.in) plus fadeInDown,
   zoomIn and rotateIn, staggered with explicit 200ms/300ms delays.

   fadeInUp / fadeIn / fadeInLeft / fadeInRight are already defined in
   section 27; only the effects that vocabulary was missing are added here,
   so both reference sites can be matched from one set of classes. */
@keyframes tgFadeInDown {
    from {
        opacity: 0;
        transform: translate3d(0, -40px, 0);
    }

    to {
        opacity: 1;
        transform: none;
    }
}

@keyframes tgZoomIn {
    from {
        opacity: 0;
        transform: scale3d(.92, .92, .92);
    }

    to {
        opacity: 1;
        transform: none;
    }
}

/* animate.css rotates a full -200deg. That is a lot of movement for a
   government page - it draws the eye to the motion rather than the
   content - so this is a restrained -12deg with a slight scale. */
@keyframes tgRotateIn {
    from {
        opacity: 0;
        transform: rotate3d(0, 0, 1, -12deg) scale(.96);
    }

    to {
        opacity: 1;
        transform: none;
    }
}

.reveal.fx-down,
.reveal.fx-zoom,
.reveal.fx-rotate {
    opacity: 0;
    transform: none;
    transition: none;
}

    /* resting state visible, keyframes only decorate the arrival - see the
       note in section 27 on why fill-mode is deliberately omitted */
    .reveal.fx-down.in-view {
        opacity: 1;
        animation: tgFadeInDown 1s ease;
    }

    .reveal.fx-zoom.in-view {
        opacity: 1;
        animation: tgZoomIn 1s ease;
    }

    .reveal.fx-rotate.in-view {
        opacity: 1;
        animation: tgRotateIn 1s ease;
    }

/* --- Delay steps, matching the 200/300ms stagger used on that site ---
   These carry fill-mode: backwards so the element holds its start frame
   for the length of the delay instead of flashing in at full opacity and
   then animating. Backwards only covers the pre-start window, so unlike
   `both` it cannot strand content invisible after the run. */
.reveal.fx-d1.in-view { animation-delay: 100ms; animation-fill-mode: backwards; }
.reveal.fx-d2.in-view { animation-delay: 200ms; animation-fill-mode: backwards; }
.reveal.fx-d3.in-view { animation-delay: 300ms; animation-fill-mode: backwards; }
.reveal.fx-d4.in-view { animation-delay: 400ms; animation-fill-mode: backwards; }

@media (prefers-reduced-motion: reduce) {
    .reveal.fx-down,
    .reveal.fx-zoom,
    .reveal.fx-rotate,
    .reveal.fx-down.in-view,
    .reveal.fx-zoom.in-view,
    .reveal.fx-rotate.in-view,
    .reveal.fx-d1.in-view,
    .reveal.fx-d2.in-view,
    .reveal.fx-d3.in-view,
    .reveal.fx-d4.in-view {
        opacity: 1 !important;
        transform: none !important;
        animation: none !important;
    }
}

/* ---------- 30. Nav density at mid-desktop widths ----------
   At 1280px three of the nine top-level items - Conservation Division,
   Publication and Contact - were being pushed into the "More" drawer.
   They stayed reachable, but burying Contact behind an icon on a desktop
   screen is poor navigation.

   The cause was self-inflicted: widening .brandbar .header to 46% for the
   larger emblems left the nav with roughly 690px for nine items. Tightening
   the item padding and tracking between 1200px and 1500px buys back enough
   room for the full menu; the overflow drawer stays as the genuine fallback
   for narrower windows. */
@media (min-width: 1200px) and (max-width: 1499.98px) {
    /* Back off the squeeze. Fitting all nine items here needs ~12px type at
       3px padding, which is cramped and gives poor click targets - the menu
       legitimately overflows at this width and the drawer is the right
       answer, so the priority is a comfortable density plus an obvious
       "More" control (labelled below), not cramming. */
    .brandbar .header {
        max-width: 44% !important;
    }

    .brandbar .navbar-wp .navbar-nav > li > a.nav-link,
    .brandbar .navbar-wp .navbar-nav > li > a.has-submenu {
        font-size: 12.5px !important;
        padding: 9px 7px !important;
        letter-spacing: -.01em;
    }

    /* the caret already implies the submenu; the gap before it can go */
    .brandbar .navbar-wp .navbar-nav > li > a .dropdown-arrow {
        margin-left: 2px;
    }
}

/* ---------- 31. Officials: name on one line ----------
   "Sri Jupally Krishna Rao" wrapped to two lines in a ~200px card, which
   left the three officials with uneven name blocks. The name now holds one
   line and the type scales down instead of breaking. */
.about-section .official-name,
.about-section .official-card .mi {
    white-space: nowrap;
    font-size: clamp(12.5px, 1.05vw, 16px) !important;
}

/* "More" overflow control: labelled rather than a bare icon.
   When items must overflow, the control that reaches them has to read as
   navigation. A 42px hamburger beside a horizontal menu does not - it looks
   like decoration, so items behind it (Contact among them) go unnoticed. */
.nav-more-toggle {
    width: auto;
    gap: 7px;
    padding: 0 10px;
}

.nav-more-label {
    font-family: var(--tg-font-body);
    font-size: 12.5px;
    font-weight: 600;
    letter-spacing: -.01em;
    color: var(--tg-navy);
    transition: color .2s var(--tg-ease-out);
}

.nav-more-toggle:hover .nav-more-label,
.nav-more-toggle[aria-expanded="true"] .nav-more-label {
    color: #fff;
}

/* ---------- 32. Menu treatment (drparagtelang.com) ----------
   Reference measurements: white 80px header with a soft wide shadow
   (0 5px 30px rgba(0,0,0,.08)); nav list flex with a 20px gap; links
   14px/600 with +0.7px tracking and a caret icon; and a pill CTA at the
   right (border-radius 50px, 12px/700, padding 12px 20px).

   What is adopted below is the finish - the diffuse header shadow, the
   tracking, and the pill treatment for the overflow control.

   What is NOT adopted, deliberately: their 14px type with 20px gaps. That
   works because their menu carries four items. This one carries nine, with
   labels as long as "Heritage Partner Scheme"; at their density three more
   would be pushed into the overflow drawer, so copying it would worsen the
   exact problem being fixed. Density here stays driven by item count. */
header.mg-headwidget {
    box-shadow: 0 5px 30px rgba(0, 0, 0, .08);
}

.brandbar .navbar-wp .navbar-nav > li > a.nav-link,
.brandbar .navbar-wp .navbar-nav > li > a.has-submenu {
    letter-spacing: .2px;
    transition: color .2s var(--tg-ease-out), background-color .2s var(--tg-ease-out);
}

/* Overflow control as a pill, echoing their CTA. Being a filled pill rather
   than an outlined square also makes it read as an action, which is what the
   items behind it need. */
.nav-more-toggle {
    height: 32px;
    border-radius: 50px;
    border-color: var(--tg-border);
    transition: background-color .2s, border-color .2s, transform .2s;
}

    .nav-more-toggle:hover {
        transform: translateY(-1px);
    }

.nav-more-label {
    letter-spacing: .6px;
    text-transform: uppercase;
    font-size: 11.5px;
}

/* ---------- 33. Utility-bar links + submenu (niftyindices.com) ----------
   Measured on that site: the main nav holds only FIVE items (528px of a
   562px bar), each a short one- or two-word label with a dropdown. About Us,
   Media, Contact Us, Careers and Login are not in it at all - they sit in a
   separate bar. Its submenus are 250px min-width with 35px rows at 14px/400.

   That is the structural answer to this menu overflowing: the fix is fewer,
   shorter primary items, not smaller type. Contact and Login have moved to
   the utility bar accordingly. */
.topbar-link {
    font-size: 12.5px;
    font-weight: 600;
    color: var(--tg-navy) !important;
    text-decoration: none;
    padding: 2px 10px;
    border-radius: 4px;
    transition: background-color .2s var(--tg-ease-out), color .2s var(--tg-ease-out);
}

    .topbar-link:hover,
    .topbar-link:focus {
        background: var(--tg-navy);
        color: #fff !important;
    }

    .topbar-link:focus-visible {
        outline: 3px solid var(--tg-gold);
        outline-offset: 2px;
    }

/* Submenus: roomier than the previous auto width, so long entries such as
   "Preservation and Conservation" stop wrapping inside the panel. */
.navbar-wp .dropdown-menu,
.brandbar .navbar-wp .dropdown-menu {
    min-width: 250px !important;
    padding: 6px 0 !important;
    border: 1px solid var(--tg-border) !important;
    border-radius: 8px !important;
    box-shadow: 0 12px 30px rgba(10, 38, 71, .16) !important;
}

    .navbar-wp .dropdown-menu > li > a {
        display: block;
        padding: 4px 16px !important;
        line-height: 30px !important;
        font-size: 13.5px !important;
        font-weight: 500 !important;
        white-space: nowrap;
        transition: background-color .18s var(--tg-ease-out), color .18s var(--tg-ease-out);
    }

    .navbar-wp .dropdown-menu > li > a:hover,
    .navbar-wp .dropdown-menu > li > a:focus {
        background: var(--tg-blue-50) !important;
        color: var(--tg-blue-800) !important;
    }

/* ---------- 34. Header at zoomed / narrow desktop widths ----------
   992-1199px is what a 1280px screen becomes at 110-130% browser zoom. The
   brand block and menu stay on one row there, and every menu item stays
   visible - both the wordmark and the nav step down so all seven fit rather
   than spilling into the overflow drawer. */
@media (min-width: 992px) and (max-width: 1199.98px) {
    .brandbar .header {
        max-width: 42% !important;
        padding: 6px 12px 4px !important;
        gap: 8px;
    }

        /* Matched heights, as above. Smaller than the >=1200px pair: the
           brand block's percentage cap is only ~476px wide at 992, so
           there is less room to give before the wordmark wraps. */
        .brandbar .header .header-left img.f,
        .brandbar .header .header-left img.s {
            width: 54px !important;
            height: 54px !important;
        }

        .brandbar .header .header-left img.rising {
            height: 54px !important;
            width: auto !important;
        }

    .brandbar .header-center h1 {
        font-size: 13.5px !important;
    }

    .brandbar .header-center h2 {
        font-size: 10px !important;
    }

    .brandbar .header-center h4 {
        font-size: 9.5px !important;
    }

    /* nav takes the space the brand gives up, so all seven items fit */
    .brandbar .navbar-wp .navbar-nav > li > a.nav-link,
    .brandbar .navbar-wp .navbar-nav > li > a.has-submenu {
        font-size: 11.5px !important;
        padding: 8px 5px !important;
        letter-spacing: -.015em;
    }
}

/* ---------- 35. Brand block: wordmark always beside the logos ----------
   .header is a flex row, but it carried `flex-wrap: wrap`. As soon as the
   available width tightened - a narrow brand column, or the page zoomed -
   .header-center wrapped onto its own line and the department name dropped
   underneath the emblems instead of sitting next to them.

   Two changes keep it on one row: nowrap stops the break, and min-width:0
   lets the text column actually shrink. Without the second, a flex item
   refuses to go below its content's intrinsic width and forces the wrap
   back even with nowrap set. */
.header {
    flex-wrap: nowrap !important;
    justify-content: flex-start;
}

.header-left {
    flex: 0 0 auto;
}

.header-center {
    flex: 1 1 auto;
    min-width: 0;
    text-align: left;
}

    /* the three lines shrink together rather than wrapping the block */
    .header-center h1,
    .header-center h2,
    .header-center h4 {
        text-align: left;
    }

@media (max-width: 991px) {
    /* stacked layout below the brandbar: keep the wordmark beside the
       emblems rather than centring it under them */
    .header {
        justify-content: flex-start;
        text-align: left;
    }

    .header-center h1 {
        font-size: clamp(13px, 3.4vw, 19px) !important;
    }

    .header-center h2 {
        font-size: clamp(10px, 2.1vw, 15px) !important;
    }

    .header-center h4 {
        font-size: clamp(9px, 1.9vw, 13px) !important;
    }
}

@media (max-width: 400px) {
    /* genuinely no room for both on the smallest phones - the emblems step
       down rather than the name being pushed to a second row */
    .header-left img.f, .header-left img.s {
        width: 48px !important;
        height: 48px !important;
    }

    .header-left img.rising {
        height: 48px !important;
        width: auto !important;
    }
}

/* homestyle2.css:321 sets .header-left and .header-center to width:100% in
   its mobile query - written for the old stacked layout. With the row now
   set to nowrap that starved the wordmark to 0px and collapsed the heading
   to one character per line. Both are returned to auto so the emblems take
   their content width and the text takes the remainder. */
.header-left {
    width: auto !important;
    margin-right: 12px !important;
    margin-bottom: 0 !important;
    justify-content: flex-start !important;
}

.header-center {
    width: auto !important;
    flex: 1 1 0 !important;
}

/* ---------- 36. Brand text must never be clipped ----------
   The third line - "Youth Advancement, Tourism and Culture Department" - is
   the longest of the three and was losing its final characters: the brand
   column had been narrowed to buy space for a nine-item menu, and the text
   was overflowing rather than fitting.

   The menu is now six items, so the column gets that width back (42-44%).
   These rules make the failure mode safe as well: nothing clips, and if the
   line still cannot fit at some width it wraps instead of being cut. */
.header,
.header-center,
.brandbar .header,
.brandbar .header-center {
    overflow: visible !important;
}

.header-center h2,
.header-center h4 {
    white-space: normal;
    overflow-wrap: break-word;
    text-overflow: clip;
}

/* h1 keeps its single line, but shrinks to fit rather than overflowing the
   column - the wordmark scales down before it ever runs past its box. */
.header-center h1 {
    max-width: 100%;
    overflow: visible;
    text-overflow: clip;
}

/* ---------- 37. No gap above the footer ----------
   Belt and braces: the legacy sheets also give the last content wrappers a
   bottom margin, which would leave a strip of page background showing above
   the footer even with its own margin-top at zero. */
footer.footer {
    margin-top: 0 !important;
}

main#skip > *:last-child,
main#skip > section:last-child,
main#skip > div:last-child {
    margin-bottom: 0 !important;
}

/* the wrapper the master page puts around header/main/footer */
body > form > div > main {
    margin-bottom: 0 !important;
    padding-bottom: 0 !important;
}

/* ---------- 38. Footer: close the space above the column headings ----------
   The h5 headings inherit a top margin from the global heading rules, which
   pushed "Quick Links", "Important Links", "Contact" and the department name
   away from the top of their columns. Zeroed, and the widget area's own top
   padding is trimmed so the footer starts tight. */
.mg-footer-widget-area {
    padding-top: 26px !important;
}

.mg-footer-widget-area h5,
.footer-col h5 {
    margin-top: 0 !important;
    padding-top: 0 !important;
}

/* the grid itself must not add a leading gap either */
.footer-grid {
    margin-top: 0 !important;
}

.footer-col {
    margin-top: 0 !important;
}

    .footer-col > *:first-child {
        margin-top: 0 !important;
    }

/* The footer headings are display:inline-block so their gold underline only
   spans the words. That puts them in an inline formatting context, where the
   parent's line-height adds a few pixels of leading above the text - a 6px
   gap that no margin rule could remove. Switching to a shrink-wrapped block
   keeps the underline the width of the words with no leading. */
.mg-footer-widget-area h5,
.footer-col h5 {
    display: block;
    width: -moz-fit-content;
    width: fit-content;
    line-height: 1.2;
}

/* =====================================================================
   15. Masthead: the arch shell
   ---------------------------------------------------------------------
   The masthead was three stacked rectangles - navy utility strip, white
   brand block, white menu bar - separated only by a hairline. Everything
   below it (page banners, the About band, the Heritage Partner Scheme
   banner) had already moved to layered gradients, curved corners and the
   jali motif, so the top of every page was the one part of the site still
   reading as the old template.

   Three moves, all presentation - no markup, no controls, no content:

     1. a shell     the brand row and the menu now sit on one layered
                    light gradient (--grad-shell) under the jali lattice,
                    so they read as a single surface with a direction to
                    it rather than two abutting blocks
     2. an arch     a lobed Deccan arch is drawn behind the emblems, the
                    same silhouette as the monuments the Department looks
                    after; it is a background shape, so it costs no
                    layout and can be clipped wherever it does not fit
     3. a curve     the white brand shelf ends in a large radius that
                    sweeps down into the menu, replacing the vertical
                    seam that used to butt the two halves together

   Placed last in the file on purpose. Section 7 sets flat backgrounds on
   .header, .brandbar and .mg-menu-full - the last of those with
   `!important`, to beat css/default.css and homestyle2.css - and section
   7 sets the nav hover colour the same way. Re-declaring here rather than
   editing those in place keeps the legacy overrides they exist for
   intact, and keeps the whole redesign in one block that can be lifted
   back out.
   ===================================================================== */

/* ---- The shell ---- */
/* .brandbar wraps the brand block and the menu at every width (it is only
   flex above 992px), so it is the one element that can carry the shell
   for both layouts. Nothing here sets overflow: the menu dropdowns are
   children of this box and would be clipped by it. */
.brandbar {
    position: relative;
    background: var(--jali-light), var(--grad-shell);
    background-repeat: repeat, no-repeat;
    background-size: 72px 72px, cover;
}

/* Gold-to-blue rule closing the masthead, matching the one --grad-accent
   already draws at the top edge of the page banner and the scheme banner.
   Absolute rather than a border so it stays on the sticky bar's own bottom
   edge in both layouts. */
.brandbar::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    height: 3px;
    background: var(--grad-accent);
    pointer-events: none;
}

/* The utility strip takes the same deep stack the dark bands use, so the
   masthead opens on the palette rather than on flat navy. */
.region.region-header-top.skips,
.skips {
    position: relative;
    background: var(--grad-deep) !important;
    background-size: cover !important;
}

header.mg-headwidget {
    background: transparent;
    box-shadow: 0 8px 26px rgba(10, 38, 71, .11);
}

/* ---- The brand block ---- */
/* Plain white, and deliberately so. This block first carried a segmental
   arch behind the emblems - a gold-and-blue background shape echoing the
   monuments the Department looks after - and a soft round plate under the
   two crests. Both are gone: tinting the brand side made the emblems sit
   on a wash rather than on the white field a state crest expects, and the
   masthead reads better as a clean white block against the gradient shell
   the menu sits on. The shell, the lattice and the curve all still run;
   only the colour behind the crests changed.

   position: relative is kept - the curve below is positioned against this
   box. Nothing here sets overflow: the brand block is a flex row, and
   clipping it would cut the tail off the third brand line as soon as a
   curve came near it. */
.header {
    position: relative;
    background: var(--tg-white);
}

/* ---- Wordmark ---- */
/* A gold sweep under the department name, tapering out to nothing rather
   than stopping square - the same accent the section headings carry, cut
   to the softer shape the rest of this block is built from. Absolute, so
   it cannot push the three brand lines apart. */
.header-center h1 {
    position: relative;
}

.header-center h1::after {
    content: "";
    position: absolute;
    left: 0;
    right: 34%;
    bottom: -1px;
    height: 3px;
    border-radius: 999px;
    background: linear-gradient(90deg, var(--tg-gold), rgba(232, 169, 51, .15));
    pointer-events: none;
}

@media (max-width: 991px) {
    /* Brand block is centred below 992px, so the sweep is centred with it. */
    .header-center h1::after {
        left: 22%;
        right: 22%;
        background: linear-gradient(90deg, rgba(232, 169, 51, .15), var(--tg-gold), rgba(232, 169, 51, .15));
    }
}

/* ---- The curve ---- */
@media (min-width: 992px) {
    /* The brand shelf: still white, but now a shape on the shell rather
       than a block flush against the menu. The radius is the masthead's
       signature - large enough to read as a sweep at a glance, and taken
       off the trailing corner only, so the emblems keep a square field to
       sit in. */
    .brandbar .header {
        background: var(--tg-white);
        margin-right: clamp(16px, 2vw, 34px);
    }

    /* The sweep hangs off the shelf rather than being cut into it. A
       bottom-right corner radius was the obvious way to do this and it is
       the wrong one: the brand block is only ~61px tall, so the browser
       scales any radius down to the height, and a corner that large eats
       into the box - measured at 1440px the curve crossed the end of
       "Youth Advancement, Tourism and Culture Department". Hung outside as
       a quarter-ellipse instead, the curve can be bigger than the corner
       would ever allow and cannot touch the type.

       It lands in the menu's left margin, which is always empty:
       #menu-primary is justify-content: flex-end, so the items sit hard
       right (section 7b). */
    .brandbar .header::after {
        content: "";
        position: absolute;
        top: 0;
        left: 100%;
        width: clamp(44px, 4.4vw, 82px);
        height: 100%;
        background: var(--tg-white);
        border-radius: 0 0 100% 0;
        box-shadow: 12px 0 32px -26px rgba(10, 38, 71, .55);
        pointer-events: none;
    }

    /* Menu drops its own white and its shadow so the shell shows through
       and the masthead reads as one surface. The wrapper's `!important`
       white is beaten on specificity, not by editing section 7. */
    .brandbar .mg-menu-full {
        background: transparent !important;
        box-shadow: none !important;
    }
}

@media (max-width: 991px) {
    /* Stacked, the curve moves to the menu: it rises as a rounded panel
       from under the brand block instead of butting straight onto it. */
    .brandbar .mg-menu-full {
        background: rgba(255, 255, 255, .72) !important;
        border-radius: 26px 26px 0 0;
        box-shadow: none !important;
    }
}

/* ---- Menu items ---- */
/* Rounded targets with a gradient fill on hover. The flat colour swap the
   links had gave no sense of a hit area, which is the one thing a menu
   sitting on a patterned shell actually needs. */
.navbar-wp .navbar-nav > li > a.nav-link,
.navbar-wp .navbar-nav > li > a.has-submenu {
    border-radius: 999px;
    transition: background-color .25s var(--tg-ease-out), color .25s var(--tg-ease-out), box-shadow .25s var(--tg-ease-out);
}

.mg-headwidget .navbar-wp .navbar-nav > li > a.nav-link:hover,
.mg-headwidget .navbar-wp .navbar-nav > li > a.nav-link:focus-visible,
.mg-headwidget .navbar-wp .navbar-nav > li > a.has-submenu:hover,
.mg-headwidget .navbar-wp .navbar-nav > li > a.has-submenu:focus-visible,
.mg-headwidget .navbar-wp .navbar-nav > .active > a.nav-link,
.mg-headwidget .navbar-wp .navbar-nav > .active > a.has-submenu {
    background: linear-gradient(180deg, rgba(232, 169, 51, .22), rgba(47, 128, 216, .16)) !important;
    color: var(--tg-navy) !important;
    box-shadow: inset 0 0 0 1px rgba(16, 83, 143, .12);
}

@media (prefers-reduced-motion: reduce) {
    .navbar-wp .navbar-nav > li > a.nav-link,
    .navbar-wp .navbar-nav > li > a.has-submenu {
        transition: none;
    }
}

/* =====================================================================
   36. Masthead: legibility and state
   ---------------------------------------------------------------------
   Two findings drove this block, both measured rather than judged by eye.

   1. THE WORDMARK WAS SHRUNK TO PAY A BILL THAT WAS NEVER OWED.
      Section 34 takes the department name down to 13.5px and the parent
      department line to 9.5px between 992 and 1199px, to keep every menu
      item out of the overflow drawer. Measured at 1024px, with the brand
      block at its 42% cap, the menu needs 456px and has 601px. There were
      145px going spare. Sweeping the brand cap against the menu's real
      requirement, every combination up to a 54% cap with the wordmark at
      18px and the menu back at its full 12.8px still fits.

      The band this hurt most is the one that can least afford it: as
      section 34's own comment says, 992-1199px is mostly a 1280px screen
      at 110-130% browser zoom. Those are people who zoomed in to make
      text bigger, and the masthead answered by setting it at 9.5px.

      50% / 16.5px is taken here rather than the 54% / 18px the sweep
      allows, to leave room for the font swap - Ubuntu and Mulish load
      with display=swap and the fallback faces measure wider (section 7b
      records that costing ~13px on this same line).

      Above 1200px the block is `flex: 0 0 auto` and shrink-wraps its
      content, so its 46% cap was never binding: at 1440px it measured
      471px against a 662px cap, with 418px spare beside the menu. The
      wordmark simply had no reason to be 17px.

   2. THE MENU NEVER SAID WHERE YOU WERE.
      No aria-current, no active class, nothing set anywhere in the master
      page, the scripts or the code-behind - six top-level sections and
      around twenty pages with no current-page state at all. js/nav-current.js
      supplies it; the styling is below.

      That also settles what gold is for in this masthead. It was being
      spent on decoration - a tri-colour rule under the bar and a sweep
      under the wordmark - which left nothing to say "you are here" with.
      Gold now marks the current section and nothing else; hover is a
      quiet blue tint, so the two states are told apart by hue rather
      than by intensity.
   ===================================================================== */

/* ---- 1. Legibility ---- */
@media (min-width: 992px) and (max-width: 1199.98px) {
    .brandbar .header {
        max-width: 50% !important;
    }

    .brandbar .header-center h1 {
        font-size: 16.5px !important;
    }

    .brandbar .header-center h2 {
        font-size: 11px !important;
    }

    .brandbar .header-center h4 {
        font-size: 10.5px !important;
    }

    .brandbar .navbar-wp .navbar-nav > li > a.nav-link,
    .brandbar .navbar-wp .navbar-nav > li > a.has-submenu {
        font-size: 12.5px !important;
        padding: 8px 8px !important;
        letter-spacing: normal;
    }
}

@media (min-width: 1200px) {
    .brandbar .header-center h1 {
        font-size: 20px !important;
    }
}

@media (min-width: 1500px) {
    .brandbar .header-center h1 {
        font-size: 22px !important;
    }
}

/* ---- 2. Hierarchy ---- */
/* The three brand lines were three different hues at three sizes, which
   reads as three competing labels rather than one identity. They step
   down now on weight and tone within a single family: the name owns the
   block, the parent department supports it, and the former name - a
   footnote that matters only to people searching for the old title - is
   the quietest thing in the masthead rather than the middle voice. */
.brandbar .header-center h2 {
    color: var(--tg-muted) !important;
    font-weight: 400 !important;
    letter-spacing: normal;
}

.brandbar .header-center h4 {
    color: var(--tg-blue-700) !important;
    font-weight: 600 !important;
}

/* Gold is reserved for the current-page state now, so the decorative
   sweep this line used to carry is gone. */
.header-center h1::after {
    content: none;
}

/* ---- 3. The closing rule ---- */
/* Was --grad-accent, gold to blue to gold. Three hues in a 3px rule under
   a white masthead reads as trim. One hue, falling away to the right,
   reads as an edge. */
.brandbar::after {
    height: 2px;
    background: linear-gradient(90deg, var(--tg-gold), var(--tg-gold-dark) 48%, rgba(232, 169, 51, .18));
}

/* ---- 4. Menu states ---- */
/* Hover and focus: a quiet blue tint. This is feedback, not a signal. */
.mg-headwidget .navbar-wp .navbar-nav > li > a.nav-link:hover,
.mg-headwidget .navbar-wp .navbar-nav > li > a.nav-link:focus-visible,
.mg-headwidget .navbar-wp .navbar-nav > li > a.has-submenu:hover,
.mg-headwidget .navbar-wp .navbar-nav > li > a.has-submenu:focus-visible {
    background: var(--tg-blue-50) !important;
    color: var(--tg-blue-700) !important;
    box-shadow: none;
}

/* Current page, and the top-level section a current child page sits under.
   Gold, and the only gold in the bar. The inset rule under the pill is
   what carries the state for anyone who cannot separate the two tints. */
.mg-headwidget .navbar-wp .navbar-nav > li.is-current > a.nav-link,
.mg-headwidget .navbar-wp .navbar-nav > li.is-current > a.has-submenu,
.mg-headwidget .navbar-wp .navbar-nav > li.is-current-parent > a.nav-link,
.mg-headwidget .navbar-wp .navbar-nav > li.is-current-parent > a.has-submenu {
    background: rgba(232, 169, 51, .20) !important;
    color: var(--tg-navy) !important;
    box-shadow: inset 0 -2px 0 var(--tg-gold);
    font-weight: 700 !important;
}

/* Inside a dropdown the items are full-width rows, so the pill shape does
   not apply - the current child takes a gold spine instead. */
.mg-headwidget .navbar-wp .dropdown-menu > li.is-current > a {
    background: rgba(232, 169, 51, .14) !important;
    color: var(--tg-navy) !important;
    box-shadow: inset 3px 0 0 var(--tg-gold);
    font-weight: 700 !important;
}

@media (max-width: 991px) {
    /* Stacked, the menu is a drawer of full-width rows rather than a row
       of pills, so the current item takes the same spine as a child. */
    .mg-headwidget .navbar-wp .navbar-nav > li.is-current > a.nav-link,
    .mg-headwidget .navbar-wp .navbar-nav > li.is-current > a.has-submenu,
    .mg-headwidget .navbar-wp .navbar-nav > li.is-current-parent > a.nav-link,
    .mg-headwidget .navbar-wp .navbar-nav > li.is-current-parent > a.has-submenu {
        box-shadow: inset 3px 0 0 var(--tg-gold);
    }
}

/* ---- 5. The hover sweep ---- */
/* Section 7 already draws a gold underline that sweeps in under a hovered
   item - it predates this block and is the better affordance of the two,
   so it stays. It only has to change hue: written when hover filled the
   item with blue, gold was the colour that stayed visible against it. Now
   that gold marks the current page, the sweep joins the rest of the hover
   treatment and goes blue. */
.navbar-wp .navbar-nav > li > a.nav-link::after,
.navbar-wp .navbar-nav > li > a.has-submenu::after {
    background: var(--tg-blue-700);
}

/* The current item carries a gold rule of its own, so the sweep would sit
   directly under a second underline on hover. */
.navbar-wp .navbar-nav > li.is-current > a::after,
.navbar-wp .navbar-nav > li.is-current-parent > a::after {
    content: none;
}
