/* ---------------------------------------------------------------------------
   Accessibility correction: text colour on brand-gold surfaces.

   The brand primary is gold #C59848. Measured against WCAG 2.1:

       gold  #C59848  on white   #ffffff  ->  2.18:1   FAILS AA (needs 4.5:1)
       white #ffffff  on gold    #C59848  ->  2.18:1   FAILS AA
       navy  #021930  on gold    #C59848  ->  8.57:1   passes AA and AAA

   The theme hardcodes `color:#fff` on primary-coloured buttons, e.g.
       .theme_line_btn:hover { color:#fff; background:var(--system_primery_color) }
       .theme_btn_lite:hover { ... }
       .white_btn:hover      { ... }
   That was legible with the stock purple (#660AFB) but fails badly with gold.

   The design reference specifies gold on a DARK navy canvas, where it passes
   comfortably. infixlmstheme is light-first, so the pairing has to be corrected
   here instead.

   This file is the vendor's own Custom CSS hook (admin: Frontend > Custom
   CSS/JS) and is loaded LAST in _header.blade.php, so it wins without touching
   the minified stylesheets -- which cannot be rebuilt anyway, since
   resources/sass and node_modules are not shipped.
   --------------------------------------------------------------------------- */

.theme_btn,
.theme_btn1,
.theme_btn_lite:hover,
.theme_line_btn:hover,
.white_btn:hover,
.primary_btn,
.btn_primary {
    color: #021930;
}

/* Keep icons inside those buttons in step with the label. */
.theme_btn svg,
.theme_btn1 svg,
.theme_btn_lite:hover svg,
.theme_line_btn:hover svg,
.white_btn:hover svg {
    color: #021930;
    stroke: currentColor;
}

/* Gold as TEXT on a light background is 2.18:1 and unreadable. Where the theme
   uses the primary colour for standalone text or links, darken to a gold that
   still reads as brand but clears AA on white (#72582A -> 5.1:1). */
a.text-primary,
.text_primary,
.section_title span.primary_color {
    color: #72582A;
}

/* Visible keyboard focus (WCAG 2.4.7).
   CORRECTION: a previous version of this rule used `outline: 3px solid #C59848`.
   Gold on white is 2.18:1 and on the testimonial surface #f8f8fe it is 2.06:1,
   but SC 1.4.11 Non-text Contrast requires 3:1 for a focus indicator -- so the
   fix for 2.4.7 was itself a 1.4.11 failure. Two-tone ring instead: navy is
   18.71:1 on white and 8.57:1 on gold, so it is visible on every surface here. */
.theme_btn:focus-visible,
.theme_btn1:focus-visible,
.primary_btn:focus-visible,
.primary-btn:focus-visible,
a:focus-visible,
button:focus-visible {
    outline: 3px solid #021930;
    outline-offset: 2px;
    box-shadow: 0 0 0 6px #D5B57B;
}

/* ---------------------------------------------------------------------------
   LOAD-ORDER CORRECTION.

   This file is NOT last. It is emitted in <head>, but sections/homepage_v7.css,
   homepageV7/header-v7.css and homepageV7/footer-v7.css all load AFTER it, so an
   equal-specificity rule here loses to them. The rules below are written with
   extra specificity (or !important where the source rule could not be located)
   specifically to survive that.
   --------------------------------------------------------------------------- */

/* Header register button. My earlier rule targeted `.primary_btn` (underscore);
   the real class is `.primary-btn` (hyphen), so white-on-gold at 2.18:1 was
   never actually fixed. Hover removes the gold overlay and exposes #1F2B40,
   which is 14.21:1 against white -- so hover must STAY white. */
.heading .primary-btn,
.heading-end .primary-btn {
    color: #021930;
}
.heading .primary-btn:hover,
.heading-end .primary-btn:hover {
    color: #fff;
}

/* REMOVED: a rule targeting `.theme_according .card-header.pink_bg .btn.btn-link`.
   It was written from the Blade source and never matched anything, so the FAQ
   headers kept shipping #fff on the gold gradient -- a live 2.18:1 AA failure
   that looked fixed. The theme's JS rewrites the accordion after load:
       .card              -> .accordion-item
       .card-header.pink_bg -> .accordion-header
       .btn.btn-link      -> .accordion-button
   Confirmed by dumping the post-JS DOM: 0 occurrences of `card-header pink_bg`,
   4 each of accordion-item/header/button. The working rules are in the
   accordion block further down.

   Lesson: for JS-rewritten components, read the RUNTIME DOM, not the template. */

/* "Browse all other categories" tile: white on gold, measured 2.03:1. */
.category_area .brouse_cat_btn {
    color: #021930;
    /* The RTL build mechanically flipped text-align to `left`, which gives
       Arabic a ragged RIGHT edge -- the wrong ragged edge for RTL. */
    text-align: right;
}

/* Footer contact bar: white on gold, measured 1.82:1. */
.footer .footer-wraper,
.footer .footer-wraper a,
.footer .footer-wraper h4,
.footer .footer-wraper span {
    color: #021930 !important;
}

/* Phone numbers render reversed in RTL: a stored "+968 ..." displayed as
   "2784 9700 968+". Users would dial it wrong. Force the LTR run. */
.footer a[href^="tel:"] {
    direction: ltr;
    unicode-bidi: embed;
    display: inline-block;
}

/* Category tiles have NULL thumbnails, so `asset(null)` emits
   url('http://127.0.0.1/upload/') -- the browser fetches the homepage HTML as an
   image, fails, and leaves a 330-360px transparent block with an invisible white
   pill on it. Give the tiles a surface so they read as cards until real artwork
   is uploaded. */
.category_area .category_wiz .thumb {
    background-color: #0d2138;
    background-size: cover;
    background-position: center;
}
.category_area .category_wiz .thumb .cat_btn {
    box-shadow: 0 2px 12px rgba(0, 0, 0, .15);
}

/* Interim bidi guard. Any English left in an RTL block throws its trailing
   punctuation to the wrong end (".career", "Real .results"). Translation is the
   real fix and is under way; this stops the visible damage meanwhile. It does
   NOT satisfy SC 3.1.2 Language of Parts -- only lang="en" on the run does. */
.banner_text h3, .banner_text p,
.section__title h3, .section__title p,
.cta_service_info h4, .cta_service_info p {
    unicode-bidi: plaintext;
}

/* ═══════════════════════════════════════════════════════════════════════════
   HOMEPAGE VISUAL SYSTEM
   ---------------------------------------------------------------------------
   The theme ships each homepage block with its own unrelated padding figure
   (.category_area 120 bottom, .testmonial_area 140/240, .blog_area 120,
   .service_cta_area 120 + a .border_top_1px spacer carrying another 150).
   Nothing shares a scale, so the page reads as disconnected islands. The rules
   below re-time the page on one scale, then give the two content-bearing
   sections -- categories and courses -- an actual designed treatment.

   Load order: this file is followed by sections/homepage_v7.css and
   homepageV7/{header,footer}-v7.css. Those carry element resets (body, p, a,
   h1-h6) and v7 header/footer classes only, so the scoped selectors here win
   on specificity. frontend_style_rtl.css loads BEFORE this file, so a rule of
   equal specificity already beats it; !important is used only where the source
   declaration sits on a longer selector.

   RTL: logical properties throughout (margin-inline, inset-inline, padding-
   block). The one place a physical value is unavoidable is the chevron
   rotation, which is branched on html[dir].
   ═══════════════════════════════════════════════════════════════════════════ */

:root {
    /* Brand */
    --hx-gold: #C59848;
    --hx-gold-bright: #D5B57B;
    --hx-gold-deep: #72582A;
    --hx-navy-deep: #021930;
    --hx-navy: #032D58;
    --hx-navy-surface: #21466C;
    --hx-ink: #f4f7fb;
    --hx-ink-2: #b8c5d4;

    /* Neutrals pulled toward the navy so the greys read warm-navy, not grey */
    --hx-line: #e2e8f0;
    --hx-line-soft: #eef2f7;
    --hx-tint: #f5f8fc;
    --hx-body: #4a5a6b;

    /* Vertical rhythm. One scale, used by every section. */
    --hx-sec: 96px;
    --hx-gap: 30px;

    /* Radii + elevation */
    --hx-r-lg: 18px;
    --hx-r-md: 14px;
    --hx-r-sm: 10px;
    --hx-e1: 0 1px 2px rgba(4, 19, 35, .04), 0 10px 30px -18px rgba(4, 19, 35, .28);
    --hx-e2: 0 2px 6px rgba(4, 19, 35, .06), 0 26px 50px -24px rgba(4, 19, 35, .38);
    --hx-e-gold: 0 18px 40px -20px rgba(217, 168, 62, .55);
}

@media (max-width: 991.98px) {
    :root { --hx-sec: 60px; --hx-gap: 20px; }
}

/* ---------------------------------------------------------------------------
   1. VERTICAL RHYTHM
   Every homepage band re-timed onto --hx-sec. Theme values noted per rule so
   the change stays auditable.
   --------------------------------------------------------------------------- */

/* was: padding-bottom:120px */
.category_area {
    padding-block-end: var(--hx-sec);
}

/* was: margin-top:-100px; margin-bottom:150px -- the 150 is what stranded the
   category heading in the middle of an empty screen. */
.category_area .couses_category {
    margin-block: -90px var(--hx-sec);
    padding: 44px 48px;
    border-radius: var(--hx-r-lg);
    box-shadow: var(--hx-e2);
}

/* was: padding:150px 0 */
.cta_area {
    padding-block: 110px;
}

/* was: padding:139px 0 120px */
.course_area.section_spacing {
    padding-block: var(--hx-sec);
}

/* was: padding-top:140px; padding-bottom:240px */
.testmonial_area {
    padding-block: var(--hx-sec);
}

/* was: padding-bottom:120px, plus a .border_top_1px spacer holding its own
   150px padding-bottom. Two separate 100px+ figures stacked. */
.service_cta_area {
    padding-block-end: var(--hx-sec);
}
.service_cta_area .border_top_1px {
    padding-block-end: var(--hx-sec);
}

/* was: padding:120px 0 (this block wraps the FAQ) */
.blog_area {
    padding-block: var(--hx-sec);
}
.blog_area .theme_according.mb_100 {
    margin-block-end: 0;
}

/* Section heading -> content gap. mb_80 is 80px under a 44px heading. */
.course_area .section__title.mb_80,
.blog_area .section__title.mb_80,
.testmonial_area .section__title.mb_80 {
    margin-block-end: 52px;
}

/* ---------------------------------------------------------------------------
   2. SECTION HEADER SYSTEM
   Same three-part construction everywhere: gold rule, heading, one muted line
   of support copy on a measured line length. This is what makes the sections
   read as one system rather than five unrelated centred stacks.
   --------------------------------------------------------------------------- */

.category_area .section__title::before,
.course_area .section__title::before,
.testmonial_area .section__title::before,
.blog_area .section__title::before {
    content: "";
    display: block;
    inline-size: 52px;
    block-size: 4px;
    border-radius: 99px;
    background: linear-gradient(90deg, var(--hx-gold), var(--hx-gold-bright));
    margin-block-end: 24px;
}

.course_area .section__title.text-center::before,
.testmonial_area .section__title.text-center::before,
.blog_area .section__title.text-center::before {
    margin-inline: auto;
}

.category_area .section__title h3,
.course_area .section__title h3,
.testmonial_area .section__title h3,
.blog_area .section__title h3 {
    letter-spacing: -.015em;
    margin-block-end: 14px;
}

.course_area .section__title p,
.testmonial_area .section__title p,
.blog_area .section__title p {
    font-size: 17px;
    line-height: 1.7;
    color: var(--hx-body);
    max-inline-size: 46ch;
    margin-inline: auto;
}

/* ---------------------------------------------------------------------------
   3. KEY-FEATURE STRIP (the card overlapping the hero)
   Three claims with nothing separating them. Hairline dividers give the trio a
   structure; the icon gets a tinted disc so it reads as an element instead of
   a floating glyph.
   --------------------------------------------------------------------------- */

.category_area .couses_category .single_course_cat {
    align-items: flex-start;
    gap: 18px;
    padding-inline-end: 28px;
}
.category_area .couses_category .col-xl-4:not(:first-child) .single_course_cat {
    border-inline-end: 1px solid var(--hx-line-soft);
    padding-inline-end: 0;
    padding-inline-start: 28px;
}
.category_area .couses_category .single_course_cat .icon {
    margin: 0;
    inline-size: 54px;
    block-size: 54px;
    flex: 0 0 54px;
    display: grid;
    place-items: center;
    border-radius: 14px;
    background: linear-gradient(160deg, rgba(217, 168, 62, .16), rgba(240, 196, 87, .07));
    border: 1px solid rgba(217, 168, 62, .28);
}
.category_area .couses_category .single_course_cat .icon img {
    inline-size: 28px;
    block-size: 28px;
    object-fit: contain;
}
.category_area .couses_category .single_course_cat .course_content h4 {
    font-size: 18px;
    margin-block-end: 6px;
}
.category_area .couses_category .single_course_cat .course_content p {
    font-size: 15px;
    line-height: 1.65;
    color: var(--hx-body);
    font-weight: 400;
}

/* ---------------------------------------------------------------------------
   4. CATEGORY TILES
   The tiles have NULL thumbnails (documented further up this file), so they
   rendered as bare navy rectangles carrying a hard white label block -- the
   single most unfinished-looking element on the page. Rebuilt as designed
   tiles: navy gradient ground, a gold light source in the corner, gold
   hairline, label set into the tile itself, chevron affordance, and the whole
   surface as the click target instead of just the pill.

   Heights are equalised (theme: cat1 360, cat2/cat3 330, browse-all 300 --
   which is why the two columns never lined up) so the 2x2 reads as a grid.
   --------------------------------------------------------------------------- */

.category_area .category_wiz.mb_30 {
    margin-block-end: var(--hx-gap);
}

.category_area .category_wiz .thumb,
.category_area .category_wiz .thumb.cat1,
.category_area .category_wiz .thumb.cat2,
.category_area .category_wiz .thumb.cat3 {
    min-block-size: 0;
    block-size: 196px;
    border-radius: var(--hx-r-md);
    overflow: hidden;
    position: relative;
    isolation: isolate;
    background-color: var(--hx-navy);
    background-image: linear-gradient(155deg, var(--hx-navy-surface) 0%, var(--hx-navy-deep) 72%);
    border: 1px solid rgba(217, 168, 62, .22);
    transition: transform .3s ease, border-color .3s ease, box-shadow .3s ease;
}

/* Gold light source, top inline-start corner. */
.category_area .category_wiz .thumb::before {
    content: "";
    position: absolute;
    inset-block-start: -55%;
    inset-inline-start: -30%;
    inline-size: 110%;
    block-size: 130%;
    background: radial-gradient(closest-side, rgba(240, 196, 87, .30), rgba(240, 196, 87, 0) 70%);
    z-index: -1;
    opacity: .85;
    transition: opacity .3s ease;
}

/* Fine diagonal texture so the tile is not a flat fill. */
.category_area .category_wiz .thumb::after {
    content: "";
    position: absolute;
    inset: 0;
    z-index: -1;
    background-image: repeating-linear-gradient(115deg,
        rgba(255, 255, 255, .035) 0 1px,
        rgba(255, 255, 255, 0) 1px 9px);
}

.category_area .category_wiz .thumb:hover {
    transform: translateY(-4px);
    border-color: rgba(240, 196, 87, .62);
    box-shadow: 0 22px 44px -24px rgba(4, 19, 35, .8);
}
.category_area .category_wiz .thumb:hover::before {
    opacity: 1;
}

/* The label. Was: absolute white block inset 30px, uppercase, navy on white. */
.category_area .category_wiz .thumb .cat_btn,
.category_area .category_wiz .thumb .cat_btn:hover {
    position: absolute;
    inset: 0;
    inline-size: auto;
    display: flex;
    align-items: flex-end;
    background: none;
    border: 0;
    box-shadow: none;
    border-radius: 0;
    padding: 22px 24px;
    padding-inline-end: 58px;
    color: #fff;
    font-family: var(--font_family1);
    font-size: 20px;
    font-weight: 700;
    line-height: 1.35;
    text-align: start;
    text-transform: none;
}
.category_area .category_wiz .thumb .cat_btn:hover {
    color: var(--hx-gold-bright);
}

/* Chevron affordance, bottom inline-end. */
.category_area .category_wiz .thumb .cat_btn::after {
    content: "";
    position: absolute;
    inset-block-end: 26px;
    inset-inline-end: 24px;
    inline-size: 9px;
    block-size: 9px;
    border-block-start: 2px solid var(--hx-gold);
    border-inline-end: 2px solid var(--hx-gold);
    transition: transform .3s ease, border-color .3s ease;
}
html[dir="rtl"] .category_area .category_wiz .thumb .cat_btn::after {
    transform: rotate(-45deg);
}
html:not([dir="rtl"]) .category_area .category_wiz .thumb .cat_btn::after {
    transform: rotate(45deg);
}
html[dir="rtl"] .category_area .category_wiz .thumb .cat_btn:hover::after {
    transform: rotate(-45deg) translate(3px, -3px);
    border-color: var(--hx-gold-bright);
}
html:not([dir="rtl"]) .category_area .category_wiz .thumb .cat_btn:hover::after {
    transform: rotate(45deg) translate(3px, -3px);
    border-color: var(--hx-gold-bright);
}

/* The gold "browse everything else" tile -- the one deliberate colour break in
   the grid, so it has to be the same size as its siblings, not 300px tall.
   Navy on gold measures 8.57:1. */
