/* =========================================================================
   components.css  -  Storefront view components + design tokens
   -------------------------------------------------------------------------
   Global stylesheet consumed by Razor views under Store/Views/. Wired into
   the active theme only (theme-MV-2026) via
   templates/parts/full-header.html.

   Owns the token vocabulary (:root). content-blocks.css inherits these
   tokens; do not redeclare them there.

   Class prefix: sf-*  (so we never collide with the existing theme
   styles.css, system.css, or marocdata.js selectors).

   See docs/storefront-css-plan.md sections 4.A and 4.1.
   ========================================================================= */


/* -------------------------------------------------------------------------
   1. TOKENS
   ------------------------------------------------------------------------- */
:root {
    /* ---- Layout ---------------------------------------------------- */
    --site-max-width:    1430px;   /* matches in-flight shell work cap */
    --content-max-width: 1170px;
    --gutter:            15px;
    --border-radius:     5px;
    --radius-sm:         3px;

    /* ---- Spacing (4 px scale) ------------------------------------- */
    --space-1:  4px;
    --space-2:  8px;
    --space-3:  12px;
    --space-4:  16px;
    --space-5:  20px;
    --space-6:  24px;
    --space-8:  32px;
    --space-10: 40px;

    /* ---- Typography ----------------------------------------------- */
    --font-xs: 11px;   /* body baseline today (legacy table chrome)   */
    --font-sm: 12px;
    --font-md: 13px;   /* current main-content baseline               */
    --font-lg: 16px;
    --font-xl: 20px;
    --font-family-base: Arial, Verdana, Helvetica, sans-serif;
    --line-height-base: 1.385;
    --font-weight-bold: 700;   /* == bold; the only non-normal weight in use */

    /* ---- Colour (sampled from theme-47b.../styles.css) ----------- */
    --color-text:        #000000;   /* body { color: #000 }                  */
    --color-muted:       #666666;   /* secondary text / footer copy          */
    --color-link:        #444444;   /* a { color: #444 }                     */
    --color-link-hover:  #3399ff;   /* a:hover { color: #3399FF }            */
    --color-primary:     #ff9900;   /* MarocVentes orange (brand)            */
    --color-accent:      #bb5c12;   /* darker orange (CTA-pressed variant)   */
    --color-border:      #cdcdcd;   /* dominant border colour in the theme   */
    --color-bg-page:     #f7f8fc;   /* body { background: #F7F8FC }          */
    --color-bg-muted:    #f6f6f6;   /* light surface (cards, panels)         */
    --color-success:     #28a745;   /* no green in current theme - default   */
    --color-warning:     #ffc107;   /* no yellow in current theme - default  */
    --color-danger:      #cc0000;   /* matches existing #c00 usage           */

    /* ---- Motion --------------------------------------------------- */
    --motion-fast: 150ms;
    --motion-base: 250ms;
    --motion-slow: 500ms;
}


/* -------------------------------------------------------------------------
   2. RESETS
   -------------------------------------------------------------------------
   Kept intentionally minimal - the theme styles.css loads AFTER this file
   and is the authority on resets/normalize. Add a rule here only when a
   view-level component class needs a baseline the theme doesn't provide.
   ------------------------------------------------------------------------- */
/* (none yet) */


/* -------------------------------------------------------------------------
   3. LAYOUT HELPERS                       (populated from commit 5 onward)
   -------------------------------------------------------------------------
   .sf-container, .sf-row, .sf-row--tight, ...
   ------------------------------------------------------------------------- */
/* (empty - filled as views migrate) */


/* -------------------------------------------------------------------------
   4. VIEW COMPONENT CLASSES               (populated from commit 6A onward)
   -------------------------------------------------------------------------
   .sf-cart-row, .sf-product-meta, .sf-form-field, .sf-pager,
   .sf-newsletter, .sf-review, ...
   ------------------------------------------------------------------------- */

/* ---- Category (Grid / List / *WithSubs) ---------------------------- */
/* Decorative corner images sitting inside .title-category. The theme's
   .title-category supplies the bordered orange bar; these classes only
   position the small corner GIFs against it. */
.sf-title-corner {
    position: absolute;
    top: -1px;
}
.sf-title-corner--tl { left:  -1px; float: left;  }
.sf-title-corner--tr { right: -1px; float: right; }

/* Loading text shown under the .imgLoading spinner on category/search
   product grids. Overrides the theme's .text-loading font-size and adds
   vertical spacing under the spinner image. */
.sf-loading-text {
    font-size:  var(--font-md);   /* 13px */
    margin-top: var(--space-5);   /* 20px */
}

/* Bottom card-divider used under the sub-category grid on
   ListWithSubs / GridWithSubs. A 1 px bottom line with two small
   3x3 corner GIFs (border_bl.gif / border_br.gif) anchored to
   the bottom-left and bottom-right ends. */
.sf-card-divider {
    position:      relative;
    height:        2px;
    margin-top:    -3px;
    margin-bottom: 0;
    border-bottom: 1px solid var(--color-border);
}
.sf-card-divider__img {
    position: absolute;
    bottom:   -1px;
}
.sf-card-divider__img--l { float: left;                }
.sf-card-divider__img--r { float: right; right: 0;     }

/* Criteria-detailed-list faceted block. Sits above the product list on
   Category/CriteriaDetailedList.cshtml. The card chrome (border, corner
   GIFs, body grid) is owned by theme styles.css `div.categories-block`;
   these classes only add the inline-style overrides that the view had. */
.sf-criteria-block {
    margin-top:    10px;
    margin-bottom: 10px;
}
.sf-criteria-block__body {
    margin-left: 46px;
}

/* ---- Cart / QuickCart popup ---------------------------------------- */
/* The quicklook cart (Cart/QuickCart.cshtml) renders inside an iframe popup
   (Layout = null). These classes carry the popup's fixed-width chrome that
   the theme styles.css does not own. The pixel widths/offsets are
   popup-layout artifacts tied to the 670px frame, not design tokens. */
.sf-quickcart-popup {
    width:      670px;
    padding:    10px;
    background: #fff;
}
.sf-quickcart-popup__close {
    margin-left: 550px;   /* right-aligns the close link inside the 670px frame */
}
/* Coupon panel inside the QuickCart popup. The #cartcoupons border is scoped
   to #cart-container so it out-specifies the theme's
   #cartcoupons{border-top/bottom:1px solid #ddd} rule (theme styles.css loads
   after components.css) and gives the popup coupon box a full box border. */
#cart-container #cartcoupons {
    border: 1px solid #ddd;
}
.sf-quickcart-coupon-input {
    height: 24px;
    color:  #666;
}
.sf-quickcart-coupon-table {
    width:            658px;
    margin:           10px 0 -10px -10px;
    padding:          10px;
    border-top:       1px solid #ddd;
    background-color: #fff;
}
.sf-quickcart-coupon-code {
    width:       206px;
    font-weight: bold;
}
/* Popup-only spacing for shared cart classes. .cartheader and
   .productdeletecolumn also appear on the full Cart/Index page (which keeps
   its own values), so these overrides are scoped to #cart-container. */
#cart-container .cartheader {
    margin-top: 5px;
}
#cart-container .productdeletecolumn {
    width: 30px;
}
/* Margin resets that override the theme's #cartfooter{margin:10px 0 0 0} and
   #cartactions{margin-top:20px}. Scoped to #cart-container so they out-specify
   the theme (0,2,0 > 0,1,0) and apply only inside the popup; the full
   Cart/Index page has no such override and keeps the theme defaults. */
#cart-container #cartfooter {
    margin-top: 0;
}
#cart-container #cartactions {
    margin-top: 0;
}
/* Quantity input width on the full Cart/Index page only. The same .qty-cart
   input also appears in the QuickCart popup, where it has no explicit width
   and inherits the theme default — so this is its own class applied only on
   Index, not a .qty-cart rule (which would leak into the popup). */
.sf-cart-qty {
    width: 40px;
}
/* Line-item grid sizing, formerly the table's width="100%"/cellspacing="0"
   HTML attributes (shared by Cart/Index and the QuickCart popup). cellpadding
   was already a no-op — theme `.cartproductgrid td`/`th` set their own padding.
   border-spacing:0 reproduces cellspacing="0" exactly: it keeps the default
   `separate` border model with zero gaps (NOT border-collapse, which would
   change how the `.cartproductgrid td` top-border renders). Scoped to
   #cartcontainer so it cannot reach the order grid in _ViewOrderItems.cshtml,
   which lives outside #cartcontainer and keeps its own attributes. */
#cartcontainer .cartproductgrid {
    width:          100%;
    border-spacing: 0;
}
/* Cart/Index line-item column widths, formerly <th width="94px"/"45px">. The
   QuickCart popup grid has no per-column widths, so these are plain classes
   applied only on Index's <th> (like .sf-cart-qty) rather than a shared rule.
   min-width (not a fixed width) floors each column at its content size — the
   75px thumbnail + 6px cell padding for the image col, the delete icon for the
   remove col — so neither collapses, while the flexible product-details column
   absorbs any extra space at wider widths. NOTE: this is a de-hardcoding /
   narrow-width improvement only; it is NOT mobile-responsive. The active theme
   has no viewport meta and no @media queries, and phones are served by the
   separate /mobile/ site (Areas/Mobile, MobileCart) — see Progress Log 23A. */
.sf-cart-col-image  { min-width: 90px; }
.sf-cart-col-remove { min-width: 40px; }
/* Totals table spacing, formerly border="0" cellspacing="4" cellpadding="3" on
   the #carttotals <table> (shared by both cart views). The theme only floats
   this table — no spacing reset — so these restore the exact 4px cell gap and
   3px cell padding. border="0" was a visual no-op (no default table border).
   border-spacing needs the default `separate` model, which the theme leaves
   intact. #carttotals is cart-only, so no extra scoping is needed. */
