/* LVL UP RX — "Didone editorial" type system.
   Typography only: families, sizes, weights, styles, tracking, leading, case and wrapping.
   Colours, layout, spacing and copy are untouched. Linked last in <head> so it wins the cascade.

   VOICE      Bodoni Moda   400 / 400 italic   headlines, product names, editorial prices, pull quotes
   STRUCTURE  Inter Tight   400 / 600 / 800    body, labels, nav, buttons, data
   LAB        IBM Plex Mono 400                lot numbers, timestamps, edition labels, disclaimers

   Fonts load from Google Fonts (see <head>). The "… Self" faces below are self-hosted @fontsource
   copies (SIL OFL, assets/fonts/) that take over if Google Fonts is blocked. */

@font-face{font-family:"Bodoni Moda Self";font-style:normal;font-weight:400;font-display:swap;src:url("../fonts/bodoni-moda-latin-400-normal.woff2") format("woff2")}
@font-face{font-family:"Bodoni Moda Self";font-style:italic;font-weight:400;font-display:swap;src:url("../fonts/bodoni-moda-latin-400-italic.woff2") format("woff2")}
@font-face{font-family:"Inter Tight Self";font-style:normal;font-weight:400;font-display:swap;src:url("../fonts/inter-tight-latin-400-normal.woff2") format("woff2")}
@font-face{font-family:"Inter Tight Self";font-style:normal;font-weight:600;font-display:swap;src:url("../fonts/inter-tight-latin-600-normal.woff2") format("woff2")}
@font-face{font-family:"Inter Tight Self";font-style:normal;font-weight:800;font-display:swap;src:url("../fonts/inter-tight-latin-800-normal.woff2") format("woff2")}
@font-face{font-family:"IBM Plex Mono Self";font-style:normal;font-weight:400;font-display:swap;src:url("../fonts/ibm-plex-mono-latin-400-normal.woff2") format("woff2")}

:root{
  --font-voice:"Bodoni Moda","Bodoni Moda Self","Didot","Bodoni 72",serif;
  --font-sans:"Inter Tight","Inter Tight Self","Helvetica Neue",Helvetica,Arial,sans-serif;
  --font-mono:"IBM Plex Mono","IBM Plex Mono Self",ui-monospace,monospace;

  --fs-masthead:clamp(3.5rem,10vw,7.5rem);
  --fs-hero:clamp(3rem,8vw,6.5rem);
  --fs-h1:clamp(2.25rem,5vw,4rem);
  --fs-h2:clamp(1.75rem,3.2vw,2.75rem);
  --fs-h3:clamp(1.25rem,2vw,1.6rem);
  --fs-body:clamp(.8125rem,.78rem + .15vw,.875rem);
  --fs-small:.75rem;
  --fs-label:.72rem;
  --fs-swiss:.75rem;
  --fs-numeral:clamp(5rem,14vw,9.5rem);
  --fs-mono:.75rem;
  --fs-caption:.6875rem;
  --fs-caption-meta:.625rem;

  /* Legacy names still used by older component stylesheets */
  --serif:var(--font-voice);--sans:var(--font-sans);--display:var(--font-voice);
  --font-display:var(--font-voice);--font-body:var(--font-sans);--body:var(--font-sans);
}

/* ─── Base ─────────────────────────────────────────────────────────────
   Only the listed weights exist; with synthesis off, Bodoni can never render bold
   and requests for other weights snap to the nearest real face. */
html{font-synthesis:none;font-optical-sizing:auto}
body{font-family:var(--font-sans);font-weight:400}
button{font-family:var(--font-sans)}
:where(b,strong){font-weight:600}
:where(input,select,textarea){font-family:var(--font-sans)!important;font-size:max(16px,1rem)!important}
:where(input,textarea)::placeholder{font-family:var(--font-sans)}

/* ─── STRUCTURE: body copy ───────────────────────────────────────────── */
:where(p,li,dd,blockquote,address,td,details summary ~ *,.pp-faq p){
  font-size:var(--fs-body)!important;font-weight:400!important;line-height:1.8!important;letter-spacing:.08em!important;
  text-transform:uppercase!important;
}
:where(small,figcaption,[class*="footnote"],[class*="-note"]:not(button)){font-size:var(--fs-small)!important;line-height:1.5!important;letter-spacing:0}
.pp-faq button{font-family:var(--font-sans)!important;font-size:var(--fs-body)!important;font-weight:600!important;letter-spacing:0!important;line-height:1.4!important}

