/*====================================================================
    Light / Dark / Auto theme support

    How this works:
    - <html> carries a `theme="dark"` or `theme="light"` attribute, written
      by assets/js/theme-toggle.js (and set as early as possible by an
      inline script in <head> to avoid a flash of the wrong theme).
    - style.css's existing --thm-* custom properties already drive nearly
      every color in the template, so light mode is mostly just
      re-pointing the *semantic* tokens (backgrounds, body/heading text)
      below. --thm-white / --thm-black are intentionally left alone in
      both themes (e.g. the mobile menu's white panel with black text
      already works in both modes). --thm-primary-color and
      --thm-secondary-color do change per theme: see the Midnight
      palette block below.
    - The remaining rules in this file are the small set of places where
      a component's background flips with the theme but its text/overlay
      color was still hardcoded to a dark-only value.
======================================================================*/

/*====================================================================
    Midnight palette: site-wide tokens

    The site's colors flow from style.css's --thm-* custom properties,
    so the palette is applied by re-pointing them here (this file loads
    last). Colors are sampled from the ctibos logo's blue ramp.

    Dark theme (default):
    - primary   #2FA5FC sky      buttons, links, icons on dark; carries navy text
    - secondary #1790F6 bright   hover swipes, check icons
    - page bg   #06122B midnight; cards / raised surfaces #0C1B3D
    - text      #C9D3E6 cool silver; headings #FFFFFF
    Light theme falls back to the blue system: primary #0474DB (white
    text), secondary #014CA6, white page, #F4F7FB surfaces, #34425C text.

    Tokens that are new to this site (not in the template):
    - --cti-on-primary: text/glyph color for anything filled with
      --thm-primary-color (navy on sky in dark, white on blue in light)
    - --cti-ico: logo-blue fill for icon squares
    - --cti-navy / --cti-ink: the logo's deep blues, for footers and bands

    The template's old cerulean primary (#3399cc) and green secondary
    no longer appear on live pages. Surfaces that are dark in BOTH
    themes (heroes, page banners, the call-to-action band, the footer)
    and the always-white mobile menu re-declare these tokens locally; see
    "Midnight palette: always-dark and always-light surfaces" at the end
    of this file.
======================================================================*/
:root {
    --thm-primary-color: #2FA5FC;
    --thm-secondary-color: #1790F6;
    --thm-body-background: #06122B;
    --thm-black-bg: #0C1B3D;
    --black-bg: #0C1B3D;
    --thm-body-font-color: #C9D3E6;
    --thm-paragraph-color: #C9D3E6;
    --cti-on-primary: #011238;
    --cti-ico: #0474DB;
    --cti-navy: #012962;
    --cti-ink: #011238;
    --cti-line: rgba(47, 165, 252, 0.16);
    --cti-error: #FF7B7B;
}

html[theme="light"] {
    --thm-primary-color: #0474DB;
    --thm-secondary-color: #014CA6;
    --thm-body-font-color: #34425C;
    --thm-heading-font-color: #011238;
    --thm-paragraph-color: #34425C;
    --thm-body-background: #ffffff;
    --thm-black-bg: #F4F7FB;
    --black-bg: #F4F7FB;
    --cti-on-primary: #ffffff;
    --cti-line: #E1E7F0;
    --cti-error: #C62828;
}

/*====================================================================
    Logo swap (header, footer, mobile menu)
======================================================================*/

/* The real logo files are much higher-resolution than the placeholder
   logo-1.png this template shipped with, and .logo-box-one / .footer-logo-one
   never constrained the <img> size (only .logo-box-two did, via a fixed-size
   box). Cap them to a sane header/footer logo height so they don't blow out
   the layout; width is auto so the aspect ratio stays correct. Sized larger
   than a typical icon-logo since this is a wordmark that needs room to stay
   legible. */
.logo-box-one img,
.footer-logo-one img {
    max-height: 72px;
    width: auto;
}

/* Desktop only (matches the breakpoint responsive.css uses to hide
   .main-header-two__bottom and switch .logo-box-two to its own mobile
   treatment: width:150px, height:90px, position:relative). Scoping
   here instead of overriding .logo-box-two unconditionally keeps that
   mobile treatment intact, since theme.css loads after responsive.css
   and would otherwise win the cascade at every breakpoint. */
@media only screen and (min-width: 1200px) {
    .logo-box-two {
        width: 260px;
        /* header.css hardcodes height:120px, sized for pages that still
           have .main-header-two__top above .main-header-two__bottom.
           about.html no longer has that top bar, so a fixed height
           overflows past the (now shorter) header. .main-header-two__inner
           (the positioned ancestor .logo-box-two is absolute within) has
           no explicit height of its own (height:100% wouldn't resolve
           against an auto-height parent), so pin top and bottom instead:
           that stretches the box to exactly match the container's real
           rendered height, whether that's full top+bottom (pages that
           still have __top) or just __bottom's height (about.html). */
        top: 0;
        bottom: 0;
        height: auto;
    }
}

.logo-light,
.footer-logo-light {
    display: block;
}

.mobile-logo-light {
    display: inline-block;
}

.logo-dark,
.footer-logo-dark,
.mobile-logo-dark {
    display: none;
}

html[theme="dark"] .logo-light,
html[theme="dark"] .footer-logo-light,
html[theme="dark"] .mobile-logo-light {
    display: none !important;
}

html[theme="dark"] .logo-dark,
html[theme="dark"] .footer-logo-dark,
html[theme="dark"] .mobile-logo-dark {
    display: block !important;
}

html[theme="light"] .mobile-logo-dark {
    display: none !important;
}

html[theme="light"] .mobile-logo-light {
    display: inline-block !important;
}

/* Footer logo: always show the dark-theme variant, regardless of site
   theme. The footer background is now a pinned dark navy in both
   themes (.footer-one--navy), so the light-theme logo variant (tuned
   for a light background) no longer applies here. */
html[theme="light"] .footer-one--navy .footer-logo-light {
    display: none !important;
}

html[theme="light"] .footer-one--navy .footer-logo-dark {
    display: block !important;
}

/* Square CTI diamond mark (resource/ctibos_logo.webp; the 1254px original is brand-source/ctibos_logo_nobackground.png): one
   theme-agnostic image, so it carries no light/dark class and none of
   the swap rules above apply to it. It is sized 140x140px, scoped to
   .logo-mark so any remaining wordmark logos keep the 72px cap at the
   top of this file. The mobile menu needs its own width because
   header.css forces .nav-logo img to width:150px, which was sized for
   the wide wordmark and would render the square mark 150x150. */
.logo-box-one img.logo-mark,
.footer-logo-one img.logo-mark {
    max-height: 140px;
}

.nav-logo img.logo-mark {
    width: 140px;
}

/*====================================================================
    Home page header logo: force the dark-theme (white-text) logo
    while unscrolled

    .main-header-one starts transparent, absolutely positioned over
    .platform-hero, which is deliberately dark in both site themes
    (see the Platform Hero section below). The theme-driven logo swap
    above assumes the header's backdrop tracks the theme, so in light
    mode it would otherwise show the dark-text logo against that
    always-dark backdrop. Force the white-text variant specifically
    while the header is still transparent (:not(.sticky-menu), before
    main.js's scroll listener adds that class and the header gets its
    own theme-aware solid background). Once sticky, let the normal
    theme-based swap resume since the header's own background is
    legible with either logo by then.
======================================================================*/
html[theme="light"] .main-header-one #sticky-header:not(.sticky-menu) .logo-light {
    display: none !important;
}

html[theme="light"] .main-header-one #sticky-header:not(.sticky-menu) .logo-dark {
    display: block !important;
}

/*====================================================================
    Home page nav centering (desktop nav only: responsive.css hides
    .navbar-wrap and swaps in the mobile menu below 1200px, so these
    rules are scoped to match and stay out of the mobile layout's way)

    .menu-nav lays out logo / nav links / right-hand icons with
    justify-content: space-between. Centering the middle section within
    its own flexible space (below) only looks centered on the whole bar
    if the logo and the right-hand cluster reserve roughly equal width.
    The logo (~289px at its 72px max-height) is wider than the theme
    switch on the right (~215px), so the reserved space is deliberately
    matched to the logo here, so if the logo's max-height above changes,
    this min-width needs to change with it.
======================================================================*/
@media only screen and (min-width: 1200px) {
    .main-header-one .navbar-wrap.main-menu {
        flex: 1;
        display: flex;
        justify-content: center;
    }

    .main-header-one .navbar-wrap.main-menu ul.navigation {
        margin: 0;
    }

    .main-header-one .menu-nav__right {
        display: flex;
        justify-content: flex-end;
        min-width: 290px;
    }
}

/*====================================================================
    Home page service cards: equal height

    .services-one__single only takes its own content's height, so cards
    with longer titles/descriptions (Field Service Tools, Website Design
    & Hosting) render shorter or taller than the others depending on how
    much their text wraps. Bootstrap's .row already stretches the columns
    to equal height; make the card itself fill that column height too,
    and push the "Read More" link to the bottom so it lines up across
    cards regardless of description length.
======================================================================*/
.services-one .row > [class*="col-"] {
    display: flex;
}

.services-one__single {
    height: 100%;
    display: flex;
    flex-direction: column;
    width: 100%;
}

.services-one__single-content {
    display: flex;
    flex-direction: column;
    flex: 1;
}

.services-one__single-content .btn-box {
    margin-top: auto;
}

/*====================================================================
    Home page service cards: spacing between cards

    Bootstrap's row gutter (horizontal, between side-by-side cards) and
    services.css's margin-bottom (vertical, between stacked cards) are
    both already present, but .services-one__single's background
    (--thm-black-bg) is barely distinguishable from the page background
    it sits on (--thm-body-background: the two are only a couple of
    RGB values apart in dark mode), so the existing gap doesn't read as
    a gap. Widen it outright instead of relying on that color
    difference to carry the separation.
======================================================================*/
.services-one .row {
    --bs-gutter-x: 40px;
}

.services-one__single {
    margin-bottom: 40px;
}

/*====================================================================
    Home page pricing teaser: responsive stacking

    module-css/pricing.css ships .pricing-one__single-inner as a single
    non-wrapping flex row (fixed-width left column + a right side with
    its own fixed paddings/margins) and never once queries a breakpoint
    for it. Unlike pricing.html's card-grid layout (.pricing-two), this
    section has no mobile treatment at all in the vendor CSS, so below
    roughly 1000px the two halves overflow/overlap. Stack them instead.
======================================================================*/
@media only screen and (max-width: 991px) {
    .pricing-one__single-inner {
        flex-direction: column;
        align-items: flex-start;
    }

    .pricing-one__single-left {
        max-width: 100%;
        padding-right: 0;
        margin-bottom: 30px;
    }

    .pricing-one__single-left::before {
        display: none;
    }

    .pricing-one__single-right {
        flex-direction: column;
        align-items: flex-start;
        width: 100%;
    }

    .pricing-one__single-right-price {
        padding-left: 0;
        margin-top: 20px;
    }

    .pricing-btn {
        margin-left: 0;
        margin-top: 20px;
    }
}

/*====================================================================
    Header text color

    The header nav text (.navbar-wrap ul li a) and the dropdown submenu
    are white by default because the header starts transparent, absolutely
    positioned over whatever's directly below it (.banner-one on the
    home page, .page-header's hero image on inner pages), both of which
    carry their own dark overlay for contrast. Once the header has a
    solid background of its own, that background tracks the theme via
    --thm-black-bg, so the text has to track the theme too. This applies
    to the submenu popout, main-header-two's bar (used on every inner
    page that still has one), and main-header-one once it becomes
    "sticky" on scroll (any page using it, home or otherwise).
======================================================================*/
html[theme="light"] .navbar-wrap ul li .sub-menu li a,
html[theme="light"] .main-header-two .navbar-wrap ul li a,
html[theme="light"] .main-header-two__bottom-right ul li a,
html[theme="light"] .sticky-menu .navbar-wrap ul li a,
html[theme="light"] .sticky-menu .contact-info-box-one .icon span,
html[theme="light"] .sticky-menu .contact-info-box-one .text p,
html[theme="light"] .sticky-menu .contact-info-box-one .text a {
    color: var(--thm-heading-font-color);
}

html[theme="light"] .navbar-wrap ul li .sub-menu li a:hover {
    color: var(--thm-white);
}