#carttotals table {
    border-spacing: 4px;
}
#carttotals table td {
    padding: 3px;
}

/* ---- Checkout (Checkout/Index.cshtml) ------------------------------- */
/* The billing address block wraps an absolutely-positioned .disabled-td
   overlay (theme styles.css), so it needs position:relative as the
   containing block. Formerly inline style="position:relative". ID selector,
   no competing theme rule. Checkout.js only .show()/.hide()s this element
   (display), so the positioning is unaffected. */
#billingwrapper {
    position: relative;
}
/* Height of the password row's field cell in the login form table, formerly
   inline style="height:34px" on a <td class="formfield">. The theme's
   td.formfield sets no height, so this is its own scoped class applied only
   to that cell. */
.sf-checkout-pwd-field {
    height: 34px;
}
/* Login form table spacing, formerly id="loginformtable" cellspacing="0"
   cellpadding="3". border-spacing:0 = cellspacing="0". cellpadding=3 gave
   every cell 3px on all sides; the theme's td.formlabel{padding-right:5px}
   overrode only the right edge. #loginformtable td reproduces the 3px, and
   the formlabel rule re-asserts the 5px right edge the shorthand would
   otherwise clobber (id+class out-specifies the id+element). Pixel-identical. */
#loginformtable {
    border-spacing: 0;
}
#loginformtable td {
    padding: 3px;
}
#loginformtable td.formlabel {
    padding-right: 5px;
}
/* The two address-choice columns on #shipping-address / #billing-address,
   formerly <td width="50%" align="center">. width:50% splits the row evenly.
   The HTML align="center" attribute centers BOTH inline content and the
   fixed-width block children (.address-choose 280px, .existed-addresses
   290px) — browsers map td[align=center] to a special center value that
   plain text-align:center does NOT reproduce for blocks. So text-align:center
   covers inline content and margin:auto re-centers the fixed-width blocks,
   together matching the old attribute. (The inner .address-table partial
   already centers via the theme's margin:1em auto.) */
.sf-checkout-addr-col {
    width:      50%;
    text-align: center;
}
.sf-checkout-addr-col .address-choose,
.sf-checkout-addr-col .existed-addresses {
    margin-left:  auto;
    margin-right: auto;
}
/* Payment-methods table (DisplayPaymentMethods.cshtml), formerly border="0"
   cellspacing="0" cellpadding="3" width="100%". Rendered as a server-side
   partial inside the checkout page, so it inherits components.css. border="0"
   was a no-op; the others map directly. The radio cells keep the top alignment
   that was carried by valign="top". */
.sf-paymethods-table {
    width:          100%;
    border-spacing: 0;
}
.sf-paymethods-table td {
    padding: 3px;
}
.sf-paymethods-table .radiobuttoncol {
    vertical-align: top;
}
/* PayPal mark + caption in the payment list. <img align="left"> floated the
   logo (align=left maps to float:left); style="margin-right:7px" spaced it
   from the caption text. */
.sf-paypal-mark {
    float:        left;
    margin-right: 7px;
}
.sf-paypal-note {
    font-size:   11px;
    font-family: Arial, Verdana;
}
/* CMI surcharge row injected by the MarocTelecommerce payment script into the
   order-totals table. The injected <td>s already carry .cmilabel / .totalcmi;
   these rules replace the inline styles the script used to write on them
   (font-weight / text-align), matching the sibling .totaltax row. */
.cmilabel {
    font-weight: bold;
}
.totalcmi {
    text-align: right;
}
/* Address form table (_CheckoutAddress.cshtml) and credit-card input table
   (_CreditCardInput.cshtml), formerly border="0" cellspacing="0" cellpadding=
   "3"/"2". border="0" was a no-op, and the cellpadding is also a no-op here —
   the theme's `.checkout .address-table td, .checkout .creditcardinput td
   {padding:1px 3px}` overrides it (all live hosts — Checkout/Index,
   PaymentError, and the DisplayPaymentMethods partial inside them — wrap the
   markup in .checkout). Only cellspacing="0" was functional → reproduced as
   border-spacing:0, grouped + scoped to .checkout exactly like the theme's own
   `.checkout .address-table, .checkout .creditcardinput table` rule. (Both
   partials have their OWN Areas/Mobile copies, so these desktop-only rules —
   and the fact that components.css is desktop-theme-only — are safe.) */
.checkout .address-table,
.checkout .creditcardinput table {
    border-spacing: 0;
}
/* MarocTelecommerce trust-badge links (_MarocTelecommerce.cshtml), formerly
   inline style="background:none" on each <a>. Those badges render in the
   checkout payment block (.sidemenu > .body > .section-payment), where the
   theme's `.sidemenu .body a` (styles.css ~1641) paints a sidemenu_item_bg.png
   bullet behind every link — the inline style cancelled ONLY that background so
   the logo images aren't marred, leaving the theme's margin/padding/display/
   text-decoration on those links intact. Reproduced by scoping to .MTC and
   overriding background only; .sidemenu .body .MTC a (0,0,3,1) out-specifies
   the theme's .sidemenu .body a (0,0,2,1), so it wins despite components.css
   loading first. (On PaymentError the badges sit in .section-payment, NOT
   .sidemenu .body, so the bullet never applies and this rule simply no-matches
   — correct either way.) */
.sidemenu .body .MTC a {
    background: none;
}

/* ---- Contact (Index.cshtml) ----------------------------------------- */
/* Formerly a <style> block inside the view body. Selectors are kept
   verbatim (NOT renamed to sf-*) because they target the controller-
   rendered markup contract: ContactController.RenderContactForm() emits
   #contactusformtable / .formfield / .forminput.contactinput / .msg-error,
   and the view wraps them in .contactusinfo / .contactform. No other file
   defines these classes, and every rule keeps its original descendant/ID
   specificity (which out-weighs any generic theme .forminput/.msg-error),
   so moving them ahead of the theme styles.css in load order is cascade-
   safe. Values left raw — none map exactly to a token (#F7F7F7 != muted
   #f6f6f6, 2px radius != --radius-sm 3px, 5/6/10px off the 4px scale).
   Vendor-prefixed border-radius kept for byte-identical legacy render.
   The empty `.contactform .formfield{}` and the commented-out .contactform
   border from the original block were no-ops and dropped. */
.contactusinfo {
    background-color:      #F7F7F7;
    color:                 #333;
    border:                solid 1px #B4B4B4;
    padding:               0px;
    -moz-border-radius:    2px;
    -webkit-border-radius: 2px;
    border-radius:         2px;
    margin-bottom:         5px;
    margin-top:            6px;
}
.contactusinfo .prehtmltext {
    padding: 10px;
}
.contactform {
    background-color: #FFF;
    border-top:       solid 1px #B4B4B4;
    padding:          10px;
}
.contactform .forminput {
    width:  200px;
    height: 18px;
}
.contactform #contactusformtable {
    border-spacing: 4px;
}
.contactform .msg-error {
    display:        inline-block;
    color:          #DD4B39;
    vertical-align: middle;
    margin-left:    4px;
}

/* ---- Contact-us page (Home/ContactUs.cshtml + Contact/ContactUs.cshtml) -- */
/* Both views shipped the SAME in-body <style> block (bare `h1` page-wide + bare
   `.msg-error`) and the same fieldset border inline; both now add .sf-contactus
   to their <div id="content"> and share these rules. The notes below describe
   the original Home/ContactUs block — Contact/ContactUs is byte-identical:
   - the page's only <h1>s are inside #content (the title + any ContentColumn
     blocks); the theme header/footer chrome has NO <h1> (theme h1s are all
     product/kit `#productTitle`), so `.sf-contactus h1` covers exactly what the
     bare `h1` did — byte-identical.
   - the H1 background url was relative (`../Images/...`, resolved vs the page
     URL); rewritten absolute (`/Images/...`) so it resolves identically from
     /Content/components.css. Path kept verbatim — it points at the INACTIVE
     theme-bv-voipfrance dir, so the visible result is the #CAE4FF fallback.
   - `.msg-error`: the in-page bare rule was already out-specified by the global
     `.contactform .msg-error` (32A) for display/color (every msg-error span is
     inside the .contactform fieldset); its ONLY surviving effect was
     margin-top:5px, so that alone is reproduced — keeping it off the
     same-specificity tie that would otherwise flip display back to block.
   - the fieldset's inline `border:1px solid #DEE3FF;padding:10px` overrode the
     global `.contactform` border-top/padding; reproduced via
     `.sf-contactus .contactform` (out-specifies .contactform like the inline). */
.sf-contactus h1 {
    background:    url('/Images/sites/1/themes/theme-bv-voipfrance/assets/H1_Right.jpg') no-repeat scroll right top #CAE4FF;
    color:         #1D70C0;
    font-size:     1.35em;
    line-height:   1em;
    margin-bottom: 0.5em;
    padding:       5px;
}
.sf-contactus .msg-error {
    margin-top: 5px;
}
.sf-contactus .contactform {
    border:  1px solid #DEE3FF;
    padding: 10px;
}

/* ---- EmailFriend popup (EmailFriend/Index.cshtml) ------------------- */
/* Formerly an in-body <style> block in a standalone Layout=null iframe
   popup (loaded by TopUp). The popup does NOT inherit the theme layout, so
   the view now links this file directly (after the theme styles.css). Every
   rule is scoped under the popup-only wrapper .sf-epf because the popup
   shares selectors with OTHER live pages: the theme styles.css owns
   .messagebox* (styles.css ~1988), and #imgLoading / #popup / .messagebox
   also appear on Search, Products, ProductReviews and EmailVendor. Without
   the wrapper, the genuine overrides here (#imgLoading positioning, and the
   font-weight/vertical-align/margin-top additions on .messagebox .message)
   would leak onto those pages — per-property cascade lets non-conflicting
   declarations through regardless of load order. .sf-epf raises specificity
   above the theme's bare selectors, so the popup wins by specificity (not
   order) and nothing escapes the popup. Values kept verbatim (incl. the
   legacy -moz-* border props) for a byte-identical render. */
