/* Cart-mode page CSS — VERBATIM port of production templates/unlimited/css/custom.css
   (the client theme the live unlimited_cart_v2 cart renders under). Loaded by
   includes/cart-head.tpl INSTEAD OF custom.css on cart pages, so the cart
   gets the exact live cascade: twenty-one base + this file + standard_cart
   + the order-form theme css. Do not brand-tweak here; fidelity first. */
/* fonts */

@font-face {
	font-family: 'Nunito Sans';
	font-style: normal;
	font-weight: 400;
	font-display: swap;
	src: url(../../../../assets/webfonts/pe0qMImSLYBIv1o4X1M8cce9I9tAcVwo.woff2) format('woff2');
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
	font-family: 'Nunito Sans';
	font-style: normal;
	font-weight: 700;
	font-display: swap;
	src: url(../../../../assets/webfonts/pe03MImSLYBIv1o4X1M8cc8GBs5tU1ECVZl_.woff2) format('woff2');
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* branding */

:root {
    --app-font-family: 'Nunito Sans', sans-serif;
    --app-nav-background: #181818;
    --app-nav-left-wide-width: 320px;
    --app-link-color: #0056b3;
    --app-brand-gradient-left: #003f88;
    --app-brand-gradient-right: #002260;
    --app-brand-background-color: #2E3192;
    --xxl-container-width: 1500px; /* OWNER DELTA from the live 1400px port:
        match the main site / client area container width so the cart no
        longer renders narrower than every other surface (2026-07-18) */
    --bg-grey: #f4f6f9;
}

/* application */

html {
	scroll-behavior: smooth;
}

body {
	font-family: var(--app-font-family) !important;
	font-weight: 400;
	line-height: 1.5;
	font-size: clamp(1rem, 1.6vw, 1.125rem);
    overflow-x: hidden;
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}

a, a:hover, .btn-link {
    color: var(--app-link-color);
}

.bg-grey {
    background-color: var(--bg-grey);
}

/* xxl devices (large desktops, 1440px and up) */

@media (min-width: 1440px) {
	.container {
	max-width: var(--xxl-container-width) !important;
	}
}

.brand-gradient {
    background-image: radial-gradient(50% 100.00% at 50% -0.05%, var(--app-brand-gradient-left) 0, var(--app-brand-gradient-right) 100%);
}

.app-nav, .main-nav {
    background-color: var(--app-nav-background);
}

.main-top .nav-icon, .main-nav .nav-icon {
    display: inline-flex;
    align-self: center;
    font-size: 1em;
}

    .main-top .nav-icon svg, .main-nav .nav-icon {
        height: 1em;
        width: 1em;
        fill: currentColor;
        position: relative;
        top: .125em;
    }

.main-nav .nav-item, .main-top .nav-item {
    font-size: 0.875rem;
}

/* large devices (desktops, 992px and up) */
@media (min-width: 992px) {
    
    /* sidebar navigation */
    .app-nav {
        position: fixed;
        top: 0;
        bottom: 0;
        left: 0;
        z-index: 1004;
        display: flex;
        flex-direction: column;
        width: var(--app-nav-left-wide-width);
        padding: 1.5rem;
        overflow-y: scroll;
        overflow-x: hidden;
    }

        .app-nav.navbar-expand-lg .navbar-nav {
            display: flex;
            flex-direction: column;
            height: 100%;
        }

        .app-nav.navbar-expand-lg .navbar-collapse {
            width: 100%;
            margin-top: 1.5rem;
        }

        .app-nav .navbar-brand img {
            width: 169px;
            height: 45px;
        }

        .app-nav .nav-item, .app-nav .dropdown-item {
            margin: 0.5rem 0rem;
        }
        
            .app-nav .nav-item a {
                color: #fff !important;
                text-transform: uppercase;
                font-weight: 700;
            }

        .app-nav .nav-item span {
            vertical-align: middle;
        }

        .app-nav .nav-icon {
            display: inline-flex;
            align-self: center;
            font-size: 1em;
        }

            .app-nav .nav-icon svg {
                height: 22px;
                width: 22px;
                fill: currentColor;
		        position: relative;
            }

        .app-nav .dropdown-item {
            font-size: 0.9rem !important;
        }

            .app-nav .dropdown-item .nav-icon svg {
                width: 1em !important;
                height: 1em !important;
                top: -0.130em;
            }

        .app-nav .nav-text {
            max-width: 100%;
            white-space: normal;
            overflow: hidden;
            text-overflow: ellipsis;
        }

        .app-nav .dropdown-menu {
            border-radius: 0;
            border: 0;
            background: transparent;
            overflow: hidden;
            width: 100%;
            margin-left: 24px; /* size of main nav icons */
        }
    
       .app-nav .dropdown-menu.show {
            display: block;
            position: static;
        }

        .app-nav .dropdown-item:focus, .app-nav .dropdown-item:hover {
            background: transparent;
        }

    /* main application */

    .app-main {
        position: relative;
        margin-left: var(--app-nav-left-wide-width);
        flex: 1 0 auto;
        display: flex;
        flex-direction: column;
    }
}

/* footer */

.cart-footer {
    background-color: var(--app-nav-background);
}

.cart-footer hr {
    background: linear-gradient(to right, rgba(255,255,255,0.1), rgba(255,255,255,0.5), rgba(255,255,255,0.1));
    height: 1px;
}

/* whmcs overrides */

.breadcrumb {
    background-color: transparent;
}

.card {
    margin-bottom: 1.4rem !important;
}

.card .card-header h3.card-title {
    font-weight: 700 !important;
    font-size: 1.1rem;
}

.card .card-header {
    border-bottom: 1px solid rgba(0,0,0,.125);
    background-color: var(--light);
}

.card .card-body, .client-home-cards .list-group .list-group-item {
    padding: 1rem;
}

.tiles .tile, .tiles .tile:hover {
    background-color: var(--white);
    border: 1px solid rgba(0,0,0,.125) !important;
    border-radius: 0.25rem;
    text-align: center;
    padding: 2rem;
    margin-bottom: 1.4rem;
}

.tiles .tile .highlight {
    display: none;
}

.tiles .tile i, .tiles .tile:hover i {
    position: absolute;
    top: 10px;
    right: 20px;
    font-size: 1rem;
    line-height: 1;
    color: #ccc;
}

.tiles .tile .title {
    font-weight: 700;
    color: #212529;
    font-size: 1rem;
    margin-top: 1rem;
}

.verification-banner {
    border-radius: 0.25rem;
    margin-bottom: 1.2rem !important;
}

/* responsive client table fix for whmcs */

.table-container {
    display: block !important;
    width: 100% !important;
    overflow-x: auto !important;
    -webkit-overflow-scrolling: touch !important;
}

/* recaptcha zindex fix */

.grecaptcha-badge {
	z-index: 2000;
}

/* carousel fix */

.upsell-carousel-caption {
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    margin: auto;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    max-width: 80%;
}

/* disable SSL checks */

#tableServicesList [data-type="service"], #tableServicesList .sorting_disabled, #tableDomainsList [data-type="domain"], #tableDomainsList .sorting_disabled:nth-child(2) {
	display: none;
}

