/* ============================================================================
   OTT Builder store reskin — WHMCS custom.css
   Matches ottbuilder.com (purple→blue, dark purple canvas + glow + grid, glass
   panels, Geist type). Drop-in override for the "twenty-one" system theme +
   "Standard Cart" order form. Presentation ONLY — no markup/billing changes.

   NOTE FOR DEPLOY: selectors below cover the stock twenty-one + standard_cart
   markup and Bootstrap 5 classes WHMCS ships. VERIFY against the live DOM and
   adjust any that differ (the theme/order-form version may rename a few). The
   :root tokens + component looks are the source of truth; re-point selectors as
   needed. Load a Geist (or Inter) webfont in the theme <head> — see deploy notes.
   ========================================================================== */

@import url('https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600;700&family=Inter:wght@400;500;600;700&display=swap');

:root {
  --ob-bg: #060510;
  --ob-text: #f4f6fb;
  --ob-muted: #9aa3ba;
  --ob-muted-2: #6c7590;
  --ob-g1: #7c5cff;
  --ob-g2: #4f9dff;
  --ob-grad: linear-gradient(135deg, #7c5cff 0%, #6d7bff 48%, #4f9dff 100%);
  --ob-brand: #6d7bff;
  --ob-success: #38d178;
  --ob-surface: rgba(255, 255, 255, 0.045);
  --ob-surface-2: rgba(255, 255, 255, 0.07);
  --ob-border: rgba(255, 255, 255, 0.10);
  --ob-border-2: rgba(255, 255, 255, 0.16);
  --ob-r-sm: 10px;
  --ob-r: 14px;
  --ob-glow: 0 18px 55px rgba(108, 99, 255, 0.35);
  --ob-shadow: 0 24px 70px rgba(0, 0, 0, 0.45);
  --ob-font: "Geist", "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
}

/* ------------------------------------------------------------------ Canvas */
body {
  background:
    radial-gradient(1100px 560px at 50% -8%, rgba(124, 92, 255, 0.28), transparent 60%),
    radial-gradient(900px 500px at 85% 8%, rgba(79, 157, 255, 0.14), transparent 55%),
    var(--ob-bg) !important;
  color: var(--ob-text);
  font-family: var(--ob-font);
  -webkit-font-smoothing: antialiased;
  letter-spacing: -0.011em;
}
/* faint grid texture behind everything */
body::before {
  content: "";
  position: fixed; inset: 0; z-index: 0; pointer-events: none;
  background-image:
    linear-gradient(rgba(255,255,255,0.03) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255,255,255,0.03) 1px, transparent 1px);
  background-size: 58px 58px;
  mask-image: radial-gradient(1200px 700px at 50% 0%, #000 0%, transparent 72%);
}
#main-body, .primary-content, main, footer { position: relative; z-index: 1; }
h1, h2, h3, h4, .h1, .h2, .h3 { letter-spacing: -0.025em; color: #fff; }
a { color: var(--ob-brand); }
a:hover { color: #93a7ff; }
.text-muted, .subheader, small { color: var(--ob-muted) !important; }

/* ------------------------------------------------------------------ Header */
#header, header#header {
  background: rgba(6, 5, 16, 0.72) !important;
  backdrop-filter: blur(20px) saturate(140%);
  border-bottom: 1px solid var(--ob-border);
}
#header .navbar, .navbar { background: transparent !important; }
.navbar .nav-link, #main-menu .nav-link, .navbar-nav > li > a {
  color: rgba(244, 246, 251, 0.66) !important; font-weight: 500; border-radius: 9px; transition: .18s;
}
.navbar .nav-link:hover, .navbar-nav > li > a:hover { color: #fff !important; background: var(--ob-surface); }
.navbar-brand { font-weight: 700; color: #fff !important; }
/* logo tile + gradient wordmark, if the brand is text/inline */
#logo a, .navbar-brand { display: inline-flex; align-items: center; gap: 10px; }
/* search box */
#search input, .search input, input[type="search"], #inputEmail {
  background: var(--ob-surface); border: 1px solid var(--ob-border); color: #fff; border-radius: 999px;
}

/* --------------------------------------------------------------- Buttons */
.btn {
  border-radius: var(--ob-r-sm) !important; font-family: var(--ob-font); font-weight: 600;
  letter-spacing: -0.01em; border: 1px solid transparent; transition: .2s;
}
.btn-primary, .btn-success, .btn-info, .btn-checkout, .btn-add-to-cart, #btnCompleteOrder, #checkout, #btnGoToCheckout, .already-registered .btn {
  background: var(--ob-grad) !important; border: 0 !important; color: #fff !important;
  box-shadow: var(--ob-glow);
}
.btn-primary:hover, .btn-success:hover, .btn-info:hover, .btn-checkout:hover, .btn-add-to-cart:hover {
  filter: brightness(1.06); transform: translateY(-1px); box-shadow: 0 22px 60px rgba(108, 99, 255, 0.45);
}
.btn-default, .btn-secondary, .btn-outline-secondary, .btn-light {
  background: var(--ob-surface) !important; color: #fff !important; border: 1px solid var(--ob-border-2) !important;
}
.btn-default:hover, .btn-secondary:hover { background: var(--ob-surface-2) !important; }
.btn-danger, .btn-outline-danger { background: rgba(255,90,90,.14) !important; color: #ff9b9b !important; border: 1px solid rgba(255,90,90,.35) !important; }

/* --------------------------------------------------- Cards / panels (glass) */
.card, .panel, .cart-item, .product, .list-group, .summary-container,
#orderSummary, .order-summary, .sidebar-menu, .clientarea-item {
  background: linear-gradient(160deg, rgba(255,255,255,0.06), rgba(255,255,255,0.02)) !important;
  border: 1px solid var(--ob-border) !important;
  border-radius: var(--ob-r) !important;
  box-shadow: var(--ob-shadow);
  backdrop-filter: blur(14px);
  color: var(--ob-text);
}
.card-header, .panel-heading {
  background: transparent !important; border-bottom: 1px solid var(--ob-border) !important;
  color: var(--ob-muted) !important; font-weight: 600;
}
.card-body, .panel-body { color: var(--ob-text); }

/* sidebar list (categories / actions) */
.list-group-item {
  background: transparent !important; border: 0 !important; color: rgba(244,246,251,0.72) !important;
  border-radius: 9px !important; margin: 2px 6px;
}
.list-group-item:hover { background: var(--ob-surface) !important; color: #fff !important; }
.list-group-item.active, .list-group-item.panel-active {
  background: var(--ob-grad) !important; color: #fff !important; box-shadow: var(--ob-glow);
}

/* --------------------------------------------------- Order form (products) */
#order-standard-cart .product, .product {
  border-radius: var(--ob-r) !important; overflow: hidden;
}
.product .product-info, .product h3, .product h4 { color: #fff; }
.product .price, .product-pricing, .cartTotal, .clearfix .price {
  color: #fff; font-weight: 700;
}
.cycle, .term, .billingcycle { color: var(--ob-muted) !important; font-weight: 500; }

/* ------------------------------------------------------------- Cart table */
.table, table { color: var(--ob-text) !important; }
.table > :not(caption) > * > * { background: transparent !important; border-color: var(--ob-border) !important; }
.table thead th, .table > thead {
  background: transparent !important; color: var(--ob-muted) !important;
  text-transform: uppercase; font-size: 11.5px; letter-spacing: .06em; border-bottom: 1px solid var(--ob-border) !important;
}
.table tbody tr { border-top: 1px solid var(--ob-border); }

/* --------------------------------------------------- Order summary sidebar */
.summary-container, #orderSummary, .order-summary { padding: 4px; }
.summary-container .total-due, .order-summary .total, .totalDue, .total-row {
  color: #fff !important; font-weight: 700;
}
/* the default light/white summary panel → dark glass (handled by .card rule above) */

/* -------------------------------------------------------------- Promo/tabs */
.nav-tabs { border-bottom: 1px solid var(--ob-border); }
.nav-tabs .nav-link { color: var(--ob-muted); border: 0; }
.nav-tabs .nav-link.active { color: #fff; background: var(--ob-surface-2); border-radius: 8px; }

/* ---------------------------------------------------------------- Forms */
.form-control, .form-select, input.form-control, select, textarea {
  background: var(--ob-surface) !important; border: 1px solid var(--ob-border) !important;
  color: #fff !important; border-radius: var(--ob-r-sm) !important;
}
.form-control::placeholder { color: var(--ob-muted-2) !important; }
.form-control:focus, .form-select:focus {
  border-color: var(--ob-brand) !important; box-shadow: 0 0 0 3px rgba(109,123,255,.22) !important; background: var(--ob-surface) !important;
}
label, .control-label { color: var(--ob-muted); }

/* ---------------------------------------------------------------- Footer */
#footer, footer#footer, .footer {
  background: transparent !important; border-top: 1px solid var(--ob-border);
  color: var(--ob-muted) !important;
}
#footer a { color: var(--ob-muted) !important; }
#footer a:hover { color: #fff !important; }

/* ------------------------------------ Final checkout / order form (cart.php?a=checkout)
   Sections: Personal Information · Billing Address · Account Security · Payment Details.
   The stock form is mostly dark already; these fix the light bits + unify it. */

/* section titles ("Personal Information", etc.) — centered label on a hairline */
#checkoutFrm h2, #orderfrm h2, .checkout-billing-details h2, .sectiontitle, .checkout-section-title,
#personalDetails .fieldarea > h2, .fields-container h2 {
  color: #aeb9ff !important; text-transform: uppercase; letter-spacing: .04em;
  font-size: 13px !important; font-weight: 600; text-align: center;
}

/* input-group icon addons WHMCS puts before fields */
.input-group-text, .input-group-addon {
  background: var(--ob-surface) !important; border-color: var(--ob-border) !important; color: var(--ob-muted) !important;
}

/* password-strength meter — was a white bar */
.progress, #inputNewPassword2Msg .progress, .password-strength .progress {
  background: var(--ob-surface) !important; border: 1px solid var(--ob-border); height: 8px; border-radius: 999px;
}
.progress-bar { background: var(--ob-grad) !important; }