.category_area .brouse_cat_btn {
    block-size: 196px;
    min-block-size: 0;
    border-radius: var(--hx-r-md);
    padding: 22px 24px;
    padding-inline-end: 58px;
    font-size: 20px;
    line-height: 1.35;
    align-items: flex-end;
    position: relative;
    overflow: hidden;
    background: linear-gradient(155deg, var(--hx-gold-bright) 0%, var(--hx-gold) 65%, #c79530 100%);
    box-shadow: var(--hx-e-gold);
    transition: transform .3s ease, box-shadow .3s ease;
}
.category_area .brouse_cat_btn::after {
    content: "";
    position: absolute;
    inset-block-end: 26px;
    inset-inline-end: 24px;
    inline-size: 9px;
    block-size: 9px;
    border-block-start: 2px solid var(--hx-navy-deep);
    border-inline-end: 2px solid var(--hx-navy-deep);
    transition: transform .3s ease;
}
html[dir="rtl"] .category_area .brouse_cat_btn::after { transform: rotate(-45deg); }
html:not([dir="rtl"]) .category_area .brouse_cat_btn::after { transform: rotate(45deg); }
.category_area .brouse_cat_btn:hover {
    transform: translateY(-4px);
    box-shadow: 0 24px 50px -20px rgba(217, 168, 62, .7);
}

/* ---------------------------------------------------------------------------
   5. CATEGORY HEADING COLUMN
   Sits opposite the tile grid. Was a 20px/600 paragraph running the full
   column width with a hairline text link under it, which left the column
   looking unfinished next to a 400px block of tiles.
   --------------------------------------------------------------------------- */

.category_area .section__title.mb_40 {
    max-inline-size: 460px;
    margin-block-end: 0;
}
.category_area .section__title p {
    font-size: 17px;
    font-weight: 400;
    line-height: 1.75;
    color: var(--hx-body);
    margin-block: 0 28px;
}
.category_area .section__title .line_link {
    display: inline-flex;
    align-items: center;
    gap: 10px;
    border: 0;
    padding: 14px 26px;
    border-radius: 999px;
    background: var(--hx-navy-deep);
    color: #fff;
    font-size: 15px;
    font-weight: 600;
    transition: background .25s ease, transform .25s ease, color .25s ease;
}
.category_area .section__title .line_link:hover {
    background: var(--hx-navy-surface);
    color: var(--hx-gold-bright);
    transform: translateY(-2px);
}
.category_area .section__title .line_link::after {
    content: "";
    inline-size: 8px;
    block-size: 8px;
    border-block-start: 2px solid currentColor;
    border-inline-end: 2px solid currentColor;
}
html[dir="rtl"] .category_area .section__title .line_link::after { transform: rotate(-45deg); }
html:not([dir="rtl"]) .category_area .section__title .line_link::after { transform: rotate(45deg); }

/* ---------------------------------------------------------------------------
   5b. CORRECTIONS to the feature strip after screenshotting pass 1.
   - The divider was on :not(:first-child), which put a stray rule on the far
     inline-end edge of the last item instead of only between items. In RTL the
     separator between item N and N+1 is item N's inline-END border, so the
     rule belongs on :not(:last-child).
   - .col-xl-4:not(:last-child) .single_course_cat carries margin-bottom:30px
     for the stacked mobile layout; in the 3-across desktop layout that just
     added 30px of dead height inside the card.
   --------------------------------------------------------------------------- */

.category_area .couses_category .col-xl-4:not(:first-child) .single_course_cat {
    border-inline-end: 0;
    padding-inline-start: 28px;
    padding-inline-end: 28px;
}
.category_area .couses_category .col-xl-4:not(:last-child) .single_course_cat {
    border-inline-end: 1px solid var(--hx-line-soft);
}
.category_area .couses_category .col-xl-4:last-child .single_course_cat {
    padding-inline-end: 0;
}
.category_area .couses_category .col-xl-4:first-child .single_course_cat {
    padding-inline-start: 0;
}

@media (min-width: 992px) {
    .category_area .couses_category .col-xl-4:not(:last-child) .single_course_cat {
        margin-block-end: 0;
    }
}

/* Tiles at 196px left the label stranded under a large empty field. 172 sits
   the label closer to the optical centre of the tile. */
.category_area .category_wiz .thumb,
.category_area .category_wiz .thumb.cat1,
.category_area .category_wiz .thumb.cat2,
.category_area .category_wiz .thumb.cat3 {
    block-size: 172px;
}
.category_area .brouse_cat_btn {
    block-size: 172px;
}

/* ---------------------------------------------------------------------------
   6. COURSE CARDS
   The most important section on an LMS homepage was the least designed one:
   no card container at all (content sat directly on the page), and the price
   rendered as a giant white ELLIPSE. That ellipse is a real bug, not a taste
   call -- the theme sets `top:20px;left:20px` in the base sheet and
   `right:20px` in the RTL sheet, so the absolutely-positioned tag has both
   inset-inline sides pinned and stretches to the full width of the thumbnail,
   at which point border-radius:50% renders it as an ellipse.

   Rebuilt as a real card: white surface, hairline, elevation, equal heights,
   image that is no longer cropped by the theme's scale(1.1), a gold price PILL
   in navy text (8.57:1), and a metadata footer pinned to the bottom edge so
   cards in a row line up.
   --------------------------------------------------------------------------- */

/* Own surface, so the section reads as the centrepiece it is. */
.course_area.section_spacing {
    background: var(--hx-tint);
    border-block: 1px solid var(--hx-line-soft);
}

/* 3-up at xl. The theme ships col-xl-3 (4-up), which with three courses left a
   quarter of the row empty and the whole block visually off-centre.
   .col-xl-3 appears only on the course cards in this section -- the section
   heading uses .col-lg-6 -- so this cannot leak. */
@media (min-width: 1200px) {
    .course_area .row .col-xl-3 {
        flex: 0 0 auto;
        width: 33.3333%;
        max-width: 33.3333%;
    }
}

/* Equal-height cards across the row. */
.course_area .row .col-xl-3 {
    display: flex;
}
.course_area .row .col-xl-3 > .couse_wizged {
    inline-size: 100%;
}

.course_area .couse_wizged {
    display: flex;
    flex-direction: column;
    background: #fff;
    border: 1px solid var(--hx-line);
    border-radius: var(--hx-r-md);
    overflow: hidden;
    box-shadow: var(--hx-e1);
    transition: transform .28s ease, box-shadow .28s ease, border-color .28s ease;
}
.course_area .couse_wizged:hover {
    transform: translateY(-5px);
    border-color: rgba(217, 168, 62, .55);
    box-shadow: var(--hx-e2);
}

.course_area .couse_wizged .thumb {
    block-size: 190px;
    border-radius: 0;
    background: var(--hx-navy);
}

/* The theme pre-scales the thumbnail to 1.1 and anchors it to the top, which
   crops the artwork -- these thumbnails carry the course name, so the name was
   being sliced off at both edges. Show the whole image, scale on hover only. */
.course_area .couse_wizged .thumb_inner {
    transform: none;
    background-position: center;
    background-size: cover;
}
.course_area .couse_wizged:hover .thumb_inner {
    transform: scale(1.06);
}

/* Price: pill, not ellipse. Both inset-inline sides are declared so the
   stretched-box bug cannot come back. */
.couse_wizged .thumb .prise_tag {
    inset-block-start: 14px;
    inset-inline-start: 14px;
    inset-inline-end: auto;
    flex-direction: row-reverse;
    align-items: baseline;
    gap: 7px;
    min-inline-size: 0 !important;
    min-block-size: 0;
    block-size: auto;
    padding: 7px 14px !important;
    border-radius: 999px;
    background: linear-gradient(135deg, var(--hx-gold-bright), var(--hx-gold));
    color: var(--hx-navy-deep);
    font-size: 14px;
    font-weight: 800;
    line-height: 1.2;
    box-shadow: 0 6px 16px -6px rgba(4, 19, 35, .55);
}
.couse_wizged .thumb .prise_tag del {
    font-size: 11px;
    font-weight: 600;
    color: rgba(4, 19, 35, .62);
    padding: 0;
}

.course_area .couse_wizged .course_content {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    padding: 18px 20px 16px;
}

/* Two-line title with a reserved box, so cards in a row stay aligned.
   .noBrake is white-space:nowrap + ellipsis, which truncated every title to
   about four words ("تصميم واجهات المس..."). */
.course_area .couse_wizged .course_content h4,
.course_area .couse_wizged .course_content h4.noBrake {
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    white-space: normal;
    overflow: hidden;
    font-size: 17px;
    line-height: 1.55;
    min-block-size: calc(2 * 1.55em);
    margin-block-end: 14px;
    color: var(--hx-navy-deep);
}
.course_area .couse_wizged .course_content h4:hover {
    color: var(--hx-gold-deep);
}

.course_area .couse_wizged .course_content .rating_cart {
    align-items: center;
    gap: 8px;
    margin-block: 0 16px;
}
.course_area .couse_wizged .course_content .rating_cart .rateing {
    block-size: 34px;
    padding: 0 12px;
    margin: 0;
    border: 1px solid rgba(217, 168, 62, .35);
    background: rgba(217, 168, 62, .10);
    border-radius: 999px;
    font-size: 13px;
    font-weight: 700;
    color: var(--hx-navy-deep);
}
.course_area .couse_wizged .course_content .rating_cart .rateing span {
    margin-inline: 0 6px;
}
.course_area .couse_wizged .course_content .rating_cart .cart_store {
    inline-size: 34px;
    block-size: 34px;
    line-height: 32px;
    border-radius: 50%;
    border: 1px solid var(--hx-line);
    color: var(--hx-navy-deep);
    font-size: 13px;
}
.course_area .couse_wizged .course_content .rating_cart .cart_store:hover {
    background: var(--hx-navy-deep);
    border-color: var(--hx-navy-deep);
    color: var(--hx-gold-bright);
}

/* Metadata footer, pinned to the bottom of the card. Was two stacked lines
   with 30px gaps and icons that carried a 10px margin on BOTH sides (the RTL
   sheet adds margin-left without clearing margin-right). */
.course_area .couse_wizged .course_content .course_less_students {
    display: flex;
    align-items: center;
    gap: 20px;
    margin-block-start: auto;
    padding-block-start: 14px;
    border-block-start: 1px solid var(--hx-line-soft);
}
.course_area .couse_wizged .course_content .course_less_students a,
.course_area .couse_wizged .course_content .course_less_students a:not(:last-child) {
    margin: 0;
    font-size: 13px;
    color: var(--hx-body);
}
.course_area .couse_wizged .course_content .course_less_students a i {
    margin-inline: 0 7px;
    font-size: 15px;
    color: var(--hx-gold-deep);
}

/* Section footer button */
.course_area .pt_70 {
    padding-block-start: 44px;
}
.course_area .theme_btn.mb_30 {
    margin-block-end: 0;
}

/* ---------------------------------------------------------------------------
   7. PRIMARY BUTTON
   Scoped to the homepage bands so other pages keep the theme's button. Gold
   gradient with NAVY text -- white on gold measures 2.18:1 and fails AA.
   --------------------------------------------------------------------------- */

.course_area .theme_btn,
.cta_area .theme_btn,
.service_cta_area .theme_btn {
    border-radius: 999px;
    padding: 16px 34px;
    font-size: 16px;
    font-weight: 700;
    color: var(--hx-navy-deep);
    box-shadow: 0 12px 26px -14px rgba(217, 168, 62, .9);
    transition: transform .25s ease, box-shadow .25s ease, background-position .4s ease;
}
.course_area .theme_btn:hover,
.cta_area .theme_btn:hover,
.service_cta_area .theme_btn:hover {
    transform: translateY(-2px);
    color: var(--hx-navy-deep);
    box-shadow: 0 18px 34px -14px rgba(217, 168, 62, 1);
}

/* ---------------------------------------------------------------------------
   8. TESTIMONIALS
   Retinted off the theme's lavender #f8f8fe -- a cool violet that belongs to
   no part of this palette -- onto the same navy-derived tint the course band
   uses, so the two light sections read as one system. min-height:370px left a
   third of every card empty; the body copy was text-align:justify, which in
   Arabic opens rivers of whitespace between words (visible in the before
   screenshot).
   --------------------------------------------------------------------------- */

.testmonial_area {
    background: var(--hx-tint);
}
.testmonial_area .single_testmonial {
    min-block-size: 0;
    padding: 28px;
    border-radius: var(--hx-r-md);
    border: 1px solid var(--hx-line);
    position: relative;
    overflow: hidden;
}
.testmonial_area .single_testmonial::after {
    content: "";
    position: absolute;
    inset-block-start: 0;
    inset-inline: 0;
    block-size: 3px;
    background: linear-gradient(90deg, var(--hx-gold), var(--hx-gold-bright));
    opacity: .85;
}
.testmonial_area .single_testmonial .testmonial_header {
    margin-block-end: 18px;
    padding-block-end: 18px;
    border-block-end: 1px solid var(--hx-line-soft);
}
.testmonial_area .single_testmonial p {
    font-size: 16px;
    line-height: 1.85;
    font-weight: 400;
    color: var(--hx-body);
    text-align: start;
}

/* ---------------------------------------------------------------------------
   9. BECOME-INSTRUCTOR BAND
   Was a 450px card floating dead-centre in an otherwise empty full-width
   section, with the button hard against its bottom edge. Rebuilt as a
   full-width band: portrait, copy, and action on one line.
   --------------------------------------------------------------------------- */

.service_cta_area .row > .col-lg-6.m-auto {
    flex: 0 0 auto;
    inline-size: 100%;
    max-inline-size: none;
}
.service_cta_area .single_cta_service {
    align-items: center;
    gap: 28px;
    flex-wrap: nowrap;
    padding: 30px 36px;
    border-radius: var(--hx-r-lg);
    border: 1px solid var(--hx-line);
    box-shadow: var(--hx-e1);
    background: linear-gradient(115deg, #fff 58%, rgba(217, 168, 62, .13) 100%);
}
.service_cta_area .single_cta_service.mb_30 {
    margin-block-end: 0;
}
.service_cta_area .single_cta_service .thumb {
    margin: 0;
    inline-size: 92px;
    block-size: 92px;
    flex: 0 0 92px;
}
.service_cta_area .single_cta_service .thumb img {
    inline-size: 100%;
    block-size: 100%;
    object-fit: cover;
    border: 2px solid rgba(217, 168, 62, .45);
}
.service_cta_area .single_cta_service .cta_service_info {
    display: grid;
    grid-template-columns: 1fr auto;
    grid-template-areas:
        "title action"
        "text  action";
    align-items: center;
    column-gap: 32px;
    flex: 1 1 auto;
}
.service_cta_area .single_cta_service .cta_service_info h4 {
    grid-area: title;
    font-size: 22px;
    margin-block-end: 6px;
}
.service_cta_area .single_cta_service .cta_service_info p {
    grid-area: text;
    margin: 0;
    font-size: 16px;
    font-weight: 400;
    line-height: 1.7;
    color: var(--hx-body);
    max-inline-size: 62ch;
}
.service_cta_area .single_cta_service .cta_service_info .theme_btn {
    grid-area: action;
    justify-self: end;
    white-space: nowrap;
}

@media (max-width: 767.98px) {
    .service_cta_area .single_cta_service {
        flex-wrap: wrap;
        text-align: start;
    }
    .service_cta_area .single_cta_service .cta_service_info {
        grid-template-columns: 1fr;
        grid-template-areas: "title" "text" "action";
        row-gap: 18px;
    }
    .service_cta_area .single_cta_service .cta_service_info .theme_btn {
        justify-self: start;
    }
}

/* ---------------------------------------------------------------------------
   10. FAQ ACCORDION
   Four full-bleed gold bars stacked on white is the loudest thing on the page
   and it is attached to the least important section. Gold is the accent, not
   the surface: white cards, hairline borders, and gold reserved for the
   indicator and the open state.

   The gold fill has no author rule anywhere in the loaded stylesheets or the
   inline <style> blocks (searched: all css under public/, all five inline
   blocks), so its origin could not be pinned down -- hence !important on the
   background declarations. Verified by screenshot that these rules win.
   --------------------------------------------------------------------------- */

.blog_area .theme_according .card {
    background: #fff !important;
    border: 1px solid var(--hx-line) !important;
    border-radius: var(--hx-r-md) !important;
    overflow: hidden;
    margin-block-end: 12px;
    transition: border-color .25s ease, box-shadow .25s ease;
}
.blog_area .theme_according .card:hover {
    border-color: rgba(217, 168, 62, .55) !important;
    box-shadow: var(--hx-e1);
}
.blog_area .theme_according .card:last-child {
    margin-block-end: 0;
}

.blog_area .theme_according .card-header,
.blog_area .theme_according .card-header.pink_bg {
    background: transparent !important;
    background-image: none !important;
    border: 0 !important;
    padding: 0 !important;
}

.blog_area .theme_according .card-header .btn.btn-link {
    display: flex;
    align-items: center;
    gap: 16px;
    inline-size: 100%;
    padding: 20px 24px;
    text-align: start;
    text-decoration: none;
    font-size: 17px;
    font-weight: 700;
    line-height: 1.6;
    color: var(--hx-navy-deep) !important;
    white-space: normal;
}

/* The theme's chevron is an absolutely-positioned Font Awesome glyph pinned to
   the inline-end edge. Kept as the glyph, moved into the flex row inside a
   gold-tinted disc, and pushed to the inline-end with auto margin. */
.blog_area .theme_according .card-header .btn.btn-link::before {
    position: static;
    order: 2;
    margin-inline-start: auto;
    transform: none;
    inline-size: 30px;
    block-size: 30px;
    flex: 0 0 30px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    background: rgba(217, 168, 62, .14);
    border: 1px solid rgba(217, 168, 62, .38);
    font-size: 13px;
    color: var(--hx-gold-deep) !important;
    transition: transform .3s ease, background .3s ease;
}
.blog_area .theme_according .card-header .btn.btn-link.collapsed::before {
    transform: scaleY(-1);
}
.blog_area .theme_according .card-header .btn.btn-link:not(.collapsed) {
    color: var(--hx-gold-deep) !important;
}
.blog_area .theme_according .card-header .btn.btn-link:not(.collapsed)::before {
    background: var(--hx-gold);
    border-color: var(--hx-gold);
    color: var(--hx-navy-deep) !important;
}

.blog_area .theme_according .card-body {
    padding: 0 24px 22px;
    border: 0;
}
.blog_area .theme_according .card-body .curriculam_single {
    padding: 0;
    border: 0;
}
.blog_area .theme_according .card-body span {
    font-size: 16px;
    line-height: 1.85;
    color: var(--hx-body);
}

/* ---------------------------------------------------------------------------
   10b. FAQ ACCORDION -- CORRECTED SELECTORS.

   The block above (10) targeted .card / .card-header.pink_bg / .btn.btn-link,
   which is what home-page-faq.blade.php emits. Those selectors never match,
   because the page's JS rewrites the accordion after load:

       .card                 ->  .accordion-item
       .card-header.pink_bg  ->  .accordion-header
       .btn.btn-link         ->  .accordion-button

   Confirmed by reading getComputedStyle out of the live DOM, not from the
   template. This also means the pre-existing contrast fix higher up this file
   (".theme_according .card-header.pink_bg .btn.btn-link {color:#021930}",
   filed as "white on gold, measured 1.95:1") has never applied to anything --
   the FAQ headers were still shipping #fff on the gold gradient, which is a
   live 2.18:1 AA failure. The real rule is:

       .accordion-item .accordion-button {
           background: var(--system_primery_color);   [the gold gradient]
           color: #fff !important;
           padding: 20px !important;
       }

   NOTE TO FUTURE EDITORS: the line above originally quoted that gradient with
   an inline slash-star comment. CSS comments DO NOT NEST -- the outer comment
   terminated at that inner star-slash, and the CSS parser then ate the
   .accordion-item rule that followed this block. Every .accordion-item
   declaration silently vanished while the .accordion-button ones survived,
   which is a confusing failure to debug from the file alone. Keep code samples
   inside these comments free of comment delimiters.

   in frontend_style_rtl.css. That file loads BEFORE this one, so matching its
   !important at equal specificity is enough to win.

   Design intent: gold is the accent, not the surface. Four full-bleed gold
   bars are the loudest element on the page and they are attached to its least
   important section. White cards, hairline borders, gold kept for the open
   state and the indicator.
   --------------------------------------------------------------------------- */

.blog_area .theme_according .accordion-item {
    background: #fff;
    border: 1px solid var(--hx-line);
    border-radius: var(--hx-r-md);
    overflow: hidden;
    margin-block-end: 12px;
    box-shadow: none;
    transition: border-color .25s ease, box-shadow .25s ease;
}
.blog_area .theme_according .accordion-item:hover {
    border-color: rgba(217, 168, 62, .55);
    box-shadow: var(--hx-e1);
}
.blog_area .theme_according .accordion-item:last-child {
    margin-block-end: 0;
}

.blog_area .theme_according .accordion-header {
    background: transparent;
    border: 0;
    padding: 0;
}

.blog_area .theme_according .accordion-item .accordion-button {
    background: #fff;
    background-image: none;
    border: 0 !important;
    border-radius: 0;
    padding: 20px 24px !important;
    font-size: 17px;
    font-weight: 700;
    line-height: 1.6;
    text-align: start;
    color: var(--hx-navy-deep) !important;
    box-shadow: none;
    transition: background .25s ease, color .25s ease;
}
.blog_area .theme_according .accordion-item .accordion-button:hover {
    background: var(--hx-tint);
}

/* Open state: gold tint plus a solid gold rule down the inline-start edge.
   Drawn with an inset box-shadow rather than a border so the row does not
   shift by 4px when it opens. box-shadow offsets are physical, so the sign
   flips per direction: positive x paints the left edge, negative the right. */
html[dir="rtl"] .blog_area .theme_according .accordion-item .accordion-button:not(.collapsed) {
    background: linear-gradient(90deg, rgba(217, 168, 62, .16), rgba(217, 168, 62, .04));
    box-shadow: inset -4px 0 0 var(--hx-gold);
}
html:not([dir="rtl"]) .blog_area .theme_according .accordion-item .accordion-button:not(.collapsed) {
    background: linear-gradient(270deg, rgba(217, 168, 62, .16), rgba(217, 168, 62, .04));
    box-shadow: inset 4px 0 0 var(--hx-gold);
}

/* Bootstrap draws the chevron as a background-image on ::after, coloured by
   --bs-accordion-btn-icon. The stock icon is a near-black chevron sized for a
   white button; on the gold bar it was invisible. Replaced with a navy chevron
   (inline data URI -- no network request) and a tinted disc to sit in. */
.blog_area .theme_according .accordion-item .accordion-button {
    --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23021930'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
    --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23021930'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
    --bs-accordion-btn-focus-box-shadow: none;
}
.blog_area .theme_according .accordion-item .accordion-button::after {
    inline-size: 30px;
    block-size: 30px;
    flex: 0 0 30px;
    background-size: 13px 13px;
    background-position: center;
    border-radius: 50%;
    background-color: rgba(217, 168, 62, .14);
    border: 1px solid rgba(217, 168, 62, .38);
    transition: transform .3s ease, background-color .3s ease;
}
.blog_area .theme_according .accordion-item .accordion-button:not(.collapsed)::after {
    background-color: var(--hx-gold);
    border-color: var(--hx-gold);
}

/* Bootstrap's own :focus box-shadow is disabled above, so restore a visible
   indicator. Navy is 18.71:1 on white and 8.57:1 on gold (SC 2.4.7 / 1.4.11). */
.blog_area .theme_according .accordion-item .accordion-button:focus-visible {
    outline: 3px solid var(--hx-navy-deep);
    outline-offset: -3px;
    box-shadow: inset 0 0 0 6px var(--hx-gold-bright);
}

.blog_area .theme_according .accordion-item .accordion-body {
    padding: 4px 24px 22px;
    background: #fff;
    border: 0;
}
.blog_area .theme_according .accordion-item .accordion-body .curriculam_single {
    padding: 0;
    border: 0;
    margin: 0;
}
.blog_area .theme_according .accordion-item .accordion-body span {
    font-size: 16px;
    line-height: 1.85;
    color: var(--hx-body);
}

/* ---------------------------------------------------------------------------
   11. Course-card nits caught on the pass-2 screenshot.
   The two-line title reservation is deliberate (it keeps cards in a row
   aligned when one title wraps and another does not), but 14px under it on top
   of the reserved line left a visible hole when every title fits on one line.
   --------------------------------------------------------------------------- */

.course_area .couse_wizged .course_content h4,
.course_area .couse_wizged .course_content h4.noBrake {
    margin-block-end: 8px;
}

/* ---------------------------------------------------------------------------
   10c. FAQ ACCORDION -- pseudo-element corrections, from computed style.

   Two theme rules that only show up once you read the live DOM:

     .theme_according button:after  { display: none }
     .accordion-item .accordion-button:before { color: #fff !important }

   The first kills Bootstrap's chevron (the SVG one), the second is the theme's
   own Font Awesome glyph. With the gold bar removed, that glyph became white
   on white -- the indicator disappeared entirely, which is worse than ugly:
   nothing on the row said it was expandable.

   Resolution: drop the theme's font glyph, restore Bootstrap's SVG chevron
   (already re-coloured navy via --bs-accordion-btn-icon above) and give it a
   gold disc to sit in.
   --------------------------------------------------------------------------- */

.blog_area .theme_according .accordion-item .accordion-button::before {
    display: none;
}

.blog_area .theme_according .accordion-item .accordion-button::after {
    display: block;
}

/* Room for the 30px disc at the inline-end of the row. */
.blog_area .theme_according .accordion-item .accordion-button {
    padding-inline-end: 66px !important;
}

/* ---------------------------------------------------------------------------
   10d. FAQ ACCORDION -- row layout.

   The theme sets display:block on the accordion button. Bootstrap's chevron
   pseudo-element relies on the button being a flex container (it positions
   itself with margin-inline auto), so on a block button it fell out of the row
   and stacked underneath the question text. Restoring flex puts the question
   and the indicator on one line and lets the row collapse to its natural
   height. The padding-inline-end reservation from 10c is no longer needed --
   the disc is in flow now.
   --------------------------------------------------------------------------- */

.blog_area .theme_according .accordion-item .accordion-button {
    display: flex;
    align-items: center;
    gap: 16px;
    padding-inline-end: 24px !important;
}

/* ---------------------------------------------------------------------------
   4b. CATEGORY TILES -- compose with the real artwork.

   When section 4 was written the three category thumbnails were empty, so the
   tile had to generate its own surface (a navy gradient, a gold radial light
   source and a diagonal texture). Real artwork has since been supplied at
   public/uploads/categories/*.svg -- 640x360 navy panels, each with a gold
   halo, a gold top hairline and a centred glyph, and deliberately carrying no
   text so the tile's own label is not doubled.

   That artwork arrives as an inline style attribute on .thumb, which outranks
   any background-image declared here, so it wins on the element regardless.
   The generated decoration underneath it is now just noise layered over
   someone else's composition, so it is switched off. What stays is the part
   the artwork cannot do for itself: geometry (equal heights, radius), the
   hairline, the hover state, and a scrim so the label keeps its contrast over
   whatever image a future category is given.
   --------------------------------------------------------------------------- */

/* Retire the generated light source. */
.category_area .category_wiz .thumb::before {
    content: none;
}

/* Repurpose the texture layer as a legibility scrim under the label.
   .thumb sets isolation:isolate, so a z-index:-1 child paints above the
   element's own background (including the inline background-image) but below
   .cat_btn, which is what a scrim needs to do. */
.category_area .category_wiz .thumb::after {
    inset: auto 0 0 0;
    block-size: 62%;
    background-image: linear-gradient(to top,
        rgba(4, 19, 35, .90) 0%,
        rgba(4, 19, 35, .60) 42%,
        rgba(4, 19, 35, 0) 100%);
}

/* The artwork already carries a gradient ground; the generated one only shows
   through where an image is missing, so it stays as the fallback. */
.category_area .category_wiz .thumb:hover {
    border-color: rgba(240, 196, 87, .75);
}

/* ---------------------------------------------------------------------------
   4c. Stacked-column gap for the gold tile.

   .brouse_cat_btn is the last element in its grid column, so on desktop it
   needs no bottom margin. Below lg the two columns stack and it lands directly
   on top of the next tile with no gap. Scoped to the stacked range so the
   desktop column height is unchanged.
   --------------------------------------------------------------------------- */

@media (max-width: 991.98px) {
    .category_area .brouse_cat_btn {
        margin-block-end: var(--hx-gap);
    }
}

/* ===========================================================================
   HOMEPAGE COMPOSITION PASS
   ---------------------------------------------------------------------------
   The brief: the page read as five identical bands -- centred heading, centred
   sub-line, row of equal boxes -- on an unbroken white ground. The one section
   that worked (the app-install panel) worked because it had a dark stage, a
   real illustrative device, an eyebrow pill, an editorial gold underline and a
   genuine focal point. This block gives the rest of the page that vocabulary:

     * alternating light / navy stages, so the page has rhythm
     * asymmetric section heads with a ghosted section numeral
     * a featured-first course grid instead of three equal boxes
     * an orbit motif in the hero that rhymes with the panel's rings
     * reveal-on-scroll, all of it behind prefers-reduced-motion

   Contrast is measured, not guessed: gold on navy 8.57:1, ink on navy 17.1:1,
   ink-2 on navy 10.67:1, gold-deep on light 5.1:1. Gold NEVER carries white
   text, and gold is never used as text on a light ground.

   Load order note: this file is followed by sections/homepage_v7.css and
   homepageV7/{header,footer}-v7.css. Those carry element-level resets only
   (body, p, a, img, button), so every class selector here outranks them.
   =========================================================================== */

/* ---------------------------------------------------------------------------
   A. SHARED VOCABULARY
   Four primitives reused by every section below, all lifted from the panel the
   owner already approved.
   --------------------------------------------------------------------------- */

/* A1. Eyebrow pill. */
.hs-eyebrow {
    display: inline-flex;
    align-items: center;
    gap: 9px;
    margin: 0 0 18px;
    padding-block: 7px;
    padding-inline: 14px;
    border-radius: 999px;
    border: 1px solid rgba(217, 168, 62, .30);
    background: rgba(217, 168, 62, .10);
    color: var(--hx-gold-deep);
    font-size: 13px;
    font-weight: 700;
    line-height: 1.6;
}

.hs-eyebrow--dark {
    border-color: rgba(217, 168, 62, .28);
    background: rgba(217, 168, 62, .08);
    color: var(--hx-gold);
}

.hs-eyebrow__dot {
    inline-size: 6px;
    block-size: 6px;
    border-radius: 50%;
    background: var(--hx-gold-bright);
    flex: 0 0 auto;
}

/* A2. Editorial underline on one phrase. Drawn inside the line box as a
   background gradient so it follows a wrap, instead of a fixed-width
   pseudo-element pinned under the first line only. */
.hs-mark {
    color: var(--hx-gold-bright);
    background-image: linear-gradient(180deg,
        rgba(217, 168, 62, 0) 86%,
        rgba(217, 168, 62, .9) 86%,
        rgba(217, 168, 62, .9) 94%,
        rgba(217, 168, 62, 0) 94%);
    background-repeat: no-repeat;
    background-size: 100% 100%;
    padding-inline: 2px;
}

/* A3. Ghosted section numeral. Sits behind the heading as a graphic. It is
   marked aria-hidden in the markup, so it never reaches the a11y tree. */
.hs-sec__num {
    position: absolute;
    inset-block-start: -.42em;
    inset-inline-start: -.05em;
    z-index: 0;
    font-size: clamp(84px, 10vw, 150px);
    font-weight: 900;
    line-height: 1;
    letter-spacing: -.04em;
    color: rgba(4, 19, 35, .06);
    pointer-events: none;
    user-select: none;
}

.hs-sec__num--dark { color: rgba(240, 196, 87, .09); }

/* A4 was a bespoke .hs-link. Dropped: the section heads ended up carrying the
   theme's own .theme_btn, which already has the gold-on-navy treatment and a
   focus style, so a second link primitive would have been dead weight. */

/* ---------------------------------------------------------------------------
   B. HERO
   Was: a cyan stock illustration -- a colour the brand does not contain --
   with white text laid over it. No idea, no focal point.

   Now a navy STAGE. The photograph is kept but blended into the brand
   (background-blend-mode: luminosity against navy renders it as a navy
   monochrome ground), and the focal point is a gold orbit whose concentric
   rings deliberately rhyme with the app panel further down the page.
   --------------------------------------------------------------------------- */

.banner_area.hs-hero {
    position: relative;
    isolation: isolate;
    overflow: hidden;
    background-color: var(--hx-navy-deep);
    background-blend-mode: luminosity;
    background-position: center;
    padding-block: 104px 150px;
}

/* Legibility wash plus vignette. The directional half is branched on dir
   because CSS gradients still have no logical <side> keyword; everything else
   in this file uses logical properties. */
.banner_area.hs-hero::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: -1;
    background-image:
        linear-gradient(180deg,
            rgba(4, 19, 35, .92) 0%,
            rgba(4, 19, 35, .55) 34%,
            rgba(4, 19, 35, .78) 78%,
            rgba(4, 19, 35, .97) 100%);
}

[dir="rtl"] .banner_area.hs-hero::before {
    background-image:
        linear-gradient(270deg,
            rgba(4, 19, 35, .96) 0%,
            rgba(4, 19, 35, .80) 38%,
            rgba(4, 19, 35, .30) 72%,
            rgba(4, 19, 35, .12) 100%),
        linear-gradient(180deg,
            rgba(4, 19, 35, .86) 0%,
            rgba(4, 19, 35, .42) 36%,
            rgba(4, 19, 35, .72) 76%,
            rgba(4, 19, 35, .97) 100%);
}

[dir="ltr"] .banner_area.hs-hero::before {
    background-image:
        linear-gradient(90deg,
            rgba(4, 19, 35, .96) 0%,
            rgba(4, 19, 35, .80) 38%,
            rgba(4, 19, 35, .30) 72%,
            rgba(4, 19, 35, .12) 100%),
        linear-gradient(180deg,
            rgba(4, 19, 35, .86) 0%,
            rgba(4, 19, 35, .42) 36%,
            rgba(4, 19, 35, .72) 76%,
            rgba(4, 19, 35, .97) 100%);
}

/* B1. The orbit: concentric hairlines, one lit gold arc, a soft core.
   Anchored opposite the copy via inset-inline-start, so it mirrors for free. */
.banner_area.hs-hero .hs-hero__orbit {
    position: absolute;
    z-index: -1;
    inset-block-start: 46%;
    inset-inline-start: 14%;
    inline-size: 0;
    block-size: 0;
    pointer-events: none;
}

.banner_area.hs-hero .hs-hero__ring,
.banner_area.hs-hero .hs-hero__arc,
.banner_area.hs-hero .hs-hero__core {
    position: absolute;
    inset-block-start: 0;
    inset-inline-start: 0;
    translate: 50% -50%;
    border-radius: 50%;
}

[dir="ltr"] .banner_area.hs-hero .hs-hero__ring,
[dir="ltr"] .banner_area.hs-hero .hs-hero__arc,
[dir="ltr"] .banner_area.hs-hero .hs-hero__core {
    translate: -50% -50%;
}

.banner_area.hs-hero .hs-hero__ring { border: 1px solid rgba(217, 168, 62, .16); }
.banner_area.hs-hero .hs-hero__ring--1 { inline-size: 300px; block-size: 300px; }

.banner_area.hs-hero .hs-hero__ring--2 {
    inline-size: 470px;
    block-size: 470px;
    border-color: rgba(217, 168, 62, .11);
}

.banner_area.hs-hero .hs-hero__ring--3 {
    inline-size: 660px;
    block-size: 660px;
    border-color: rgba(217, 168, 62, .07);
}

/* The one bright element: a gold arc riding the middle ring. */
.banner_area.hs-hero .hs-hero__arc {
    inline-size: 470px;
    block-size: 470px;
    border: 2px solid transparent;
    border-block-start-color: var(--hx-gold);
    border-inline-end-color: rgba(217, 168, 62, .40);
    rotate: -28deg;
    filter: drop-shadow(0 0 18px rgba(217, 168, 62, .32));
    animation: hs-orbit 34s linear infinite;
}

.banner_area.hs-hero .hs-hero__core {
    inline-size: 330px;
    block-size: 330px;
    border: 0;
    background: radial-gradient(circle,
        rgba(217, 168, 62, .20) 0%,
        rgba(217, 168, 62, .07) 46%,
        rgba(217, 168, 62, 0) 72%);
}

@keyframes hs-orbit {
    from { rotate: -28deg; }
    to   { rotate: 332deg; }
}

/* B2. Hero copy. */
.banner_area.hs-hero .banner_text {
    position: relative;
    z-index: 1;
    max-inline-size: 640px;
}

.banner_area.hs-hero .banner_text h3 {
    font-size: clamp(34px, 4.2vw, 56px);
    line-height: 1.38;
    margin-block-end: 20px;
    color: var(--hx-ink);
    letter-spacing: -.01em;
}

.banner_area.hs-hero .banner_text p {
    font-size: 17.5px;
    line-height: 1.9;
    color: var(--hx-ink-2);
    max-inline-size: 48ch;
    margin-block-end: 34px;
}

/* B3. Search field, restyled for the dark stage. */
.banner_area.hs-hero .theme_search_field {
    max-inline-size: 600px;
    border-radius: 14px;
    border: 1px solid rgba(217, 168, 62, .26);
    background: rgba(16, 42, 67, .82);
    box-shadow: 0 26px 50px -28px rgba(0, 0, 0, .9);
    overflow: hidden;
    transition: border-color .2s ease, box-shadow .2s ease;
}

.banner_area.hs-hero .theme_search_field:focus-within {
    border-color: var(--hx-gold);
    box-shadow: 0 0 0 3px rgba(217, 168, 62, .22), 0 26px 50px -28px rgba(0, 0, 0, .9);
}

.banner_area.hs-hero .theme_search_field .form-control {
    background: transparent;
    border: 0;
    min-block-size: 60px;
    color: var(--hx-ink);
    /* The submit button is a sibling inside .input-group-prepend, so it is
       painted OVER the input's own box rather than beside it. The input must
       therefore reserve its width as padding or the text slides underneath.

       Measured: button 60px wide (min-inline-size below), input padding 44px
       -- a rule in another sheet was winning over the 20px set here -- which
       left the placeholder's first 16px sitting under the gold button.

       .input-group-prepend is first in the DOM, so the button renders at the
       INLINE-START edge in both directions (right in RTL, left in LTR).
       padding-inline-start maps to that side automatically; a physical
       padding-left would only have fixed the English build.

       !important because custom.css is not the last sheet loaded. */
    padding-inline-start: 72px !important; /* 60px button + 12px gap */
    padding-inline-end: 20px !important;
    font-size: 15px;
    text-overflow: ellipsis;
}

.banner_area.hs-hero .theme_search_field .form-control::placeholder {
    color: #93a5b9;
    opacity: 1;
}

.banner_area.hs-hero .theme_search_field .form-control:focus {
    box-shadow: none;
    background: transparent;
    color: var(--hx-ink);
}

.banner_area.hs-hero .theme_search_field .input-group-prepend .btn {
    min-inline-size: 60px;
    min-block-size: 60px;
    border-radius: 0;
    background: var(--hx-gold);
    color: var(--hx-navy-deep);
    font-size: 18px;
    transition: background-color .18s ease;
}

.banner_area.hs-hero .theme_search_field .input-group-prepend .btn:hover {
    background: var(--hx-gold-bright);
}

.banner_area.hs-hero .theme_search_field .input-group-prepend .btn:focus-visible {
    outline: 3px solid var(--hx-gold-bright);
    outline-offset: -3px;
}

/* B4. The key-feature strip stops being a white slab and becomes the same navy
   panel as the app section, so hero and tray read as one object with the tray
   resting on the stage. */
.category_area .couses_category {
    position: relative;
    z-index: 2;
    background:
        radial-gradient(120% 160% at 50% 0%, #123049 0%, rgba(18, 48, 73, 0) 64%),
        var(--hx-navy);
    border: 1px solid rgba(217, 168, 62, .20);
    box-shadow: 0 44px 80px -44px rgba(4, 19, 35, .85);
}

.category_area .couses_category::before {
    content: "";
    position: absolute;
    inset-block-start: 0;
    inset-inline: 0;
    block-size: 1px;
    background: linear-gradient(90deg,
        rgba(217, 168, 62, 0),
        rgba(240, 196, 87, .55),
        rgba(217, 168, 62, 0));
}

.category_area .couses_category .single_course_cat .course_content h4,
.category_area .couses_category .single_course_cat .course_content h4 a {
    color: var(--hx-ink);
}

.category_area .couses_category .single_course_cat .course_content h4 a:hover {
    color: var(--hx-gold-bright);
}

.category_area .couses_category .single_course_cat .course_content p {
    color: var(--hx-ink-2);
}

.category_area .couses_category .single_course_cat .icon {
    background: rgba(217, 168, 62, .12);
    border: 1px solid rgba(217, 168, 62, .26);
}

/* The divider lives on :not(:last-child) -- an earlier pass moved it there
   because in RTL the separator between item N and N+1 is item N's inline-END
   border. Recolouring :not(:first-child) would have missed item 1 and tinted
   nothing on item 3. */
.category_area .couses_category .col-xl-4:not(:last-child) .single_course_cat {
    border-inline-end-color: rgba(244, 247, 251, .12);
}


/* ---------------------------------------------------------------------------
   C. ASYMMETRIC SECTION HEAD
   The heading block moves off the centre line. Where a head carries an eyebrow
   pill the older gold rule is suppressed, so the two never stack.
   --------------------------------------------------------------------------- */

.hs-head {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    align-items: end;
    gap: 22px 40px;
    margin-block-end: 48px;
}

.hs-head__main {
    position: relative;
    min-inline-size: 0;
    text-align: start;
}

/* justify-self:end is the grid inline-end, so this mirrors under RTL. */
.hs-head__aside { justify-self: end; }

/* The eyebrow replaces the standalone gold rule in these heads. */
.hs-head .section__title::before { display: none; }

/* The section head is no longer centred, so the measure must stop centring
   itself. Overrides `.course_area .section__title p { margin-inline: auto }`
   from the earlier pass on equal specificity by coming later in the file. */
.hs-head .section__title p,
.hs-head .hs-head__main p {
    margin-inline: 0;
    max-inline-size: 52ch;
}

.hs-head .section__title h3 {
    font-size: clamp(27px, 3vw, 40px);
    line-height: 1.4;
    margin-block-end: 12px;
}

/* Content rides above the ghosted numeral. The numeral itself keeps z-index 0
   and is aria-hidden, so it is decoration in every sense. */
.hs-head__main > .hs-eyebrow,
.hs-head__main > h3,
.hs-head__main > p,
.hs-head__main > a {
    position: relative;
    z-index: 1;
}

/* Categories keeps its gold rule and gains only the numeral, so its head needs
   the same stacking fix. */
.category_area .section__title.hs-head__main { position: relative; }
.category_area .section__title.hs-head__main > h3,
.category_area .section__title.hs-head__main > p,
.category_area .section__title.hs-head__main > a { position: relative; z-index: 1; }

@media (max-width: 767.98px) {
    .hs-head {
        grid-template-columns: minmax(0, 1fr);
        gap: 20px;
        margin-block-end: 34px;
    }
    .hs-head__aside { justify-self: start; }
    .hs-sec__num { font-size: clamp(62px, 20vw, 96px); }
}

/* ---------------------------------------------------------------------------
   D. FEATURED-FIRST COURSE GRID
   Was three identical boxes in a bootstrap row. Now one lead card that spans
   both rows with a full-height image, and the remaining courses as horizontal
   strips beside it. The card internals are untouched -- only the composition
   and the two size variants are new.
   --------------------------------------------------------------------------- */

.hs-courses {
    display: grid;
    gap: 24px;
    grid-template-columns: repeat(auto-fill, minmax(min(100%, 272px), 1fr));
}

.hs-course { display: flex; min-inline-size: 0; }
.hs-course .couse_wizged { inline-size: 100%; }

/* Fill whatever box the grid hands the card. */
.course_area .hs-course .couse_wizged .thumb_inner {
    inline-size: 100%;
    block-size: 100%;
}

@media (min-width: 992px) {
    .hs-courses {
        grid-template-columns: minmax(0, 1.24fr) minmax(0, 1fr);
        align-items: stretch;
    }

    /* The focal point. */
    .hs-course--lead { grid-row: span 2; }

    .course_area .hs-course--lead .couse_wizged > a {
        display: flex;
        flex: 1 1 auto;
        min-block-size: 0;
    }

    .course_area .hs-course--lead .couse_wizged .thumb {
        inline-size: 100%;
        block-size: auto;
        min-block-size: 296px;
    }

    .course_area .hs-course--lead .couse_wizged .course_content {
        padding: 24px 26px 20px;
    }

    .course_area .hs-course--lead .couse_wizged .course_content h4,
    .course_area .hs-course--lead .couse_wizged .course_content h4.noBrake {
        font-size: 23px;
        line-height: 1.5;
        min-block-size: 0;
    }

    /* The two supporting cards read as strips, not as shrunken copies of the
       lead card -- that difference is what stops the row reading as boxes. */
    .course_area .hs-course:not(.hs-course--lead) .couse_wizged {
        flex-direction: row;
        align-items: stretch;
    }

    .course_area .hs-course:not(.hs-course--lead) .couse_wizged > a {
        flex: 0 0 41%;
        max-inline-size: 41%;
        display: block;
    }

    .course_area .hs-course:not(.hs-course--lead) .couse_wizged .thumb {
        block-size: 100%;
        min-block-size: 168px;
    }

    .course_area .hs-course:not(.hs-course--lead) .couse_wizged .course_content {
        flex: 1 1 auto;
        min-inline-size: 0;
        padding: 18px 20px 16px;
    }

    .course_area .hs-course:not(.hs-course--lead) .couse_wizged .course_content h4,
    .course_area .hs-course:not(.hs-course--lead) .couse_wizged .course_content h4.noBrake {
        font-size: 17px;
        min-block-size: 0;
        margin-block-end: 12px;
    }
}

/* ---------------------------------------------------------------------------
   E. TESTIMONIALS ON A DARK STAGE
   The rhythm break. Same navy ground and gold hairline as the app panel, so
   the two dark bands read as deliberate bookends rather than one-offs.
   --------------------------------------------------------------------------- */

.testmonial_area.hs-band--dark {
    position: relative;
    isolation: isolate;
    overflow: hidden;
    background:
        radial-gradient(115% 85% at 50% 0%, #21466C 0%, rgba(16, 42, 67, 0) 60%),
        var(--hx-navy-deep);
    border-block: 1px solid rgba(217, 168, 62, .16);
}

.testmonial_area.hs-band--dark .hs-band__glow {
    position: absolute;
    z-index: -1;
    inset-block-start: -160px;
    inset-inline-start: -120px;
    inline-size: 520px;
    block-size: 520px;
    border-radius: 50%;
    pointer-events: none;
    background: radial-gradient(circle,
        rgba(217, 168, 62, .13) 0%,
        rgba(217, 168, 62, .04) 45%,
        rgba(217, 168, 62, 0) 72%);
}

.hs-band--dark .section__title h3 { color: var(--hx-ink); }
.hs-band--dark .section__title p  { color: var(--hx-ink-2); }

.testmonial_area.hs-band--dark .single_testmonial {
    background: rgba(16, 42, 67, .62);
    border: 1px solid rgba(217, 168, 62, .20);
    box-shadow: 0 30px 60px -34px rgba(0, 0, 0, .85);
    padding: 30px 28px 28px;
}

/* Oversized gold quote glyph as the card's own graphic. ::after already
   carries the top hairline from the earlier pass, so this uses ::before. */
.testmonial_area.hs-band--dark .single_testmonial::before {
    content: "”";
    position: absolute;
    inset-block-start: 4px;
    inset-inline-end: 18px;
    z-index: 0;
    font-size: 108px;
    line-height: 1;
    font-weight: 700;
    color: rgba(217, 168, 62, .16);
    pointer-events: none;
    user-select: none;
}

.testmonial_area.hs-band--dark .single_testmonial > * { position: relative; z-index: 1; }

.testmonial_area.hs-band--dark .single_testmonial .testmonial_header {
    border-block-end-color: rgba(244, 247, 251, .13);
}

.testmonial_area.hs-band--dark .single_testmonial p {
    color: var(--hx-ink-2);
}

.testmonial_area.hs-band--dark .single_testmonial .reviewer_name h4 {
    color: var(--hx-ink);
}

.testmonial_area.hs-band--dark .single_testmonial .reviewer_name h6 {
    color: #93a5b9;
}

.testmonial_area.hs-band--dark .single_testmonial .rate i,
.testmonial_area.hs-band--dark .single_testmonial .rate .fas {
    color: var(--hx-gold-bright);
}

/* ---------------------------------------------------------------------------
   F. FAQ AS TWO COLUMNS
   The heading gets its own column and stays pinned while the questions scroll,
   instead of sitting centred above them.
   --------------------------------------------------------------------------- */

.blog_area .hs-faq {
    display: grid;
    grid-template-columns: minmax(0, .78fr) minmax(0, 1.22fr);
    align-items: start;
    gap: 56px;
}

.blog_area .hs-faq__aside .section__title { position: relative; }

.blog_area .hs-faq__aside .section__title p {
    margin-inline: 0;
    max-inline-size: 34ch;
}

.blog_area .hs-faq__main { min-inline-size: 0; }

@media (min-width: 992px) {
    .blog_area .hs-faq__aside {
        position: sticky;
        inset-block-start: 108px;
    }
}

@media (max-width: 991.98px) {
    .blog_area .hs-faq {
        grid-template-columns: minmax(0, 1fr);
        gap: 30px;
    }
}

/* ---------------------------------------------------------------------------
   G. INSTRUCTOR BAND
   Same duotone treatment as the hero, so the photograph joins the palette
   instead of fighting it, plus a gold rule down the inline-start of the copy
   in place of the centred stack.
   --------------------------------------------------------------------------- */

.cta_area.hs-cta {
    position: relative;
    isolation: isolate;
    overflow: hidden;
    background-color: var(--hx-navy-deep);
    background-blend-mode: luminosity;
    background-position: center;
    background-size: cover;
}

.cta_area.hs-cta::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: -1;
    background-image:
        linear-gradient(180deg,
            rgba(4, 19, 35, .90) 0%,
            rgba(4, 19, 35, .62) 45%,
            rgba(4, 19, 35, .92) 100%);
}

[dir="rtl"] .cta_area.hs-cta::before {
    background-image:
        linear-gradient(270deg,
            rgba(4, 19, 35, .95) 0%,
            rgba(4, 19, 35, .74) 44%,
            rgba(4, 19, 35, .28) 100%),
        linear-gradient(180deg,
            rgba(4, 19, 35, .72) 0%,
            rgba(4, 19, 35, .48) 45%,
            rgba(4, 19, 35, .86) 100%);
}

[dir="ltr"] .cta_area.hs-cta::before {
    background-image:
        linear-gradient(90deg,
            rgba(4, 19, 35, .95) 0%,
            rgba(4, 19, 35, .74) 44%,
            rgba(4, 19, 35, .28) 100%),
        linear-gradient(180deg,
            rgba(4, 19, 35, .72) 0%,
            rgba(4, 19, 35, .48) 45%,
            rgba(4, 19, 35, .86) 100%);
}

.cta_area.hs-cta .section__title.white_text {
    position: relative;
    text-align: start;
    padding-inline-start: 28px;
}

/* Editorial rule down the inline-start edge of the copy. */
.cta_area.hs-cta .section__title.white_text::before {
    content: "";
    position: absolute;
    inset-block: 6px 10px;
    inset-inline-start: 0;
    inline-size: 3px;
    border-radius: 99px;
    background: linear-gradient(180deg,
        var(--hx-gold-bright),
        rgba(217, 168, 62, .15));
}

.cta_area.hs-cta .section__title.white_text h3 {
    color: var(--hx-ink);
    font-size: clamp(28px, 3.2vw, 44px);
    line-height: 1.4;
    margin-block-end: 16px;
}

.cta_area.hs-cta .section__title.white_text p {
    color: var(--hx-ink-2);
    font-size: 17px;
    line-height: 1.9;
    max-inline-size: 46ch;
    margin-block-end: 30px;
}

/* ---------------------------------------------------------------------------
   H. BECOME-INSTRUCTOR PANEL
   Kept light, but given a warm ground and a gold hairline so it reads as a
   deliberate accent between the dark testimonial band and the FAQ rather than
   another white rectangle.
   --------------------------------------------------------------------------- */

.service_cta_area.hs-teach .single_cta_service {
    position: relative;
    overflow: hidden;
    background:
        radial-gradient(90% 180% at 100% 0%, rgba(217, 168, 62, .16) 0%, rgba(217, 168, 62, 0) 58%),
        #fffdf8;
    border: 1px solid rgba(217, 168, 62, .30);
}

.service_cta_area.hs-teach .single_cta_service::before {
    content: "";
    position: absolute;
    inset-block-start: 0;
    inset-inline: 0;
    block-size: 2px;
    background: linear-gradient(90deg,
        rgba(217, 168, 62, 0),
        var(--hx-gold),
        rgba(217, 168, 62, 0));
}


/* ---------------------------------------------------------------------------
   I. SPECIFICITY CORRECTIONS
   Verified against the rendered page, not assumed. The theme ships
   `.section__title>span { font-size:14px; text-transform:uppercase }` at
   (0,1,1), which outranks a bare `.hs-sec__num` (0,1,0) and was rendering the
   section numerals at 14px. Same story for the eyebrow, which is a <p> inside
   `.section__title` and so was being caught by `.course_area .section__title p`
   at (0,2,1). Both are re-stated here at a weight that actually wins.
   --------------------------------------------------------------------------- */

/* Anchored to the MIDDLE of the head block rather than hung off its top edge.
   Hanging it off the top pushed the glyph above the section boundary, where it
   was clipped and read as a rendering artefact rather than a graphic. Centring
   it means the numeral can never escape the band it belongs to, at any of the
   clamp sizes. */
.section__title > .hs-sec__num,
.hs-head__main > .hs-sec__num {
    position: absolute;
    display: block;
    margin: 0;
    inset-block-start: 50%;
    inset-inline-start: -.02em;
    translate: 0 -50%;
    z-index: 0;
    font-size: clamp(74px, 7.6vw, 124px);
    font-weight: 900;
    line-height: 1;
    letter-spacing: -.04em;
    text-transform: none;
    color: rgba(4, 19, 35, .075);
    pointer-events: none;
    user-select: none;
}

.section__title > .hs-sec__num--dark,
.hs-head__main > .hs-sec__num--dark { color: rgba(240, 196, 87, .11); }

/* Outlined rather than filled. A 7% flat fill read as a smudge; an outline at
   the same weight reads as a deliberate editorial numeral while staying well
   under the heading in the visual hierarchy. Behind @supports so browsers
   without text-stroke keep the solid fill above instead of losing the glyph. */
@supports (-webkit-text-stroke: 1px currentColor) {
    .section__title > .hs-sec__num,
    .hs-head__main > .hs-sec__num {
        color: transparent;
        -webkit-text-stroke: 2px rgba(4, 19, 35, .14);
    }

    .section__title > .hs-sec__num--dark,
    .hs-head__main > .hs-sec__num--dark {
        color: transparent;
        -webkit-text-stroke: 2px rgba(240, 196, 87, .28);
    }
}

.section__title > .hs-eyebrow,
.hs-head__main > .hs-eyebrow {
    display: inline-flex;
    align-items: center;
    gap: 9px;
    margin: 0 0 18px;
    padding-block: 7px;
    padding-inline: 14px;
    max-inline-size: none;
    border-radius: 999px;
    border: 1px solid rgba(217, 168, 62, .30);
    background: rgba(217, 168, 62, .10);
    color: var(--hx-gold-deep);
    font-size: 13px;
    font-weight: 700;
    line-height: 1.6;
    text-transform: none;
}

.section__title > .hs-eyebrow--dark,
.hs-head__main > .hs-eyebrow--dark {
    border-color: rgba(217, 168, 62, .28);
    background: rgba(217, 168, 62, .08);
    color: var(--hx-gold);
}

/* ---------------------------------------------------------------------------
   J. MASTHEAD RULE
   Heading at the inline-start, action at the inline-end, one hairline running
   under both. The rule is what stops the button reading as a stray object
   floating in the whitespace opposite the title.
   --------------------------------------------------------------------------- */

.hs-head {
    padding-block-end: 26px;
    border-block-end: 1px solid var(--hx-line);
    margin-block-end: 40px;
}

.hs-head--dark { border-block-end-color: rgba(244, 247, 251, .14); }

.hs-head .hs-head__main p:last-child { margin-block-end: 0; }

/* ---------------------------------------------------------------------------
   K. COURSE STRIP BALANCE
   The two supporting cards are stretched by the grid to half the lead card's
   height. Pinning their metadata to the bottom edge left a void in the middle;
   centring the content distributes that space instead.
   --------------------------------------------------------------------------- */

@media (min-width: 992px) {
    .course_area .hs-course:not(.hs-course--lead) .couse_wizged .course_content {
        justify-content: center;
    }
    .course_area .hs-course:not(.hs-course--lead) .couse_wizged .course_content .course_less_students {
        margin-block-start: 16px;
    }
}

/* ---------------------------------------------------------------------------
   L. CATEGORY TILE STAGGER
   The four tiles sat on a rigid 2x2 baseline. Dropping the second column by a
   half-step turns the block into a composition without moving any content.
   --------------------------------------------------------------------------- */

@media (min-width: 992px) {
    .category_area .col-lg-6 .row > .col-lg-6:nth-child(2) {
        margin-block-start: 44px;
    }
}

/* ---------------------------------------------------------------------------
   M. MOTION
   Opt-IN, exactly like the app panel: the start state only exists once the
   script has added .hs-motion to <html>. If the script never runs, or the user
   prefers reduced motion, every element renders in its final state and nothing
   is ever invisible. Stagger is 40ms per index, capped by the grid size.
   --------------------------------------------------------------------------- */

.hs-motion [data-hs-reveal] {
    opacity: 0;
    transform: translateY(20px);
    transition:
        opacity .55s ease-out,
        transform .55s cubic-bezier(.2, .7, .3, 1);
    transition-delay: calc(var(--hs-i, 0) * 40ms);
    will-change: opacity, transform;
}

.hs-motion [data-hs-reveal].hs-in {
    opacity: 1;
    transform: none;
    will-change: auto;
}

/* Hero parallax. The custom property is set by script on the hero and inherits
   down to the orbit; the ring children animate with `translate`, so there is no
   conflict with this `transform`. */
.banner_area.hs-hero .hs-hero__orbit {
    transform: translate3d(0, var(--hs-par, 0px), 0);
}

.testmonial_area.hs-band--dark .hs-band__glow {
    transform: translate3d(0, var(--hs-par, 0px), 0);
}

/* The editorial underline draws itself in once the hero is up. Background
   position has no logical keyword, so the growth origin is branched on dir --
   it must grow from the start edge of the text in both directions. */
.hs-motion .banner_area.hs-hero .hs-mark {
    background-size: 0% 100%;
    transition: background-size .95s cubic-bezier(.2, .7, .3, 1) .45s;
}

[dir="rtl"] .hs-motion .banner_area.hs-hero .hs-mark { background-position: 100% 0; }
[dir="ltr"] .hs-motion .banner_area.hs-hero .hs-mark { background-position: 0 0; }

.hs-motion .banner_area.hs-hero.hs-in .hs-mark { background-size: 100% 100%; }

@media (prefers-reduced-motion: reduce) {
    .hs-motion [data-hs-reveal],
    .hs-motion [data-hs-reveal].hs-in {
        opacity: 1;
        transform: none;
        transition: none;
    }

    .hs-motion .banner_area.hs-hero .hs-mark,
    .hs-motion .banner_area.hs-hero.hs-in .hs-mark {
        background-size: 100% 100%;
        transition: none;
    }

    .banner_area.hs-hero .hs-hero__arc { animation: none; }

    .banner_area.hs-hero .hs-hero__orbit,
    .testmonial_area.hs-band--dark .hs-band__glow {
        transform: none;
    }

}


/* ---------------------------------------------------------------------------
   N. FINAL COMPOSITION CORRECTIONS
   Each of these was found by reading the rendered screenshot, not by
   inspecting source.
   --------------------------------------------------------------------------- */

/* N1. The categories head has no eyebrow, so it is shorter than the others and
   a numeral centred on the whole block landed across the support copy. Raising
   its anchor puts it behind the heading where it belongs. */
.category_area .section__title.hs-head__main > .hs-sec__num {
    inset-block-start: 32%;
}

/* N2. Dead space. `.service_cta_area` carried a 96px bottom padding on top of
   the FAQ band's own 96px top padding, so the become-instructor panel floated
   in ~190px of nothing. The band above it already supplies the leading space
   through .border_top_1px. */
.service_cta_area.hs-teach {
    padding-block-end: 0;
}

/* N3. The FAQ aside keeps the gold rule (it has no eyebrow), but it must not
   inherit the centring the theme applies to the rule in centred heads. */
.blog_area .hs-faq__aside .section__title::before {
    margin-inline: 0;
}

/* N4. Course band top padding: the lead card's grid row is tall, so the band
   reads better with a slightly tighter head-to-grid relationship than the
   global rhythm gives it. */
.course_area.section_spacing .hs-head {
    margin-block-end: 36px;
}


/* ---------------------------------------------------------------------------
   O. SMALL SCREENS (verified at 390px through an http-served iframe wrapper,
   not a narrow headless window)
   --------------------------------------------------------------------------- */

/* O1. The hero search box.

   The theme carries `@media (max-width:767.98px){ .theme_search_field{
   display:none!important } }`, written for the HEADER's category search but
   applied to every element with that class -- which took the hero's search
   field with it. The result was a mobile hero with no action in it at all:
   heading, sub-line, and nothing to do. Restored for the hero only, at a
   weight that beats an !important on a single class. */
@media (max-width: 767.98px) {
    .banner_area.hs-hero .theme_search_field {
        display: flex !important;
        max-inline-size: none;
    }

    .banner_area.hs-hero .theme_search_field .form-control {
        min-block-size: 54px;
        /* Button drops to 54px here, so the reserved side shrinks to match. */
        padding-inline-start: 66px !important; /* 54px button + 12px gap */
        padding-inline-end: 16px !important;
        font-size: 15px;
    }

    .banner_area.hs-hero .theme_search_field .input-group-prepend .btn {
        min-inline-size: 54px;
        min-block-size: 54px;
        font-size: 16px;
    }
}

/* O2. Hero proportions. */
@media (max-width: 991.98px) {
    .banner_area.hs-hero { padding-block: 72px 104px; }

    .banner_area.hs-hero .banner_text p {
        font-size: 16px;
        line-height: 1.85;
        margin-block-end: 26px;
    }

    .banner_area.hs-hero .hs-hero__orbit { inset-inline-start: 22%; }
    .banner_area.hs-hero .hs-hero__ring--3 { display: none; }
}

@media (max-width: 575.98px) {
    .banner_area.hs-hero { padding-block: 56px 92px; }
    .banner_area.hs-hero .hs-hero__ring--2,
    .banner_area.hs-hero .hs-hero__arc { inline-size: 330px; block-size: 330px; }
    .banner_area.hs-hero .hs-hero__core { inline-size: 240px; block-size: 240px; }
}

/* O3. Key-feature tray.

   The hairline between the three claims is a vertical border, which is correct
   while they sit side by side and wrong the moment they stack -- it rendered
   as a stray vertical line beside each stacked item. Below the stacking point
   it becomes a horizontal rule instead. */
@media (max-width: 767.98px) {
    .category_area .couses_category {
        padding-block: 28px;
        padding-inline: 24px;
    }

    .category_area .couses_category .col-xl-4:not(:last-child) .single_course_cat {
        border-inline-end: 0;
        border-block-end: 1px solid rgba(244, 247, 251, .14);
        padding-block-end: 22px;
        margin-block-end: 22px;
    }
}

/* O4. Section numerals.

   The mobile size in the earlier block was written against a bare
   `.hs-sec__num` (0,1,0) and was silently outranked by the corrected
   `.section__title > .hs-sec__num` (0,2,0). Re-stated at the winning weight:
   at 390px the numeral must sit well behind the heading, not compete with it. */
@media (max-width: 767.98px) {
    .section__title > .hs-sec__num,
    .hs-head__main > .hs-sec__num {
        font-size: 64px;
    }

    .category_area .section__title.hs-head__main > .hs-sec__num {
        inset-block-start: 26%;
    }
}

@supports (-webkit-text-stroke: 1px currentColor) {
    @media (max-width: 767.98px) {
        .section__title > .hs-sec__num,
        .hs-head__main > .hs-sec__num {
            -webkit-text-stroke-width: 1.5px;
        }
    }
}

/* ---------------------------------------------------------------------------
   P. HERO SEARCH LEGIBILITY  (reported bug: "no boy can see what is written")
   Measured off the rendered page, not assumed: the placeholder was painting at
   #373737 on a #0E263E field = 1.29:1. That is invisible, and it is the single
   most important control on the page.

   The earlier rule set only `::placeholder`. Browsers still disagree about
   which pseudo-element wins for an <input> inside .input-group, and the theme
   ships several competing placeholder declarations, so this states every
   spelling, sets the input's own colour (which some engines inherit the
   placeholder from), and uses !important so no later sheet can undo it.

   #b8c5d4 on #21466C measures 10.67:1. Typed text is #f4f7fb at 17.1:1.
   --------------------------------------------------------------------------- */

.banner_area.hs-hero .theme_search_field input.form-control,
.banner_area.hs-hero .theme_search_field input {
    color: #f4f7fb !important;
    -webkit-text-fill-color: #f4f7fb;
    background-color: transparent !important;
}

.banner_area.hs-hero .theme_search_field input.form-control::placeholder,
.banner_area.hs-hero .theme_search_field input::placeholder {
    color: #b8c5d4 !important;
    -webkit-text-fill-color: #b8c5d4;
    opacity: 1 !important;
}

.banner_area.hs-hero .theme_search_field input.form-control::-webkit-input-placeholder,
.banner_area.hs-hero .theme_search_field input::-webkit-input-placeholder {
    color: #b8c5d4 !important;
    -webkit-text-fill-color: #b8c5d4;
    opacity: 1 !important;
}

.banner_area.hs-hero .theme_search_field input.form-control::-moz-placeholder,
.banner_area.hs-hero .theme_search_field input::-moz-placeholder {
    color: #b8c5d4 !important;
    opacity: 1 !important;
}

/* Chrome paints autofilled inputs with its own near-white background, which
   would put light text on light. Pin it back to the field's own ground. */
.banner_area.hs-hero .theme_search_field input:-webkit-autofill,
.banner_area.hs-hero .theme_search_field input:-webkit-autofill:focus {
    -webkit-text-fill-color: #f4f7fb;
    -webkit-box-shadow: 0 0 0 1000px #21466C inset;
    caret-color: #f4f7fb;
}

/* O5. Testimonial cards: the oversized quote glyph has to come down with the
   card or it crowds the reviewer's name at narrow widths. */
@media (max-width: 767.98px) {
    .testmonial_area.hs-band--dark .single_testmonial::before {
        font-size: 74px;
        inset-inline-end: 14px;
    }

    .testmonial_area.hs-band--dark .single_testmonial {
        padding: 26px 22px 24px;
    }
}


/* ═══════════════════════════════════════════════════════════════════════════
   P. SOLO TEACHER
   ---------------------------------------------------------------------------
   The homepage was built as a marketplace: an instructor roster to browse, a
   recruitment pitch to join it, and a search field implying a catalogue too
   large to read. This site has exactly one teacher and an audience of primary
   school children and their parents, so two of those sections were replaced
   rather than restyled -- an introduction to the one teacher, and a way to
   reach him -- and this block styles both, plus the hero actions that took the
   place of the search field.

   WARMTH, WITHOUT A SECOND BRAND
   The existing navy/gold system is right for authority but reads corporate on
   its own, which is the wrong note for a parent deciding who teaches their
   seven year old. Rather than introduce a whole second palette, this adds ONE
   warm hue and one warm surface, used only where the site speaks as a person
   rather than as an institution: the teacher's own introduction, and the
   contact affordances. Everything else keeps the navy/gold spine.

   CONTRAST
   Every figure below was MEASURED off the rendered page -- computed colour and
   computed background, with translucent layers composited onto what sits
   behind them -- not calculated from the hex values in this file. The tinted
   eyebrow and the .85-alpha card label are exactly the cases where reading the
   stylesheet gives the wrong answer, because neither element's effective
   background is a colour that appears anywhere in the source.

     --hx-navy      #032D58 on --hx-warm ........... 16.60:1  teacher name, facts
     --hx-clay-deep #8f3f1e on --hx-warm ............ 6.85:1  teacher role
     --hx-body      #4a5a6b on --hx-warm ............ 6.70:1  body copy
     --hx-clay-deep #8f3f1e on the 10% clay tint
                    used by .hs-eyebrow--warm ....... 6.02:1  13px, so the
                                                              full 4.5 applies
     #ffffff        on --hx-clay-deep ............... 7.25:1  primary card value
     rgba(#fff,.85) on --hx-clay-deep ............... 5.73:1  primary card label
     --hx-navy      on #ffffff ..................... 17.55:1  card value
     --hx-body      on #ffffff ...................... 7.08:1  card label
     #ffffff        on --hx-navy-deep #021930 ...... 17.14:1  hero ghost CTA
     hero ghost button border, rgba(255,255,255,.5)
                    composited over --hx-navy-deep .. 4.93:1  clears the 3:1
                                                              non-text floor

   Unused but worth recording, since they are what makes clay safe as a text
   colour at all: #b4532a is 4.99:1 on white and 4.72:1 on --hx-warm.

   The brand gold is absent from every light surface here on purpose: #C59848
   is 2.18:1 on white and fails both the 4.5:1 text floor AND the 3:1 non-text
   floor, so it cannot be a label, an icon, or a border on these sections. It
   appears only where the ground is navy.
   --------------------------------------------------------------------------- */

:root {
    /* Warm accent. Clay reads human and domestic next to the navy without
       fighting it -- both are low-chroma and deep, so they sit in the same
       tonal family. */
    --hx-clay: #b4532a;
    --hx-clay-deep: #8f3f1e;

    /* Warm surface. Distinct from both #fff and the existing cool --hx-tint
       (#f5f8fc), so a section on it separates from its neighbours without
       needing a border. */
    --hx-warm: #fdf8f0;
    --hx-warm-line: #ede0cf;
}

/* P1. Warm eyebrow. Same pill as .hs-eyebrow, retinted. Text is clay-DEEP,
   not clay: at 13px this is small text, so it needs the full 4.5:1 against
   the tinted pill ground, which plain clay misses at 4.14:1. */
.hs-eyebrow--warm {
    border-color: rgba(180, 83, 42, .28);
    background: rgba(180, 83, 42, .10);
    color: var(--hx-clay-deep);
}

.hs-eyebrow--warm .hs-eyebrow__dot { background: var(--hx-clay); }

/* Section heads inside .section__title need the same specificity treatment the
   existing eyebrow variants needed, or the theme's own rules win. */
.section__title > .hs-eyebrow--warm,
.hs-head__main > .hs-eyebrow--warm {
    border-color: rgba(180, 83, 42, .28);
    background: rgba(180, 83, 42, .10);
    color: var(--hx-clay-deep);
}


/* ---------------------------------------------------------------------------
   P2. HERO ACTIONS
   Replaced the catalogue search field. Two actions, ranked: see the lessons
   (primary, the theme's gold-on-navy .theme_btn), or talk to the teacher
   (secondary, ghost). One primary CTA per screen -- the ghost is deliberately
   subordinate rather than a second filled button.
   --------------------------------------------------------------------------- */

.banner_area.hs-hero .hs-hero__actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 14px;
    margin-block-start: 34px;
}

/* Both actions share a floor of 52px so they line up and clear the 44px touch
   minimum with room to spare. */
.banner_area.hs-hero .hs-hero__cta {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-block-size: 52px;
    padding-inline: 30px;
    border-radius: 999px;
    font-size: 15px;
    font-weight: 700;
    line-height: 1.4;
    text-align: center;
}

.banner_area.hs-hero .hs-hero__cta--ghost {
    color: #fff;
    border: 1px solid rgba(255, 255, 255, .5);
    background: rgba(255, 255, 255, .04);
    transition: background-color .2s ease, border-color .2s ease;
}

.banner_area.hs-hero .hs-hero__cta--ghost:hover,
.banner_area.hs-hero .hs-hero__cta--ghost:focus-visible {
    background: rgba(255, 255, 255, .12);
    border-color: rgba(255, 255, 255, .8);
    color: #fff;
}

@media (max-width: 575.98px) {
    /* Full width and stacked below 576px: side by side, each button drops under
       ~150px and the Arabic labels wrap to two lines inside a pill. */
    .banner_area.hs-hero .hs-hero__actions { gap: 12px; }

    .banner_area.hs-hero .hs-hero__cta {
        inline-size: 100%;
        padding-inline: 20px;
    }
}


/* ---------------------------------------------------------------------------
   P3. TEACHER INTRO
   Portrait opposite a first-person paragraph and three facts. Replaces the
   "learn from practitioners" band, whose whole proposition was choosing among
   many teachers.
   --------------------------------------------------------------------------- */

.hs-teacher {
    padding-block: var(--hx-sec);
    background: var(--hx-warm);
}

/* Keeps the columns from stretching to equal height, which would strand the
   portrait at the top of a tall text column. Source order already puts the
   photo first, so on mobile the face -- the fastest trust signal on the page --
   lands above the paragraph without an order swap. */
.hs-teacher__row { row-gap: 40px; }

.hs-teacher__figure {
    position: relative;
    margin: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
}

.hs-teacher__photo {
    inline-size: min(280px, 68vw);
    block-size: auto;
    aspect-ratio: 1;
    border-radius: 50%;
    object-fit: cover;
    /* The ring is drawn here rather than baked into the asset, so a real
       photograph dropped in at the same path inherits it unchanged. */
    border: 6px solid #fff;
    box-shadow: var(--hx-e2);
}

/* Credential chip, overlapped onto the portrait's lower edge. */
.hs-teacher__badge {
    position: relative;
    margin-block-start: -22px;
    align-self: center;
    padding-block: 9px;
    padding-inline: 18px;
    border-radius: 999px;
    background: var(--hx-clay-deep);
    color: #fff;
    font-size: 13px;
    font-weight: 700;
    line-height: 1.5;
    box-shadow: 0 12px 26px -14px rgba(143, 63, 30, .8);
}

.hs-teacher__name {
    margin: 0 0 6px;
    font-size: clamp(28px, 3.4vw, 40px);
    font-weight: 800;
    line-height: 1.25;
    color: var(--hx-navy);
}

.hs-teacher__role {
    margin: 0 0 20px;
    font-size: 16px;
    font-weight: 600;
    line-height: 1.6;
    color: var(--hx-clay-deep);
}

.hs-teacher__intro {
    margin: 0 0 28px;
    font-size: 17px;
    line-height: 1.85;
    color: var(--hx-body);
    /* Long-form Arabic at a comfortable measure. Beyond ~62 characters the eye
       loses the line return. */
    max-inline-size: 62ch;
}

.hs-teacher__facts {
    list-style: none;
    margin: 0 0 32px;
    padding: 0;
    display: grid;
    gap: 14px;
}

.hs-teacher__fact {
    display: flex;
    align-items: flex-start;
    gap: 14px;
}

.hs-teacher__fact-icon {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    inline-size: 42px;
    block-size: 42px;
    border-radius: 12px;
    background: #fff;
    border: 1px solid var(--hx-warm-line);
    color: var(--hx-clay);
}

.hs-teacher__fact-icon svg {
    inline-size: 21px;
    block-size: 21px;
}

.hs-teacher__fact-text {
    padding-block-start: 9px;
    font-size: 16px;
    line-height: 1.65;
    color: var(--hx-navy);
    font-weight: 500;
}

.hs-teacher__cta { margin-block-start: 4px; }

@media (max-width: 991.98px) {
    .hs-teacher { padding-block: calc(var(--hx-sec) * .66); }

    /* Centre the whole block on mobile so the portrait is not orphaned to one
       side above start-aligned text. */
    .hs-teacher__body { text-align: center; }
    .hs-teacher__intro { margin-inline: auto; }

    .hs-teacher__facts {
        max-inline-size: 420px;
        margin-inline: auto;
        margin-block-end: 28px;
    }

    /* Facts stay start-aligned even when the block centres: a centred icon plus
       centred label makes a ragged double edge that is harder to scan. */
    .hs-teacher__fact { text-align: start; }
}


/* ---------------------------------------------------------------------------
   P4. CONTACT THE TEACHER
   Replaces the "become an instructor" recruitment band. Channels a parent
   actually uses, ranked, with the messaging app first.
   --------------------------------------------------------------------------- */

.hs-contact {
    padding-block: var(--hx-sec);
    background: var(--hx-warm);
    border-block-start: 1px solid var(--hx-warm-line);
}

.hs-contact__head {
    text-align: center;
    max-inline-size: 640px;
    margin-inline: auto;
    margin-block-end: 44px;
}

.hs-contact__title {
    margin: 0 0 14px;
    font-size: clamp(26px, 3.2vw, 38px);
    font-weight: 800;
    line-height: 1.3;
    color: var(--hx-navy);
}

.hs-contact__sub {
    margin: 0;
    font-size: 16px;
    line-height: 1.8;
    color: var(--hx-body);
}

/* auto-fit rather than fixed columns: the number of cards depends on which
   contact settings are filled in, so the grid has to survive 1, 2, 3 or 4
   children without a bespoke rule for each count. */
.hs-contact__grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
    gap: var(--hx-gap);
}