/* ─── STRUCTURE: labels (eyebrows, nav, buttons, tabs, filters, badges, CTAs) ─ */
:is([class*="eyebrow"],[class*="kicker"],[class*="label"],[class*="badge"],[class*="__tag"],[class*="-tag"],[class*="pill"],
    [class*="crumb"],[class*="chip"],[class*="filter"],[role="tab"],.tab,.btn,[class*="btn"],[class*="cta"],
    button:not(:has(*)),nav a,header a,[class*="nav"] :is(a,button),[class*="menu"] :is(a,button),
    label,.fl,a.link,.note,.cascade-collection,.ps-skip,.ps-collection,.ps-material-state,.ps-scroll-cue,.ps-top span,.ps-caption > span,.ps-object-id span,.ps-steps button,.ps-steps button span,.ss-brand span,.ss-hint,.ss-controls a,.mq-item,.focus-intro span,.focus-card-top span,.focus-card-category,.cat-section-title,.philo-back,.assay-num,.gd-card-cat,.gd-card-dl,.gd-card-size,.pp-dashlink,.lvl-film-watch,.card__idx,.card__meta,.rail__tot,.rail-kicker,.mnp-section,.co-step-label,.co-step-circle,.co-grand-note,.cart-count,.co-eyebrow,.metric-caption,.metric-kicker,.f-col-title,.f-copy):not(.f-tag,.collection-vial-label,.collection-vial-label *.coll-masthead__research-label,.sr-only,.ss-sr,.pp-faq button,
       :has(h1,h2,h3,h4,p,div,img,svg,input,select)){
  font-family:var(--font-sans)!important;
  font-size:max(11px,var(--fs-label))!important;
  font-weight:400!important;
  font-style:normal!important;
  letter-spacing:.26em!important;
  line-height:1.4!important;
  text-transform:uppercase;
  white-space:nowrap;
}

/* ─── STRUCTURE: Swiss data (spec rows, COA data, footer columns, checkout/order data) ─ */
:is(.lv-plate__identity,.lv-plate__goal,.lv-plate__dose,.blend-compounds,.blend-tier,.sbc-label-name,.cd-val,
    .coa-name,.coa-assay,#lab-page .coa-assay,.f-col-title,.f-col a,.footer-col a,
    .co-total-val,.co-summary-price,.co-shipping-info-name,.co-shipping-price,.co-shipping-info-time,.co-review-value,
    .co-step-row-title,.co-pay-order-num-val,#co-order-number,#co-memo-order-number,.co-memo-num,.co-step-row-num,
    .cart-item-price,.cart-item-qty,.order-product-info-detail,.order-product-info-price,.order-qty-display,
    .mp-order-total strong,.mp-today-card strong,.mp-calculation-values strong,.lvl-account .order__id,.lvl-account .items .tot,
    .pp-control output,.pp-result-main strong,#pp-new-earn,#pp-repeat-earn,#pp-volume,#pp-rate){
  font-family:var(--font-sans)!important;
  font-size:max(11px,var(--fs-swiss))!important;
  font-weight:600!important;
  font-style:normal!important;
  letter-spacing:.01em!important;
  line-height:1.3!important;
  text-transform:uppercase;
  font-feature-settings:"tnum";
}
/* Swiss pairs: the label half stays Regular. */
:is(.co-total-label,.co-review-label,.cd-lbl,.co-step-row-desc,.sbc-label-hint){
  font-family:var(--font-sans)!important;font-size:max(11px,var(--fs-swiss))!important;font-weight:400!important;
  letter-spacing:.01em!important;line-height:1.3!important;text-transform:uppercase;
}

/* ─── LAB: mono ─────────────────────────────────────────────────────── */
:is(.coa-lot,.coa-date,[class*="lot-"],time,.lvl-film-clock,.gd-count,.ss-brand small,.philo-mantra,
    .lvl-account .mono,.lvl-account .code,
    .dis-txt,.d-disclaimer,.gate-legal,.order-legal,.f-legal,.collection-detail-notice,[class*="use-notice"]){
  font-family:var(--font-mono)!important;
  font-size:var(--fs-mono)!important;
  font-weight:400!important;
  font-style:normal!important;
  letter-spacing:.12em!important;
  line-height:1.6!important;
  text-transform:uppercase;
  font-feature-settings:"tnum";
}