/* "Total Due Today" band + the payment area heading */
.total-due-today, #totalDueToday, .checkout-total { color: #fff !important; }

/* Payment method + gateway container: darken the panel WHMCS/PayPal renders the buttons in.
   IMPORTANT: only the WRAPPER — the PayPal "Pay with PayPal" / "Debit or Credit Card"
   buttons are cross-origin PayPal iframes and must NOT be restyled (they stay white, which
   reads fine on the dark panel). Identify the real wrapper id/class on the live page and add
   it here if different. */
#paymentGateway, .payment-methods, #frmCheckout .paymentgateway, .paymentgateway,
#paypalCheckout, .braintree-container, #cardArea, .payment-details-container, .credit-card-input {
  background: transparent !important; border: 0 !important; box-shadow: none !important;
}
/* the grey "Link a New PayPal Account" option row */
.paypal-account-option, .payment-account-option { background: var(--ob-surface) !important; border: 1px solid var(--ob-border) !important; color: var(--ob-text) !important; border-radius: var(--ob-r-sm) !important; }

/* radio for the selected payment method */
.payment-method input[type="radio"], input[type="radio"]:checked { accent-color: var(--ob-brand); }

/* Terms checkbox row + the "secure environment / IP logged" notice */
#checkoutFrm .terms, .checkout-terms { color: var(--ob-muted); }
.order-summary-fraud, .fraud-notice, .secure-notice { background: var(--ob-surface) !important; border: 1px solid var(--ob-border) !important; border-radius: var(--ob-r) !important; color: var(--ob-muted) !important; }