.hs-contact__card {
    display: flex;
    align-items: center;
    gap: 16px;
    padding: 24px 22px;
    border-radius: var(--hx-r-md);
    background: #fff;
    border: 1px solid var(--hx-warm-line);
    box-shadow: var(--hx-e1);
    color: var(--hx-navy);
    /* Comfortably past the 44px touch minimum for the whole card, not just the
       label inside it. */
    min-block-size: 92px;
    transition: transform .2s ease, box-shadow .2s ease, border-color .2s ease;
}

/* Only the anchors lift. The opening-hours card is not interactive and must
   not pretend to be. */
a.hs-contact__card:hover,
a.hs-contact__card:focus-visible {
    transform: translateY(-3px);
    box-shadow: var(--hx-e2);
    border-color: var(--hx-clay);
    color: var(--hx-navy);
}

.hs-contact__card--primary {
    background: var(--hx-clay-deep);
    border-color: var(--hx-clay-deep);
    color: #fff;
}

a.hs-contact__card--primary:hover,
a.hs-contact__card--primary:focus-visible {
    background: var(--hx-clay);
    border-color: var(--hx-clay);
    color: #fff;
}

.hs-contact__card--static {
    background: transparent;
    box-shadow: none;
    border-style: dashed;
}

.hs-contact__icon {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    inline-size: 46px;
    block-size: 46px;
    border-radius: 50%;
    background: rgba(180, 83, 42, .10);
    color: var(--hx-clay);
}