/*====================================================================
    Homepage hero: "Platform Hero" (dashboard mockup) redesign

    Replaces the vendor's photo-background/Swiper banner-one with a
    static two-column layout (text left, dashboard mockup right).
    Deliberately kept dark in both themes: a marketing hero with a
    product-visual mockup reads better against a fixed dark background
    than one that flips to light mode. It's also a self-contained
    section (no page content sits on top of it), so there's no
    contrast/legibility dependency on the rest of the page.
======================================================================*/
.platform-hero {
    position: relative;
    display: block;
    overflow: hidden;
    padding: 200px 0 120px;
    background: linear-gradient(120deg, #020A1C 0%, #011238 48%, #013378 100%);
}

.platform-hero__inner {
    position: relative;
    display: grid;
    grid-template-columns: minmax(0, 460px) 1fr;
    align-items: center;
    gap: 70px;
    z-index: 1;
}

.platform-hero__title {
    color: var(--thm-white);
    font-size: 52px;
    line-height: 1.2em;
    font-weight: 700;
    text-transform: none;
}

.platform-hero__title-muted {
    color: rgba(255, 255, 255, 0.55);
    font-weight: 500;
}

.platform-hero__text {
    position: relative;
    color: rgba(255, 255, 255, 0.7);
    font-size: 18px;
    line-height: 30px;
    max-width: 460px;
    margin: 22px 0 0;
}

.platform-hero__btn-box {
    position: relative;
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 18px;
    margin-top: 38px;
}

.platform-hero__btn {
    display: inline-flex;
    align-items: center;
    gap: 12px;
    font-family: var(--thm-heading-font-family);
    font-size: 15px;
    font-weight: 700;
    letter-spacing: 0.5px;
    text-transform: uppercase;
    border-radius: 8px;
    padding: 15px 28px;
    transition: all 300ms ease;
}

.platform-hero__btn--outline {
    color: var(--thm-white);
    background: transparent;
    border: 1.5px solid rgba(255, 255, 255, 0.35);
}

.platform-hero__btn--outline:hover {
    background: rgba(255, 255, 255, 0.08);
    border-color: rgba(255, 255, 255, 0.6);
    color: var(--thm-white);
}

.platform-hero__btn--solid {
    color: var(--thm-white);
    background: var(--thm-primary-color);
    border: 1.5px solid var(--thm-primary-color);
}

.platform-hero__btn--solid:hover {
    background: var(--thm-secondary-color);
    border-color: var(--thm-secondary-color);
    color: var(--thm-white);
}

/* --- Dashboard mockup card --- */
.platform-hero__visual {
    position: relative;
}

.platform-hero__mockup {
    position: relative;
    background: #f5f7fb;
    border-radius: 16px;
    padding: 26px;
    box-shadow: 0 40px 80px rgba(2, 8, 24, 0.45);
    transform: perspective(1400px) rotateY(-8deg) rotateX(2deg);
}

/* Real screenshot (assets/img/screenshots/field-operations-workorder.png)
   standing in for the CSS-built fake mockup header/stats this used to
   hold, so the padding that framed that fake content is dropped and
   the image fills the card edge to edge instead, keeping the same
   rounded corners/shadow as every other page's mockup card. The base
   rotateY(-8deg) rotateX(2deg) 3D tilt is dropped to flat (0 rotation)
   here: a real screenshot with fine text/UI detail reads noticeably
   blurrier under any CSS 3D transform than the flat CSS/SVG mockups
   on other pages do, and even the shallower -3deg/1deg tried first
   still wasn't clean enough. */
.platform-hero__mockup--image {
    padding: 0;
    overflow: hidden;
    line-height: 0;
    transform: none;
}

.platform-hero__mockup-img {
    display: block;
    width: 100%;
    height: auto;
}

/* blog.css's generic .blog-page__single-img img sets a default
   scale(1.05) that eases down to scale(1) on hover (a subtle
   zoom-out reveal), used site-wide for every product page's Product
   Details hero image. Product Details' image on this specific page
   (field-operations-schedule.png) shouldn't have that zoom, so this
   scopes the override to just this instance via a modifier class
   rather than changing the shared rule everyone else still uses. */
.blog-page__single-img--static img {
    transform: none;
    transition: transform 300ms ease;
}

/* This screenshot has a white/light UI and sits directly on the
   page's white background in light mode, so with no border or shadow
   it visually disappears into the page instead of reading as a
   distinct image, unlike every other real screenshot on the site
   (which all sit inside a card-style frame with its own shadow). */
.blog-page__single-img--static {
    border: 1px solid rgba(2, 8, 24, 0.08);
    box-shadow: 0 20px 50px rgba(2, 8, 24, 0.18);
}

/* Same hover-scale + click-to-enlarge treatment as
   .dashboard-preview__screenshot-link on products-property-management.html:
   slightly scale up on hover and open the full image via the existing
   unscoped $(".popup-image") Magnific Popup handler in main.js (which
   already also gets the 80vw/80vh img.mfp-img cap defined above the
   dashboard-preview rules). */
.blog-page__single-img--static-link {
    display: block;
    cursor: zoom-in;
}

.blog-page__single-img--static-link:hover img {
    transform: scale(1.04);
}

.platform-hero__mockup-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding-bottom: 18px;
    margin-bottom: 20px;
    border-bottom: 1px solid #e2e6ee;
}

.platform-hero__mockup-title {
    font-family: var(--thm-heading-font-family);
    font-size: 18px;
    font-weight: 700;
    color: #16233f;
}

.platform-hero__mockup-select {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    font-size: 12px;
    font-weight: 500;
    color: #63708a;
    background: #ffffff;
    border: 1px solid #e2e6ee;
    border-radius: 6px;
    padding: 6px 12px;
}

.platform-hero__mockup-body {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 26px;
}

.platform-hero__mockup-label {
    display: block;
    font-size: 12px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    color: #8792a8;
    margin-bottom: 10px;
}

.platform-hero__mockup-label + .platform-hero__mockup-label {
    margin-top: 22px;
}

.platform-hero__stat-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 10px;
}

.platform-hero__stat {
    background: #ffffff;
    border-radius: 8px;
    padding: 12px 14px;
    border-top: 3px solid #cfd6e4;
}

.platform-hero__stat--blue {
    border-top-color: var(--thm-primary-color);
}

.platform-hero__stat--green {
    border-top-color: #3DD6B0;
}

.platform-hero__stat--orange {
    border-top-color: #E2A03F;
}

.platform-hero__stat--red {
    border-top-color: #FF6B6B;
}

.platform-hero__stat-num {
    display: block;
    font-family: var(--thm-heading-font-family);
    font-size: 20px;
    font-weight: 700;
    color: #16233f;
    line-height: 1.3em;
}

.platform-hero__stat-name {
    display: block;
    font-size: 11px;
    color: #7c869c;
    line-height: 1.3em;
}

.platform-hero__bar-chart {
    display: flex;
    align-items: flex-end;
    gap: 8px;
    height: 90px;
    background: #ffffff;
    border-radius: 8px;
    padding: 12px;
}

.platform-hero__bar-chart span {
    flex: 1 1 0;
    height: var(--v);
    min-height: 4px;
    background: var(--thm-primary-color);
    border-radius: 3px 3px 0 0;
    opacity: 0.85;
}

.platform-hero__line-chart {
    display: block;
    width: 100%;
    height: 90px;
    background: #ffffff;
    border-radius: 8px;
    padding: 10px;
    box-sizing: border-box;
}

@media only screen and (max-width: 1199px) {
    .platform-hero__inner {
        grid-template-columns: 1fr;
        gap: 50px;
    }

    .platform-hero__mockup {
        transform: none;
        max-width: 600px;
        margin: 0 auto;
    }

    .platform-hero__content,
    .platform-hero__text {
        max-width: 100%;
    }
}

@media only screen and (max-width: 767px) {
    .platform-hero {
        padding: 160px 0 80px;
    }

    .platform-hero__title {
        font-size: 36px;
    }

    .platform-hero__mockup-body {
        grid-template-columns: 1fr;
    }

    .platform-hero__mockup-label + .platform-hero__mockup-label {
        margin-top: 22px;
    }
}

@media only screen and (max-width: 480px) {
    .platform-hero__stat-grid {
        grid-template-columns: 1fr 1fr;
    }

    .platform-hero__btn-box {
        flex-direction: column;
        align-items: stretch;
    }

    .platform-hero__btn {
        justify-content: center;
    }
}

/*====================================================================
    Product page hero ("product-hero") — lighter-blue variant of
    .platform-hero (same two-column content/mockup layout, same
    dashboard mockup markup), used in place of the vendor .page-header
    on every products-*.html page.

    Reuses .platform-hero__inner / __content / __visual / __mockup /
    __text / __btn-box / __btn as-is (all scoped by class name only,
    not by .platform-hero ancestor, so the existing responsive
    stacking/scaling rules and the homepage hero's subtitle/dual-CTA
    pattern apply here for free — see products-financial-management.html,
    the first pillar page to use them). Only .product-hero itself is
    new: a lighter-blue gradient instead of platform-hero's near-black
    start, and a fixed min-height instead of top/bottom padding, so
    flexbox vertical-centering handles clearing the transparent header
    automatically at any content height, matching a roughly
    1899x620px reference size on a full-width desktop viewport (taller
    on pages with hero subtitle/CTAs, since min-height only sets a
    floor).
======================================================================*/
.product-hero {
    position: relative;
    display: flex;
    align-items: center;
    overflow: hidden;
    min-height: 620px;
    padding: 130px 0 30px;
    background: linear-gradient(120deg, #020A1C 0%, #011238 48%, #013378 100%);
}

.product-hero .platform-hero__title {
    text-transform: capitalize;
}

/* Scaled down from the homepage version so the full mockup (a
   stand-in image, see comment above) fits within this section's
   much shorter 620px target height without pushing past it or
   overlapping the transparent header above. */
.product-hero .platform-hero__mockup {
    padding: 18px;
}

/* Same specificity as the rule above (both are ".product-hero
   .platform-hero__X"), so it must come after in source order to win:
   the image variant should stay edge-to-edge, not inherit this 18px
   padding. */
.product-hero .platform-hero__mockup--image {
    padding: 0;
}

.product-hero .platform-hero__mockup-header {
    padding-bottom: 12px;
    margin-bottom: 14px;
}

.product-hero .platform-hero__mockup-label {
    margin-bottom: 6px;
}

.product-hero .platform-hero__mockup-label + .platform-hero__mockup-label {
    margin-top: 14px;
}

.product-hero .platform-hero__stat-grid {
    gap: 8px;
}

.product-hero .platform-hero__stat {
    padding: 8px 10px;
}

.product-hero .platform-hero__bar-chart,
.product-hero .platform-hero__line-chart {
    height: 64px;
}

@media only screen and (max-width: 767px) {
    .product-hero {
        min-height: 460px;
    }
}

/* Content-only .platform-hero__inner variant: pages with no mockup
   to show (About Us, FAQ, Pricing, Contact) collapse the two-column
   grid to one centered column instead of leaving the second grid
   column empty. */
.platform-hero__inner--content-only {
    grid-template-columns: minmax(0, 1fr);
    justify-items: center;
    text-align: center;
}

.platform-hero__inner--content-only .platform-hero__text {
    max-width: 700px;
}

.platform-hero__inner--content-only .platform-hero__btn-box {
    justify-content: center;
}

/*====================================================================
    Theme toggle button (sun / moon icon)

    A single round button: moon icon in dark mode, sun icon in light
    mode ("auto" is only ever the first-visit default; it has no icon
    of its own). The icon is drawn with mask-image rather than an <img>
    so it can be recolored per context with a plain background-color.
    The source SVGs are multi-tone (not simple single-color icons), so
    swapping in a "light" vs "dark" file wouldn't reliably give clean
    contrast the way a masked, solid-color icon does.

    Default color (white) matches the header's default
    transparent-over-banner state on the home page; the light-mode
    override further down flips it once the header has a solid
    background of its own (same contexts as "Header text color" above).
    The mobile menu panel is always a white surface regardless of theme
    (see the note at the top of this file), so it gets its own
    unconditional dark icon instead of following the theme attribute.
======================================================================*/
.theme-toggle-btn {
    position: relative;
    display: inline-block;
    width: 38px;
    height: 38px;
    margin-left: 15px;
    padding: 0;
    border: none;
    border-radius: 50%;
    background-color: rgba(255, 255, 255, 0.12);
    cursor: pointer;
}

.theme-toggle-btn::before {
    content: "";
    position: absolute;
    inset: 10px;
    background-color: var(--thm-white);
    -webkit-mask-image: url("../icons/sun-solid.svg");
    mask-image: url("../icons/sun-solid.svg");
    -webkit-mask-size: contain;
    mask-size: contain;
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-position: center;
    mask-position: center;
}

html[theme="dark"] .theme-toggle-btn::before {
    -webkit-mask-image: url("../icons/moon-solid.svg");
    mask-image: url("../icons/moon-solid.svg");
}

html[theme="light"] .main-header-two .theme-toggle-btn,
html[theme="light"] .sticky-menu .theme-toggle-btn {
    background-color: rgba(0, 0, 0, 0.08);
}

html[theme="light"] .main-header-two .theme-toggle-btn::before,
html[theme="light"] .sticky-menu .theme-toggle-btn::before {
    background-color: var(--thm-heading-font-color);
}

/* Below 1200px responsive.css forces .main-header-one to a solid
   background (position:relative + --thm-black-bg) the moment the page
   loads, not just after scroll like it does at desktop width, so the
   button needs the same light-mode dark-icon treatment here even though
   .sticky-menu hasn't been added yet. */
@media only screen and (max-width: 1199px) {
    html[theme="light"] .main-header-one .theme-toggle-btn {
        background-color: rgba(0, 0, 0, 0.08);
    }

    html[theme="light"] .main-header-one .theme-toggle-btn::before {
        background-color: var(--thm-heading-font-color);
    }
}

.mobile-menu .menu-box .theme-toggle-btn {
    margin: 20px auto 0;
    display: block;
    background-color: rgba(0, 0, 0, 0.08);
}

.mobile-menu .menu-box .theme-toggle-btn::before {
    background-color: var(--thm-black);
}

/*====================================================================
    Section headings / accordion / icon-card text: hardcoded white

    A handful of vendor components hardcode their text to --thm-white
    on a background that's driven by --thm-black-bg. --thm-black-bg
    flips to a light gray in light mode (see the :root override at the
    top of this file) but these text colors were never repointed to
    follow it, so the text goes white-on-near-white and disappears.
    These components were never exercised in light mode before now
    (service.html/about.html, which use two of them, don't load this
    file at all). Surfaced while building out products-website-hosting.html.
======================================================================*/
html[theme="light"] .section-title h2,
html[theme="light"] .faq-one__accrodion .accrodion .accrodion-title h2,
html[theme="light"] .services-one__single-title h3 a {
    color: var(--thm-heading-font-color);
}

html[theme="light"] .services-one__single-title .icon span,
html[theme="light"] .about-one__content-features ul li .inner .icon span {
    color: var(--thm-primary-color);
}

html[theme="light"] .working-process-one__big-text {
    color: rgba(0, 0, 0, 0.08);
}

/*====================================================================
    "What You Get" benefit grid: more breathing room between rows

    .services-one__single's own margin-bottom doesn't create any visible
    gap here: theme.css's equal-height fix (further up this file) makes
    each card `height: 100%` inside a `display: flex` column so it can
    match its row's tallest sibling, and that stretch resolves the
    column's own height to exactly the card's content height, so the
    card's margin-bottom ends up rendered outside the column's box
    without pushing the next flex line down (confirmed via
    getBoundingClientRect: zero pixels between a row's card bottoms and
    the next row's card tops despite a computed 50px margin-bottom).
    row-gap on the row itself sidesteps that entirely. Scoped to
    .services-one--services (this page only, since service.html, the
    only other user of that class, doesn't load theme.css) rather than
    editing the shared services.css rule directly.
======================================================================*/
.services-one--services .row {
    row-gap: 50px;
}

/*====================================================================
    Benefit card feature list

    products-property-management.html's six "What You Get" categories each
    cover several named sub-features (e.g. Community Management: a
    directory, news, a calendar, a forum, messaging, notifications) —
    too many to fold into one benefit sentence without losing the
    specifics the user asked to have listed. Adds a compact, unlinked
    list under a card's benefit paragraph rather than reusing
    .sidebar__category-list, which styles its <li> via `li a` and is
    built around clickable filter links, not plain feature names.
======================================================================*/
.services-one__feature-list {
    margin-top: 15px;
    padding-top: 15px;
    border-top: 1px solid rgba(150, 150, 150, 0.25);
}

.services-one__feature-list li {
    position: relative;
    font-size: 14px;
    line-height: 1.9em;
    color: var(--thm-body-font-color);
    padding-left: 16px;
}

.services-one__feature-list li::before {
    content: "";
    position: absolute;
    left: 0;
    top: 10px;
    width: 5px;
    height: 5px;
    border-radius: 50%;
    background: var(--thm-primary-color);
}

/*====================================================================
    "How It Works" process steps: equal height

    .working-process-one__single normally lives inside a Swiper slide
    (about.html/index-2.html), where every slide is the same width and
    height differences don't matter. products-website-hosting.html uses
    the same card markup in a plain Bootstrap grid instead (see the
    "Pricing Two cards" and "What You Get" fixes above for why), so a
    step whose text wraps to an extra line renders taller than its
    siblings. Same fix pattern as .services-one__single above. Scoped
    to .working-process-one generally since about.html/index-2.html
    don't load theme.css, so this only ever applies here.
======================================================================*/
.working-process-one .row > [class*="col-"] {
    display: flex;
}

.working-process-one__single {
    height: 100%;
    width: 100%;
}

.working-process-one {
    background-color: #012962;
}

/*====================================================================
    "How It Works" heading: match the h5/h2 color treatment

    .working-process-one's background is now a solid brand blue in
    both themes (see above), not the theme-driven surface the base
    section-title colors assume. The h5 eyebrow defaults to
    var(--thm-primary-color) (style.css), which is literally the same
    blue as this section's background and disappears entirely; the h2
    picks up the light-mode heading-color override meant for light
    surfaces elsewhere, which reads as low-contrast dark text on this
    blue. Pin both to white here so the eyebrow and heading share the
    same always-legible treatment regardless of theme.
======================================================================*/
.working-process-one .section-title h5 {
    color: var(--thm-white);
}

html[theme="light"] .working-process-one .section-title h2 {
    color: var(--thm-white);
}

/*====================================================================
    Homepage "Platform Capabilities": 3-up card row, wraps 3+2

    Five cards don't divide evenly into a clean grid, and forcing a
    true 5-across row (an earlier version of this fix, via flex: 0 0
    20%) squeezed each card's content area down to ~180px, too narrow
    for .services-one__single-title's 80px icon column plus its 50px
    icon, and too narrow for .button-style-2's "Read More" (uppercase,
    1.28px letter-spacing) to fit on one line. col-xl-4 keeps each card
    at the ~33% width the component's icon/button sizing was actually
    designed around (matches products-website-hosting.html's "What You
    Get" grid, which uses the same col-xl-4/col-lg-4 split for 6 cards)
    and just lets the 5th wrap to its own row. row-gap on the row
    covers the vertical gap that wrap introduces. .services-one__single
    is `height: 100%` inside a flex column (see the equal-height fix
    above), which resolves the column's box to exactly the card's
    content height and swallows its own margin-bottom instead of
    pushing the next row down (same root cause documented for
    .services-one--services further down this file).
======================================================================*/
#platform-capabilities .row {
    row-gap: 50px;
}