.sf-epf #popup {
    background-color: white;
    margin:           15px;
    padding:          5px;
    border:           solid 1px #333;
    padding-left:     0px;
    padding-right:    0px;
}
.sf-epf #popup h3 {
    background:    url("/images/H3.jpg") repeat scroll 0 0 transparent;
    color:         gray;
    border-top:    solid 1px #ccc;
    border-bottom: solid 1px #ccc;
    font-size:     1.2em;
    font-weight:   bold;
    line-height:   1.8em;
    margin:        0;
    padding:       1px 1px 1px 20px;
}
.sf-epf .messagebox {
    width:                     100%;
    -moz-border-bottom-colors: none;
    -moz-border-image:         none;
    -moz-border-left-colors:   none;
    -moz-border-right-colors:  none;
    -moz-border-top-colors:    none;
    background:                none repeat scroll 0 0 #FF9;
    border-color:              #FE3 -moz-use-text-color;
    border-style:              solid none;
    border-width:              1px medium;
    display:                   block;
    margin:                    10px 0;
    padding:                   0 10px;
}
.sf-epf .messagebox ul {
    display: block;
    margin:  0;
    padding: 0;
    width:   100%;
}
.sf-epf .messagebox .errorline {
    clear:      both;
    color:      #333;
    list-style: none outside none;
}
.sf-epf .messagebox li {
    margin:   10px 0;
    overflow: hidden;
    padding:  0;
    width:    100%;
}
.sf-epf .messagebox .icon {
    float:  left;
    margin: 0 8px 0 0;
}
.sf-epf .messagebox .message {
    font-size:      100%;
    line-height:    1.2em;
    margin:         0 5px 0 10px;
    vertical-align: middle;
    margin-top:     8px;
    font-weight:    bold;
}
.sf-epf #imgLoading {
    position:         fixed;
    top:              30%;
    left:             40%;
    width:            60px;
    height:           60px;
    background-color: #FFF;
    padding:          0;
    z-index:          100;
    border:           #333 solid 1px;
    display:          none;
}
.sf-epf #close_popup {
    margin-left: 10px;
}
.sf-epf #write {
    margin-left: 10px;
}
/* Per-element inline style="" attrs from the same popup, scoped under
   .sf-epf. The text-align:left on .formlabel is functional: theme
   styles.css:1825 `td.formlabel` sets text-align:right, and the cell's
   own align="left" attribute is out-prioritised by that CSS — only the
   inline style forced left, so `.sf-epf td.formlabel` (0,0,2,1) reproduces
   it by out-specifying the theme rule. It also covers the submit-row label
   cell (whitespace-only &nbsp; — alignment invisible there, so no visual
   change). `.padded` overrides theme .padded{padding:10px}. The table's
   width="60%" and cellspacing="0" attrs moved here (width / border-spacing
   on .formtable). cellpadding="0" stays an attr: converting it to
   `.formtable td { padding:0 }` (0,0,2,1) would out-specify and wrongly zero
   the theme's td.formlabel padding-right (0,0,1,1). The valign/align cell
   attrs also stay. The .messagebox style="display:none" stays inline — it is
   the initial state the JS slideDown() toggles. */
.sf-epf #tabreviews {
    padding: 0px;
}
.sf-epf .padded {
    padding: 0px;
}
.sf-epf .formtable {
    height:         35%;
    width:          60%;     /* was width="60%"   attr */
    border-spacing: 0;       /* was cellspacing="0" attr */
}
.sf-epf td.formlabel {
    text-align: left;
}
.sf-epf #submitbutton,
.sf-epf #submitbuttonlocal {   /* EmailVendor popup names the button #submitbuttonlocal */
    padding: 0px;
}
/* EmailVendor-only: the subject input carried inline width:100% (overriding
   the theme's .forminput). `.sf-epf #subject` (0,1,1,0) reproduces it. */
.sf-epf #subject {
    width: 100%;
}

/* ---- EmailFriend form redesign (.mv-epf BEM block) ----------------------
   CQ-006: this block was originally an inline <style> inside
   EmailFriend/Index.cshtml (lines 10-22). Subtask 003 deletes it from the view;
   subtask 008 (this file) is the canonical destination. The rules below are
   byte-identical to what 003 removes — do not alter them independently.
   Scoped under .mv-epf (a BEM block wrapper added to the redesigned form), so
   they cannot affect the legacy .sf-epf chrome above. */