/* --------------------------------------------------------- Misc polish */
hr { border-color: var(--ob-border) !important; opacity: 1; }
.badge, .label { border-radius: 999px; }
.alert-success { background: rgba(56,209,120,.12); border: 1px solid rgba(56,209,120,.3); color: #a7f0c4; }
.alert { border-radius: var(--ob-r); }
::selection { background: rgba(124, 92, 255, 0.32); color: #fff; }

/* ============================================================================
   LIVE-DOM FIXES — ottbuilder-store child theme.
   Targets the classes the store ACTUALLY renders (confirmed from the live DOM) and
   sweeps the remaining white/blue patches. Placed last so it wins the cascade;
   every value reuses the :root tokens above. If a spot is still light, inspect its
   real class on the live page and add it here — keep the tokens, only re-point.
   ========================================================================== */

/* confirmed-real selectors on the live store */
.card-sidebar, .order-summary, #orderSummary {
  background: linear-gradient(160deg, rgba(255,255,255,0.06), rgba(255,255,255,0.02)) !important;
  border: 1px solid var(--ob-border) !important; border-radius: var(--ob-r) !important;
  color: var(--ob-text) !important; box-shadow: var(--ob-shadow);
}
.field-icon, .input-group .field-icon { color: var(--ob-muted) !important; background: transparent !important; }

/* 1) breadcrumb / "Shopping Cart" strip — was a full-width WHITE bar */
.breadcrumb, .breadcrumbs, #order-standard-cart .breadcrumb, .page-header, .primary-content > .breadcrumb,
.shopping-cart-title, .cart-header, .steps-container, .breadcrumb-bar, .cart-breadcrumb {
  background: transparent !important; border: 0 !important; color: var(--ob-muted) !important;
}

/* 2) product-card WHITE header — force card + header dark */
.product, .product .card, .card, .panel {
  background: linear-gradient(160deg, rgba(255,255,255,0.06), rgba(255,255,255,0.02)) !important;
}
.card-header, .panel-heading, .product .card-header, .product-header, .product-title,
.card > .card-header, .panel > .panel-heading, .item-header, .productcart .card-header {
  background: transparent !important; color: #fff !important; border-bottom: 1px solid var(--ob-border) !important;
}

/* 3) Review & Checkout table — BLUE header + WHITE rows */
.table, .table > thead, .table > tbody, .table > thead > tr, .table > tbody > tr,
.table th, .table td, table.cart, #productsCart, .cart-table {
  background: transparent !important; color: var(--ob-text) !important; border-color: var(--ob-border) !important;
}
.table > thead > tr > th, .table thead th, .cart-header-row, thead.table-dark, thead.thead-primary, .table-primary {
  background: transparent !important; color: var(--ob-muted) !important;
  text-transform: uppercase; font-size: 11.5px; letter-spacing: .06em; border-bottom: 1px solid var(--ob-border) !important;
}