/*====================================================================
    Product page tabbed deep-dive ("See X In Action")

    First use of Bootstrap's native tab plugin on the site (already
    loaded via bootstrap.min.js; data-bs-toggle="tab" drives pane
    switching with no custom JS needed). The nav buttons and content
    card get their own look since nothing existing styled Bootstrap
    tabs before. The visual in each pane reuses .platform-hero__mockup
    as a standalone card, not stock photography, matching the direction
    started on Financial Management's hero mockup, so it needs no new
    image assets and no new imagery gotchas.
======================================================================*/
.services-tabs__intro-text {
    max-width: 620px;
    margin: -20px auto 40px;
    color: var(--thm-body-font-color);
}

.services-tabs__nav {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 12px;
    padding: 0;
    margin-bottom: 50px;
}

.services-tabs__nav .nav-link {
    font-family: var(--thm-heading-font-family);
    font-size: 15px;
    font-weight: 700;
    color: var(--thm-body-font-color);
    background: var(--thm-black-bg);
    border: none;
    border-radius: 8px;
    padding: 14px 26px;
    transition: all 200ms linear;
}

.services-tabs__nav .nav-link:hover {
    color: var(--thm-primary-color);
}

.services-tabs__nav .nav-link.active {
    color: var(--thm-white);
    background: var(--thm-primary-color);
}

.services-tabs__content-inner {
    background: var(--thm-black-bg);
    border-radius: 12px;
    padding: 60px;
}

/* .platform-hero__mockup normally sits in a 2-up grid inside the hero;
   here it's a single standalone card in one column, so its body only
   needs one column instead of the hero's default two. */
.services-tabs__mockup .platform-hero__mockup-body {
    grid-template-columns: 1fr;
}

.services-tabs__mockup {
    transform: none;
}

.services-tabs__text h3 {
    font-size: 30px;
    line-height: 1.3em;
    margin-bottom: 18px;
}

.services-tabs__text > p {
    color: var(--thm-body-font-color);
    margin-bottom: 25px;
}

.services-tabs__checklist {
    margin-bottom: 30px;
}

.services-tabs__checklist li {
    display: flex;
    align-items: flex-start;
    gap: 12px;
    font-family: var(--thm-heading-font-family);
    font-weight: 600;
    color: var(--thm-heading-font-color);
    margin-bottom: 14px;
}

.services-tabs__checklist li i {
    color: var(--thm-primary-color);
    font-size: 18px;
    margin-top: 3px;
}

@media only screen and (max-width: 767px) {
    .services-tabs__content-inner {
        padding: 30px;
    }
}

/*====================================================================
    Pinned dark-navy footer background (per-page opt-in)

    Applied to specific pages' footers (currently the homepage's
    .footer-one and products-inventory-purchasing's .footer-one__two)
    regardless of site theme. The .footer-one__two.about combination
    also carries a --thm-black-bg background of its own (see Footer
    Two above), so that variant needs the extra specificity to win;
    plain .footer-one has no competing background rule and doesn't.

    The footer's link/paragraph text and contact-icon chip normally
    track the theme (dark mode's light-gray text already reads fine
    on a dark footer; light mode's near-black text would not against
    navy), so pin them to the same light values dark mode already
    uses instead of leaving light mode illegible here.
======================================================================*/
.footer-one--navy,
.footer-one__two.about.footer-one--navy {
    background-color: #012962;
}

.footer-one--navy .footer-widget-links ul li a,
.footer-one--navy .footer-widget-contact-info ul li .text-box p,
.footer-one--navy .footer-widget-contact-info ul li .text-box p a,
.footer-one--navy .our-company-info .text p,
.footer-one--navy .copyright-text p,
.footer-one--navy .copyright-menu ul li a {
    color: #bebebe;
}

.footer-one--navy .footer-widget-links ul li a:hover,
.footer-one--navy .footer-widget-contact-info ul li .text-box p a:hover,
.footer-one--navy .copyright-menu ul li a:hover {
    color: var(--thm-white);
}

.footer-one--navy .footer-widget-contact-info ul li .icon-box {
    background-color: transparent;
}

/* The icon-box's fixed top:6px/45px-tall absolute box (style.css) was
   tuned to sit against the two-line address entry; on the single-line
   phone/email entries it lands the icon well below that line's own
   center. Flex-centering the <li> against whatever content height is
   actually there fixes both cases instead of a fixed offset. */
.footer-one--navy .footer-widget-contact-info ul li {
    display: flex;
    align-items: center;
    padding-left: 0;
}

.footer-one--navy .footer-widget-contact-info ul li .icon-box {
    position: static;
    flex: 0 0 45px;
    margin-right: 15px;
}

/*====================================================================
    Field Operations: mobile-app showcase ("in your pocket")

    New component: a CSS-only phone frame with an app-screen mockup
    (reusing .platform-hero__bar-chart for the chart, same as the
    other mockups this session, no raster images) plus a floating
    stat card, dot-pattern backdrop, and a 2-up feature list. No
    device photo/human photo, per request; a person/watch photo was
    part of the reference but intentionally left out.
======================================================================*/
.field-mobile-visual {
    position: relative;
    padding: 30px 0 60px;
}

.field-mobile-visual__dots {
    position: absolute;
    left: 0;
    bottom: 0;
    width: 200px;
    height: 200px;
    background-image: radial-gradient(rgba(47, 165, 252, 0.35) 1.5px, transparent 1.5px);
    background-size: 16px 16px;
    z-index: 0;
}

.field-mobile-visual__phone {
    position: relative;
    z-index: 1;
    width: 260px;
    margin: 0 auto;
    background: #16233f;
    border-radius: 34px;
    padding: 16px 12px;
    box-shadow: 0 40px 80px rgba(2, 8, 24, 0.35);
}

/* Real screenshot (assets/img/screenshots/mobile-2.webp) standing in for the
   CSS-built fake app screen this used to hold, so the padding that
   made room for that fake header/notch is no longer needed; the image
   fills the screen edge to edge instead. */
.field-mobile-visual__phone-screen {
    position: relative;
    background: #f5f7fb;
    border-radius: 22px;
    overflow: hidden;
}

.field-mobile-visual__phone-img {
    display: block;
    width: 100%;
    height: auto;
}

.field-mobile-visual__phone-notch {
    position: absolute;
    top: 16px;
    left: 50%;
    transform: translateX(-50%);
    width: 74px;
    height: 16px;
    background: #16233f;
    border-radius: 10px;
    z-index: 2;
}

.field-mobile-visual__app-header {
    display: flex;
    align-items: center;
    gap: 10px;
    margin-bottom: 14px;
}

.field-mobile-visual__app-badge {
    flex: 0 0 26px;
    width: 26px;
    height: 26px;
    border-radius: 6px;
    background: var(--thm-primary-color);
    color: #ffffff;
    display: flex;
    align-items: center;
    justify-content: center;
    font-family: var(--thm-heading-font-family);
    font-size: 13px;
    font-weight: 700;
}

.field-mobile-visual__app-title {
    flex: 1;
    font-family: var(--thm-heading-font-family);
    font-size: 14px;
    font-weight: 700;
    color: #16233f;
}

.field-mobile-visual__app-header i {
    color: #8792a8;
    font-size: 14px;
}

.field-mobile-visual__app-search {
    display: flex;
    align-items: center;
    gap: 8px;
    background: #ffffff;
    border: 1px solid #e2e6ee;
    border-radius: 8px;
    padding: 8px 12px;
    font-size: 12px;
    color: #8792a8;
    margin-bottom: 14px;
}

.field-mobile-visual__app-stat-row {
    display: flex;
    gap: 10px;
    margin-bottom: 14px;
}

.field-mobile-visual__app-stat-row > div {
    flex: 1;
    background: #ffffff;
    border-radius: 8px;
    padding: 10px;
    border-top: 3px solid var(--thm-primary-color);
}

.field-mobile-visual__app-stat-row .num {
    display: block;
    font-family: var(--thm-heading-font-family);
    font-size: 18px;
    font-weight: 700;
    color: #16233f;
    line-height: 1.3em;
}

.field-mobile-visual__app-stat-row .label {
    display: block;
    font-size: 10px;
    color: #7c869c;
    line-height: 1.3em;
}

.field-mobile-visual__phone-screen .platform-hero__bar-chart {
    height: 60px;
    margin-bottom: 14px;
    padding: 8px;
}

.field-mobile-visual__app-list {
    background: #ffffff;
    border-radius: 8px;
    padding: 4px 12px;
}

.field-mobile-visual__app-list-item {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: 11px;
    color: #4a5568;
    padding: 7px 0;
    border-bottom: 1px solid #eef1f6;
}

.field-mobile-visual__app-list-item:last-child {
    border-bottom: none;
}

.field-mobile-visual__app-list-item .dot {
    width: 7px;
    height: 7px;
    border-radius: 50%;
    flex: 0 0 7px;
}

.field-mobile-visual__app-list-item .dot--green {
    background: #3DD6B0;
}

.field-mobile-visual__app-list-item .dot--blue {
    background: var(--thm-primary-color);
}

.field-mobile-visual__app-list-item .dot--orange {
    background: #E2A03F;
}

.field-mobile-visual__card {
    position: absolute;
    right: 6%;
    bottom: 40px;
    z-index: 2;
    background: #ffffff;
    border-radius: 12px;
    padding: 16px 18px;
    min-width: 170px;
    box-shadow: 0 20px 50px rgba(2, 8, 24, 0.25);
}