.mv-epf { font-family: "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; max-width: 460px; margin: 0 auto; padding: 24px 22px; box-sizing: border-box; color: var(--site-content-text, #333); }
.mv-epf * { box-sizing: border-box; }
.mv-epf__title { font-size: 19px; font-weight: 700; margin: 0 0 16px; color: var(--site-header-end, #396b9e) !important; }
.mv-epf__sub { font-size: 13px; color: var(--site-muted, #777); margin: 0 0 18px; }
.mv-epf__field { margin-bottom: 14px; }
.mv-epf__label { display: block; font-size: 13px; font-weight: 600; margin-bottom: 6px; }
.mv-epf__input { width: 100%; padding: 10px 12px; border: 1px solid var(--site-border, #cdcdcd); border-radius: 6px; font-size: 14px; background: #fff; transition: border-color .15s, box-shadow .15s; }
.mv-epf__input:focus { outline: none; border-color: var(--site-header-end, #396b9e); box-shadow: 0 0 0 3px rgba(57, 107, 158, .15); }
.mv-epf__submit { margin-top: 8px; }
.mv-epf .messagebox { margin-bottom: 14px; }
.mv-epf__loading { text-align: center; padding: 6px 0; }
/* EmailVendor reuses the .mv-epf card (it is EmailFriend's twin) but adds two
   things the friend form doesn't have: a pre-filled message body block, and a
   wider set of text fields. These extend the shared .mv-epf primitives. */
.mv-epf #popup { background: #fff; }
.mv-epf__form { display: block; }
.mv-epf__body { font-size: 13px; line-height: 1.5; color: var(--site-content-text, #333); margin: 0 0 14px; }
.mv-epf textarea.mv-epf__input { min-height: 110px; resize: vertical; }

/* ---- ProductReviews popup (ProductReviews/ProductReviewPopup.cshtml) ----- */
/* The third TopUp popup, but it renders through _PopupLayout.cshtml (not
   Layout=null) and is NOT byte-identical to the EmailFriend/EmailVendor twins,
   so it gets its OWN wrapper .sf-prp rather than reusing .sf-epf:
     - its <table class="formtable"> has NO width/height (the .sf-epf rule
       carries width:60%/height:35% — reusing it would resize this table);
     - its #imgLoading spinner is 120x100, not 60x60;
     - it adds a bare `td { padding:1px }` the twins don't have.
   The popup-chrome rules (#popup, #popup h3, .messagebox*, #close_popup,
   #write) are duplicated verbatim from .sf-epf on purpose — scoping keeps the
   generic selectors from leaking, and a shared base class would have to undo
   the table/spinner differences above. Values kept verbatim (incl. legacy
   -moz-* props) for a byte-identical render. */
.sf-prp #popup {
    background-color: white;
    margin:           15px;
    padding:          5px;
    border:           solid 1px #333;
    padding-left:     0px;
    padding-right:    0px;
}
/* Loading state while a review POSTs — the JS used to set opacity:0.3 +
   pointer-events:none inline via .css() and clear them on success/error.
   Now toggled with addClass/removeClass("sf-loading"). */
.sf-prp #popup.sf-loading {
    opacity:        0.3;
    pointer-events: none;
}
.sf-prp #popup h3 {
    background:    url("/images/H3.jpg") repeat scroll 0 0 transparent;
    color:         gray;
    border-top:    solid 1px #ccc;
    border-bottom: solid 1px #ccc;
    font-size:     1.2em;
    font-weight:   bold;
    line-height:   1.8em;
    margin:        0;
    padding:       1px 1px 1px 20px;
}
.sf-prp .messagebox {
    width:                     100%;
    -moz-border-bottom-colors: none;
    -moz-border-image:         none;
    -moz-border-left-colors:   none;
    -moz-border-right-colors:  none;
    -moz-border-top-colors:    none;
    background:                none repeat scroll 0 0 #FF9;
    border-color:              #FE3 -moz-use-text-color;
    border-style:              solid none;
    border-width:              1px medium;
    /* Was display:block in the source <style>, but the element also carried
       inline style="display:none" (inline won) so it rendered hidden on load.
       That inline attr is gone now, so the initial hidden state lives here;
       jQuery .slideDown() reveals it (ending at the div's default block). */
    display:                   none;
    margin:                    10px 0;
    padding:                   0 10px;
}
/* flash-message-warning divs injected into .messagebox by the popup's AJAX
   handlers carried inline style="padding:10px;" — moved here, scoped so it
   can't affect the shared class elsewhere. */
.sf-prp .messagebox .flash-message-warning {
    padding: 10px;
}
.sf-prp .messagebox ul {
    display: block;
    margin:  0;
    padding: 0;
    width:   100%;
}
.sf-prp .messagebox .errorline {
    clear:      both;
    color:      #333;
    list-style: none outside none;
}
.sf-prp .messagebox li {
    margin:   10px 0;
    overflow: hidden;
    padding:  0;
    width:    100%;
}
.sf-prp .messagebox .icon {
    float:  left;
    margin: 0 8px 0 0;
}
.sf-prp .messagebox .message {
    font-size:      100%;
    line-height:    1.2em;
    margin:         0 5px 0 10px;
    vertical-align: middle;
    margin-top:     8px;
    font-weight:    bold;
}
/* This popup's spinner is larger than the twins' 60x60. The commented-out
   126x22 variant from the source <style> was dropped (dead). */
.sf-prp #imgLoading {
    position:         fixed;
    top:              30%;
    left:             40%;
    width:            120px;
    height:           100px;
    background-color: #FFF;
    padding:          0;
    z-index:          100;
    border:           #333 solid 1px;
    display:          none;
}
.sf-prp #close_popup {
    margin-left: 10px;
}
.sf-prp #write {
    margin-left: 10px;
}
/* Bare `td { padding:1px }` in the source <style> — scoped to the popup so it
   no longer targets every table cell on whatever page might share this CSS.
   PERF-007: tightened from `.sf-prp td` (every td) to only the two cell types
   that actually need the 1px squeeze: the form-label column and the form-input
   column. The popup's `.reviews` td never needed it (margin-left:10px does the
   spacing); the submit-row td is zero-padded via .sf-prp #submitbutton below. */
.sf-prp td.formlabel,
.sf-prp td.formfield {
    padding: 1px;
}
/* Per-element inline style="" attrs from the same popup, scoped under .sf-prp.
   #tabreviews/.padded zero the theme's padding; td.formlabel text-align:left
   reproduces the theme override (see the .sf-epf note). Both .reviews blocks
   carried margin-left:10px; the lower (form) one adds top/bottom via the
   sf-reviews-form modifier. #msg-error's initial display:none now lives here
   too (JS slideUp/slideDown still toggles it), alongside its color/font/float.
   #newreview reproduces the textarea's inline width/height (overriding the
   rows/cols attrs, which stay); .sf-input-error is the error-border state the
   JS used to set via .css("border", ...). The clear:both spacer div became
   class="clear" (already used twice in this view). */
.sf-prp #tabreviews {
    padding: 0px;
}
.sf-prp .padded {
    padding: 0px;
}
.sf-prp td.formlabel {
    text-align: left;
}
.sf-prp .reviews {
    margin-left: 10px;
}
.sf-prp .reviews.sf-reviews-form {
    margin-top:    10px;
    margin-bottom: 10px;
}
.sf-prp #msg-error {
    color:       #BA3323;
    font-weight: bold;
    font-size:   11px;
    float:       left;
    display:     none;
}
.sf-prp #newreview {
    width:  250px;
    height: 40px;
}
.sf-prp #newreview.sf-input-error {
    border: solid 1px #BA3323;
}

/* ---- ProductReviews popup modern card (.mv-prp, mirrors .mv-epf) ----------
   MUST follow the entire .sf-prp block above: the review popup wrapper carries
   both classes (class="sf-prp mv-prp"), so these overrides win the legacy
   .sf-prp rules by source order at equal specificity. Placing this block before
   .sf-prp (as it originally was) let the legacy table/250px-textarea/image-heading
   look win — hence the flat card and #newreview width:100% below now apply. */
.mv-prp #popup { margin: 0; padding: 14px 0 0; padding-left: 0; padding-right: 0;
    background: #fff; border: 0; border-radius: 10px; overflow: hidden; }
.mv-prp #popup.sf-loading { opacity: .4; pointer-events: none; }
.mv-prp .padded { padding: 0 20px 20px; }
.mv-prp #popup h3 { background: none; color: var(--site-button-bg, #4F7CC2); border: 0;
    border-bottom: 1px solid var(--site-button-bg, #4F7CC2); font-size: 16px; font-weight: 700;
    line-height: 1.4; margin: 0 -20px 16px; padding: 14px 20px; }
.mv-prp .reviews { margin-left: 0; width: 100%; box-sizing: border-box; }
.mv-prp .reviews.sf-reviews-form { margin-top: 0; margin-bottom: 0; }
.mv-prp .reviewform { width: 100%; box-sizing: border-box; }
.mv-prp__field { margin: 0 0 14px; }
.mv-prp__label { display: block; font-size: 13px; font-weight: 600; margin-bottom: 6px; }
.mv-prp #newreview { width: 100%; height: auto; min-height: 110px; resize: vertical; padding: 10px 12px;
    box-sizing: border-box; border: 1px solid var(--site-border, #cdcdcd); border-radius: 6px; font-size: 14px;
    background: #fff; transition: border-color .15s, box-shadow .15s; }
.mv-prp #newreview:focus { outline: none; border-color: var(--site-header-end, #396b9e);
    box-shadow: 0 0 0 3px rgba(57, 107, 158, .15); }
/* SVG star rating — real radio inputs (name="rating") + label tiles, each
   holding an inline <svg> star, in REVERSE DOM order (5..1) with row-reverse so
   they read 1..5 left to right. :checked ~ .mv-star persists the chosen fill
   with NO JS (click always sticks); :hover previews via the same ~ combinator.
   SVG (not a font glyph) → perfectly centered + crisp at any size, immune to the
   theme's label font-size override. CreateReviews() reads the checked radio. */
.mv-prp .mv-stars { display: inline-flex; flex-direction: row-reverse; justify-content: flex-end; gap: 8px; }
.mv-prp .mv-star-input { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }
/* Empty tile: white box, light-orange border, hollow orange star. */
.mv-prp .mv-star { cursor: pointer; box-sizing: border-box; width: 38px; height: 38px;
    display: inline-flex; align-items: center; justify-content: center;
    border: 1px solid #e6a45c; border-radius: 6px; background: #fff;
    transition: background .12s, border-color .12s; }
.mv-prp .mv-star-svg { width: 24px; height: 24px; display: block; }
.mv-prp .mv-star-svg path { fill: none; stroke: #e0820e; stroke-width: 1; stroke-linejoin: round; }
/* Filled tile (persistent set): orange box, solid white star. */
.mv-prp .mv-star-input:checked ~ .mv-star { background: #e0820e; border-color: #e0820e; }
.mv-prp .mv-star-input:checked ~ .mv-star .mv-star-svg path { fill: #fff; stroke: #fff; }
/* Hover preview: reset all, then fill from the left up to the hovered tile. */
.mv-prp .mv-stars:hover .mv-star { background: #fff; border-color: #e6a45c; }
.mv-prp .mv-stars:hover .mv-star .mv-star-svg path { fill: none; stroke: #e0820e; }
.mv-prp .mv-stars:hover .mv-star:hover,
.mv-prp .mv-stars:hover .mv-star:hover ~ .mv-star { background: #e0820e; border-color: #e0820e; }
.mv-prp .mv-stars:hover .mv-star:hover .mv-star-svg path,
.mv-prp .mv-stars:hover .mv-star:hover ~ .mv-star .mv-star-svg path { fill: #fff; stroke: #fff; }
.mv-prp .mv-star-input:focus-visible + .mv-star { outline: 2px solid #e0820e; outline-offset: 2px; }
.mv-prp #msg-error { display: none; float: none; color: #BA3323; font-weight: 600; font-size: 12px; margin: -8px 0 10px; }
.mv-prp__submit { margin-top: 4px; }
/* Submit row: full-width wrapper, button sized to 20% and pushed to the right. */
.mv-prp__actions { width: 100%; display: flex; justify-content: flex-end; }
.mv-prp .mv-prp__submit { width: 20%; }
/* Keep the Send button off the card's right edge. */
.mv-prp__actions .mv-btn { margin-right: 6px; }

/* ---- ProductReviews list (TopReviews.cshtml + _SingleReview.cshtml) ------- */
/* NOT scoped under a popup wrapper: these two partials render in THREE places —
   the product detail page (template engine), the full reviews page
   (ProductReviews/Index), AND inside the .sf-prp popup — so the rules are
   global. components.css loads before the theme styles.css, but no theme rule
   competes for these exact selectors/properties (theme styles.css:1870-1871
   style .ProductReview/.ProductReviewKarma, and :2082 only the grid-scoped
   .cell-product .ProductReviewRating — none touch these imgs/margins), so the
   relocation is cascade-safe. */

/* TopReviews avg-rating row. The source div carried
   style="margin-top: 10; margin-bottom: 5px" — `margin-top: 10` is unitless,
   hence invalid and ignored by every browser, so only margin-bottom:5px ever
   applied; the no-op is dropped. A dedicated `.sf-review-avg` modifier (not the
   bare .ProductReviewRating) keeps this margin off the plain .ProductReviewRating
   in ProductReviews/Index.cshtml, which never had it. The avg <img> carried
   vertical-align:middle, reproduced via `.sf-review-avg img`. */
.sf-review-avg {
    margin-bottom: 5px;
}
.sf-review-avg img {
    vertical-align: middle;
}

/* _SingleReview karma yes/no vote buttons — were inline
   border:none;vertical-align:middle. `.ProductReviewKarma img` matches exactly
   the two <a><img> votes (the only imgs in that span) in every render context. */
.ProductReviewKarma img {
    border:         none;
    vertical-align: middle;
}

/* ---- EstimateShipping popup (EstimateShipping/Index.cshtml) -------------- */
/* The only inline style on this _PopupLayout popup — the form's
   margin-left:120px. A dedicated class (no wrapper needed: there was no <style>
   block of generic selectors to contain). The view links components.css via its
   HeadContent section since _PopupLayout does not load it globally. */
.sf-estimate-form {
    margin-left: 120px;
}

/* ---- Products cross-sell accessories (AdditionalProductAccessories.cshtml) -- */
/* Parked: this view is DEAD. Its action is reachable only via the route
   `addproductaccessoires?sku=`, whose sole inbound link is the dead
   Kits/Index.cshtml (KitsController is template-engine, so its views never
   render) plus two commented-out refs (CustomHeader.cs:92, Product.cs:1261) —
   nothing live navigates here. Migrated for inventory completeness, not customer
   effect. The two cross-sell <input type="image"> buttons carried
   border-width:0px + margin-top:5px (and the add-to-cart one vertical-align:
   middle). border/va reuse the .sf-bw-0 / .sf-va-middle utilities; only the
   off-scale 5px margin is a dedicated class here (NOT .sf-mt-5 — §5 reserves that
   name for --space-5 = 20px). The theme borders no image inputs (input[type=image]
   sets padding:0 5px only), so dropping the inline border is pixel-identical. */
.sf-acc-btn {
    margin-top: 5px;
}

/* ---- Products: replaced-product card (RenderSingleProductReplaced.cshtml) -- */
/* LIVE: Html.Partial'd by Products/Index.cshtml when a product IsReplaced &&
   Disabled. The view's in-body <style> block (generic .product-line / .imgMax /
   .addtocart-block / .title-replace / .product-replace) plus its per-element
   inline styles are ported here, ALL scoped under the view root .product-replace.
   Scoping is required for correctness as well as leak-prevention: components.css
   loads BEFORE the theme styles.css, so a bare .product-line rule would lose to
   the theme's .product-line; the extra .product-replace ancestor keeps these
   winning, and the generic names can't leak to other (dead) product partials.
   Legacy -moz-/-webkit-border-radius kept verbatim. The id-scoped #new / #aPromo
   selectors follow the .sf-prp #popup pattern already used in this file. The
   clear:both spacer div became class="clear" (theme), and the lone font-weight:
   bold anchor reuses .sf-fw-bold. */
.product-replace {
    background-color:      #e7ffe7;
    color:                 #333;
    border:                solid 1px #B4B4B4;
    padding:               10px;
    -moz-border-radius:    4px;
    -webkit-border-radius: 4px;
    border-radius:         4px;
    position:              relative;
    top:                   -30px;
    font-size:             12px;
}
.product-replace p {
    font-size: 11px;
}
.product-replace .title-replace {
    font-weight: bold;
    font-size:   13px;
}
.product-replace .product-line {
    height:           300px;
    background-color: #FFF;
    border:           1px solid #ccc;
}
.product-replace .addtocart-block {
    border-bottom: 1px solid #ccc;
    padding-top:   4px;
    padding-right: 4px;
    text-align:    right;
}
.product-replace .imgMax {
    display:  none;
    left:     14px;
    position: absolute;
    top:      61px;
    z-index:  1;
}
.product-replace .replace-details-link {
    margin-right: 10px;
}
.product-replace #new {
    position: absolute;
}
.product-replace .see_product a {
    font-weight: bold;
    font-size:   12px;
    margin-left: 10px;
}
.product-replace .replace-body {
    position:    relative;
    margin-left: 120px;
    top:         -140px;
}
.product-replace .promo-corner {
    position: absolute;
    top:      0;
    right:    0;
}
.product-replace #aPromo {
    color: #ff0000;
}
.product-replace .product_discount_adverts img {
    left:     -1px;
    position: absolute;
    top:      22px;
}

/* ---- Products: detail page (Index.cshtml) ------------------------------- */
/* DEAD/edge-path: the live product page is template-engine rendered
   (ProductsController.Index GET :60 returns Content()); this Razor view renders
   only on a failed add-to-cart POST fallback (:170), which IndexSetup leaves
   half-populated (it would NPE — see 39A). Migrated for inventory completeness.
   Two values must out-specify the theme (components.css loads BEFORE styles.css):
   the loading caption's font-size (theme .text-loading is 12px @styles.css:2097)
   is reproduced via the higher-specificity #imgLoading .text-loading; the qty
   field's width (theme .forminput is 190px @styles.css:1836) via the id rule
   #qty. The rest (#titleDesc, #addToCart, .thumbnail, .suggesteditem,
   jcarousel-prev/next, #FilesGridView, #wishlist) have NO competing theme rule
   (grepped), so plain classes/ids are cascade-safe. The invalid `# DataList1 a`
   selector from the source <style> (space after #) never matched anything and is
   dropped. clear:both spacers already used class="clear"; the WhatsApp SVG fills
   moved to fill="" presentation attrs (equivalent, no CSS). */
#imgLoading .text-loading {
    font-size:      13px;
    display:        inline-block;
    vertical-align: super;
}
/* #divLoading wraps a different loading caption (font-size + margin-top, no
   inline-block/super) than the live #imgLoading variant above. Used by the
   backup clone "Copie Index.cshtml" (DEAD) AND the dead Search views
   (Search/Index.cshtml + Search/Result.cshtml), which all had the same inline
   `font-size:13px; margin-top:20px` on their #divLoading caption. Scoped id keeps
   it off the live #imgLoading variant and out-specifies theme .text-loading
   (12px @styles.css:2097). */
#divLoading .text-loading {
    font-size:  13px;
    margin-top: 20px;
}
.sf-product-titledesc {
    margin-top: -30px;
}
#qty {
    width: 20px;
}
.sf-product-options {
    margin-top:    10px;
    margin-bottom: 10px;
    text-align:    left;
}
.sf-downloads-title {
    color: #FFF;
}
.sf-files-grid {
    color:           #333333;
    border-collapse: collapse;
}
.sf-files-grid-head {
    color:            #FFFFFF;
    background-color: #FFFFFF;
    font-weight:      bold;
}
.sf-files-grid-row {
    color:            #333333;
    background-color: #F7F6F3;
}
.sf-suggested-panel {
    margin-top: 10px;
}
#_SuggestedItems1_SuggestedItemsPanel .suggesteditem {
    text-align:     center;
    display:        inline-block;
    width:          250px;
    margin:         5px;
    vertical-align: top;
}

/* ---- Products: detailed-list row (RenderSingleProductDetailed.cshtml) ---- */
/* DEAD: referenced by no .cshtml or .cs (the detailed-list product layout is
   template-engine via parts/single-product-list.html). Migrated for inventory
   completeness. The view root is the shared <div class="product-line"> (the
   theme + marocdata.js style .product-line), so we add an own wrapper class
   .sf-prod-detailed and scope every ported inline style under it — never under
   bare .product-line, which would leak into the theme's rows and the
   .product-replace card. Reuses .sf-bw-0 (the <img border=0>) and .sf-fw-bold
   (two anchors); clear:both spacer became class="clear".
   ALSO reused by the dead Kits/RenderSingleKit.cshtml — its detailed-list row is
   structurally identical (same .product-line root, #new / .detail-body /
   .promo-corner / #aPromo / .product_discount_adverts img / .buttons, same
   pixel values), so it carries the same .sf-prod-detailed wrapper rather than
   duplicating the rules. */
.sf-prod-detailed #new {
    left:     0;
    top:      0;
    position: absolute;
}
.sf-prod-detailed .detail-body {
    position:    relative;
    margin-left: 140px;
}
.sf-prod-detailed .promo-corner {
    width:    28%;
    position: absolute;
    top:      0;
    right:    0;
}
.sf-prod-detailed #aPromo {
    color: #ff0000;
}
.sf-prod-detailed .product_discount_adverts img {
    left:     -1px;
    position: absolute;
    top:      22px;
}
.sf-prod-detailed .buttons {
    margin-right: 10px;
}

/* ---- Products: grid cell (RenderSingleProductGrid.cshtml) ---------------- */
/* DEAD: referenced by no .cshtml or .cs (grid product layout is template-engine
   via parts/single-product-grid.html, and the live hover-zoom uses
   marocdata.js's maximizeForGrid, not this view's inline copy). Migrated for
   completeness. The root is the shared <div class="cell-product"> (theme +
   marocdata.js style it), so an own wrapper class .sf-prod-grid carries the
   root's margin-left and scopes the rest — including the two styles that the
   view's inline maximizeForGrid script used to build as JS strings and stamp on
   the dynamically-created .ImgMax / .loading elements (now plain class rules, as
   those elements already carry the classes). text-align:center reuses the
   .sf-text-center utility.
   ALSO reused by the dead Kits/RenderSingleKitGrid.cshtml — identical grid cell
   (.cell-product root, same maximizeForGrid JS building .ImgMax / .loading, same
   .grid-price / .more_details, same values), so it shares the .sf-prod-grid
   wrapper instead of duplicating the rules. */
.sf-prod-grid {
    margin-left: 10px;
}
.sf-prod-grid .ImgMax {
    display:  none;
    z-index:  1;
    position: absolute;
    top:      2px;
    left:     2px;
}
.sf-prod-grid .loading {
    background: url(/Images/loading2.gif) no-repeat 0 0;
    height:     20px;
    width:      20px;
    position:   absolute;
    top:        0;
    left:       0;
}
.sf-prod-grid .grid-price {
    padding-left: 14px;
}
.sf-prod-grid .more_details {
    margin-top: 2px;
}

/* ---- Revendeur reseller export page (Revendeur/Index.cshtml) ------------- */
/* LIVE: RevendeurController returns View(model) (:80) and View("Index", model)
   (:196). The 5 inline styles externalized here, cascade checked vs the theme
   (loads AFTER components.css): h3 reproduces #678C10 over theme `h3{color:#000}`
   — `.block-revendeur h3` (0,1,1) out-specifies theme `h3` (0,0,1); #treeCategory
   border-left/right is uncontested (theme #treeCategory rules set only
   margin/padding !important, no border); #msg-info and the signup wrapper are
   children of .block-information with no competing rule (id / dedicated class).
   The `.block-revendeur`/`.block-information` cards themselves are theme-owned
   (styles.css:2657-2658) and untouched here. */
.sf-revendeur-signup {
    background-color: #FFF;
    border-top:       solid 1px #B4B4B4;
    padding:          10px;
}
#msg-info {
    padding: 10px;
}
.block-revendeur h3 {
    color: #678C10;
}
.block-revendeur p {
    font-weight: normal;
}
#treeCategory {
    border-left:  1px solid #ccc;
    border-right: 1px solid #ccc;
}