/* ─── VOICE ─────────────────────────────────────────────────────────── */
/* Hero headline (magazine cover). */
#hero .lvl-film-title{
  font-family:var(--font-voice)!important;font-size:var(--fs-hero)!important;font-weight:400!important;
  line-height:.92!important;letter-spacing:-.025em!important;font-feature-settings:"kern","liga";
}
/* Decorative watermark words keep their size; only the face changes. */
.philo-hero::before,.related-library::after,#lab-page .quality-section::after{font-family:var(--font-voice)!important;font-weight:400!important}

/* Page headlines → H1; section headlines → H2. */
:is(.philo-side-title,.gate-title,.hero-h1,h1.s-title,.con-title,#shop-all-page .coll-masthead h1,.cv-main-title,h1.pp-display,
    .pd-bar h1,.mp-welcome-story h1,.mp-page-head h1,#bundle-page-title,.co-intro h1,.philo-hero-copy h1,
    #lab-page .quality-heading h1,.lvl-account .h1,#detail-page .d-name,#detail-page.glow-profile .d-name,.d-name){
  font-family:var(--font-voice)!important;font-size:var(--fs-h1)!important;font-weight:400!important;
  line-height:1!important;letter-spacing:-.02em!important;font-feature-settings:"kern","liga";
}
:is(.order-title,.order-confirm-title,.v2-intro-lede,.philo-lede,.philo-principles-head h2,.philo-reframe,.philo-closing h2,
    h2.s-title,.con-form-h2,.footer-list h2,.upsell-title,.lv-register__title,.d-inside-title,.co-success-title,.co-review-intro h2,
    h2.pp-display,.pa-step h2,.pd-heading h2,#home-page .vt-title,.focus-atlas h2,.mp-onboarding h2,.mp-points-hero h2,
    .mp-section-label h2,.mp-empty h2,.mp-syringe-heading h2,.mp-surface h2,.mp-modal h2,.selection-upsell .upsell-title,
    .vial-heading h2,.ss-lede,.co-summary-intro,#checkout-overlay .co-review-intro h2,.research-cascade .hero__title,.elev-head,
    .philo-closing .philo-final-line,.philo-path h2,.philo-members h2,.related-library h2,#lab-page .assay-head h2,
    .lvl-account .h2,.lvl-account .hero h2,#related-library-title){
  font-family:var(--font-voice)!important;font-size:var(--fs-h2)!important;font-weight:400!important;
  line-height:1.08!important;letter-spacing:-.015em!important;font-feature-settings:"kern","liga";
}
/* Card titles, product names, pull quotes → H3. */
:is(.order-product-info-name,.rail-title,.philo-card-title,.vs-name,.pc-name,.proof-h,.prq-quote,.pillar-title,.ea-title,
    .gd-card-title,.community-title,.upsell-product-name,.bsg-product-name,#blends-page .blend-name,.blend-name,.cart-item-name,
    .testimonial-strip-text,.pp-step h3,.pp-dashbrand,.pp-dashhello,.pp-benefit h3,.pd-card h2,.pd-card h3,
    #home-page .v2-intro-main h3,.focus-card-title,.focus-detail h3,.mp-order-heading h3,.mp-quick-title,.mp-reward-card h2,
    .mp-library-card h2,.mp-saved-card h3,.mp-perk-card h2,.mp-tracking-block h3,#product-study h2,#product-study h3,
    .collection-pair h3,.selection-upsell-product h3,.bundle-content h2,.ss-card-title,#checkout-overlay .co-summary-name,
    .co-discover h3,.research-cascade .card__title,.related-guide__title,#lab-page .metric-title,#lab-page .assay-step h3,
    #lab-page .coa-head h3,.lv-plate__title,.pd-brand,.collection-coming span,.lvl-account .h3,.lvl-account .who__name,
    #related-library-product){
  font-family:var(--font-voice)!important;font-size:var(--fs-h3)!important;font-weight:400!important;
  line-height:1.2!important;letter-spacing:-.005em!important;font-style:normal;font-feature-settings:"kern","liga";
}
/* Voice accents that keep their designed size (inline emphasis, monograms, index numerals). */
:is(#home-page .vt-metric b,#home-page .vt-callout b,#home-page .vt-purity-note b,.focus-card-vertical,.mp-card-top > span:first-child,
    .mp-member-card > strong,.mp-side-note > strong,.mp-saved-card strong,.mp-dialog-ref strong,#product-study .ps-note b,
    .co-discovery-item strong,.co-logo,.pp-feature i,.lvl-account .marquee__t,
    .philo-card-num,.ben-num,.w-num,.metric-num,.step-num,.coa-purity-number,.coa-point-num,.hms-step-num,
    #shop-all-page .coll-masthead__number,.testimonial-strip-quote-mark,.pp-stat strong,.pp-num,.lvl-account .num,
    .lvl-account .ghostnum,.lvl-account .medal,.lvl-account .bundle__n,.lvl-account .ladder__s b,.lvl-account .face__cap b,
    .mp-ready-mark,.mp-avatar,.mp-points-medallion strong,.mp-privilege-mark,.mp-empty-mark,.mp-reward-summary strong,
    .mp-reward-seal,.mp-reward-value,.mp-visual-readout,.mp-perk-number,.research-cascade .rail__count,.philo-path-num,
    .philo-perk-num,#lab-page .standard-index,#lab-page .metric-value,#lab-page .provenance-index,.rail__cur){
  font-family:var(--font-voice)!important;font-weight:400!important;letter-spacing:-.01em!important;
  font-feature-settings:"kern","liga","tnum";
}
/* Editorial prices: Bodoni, tabular figures, at H3 size beside the product name. */
:is(.pc-price,.lv-plate__price,#blends-page .blend-price,.blend-price,.d-price-display,#detail-page .d-price-display,
    .upsell-product-price,.bsg-price,.selection-upsell-price,.collection-pair .collection-pair-price,.bundle-price-row strong,
    .cart-subtotal-amount,.co-pay-total,.co-total-row.grand .co-total-val,#checkout-overlay .co-total-row.grand .co-total-val,
    #detail-page .vial-row > [data-vial-unit],#detail-page .vial-row > [data-vial-total]){
  font-family:var(--font-voice)!important;font-size:var(--fs-h3)!important;font-weight:400!important;
  letter-spacing:0!important;line-height:1.2!important;text-transform:none!important;
  font-variant-numeric:tabular-nums;font-feature-settings:"kern","tnum";
}