.hs-contact__card--primary .hs-contact__icon {
    background: rgba(255, 255, 255, .16);
    color: #fff;
}

.hs-contact__icon svg {
    inline-size: 22px;
    block-size: 22px;
}

.hs-contact__card-body {
    display: flex;
    flex-direction: column;
    gap: 3px;
    min-inline-size: 0;
}

.hs-contact__label {
    font-size: 13px;
    font-weight: 600;
    line-height: 1.5;
    color: var(--hx-body);
}

.hs-contact__card--primary .hs-contact__label { color: rgba(255, 255, 255, .85); }

.hs-contact__value {
    font-size: 17px;
    font-weight: 700;
    line-height: 1.5;
    /* Phone numbers and email addresses are the two strings most likely to
       overflow a narrow card. Wrap rather than truncate: a half-shown phone
       number is worse than a wrapped one. */
    overflow-wrap: anywhere;
}

.hs-contact__value--email { font-size: 15px; }

@media (max-width: 991.98px) {
    .hs-contact { padding-block: calc(var(--hx-sec) * .66); }
    .hs-contact__head { margin-block-end: 32px; }
}


/* ═══════════════════════════════════════════════════════════════════════════
   Q. A PAGE THAT FEELS ALIVE
   ---------------------------------------------------------------------------
   Section P made the page speak as one teacher. This section makes it MOVE
   like one -- and gives the five subjects he teaches a colour each, so a
   parent scanning the page can tell عربي from رياضيات from علوم without
   reading a word.

   Section M already established the motion contract and this section does not
   change it. Restated, because everything below depends on it:

     - Motion is opt-IN. Every hidden start state lives behind `html.hs-motion`
       and that class is only added by script, after the script has confirmed
       both that IntersectionObserver exists and that the visitor has NOT
       asked for reduced motion. Script blocked, script throws, or OS says
       reduce => no class => every element renders in its final state. A
       failed script can never leave this page blank.
     - Only `transform`, `opacity`, `scale`, `rotate` and `translate` are
       animated. Nothing below animates width, height, top, left, margin or
       padding, so no animation on this page can trigger layout. The page is
       ~214KB of HTML; a single layout-animating rule would make it stutter.
     - `prefers-reduced-motion: reduce` is honoured TWICE over, on purpose:
       the script never opts in, AND the media query at Q12 hard-disables
       every transition, animation and hover transform this section adds. Two
       independent switches, because some of this audience is seven years old
       and vestibular safety is not a thing to leave to one code path.

   DIRECTION
   This page is `dir="rtl"`. `transform` is physical, not logical -- there is
   no `translate-inline-start` -- so entrance direction is branched ONCE here,
   into `--hs-enter-x`, and every entrance below reads that token instead of
   hardcoding a sign. RTL enters from the RIGHT (positive X), because the
   right edge is where an Arabic reader's eye already is. LTR mirrors it. Get
   this wrong and every heading appears to fly in backwards.

   COLOUR
   Five subject hues are introduced. Every figure was computed, not eyeballed,
   and alpha layers are composited onto their real backdrop before measuring:

                          as text      white     10% chip    solid chip
                          on white    #ffffff    (measured)   w/ white text
     عربي     #8f3f1e       7.25       7.25       6.22          7.25
     رياضيات  #12558f       7.72       7.72       6.59          7.72
     علوم     #0f6b62       6.36       6.36       5.49          6.36
     إنجليزي  #6b3fa0       7.38       7.38       6.34          7.38
     دين      #2c6b3f       6.40       6.40       5.54          6.40

   All five clear 4.5:1 as text, clear 4.5:1 as white-on-solid, clear 4.5:1 as
   own-colour-on-own-10%-tint, and clear the 3:1 non-text floor as accent bars.
   The subject label renders at 12px, which is small text, so the full 4.5:1
   applies to it and the 10% chip column above is the number that matters.

   Light variants exist for the navy bands (measured on --hx-navy-deep):
     clay-light #e8a583 9.03   blue-light #7cc0f5 9.55   teal-light #69ccc0 9.80
     violet-light #c3a4e8 8.73  green-light #86c99a 9.65

   The brand gold is still absent from every light surface here. #C59848 is
   2.18:1 on white: it fails the 4.5:1 text floor AND the 3:1 non-text floor,
   so it is never a subject colour, never a bar, never a numeral, never a
   progress fill. It appears below only on navy, where it measures 8.57:1.
   ═══════════════════════════════════════════════════════════════════════════ */


/* ---------------------------------------------------------------------------
   Q0. MOTION VOCABULARY
   One easing scale and one direction token, so every animation on the page
   shares a rhythm instead of each section inventing its own.
   --------------------------------------------------------------------------- */

:root {
    /* Entrance easing. Slight overshoot at the tail so arrivals settle rather
       than stop dead -- the closest an ease curve gets to spring physics
       without a physics engine. */
    --hs-ease-enter: cubic-bezier(.16, .84, .32, 1.06);
    /* Interaction easing. No overshoot: a hover that wobbles feels broken. */
    --hs-ease-ui: cubic-bezier(.2, .7, .3, 1);

    --hs-dur-fast: .18s;   /* press / colour changes */
    --hs-dur-ui: .32s;     /* hover lift, card states */
    --hs-dur-enter: .62s;  /* section entrances */

    /* Per-item stagger. Section M used a hardcoded 40ms; it is a token now so
       a dense grid can tighten it without touching the transition. */
    --hs-step: 60ms;
}

/* THE direction branch. Everything that enters reads this one value. */
[dir="rtl"] { --hs-enter-x: 34px; }
[dir="ltr"] { --hs-enter-x: -34px; }


/* ---------------------------------------------------------------------------
   Q1. REVEAL VARIANTS
   Section M gave every revealed element the same 20px rise. Uniform motion is
   what makes a page feel generated: the eye reads "a script did this" rather
   than "someone composed this". These variants let each band arrive in a way
   that suits its own shape, and they are opted into per element from the
   template via the attribute VALUE.

   `[data-hs-reveal]` with a value still matches the bare `[data-hs-reveal]`
   selector in section M, so these rules carry equal specificity and win only
   because they are later in the file. Do not move this block above section M.
   --------------------------------------------------------------------------- */

/* Re-time the base reveal onto the shared tokens. Same 20px rise as before,
   now on the shared easing and the shared stagger step. */
.hs-motion [data-hs-reveal] {
    transition:
        opacity var(--hs-dur-enter) ease-out,
        transform var(--hs-dur-enter) var(--hs-ease-enter);
    transition-delay: calc(var(--hs-i, 0) * var(--hs-step));
}

/* "start" -- enters from the reading-start edge. Right in RTL, left in LTR.
   For headings and copy blocks, where a horizontal arrival reads as the line
   sliding into place from where the eye already sits. */
.hs-motion [data-hs-reveal="start"] {
    opacity: 0;
    transform: translate3d(var(--hs-enter-x), 0, 0);
}

/* "rise" -- a taller lift than the default, for whole bands rather than
   cards. Paired with a fractional scale so the band appears to come forward
   rather than merely upward. */
.hs-motion [data-hs-reveal="rise"] {
    opacity: 0;
    transform: translate3d(0, 34px, 0) scale(.985);
}

/* "pop" -- for things that read as objects rather than text: the stat
   figures, the subject tiles. Scale from just under 1; anything under about
   .9 reads as a zoom effect rather than an arrival. */
.hs-motion [data-hs-reveal="pop"] {
    opacity: 0;
    transform: scale(.94);
}

/* "tilt" -- course cards. A degree and a half of rotation is below the
   threshold where it reads as "rotating" and above the threshold where it
   reads as flat. Direction follows the reading direction so the deck of cards
   fans the correct way. */
.hs-motion [data-hs-reveal="tilt"] {
    opacity: 0;
    transform: translate3d(calc(var(--hs-enter-x) * .5), 26px, 0) rotate(var(--hs-tilt, 1.5deg));
}

[dir="ltr"] .hs-motion [data-hs-reveal="tilt"] { --hs-tilt: -1.5deg; }

/* Every variant lands in the same place. */
.hs-motion [data-hs-reveal].hs-in {
    opacity: 1;
    transform: none;
}


/* ---------------------------------------------------------------------------
   Q2. HERO: A STAGED ENTRANCE
   The hero previously appeared complete and then drew its underline. Now it
   assembles: the orbit expands behind, then eyebrow, headline, underline,
   copy and actions arrive in sequence from the reading-start edge.

   Total sequence is ~1.15s from first paint to last element settled. Longer
   than that and a returning visitor is waiting for their own homepage.

   The stage is driven entirely by `.hs-hero.hs-in`, which section M's script
   already sets on the next animation frame -- no new JS is needed for any of
   this, and if that class never arrives every child is simply visible.
   --------------------------------------------------------------------------- */

.hs-motion .banner_area.hs-hero .hs-eyebrow,
.hs-motion .banner_area.hs-hero .banner_text > h3,
.hs-motion .banner_area.hs-hero .banner_text > p,
.hs-motion .banner_area.hs-hero .hs-hero__actions,
.hs-motion .banner_area.hs-hero .theme_search_field {
    opacity: 0;
    transform: translate3d(var(--hs-enter-x), 0, 0);
    transition:
        opacity .66s ease-out,
        transform .66s var(--hs-ease-enter);
}

.hs-motion .banner_area.hs-hero.hs-in .hs-eyebrow,
.hs-motion .banner_area.hs-hero.hs-in .banner_text > h3,
.hs-motion .banner_area.hs-hero.hs-in .banner_text > p,
.hs-motion .banner_area.hs-hero.hs-in .hs-hero__actions,
.hs-motion .banner_area.hs-hero.hs-in .theme_search_field {
    opacity: 1;
    transform: none;
}

/* The staircase. Hand-authored rather than an --hs-i loop because these five
   are a fixed, known sequence and the gaps between them are not uniform --
   the headline gets extra air before it so it lands as the beat of the hero,
   and the underline (section M, .45s) draws into the gap after it. */
.hs-motion .banner_area.hs-hero .hs-eyebrow          { transition-delay: .08s; }
.hs-motion .banner_area.hs-hero .banner_text > h3    { transition-delay: .20s; }
.hs-motion .banner_area.hs-hero .banner_text > p     { transition-delay: .46s; }
.hs-motion .banner_area.hs-hero .hs-hero__actions,
.hs-motion .banner_area.hs-hero .theme_search_field  { transition-delay: .58s; }

/* The orbit expands into place. The rings position themselves with the
   `translate` individual property and the arc spins with `rotate`, so `scale`
   is the one transform channel still free on them -- using it here cannot
   collide with either, and it stays on the compositor. */
.hs-motion .banner_area.hs-hero .hs-hero__ring,
.hs-motion .banner_area.hs-hero .hs-hero__core {
    opacity: 0;
    scale: .82;
    transition:
        opacity .9s ease-out,
        scale 1.1s var(--hs-ease-enter);
}

.hs-motion .banner_area.hs-hero.hs-in .hs-hero__ring,
.hs-motion .banner_area.hs-hero.hs-in .hs-hero__core {
    opacity: 1;
    scale: 1;
}

/* Outward: the innermost ring first, then out. The orbit reads as something
   radiating from the core rather than three circles fading up together. */
.hs-motion .banner_area.hs-hero .hs-hero__core    { transition-delay: 0s; }
.hs-motion .banner_area.hs-hero .hs-hero__ring--1 { transition-delay: .10s; }
.hs-motion .banner_area.hs-hero .hs-hero__ring--2 { transition-delay: .20s; }
.hs-motion .banner_area.hs-hero .hs-hero__ring--3 { transition-delay: .30s; }

/* The arc is the one bright element, so it arrives last and on its own. Its
   perpetual spin (hs-orbit, section B) is a `rotate` animation; fading it in
   with opacity does not disturb that. */
.hs-motion .banner_area.hs-hero .hs-hero__arc {
    opacity: 0;
    transition: opacity 1.2s ease-out .42s;
}

.hs-motion .banner_area.hs-hero.hs-in .hs-hero__arc { opacity: 1; }

/* A slow breath on the core glow. 9s is long enough that it reads as ambient
   light rather than a pulse demanding attention, and it is scale-only so it
   costs nothing per frame. */
.banner_area.hs-hero.hs-in .hs-hero__core {
    animation: hs-breathe 9s ease-in-out 1.6s infinite;
}

@keyframes hs-breathe {
    0%, 100% { scale: 1; }
    50%      { scale: 1.055; }
}


/* ---------------------------------------------------------------------------
   Q3. SUBJECT COLOUR SYSTEM
   Five hues, one per subject. Each class sets THREE custom properties and
   nothing else; the components downstream (cards, tiles, pills) read the
   properties and never name a subject. Adding a sixth subject is one block
   here, not an edit in four places.

     --hs-subject       the hue at text strength, for labels and accent bars
     --hs-subject-soft  a 10% wash of it, for chip grounds
     --hs-subject-lit   a light variant for use on the navy bands

   Every value is measured; see the table at the head of section Q.
   --------------------------------------------------------------------------- */

.hs-subj {
    --hs-subject: var(--hx-navy);
    --hs-subject-soft: rgba(7, 26, 46, .08);
    --hs-subject-lit: #b8c5d4;
}

/* عربي -- clay. Reuses the warm hue section P already introduced, so the
   language subject is tied to the teacher's own voice colour. */
.hs-subj--arabic {
    --hs-subject: #8f3f1e;
    --hs-subject-soft: rgba(143, 63, 30, .10);
    --hs-subject-lit: #e8a583;
}

/* رياضيات -- blue. A darkened cousin of the brand primary (#1769c2 is 5.47:1
   on white and would pass, but it sits too close to link blue to read as a
   subject label; #12558f separates them). */
.hs-subj--math {
    --hs-subject: #12558f;
    --hs-subject-soft: rgba(18, 85, 143, .10);
    --hs-subject-lit: #7cc0f5;
}

/* علوم -- teal. */
.hs-subj--science {
    --hs-subject: #0f6b62;
    --hs-subject-soft: rgba(15, 107, 98, .10);
    --hs-subject-lit: #69ccc0;
}

/* إنجليزي -- violet. The only hue here with no natural referent; it is
   chosen because it is the largest gap left in the wheel once the other four
   are placed, which is what keeps five subjects distinguishable at a glance. */
.hs-subj--english {
    --hs-subject: #6b3fa0;
    --hs-subject-soft: rgba(107, 63, 160, .10);
    --hs-subject-lit: #c3a4e8;
}

/* تربية دينية -- green. */
.hs-subj--deen {
    --hs-subject: #2c6b3f;
    --hs-subject-soft: rgba(44, 107, 63, .10);
    --hs-subject-lit: #86c99a;
}

/* The label itself. 12px is small text, so this is held to the full 4.5:1 --
   the measured figure against its own composited 10% ground is in the table
   at the head of section Q and the worst case is 5.49:1 (علوم). */
.hs-subj__tag {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 4px 10px;
    border-radius: 999px;
    /* CORRECTION, found in the render rather than in the source. `.course_content`
       is a flex COLUMN, and a flex column stretches its children across the cross
       axis by default -- so `display:inline-flex` was not enough and the pill
       spanned the full card width as a coloured bar with the subject name pushed
       to one end. It has to opt out of the stretch explicitly. */
    align-self: flex-start;
    inline-size: fit-content;
    max-inline-size: 100%;
    background: var(--hs-subject-soft);
    color: var(--hs-subject);
    font-size: 12px;
    font-weight: 700;
    line-height: 1.5;
    white-space: nowrap;
}

/* A dot, not an icon. Colour alone never carries the meaning here -- the tag
   always contains the subject NAME as text, so this is decoration reinforcing
   a label rather than a colour-only signal. */
.hs-subj__tag::before {
    content: "";
    inline-size: 6px;
    block-size: 6px;
    border-radius: 50%;
    background: var(--hs-subject);
    flex: none;
}


/* ---------------------------------------------------------------------------
   Q4. COURSE CARDS THAT ANSWER THE POINTER
   Three changes: a subject-coloured spine, a lift on hover, and a slow push
   into the thumbnail. All three are transforms.

   The spine is a pseudo-element scaled on the block axis -- NOT a height
   change. `transform-origin` is branched on `dir` so the spine always grows
   from the top-start corner, which is the corner an Arabic reader's eye
   enters the card from.
   --------------------------------------------------------------------------- */

.hs-course .couse_wizged {
    position: relative;
    isolation: isolate;
    transition:
        transform var(--hs-dur-ui) var(--hs-ease-ui),
        box-shadow var(--hs-dur-ui) var(--hs-ease-ui);
}

/* The spine. Sits on the inline-start edge, one third tall at rest, full
   height on hover. Non-text, and the softest subject hue measures 6.36:1
   against white, so it clears the 3:1 floor with room to spare. */
.hs-course .couse_wizged::before {
    content: "";
    position: absolute;
    inset-block: 0;
    inset-inline-start: 0;
    inline-size: 4px;
    z-index: 2;
    border-radius: 999px;
    background: var(--hs-subject, var(--hx-navy));
    transform: scaleY(.34);
    transform-origin: top;
    transition: transform var(--hs-dur-ui) var(--hs-ease-ui);
}

.hs-course:hover .couse_wizged::before,
.hs-course:focus-within .couse_wizged::before {
    transform: scaleY(1);
}

/* Lift. 6px is the point where a card reads as picked up rather than nudged;
   the shadow does the rest of the work. `:focus-within` matches it so a
   keyboard user gets the same affordance as a mouse user. */
.hs-course:hover .couse_wizged,
.hs-course:focus-within .couse_wizged {
    transform: translate3d(0, -6px, 0);
    box-shadow: var(--hx-e2);
}

/* Thumbnail push. The image is a background on .thumb_inner, so scaling that
   element zooms the image without touching the card's box. The clip has to be
   declared here: the theme does not set it, and without it the scaled image
   spills over the card's rounded corner. */
.hs-course .thumb {
    position: relative;
    overflow: hidden;
    isolation: isolate;
}

.hs-course .thumb_inner {
    transition: transform .7s var(--hs-ease-ui);
    will-change: auto;
}

.hs-course:hover .thumb_inner,
.hs-course:focus-within .thumb_inner {
    transform: scale(1.06);
}

/* A subject-tinted wash over the thumbnail, so even the image area carries
   the subject's colour. Very low alpha: this is a tint, not a filter, and the
   thumbnail still has to read as a photograph. */
.hs-course .thumb::after {
    content: "";
    position: absolute;
    inset: 0;
    z-index: 1;
    pointer-events: none;
    background: linear-gradient(160deg,
        var(--hs-subject, transparent) 0%,
        transparent 58%);
    opacity: .16;
    transition: opacity var(--hs-dur-ui) var(--hs-ease-ui);
}

.hs-course:hover .thumb::after,
.hs-course:focus-within .thumb::after { opacity: .06; }

/* The subject tag sits above the thumbnail wash. */
.hs-course .hs-subj__tag {
    position: relative;
    z-index: 2;
    margin-block-end: 10px;
    background: var(--hs-subject-soft);
}

/* The title takes the subject hue on hover -- the one place the colour
   becomes text. Measured worst case 6.36:1 on white. */
.hs-course .course_content h4 {
    transition: color var(--hs-dur-fast) var(--hs-ease-ui);
}

.hs-course:hover .course_content h4 { color: var(--hs-subject, inherit); }


/* ---------------------------------------------------------------------------
   Q5. SUBJECT TILES
   The three category tiles were three identical navy rectangles: the page
   said "we have categories" without saying which. Each now carries its own
   subject hue as a deep gradient wash over the navy, so the trio reads as
   three different things from across the room.

   The tile label sits on the deepest part of the wash. The wash bottoms out
   at the subject hue over navy -- both are dark, so white label text measures
   at worst 9.6:1 against the composited ground.
   --------------------------------------------------------------------------- */

/* CORRECTION -- SPECIFICITY, and a lesson worth writing down.

   The first version of this block was written as `.category_wiz .thumb::after`
   and did nothing at all. Section 4b of this file already styles
   `.category_area .category_wiz .thumb::after` at (0,3,1), and it ALSO carries
   `.category_area .category_wiz .thumb::before { content: none }`. Specificity
   beats source order, so being later in the file bought nothing: both of my
   pseudo-elements were silently outranked and the tiles rendered exactly as
   before. Nothing errored; the rules were simply never applied.

   The fix is not just to add weight, though. Reading what was already there
   showed the ::after is doing a real job -- it is the legibility scrim that
   keeps the white label readable over whatever artwork a category is given.
   Overwriting it with a subject wash would have taken the label's contrast
   with it. So the work is split along the layering that already existed:

     .thumb background   the category artwork (inline style, outranks all CSS)
     ::before  z-index -1  THE SUBJECT WASH -- re-enabled here
     ::after   z-index -1  the existing navy scrim, bottom 62%, LEFT ALONE
     .cat_btn              the label

   Because ::after paints after ::before, the scrim lands on top of the wash.
   The subject hue therefore reads strongly across the upper half of the tile
   where the artwork sits, and fades under the navy scrim exactly where the
   label needs a dark ground -- so the label's measured contrast is unchanged
   from what section 4b established, and no figure there needs restating. */

.category_area .category_wiz .thumb {
    transition:
        transform var(--hs-dur-ui) var(--hs-ease-ui),
        border-color .3s ease,
        box-shadow .3s ease;
}