/* 4) Order Summary inner white bits */
.order-summary .panel-body, .order-summary .card-body, #orderSummary .panel-body, .summary-body,
.total-container, .order-summary-container, .order-summary .list-group-item {
  background: transparent !important; color: var(--ob-text) !important;
}

/* 5) "Already Registered?" — was TEAL */
#btnLoginCheckout, .existing-customer .btn, .already-registered .btn, a.btn[href*="login"],
.login-link .btn, #loginLink, .btn-info {
  background: var(--ob-grad) !important; color: #fff !important; border: 0 !important; box-shadow: var(--ob-glow);
}

/* 6) PayPal payment panel — the big WHITE box is the WHMCS/SDK WRAPPER div (same
   origin) → safe to make transparent. The "Pay with PayPal" / "Debit or Credit Card"
   buttons INSIDE are cross-origin PayPal iframes and are NOT touched here — they stay
   white and read fine on the dark panel (as in the approved mockup). */
#paypal_ppcpv_input_container, .paypal-container, #paymentGateway, .payment-gateway-container,
.gateway-container, .credit-card-input, #ppplusDccContainer, .payment-methods-container {
  background: transparent !important; border: 0 !important; box-shadow: none !important;
}
#paypal_ppcpv_input_container .paypal-account, .payment-account-option, .paypal-account-option {
  background: var(--ob-surface) !important; color: var(--ob-text) !important; border: 1px solid var(--ob-border) !important;
}

/* header polish (scoped to the store theme, so harmless): glassy top bar */
#header, header.header, .navbar, #top-menu, .header-lined {
  background: rgba(6,5,16,0.72) !important; backdrop-filter: blur(20px) saturate(140%);
  border-bottom: 1px solid var(--ob-border);
}

/* ============================================================================
   CONFIRMED-DOM FIXES — verified live in the browser against the ottbuilder-store
   child theme. These are the EXACT classes the store renders; they replace the
   best-guess selectors above for the six problem spots. Live-tested (inject +
   screenshot) on the storefront, cart, and checkout.
   ========================================================================== */

/* breadcrumb strip (was a light-gray bar rgb(233,236,239)) */
.master-breadcrumb { background: transparent !important; border: 0 !important; box-shadow: none !important; }
.master-breadcrumb, .master-breadcrumb a, .master-breadcrumb li, .master-breadcrumb .active { color: var(--ob-muted) !important; }