/* ---- SIPS checkout (SipsCheckout/Index.cshtml + ResponseConfirmPayment.cshtml) */
/* LIVE: SipsCheckoutController returns View(model). Both views widen the shared
   checkout .sections from the theme's 750px (styles.css:1341
   `.checkout .sections{width:750px}`) to 1012px via an inline style. They reuse
   id="paypalexpresscheckout" — which the real PayPalExpressCheckout/Index ALSO
   uses, WITHOUT a width override — so scoping on that id would wrongly widen the
   PayPal page too. Instead a dedicated .sf-sips-sections class goes on these two
   .sections only; `.checkout .sections.sf-sips-sections` (0,3,0) out-specifies the
   theme rule (0,2,0), so 1012px wins despite components.css loading first. */
.checkout .sections.sf-sips-sections {
    width: 1012px;
}

/* ---- Shared partials ---------------------------------------------------- */
/* _ViewOrder.cshtml (LIVE: Checkout/Receipt + account/OrderHistory/Details; both
   use _Layout, which loads components.css via the FullHeader template engine).
   float:right / text-align:right reuse utilities; the empty 20px vertical spacer
   div gets .sf-spacer-20. */
.sf-spacer-20 { height: 20px; }

/* _OrderPaymentSummary.cshtml — the receipt's payment-summary table. LIVE on
   desktop (rendered by _ViewOrder, which loads components.css). It is ALSO
   rendered by the mobile Areas/Mobile _ViewOrder, which does NOT load
   components.css — so the SAME rules are duplicated into that mobile view's own
   <style> block, keyed on the .sf-order-paysummary classes added here, keeping
   the mobile receipt identical. The table's border/cellspacing/cellpadding/width
   stay as HTML attributes (they work on both platforms without CSS); only the
   style="" attributes are externalized. The row-specific 1px #999 dividers and
   the grand-total #333 use 2-class selectors so they out-specify the mobile
   block's `.totaltable tr td` rule on mobile, reproducing what the inline styles
   did. */