.field-mobile-visual__card-label {
    display: block;
    font-size: 11px;
    color: #7c869c;
    margin-bottom: 4px;
}

.field-mobile-visual__card-value {
    display: block;
    font-family: var(--thm-heading-font-family);
    font-size: 24px;
    font-weight: 700;
    color: #16233f;
    line-height: 1.3em;
}

.field-mobile-visual__card-value small {
    display: block;
    font-size: 11px;
    font-weight: 500;
    color: #7c869c;
    margin-top: 2px;
}

.field-mobile-content .section-title {
    padding-bottom: 22px;
}

.field-mobile-content > p {
    color: var(--thm-body-font-color);
    font-size: 16px;
    line-height: 1.8em;
    margin-bottom: 30px;
    max-width: 520px;
}

.field-mobile-feature .icon {
    font-size: 32px;
    color: var(--thm-primary-color);
    margin-bottom: 16px;
}

.field-mobile-feature h3 {
    font-size: 20px;
    margin-bottom: 10px;
}

.field-mobile-feature p {
    color: var(--thm-body-font-color);
    font-size: 15px;
    line-height: 1.7em;
    margin: 0;
}

.field-mobile-features .row {
    row-gap: 30px;
}

/*====================================================================
    Property Management: dashboard preview cards

    New component: 3 CSS-only "dashboard screenshot" cards (sidebar +
    header + stat tiles + chart), not real product screenshots or
    stock UI-kit imagery, consistent with the CSS-mockup direction
    used everywhere else this session. Always dark internally (like
    .platform-hero__mockup is always light internally) since it's
    depicting a dark-themed app UI, independent of site theme.
======================================================================*/
.dashboard-preview__dots {
    width: 140px;
    height: 60px;
    margin: 0 auto 10px;
    background-image: radial-gradient(rgba(47, 165, 252, 0.35) 1.5px, transparent 1.5px);
    background-size: 14px 14px;
}

/* Real screenshot (assets/img/hoa_dashboard.png) standing in for the
   first dashboard-preview card. Unlike the other two cards, which are
   built from DOM text/SVG and need the xl+ transform:scale() trick
   below (see .dashboard-preview__card-frame) to shrink crisply into a
   630px slot at 2-up, a raster image scales natively, so this uses
   its own frame class instead of that one and just stays fluid at a
   ~729x441 target size. Clickable via the existing unscoped
   $(".popup-image") Magnific Popup handler in main.js, so no new JS
   is needed for the click-to-enlarge lightbox. */
.dashboard-preview__screenshot-frame {
    width: 729px;
    max-width: 100%;
    margin: 0 auto;
}

.dashboard-preview__screenshot-link {
    display: block;
    cursor: zoom-in;
}

.dashboard-preview__screenshot {
    display: block;
    width: 100%;
    height: auto;
    aspect-ratio: 729 / 441;
    object-fit: cover;
    border-radius: 14px;
    box-shadow: 0 30px 60px rgba(2, 8, 24, 0.3);
    transition: transform 300ms ease;
}

.dashboard-preview__screenshot-link:hover .dashboard-preview__screenshot {
    transform: scale(1.04);
}

/* Magnific Popup's image module sets an inline max-height on img.mfp-img
   at runtime (verticalFit option) to fit the viewport, so it otherwise
   renders at nearly full-screen size for a large source image like
   hoa_dashboard.png (3802x1864). !important is needed here since an
   inline style otherwise wins over a plain stylesheet rule; capping at
   80vw/80vh shrinks the popup image ~20% from that full-viewport size. */
img.mfp-img {
    max-width: 80vw !important;
    max-height: 80vh !important;
}

/* Fixed ~750x440 "image" size per card, per request, with all the
   internal spacing/fonts tuned to fill that box. Below xl, each card
   still gets its own full-width row and centers within it (see
   .dashboard-preview__row > [class*="col-"] below) — .dashboard-preview__card
   just shrinks fluidly via max-width:100%, same as before. At xl+ the
   3 cards go 2-up (col-xl-6, third card wraps to its own centered
   row): 750px doesn't quite fit a col-xl-6 column (measured ~630px of
   usable width at the common 1320px-container desktop sizes this
   template's container caps out at), so the xl media query below
   turns .dashboard-preview__card-frame into a fixed-size,
   position:relative box matching that rendered size, and clips an
   absolutely-positioned copy of the same 750x440 card, uniformly
   shrunk via `transform: scale()`. This reuses the exact 750x440
   markup/CSS as-is instead of maintaining a second compacted set of
   padding/font-size rules for the 2-up layout. */
.dashboard-preview__card-frame {
    width: 750px;
    max-width: 100%;
    margin: 0 auto;
}

.dashboard-preview__card {
    display: flex;
    background: #0f1425;
    border-radius: 14px;
    overflow: hidden;
    box-shadow: 0 30px 60px rgba(2, 8, 24, 0.3);
    width: 750px;
    height: 440px;
    max-width: 100%;
}

.dashboard-preview__sidebar {
    flex: 0 0 64px;
    background: #0a0e1c;
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: 26px 0;
    gap: 28px;
}

.dashboard-preview__sidebar-logo {
    width: 32px;
    height: 32px;
    border-radius: 8px;
    background: var(--thm-primary-color);
    color: #ffffff;
    display: flex;
    align-items: center;
    justify-content: center;
    font-family: var(--thm-heading-font-family);
    font-size: 12px;
    font-weight: 700;
}

.dashboard-preview__sidebar-nav {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 24px;
}

.dashboard-preview__sidebar-nav li {
    color: rgba(255, 255, 255, 0.3);
    font-size: 18px;
}

.dashboard-preview__sidebar-nav li.active {
    color: var(--thm-primary-color);
}

.dashboard-preview__main {
    flex: 1;
    min-width: 0;
    padding: 32px 36px 36px;
}

.dashboard-preview__header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: 26px;
}

.dashboard-preview__header-title {
    font-family: var(--thm-heading-font-family);
    font-size: 18px;
    font-weight: 700;
    color: #ffffff;
}

.dashboard-preview__header-dot {
    width: 30px;
    height: 30px;
    border-radius: 50%;
    background: var(--thm-primary-color);
    opacity: 0.8;
}

.dashboard-preview__stats {
    display: flex;
    gap: 16px;
    margin-bottom: 26px;
}

.dashboard-preview__stat {
    flex: 1;
    background: rgba(255, 255, 255, 0.04);
    border-radius: 8px;
    padding: 16px 18px;
    border-top: 3px solid var(--thm-primary-color);
}

.dashboard-preview__stat--green {
    border-top-color: #3DD6B0;
}

.dashboard-preview__stat--orange {
    border-top-color: #E2A03F;
}

.dashboard-preview__stat .num {
    display: block;
    font-family: var(--thm-heading-font-family);
    font-size: 26px;
    font-weight: 700;
    color: #ffffff;
    line-height: 1.3em;
}

.dashboard-preview__stat .label {
    display: block;
    font-size: 13px;
    color: rgba(255, 255, 255, 0.5);
    line-height: 1.3em;
}

.dashboard-preview__chart-label {
    font-size: 12px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    color: rgba(255, 255, 255, 0.4);
    margin-bottom: 14px;
}

.dashboard-preview__bar-chart {
    display: flex;
    align-items: flex-end;
    gap: 10px;
    height: 170px;
    background: rgba(255, 255, 255, 0.04);
    border-radius: 8px;
    padding: 14px;
}

.dashboard-preview__bar-chart span {
    flex: 1 1 0;
    height: var(--v);
    min-height: 4px;
    background: var(--thm-primary-color);
    border-radius: 4px 4px 0 0;
    opacity: 0.9;
}

.dashboard-preview__bar-chart--green span {
    background: #3DD6B0;
}

.dashboard-preview__bar-chart--orange span {
    background: #E2A03F;
}

.dashboard-preview__line-chart {
    display: block;
    width: 100%;
    height: 170px;
    background: rgba(255, 255, 255, 0.04);
    border-radius: 8px;
    padding: 14px;
    box-sizing: border-box;
}

.dashboard-preview__row {
    row-gap: 30px;
}

.dashboard-preview__row > [class*="col-"] {
    display: flex;
    justify-content: center;
}

@media only screen and (max-width: 767px) {
    .dashboard-preview__card {
        height: 400px;
    }

    .dashboard-preview__main {
        padding: 24px 22px 26px;
    }

    .dashboard-preview__bar-chart,
    .dashboard-preview__line-chart {
        height: 130px;
    }
}

/* 2-up horizontal layout (col-xl-6, third card wraps alone onto its
   own centered row). The 1320px container leaves ~630px of column
   content per card at this breakpoint, so shrink the 750x440 card to
   fit via a fixed-size frame + transform:scale, sized for that ~630px
   slot rather than left fluid (fluid width paired with the card's
   fixed 440px height would distort the aspect ratio at in-between
   widths, see the comment on .dashboard-preview__card above). */
@media only screen and (min-width: 1200px) {
    .dashboard-preview__card-frame {
        position: relative;
        width: 630px;
        aspect-ratio: 750 / 440;
        overflow: hidden;
    }

    .dashboard-preview__card {
        position: absolute;
        top: 0;
        left: 0;
        max-width: none;
        transform: scale(0.84);
        transform-origin: top left;
    }

    /* 3 items in a 2-up (col-xl-6) grid: the 3rd card wraps onto its
       own row but, left at col-xl-6, only fills the row's left half
       and sits off-center. Make it span the full row here so
       justify-content:center (above) centers it properly instead. */
    .dashboard-preview__row > [class*="col-"]:nth-child(3) {
        flex: 0 0 100%;
        max-width: 100%;
    }
}

/*====================================================================
    Product page sidebar "Get a Quote" box: pin text to black in
    light mode. The h2 is hardcoded to var(--thm-white) in blog.css
    (the .sidebar__author component was built for the dark-only blog
    sidebar), which disappears against this box's light-gray
    --thm-black-bg background once the page is in light mode.
======================================================================*/
html[theme="light"] .sidebar__single.sidebar__author .sidebar__author-inner h2,
html[theme="light"] .sidebar__single.sidebar__author .sidebar__author-inner p {
    color: #222222;
}

/* 4-tier pricing layout (Starter/Basic/Pro/Custom): the base
   .pricing-two__single padding (40px 40px 50px) was sized for a
   3-across col-xl-4 grid; at 4-across col-xl-3 it leaves little room
   for feature text before wrapping, so tighten the horizontal padding
   a bit for this variant only. Card descriptions/prices/feature lists
   also differ in length across the 4 tiers, so without the flex rules
   below the cards shrink-wrap to their own content and end up visibly
   different heights. Bootstrap's .row is already flex with equal-height
   columns, so stretching the card to fill that column height and
   pinning the button to the bottom is enough to make every card
   uniform regardless of content. */
.pricing-two--4col .pricing-two__single {
    display: flex;
    flex-direction: column;
    height: 100%;
    padding-left: 28px;
    padding-right: 28px;
}

/* pricing.css's .pricing-two__price padding (10px 70px) was sized
   for the original 3-across layout and renders as a roughly 244x140px
   badge here, oversized/overflowing at this narrower column width
   (worst on the Custom card, since its short "Custom" label makes the
   excess padding most visible). Fix the badge to a uniform 244x100px
   box across every card instead. */
.pricing-two--4col .pricing-two__price {
    width: 244px;
    height: 100px;
    max-width: 100%;
    padding: 0;
    display: flex;
    align-items: center;
    justify-content: center;
}

.pricing-two--4col .pricing-two__price h2 {
    white-space: nowrap;
}

.pricing-two--4col .pricing-two__bottom {
    display: flex;
    flex-direction: column;
    flex-grow: 1;
}

.pricing-two--4col .pricing-two__list {
    flex-grow: 1;
}

.pricing-two--4col .pricing-two__bottom .pricing-btn {
    margin-top: auto;
    text-align: center;
}

/* pricing.css's generic .button-style-1 rule inside .pricing-btn
   forces width:100%, which at this variant's narrower column width
   makes the button (especially the longer "Contact Us" label on the
   Custom tier) look oversized and/or overflow the card's padding.
   Let it size to its own content instead. */
.pricing-two--4col .pricing-two__bottom .pricing-btn .button-style-1 {
    width: auto;
    max-width: 100%;
    padding: 12px 26px;
}

/* pricing.css's generic .pricing-btn adds margin-left: 70px (meant for
   the pricing-table layout) and makes .button-style-1 an outline button
   with var(--thm-white) text. Both leak into this reused "Get A Quote"
   box: the margin knocks the button off the .text-center axis, and the
   white text disappears against the light-mode background. */
.sidebar__single.sidebar__author .pricing-btn {
    margin-left: 0;
}

html[theme="light"] .sidebar__single.sidebar__author .pricing-btn .button-style-1 {
    color: #222222;
}

/*====================================================================
    Financial Management page restructure (2026-07-31)

    Longer hero headline ("Accounting and Financial Management That
    Connects to Your Business" vs. every other pillar page's 1-3 word
    title) needs a smaller size than the shared 52px .platform-hero__title
    default so it doesn't dominate the hero at this length. Same
    specificity as the base rule and the existing mobile override, so
    it must stay below both in the cascade (it does, file order).
======================================================================*/
.platform-hero__title--long {
    font-size: 40px;
}

@media only screen and (max-width: 767px) {
    .platform-hero__title--long {
        font-size: 28px;
    }
}

/* Two-button footer CTA row (Financial Management's final CTA has two
   actions instead of every other page's single "Get A Free Quote"). */
.subscribe-one__btn-group {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 20px;
}

/* .subscribe-one__inner's background is var(--thm-primary-color), the
   exact same blue as .button-style-1's default background, so a plain
   second .button-style-1 here would render with no visible button
   shape (blue-on-blue), just floating text. Give it a white
   outline/transparent treatment instead, matching how .secondary-white
   already handles contrast for the primary button in this section. */