/* module-client-area-hosting (plesk button) */

.module-client-area-hosting input[type=submit] {
    color: #fff;
    display: inline-block;
    font-weight: 400;
    text-align: center;
    vertical-align: middle;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
    background-color: #28a745;
    border: 1px solid #28a745;
    padding: .375rem .75rem;
    font-size: 1rem;
    line-height: 1.5;
    border-radius: .25rem;
    transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;
}

.module-client-area-hosting input[type=submit]:active, .module-client-area-hosting input[type=submit]:focus {
	box-shadow: 0 0 0 0.2rem rgba(72,180,97,.5);
}

/* fix datatables */
.dataTables_wrapper table.table-list thead th {
    font-weight: 700;
}

/* remove default styles from main-content */

.main-content {
    margin: 0;
    min-height: auto;
}

/* rounded-xxl */

.rounded-xxl {
    border-radius: 15px;
}

.rounded-left-xxl {
	border-top-left-radius: 15px !important;
	border-bottom-left-radius: 15px !important;
}

.rounded-right-xxl {
	border-top-right-radius: 15px !important;
	border-bottom-right-radius: 15px !important;
}

.rounded-top-xxl {
	border-top-left-radius: 15px !important;
	border-top-right-radius: 15px !important;
}

.rounded-bottom-xxl {
	border-bottom-left-radius: 15px !important;
	border-bottom-right-radius: 15px !important;
}

/* disable sitejet */

#cPanelGetSitejet, #pleskGetSitejet {
    display: none;
}

/* ==== uwx-cartsteps — order-progress indicator ====
   Owner-approved 2026-07-19 addition (NOT part of the verbatim
   unlimited/custom.css port above; see .meta/plans/cart_stage_wizard.md).
   Renders only via includes/cart-steps.tpl in cart mode. Bootstrap-native
   palette so it sits inside live's cart language: success green for done,
   body ink for current, muted grey for upcoming. */

.uwx-cartsteps {
    margin: 0 0 1.75rem;
}

.uwx-cartsteps__list {
    list-style: none;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    margin: 0;
    padding: 0;
}

.uwx-cartsteps__step {
    display: flex;
    align-items: center;
    font-size: 14px;
    font-weight: 700;
    color: #6c757d;
}