/* storefront product card = div.product.clearfix; its title is a bare <header> (was white) */
.product > header, .product header { background: transparent !important; color: #fff !important; border-bottom: 1px solid var(--ob-border) !important; }

/* Review & Checkout: blue "Product/Options" header bar (was rgb(0,85,136)) */
.view-cart-items-header { background: transparent !important; color: var(--ob-muted) !important; border-bottom: 1px solid var(--ob-border) !important; text-transform: uppercase; letter-spacing: .05em; }

/* Order Summary box is .summary-container (the inner .order-summary was already dark) */
.summary-container {
  background: linear-gradient(160deg, rgba(255,255,255,0.06), rgba(255,255,255,0.02)) !important;
  border: 1px solid var(--ob-border) !important; border-radius: var(--ob-r) !important;
  color: var(--ob-text) !important; box-shadow: var(--ob-shadow);
}
.summary-container h1, .summary-container h2, .summary-container h3,
.summary-container span, .summary-container div, .summary-container td { color: var(--ob-text) !important; }

/* promo / taxes tabs (active tab + panel were white) */
.tab-content { background: transparent !important; border-color: var(--ob-border) !important; }
.nav-tabs { border-bottom: 1px solid var(--ob-border) !important; }
.nav-link.active { background: var(--ob-surface-2) !important; color: #fff !important; }

/* final-checkout PayPal wrapper (kept from LIVE-DOM FIXES): darken the same-origin
   wrapper only; the Pay-with-PayPal / card buttons inside are cross-origin iframes. */
#paypal_ppcpv_input_container, .paypal-container, .payment-details-container { background: transparent !important; }

/* ============================================================================
   FLOW-WALK FIXES — verified by walking the FULL buy flow live in the browser
   (storefront → Configure → cart → Checkout). Exact classes read off the live DOM.
   ========================================================================== */

/* storefront + config: product TITLE is a bare <span> colored #333 (unreadable) */
.product > header, .product > header *, .product-info h1, .product-info h2, .product-info h3 { color: #fff !important; }
.product > header { font-weight: 600 !important; }

/* storefront: product DESCRIPTION was full-bright white (harsh) → soft/muted, bold = near-white */
.product-desc, .product-desc * { color: var(--ob-muted) !important; }
.product-desc strong, .product-desc b { color: rgba(255,255,255,0.9) !important; font-weight: 600 !important; }

/* Configure page: the big WHITE product summary box (.product-info rgb(248,248,248)) */
.product-info {
  background: linear-gradient(160deg, rgba(255,255,255,0.06), rgba(255,255,255,0.02)) !important;
  border: 1px solid var(--ob-border) !important; border-radius: var(--ob-r) !important;
  color: var(--ob-text) !important; box-shadow: var(--ob-shadow);
}
.product-info, .product-info * { color: var(--ob-text) !important; }

/* theme "primary background" utility — light-gray pills behind section-header labels
   ("Personal Information", "Additional Information", "Payment Details", …).
   CRITICAL: <body> ALSO carries class .primary-bg-color, so this MUST exclude body —
   otherwise it overrides `body{background:radial-gradient !important}` (0,1,0 beats 0,0,1)
   and the whole dark canvas collapses to white. :not(body) keeps the canvas, fixes the pills. */
.primary-bg-color:not(body) { background: transparent !important; color: #aeb9ff !important; }
/* section titles sit centered ON a .sub-heading top-border rule → the line runs THROUGH the
   text (reads like strikethrough). Give the label a solid canvas-colored chip + side padding so
   the divider breaks cleanly around it. Higher specificity + !important beats the transparent
   rule above; also covers the collapsed "Existing Customer Login" heading. */
.sub-heading > .primary-bg-color, .sub-heading .primary-bg-color {
  background: var(--ob-bg) !important; padding: 0 18px !important; color: #aeb9ff !important;
}

/* yellow warning alerts (Configure "Have questions?" + checkout "secure environment / IP logged") */
.alert-warning, .alert.alert-warning, .checkout-security-msg {
  background: rgba(242,181,68,0.10) !important; border: 1px solid rgba(242,181,68,0.30) !important; color: #e9c98a !important;
}
.alert-warning a, .alert-warning b, .alert-warning strong, .checkout-security-msg b { color: #ffd98a !important; }

/* checkout: the WHITE PayPal / credit-card panel is #creditCardInputFields.cc-input-container.
   Darken the WRAPPER only — the "Pay with PayPal" / "Debit or Credit Card" buttons inside are
   cross-origin PayPal iframes (untouched); they read fine on the dark panel. */
#creditCardInputFields, .cc-input-container {
  background: linear-gradient(160deg, rgba(255,255,255,0.05), rgba(255,255,255,0.02)) !important;
  border: 1px solid var(--ob-border) !important; border-radius: var(--ob-r) !important; box-shadow: none !important;
}
/* the light-gray "Link a New PayPal Account" option row */
.cc-input-container ul.selected, ul.selected, .payment-account-option {
  background: var(--ob-surface) !important; border: 1px solid var(--ob-border) !important; color: var(--ob-text) !important;
}

/* View Cart / Review & Checkout: each cart line-item is `div.view-cart-items > div.item`
   and renders SOLID WHITE (rgb(255,255,255)) with near-invisible text. Make it a dark glass
   card (matching the Order Summary), force its text light, keep links brand-blue. Scoped to
   `.view-cart-items .item` so the generic `.item` class is not touched elsewhere. */
.view-cart-items .item {
  background: linear-gradient(160deg, rgba(255,255,255,0.06), rgba(255,255,255,0.02)) !important;
  border: 1px solid var(--ob-border) !important; border-radius: var(--ob-r) !important;
  box-shadow: var(--ob-shadow) !important; margin-bottom: 12px !important;
}
.view-cart-items .item, .view-cart-items .item td, .view-cart-items .item th, .view-cart-items .item span,
.view-cart-items .item div, .view-cart-items .item p, .view-cart-items .item h1, .view-cart-items .item h2,
.view-cart-items .item h3, .view-cart-items .item h4, .view-cart-items .item label { color: var(--ob-text) !important; }
.view-cart-items .item a { color: #8ea2ff !important; }
/* cart line-item name → crisp white */
.view-cart-items-title, .item-title, .cart-item-name, #viewCartTmpl .title, .view-cart-item .title { color: #fff !important; }

/* ------------------------------------------------------- Modals (2026-07-12)
   Owner-reported bug: the cart's "remove item" confirmation opened as an
   unstyled grey box (invisible text/buttons — looked frozen). The reskin never
   themed Bootstrap modals; WHMCS standard_cart uses them for remove/empty-cart
   confirms. Theme them like the site's glass panels, and keep the full-page
   ajax overlay legible on the dark canvas. */
/* ROOT CAUSE (proven live 2026-07-12, elementsFromPoint): WHMCS renders these
   modals INSIDE `.primary-content`, and this reskin gives `.primary-content`
   `position:relative; z-index:1` (for the grid-texture layering above). That
   traps the modal's z-index inside a z:1 stacking context, so Bootstrap's
   body-level `.modal-backdrop` (z 1040) sits ABOVE the entire modal — eating
   every click ("frozen" dialog) and, in Safari's paint order, dimming the modal
   itself. z-index on .modal cannot escape the trap, so: remove the backdrop
   entirely and let the full-viewport .modal root paint its own scrim. Dismissal
   is unaffected — Bootstrap listens for outside-clicks on .modal, not the
   backdrop div. Verified on the live store: real click on Yes removes the item,
   modal closes, no stuck scrim. */
.modal { z-index: 1055 !important; background: rgba(0, 0, 0, 0.65) !important; }
.modal-backdrop { display: none !important; }
.modal-content {
  background: linear-gradient(160deg, #16151f, #0d0c16) !important;
  color: var(--ob-text) !important;
  border: 1px solid var(--ob-border-2) !important;
  border-radius: var(--ob-r) !important;
  box-shadow: var(--ob-shadow) !important;
}
.modal-header, .modal-footer { border-color: var(--ob-border) !important; }
.modal-title, .modal-content h1, .modal-content h2, .modal-content h3,
.modal-content h4, .modal-content h5 { color: #fff !important; }
.modal-body, .modal-body p, .modal-body div, .modal-body span, .modal-body label {
  color: var(--ob-text) !important;
}
/* close ✕ (Bootstrap 4 .close and 5 .btn-close variants) */
.modal .close { color: #fff !important; opacity: 0.75; text-shadow: none !important; }
.modal .close:hover { opacity: 1; }
.modal .btn-close { filter: invert(1) grayscale(100%) brightness(1.6); opacity: 0.8; }
/* confirm/cancel buttons inside any modal */
.modal .btn-primary, .modal .btn-danger, .modal .btn-confirm {
  background: var(--ob-grad) !important; border: 0 !important; color: #fff !important;
  border-radius: var(--ob-r-sm) !important; box-shadow: var(--ob-glow) !important;
}
.modal .btn-default, .modal .btn-secondary, .modal .btn-cancel {
  background: var(--ob-surface-2) !important; border: 1px solid var(--ob-border-2) !important;
  color: var(--ob-text) !important; border-radius: var(--ob-r-sm) !important;
}
/* WHMCS full-page ajax overlay (shows while the cart updates): keep it on-brand
   and clearly "working", never a grey void. */
#fullpage-overlay {
  background: rgba(6, 5, 16, 0.82) !important; color: #fff !important;
}
#fullpage-overlay .msg, #fullpage-overlay p { color: #fff !important; }

/* ---------------------------------------------- Product cards (2026-10-24)
   Descriptions are one line of HTML: .ob-pitch + ul.ob-feats (ticked list). */
.product-desc .ob-pitch { display: block; color: #fff !important; font-size: 15px; font-weight: 600 !important; line-height: 1.45; margin: 0 0 12px; }
.product-desc ul.ob-feats { list-style: none !important; padding: 0 !important; margin: 0 !important; }
.product-desc ul.ob-feats li { position: relative; padding: 0 0 0 24px !important; margin: 0 0 7px !important; line-height: 1.45; font-size: 14px; border: 0 !important; background: none !important; }
.product-desc ul.ob-feats li::before { content: ""; position: absolute; left: 0; top: 3px; width: 15px; height: 15px; border-radius: 50%; background: var(--ob-grad); }
.product-desc ul.ob-feats li::after { content: ""; position: absolute; left: 5px; top: 6px; width: 4px; height: 7px; border: solid #fff; border-width: 0 2px 2px 0; transform: rotate(45deg); }

/* ------------------------------- OTT Apps cards (orderform ottbuilder_cart, 2026-10-24)
   One card per platform: device art, pitch + ticks, One-time / Yearly switch. */
.ob-products .ob-card { display: flex; flex-direction: column; height: calc(100% - 20px); }
.ob-products .ob-card > header { text-align: left; }
.ob-products .ob-device { padding: 18px 16px 4px; text-align: center; }
.ob-products .ob-device img { width: 100%; max-width: 300px; height: auto; display: inline-block; }
.ob-products .ob-card .product-desc.ob-desc { float: none !important; width: auto !important; padding: 12px 20px 4px !important; flex: 1 1 auto; }
.ob-products .ob-card footer.ob-foot { float: none !important; width: auto !important; padding: 14px 20px 20px !important; margin: 0 !important; border-top: 1px solid var(--ob-border); display: flex; flex-direction: column; gap: 12px; text-align: left !important; background: transparent !important; }
.ob-products .ob-switch { display: inline-flex; align-self: flex-start; padding: 3px; border-radius: 999px; background: var(--ob-surface-2); border: 1px solid var(--ob-border); }
.ob-products .ob-switch button { border: 0; background: transparent; color: var(--ob-muted); font-size: 13px; font-weight: 600; padding: 6px 14px; border-radius: 999px; cursor: pointer; }
.ob-products .ob-switch button[aria-pressed="true"] { background: var(--ob-grad); color: #fff; }
.ob-products .ob-plan { display: none; align-items: center; justify-content: space-between; gap: 12px; }
.ob-products .ob-card[data-plan="once"] .ob-plan[data-plan-for="once"],
.ob-products .ob-card[data-plan="yearly"] .ob-plan[data-plan-for="yearly"] { display: flex; }
.ob-products .ob-plan .product-pricing { float: none !important; width: auto !important; margin: 0 !important; text-align: left !important; display: flex; flex-direction: column; line-height: 1.2; }
.ob-products .ob-plan .price { font-size: 22px; color: #fff; }
.ob-products .ob-cycle { font-size: 12px; color: var(--ob-muted); font-weight: 500; }
.ob-products .ob-plan .btn-order-now { margin: 0 !important; white-space: nowrap; }