.sf-order-paysummary {
    margin-top: 8px;
    color:      #666;
    font-size:  11px;
}
.sf-order-paysummary .sf-ops-divider {
    border-bottom: solid 1px #999;
}
.sf-order-paysummary .sf-ops-refund {
    border-bottom:  solid 1px #999;
    padding-bottom: 3px;
}
.sf-order-paysummary .sf-ops-due-label {
    vertical-align: middle;
}
.sf-order-paysummary .totalgrand {
    color: #333;
}

/* The next four classes belong to DEAD orphan Shared partials (referenced by no
   .cshtml/.cs): the Logo/Socials/SearchForm/Newsletter tag handlers emit their
   HTML directly via StringBuilder, and _Pager2/_PagerCat are pagers for the dead
   (template-engine) Category/Search pages. Migrated for completeness (user
   decision). Per-element dedicated classes only — never the shared
   .pager/.recordprice/#search-header selectors — so nothing leaks onto the live
   tag-handler output that reuses those names. */
.sf-searchform-header {           /* _SearchForm.cshtml #search-header */
    margin-top: 15px;
    text-align: left;
}
.sf-pager2-count {                /* _Pager2.cshtml product-count span */
    margin:      7px 0 0;
    font-weight: bold;
    font-size:   14px;
    float:       left;
}
.sf-pagercat-count-wrap {         /* _PagerCat.cshtml product-count <ul> */
    float:       left;
    margin-top:  0;
    font-size:   10px;
    position:    absolute;
    left:        0;
    margin-left: 216px;
}
.sf-pagercat-count {              /* _PagerCat.cshtml product-count span */
    margin:      6px 10px 0 0;
    font-weight: bold;
    font-size:   13px;
    float:       left;
}

/* ---- Home/Manufacturers.cshtml (DEAD: no action/route renders it) -------- */
/* Migrated for completeness. Per-element dedicated classes (no wrapper) keep the
   page_header/col_large overrides off the live theme classes. The <img border>
   reuses .sf-bw-0. */
.sf-mfr-col {
    margin-left: 13px;
}
.sf-mfr-header {
    background:  none;
    color:       #444444;
    padding:     0;
    margin:      7px 0 10px;
    font-family: Tahoma, Arial, Helvetica, sans-serif;
    font-style:  normal;
}

/* ---- Home/Tarifs.cshtml (DEAD + BROKEN) --------------------------------- */
/* This view is a WebForms .aspx pasted into a .cshtml (<asp:repeater>, <%# %>,
   <uc1:>, VB <% %>) — it is not valid Razor and the route `tarifs` points to a
   non-existent Home/Tarifs action, so it can never render. Its in-body <style>
   block contained GENERIC selectors (#homepagecolumn2 a, .loading, .bold, .top,
   .download, .row:hover, .psdg-*) that would restyle LIVE pages if globalized.
   Per user decision, migrated anyway but ALL rules are scoped under a dead
   .sf-tarifs wrapper added around the view body, so they only match inside this
   (never-rendered) view and cannot leak. Values kept verbatim. */
.sf-tarifs #st_horizontal { max-width: 400px; }
.sf-tarifs #st_horizontal .st_view_container { max-width: 365px; }
.sf-tarifs #st_horizontal .st_tabs_container { width: 338px !important; }
.sf-tarifs #st_horizontal .st_tab { padding: 10px 24px; }
.sf-tarifs #homepagecolumn2 a { color: #1D70C0; }
.sf-tarifs .marginTopBottom20 { margin: 10px 0; }
.sf-tarifs .bold { font-weight: bold; }
.sf-tarifs br.clear { height: 0; clear: both; }
.sf-tarifs .download {
    background:   url(btn_telecharger.jpg) no-repeat;
    display:      inline-block;
    width:        54px;
    font-size:    0;
}
.sf-tarifs .letter { margin: 0 2px; }
.sf-tarifs .top {
    background:      url(/MDModules/Themes/MVBleu/images/top.png) no-repeat;
    display:         inline-block;
    width:           16px;
    text-decoration: none;
}
.sf-tarifs .psdg-top-cell {
    border-right: 1px solid #CED9EC;
    color:        #1F3D71;
    float:        left;
    font:         13px Arial, Helvetica, sans-serif;
    height:       31px;
    padding:      15px 0 0 24px;
    width:        50%;
    text-align:   left;
}
.sf-tarifs .psdg-middle {
    background: #F6F6F6;
    margin:     0;
    padding:    0;
    width:      100%;
}
.sf-tarifs .psdg-left {
    color:      #1F3D71;
    font:       13px Arial, Helvetica, sans-serif;
    margin:     0;
    padding:    5px 0 5px 10px;
    text-align: left;
    width:      50%;
    float:      left;
}
.sf-tarifs .psdg-right {
    float:      left;
    margin:     0;
    padding:    5px 0;
    text-align: center;
    width:      42.5%;
}
.sf-tarifs .psdg-bottom {
    background:  #E4E3E3;
    border-top:  2px solid #FFFFFF;
    clear:       both;
    height:      20px;
    margin:      0;
    padding:     0;
    width:       100%;
    text-align:  center;
}
.sf-tarifs .prefix,
.sf-tarifs .loading { clear: both; }
.sf-tarifs .loading {
    background: url(/MDModules/Themes/MVBleu/images/loading.gif) no-repeat center center;
    height:     32px;
    padding:    5px 0;
}
.sf-tarifs .row2 {
    font-family:      Verdana, Arial, Helvetica, sans-serif;
    background-color: #F6F6F6;
    text-align:       center;
}
.sf-tarifs .row1 {
    font-family:      Verdana, Arial, Helvetica, sans-serif;
    background-color: #ffffff;
    text-align:       center;
}
.sf-tarifs .row:hover { background: #E4EBF8; }
/* Per-element inline styles from the same view, scoped under .sf-tarifs. */
.sf-tarifs .anrt-link {
    float:        left;
    display:      block;
    width:        118px;
    height:       45px;
    margin-right: 10px;
}
.sf-tarifs .price-search-col { width: 50%; }
.sf-tarifs .price-search-box {
    float:      right;
    text-align: right;
}
.sf-tarifs .txt-search-price {
    display: inline;
    width:   80px;
}
.sf-tarifs .btn-search-price {
    display:             inline;
    border:              none;
    width:               96px;
    height:              24px;
    background-position: -185px 0;
}
.sf-tarifs #lnkPricesAll { display: block; }
.sf-tarifs .psdg-top-cell-last {
    border: none;
    width:  36%;
}

/* ---- RssFeed list page (RssFeed/Feed.cshtml) ---------------------------- */
/* LIVE: RssFeedController returns View(model) (:44); the view uses the default
   _Layout, which loads components.css via the FullHeader template engine. The
   two .sidemenu sections each carried inline style="margin-bottom:5px", which
   trimmed the theme's .sidemenu base rule (styles.css:1590 `margin:0 0 6px`)
   from 6px to 5px. components.css loads BEFORE the theme, so a bare class would
   lose to .sidemenu (same 0,0,1,0 specificity, theme wins on load order);
   .sidemenu.sf-rss-section (0,0,2,0) out-specifies it so 5px wins — same
   technique as .sf-sips-sections above. 5px is off the 4px token scale, kept
   raw (port). */
.sidemenu.sf-rss-section {
    margin-bottom: 5px;
}

/* ---- Search results page (Search/Index.cshtml) -------------------------- */
/* DEAD: the live search page is template-engine rendered (SearchController
   returns Content()); this Razor view never renders. It carried TWO in-body
   <style> blocks of GENERIC selectors (.block-search, .result-msg*, #recherche_2,
   .contact, .msg-error, .flash-message-info, #imgLoading) plus per-element inline
   styles. Both blocks + the inlines are ported here scoped under a dead .sf-search
   wrapper (added to the view's #categorymain) so the generic names cannot leak
   onto live pages. Values kept verbatim (incl. legacy -moz-/-webkit-border-radius).
   #recherche_2's source had `color:blue` immediately overridden by `color:#F60`
   in the same block — the dead `color:blue` no-op is dropped (only #F60 renders).
   The #divLoading caption keeps no rule here — the existing global
   `#divLoading .text-loading` already covers it. Migrated for folder-wide
   inline-style removal. */
.sf-search .block-search {
    background-color:      #F7F7F7;
    color:                 #333;
    border:                solid 1px #9a9a9a;
    padding:               0px;
    -moz-border-radius:    2px;
    -webkit-border-radius: 2px;
    border-radius:         2px;
    margin-bottom:         5px;
}
.sf-search .result-msg-err {
    color:         red;
    font-family:   verdana;
    font-size:     11px;
    font-weight:   bold;
    padding:       16px;
    border-bottom: solid 1px #9a9a9a;
}
.sf-search .result-msg {
    color:       #060;
    font-family: verdana;
    font-size:   14px;
    font-weight: bold;
    padding:     16px;
}
.sf-search #recherche_2 {
    height:                23px;
    background-image:      url(/Images/bg_search.gif);
    background-repeat:     repeat-x;
    font-family:           verdana;
    -moz-border-radius:    2px;
    -webkit-border-radius: 2px;
    border-radius:         2px;
    font-size:             12px;
    color:                 #F60;
    padding-top:           6px;
    font-weight:           bold;
    margin-bottom:         5px;
    border:                #9a9a9a 1px solid;
    padding-left:          16px;
}
.sf-search .contact {
    background-color: #F7F7F7;
    padding:          16px;
}
.sf-search .msg-error {
    display:    block;
    color:      #DD4B39;
    margin-top: 5px;
}
.sf-search .flash-message-info {
    display: none;
}
.sf-search #imgLoading {
    top:              600px;
    left:             540px;
    width:            120px;
    height:           100px;
    background-color: white;
    padding:          0;
    z-index:          1000;
    border:           #999 solid 1px;
    position:         absolute;
    display:          none;
}
/* Per-element inline styles from the same view, scoped under .sf-search. */
.sf-search-flabel {           /* the 7 form-row labels: display:block; margin-top:6px */
    display:    block;
    margin-top: 6px;
}
.sf-search .sf-search-price { /* MinPrice/MaxPrice forminputs: width:auto over theme 190px */
    width: auto;
}
/* The empty / contact result panels reuse .block-search but override its
   #F7F7F7 surface to white with no padding. Defined AFTER .sf-search
   .block-search so it wins the same-specificity tie. text-align handled by the
   global .sf-text-center utility on the centered one (the other was left =
   default, dropped). */