.subscribe-one__btn-outline {
    background: transparent;
    border: 1.5px solid var(--thm-white);
}

.subscribe-one__btn-outline:hover {
    color: var(--thm-primary-color);
}

.subscribe-one__btn-outline:before,
.subscribe-one__btn-outline:after {
    background-color: var(--thm-white);
}

/*====================================================================
    Reusable icon + heading + description list, used by both the
    "Financial Controls" and "Customization" sections below. Distinct
    from .services-tabs__checklist (a single bold line per item) since
    these items each need a short explanatory sentence too.
======================================================================*/
.financial-controls {
    padding: 120px 0;
}

.financial-controls--single {
    padding: 80px 0 120px;
}

.control-list {
    list-style: none;
    margin: 0;
    padding: 0;
}

.control-list li {
    display: flex;
    align-items: flex-start;
    gap: 18px;
    margin-bottom: 30px;
}

.control-list li:last-child {
    margin-bottom: 0;
}

.control-list li .icon {
    flex: 0 0 50px;
    width: 50px;
    height: 50px;
    border-radius: 8px;
    background: var(--thm-black-bg);
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--thm-primary-color);
    font-size: 20px;
}

.control-list li h4 {
    font-size: 18px;
    margin-bottom: 6px;
    color: var(--thm-heading-font-color);
}

.control-list li p {
    color: var(--thm-body-font-color);
    margin: 0;
    line-height: 1.6em;
}

/* .control-list li:last-child zeroes margin-bottom, correct for a
   single-column control-list but it leaves no gap between the two
   <ul>s in .financial-controls' two-column layout once those columns
   stack below the lg breakpoint (the first list's last item and the
   second list's first item end up flush against each other). Scoped
   to that breakpoint only since the columns sit side-by-side above it
   and don't need the extra spacing. */
@media only screen and (max-width: 991px) {
    .financial-controls .row > .col-lg-6 + .col-lg-6 .control-list {
        margin-top: 30px;
    }
}

/*====================================================================
    Connected Platform: first real build of the "platform-integration
    connector graphic" idea from the original product-page
    differentiation brainstorm. Kept modest per that plan (CSS-only,
    no SVG line-drawing) — a row of pillar chips feeding visually into
    a single prominent hub via a centered connector line.
======================================================================*/
.connected-platform {
    padding: 120px 0;
}

.connected-platform__diagram {
    display: flex;
    flex-direction: column;
    align-items: center;
    max-width: 900px;
    margin: 0 auto;
}

.connected-platform__nodes {
    position: relative;
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 16px;
    list-style: none;
    margin: 0;
    padding: 0 0 40px;
}

.connected-platform__nodes li {
    display: flex;
    align-items: center;
    gap: 10px;
    background: var(--thm-black-bg);
    border: 1px solid rgba(47, 165, 252, 0.3);
    border-radius: 30px;
    padding: 12px 20px;
    font-family: var(--thm-heading-font-family);
    font-weight: 600;
    color: var(--thm-heading-font-color);
    font-size: 14px;
}

.connected-platform__nodes li i {
    color: var(--thm-primary-color);
}

.connected-platform__nodes::after {
    content: "";
    position: absolute;
    bottom: 0;
    left: 50%;
    transform: translateX(-50%);
    width: 2px;
    height: 40px;
    background: var(--thm-primary-color);
    opacity: 0.4;
}

.connected-platform__center {
    display: flex;
    align-items: center;
    gap: 14px;
    background: var(--thm-primary-color);
    color: var(--thm-white);
    border-radius: 12px;
    padding: 22px 36px;
    font-family: var(--thm-heading-font-family);
    font-weight: 700;
    font-size: 20px;
    box-shadow: 0 20px 40px rgba(47, 165, 252, 0.25);
}

.connected-platform__center i {
    font-size: 24px;
}

@media only screen and (max-width: 767px) {
    .connected-platform__nodes li {
        font-size: 13px;
        padding: 10px 16px;
    }

    .connected-platform__center {
        font-size: 16px;
        padding: 18px 24px;
        text-align: center;
    }
}

/*====================================================================
    Credibility: reuses the .odometer/data-count mechanism already
    built for about.html's .fact-counter-one (CSS/JS already loaded on
    every page via the standard asset order, main.js's $(".odometer")
    trigger is unscoped), but only for the one real, defensible number
    (years in business). The other 3 items are plain qualitative text,
    not fabricated stats like .fact-counter-one's stock placeholder
    numbers — so this uses lighter, purpose-built markup/CSS rather
    than the heavier icon-box .fact-counter-one__single component.
======================================================================*/
.credibility {
    padding: 100px 0;
}

.credibility__item {
    text-align: center;
    padding: 20px;
}

.credibility__item p {
    color: var(--thm-body-font-color);
    font-weight: 600;
    font-family: var(--thm-heading-font-family);
    margin: 0;
}

.credibility__item--stat .count {
    display: block;
    font-size: 48px;
    font-weight: 700;
    color: var(--thm-primary-color);
    font-family: var(--thm-heading-font-family);
    margin-bottom: 8px;
}

.credibility__item--stat p {
    color: var(--thm-heading-font-color);
}

/* style.css's base p rule sets margin-bottom:0 site-wide, so any block
   that stacks multiple <p> tags needs its own spacing rule. Both of
   these about.html blocks originally held a single vendor-copy
   paragraph (no gap needed); now that "Where We Started" and "About
   CTI" each use multiple real paragraphs, add the gap back scoped to
   just these two blocks rather than changing the global p rule. */
.about-two__content .text p + p,
.about-one__content-text p + p {
    margin-top: 16px;
}

/* Content-only hero pages (no mockup, just a short title + one line
   of text) don't need the standard 1899x620 .product-hero height
   every products-*.html page uses — 1899x320 per request, first for
   about.html, then reused as-is for faq.html and contact.html.
   .product-hero is already display:flex + align-items:center, so
   this just lowers the min-height floor and the existing flex
   centering keeps the content vertically centered within it (content
   + the base 130px/30px top/bottom padding measures ~304px at the
   1899px reference width, so it fits inside 320px without the box
   growing past the floor). Now shared by about.html, faq.html,
   contact.html, and pricing.html — all content-only heroes with a
   short title + one line of text. */
.product-hero--compact {
    min-height: 320px;
}

@media only screen and (max-width: 767px) {
    .product-hero--compact {
        min-height: 260px;
    }
}

/*====================================================================
    Pricing page (2026-08-19)

    Body content between the hero and the final CTA, built to reuse
    existing components rather than invent new visual language:

    - .pricing-page__intro: just a spacing wrapper around the standard
      .section-title + .services-tabs__intro-text pair already used
      for page intros elsewhere (e.g. Financial Management's "See It
      In Action").
    - The "what shapes your price" row reuses .working-process-one /
      .working-process-one__single as-is (same numbered-circle/icon/
      title pattern as every product page's "How It Works" section),
      just 2 columns instead of 4 since there are only two factors —
      which also gives each card room for two paragraphs instead of
      one, hence the p+p rule below.
    - The pull-quote callout reuses .blog-details__content-text2 /
      .text-box directly (same dark box + centered heading every
      product page's blog-details section already uses) rather than
      duplicating that visual in a new class; only its supporting
      paragraph needed a new rule, since existing usage is
      heading-only.
    - The final CTA reuses .subscribe-one__inner, the same box every
      product page already ends with (see .subscribe-one__btn-group
      above) — only the supporting paragraph under the heading is new,
      since existing usage there is headline+button only.
======================================================================*/
.pricing-page__intro {
    padding: 120px 0 0;
}

.working-process-one__text p + p {
    margin-top: 16px;
}

.pricing-page__callout {
    padding: 0 0 120px;
}

.blog-details__content-text2 .text-box p {
    margin-top: 12px;
}

.subscribe-one__inner .title-box p {
    color: var(--thm-white);
    max-width: 560px;
    margin: 16px auto 0;
}

/*====================================================================
    Header nav links: 20px

    header.css sets the top-level nav links (.navbar-wrap ul li a) to
    16px. Only the top-level links are enlarged here (>ul>li>a): the
    dropdown items keep their own 15px size (.sub-menu li a), and the
    mobile menu is unaffected because main.js clones the menu outside
    .navbar-wrap. Same specificity as the header.css rule, so it wins by
    loading later. The links' line-height (20px) and the bar's height
    (set by the 140px logo) need no change.
======================================================================*/
.navbar-wrap > ul > li > a {
    font-size: 20px;
}

/*====================================================================
    Header dropdown (Products): 5px rounded corners

    header.css sets .sub-menu to border-radius: 0. overflow: hidden is
    needed alongside the radius so the solid hover highlight on the
    first and last items is clipped to the rounded corners instead of
    poking out square. It would also clip a second-level flyout
    (.sub-menu .sub-menu), but no CTI page has one. Same selector as
    the header.css rule, so it wins by loading later. The mobile menu
    is unaffected because it is cloned outside .navbar-wrap.
======================================================================*/
.navbar-wrap ul li .sub-menu {
    border-radius: 5px;
    overflow: hidden;
}

/*====================================================================
    Compact sticky header (desktop)

    Unscrolled, the header keeps the full 140px logo over the hero (the
    bar's height is set by the logo). Once main.js adds .sticky-menu
    (after 245px of scroll) the bar compacts to ~76px: the logo drops
    to 60px and the nav links' vertical padding to 28px (header.css
    gives them 35px, which was what made the old sticky bar 90px+).

    - The logo's slot is pinned at 140px wide (min-width) so the nav,
      which is centered between the logo and the right-hand cluster,
      doesn't slide sideways when the logo shrinks.
    - The sticky background is the theme's own --thm-black-bg at 92%
      opacity with a backdrop blur, plus a hairline bottom edge, so it
      reads as a light bar instead of a solid block. color-mix() keeps it
      theme-aware; a browser without it ignores the declaration and keeps
      header.css's solid background.
    - Desktop only: below 1200px responsive.css makes .sticky-menu
      position: static, so the header never sticks there.
======================================================================*/
@media only screen and (min-width: 1200px) {
    .main-header-one .logo-box-one {
        min-width: 140px;
    }

    .sticky-menu .logo-box-one img.logo-mark {
        max-height: 60px;
    }

    .sticky-menu .navbar-wrap > ul > li > a {
        padding: 28px 0;
    }

    .sticky-menu {
        background-color: color-mix(in srgb, var(--thm-black-bg) 92%, transparent);
        -webkit-backdrop-filter: blur(10px);
        backdrop-filter: blur(10px);
        box-shadow: 0 1px 0 rgba(255, 255, 255, 0.06), 0 8px 24px rgba(0, 0, 0, 0.25);
    }

    html[theme="light"] .sticky-menu {
        box-shadow: 0 1px 0 rgba(0, 0, 0, 0.08), 0 8px 24px rgba(0, 0, 0, 0.1);
    }
}

/*====================================================================
    Compact header (tablet / phone)

    Below 1200px the header is a normal in-flow bar (it never sticks),
    so instead of compacting on scroll it is simply shorter all the
    time: a 56px logo and a hamburger with 17px of vertical padding
    (header.css gives it 29px/30px) make the bar ~64px instead of the
    140px the full logo forced. The slide-out menu panel keeps its own
    full-size logo.
======================================================================*/
@media only screen and (max-width: 1199px) {
    .main-header-one .logo-box-one img.logo-mark {
        max-height: 56px;
    }

    .menu-area .mobile-nav-toggler {
        padding: 17px 0;
    }
}

/*====================================================================
    Theme toggle, light theme: flat amber sun, no button background

    In light theme the toggle shows assets/icons/sun-amber.svg (a disc
    with eight short rays, #E2A03F, 24x24 artwork) with no circular
    backdrop, instead of the one-color masked starburst on a gray
    circle. It is a real two-part colored image, so it is drawn with
    background-image and the mask above is switched off (the
    mask + background-color recipe can only paint one flat color).
    One amber reads on every surface the sun appears on (the dark home
    hero, the blue page banners, the light sticky bar, the white mobile
    menu panel), so the per-context icon colors above don't apply to
    it. The selector lists mirror each existing light-mode context so
    these win over them at equal specificity by coming later. The icon
    box is inset 7px to make it 24px inside the 38px button. The dark
    theme's moon keeps its mask icon but loses the circle too (below).
======================================================================*/
html[theme="light"] .theme-toggle-btn,
html[theme="light"] .main-header-one .theme-toggle-btn,
html[theme="light"] .main-header-two .theme-toggle-btn,
html[theme="light"] .sticky-menu .theme-toggle-btn,
html[theme="light"] .mobile-menu .menu-box .theme-toggle-btn {
    background-color: transparent;
}

html[theme="light"] .theme-toggle-btn::before,
html[theme="light"] .main-header-one .theme-toggle-btn::before,
html[theme="light"] .main-header-two .theme-toggle-btn::before,
html[theme="light"] .sticky-menu .theme-toggle-btn::before,
html[theme="light"] .mobile-menu .menu-box .theme-toggle-btn::before {
    inset: 7px;
    background-color: transparent;
    background-image: url("../icons/sun-amber.svg");
    background-size: contain;
    background-repeat: no-repeat;
    background-position: center;
    -webkit-mask-image: none;
    mask-image: none;
}

/* Dark theme: the moon has no backdrop either. The default button has a
   translucent white circle, and the mobile menu panel (always white)
   gives it a light-gray one; the longer selector beats that panel rule's
   specificity. Only the circle goes; the moon's size and color are as
   before. */
html[theme="dark"] .theme-toggle-btn,
html[theme="dark"] .mobile-menu .menu-box .theme-toggle-btn {
    background-color: transparent;
}