.uwx-cartsteps__step + .uwx-cartsteps__step::before {
    content: "";
    width: 28px;
    height: 2px;
    background: #dee2e6;
    margin: 0 10px;
}

.uwx-cartsteps__dot {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 26px;
    height: 26px;
    border-radius: 50%;
    background: #fff;
    border: 2px solid #dee2e6;
    font-size: 13px;
    line-height: 1;
    margin-right: 8px;
    flex: 0 0 auto;
}

.uwx-cartsteps__step--current {
    color: #212529;
}

.uwx-cartsteps__step--current .uwx-cartsteps__dot {
    background: #212529;
    border-color: #212529;
    color: #fff;
}

.uwx-cartsteps__step--done .uwx-cartsteps__dot {
    background: #28a745;
    border-color: #28a745;
    color: #fff;
}

.uwx-cartsteps__step--done .uwx-cartsteps__dot::before {
    content: "\2713";
}

.uwx-cartsteps__link {
    display: flex;
    align-items: center;
    color: inherit;
    text-decoration: none;
}

.uwx-cartsteps__link:hover .uwx-cartsteps__label,
.uwx-cartsteps__link:focus .uwx-cartsteps__label {
    color: #0056b8;
    text-decoration: underline;
}

/* Small screens: the current label stays, other labels drop (dots + the
   connectors keep the shape); connectors shorten. */
@media (max-width: 575.98px) {
    .uwx-cartsteps__step:not(.uwx-cartsteps__step--current) .uwx-cartsteps__label {
        position: absolute;
        width: 1px;
        height: 1px;
        margin: -1px;
        overflow: hidden;
        clip: rect(0, 0, 0, 0);
        white-space: nowrap;
    }
    .uwx-cartsteps__step + .uwx-cartsteps__step::before {
        width: 14px;
        margin: 0 6px;
    }
    .uwx-cartsteps__dot {
        margin-right: 0;
    }
    .uwx-cartsteps__step--current .uwx-cartsteps__dot {
        margin-right: 8px;
    }
}


/* ---------------------------------------------------------------------------
   autoAdd: hide stock's ENTIRE domain-results area while our status card runs

   Arriving at the domain step with ?autoAdd=1 replaces the search bar with an
   "Adding to your basket..." card (unlimited-next-cart/domainregister.tpl) and
   clicks the add button for the visitor. Everything stock renders underneath —
   its lookup loaders, the "<domain> is available / Register for £X per year"
   panel, the add button and the spotlight/suggestion TLD grid — is chrome for a
   decision the visitor already made on the marketing site, and it is thrown away
   a second or two later when we navigate to a=confdomains.

   History, because it explains the shape of this rule (operator reports
   2026-08-10 and 2026-08-11): two narrower versions of this rule targeted first
   .domain-lookup-loader and then .btn-add-to-cart span.loading. Both hid real
   spinners; neither was enough, and the second left the add button rendering as
   an EMPTY green box (stock hides span.to-add, we hid span.loading, so nothing
   was left in it). Browser E2E showed the visitor sitting for ~4s in front of
   our spinner card stacked on a full stock result panel. One rule over the
   container replaces both — every loader (4/4) and every span.loading (4/4) is
   a descendant of #DomainSearchResults, verified in-browser.

   WHY visibility + height, and NOT display:none. The auto-add poll reads
   '.domain-available:visible', and the give-up branch reads
   'span.unavailable:visible' inside the button; jQuery ':visible' means "has
   layout boxes", so display:none blinds both and the visitor is stranded on the
   10s timeout instead of the immediate, explained fallback. visibility:hidden
   PRESERVES layout boxes, so every poll input is untouched. Measured on dev21
   2026-08-11 with the panel showing: normal and visibility:hidden both report
   available=1; display:none reports available=0 — the trap, demonstrated.
   height:0 + overflow:hidden then collapses the 751px gap visibility alone
   leaves (page 1093px -> 800px) while still reporting available=1.

   The search bar is NOT inside this container (verified), so it stays under
   domainregister.tpl's own control. handBack() removes the class the moment
   auto-add gives up, restoring the whole panel for a manual search — which is
   exactly what that fallback message tells the visitor to do.

   SECOND CONSUMER (2026-08-14): configureproductdomain.tpl's spinner adapter
   (unlimited-next-cart/js/uwx-spinner.js) sets the same class during its
   one-click "Register" flow — same container id on that template, same
   poll-through-visibility requirement. Its recovery contract DIFFERS from the
   paragraph above, deliberately: before stock's Continue is dispatched it
   hands back exactly like domainregister.tpl (class off, panel restored);
   after dispatch it never removes the class or re-enables a submission path,
   because stock's addproductajax POST may already have committed the item and
   a restored Continue would double-add. Change the rule's mechanism only with
   both call sites in view.
   --------------------------------------------------------------------------- */