.sf-search .sf-result-panel {
    background-color: White;
    padding:          0px;
}
.sf-search .sf-search-flash-msg { margin-top: 4px; }   /* .flash-message-info .msg */
.sf-search .sf-search-msg-ta {                         /* contact-form textarea */
    background: none repeat scroll 0 0 white;
    border:     1px solid #CCC;
    color:      #444;
}

/* ---- Kits listing page (Kits/Kits.cshtml) ------------------------------- */
/* DEAD: KitsController is template-engine, so this "Les Packs PME/PMI" Razor
   listing never renders. Its in-body <style> block used GENERIC, LIVE-shared
   selectors (.cell-product, .grid-top, .grid-left, .name, .description) that
   would restyle the real category/product grids if globalized, so the whole
   block + the per-element inline styles are scoped under a dead .sf-kits wrapper
   (added to the view's #categorymain). The corner GIFs on its three
   .title-category / .list-man-category bars reuse the global .sf-title-corner
   classes; text-align:center reuses .sf-text-center. Values kept verbatim
   (incl. the !important on .grid-left and the legacy IE `cursor:hand`).
   Migrated for folder-wide inline-style removal. */
.sf-kits .man-block {
    display:       inline-table;
    width:         150px;
    text-align:    center;
    margin-top:    5px;
    margin-bottom: 5px;
}
.sf-kits .cell-product .grid-top {
    width: 241px;
}
.sf-kits .cell-product {
    width:  250px;
    height: 260px;
}
.sf-kits .grid-left {
    height: 260px !important;
}
.sf-kits .cell-product .name {
    font-weight:  bold;
    padding-left: 14px;
}
.sf-kits .cell-product .description {
    width:    236px;
    height:   28px;
    position: relative;
    z-index:  0;
    overflow: visible;
    left:     5px;
}
/* Per-element inline styles from the same view, scoped under .sf-kits. */
.sf-kits-sku-wrap {
    text-align: center;
    padding:    10px;
}
.sf-kits-price-box {
    position:         relative;
    background-color: #FFF;
    left:             1px;
}
.sf-kits .grid-price {
    padding-left: 14px;
}
.sf-kits .siteprice {
    font-size:   9pt;
    font-weight: bold;
    color:       green;
    margin-left: 5px;
}
.sf-kits .more_details {
    margin-top: 2px;
}
.sf-kits-man-list {
    text-align: left;
    width:      100%;
    cursor:     hand;   /* legacy IE keyword kept verbatim (dead view) */
}

/* ---- Kit detail page (Kits/Index.cshtml) -------------------------------- */
/* DEAD: KitsController is template-engine, so this kit detail Razor view (the
   twin of Products/Index.cshtml) never renders. It shares GENERIC IDs/classes
   with the LIVE template-engine product detail page (#productPrices_prices,
   #imgLoading, #productTitle, #productContent, #pricewrapper, .siteprice), so
   its two in-body <style> blocks + the price/title/spinner inline styles are
   scoped under a dead .sf-kit-detail wrapper (added around the view body) to
   keep them off the live page. The parts that match Products/Index reuse the
   global classes that port already created — .sf-product-titledesc (#titleDesc),
   #qty, .sf-suggested-panel + #_SuggestedItems1_SuggestedItemsPanel .suggesteditem
   — and the rest reuse utilities (.sf-float-right, .sf-inline, .sf-bw-0,
   .sf-va-middle, .sf-block, .sf-cursor-pointer, .sf-hidden). The #divLoading
   caption is covered by the existing global #divLoading .text-loading. DROPPED
   from <style> block 2: the invalid `# DataList1 a` selector (space after #,
   matches nothing — same as the Products/Index port) and the bare .suggesteditem
   rule (the existing #_SuggestedItems1_SuggestedItemsPanel .suggesteditem already
   covers the same elements). NOTE: this view's #imgLoading rule matches no
   element in the markup (the spinner here is #divLoading) — it is a copy-paste
   leftover, ported verbatim under the wrapper where it stays inert. Values kept
   verbatim (incl. the !important flags). Migrated for folder-wide inline-style
   removal. */
.sf-kit-detail #productPrices_prices .prices p {
    margin: 0 !important;
}
.sf-kit-detail #productPrices_prices .prixPublic {
    color:           red !important;
    text-decoration: line-through;
}
.sf-kit-detail #productPrices_prices .prixSpecial span {
    font-size:   11pt;
    font-weight: bold;
    color:       Green !important;
}
.sf-kit-detail #productPrices_prices .prixSpecialOverrided {
    text-decoration: line-through;
    color:           Red;
}
.sf-kit-detail #productPrices_prices .prixSpecialOverrided span {
    font-size: 9pt;
}
.sf-kit-detail #productPrices_prices .economie {
    color: Orange;
}
.sf-kit-detail #imgLoading {
    top:              200px;
    left:             380px;
    width:            150px;
    height:           40px;
    background-color: white;
    padding:          14px;
    z-index:          1000;
    border:           #999 solid 1px;
    position:         absolute;
    display:          none;
}
.sf-kit-detail #productTitle {
    font-weight: bold;
    margin-top:  4px;
}
.sf-kit-detail #productContent {
    margin-top: 22px;
}
.sf-kit-detail #pricewrapper span {
    color: green;
}
.sf-kit-detail .siteprice {
    font-size:   9pt;
    font-weight: bold;
    color:       green;
    margin-left: 5px;
}

/* ---- Category grid page (Category/Grid.cshtml) -------------------------- */
/* DEAD: Category Razor views never render (CategoryController returns Content()
   from the template engine). The real grid part at the top of the view reuses
   global classes: the .title-category corner GIFs use .sf-title-corner, and the
   #divLoading caption is covered by the existing global #divLoading .text-loading.
   Only the banner margin needs a class: */
.sf-cat-banner {
    margin-bottom: 5px;
}
/* Below the grid, this view has ~440 lines of an ORPHANED "DEVIS" (quote) print
   template pasted in by mistake — a hardcoded fake Voip-France invoice that
   renders nowhere. Per the user's decision its content is KEPT but its two
   in-body <style> blocks (super-generic A / BODY,TD,CENTER,P / .style1-.style17
   selectors that would wreck the whole site if globalized) + every per-element
   inline style are ported here scoped under a dead .sf-cat-devis wrapper (added
   to the leftover <table>). Notes:
   - The bare `BODY` selector is dropped (a <body> can't exist inside a table);
     TD/CENTER/P become .sf-cat-devis descendants.
   - `.style1` was declared in BOTH source blocks (border in block 1, text-align
     :center in block 2 — non-conflicting), so the merged rule carries both, as
     the source cascade did.
   - Several inline `width: NNN` values are UNITLESS (110 / 20 / 475) — invalid
     CSS that every browser ignores, so those no-op widths are dropped (matching
     how the Kits/Search ports dropped invalid selectors). The cells they were on
     collapse to the shared .sf-devis-cell border/padding.
   - .sf-devis-cell is defined AFTER .style1 so its `border` shorthand wins the
     same-specificity tie on cells carrying both classes — reproducing the inline
     #808080 border that won in the source. */
