
    /* ── Homepage: neutralize the surrounding layout chrome ───────────
       The layout wraps every public route in a Bootstrap `.container py-4`
       with a 9/12 + 3/12 grid (main + sidebar) and appends a `#content-box`
       that repeats the pageTrans title/description. For the premium
       landing page we want a full-bleed canvas, so we hide the extras and
       break the main column out to full viewport width.
       We target either `body:has(.aits-home)` (modern browsers) or the
       `aits-home-page` class dropped on <body> by the fallback script
       below — Safari <15.4 and Firefox <121 don't support :has(). */
    body:has(.aits-home) #content-box,
    body.aits-home-page #content-box,
    body:has(.aits-home) .sidebars,
    body.aits-home-page .sidebars,
    body:has(.aits-home) .page-wrapper .breadcrumb,
    body.aits-home-page .page-wrapper .breadcrumb,
    body:has(.aits-home) .page-wrapper > .page-content > #parallax,
    body.aits-home-page .page-wrapper > .page-content > #parallax { display: none !important; }

    body:has(.aits-home) .page-wrapper > .page-content > .container,
    body.aits-home-page .page-wrapper > .page-content > .container { max-width: 100% !important; padding: 0 !important; }
    body:has(.aits-home) .page-wrapper > .page-content > .container > .row,
    body.aits-home-page .page-wrapper > .page-content > .container > .row { margin: 0 !important; }
    body:has(.aits-home) .page-wrapper > .page-content > .container > .row > div,
    body.aits-home-page .page-wrapper > .page-content > .container > .row > div {
        flex: 0 0 100% !important; max-width: 100% !important; padding: 0 !important;
    }
    body:has(.aits-home) .page-home,
    body.aits-home-page .page-home { margin: 0 !important; padding: 0 !important; }

    /* ── Dark-mode surface, wrapper-level ───────────────────────────
       Force every wrapper on the home page to the same dark card
       surface the home page uses so the whole column reads as one
       continuous canvas from navbar edge to footer edge. */
    body.theme-dark:has(.aits-home),
    body.theme-dark:has(.aits-home) .page-wrapper,
    body.theme-dark:has(.aits-home) .page-wrapper > .page-content,
    body.theme-dark:has(.aits-home) .page-wrapper > .page-content > .container,
    body.theme-dark:has(.aits-home) .page-wrapper > .page-content > .container > .row,
    body.theme-dark:has(.aits-home) .page-wrapper > .page-content > .container > .row > div,
    body.theme-dark.aits-home-page,
    body.theme-dark.aits-home-page .page-wrapper,
    body.theme-dark.aits-home-page .page-wrapper > .page-content,
    body.theme-dark.aits-home-page .page-wrapper > .page-content > .container,
    body.theme-dark.aits-home-page .page-wrapper > .page-content > .container > .row,
    body.theme-dark.aits-home-page .page-wrapper > .page-content > .container > .row > div {
        background: var(--aits-bg) !important;
    }

    /* ── Root scope ─────────────────────────────────────────────────
       Every design token used here (colors, radii, shadows, motion) is
       declared once in custom.ltr.css on `body:not(.admin-shell)`. This
       block never redeclares tokens — it only consumes them. */
    .aits-home {
        font-family: 'Inter', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
        color: var(--aits-ink);
        background: var(--aits-card);
        line-height: 1.6;
    }
    .aits-home *,
    .aits-home *::before,
    .aits-home *::after { box-sizing: border-box; }
    .aits-home a { text-decoration: none; color: inherit; }
    .aits-home a:hover { text-decoration: none; }
    .aits-home img { max-width: 100%; height: auto; display: block; }

    /* Dark: keep container transparent so section gradients bleed edge-to-edge */
    body.theme-dark .aits-home { background: var(--aits-bg); }
    body.theme-dark .aits-home .aits-container { background: transparent; }

    /* ── Container — 1240 px per design.md §4 ─────────────────────────
       ⚠️ This padding is the INNER inset of each `section.aits-*` (hero,
       directory, trust), not a page gutter — every .aits-container is a child
       of one of those sections. It is also a `.container > .row > .col-lg-9`
       sidebar page, so it is not meant to align with the header brand.
       Stripped on 2026-08-11 during a sitewide alignment pass and restored
       the same day; don't remove it again. */
    .aits-container {
        width: 100%;
        max-width: 1240px;
        margin-inline: auto;
        padding: 0 24px;
    }

    /* ── Buttons ──────────────────────────────────────────────────── */
    .aits-home .aits-btn {
        display: inline-flex;
        align-items: center;
        justify-content: center;
        gap: 8px;
        padding: 12px 22px;
        border: 0;
        border-radius: var(--r-md, 12px);
        font-family: 'Inter', system-ui, sans-serif;
        font-weight: 600;
        font-size: 14.5px;
        line-height: 1.2;
        letter-spacing: -0.005em;
        cursor: pointer;
        text-decoration: none !important;
        text-shadow: none !important;
        box-shadow: none;
        transition: background-color var(--t, .18s) ease, color var(--t, .18s) ease, transform var(--t-fast, .12s) ease, box-shadow var(--t, .18s) ease;
        -webkit-appearance: none;
        appearance: none;
        white-space: nowrap;
    }
    .aits-home .aits-btn svg { width: 16px; height: 16px; flex-shrink: 0; }
    .aits-home .aits-btn:hover { transform: translateY(-1px); text-decoration: none !important; }
    .aits-home .aits-btn:active { transform: translateY(0); }
    .aits-home .aits-btn:focus-visible {
        outline: 3px solid var(--aits-focus);
        outline-offset: 2px;
    }

    /* Primary — solid brand blue */
    .aits-home .aits-btn-primary {
        background: var(--aits-blue);
        color: #fff !important;
        box-shadow: var(--sh-brand);
    }
    .aits-home .aits-btn-primary:hover {
        background: var(--aits-blue-dark);
        color: #fff !important;
        box-shadow: 0 12px 24px rgba(54, 128, 237, 0.32);
    }

    /* Gradient CTA — the big pillar buttons */
    .aits-home .aits-btn-gradient {
        background: linear-gradient(135deg, var(--aits-blue) 0%, var(--aits-blue-dark) 100%);
        color: #fff !important;
        padding: 16px 32px;
        font-size: 15.5px;
        border-radius: var(--r-lg, 14px);
        box-shadow: 0 10px 26px rgba(54, 128, 237, 0.32), inset 0 1px 0 rgba(255,255,255,0.18);
    }
    .aits-home .aits-btn-gradient:hover {
        color: #fff !important;
        box-shadow: 0 18px 38px rgba(54, 128, 237, 0.42), inset 0 1px 0 rgba(255,255,255,0.22);
    }

    /* Soft (tinted) — secondary CTAs on light backgrounds */
    .aits-home .aits-btn-soft {
        background: var(--aits-blue-tint);
        color: var(--aits-blue-dark) !important;
    }
    .aits-home .aits-btn-soft:hover {
        background: var(--aits-blue);
        color: #fff !important;
    }

    /* Ghost — outline style */
    .aits-home .aits-btn-ghost {
        background: var(--aits-card);
        color: var(--aits-blue-dark) !important;
        border: 1px solid var(--aits-line-strong);
    }
    .aits-home .aits-btn-ghost:hover {
        border-color: var(--aits-blue);
        background: var(--aits-blue-tint);
        color: var(--aits-blue-dark) !important;
    }

    /* ═════════════════════════════════════════════════════════════════
       SECTION 1 — HERO  (design.md §5.2)
       ═════════════════════════════════════════════════════════════════ */
    .aits-hero {
        position: relative;
        padding: 72px 0 40px;
        overflow: hidden;
        background:
            radial-gradient(circle at 15% 20%, rgba(54, 128, 237, 0.06), transparent 45%),
            radial-gradient(circle at 85% 80%, rgba(54, 128, 237, 0.05), transparent 40%),
            linear-gradient(180deg, #ffffff 0%, #f4f8fe 100%);
    }
    .aits-hero::before,
    .aits-hero::after {
        content: '';
        position: absolute;
        border-radius: 50%;
        pointer-events: none;
        filter: blur(80px);
        opacity: 0.5;
    }
    .aits-hero::before { top: -80px; left: -80px; width: 320px; height: 320px; background: #CFE0FA; }
    .aits-hero::after  { bottom: -100px; right: -80px; width: 380px; height: 380px; background: #EAF2FD; }

    .aits-hero-grid {
        position: relative;
        display: grid;
        grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);
        gap: 48px;
        align-items: center;
    }

    /* A grid item's automatic minimum size is its MIN-CONTENT, not zero, so a
       single non-wrapping descendant sets a floor for the whole column. The
       popular-searches rail is exactly that: a row of `white-space: nowrap`
       chips. Without this the 1fr track resolved to the rail's full 620px
       inside a 328px container on a phone, and `.aits-hero { overflow:
       hidden }` quietly clipped the difference — taking the Search button
       off-screen with it. The overflow never showed up as a scrollbar, which
       is what made it easy to miss. */
    .aits-hero-left { min-width: 0; }

    /* The surface is `--aits-card`, NOT a hard-coded #FFFFFF. The previous
       gradient started at literal white, and since this rule had no dark
       twin the pill kept a white top half at night with `--aits-blue-dark`
       text on it — which is why the badge label read as missing in dark
       mode. Token in, dark twin below, and it can't happen again. */
    .aits-hero-badge {
        display: inline-flex;
        align-items: center;
        gap: 9px;
        padding: 8px 18px 8px 14px;
        border-radius: 999px;
        background: linear-gradient(180deg, var(--aits-card) 0%, var(--aits-blue-tint) 100%);
        border: 1px solid rgba(54,128,237,.22);
        color: var(--aits-blue-dark);
        font-size: 13px;
        font-weight: 700;
        letter-spacing: .01em;
        margin-bottom: 24px;
        box-shadow: 0 4px 14px rgba(54,128,237,.14), inset 0 1px 0 rgba(255,255,255,.9);
        transition: transform var(--t-fast, .15s) ease, box-shadow var(--t-fast, .15s) ease, border-color var(--t-fast, .15s) ease;
    }
    .aits-hero-badge:hover {
        transform: translateY(-1px);
        border-color: rgba(54,128,237,.42);
        box-shadow: 0 8px 20px rgba(54,128,237,.22), inset 0 1px 0 rgba(255,255,255,.9);
    }

    /* The four-point sparkle is the AIToolsay mark and is brand blue, not
       the amber star this carried before — the homepage hero opens on the
       same mark, so the two pages now read as one product. */
    .aits-hero-badge svg {
        width: 15px; height: 15px;
        color: var(--aits-blue);
        animation: aits-badge-twinkle 3.2s ease-in-out infinite;
    }

    @keyframes aits-badge-twinkle {
        0%, 100% { opacity: 1; transform: scale(1); }
        50%      { opacity: .55; transform: scale(.85); }
    }

    @media (prefers-reduced-motion: reduce) {
        .aits-hero-badge svg { animation: none; }
    }

    /* Mobile brand strip removed — the navbar logo is the only brand mark
       on <720px, so the hero opens straight on the badge + headline. */

    .aits-hero-title {
        font-family: 'Inter', system-ui, sans-serif;
        font-size: clamp(2.2rem, 4.4vw, 3.6rem);
        line-height: 1.05;
        font-weight: 800;
        letter-spacing: -0.03em;
        margin: 0 0 20px;
        color: var(--aits-ink);
    }
    .aits-hero-title .aits-accent {
        display: block;
        color: var(--aits-blue);
    }

    .aits-hero-sub {
        font-size: 1.05rem;
        color: var(--aits-mut);
        margin: 0 0 28px;
        max-width: 560px;
    }
    .aits-hero-sub strong { color: var(--aits-ink); font-weight: 600; }

    /* Premium search bar */
    .aits-search-form {
        display: flex;
        align-items: center;
        background: linear-gradient(180deg, #FFFFFF 0%, #FBFDFF 100%);
        border-radius: 16px;
        box-shadow:
            0 1px 2px rgba(15,23,42,.04),
            0 12px 32px -8px rgba(54,128,237,.12),
            inset 0 1px 0 rgba(255,255,255,1);
        padding: 6px 6px 6px 20px;
        max-width: 620px;
        margin-bottom: 20px;
        border: 1.5px solid var(--aits-line-strong);
        transition: box-shadow var(--t, .2s) ease, border-color var(--t, .2s) ease, transform var(--t-fast, .15s) ease;
    }
    .aits-search-form:hover {
        border-color: rgba(54, 128, 237, 0.30);
        box-shadow:
            0 1px 2px rgba(15,23,42,.04),
            0 16px 36px -8px rgba(54,128,237,.20),
            inset 0 1px 0 rgba(255,255,255,1);
    }
    .aits-search-form:focus-within {
        border-color: var(--aits-blue);
        box-shadow:
            0 0 0 4px rgba(54,128,237,.14),
            0 20px 44px -10px rgba(54,128,237,.28),
            inset 0 1px 0 rgba(255,255,255,1);
    }
    .aits-search-form .aits-search-ico {
        flex-shrink: 0;
        width: 22px;
        height: 22px;
        color: var(--aits-mut);
        transition: color var(--t-fast, .15s) ease, transform var(--t-fast, .15s) ease;
    }
    .aits-search-form:focus-within .aits-search-ico { color: var(--aits-blue); transform: scale(1.08); }
    .aits-search-form input {
        flex: 1;
        border: 0;
        outline: 0;
        background: transparent;
        padding: 16px 12px;
        font-size: 15px;
        color: var(--aits-ink);
        font-family: inherit;
        font-weight: 600;
        letter-spacing: -.005em;
        min-width: 0;
    }
    .aits-search-form input::placeholder { color: var(--aits-faint); font-weight: 500; }
    /* The signature 135° blue→blue-dark gradient, the same fill the homepage
       hero's Search button carries. A flat `--aits-blue` that swapped to
       `--aits-blue-dark` on hover was the off-brand button: the site's
       primary action is a gradient everywhere else, and swapping the whole
       fill on hover reads as a state change rather than as a lift. Sliding
       the gradient keeps the identity and still answers the pointer. */
    .aits-btn-search {
        flex-shrink: 0;
        display: inline-flex;
        align-items: center;
        justify-content: center;
        gap: 8px;
        padding: 14px 26px;
        background: linear-gradient(135deg, var(--aits-blue) 0%, var(--aits-blue-dark) 100%);
        background-size: 170% 170%;
        background-position: 0% 50%;
        color: #fff;
        border: 0;
        border-radius: 12px;
        font-weight: 700;
        font-size: 15px;
        letter-spacing: -.005em;
        white-space: nowrap;
        cursor: pointer;
        box-shadow:
            0 10px 24px rgba(54,128,237,.32),
            inset 0 1px 0 rgba(255,255,255,.24);
        transition: background-position var(--t, .35s) ease, transform var(--t-fast, .15s) ease, box-shadow var(--t-fast, .15s) ease;
    }
    .aits-btn-search:hover {
        background-position: 100% 50%;
        transform: translateY(-2px);
        box-shadow:
            0 16px 32px rgba(54,128,237,.42),
            inset 0 1px 0 rgba(255,255,255,.28);
    }
    .aits-btn-search:active { transform: translateY(0) scale(.975); }
    .aits-btn-search svg { width: 18px; height: 18px; flex-shrink: 0; transition: transform var(--t-fast, .15s) ease; }
    .aits-btn-search:hover svg { transform: scale(1.10); }

    /* The sparkle leading the label, matching the homepage hero's button. */
    .aits-btn-search .aits-btn-spark { width: 16px; height: 16px; }
    .aits-btn-search:hover .aits-btn-spark { animation: aits-badge-twinkle 1.4s ease-in-out infinite; transform: none; }

    /* The magnifier is the narrow-screen stand-in for the word, so it stays
       out of the way until the label is dropped at 560px. Declared here
       rather than only in the breakpoint so the button never renders both
       glyphs at once. */
    .aits-btn-search .aits-btn-search-ico { display: none; }

    /* The label sits ABOVE the rail rather than beside it. This hero's copy
       column is ~610px, and an inline label ate a third of it — enough that
       only two and a half chips survived, which reads as broken rather than
       as scrollable. Stacked, the rail gets the whole column. */
    .aits-popular {
        display: flex;
        flex-wrap: wrap;
        align-items: center;
        gap: 10px;
        max-width: 620px;
    }
    .aits-popular-label {
        flex: 0 0 100%;
        font-size: 12.5px;
        font-weight: 700;
        color: var(--aits-mut);
        letter-spacing: 0.14em;
        text-transform: uppercase;
        margin: 0 0 2px;
    }

    .aits-popular-rail {
        display: flex;
        align-items: center;
        gap: 10px;
        flex: 1 1 0;
        min-width: 0;
        padding: 3px 2px;
        overflow-x: auto;
        /* NO `scroll-behavior: smooth` here. It applies to direct
           `scrollLeft` assignment as well as to scrollTo(), which means the
           arrow's instant fallback would animate too — and when the
           animation is the thing being suppressed, the fallback stalls
           exactly like the call it was meant to rescue. Smoothness is asked
           for per-call in the handler instead. */
        scrollbar-width: none;
        -ms-overflow-style: none;
        scroll-snap-type: x proximity;
    }
    .aits-popular-rail::-webkit-scrollbar { display: none; }

    /* Painted only once the script measures a genuine overflow — an arrow
       that scrolls nothing is a dead control. Driven by an attribute rather
       than `:has()`, which Safari below 15.4 and Firefox below 121 lack;
       there they would lose the arrow outright instead of degrading. */
    .aits-popular-next {
        display: none;
        align-items: center;
        justify-content: center;
        flex: 0 0 auto;
        width: 34px; height: 34px;
        padding: 0;
        background: var(--aits-card);
        border: 1px solid var(--aits-line-strong);
        border-radius: 50%;
        color: var(--aits-ink);
        cursor: pointer;
        transition: background var(--t-fast, .15s) ease, border-color var(--t-fast, .15s) ease, color var(--t-fast, .15s) ease, transform var(--t-fast, .15s) ease;
    }
    .aits-popular[data-scrollable="1"] .aits-popular-next { display: inline-flex; }
    .aits-popular[data-at-end="1"] .aits-popular-next { opacity: .35; }
    .aits-popular-next svg { width: 15px; height: 15px; }
    .aits-popular-next:hover {
        background: var(--aits-blue);
        border-color: var(--aits-blue);
        color: #fff;
        transform: scale(1.06);
    }
    /* Written at (0,2,0). These are anchors now, and `.aits-home a { color:
       inherit }` is (0,1,1) — it out-ranks a bare `.aits-chip { color: … }`
       at (0,1,0) whatever the source order, which is exactly how a coloured
       link in here ends up ignoring the colour it was given. The surface is
       `--aits-card` for the same reason the badge is: a literal #FFFFFF has
       no dark twin to fall back on. */
    .aits-home .aits-chip {
        display: inline-flex;
        align-items: center;
        flex: 0 0 auto;
        padding: 8px 15px;
        border-radius: 999px;
        background: var(--aits-card);
        border: 1px solid var(--aits-line-strong);
        color: var(--aits-ink);
        font-size: 13px;
        font-weight: 700;
        letter-spacing: -0.005em;
        white-space: nowrap;
        scroll-snap-align: start;
        box-shadow: 0 1px 2px rgba(15,23,42,.04);
        transition: background var(--t-fast, .15s) ease, color var(--t-fast, .15s) ease, border-color var(--t-fast, .15s) ease, transform var(--t-fast, .15s) ease, box-shadow var(--t-fast, .15s) ease;
        cursor: pointer;
    }
    .aits-home .aits-chip:hover,
    .aits-home .aits-chip:focus-visible {
        background: var(--aits-blue);
        border-color: var(--aits-blue);
        color: #fff;
        transform: translateY(-2px);
        box-shadow: 0 8px 18px rgba(54,128,237,.32);
    }
    .aits-home .aits-chip:active { transform: translateY(0) scale(.97); }

    /* Right illustration */
    .aits-hero-illust {
        position: relative;
        min-height: 460px;
    }
    .aits-laptop {
        position: relative;
        max-width: 520px;
        margin: 0 auto;
        aspect-ratio: 16/10;
        border-radius: var(--r-xl, 18px);
        background: linear-gradient(180deg, #17171A 0%, #0F0F11 100%);
        padding: 14px 14px 22px;
        box-shadow: 0 40px 80px -20px rgba(15, 23, 42, 0.35);
    }
    .aits-laptop-screen {
        width: 100%;
        height: 100%;
        border-radius: 8px;
        background: radial-gradient(circle at 50% 50%, #fff 0%, #F4F8FE 100%);
        display: flex;
        align-items: center;
        justify-content: center;
        overflow: hidden;
        position: relative;
        padding: 24px;
    }
    .aits-laptop-screen > picture {
        display: flex;
        align-items: center;
        justify-content: center;
        width: 100%;
        height: 100%;
        margin: 0;
    }
    .aits-laptop-icon {
        width: 36%;
        max-width: 140px;
        aspect-ratio: 1/1;
        height: auto;
        object-fit: contain;
        display: block;
        margin: 0 auto;
        filter: drop-shadow(0 18px 34px rgba(54, 128, 237, 0.28));
        border-radius: 22%;                     /* the mark ships as a hard square — round it like the float tiles */
    }
    .aits-laptop-base {
        position: absolute;
        bottom: -14px;
        left: -32px;
        right: -32px;
        height: 14px;
        border-radius: 0 0 14px 14px;
        background: linear-gradient(180deg, #2B2B2B 0%, #17171A 100%);
    }

    /* Floating glass tiles — design.md §5.2 (8 tiles, 44-62px, blur, 6s float) */
    .aits-float {
        position: absolute;
        display: grid;
        place-items: center;
        border-radius: var(--r-lg, 14px);
        background: rgba(255, 255, 255, 0.85);
        backdrop-filter: blur(10px);
        -webkit-backdrop-filter: blur(10px);
        box-shadow: var(--sh-md);
        border: 1px solid rgba(255, 255, 255, 0.7);
        animation: aitsFloat 6s ease-in-out infinite;
    }
    .aits-float svg { width: 22px; height: 22px; }
    .aits-float.aits-f1 { top: 0;   left: 4%;   width: 62px; height: 62px; background: var(--aits-blue); color:#fff; animation-delay: 0s; }
    .aits-float.aits-f2 { top: 18%; left: -2%;  width: 46px; height: 46px; color: var(--aits-violet); animation-delay: .8s; }
    .aits-float.aits-f3 { top: 8%;  right: 10%; width: 44px; height: 44px; color: var(--aits-mut); animation-delay: 1.4s; }
    .aits-float.aits-f4 { top: 45%; left: -4%;  width: 58px; height: 58px; background: var(--aits-violet); color:#fff; animation-delay: 2s; }
    .aits-float.aits-f5 { bottom: 20%; right: -4%; width: 60px; height: 60px; background: var(--aits-blue); color:#fff; animation-delay: 1.1s; }
    .aits-float.aits-f6 { top: 32%; right: 2%;  width: 52px; height: 52px; color: var(--aits-blue-light); animation-delay: .4s; }
    .aits-float.aits-f7 { bottom: 8%; left: 12%; width: 54px; height: 54px; color: var(--aits-gold); animation-delay: 2.4s; }
    .aits-float.aits-f8 { bottom: -4%; right: 22%; width: 50px; height: 50px; color: var(--aits-green); animation-delay: 1.8s; }

    /* Robot mascot */
    .aits-robot {
        position: absolute;
        right: -18px;
        bottom: -22px;
        width: 150px;
        height: 180px;
        animation: aitsFloat 4s ease-in-out infinite;
    }

    @keyframes aitsFloat {
        0%, 100% { transform: translateY(0); }
        50%      { transform: translateY(-10px); }
    }

    /* Stats row (6-tile grid) */
    .aits-stats {
        margin-top: 44px;
        background: linear-gradient(180deg, #FFFFFF 0%, #FBFDFF 100%);
        border-radius: 22px;
        padding: 22px 20px;
        box-shadow:
            0 1px 2px rgba(15,23,42,.03),
            0 12px 32px -8px rgba(15,23,42,.10),
            inset 0 1px 0 rgba(255,255,255,1);
        display: grid;
        grid-template-columns: repeat(6, 1fr);
        gap: 8px;
        border: 1px solid var(--aits-line-strong);
    }
    .aits-stat {
        --stc: #3680ED;
        --stc2: #60A4F5;
        display: flex;
        align-items: center;
        gap: 12px;
        padding: 10px 14px;
        border-radius: 14px;
        position: relative;
        /* ⚠️ Declared HERE, not in a breakpoint, and it is load-bearing.
           `@media (max-width:720px) { .aits-hero { text-align:center } }`
           centres the whole mobile hero — badge, title, sub, chips — which is
           deliberate, but it INHERITS into these tiles, and the tile is a
           flex row whose text column is wider than its own label. The result
           was "Online AI Tools" centring itself under "2,000+" instead of
           lining up with it, i.e. a ragged left edge on every tile.
           A directly-applied value always beats an inherited one regardless
           of specificity, so this needs no `!important` and no breakpoint
           twin — and it keeps working if that hero rule ever moves.
           `start`, not `left`: the site ships an RTL stylesheet. */
        text-align: start;
        transition: background var(--t-fast, .15s) ease, transform var(--t-fast, .15s) ease;
    }
    .aits-stat:hover { background: rgba(15,23,42,.02); transform: translateY(-2px); }
    .aits-stat:hover .aits-stat-ico { transform: scale(1.08) rotate(-4deg); }
    /* Per-stat colors — cycle 6 hues */
    .aits-stat:nth-child(1){--stc:#3680ED; --stc2:#60A4F5}
    .aits-stat:nth-child(2){--stc:#7048E8; --stc2:#A78BFA}
    .aits-stat:nth-child(3){--stc:#F59E0B; --stc2:#FBBF24}
    .aits-stat:nth-child(4){--stc:#0CA678; --stc2:#22C55E}
    .aits-stat:nth-child(5){--stc:#EC4899; --stc2:#F472B6}
    .aits-stat:nth-child(6){--stc:#06B6D4; --stc2:#22D3EE}
    .aits-stat + .aits-stat::before {
        content: '';
        position: absolute;
        left: 0;
        top: 22%;
        height: 56%;
        width: 1px;
        background: linear-gradient(180deg, transparent, var(--aits-line-strong) 30%, var(--aits-line-strong) 70%, transparent);
    }
    .aits-stat-ico {
        flex-shrink: 0;
        width: 44px;
        height: 44px;
        border-radius: 12px;
        background: linear-gradient(135deg, var(--stc) 0%, var(--stc2) 100%);
        color: #fff;
        display: grid;
        place-items: center;
        box-shadow: 0 6px 14px color-mix(in oklab, var(--stc) 30%, transparent), inset 0 1px 0 rgba(255,255,255,.24);
        transition: transform var(--t-slow, .25s) var(--ease, cubic-bezier(.16,1,.3,1));
    }
    @supports not (background: color-mix(in oklab, red, blue)) {
        .aits-stat-ico { box-shadow: 0 6px 14px rgba(54,128,237,.30), inset 0 1px 0 rgba(255,255,255,.24) }
    }
    .aits-stat-ico svg { width: 22px; height: 22px; }
    .aits-stat-num {
        font-family: 'Inter', system-ui, sans-serif;
        font-size: 1.4rem;
        font-weight: 800;
        color: var(--aits-ink);
        line-height: 1.1;
        font-variant-numeric: tabular-nums;
        letter-spacing: -0.02em;
    }
    .aits-stat-label {
        font-size: 12px;
        color: var(--aits-mut);
        font-weight: 700;
        letter-spacing: .015em;
        margin-top: 2px;
    }

    /* ═════════════════════════════════════════════════════════════════
       SECTION 2 — ALL TOOLS DIRECTORY  (design.md §5.3)
       ═════════════════════════════════════════════════════════════════ */
    .aits-directory {
        padding: 88px 0 48px;
        position: relative;
        background:
            radial-gradient(circle at 50% 0%, var(--aits-blue-tint-2), transparent 55%),
            radial-gradient(circle at 50% 100%, #F7F7F8, transparent 60%);
    }
    .aits-directory::before {
        content: '';
        position: absolute;
        inset: 0;
        background-image: radial-gradient(circle, rgba(54, 128, 237, 0.06) 1px, transparent 1.5px);
        background-size: 32px 32px;
        opacity: 0.35;
        pointer-events: none;
        mask-image: radial-gradient(ellipse 70% 60% at 50% 50%, black 30%, transparent 100%);
        -webkit-mask-image: radial-gradient(ellipse 70% 60% at 50% 50%, black 30%, transparent 100%);
    }
    .aits-dir-head {
        position: relative;
        display: flex;
        align-items: center;
        justify-content: space-between;
        gap: 28px;
        margin-bottom: 40px;
        flex-wrap: wrap;
    }
    .aits-dir-eyebrow {
        display: inline-flex;
        align-items: center;
        gap: 8px;
        padding: 6px 14px;
        background: var(--aits-blue-tint);
        color: var(--aits-blue-dark);
        border-radius: var(--r-pill, 999px);
        font-size: 12px;
        font-weight: 700;
        letter-spacing: 0.10em;
        text-transform: uppercase;
        margin-bottom: 14px;
    }
    .aits-dir-eyebrow svg { width: 14px; height: 14px; }
    .aits-dir-head h2 {
        font-family: 'Inter', system-ui, sans-serif;
        font-size: clamp(1.8rem, 2.6vw, 2.25rem);
        font-weight: 700;
        letter-spacing: -0.025em;
        margin: 0;
        color: var(--aits-ink);
        line-height: 1.15;
    }
    .aits-dir-head h2 .aits-h2-mute {
        color: var(--aits-mut);
        font-weight: 500;
        font-size: .68em;
        letter-spacing: -0.01em;
    }
    .aits-dir-head p {
        margin: 8px 0 0;
        color: var(--aits-mut);
        font-size: 15px;
        max-width: 520px;
    }

    /* The three "explore all tools" CTAs jump here rather than reloading
       /tools. The site header is STICKY, so without this the wall's first row
       lands underneath it — `--aits-hd-h` is the measured header height every
       page-level sticky on this site clears (76 / 68 / 62px by breakpoint), and
       the extra 18px keeps the card's shadow off the bar. */
    #aits-cats{ scroll-margin-top: calc(var(--aits-hd-h, 76px) + 18px); }

    /* ── §DIRHEAD) The directory head's subtitle + expand-all control ─────
       ONE LINE ON DESKTOP. The 520px cap above is a reading measure, and it
       is right for a paragraph — but this is a one-line strapline, and at
       15px Inter the shipped copy renders ~700px wide (measured: 770px in
       DejaVu Sans, which runs 8-10% wider than Inter), so 520px broke it
       across two lines with a four-word orphan. 760px clears the real width
       with headroom and still caps the measure, so longer admin copy wraps
       gracefully instead of running the full 1,000px the flex row would
       otherwise allow.

       1101px is this file's own desktop boundary — the card grid drops to
       three columns below it. Under that the head has to fit the copy AND
       the button in ~1,000px, which the one-line width would not leave room
       for, so the 520px measure stays and the strapline wraps as before. */
    @media (min-width: 1101px){
        .aits-dir-head p{ max-width: 760px; }
    }

    /* ⚠️ (0,3,0), and it has to be. `[hidden]` is a UA rule at (0,1,0) and
       `.aits-home .aits-btn { display:inline-flex }` is (0,2,0) — so a
       hidden BUTTON in this head would still render. This out-ranks both
       rather than relying on source order, which is the same trap the card
       rows hit with `.aits-cat-list li[hidden]`. */
    .aits-home .aits-dir-head [hidden]{ display: none; }

    /* The expand-all control. It is a real <button> rendered beside the
       <a>, not a rewritten anchor: with JS off the anchor stays and still
       navigates to the full listing, and with JS on the button takes over
       with correct semantics. Neither mode gets an element pretending to be
       something it is not. */
    .aits-dir-all-ic{
        transition: transform var(--t-slow, .25s) var(--ease, cubic-bezier(.16,1,.3,1));
    }
    .aits-dir-all[aria-expanded="true"] .aits-dir-all-ic{ transform: rotate(180deg); }
    /* Expanding every card fires one request per category. The control says
       so, and stops taking clicks until they land. */
    .aits-dir-all.is-busy{ opacity: .65; pointer-events: none; }

    /* ═══ Category card — premium per-card color cycling ═══
       Each card exposes its accent via --cc / --cc2 / --ctint. 8 colors
       cycle across the grid so the whole page reads like a coherent
       system rather than one flat blue block. */
    .aits-cats {
        position: relative;
        display: grid;
        grid-template-columns: repeat(4, minmax(0, 1fr));
        gap: 22px;
    }
    .aits-cat {
        --cc:  #3680ED;
        --cc2: #60A4F5;
        --ctint: rgba(54,128,237,.06);
        position: relative;
        background: var(--aits-card);
        border: 1px solid #EEF0F3;
        border-radius: 22px;
        padding: 24px 22px 20px;
        transition: transform var(--t-slow, .25s) var(--ease, cubic-bezier(.16,1,.3,1)),
                    box-shadow var(--t-slow, .25s) ease,
                    border-color var(--t, .2s) ease;
        display: flex;
        flex-direction: column;
        overflow: hidden;
        isolation: isolate;
        box-shadow: 0 1px 2px rgba(15,23,42,.03), 0 4px 12px rgba(15,23,42,.04);
    }
    /* Per-card color palette — cycles across 8 hues */
    .aits-cat:nth-child(8n+1){--cc:#3680ED; --cc2:#60A4F5; --ctint:rgba(54,128,237,.06)}
    .aits-cat:nth-child(8n+2){--cc:#7048E8; --cc2:#A78BFA; --ctint:rgba(112,72,232,.06)}
    .aits-cat:nth-child(8n+3){--cc:#EC4899; --cc2:#F472B6; --ctint:rgba(236,72,153,.06)}
    .aits-cat:nth-child(8n+4){--cc:#0CA678; --cc2:#22C55E; --ctint:rgba(12,166,120,.06)}
    .aits-cat:nth-child(8n+5){--cc:#F59E0B; --cc2:#FBBF24; --ctint:rgba(245,158,11,.06)}
    .aits-cat:nth-child(8n+6){--cc:#06B6D4; --cc2:#22D3EE; --ctint:rgba(6,182,212,.06)}
    .aits-cat:nth-child(8n+7){--cc:#EF4444; --cc2:#F97316; --ctint:rgba(239,68,68,.06)}
    .aits-cat:nth-child(8n+8){--cc:#4F46E5; --cc2:#818CF8; --ctint:rgba(79,70,229,.06)}

    /* Top-fade tint that appears on hover */
    .aits-cat::before {
        content: '';
        position: absolute;
        left: 0; right: 0; top: 0;
        height: 90px;
        z-index: -1;
        background: linear-gradient(180deg, var(--ctint) 0%, transparent 100%);
        opacity: 0;
        transition: opacity var(--t-slow, .25s) ease;
        pointer-events: none;
    }
    /* Top edge shine bar */
    .aits-cat::after {
        content: '';
        position: absolute;
        left: 20px; right: 20px; top: 0;
        height: 2px;
        background: linear-gradient(90deg, transparent, var(--cc), var(--cc2), transparent);
        border-radius: 0 0 2px 2px;
        opacity: 0;
        transform: translateY(-2px);
        transition: opacity var(--t-slow, .25s) ease, transform var(--t-slow, .25s) ease;
    }
    .aits-cat:hover {
        border-color: color-mix(in oklab, var(--cc) 32%, transparent);
        box-shadow:
            0 22px 44px -14px color-mix(in oklab, var(--cc) 32%, transparent),
            0 8px 18px -8px rgba(15,23,42,.10);
        transform: translateY(-5px);
    }
    @supports not (background: color-mix(in oklab, red, blue)) {
        .aits-cat:hover {
            border-color: rgba(54,128,237,.28);
            box-shadow: 0 22px 44px -14px rgba(54,128,237,.28), 0 8px 18px -8px rgba(15,23,42,.10);
        }
    }
    .aits-cat:hover::before { opacity: 1; }
    .aits-cat:hover::after { opacity: 1; transform: translateY(0); }

    .aits-cat-head {
        display: flex;
        align-items: center;
        gap: 14px;
        margin-bottom: 18px;
        padding-bottom: 16px;
        border-bottom: 1px dashed var(--aits-line);
    }
    .aits-cat-ico {
        flex-shrink: 0;
        width: 46px; height: 46px;
        border-radius: 13px;
        background: linear-gradient(135deg, var(--cc) 0%, var(--cc2) 100%);
        color: #fff;
        display: grid;
        place-items: center;
        box-shadow:
            0 8px 18px color-mix(in oklab, var(--cc) 34%, transparent),
            inset 0 1px 0 rgba(255,255,255,.24);
        transition: transform var(--t-slow, .3s) ease, box-shadow var(--t-slow, .3s) ease;
    }
    @supports not (background: color-mix(in oklab, red, blue)) {
        .aits-cat-ico { box-shadow: 0 8px 18px rgba(54,128,237,.34), inset 0 1px 0 rgba(255,255,255,.24) }
    }
    .aits-cat:hover .aits-cat-ico {
        transform: scale(1.08) rotate(-5deg);
    }
    .aits-cat-ico svg { width: 22px; height: 22px; }
    .aits-cat-title {
        font-family: 'Inter', system-ui, sans-serif;
        font-size: 1.05rem;
        font-weight: 800;
        color: var(--aits-ink);
        margin: 0;
        letter-spacing: -0.015em;
        line-height: 1.2;
    }
    /* Count now uses the card's own accent color */
    .aits-cat-count {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 11px;
        color: var(--cc);
        margin: 5px 0 0;
        font-weight: 800;
        padding: 3px 9px 3px 6px;
        border-radius: 99px;
        background: color-mix(in oklab, var(--cc) 10%, transparent);
        border: 1px solid color-mix(in oklab, var(--cc) 22%, transparent);
        letter-spacing: .02em;
    }
    @supports not (background: color-mix(in oklab, red, blue)) {
        .aits-cat-count { background: rgba(54,128,237,.10); border-color: rgba(54,128,237,.22); color: var(--aits-blue-dark); }
    }
    .aits-cat-count::before {
        content: '';
        width: 6px; height: 6px;
        border-radius: 50%;
        background: var(--cc);
        box-shadow: 0 0 0 3px color-mix(in oklab, var(--cc) 20%, transparent);
    }
    @supports not (background: color-mix(in oklab, red, blue)) {
        .aits-cat-count::before { background: var(--aits-blue); box-shadow: 0 0 0 3px rgba(54,128,237,.20) }
    }
    .aits-cat-list {
        list-style: none;
        margin: 0 0 18px;
        padding: 0;
        display: flex;
        flex-direction: column;
        gap: 1px;
        flex: 1;
    }
    .aits-cat-list a {
        position: relative;
        display: flex;
        align-items: center;
        gap: 10px;
        font-size: 13.5px;
        color: var(--aits-txt);
        padding: 8px 10px;
        margin: 0 -10px;
        border-radius: 10px;
        transition: background var(--t-fast, .15s) ease, color var(--t-fast, .15s) ease;
    }
    /* Left accent bar slides in on hover */
    .aits-cat-list a::before {
        content: '';
        position: absolute;
        left: 2px; top: 10px; bottom: 10px; width: 2px;
        background: linear-gradient(180deg, var(--cc) 0%, var(--cc2) 100%);
        border-radius: 2px;
        opacity: 0;
        transform: scaleY(0);
        transition: opacity var(--t-fast, .15s) ease, transform var(--t-fast, .15s) ease;
    }
    .aits-cat-list a:hover {
        color: var(--cc);
        background: var(--ctint);
    }
    .aits-cat-list a:hover::before { opacity: 1; transform: scaleY(1); }
    .aits-cat-list a .aits-tool-ico {
        width: 16px; height: 16px;
        color: var(--aits-mut);
        flex-shrink: 0;
        display: inline-flex; align-items: center; justify-content: center;
        line-height: 0;
        transition: color var(--t-fast, .15s) ease, transform var(--t-fast, .15s) ease;
    }
    .aits-cat-list a .aits-tool-ico svg { display: block; width: 16px; height: 16px; }
    .aits-cat-list a:hover .aits-tool-ico { color: var(--cc); transform: scale(1.10); }
    .aits-cat-list a > span:last-child {
        overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
        min-width: 0; flex: 1;
        font-weight: 500;
    }

    /* "View all" pill — themed to the card color */
    .aits-cat-more {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px;
        font-weight: 800;
        color: var(--cc);
        margin-top: auto;
        padding: 9px 14px;
        background: color-mix(in oklab, var(--cc) 10%, transparent);
        border: 1px solid color-mix(in oklab, var(--cc) 18%, transparent);
        border-radius: 10px;
        align-self: flex-start;
        transition: background var(--t-fast, .15s) ease, color var(--t-fast, .15s) ease, border-color var(--t-fast, .15s) ease, transform var(--t-fast, .15s) ease, box-shadow var(--t-fast, .15s) ease, gap var(--t-fast, .15s) ease;
        letter-spacing: -.005em;
    }
    @supports not (background: color-mix(in oklab, red, blue)) {
        .aits-cat-more { background: var(--aits-blue-tint); border-color: rgba(54,128,237,.18); color: var(--aits-blue-dark); }
    }
    .aits-cat-more:hover {
        background: linear-gradient(135deg, var(--cc) 0%, var(--cc2) 100%);
        border-color: transparent;
        color: #fff !important;
        text-decoration: none !important;
        transform: translateY(-2px);
        gap: 10px;
        box-shadow: 0 8px 18px color-mix(in oklab, var(--cc) 36%, transparent);
    }
    @supports not (background: color-mix(in oklab, red, blue)) {
        .aits-cat-more:hover { box-shadow: 0 8px 18px rgba(54,128,237,.36) }
    }
    .aits-cat-more svg { width: 14px; height: 14px; transition: transform var(--t-fast, .15s) ease; }
    .aits-cat-more:hover svg { transform: translateX(3px); }

    /* ══════════════════════════════════════════════════════════════════════
       §CATX) Category cards — "show all" expansion, in a masonry wall.

       WHY. Every card in a grid ROW is stretched to the tallest one in it, so
       "SEO Tools" (6 tools) carried ~90px of dead white under its pill purely
       because "Coding Tools" (8) sat beside it. Expanding a card in that grid
       would have been worse still: a 610-row card would stretch its entire
       row to 24,000px. So the two changes are one change — cards can expand
       only because the wall packs them by height.

       WHAT IS AND ISN'T NEW. Not one surface, colour, radius, shadow, hue
       cycle or hover behaviour is touched. `.aits-cat` keeps every rule it
       had, including the §TPX orbit ring on `::before` and the eight-hue
       `nth-child(8n+…)` cycle. This adds a control, a hidden overflow list,
       and a packing mode.

       ⚠️ THE DOM STAYS FLAT. The obvious masonry — deal the cards into
       per-column wrappers — would put each card at `nth-child(1..n)` of its
       own column and hand four cards the SAME blue: both the `--cc` cycle and
       the `--tpx-rgb` ramp count position among `.aits-cats`' children. So
       the cards stay its direct children and the packing happens in the grid.
       ══════════════════════════════════════════════════════════════════════ */

    .aits-cat-hd-t{ flex: 1 1 auto; min-width: 0; }

    /* ── "Show all N tools" ───────────────────────────────────────────────
       Rendered with the `hidden` attribute and unhidden by script, because
       the rows it reveals are fetched over the network — with JS off the
       button could never do anything, and a dead control is worse than no
       control. JS off therefore lands exactly on the old card: eight tools
       and the "View all" pill straight through to the category page. */
    .aits-cat-toggle{
        display: flex;
        align-items: center;
        justify-content: center;
        gap: 7px;
        width: 100%;
        margin: 2px 0 14px;
        padding: 9px 12px;
        border: 1px dashed color-mix(in oklab, var(--cc) 30%, transparent);
        border-radius: 10px;
        background: transparent;
        /* ⚠️ NOT `var(--cc)`. Four of the eight card hues fail as TEXT on
           white — amber #F59E0B is 2.15:1, cyan #06B6D4 2.53:1, pink #EC4899
           3.49:1, red #EF4444 3.76:1 — so a hue-coloured label would be
           unreadable on half the wall. The hue lives in the border and the
           hover fill, which are decoration; the words stay on an ink token
           that clears AA on every card. (`.aits-cat-count` and
           `.aits-cat-more` predate this and do colour their text with
           `--cc`; that is existing debt, not a pattern to copy.) */
        color: var(--aits-txt);
        font-family: inherit;
        font-size: 12.5px;
        font-weight: 800;
        letter-spacing: -.005em;
        cursor: pointer;
        transition: background var(--t-fast, .15s) ease,
                    border-color var(--t-fast, .15s) ease,
                    color var(--t-fast, .15s) ease,
                    box-shadow var(--t-fast, .15s) ease;
    }
    @supports not (background: color-mix(in oklab, red, blue)){
        .aits-cat-toggle{ border-color: rgba(54,128,237,.30); }
    }
    /* ⚠️ (0,2,1). A bare `[hidden]` is the UA rule `display:none` at (0,1,0),
       and `.aits-cat-list` is a flex column — any author `display` on the
       row would silently out-rank it and the "hidden" rows would render.
       Same trap the FAQ page hit. */
    .aits-cat .aits-cat-toggle[hidden],
    .aits-cat-list li[hidden]{ display: none; }

    .aits-cat-toggle-ic{
        flex: 0 0 auto;
        width: 14px; height: 14px;
        display: block;
        transition: transform var(--t-slow, .25s) var(--ease, cubic-bezier(.16,1,.3,1));
    }
    .aits-cat-toggle[aria-expanded="true"] .aits-cat-toggle-ic{ transform: rotate(180deg); }

    @media (hover: hover) and (pointer: fine){
        .aits-cat-toggle:hover{
            background: linear-gradient(135deg, var(--cc) 0%, var(--cc2) 100%);
            border-color: transparent;
            border-style: solid;
            color: #fff;
            box-shadow: 0 8px 18px color-mix(in oklab, var(--cc) 30%, transparent);
        }
        @supports not (background: color-mix(in oklab, red, blue)){
            .aits-cat-toggle:hover{ box-shadow: 0 8px 18px rgba(54,128,237,.30); }
        }
    }
    /* The card carries `overflow:hidden` for its own tint, so a focus ring
       drawn with box-shadow gets sliced off. An outline with a NEGATIVE
       offset is painted inside the padding box and survives. */
    .aits-cat-toggle:focus-visible{
        outline: 2px solid var(--cc);
        outline-offset: -3px;
    }
    body.theme-dark .aits-home .aits-cat-toggle{ color: var(--aits-txt); }

    /* A row that is still arriving. Only ever set while a fetch is in
       flight, and cleared in a `finally`, so a failed request cannot leave
       the card stuck in it. */
    .aits-cat-toggle.is-busy{ opacity: .6; pointer-events: none; }

    /* ── Masonry packing ──────────────────────────────────────────────────
       `is-masonry` is added by script, so with JS off the section renders as
       the plain equal-height grid it always was — the enhancement can fail
       without taking the layout with it.

       HOW IT PACKS. Rows become 1px tall and the row gap moves onto the card
       as a margin, so a card can be given `grid-row-end: span <its height in
       px>` and occupy exactly the space it needs. 1px rather than a coarser
       step because the quantisation error lands in the gap: at 8px rows a
       card can sit up to 7px shy of its slot, and cards each off by a
       different amount is a visibly ragged wall.

       ⚠️ NO `dense`, DELIBERATELY — and the reason is measured, not assumed.
       `grid-auto-flow: row dense` looks like the obvious choice, and it was
       in the first draft on the theory that sparse packing strands cards at
       the row the previous one ended on. That theory is wrong: the sparse
       cursor is left at the placed item's START row, not below it, so the
       next search still reaches free rows further up in other columns. A
       faithful simulation of both algorithms over 12,000 random walls (14
       cards, open/short/collapsed heights, at 4 / 3 / 2 columns) found dense
       beating sparse in ZERO of them — both leave no dead space at all.
       Since it buys nothing, its one real cost decides it: dense can float a
       later card above an earlier one, which desyncs the visual order from
       the DOM order that tab and screen-reader navigation follow. Default
       sparse flow keeps those two in step. Do not "optimise" this back.

       ⚠️ `align-items: start` is what stops the feedback loop. Stretched
       items would grow to fill the span the script just gave them, the
       ResizeObserver would see a new height, and the two would chase each
       other forever. Content-height cards make the span a pure output. */
    .aits-cats.is-masonry{
        grid-auto-rows: 1px;
        row-gap: 0;
        align-items: start;
        /* The last row's cards still carry their 22px margin, which would
           otherwise add to `.aits-cta-strip`'s own 44px and open a 66px gap
           below the wall. */
        margin-bottom: -22px;
    }
    .aits-cats.is-masonry > .aits-cat{ margin-bottom: 22px; }

    /* CTA strip below directory */
    .aits-cta-strip {
        margin-top: 44px;
        display: flex;
        justify-content: center;
        position: relative;
    }
    .aits-cta-strip::before,
    .aits-cta-strip::after {
        content: '';
        position: absolute;
        top: 50%;
        transform: translateY(-50%);
        width: 24%;
        height: 40px;
        background-image: radial-gradient(circle, rgba(54, 128, 237, 0.15) 1.2px, transparent 1.5px);
        background-size: 12px 12px;
    }
    .aits-cta-strip::before { left: 0; }
    .aits-cta-strip::after  { right: 0; }

    /* ═════════════════════════════════════════════════════════════════
       SECTION 3 — TRUST, FEATURES & BLOG  (design.md §5.6, §5.7)
       ═════════════════════════════════════════════════════════════════ */
    .aits-trust {
        padding: 84px 0 100px;
        background: var(--aits-card);
    }

    /* ══════════════════════════════════════════════════════════════════════
       §WHY) "Why AIToolsay" band — rebuilt on the AI-model / tool detail
       page's design language (`v2/public/tool/atd-styles.blade.php`).

       WHAT CHANGED AND WHY. The old band was a saturated blue plate with
       white type — a different visual system from every detail page on the
       site, and one that could not participate in dark mode at all (it was
       the same blue in both themes, so the section read as a hole punched
       through the page). It is now the detail page's §SPINE-BLUE card:

         · a near-white tinted FIELD with the blue living in the ACCENTS,
           not in the ground — the one lesson §SPINE-BLUE records twice,
         · a 150deg diagonal wash plus a concentrated corner bloom,
         · a hairline tinted edge at 20-24px radius,
         · gradient icon TILES as the anchors,
         · the masked-conic orbit ring on hover,
         · a six-tone ramp (§TONE6's own values) so every plate, tile and
           row carries a hue instead of eight copies of blue.

       Both themes are first-class: every surface reads a `--aits-*` token or
       ships an explicit `body.theme-dark` twin.

       ⚠️ THE FLOATING CHIPS ARE GONE ON PURPOSE. "Secure & Private" was
       pinned at `left:calc(50% - 92px)` and sat directly on top of the
       mockup's sidebar, covering the "All AI Tools" and "Categories" rows;
       below 900px all three were `display:none`, so phones and tablets lost
       the three trust claims entirely. They are now an assurance RAIL under
       the frame — same three claims, same glass-plaque language, visible at
       every width, and nothing overlaps anything.
       ══════════════════════════════════════════════════════════════════════ */

    /* The ring's angle has to be a registered <angle> or it cannot be
       animated — an unregistered custom property is an untyped string and
       the conic simply snaps. Browsers without @property fall back to the
       `--aitsw-spin:0deg` declared next to the animation, i.e. a static ring. */
    @property --aitsw-spin{ syntax:"<angle>"; inherits:false; initial-value:0deg; }
    @keyframes aitsw-orbit{ to{ --aitsw-spin:360deg; } }

    /* ── The six-tone ramp (values are §TONE6's) ──────────────────────────
       `--t-p1`/`--t-p2` are the PLATE ends. A plate carries a white glyph and
       the ramp's own light end does not always survive that — white on
       #10B981 is 2.54:1 — so emerald, amber and cyan each start one step
       darker (#0EA575 / #D07E0A / #1A9EBD), which is where they clear 3:1. */
    .aitsw-t0{ --t-rgb:76,141,242;  --t-p1:#4C8DF2; --t-p2:#2060C0; --t-bg:#EAF2FD; --t-ink:#1B5BB5; --t-line:#CFE0FA; }
    .aitsw-t1{ --t-rgb:16,185,129;  --t-p1:#0EA575; --t-p2:#08795A; --t-bg:#E6F8F1; --t-ink:#08795A; --t-line:#C6EEDF; }
    .aitsw-t2{ --t-rgb:139,92,246;  --t-p1:#8B5CF6; --t-p2:#5B33C4; --t-bg:#F0EBFE; --t-ink:#5B33C4; --t-line:#DED2FB; }
    .aitsw-t3{ --t-rgb:245,158,11;  --t-p1:#D07E0A; --t-p2:#A85B08; --t-bg:#FEF4E4; --t-ink:#A85B08; --t-line:#FBE3C0; }
    .aitsw-t4{ --t-rgb:244,63,94;   --t-p1:#F43F5E; --t-p2:#B31D3C; --t-bg:#FEECEF; --t-ink:#B31D3C; --t-line:#FBD2DA; }
    .aitsw-t5{ --t-rgb:34,184,217;  --t-p1:#1A9EBD; --t-p2:#0A6E88; --t-bg:#E4F6FB; --t-ink:#0A6E88; --t-line:#C2E9F4; }
    /* Dark twins: the tint becomes an alpha over the card rather than a
       pastel, and the INK inverts to the light end of each hue — a #08795A
       emerald on a #17171A card is 2.1:1 and would half vanish. */
    body.theme-dark .aits-home .aitsw-t0{ --t-bg:rgba(54,128,237,.18); --t-ink:#8CBEFA; --t-line:rgba(96,164,245,.28); }
    body.theme-dark .aits-home .aitsw-t1{ --t-bg:rgba(16,185,129,.18); --t-ink:#6EE7BE; --t-line:rgba(52,211,153,.30); }
    body.theme-dark .aits-home .aitsw-t2{ --t-bg:rgba(124,77,240,.20); --t-ink:#BFA6FB; --t-line:rgba(160,120,250,.32); }
    body.theme-dark .aits-home .aitsw-t3{ --t-bg:rgba(245,158,11,.20); --t-ink:#FBC97A; --t-line:rgba(251,191,36,.32); }
    body.theme-dark .aits-home .aitsw-t4{ --t-bg:rgba(244,63,94,.18);  --t-ink:#FB9BB0; --t-line:rgba(251,113,133,.30); }
    body.theme-dark .aits-home .aitsw-t5{ --t-bg:rgba(6,182,212,.18);  --t-ink:#7CD9EE; --t-line:rgba(34,211,238,.30); }

    /* ── The band ─────────────────────────────────────────────────────────
       NO `overflow:hidden`. Backgrounds clip to the rounded border box for
       free, the bloom is `inset:0` + `border-radius:inherit`, and the orbit
       ring deliberately hangs 1px OUTSIDE the box — clipping would shave it
       off entirely. `isolation:isolate` is what makes the bloom's z-index:-1
       mean "over the band's own background": an element with
       position:relative and no z-index is not a stacking context, so the
       pseudo would escape to an ancestor's and paint behind the background. */
    .aitsw{
        --aitsw-brand: 54,128,237;
        position: relative;
        isolation: isolate;
        border-radius: 26px;
        padding: clamp(28px, 3.4vw, 54px) clamp(20px, 3vw, 52px);
        /* The section ground is #fff, so the field is tinted rather than
           white-on-white — a wash is invisible unless it departs from the
           ground it sits on. */
        background:
            radial-gradient(560px 380px at 100% -12%, rgba(54,128,237,.15) 0%, rgba(54,128,237,0) 72%) no-repeat,
            radial-gradient(460px 320px at -8% 112%, rgba(139,92,246,.11) 0%, rgba(139,92,246,0) 72%) no-repeat,
            linear-gradient(150deg, rgba(54,128,237,.06) 0%, rgba(54,128,237,0) 48%, rgba(54,128,237,.05) 100%) no-repeat,
            linear-gradient(180deg, #FBFCFF 0%, #F4F8FE 100%);
        border: 1px solid rgba(54,128,237,.18);
        box-shadow:
            0 1px 2px rgba(16,24,40,.04),
            0 22px 56px -22px rgba(32,96,192,.22);
        transition: border-color .2s ease, box-shadow .24s ease;
    }
    /* The bloom's CENTRE sits outside the box on purpose — only its tail
       bleeds into the corner, which is what makes it read as light falling
       on the card rather than a circle drawn on it. It is ::after because it
       animates on hover and background layers cannot cross-fade; ::before is
       the orbit ring. */
    .aitsw::after{
        content: ''; position: absolute; inset: 0; z-index: -1;
        pointer-events: none; border-radius: inherit;
        background: radial-gradient(320px 320px at calc(100% + 46px) -70px,
            rgba(54,128,237,.20) 0%, rgba(54,128,237,0) 70%) no-repeat;
        opacity: .9; transform-origin: 100% 0;
        transition: opacity 360ms ease, transform 520ms cubic-bezier(.16,1,.3,1);
    }
    body.theme-dark .aits-home .aitsw{
        background:
            radial-gradient(560px 380px at 100% -12%, rgba(54,128,237,.20) 0%, rgba(54,128,237,0) 72%) no-repeat,
            radial-gradient(460px 320px at -8% 112%, rgba(139,92,246,.15) 0%, rgba(139,92,246,0) 72%) no-repeat,
            linear-gradient(150deg, rgba(54,128,237,.10) 0%, rgba(54,128,237,0) 48%, rgba(54,128,237,.07) 100%) no-repeat,
            #17171A;
        border-color: rgba(54,128,237,.28);
        box-shadow: 0 1px 2px rgba(0,0,0,.45), 0 22px 56px -22px rgba(0,0,0,.62);
    }
    body.theme-dark .aits-home .aitsw::after{
        background: radial-gradient(320px 320px at calc(100% + 46px) -70px,
            rgba(54,128,237,.17) 0%, rgba(54,128,237,0) 70%) no-repeat;
    }
    @media (hover:hover) and (pointer:fine){
        .aitsw:hover{
            border-color: rgba(54,128,237,.34);
            box-shadow: 0 2px 6px rgba(16,24,40,.06), 0 26px 64px -22px rgba(32,96,192,.28);
        }
        .aitsw:hover::after{ opacity: 1; transform: scale(1.14); }
        body.theme-dark .aits-home .aitsw:hover{
            border-color: rgba(54,128,237,.46);
            box-shadow: 0 2px 6px rgba(0,0,0,.55), 0 26px 64px -22px rgba(0,0,0,.68);
        }
    }

    /* ── The orbit ring ───────────────────────────────────────────────────
       Two full-box mask layers — one clipped to the content box, one to the
       border box — composited with xor, leaving exactly the padding band.
       mask-clip follows border-radius, so the inner cut is a rounded rect on
       a rounded rect and the corners stay true.

       ⚠️ The @supports gate is load-bearing, not defensive: without
       mask-composite the two layers UNION and the conic paints as a SOLID
       BLOCK over the whole band, covering every word on it. Where the mask
       is missing there is simply no ring and the border/shadow hover carries
       the state.

       `rgba(var(--orb-rgb), 0)` rather than the `transparent` KEYWORD: a
       conic fading a colour to `transparent` interpolates through
       transparent BLACK in sRGB and leaves a grey, dirty fringe on the tail. */
    @supports ((-webkit-mask-composite: xor) or (mask-composite: exclude)){
        .aitsw::before,
        .aitsw-rc::before{
            content: ''; position: absolute; pointer-events: none;
            inset: -1px; z-index: 1; border-radius: inherit;
            padding: var(--orb-t, 1.5px);
            --aitsw-spin: 0deg;
            --orb-rgb: var(--aitsw-brand);
            --orb-hot: 255,255,255;
            --orb-a1: .5; --orb-a2: .9; --orb-a3: 1;
            background: conic-gradient(from var(--aitsw-spin),
                rgba(var(--orb-rgb), 0)                0deg,
                rgba(var(--orb-rgb), var(--orb-a1))   30deg,
                rgba(var(--orb-hot), var(--orb-a3))   52deg,
                rgba(var(--orb-rgb), var(--orb-a2))   74deg,
                rgba(var(--orb-rgb), 0)              118deg,
                rgba(var(--orb-rgb), 0)              180deg,
                rgba(var(--orb-rgb), var(--orb-a1))  210deg,
                rgba(var(--orb-hot), var(--orb-a3))  232deg,
                rgba(var(--orb-rgb), var(--orb-a2))  254deg,
                rgba(var(--orb-rgb), 0)              298deg,
                rgba(var(--orb-rgb), 0)              360deg);
            -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
                    mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
            -webkit-mask-composite: xor;
                    mask-composite: exclude;
            opacity: 0; transition: opacity .32s ease;
            animation: aitsw-orbit var(--orb-sp, 3s) linear infinite;
            /* A paused animation does not tick, so an idle band costs
               nothing, and re-entering RESUMES rather than snapping to 0deg. */
            animation-play-state: paused;
        }
        /* The ring sits 1px outside the box, so a host's radius plus that
           pixel is the ring's radius. */
        .aitsw::before{ --orb-sp: 9s; border-radius: 27px; }
        .aitsw-rc::before{ --orb-rgb: var(--t-rgb, 54,128,237); --orb-sp: 3.2s; --orb-t: 1.4px; border-radius: 17px; }
        /* Over near-black the tails have to work harder or the comet reads
           as a single white dash with nothing attached to it. */
        body.theme-dark .aits-home .aitsw::before,
        body.theme-dark .aits-home .aitsw-rc::before{ --orb-a1: .66; --orb-a2: 1; }

        .aitsw:focus-within::before{ opacity: .85; animation-play-state: running; }
        .aitsw-rc:focus-within::before{ opacity: 1; animation-play-state: running; }
        @media (hover:hover) and (pointer:fine){
            .aitsw:hover::before{ opacity: 1; animation-play-state: running; }
            /* The band's own ring dims while a rail tile is hovered, so the
               thing under the pointer always wins. */
            .aitsw:has(.aitsw-rc:hover):hover::before{ opacity: .3; }
            .aitsw-rc:hover::before{ opacity: 1; animation-play-state: running; }
        }
        @media (prefers-reduced-motion: reduce){
            .aitsw::before,
            .aitsw-rc::before{ --aitsw-spin: 135deg; animation: none !important; }
        }
    }

    /* ── Layout ───────────────────────────────────────────────────────── */
    .aitsw-grid{
        display: grid;
        grid-template-columns: minmax(0, 1fr) minmax(0, 1.02fr);
        gap: clamp(28px, 3.6vw, 56px);
        align-items: center;
    }

    /* ── Eyebrow ──────────────────────────────────────────────────────── */
    .aitsw-eyebrow{
        display: inline-flex; align-items: center; gap: 8px;
        padding: 7px 15px 7px 9px;
        border-radius: 999px;
        background: linear-gradient(135deg, rgba(54,128,237,.14) 0%, rgba(139,92,246,.10) 100%), #fff;
        border: 1px solid rgba(54,128,237,.22);
        /* --aits-blue itself is 3.84:1 on white and fails AA as TEXT; the
           dark end of the ramp measures 6.2:1. */
        color: var(--aits-blue-dark);
        font-size: 12px; font-weight: 800; letter-spacing: .045em;
        text-transform: uppercase;
        box-shadow: 0 2px 8px rgba(32,96,192,.10);
        margin-bottom: 20px;
    }
    .aitsw-eyebrow-ic{
        width: 22px; height: 22px; border-radius: 7px; flex: 0 0 auto;
        display: grid; place-items: center;
        background: linear-gradient(135deg, #4C8DF2 0%, #2060C0 100%);
        color: #fff;
        box-shadow: 0 3px 8px rgba(32,96,192,.32);
    }
    .aitsw-eyebrow-ic svg{ width: 12px; height: 12px; display: block; }
    body.theme-dark .aits-home .aitsw-eyebrow{
        background: linear-gradient(135deg, rgba(54,128,237,.22) 0%, rgba(139,92,246,.16) 100%), transparent;
        border-color: rgba(96,164,245,.32);
        color: #9DC0F6;
        box-shadow: none;
    }

    /* ── Heading ──────────────────────────────────────────────────────────
       ⚠️ (0,3,0) is REQUIRED, not belt-and-braces. custom.ltr.css ships
       `body:not(.admin-shell):not(.theme-dark) h2` at (0,2,1), which sets
       colour, weight, letter-spacing AND line-height — in LIGHT MODE ONLY.
       A `.aitsw .aitsw-h` at (0,2,0) loses to it, so the band would have had
       one type ramp in dark and a different one in light. */
    .aits-home .aitsw .aitsw-h{
        font-family: 'Inter', system-ui, sans-serif;
        font-size: clamp(1.95rem, 3.1vw, 2.85rem);
        font-weight: 800;
        line-height: 1.06;
        letter-spacing: -.032em;
        margin: 0 0 16px;
        color: var(--aits-ink);
    }
    .aits-home .aitsw .aitsw-h span{ display: block; }
    /* The second line is the accent. `background-clip:text` needs a real
       fallback: the declared colour paints first and only browsers that
       support the clip replace it, so nothing renders invisible. */
    .aits-home .aitsw .aitsw-h .aitsw-h2{ color: var(--aits-blue-dark); }
    @supports ((-webkit-background-clip: text) or (background-clip: text)){
        .aits-home .aitsw .aitsw-h .aitsw-h2{
            background: linear-gradient(96deg, #2060C0 0%, #3680ED 42%, #7C4DF0 100%);
            -webkit-background-clip: text; background-clip: text;
            -webkit-text-fill-color: transparent; color: transparent;
        }
        body.theme-dark .aits-home .aitsw .aitsw-h .aitsw-h2{
            background: linear-gradient(96deg, #7FB4F8 0%, #60A4F5 42%, #B49BFB 100%);
            -webkit-background-clip: text; background-clip: text;
            -webkit-text-fill-color: transparent;
        }
    }
    body.theme-dark .aits-home .aitsw .aitsw-h .aitsw-h2{ color: #8CBEFA; }

    .aits-home .aitsw .aitsw-lede{
        font-size: clamp(14.5px, 1.05vw, 16px);
        line-height: 1.62;
        color: var(--aits-txt);
        margin: 0 0 26px;
        max-width: 52ch;
    }

    /* ── Check rows — the §PROSCONS row recipe at claim scale ─────────────
       Not links, so the hover is a READING HIGHLIGHT, not an affordance:
       the wash deepens and the plate lifts, but nothing translates in a way
       that suggests it can be clicked. */
    .aitsw-checks{
        list-style: none; margin: 0; padding: 0;
        display: grid;
        grid-template-columns: repeat(2, minmax(0, 1fr));
        gap: 10px;
    }
    .aitsw-check{
        display: flex; align-items: center; gap: 12px;
        padding: 11px 14px 11px 11px;
        border-radius: 13px;
        background:
            linear-gradient(135deg, rgba(var(--t-rgb), .11) 0%, rgba(var(--t-rgb), 0) 64%) no-repeat,
            #fff;
        border: 1px solid var(--t-line);
        box-shadow: 0 1px 2px rgba(16,24,40,.04);
        transition: border-color .18s ease, box-shadow .22s ease, background .22s ease;
    }
    .aitsw-check-ic{
        flex: 0 0 auto;
        width: 30px; height: 30px; border-radius: 9px;
        display: grid; place-items: center;
        background: linear-gradient(135deg, var(--t-p1) 0%, var(--t-p2) 100%);
        color: #fff;
        box-shadow: 0 3px 9px rgba(var(--t-rgb), .34), inset 0 1px 0 rgba(255,255,255,.24);
        transition: transform 380ms cubic-bezier(.16,1,.3,1), box-shadow 300ms ease;
    }
    .aitsw-check-ic svg{ width: 14px; height: 14px; display: block; }
    .aitsw-check-lbl{
        font-size: 14.5px; font-weight: 700; letter-spacing: -.01em;
        color: var(--aits-ink);
        min-width: 0;
    }
    body.theme-dark .aits-home .aitsw-check{
        background:
            linear-gradient(135deg, rgba(var(--t-rgb), .16) 0%, rgba(var(--t-rgb), 0) 64%) no-repeat,
            rgba(255,255,255,.03);
        border-color: var(--t-line);
        box-shadow: 0 1px 2px rgba(0,0,0,.35);
    }
    @media (hover:hover) and (pointer:fine){
        .aitsw-check:hover{
            border-color: rgba(var(--t-rgb), .42);
            box-shadow: 0 6px 18px -8px rgba(var(--t-rgb), .34);
        }
        .aitsw-check:hover .aitsw-check-ic{
            transform: scale(1.07) rotate(-4deg);
            box-shadow: 0 5px 14px rgba(var(--t-rgb), .44), inset 0 1px 0 rgba(255,255,255,.24);
        }
    }

    /* ── The stage + the app frame ────────────────────────────────────── */
    .aitsw-stage{ position: relative; min-width: 0; }
    .aitsw-app{
        border-radius: 18px;
        overflow: hidden;                 /* the chrome bar's top corners */
        background: var(--aits-card);
        border: 1px solid var(--aits-line-strong);
        box-shadow:
            0 30px 70px -26px rgba(16,24,40,.34),
            0 10px 24px -12px rgba(16,24,40,.16);
        transition: transform .34s cubic-bezier(.16,1,.3,1), box-shadow .34s ease;
    }
    @media (hover:hover) and (pointer:fine){
        .aitsw:hover .aitsw-app{
            transform: translateY(-4px);
            box-shadow:
                0 40px 84px -26px rgba(16,24,40,.40),
                0 14px 30px -12px rgba(16,24,40,.18);
        }
    }
    body.theme-dark .aits-home .aitsw-app{
        background: #1C1C1F;
        border-color: rgba(255,255,255,.13);
        box-shadow: 0 30px 70px -26px rgba(0,0,0,.80), 0 10px 24px -12px rgba(0,0,0,.55);
    }

    /* Window chrome — three dots and an address pill. It is also the band's
       one deliberately EMPTY strip, which is what lets the frame carry a
       "live" marker without landing on top of any content. */
    .aitsw-chrome{
        display: flex; align-items: center; gap: 10px;
        padding: 9px 12px;
        background: linear-gradient(180deg, #F8FAFE 0%, #F1F5FC 100%);
        border-bottom: 1px solid var(--aits-line);
    }
    .aitsw-dots{ display: flex; gap: 5px; flex: 0 0 auto; }
    .aitsw-dots i{ width: 8px; height: 8px; border-radius: 50%; display: block; }
    .aitsw-dots i:nth-child(1){ background: #F26D6A; }
    .aitsw-dots i:nth-child(2){ background: #F5BE4F; }
    .aitsw-dots i:nth-child(3){ background: #61C554; }
    .aitsw-url{
        flex: 1 1 auto; min-width: 0;
        display: flex; align-items: center; gap: 6px;
        padding: 4px 10px;
        border-radius: 999px;
        background: #fff;
        border: 1px solid var(--aits-line);
        font-size: 10.5px; font-weight: 600; letter-spacing: -.005em;
        color: var(--aits-txt);
        white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
    }
    .aitsw-url svg{ width: 10px; height: 10px; flex: 0 0 auto; color: #0C9469; }
    /* ⚠️ The address MUST be one element, not `<em>www.</em>` + a bare text
       node. `.aitsw-url` is a flex container, and a text node next to an
       element becomes its own ANONYMOUS FLEX ITEM — so the 6px `gap` that
       separates the padlock from the address also opened a 6px hole between
       "www." and "aitoolsay.com". Wrapping both in `.aitsw-url-t` makes the
       pill exactly two flex items again (padlock, address) and the gap goes
       back to meaning what it says.
       The ellipsis lives here too: `text-overflow` on the flex CONTAINER
       cannot clip an anonymous item, it has to be on the inline box. */
    .aitsw-url-t{ min-width: 0; overflow: hidden; text-overflow: ellipsis; }
    /* `www.` is muted the way real browser chrome greys it — the registrable
       domain is what a reader is meant to land on. */
    .aitsw-url em{ font-style: normal; font-weight: 500; color: var(--aits-mut); }
    .aitsw-live{
        flex: 0 0 auto;
        display: inline-flex; align-items: center; gap: 5px;
        padding: 3px 9px 3px 7px;
        border-radius: 999px;
        background: rgba(16,185,129,.12);
        border: 1px solid rgba(16,185,129,.26);
        font-size: 9.5px; font-weight: 800; letter-spacing: .06em;
        text-transform: uppercase;
        color: #076F53;
    }
    .aitsw-live b{
        width: 5px; height: 5px; border-radius: 50%; background: #0C9469;
        box-shadow: 0 0 0 0 rgba(14,165,117,.55);
        animation: aitsw-pulse 2.4s ease-out infinite;
    }
    @keyframes aitsw-pulse{
        0%   { box-shadow: 0 0 0 0 rgba(14,165,117,.55); }
        70%  { box-shadow: 0 0 0 6px rgba(14,165,117,0); }
        100% { box-shadow: 0 0 0 0 rgba(14,165,117,0); }
    }
    body.theme-dark .aits-home .aitsw-chrome{
        background: linear-gradient(180deg, #232327 0%, #1E1E22 100%);
        border-bottom-color: rgba(255,255,255,.09);
    }
    body.theme-dark .aits-home .aitsw-url{
        background: rgba(255,255,255,.05);
        border-color: rgba(255,255,255,.10);
        color: var(--aits-txt);
    }
    body.theme-dark .aits-home .aitsw-live{ color: #6EE7BE; background: rgba(16,185,129,.16); border-color: rgba(52,211,153,.30); }

    .aitsw-app-body{
        display: grid;
        grid-template-columns: 148px minmax(0, 1fr);
    }

    /* Sidebar */
    .aitsw-side{
        min-width: 0;
        padding: 12px 10px;
        background: linear-gradient(180deg, #FBFCFF 0%, #F7FAFE 100%);
        border-right: 1px solid var(--aits-line);
        display: flex; flex-direction: column; gap: 3px;
    }
    body.theme-dark .aits-home .aitsw-side{
        background: linear-gradient(180deg, rgba(255,255,255,.035) 0%, rgba(255,255,255,.015) 100%);
        border-right-color: rgba(255,255,255,.08);
    }
    .aitsw-brand{ display: flex; align-items: center; padding: 4px 4px 12px; }
    /* ⚠️ (0,2,1) IS THE POINT. `.aits-home img { display:block }` in this
       same stylesheet is (0,1,1) and TIES `body .aits-only-dark
       { display:none }` from custom.ltr.css — and being later in the
       document, the tie went to `display:block`. That is why BOTH logos
       rendered side by side in the old mockup: the light lockup, and the
       dark lockup's blue "say" floating over the main column beside it.
       Qualifying with the element keeps this above both. */
    .aitsw-brand img.aitsw-logo{ width: auto; max-width: 108px; height: 26px; object-fit: contain; object-position: left center; }
    .aitsw-brand img.aitsw-logo-d{ display: none; }
    body.theme-dark .aits-home .aitsw-brand img.aitsw-logo-l{ display: none; }
    body.theme-dark .aits-home .aitsw-brand img.aitsw-logo-d{ display: block; }

    .aitsw-nav{
        display: flex; align-items: center; gap: 9px;
        padding: 7px 9px;
        border-radius: 9px;
        font-size: 11.5px; font-weight: 600; letter-spacing: -.005em;
        color: var(--aits-mut);
        min-width: 0;
    }
    .aitsw-nav span{ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; }
    .aitsw-nav-ic{
        flex: 0 0 auto;
        width: 22px; height: 22px; border-radius: 7px;
        display: grid; place-items: center;
        background: var(--t-bg, rgba(15,23,42,.05));
        color: var(--t-ink, var(--aits-mut));
    }
    .aitsw-nav-ic svg{ width: 12px; height: 12px; display: block; }
    .aitsw-nav.is-on{
        background: linear-gradient(135deg, rgba(54,128,237,.14) 0%, rgba(54,128,237,.05) 100%);
        color: var(--aits-blue-dark);
        font-weight: 800;
        box-shadow: inset 2px 0 0 var(--aits-blue);
    }
    .aitsw-nav.is-on .aitsw-nav-ic{
        background: linear-gradient(135deg, #4C8DF2 0%, #2060C0 100%);
        color: #fff;
        box-shadow: 0 3px 8px rgba(32,96,192,.30);
    }
    body.theme-dark .aits-home .aitsw-nav.is-on{ color: #8CBEFA; }

    /* Main column */
    .aitsw-main{ min-width: 0; padding: 13px 14px 14px; }
    .aitsw-hello{ display: flex; align-items: center; gap: 9px; margin-bottom: 12px; min-width: 0; }
    .aitsw-ava{
        flex: 0 0 auto;
        width: 26px; height: 26px; border-radius: 50%;
        display: grid; place-items: center;
        background: linear-gradient(135deg, #8B5CF6 0%, #5B33C4 100%);
        color: #fff; font-size: 10.5px; font-weight: 800;
        box-shadow: 0 3px 8px rgba(91,51,196,.30);
    }
    .aitsw-hello-t{ min-width: 0; }
    /* ⚠️ (0,3,1), not (0,1,1). custom.ltr.css ships
       `body:not(.admin-shell):not(.theme-dark) b { color:…; font-weight:600 }`
       at (0,2,1) — LIGHT MODE ONLY — so an unqualified `.aitsw-hello-t b`
       would render 600 in light and 800 in dark: one band, two type ramps. */
    .aits-home .aitsw .aitsw-hello-t b{ display: block; font-size: 11.5px; font-weight: 800; color: var(--aits-ink); letter-spacing: -.01em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
    .aitsw-hello-t span{ display: block; font-size: 10px; color: var(--aits-mut); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

    .aitsw-stats{ display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; margin-bottom: 14px; }
    .aitsw-stat{
        min-width: 0;
        padding: 9px 9px 10px;
        border-radius: 11px;
        background:
            linear-gradient(140deg, rgba(var(--t-rgb), .12) 0%, rgba(var(--t-rgb), 0) 70%) no-repeat,
            #fff;
        border: 1px solid var(--t-line);
    }
    body.theme-dark .aits-home .aitsw-stat{
        background:
            linear-gradient(140deg, rgba(var(--t-rgb), .17) 0%, rgba(var(--t-rgb), 0) 70%) no-repeat,
            rgba(255,255,255,.03);
    }
    .aitsw-stat-ic{
        width: 22px; height: 22px; border-radius: 7px;
        display: grid; place-items: center; margin-bottom: 7px;
        background: linear-gradient(135deg, var(--t-p1) 0%, var(--t-p2) 100%);
        color: #fff;
        box-shadow: 0 3px 8px rgba(var(--t-rgb), .32);
    }
    .aitsw-stat-ic svg{ width: 12px; height: 12px; display: block; }
    .aitsw-stat-n{ font-size: 14px; font-weight: 800; letter-spacing: -.02em; color: var(--aits-ink); line-height: 1.1; }
    .aitsw-stat-l{ font-size: 9.5px; font-weight: 600; color: var(--aits-mut); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-top: 2px; }

    .aitsw-rec-hd{
        display: flex; align-items: center; justify-content: space-between; gap: 8px;
        font-size: 10px; font-weight: 800; letter-spacing: .07em; text-transform: uppercase;
        color: var(--aits-mut);
        margin-bottom: 7px;
    }
    .aitsw-rec-hd em{ font-style: normal; font-size: 9.5px; font-weight: 700; color: var(--aits-blue-dark); letter-spacing: 0; text-transform: none; }
    body.theme-dark .aits-home .aitsw-rec-hd em{ color: #8CBEFA; }
    .aitsw-rec{
        display: flex; align-items: center; gap: 9px;
        padding: 7px 9px;
        border-radius: 9px;
        background: var(--t-bg);
        border: 1px solid var(--t-line);
        margin-bottom: 6px;
        min-width: 0;
    }
    .aitsw-rec:last-child{ margin-bottom: 0; }
    .aitsw-rec-ic{
        flex: 0 0 auto;
        width: 20px; height: 20px; border-radius: 6px;
        display: grid; place-items: center;
        background: linear-gradient(135deg, var(--t-p1) 0%, var(--t-p2) 100%);
        color: #fff;
    }
    .aitsw-rec-ic svg{ width: 11px; height: 11px; display: block; }
    .aitsw-rec-l{ flex: 1 1 auto; min-width: 0; font-size: 11px; font-weight: 700; color: var(--aits-ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
    .aitsw-rec-m{ flex: 0 0 auto; font-size: 9.5px; font-weight: 600; color: var(--t-ink); }

    /* Status bar */
    .aitsw-status{
        display: flex; align-items: center; justify-content: space-between; gap: 10px;
        padding: 8px 12px;
        border-top: 1px solid var(--aits-line);
        background: linear-gradient(180deg, #F8FAFE 0%, #F1F5FC 100%);
        font-size: 9.5px; font-weight: 700; letter-spacing: -.005em;
        color: var(--aits-mut);
    }
    .aitsw-status span{ display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; }
    .aitsw-status svg{ width: 11px; height: 11px; flex: 0 0 auto; color: #0C9469; }
    body.theme-dark .aits-home .aitsw-status{
        background: linear-gradient(180deg, #232327 0%, #1E1E22 100%);
        border-top-color: rgba(255,255,255,.09);
    }

    /* ── Assurance rail — the three claims, always visible ────────────── */
    .aitsw-rail{
        list-style: none; margin: 18px 0 0; padding: 0;
        display: grid;
        grid-template-columns: repeat(3, minmax(0, 1fr));
        gap: 10px;
    }
    .aitsw-rc{
        position: relative; isolation: isolate;
        display: flex; align-items: center; gap: 10px;
        padding: 11px 12px;
        border-radius: 16px;
        background:
            linear-gradient(140deg, rgba(var(--t-rgb), .12) 0%, rgba(var(--t-rgb), 0) 66%) no-repeat,
            #fff;
        border: 1px solid var(--t-line);
        box-shadow: 0 1px 2px rgba(16,24,40,.04), 0 6px 18px -10px rgba(16,24,40,.14);
        transition: border-color .18s ease, box-shadow .22s ease, transform .24s cubic-bezier(.16,1,.3,1);
    }
    .aitsw-rc-ic{
        flex: 0 0 auto;
        width: 34px; height: 34px; border-radius: 11px;
        display: grid; place-items: center;
        background: linear-gradient(135deg, var(--t-p1) 0%, var(--t-p2) 100%);
        color: #fff;
        box-shadow: 0 4px 11px rgba(var(--t-rgb), .34), inset 0 1px 0 rgba(255,255,255,.24);
        transition: transform 380ms cubic-bezier(.16,1,.3,1), box-shadow 300ms ease;
    }
    .aitsw-rc-ic svg{ width: 16px; height: 16px; display: block; }
    .aitsw-rc-t{ min-width: 0; }
    /* (0,3,1) for the same reason as `.aitsw-hello-t b` above. */
    .aits-home .aitsw .aitsw-rc-t b{ display: block; font-size: 12.5px; font-weight: 800; letter-spacing: -.01em; color: var(--aits-ink); }
    .aitsw-rc-t span{ display: block; font-size: 11px; font-weight: 500; color: var(--aits-mut); margin-top: 1px; }
    body.theme-dark .aits-home .aitsw-rc{
        background:
            linear-gradient(140deg, rgba(var(--t-rgb), .17) 0%, rgba(var(--t-rgb), 0) 66%) no-repeat,
            rgba(255,255,255,.035);
        box-shadow: 0 1px 2px rgba(0,0,0,.40), 0 6px 18px -10px rgba(0,0,0,.50);
    }
    @media (hover:hover) and (pointer:fine){
        .aitsw-rc:hover{
            transform: translateY(-3px);
            border-color: rgba(var(--t-rgb), .44);
            box-shadow: 0 2px 6px rgba(16,24,40,.05), 0 16px 32px -14px rgba(var(--t-rgb), .38);
        }
        .aitsw-rc:hover .aitsw-rc-ic{
            transform: scale(1.07) rotate(-4deg);
            box-shadow: 0 6px 16px rgba(var(--t-rgb), .46), inset 0 1px 0 rgba(255,255,255,.24);
        }
    }

    /* ── Responsive ───────────────────────────────────────────────────────
       The rail deliberately alternates 3-up / 1-up rather than passing
       through a 2-up step: three tiles in two tracks leaves an orphan in the
       second row, and a stretched orphan beside an empty cell reads as a
       layout bug rather than a choice. Each width gets whichever of the two
       even splits actually fits. */
    @media (max-width: 1280px){
        .aitsw-rail{ grid-template-columns: minmax(0, 1fr); }
    }
    @media (max-width: 1200px){
        .aitsw{ border-radius: 24px; }
        .aitsw-app-body{ grid-template-columns: 132px minmax(0, 1fr); }
        .aitsw-brand img.aitsw-logo{ max-width: 96px; height: 24px; }
        .aitsw-stat-n{ font-size: 13px; }
    }
    @media (max-width: 900px){
        /* One column: the argument reads first, the product proves it. */
        .aitsw-grid{ grid-template-columns: minmax(0, 1fr); gap: 30px; }
        .aitsw-rail{ grid-template-columns: repeat(3, minmax(0, 1fr)); }
        .aits-home .aitsw .aitsw-lede{ max-width: none; }
        .aitsw-app-body{ grid-template-columns: 148px minmax(0, 1fr); }
    }
    @media (max-width: 700px){
        .aitsw-rail{ grid-template-columns: minmax(0, 1fr); margin-top: 14px; }
        .aitsw{ border-radius: 20px; }
        .aitsw::before{ border-radius: 21px; }
    }
    @media (max-width: 600px){
        .aitsw-checks{ grid-template-columns: minmax(0, 1fr); }
        .aitsw-app-body{ grid-template-columns: 108px minmax(0, 1fr); }
        .aitsw-side{ padding: 10px 7px; }
        .aitsw-brand{ padding: 2px 2px 9px; }
        .aitsw-brand img.aitsw-logo{ max-width: 84px; height: 21px; }
        .aitsw-nav{ padding: 6px 6px; gap: 6px; font-size: 10px; }
        .aitsw-nav-ic{ width: 19px; height: 19px; border-radius: 6px; }
        .aitsw-nav-ic svg{ width: 10px; height: 10px; }
        .aitsw-main{ padding: 11px 10px 12px; }
        .aitsw-stats{ gap: 5px; }
        .aitsw-stat{ padding: 7px 6px 8px; border-radius: 9px; }
        .aitsw-stat-ic{ width: 19px; height: 19px; border-radius: 6px; margin-bottom: 5px; }
        .aitsw-stat-ic svg{ width: 10px; height: 10px; }
        .aitsw-stat-n{ font-size: 11.5px; }
        .aitsw-stat-l{ font-size: 8.5px; }
        .aitsw-rec{ padding: 6px 7px; gap: 7px; }
        .aitsw-rec-l{ font-size: 10px; }
        .aitsw-rec-m{ font-size: 8.5px; }
        /* The address is the first thing worth losing — it is decoration,
           and truncating it to three characters is worse than dropping it. */
        .aitsw-url{ display: none; }
        .aitsw-chrome{ padding: 8px 10px; }
        .aitsw-eyebrow{ font-size: 11px; padding: 6px 13px 6px 8px; }
    }
    @media (max-width: 500px){
        /* Below this the sidebar cannot hold a legible label AND leave the
           main column usable, so the frame shows the screen it is actually
           demonstrating rather than two starved columns.

           500, not 420: with a 108px sidebar the three stat tiles get
           (vw - 28 shell - 40 band - 108 side - 20 main) / 3, which is 74px
           at 430px — under the width "1,250h" needs beside its own padding.
           At 500 the same maths gives 90px, and every phone below that now
           gets the uncramped single-column frame instead. */
        .aitsw-app-body{ grid-template-columns: minmax(0, 1fr); }
        .aitsw-side{ display: none; }
        .aitsw-status{ font-size: 9px; padding: 7px 10px; }
    }

    @media (prefers-reduced-motion: reduce){
        .aitsw-app,
        .aitsw-rc,
        .aitsw-rc-ic,
        .aitsw-check-ic,
        .aitsw::after{ transition: none !important; }
        .aitsw:hover .aitsw-app,
        .aitsw-rc:hover,
        .aitsw-rc:hover .aitsw-rc-ic,
        .aitsw-check:hover .aitsw-check-ic{ transform: none !important; }
        .aitsw:hover::after{ transform: none; }
        .aitsw-live b{ animation: none !important; }
    }

    /* ── The `.aits-only-*` swap, repaired page-wide ───────────────────────
       custom.ltr.css declares `body .aits-only-dark { display:none }` at
       (0,1,1). This stylesheet's own `.aits-home img { display:block }` is
       ALSO (0,1,1) — a specificity TIE — and it is later in the document, so
       it won and every theme-variant image on this page rendered BOTH
       variants at once. Re-stating the swap here with the element qualifier
       puts it at (0,2,1)/(0,3,1), above both. */
    .aits-home img.aits-only-dark{ display: none; }
    body.theme-dark .aits-home img.aits-only-light{ display: none; }
    body.theme-dark .aits-home img.aits-only-dark{ display: block; }

    /* Three feature cards row — design.md §5.6 */
    /* ═══ 3-card feature grid — premium redesign ═══
       Each card owns its accent color for icon-tile + hover glow. */
    .aits-features {
        margin-top: 44px;
        display: grid;
        grid-template-columns: repeat(3, minmax(0, 1fr));
        gap: 22px;
    }
    .aits-feat-card {
        --fc:  #3680ED;
        --fc2: #60A4F5;
        --ftint: rgba(54,128,237,.06);
        position: relative;
        background: var(--aits-card);
        border: 1px solid var(--aits-line-strong);
        border-radius: 20px;
        padding: 28px 24px 24px;
        box-shadow: 0 1px 2px rgba(15,23,42,.03), 0 4px 12px rgba(15,23,42,.04);
        transition: transform var(--t-slow, .25s) var(--ease, cubic-bezier(.16,1,.3,1)),
                    box-shadow var(--t-slow, .25s) ease,
                    border-color var(--t, .2s) ease;
        overflow: hidden;
        isolation: isolate;
    }
    .aits-features .aits-feat-card:nth-child(1){--fc:#3680ED; --fc2:#60A4F5; --ftint:rgba(54,128,237,.06)}
    .aits-features .aits-feat-card:nth-child(2){--fc:#7048E8; --fc2:#A78BFA; --ftint:rgba(112,72,232,.06)}
    .aits-features .aits-feat-card:nth-child(3){--fc:#F59E0B; --fc2:#FBBF24; --ftint:rgba(245,158,11,.06)}
    /* Top-fade tint appears on hover */
    .aits-feat-card::before {
        content: '';
        position: absolute;
        left: 0; right: 0; top: 0;
        height: 90px;
        z-index: -1;
        background: linear-gradient(180deg, var(--ftint) 0%, transparent 100%);
        opacity: 0;
        transition: opacity var(--t-slow, .25s) ease;
        pointer-events: none;
    }
    /* Top edge shine bar */
    .aits-feat-card::after {
        content: '';
        position: absolute;
        left: 20px; right: 20px; top: 0;
        height: 2px;
        background: linear-gradient(90deg, transparent, var(--fc), var(--fc2), transparent);
        border-radius: 0 0 2px 2px;
        opacity: 0;
        transform: translateY(-2px);
        transition: opacity var(--t-slow, .25s) ease, transform var(--t-slow, .25s) ease;
    }
    .aits-feat-card:hover {
        transform: translateY(-4px);
        border-color: color-mix(in oklab, var(--fc) 32%, transparent);
        box-shadow: 0 22px 44px -14px color-mix(in oklab, var(--fc) 32%, transparent),
                    0 8px 18px -8px rgba(15,23,42,.10);
    }
    @supports not (background: color-mix(in oklab, red, blue)) {
        .aits-feat-card:hover { border-color: rgba(54,128,237,.28); box-shadow: 0 22px 44px -14px rgba(54,128,237,.28), 0 8px 18px -8px rgba(15,23,42,.10); }
    }
    .aits-feat-card:hover::before { opacity: 1; }
    .aits-feat-card:hover::after { opacity: 1; transform: translateY(0); }
    .aits-feat-card h3 {
        font-family: 'Inter', system-ui, sans-serif;
        font-size: 1.15rem;
        font-weight: 800;
        margin: 0 0 22px;
        letter-spacing: -0.02em;
        color: var(--aits-ink);
        padding-bottom: 16px;
        border-bottom: 1px dashed var(--aits-line);
        display: flex;
        align-items: center;
        gap: 10px;
    }
    .aits-feat-card h3::before {
        content: '';
        display: inline-block;
        width: 4px; height: 20px; border-radius: 4px;
        background: linear-gradient(180deg, var(--fc) 0%, var(--fc2) 100%);
    }

    /* Card 1 — How it works: numbered steps with gradient circles */
    .aits-steps { display: flex; flex-direction: column; gap: 14px; }
    .aits-step {
        position: relative;
        display: flex; align-items: flex-start; gap: 14px;
        padding: 6px 8px;
        margin: 0 -8px;
        border-radius: 10px;
        transition: background var(--t-fast, .15s) ease, transform var(--t-fast, .15s) ease;
    }
    .aits-step:hover { background: var(--ftint); transform: translateX(2px); }
    .aits-step-num {
        flex-shrink: 0;
        width: 34px; height: 34px;
        border-radius: 50%;
        display: grid; place-items: center;
        color: #fff;
        font-weight: 800; font-family: 'Inter', system-ui, sans-serif;
        font-size: 14px;
        box-shadow: 0 6px 14px rgba(15,23,42,.14), inset 0 1px 0 rgba(255,255,255,.24);
        transition: transform var(--t-fast, .15s) ease, box-shadow var(--t-fast, .15s) ease;
    }
    .aits-step:hover .aits-step-num { transform: scale(1.08); }
    /* Design.md §5.6: circle 1 blue, 2 violet, 3 green, 4 gold — kept as gradients */
    .aits-step:nth-child(1) .aits-step-num { background: linear-gradient(135deg,#3680ED 0%,#60A4F5 100%); box-shadow: 0 6px 14px rgba(54,128,237,.34), inset 0 1px 0 rgba(255,255,255,.24); }
    .aits-step:nth-child(2) .aits-step-num { background: linear-gradient(135deg,#7048E8 0%,#A78BFA 100%); box-shadow: 0 6px 14px rgba(112,72,232,.34), inset 0 1px 0 rgba(255,255,255,.24); }
    .aits-step:nth-child(3) .aits-step-num { background: linear-gradient(135deg,#0CA678 0%,#22C55E 100%); box-shadow: 0 6px 14px rgba(12,166,120,.34), inset 0 1px 0 rgba(255,255,255,.24); }
    .aits-step:nth-child(4) .aits-step-num { background: linear-gradient(135deg,#F59E0B 0%,#FBBF24 100%); box-shadow: 0 6px 14px rgba(245,158,11,.34), inset 0 1px 0 rgba(255,255,255,.24); }
    .aits-step-body strong { display: block; color: var(--aits-ink); font-weight: 800; font-size: 14.5px; margin-bottom: 3px; letter-spacing: -.01em; }
    .aits-step-body span { color: var(--aits-mut); font-size: 13px; line-height: 1.4; }

    /* Card 2 — Why users love it — gradient perk icons + hover */
    .aits-perks { display: flex; flex-direction: column; gap: 14px; margin-bottom: 20px; }
    .aits-perk {
        display: flex; align-items: flex-start; gap: 12px;
        padding: 6px 8px;
        margin: 0 -8px;
        border-radius: 10px;
        transition: background var(--t-fast, .15s) ease, transform var(--t-fast, .15s) ease;
    }
    .aits-perk:hover { background: var(--ftint); transform: translateX(2px); }
    .aits-perk-ico {
        flex-shrink: 0;
        width: 36px; height: 36px;
        border-radius: 10px;
        display: grid; place-items: center;
        color: #fff;
        box-shadow: 0 4px 10px rgba(15,23,42,.10), inset 0 1px 0 rgba(255,255,255,.24);
        transition: transform var(--t-fast, .15s) ease;
    }
    .aits-perk:hover .aits-perk-ico { transform: scale(1.08) rotate(-4deg); }
    .aits-perk:nth-child(1) .aits-perk-ico { background: linear-gradient(135deg,#0CA678 0%,#22C55E 100%); box-shadow: 0 4px 10px rgba(12,166,120,.30), inset 0 1px 0 rgba(255,255,255,.24); }
    .aits-perk:nth-child(2) .aits-perk-ico { background: linear-gradient(135deg,#3680ED 0%,#60A4F5 100%); box-shadow: 0 4px 10px rgba(54,128,237,.30), inset 0 1px 0 rgba(255,255,255,.24); }
    .aits-perk:nth-child(3) .aits-perk-ico { background: linear-gradient(135deg,#7048E8 0%,#A78BFA 100%); box-shadow: 0 4px 10px rgba(112,72,232,.30), inset 0 1px 0 rgba(255,255,255,.24); }
    .aits-perk:nth-child(4) .aits-perk-ico { background: linear-gradient(135deg,#EC4899 0%,#F472B6 100%); box-shadow: 0 4px 10px rgba(236,72,153,.30), inset 0 1px 0 rgba(255,255,255,.24); }
    .aits-perk-ico svg { width: 16px; height: 16px; }
    .aits-perk strong { display: block; font-weight: 800; font-size: 14px; color: var(--aits-ink); margin-bottom: 3px; letter-spacing: -.01em; }
    .aits-perk span { color: var(--aits-mut); font-size: 12.5px; line-height: 1.4; }

    /* Card 3 — Testimonials — premium review cards with gradient avatars */
    .aits-testimonials { display: flex; flex-direction: column; gap: 12px; }
    .aits-review {
        position: relative;
        padding: 16px;
        background: linear-gradient(180deg, #FFFFFF 0%, var(--aits-bg) 100%);
        border: 1px solid var(--aits-line);
        border-radius: 14px;
        font-size: 13px;
        transition: transform var(--t-fast, .15s) ease, border-color var(--t-fast, .15s) ease, box-shadow var(--t-fast, .15s) ease;
    }
    .aits-review:hover {
        transform: translateY(-2px);
        border-color: rgba(245,158,11,.32);
        box-shadow: 0 8px 20px -8px rgba(245,158,11,.24);
    }
    .aits-review-body { color: var(--aits-ink); line-height: 1.55; margin: 0 0 12px; font-weight: 500; }
    .aits-review-foot { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
    .aits-review-who { display: flex; align-items: center; gap: 10px; }
    .aits-review-avatar {
        width: 32px; height: 32px; border-radius: 50%;
        color: #fff; display: grid; place-items: center;
        font-weight: 800; font-size: 12px;
        overflow: hidden;
        flex: 0 0 auto;
        border: 2px solid #fff;
        box-shadow: 0 3px 8px rgba(15,23,42,.14);
    }
    /* Rotating avatar palette for reviews (blue → purple → pink → amber) */
    .aits-review:nth-child(1) .aits-review-avatar { background: linear-gradient(135deg,#3680ED 0%,#60A4F5 100%); }
    .aits-review:nth-child(2) .aits-review-avatar { background: linear-gradient(135deg,#7048E8 0%,#A78BFA 100%); }
    .aits-review:nth-child(3) .aits-review-avatar { background: linear-gradient(135deg,#EC4899 0%,#F472B6 100%); }
    .aits-review:nth-child(4) .aits-review-avatar { background: linear-gradient(135deg,#F59E0B 0%,#FBBF24 100%); }
    .aits-review-avatar img { width: 100%; height: 100%; object-fit: cover; display: block; }
    .aits-review-name { font-weight: 800; font-size: 12.5px; color: var(--aits-ink); letter-spacing: -.005em; }
    .aits-review-role { font-size: 11px; color: var(--aits-mut); }
    .aits-review-stars {
        display: inline-flex; gap: 2px;
        background: linear-gradient(90deg,#F59E0B 0%,#EAB308 100%);
        -webkit-background-clip: text; background-clip: text; color: transparent;
        filter: drop-shadow(0 1px 2px rgba(245,158,11,.24));
    }
    .aits-review-stars svg { width: 13px; height: 13px; fill: #F59E0B; color: #F59E0B; }

    /* Blog cards — design.md §5.7 */

    .aits-blog { margin-top: 60px; }
    .aits-blog-head {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 24px;
        gap: 16px;
        flex-wrap: wrap;
    }
    .aits-blog-head h2 {
        font-family: 'Inter', system-ui, sans-serif;
        font-size: clamp(1.5rem, 2.2vw, 1.9rem);
        font-weight: 700;
        letter-spacing: -0.02em;
        margin: 0;
        color: var(--aits-ink);
    }
    .aits-blog-grid {
        display: grid;
        grid-template-columns: repeat(4, minmax(0, 1fr));
        gap: 22px;
    }
    .aits-post {
        background: var(--aits-card);
        border: 1px solid var(--aits-line-strong);
        border-radius: var(--r-xl, 16px);
        overflow: hidden;
        display: flex;
        flex-direction: column;
        transition: all var(--t-slow, .25s) ease;
    }
    .aits-post:hover {
        box-shadow: var(--sh-md);
        transform: translateY(-3px);
        border-color: var(--aits-blue-line);
    }
    .aits-post-media {
        aspect-ratio: 16/10;
        background: linear-gradient(135deg, var(--aits-blue-tint) 0%, var(--aits-blue-tint-2) 100%);
        position: relative;
        overflow: hidden;
    }
    .aits-post-media img { width: 100%; height: 100%; object-fit: cover; transition: transform var(--t-slow, .3s) ease; }
    .aits-post:hover .aits-post-media img { transform: scale(1.05); }
    .aits-post-media-fallback {
        position: absolute; inset: 0;
        display: grid; place-items: center;
        color: rgba(255,255,255,0.7);
    }
    .aits-post-media-fallback svg { width: 48px; height: 48px; }
    .aits-post-body { padding: 18px; display: flex; flex-direction: column; flex: 1; }
    .aits-post-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px;
        gap: 10px;
        font-size: 12px;
    }
    .aits-post-cat {
        padding: 4px 10px;
        background: var(--aits-blue-tint);
        color: var(--aits-blue-dark);
        border-radius: var(--r-xs, 6px);
        font-weight: 600;
        font-size: 11.5px;
    }
    .aits-post-date { color: var(--aits-mut); font-size: 12px; }
    .aits-post h3 {
        font-family: 'Inter', system-ui, sans-serif;
        font-size: 1rem;
        font-weight: 600;
        line-height: 1.35;
        margin: 0 0 8px;
        color: var(--aits-ink);
        display: -webkit-box;
        -webkit-line-clamp: 2;
        -webkit-box-orient: vertical;
        overflow: hidden;
    }
    .aits-post p {
        font-size: 13px;
        color: var(--aits-mut);
        margin: 0 0 12px;
        display: -webkit-box;
        -webkit-line-clamp: 2;
        -webkit-box-orient: vertical;
        overflow: hidden;
        flex: 1;
    }
    .aits-post-more {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        color: var(--aits-blue-dark);
        font-weight: 600;
        font-size: 13px;
    }
    .aits-post-more:hover { color: var(--aits-blue-dark); text-decoration: underline; }
    .aits-post-more svg { width: 14px; height: 14px; transition: transform var(--t-fast, .15s) ease; }
    .aits-post:hover .aits-post-more svg { transform: translateX(3px); }

    /* Sitewide tool-card icon helper — design.md §5.4 */
    .aits-home .tool-lucide {
        display: inline-flex;
        align-items: center;
        justify-content: center;
        width: 40px;
        height: 40px;
        border-radius: var(--r-sm, 8px);
        background: var(--aits-blue-tint);
        color: var(--aits-blue);
    }
    body.theme-dark .aits-home .tool-lucide {
        background: rgba(54, 128, 237, 0.18);
        color: var(--aits-blue-light);
    }

    /* ═════════════════════════════════════════════════════════════════
       RESPONSIVE
       ═════════════════════════════════════════════════════════════════ */
    @media (max-width: 1100px) {
        .aits-cats,
        .aits-blog-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
        .aits-stats { grid-template-columns: repeat(3, 1fr); gap: 18px 8px; }
        .aits-stat + .aits-stat::before { display: none; }
    }
    @media (max-width: 900px) {
        .aits-hero-grid { grid-template-columns: 1fr; gap: 40px; }
        .aits-hero-illust { min-height: 380px; margin-top: 20px; }
        .aits-features { grid-template-columns: 1fr; }
    }
    @media (max-width: 720px) {
        .aits-hero { padding: 32px 0 24px; text-align: center; }
        .aits-directory, .aits-trust { padding: 56px 0 40px; }

        .aits-hero-illust { display: none; }
        .aits-hero-grid { gap: 0; }

        .aits-hero-badge { margin-inline: auto; }
        .aits-hero-sub { margin-inline: auto; }
        .aits-search-form { margin-inline: auto; }
        .aits-popular { justify-content: center; }

        .aits-search-form { padding: 5px 5px 5px 14px; }
        .aits-search-form input { padding: 12px 8px; font-size: 14px; }
        .aits-home .aits-btn-search { padding: 12px 16px; font-size: 14px; }
        .aits-home .aits-btn-search svg { width: 16px; height: 16px; }

        .aits-cats,
        .aits-blog-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
        .aits-stats { grid-template-columns: repeat(2, 1fr); }
        .aits-cta-strip::before, .aits-cta-strip::after { display: none; }
        .aits-home .aits-btn-gradient { padding: 14px 28px; font-size: 15px; }

        .aits-dir-head { text-align: left; }
        .aits-feat-card { padding: 22px; }
    }
    @media (max-width: 520px) {
        .aits-cats,
        .aits-blog-grid { grid-template-columns: 1fr; }

        .aits-popular { gap: 6px 8px; justify-content: center; }
        .aits-popular-label { font-size: 12px; margin-right: 2px; width: 100%; text-align: center; }
        .aits-chip { padding: 5px 11px; font-size: 12px; }

        /* Stats: 2 columns, self-contained premium tiles */
        .aits-stats {
            grid-template-columns: repeat(2, 1fr);
            padding: 18px 14px;
            gap: 10px;
        }
        .aits-stat {
            gap: 12px;
            padding: 12px 10px;
            border-radius: var(--r-lg, 14px);
            background: linear-gradient(135deg, #fff 0%, var(--aits-blue-tint) 260%);
            border: 1px solid var(--aits-line-strong);
            box-shadow: 0 2px 6px rgba(15, 23, 42, 0.03);
            transition: transform var(--t, .18s) ease, box-shadow var(--t, .18s) ease, border-color var(--t, .18s) ease;
        }
        .aits-stat:active {
            transform: translateY(-1px);
            border-color: rgba(54, 128, 237, 0.28);
            box-shadow: 0 8px 22px rgba(54, 128, 237, 0.10);
        }
        .aits-stat + .aits-stat::before { display: none; }
        .aits-stat-ico { width: 38px; height: 38px; border-radius: var(--r-md, 10px); }
        .aits-stat-ico svg { width: 18px; height: 18px; }
        .aits-stat-num { font-size: 1.15rem; }
        .aits-stat-label { font-size: 11.5px; }

        .aits-hero-title { font-size: 2rem; }


        /* Below 560px the word would push the field under a usable width, so
           the button becomes the magnifier it already carries. `font-size:0`
           on the button is gone: it silently zeroed the label of anything
           nested here, and hiding the two elements by name is both narrower
           and readable at a glance. */
        .aits-home .aits-btn-search { padding: 12px 15px; gap: 0; }
        .aits-home .aits-btn-search .aits-btn-search-label,
        .aits-home .aits-btn-search .aits-btn-spark { display: none; }
        .aits-home .aits-btn-search .aits-btn-search-ico { display: block; width: 18px; height: 18px; }
    }

    /* ═════════════════════════════════════════════════════════════════
       DARK-MODE PASS — token-driven; every rule keys off --aits-* so
       the design.md §2.2 overrides in custom.ltr.css automatically flip
       tone. This block only re-tunes rules that ship literal RGBA
       values (blobs, chips, shadows) that tokens can't express.
       ═════════════════════════════════════════════════════════════════ */

    /* Hero — dark surfaces, still branded */
    body.theme-dark .aits-home .aits-hero {
        background:
            radial-gradient(circle at 15% 20%, rgba(54, 128, 237, 0.08), transparent 45%),
            radial-gradient(circle at 85% 80%, rgba(54, 128, 237, 0.07), transparent 40%),
            linear-gradient(180deg, var(--aits-bg) 0%, var(--aits-surface-2) 100%);
    }
    body.theme-dark .aits-home .aits-hero::before { background: rgba(54, 128, 237, 0.20); }
    body.theme-dark .aits-home .aits-hero::after  { background: rgba(96, 164, 245, 0.16); }

    /* The badge had NO dark twin, so it kept a gradient that began at
       literal white and `--aits-blue-dark` text — a pill that was white at
       the top, dark at the bottom, with navy text straddling both. That is
       the label that read as missing at night. */
    body.theme-dark .aits-home .aits-hero-badge {
        background: linear-gradient(180deg, var(--aits-card) 0%, rgba(54, 128, 237, 0.18) 100%);
        border-color: rgba(96, 164, 245, 0.32);
        color: var(--aits-blue-light);
        box-shadow: 0 4px 14px rgba(0, 0, 0, 0.42), inset 0 1px 0 rgba(255, 255, 255, 0.06);
    }
    body.theme-dark .aits-home .aits-hero-badge:hover {
        border-color: rgba(96, 164, 245, 0.55);
        box-shadow: 0 8px 22px rgba(0, 0, 0, 0.52), inset 0 1px 0 rgba(255, 255, 255, 0.08);
    }
    body.theme-dark .aits-home .aits-hero-badge svg { color: var(--aits-blue-light); }

    /* box-shadow has to be restated, not just background and border: the
       light rule ends on `inset 0 1px 0 rgba(255,255,255,1)`, and a twin
       that leaves it alone paints a hard white hairline across the top of
       the bar on a dark page — the stray edge on this control. */
    body.theme-dark .aits-home .aits-search-form {
        background: var(--aits-card);
        border-color: var(--aits-line-strong);
        box-shadow:
            0 1px 2px rgba(0, 0, 0, 0.4),
            0 12px 32px -8px rgba(0, 0, 0, 0.5),
            inset 0 1px 0 rgba(255, 255, 255, 0.05);
    }
    body.theme-dark .aits-home .aits-search-form:hover {
        border-color: rgba(96, 164, 245, 0.35);
        box-shadow:
            0 1px 2px rgba(0, 0, 0, 0.4),
            0 16px 36px -8px rgba(0, 0, 0, 0.55),
            inset 0 1px 0 rgba(255, 255, 255, 0.05);
    }
    body.theme-dark .aits-home .aits-search-form:focus-within {
        border-color: rgba(96, 164, 245, 0.55);
        box-shadow: 0 0 0 3px rgba(54, 128, 237, 0.16), 0 14px 40px rgba(0, 0, 0, 0.55);
    }
    body.theme-dark .aits-home .aits-chip {
        background: var(--aits-card);
        color: var(--aits-ink);
        border-color: var(--aits-line-strong);
    }
    body.theme-dark .aits-home .aits-chip:hover {
        background: rgba(54, 128, 237, 0.14);
        color: var(--aits-blue-light);
        border-color: rgba(96, 164, 245, 0.45);
    }
    body.theme-dark .aits-home .aits-stats {
        background: var(--aits-card);
        border-color: var(--aits-line-strong);
        box-shadow: 0 12px 32px rgba(0, 0, 0, 0.45);
    }
    body.theme-dark .aits-home .aits-stat + .aits-stat::before { background: var(--aits-line); }

    /* Keep the six hues. Flattening every tile to one translucent blue threw
       away the only thing distinguishing the six counters at a glance, and a
       .18-alpha fill under a pale-blue glyph is the washed-out chip that got
       reported. These are saturated brand colours — they carry a white glyph
       on a dark page perfectly well; only the shadow needs to change, because
       a coloured glow reads as smudge at night where a black one reads as
       depth. */
    body.theme-dark .aits-home .aits-stat-ico {
        background: linear-gradient(135deg, var(--stc) 0%, var(--stc2) 100%);
        color: #fff;
        box-shadow: 0 6px 16px rgba(0, 0, 0, 0.45), inset 0 1px 0 rgba(255, 255, 255, 0.18);
    }
    body.theme-dark .aits-home .aits-stat:hover { background: rgba(255, 255, 255, 0.035); }

    /* Laptop illustration — dark screen */
    body.theme-dark .aits-home .aits-laptop {
        background: linear-gradient(180deg, #1C1C1F 0%, #0A0A0C 100%);
        box-shadow: 0 40px 90px -20px rgba(0, 0, 0, 0.8);
    }
    body.theme-dark .aits-home .aits-laptop-screen {
        background: radial-gradient(circle at 50% 42%, #232327 0%, #17171A 60%, #101012 100%);
    }
    body.theme-dark .aits-home .aits-laptop-icon { filter: drop-shadow(0 18px 42px rgba(54, 128, 237, 0.50)); }
    body.theme-dark .aits-home .aits-laptop-base { background: linear-gradient(180deg, #2B2B2B 0%, #0A0A0C 100%); }

    /* Float tiles */
    body.theme-dark .aits-home .aits-float {
        background: rgba(26, 26, 29, 0.85);
        border-color: rgba(255, 255, 255, 0.08);
        box-shadow: 0 12px 28px rgba(0, 0, 0, 0.55);
    }
    body.theme-dark .aits-home .aits-float.aits-f1,
    body.theme-dark .aits-home .aits-float.aits-f5 {
        background: linear-gradient(135deg, var(--aits-blue) 0%, var(--aits-blue-dark) 100%);
        color: #fff;
    }
    body.theme-dark .aits-home .aits-float.aits-f4 {
        background: linear-gradient(135deg, var(--aits-violet) 0%, #4C2FBE 100%);
        color: #fff;
    }

    /* Directory dark surface */
    body.theme-dark .aits-home .aits-directory {
        background:
            radial-gradient(ellipse 60% 40% at 50% 0%, rgba(54, 128, 237, 0.10), transparent 60%),
            linear-gradient(180deg, var(--aits-bg) 0%, var(--aits-surface-2) 100%);
    }
    body.theme-dark .aits-home .aits-directory::before {
        background-image: radial-gradient(circle, rgba(96, 164, 245, 0.10) 1px, transparent 1.5px);
    }
    body.theme-dark .aits-home .aits-cat {
        background: var(--aits-card);
        border-color: var(--aits-line-strong);
    }
    body.theme-dark .aits-home .aits-cat:hover {
        background: var(--aits-surface-3);
        border-color: rgba(96, 164, 245, 0.45);
        box-shadow: 0 18px 44px -14px rgba(54, 128, 237, 0.30), 0 12px 28px rgba(0, 0, 0, 0.55);
    }
    body.theme-dark .aits-home .aits-cat-head { border-bottom-color: var(--aits-line-strong); }
    body.theme-dark .aits-home .aits-cat-list a { color: var(--aits-txt); }
    body.theme-dark .aits-home .aits-cat-list a:hover { color: var(--aits-blue-light); background: rgba(54, 128, 237, 0.10); }
    body.theme-dark .aits-home .aits-cat-more { background: rgba(54, 128, 237, 0.14); color: var(--aits-blue-light); }
    body.theme-dark .aits-home .aits-cat-more:hover {
        background: linear-gradient(135deg, var(--aits-blue) 0%, var(--aits-blue-dark) 100%);
        color: #fff !important;
    }

    /* Trust section — dark surface + banner shadow */
    body.theme-dark .aits-home .aits-trust { background: var(--aits-bg); }

    /* Feature + blog cards dark */
    body.theme-dark .aits-home .aits-feat-card,
    body.theme-dark .aits-home .aits-post {
        background: var(--aits-card);
        border-color: var(--aits-line-strong);
    }
    body.theme-dark .aits-home .aits-feat-card:hover,
    body.theme-dark .aits-home .aits-post:hover {
        border-color: rgba(96, 164, 245, 0.45);
        box-shadow: 0 18px 42px -14px rgba(54, 128, 237, 0.26), 0 12px 28px rgba(0, 0, 0, 0.55);
    }
    body.theme-dark .aits-home .aits-review {
        background: var(--aits-surface-3);
        border: 1px solid var(--aits-line);
    }
    body.theme-dark .aits-home .aits-post-media,
    body.theme-dark .aits-home .aits-post-media-fallback {
        background: linear-gradient(135deg, var(--aits-surface-3) 0%, var(--aits-bg-deep) 100%);
        color: var(--aits-mut);
    }
    body.theme-dark .aits-home .aits-post-cat {
        background: rgba(54, 128, 237, 0.16);
        color: var(--aits-blue-light);
    }
    body.theme-dark .aits-home .aits-post-more { color: var(--aits-blue-light); }

    body.theme-dark .aits-home .aits-cta-strip::before,
    body.theme-dark .aits-home .aits-cta-strip::after {
        background-image: radial-gradient(circle, rgba(96, 164, 245, 0.30) 1.2px, transparent 1.5px);
    }

    /* Mobile stat tiles dark */
    @media (max-width: 520px) {
        body.theme-dark .aits-home .aits-stat {
            background: linear-gradient(135deg, var(--aits-card) 0%, rgba(54, 128, 237, 0.10) 260%);
            border-color: var(--aits-line-strong);
            box-shadow: 0 2px 8px rgba(0, 0, 0, 0.35);
        }
        body.theme-dark .aits-home .aits-stat:active {
            border-color: rgba(96, 164, 245, 0.45);
            box-shadow: 0 10px 24px rgba(54, 128, 237, 0.20);
        }
    }

    /* ═════════════════════════════════════════════════════════════════
       REDUCED MOTION — respect user preference: kill every float
       animation (hero orbs, floating chips, robot mascot, banner chips)
       and neutralize hover-lift transforms.
       ═════════════════════════════════════════════════════════════════ */
    @media (prefers-reduced-motion: reduce) {
        .aits-home *,
        .aits-home *::before,
        .aits-home *::after {
            animation-duration: 0.001ms !important;
            animation-iteration-count: 1 !important;
            transition-duration: 0.001ms !important;
        }
        .aits-home .aits-float,
        .aits-home .aits-robot,
        .aits-home .aitsw-live b {
            animation: none !important;
            transform: none !important;
        }
        .aits-home .aits-cat:hover,
        .aits-home .aits-feat-card:hover,
        .aits-home .aits-post:hover,
        .aits-home .aits-chip:hover,
        .aits-home .aits-btn:hover,
        .aits-home .aits-btn-search:hover,
        .aits-home .aits-cat:hover .aits-cat-ico {
            transform: none !important;
        }
        .aits-home .aits-cat-list a:hover { transform: none !important; }
    }

    /* ═════════════════════════════════════════════════════════════════
       §TPX) The homepage's card language, on /tools

       The homepage got this pass first (`assets/css/homepage.css`, §HPXP,
       2026-08-13) and /tools is an INDEPENDENT copy of that design — its own
       view, its own `<style>`, its own `--aits-*` tokens — so nothing there is
       reusable as an import. What transfers is the RECIPE, exactly as the
       §WHY band above ported the detail page's:

         · a soft 152° diagonal wash, corner to corner, in the card's OWN hue
         · a small saturated bloom concentrated in ONE corner
         · a hairline edge tinted in that same hue
         · a masked conic ORBIT ring that sweeps the border on hover

       ── The defect this fixes ─────────────────────────────────────────
       Every card on this page — 8 directory cards, 3 feature cards, the
       reviews, the blog posts — carried its hue in a `::before` tint held at
       OPACITY ZERO until hover. Two consequences, both bad, and both are the
       same ones the homepage had:

         1. AT REST the page was white cards on a white ground separated by a
            hairline. The eight-hue palette existed but was invisible until a
            pointer moved through it.
         2. ON TOUCH hover never arrives, so the resting state was the ONLY
            state those visitors ever saw — the palette was desktop-only by
            accident.

       Retiring that hover-only tint is also what FREES `::before` for the
       ring, which is why this needs no new markup. `::after` — the top edge
       shine bar — is untouched on both hosts that have one.

       ── Scope ─────────────────────────────────────────────────────────
       ⚠️ NOTHING HERE TOUCHES `.aitsw-*`. The "Why AIToolsay?" band was
       rebuilt on this same language on 2026-08-13 and is explicitly out of
       scope; every selector below names a host outside it, and the ramp is
       set on those hosts rather than on a shared ancestor precisely so it
       cannot inherit into that band.

       ── Why the triplets are restated ─────────────────────────────────
       `--cc` / `--fc` / `--stc` are composited HEXES. A wash, a bloom and a
       conic tail need to vary ALPHA along a gradient, which needs the hue as
       an RGB TRIPLET, and no existing token carries one. The values below are
       the same eight hues already cycling on this page, written the one way
       `rgba()` can consume.
       ═══════════════════════════════════════════════════════════════════ */

    @property --tpx-spin { syntax: "<angle>"; inherits: false; initial-value: 0deg; }
    @keyframes tpx-orbit { to { --tpx-spin: 360deg; } }

    /* ── §TPX-RAMP) Four numbers, one dark rule ───────────────────────
       Wash start, wash end, edge and bloom are set once here and re-set once
       under `body.theme-dark`. Every host reads them, so a dark retune is
       four numbers in one place rather than a second copy of this block that
       drifts out of step with the first.

       The alphas are the homepage's measured values, and they were measured
       against the same two grounds this page uses — #FFFFFF light, and a card
       (#17171A) that is LIGHTER than the dark ground, so at night the wash is
       free to carry hue rather than separation and every alpha rises. */
    .aits-home .aits-cat,
    .aits-home .aits-feat-card,
    .aits-home .aits-post,
    .aits-home .aits-review,
    .aits-home .aits-stat {
        --tpx-rgb: 54, 128, 237;
        --tpx-a1: .075;
        --tpx-a2: .055;
        --tpx-edge: .20;
        --tpx-bloom: .20;
        --tpx-hot: 255, 255, 255;   /* the specular core of the comet */
        --tpx-o1: .5;               /* leading tail */
        --tpx-o2: .88;              /* trailing tail */
        --tpx-o3: 1;                /* core */
    }
    body.theme-dark .aits-home .aits-cat,
    body.theme-dark .aits-home .aits-feat-card,
    body.theme-dark .aits-home .aits-post,
    body.theme-dark .aits-home .aits-review,
    body.theme-dark .aits-home .aits-stat {
        --tpx-a1: .13;
        --tpx-a2: .09;
        --tpx-edge: .30;
        --tpx-bloom: .17;
        --tpx-o1: .66;
        --tpx-o2: 1;
    }

    /* The eight directory hues, matching the `--cc` cycle above one for one.
       (0,4,0) so it clears the (0,2,0) `:nth-child` rules that set `--cc`. */
    .aits-home .aits-cats .aits-cat:nth-child(8n+1) { --tpx-rgb: 54, 128, 237; }
    .aits-home .aits-cats .aits-cat:nth-child(8n+2) { --tpx-rgb: 112, 72, 232; }
    .aits-home .aits-cats .aits-cat:nth-child(8n+3) { --tpx-rgb: 236, 72, 153; }
    .aits-home .aits-cats .aits-cat:nth-child(8n+4) { --tpx-rgb: 12, 166, 120; }
    .aits-home .aits-cats .aits-cat:nth-child(8n+5) { --tpx-rgb: 245, 158, 11; }
    .aits-home .aits-cats .aits-cat:nth-child(8n+6) { --tpx-rgb: 6, 182, 212; }
    .aits-home .aits-cats .aits-cat:nth-child(8n+7) { --tpx-rgb: 239, 68, 68; }
    .aits-home .aits-cats .aits-cat:nth-child(8n+8) { --tpx-rgb: 79, 70, 229; }

    .aits-home .aits-features .aits-feat-card:nth-child(1) { --tpx-rgb: 54, 128, 237; }
    .aits-home .aits-features .aits-feat-card:nth-child(2) { --tpx-rgb: 112, 72, 232; }
    .aits-home .aits-features .aits-feat-card:nth-child(3) { --tpx-rgb: 245, 158, 11; }

    /* The review card already hovers amber and sits inside the amber feature
       card, so it orbits amber — the light belongs to the card it is lighting,
       not to a page-wide default. The blog post stays brand blue: it is the
       one card here whose accent is the site's rather than its own. */
    .aits-home .aits-review { --tpx-rgb: 245, 158, 11; }
    .aits-home .aits-post   { --tpx-rgb: 54, 128, 237; }

    /* ── §TPX-WASH) The surface ───────────────────────────────────────
       `background-color` and `background-image` as SEPARATE properties, never
       the `background` shorthand: the shorthand resets colour to transparent,
       which would drop `--aits-card` out from under the wash and let the
       section ground show through every card.

       The fade goes to `rgba(same-hue, 0)`, never the `transparent` KEYWORD —
       that interpolates through transparent BLACK in sRGB and leaves a grey,
       dirty fringe down the middle of the card.

       The bloom rides in the SAME stack on these two hosts because their
       `::before` is now the ring and their `::after` is the shine bar. It is
       therefore static: background layers cannot cross-fade. A static bloom
       under a moving ring still reads as one designed surface, and the
       alternative was adding a span to the markup.

       The bloom's CENTRE sits OUTSIDE the box on purpose, so what lands on
       the card is the falloff rather than a circle drawn on it. */
    .aits-home .aits-cat,
    .aits-home .aits-feat-card {
        background-color: var(--aits-card);
        background-image:
            radial-gradient(240px 210px at calc(100% + 32px) -58px,
                rgba(var(--tpx-rgb), var(--tpx-bloom)) 0%,
                rgba(var(--tpx-rgb), 0) 72%),
            linear-gradient(152deg,
                rgba(var(--tpx-rgb), var(--tpx-a1)) 0%,
                rgba(var(--tpx-rgb), 0)            48%,
                rgba(var(--tpx-rgb), var(--tpx-a2)) 100%);
        background-repeat: no-repeat;
        border-color: rgba(var(--tpx-rgb), var(--tpx-edge));
    }

    /* The blog card has both pseudos free, so its bloom is a real element and
       can swell on hover — see §TPX-BLOOM. Only the wash is a layer here.

       ⚠️ `position: relative` and `isolation: isolate` are SET here, not
       assumed: `.aits-post` had neither. Without position the ring has nothing
       to pin to; without isolation `z-index:-1` escapes to an ancestor's
       stacking context and the bloom paints BEHIND the card's own background,
       i.e. invisibly, with the CSS looking perfectly correct. */
    .aits-home .aits-post {
        position: relative;
        isolation: isolate;
        background-color: var(--aits-card);
        background-image:
            linear-gradient(152deg,
                rgba(var(--tpx-rgb), var(--tpx-a1)) 0%,
                rgba(var(--tpx-rgb), 0)            48%,
                rgba(var(--tpx-rgb), var(--tpx-a2)) 100%);
        background-repeat: no-repeat;
        border-color: rgba(var(--tpx-rgb), var(--tpx-edge));
    }

    /* The review keeps its own vertical white→ground gradient as the BOTTOM
       layer — it is what gives a 14px card its body — with the tone wash laid
       over it. Composed rather than replaced, so the card still reads the way
       it was designed to. */
    .aits-home .aits-review {
        isolation: isolate;
        /* Defensive, and the audit is why it is here. The base rule sets the
           `background` SHORTHAND, which leaves background-COLOR at its initial
           `transparent`; the card is opaque today only because the 180deg
           gradient composed below is. Naming the colour means the card cannot
           go see-through if `--aits-bg` ever gains an alpha. */
        background-color: var(--aits-card);
        background-image:
            linear-gradient(152deg,
                rgba(var(--tpx-rgb), var(--tpx-a1)) 0%,
                rgba(var(--tpx-rgb), 0)            48%,
                rgba(var(--tpx-rgb), var(--tpx-a2)) 100%),
            linear-gradient(180deg, #FFFFFF 0%, var(--aits-bg) 100%);
        background-repeat: no-repeat;
        border-color: rgba(var(--tpx-rgb), var(--tpx-edge));
    }

    /* ── §TPX-DARK) The four hosts whose dark rule uses the SHORTHAND ──
       ⚠️ THIS IS THE TRAP THIS PAGE SETS. `body.theme-dark .aits-home
       .aits-cat` (and the same for feat-card, post and review) sets
       `background:` — the SHORTHAND, at (0,3,1) — which both out-ranks the
       (0,2,0) wash above AND resets background-image to none. Without these
       twins every card on the page silently loses its wash after dark, and
       ONLY after dark, which is the kind of bug that ships.

       The dark `:hover` rule does it again at (0,4,1), swapping the card to
       `--aits-surface-3`, so the hover state needs its own twin or the wash
       disappears the moment a pointer lands on it. */
    body.theme-dark .aits-home .aits-cat,
    body.theme-dark .aits-home .aits-feat-card {
        background-color: var(--aits-card);
        background-image:
            radial-gradient(240px 210px at calc(100% + 32px) -58px,
                rgba(var(--tpx-rgb), var(--tpx-bloom)) 0%,
                rgba(var(--tpx-rgb), 0) 72%),
            linear-gradient(152deg,
                rgba(var(--tpx-rgb), var(--tpx-a1)) 0%,
                rgba(var(--tpx-rgb), 0)            48%,
                rgba(var(--tpx-rgb), var(--tpx-a2)) 100%);
        background-repeat: no-repeat;
        border-color: rgba(var(--tpx-rgb), var(--tpx-edge));
    }
    body.theme-dark .aits-home .aits-cat:hover {
        background-color: var(--aits-surface-3);
        background-image:
            radial-gradient(240px 210px at calc(100% + 32px) -58px,
                rgba(var(--tpx-rgb), var(--tpx-bloom)) 0%,
                rgba(var(--tpx-rgb), 0) 72%),
            linear-gradient(152deg,
                rgba(var(--tpx-rgb), var(--tpx-a1)) 0%,
                rgba(var(--tpx-rgb), 0)            48%,
                rgba(var(--tpx-rgb), var(--tpx-a2)) 100%);
    }
    body.theme-dark .aits-home .aits-post {
        background-color: var(--aits-card);
        background-image:
            linear-gradient(152deg,
                rgba(var(--tpx-rgb), var(--tpx-a1)) 0%,
                rgba(var(--tpx-rgb), 0)            48%,
                rgba(var(--tpx-rgb), var(--tpx-a2)) 100%);
        background-repeat: no-repeat;
        border-color: rgba(var(--tpx-rgb), var(--tpx-edge));
    }
    body.theme-dark .aits-home .aits-review {
        background-color: var(--aits-surface-3);
        background-image:
            linear-gradient(152deg,
                rgba(var(--tpx-rgb), var(--tpx-a1)) 0%,
                rgba(var(--tpx-rgb), 0)            48%,
                rgba(var(--tpx-rgb), var(--tpx-a2)) 100%);
        background-repeat: no-repeat;
        border: 1px solid rgba(var(--tpx-rgb), var(--tpx-edge));
    }

    /* ── §TPX-BLOOM) The two hosts that get the animated bloom ────────
       The bloom SWELLS from the corner it hangs off, so the light appears to
       move rather than simply brighten. Paired with the ring on the same
       hover, that is the card's whole answer. */
    .aits-home .aits-post::after,
    .aits-home .aits-review::after {
        content: '';
        position: absolute;
        inset: 0;
        z-index: -1;
        pointer-events: none;
        border-radius: inherit;
        background: radial-gradient(220px 190px at calc(100% + 28px) -50px,
            rgba(var(--tpx-rgb), var(--tpx-bloom)) 0%,
            rgba(var(--tpx-rgb), 0) 72%) no-repeat;
        opacity: .92;
        transform-origin: 100% 0;
        transition: opacity .36s ease, transform .52s cubic-bezier(.16, 1, .3, 1);
    }

    @media (hover: hover) and (pointer: fine) {
        .aits-home .aits-post:hover::after,
        .aits-home .aits-review:hover::after { opacity: 1; transform: scale(1.14); }
    }

    /* ── §TPX-ORBIT) The rotating light ───────────────────────────────
       One recipe at four scales. Speed is a statement about size: a big card
       sweeps slowly because slow reads as large, and a small one sweeps fast
       because it has less border to cross.

         feature card    6.5s
         directory card  4.4s
         blog post       3.8s
         review          3.0s   the smallest host

       THE HUE IS NOT FIXED — it reads `--tpx-rgb`, so a violet card orbits
       violet and an amber one amber. Dark mode is not a second copy of an
       eleven-stop conic; it is two alpha numbers, lifted because a 50%-alpha
       tail that reads over #FFFFFF disappears over #17171A.

       A NEW registered property and keyframe rather than reusing the §WHY
       band's `--aitsw-spin`: that block is documented as self-contained, and
       hanging four more hosts off its internals would quietly make that
       false — and it is the one band this pass must not touch. */
    @supports ((-webkit-mask-composite: xor) or (mask-composite: exclude)) {
        /* Two full-box mask layers — one clipped to the content box, one to
           the border box — composited with xor, leaving exactly the padding
           band. `mask-clip` follows `border-radius`, so the inner cut is a
           rounded rect on a rounded rect and the corners stay true.

           ⚠️ THE @supports GATE IS LOAD-BEARING, NOT DEFENSIVE. Without
           mask-composite the two layers UNION and the conic paints as a SOLID
           BLOCK over the card, covering every word on it. Where the mask is
           missing there is simply no ring and the existing border/lift hover
           carries the state.

           ⚠️ inset: 0, not -1px. Three of these four hosts carry
           `overflow: hidden` so they can clip their own tint, and a ring hung
           1px outside gets sliced off on all four sides — which reads as a
           rendering fault, not as a highlight. */
        .aits-home .aits-cat::before,
        .aits-home .aits-feat-card::before,
        .aits-home .aits-post::before,
        .aits-home .aits-review::before {
            content: '';
            position: absolute;
            inset: 0;
            /* The two repurposed slots carried a 90px top strip and a
               negative z-index from the tint they used to run. Both have to be
               unwound or the ring inherits a sliver of its predecessor's box
               and paints behind the card. */
            left: 0;
            right: 0;
            width: auto;
            height: auto;
            transform: none;
            z-index: 2;
            pointer-events: none;
            border-radius: inherit;
            padding: var(--tpx-t, 1.5px);
            --tpx-spin: 0deg;
            background: conic-gradient(from var(--tpx-spin),
                rgba(var(--tpx-rgb), 0)               0deg,
                rgba(var(--tpx-rgb), var(--tpx-o1))  30deg,
                rgba(var(--tpx-hot), var(--tpx-o3))  52deg,
                rgba(var(--tpx-rgb), var(--tpx-o2))  74deg,
                rgba(var(--tpx-rgb), 0)             118deg,
                rgba(var(--tpx-rgb), 0)             180deg,
                rgba(var(--tpx-rgb), var(--tpx-o1)) 210deg,
                rgba(var(--tpx-hot), var(--tpx-o3)) 232deg,
                rgba(var(--tpx-rgb), var(--tpx-o2)) 254deg,
                rgba(var(--tpx-rgb), 0)             298deg,
                rgba(var(--tpx-rgb), 0)             360deg);
            -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
                    mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
            -webkit-mask-composite: xor;
                    mask-composite: exclude;
            opacity: 0;
            transition: opacity .32s ease;
            animation: tpx-orbit var(--tpx-sp, 4s) linear infinite;
            /* A paused animation does not tick, so a grid of idle cards costs
               nothing — and re-entering RESUMES the sweep rather than snapping
               the comet back to 0deg under the pointer. */
            animation-play-state: paused;
        }

        .aits-home .aits-feat-card::before { --tpx-sp: 6.5s; }
        .aits-home .aits-cat::before       { --tpx-sp: 4.4s; }
        .aits-home .aits-post::before      { --tpx-sp: 3.8s; }
        .aits-home .aits-review::before    { --tpx-sp: 3.0s; --tpx-t: 1.4px; }

        /* Keyboard is deliberately OUTSIDE the hover query — a keyboard on a
           touch screen is a real combination, and focus deserves the same
           answer as the pointer. The directory and feature cards are DIVs
           holding links, so they take `:focus-within`; the post is itself an
           anchor and takes `:focus-visible`. */
        .aits-home .aits-cat:focus-within::before,
        .aits-home .aits-feat-card:focus-within::before,
        .aits-home .aits-post:focus-visible::before,
        .aits-home .aits-review:focus-within::before { opacity: 1; animation-play-state: running; }

        @media (hover: hover) and (pointer: fine) {
            /* (0,3,1). The two repurposed slots already carry
               `.aits-cat:hover::before { opacity: 1 }` at (0,2,1) from the
               tint they used to run, so they have to be out-ranked rather than
               merely followed — otherwise the ring appears but never sweeps,
               because `animation-play-state` was never set. */
            .aits-home .aits-cat:hover::before,
            .aits-home .aits-feat-card:hover::before,
            .aits-home .aits-post:hover::before,
            .aits-home .aits-review:hover::before { opacity: 1; animation-play-state: running; }

            /* The card steps BACK the moment a link inside it claims the
               pointer, so the thing under the cursor always wins — the same
               choreography the homepage and the detail pages use, which is
               what makes the three read as one site. Without `:has()` the card
               simply stays lit: a degradation, not a break. */
            .aits-home .aits-cat:has(.aits-cat-list a:hover)::before,
            .aits-home .aits-feat-card:has(a:hover)::before { opacity: .3; }
        }
    }

    /* ── §TPX-LIFT) Depth, matched across the four hosts ──────────────
       The tone is carried into the lift shadow at low alpha, so a violet card
       casts a violet-tinged shadow rather than the same grey as its blue
       neighbour. Written on the SHADOW only — every host keeps its own
       transform and radius, because this pass is about surface, not geometry,
       and flattening four hosts to one shape would cost the page its rhythm.

       `color-mix()` is deliberately NOT used, unlike the existing hover rules:
       the triplet is already an RGB, so `rgba()` needs no fallback block and
       works everywhere the rest of this file does. */
    .aits-home .aits-cat,
    .aits-home .aits-feat-card,
    .aits-home .aits-post {
        box-shadow:
            inset 0 1px 0 rgba(255, 255, 255, .7),
            0 1px 2px rgba(15, 23, 42, .03),
            0 14px 30px -22px rgba(var(--tpx-rgb), .40),
            0 8px 20px -18px rgba(15, 23, 42, .22);
    }
    body.theme-dark .aits-home .aits-cat,
    body.theme-dark .aits-home .aits-feat-card,
    body.theme-dark .aits-home .aits-post {
        box-shadow:
            inset 0 1px 0 rgba(255, 255, 255, .05),
            0 1px 2px rgba(0, 0, 0, .42),
            0 14px 30px -22px rgba(var(--tpx-rgb), .34),
            0 8px 20px -18px rgba(0, 0, 0, .70);
    }

    /* ── §TPX-RESP) Tablet and phone ─────────────────────────────────
       The bloom is sized in PIXELS, so it does not shrink with the card the
       way the wash does — a 240px bloom on a 340px desktop card is light
       falling on a corner, and the same 240px bloom on a 320px phone card is
       a flood across the whole surface. The wash and the edge are untouched:
       they are proportional already, and the colour system has to survive the
       breakpoint or the phone gets back the flat white page this pass exists
       to remove. */
    @media (max-width: 991.98px) {
        .aits-home .aits-cat,
        .aits-home .aits-feat-card,
        body.theme-dark .aits-home .aits-cat,
        body.theme-dark .aits-home .aits-feat-card {
            background-image:
                radial-gradient(190px 165px at calc(100% + 26px) -46px,
                    rgba(var(--tpx-rgb), var(--tpx-bloom)) 0%,
                    rgba(var(--tpx-rgb), 0) 72%),
                linear-gradient(152deg,
                    rgba(var(--tpx-rgb), var(--tpx-a1)) 0%,
                    rgba(var(--tpx-rgb), 0)            48%,
                    rgba(var(--tpx-rgb), var(--tpx-a2)) 100%);
        }
    }

    @media (max-width: 767.98px) {
        /* One step thinner. A 1.5px ring on a 320px card is proportionally
           twice what it is on a 640px one, and at that width it stops reading
           as a lit edge and starts reading as a second border. */
        .aits-home .aits-cat::before,
        .aits-home .aits-feat-card::before,
        .aits-home .aits-post::before,
        .aits-home .aits-review::before { --tpx-t: 1.2px; }

        .aits-home .aits-cat,
        .aits-home .aits-feat-card,
        body.theme-dark .aits-home .aits-cat,
        body.theme-dark .aits-home .aits-feat-card {
            background-image:
                radial-gradient(150px 135px at calc(100% + 20px) -38px,
                    rgba(var(--tpx-rgb), var(--tpx-bloom)) 0%,
                    rgba(var(--tpx-rgb), 0) 72%),
                linear-gradient(152deg,
                    rgba(var(--tpx-rgb), var(--tpx-a1)) 0%,
                    rgba(var(--tpx-rgb), 0)            48%,
                    rgba(var(--tpx-rgb), var(--tpx-a2)) 100%);
        }

        .aits-home .aits-post::after,
        .aits-home .aits-review::after {
            background: radial-gradient(160px 140px at calc(100% + 20px) -36px,
                rgba(var(--tpx-rgb), var(--tpx-bloom)) 0%,
                rgba(var(--tpx-rgb), 0) 72%) no-repeat;
        }
    }

    /* ── §TPX-STATS) The hero counters, where they become cards ───────
       Above 520px these are a divider-separated ROW, not cards, and they are
       left exactly as they are — a wash on a borderless tile in a strip would
       read as six stains, not six surfaces.

       Below 520px the responsive block already turns them into real 2-up
       cards — and gives all six the SAME blue gradient, throwing away the
       six-hue `--stc` cycle the tiles were built on. That is the same defect
       the dark `.aits-stat-ico` rule had. Each tile now washes in its OWN hue,
       so the phone gets the palette the desktop row has. */
    @media (max-width: 520px) {
        .aits-home .aits-stats .aits-stat:nth-child(1) { --tpx-rgb: 54, 128, 237; }
        .aits-home .aits-stats .aits-stat:nth-child(2) { --tpx-rgb: 112, 72, 232; }
        .aits-home .aits-stats .aits-stat:nth-child(3) { --tpx-rgb: 245, 158, 11; }
        .aits-home .aits-stats .aits-stat:nth-child(4) { --tpx-rgb: 12, 166, 120; }
        .aits-home .aits-stats .aits-stat:nth-child(5) { --tpx-rgb: 236, 72, 153; }
        .aits-home .aits-stats .aits-stat:nth-child(6) { --tpx-rgb: 6, 182, 212; }

        .aits-home .aits-stats .aits-stat,
        body.theme-dark .aits-home .aits-stats .aits-stat {
            background-color: var(--aits-card);
            background-image:
                radial-gradient(120px 105px at calc(100% + 16px) -30px,
                    rgba(var(--tpx-rgb), var(--tpx-bloom)) 0%,
                    rgba(var(--tpx-rgb), 0) 72%),
                linear-gradient(152deg,
                    rgba(var(--tpx-rgb), var(--tpx-a1)) 0%,
                    rgba(var(--tpx-rgb), 0)            48%,
                    rgba(var(--tpx-rgb), var(--tpx-a2)) 100%);
            background-repeat: no-repeat;
            border: 1px solid rgba(var(--tpx-rgb), var(--tpx-edge));
        }
    }

    /* ── §TPX-A11Y) Touch, reduced motion, forced colours ─────────────
       On a touch screen the ring can never be triggered, and an animation
       that can never run is still a compositor layer per card. Suppressing it
       there is a battery decision, not a design one — the resting wash, the
       bloom and the tinted edge are what those visitors were getting none of
       before, and all three remain. */
    @media (hover: none) {
        .aits-home .aits-cat::before,
        .aits-home .aits-feat-card::before,
        .aits-home .aits-post::before,
        .aits-home .aits-review::before { animation: none; }
    }

    @media (prefers-reduced-motion: reduce) {
        /* The ring still APPEARS on hover and focus — it is state, and
           removing state is not what reduced motion asks for. What stops is
           the sweep. */
        .aits-home .aits-cat::before,
        .aits-home .aits-feat-card::before,
        .aits-home .aits-post::before,
        .aits-home .aits-review::before { animation: none !important; }

        .aits-home .aits-post::after,
        .aits-home .aits-review::after { transition: none !important; }

        .aits-home .aits-post:hover::after,
        .aits-home .aits-review:hover::after { transform: none; }
    }

    @media (forced-colors: active) {
        /* Every layer this block adds is decorative and none of it survives a
           forced palette intact — a conic in system colours is a grey smear
           across the border. The hairline is restored as a real border so the
           cards stay separable, which is all forced colours needs from them. */
        .aits-home .aits-cat::before,
        .aits-home .aits-feat-card::before,
        .aits-home .aits-post::before,
        .aits-home .aits-review::before,
        .aits-home .aits-post::after,
        .aits-home .aits-review::after { display: none; }

        .aits-home .aits-cat,
        .aits-home .aits-feat-card,
        .aits-home .aits-post,
        .aits-home .aits-review {
            background-image: none;
            border: 1px solid CanvasText;
            box-shadow: none;
        }
    }