/*====================================================================
    Midnight palette: always-dark and always-light surfaces

    The tokens at the top of this file follow the theme, but some
    surfaces do not: heroes, page banners, the call-to-action band, the
    "How It Works" band and the footer stay dark in BOTH themes, and the
    mobile menu panel stays white in both. Re-declaring the tokens on
    those containers means everything inside them (text, links, buttons,
    icons) resolves to the right values regardless of the page theme,
    instead of needing a light-mode patch per component.
======================================================================*/
.platform-hero,
.product-hero,
.page-header,
.subscribe-one,
.footer-one,
.footer-one__two,
.working-process-one {
    --thm-primary-color: #2FA5FC;
    --thm-secondary-color: #1790F6;
    --thm-body-font-color: #C9D3E6;
    --thm-paragraph-color: #C9D3E6;
    --thm-heading-font-color: #FFFFFF;
    --thm-black-bg: #0C1B3D;
    --black-bg: #0C1B3D;
    --cti-on-primary: #011238;
}

.mobile-menu {
    --thm-primary-color: #0474DB;
    --thm-secondary-color: #014CA6;
    --cti-on-primary: #FFFFFF;
}

::selection {
    background: var(--thm-primary-color);
    color: var(--cti-on-primary);
}

/*====================================================================
    Midnight palette: buttons

    Primary fills are sky blue in dark theme, which only holds NAVY text
    (white on #2FA5FC is 2.7:1), so every primary-filled control takes
    --cti-on-primary for its text and glyph (navy on sky, white on the
    light theme's #0474DB). The hover swipe is the bright blue
    (--thm-secondary-color) and keeps the same text color.
======================================================================*/
.button-style-1,
.button-style-1:hover,
.platform-hero__btn--solid,
.platform-hero__btn--solid:hover,
.scroll-top,
.services-tabs__nav .nav-link.active {
    color: var(--cti-on-primary);
}

/* "Request A Consultation" (.secondary-white) is the SECONDARY button
   now: transparent with a sky outline and white text, filling with sky
   (navy text) on hover. The outline is an inset shadow so the button
   keeps its size. Literal colors, not tokens: it only ever sits on the
   dark call-to-action band, in both themes. */
.button-style-1.secondary-white {
    background-color: transparent;
    box-shadow: inset 0 0 0 1.5px #2FA5FC;
    color: #FFFFFF;
}

.secondary-white:before,
.secondary-white:after {
    background-color: #2FA5FC;
}

.button-style-1.secondary-white:hover {
    color: #011238;
}

/* The band's second button (white outline, see its comment above)
   needs white text now that .button-style-1 text is navy by default,
   and a navy label when it fills white on hover. */
.subscribe-one__btn-outline {
    color: #FFFFFF;
}

.subscribe-one__btn-outline:hover {
    color: #011238;
}

/*====================================================================
    Midnight palette: call-to-action band

    Was a solid cerulean block. Now the Midnight band: card navy fading
    to logo navy, with a thin sky outline (inset shadow, so the band's
    size is unchanged). The circuit artwork (.shape1) stays on top.
======================================================================*/
.subscribe-one__inner {
    background: linear-gradient(110deg, #0C1B3D 0%, #012962 100%);
    box-shadow: inset 0 0 0 1px rgba(47, 165, 252, 0.35);
}

/*====================================================================
    Midnight palette: card icon squares (logo blue)

    The service / "What You Get" card icon was a bare 50px glyph (white,
    turning primary on hover). It is now a 56px rounded square filled
    with the logo blue (--cti-ico, #0474DB) and a white glyph, as in the
    approved palette preview. The glyph stays white in both themes and on
    hover (the light-theme rule earlier in this file recolors it to the
    primary blue, which would vanish on this fill).
======================================================================*/
.services-one__single-title .icon {
    display: grid;
    place-items: center;
    flex: none;
    width: 56px;
    height: 56px;
    margin-right: 20px;
    border-radius: 10px;
    background: var(--cti-ico);
}

.services-one__single-title .icon span,
html[theme="light"] .services-one__single-title .icon span,
.services-one__single:hover .services-one__single-title .icon span {
    color: #FFFFFF;
    font-size: 26px;
    line-height: 1;
}

.services-one__single:hover .services-one__single-title .icon span {
    transform: scale(0.92);
}

/*====================================================================
    Midnight palette: fixes found by the contrast audit

    A rendered-text contrast audit (every text element vs. the
    background actually behind it, all pages, both themes) turned up
    these; everything else passed.
    - Outline buttons in pricing cards (.pricing-btn .button-style-1)
      are transparent, so their text must follow the page (white in dark,
      navy in light) and only take the on-primary color once the hover
      fill arrives.
    - White text on primary fills (comparison table "popular" header,
      dashboard sidebar logo chip) becomes --cti-on-primary.
    - The faint mock-dashboard captions were already under 4.5:1 before
      the palette change; darkened / made less transparent.
    - The decorative "01/02/03" numerals sit on the always-dark process
      band, so the light theme's near-black tint is replaced by a white
      one.
======================================================================*/
/* "Read More" (.button-style-2) hardcoded a near-black fill
   (#141416) with a primary-colored icon. It is now a primary button
   like the approved preview: primary fill, on-primary text and icon,
   bright secondary fill on hover. */
.button-style-2 {
    background-color: var(--thm-primary-color);
    color: var(--cti-on-primary);
}

.button-style-2 i {
    color: var(--cti-on-primary);
}

.button-style-2:hover {
    background-color: var(--thm-secondary-color);
    color: var(--cti-on-primary);
}

/* The footer's social-icon chip is a primary fill, so its glyphs take
   the on-primary color too (white on sky is 2.7:1). */
.footer-social-link a,
.footer-social-link a i {
    color: var(--cti-on-primary);
}

.pricing-btn .button-style-1 {
    color: var(--thm-heading-font-color);
}

.pricing-btn .button-style-1:hover {
    color: var(--cti-on-primary);
}

.pricing-compare thead th.popular,
.pricing-compare thead th.popular .plan-name,
.pricing-compare thead th .plan-badge {
    color: var(--cti-on-primary);
}

.pricing-compare tbody td.popular {
    background: rgba(47, 165, 252, 0.08);
}

.dashboard-preview__sidebar-logo {
    color: var(--cti-on-primary);
}

.platform-hero__mockup-label,
.platform-hero__stat-name {
    color: #63708A;
}

.dashboard-preview__chart-label {
    color: rgba(255, 255, 255, 0.6);
}

html[theme="light"] .working-process-one__big-text {
    color: rgba(255, 255, 255, 0.1);
}

/*====================================================================
    Midnight palette: icon fills are logo blue

    Same rule as the card icon squares: a white glyph on the sky
    primary is only 2.7:1, so icon chips and badges that were filled
    with --thm-primary-color take the logo-blue --cti-ico fill (white
    glyph, 4.6:1) instead. Found by auditing glyph-vs-fill contrast:
    the contact-page icon circles, the "+" badge on the About photos and
    the circle behind each "How It Works" step icon. Also lifted two
    hardcoded grays that were under 3:1 on the navy surfaces: the
    "not included" crosses in the comparison table and the dashboard
    mockup's sidebar icons.
======================================================================*/
.contact-page__contact-info ul li .icon-box,
.about-one__img-icon a,
.working-process-one__title .circle {
    background: var(--cti-ico);
}

.pricing-compare tbody td i.fa-xmark {
    color: #7A87A6;
}

.dashboard-preview__sidebar-nav li {
    color: rgba(255, 255, 255, 0.55);
}

/* Hairlines: the template hardcoded dark grays (#363638, #424244,
   #525254, #3d3d3f) that look off against navy. They now use
   --cti-line (sky-tinted in dark, soft blue-gray in light). The footer
   is dark in both themes, so its rule is a literal sky tint. */
.footer-bottom,
.footer-one__two .footer-bottom__inner {
    border-top-color: rgba(47, 165, 252, 0.18);
}

.blog-details__content-text1 {
    border-top-color: var(--cti-line);
}

.sidebar__category-list li {
    border-bottom-color: var(--cti-line);
}

.pricing-compare thead th,
.pricing-compare tbody td {
    border-bottom-color: var(--cti-line);
}

/*====================================================================
    Mobile polish, part 1: home page, product heroes, footer
    (2026-10-26; part 2 for the other content pages follows below)

    Below 768px the home page was the desktop layout simply stacked: a
    hero that kept 160px of top padding for the overlay header (which
    only exists from 1200px up, so there was a dead gap under the
    in-flow bar) followed by the whole dashboard mockup, six 40px-padded
    product cards with a 50px row-gap, a four-photo collage whose
    195-315px source images were stretched to ~400px each (about two
    screens of scrolling), and a footer with 120px of top padding, a
    140px logo and 60px margins around each stacked widget.

    Everything here is scoped to max-width: 767px, so tablet and desktop
    are unchanged. Mind the class names when scoping: .platform-hero__*
    is NOT home-only. The same markup is the dashboard card in every
    .product-hero, the content of the "See X In Action" tab mockups
    (.services-tabs__mockup, Financial and Inventory) and the title/text/
    buttons of the compact banners. Mockup rules are therefore keyed to
    :is(.platform-hero, .product-hero), never to the bare class; the
    shared hero type/button rules are deliberately for all of them. The
    footer is shared, and every page uses the same .footer-one--navy
    markup, so it applies site-wide.

    - Hero (home + product pages): the mockup becomes a swipeable strip
      of stat tiles (CSS only, using the existing markup: the column and
      stat-grid wrappers become display: contents so the tiles are flex
      children of the scroller; red alert tiles and each grid's 4th tile
      are hidden, plus the header, labels and charts).
    - Product cards (home + .services-one--services): tighter padding,
      smaller icon/title, 16px gap.
    - About (index.html, about.html via .about-one--compact): the four
      photos as a 2x2 grid of short 4:3 tiles (4:3 avoids upscaling the
      195x130 photo). Photos first on the home page; about.html adds
      .about-one--text-first to put its story text above them.
    - Footer: centered brand block, no Quick Links, Products as two
      side-by-side lists, shorter logo and spacing.
======================================================================*/

/* Desktop value of the two About paragraphs (was an inline style). */
.about-one__lead {
    font-size: 18px;
}

@media only screen and (max-width: 767px) {

    /* --- Hero --- */
    .platform-hero {
        padding: 44px 0 52px;
    }

    /* minmax(0, 1fr), not 1fr: a plain 1fr track won't shrink below
       its content's min-content width, and the stat strip below is as
       wide as all four tiles even though it scrolls. */
    .platform-hero__inner {
        grid-template-columns: minmax(0, 1fr);
        gap: 32px;
    }

    .platform-hero__text {
        font-size: 16px;
        line-height: 26px;
        margin-top: 16px;
    }

    .platform-hero__btn-box {
        gap: 12px;
        margin-top: 26px;
    }

    .platform-hero__btn {
        min-height: 48px;
        padding: 12px 22px;
        justify-content: center;
    }

    /* Dashboard mockup -> swipeable stat strip, in the two heroes only
       (:is() keeps the specificity of a single class, the same as
       .product-hero .platform-hero__mockup earlier in this file, so
       these win by coming later). Every selector below is scoped on
       purpose: the same .platform-hero__mockup / __stat markup is also
       used by the in-page "See X In Action" tab mockups
       (.services-tabs__mockup on the Financial and Inventory pages),
       which are not heroes and must keep their full card.

       The strip bleeds to the screen edges (negative margin cancels the
       container's 15px padding, the scroller's own padding puts it
       back) so the tiles slide off-screen instead of being clipped by
       the gutter. */
    :is(.platform-hero, .product-hero) .platform-hero__mockup {
        margin: 0 -15px;
        max-width: none;
        padding: 0;
        border-radius: 0;
        background: transparent;
        box-shadow: none;
    }

    :is(.platform-hero, .product-hero) .platform-hero__mockup-header,
    :is(.platform-hero, .product-hero) .platform-hero__mockup-label,
    :is(.platform-hero, .product-hero) .platform-hero__mockup-col:nth-child(2) {
        display: none;
    }

    :is(.platform-hero, .product-hero) .platform-hero__mockup-body {
        display: flex;
        gap: 10px;
        padding: 0 15px 4px;
        overflow-x: auto;
        scroll-snap-type: x mandatory;
        scroll-padding-left: 15px;
        scrollbar-width: none;
    }

    :is(.platform-hero, .product-hero) .platform-hero__mockup-body::-webkit-scrollbar {
        display: none;
    }

    :is(.platform-hero, .product-hero) .platform-hero__mockup-col:first-child,
    :is(.platform-hero, .product-hero) .platform-hero__stat-grid {
        display: contents;
    }

    /* Which tiles survive: never the red alert tiles (Overdue,
       Unassigned, Low Stock...), and never a grid's 4th tile, so a
       grid contributes at most three. On the home hero that is Invoices
       Sent, Collected, Work Orders Open and Completed MTD. */
    :is(.platform-hero, .product-hero) .platform-hero__stat--red,
    :is(.platform-hero, .product-hero) .platform-hero__stat:nth-child(4) {
        display: none;
    }

    :is(.platform-hero, .product-hero) .platform-hero__stat {
        flex: 0 0 148px;
        scroll-snap-align: start;
        padding: 14px 16px;
    }

    :is(.platform-hero, .product-hero) .platform-hero__stat-num {
        font-size: 26px;
    }

    :is(.platform-hero, .product-hero) .platform-hero__stat-name {
        font-size: 12px;
    }

    /* Product heroes: the 130px top padding clears the overlay header
       that only exists from 1200px up, and the 460px floor was sized
       for the full dashboard card. Neither applies to the strip. The
       compact banners (About, Pricing, FAQ, Contact) keep their own
       260px floor. */
    .product-hero:not(.product-hero--compact) {
        min-height: 0;
        padding: 44px 0 40px;
    }

    /* --- Product cards --- */
    #platform-capabilities {
        padding-top: 48px;
    }

    :is(#platform-capabilities, .services-one--services) .section-title {
        padding-bottom: 28px;
    }

    :is(#platform-capabilities, .services-one--services) .section-title h5 {
        font-size: 13px;
        line-height: 22px;
        letter-spacing: 2px;
    }

    :is(#platform-capabilities, .services-one--services) .section-title h2 {
        font-size: 28px;
    }

    /* Direct-child rows only (the card grids): the tab rows deeper in
       the Financial / Inventory "In Action" sections keep their own gap
       (set further down). */
    :is(#platform-capabilities, .services-one--services) > .container > .row {
        row-gap: 16px;
    }

    :is(#platform-capabilities, .services-one--services) .services-one__single {
        padding: 22px;
        margin-bottom: 0;
    }

    :is(#platform-capabilities, .services-one--services) .services-one__single-title .icon {
        width: 44px;
        height: 44px;
        margin-right: 14px;
        border-radius: 9px;
    }

    :is(#platform-capabilities, .services-one--services) .services-one__single-title .icon span {
        font-size: 22px;
    }

    :is(#platform-capabilities, .services-one--services) .services-one__single-title h3 {
        font-size: 20px;
        line-height: 26px;
    }

    :is(#platform-capabilities, .services-one--services) .services-one__single-content {
        padding-top: 14px;
    }

    :is(#platform-capabilities, .services-one--services) .services-one__single-content p {
        font-size: 16px;
        line-height: 26px;
    }

    /* Cards are one per row here, so the margin-top: auto that bottom-
       aligns the button across a side-by-side row (see "equal height"
       above) has nothing to align and would leave the button flush
       against the text on the tallest card. */
    :is(#platform-capabilities, .services-one--services) .services-one__single-content .btn-box {
        margin-top: 18px;
    }

    :is(#platform-capabilities, .services-one--services) .button-style-2 {
        padding: 10px 22px;
        font-size: 14px;
        line-height: 24px;
    }

    /* --- About (home and about pages, via .about-one--compact) --- */
    .about-one--compact {
        padding: 56px 0 64px;
    }

    /* Photos come first (the DOM order), as on the home page. About
       opts into text-first with .about-one--text-first; the photos
       are decorative, so the visual order does not affect reading
       order. */
    .about-one--text-first .row > .col-xl-6:first-child {
        order: 2;
    }

    .about-one--compact .about-one__content {
        padding-top: 0;
    }

    .about-one--compact .about-one__content .section-title {
        padding-bottom: 18px;
    }

    .about-one--compact .section-title h2 {
        font-size: 28px;
    }

    .about-one__lead {
        font-size: 16px;
        line-height: 26px;
    }

    .about-one--compact .about-one__content-features {
        margin-top: 24px;
    }

    .about-one--compact .about-one__content-features ul {
        max-width: none;
    }

    .about-one--compact .about-one__content-features ul li {
        padding: 14px 18px;
    }

    .about-one--compact .about-one__content-features ul li .inner .icon {
        margin-right: 14px;
    }

    .about-one--compact .about-one__content-features ul li .inner .icon span {
        font-size: 32px;
        line-height: 32px;
    }

    .about-one--compact .about-one__content-features ul li .inner h3 {
        font-size: 18px;
        line-height: 26px;
    }

    .about-one--compact .about-one__content-text .bottom-text {
        padding-top: 20px;
    }

    /* Photos: 2x2 grid of 4:3 tiles. li:nth-child(n) is a specificity
       bump so these beat about.css's per-image rounded corners. */
    .about-one--compact .about-one__img {
        max-width: none;
        margin: 0 0 28px;
        padding: 0;
    }

    .about-one--text-first .about-one__img {
        margin: 28px 0 0;
    }

    .about-one--compact .about-one__img-top ul,
    .about-one--compact .about-one__img-bottom ul {
        display: grid;
        grid-template-columns: 1fr 1fr;
        align-items: stretch;
        gap: 10px;
        margin: 0;
    }

    .about-one--compact .about-one__img-top ul li,
    .about-one--compact .about-one__img-bottom ul li,
    .about-one--compact .about-one__img-bottom ul li + li {
        float: none;
        padding: 0;
        margin: 0;
    }

    .about-one--compact .about-one__img-bottom {
        margin-top: 10px;
    }

    .about-one--compact .about-one__img-top li:nth-child(1) .about-one__single-img-box::before {
        display: none;
    }

    .about-one--compact .about-one__img ul li:nth-child(n) .about-one__single-img-box .inner img {
        display: block;
        width: 100%;
        aspect-ratio: 4 / 3;
        object-fit: cover;
        border-radius: 12px;
    }

    /* --- Footer (shared by all pages) --- */
    .footer-one--navy .footer-main {
        padding: 36px 0 20px;
    }

    .footer-one--navy .footer-main .row {
        display: grid;
        grid-template-columns: minmax(0, 1fr);
        row-gap: 28px;
    }

    /* Quick Links (the 2nd widget) only repeats the hamburger menu, so
       it is hidden on phones. */
    .footer-one--navy .footer-main .row > div:nth-child(2) {
        display: none;
    }

    /* Products: two side-by-side lists, filled column by column (the
       first three entries on the left, the last three on the right).
       The three rows are fixed on purpose; a 7th product would start a
       third column, so change the 3 if the list ever grows. */
    .footer-one--navy .footer-widget-links ul {
        display: grid;
        grid-template-columns: repeat(2, minmax(0, 1fr));
        grid-template-rows: repeat(3, auto);
        grid-auto-flow: column;
        column-gap: 20px;
    }

    .footer-one--navy .single-footer-widget,
    .footer-one--navy .single-footer-widget.ml50,
    .footer-one--navy .single-footer-widget.ml15 {
        margin: 0;
    }

    /* Brand block: logo on the left, tagline and the social pill
       stacked to its right (the logo spans both rows of the grid). */
    .footer-one--navy .our-company-info {
        display: grid;
        grid-template-columns: auto minmax(0, 1fr);
        column-gap: 16px;
        align-items: center;
        text-align: left;
    }

    .footer-one--navy .footer-logo-one {
        grid-row: 1 / span 2;
    }

    .footer-one--navy .footer-logo-one img.logo-mark {
        max-height: 80px;
    }

    .footer-one--navy .our-company-info .text {
        grid-column: 2;
        margin: 0;
    }

    .footer-one--navy .our-company-info .text p {
        font-size: 14px;
        line-height: 20px;
    }

    /* Social pill: shrink-wraps its three icons (was a fixed 170px
       wide, 50px tall). The icon links are 34px tall so they stay an
       easy tap target. */
    .footer-one--navy .footer-social-link {
        grid-column: 2;
        width: fit-content;
        margin: 10px 0 0;
        padding: 0;
    }

    .footer-one--navy .footer-social-link ul {
        display: flex;
    }

    .footer-one--navy .footer-social-link ul li {
        float: none;
        line-height: 34px;
    }

    .footer-one--navy .footer-social-link ul li a {
        padding: 0 14px;
        font-size: 15px;
    }

    .footer-one--navy .single-footer-widget .title h3 {
        font-size: 20px;
        line-height: 26px;
    }

    .footer-one--navy .footer-widget-links,
    .footer-one--navy .footer-widget-contact-info {
        padding-top: 14px;
    }

    .footer-one--navy .footer-widget-links ul li a {
        align-items: baseline;
        font-size: 15px;
        line-height: 24px;
    }

    .footer-one--navy .footer-widget-links ul li a i {
        margin-right: 8px;
        font-size: 12px;
    }

    /* Contact Us: 30px icons, 6px between rows (was 45px / 19px), and
       the address on one line (the <br> after the street is hidden;
       the source has a space after it, so the words stay separated). */
    .footer-one--navy .footer-widget-contact-info ul li + li {
        margin-top: 6px;
    }

    .footer-one--navy .footer-widget-contact-info ul li .icon-box {
        flex: 0 0 30px;
        width: 30px;
        height: 30px;
        margin-right: 12px;
    }

    .footer-one--navy .footer-widget-contact-info ul li .icon-box span {
        font-size: 16px;
    }

    .footer-one--navy .footer-widget-contact-info ul li .text-box p {
        font-size: 15px;
        line-height: 22px;
    }

    .footer-one--navy .footer-widget-contact-info ul li .text-box p br {
        display: none;
    }

    /* Copyright bar: 13px text and tight padding (was ~143px tall with
       the since-removed Contact Us link under it). */
    .footer-one--navy .footer-main {
        padding-bottom: 12px;
    }

    .footer-one--navy .footer-bottom {
        padding: 14px 0 12px;
    }

    .footer-one--navy .footer-bottom .copyright-text {
        margin-bottom: 0;
    }

    .footer-one--navy .footer-bottom .copyright-text p {
        font-size: 13px;
        line-height: 20px;
    }
}