.sf-cat-devis {
    background-color: White;
    width:            100%;
    border-collapse:  collapse;
}
.sf-cat-devis a               { text-decoration: none; }
.sf-cat-devis a:link          { color: #3366cc; text-decoration: none; }
.sf-cat-devis a:visited       { color: #663399; text-decoration: none; }
.sf-cat-devis a:active        { color: #cccccc; text-decoration: none; }
.sf-cat-devis a:hover         { text-decoration: underline; }
.sf-cat-devis td,
.sf-cat-devis center,
.sf-cat-devis p {
    font-family: Geneva, Verdana, Arial, Helvetica;
    font-size:   10px;
    color:       #333333;
}
.sf-cat-devis .body    { font-family: Geneva, Verdana, Arial, Helvetica; font-size: 10px; color: #333333; }
.sf-cat-devis .content { font-family: Arial, Helvetica, sans-serif; font-size: 11px; font-weight: normal; color: #000000; }
.sf-cat-devis .title   { font-family: Helvetica, Arial, sans-serif; font-size: 10px; font-weight: normal; color: #000000; }
.sf-cat-devis .headline{ font-family: Helvetica, Arial, sans-serif; font-size: 14px; font-weight: bold; color: #000000; }
.sf-cat-devis .message { font-family: Geneva, Verdana, Arial, Helvetica; font-size: 9px; }
.sf-cat-devis .style1 {
    border-left-style: solid;
    border-left-width: 1px;
    border-right:      1px solid #C0C0C0;
    border-top-style:  solid;
    border-top-width:  1px;
    border-bottom:     1px solid #C0C0C0;
    text-align:        center;   /* from the 2nd source block's .style1 */
}
.sf-cat-devis .style3  { font-size: large; }
.sf-cat-devis .style4  { text-align: left; }
.sf-cat-devis .style5 {
    border-left-style: solid;
    border-left-width: 1px;
    border-right:      1px solid #C0C0C0;
    border-top-style:  solid;
    border-top-width:  1px;
    border-bottom:     1px solid #C0C0C0;
}
.sf-cat-devis .style7  { font-weight: bold; }
.sf-cat-devis .style8  { font-size: 9px; }
.sf-cat-devis .style9  { text-align: center; font-size: 9px; }
.sf-cat-devis .style10 { font-size: 10px; }
.sf-cat-devis .style11 { border-width: 0; }
.sf-cat-devis .style12 { text-align: right; }
.sf-cat-devis .style13 {
    text-align:         center;
    border-left-width:  0;
    border-right-color: #C0C0C0;
    border-right-width: 0;
    border-top-width:   0;
    border-bottom-color:#C0C0C0;
    border-bottom-width:0;
}
.sf-cat-devis .style14 { color: #666666; }
.sf-cat-devis .style15 { text-align: left; font-size: 10px; }
.sf-cat-devis .style16 { font-weight: normal; }
.sf-cat-devis .style17 { font-weight: normal; color: #FF0000; }
/* Per-element inline styles from the invoice table, scoped under .sf-cat-devis. */
.sf-devis-frame { width: 700px; height: 910px; }
.sf-cat-devis .sf-devis-w100 { width: 100%; }
.sf-cat-devis .sf-devis-w400 { width: 400px; }
.sf-cat-devis .sf-devis-w300 { width: 300px; }
.sf-cat-devis .sf-devis-cell {
    border:  1px solid #808080;
    padding: 1px 4px;
}
.sf-cat-devis .sf-devis-cell-text {
    border:     1px solid #808080;
    padding:    1px 4px;
    text-align: left;   /* font/size/color inherited from .sf-cat-devis td */
}
.sf-cat-devis .sf-devis-total-cell {
    border-width: 1px;
    text-align:   right;
}
.sf-cat-devis .sf-devis-rowspan-cell {
    border-width: 1px;
}
.sf-cat-devis .sf-devis-foot-cell {
    border-width: 1px;
    text-align:   left;
}


/* -------------------------------------------------------------------------
   5. UTILITIES                            (populated from commit 5 onward)
   -------------------------------------------------------------------------
   Display:     .sf-hidden .sf-inline .sf-inline-block .sf-flex
   Float/clear: .sf-float-left .sf-float-right .sf-clear
   Text:        .sf-text-left .sf-text-center .sf-text-right
   Width:       .sf-w-full .sf-w-half .sf-mw-content
   Spacing:     .sf-mt-0..10 .sf-mb-0..10 .sf-ml-0..10 .sf-mr-0..10
                .sf-pt-0..10 .sf-pb-0..10 .sf-pl-0..10 .sf-pr-0..10
   Font:        .sf-fs-xs..xl .sf-fw-bold
   VAlign:      .sf-va-middle .sf-va-super .sf-va-bottom
   Icons:       .sf-icon-16 .sf-icon-20 .sf-icon-24
   Borders:     .sf-bw-0
   ------------------------------------------------------------------------- */

/* ---- Text alignment -------------------------------------------------- */
.sf-text-left   { text-align: left; }
.sf-text-center { text-align: center; }
.sf-text-right  { text-align: right; }

/* ---- Float ----------------------------------------------------------- */
.sf-float-right { float: right; }

/* ---- Font weight ----------------------------------------------------- */
.sf-fw-bold   { font-weight: bold; }
.sf-fw-normal { font-weight: normal; }

/* ---- Font size ------------------------------------------------------- */
.sf-fs-lg { font-size: var(--font-lg); }   /* 16px */

/* ---- Display / visibility -------------------------------------------- */
.sf-hidden    { display: none; }
.sf-inline    { display: inline; }
.sf-block     { display: block; }
.sf-invisible { visibility: hidden; }

/* ---- Spacing --------------------------------------------------------- */
.sf-mr-0 { margin-right: 0; }
.sf-mb-5 { margin-bottom: var(--space-5); }   /* 20px */

/* ---- Vertical align -------------------------------------------------- */
.sf-va-middle { vertical-align: middle; }
.sf-va-bottom { vertical-align: bottom; }

/* ---- Cursor ---------------------------------------------------------- */
.sf-cursor-pointer { cursor: pointer; }
/* Disabled-looking link (used by pager prev/next at the ends) */
.sf-disabled-link { pointer-events: none; cursor: default; }

/* ---- Borders --------------------------------------------------------- */
.sf-bw-0 { border: none; }

/* ============================================================================
   BARE POPUP TYPOGRAPHY  (.mv-bare-popup)
   Emitted by CustomPageController.Index when ?bare=1 — the terms & conditions
   (and any custom page) loaded chrome-less inside the checkout terms modal.
   The bare page loads theme styles.css (incl. the global #main-content 12px
   !important rule and the h1 halftone graphic) BEFORE this file, so we re-assert
   a clean reading scale with matching specificity + !important.
   ============================================================================ */
.mv-bare-popup {
    background: #fff;
}
.mv-bare-popup #main-content {
    max-width: 760px !important;
    width: auto !important;
    margin: 0 auto !important;
    padding: 26px 32px 36px !important;
    color: #374151;
    font-family: Montserrat, Ubuntu, -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", Arial, sans-serif;
    line-height: 1.65;
}

/* Body copy — lift off the cramped 12px to a comfortable reading size */
.mv-bare-popup #main-content p,
.mv-bare-popup #main-content li,
.mv-bare-popup #main-content td,
.mv-bare-popup #main-content span,
.mv-bare-popup #main-content div {
    font-size: 14px !important;
    line-height: 1.65 !important;
    color: #374151 !important;
}

/* Headings — clean, no halftone background, clear hierarchy */
.mv-bare-popup #main-content h1,
.mv-bare-popup #main-content h2,
.mv-bare-popup #main-content h3,
.mv-bare-popup #main-content h4 {
    color: #111827 !important;
    font-family: Montserrat, Ubuntu, -apple-system, "Segoe UI", Arial, sans-serif !important;
    font-weight: 700 !important;
    line-height: 1.3 !important;
    letter-spacing: -.01em !important;
    background: none !important;   /* kill the theme h1 assets/H1.png texture */
    border: 0 !important;
    box-shadow: none !important;
    padding: 0 !important;
    margin: 1.5em 0 .5em !important;
}
.mv-bare-popup #main-content h1 { font-size: 22px !important; margin-top: 0 !important; }
.mv-bare-popup #main-content h2 { font-size: 18px !important; }
.mv-bare-popup #main-content h3 { font-size: 16px !important; }
.mv-bare-popup #main-content h4 { font-size: 14px !important; }

/* First block flush to the top */
.mv-bare-popup #main-content > *:first-child,
.mv-bare-popup #main-content p:first-child { margin-top: 0 !important; }

/* Lists */
.mv-bare-popup #main-content ul,
.mv-bare-popup #main-content ol {
    padding-left: 22px !important;
    margin: .6em 0 1em !important;
}
.mv-bare-popup #main-content li { margin: .35em 0 !important; }

/* Links */
.mv-bare-popup #main-content a {
    color: #3973ac !important;
    text-decoration: underline;
}
.mv-bare-popup #main-content a:hover { color: #2c3e50 !important; }

/* Tables inside the terms (if any) read as plain text blocks */
.mv-bare-popup #main-content table { max-width: 100% !important; }
.mv-bare-popup #main-content img { max-width: 100% !important; height: auto !important; }