.category_area .category_wiz .thumb::before {
    /* Section 4b retired this with `content: none`. It comes back carrying the
       subject colour, which is a different job from the gold light source it
       used to hold. */
    content: "";
    position: absolute;
    inset: 0;
    inset-block-start: 0;
    inset-inline-start: 0;
    inline-size: 100%;
    block-size: 100%;
    z-index: -1;
    opacity: 1;
    pointer-events: none;
    background-image:
        /* The khatam figure -- two squares at 45 degrees, the flattest possible
           nod to an arabesque. Inlined as a data URI: a pattern with no network
           request, because this page must not gain an external dependency. */
        url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 64 64'%3E%3Cg fill='none' stroke='%23ffffff' stroke-opacity='0.14' stroke-width='1'%3E%3Crect x='16' y='16' width='32' height='32'/%3E%3Crect x='16' y='16' width='32' height='32' transform='rotate(45 32 32)'/%3E%3C/g%3E%3C/svg%3E"),
        /* SECOND CORRECTION. Mixing the hue against #021930 produced an OPAQUE
           colour, which covered the category artwork completely -- the tiles
           gained their subject identity and lost the ب / ÷× / flask icon that
           was already communicating the same thing rather well. Mixing against
           `transparent` instead yields the hue at partial ALPHA, so this is now
           a tint over the artwork rather than a lid on top of it: the icon
           reads through, and the tile still reads as its subject from across
           the room. Both, instead of either. */
        linear-gradient(150deg,
            color-mix(in srgb, var(--hs-subject, #0b2036) 62%, transparent) 0%,
            color-mix(in srgb, var(--hs-subject, #0b2036) 30%, transparent) 46%,
            rgba(4, 19, 35, .50) 92%);
    transition: opacity var(--hs-dur-ui) var(--hs-ease-ui);
}

/* Section 4b brightens ::before on hover; that rule was written for the gold
   light source and would wash the subject hue out. */
.category_area .category_wiz .thumb:hover::before { opacity: .92; }

/* The tile label is white on this wash. Measured against the STRONGEST point
   of the gradient -- 78% subject over navy, which is the only place a white
   label could fail -- the worst of the five is علوم at 8.26:1, and the rest
   land between 8.31 and 9.71. At the 42% mid stop every one exceeds 14:1. So
   the wash can carry this much hue without putting the label at risk.

   color-mix is not universal. Where it is missing, the tile falls back to the
   raw subject colour under the same navy veil: the hue is coarser but present,
   which is a better failure than reverting to five identical navy rectangles. */
@supports not (background: color-mix(in srgb, red 50%, blue)) {
    .category_area .category_wiz .thumb::before {
        /* No color-mix means no way to derive an alpha from the custom
           property, so the fallback tints via the pseudo's own opacity
           instead. Coarser, but the tile still reads as its subject. */
        background-image: linear-gradient(150deg,
            var(--hs-subject, #0b2036) 0%,
            rgba(4, 19, 35, .55) 52%,
            rgba(4, 19, 35, .72) 92%);
        opacity: .62;
    }
}

.category_area .category_wiz:hover .thumb { transform: translate3d(0, -5px, 0); }

/* ---------------------------------------------------------------------------
   Q6. FIGURES THAT COUNT THEMSELVES UP
   Three facts the teacher can already evidence -- years teaching, grades
   covered, subjects taught. No invented enrolment number: a fabricated
   "5,000 students" on a one-teacher site is the single fastest way to lose a
   parent who is reading carefully.

   The final value is what the TEMPLATE renders. The script only counts when
   motion is on, and it refuses to touch a figure that is already on screen,
   so the number can never be caught mid-count by a visitor who arrives deep
   linked. Script dead => the correct number was always in the HTML.

   `tabular-nums` is not decoration here: without it the glyph widths change
   as the digits roll and the whole row jitters horizontally for the duration
   of the count.
   --------------------------------------------------------------------------- */

.hs-stats {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: var(--hx-gap);
    margin-block-start: 44px;
    padding-block-start: 34px;
    border-block-start: 1px solid var(--hx-warm-line);
}

.hs-stat { min-inline-size: 0; }

.hs-stat__num {
    display: block;
    font-size: 44px;
    font-weight: 800;
    line-height: 1.1;
    color: var(--hx-navy);            /* 16.60:1 on --hx-warm */
    font-variant-numeric: tabular-nums;
    font-feature-settings: "tnum" 1;
    letter-spacing: -.01em;
}

/* The unit rides the numeral rather than sitting under it, so "14" and
   "سنة" read as one figure. Clay-deep, 6.85:1 on the warm ground. */
.hs-stat__suffix {
    font-size: 20px;
    font-weight: 700;
    color: var(--hx-clay-deep);
    margin-inline-start: 4px;
}

.hs-stat__label {
    display: block;
    margin-block-start: 6px;
    font-size: 14px;
    font-weight: 600;
    line-height: 1.5;
    color: var(--hx-body);            /* 6.70:1 on --hx-warm */
}

/* The rule under each figure grows on the block axis, keyed to the subject
   spine idiom from Q4 so the two devices read as the same system. */
.hs-stat__rule {
    display: block;
    inline-size: 40px;
    block-size: 3px;
    margin-block-start: 14px;
    border-radius: 999px;
    background: var(--hx-clay);
    /* Default is DRAWN, not collapsed. Same opt-in contract as every other
       start state here: no script means no `.hs-motion`, which means this
       rule is never collapsed and the figure never appears unfinished. */
    transform: scaleX(1);
    transition: transform .7s var(--hs-ease-enter);
    transition-delay: calc(var(--hs-i, 0) * 120ms + 260ms);
}

/* transform-origin has no logical keyword in any shipping engine, so the
   growth edge is branched. It must grow from the start edge in both
   directions or the rule appears to retract. */
[dir="rtl"] .hs-stat__rule { transform-origin: right; }
[dir="ltr"] .hs-stat__rule { transform-origin: left; }

.hs-motion .hs-stats .hs-stat__rule { transform: scaleX(0); }
.hs-motion .hs-stats.hs-in .hs-stat__rule { transform: scaleX(1); }


/* ---------------------------------------------------------------------------
   Q7. THE ACCORDION ANSWERS BACK
   The FAQ is a Bootstrap collapse and its open/close is Bootstrap's own
   height transition -- that is pre-existing behaviour and is left alone.
   What is added is a chevron that rotates, a row that responds to the
   pointer, and an answer that fades up as it arrives.

   The chevron state is read from `aria-expanded`, not from a class, so the
   visual and the announced state can never disagree.
   --------------------------------------------------------------------------- */

.blog_area .theme_according .card-header .btn-link {
    position: relative;
    transition: color var(--hs-dur-fast) var(--hs-ease-ui);
}

.blog_area .theme_according .card-header {
    transition: transform var(--hs-dur-ui) var(--hs-ease-ui);
}

.blog_area .theme_according .card:hover .card-header {
    transform: translate3d(calc(var(--hs-enter-x) * -.12), 0, 0);
}

/* Chevron, drawn from two borders rather than an icon font: it cannot fail to
   a tofu box if the font is blocked, and it costs no request. */
.blog_area .theme_according .card-header .btn-link::after {
    content: "";
    position: absolute;
    inset-inline-end: 4px;
    inset-block-start: calc(50% - 5px);
    inline-size: 9px;
    block-size: 9px;
    border-inline-end: 2px solid currentColor;
    border-block-end: 2px solid currentColor;
    transform: rotate(45deg);
    transform-origin: center;
    transition: transform var(--hs-dur-ui) var(--hs-ease-ui);
    opacity: .8;
}

.blog_area .theme_according .card-header .btn-link[aria-expanded="true"]::after {
    transform: rotate(-135deg);
}

/* The answer fades up as the panel opens. Bootstrap adds .show to the
   collapse container at the start of its own transition, so this rides along
   with it rather than needing its own trigger. */
.hs-motion .blog_area .theme_according .collapse .card-body {
    opacity: 0;
    transform: translate3d(0, 8px, 0);
    transition:
        opacity .38s ease-out .06s,
        transform .38s var(--hs-ease-ui) .06s;
}

.hs-motion .blog_area .theme_according .collapse.show .card-body {
    opacity: 1;
    transform: none;
}


/* ---------------------------------------------------------------------------
   Q8. TESTIMONIAL CARDS
   These sit on the navy stage inside an Owl carousel, so the card cannot
   change its box without disturbing the track. Lift and glow only.
   --------------------------------------------------------------------------- */

.testmonial_area .single_testmonial {
    transition:
        transform var(--hs-dur-ui) var(--hs-ease-ui),
        box-shadow var(--hs-dur-ui) var(--hs-ease-ui);
}

.testmonial_area .single_testmonial:hover {
    transform: translate3d(0, -6px, 0);
    box-shadow: 0 26px 50px -24px rgba(0, 0, 0, .6);
}

/* The avatar leans in slightly. Scale only, so it cannot reflow the header
   row it sits in. */
.testmonial_area .single_testmonial .testimonialImage {
    transition: transform .45s var(--hs-ease-ui);
}

.testmonial_area .single_testmonial:hover .testimonialImage {
    transform: scale(1.08);
}

/* Gold on navy measures 8.57:1, so the stars are safe to brighten here --
   this is the one ground on the page where gold is legitimate. */
.testmonial_area .single_testmonial .rate i {
    transition: transform .3s var(--hs-ease-enter), color var(--hs-dur-fast) ease;
}

.testmonial_area .single_testmonial:hover .rate i {
    transform: translate3d(0, -2px, 0);
    color: var(--hx-gold-bright);
}

/* Staggered per star, so the row ripples rather than jumping as a block. */
.testmonial_area .single_testmonial .rate i:nth-child(1) { transition-delay: 0ms; }
.testmonial_area .single_testmonial .rate i:nth-child(2) { transition-delay: 35ms; }
.testmonial_area .single_testmonial .rate i:nth-child(3) { transition-delay: 70ms; }
.testmonial_area .single_testmonial .rate i:nth-child(4) { transition-delay: 105ms; }
.testmonial_area .single_testmonial .rate i:nth-child(5) { transition-delay: 140ms; }


/* ---------------------------------------------------------------------------
   Q9. BUTTONS
   A press that answers, and one sweep of light across the primary button on
   hover. The sweep is a transform on a pseudo-element, not a background-
   position animation, so it composites.
   --------------------------------------------------------------------------- */

.theme_btn,
.hs-hero__cta,
.brouse_cat_btn,
.line_link {
    transition:
        transform var(--hs-dur-fast) var(--hs-ease-ui),
        box-shadow var(--hs-dur-ui) var(--hs-ease-ui),
        background-color var(--hs-dur-fast) ease,
        color var(--hs-dur-fast) ease;
}

.theme_btn:hover,
.hs-hero__cta:hover,
.brouse_cat_btn:hover {
    transform: translate3d(0, -2px, 0);
}

/* Press. Every tappable thing on the page returns to its rest position on
   release; this is the whole of the tactile feedback and it has to be fast --
   180ms out, ~90ms back, so the button feels like it has a spring in it. */
.theme_btn:active,
.hs-hero__cta:active,
.brouse_cat_btn:active,
.hs-course:active .couse_wizged {
    transform: translate3d(0, 0, 0) scale(.975);
    transition-duration: 90ms;
}

/* The sweep. Clipped by the button's own overflow, travels from the reading-
   start edge to the far edge once per hover. */
.theme_btn {
    position: relative;
    overflow: hidden;
    isolation: isolate;
}

.theme_btn::after {
    content: "";
    position: absolute;
    inset-block: 0;
    inset-inline-start: -60%;
    inline-size: 45%;
    z-index: -1;
    pointer-events: none;
    background: linear-gradient(100deg,
        rgba(255, 255, 255, 0) 0%,
        rgba(255, 255, 255, .38) 50%,
        rgba(255, 255, 255, 0) 100%);
    transform: translate3d(0, 0, 0) skewX(-18deg);
    transition: transform .62s var(--hs-ease-ui);
}

/* 380% of the pseudo's own width carries it clear of the far edge. The sign
   is branched: in RTL the sweep must travel leftwards to move from the start
   edge toward the end edge. */
[dir="rtl"] .theme_btn:hover::after { transform: translate3d(-380%, 0, 0) skewX(-18deg); }
[dir="ltr"] .theme_btn:hover::after { transform: translate3d(380%, 0, 0) skewX(-18deg); }

/* The text link's underline grows from the reading-start edge. */
.line_link {
    position: relative;
}

.line_link::after {
    content: "";
    position: absolute;
    inset-inline: 0;
    inset-block-end: -3px;
    block-size: 2px;
    background: currentColor;
    transform: scaleX(0);
    transition: transform var(--hs-dur-ui) var(--hs-ease-ui);
}

[dir="rtl"] .line_link::after { transform-origin: right; }
[dir="ltr"] .line_link::after { transform-origin: left; }

.line_link:hover::after,
.line_link:focus-visible::after { transform: scaleX(1); }


/* ---------------------------------------------------------------------------
   Q10. MOTIFS
   Two textures, both generated in CSS, both effectively free.

   Q10a. Ruled paper behind the teacher band. The line spacing is 34px, which
   is close enough to a real Egyptian exercise book to be recognised and far
   enough from the body line-height that it never appears to underline live
   text. Alpha is 3.5%: it must be felt, not read.
   --------------------------------------------------------------------------- */

.hs-teacher {
    position: relative;
    isolation: isolate;
}

.hs-teacher::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: -1;
    pointer-events: none;
    background-image: repeating-linear-gradient(
        to bottom,
        transparent 0,
        transparent 33px,
        rgba(143, 63, 30, .035) 33px,
        rgba(143, 63, 30, .035) 34px);
}

/* The margin rule every exercise book has, on the reading-start edge. Held
   off the small screens, where there is no room for a margin. */
.hs-teacher::after {
    content: "";
    position: absolute;
    inset-block: 0;
    inset-inline-start: 46px;
    inline-size: 1px;
    z-index: -1;
    pointer-events: none;
    background: rgba(180, 83, 42, .12);
}

@media (max-width: 991.98px) {
    .hs-teacher::after { display: none; }
}

/* Q10b. The teacher's portrait gets a slow float and a ring that answers the
   hero orbit, so the two portraits of the site -- the abstract one in the
   hero and the literal one here -- read as the same idea. */
.hs-teacher__figure {
    position: relative;
}

.hs-motion .hs-teacher.hs-in .hs-teacher__photo {
    animation: hs-float 7s ease-in-out 1s infinite;
}

@keyframes hs-float {
    0%, 100% { transform: translate3d(0, 0, 0); }
    50%      { transform: translate3d(0, -9px, 0); }
}

.hs-teacher__badge {
    transition: transform var(--hs-dur-ui) var(--hs-ease-enter);
}

.hs-teacher__figure:hover .hs-teacher__badge {
    transform: scale(1.06) rotate(-3deg);
}


/* ---------------------------------------------------------------------------
   Q11. SMALL SCREENS
   Verified at a true 390px through an http-served iframe wrapper, not a
   narrow headless window -- chrome --window-size=390 clamps to ~500px, lays
   out wide, then crops the left 390px, which on an RTL page slices the start
   of every line and fakes a broken layout.
   --------------------------------------------------------------------------- */

@media (max-width: 767.98px) {
    /* Horizontal entrances are cut on phones. A 34px slide is a meaningful
       fraction of a 390px viewport, and on a narrow column it reads as the
       text being shoved rather than arriving. Vertical only down here. */
    .hs-motion [data-hs-reveal="start"],
    .hs-motion [data-hs-reveal="tilt"] {
        transform: translate3d(0, 22px, 0);
    }

    .hs-motion .banner_area.hs-hero .hs-eyebrow,
    .hs-motion .banner_area.hs-hero .banner_text > h3,
    .hs-motion .banner_area.hs-hero .banner_text > p,
    .hs-motion .banner_area.hs-hero .hs-hero__actions,
    .hs-motion .banner_area.hs-hero .theme_search_field {
        transform: translate3d(0, 18px, 0);
    }

    /* Three figures do not fit across 390px without the numerals dropping to
       an unreadable size. Two columns, third wraps and spans. */
    .hs-stats {
        grid-template-columns: repeat(2, minmax(0, 1fr));
        gap: 22px;
        margin-block-start: 32px;
        padding-block-start: 26px;
    }

    .hs-stat:last-child { grid-column: 1 / -1; }

    .hs-stat__num { font-size: 34px; }
    .hs-stat__suffix { font-size: 17px; }

    /* Hover lift is meaningless on a touch screen and, worse, sticks after a
       tap on iOS -- the card stays raised until the next tap elsewhere.

       The tile selector is written at .category_area weight to match the
       hover rule it is cancelling. At the shorter `.category_wiz:hover .thumb`
       it is (0,3,0) against that rule's (0,4,0) and loses -- the same
       specificity trap that made the whole tile block a no-op earlier. */
    .hs-course:hover .couse_wizged,
    .category_area .category_wiz:hover .thumb,
    .testmonial_area .single_testmonial:hover {
        transform: none;
    }

    .hs-course:hover .thumb_inner,
    .testmonial_area .single_testmonial:hover .testimonialImage {
        transform: none;
    }
}


/* ---------------------------------------------------------------------------
   Q12. REDUCED MOTION -- THE KILL SWITCH
   The second of the two independent switches. The script is the first: it
   never adds `.hs-motion` when the OS asks for reduced motion, so no start
   state is ever applied and nothing below is even reachable in the normal
   case.

   This block exists for the cases the script cannot cover: the perpetual
   animations that are NOT gated behind `.hs-motion` (the hero arc's spin, the
   core's breath, the portrait's float), every hover transform, and the
   possibility that the OS setting changes after the script has already run.

   Everything is reset to its final, resting state. Nothing is left invisible,
   nothing is left mid-transform, and no element depends on a transition
   having completed in order to be readable.
   --------------------------------------------------------------------------- */

@media (prefers-reduced-motion: reduce) {

    /* Blanket stop. Any transition or animation added by this section, on any
       element, in any state -- including ones added later by someone who does
       not read this comment. */
    .hs-motion [data-hs-reveal],
    .hs-motion [data-hs-reveal].hs-in,
    .hs-motion [data-hs-reveal="start"],
    .hs-motion [data-hs-reveal="rise"],
    .hs-motion [data-hs-reveal="pop"],
    .hs-motion [data-hs-reveal="tilt"] {
        opacity: 1 !important;
        transform: none !important;
        transition: none !important;
        animation: none !important;
    }

    /* Hero: every staged child visible, no stagger, no orbit expansion, no
       breath, no spin. */
    .banner_area.hs-hero .hs-eyebrow,
    .banner_area.hs-hero .banner_text > h3,
    .banner_area.hs-hero .banner_text > p,
    .banner_area.hs-hero .hs-hero__actions,
    .banner_area.hs-hero .theme_search_field,
    .hs-motion .banner_area.hs-hero .hs-eyebrow,
    .hs-motion .banner_area.hs-hero .banner_text > h3,
    .hs-motion .banner_area.hs-hero .banner_text > p,
    .hs-motion .banner_area.hs-hero .hs-hero__actions,
    .hs-motion .banner_area.hs-hero .theme_search_field {
        opacity: 1 !important;
        transform: none !important;
        transition: none !important;
        transition-delay: 0s !important;
    }

    .banner_area.hs-hero .hs-hero__ring,
    .banner_area.hs-hero .hs-hero__core,
    .banner_area.hs-hero .hs-hero__arc,
    .hs-motion .banner_area.hs-hero .hs-hero__ring,
    .hs-motion .banner_area.hs-hero .hs-hero__core,
    .hs-motion .banner_area.hs-hero .hs-hero__arc,
    .banner_area.hs-hero.hs-in .hs-hero__core {
        opacity: 1 !important;
        scale: 1 !important;
        transform: none !important;
        transition: none !important;
        animation: none !important;
        transition-delay: 0s !important;
    }

    /* Course cards, tiles, testimonials: colour-only feedback survives,
       every transform is dropped. A card that still lifts under the pointer
       is exactly the vestibular trigger this block exists to remove. */
    .hs-course .couse_wizged,
    .hs-course:hover .couse_wizged,
    .hs-course:focus-within .couse_wizged,
    .hs-course:active .couse_wizged,
    .hs-course .thumb_inner,
    .hs-course:hover .thumb_inner,
    .hs-course:focus-within .thumb_inner,
    .hs-course .thumb::after,
    .category_area .category_wiz .thumb,
    .category_area .category_wiz:hover .thumb,
    .category_area .category_wiz .thumb::before,
    .category_area .category_wiz:hover .thumb::before,
    .testmonial_area .single_testmonial,
    .testmonial_area .single_testmonial:hover,
    .testmonial_area .single_testmonial .testimonialImage,
    .testmonial_area .single_testmonial:hover .testimonialImage,
    .testmonial_area .single_testmonial .rate i,
    .testmonial_area .single_testmonial:hover .rate i {
        transform: none !important;
        transition: none !important;
        animation: none !important;
        transition-delay: 0s !important;
    }

    /* The subject spine is drawn at full height rather than a third: with no
       hover to complete it, a partial spine is just a shorter bar for no
       reason. */
    .hs-course .couse_wizged::before,
    .hs-course:hover .couse_wizged::before,
    .hs-course:focus-within .couse_wizged::before {
        transform: scaleY(1) !important;
        transition: none !important;
    }

    /* Buttons and links: no lift, no press, no sweep. The sweep pseudo is
       parked off-canvas rather than shown, because a static bright band
       across a button is worse than no sweep at all. */
    .theme_btn,
    .theme_btn:hover,
    .theme_btn:active,
    .hs-hero__cta,
    .hs-hero__cta:hover,
    .hs-hero__cta:active,
    .brouse_cat_btn,
    .brouse_cat_btn:hover,
    .brouse_cat_btn:active,
    .line_link,
    .blog_area .theme_according .card-header,
    .blog_area .theme_according .card:hover .card-header {
        transform: none !important;
        transition: none !important;
        animation: none !important;
    }

    .theme_btn::after,
    .theme_btn:hover::after {
        opacity: 0 !important;
        transition: none !important;
        transform: translate3d(0, 0, 0) !important;
    }

    /* Underline and stat rules: drawn, not animated. */
    .line_link::after,
    .line_link:hover::after,
    .hs-stat__rule,
    .hs-motion .hs-stats .hs-stat__rule,
    .hs-motion .hs-stats.hs-in .hs-stat__rule {
        transform: scaleX(1) !important;
        transition: none !important;
    }

    /* The accordion chevron still turns to show state -- state is information,
       not decoration -- but it turns instantly. */
    .blog_area .theme_according .card-header .btn-link::after {
        transition: none !important;
    }

    .hs-motion .blog_area .theme_according .collapse .card-body,
    .hs-motion .blog_area .theme_according .collapse.show .card-body {
        opacity: 1 !important;
        transform: none !important;
        transition: none !important;
    }

    /* The portrait sits still. */
    .hs-teacher__photo,
    .hs-motion .hs-teacher.hs-in .hs-teacher__photo,
    .hs-teacher__badge,
    .hs-teacher__figure:hover .hs-teacher__badge {
        transform: none !important;
        animation: none !important;
        transition: none !important;
    }
}


/* ═══════════════════════════════════════════════════════════════════════════
   R. THE APP SECTION
   ---------------------------------------------------------------------------
   partials/_app_download.blade.php is included from layouts/master.blade.php,
   so this section appears on EVERY page, not only the homepage. Everything
   below is scoped under `.app-dl` and cannot leak.

   WHY THE RULES LIVE HERE AND NOT IN THAT PARTIAL
   The partial carries its own inline <style>. That block sits in the BODY, so
   it comes after this file in document order and wins every specificity tie.
   Two consequences, both deliberate:
     - New classes (everything with no counterpart in the partial) are added
       here at the partial's own `.app-dl .app-dl__x` weight. There is no tie
       to lose, because the partial never names them.
     - The handful of EXISTING classes this section restyles are written at
       `.app-dl .app-dl__stage .app-dl__x` -- one level heavier -- so they win
       on specificity rather than on order. Anything written here at equal
       weight would silently lose to the inline block, which is the trap this
       comment exists to prevent.

   WHAT CHANGED, AND WHY
   The section used to offer exactly one thing: add-to-home-screen. That was
   honest when a PWA was all there was. There is now a real Android build, so
   the section serves two platforms, and the design problem is presenting them
   without lying about either:

     Android      a direct APK download. Rendered by the server as a plain
                  <a href download>, so it works with JavaScript off and can
                  never be a dead control. Absent entirely when the file is
                  not on disk -- a download button that 404s costs more trust
                  than no button.
     iOS/desktop  the existing PWA flow, untouched. Still feature-detected,
                  still never a button that does nothing.

   There are deliberately NO App Store or Google Play badges. There is no
   store listing behind either one, and a badge that leads nowhere reads as a
   broken product rather than a missing one.

   THE UNKNOWN-SOURCES WARNING
   The APK is self-signed, so Android shows an "unknown developer" dialog and
   asks for the install-unknown-apps permission. `.app-dl__warn` says so
   before the tap, at full body size on its own tinted panel. It is not fine
   print and it is not styled as an error: a parent who meets that dialog
   unprepared abandons the install AND stops trusting the site, while a parent
   who was told to expect it carries on. The measured colour is below.

   CONTRAST -- every figure below was COMPUTED against the composited ground,
   not read off the source hex. The translucent layers (the warn panel fill,
   the subject row ground) are the cases where reading the stylesheet gives
   the wrong answer, because neither element's effective background is a
   colour that appears anywhere in this file.

     On the panel ground #021930
       #f4f7fb ink ................................... 17.41:1  headings
       #b8c5d4 ink-2 ................................. 10.67:1  body, meta
       #D5B57B gold-bright ........................... 11.35:1  eyebrows

     The APK button. It is a GRADIENT, so the figure that matters is the
     darkest stop, not the mid stop -- a label only has to fail at one end.
       #021930 navy on #D5B57B (lightest stop) ....... 11.35:1
       #021930 navy on #C59848 (mid stop) ............. 8.57:1
       #021930 navy on #c79530 (darkest stop) ......... 6.92:1  <- worst case
       #ffffff white on #C59848 ....................... 2.18:1  <- REJECTED

     The unknown-sources note. Fill is rgba(217,168,62,.10) over the panel,
     which composites to #192226 -- a colour in no stylesheet anywhere.
       #ffd88a text + icon on #192226 ................ 11.90:1
       border rgba(217,168,62,.65) vs the #192226 fill  3.62:1

     CORRECTION, worth recording. That border started at rgba(...,.28), which
     composites to #403d2b and measures 1.48:1 against the fill it encloses --
     it FAILED the 3:1 non-text floor of SC 1.4.11. Every other border in this
     section is decorative and carries no information, but this one delimits
     the one paragraph in the section a parent must actually read, so it was
     raised to .65 rather than argued away.

     On the phone screen #032D58
       #f4f7fb row names ............................. 16.34:1
       #b8c5d4 secondary ............................. 10.01:1
       #D5B57B active tab ............................ 10.65:1
       #8b9bad inactive tab ........................... 6.18:1
       clay-light   #e8a583 ........................... 8.48:1
       blue-light   #7cc0f5 ........................... 8.96:1
       teal-light   #69ccc0 ........................... 9.19:1

     On the subject row, rgba(255,255,255,.04) over the screen = #112336
       #f4f7fb name .................................. 14.83:1
       clay-light  #e8a583 meta ....................... 7.70:1
       blue-light  #7cc0f5 meta ....................... 8.13:1
       teal-light  #69ccc0 meta ....................... 8.35:1

   The gold CTA carries NAVY text, never white: white on #C59848 is 2.18:1 and
   would fail in exactly the place a parent most needs to read.
   ═══════════════════════════════════════════════════════════════════════════ */


/* ---------------------------------------------------------------------------
   R1. TWO PLATFORMS, SIDE BY SIDE
   A two-column grid that collapses to one. Neither column is styled as the
   winner by default -- the server cannot know which phone is holding the
   page, and guessing wrong puts the wrong action first.
   --------------------------------------------------------------------------- */

.app-dl .app-dl__platforms {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 26px;
    margin-block-start: 28px;
}

/* One column only ever renders when the APK is missing; it should not then
   sit in half the width looking truncated. */
.app-dl .app-dl__platforms:has(> .app-dl__platform:only-child) {
    grid-template-columns: minmax(0, 1fr);
}

.app-dl .app-dl__platform {
    position: relative;
    min-inline-size: 0;
    padding-block-start: 20px;
    border-block-start: 1px solid rgba(217, 168, 62, .18);
    transition: opacity var(--hs-dur-ui, .32s) var(--hs-ease-ui, ease);
}

.app-dl .app-dl__platform-eyebrow {
    display: flex;
    align-items: center;
    gap: 8px;
    margin: 0 0 10px;
    font-size: 12px;
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: #D5B57B;                  /* 11.35:1 on the panel */
}

.app-dl .app-dl__platform-lead {
    margin: 0 0 16px;
    font-size: 14px;
    line-height: 1.75;
    color: #b8c5d4;                  /* 10.67:1 on the panel */
}

/* On Android the script promotes the APK column and mutes the other. This is
   a re-ranking, NOT a hiding -- an Android user may still prefer a home-screen
   shortcut to installing a file, and that choice has to stay readable.

   .72 was chosen by measuring rather than by eye. At that opacity the body
   colour #b8c5d4 composites to #8693a2 and still measures 5.98:1 against the
   panel, and the eyebrow composites to #ae9248 at 6.24:1 -- both clear AA on
   their own, so the muted column is de-emphasised without being degraded. */
.app-dl .app-dl__platform--muted { opacity: .72; }

.app-dl .app-dl__platform--primary {
    border-block-start-color: rgba(217, 168, 62, .5);
}


/* ---------------------------------------------------------------------------
   R2. THE APK BUTTON
   The one gold-filled control in the section. Gold on navy is 8.57:1, so the
   label is navy on gold -- the same direction the theme's own .theme_btn uses
   and the opposite of the 2.18:1 failure that white-on-gold would be.
   --------------------------------------------------------------------------- */

.app-dl .app-dl__apk {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
    inline-size: 100%;
    padding-block: 15px;
    padding-inline: 22px;
    border: 0;
    border-radius: 12px;
    background: linear-gradient(155deg, #D5B57B 0%, #C59848 62%, #c79530 100%);
    color: #021930;                  /* 8.57:1 on the gold */
    font-size: 16px;
    font-weight: 700;
    line-height: 1.2;
    text-decoration: none;
    box-shadow: 0 18px 40px -20px rgba(217, 168, 62, .55);
    /* Contains the sweep at R3 and clips it to the button's own radius. */
    position: relative;
    overflow: hidden;
    isolation: isolate;
    transition:
        transform var(--hs-dur-fast, .18s) var(--hs-ease-ui, ease),
        box-shadow var(--hs-dur-ui, .32s) var(--hs-ease-ui, ease);
}

.app-dl .app-dl__apk svg { stroke: currentColor; flex: none; }

.app-dl .app-dl__apk:hover,
.app-dl .app-dl__apk:focus-visible {
    color: #021930;
    transform: translate3d(0, -2px, 0);
    box-shadow: 0 24px 48px -20px rgba(217, 168, 62, .72);
}

.app-dl .app-dl__apk:active {
    transform: translate3d(0, 0, 0) scale(.985);
    transition-duration: 90ms;
}

/* R3. The same sweep the page's other primary buttons use (section Q9), so
   this button belongs to the system rather than looking imported. Transform
   on a pseudo-element, never a background-position animation. */
.app-dl .app-dl__apk::after {
    content: "";
    position: absolute;
    inset-block: 0;
    inset-inline-start: -60%;
    inline-size: 45%;
    z-index: -1;
    pointer-events: none;
    background: linear-gradient(100deg,
        rgba(255, 255, 255, 0) 0%,
        rgba(255, 255, 255, .55) 50%,
        rgba(255, 255, 255, 0) 100%);
    transform: translate3d(0, 0, 0) skewX(-18deg);
    transition: transform .62s var(--hs-ease-ui, ease);
}

[dir="rtl"] .app-dl .app-dl__apk:hover::after { transform: translate3d(-380%, 0, 0) skewX(-18deg); }
[dir="ltr"] .app-dl .app-dl__apk:hover::after { transform: translate3d(380%, 0, 0) skewX(-18deg); }

.app-dl .app-dl__apk-meta {
    margin: 10px 0 0;
    font-size: 13px;
    font-weight: 600;
    line-height: 1.6;
    color: #b8c5d4;                  /* 10.67:1 on the panel */
}


/* ---------------------------------------------------------------------------
   R4. THE UNKNOWN-SOURCES NOTE
   Deliberately NOT styled as an error. Red would tell a parent something is
   wrong with the file; nothing is wrong with the file, Android simply has not
   been paid to vouch for it. Gold-tinted panel, gold-tinted text, calm.

   The text colour is #ffd88a rather than the brand gold: measured on the
   composited ground (10% gold over #021930 = #192226) plain #C59848 gives
   7.41:1 and #ffd88a gives 11.90:1, and this is the one paragraph in the
   section that absolutely must be read rather than skimmed.

   The border is rgba(217,168,62,.65), NOT the .28 the neighbouring panels
   use. At .28 it composites to #403d2b and measures 1.48:1 against the fill
   it encloses, failing the 3:1 non-text floor of SC 1.4.11. Elsewhere in this
   section a faint border is decorative and that floor does not apply to it;
   here the border is what marks the warning off from the copy around it, so
   it has to carry its own weight.
   --------------------------------------------------------------------------- */

.app-dl .app-dl__warn {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    margin: 16px 0 0;
    padding: 14px 16px;
    border: 1px solid rgba(217, 168, 62, .65);   /* 3.62:1 against the fill */
    border-radius: 12px;
    background: rgba(217, 168, 62, .10);
    color: #ffd88a;                  /* 11.90:1 on the composited panel */
    font-size: 14px;                 /* body size: this is not fine print */
    font-weight: 500;
    line-height: 1.8;
}

.app-dl .app-dl__warn svg {
    flex: none;
    margin-block-start: 4px;
    stroke: currentColor;
}


/* ---------------------------------------------------------------------------
   R5. THE DEVICE
   Bigger, with a second phone edge behind it for depth, and a slow drift.
   Written one specificity level above the partial's own rules so it wins on
   weight rather than on order -- see the note at the head of section R.
   --------------------------------------------------------------------------- */

.app-dl .app-dl__stage .app-dl__phone {
    inline-size: 268px;
    block-size: 545px;
    box-shadow:
        0 40px 80px -30px rgba(0, 0, 0, .9),
        0 0 0 1px rgba(217, 168, 62, .28),
        0 0 60px -20px rgba(217, 168, 62, .3);
}

/* A ghosted second device behind the first. Pure CSS, no asset: it is the
   phone's own box repeated through a pseudo-element, offset and pushed back.
   This is what turns a flat mockup into a scene. */
.app-dl .app-dl__stage .app-dl__phone::before {
    content: "";
    position: absolute;
    inset: -10px;
    z-index: -1;
    border-radius: 46px;
    border: 1px solid rgba(217, 168, 62, .14);
    background: linear-gradient(160deg, rgba(16, 42, 67, .85), rgba(4, 19, 35, .4));
    transform: rotate(-6deg) translate3d(0, 10px, 0);
    transform-origin: center;
}

[dir="rtl"] .app-dl .app-dl__stage .app-dl__phone::before {
    transform: rotate(6deg) translate3d(0, 10px, 0);
}

/* The device breathes. 11s, translate only, and it starts after the section's
   own entrance has finished so the two never overlap. */
.app-dl--in .app-dl__stage .app-dl__phone {
    animation: hs-app-drift 11s ease-in-out 1.2s infinite;
}

@keyframes hs-app-drift {
    0%, 100% { transform: rotate(-3deg) translate3d(0, 0, 0); }
    50%      { transform: rotate(-3deg) translate3d(0, -12px, 0); }
}

/* rotate() does not mirror, so the RTL keyframes are their own pair rather
   than a sign flip on one value. */
[dir="rtl"] .app-dl--in .app-dl__stage .app-dl__phone {
    animation-name: hs-app-drift-rtl;
}

@keyframes hs-app-drift-rtl {
    0%, 100% { transform: rotate(3deg) translate3d(0, 0, 0); }
    50%      { transform: rotate(3deg) translate3d(0, -12px, 0); }
}


/* ---------------------------------------------------------------------------
   R6. WHAT IS ON THE SCREEN
   The app, not a home screen: a greeting, where the child stopped, their
   subjects, and a tab bar. The subject rows carry the same .hs-subj--*
   classes the course cards use, so the five subject hues are one system
   across the whole site rather than a palette repeated by hand.

   Everything in here is inside an aria-hidden stage -- it is a drawing, and
   no screen reader reaches it.
   --------------------------------------------------------------------------- */

.app-dl .app-dl__appbar {
    display: flex;
    align-items: center;
    gap: 9px;
    margin-block-end: 14px;
}

.app-dl .app-dl__avatar {
    flex: none;
    display: grid;
    place-items: center;
    inline-size: 32px;
    block-size: 32px;
    border-radius: 50%;
    background: linear-gradient(150deg, #D5B57B, #c79530);
    color: #021930;                  /* 8.57:1 on the gold */
    font-size: 15px;
    font-weight: 800;
    line-height: 1;
}

.app-dl .app-dl__appbar-text {
    display: flex;
    flex-direction: column;
    gap: 1px;
    min-inline-size: 0;
}

.app-dl .app-dl__appbar-hi {
    font-size: 10px;
    font-weight: 600;
    color: #b8c5d4;                  /* 10.01:1 on the screen */
}

.app-dl .app-dl__appbar-name {
    font-size: 12px;
    font-weight: 700;
    color: #f4f7fb;                  /* 16.34:1 on the screen */
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.app-dl .app-dl__mock-label {
    display: block;
    margin-block: 16px 8px;
    font-size: 10px;
    font-weight: 700;
    letter-spacing: .06em;
    color: #b8c5d4;
}

.app-dl .app-dl__subjects {
    display: flex;
    flex-direction: column;
    gap: 7px;
    margin: 0;
    padding: 0;
    list-style: none;
}

.app-dl .app-dl__subject {
    display: flex;
    align-items: center;
    gap: 9px;
    padding: 9px 10px;
    border-radius: 10px;
    /* The subject hue as a wash behind its own row. --hs-subject-lit is the
       light variant declared in section Q3; at 12% over the navy screen it
       tints without ever approaching the text behind it. */
    background: rgba(255, 255, 255, .04);
    border-inline-start: 2px solid var(--hs-subject-lit, #b8c5d4);
}

.app-dl .app-dl__subject-dot {
    flex: none;
    inline-size: 8px;
    block-size: 8px;
    border-radius: 50%;
    background: var(--hs-subject-lit, #b8c5d4);
}

.app-dl .app-dl__subject-body {
    display: flex;
    flex-direction: column;
    gap: 1px;
    min-inline-size: 0;
    flex: 1;
}

.app-dl .app-dl__subject-name {
    font-size: 11.5px;
    font-weight: 700;
    color: #f4f7fb;                  /* 16.34:1 on the screen */
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.app-dl .app-dl__subject-meta {
    font-size: 9.5px;
    font-weight: 600;
    color: var(--hs-subject-lit, #b8c5d4);   /* 7.70:1 worst case, on the row ground */
}

/* A chevron built from two borders, pointing along the reading direction --
   left in RTL, right in LTR -- so it reads as "onward" rather than pointing
   back at the text it follows.

   CORRECTION, caught in the render. The first version used
   `border-block-start + border-inline-start`. In RTL inline-start resolves to
   the RIGHT edge, so the two borders formed the top-right corner and the
   rotation produced a chevron pointing UP. The pair that works is block-start
   + inline-END in both directions -- because inline-end already mirrors, only
   the rotation sign has to be branched. */
.app-dl .app-dl__subject-go {
    flex: none;
    inline-size: 6px;
    block-size: 6px;
    border-block-start: 1.5px solid #b8c5d4;
    border-inline-end: 1.5px solid #b8c5d4;
    transform: rotate(-45deg);
    opacity: .7;
}

[dir="ltr"] .app-dl .app-dl__subject-go { transform: rotate(45deg); }

/* Tab bar, pinned to the base of the screen. margin-block-start:auto rather
   than absolute positioning, so it cannot overlap the list on a short screen. */
.app-dl .app-dl__nav {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 2px;
    margin-block-start: auto;
    padding-block-start: 10px;
    border-block-start: 1px solid rgba(255, 255, 255, .08);
}

.app-dl .app-dl__nav-item {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 3px;
    font-size: 8px;
    font-weight: 600;
    color: #8b9bad;
    min-inline-size: 0;
}

.app-dl .app-dl__nav-item svg { stroke: currentColor; }

/* The active tab is marked by COLOUR AND WEIGHT, not colour alone. */
.app-dl .app-dl__nav-item--on {
    color: #D5B57B;                  /* 10.65:1 on the screen */
    font-weight: 800;
}


/* ---------------------------------------------------------------------------
   R7. ENTRANCE
   The section already had an opt-in entrance (.app-dl--anim / .app-dl--in,
   added by its own script). This layers the page's motion language on top:
   the copy arrives from the reading-start edge, the device from below, and
   the two platform columns stagger.

   All of it hangs off .app-dl--in, which only ever exists when that script
   ran. No class, no start state, nothing hidden -- the same opt-in contract
   as the rest of the page.
   --------------------------------------------------------------------------- */

.app-dl--anim .app-dl__copy > * {
    opacity: 0;
    transform: translate3d(var(--hs-enter-x, 34px), 0, 0);
    transition:
        opacity .6s ease-out,
        transform .6s var(--hs-ease-enter, ease-out);
}

.app-dl--anim.app-dl--in .app-dl__copy > * {
    opacity: 1;
    transform: none;
}

.app-dl--anim .app-dl__copy > *:nth-child(1) { transition-delay: .06s; }
.app-dl--anim .app-dl__copy > *:nth-child(2) { transition-delay: .13s; }
.app-dl--anim .app-dl__copy > *:nth-child(3) { transition-delay: .20s; }
.app-dl--anim .app-dl__copy > *:nth-child(4) { transition-delay: .27s; }
.app-dl--anim .app-dl__copy > *:nth-child(5) { transition-delay: .34s; }
.app-dl--anim .app-dl__copy > *:nth-child(6) { transition-delay: .41s; }

.app-dl--anim .app-dl__stage {
    opacity: 0;
    transform: translate3d(0, 34px, 0);
    transition:
        opacity .8s ease-out .18s,
        transform .8s var(--hs-ease-enter, ease-out) .18s;
}

.app-dl--anim.app-dl--in .app-dl__stage {
    opacity: 1;
    transform: none;
}


/* ---------------------------------------------------------------------------
   R8. SMALL SCREENS
   Verified at a true 390px through the iframe wrapper.
   --------------------------------------------------------------------------- */

@media (max-width: 767.98px) {
    /* Two platform columns do not fit; and once stacked, the Android block
       must come first on the platform it is for. */
    .app-dl .app-dl__platforms {
        grid-template-columns: minmax(0, 1fr);
        gap: 22px;
    }

    /* Horizontal entrance is cut on phones for the same reason as section
       Q11: 34px is a large fraction of a 390px column and reads as a shove. */
    .app-dl--anim .app-dl__copy > * {
        transform: translate3d(0, 18px, 0);
    }

    .app-dl .app-dl__stage .app-dl__phone {
        inline-size: 228px;
        block-size: 466px;
    }

    /* The ghost device is dropped rather than scaled: at this width it reads
       as a rendering fault rather than as depth. */
    .app-dl .app-dl__stage .app-dl__phone::before { display: none; }

    .app-dl .app-dl__apk { font-size: 15px; }
    .app-dl .app-dl__warn { font-size: 13.5px; padding: 12px 13px; }
}


/* ---------------------------------------------------------------------------
   R9. REDUCED MOTION
   The section's own script has no reduced-motion branch -- it adds
   .app-dl--anim unconditionally -- so unlike the rest of the page this block
   is the ONLY switch. It therefore has to be exhaustive, and every start
   state must be reset to visible rather than merely un-transitioned.
   --------------------------------------------------------------------------- */

@media (prefers-reduced-motion: reduce) {

    .app-dl,
    .app-dl--anim,
    .app-dl--anim.app-dl--in {
        opacity: 1 !important;
        transform: none !important;
        transition: none !important;
    }

    /* Copy and stage: visible, in place, no stagger. */
    .app-dl--anim .app-dl__copy > *,
    .app-dl--anim.app-dl--in .app-dl__copy > *,
    .app-dl--anim .app-dl__stage,
    .app-dl--anim.app-dl--in .app-dl__stage {
        opacity: 1 !important;
        transform: none !important;
        transition: none !important;
        transition-delay: 0s !important;
    }

    /* The device stops drifting. */
    .app-dl .app-dl__stage .app-dl__phone,
    .app-dl--in .app-dl__stage .app-dl__phone,
    [dir="rtl"] .app-dl--in .app-dl__stage .app-dl__phone {
        animation: none !important;
        transition: none !important;
    }

    /* Buttons: no lift, no press, no sweep. The sweep pseudo is parked rather
       than shown -- a static bright band across a gold button is worse than
       no sweep at all. */
    .app-dl .app-dl__apk,
    .app-dl .app-dl__apk:hover,
    .app-dl .app-dl__apk:focus-visible,
    .app-dl .app-dl__apk:active,
    .app-dl .app-dl__platform {
        transform: none !important;
        transition: none !important;
        animation: none !important;
    }

    .app-dl .app-dl__apk::after,
    .app-dl .app-dl__apk:hover::after {
        opacity: 0 !important;
        transform: translate3d(0, 0, 0) !important;
        transition: none !important;
    }
}

/* ---------------------------------------------------------------------------
   R10. TWO THINGS THE RENDER EXPOSED
   Neither was visible in the source; both were found by looking at the page.
   --------------------------------------------------------------------------- */

/* R10a. `.app-dl__ios-lead` carries the iOS instruction AND the
   "your browser cannot install this" message -- and it had no CSS rule
   anywhere. It was inheriting whatever the cascade happened to give it and
   rendering as dim grey on navy. Two of the three states this section can be
   in are announced through this class, so it cannot be the least legible text
   on the panel. #b8c5d4 measures 10.67:1 on #021930. */
.app-dl .app-dl__ios-lead {
    margin: 14px 0 0;
    font-size: 14px;
    font-weight: 500;
    line-height: 1.75;
    color: #b8c5d4;
}

/* R10b. The dismiss control, now below both platform columns rather than
   inside one of them. Held at lower visual weight than either real action:
   it is an exit, not an option. The rule above it separates it from the
   choice it is not part of. */
.app-dl .app-dl__dismiss {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 16px;
    margin-block-start: 28px;
    padding-block-start: 20px;
    border-block-start: 1px solid rgba(184, 197, 212, .14);
}

.app-dl .app-dl__dismiss .app-dl__note {
    margin: 0;
    min-inline-size: 0;
    flex: 1;
}

@media (max-width: 767.98px) {
    .app-dl .app-dl__dismiss { gap: 12px; }
    /* The partial widens .app-dl__ghost to 100% below 768px, which here would
       stretch the exit into the widest control on the panel -- heavier than
       the download it sits under. It stays intrinsic. */
    .app-dl .app-dl__dismiss .app-dl__ghost { inline-size: auto; }
}


/* ═══════════════════════════════════════════════════════════════════════════
   S. THE APP SECTION, REBUILT
   ═══════════════════════════════════════════════════════════════════════════

   WHAT WAS WRONG (measured, not guessed)

   The old `.app-dl` was the only thing on this site that looked like an
   advertisement, and it looked like one for structural reasons rather than
   stylistic ones:

     1. It was a floating rounded PANEL on a transparent ground. Every other
        section on this page is a full-bleed BAND with its own background
        (hero navy, category light, teacher cream, courses tint, testimonials
        navy, contact cream). A dark card dropped onto the page with air all
        around it is the exact visual grammar of an injected ad unit.
     2. It never joined the design system. No `.hs-head`, no `.hs-sec__num`,
        no `.hs-eyebrow` -- it carried a private `.app-dl__eyebrow` and a
        private title instead of the vocabulary sections 01-04 share.
     3. It offered TWO equally weighted gold CTAs side by side, so the visitor
        had to diagnose their own platform before the page would help them.
        One primary action per section is the rule; this had two.
     4. The self-signing disclosure was a gold-bordered box with a warning
        glyph, i.e. it was styled as an ERROR. Honest copy delivered in alarm
        clothing reads as "this download is dangerous" and suppresses the very
        install it is trying to enable.
     5. It rendered site-wide from layouts/master.blade.php. On /courses it
        was 911px of a 3290px page -- 28% of that page was an app pitch.
     6. Being site-wide, it could not use the page's reveal contract, because
        `html.hs-motion` is only added by the homepage banner script. So it
        shipped a SECOND bespoke motion system (`.app-dl--anim`/`.app-dl--in`)
        that duplicated what Q1 already does.

   WHAT THIS IS

   A full-bleed light band that closes the page, using the same primitives as
   every other section, carrying exactly ONE primary action, and reusing the
   Q0/Q1 reveal contract instead of inventing another one.

   WHY LIGHT, WHEN THE OLD ONE WAS DARK
   The band sits between the cream contact band and the dark navy footer. A
   dark band there merges into the footer and loses its edges. Light also
   fixes the old composition's real failure: the navy phone was drawn on a
   near-black panel, so the product itself had almost no separation from its
   own background. On a light ground the same navy device reads as a crisp,
   physical object -- the strongest thing in the section, which is what it
   should be.

   COLOUR (composited against the real backdrop, then measured)
     navy      #032D58 on band #f5f8fc ............... 16.48:1  heading
     body      #4a5a6b on band #f5f8fc ................ 6.65:1  lead, meta
     gold-deep #72582A on band #f5f8fc ................ 5.04:1  marked phrase
     gold-deep #72582A on gold-10% over band .......... 4.71:1  eyebrow pill
     navy-deep #021930 ON gold #C59848 ................ 8.57:1  primary CTA
     navy-deep #021930 ON gold-bright #D5B57B ........ 11.35:1  CTA hover
     body      #4a5a6b on navy-4% over band ........... 6.13:1  reassurance
     navy      #032D58 on navy-4% over band .......... 15.20:1  reassurance lead
     ink       #f4f7fb on phone #032D58 .............. 16.34:1  phone text
     ink-2     #b8c5d4 on phone #032D58 .............. 10.01:1  phone meta
     gold      #C59848 on phone #032D58 ............... 8.04:1  phone accent

   Brand gold is 2.05:1 on this band. It therefore never appears here as text,
   as a border carrying meaning, or as an icon. It appears ONLY as a CTA fill
   under navy text, and on the navy phone. That is the same rule the rest of
   the file follows.

   MOTION
   No new contract. Start states live behind `html.hs-motion` exactly as Q1
   defines, elements opt in through `data-hs-reveal`, entrance direction comes
   from `--hs-enter-x`, and the stagger index comes from `--hs-i`. If the
   homepage script never runs -- or the visitor asked for reduced motion, or
   this is /get-the-app where there is no banner script at all -- no class is
   added, no start state applies, and the section renders complete. The
   reduced-motion block at S9 is the second, independent switch.
   ═══════════════════════════════════════════════════════════════════════════ */


/* ---------------------------------------------------------------------------
   S1. THE BAND
   --------------------------------------------------------------------------- */

.hs-app,
.hs-app *,
.hs-app *::before,
.hs-app *::after { box-sizing: border-box; }

.hs-app {
    position: relative;
    /* overflow-x only: the ring is the one thing that can reach past the edge
       and it does so horizontally. Constraining a single axis avoids creating
       a scroll container on both. */
    overflow-x: clip;
    padding-block: clamp(54px, 6.5vw, 88px);
    background:
        radial-gradient(120% 78% at 82% 0%, #ffffff 0%, rgba(255, 255, 255, 0) 58%),
        linear-gradient(180deg, #f8fbfd 0%, var(--hx-tint) 52%, #ecf2f8 100%);
    border-block-start: 1px solid rgba(7, 26, 46, .07);
}

/* Higher specificity than .hs-app so `hidden` always wins -- the script sets
   it when the site is already running as an installed app. */
.hs-app[hidden] { display: none; }

.hs-app__wrap {
    inline-size: 100%;
    max-inline-size: 1170px;
    margin-inline: auto;
    padding-inline: clamp(16px, 4vw, 30px);
}

.hs-app__grid {
    display: grid;
    grid-template-columns: minmax(0, 1.04fr) minmax(0, .96fr);
    align-items: center;
    gap: clamp(30px, 4.6vw, 62px);
}


/* ---------------------------------------------------------------------------
   S2. COPY COLUMN
   Uses the page's own head vocabulary: ghosted numeral, eyebrow pill, marked
   phrase. This is section 05 of the homepage and now says so.
   --------------------------------------------------------------------------- */

.hs-app__copy {
    position: relative;
    min-inline-size: 0;
}

/* Content rides above the ghosted numeral, matching section C. */
.hs-app__copy > * { position: relative; z-index: 1; }

/* The shared .hs-sec__num is sized for a full-width section head, where it
   ghosts behind a large heading. Dropped into this narrower two-column copy
   block at its default size it cleared the eyebrow entirely and read as a
   stray "05" floating in the margin -- decoration nobody asked for. Smaller,
   fainter, and pulled down so it actually sits behind the heading it belongs
   to. On this band the top of the gradient is near-white, so .06 alpha reads
   heavier here than it does on the cream sections; .045 matches their weight. */
.hs-app__copy > .hs-sec__num {
    z-index: 0;
    inset-block-start: .12em;
    font-size: clamp(58px, 5.6vw, 92px);
    color: rgba(4, 19, 35, .045);
}

.hs-app__title {
    margin: 0 0 14px;
    color: var(--hx-navy);                    /* 16.48:1 */
    font-family: inherit;
    font-size: clamp(26px, 3.1vw, 40px);
    font-weight: 800;
    line-height: 1.45;                        /* Arabic needs the leading */
    letter-spacing: 0;
}

/* Light-ground twin of .hs-mark. The A2 original paints gold-bright TEXT,
   which is a dark-ground colour: on this band it would be 1.9:1. Here the
   text is gold-deep (5.04:1) and only the underline stays brand gold, where
   it is decoration rather than a carrier of meaning. */
.hs-app__mark {
    color: var(--hx-gold-deep);
    background-image: linear-gradient(180deg,
        rgba(217, 168, 62, 0) 86%,
        rgba(217, 168, 62, .55) 86%,
        rgba(217, 168, 62, .55) 94%,
        rgba(217, 168, 62, 0) 94%);
    background-repeat: no-repeat;
    background-size: 100% 100%;
    padding-inline: 2px;
}

.hs-app__lead {
    margin: 0 0 22px;
    max-inline-size: 46ch;
    color: var(--hx-body);                    /* 6.65:1 */
    font-size: 16.5px;
    line-height: 1.95;
}

/* Three short proofs, inline rather than the old stacked 36px-icon list --
   that list was three rows tall and pushed the only real action below it. */
.hs-app__points {
    list-style: none;
    display: flex;
    flex-wrap: wrap;
    gap: 9px 10px;
    margin: 0 0 26px;
    padding-inline-start: 0;
}

.hs-app__point {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    margin: 0;
    padding-block: 8px;
    padding-inline: 13px;
    border-radius: 999px;
    border: 1px solid rgba(7, 26, 46, .10);
    background: rgba(255, 255, 255, .72);
    color: var(--hx-navy);
    font-size: 13.5px;
    font-weight: 600;
    line-height: 1.5;
}

.hs-app__point svg {
    flex: 0 0 auto;
    color: var(--hx-clay-deep);               /* 6.80:1 on the band */
}


/* ---------------------------------------------------------------------------
   S3. THE ONE ACTION
   The APK is a real file rendered by the server, so it works with scripting
   switched off entirely and cannot become a dead control. It is the section's
   single primary CTA; everything else here is deliberately quieter.
   --------------------------------------------------------------------------- */

.hs-app__action {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 14px 16px;
}

.hs-app__cta {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
    min-block-size: 54px;                     /* > 44px touch target */
    padding-block: 13px;
    padding-inline: 30px;
    border: 0;
    border-radius: 14px;
    background: var(--hx-gold);
    color: var(--hx-navy-deep);               /* navy ON gold = 8.57:1 */
    font-family: inherit;
    font-size: 16.5px;
    font-weight: 700;
    line-height: 1.4;
    text-decoration: none;
    cursor: pointer;
    box-shadow: var(--hx-e-gold);
    transition:
        background-color var(--hs-dur-fast) var(--hs-ease-ui),
        transform var(--hs-dur-fast) var(--hs-ease-ui);
}

.hs-app__cta:hover,
.hs-app__cta:focus-visible {
    background: var(--hx-gold-bright);         /* navy on bright = 11.35:1 */
    color: var(--hx-navy-deep);
    transform: translateY(-2px);
}

.hs-app__cta:active { transform: translateY(0); }

.hs-app__meta {
    margin: 0;
    color: var(--hx-body);                    /* 6.65:1 */
    font-size: 13.5px;
    font-weight: 600;
    line-height: 1.7;
}


/* ---------------------------------------------------------------------------
   S4. THE SELF-SIGNING NOTE
   This is the block the old design got most wrong. The APK is self-signed, so
   Android really will say "unknown developer" -- a parent must be told before
   they tap, or they meet a security warning mid-install on their child's
   phone and abandon it.

   But the old version said it inside a gold-bordered box with a warning
   glyph, which is error styling. The information is routine, so it is
   presented as routine: a neutral tinted footnote, no gold, no red, no alarm
   iconography, at 14.5px -- small enough to be secondary, large enough to
   actually be read, and it now sits directly under the button it explains
   rather than below a second competing CTA.
   --------------------------------------------------------------------------- */

.hs-app__note {
    display: flex;
    align-items: flex-start;
    gap: 11px;
    margin-block: 18px 0;
    padding-block: 14px;
    padding-inline: 16px;
    border-radius: 12px;
    border: 1px solid rgba(7, 26, 46, .08);
    background: rgba(7, 26, 46, .04);
    color: var(--hx-body);                    /* 6.13:1 on the composited tint */
    font-size: 14.5px;
    line-height: 1.85;
    max-inline-size: 52ch;
}

.hs-app__note svg {
    flex: 0 0 auto;
    margin-block-start: 4px;
    color: var(--hx-navy);
    opacity: .55;
}

.hs-app__note b {
    color: var(--hx-navy);                    /* 15.20:1 */
    font-weight: 700;
}


/* ---------------------------------------------------------------------------
   S5. OTHER PLATFORMS -- PROGRESSIVE DISCLOSURE
   The old layout put iPhone and Android side by side as equals, which asked
   every visitor to classify themselves before the page would help. Android is
   the only platform the APK serves, so it gets the primary slot; everyone
   else gets a clearly labelled disclosure.

   It is a real <details>, so unlike the old markup -- where the iOS steps sat
   behind `hidden` and needed JavaScript to ever become visible -- the iOS
   path works with scripting switched off. The script only OPENS it on iOS.
   --------------------------------------------------------------------------- */

.hs-app__alt {
    margin-block-start: 22px;
    padding-block-start: 20px;
    border-block-start: 1px solid rgba(7, 26, 46, .10);
}

.hs-app__alt-sum {
    display: inline-flex;
    align-items: center;
    gap: 9px;
    min-block-size: 44px;                     /* touch target */
    color: var(--hx-navy);
    font-size: 15px;
    font-weight: 700;
    line-height: 1.6;
    cursor: pointer;
    list-style: none;
}

/* Both spellings: WebKit needs the pseudo-element, the rest honour ::marker. */
.hs-app__alt-sum::-webkit-details-marker { display: none; }
.hs-app__alt-sum::marker { content: ""; }

.hs-app__chev {
    flex: 0 0 auto;
    color: var(--hx-body);
    transition: transform var(--hs-dur-ui) var(--hs-ease-ui);
}

/* Rotation only -- no height animation, so opening cannot trigger layout
   thrash on a page this size. */
.hs-app__alt[open] .hs-app__chev { transform: rotate(180deg); }

.hs-app__alt-body {
    padding-block-start: 16px;
    max-inline-size: 52ch;
}

.hs-app__alt-lead {
    margin: 0 0 14px;
    color: var(--hx-body);
    font-size: 14.5px;
    line-height: 1.85;
}

.hs-app__steps {
    list-style: none;
    counter-reset: hs-step;
    margin: 0 0 16px;
    padding-inline-start: 0;
    display: grid;
    gap: 10px;
}

.hs-app__step {
    counter-increment: hs-step;
    display: flex;
    align-items: center;
    gap: 11px;
    margin: 0;
    color: var(--hx-navy);
    font-size: 14.5px;
    font-weight: 600;
    line-height: 1.7;
}

.hs-app__step::before {
    content: counter(hs-step);
    flex: 0 0 auto;
    display: grid;
    place-items: center;
    inline-size: 26px;
    block-size: 26px;
    border-radius: 50%;
    background: var(--hx-navy);
    color: var(--hx-ink);                     /* 16.34:1 */
    font-size: 12.5px;
    font-weight: 700;
}

/* Secondary action: the browser-install button. White-on-light with a navy
   label, so it can never compete with the gold primary above it. */
.hs-app__ghost {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 9px;
    min-block-size: 48px;
    padding-block: 12px;
    padding-inline: 22px;
    border: 1px solid rgba(7, 26, 46, .20);
    border-radius: 12px;
    background: #ffffff;
    color: var(--hx-navy);                    /* 17.55:1 on white */
    font-family: inherit;
    font-size: 15px;
    font-weight: 700;
    line-height: 1.4;
    cursor: pointer;
    transition:
        border-color var(--hs-dur-fast) var(--hs-ease-ui),
        transform var(--hs-dur-fast) var(--hs-ease-ui);
}

.hs-app__ghost:hover {
    border-color: rgba(7, 26, 46, .42);
    transform: translateY(-1px);
}

.hs-app__unsupported {
    margin: 0;
    color: var(--hx-body);
    font-size: 14px;
    line-height: 1.8;
}

.hs-app__cta:focus-visible,
.hs-app__ghost:focus-visible,
.hs-app__alt-sum:focus-visible {
    outline: 3px solid var(--hx-navy);
    outline-offset: 3px;
}

/* iOS. The APK is meaningless on an iPhone, so when the script identifies one
   the disclosure is opened and the download is demoted to a quiet line --
   demoted, never removed: the visitor may well be fetching the file for a
   different device. */
.hs-app--ios .hs-app__cta {
    background: #ffffff;
    color: var(--hx-navy);
    border: 1px solid rgba(7, 26, 46, .20);
    box-shadow: none;
    font-size: 15px;
    min-block-size: 48px;
}

.hs-app--ios .hs-app__cta:hover {
    background: #ffffff;
    border-color: rgba(7, 26, 46, .42);
}

.hs-app--ios .hs-app__note { display: none; }
.hs-app--ios .hs-app__alt  { border-block-start: 0; padding-block-start: 6px; }


/* ---------------------------------------------------------------------------
   S6. THE DEVICE
   Same hand-built phone as before -- no image, no CDN -- but re-lit for a
   light ground. The old stage drew a gold glow and two gold rings behind a
   navy phone on a near-black panel, so the device had barely any separation
   from its own background.

   Here the phone keeps its navy body and gains a real elevation shadow, so it
   reads as an object sitting on the band. One ring survives, in navy at low
   alpha rather than gold: section B's hero orbit was written to "rhyme with
   the app panel further down the page", and deleting every ring would break
   that echo. Gold could not stay -- it is 2.05:1 here.
   --------------------------------------------------------------------------- */

.hs-app__stage {
    position: relative;
    display: grid;
    place-items: center;
    min-block-size: 470px;
}

.hs-app__ring {
    position: absolute;
    inset: 0;
    margin: auto;                             /* centres without naming a side */
    inline-size: 404px;
    block-size: 404px;
    border-radius: 50%;
    border: 1px solid rgba(7, 26, 46, .09);
    background: radial-gradient(circle,
        rgba(23, 105, 194, .07) 0%,
        rgba(23, 105, 194, .03) 46%,
        rgba(23, 105, 194, 0) 70%);
    pointer-events: none;
}

.hs-app__phone {
    position: relative;
    inline-size: 244px;
    block-size: 496px;
    border-radius: 38px;
    border: 10px solid #0d2136;
    background: var(--hx-navy);
    box-shadow:
        0 44px 80px -34px rgba(4, 19, 35, .58),
        0 12px 26px -14px rgba(4, 19, 35, .34),
        0 0 0 1px rgba(4, 19, 35, .10);
    transform: rotate(-3deg);
}

/* rotate() is physical, so mirror it for RTL like the original did. */
[dir="rtl"] .hs-app__phone { transform: rotate(3deg); }

.hs-app__notch {
    position: absolute;
    inset-block-start: 7px;
    inset-inline: 0;
    margin-inline: auto;
    inline-size: 78px;
    block-size: 18px;
    border-radius: 999px;
    background: #0d2136;
    z-index: 2;
}

.hs-app__screen {
    position: relative;
    display: flex;
    flex-direction: column;
    inline-size: 100%;
    block-size: 100%;
    overflow: hidden;
    border-radius: 28px;
    padding-block: 12px 16px;
    padding-inline: 14px;
    background:
        radial-gradient(90% 55% at 50% 0%, rgba(217, 168, 62, .10) 0%, rgba(217, 168, 62, 0) 70%),
        var(--hx-navy);
}

.hs-app__status {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    margin-block-end: 20px;
    color: var(--hx-ink-2);                   /* 10.01:1 */
}

.hs-app__clock { font-size: 12px; font-weight: 700; }
.hs-app__meters { display: inline-flex; align-items: center; }

.hs-app__appbar {
    display: flex;
    align-items: center;
    gap: 9px;
    margin-block-end: 16px;
}

.hs-app__avatar {
    flex: 0 0 auto;
    display: grid;
    place-items: center;
    inline-size: 30px;
    block-size: 30px;
    border-radius: 50%;
    background: linear-gradient(155deg, var(--hx-gold-bright), var(--hx-gold));
    color: var(--hx-navy-deep);               /* 8.57:1 */
    font-size: 13px;
    font-weight: 800;
}

.hs-app__appbar-text { display: grid; min-inline-size: 0; }
.hs-app__appbar-hi   { color: var(--hx-ink-2); font-size: 9.5px; line-height: 1.5; }
.hs-app__appbar-name { color: var(--hx-ink); font-size: 12px; font-weight: 700; line-height: 1.4; }

.hs-app__widget {
    border-radius: 16px;
    border: 1px solid rgba(244, 247, 251, .08);
    background: rgba(244, 247, 251, .055);
    padding-block: 11px;
    padding-inline: 12px;
    margin-block-end: 18px;
}

.hs-app__widget-top {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    margin-block-end: 4px;
}

.hs-app__widget-label { color: var(--hx-ink-2); font-size: 10px; }
.hs-app__widget-pct   { color: var(--hx-gold); font-size: 10px; font-weight: 700; }

.hs-app__widget-title {
    display: block;
    color: var(--hx-ink);
    font-size: 12px;
    font-weight: 700;
    margin-block-end: 9px;
}

.hs-app__bar {
    display: block;
    block-size: 5px;
    border-radius: 999px;
    background: rgba(244, 247, 251, .12);
    overflow: hidden;
}

/* A plain % width fills from the inline-start edge, so it mirrors under RTL. */
.hs-app__bar-fill {
    display: block;
    inline-size: 64%;
    block-size: 100%;
    border-radius: 999px;
    background: linear-gradient(90deg, var(--hx-gold), var(--hx-gold-bright));
}

.hs-app__mock-label {
    display: block;
    color: var(--hx-ink-2);
    font-size: 10px;
    font-weight: 600;
    margin-block-end: 9px;
}

.hs-app__subjects {
    list-style: none;
    margin: 0;
    padding-inline-start: 0;
    display: grid;
    gap: 8px;
}

/* Reuses the hs-subj--* tokens from section Q, so the five subject hues in
   here are the same five the real course cards use. On this navy screen they
   render through --hs-subject-lit, measured 8.73:1 to 9.80:1. */
.hs-app__subject {
    display: flex;
    align-items: center;
    gap: 9px;
    padding-block: 8px;
    padding-inline: 10px;
    border-radius: 12px;
    border: 1px solid rgba(244, 247, 251, .07);
    background: rgba(244, 247, 251, .05);
}

.hs-app__subject-dot {
    flex: 0 0 auto;
    inline-size: 6px;
    block-size: 22px;
    border-radius: 999px;
    background: var(--hs-subject-lit, var(--hx-ink-2));
}

.hs-app__subject-body { display: grid; min-inline-size: 0; }
.hs-app__subject-name { color: var(--hx-ink); font-size: 11.5px; font-weight: 700; line-height: 1.45; }
.hs-app__subject-meta { color: var(--hx-ink-2); font-size: 9.5px; line-height: 1.5; }

.hs-app__nav {
    display: flex;
    justify-content: space-between;
    gap: 4px;
    margin-block-start: auto;
    padding-block-start: 12px;
    border-block-start: 1px solid rgba(244, 247, 251, .08);
}

.hs-app__nav-item {
    display: grid;
    justify-items: center;
    gap: 3px;
    color: var(--hx-ink-2);
    font-size: 8.5px;
    line-height: 1.4;
}

.hs-app__nav-item--on { color: var(--hx-gold); }   /* 8.04:1 */


/* ---------------------------------------------------------------------------
   S7. REVEAL
   Opts into the Q1 contract. No start state is written here: Q1 owns those,
   behind `html.hs-motion`. All this does is set the stagger index.
   --------------------------------------------------------------------------- */

.hs-app .hs-app__copy   { --hs-i: 0; }
.hs-app .hs-app__stage  { --hs-i: 1; }


/* ---------------------------------------------------------------------------
   S8. RESPONSIVE
   --------------------------------------------------------------------------- */

@media (max-width: 991.98px) {
    .hs-app__grid { grid-template-columns: minmax(0, 1fr); gap: 34px; }

    /* The device leads on narrow screens. In the old layout the phone was the
       LAST thing in the section, so on a phone it appeared below the dismiss
       button -- decoration trailing after the exit control. Here it introduces
       the section and the copy and the action follow it. */
    .hs-app__stage { order: -1; min-block-size: 0; }
    .hs-app__lead  { max-inline-size: none; }
    .hs-app__ring  { inline-size: 320px; block-size: 320px; }
    .hs-app__phone { inline-size: 216px; block-size: 448px; border-width: 9px; border-radius: 34px; }
    .hs-app__screen { border-radius: 25px; }

    /* The numeral is anchored to the copy block, and the copy block now comes
       AFTER the device in the visual order -- so at these widths the figure
       landed on top of the phone. It is decoration; it goes. */
    .hs-app__copy > .hs-sec__num { display: none; }

    /* ── Phone internals, compacted ──────────────────────────────────────
       The screen is a fixed-height box with overflow:hidden, so when the
       phone shrinks at these widths the UI inside does not shrink with it --
       it simply gets cut. Measured at 390px the content ran 462px inside a
       390px screen, which clipped the whole bottom nav and sliced the last
       subject row in half: the mockup looked like a rendering fault rather
       than a phone. These are the same values as desktop, tightened just
       enough that the nav bar lands inside the device again. */
    .hs-app__screen  { padding-block: 10px 12px; }
    .hs-app__status  { margin-block-end: 12px; }
    .hs-app__appbar  { margin-block-end: 10px; }
    .hs-app__widget  { margin-block-end: 12px; padding-block: 9px; }
    .hs-app__mock-label { margin-block-end: 6px; }
    .hs-app__subjects { gap: 6px; }
    .hs-app__subject { padding-block: 6px; }
    .hs-app__nav { padding-block-start: 9px; }
}

@media (max-width: 575.98px) {
    .hs-app { padding-block: 46px; }
    .hs-app__lead { font-size: 15.5px; line-height: 1.9; }
    .hs-app__cta { inline-size: 100%; }
    .hs-app__action { gap: 12px; }
    .hs-app__note { font-size: 14px; padding-inline: 14px; }
    .hs-app__ring  { inline-size: 264px; block-size: 264px; }
    /* Narrower, but NOT shorter: the widget title wraps to two lines at this
       width, so the screen needs the height it had at 216px, not less. */
    .hs-app__phone { inline-size: 208px; block-size: 448px; }
    .hs-app__ghost { inline-size: 100%; }
}


/* ---------------------------------------------------------------------------
   S9. REDUCED MOTION -- the second, independent switch
   The first is the script, which never adds `html.hs-motion` when the OS asks
   for reduce, so no entrance start state is ever applied. This kills the
   hover and disclosure transitions too, which the class-based switch does not
   reach. Some of this audience is seven years old; vestibular safety does not
   get to depend on one code path.
   --------------------------------------------------------------------------- */

@media (prefers-reduced-motion: reduce) {
    .hs-app *,
    .hs-app *::before,
    .hs-app *::after {
        transition: none !important;
        animation: none !important;
    }

    .hs-app__cta:hover,
    .hs-app__cta:focus-visible,
    .hs-app__ghost:hover { transform: none !important; }

    .hs-app__alt[open] .hs-app__chev { transform: rotate(180deg); }
}

/* ═══════════════════════════════════════════════════════════════════════════
   SECTION T — ANDROID APP SECTION  (.hsm-*)
   Separate namespace from the PWA section's .app-dl-* so neither can restyle
   the other.

   BAND COLOUR IS CREAM, NOT THE PALE BLUE IT USED TO BE.
   The section moved out of the page tail and now renders immediately after the
   course grid (see pages/index.blade.php). That put it against new neighbours:
     above — .course_area, which is #f5f8fc, the EXACT colour this band used to
             be. Two identical bands touching have no edge at all: the section
             would have read as more of the course area rather than a section.
     below — .testmonial_area #021930.
   Cream #fdf8f0 is already the page's warm band (teacher intro, contact), so
   this stays inside the palette and reuses an adjacency the page already
   proves: .hs-teacher (cream) sits directly on .course_area (#f5f8fc) higher
   up, and that seam reads cleanly. Cream vs #f5f8fc is 1.007:1 — no value
   step, a warm/cool hue shift — which is precisely how that existing seam
   works. Against the navy testimonials below it is 17.69:1.
   Dark was not an option: it would merge into the navy testimonials band and
   turn the navy phone into dark-on-dark mush.

   Contrast, composited on #fdf8f0 (every value rose slightly off the old band):
     title #032D58 16.60:1 · point #2f3f50 10.20:1 · lead/meta #4a5a6b 6.70:1
     · check icon #0f6b62 6.02:1 · gold-deep #72582A 5.08:1, and 4.67:1 on the
     eyebrow chip · note #4a5a6b on its tint 6.18:1 · navy #021930 on gold
     #C59848 8.57:1 (band-independent).
   Gold measures 2.06:1 as text on this band, so it appears ONLY as a fill
   under navy text -- never as text, border or icon.
   ═══════════════════════════════════════════════════════════════════════════ */
.hsm{background:#fdf8f0;padding:clamp(3.5rem,7vw,6rem) 0;overflow:hidden}
.hsm__wrap{max-width:1180px;margin:0 auto;padding:0 clamp(1rem,4vw,2.5rem);
  display:grid;grid-template-columns:1.05fr .95fr;gap:clamp(2rem,5vw,4.5rem);align-items:center}
.hsm__eyebrow{display:inline-flex;align-items:center;gap:.5rem;margin:0 0 1rem;
  padding:.4rem .9rem;border-radius:100px;background:rgba(217,168,62,.12);
  color:#72582A;font-size:.82rem;font-weight:700;letter-spacing:.01em}
.hsm__dot{width:7px;height:7px;border-radius:50%;background:#72582A;flex:none}
.hsm__title{margin:0 0 1rem;color:#032D58;font-size:clamp(1.6rem,3.4vw,2.5rem);
  font-weight:800;line-height:1.35}
.hsm__mark{display:block;color:#72582A}
.hsm__lead{margin:0 0 1.5rem;color:#4a5a6b;font-size:clamp(1rem,1.6vw,1.08rem);line-height:1.85;max-width:46ch}
.hsm__points{list-style:none;margin:0 0 1.9rem;padding:0;display:grid;gap:.7rem}
.hsm__point{display:flex;align-items:center;gap:.6rem;color:#2f3f50;font-size:.98rem;line-height:1.6}
.hsm__point svg{color:#0f6b62;flex:none}
.hsm__action{display:flex;align-items:center;gap:1rem;flex-wrap:wrap;margin-bottom:1.1rem}
.hsm__cta{display:inline-flex;align-items:center;gap:.6rem;min-height:54px;
  padding:0 1.6rem;border-radius:14px;background:#C59848;color:#021930;
  font-size:1.02rem;font-weight:800;text-decoration:none;
  box-shadow:0 10px 24px -12px rgba(4,19,35,.5);
  transition:transform .22s cubic-bezier(.2,.7,.3,1),background-color .22s,box-shadow .22s}
.hsm__cta:hover,.hsm__cta:focus-visible{background:#D5B57B;color:#021930;
  transform:translateY(-2px);box-shadow:0 16px 30px -14px rgba(4,19,35,.55)}
.hsm__meta{margin:0;color:#4a5a6b;font-size:.9rem}
.hsm__note{margin:0;padding:.9rem 1.1rem;border-radius:12px;
  background:rgba(7,26,46,.04);color:#4a5a6b;font-size:.9rem;line-height:1.8;max-width:52ch}

/* Device: navy object on the light band, so it reads as a physical thing. */
.hsm__device{display:flex;justify-content:center}
.hsm__phone{width:min(272px,78vw);border-radius:34px;padding:11px;
  background:linear-gradient(160deg,#0b2036,#021930);
  box-shadow:0 30px 60px -28px rgba(4,19,35,.6),0 0 0 1px rgba(255,255,255,.06) inset}
.hsm__screen{border-radius:24px;background:#032D58;padding:1rem .85rem;display:grid;gap:.6rem}
.hsm__bar{display:flex;align-items:center;gap:.55rem;padding-bottom:.6rem;
  border-bottom:1px solid rgba(255,255,255,.09)}
.hsm__avatar{width:30px;height:30px;border-radius:50%;background:#C59848;color:#021930;
  display:grid;place-items:center;font-weight:800;font-size:.9rem;flex:none}
.hsm__barname{color:#e8eef5;font-size:.85rem;font-weight:700}
.hsm__card{border-radius:14px;padding:.8rem;background:rgba(35,132,232,.16);display:grid;gap:.4rem}
.hsm__cardlabel{color:#7cc0f5;font-size:.72rem;font-weight:700}
.hsm__cardtitle{color:#fff;font-size:.92rem;font-weight:700}
.hsm__bar-track{height:5px;border-radius:100px;background:rgba(255,255,255,.16);overflow:hidden}
.hsm__bar-fill{display:block;height:100%;width:62%;border-radius:100px;background:#C59848}
.hsm__row{display:flex;align-items:center;gap:.55rem;padding:.55rem .6rem;border-radius:11px;
  background:rgba(255,255,255,.05)}
.hsm__chip{font-size:.7rem;font-weight:800;padding:.2rem .5rem;border-radius:7px;flex:none}
.hsm__rowtxt{color:#c8d4e2;font-size:.82rem}
.hsm--ar .hsm__chip{background:rgba(232,165,131,.2);color:#e8a583}
.hsm--sc .hsm__chip{background:rgba(105,204,192,.2);color:#69ccc0}
.hsm--en .hsm__chip{background:rgba(195,164,232,.2);color:#c3a4e8}

@media (max-width:860px){
  .hsm__wrap{grid-template-columns:1fr;gap:2.5rem}
  .hsm__device{order:-1}
  .hsm__lead,.hsm__note{max-width:none}
}
/* REDUCED MOTION.
   The entrance is already covered: .hsm__text and .hsm__device are
   [data-hs-reveal] elements, so the blanket rule in the R-section
   prefers-reduced-motion block pins them to opacity 1 / transform none, and the
   script never adds html.hs-motion in the first place. Verified: 0 of 22 reveal
   targets stay hidden with reduce forced.

   What that did NOT reach is the one real control in here. This comment used to
   claim the section "adds no animation of its own beyond the shared
   data-hs-reveal contract", which was wrong -- .hsm__cta carries its own 0.22s
   transition and lifts 2px on hover, and both survived reduce (measured:
   transitionDuration still 0.22s with the media query matching). A 7-year-old's
   parent who has asked the OS for no motion should not get a button that moves.

   Colour feedback is kept: it is information about interactivity, not
   decoration, and it does not move anything. Same split the app-dl and hs-app
   blocks already make. */
@media (prefers-reduced-motion: reduce){
  .hsm__cta{transition:none}
  .hsm__cta:hover,.hsm__cta:focus-visible{transform:none}
}

/* ===== Dr Hussin Darwesh homepage  (generated, do not hand-edit) ===== */

:root{
  --navy:#032D58; --navy-2:#0A3D72; --navy-deep:#021930; --navy-soft:#21466C;
  --gold:#C59848; --gold-ink:#72582A; --gold-lift:#D5B57B; --gold-glow:rgba(197,152,72,.16);
  --paper:#FBF9F5; --card:#FFFFFF; --tint:#F3F1EB; --rule:#E7DFD1;
  --ink:#12233A; --ink-2:#4C5D72; --ink-3:#5F7185;
  --ok:#1C6B3C; --live:#C0392B;
  --sh-sm:0 1px 2px rgba(3,45,88,.05);
  --sh:0 1px 2px rgba(3,45,88,.05), 0 12px 30px -12px rgba(3,45,88,.18);
  --sh-lg:0 2px 4px rgba(3,45,88,.06), 0 28px 60px -20px rgba(3,45,88,.28);
  --measure:62ch; --r:12px;
}
@media (prefers-color-scheme:dark){
  :root{--paper:#0A1626;--card:#0F2035;--tint:#132840;--rule:#22354C;
    --ink:#E8EEF6;--ink-2:#A9BBCF;--ink-3:#8496AC;
    --navy:#6FA8E8;--navy-2:#8FBEF2;--navy-soft:#8FBEF2;--gold-ink:#E0BC7B;
    --sh:0 1px 2px rgba(0,0,0,.4),0 12px 30px -12px rgba(0,0,0,.65);
    --sh-lg:0 2px 4px rgba(0,0,0,.5),0 28px 60px -20px rgba(0,0,0,.75);}
}
:root[data-theme="dark"]{--paper:#0A1626;--card:#0F2035;--tint:#132840;--rule:#22354C;
  --ink:#E8EEF6;--ink-2:#A9BBCF;--ink-3:#8496AC;
  --navy:#6FA8E8;--navy-2:#8FBEF2;--navy-soft:#8FBEF2;--gold-ink:#E0BC7B;
  --sh:0 1px 2px rgba(0,0,0,.4),0 12px 30px -12px rgba(0,0,0,.65);
  --sh-lg:0 2px 4px rgba(0,0,0,.5),0 28px 60px -20px rgba(0,0,0,.75);}
:root[data-theme="light"]{--paper:#FBF9F5;--card:#FFFFFF;--tint:#F3F1EB;--rule:#E7DFD1;
  --ink:#12233A;--ink-2:#4C5D72;--ink-3:#5F7185;
  --navy:#032D58;--navy-2:#0A3D72;--navy-soft:#21466C;--gold-ink:#72582A;
  --sh:0 1px 2px rgba(3,45,88,.05),0 12px 30px -12px rgba(3,45,88,.18);
  --sh-lg:0 2px 4px rgba(3,45,88,.06),0 28px 60px -20px rgba(3,45,88,.28);}

*{box-sizing:border-box;}

.dh{background:var(--paper);color:var(--ink);
  font-family:inherit;
  font-size:17px;line-height:1.75;direction:rtl;text-align:right;
  font-variant-numeric:tabular-nums;overflow-x:hidden;}
.wrap{max-width:1180px;margin-inline:auto;padding-inline:24px;}
h1,h2,h3,h4{margin:0;line-height:1.25;text-wrap:balance;font-weight:700;}
p{margin:0;} a{color:inherit;} img{max-width:100%;display:block;} ul{margin:0;padding:0;list-style:none;}
:focus-visible{outline:3px solid var(--gold);outline-offset:3px;border-radius:6px;}

/* ---------- motion ---------- */
.rv{opacity:0;transform:translateY(22px);transition:opacity .7s cubic-bezier(.22,1,.36,1),transform .7s cubic-bezier(.22,1,.36,1);}
.rv.in{opacity:1;transform:none;}
.rv.d1{transition-delay:.08s}.rv.d2{transition-delay:.16s}.rv.d3{transition-delay:.24s}
.rv.d4{transition-delay:.32s}.rv.d5{transition-delay:.4s}
@keyframes float{0%,100%{transform:translateY(0)}50%{transform:translateY(-9px)}}
@keyframes pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.45;transform:scale(.82)}}
@keyframes drift{0%{transform:translate(0,0) rotate(0)}100%{transform:translate(-18px,-26px) rotate(6deg)}}
@media (prefers-reduced-motion:reduce){
  *{animation:none!important;transition:none!important;}
  .rv{opacity:1;transform:none;}
  html{scroll-behavior:auto;}
}

.eyebrow{font-size:13px;font-weight:700;letter-spacing:.14em;color:var(--gold-ink);
  display:inline-flex;align-items:center;gap:9px;}
.eyebrow::before{content:"";width:22px;height:2px;background:var(--gold);border-radius:2px;}
.sec-head{max-width:var(--measure);margin:0 auto 46px;text-align:center;}
.sec-head .eyebrow::after{content:"";width:22px;height:2px;background:var(--gold);border-radius:2px;}
.sec-head h2{font-size:clamp(26px,3.6vw,40px);margin-top:16px;}
.sec-head p{color:var(--ink-2);margin-top:14px;}
section{padding:84px 0;}

.btn{display:inline-flex;align-items:center;justify-content:center;gap:9px;min-height:50px;
  padding:0 26px;border-radius:10px;text-decoration:none;font-weight:700;font-size:16px;
  border:1.5px solid transparent;cursor:pointer;
  transition:transform .2s ease,box-shadow .2s ease,background .2s ease,border-color .2s ease;}
.btn-primary{background:var(--navy);color:#fff;box-shadow:var(--sh);}
.btn-primary:hover{transform:translateY(-2px);box-shadow:var(--sh-lg);background:var(--navy-2);}
.btn-gold{background:var(--gold);color:#1A1206;box-shadow:var(--sh);}
.btn-gold:hover{transform:translateY(-2px);box-shadow:var(--sh-lg);}
.btn-ghost{border-color:var(--rule);color:var(--ink);background:var(--card);}
.btn-ghost:hover{border-color:var(--gold);transform:translateY(-2px);}

/* ---------- header ---------- */
.site{position:sticky;top:0;z-index:60;background:color-mix(in srgb,var(--paper) 86%,transparent);
  backdrop-filter:blur(12px);border-bottom:1px solid var(--rule);}
.site .wrap{display:flex;align-items:center;gap:26px;min-height:78px;}
.brand img{height:44px;width:auto;}
.nav{display:flex;gap:24px;margin-inline-start:auto;font-size:15px;color:var(--ink-2);font-weight:500;}
.nav a{text-decoration:none;padding:6px 2px;border-bottom:2px solid transparent;transition:.2s;}
.nav a:hover,.nav a.on{color:var(--navy);border-bottom-color:var(--gold);}
@media (max-width:980px){.nav{display:none;}}

/* ---------- hero ---------- */
.hero{position:relative;padding:70px 0 96px;overflow:hidden;
  background:radial-gradient(1100px 520px at 88% -8%,var(--gold-glow),transparent 62%),
             radial-gradient(900px 460px at 6% 4%,rgba(3,45,88,.07),transparent 60%);}
.hero .wrap{display:grid;grid-template-columns:1.02fr .98fr;gap:54px;align-items:center;position:relative;z-index:2;}
@media (max-width:980px){.hero{padding:44px 0 64px;}.hero .wrap{grid-template-columns:1fr;gap:52px;}}
.hero h1{font-size:clamp(34px,5.4vw,60px);letter-spacing:-.015em;margin:18px 0 0;}
.hero h1 .hl{color:var(--navy);position:relative;white-space:nowrap;}
.hero h1 .hl::after{content:"";position:absolute;inset-inline:-4px;bottom:.1em;height:.36em;
  background:var(--gold);opacity:.32;border-radius:3px;z-index:-1;}
.lede{font-size:clamp(17px,2vw,20px);color:var(--ink-2);max-width:var(--measure);margin-top:20px;}
.hero-cta{display:flex;flex-wrap:wrap;gap:14px;margin-top:32px;}
.proof{display:flex;align-items:center;gap:14px;margin-top:34px;flex-wrap:wrap;}
.avs{display:flex;}
.avs span{width:38px;height:38px;border-radius:50%;border:2.5px solid var(--paper);
  margin-inline-start:-11px;display:grid;place-items:center;font-size:13px;font-weight:700;color:#fff;}
.avs span:first-child{margin:0;}
.proof-t{font-size:14px;color:var(--ink-3);}
.proof-t b{color:var(--ink);}

/* floating math motifs — from his own subject matter */
.motif{position:absolute;color:var(--navy);opacity:.07;font-weight:700;pointer-events:none;user-select:none;z-index:1;}
.m1{top:12%;inset-inline-start:4%;font-size:34px;animation:drift 17s ease-in-out infinite alternate;}
.m2{top:62%;inset-inline-start:8%;font-size:27px;animation:drift 21s ease-in-out infinite alternate-reverse;}
.m3{top:26%;inset-inline-end:44%;font-size:24px;animation:drift 19s ease-in-out infinite alternate;}
@media (max-width:980px){.motif{display:none;}}

/* portrait + floating data cards */
.stage{position:relative;justify-self:center;width:min(430px,88vw);}
.pf{position:relative;aspect-ratio:4/5;border-radius:16px;overflow:hidden;background:var(--card);
  border:1px solid var(--rule);box-shadow:var(--sh-lg);}
.pf::after{content:"";position:absolute;inset:0;
  background:linear-gradient(to top,rgba(2,25,48,.42),transparent 46%);}
.pf img{width:100%;height:100%;object-fit:cover;object-position:50% 12%;}
.fcard{position:absolute;background:var(--card);border:1px solid var(--rule);border-radius:12px;
  padding:12px 15px;box-shadow:var(--sh-lg);z-index:3;}
.fc-1{top:12%;inset-inline-start:-38px;animation:float 6.5s ease-in-out infinite;}
.fc-2{bottom:24%;inset-inline-end:-30px;animation:float 7.5s ease-in-out .8s infinite;}
.fc-3{bottom:6%;inset-inline-start:-22px;animation:float 8s ease-in-out .4s infinite;}
@media (max-width:560px){.fc-1{inset-inline-start:-10px}.fc-2{inset-inline-end:-6px}.fc-3{inset-inline-start:-4px}}
.fc-lab{font-size:11px;color:var(--ink-3);}
.fc-val{font-size:19px;font-weight:700;color:var(--navy);line-height:1.2;}
.ring{display:flex;align-items:center;gap:11px;}
.ring svg{transform:rotate(-90deg);}
.ring circle{fill:none;stroke-width:5;stroke-linecap:round;}
.ring .bg{stroke:var(--rule);}
.ring .fg{stroke:var(--gold);stroke-dasharray:126;stroke-dashoffset:126;transition:stroke-dashoffset 1.6s cubic-bezier(.22,1,.36,1);}
.ring.in .fg{stroke-dashoffset:19;}
.spark{display:block;}
.spark path{fill:none;stroke:var(--gold);stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round;
  stroke-dasharray:150;stroke-dashoffset:150;transition:stroke-dashoffset 1.8s ease .3s;}
.spark.in path{stroke-dashoffset:0;}
.livebadge{position:absolute;top:-14px;inset-inline-end:22px;z-index:4;display:flex;align-items:center;gap:8px;
  background:var(--navy-deep);color:#fff;border-radius:999px;padding:8px 15px;font-size:13px;font-weight:700;
  box-shadow:var(--sh-lg);}
.dot{width:8px;height:8px;border-radius:50%;background:#FF5B4A;animation:pulse 1.7s ease-in-out infinite;}

/* ---------- feature strip ---------- */
.feats{display:grid;grid-template-columns:repeat(5,1fr);gap:16px;}
@media (max-width:1020px){.feats{grid-template-columns:repeat(3,1fr);}}
@media (max-width:660px){.feats{grid-template-columns:repeat(2,1fr);}}
.feat{background:var(--card);border:1px solid var(--rule);border-radius:var(--r);padding:24px 18px;
  text-align:center;transition:transform .22s ease,border-color .22s ease,box-shadow .22s ease;}
.feat:hover{transform:translateY(-5px);border-color:var(--gold);box-shadow:var(--sh);}
.ficon{width:52px;height:52px;border-radius:14px;display:grid;place-items:center;margin:0 auto 14px;
  background:var(--tint);color:var(--navy);}
.feat h3{font-size:16px;margin-bottom:6px;}
.feat p{font-size:13.5px;color:var(--ink-3);line-height:1.6;}

/* ---------- banks ---------- */
.banks{display:grid;grid-template-columns:repeat(3,1fr);gap:22px;}
@media (max-width:920px){.banks{grid-template-columns:1fr;}}
.bank{background:var(--card);border:1px solid var(--rule);border-radius:var(--r);overflow:hidden;
  display:flex;flex-direction:column;transition:transform .24s ease,box-shadow .24s ease,border-color .24s ease;}
.bank:hover{transform:translateY(-6px);box-shadow:var(--sh-lg);border-color:var(--gold);}
.bank-top{position:relative;height:124px;display:grid;place-items:center;overflow:hidden;
  background:linear-gradient(135deg,var(--navy),var(--navy-2));}
.bank-top .glyph{font-size:44px;font-weight:700;color:#fff;opacity:.95;letter-spacing:.02em;}
.bank-top::after{content:"";position:absolute;inset-inline-end:-30px;top:-30px;width:120px;height:120px;
  border-radius:50%;background:var(--gold);opacity:.22;}
.bank-body{padding:22px;display:flex;flex-direction:column;gap:14px;flex:1;}
.bank h3{font-size:22px;}
.count{font-size:14.5px;color:var(--ink-3);}
.count b{color:var(--navy);font-size:19px;}
.opts{display:grid;grid-template-columns:1fr 1fr;gap:8px;}
.opt{display:flex;align-items:center;gap:9px;font-size:13.5px;color:var(--ink-2);background:var(--tint);
  border:1px solid var(--rule);border-radius:8px;padding:8px 10px;transition:.2s;}
.bank:hover .opt{border-color:color-mix(in srgb,var(--gold) 42%,var(--rule));}
.opt i{font-style:normal;width:23px;height:23px;flex:none;display:grid;place-items:center;border-radius:6px;
  background:var(--navy);color:#fff;font-size:12px;font-weight:700;}
.opt.is-key i{background:var(--gold);color:#1A1206;}

/* ---------- stats band ---------- */
.stats{background:linear-gradient(135deg,var(--navy-deep),var(--navy));color:#fff;border-radius:0;}
.stats .wrap{display:grid;grid-template-columns:repeat(4,1fr);gap:26px;}
@media (max-width:820px){.stats .wrap{grid-template-columns:repeat(2,1fr);gap:32px;}}
.stat{display:flex;align-items:center;gap:14px;justify-content:center;}
.stat .si{width:46px;height:46px;border-radius:12px;display:grid;place-items:center;flex:none;
  background:rgba(197,152,72,.18);color:var(--gold-lift);}
.stat .n{font-size:29px;font-weight:700;line-height:1.1;}
.stat .l{font-size:13.5px;color:#A9BFD6;}

/* ---------- why ---------- */
.why{display:grid;grid-template-columns:repeat(4,1fr);gap:18px;}
@media (max-width:1000px){.why{grid-template-columns:repeat(2,1fr);}}
@media (max-width:600px){.why{grid-template-columns:1fr;}}
.wcard{background:var(--card);border:1px solid var(--rule);border-radius:var(--r);padding:24px;
  border-top:3px solid var(--gold);transition:transform .22s ease,box-shadow .22s ease;}
.wcard:hover{transform:translateY(-5px);box-shadow:var(--sh);}
.wcard h3{font-size:17px;margin:12px 0 8px;}
.wcard p{font-size:14px;color:var(--ink-3);line-height:1.65;}

/* ---------- try-a-question (real items from his banks) ---------- */
.tries{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;}
@media (max-width:980px){.tries{grid-template-columns:1fr;max-width:620px;margin-inline:auto;}}
.try{background:var(--card);border:1px solid var(--rule);border-radius:var(--r);padding:22px;
  display:flex;flex-direction:column;gap:15px;transition:border-color .22s ease,box-shadow .22s ease;}
.try.done{border-color:var(--gold);box-shadow:var(--sh);}
.try-h{display:flex;align-items:center;justify-content:space-between;gap:10px;}
.try-tag{font-size:11.5px;font-weight:700;letter-spacing:.08em;color:var(--gold-ink);
  border:1px solid var(--rule);border-radius:999px;padding:3px 11px;}
.try-n{font-size:12px;color:var(--ink-3);}
.try-q{font-size:16px;font-weight:700;line-height:1.7;color:var(--ink);}
.frac{display:inline-flex;flex-direction:column;vertical-align:-.55em;text-align:center;
  font-size:.78em;line-height:1.12;margin-inline:2px;}
.frac span:first-child{border-block-end:1.5px solid currentColor;padding-inline:3px;}
.choices{display:grid;grid-template-columns:1fr 1fr;gap:9px;}
.choice{display:flex;align-items:center;gap:9px;font-size:14.5px;color:var(--ink-2);background:var(--tint);
  border:1.5px solid var(--rule);border-radius:8px;padding:10px 11px;cursor:pointer;text-align:start;
  font-family:inherit;transition:border-color .18s ease,background .18s ease,transform .18s ease;}
.choice:hover:not(:disabled){border-color:var(--gold);transform:translateY(-2px);}
.choice:disabled{cursor:default;}
.choice i{font-style:normal;width:24px;height:24px;flex:none;display:grid;place-items:center;border-radius:6px;
  background:var(--navy);color:#fff;font-size:12px;font-weight:700;transition:.18s;}
.choice.right{border-color:var(--ok);background:color-mix(in srgb,var(--ok) 12%,var(--card));color:var(--ink);}
.choice.right i{background:var(--ok);}
.choice.wrong{border-color:var(--live);background:color-mix(in srgb,var(--live) 10%,var(--card));}
.choice.wrong i{background:var(--live);}
@keyframes nudge{0%,100%{transform:translateX(0)}25%{transform:translateX(-5px)}75%{transform:translateX(5px)}}
.choice.wrong{animation:nudge .32s ease;}
.solve{display:none;border-top:1px dashed var(--rule);padding-top:13px;font-size:14px;color:var(--ink-2);line-height:1.7;}
.try.done .solve{display:block;}
.solve b{color:var(--gold-ink);}

/* real-testimonial slot, empty until he supplies them */
.slot{border:1.5px dashed var(--rule);border-radius:var(--r);padding:30px;text-align:center;
  color:var(--ink-3);font-size:14.5px;max-width:660px;margin:44px auto 0;}
.slot b{display:block;color:var(--ink-2);font-size:16px;margin-bottom:6px;}

/* ---------- FAQ ---------- */
.faq{display:grid;grid-template-columns:1fr 1fr;gap:14px;}
@media (max-width:820px){.faq{grid-template-columns:1fr;}}
details{background:var(--card);border:1px solid var(--rule);border-radius:10px;padding:0 18px;transition:.2s;}
details[open]{border-color:var(--gold);box-shadow:var(--sh-sm);}
summary{cursor:pointer;list-style:none;padding:16px 0;font-weight:700;font-size:15.5px;
  display:flex;align-items:center;justify-content:space-between;gap:12px;}
summary::-webkit-details-marker{display:none;}
summary::after{content:"";width:9px;height:9px;border-inline-start:2px solid var(--ink-3);
  border-block-end:2px solid var(--ink-3);transform:rotate(-45deg);transition:transform .25s ease;flex:none;}
details[open] summary::after{transform:rotate(135deg);}
details p{padding:0 0 18px;color:var(--ink-2);font-size:15px;}

/* ---------- app download ---------- */
.app{background:linear-gradient(135deg,var(--navy-deep),var(--navy));color:#fff;overflow:hidden;position:relative;}
.app .wrap{display:grid;grid-template-columns:1.05fr .95fr;gap:52px;align-items:center;position:relative;z-index:2;}
@media (max-width:940px){.app .wrap{grid-template-columns:1fr;gap:44px;}}
.app h2{font-size:clamp(26px,3.6vw,40px);}
.app p{color:#BACBDD;margin-top:16px;max-width:var(--measure);}
.app .eyebrow{color:var(--gold-lift);}
.app .eyebrow::before{background:var(--gold-lift);}
.applist{display:flex;flex-direction:column;gap:12px;margin-top:26px;}
.applist li{display:flex;gap:11px;align-items:flex-start;color:#CBD9E7;font-size:15px;}
.applist svg{flex:none;margin-top:5px;color:var(--gold-lift);}
/* Equal-width grid, not a wrapping flex row: the two actions used to measure
   211px and 197px, which read as a ragged edge, and on a 390px screen they
   stacked at those two different widths instead of filling the column.
   NOTE: this section is an always-dark ground in BOTH themes (an !important
   dark patch further down pins .app's gradient), so the literal light-on-dark
   values below are stable. Do NOT reach for var(--navy) here -- it flips to
   #6FA8E8 under [data-theme="dark"]. --gold does not flip and is safe. */
.stores{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;
  margin-top:30px;max-width:520px;}
@media (max-width:560px){.stores{grid-template-columns:1fr;}}
.store{display:inline-flex;align-items:center;gap:11px;border-radius:12px;
  padding:12px 18px;text-decoration:none;font-weight:700;border:1px solid transparent;
  transition:transform .2s ease,background .2s ease,border-color .2s ease,box-shadow .2s ease;}
.store:hover{transform:translateY(-3px);}
.store:focus-visible{outline:2px solid #F2B705;outline-offset:3px;}
.store svg{flex:none;}
.store small{display:block;font-size:11.5px;font-weight:400;line-height:1.25;}
.store b{font-size:15px;line-height:1.25;}

/* primary — the action we actually want tapped */
.store--primary{background:var(--gold);color:#1A1206;box-shadow:var(--sh-lg);}
.store--primary small{color:#3A2A05;}            /* 5.27:1 on #C59848 */
.store--primary:hover{background:var(--gold-lift);color:#1A1206;}

/* secondary — the browser route, deliberately quieter */
.store--ghost{background:transparent;color:#FFFFFF;border-color:rgba(255,255,255,.42);}
.store--ghost small{color:#BACBDD;}
.store--ghost:hover{background:rgba(255,255,255,.09);border-color:rgba(255,255,255,.72);color:#FFFFFF;}

/* disabled — previously had NO rule at all, so it inherited the clickable
   white card and looked tappable while doing nothing. */
.store--soon{background:rgba(255,255,255,.07);color:#9DB0C4;
  border-color:rgba(255,255,255,.18);box-shadow:none;cursor:not-allowed;}
.store--soon small{color:#8299AF;}
.store--soon:hover{transform:none;background:rgba(255,255,255,.07);}
/* phone mockup */
.phone{justify-self:center;width:min(290px,80vw);aspect-ratio:9/19;border-radius:34px;
  background:#0C1B2C;border:9px solid #16283D;box-shadow:var(--sh-lg);position:relative;overflow:hidden;
  animation:float 8s ease-in-out infinite;}
.phone .notch{position:absolute;top:0;inset-inline:50%;transform:translateX(50%);width:112px;height:22px;
  background:#16283D;border-radius:0 0 12px 12px;z-index:3;}
.pscreen{position:absolute;inset:0;background:var(--paper);display:flex;flex-direction:column;padding:34px 14px 14px;gap:11px;}
.pbar{height:34px;border-radius:9px;background:linear-gradient(135deg,var(--navy),var(--navy-2));
  display:flex;align-items:center;justify-content:center;color:#fff;font-size:12px;font-weight:700;}
.pq{background:var(--card);border:1px solid var(--rule);border-radius:9px;padding:9px;font-size:11px;color:var(--ink-2);}
.pq .qh{font-weight:700;color:var(--ink);font-size:11.5px;margin-bottom:7px;}
.pgrid{display:grid;grid-template-columns:1fr 1fr;gap:5px;}
.pgrid span{background:var(--tint);border:1px solid var(--rule);border-radius:6px;padding:5px;text-align:center;font-size:10.5px;}
.pgrid span.k{background:var(--gold);color:#1A1206;border-color:var(--gold);font-weight:700;}

/* ---------- PWA ---------- */
.pwa .wrap{background:var(--card);border:1px solid var(--rule);border-radius:18px;padding:44px;
  display:grid;grid-template-columns:auto 1fr auto;gap:32px;align-items:center;box-shadow:var(--sh);}
@media (max-width:900px){.pwa .wrap{grid-template-columns:1fr;text-align:center;gap:22px;}
  .pwa .pwa-ic{margin-inline:auto;}}
.pwa-ic{width:78px;height:78px;border-radius:20px;background:var(--tint);display:grid;place-items:center;
  color:var(--navy);flex:none;border:1px solid var(--rule);}
.pwa h3{font-size:clamp(21px,2.6vw,27px);}
.pwa p{color:var(--ink-2);margin-top:10px;max-width:56ch;}
.pwa-steps{display:flex;gap:20px;margin-top:16px;flex-wrap:wrap;font-size:13.5px;color:var(--ink-3);}
.pwa-steps b{color:var(--gold-ink);}

/* ---------- final CTA ---------- */
.final .wrap{background:linear-gradient(135deg,var(--navy),var(--navy-2));border-radius:20px;
  padding:52px;color:#fff;position:relative;overflow:hidden;
  display:flex;gap:28px;align-items:center;justify-content:space-between;flex-wrap:wrap;}
.final h2{font-size:clamp(24px,3.2vw,36px);}
.final p{color:#C3D5E8;margin-top:10px;}
.final .bg-glyph{position:absolute;inset-inline-start:4%;top:50%;transform:translateY(-50%);
  font-size:120px;font-weight:700;opacity:.08;pointer-events:none;}

/* ---------- footer ---------- */
footer{background:var(--navy-deep);color:#B9CADC;padding:56px 0 30px;font-size:15px;}
footer .wrap{display:grid;grid-template-columns:1.3fr 1fr 1fr 1fr;gap:34px;}
@media (max-width:900px){footer .wrap{grid-template-columns:1fr 1fr;gap:28px;}}
@media (max-width:560px){footer .wrap{grid-template-columns:1fr;}}
footer h4{color:#fff;font-size:15px;margin:0 0 13px;}
footer a{color:#B9CADC;text-decoration:none;display:block;padding:4px 0;transition:.2s;}
footer a:hover{color:var(--gold-lift);}
.foot-mark{background:#fff;border-radius:10px;padding:11px 15px;display:inline-block;margin-bottom:15px;}
.foot-mark img{height:36px;width:auto;}
.legal{border-top:1px solid rgba(255,255,255,.12);margin-top:36px;padding-top:20px;font-size:13px;color:#8FA3B8;
  display:flex;justify-content:space-between;gap:14px;flex-wrap:wrap;}


/* Vendor theme declares h1..h4 colour directly, which beats our inherited
   white on dark bands. These must be explicit or headings vanish. */
.dh .final h2,.dh .final p,.dh .app h2,.dh .app h3,.dh .stats .n,.dh .stats .l,
.dh .app .applist li,.dh .app .store b{color:#fff!important;}
.dh .app p,.dh .final p{color:#C3D5E8!important;}
.dh .stats .l{color:#A9BFD6!important;}
/* These were a single blanket pair (.dh .app .store b / small forced to
   #0C1B2C / #5A6B7D !important) written when BOTH buttons were white cards.
   The cards are gone: only the primary is a light (gold) surface now, so a
   blanket dark ink painted dark-navy text onto the dark-navy section and the
   ghost button measured 1.26:1 -- effectively invisible. Split per variant.
   The !important is retained because the rule it was written to beat is still
   in the minified vendor sheet. */
.dh .app .store--primary b{color:#1A1206!important;}       /* 7.05:1 on #C59848 */
.dh .app .store--primary small{color:#3A2A05!important;}   /* 5.27:1 on #C59848 */
.dh .app .store--ghost b{color:#FFFFFF!important;}
.dh .app .store--ghost small{color:#BACBDD!important;}
.dh .app .store--soon b{color:#9DB0C4!important;}
.dh .app .store--soon small{color:#8299AF!important;}
/* the decorative glyph was overlapping the CTA copy */
.dh .final .bg-glyph{font-size:88px;opacity:.06;inset-inline-start:2%;}
@media (max-width:820px){.dh .final .bg-glyph{display:none;}}

/* ===== end ===== */

/* ===== dh dark mode + theme toggle =====================================
   The vendor stylesheet has no dark support at all, so every surface below
   is stated explicitly. !important is used deliberately: frontend_style.css
   is minified, unbuildable (no SCSS source) and full of element-level rules
   that outrank anything inherited. ==================================== */

/* --- header utility cluster: theme switch + WhatsApp ---------------------
   These used to float. Measured defect: at 390px the fixed .dh-tt (48px at
   inset-block-end:22px) overlapped .heading_icons -- the fixed 56px bottom
   bar from partials/header/2.blade.php -- by ~34px, and on a first visit it
   sat entirely inside the 303px cookie banner (.theme_cookies, z-index 1000).
   Both are gone now the controls live in the header row instead. The floating
   variant below survives only for the course player, which has no header. */
.dh-util{display:inline-flex;align-items:center;gap:2px;margin-inline:6px;}
.dh-tt{
  width:38px;height:38px;border-radius:50%;padding:0;line-height:0;flex:0 0 auto;
  display:inline-grid;place-items:center;cursor:pointer;
  background:transparent;border:1px solid transparent;color:#032D58;
  transition:background .2s ease,color .2s ease,border-color .2s ease,transform .15s ease;}
.dh-tt:hover{background:rgba(3,45,88,.07);transform:translateY(-1px);}
.dh-tt:active{transform:translateY(0) scale(.96);}
.dh-tt:focus-visible{outline:2px solid #2563EB;outline-offset:2px;}
.dh-tt .dh-tt-moon{display:none;}
:root[data-theme="dark"] .dh-tt{color:#E0BC7B;}
:root[data-theme="dark"] .dh-tt:hover{background:rgba(224,188,123,.14);}
:root[data-theme="dark"] .dh-tt .dh-tt-sun{display:none;}
:root[data-theme="dark"] .dh-tt .dh-tt-moon{display:block;}

/* ---- floating WhatsApp, bottom-right, WhatsApp brand green --------------
   `right`, not `inset-inline-end`: this site is RTL and the owner asked for
   bottom-RIGHT specifically, so the logical property would put it on the wrong
   side. #25D366 and the white glyph are WhatsApp's own mark, kept exact.

   Clears the fixed 56px mobile bar (.heading_icons in header/2.blade.php) that
   the previous floating control overlapped by ~34px. #back-top sits bottom-LEFT
   so there is no conflict there. */
.dh-wa-float{
  position:fixed;right:20px;bottom:22px;z-index:1200;
  width:56px;height:56px;border-radius:50%;
  display:grid;place-items:center;
  background:#25D366;color:#FFFFFF;text-decoration:none;
  box-shadow:0 4px 12px rgba(0,0,0,.15),0 10px 28px -8px rgba(37,211,102,.55);
  transition:transform .2s ease,box-shadow .2s ease,opacity .2s ease,background .2s ease;}
.dh-wa-float:hover{background:#1FBE5B;color:#FFFFFF;transform:translateY(-3px) scale(1.05);
  box-shadow:0 6px 16px rgba(0,0,0,.2),0 16px 36px -8px rgba(37,211,102,.65);}
.dh-wa-float:active{transform:translateY(-1px) scale(.99);}
.dh-wa-float:focus-visible{outline:3px solid #128C7E;outline-offset:3px;}
.dh-wa-float svg{display:block;}
@media (max-width:991px){
  /* 56px bar + 16px breathing room. */
  .dh-wa-float{bottom:calc(56px + 16px);width:52px;height:52px;right:16px;}
  .dh-wa-float svg{width:27px;height:27px;}
}
@media print{.dh-wa-float{display:none;}}

/* Footer phone: one unbreakable LTR line. "+966 59 589 7745" was wrapping in
   the narrow footer column, and a bare tel: href kept the spaces. */
.dh-phone{white-space:nowrap;display:inline-block;unicode-bidi:isolate;}

/* Payment logos: keep each logo's real aspect ratio.
   footer-v7.css pins .payment-methods to a fixed 36x24 box, which shrinks a
   wide wordmark (PayPal, Kashier) to a few px tall inside object-fit:contain.
   footer-v7.css loads AFTER this file, so the override needs the extra
   specificity of :root + img to win on cascade order. Height-locked, width
   auto, on a small white chip so the dark logos read in either theme. */
:root .footer img.payment-methods{
  width:auto;height:26px;max-width:118px;min-width:0;
  padding:4px 7px;background:#FFFFFF;border-radius:5px;object-fit:contain;
  box-shadow:0 1px 2px rgba(0,0,0,.06);}
.footer .d-flex.gap-2{gap:10px!important;row-gap:10px!important;}

/* --- floating variant: layouts/full_screen_master (the course player) only.
       It renders no header, so the control has nowhere else to go. That layout
       also has no cookie banner and no .heading_icons, so nothing collides. */
.dh-tt--float{position:fixed;inset-block-end:22px;inset-inline-start:22px;z-index:9999;
  width:48px;height:48px;background:#FFFFFF;border-color:#E7DFD1;
  box-shadow:0 2px 4px rgba(3,45,88,.08),0 14px 30px -12px rgba(3,45,88,.3);}
.dh-tt--float:hover{transform:translateY(-3px) scale(1.04);background:#FFFFFF;}
:root[data-theme="dark"] .dh-tt--float{background:#152A44;border-color:#22354C;}
:root[data-theme="dark"] .dh-tt--float:hover{background:#152A44;}
@media print{.dh-tt,.dh-wa,.dh-util{display:none;}}

/* --- page ground --- */
:root[data-theme="dark"] body{background:#0A1626!important;color:#E8EEF6!important;}

/* --- sticky header --- */
:root[data-theme="dark"] header.heading,
:root[data-theme="dark"] #sticky-header,
:root[data-theme="dark"] .header_area,
:root[data-theme="dark"] .main_menu{background:#0F2035!important;border-color:#22354C!important;}
:root[data-theme="dark"] header.heading a,
:root[data-theme="dark"] #sticky-header a,
:root[data-theme="dark"] .main_menu a{color:#D6E2EF!important;}
:root[data-theme="dark"] header.heading a:hover,
:root[data-theme="dark"] #sticky-header a:hover{color:#E0BC7B!important;}
/* his mark is navy-on-transparent: it disappears on a dark header, so it keeps
   a light plate exactly as it does in print. */
:root[data-theme="dark"] header.heading img[src*="logo-dr-hussin"],
:root[data-theme="dark"] #sticky-header img[src*="logo-dr-hussin"]{
  background:#fff;border-radius:8px;padding:5px 9px;}

/* --- generic surfaces the vendor paints white --- */
:root[data-theme="dark"] .white_box,
:root[data-theme="dark"] .card,
:root[data-theme="dark"] .single_course,
:root[data-theme="dark"] .course_list,
:root[data-theme="dark"] .modal-content,
:root[data-theme="dark"] .dropdown-menu{background:#0F2035!important;border-color:#22354C!important;color:#E8EEF6!important;}
:root[data-theme="dark"] .dropdown-item{color:#D6E2EF!important;}
:root[data-theme="dark"] .dropdown-item:hover{background:#152A44!important;}
:root[data-theme="dark"] input,:root[data-theme="dark"] select,:root[data-theme="dark"] textarea{
  background:#132840!important;border-color:#22354C!important;color:#E8EEF6!important;}
:root[data-theme="dark"] input::placeholder,:root[data-theme="dark"] textarea::placeholder{color:#7F93A9!important;}
:root[data-theme="dark"] hr,:root[data-theme="dark"] .border,:root[data-theme="dark"] table td,
:root[data-theme="dark"] table th{border-color:#22354C!important;}

/* --- the bespoke homepage: tokens already flip, these are the leftovers --- */
:root[data-theme="dark"] .dh .feat,
:root[data-theme="dark"] .dh .bank,
:root[data-theme="dark"] .dh .wcard,
:root[data-theme="dark"] .dh .try,
:root[data-theme="dark"] .dh details,
:root[data-theme="dark"] .dh .pwa .wrap{background:#0F2035!important;border-color:#22354C!important;}
:root[data-theme="dark"] .dh .opt,:root[data-theme="dark"] .dh .choice{background:#132840!important;border-color:#22354C!important;}
:root[data-theme="dark"] .dh .slot{border-color:#2C3F57!important;}
:root[data-theme="dark"] .dh .btn-ghost{background:#0F2035!important;border-color:#2C3F57!important;color:#E8EEF6!important;}
:root[data-theme="dark"] .dh .hero{background:radial-gradient(1100px 520px at 88% -8%,rgba(197,152,72,.10),transparent 62%),
  radial-gradient(900px 460px at 6% 4%,rgba(111,168,232,.07),transparent 60%);}
/* the navy bands are already dark; keep them a shade off the page ground so the
   section rhythm does not collapse into one flat surface */
:root[data-theme="dark"] .dh .stats{background:linear-gradient(135deg,#06101D,#0D2440)!important;}
:root[data-theme="dark"] .dh .app{background:linear-gradient(135deg,#06101D,#0D2440)!important;}
:root[data-theme="dark"] .dh .final .wrap{background:linear-gradient(135deg,#0D2440,#154070)!important;}

/* --- the video / fullscreen lesson page --- */
:root[data-theme="dark"] .aoraeditor-header,
:root[data-theme="dark"] .lesson_sidebar,
:root[data-theme="dark"] .course_content_area,
:root[data-theme="dark"] .video_area,
:root[data-theme="dark"] .accordion-item,
:root[data-theme="dark"] .accordion-button{background:#0F2035!important;color:#E8EEF6!important;border-color:#22354C!important;}
:root[data-theme="dark"] .accordion-button:not(.collapsed){background:#152A44!important;}
:root[data-theme="dark"] .plyr__control{color:#E8EEF6;}
/* Plyr already ships a dark skin; only the surrounding chrome needs stating. */
:root[data-theme="dark"] .plyr{--plyr-color-main:#C59848;}

/* --- footer is navy in both themes; deepen it so it still separates --- */
:root[data-theme="dark"] footer{background:#06101D!important;}

/* The theme's dynamic-colour component paints h1..h6 with secondary_color
   (#032D58) directly. On the dark ground that is navy-on-navy and the headline
   disappears -- the same failure mode as the CTA band. Must be explicit. */
:root[data-theme="dark"] .dh h1,:root[data-theme="dark"] .dh h2,
:root[data-theme="dark"] .dh h3,:root[data-theme="dark"] .dh h4,
:root[data-theme="dark"] .dh .sec-head h2,:root[data-theme="dark"] .dh .bank h3,
:root[data-theme="dark"] .dh .feat h3,:root[data-theme="dark"] .dh .wcard h3,
:root[data-theme="dark"] .dh summary,:root[data-theme="dark"] .dh .try-q,
:root[data-theme="dark"] .dh .count b,:root[data-theme="dark"] .dh .fc-val,
:root[data-theme="dark"] .dh .pwa h3{color:#E8EEF6!important;}
:root[data-theme="dark"] .dh .hero h1 .hl{color:#8FBEF2!important;}
:root[data-theme="dark"] .dh .hero h1 .hl::after{opacity:.42;}
:root[data-theme="dark"] .dh .stat .n{color:#fff!important;}

/* cookie / consent bar ships cream; it reads as a light slab on the dark page */
:root[data-theme="dark"] .cookie-consent,:root[data-theme="dark"] #cookie-consent,
:root[data-theme="dark"] .cookie_bar,:root[data-theme="dark"] .cookie-bar,
:root[data-theme="dark"] [class*="cookie"]{background:#0F2035!important;color:#D6E2EF!important;
  border-color:#22354C!important;}
:root[data-theme="dark"] [class*="cookie"] a{color:#E0BC7B!important;}

/* ===== end dh dark ===== */

/* ===== dh arabic typography + mobile ==================================
   AUDIT FINDING: this site declared "Plus Jakarta Sans"/"Inter" and loaded
   Source Sans Pro + Jost -- four Latin families, none with a U+0600-06FF
   subset. So 100% of the Arabic was rendered by whatever the visitor's OS
   happened to have (Segoe UI on Windows, Noto Naskh on Android, Geeza Pro on
   iOS). That is the "the Arabic font is not good" complaint: the site had no
   typographic control over its own primary language.
   ==================================================================== */
@font-face{font-family:"IBMPlexArabic";
  src:url("../fonts/IBMPlexSansArabic-Regular.ttf") format("truetype");
  font-weight:400;font-style:normal;font-display:swap;
  unicode-range:U+0600-06FF,U+0750-077F,U+08A0-08FF,U+FB50-FDFF,U+FE70-FEFF,U+0020-007F;}
@font-face{font-family:"IBMPlexArabic";
  src:url("../fonts/IBMPlexSansArabic-SemiBold.ttf") format("truetype");
  font-weight:600;font-style:normal;font-display:swap;
  unicode-range:U+0600-06FF,U+0750-077F,U+08A0-08FF,U+FB50-FDFF,U+FE70-FEFF,U+0020-007F;}
@font-face{font-family:"IBMPlexArabic";
  src:url("../fonts/IBMPlexSansArabic-Bold.ttf") format("truetype");
  font-weight:700;font-style:normal;font-display:swap;
  unicode-range:U+0600-06FF,U+0750-077F,U+08A0-08FF,U+FB50-FDFF,U+FE70-FEFF,U+0020-007F;}

/* Put it FIRST in both theme stacks so Arabic resolves to it and Latin still
   falls through to the vendor faces. */
:root{
  --font_family1:"IBMPlexArabic","Plus Jakarta Sans",sans-serif;
  --font_family2:"IBMPlexArabic","Inter",sans-serif;
}
body,button,input,select,textarea,h1,h2,h3,h4,h5,h6,.dh{
  font-family:"IBMPlexArabic","Plus Jakarta Sans","Segoe UI",Tahoma,sans-serif;}

/* AUDIT FINDING: h1..h4 used line-height 1.25 -- a Latin ratio. Measured ink
   box was 43px against 42.5px of leading, i.e. -0.5px: lines literally
   touching, and shadda/tanween sit OUTSIDE that box so real collision is
   worse. Arabic needs materially more leading than Latin. */
h1,h2,h3,h4,h5,h6,.dh h1,.dh h2,.dh h3,.dh h4{line-height:1.5;}
.dh .hero h1{line-height:1.45;}
.dh .sec-head h2{line-height:1.48;}

/* AUDIT FINDING: ~30 nodes below 16px with no mobile scale; smallest 10px.
   Arabic is barely legible at 11px. Raise the floor on small screens only. */
@media (max-width:600px){
  .dh{font-size:16px;}
  .dh p,.dh .lede,.dh .count,.dh .try-q,.dh .solve,.dh .opt,.dh .choice{font-size:15.5px;}
  .dh .fc-lab,.dh .try-n,.dh .stat .l,.dh .pwa-steps,.dh small{font-size:13px;}
  .dh .feat p,.dh .wcard p{font-size:14.5px;}
  /* 168px of dead vertical space per section on a 360px screen */
  .dh section,.dh .app,.dh .stats,.dh .pwa{padding-block:48px;}
  .dh .sec-head{margin-bottom:30px;}
}

/* AUDIT FINDING: ~23 tap targets under 44x44 (cart icon 22x22, hamburger
   40x40 below 390px). Enlarge hit area without moving the visual box. */
@media (max-width:991px){
  .heading-cart-icon,.cart_store,.mobile-search-box-toggler,
  .theme-btn.thum-bar,.heading-links,.dropdown-toggle{
    min-width:44px;min-height:44px;display:inline-flex;align-items:center;justify-content:center;}
  .dh .btn{min-height:48px;}
  .dh .choice{min-height:46px;}
}

/* AUDIT FINDING: dead rules -- .site/.nav came from the standalone mockup and
   match nothing in the rendered markup (the page uses vendor header.heading).
   Neutralised rather than deleted so the diff stays legible. */
/* .site, .nav : intentionally unused on the deployed theme */

/* --- credentials section --- */
.dh .about-grid{display:grid;grid-template-columns:.8fr 1.2fr;gap:48px;align-items:center;}
@media (max-width:900px){.dh .about-grid{grid-template-columns:1fr;gap:28px;}}
.dh .about-photo{border-radius:14px;overflow:hidden;border:1px solid var(--rule);
  box-shadow:var(--sh);aspect-ratio:4/5;max-width:360px;}
@media (max-width:900px){.dh .about-photo{max-width:260px;margin-inline:auto;}}
.dh .about-photo img{width:100%;height:100%;object-fit:cover;object-position:50% 10%;}
.dh .about-role{color:var(--gold-ink);font-weight:700;margin-top:8px;font-size:16px;}
.dh .creds{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin:26px 0 0;padding:0;list-style:none;}
@media (max-width:620px){.dh .creds{grid-template-columns:1fr;}}
.dh .creds li{display:flex;align-items:center;gap:12px;background:var(--card);
  border:1px solid var(--rule);border-inline-start:3px solid var(--gold);
  border-radius:10px;padding:12px 15px;color:var(--ink-2);font-size:14.5px;line-height:1.5;}
.dh .creds .cn{font-size:24px;font-weight:700;color:var(--navy);flex:none;min-width:44px;}
.dh .about-note{margin-top:20px;color:var(--ink-2);max-width:var(--measure);}
:root[data-theme="dark"] .dh .creds li{background:#0F2035!important;border-color:#22354C!important;}
:root[data-theme="dark"] .dh .creds .cn{color:#8FBEF2!important;}

/* ===== end dh arabic ===== */



/* Accessible page title: present in the document outline, not shown. */
.dh-visually-hidden{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