/* Italic voice: the existing <em> in a headline is the one italic accent. */
:is(h1,h2,h3,#hero .lvl-film-title,.ss-lede,.v2-intro-lede,.philo-final-line,.co-summary-intro,.focus-card-title) :is(em,i){
  font-family:var(--font-voice)!important;font-style:italic!important;font-weight:400!important;
}

/* Invitation pattern: membership tier names in Bodoni italic. */
:is(.pp-tier b,#pp-tier-name,#hdrTier){font-family:var(--font-voice)!important;font-style:italic!important;font-weight:400!important;letter-spacing:0!important;text-transform:none!important}

/* Tabular figures for all sans numeric data. */
:is([class*="price"],[class*="total"],[class*="amount"],[class*="qty"],[class*="count"],[class*="-num"],[class*="-val"],output){font-variant-numeric:tabular-nums}

/* ─── WooCommerce (WordPress theme): keep plugin CSS from reverting the system ─ */
body.woocommerce,body.woocommerce-page{font-family:var(--font-sans)!important;font-size:var(--fs-body);line-height:1.65}
body:is(.woocommerce,.woocommerce-page) :is(h1,h2,h3,.product_title,.woocommerce-loop-product__title,.page-title){
  font-family:var(--font-voice)!important;font-weight:400!important;letter-spacing:-.015em;font-feature-settings:"kern","liga";
}
body:is(.woocommerce,.woocommerce-page) h1{font-size:var(--fs-h1);line-height:1}
body:is(.woocommerce,.woocommerce-page) h2{font-size:var(--fs-h2);line-height:1.08}
body:is(.woocommerce,.woocommerce-page) :is(h3,.woocommerce-loop-product__title){font-size:var(--fs-h3);line-height:1.2}
body:is(.woocommerce,.woocommerce-page) :is(.price,.amount){font-family:var(--font-voice)!important;font-weight:400!important;font-variant-numeric:tabular-nums}
body:is(.woocommerce,.woocommerce-page) :is(.shop_table,.woocommerce-checkout-review-order-table,.woocommerce-orders-table,.cart_totals) :is(th,td,.amount){
  font-family:var(--font-sans)!important;font-size:max(11px,var(--fs-swiss));font-weight:600;letter-spacing:.01em;text-transform:uppercase;font-feature-settings:"tnum";
}
body:is(.woocommerce,.woocommerce-page) :is(.button,button,input[type="submit"],.woocommerce-tabs .tabs a,.onsale,label){
  font-family:var(--font-sans)!important;font-size:max(11px,var(--fs-label));font-weight:400!important;letter-spacing:.26em;text-transform:uppercase;white-space:nowrap;
}
body:is(.woocommerce,.woocommerce-page) :is(input,select,textarea){font-family:var(--font-sans)!important;font-size:16px}

/* Flagged: one-word categories in the narrow focus cards overflow at .26em; tracking eased to fit. */
.focus-card-category:not(#_):not(#_){letter-spacing:.14em!important}
/* Flagged: these labels overflow their fixed boxes at .26em; tracking eased (size stays at the 11px floor). */
.ps-collection:not(#_):not(#_){letter-spacing:.1em!important}
.philo-back:not(#_):not(#_){letter-spacing:.04em!important}

/* Size floor (11px) for small meta text inside portal, partner and data components.
   Case, tracking and wrapping are left as designed so form layouts are not forced onto one line. */
:is(.focus-footer span,.focus-interaction-hint,.who__meta span,.lvl-account .foot span,.philo-scroll span,.standard-copy strong,
    .panel-meta span,.provenance-item strong,.gd-card-foot .gd-card-dl,.pp-stat span,.pp-result-main span,.pp-tier span,
    .pp-metric span,.pp-linkbox span,.pp-linkline b,.pa-top span,.pa-progress span,.pa-progress .active,.pa-two label,
    .pa-step label,.pd-person span,.pd-card label,.pd-card span,.mp-card-top sup){
  font-family:var(--font-sans)!important;font-size:max(11px,var(--fs-label))!important;
}

/* Flagged: a full sentence styled as a label must wrap on mobile. */
.focus-intro span{white-space:normal!important}

/* Checkout panel titles (label) and summary line data (Swiss). */
.co-panel-title{font-family:var(--font-sans)!important;font-size:max(11px,var(--fs-label))!important;font-weight:400!important;letter-spacing:.26em!important;text-transform:uppercase;white-space:nowrap}
:is(.co-summary-detail,.co-summary-plan,.co-summary-qty,.cart-item-plan){font-family:var(--font-sans)!important;font-size:max(11px,var(--fs-swiss))!important;font-weight:600!important;letter-spacing:.01em!important;line-height:1.3!important;text-transform:uppercase;font-feature-settings:"tnum"}

/* ─── Photo captions ──────────────────────────────────────────────────
   Text that sits on photography stays small and quiet in the bottom-left corner:
   Inter Tight Regular, tracked caps (the "FOR RESEARCH USE ONLY" style), so the image leads.
   :not(#_) raises specificity above the voice role lists without touching the markup. */
:is(.ss-card-title,.research-cascade .card__title,.card__title,.gd-card-title,.member-guide__body h3,.collection-coming span):not(#_):not(#_){
  font-family:var(--font-sans)!important;font-size:var(--fs-caption)!important;font-weight:400!important;font-style:normal!important;
  letter-spacing:.22em!important;line-height:1.55!important;text-transform:uppercase!important;white-space:normal!important;
}
:is(.ss-card-meta,.card__meta,.card__tag,.card__kicker,.card__idx,.gd-card-cat,.gd-card-sub,.gd-card-dl,.gd-card-size,.member-guide__body .label):not(#_):not(#_){
  font-family:var(--font-sans)!important;font-size:var(--fs-caption-meta)!important;font-weight:400!important;font-style:normal!important;
  letter-spacing:.22em!important;line-height:1.5!important;text-transform:uppercase!important;
}
:is(.gd-card-desc,.member-guide__body p):not(#_):not(#_){
  font-size:var(--fs-small)!important;letter-spacing:.08em!important;line-height:1.7!important;
}

/* Paragraphs that carry a Bodoni voice line (intros, pull quotes) keep their own case. */
:is(.co-summary-intro,.philo-final-line,.rail-title,.testimonial-strip-text,.prq-quote,.philo-reframe):not(#_){text-transform:none!important}

/* Buttons and links that hold a title plus a description (e.g. the Quality standards cards) must wrap. */
:is(button,a):has(> :is(span,strong,b,small) ~ :is(span,strong,b,small)):not(#_){white-space:normal!important}
.standard-control:not(#_):not(#_){letter-spacing:.08em!important;line-height:1.8!important}
.standard-copy:not(#_):not(#_){font-size:var(--fs-body)!important;letter-spacing:.08em!important;line-height:1.8!important}
/* Longer label-styled lines that must wrap inside their boxes. */
:is(.card__meta,.ps-object-id span,.sbc-label-hint,.pp-dashlink,.focus-intro span):not(#_):not(#_){white-space:normal!important}
.pp-dashlink:not(#_):not(#_){letter-spacing:.12em!important}
:is(.shop-all-cat-label,.gd-card-cat,.lvl-account .label,#account-page label,#account-page .label):not(#_):not(#_){white-space:normal!important}