@media only screen and (max-width: 480px) {
    .platform-hero__title {
        font-size: 32px;
    }

    /* Buttons stack here (rule above); the primary action goes first. */
    .platform-hero__btn--solid {
        order: -1;
    }
}

/* 360px-class phones: at 13px the copyright line is ~335px wide in a
   330px container and "Reserved" wraps onto a line of its own. */
@media only screen and (max-width: 380px) {
    .footer-one--navy .footer-bottom .copyright-text p {
        font-size: 12px;
    }
}

/*====================================================================
    Mobile polish, part 2: product pages and the other content pages
    (2026-10-26)

    The same stacked-desktop problem as the home page, on every
    products-*.html page, pricing, about, contact and faq: every
    section keeps its 120px top/bottom padding, cards keep 40px of
    padding and a 50px gap, so a product page runs 9,000-12,000px at
    phone width. The cards, process steps, FAQ accordion and spacing
    below take the same tightening the home page got. Everything is
    inside max-width: 767px, so tablet and desktop are unchanged.

    The product-hero strip and the shared card rules live in part 1
    above (they are keyed to .product-hero / .services-one--services).

    - The one inline padding left alone: .subscribe-one and
      .dashboard-preview carry style="padding-bottom: 80px", which
      only !important could beat.
    - Hosting: the 4-plan comparison table is >=720px wide (min-width),
      so on phones it is replaced by .plan-cards (markup in
      products-website-hosting.html, hidden from 768px up with
      d-md-none while the table is d-none d-md-block).
======================================================================*/
@media only screen and (max-width: 767px) {

    /* --- Section rhythm: 120px -> ~56px --- */
    .services-one--services {
        padding: 56px 0 40px;
    }

    .blog-details {
        padding: 48px 0 56px;
    }

    .blog-details.no-bottom-padding {
        padding: 48px 0 0;
    }

    .working-process-one,
    .financial-controls,
    .connected-platform,
    .contact-page {
        padding-top: 56px;
        padding-bottom: 56px;
    }

    .financial-controls--single {
        padding-top: 40px;
    }

    .faq-one {
        padding: 56px 0 48px;
    }

    .pricing-compare {
        padding: 56px 0 24px;
    }

    .pricing-page__intro {
        padding-top: 48px;
    }

    .pricing-page__callout {
        padding-bottom: 56px;
    }

    .about-two {
        padding-bottom: 56px;
    }

    /* Section headings in the sections above (the cards/tabs section is
       covered by the :is() rules in part 1). */
    :is(.working-process-one, .faq-one, .financial-controls, .connected-platform, .pricing-compare, .pricing-page__intro, .about-two) .section-title {
        padding-bottom: 28px;
    }

    :is(.working-process-one, .faq-one, .financial-controls, .connected-platform, .pricing-compare, .pricing-page__intro, .about-two) .section-title h2 {
        font-size: 28px;
    }

    :is(.working-process-one, .faq-one, .financial-controls, .connected-platform, .pricing-compare, .pricing-page__intro, .about-two) .section-title h5 {
        font-size: 13px;
        line-height: 22px;
        letter-spacing: 2px;
    }

    .pricing-compare__intro {
        margin-bottom: 28px;
    }

    /* --- "How It Works" steps --- */
    .working-process-one .row {
        row-gap: 16px;
    }

    .working-process-one__single {
        padding: 22px 22px 48px;
    }

    .working-process-one__title {
        margin-bottom: 14px;
        padding-left: 0;
    }

    .working-process-one__title .circle {
        width: 52px;
        height: 52px;
        margin-right: 14px;
    }

    .working-process-one__title .icon {
        top: 12px;
    }

    .working-process-one__title .icon span {
        font-size: 48px;
        line-height: 48px;
    }

    .working-process-one__text {
        margin-bottom: 0;
    }

    .working-process-one__big-text {
        right: 16px;
        bottom: 12px;
        font-size: 44px;
    }

    /* --- FAQ accordion --- */
    .faq-one__accrodion .accrodion {
        margin-bottom: 12px;
    }

    .faq-one__accrodion .accrodion .accrodion-title {
        padding-top: 14px;
        padding-bottom: 12px;
    }

    .faq-one__accrodion .accrodion .accrodion-title h2 {
        font-size: 18px;
        line-height: 26px;
    }

    .faq-one__accrodion .accrodion .accrodion-content {
        padding: 16px 0 8px;
    }

    /* --- Financial controls / icon lists --- */
    .control-list li {
        gap: 14px;
        margin-bottom: 20px;
    }

    .control-list li .icon {
        flex: 0 0 44px;
        width: 44px;
        height: 44px;
    }

    .financial-controls .row > .col-lg-6 + .col-lg-6 .control-list {
        margin-top: 20px;
    }

    /* --- "See X In Action" tabs (Financial, Inventory) --- */
    .services-tabs__intro-text {
        margin: -8px auto 28px;
    }

    .services-tabs__nav {
        gap: 8px;
        margin-bottom: 28px;
    }

    .services-tabs__nav .nav-link {
        padding: 11px 16px;
        font-size: 14px;
    }

    .services-tabs__content-inner {
        padding: 20px;
    }

    .services-tabs__content-inner .row {
        row-gap: 24px;
    }

    .services-tabs__text h3 {
        font-size: 24px;
    }

    /* --- Property Management: the dashboard screenshot is unreadable at
       phone width but already opens a lightbox on tap (Magnific Popup,
       .popup-image), so say so. --- */
    .dashboard-preview__screenshot-link {
        position: relative;
    }

    .dashboard-preview__screenshot-link::after {
        content: "Tap to enlarge";
        position: absolute;
        right: 10px;
        bottom: 10px;
        padding: 6px 12px;
        border-radius: 20px;
        background: rgba(1, 18, 56, 0.85);
        color: #FFFFFF;
        font-size: 12px;
        font-weight: 700;
        line-height: 1.2;
        pointer-events: none;
    }

    /* --- About (also uses .about-one--compact, see part 1) --- */
    .about-one--compact .about-two__content {
        margin-top: 0;
    }

    .about-one--compact .about-two__content .section-title {
        padding-bottom: 18px;
    }

    .about-two .about-one__content {
        padding-top: 0;
    }

    .about-two .about-one__content .section-title {
        padding-bottom: 18px;
    }

    .about-two .about-two__img {
        margin-top: 28px;
    }

    /* --- Contact --- */
    .contact-page__form {
        margin-right: 0;
    }

    .contact-page__form .title-box {
        margin-bottom: 20px;
    }

    .contact-page__form .title-box h2,
    .contact-page__contact-info .title-box h2 {
        font-size: 28px;
        line-height: 36px;
    }

    .contact-page__form-btn button {
        width: 100%;
        min-height: 52px;
        justify-content: center;
    }

    /* --- Hosting plan cards --- */
    .plan-cards {
        display: grid;
        gap: 24px;
    }

    .plan-card {
        position: relative;
        background: var(--thm-black-bg);
        border: 1px solid var(--cti-line);
        border-radius: 8px;
        padding: 22px;
    }

    .plan-card--popular {
        border-color: var(--thm-primary-color);
        box-shadow: inset 0 0 0 1px var(--thm-primary-color);
    }

    .plan-card__badge {
        position: absolute;
        top: -12px;
        left: 22px;
        padding: 4px 12px;
        border-radius: 20px;
        background: var(--thm-primary-color);
        color: var(--cti-on-primary);
        font-size: 12px;
        font-weight: 700;
        letter-spacing: 0.5px;
        line-height: 18px;
        text-transform: uppercase;
    }

    .plan-card__name {
        margin: 0;
        font-size: 24px;
        line-height: 30px;
    }

    .plan-card__price {
        margin: 10px 0 0;
        color: var(--thm-heading-font-color);
        font-family: var(--thm-heading-font-family);
        font-size: 34px;
        font-weight: 700;
        line-height: 1.1;
    }

    .plan-card__price span {
        color: var(--thm-body-font-color);
        font-size: 14px;
    }

    .plan-card__blurb {
        margin: 10px 0 0;
        font-size: 15px;
        line-height: 24px;
    }

    .plan-card .button-style-1 {
        width: 100%;
        margin-top: 18px;
        justify-content: center;
    }

    .plan-card__features {
        margin-top: 14px;
        border-top: 1px solid var(--cti-line);
    }

    .plan-card__features summary {
        display: flex;
        align-items: center;
        justify-content: space-between;
        padding: 14px 0 4px;
        color: var(--thm-primary-color);
        font-family: var(--thm-heading-font-family);
        font-size: 15px;
        font-weight: 700;
        cursor: pointer;
        list-style: none;
    }

    .plan-card__features summary::-webkit-details-marker {
        display: none;
    }

    .plan-card__features summary::after {
        content: "";
        width: 8px;
        height: 8px;
        margin-right: 4px;
        border-right: 2px solid currentColor;
        border-bottom: 2px solid currentColor;
        transform: rotate(45deg);
        transition: transform 200ms ease;
    }

    .plan-card__features[open] summary::after {
        transform: rotate(-135deg);
    }

    .plan-card__features h4 {
        margin: 16px 0 4px;
        color: var(--thm-primary-color);
        font-size: 13px;
        letter-spacing: 1px;
        line-height: 20px;
        text-transform: uppercase;
    }

    .plan-card__features li {
        display: flex;
        align-items: flex-start;
        gap: 10px;
        padding: 7px 0;
        border-bottom: 1px solid var(--cti-line);
        font-size: 15px;
        line-height: 22px;
    }

    .plan-card__features li:last-child {
        border-bottom: 0;
    }

    .plan-card__features li i {
        flex: 0 0 16px;
        margin-top: 4px;
        color: var(--thm-primary-color);
        font-size: 14px;
    }

    .plan-card__features li small {
        display: block;
        margin-top: 2px;
        font-size: 13px;
        line-height: 19px;
        opacity: 0.8;
    }

    .plan-card__features .is-no {
        opacity: 0.6;
    }

    .plan-card__features .is-no i {
        color: #7A87A6;
    }
}