body.uwh-autoadding #DomainSearchResults {
    visibility: hidden;
    height: 0;
    overflow: hidden;
}

/* ---------------------------------------------------------------------------
   Store navigation rail (uwx-store-categories.tpl — the browsing pages:
   products, addons, domain/service renewals, domain transfer; scope widened
   from products-only 2026-08-14, owner request)

   Restores the category navigation stock puts on every cart page and this fork
   has never had — without it a visitor landing on a product group can see that
   group and nothing else. The payment funnel stays excluded on purpose.

   STYLED AS NAVIGATION, NOT AS PROSE LINKS (operator feedback 2026-08-11: the
   first cut used blue anchors with hover underlines and "didn't feel like our
   style" — correctly). house_style's link blue + hover underline governs
   ANCHORS IN PROSE; this console's navigation is body ink with an ink-black
   active state, and the dashboard's own sidebar rows carry a comment saying
   their colour is deliberately left as body ink. This mirrors those rows:
   .uwx-morepanels .sidebar .list-group-item metrics (15px, 14px 20px), the
   12px/700/uppercase/.08em muted panel label with no divider under it, hairline
   separators, and muted 13.5px icons at a 10px gutter.

   Colours are literals because the cart cascade loads this sheet INSTEAD of
   custom.css, so the --uwx-* tokens are not defined here: #212529 body ink,
   #181818 ink, #6c757d muted, #e8eaef border, #f0f1f4 soft border. Keep in
   step with custom.css if those move.
   --------------------------------------------------------------------------- */
.uwx-storenav__panel {
    background: #fff;
    border: 1px solid #e8eaef;
    border-radius: 15px;
    box-shadow: 0 1px 2px rgba(24, 24, 24, .04);
    margin-bottom: 20px;
    overflow: hidden;
}

.uwx-storenav__head {
    font-size: 12px;
    font-weight: 700;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: #6c757d;
    padding: 14px 20px 0;
}

.uwx-storenav__body {
    padding: 10px 20px 14px;
}

.uwx-storenav__list {
    list-style: none;
    margin: 14px 0 0;
    padding: 0;
}

/* Every row separated, including the first — the panel label deliberately has
   no divider beneath it, exactly as the dashboard panels are treated. */
.uwx-storenav__item {
    margin: 0;
    border-top: 1px solid #f0f1f4;
}

.uwx-storenav__link {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 14px 20px;
    font-size: 15px;
    line-height: 1.35;
    color: #212529;
    text-decoration: none;
}

/* No colour change and no underline on hover: this is a destination list, so
   the affordance is the row lighting up, not the text changing character. */
a.uwx-storenav__link:hover,
a.uwx-storenav__link:focus {
    color: #181818;
    text-decoration: none;
    background: var(--bg-grey);
}

/* Where you are. Ink, never the CTA green — green is for actions and good news
   only. The left bar carries the state in FORM as well as colour. */
.uwx-storenav__link.is-current {
    color: #181818;
    font-weight: 700;
    text-decoration: none;
    box-shadow: inset 3px 0 0 #181818;
    background: var(--bg-grey);
}

.uwx-storenav__link--static {
    color: #6c757d;
    cursor: default;
}

/* Icon supports the label rather than competing with it. */
.uwx-storenav__link > i {
    flex: 0 0 auto;
    font-size: 13.5px;
    color: #6c757d;
    line-height: 1;
}

.uwx-storenav__badge {
    margin-left: auto;
    font-size: 12px;
    color: #6c757d;
}

/* Stacked below lg the rail sits above the products, as stock does on this
   page. Cap its height so a long category list cannot push the products off
   a phone screen entirely. */
@media (max-width: 991.98px) {
    .uwx-storelayout__nav .uwx-storenav__list {
        max-height: 15rem;
        overflow-y: auto;
    }
}

/* Equal-height product cards in the store grid.

   products.tpl marks its rows .row-eq-height, but that class is defined in NO
   sheet in the cart cascade (checked: cart-page.css, theme.min.css, the order
   form's custom.css) — it is dead stock markup and the cards have never
   actually been equalised. It went unnoticed while the grid was full-width,
   because titles fitted on one line; adding the nav rail narrowed the column,
   titles began wrapping, and the ragged card bottoms became obvious.

   Fixed by letting the card fill its column rather than by chasing heights:
   Bootstrap rows already stretch columns to equal height, so making the column
   a flex parent and the card grow is enough. Margin-agnostic on purpose — the
   ported .card rule carries a !important margin-bottom, and a calc() against
   it would rot the moment that value changed. Scoped to the store grid so the
   rest of the cart is untouched. */
.uwx-storelayout__main .products .row > [class*="col-"] {
    display: flex;
}

.uwx-storelayout__main .products .row > [class*="col-"] > .card {
    flex: 1 1 auto;
}