/*====================================================================
    Sticky header below 1200px (where the hamburger replaces the nav)
    (2026-10-26)

    From 1200px up main.js adds .sticky-menu after 245px of scroll and
    header.css turns that into a fixed, compact bar. Below 1200px
    responsive.css sets .sticky-menu back to position: static, so the
    bar (logo + hamburger) scrolled away with the page and the menu was
    out of reach until the visitor scrolled all the way back up. It is
    now sticky from the start instead: position: sticky on the header
    element keeps it in the flow (no jump when it sticks, no spacer
    needed) and it is already the compact ~64px bar (see "Compact
    header (tablet / phone)"). .main-header already carries z-index
    99, above the page sections and the footer (z-index 10).

    The template's own scroll behavior is switched off here, because
    the class still toggles at any width: its menu_sticky animation
    would slide the whole bar up out of view and back down every time
    the page crossed 245px. The class is still useful as the "has been
    scrolled" signal, so it carries the hairline + soft shadow that
    separates the bar from the content under it (no shadow at the top
    of the page, where the bar sits above the hero).
======================================================================*/
@media only screen and (max-width: 1199px) {
    .main-header-one {
        position: sticky;
        top: 0;
    }

    .main-header-one .sticky-menu {
        animation: none;
        box-shadow: 0 1px 0 var(--cti-line), 0 6px 18px rgba(0, 0, 0, 0.18);
    }
}

/*====================================================================
    Contact form validation (2026-10-26)

    assets/js/ajax-form.js flags a bad field with .is-invalid and fills
    the .field-error span under it (the form has `novalidate`, so these
    replace the browser's own bubbles). --cti-error is a coral on the
    dark page and a deep red on the light one, both >= 4.5:1 as text on
    the page background.

    The inputs have `border: none` (contact.css), so the red "border" is
    an inset box-shadow ring: it keeps the field's size and follows its
    rounded corners. The message is absolutely positioned into the 30px
    bottom margin of .input-box, so showing or clearing an error never
    moves the fields below it.
======================================================================*/
.contact-page__form .input-box input.is-invalid,
.contact-page__form .input-box textarea.is-invalid {
    box-shadow: inset 0 0 0 2px var(--cti-error);
}

.contact-page__form .field-error {
    position: absolute;
    left: 2px;
    top: calc(100% + 5px);
    max-width: 100%;
    color: var(--cti-error);
    font-size: 13px;
    font-weight: 500;
    line-height: 18px;
}

.contact-page__form .field-error:empty {
    display: none;
}

/* While a message is being sent (ajax-form.js disables the button). */
.contact-page__form-btn button:disabled {
    opacity: 0.65;
    cursor: wait;
}

/* Honeypot field (contact.html): off-screen rather than display: none,
   because some bots skip fields that are display: none or hidden. It
   takes no space, so the form layout does not change. */
.contact-page__form .hp-field {
    position: absolute;
    left: -10000px;
    top: auto;
    width: 1px;
    height: 1px;
    overflow: hidden;
}

/* The server's own response (e.g. a failed send) and the success note. */
.contact-page__form .ajax-response {
    margin-top: 16px;
}

.contact-page__form .ajax-response.error {
    color: var(--cti-error);
}

.contact-page__form .ajax-response.success {
    color: var(--thm-primary-color);
}

/*====================================================================
    Call-to-action band buttons: hero-style hover (2026-10-28)

    The band's buttons ("Request A Consultation", and "See The System"
    on Financial) used .button-style-1's two-part sliding fill on hover,
    while the hero buttons above them simply fade (.platform-hero__btn,
    300ms). The owner asked for the hero's hover here; the resting look
    is unchanged. The sliding pseudo-elements are switched off, and:
    - Consultation (sky outline) fades to a sky fill with navy text,
    - See The System (white outline) gets the hero outline button's faint
      white tint and keeps its white text.
    Applies wherever the band appears (every product page, and About).
======================================================================*/
.subscribe-one .button-style-1 {
    transition: background-color 300ms ease, color 300ms ease;
}

.subscribe-one .button-style-1:before,
.subscribe-one .button-style-1:after {
    display: none;
}

.subscribe-one .button-style-1.secondary-white:hover {
    background-color: #2FA5FC;
    color: #011238;
}

.subscribe-one .subscribe-one__btn-outline:hover {
    background-color: rgba(255, 255, 255, 0.08);
    color: #FFFFFF;
}

/*====================================================================
    Product page text and tab sizes (2026-10-28)

    These four rules used to be an inline <style> in the <head> of
    products-financial-management.html only, so Inventory's identical
    "See X In Action" tabs and intro were smaller than Financial's.
    Moved here so every product page matches. They stay at the very end
    of this file (and unscoped by width) so they keep winning exactly as
    the inline block did, including over the phone rules above.
======================================================================*/
.blog-details__content-text1 p {
    font-size: 18px;
}

.services-tabs__intro-text.text-center {
    font-size: 20px;
}

.services-tabs__nav .nav-link {
    font-size: 17px;
}

.services-tabs__nav .nav-link.active {
    font-size: 19px;
}

/*====================================================================
    Privacy policy page and links to it (2026-10-30)

    privacy.html is plain reading text, so .legal-page is a single
    readable column (about 75 characters a line) with the template's
    list reset undone, using the theme tokens so it works in both
    themes. The link to it sits in every page's copyright bar; on
    phones the bar is already one full line at 12-13px (see "Mobile
    polish"), so there the link drops onto its own line instead of
    wrapping "Reserved" by itself.
======================================================================*/
.legal-page {
    padding: 100px 0 110px;
}

.legal-page__inner {
    max-width: 780px;
    margin: 0 auto;
}

.legal-page__updated {
    font-size: 14px;
    margin-bottom: 24px;
    opacity: 0.8;
}

.legal-page h2 {
    font-size: 28px;
    margin: 44px 0 14px;
}

.legal-page p,
.legal-page li {
    font-size: 17px;
    line-height: 29px;
    color: var(--thm-paragraph-color);
}

.legal-page p + p {
    margin-top: 14px;
}

.legal-page ul {
    margin: 0 0 14px;
    padding-left: 22px;
}

.legal-page ul li {
    list-style: disc;
    margin-bottom: 10px;
}

.legal-page ul li::marker {
    color: var(--thm-primary-color);
}

.legal-page strong {
    color: var(--thm-heading-font-color);
    font-weight: 600;
}

.legal-page a {
    color: var(--thm-primary-color);
    text-decoration: underline;
    text-underline-offset: 3px;
}

.legal-page a:hover {
    color: var(--thm-secondary-color);
}

.footer-one--navy .copyright-text p a {
    color: inherit;
    text-decoration: underline;
    text-underline-offset: 3px;
}

.footer-one--navy .copyright-text p a:hover {
    color: var(--thm-white);
}

.contact-page__privacy-note {
    margin-top: 16px;
    font-size: 14px;
    line-height: 22px;
}

.contact-page__privacy-note a {
    color: var(--thm-primary-color);
    text-decoration: underline;
    text-underline-offset: 3px;
}

@media only screen and (max-width: 767px) {
    .legal-page {
        padding: 48px 0 56px;
    }

    .legal-page h2 {
        font-size: 23px;
        margin-top: 34px;
    }

    .legal-page p,
    .legal-page li {
        font-size: 16px;
        line-height: 27px;
    }

    .footer-one--navy .copyright-text__sep {
        display: none;
    }

    .footer-one--navy .copyright-text p a {
        display: block;
        margin-top: 2px;
    }
}

/*====================================================================
    "Request a Demo" tab buttons: outline that fills (2026-10-30)

    The buttons inside the "See X In Action" tabs (.services-tabs__text,
    on Financial and Inventory) were solid primary fills with
    .button-style-1's two-part sliding hover. The owner asked for them
    to match the band's secondary button ("Request a Demo" on Field
    Operations, .secondary-white; see "Call-to-action band buttons"
    above): transparent with an inset outline, fading to a solid fill
    in 300ms. That button uses literal white text because the band is
    always dark; these sit on the page background, which is white in
    light theme, so they use tokens: in dark they match it exactly
    (sky outline, white text -> sky fill, navy text), in light it is a
    blue outline with navy text -> blue fill, white text.
======================================================================*/
.services-tabs__text .button-style-1 {
    background-color: transparent;
    box-shadow: inset 0 0 0 1.5px var(--thm-primary-color);
    color: var(--thm-heading-font-color);
    transition: background-color 300ms ease, color 300ms ease;
}

.services-tabs__text .button-style-1:before,
.services-tabs__text .button-style-1:after {
    display: none;
}

.services-tabs__text .button-style-1:hover {
    background-color: var(--thm-primary-color);
    color: var(--cti-on-primary);
}

/*======================================================================
    Contact map follows the theme (2026-10-30)
    contact.css always darkens the Google Maps embed with
    grayscale + invert, which suits the dark theme but left a dark map
    on the white light-theme page. In light theme, show the map in its
    normal colors.
======================================================================*/
html[theme="light"] .google-map-one__map {
    filter: none;
}
