/**
* Theme Name: Blonwe Child
* Description: This is a child theme of Blonwe, generated by Merlin WP.
* Author: <a href="http://themeforest.net/user/KlbTheme">KlbTheme (Sinan ISIK)</a>
* Template: blonwe
* Version: 1.3.9
*/

.site-header .header-inner > .col-custom-260 {
  display: flex;
  align-items: center;
  justify-content: center;
}

.site-header .site-brand {
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0;
}

.site-header .site-brand img,
.site-header .header-topbar.bordered-bottom,
.site-header .header-main.bordered-bottom {
  border-bottom: 0 !important;
}

.elementor-widget-blonwe-home-slider {
  width: 100%;
  margin: 0 auto;
}

.elementor-widget-blonwe-home-slider,
.elementor-widget-blonwe-home-slider .elementor-widget-container,
.elementor-widget-blonwe-home-slider .container-custom-large,
.elementor-widget-blonwe-home-slider .klb-slider-wrapper,
.elementor-widget-blonwe-home-slider .klb-slider,
.elementor-widget-blonwe-home-slider .slick-list,
.elementor-widget-blonwe-home-slider .klb-banner {
  width: 100% !important;
  /* 1440px to match the Elementor column it sits in, which is the same width as
     every other section. It was 1390px, which left the slide inset 25px either
     side while the sections above and below ran to the full width. */
  max-width: 1440px !important;
  margin-right: auto !important;
  margin-left: auto !important;
  box-sizing: border-box;
}

.elementor-widget-blonwe-home-slider .slick-list {
  overflow: hidden !important;
}

/* Equal-height product cards, in every product list (shop and category
   archives, related products, the Elementor carousels).

   The grids are already flex rows, so .product stretches to the tallest item
   in its row - but .product-wrapper and .product-inner inside it keep their
   natural height, so the button ends up higher on a card whose title fits on
   one line. The height:100% chain below carries the stretched height down to
   .product-inner so the buttons can bottom-align.

   Excluded: the mini-cart list and the list-style layout, which are
   horizontal and would break under a column flexbox. */
.products:not(.woocommerce-mini-cart):not(.list-style) .product > .product-wrapper,
.products:not(.woocommerce-mini-cart):not(.list-style) .product .product-inner {
  height: 100%;
}

.products:not(.woocommerce-mini-cart):not(.list-style) .product .product-inner {
  display: flex;
  flex-direction: column;
}

.products:not(.woocommerce-mini-cart):not(.list-style) .product .content-wrapper {
  display: flex;
  flex: 1;
  flex-direction: column;
}

/* The auto margin sits on the price, not the button, so the price is pushed
   down to the button instead of staying under the title. Any spare height in
   the card then collects between the title and the price, keeping prices and
   buttons on a common baseline whether or not the product is on sale. */
.products:not(.woocommerce-mini-cart):not(.list-style) .product .price {
  margin-top: auto;
}

.products:not(.woocommerce-mini-cart):not(.list-style) .product .product-buttons {
  margin-top: 0;
}

/* Slick lays carousel slides out as floats of their natural height, so the
   track needs to become a flex row before the chain above can do anything. */
[class*="elementor-widget-blonwe-product-carousel"] .slick-track {
  display: flex;
  align-items: stretch;
}

[class*="elementor-widget-blonwe-product-carousel"] .slick-slide {
  height: auto;
}

[class*="elementor-widget-blonwe-product-carousel"] .slick-slide > .product {
  height: 100%;
}

/* Card title and price, matched across every product list.

   These were scoped to the Elementor carousels, which is why the "Novidades"
   cards on the home page and the shop grid drifted apart: same markup, two
   different sets of rules. The carousels render inside a .products container
   like every other list, so one selector now covers the shop and category
   archives, related products and the carousels alike.

   Specificity: .products .product-title (0,2,0) sets the name's line-height to
   1.3 and .price (0,1,0) sets the price to 15px. The two :not() clauses here
   carry this to (0,4,0), which clears both without !important, and they are the
   same exclusions the equal-height rules further down already use.

   min-height on the title reserves two lines so the price and button line up
   across a row whatever the name's length. */
.products:not(.woocommerce-mini-cart):not(.list-style) .product-title {
  /* Exactly two lines at the step's own line-height, so the price and button
     stay level across a row whatever the name's length. */
  min-height: calc(2em * var(--stw-h4-lh));
  font-size: var(--stw-h4-size);
  line-height: var(--stw-h4-lh);
}

/* 18px is stated rather than taken from a token: the body sheet has no 18px
   sans step (16px base, 20px lrg), and its 18px entry is the serif long-form
   one. The 1.2 line-height is kept from the carousel cards so the price sits
   tightly under the name. */
.products:not(.woocommerce-mini-cart):not(.list-style) .price {
  font-size: 18px;
  line-height: 1.2;
  margin-bottom: 16px;
}

:root {
  --wine-button-color: #672823;
  --wine-button-hover: #4d1d1a;
  /* The gold ring in the logo, taken from LogotipoSVG_horizontal.svg (.fil0). */
  --wine-gold: #bd9026;
  /* Pill-shaped buttons. Any value past half the tallest button's height gives
     fully rounded ends, so one number works for every size on the site. */
  --wine-button-radius: 100px;
}

body .btn,
body .button,
body button.button,
body .elementor-button,
body a.add_to_cart_button,
body a.product_type_variable,
body a.single_add_to_cart_button,
body button.single_add_to_cart_button {
  background-color: var(--wine-button-color) !important;
  border-color: var(--wine-button-color) !important;
  color: #ffffff !important;
}

body .btn:hover,
body .button:hover,
body button.button:hover,
body .elementor-button:hover,
body a.add_to_cart_button:hover,
body a.product_type_variable:hover,
body a.single_add_to_cart_button:hover,
body button.single_add_to_cart_button:hover {
  background-color: var(--wine-button-hover) !important;
  border-color: var(--wine-button-hover) !important;
  color: #ffffff !important;
}

@media (min-width: 992px) {
  body .site-header .col-custom-260 {
    flex: 0 0 auto !important;
    width: max-content !important;
    max-width: none !important;
    padding: 0 !important;
    display: flex;
    align-items: center;
    justify-content: flex-start;
  }

  body .site-header .col-custom-260 .site-brand {
    margin: 0 !important;
  }
}

/* Sale price: use the regular price colour instead of the theme's red */
.price ins,
.price ins bdi,
.price ins .woocommerce-Price-amount,
.price ins .woocommerce-Price-amount.amount {
  color: inherit !important;
}

/* Footer: "Follow us" and payment methods sit as columns in the widgets row */
.footer-widgets .widget_footer_social .site-social,
.footer-widgets .widget_footer_payment .site-payment-cards {
  display: block;
}

.footer-widgets .widget_footer_payment .payment-cards {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  column-gap: 18px;
  row-gap: 18px;
  padding-top: 4px;
}

/* The payment marks are inherently wider than a menu column, so this column
   takes a double share of the row instead of wrapping every other logo. */
.footer-widgets .column-widgets > .widget-column:has(.widget_footer_payment) {
  flex: 2 0 0%;
}

/* ---------------------------------------------------------------------------
   Payment logos - sized to each brand's own guidelines.

   --pay-logo-h: 37px is derived, not chosen. SIBS require MB WAY and
   MULTIBANCO to be at least 20mm and to appear "at the same scale".
   Rendering both SVGs at an equal box height puts their shared MB symbol at
   an identical size (measured: 214x200 vs 213x199), so equal height IS equal
   scale. MB WAY is the wider-constrained of the two at 2.051:1, so
   20mm (75.59px) / 2.051 = 36.9px -> 37px. At that height MB WAY is 75.9px
   (20.08mm) and MULTIBANCO 174.9px (46mm), both clearing the 20mm floor.

   Gaps: Apple require clear space of 1/4 the mark height (9.25px here);
   Google require 0.5x the cap-G height (4.3px here). 18px clears both.
--------------------------------------------------------------------------- */
.footer-widgets .widget_footer_payment {
  --pay-logo-h: 37px;
}

.footer-widgets .widget_footer_payment .card-item img {
  height: var(--pay-logo-h);
  width: auto;
  display: block;
}

/* Google ships its mark with the required clear space inside the artwork -
   the visible badge is only 55% of the box height, so the box is scaled up
   to land the badge itself at --pay-logo-h. */
.footer-widgets .widget_footer_payment .card-google-pay img {
  height: calc(var(--pay-logo-h) / 0.545);
}

/* Generic, non-branded icons - no guideline to honour, sized to sit quietly
   next to the brand marks rather than compete with them. */
.footer-widgets .widget_footer_payment .card-cartao-credito img,
.footer-widgets .widget_footer_payment .card-transferencia-bancaria img {
  height: 26px;
}

/* Footer First Column (footer-1): all content in one colour */
.site-footer .footer-widgets .column-brand,
.site-footer .footer-widgets .column-brand *,
.site-footer .footer-widgets .column-brand a:hover,
.site-footer .footer-widgets .column-brand a:focus {
  color: #1b1f22 !important;
}

/* The "(Chamada para a rede fixa nacional)" line belongs to the phone number
   above it, so it sits closer than Bootstrap Reboot's global 1rem gap between
   the contact lines. Matched on the tel: link rather than on position, so
   reordering the widget cannot move the rule onto the wrong line. */
.site-footer .footer-widgets .column-brand .widget-body p:has(a[href^="tel:"]) {
  margin-bottom: 6px;
}

/* Benefit icon boxes: copy always beside the icon, never wrapped underneath.
   The theme's .module-body is a wrapping flexbox whose text block has no
   flex-basis, so on narrow screens its max-content width overflows the line
   and it drops below the icon - which is why the two longer benefits stack
   on mobile while the short one stays inline. */
.elementor-widget-blonwe-icon-box .module-iconbox .module-body {
  flex-wrap: nowrap;
}

.elementor-widget-blonwe-icon-box .module-iconbox .iconbox-content {
  flex: 1 1 auto;
  min-width: 0;
}

/* Product box: keep box type "Type 11" but drop its border.
   Type 11 renders the card as .product-wrapper.style-6, and style-6 is the
   only variant that draws a box (base.css: `border: 1px solid`). Zeroing the
   width also neutralises the data-color border-colour rules and the
   .hot-product `!important` override, since none of them matter at 0 width. */
.products .product .product-wrapper.style-6 {
  border: 0;
}

/* Product gallery: vertical thumbnail strip on the left below 992px.
   The parent theme scopes every .klb-flexslider-thumbnail.vertical rule to
   @media (min-width: 992px), so these mirror them at narrower widths with
   sizes that suit a phone (64px thumbs rather than 80px). */
@media screen and (max-width: 991.98px) {
  .single-product-wrapper .vertical-thumbnails .woocommerce-product-gallery {
    padding-left: 76px;
  }

  .klb-flexslider-thumbnail.vertical {
    position: absolute;
    left: 0;
    top: 0;
    width: 64px;
    z-index: 9;
  }

  /* FlexSlider writes an inline viewport height that is only one thumb tall in
     vertical mode, and its <ol> is absolutely positioned - so `auto` collapses
     the strip to nothing. The parent theme pins 480px for desktop; this is the
     phone equivalent, tall enough for four 64px thumbs plus their margins. */
  .klb-flexslider-thumbnail.vertical .flex-viewport {
    height: 276px !important;
  }

  .klb-flexslider-thumbnail.vertical li,
  .klb-flexslider-thumbnail.vertical li img {
    width: 64px;
    height: auto;
  }

  .klb-flexslider-thumbnail.vertical li {
    margin-bottom: 5px;
  }
}

/* ---------------------------------------------------------------------------
   Cart (WooCommerce Cart block)
   The cart line items are rendered client-side by the block's React
   components, so there is no PHP hook or block attribute for the pieces
   below - they are styled here.
--------------------------------------------------------------------------- */

/* Drop the short description repeated under every cart line item. */
.wc-block-components-product-metadata__description {
  display: none;
}

/* Checkout: hide the "Save 2,00 €" savings badge on order-summary line items.
   Scoped to checkout - the cart shows the same badge and still does. */
.woocommerce-checkout .wc-block-components-sale-badge {
  display: none;
}

/* Boxed layout: every full-bleed band (header rows, Elementor sections,
   footer rows) is capped at the site width, so background colours stop at the
   same 1440px edge the .container already uses instead of running to the
   viewport edge. One rule on the wrapper rather than per-section overrides.

   Overlays and floating UI (.site-overlay, the mobile bottom bar, the
   WhatsApp button, the search modal) are position:fixed, so they resolve
   against the viewport and stay full width - which is what they need. */
.page-content {
  max-width: var(--theme-site-width);
  margin-left: auto;
  margin-right: auto;
}

/* WooCommerce Checkout block: "Finalizar encomenda" button.
   The blocks expose no colour controls - woocommerce/proceed-to-checkout-block
   declares no colour supports - and Blonwe is a classic theme, so there is no
   global-styles UI either. Reuses the same --wine-button-color the rest of the
   site's buttons already use. */
.wc-block-components-checkout-place-order-button,
.wp-block-woocommerce-checkout .wc-block-components-button.contained {
  background-color: var(--wine-button-color);
  border-color: var(--wine-button-color);
  color: #fff;
}

.wc-block-components-checkout-place-order-button:hover,
.wp-block-woocommerce-checkout .wc-block-components-button.contained:hover {
  background-color: var(--wine-button-hover);
  border-color: var(--wine-button-hover);
  color: #fff;
}

/* Free-shipping notice: drop the bookmark icon before the message.
   The icon is hardcoded in the plugin template
   (blonwe-core/.../shipping-progress-bar/free-shipping.php), so there is no
   setting for it. The theme already hides it this way inside the mini-cart;
   this extends that to every place the notice appears. */
.klb-free-shipping .shipping-notice i {
  display: none;
}

/* Cart totals: hide the "Envio para …" destination line.
   WooCommerce prints it inside the shipping row, gated to is_cart(), and it
   also carries the "Alterar morada" link. Scoped to the cart body class so
   the same markup elsewhere is unaffected. */
.woocommerce-cart .woocommerce-shipping-destination {
  display: none;
}

/* Cart/checkout totals: line the shipping amount up with its "Portes de envio"
   label. The method <li> carries a 15px bottom margin, and because the table
   cells are vertically centred that margin lifts the amount above the label's
   baseline. Dropping it on the last item keeps the spacing between methods
   when more than one is offered. The selector repeats the #shipping_method
   id because the theme's `ul#shipping_method li` rule would otherwise win on
   specificity. */
.cart_totals ul#shipping_method li:last-child {
  margin-bottom: 0;
}

/* Header dropdowns: remove the dead gap under the menu item.

   Root cause: .klb-menu-nav.horizontal .sub-menu uses `top: calc(100% - 1px)`,
   but the <li> is position:static, so 100% resolves against .site-header
   (134px tall) instead of the item (bottom at 114px). The panel therefore
   opens 19px below its trigger. Crossing that dead band drops :hover, and the
   closed panel sets pointer-events:none so it can never be re-entered - the
   submenu was unreachable by mouse.

   Fix is geometric, not timing based: pull the panel's box up by the 19px so
   it is flush with the item, and add the same 19px back as padding so the
   visible contents do not move. Pointer travel from trigger to panel is now
   continuous, which is what a dropdown should be - no hover delay, no
   lingering panel, nothing to mistime. */
.klb-menu-nav.horizontal .klb-menu > .menu-item-has-children > .sub-menu {
  margin-top: -19px;
  padding-top: calc(2.375rem + 19px);
}

/* Boxed mega menu: columns the width of an ordinary dropdown, panel sized to
   fit them, sitting under its own trigger. The theme gives the panel
   width:100% of the 1360px container and each column flex:1, so two columns
   become 637px each and the panel spans the whole page. */
.klb-menu-nav.primary-menu .klb-menu .mega-menu.mega-menu-boxed {
  position: relative;
}

.klb-menu-nav.primary-menu .klb-menu .mega-menu.mega-menu-boxed > .sub-menu {
  width: max-content;
  left: 0;
  right: auto;
}

.klb-menu-nav.primary-menu .klb-menu .mega-menu.mega-menu-boxed > .sub-menu > li {
  flex: 0 0 208px;
}

/* Mega menu: leave the page at its own colour instead of veiling it.
   The theme dims the whole viewport with .site-overlay while the JS keeps
   body.mega-menu-hover set - base.css takes it to opacity .2 in the light
   skin, base-dark.css to .6 - both at the same specificity as a plain
   override, so the class is repeated to outrank them without !important.
   Hiding it as well as clearing the opacity keeps the invisible layer from
   swallowing clicks on the page underneath. The theme dims
   .mobile-filter-overlay from the same rule, and that element is present on
   every shop and category page, so it has to be covered too - otherwise those
   pages still darken while the homepage looks fine. It is scoped to
   .mega-menu-hover so the sidebar filter drawer keeps its own backdrop, which
   sidebarfilter.js animates with GSAP inline styles. */
body.mega-menu-hover .site-overlay.site-overlay,
body[data-theme].mega-menu-hover .site-overlay.site-overlay,
body.mega-menu-hover .mobile-filter-overlay.mobile-filter-overlay,
body[data-theme].mega-menu-hover .mobile-filter-overlay.mobile-filter-overlay {
  opacity: 0;
  visibility: hidden;
}

/* Cart/Checkout blocks: match the classic totals presentation.
   The shipping row repeats the method name under its value ("Portes de envio"
   below "30,00 €"), which duplicates the row label once that label is renamed
   to Portes de envio. */
.wc-block-components-totals-shipping .wc-block-components-totals-item__description,
.wc-block-components-totals-item__description:empty {
  display: none;
}

/* Cart/Checkout blocks: give the summary column the same grey panel the
   classic templates use for "Total no carrinho"
   (.cart-wrapper .cart-collaterals .cart_totals in base.css:17413-17422).

   The gap between the two columns already comes from the main column's
   padding-right, so the sidebar only needs its own padding swapped for even
   panel padding - adding a margin here pushed the row past 100% and wrapped
   the sidebar underneath the items. align-self keeps the panel hugging its
   content rather than stretching to the items column's height. */
@media screen and (min-width: 992px) {
  .wc-block-components-sidebar-layout .wc-block-components-sidebar {
    align-self: flex-start;
    padding: 2.1875rem;
    background-color: var(--color-gray25);
    border-radius: var(--theme-radius-base);
  }
}

/* Panel heading: match the classic rule - one divider, under the title only.
   WooCommerce rules this heading above *and* below and pads it 20px on both
   sides; the heading is the first thing in the panel, so the top divider and
   its padding are dropped. The `body` prefix is needed because WooCommerce's
   own rule ties at (0,2,0) and loads after this file. */
body .wc-block-components-sidebar .wc-block-components-checkout-order-summary__title {
  margin-top: 0;
  margin-bottom: 0.75rem;
  padding-top: 0;
  padding-bottom: 0.625rem;
  border-top: 0;
  border-bottom: 1px solid var(--color-gray300);
}

/* Footer note strip: full-width row under the widget columns, used for the
   VAT notice. The text lives in a Custom HTML widget in Appearance > Widgets >
   Footer Fifth Column, so it stays editable without touching this file. */
.footer-widgets .footer-inner > .column.footer-note {
  flex: 0 0 100%;
  width: 100%;
  max-width: 100%;
  margin-top: 0;
  padding-top: 0;
}

.footer-widgets .footer-note .footer-vat-notice {
  margin: 0;
  font-size: 0.8125rem;
}

/* Age verification popup (Surbma Yes/No Popup).
   The plugin ships UIkit's default chrome - grey header and footer bars with
   divider rules, a blue primary button and a washed-out secondary one - none of
   which belongs on this site. Rules are keyed on the popup's id so they outrank
   the plugin's single-class UIkit selectors without !important, and they read
   the theme's own custom properties so the popup follows any Customizer change
   to the brand colour or radius. */
#surbma-yes-no-popup.uk-modal {
  background: rgba(27, 31, 34, 0.7);
}

/* Centre the dialog in the viewport. The plugin leaves it block-level with a
   fixed 50px top margin, which pins it near the top of the screen. Scoped to
   .uk-open - the class the plugin adds when showing and removes when hiding -
   so the inline display:none it sets on close still wins. */
#surbma-yes-no-popup.uk-modal.uk-open {
  display: flex !important;
  padding: 1.5rem;
}

#surbma-yes-no-popup .uk-modal-dialog {
  /* auto margins centre a flex item on both axes and, unlike align-items,
     still let a dialog taller than the viewport scroll to its own top. */
  margin: auto;
  width: 100%;
  max-width: 560px;
  padding: 3rem;
  border-radius: var(--theme-radius-base, 4px);
  box-shadow: 0 18px 50px rgba(27, 31, 34, 0.22);
}

/* Drop the grey bars and divider rules; the dialog is one surface. */
#surbma-yes-no-popup .uk-modal-header,
#surbma-yes-no-popup .uk-modal-footer {
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  border-radius: 0;
}

#surbma-yes-no-popup .uk-modal-header {
  margin-bottom: 1.25rem;
}

#surbma-yes-no-popup .uk-modal-header h2 {
  margin: 0;
  /* Was a hardcoded "EB Garamond": once the heading face moved to Inter that
     name stopped being requested and this fell back to a system serif. It
     follows the Customizer face and the H2 step now. */
  font-family: var(--theme-heading-font);
  font-size: var(--stw-h2-size);
  font-weight: 600;
  line-height: var(--stw-h2-lh);
  letter-spacing: 0;
  color: #1b1f22;
  text-transform: none;
}

#surbma-yes-no-popup .uk-modal-content {
  margin-bottom: 2rem;
  font-family: "DM Sans", sans-serif;
  font-size: 1rem;
  line-height: 1.5;
  color: #1b1f22;
}

#surbma-yes-no-popup .uk-modal-footer {
  display: flex;
  flex-wrap: wrap;
  gap: 0.625rem;
}

#surbma-yes-no-popup .uk-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 2.75rem;
  height: auto;
  padding: 0.8125rem 1.25rem;
  border-radius: 2px;
  font-family: "DM Sans", sans-serif;
  font-size: 0.8125rem;
  font-weight: 600;
  line-height: 1;
  letter-spacing: -0.01em;
  text-transform: none;
  transition: background-color 0.2s ease, color 0.2s ease;
}

/* "Tenho mais de 18 anos" - the affirmative action, styled like Adicionar ao carrinho. */
/* UIkit strips the footer's outer padding via
   .uk-modal-footer > :first-child { padding-top: 0 } and the matching
   :last-child { padding-bottom: 0 }. That reset is written for block content,
   but the footer's children here are the two buttons - so the first loses its
   top padding and the second its bottom, and each label sits off-centre in a
   different direction. Repeating the class outranks those pseudo-class
   selectors without !important. */
#surbma-yes-no-popup .uk-modal-footer > .uk-button.uk-button {
  padding-top: 0.8125rem;
  padding-bottom: 0.8125rem;
}

#surbma-yes-no-popup .uk-button-primary {
  background-color: var(--theme-primary-color, #672823);
  border: 1px solid var(--theme-primary-color, #672823);
  color: #fff;
}

#surbma-yes-no-popup .uk-button-primary:hover,
#surbma-yes-no-popup .uk-button-primary:focus {
  background-color: #4e1e1a;
  border-color: #4e1e1a;
  color: #fff;
}

/* "Ainda não tenho 18 anos" - present, but visibly the secondary choice. */
#surbma-yes-no-popup .uk-button-default {
  background-color: transparent;
  border: 1px solid rgba(27, 31, 34, 0.2);
  color: #1b1f22;
}

#surbma-yes-no-popup .uk-button-default:hover,
#surbma-yes-no-popup .uk-button-default:focus {
  background-color: transparent;
  border-color: #1b1f22;
  color: #1b1f22;
}

@media screen and (max-width: 480px) {
  #surbma-yes-no-popup .uk-modal-dialog {
    padding: 2rem 1.5rem;
  }

  #surbma-yes-no-popup .uk-modal-header h2 {
    font-size: 1.625rem;
  }

  #surbma-yes-no-popup .uk-button {
    flex: 1 1 100%;
  }
}

/* Off-canvas menu: drop the repeated logo and the "Main Menu" label.
   The drawer opens from the header, which already shows the logo, and a
   heading that says "Main Menu" above the main menu earns nothing. Neither is
   exposed as a setting - the logo is the shared site logo and the heading is
   hardcoded as esc_html_e('Main Menu','blonwe') in
   blonwe/includes/header/models/canvas-menu.php:29 - so they are hidden here.
   The heading is matched by what follows it, so the other drawer headings
   (Browse Categories, the bottom menu and contact titles) are untouched. */
.site-drawer .drawer-header .site-brand {
  display: none;
}

/* Keep the close button where it was once the logo is gone. */
.site-drawer .drawer-header .site-close {
  margin-left: auto;
}

.site-drawer .drawer-heading:has(+ .drawer-primary) {
  display: none;
}

/* Off-canvas menu: drop the copyright row. The drawer is a navigation panel,
   not a page footer, and the credit already sits in the real footer. It cannot
   be emptied in the Customizer because blonwe_copyright feeds both, and the
   theme falls back to a hardcoded KlbTheme string when it is blank
   (blonwe/includes/header/models/canvas-menu.php:104-111). */
.site-drawer .drawer-footer {
  display: none;
}

/* Cart totals panel: the subtotal is the only row, set bold with no rule
   under it. The IVA breakdown was removed from
   blonwe-child/woocommerce/cart/cart-totals.php. */

/* …and drop the rule under the subtotal, which otherwise draws the top edge
   of that same block. */
.cart-collaterals .cart_totals .shop_table tr.cart-subtotal th,
.cart-collaterals .cart_totals .shop_table tr.cart-subtotal td,
.cart_totals table tr.cart-subtotal th,
.cart_totals table tr.cart-subtotal td {
  border-bottom: 0;
}

/* The theme sets .cart-collaterals .cart_totals .shop_table tr th to 400
   (specificity 0,4,1), so the subtotal label needs at least that reach. */
.cart-collaterals .cart_totals .shop_table tr.cart-subtotal th,
.cart-collaterals .cart_totals .shop_table tr.cart-subtotal td,
.cart_totals table tr.cart-subtotal th,
.cart_totals table tr.cart-subtotal td {
  font-weight: 700;
}

/* Quantity stepper: the button at its limit reads as dead rather than live.
   pointer-events keeps the click from reaching Blonwe's own handler, so no
   pointless cart update is fired. State is set by assets/js/quantity-limits.js. */
.quantity .quantity-button.is-disabled {
  opacity: 0.35;
  cursor: not-allowed;
  pointer-events: none;
}

/* Quantity stepper with no chrome. The outline came from two places: a 1px
   border plus a box-shadow on the .quantity wrapper, and a second box-shadow
   on the input itself which drew the divider around the middle cell. Clearing
   only the border leaves both shadows behind, so all three go. */
.quantity,
.woocommerce .quantity,
.woocommerce-cart-form .quantity {
  border: 0;
  box-shadow: none;
}

/* The input's shadow and fill come from a global rule,
   body:not(.input-variation-filled)[data-color="default"] input[type=...],
   which outranks a plain .quantity input.qty, so match its depth. */
body[data-color] .quantity input.qty,
body[data-color] .quantity input.qty.text,
.quantity input.qty,
.woocommerce .quantity input.qty {
  border: 0;
  box-shadow: none;
  background-color: transparent;
}

/* Cart remove control: a dark-red cross on white, instead of a white cross on
   a red disc. The circle stays (radius 50%) so the hit area is unchanged - it
   just no longer reads as a warning badge next to every line. */
.product-remove a.remove,
.product-remove a.remove:hover,
.product-remove a.remove:focus,
.woocommerce .product-remove a.remove,
.woocommerce .product-remove a.remove:hover {
  color: #672823;
  background-color: #ffffff;
}

/* Hide the cart actions row. It is not removed from the DOM on purpose: that
   cell carries the woocommerce-cart-nonce, and blonwe_update_cart() saves
   quantity changes by firing $("[name='update_cart']").trigger("click") on the
   button inside it. Deleting the markup would silently stop quantities saving.
   Coupons are disabled store-wide, so nothing else in here is reachable. */
.woocommerce-cart-form .actions {
  display: none;
}

/* ---------------------------------------------------------------------------
   Mobile cart row.

   Blonwe's own mobile handling hides the price and subtotal entirely, absolutely
   positions the remove control over the thumbnail, and leaves the name squeezed
   into a narrow column. That loses the two numbers a customer most wants to see.

   Rebuilt as a grid so each line item reads:

       [img]  Product name, full width                    x
              - 1 +   18,00 €              18,00 EUR

   Five columns: the name spans the content width, the remove control sits at
   the far right of the first line, and quantity / unit price / line total share
   the second. Breakpoint matches the theme's own 991.98px.
   --------------------------------------------------------------------------- */
@media screen and (max-width: 991.98px) {

  .shop_table.woocommerce-cart-form__contents thead {
    display: none;
  }

  .shop_table.woocommerce-cart-form__contents tbody tr.woocommerce-cart-form__cart-item {
    display: grid;
    /* Two equal 1fr spacer columns sit between quantity, price and line total.
       Being equal, they always take the same width, so the two gaps stay
       identical no matter how wide the values are - and because the last column
       ends at the right edge, the row fills the full line. */
    grid-template-columns: auto auto 1fr auto 1fr auto auto;
    grid-template-areas:
      "thumb name     name name  name name     remove"
      "thumb quantity .    price .    subtotal subtotal";
    align-items: center;
    column-gap: 0.75rem;
    row-gap: 0.625rem;
    padding: 1rem 0;
  }

  .shop_table.woocommerce-cart-form__contents tbody tr.woocommerce-cart-form__cart-item > td {
    border: 0;
    padding: 0;
  }

  .shop_table.woocommerce-cart-form__contents td.product-thumbnail   { grid-area: thumb; }
  .shop_table.woocommerce-cart-form__contents td.product-name        { grid-area: name; }
  /* The stepper wrapper keeps 26px of right padding to hold the absolutely
     positioned + button, and ~6px of it sits beyond the glyph. Without this the
     quantity->price gap measures 6px wider than price->total at every
     column-gap value. Reclaiming it makes the two gaps identical. */
  .shop_table.woocommerce-cart-form__contents td.product-quantity {
    grid-area: quantity;
    margin-right: -6px;
  }

  /* The theme hides these below 992px; they are the point of the exercise. */
  .shop_table.woocommerce-cart-form__contents td.product-price {
    grid-area: price;
    display: block;
  }

  .shop_table.woocommerce-cart-form__contents td.product-subtotal {
    grid-area: subtotal;
    display: block;
    justify-self: end;
    font-weight: 700;
  }

  /* Out of the absolute positioning the theme uses, and onto the right edge. */
  .shop_table.woocommerce-cart-form__contents td.product-remove {
    grid-area: remove;
    position: static;
    left: auto;
    justify-self: end;
    align-self: start;
  }
}

/* Tighten the quantity stepper.
   The - and + are position:absolute, pinned inside the wrapper's 32px left and
   right padding - so their own width and margins change nothing, and that
   padding IS the gap. Measured on the live page: 32px padding leaves 20px of
   clear space between each glyph and the number, 26px leaves 10px - half.
   Height is untouched so the 44px tap target survives. */
.quantity,
.woocommerce .quantity {
  padding-left: 26px;
  padding-right: 26px;
}

body[data-color] .quantity input.qty,
body[data-color] .quantity input.qty.text,
.quantity input.qty,
.woocommerce .quantity input.qty {
  width: 1.5rem;
  padding-left: 0;
  padding-right: 0;
  text-align: center;
}

/* Mobile: the grey surface belongs to the progress bar and the cart value, not
   to the whole column.

   base.css:17412 gives .cart_totals a grey panel only from 992px up, so below
   that the theme paints nothing. Here the pair inside .cart-total-panel takes
   the panel instead and "Finalizar compra" sits outside it - see
   blonwe-child/woocommerce/cart/cart-totals.php for the wrapper. The column
   around them stays white because it is also the pinned bar further down this
   file, which has to be opaque for content to scroll under it. */
@media screen and (max-width: 991.98px) {
  .cart-wrapper .cart-collaterals {
    padding: 1.25rem;
    border-radius: var(--theme-radius-base);
  }

  body[data-color="default"] .cart-wrapper .cart-collaterals,
  body[data-color="custom"][data-theme="light"] .cart-wrapper .cart-collaterals {
    background-color: #fff;
  }
}

/* ---------------------------------------------------------------------------
   Mobile: pin the whole totals panel to the bottom of the viewport on the cart.

   The bar is .cart-collaterals rather than just the button, so "Total no
   carrinho" and the amount ride directly above "Finalizar compra" - the value
   and the action stay together instead of the value scrolling away. One fixed
   container also avoids two separately pinned elements whose heights have to be
   kept in sync by hand.
   --------------------------------------------------------------------------- */
@media screen and (max-width: 991.98px) {

  body.woocommerce-cart .cart-wrapper .cart-collaterals {
    position: fixed;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: 999;
    margin: 0;
    padding: 0.875rem 1rem;
    padding-bottom: calc(0.875rem + env(safe-area-inset-bottom, 0px));
    border-radius: 0;
    box-shadow: 0 -2px 12px rgba(27, 31, 34, 0.1);
  }

  /* The button is no longer pinned on its own - the panel around it is. Its own
     margin is dropped so the bar's padding is all that surrounds it, the same
     above as below. */
  body.woocommerce-cart .wc-proceed-to-checkout {
    position: static;
    margin: 0;
    padding: 0;
    background: none;
    box-shadow: none;
  }

  body.woocommerce-cart .wc-proceed-to-checkout .checkout-button {
    display: block;
    width: 100%;
    margin: 0;
    text-align: center;
  }

  /* Room to scroll past the bar, at the end of the page rather than under the
     cart. Putting it on .cart-wrapper left a band of empty page between the cart
     total and the footer; the footer already follows the cart, so the only thing
     that actually needs clearing is the very bottom of the document, where the
     bar would otherwise sit over the last of the footer. 6rem covers the bar's
     86px with room to spare. */
  body.woocommerce-cart .cart-wrapper {
    padding-bottom: 0;
  }

  body.woocommerce-cart .site-footer {
    /* The theme sets the footer 30px clear of the page content. On the cart the
       grey total band is the last thing above it, and the two read as one strip
       when they meet. */
    margin-top: 0;
  }
}

/* No focus ring around a notice.

   WooCommerce gives each notice tabindex="-1" and focuses it so a screen reader
   announces it, and the browser then draws its default ring - the blue line
   around the box. Nothing here is interactive, and the element cannot be tabbed
   to, so the ring marks nothing a keyboard user can act on; links inside the
   notice keep their own. */
.woocommerce-error[tabindex="-1"]:focus,
.woocommerce-message[tabindex="-1"]:focus,
.woocommerce-info[tabindex="-1"]:focus {
  outline: none;
}

/* No tick after an AJAX add to cart.

   WooCommerce's add-to-cart.js appends <a class="added_to_cart">Ver carrinho</a>
   beside the button, and Blonwe renders it as a 30x35 brand-coloured square with
   the label zeroed out and a klbtheme glyph on ::before - the tick. The link is
   written into the script with no filter to switch it off, so it is hidden here
   rather than removed. One rule covers every place a product card appears: the
   shop grid, the home carousels, category pages and related products.

   display:none also keeps it out of the accessibility tree, which is just as
   well - it announced only as "Ver carrinho" with no visible text. The header
   cart icon still updates its count, so nothing is lost. a.added_to_cart in the
   theme weighs (0,1,1) and the body prefix clears it without !important. */
body a.added_to_cart {
  display: none;
}

/* "Continuar a comprar" at the top of the cart.

   Styled as a secondary action - outlined rather than filled - so it never
   competes with "Finalizar compra". It inherits the pill radius and 14px from
   the shared .button rules; only the fill is overridden. That needs !important
   because the rule it is overriding (line 159) carries !important itself, which
   no amount of specificity gets past.

   One value above and below, so the header, the link and the item list keep an
   even rhythm - the link no longer sits flush against the header. */
.serratopwines-continue-shopping {
  margin: 1.5rem 0;
}

/* .cart-wrapper brings its own top margin - 2.5rem on desktop, 1.25rem below
   992px - which is the theme's gap between the page and the cart when nothing
   sits above it. It is an adjacent sibling, so the two margins collapse to the
   larger and the gap under the link would be 40px on desktop against 24px
   above it. Zeroing it leaves the link's own margin to set both. */
body.woocommerce-cart .cart-wrapper {
  margin-top: 0;
}

/* Phones: the link sits straight under the header, and the totals panel moves
   up under it (cart-panel.js) and runs edge to edge.

   The panel is inside .container, which carries the page gutter, so the
   negative side margins pull it back out to the window - a block element with
   negative left and right margins widens to fill them. The radius goes with
   them: there are no corners left to round. */
@media screen and (max-width: 991.98px) {
  .serratopwines-continue-shopping {
    margin: 1rem 0;
  }

  .serratopwines-cart-panel-slot.is-bottom:not(:empty) {
    margin-left: calc(50% - 50vw);
    margin-right: calc(50% - 50vw);
    border-radius: 0;
  }

  /* Clear of the last item's rule. :not(:empty) keeps the slot invisible until
     the script fills it, so a failed move leaves no stray grey band. */
  .serratopwines-cart-panel-slot.is-bottom:not(:empty) {
    margin-top: 1rem;
  }

  /* Nothing hanging below the last item.

     Two things sit under it. Each row carries its rule on its own top edge, and
     the row after the items is WooCommerce's actions row - 0px tall here, since
     coupons are off, but still drawing that rule as a line with nothing beneath
     it. And rows pad themselves 16px away from the next one, which the last row
     has no need of. :last-child cannot name the last item, because the actions
     row is the real last child; :has() picks the item whose next sibling is not
     one. The selector repeats the theme's own shape because its rule for these
     rows weighs (0,3,2) and loads later; the class alone would lose. */
  .woocommerce-cart-form__contents tr:not(.woocommerce-cart-form__cart-item):last-child {
    border-top: 0;
  }

  .shop_table.woocommerce-cart-form__contents tbody tr.woocommerce-cart-form__cart-item:has(+ tr:not(.woocommerce-cart-form__cart-item)) {
    padding-bottom: 0;
  }
}

body .serratopwines-continue-shopping a.button {
  display: inline-block;
  background-color: transparent !important;
  box-shadow: inset 0 0 0 1px var(--wine-button-color);
  color: var(--wine-button-color) !important;
}

body .serratopwines-continue-shopping a.button:hover,
body .serratopwines-continue-shopping a.button:focus {
  background-color: var(--wine-button-color) !important;
  color: #fff !important;
}

/* Cart totals reduced to one line: heading left, cart value right. The h2 keeps
   its own styling but loses the rule beneath it - with a single line there is
   nothing left to separate. See blonwe-child/woocommerce/cart/cart-totals.php. */
body .cart-total-line {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 1rem;
}

body .cart-total-line h2 {
  margin: 0;
  padding: 0;
  border: 0;
  /* The theme's h2 is 32px on desktop, which wraps "Total no carrinho" onto two
     lines inside a 340px panel and leaves the amount stranded beside the first.
     Sized to fit the label and the value on one line at both breakpoints. */
  font-size: 1.25rem;
  line-height: 1.3;
  white-space: nowrap;
}

body .cart-total-line__amount {
  font-weight: 700;
  white-space: nowrap;
}

/* Free-shipping progress bar: it sits in the totals column at every width.

   cart-totals.php renders it there, inside .cart-total-panel with the cart
   value. Blonwe's own copy above the product table is off at the source - the
   Customizer's "Cart page" location under Free Shipping Bar - rather than
   hidden here, so the markup is not emitted twice.

   From 992px up the theme already paints the whole column grey
   (base.css:17412-17422), so the pair needs no box of its own. Below that the
   theme paints nothing, so the bar and the value take the panel themselves and
   the checkout button sits outside it on the page. 1rem matches the padding the
   block checkout's sidebar uses at the same width. */
@media screen and (max-width: 991.98px) {
  .serratopwines-cart-panel-slot.is-bottom:not(:empty) {
    padding: 1rem;
    background-color: var(--color-gray25);
    border-radius: var(--theme-radius-base);
  }

  body[data-color="custom"][data-theme="light"] .serratopwines-cart-panel-slot.is-bottom:not(:empty) {
    background-color: rgba(var(--color-rgb), 0.06);
  }

  /* The progress bar draws its own box, so it needs no surface behind it - only
     clearance from the item list below. */
  .serratopwines-cart-panel-slot.is-top:not(:empty) {
    margin-bottom: 1rem;
  }

  .serratopwines-cart-panel-slot.is-top .cart-total-panel {
    padding: 0;
    background-color: transparent;
  }
}

.cart-total-panel .serratopwines-cart-progress .klb-free-shipping {
  margin-bottom: 1.25rem;
}

/* On phones the total line is lifted out, leaving the progress bar alone in the
   panel - its gap to the value below it then has nothing to separate. */
.cart-total-panel .serratopwines-cart-progress:last-child .klb-free-shipping {
  margin-bottom: 0;
}

/* Block checkout: one border per checkbox, not two.

   Blonwe draws its own checkbox face on input[type="checkbox"]::after - a
   1.0625rem bordered square with a background and box-shadow (base.css:7726
   and :7746) - plus a glyph on :checked::before (base.css:7786). That works on
   the classic forms it was written for, where the real input is hidden behind
   it.

   WooCommerce Blocks styles the input itself instead (20px, 1px border, 4px
   radius) and renders the tick as a sibling <svg class="…__mark">, keeping
   ::before as a bare content:"". So the theme's square nests inside the
   block's and both outlines show, with two ticks once checked.

   Fix: drop both pseudo-elements on block checkboxes and put the brand fill on
   the input, which keeps the current checked appearance with a single border.
   Scoped to .wc-block-components-checkbox so the classic forms are untouched.
   Specificity has to clear the theme's :hover::after and :checked::after rules
   at (0,5,3), hence the input tag and the ancestor class. */
body[data-color] .wc-block-components-checkbox input.wc-block-components-checkbox__input[type="checkbox"]::before,
body[data-color] .wc-block-components-checkbox input.wc-block-components-checkbox__input[type="checkbox"]::after,
body[data-color] .wc-block-components-checkbox input.wc-block-components-checkbox__input[type="checkbox"]:hover::after,
body[data-color] .wc-block-components-checkbox input.wc-block-components-checkbox__input[type="checkbox"]:checked::before,
body[data-color] .wc-block-components-checkbox input.wc-block-components-checkbox__input[type="checkbox"]:checked::after {
  content: none;
  width: 0;
  height: 0;
  border: 0;
  background: none;
  box-shadow: none;
}

body[data-color] .wc-block-components-checkbox input.wc-block-components-checkbox__input[type="checkbox"]:checked {
  border-color: var(--wine-button-color);
  background-color: var(--wine-button-color);
}

body[data-color] .wc-block-components-checkbox .wc-block-components-checkbox__mark {
  fill: #ffffff;
}

/* Order summary: no box around the panel, only horizontal dividers.

   WooCommerce draws a full 1px outline plus a 5px radius on the summary card
   (checkout.css, .wp-block-woocommerce-checkout-order-summary-block). The
   three lines inside it - under the title, above the Subtotal group, above
   Total - are separate rules and are left alone, so dropping the card's top,
   left and right edges leaves horizontal rules only, closed off by the card's
   own bottom edge under Total. */
.wc-block-checkout__sidebar .wp-block-woocommerce-checkout-order-summary-block,
.wc-block-components-sidebar .wp-block-woocommerce-checkout-order-summary-block {
  border-top: 0;
  border-right: 0;
  border-left: 0;
  border-radius: 0;
}

/* Checkout fields: underline only.

   WooCommerce boxes every control with a 1px border plus a 4px radius, and
   Blonwe layers its own border on top - both reapply the border as a
   *shorthand* on :hover and :focus, at specificities that vary rule by rule.
   Chasing each one is fragile, hence !important on the widths and radius only.
   border-color is left alone, so the line keeps the theme's grey at rest and
   recolours to #672823 on focus.

   Scoped to the three text-entry control types. Checkboxes and radios are form
   fields too but are drawn as boxes and circles, so they keep their outline. */
.wp-block-woocommerce-checkout .wc-block-components-text-input input,
.wp-block-woocommerce-checkout .wc-blocks-components-select .wc-blocks-components-select__select,
.wp-block-woocommerce-checkout .wc-block-components-textarea {
  border-top-width: 0 !important;
  border-right-width: 0 !important;
  border-left-width: 0 !important;
  border-radius: 0 !important;
}

.wp-block-woocommerce-checkout .wc-blocks-components-select__container {
  border-radius: 0;
}

/* Underline only means no ring either. Blonwe puts a soft drop shadow on every
   field at rest and a full 1px #672823 ring on :focus, and WooCommerce adds an
   inset ring to the focused textarea - all of them draw on four sides. The
   bottom border turning #672823 is what marks focus now. */
.wp-block-woocommerce-checkout .wc-block-components-text-input input,
.wp-block-woocommerce-checkout .wc-block-components-text-input input:focus,
.wp-block-woocommerce-checkout .wc-blocks-components-select .wc-blocks-components-select__select,
.wp-block-woocommerce-checkout .wc-blocks-components-select .wc-blocks-components-select__select:focus,
.wp-block-woocommerce-checkout .wc-block-components-textarea,
.wp-block-woocommerce-checkout .wc-block-components-textarea:focus {
  box-shadow: none !important;
}

/* WooCommerce trims horizontal padding by 0.5px on focus to absorb the border
   going 1px -> 1.5px. With no side borders left there is nothing to absorb, so
   that trim became a visible 0.5px text jump; pin it instead. */
.wp-block-woocommerce-checkout .wc-block-components-text-input input,
.wp-block-woocommerce-checkout .wc-block-components-text-input input:focus,
.wp-block-woocommerce-checkout .wc-blocks-components-select .wc-blocks-components-select__select,
.wp-block-woocommerce-checkout .wc-blocks-components-select .wc-blocks-components-select__select:focus {
  padding-left: 9px !important;
  padding-right: 9px !important;
}

/* Checkout delivery toggle: fill the chosen tile with the brand colour.

   WooCommerce marks the chosen tile with a 2px black border on white, and gives
   the other one border: 2px solid transparent purely so the two stay the same
   size. The black outline is therefore removed by matching it to the fill, not
   by setting border: 0 - that would make the chosen tile 4px smaller than its
   neighbour and shift both labels.

   The icon needs no rule of its own: WooCommerce sets
   .wc-block-checkout__shipping-method-option-icon { fill: currentColor }, so it
   follows the colour set here.

   WooCommerce's own rule doubles the class
   (.option.option--selected { background: #fff; border: 2px solid }) for a
   specificity of (0,2,0), and its stylesheet loads after this one, so matching
   that weight loses the tie. Hence the class is doubled here too, for (0,3,0).
   Its border has no colour of its own, so without this it falls back to
   currentColor and follows the white text. */
.wc-block-checkout__shipping-method .wc-block-checkout__shipping-method-option.wc-block-checkout__shipping-method-option--selected,
.wc-block-checkout__shipping-method .wc-block-checkout__shipping-method-option.wc-block-checkout__shipping-method-option--selected:hover,
.wc-block-checkout__shipping-method .wc-block-checkout__shipping-method-option.wc-block-checkout__shipping-method-option--selected:focus {
  background-color: var(--wine-button-color);
  border-color: var(--wine-button-color);
  color: #ffffff;
}

/* Order details: every item name in the brand colour.

   The colour is stated rather than left to the theme's link colour, because
   these cells can hold two different things: a linked name, and - when the
   product has been deleted outright - a bare text node with no element of its
   own to target. Colouring the cell is the only way to reach that text node,
   which also catches the "x 3" quantity sitting in the same cell, so that is
   put back to the body colour. See serratopwines_order_item_permalink() for
   why out-of-stock items are no longer part of this set. */
.woocommerce-table--order-details td.product-name,
.woocommerce-table--order-details td.product-name a,
.woocommerce-table--order-details td.product-name a:hover {
  color: var(--wine-button-color);
}

.woocommerce-table--order-details td.product-name .product-quantity,
.woocommerce-table--order-details td.product-name .wc-item-meta {
  color: var(--color-text);
}

/* Checkout delivery/payment options: no outline on the chosen card, brand-
   coloured radio.

   The black edge is not a border - border-width is 0. WooCommerce draws it with
   box-shadow: inset 0 0 0 1.5px currentColor on
   .…--checked-option-highlighted, which is why it picks up the body text
   colour. One rule covers both the shipping label and the payment accordion
   div, at (0,2,1) and (0,2,0); its stylesheet loads after this one, so matching
   that weight would lose the tie - hence the .wp-block-woocommerce-checkout
   prefix. In its place the row is washed with the brand colour.

   8% keeps it a tint rather than a block of colour. The reference fill measures
   rgb(247, 248, 233), roughly 5% darker than white; #672823 is dark enough that
   the same 5% reads as grey, so it is nudged up until the brown shows. color-mix
   keeps --wine-button-color the single source for the hex, with an rgba fallback
   for anything that does not support it. */
.wp-block-woocommerce-checkout .wc-block-components-radio-control--highlight-checked label.wc-block-components-radio-control__option--checked-option-highlighted,
.wp-block-woocommerce-checkout .wc-block-components-radio-control--highlight-checked .wc-block-components-radio-control-accordion-option--checked-option-highlighted {
  box-shadow: none;
  background-color: rgba(103, 40, 35, 0.08);
  background-color: color-mix(in srgb, var(--wine-button-color) 8%, transparent);
}

/* The dot is the input's ::before, filled #000 by
   .wc-block-components-radio-control .…__input:checked:before at (0,3,1). */
.wp-block-woocommerce-checkout .wc-block-components-radio-control .wc-block-components-radio-control__input:checked::before {
  background: var(--wine-button-color);
}

.wp-block-woocommerce-checkout .wc-block-components-radio-control .wc-block-components-radio-control__input:checked {
  border-color: var(--wine-button-color);
}

/* Delivery/payment options: drop the side rails.

   The two vertical lines are not on the option rows themselves - they come
   from .wc-block-components-radio-control::after, an absolutely positioned
   pseudo-element inset to 0 that carries only border-left and border-right
   (top and bottom are already 0). Zeroing those two widths leaves it drawing
   nothing, without removing an element WooCommerce may later use. */
.wp-block-woocommerce-checkout .wc-block-components-radio-control::after {
  border-left-width: 0;
  border-right-width: 0;
}

/* The checkout's inline actions - "Editar" on the address card and "Iniciar
   sessão" beside the Contacto heading - styled as the Finalizar compra button.

   Colour, radius and type are copied from
   .wc-block-components-checkout-place-order-button exactly: #672823 on white,
   2px radius, 11px/600 with -0.11px tracking. The padding is not copied - that
   button uses 18px with a 42px line-height to stand 78px tall across the full
   column, which on a control sitting inside the address card would swamp the
   address itself. It is scaled to keep the same proportions at this size.

   Editar is a <span role="button"> and the login prompt an <a> rendered as a
   block, so display and cursor have to be set as well. One rule for both keeps
   the two reading as the same control rather than two sizes of the same idea. */
.wp-block-woocommerce-checkout .wc-block-components-checkout-step__heading .wc-block-checkout__login-prompt,
.wp-block-woocommerce-checkout .wc-block-components-address-card .wc-block-components-address-card__edit {
  display: inline-flex;
  align-items: center;
  padding: 7px 14px;
  border-radius: var(--wine-button-radius);
  background-color: var(--wine-button-color);
  color: #ffffff;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: -0.11px;
  line-height: 1;
  text-decoration: none;
  cursor: pointer;
}

.wp-block-woocommerce-checkout .wc-block-components-checkout-step__heading .wc-block-checkout__login-prompt:hover,
.wp-block-woocommerce-checkout .wc-block-components-checkout-step__heading .wc-block-checkout__login-prompt:focus,
.wp-block-woocommerce-checkout .wc-block-components-address-card .wc-block-components-address-card__edit:hover,
.wp-block-woocommerce-checkout .wc-block-components-address-card .wc-block-components-address-card__edit:focus {
  background-color: var(--wine-button-hover);
  color: #ffffff;
}

/* Promo bar above the header.

   Printed on wp_body_open by serratopwines_promo_bar(), so it sits before
   .site-header in the document and pushes the page down rather than overlaying
   it. Copy is stored in sentence case and uppercased here, which keeps the
   source readable and lets the casing change without touching PHP. */
.serratopwines-promo-bar {
  background-color: var(--wine-gold);
  /* Stated rather than var(--color-text): that token flips in the theme's dark
     mode (base-dark.css), and the bar's background is a fixed brand gold, so the
     text has to stay dark whatever the rest of the page does. 5.67:1 on the
     gold, which clears WCAG AA for this 11px text; white was 2.92:1. */
  color: #1b1f22;
  text-align: center;
  /* Horizontal padding and the 1440px cap come from the theme's own .container
     class on this element, so the band lines up with every other section and
     follows the same breakpoints. Only the vertical padding is ours - setting
     the padding shorthand here would overwrite the container's. */
  padding-top: 10px;
  padding-bottom: 10px;
}

.serratopwines-promo-bar p {
  margin: 0;
  font-size: 0.6875rem;
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: 0.02em;
  text-transform: uppercase;
  color: inherit;
}

.serratopwines-promo-bar a {
  color: inherit;
  text-decoration: underline;
}

/* ===========================================================================
   Type scale.

   From the project's typography sheets: headings on a 1.25 (Major Third)
   scale, body on 1.125 (Major Second). The sheets specify Inter for headings
   and Newsreader for long-form; both are dropped on purpose - the site's
   heading face is EB Garamond, set in the Customizer
   (blonwe_heading_typography -> --theme-heading-font), and long-form reuses it
   rather than loading a third family.

   Line-heights are unitless ratios, not the px values in the sheets, though
   they resolve to exactly those px at the sizes below: h1 59x1.186441 = 70,
   h2 28x1.214286 = 34, h3 18x1.222222 = 22, h4 16x1.5 = 24, body 16x1.625 = 26.
   The theme and Elementor set their own font-size on plenty of headings at a
   higher specificity than this rule can reach. A px line-height would still
   apply to those, so a heading left at 42px would be squeezed into a 22px line
   box; a ratio scales with whatever size wins instead.

   Sizes stay in px because the sheets are in px and that keeps them checkable
   against the source. Mobile overrides use the theme's Bootstrap md breakpoint.
   ========================================================================= */
:root {
  /* The hero. 59/46px put the longest headline ("Saboreie com paixão vinhos
     únicos") onto three lines - 31% of the slide on desktop, 42% on a phone,
     which left the subtitle squeezed against the button. 48 and 28 are the
     steps where it settles to two lines; one size larger tips it back to three.
     Tracking eases with the size: -2px was tuned for 59px. */
  --stw-h1-size: 48px;         --stw-h1-lh: 1.186441;    --stw-h1-ls: -1px;
  --stw-h1-size-sm: 28px;      --stw-h1-lh-sm: 1.195652; --stw-h1-ls-sm: -0.5px;
  /* The product title is a content heading, not a display one. H1 is sized for
     the hero, where the copy is written to fit; wine names are not, and at
     59/46px a long one ran four lines and 220px tall at 390px before the price
     came into view. Benchmarked against granvine (36px desktop / 25px mobile)
     and domvinho (33/22) - see the wine-store-heading-benchmark note. The
     tracking comes off with the size: -2px was tuned for 59px. */
  --stw-product-title-size: 32px;      --stw-product-title-lh: 1.2;
  --stw-product-title-size-sm: 24px;   --stw-product-title-ls: -0.5px;
  --stw-h2-size: 28px;         --stw-h2-lh: 1.214286;
  --stw-h3-size: 18px;         --stw-h3-lh: 1.222222;
  --stw-h4-size: 16px;         --stw-h4-lh: 1.5;

  --stw-body-lg-size: 20px;    --stw-body-lg-lh: 1.5;
  --stw-body-size: 16px;       --stw-body-lh: 1.625;
  --stw-body-size-sm: 14px;    --stw-body-lh-sm: 1.5;
  --stw-body-lf-size: 18px;    --stw-body-lf-lh: 1.5;
  --stw-body-lf-size-sm: 16px; --stw-body-lf-lh-sm: 1.5;
  --stw-body-sm-size: 12px;    --stw-body-sm-lh: 1.583333;
  /* The sheets' long-form face. Loaded by serratopwines_longform_font(); the
     heading face is not here because it comes from the Customizer as
     --theme-heading-font. */
  --stw-longform-font: "Newsreader", Georgia, serif;
}

/* Prefixed with body to clear Bootstrap's .h2/h2 rules at (0,1,0) without
   reaching for !important. The theme's own utility classes (.font-md-56,
   .weight-700 and friends) use !important and deliberately still win - those
   are per-component decisions in the theme templates. */
body h1, body .h1 {
  font-size: var(--stw-h1-size);
  line-height: var(--stw-h1-lh);
  letter-spacing: var(--stw-h1-ls);
  font-weight: 600;
}

body h2, body .h2 {
  font-size: var(--stw-h2-size);
  line-height: var(--stw-h2-lh);
  letter-spacing: 0;
  font-weight: 600;
}

body h3, body .h3 {
  font-size: var(--stw-h3-size);
  line-height: var(--stw-h3-lh);
  letter-spacing: 0;
  font-weight: 600;
}

body h4, body .h4 {
  font-size: var(--stw-h4-size);
  line-height: var(--stw-h4-lh);
  letter-spacing: 0;
  font-weight: 600;
}

body {
  font-size: var(--stw-body-size);
  line-height: var(--stw-body-lh);
}

/* Named body styles from the sheet, as classes to apply where wanted. */
.stw-body-lg {
  font-size: var(--stw-body-lg-size);
  line-height: var(--stw-body-lg-lh);
}

.stw-body-lg-lf {
  font-family: var(--stw-longform-font);
  font-size: var(--stw-body-lg-size);
  line-height: var(--stw-body-lg-lh);
}

.stw-body-lf {
  font-family: var(--stw-longform-font);
  font-size: var(--stw-body-lf-size);
  line-height: var(--stw-body-lf-lh);
}

.stw-body-sm {
  font-size: var(--stw-body-sm-size);
  line-height: var(--stw-body-sm-lh);
}

/* Only h1 and the body sizes have mobile variants in the sheets; everything
   else is specified as staying the same. */
@media (max-width: 767.98px) {
  body h1, body .h1 {
    font-size: var(--stw-h1-size-sm);
    line-height: var(--stw-h1-lh-sm);
  }

  body {
    font-size: var(--stw-body-size-sm);
    line-height: var(--stw-body-lh-sm);
  }

  .stw-body-lf {
    font-size: var(--stw-body-lf-size-sm);
    line-height: var(--stw-body-lf-lh-sm);
  }
}

/* ---------------------------------------------------------------------------
   The scale applied to components.

   The h1-h4 rules above only reach headings whose size nothing else claims.
   These are the ones the theme sizes itself, mapped to a step by the role the
   sheet describes rather than by tag - the theme marks product names up as h2
   and h4, and taking that literally would put 28px titles in every shop grid.

       hero slide titles   -> H1   (the sheet's "main intro to the website")
       product page title  -> H1   (the page's own title)
       product names       -> H3   ("individual item titles within a section")
       widget/modal titles -> H4   ("headings below h3")

   Two groups are not here because they are set in the admin instead, which
   keeps the editor honest about what the page will look like: section and
   banner titles are the widgets' own "title_size" control in Elementor (set to
   28), and product names in the shop grids come from Customizer > Typography >
   Product name (set to 18px).

   Each selector below is sized against the rule it has to beat, which is why
   they are longer than they look like they need to be:
     .single-product-wrapper .product_title            (0,2,0)
     .widget .widget-title                             (0,2,0)
     .klb-modal-root .klb-modal-inner .klb-modal-header .entry-title  (0,4,0)
   ------------------------------------------------------------------------- */

/* Hero slides. .for-slider separates them from the promo banner boxes, which
   share the .entry-title class. !important because the theme puts .font-md-56
   on them, which is !important itself. */
body .klb-banner.for-slider .entry-title {
  font-size: var(--stw-h1-size) !important;
  line-height: var(--stw-h1-lh) !important;
  letter-spacing: var(--stw-h1-ls);
}

/* Promo banner titles take their size from the widget's own title_size control
   in Elementor, but the template also prints a .weight-700 utility class, which
   is !important - so the sheets' 600 has to be restated. */
body .klb-banner:not(.for-slider) .entry-title {
  font-weight: 600 !important;
}

body .single-product-wrapper .product_title {
  font-size: var(--stw-product-title-size);
  line-height: var(--stw-product-title-lh);
  letter-spacing: var(--stw-product-title-ls);
}

body .page-header .entry-title {
  font-size: var(--stw-h1-size);
  line-height: var(--stw-h1-lh);
  letter-spacing: var(--stw-h1-ls);
}

/* Hero copy in the left third of the slide.

   The theme pushes it to the middle with padding-left: 23.75rem !important on
   .klb-slider-wrapper .klb-slider.full-width ... .entry-wrapper above 1200px,
   and gives .entry-inner width: 60% through the widget's .w-60 class. Both are
   reset here: the block starts at the slide's own gutter and is capped at a
   third of the width. !important and a six-class selector are what it takes to
   get past the theme's own !important. */
@media screen and (min-width: 992px) {
  /* The block starts a quarter of the way across the slide. Two rules because
     the wrapper's offset inside the slide is not constant: below 1360px the
     wrapper fills the slide, so a quarter of the wrapper is a quarter of the
     slide; above it the wrapper caps at 1360 and sits 40px in, and the slide
     itself caps at 1440, so 360 - 40 = 320px is the fixed value from there up.

     The column keeps the widget's own 60% (.w-60). An earlier cap of 33.333%
     here was a mistake: percentages resolve against the wrapper's content box,
     which this padding shrinks, so the headline fell to four lines. */
  body .klb-slider-wrapper .klb-slider .klb-banner.for-slider.inner-style .entry-wrapper {
    padding-left: 25% !important;
  }

}

@media screen and (min-width: 1360px) {
  body .klb-slider-wrapper .klb-slider .klb-banner.for-slider.inner-style .entry-wrapper {
    padding-left: 320px !important;
  }
}

/* Hero slide height on desktop: 544px rather than 680px.

   The 680 is written straight into the widget's markup as an inline style -
   blonwe-core/elementor/widgets/home-slider/blonwe-home-slider1.php:28 - with
   no Elementor or Customizer control behind it, so !important is the only way
   past it short of editing the plugin, which an update would undo. Below 992px
   the theme already overrides the same inline value, and that is left alone. */
@media screen and (min-width: 992px) {
  .klb-banner.for-slider.custom-height {
    height: 544px !important;
  }
}

/* Mobile search icon, matched to the cart beside it.

   The theme sizes the cart glyph at 1.625rem (26px) through
   `.header-action .action-icon i`, and spaces the button 15px from its
   neighbour. The margin is copied as-is, and so is the size - but it has to
   be restated here, because the theme's rule needs an .action-icon wrapper
   this button does not have.

   Measured off the font itself (a 200px render, ink bounding box): the basket
   and klb-icon-search-feather both draw 167/200 em of ink, so the matching
   size is the cart's own 26px. An earlier 17px here came from comparing the
   bare <i> box against the cart's .action-icon box - different boxes, so the
   feather looked oversized when it was not.

   See includes/header/header-type4.php for the icon itself. */
.header-mobile .header-action.serratopwines-mobile-search {
  margin-left: 15px;
}

.header-mobile .header-action.serratopwines-mobile-search .action-link i {
  font-size: 26px;
  line-height: 1;
  display: block;
}

/* Mobile header: the rule under it only while the reader is scrolling up.

   At the top of the page, and on the way down, the header sits flush against
   the content. Coming back up it is overlapping what was just read, so the 1px
   rule earns its place as a separation. The theme's own `sticky-header` class
   cannot drive this - it only says "not at the top", regardless of direction -
   so header-border.js flags the direction on <body>.

   Desktop keeps the rule at all times; this is a small-screen concern. */
@media screen and (max-width: 991.98px) {
  body .site-header .header-row.bordered-bottom {
    border-bottom-width: 0;
  }

  body.stw-scrolling-up .site-header .header-row.bordered-bottom {
    border-bottom-width: 1px;
  }
}

/* Shop header banner: capped height.

   The widget scales the image to the full content width and lets its ratio set
   the height, so a 2.49:1 photo stood 546px tall at 1360px wide - half the
   viewport before a single product. Capped and cropped instead, which also
   means the banner no longer changes height when the image is swapped. Mobile
   already came in under the cap at 104px, so it is untouched. */
.woocommerce .klb-banner.inner-style .entry-media img {
  width: 100%;
  max-height: 260px;
  object-fit: cover;
}

/* Home: the six category tiles sit three across, on two rows.

   Elementor's own .elementor-section .elementor-container is flex-wrap: wrap,
   but on this page the container computes nowrap, so the six 33% columns were
   squeezed onto one line at 232px each instead of wrapping. Stated here for
   this section only, so no other Elementor row changes behaviour. */
.elementor-element-658bc1b > .elementor-container {
  flex-wrap: wrap;
}

/* Title and button pinned 15px above the bottom edge of the tile.

   .entry-wrapper covers the photo and centres its contents, so the gap under
   the text depended on how tall the text was - 23px where the title wrapped to
   two lines, 39px where it did not. Aligning to the end and padding the bottom
   makes that distance the same on every tile. The 40px left padding is the
   theme's and stays, so nothing moves horizontally.

   The selector carries .inner-style because two theme rules sit at (0,4,0):
   .klb-banner.inner-style.align-center for the centring, and
   .klb-banner.inner-style.space-40 for the padding - the latter only above
   992px, which is why a lighter selector worked on phones but not on desktop. */
body .elementor-element-658bc1b .klb-banner.inner-style .entry-wrapper {
  align-items: flex-end;
  padding-bottom: 15px;
}

/* ...and 15px between the title and the "Ver mais" button. The theme gives
   .entry-body a 20px bottom margin; same selector weight as above, for the
   same reason. */
body .elementor-element-658bc1b .klb-banner.inner-style .entry-body {
  margin-bottom: 15px;
}

/* Every tile the same height, whatever shape the photo is.

   The widget prints a bare <img> and lets the file's own proportions set the
   tile height, so six photos of six ratios gave six heights (174px to 325px).
   The box is fixed at 2.5:1 - the shape of the two banners that were already
   here - and the photo is cropped to fill it. Uploading an image of the wrong
   ratio can no longer change the layout; it just gets cropped. */
.elementor-element-658bc1b .klb-banner img {
  width: 100%;
  aspect-ratio: 1200 / 480;
  height: auto;
  object-fit: cover;
}

/* Product with a single photo: no thumbnail strip, so no space held for one.

   The reserved 6.5rem comes from .single-product-wrapper .vertical
   .woocommerce-product-gallery at (0,3,0), which loads after this file, so the
   body prefix is what carries this past it. The photo then fills the image
   column instead of sitting right of an empty gap - which is also what centres
   it, since the column is the full width available to it.
   serratopwines_single_image_gallery_class() adds the class. */
body .single-product-wrapper .woocommerce-product-gallery.serratopwines-single-image {
  padding-left: 0;
}

/* The strip that carries the rule under the product title holds no text - it is
   11px tall and empty - so its 10px of bottom padding only pushes the rule away
   from the title for no reason. Dropped at every width; it reads the same on
   desktop. */
body.single-product .single-product-wrapper .product-meta.top {
  padding-bottom: 0;
}

/* Product page, top of the mobile layout.

   The theme gives the product title a bottom margin and no top one, so it sat
   flush against the header's rule - the two read as one thick divider with the
   title wedged into it. The rule goes on this page and the title gets the same
   15px above as it already had below. The divider under .product-meta stays;
   that one separates the title from the meta and is doing a job. */
@media screen and (max-width: 991.98px) {
  body.single-product .single-product-wrapper .product_title {
    margin-top: 15px;
  }

  /* The block around the title carries another 20px below it, on top of the
     title's own 15px, so the space under the heading came to 35px against 15px
     over it. Matched to the title's value so the rhythm is the same on both
     sides. */
  body.single-product .single-product-wrapper .column.product-header {
    margin-bottom: 15px;
  }
}

/* Theme-rendered module headers - "Vistos recentemente", "Produtos
   relacionados" and friends. Same role as the Elementor section titles, so the
   same step; beats .klb-module .module-header .entry-title at (0,3,0). */
body .klb-module .module-header .entry-title {
  font-size: var(--stw-h2-size);
  line-height: var(--stw-h2-lh);
  letter-spacing: 0;
}

body .widget .widget-title {
  font-size: var(--stw-h4-size);
  line-height: var(--stw-h4-lh);
  letter-spacing: 0;
}

body .klb-modal-root .klb-modal-inner .klb-modal-header .entry-title {
  font-size: var(--stw-h4-size);
  line-height: var(--stw-h4-lh);
  font-weight: 600;
  letter-spacing: 0;
}

@media (max-width: 767.98px) {
  body .klb-banner.for-slider .entry-title {
    font-size: var(--stw-h1-size-sm) !important;
    line-height: var(--stw-h1-lh-sm) !important;
    letter-spacing: var(--stw-h1-ls-sm);
  }

  body .single-product-wrapper .product_title {
    font-size: var(--stw-product-title-size-sm);
  }

  body .page-header .entry-title {
    font-size: var(--stw-h1-size-sm);
    line-height: var(--stw-h1-lh-sm);
  }
}

/* Main menu: keep all six items on one row at 14px.

   The font size itself is a Customizer setting (Typography > Menu, 14px). At
   that size the six top-level items need ~574px, and between roughly 1200 and
   1365 the header's middle column is narrower than that - the last item
   ("Mercearia") wraps to a second row and disappears out of the header, rather
   than the menu simply growing taller.

   The theme gives each item 0.375rem (6px) of horizontal padding; trimming it
   to 4px frees 24px across the six, which is enough at 1280. Below ~1152 the
   header switches to a layout where everything fits again, and from 1366 up
   there was never a problem - so this only matters for that middle band. */
.site-header .klb-menu-nav.primary-menu .klb-menu > .menu-item > a {
  padding-left: 4px;
  padding-right: 4px;
}

/* Pill-shaped buttons, Amazon style.

   Shape only - the brand colour is untouched and comes from the blanket rule
   near the top of this file. 100px is past half the height of even the tallest
   button (the 78px place-order one), so one value rounds every size fully.

   The :not(.unset) mirrors the theme's own rule,
     button:not(.unset), .button:not(.unset), ... { border-radius: var(--theme-radius-form) }
   which sits at (0,2,0) and would otherwise win; repeating the clause and
   prefixing body takes these to (0,2,1). It also keeps the theme's escape
   hatch working - add the class "unset" to a button and it opts out.

   Deliberately excluded: .slick-nav (carousel arrows, already circles at 50%)
   and .show-password-input (an icon toggle inside the password field).

   Not done through Customizer > border radius: that is
   blonwe_border_radius_form, which also rounds every text input. */
body .btn:not(.unset),
body .button:not(.unset),
body button.button:not(.unset),
body .elementor-button:not(.unset),
body a.add_to_cart_button:not(.unset),
body a.product_type_variable:not(.unset),
body .single_add_to_cart_button:not(.unset),
body .buy_now_button:not(.unset),
body .checkout-button:not(.unset),
body button.wc-forward:not(.unset),
body button.checkout:not(.unset),
body .woocommerce-button:not(.unset),
body .woocommerce-Button:not(.unset),
body input[type="submit"]:not(.unset),
body .wc-block-components-button,
body .wc-block-components-checkout-place-order-button {
  border-radius: var(--wine-button-radius);
}

/* Mini-cart drawer buttons.

   The parent theme pins these at 8px with
     p.woocommerce-mini-cart__buttons a.button:not(.checkout)
   which is (0,3,2) - more specific than the pill rule above, so they need
   their own line at matching weight. */
body p.woocommerce-mini-cart__buttons a.button:not(.unset),
body p.woocommerce-mini-cart__buttons a.checkout:not(.unset) {
  border-radius: var(--wine-button-radius);
}

/* Add-to-cart button: let a long label wrap inside the pill.

   The theme sizes these for a single line - .products .product-buttons a.button
   sets height and line-height both to 2.1875rem (35px). On narrow columns
   "Adicionar ao carrinho" needs two lines, so the text overflowed the pill and
   spilled below it instead of the button growing.

   line-height 1.2 puts two 13px lines in 31px, so the pair still fits the 35px
   floor; the button only grows once the padding pushes it past that. height
   stays auto with min-height as the floor, so single-line buttons are unchanged.

   text-align is needed as well as the flex centring the theme already applies:
   justify-content centres the text block, but the second line inside it would
   still sit left on text-align: start.

   Specificity: the theme's rule is (0,3,1); the two :not() clauses here - the
   same ones the other card rules use - take this to (0,5,0). */
.products:not(.woocommerce-mini-cart):not(.list-style) .product-buttons .button,
.products:not(.woocommerce-mini-cart):not(.list-style) .product-buttons .add_to_cart_button {
  height: auto;
  min-height: 2.1875rem;
  line-height: 1.2;
  padding-top: 6px;
  padding-bottom: 6px;
  text-align: center;
}

/* Mini-cart buttons: room for a wrapped label.

   "Finalizar compras" wraps to two lines in the drawer's narrow columns. The
   theme fixes the height at 2.375rem (38px) with line-height 1, so the two
   lines measure 4px from the top and 4px from the bottom - centred, but with
   no breathing room, which reads as the text filling the pill.

   Letting the height grow past the 38px floor and giving the lines 1.2 of
   leading puts real space above and below. text-align is also needed: the
   theme's flex centring positions the text block, but the second line inside
   it stays left on text-align: start.

   Specificity has to clear .site-header .header-action.cart-button
   .cart-not-empty ... (height) and p.woocommerce-mini-cart__buttons a.button
   (0,3,2). */
body .site-header .header-action.cart-button .woocommerce-mini-cart__buttons a.button,
body p.woocommerce-mini-cart__buttons a.button {
  height: auto;
  min-height: 2.375rem;
  line-height: 1.2;
  padding-top: 6px;
  padding-bottom: 6px;
  text-align: center;
}

/* Button text size, unified at the sheet's 14px step.

   Typography > Button in the Customizer carries most buttons (11px -> 14px),
   and the Elementor banner/slider buttons have their own btn_size control, set
   to 14 there. These are the ones the theme sizes itself and that neither of
   those reaches: product card buttons and the mini-cart pair sat at 13px, the
   shop filter at 12px.

   11px was not a step in the body sheet at all - its sans sizes are 20, 16, 14
   and 12 - so this also puts buttons back on the scale. */
.products:not(.woocommerce-mini-cart):not(.list-style) .product-buttons .button,
.products:not(.woocommerce-mini-cart):not(.list-style) .product-buttons .add_to_cart_button,
body .site-header .header-action.cart-button .woocommerce-mini-cart__buttons a.button,
body p.woocommerce-mini-cart__buttons a.button,
body .widget button,
body .price_slider_amount button.button {
  font-size: 14px;
}

/* The checkout CTA sits on the same 14px step as every other button. */
body .wc-block-components-checkout-place-order-button {
  font-size: 14px;
}

/* The three buttons the rule above cannot reach, each pinned by a longer
   theme selector:
     .products .product .product-wrapper.style-6 .content-wrapper … .button
                                            carousel/grid cards, 0.8125rem
     .klb-banner .entry-footer .btn          slider and banner "Ver mais", 0.8125rem
     .price_slider_wrapper .price_slider_bottom button   shop filter, 0.75rem */
body .products .product .product-wrapper.style-6 .content-wrapper .product-buttons a.button,
body .products .product .product-wrapper.style-6 .content-wrapper .product-buttons button.button,
body .products .product .product-wrapper.style-6 .content-wrapper .product-buttons .add_to_cart_button,
body .klb-banner .entry-footer .btn,
body .price_slider_wrapper .price_slider_bottom button {
  font-size: 14px;
}

/* The terms line and submit button, grouped by assets/js/checkout-actions.js
   into .serratopwines-checkout-bar and placed by layout. */
.serratopwines-checkout-bar .wc-block-checkout__actions_row {
  margin: 0;
}

/* :not(.is-link) and the body prefix are here to clear WooCommerce's
   body:not(.woocommerce-block-theme-has-button-styles)
   .wc-block-components-button:not(.is-link) { min-height: 3em } at (0,3,1),
   which otherwise pins this to 3em - 42px at the 14px size. Both button
   classes are named so this reaches (0,4,1); a tie at (0,3,1) loses, because
   WooCommerce's stylesheet loads after this one. */
body .serratopwines-checkout-bar .wc-block-components-button.wc-block-components-checkout-place-order-button:not(.is-link) {
  width: 100%;
  /* 78px came from the theme's 2.625rem line-height plus WooCommerce's 18px of
     vertical padding. 46px matches the other buttons on the site. */
  min-height: 46px;
  height: auto;
  line-height: 1.2;
  padding-top: 12px;
  padding-bottom: 12px;
}

/* In the order summary column, below the total. */
.wc-block-components-sidebar .serratopwines-checkout-bar.is-in-sidebar {
  margin-top: 20px;
}

/* ---------------------------------------------------------------------------
   Below the two-column breakpoint the bar is pinned to the bottom of the
   viewport, the same treatment .cart-collaterals gets on the cart page - same
   breakpoint, z-index, shadow and safe-area padding, so the two pages behave
   alike.

   The terms line travels with the button rather than being pinned separately:
   one container means their heights never have to be kept in sync by hand.
   --------------------------------------------------------------------------- */
@media screen and (max-width: 991.98px) {

  body.woocommerce-checkout .serratopwines-checkout-bar {
    position: fixed;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: 999;
    margin: 0;
    padding: 0.875rem 1rem;
    padding-bottom: calc(0.875rem + env(safe-area-inset-bottom, 0px));
    background-color: var(--color-gray25);
    box-shadow: 0 -2px 12px rgba(27, 31, 34, 0.1);
  }

  /* Below 992px WooCommerce renders the order summary twice: a collapsed
     toggle at the top of the page, and a second, fully expanded copy inside
     .wc-block-checkout__actions just above the button. Both carry identical
     data - same line items, same totals - so the expanded one is redundant
     once the collapsed toggle is there. Hidden rather than removed, because
     only the summary goes; the notices that share that container are the ones
     that surface checkout errors.

     Desktop is untouched: there is only one summary there, in the sidebar. */
  body.woocommerce-checkout .wc-block-checkout__actions .wp-block-woocommerce-checkout-order-summary-block {
    display: none;
  }

  /* Room to scroll past the bar, at the end of the page rather than under the
     form. On the form it left a band of empty page between the terms and the
     footer; the footer already follows the checkout, so the only thing that
     needs clearing is the very bottom of the document, where the bar would
     otherwise sit over the last of it. 6rem covers the bar's 74px with room to
     spare. */
  body.woocommerce-checkout .wp-block-woocommerce-checkout {
    /* The top 24px too: the summary band is the first thing on the page and
       runs edge to edge, so it meets the header directly. */
    padding-top: 0;
    padding-bottom: 0;
  }

  /* Nothing between the terms and the footer. Two margins sat there: the
     layout's own 16px below the two columns, and the 30px the theme puts above
     every footer. */
  body.woocommerce-checkout .wc-block-components-sidebar-layout {
    margin-bottom: 0;
  }

  body.woocommerce-checkout .site-footer {
    margin-top: 0;
  }

  /* Room to scroll past the pinned bar, added to the last footer row rather than
     to .site-footer: the footer element is transparent and the gold sits on the
     rows inside it, so padding on the footer showed as a white band below the
     page. :has() keeps it to pages that actually have a bar - an empty cart has
     none, and reserving space for it there is just dead screen. */
  body.woocommerce-cart:has(.cart-collaterals) .site-footer > .footer-row:last-child,
  body.woocommerce-checkout:has(.serratopwines-checkout-bar) .site-footer > .footer-row:last-child {
    padding-bottom: calc(6rem + env(safe-area-inset-bottom, 0px));
  }
}

/* Collapsed order summary: the total matches the heading beside it.

   The toggle row carries "Resumo da encomenda" at
   var(--wp--preset--font-size--medium) / 500, while the amount next to it just
   inherits the block's small size (13px / 400). Same token and weight here, so
   the two stay in step if that preset ever changes rather than being pinned to
   20px by hand. The colour already matches.

   Self-scoping: the amount only appears inside this title on the collapsible
   layout below 992px - on desktop the summary is expanded and its header
   carries no total. */
.wc-block-components-checkout-order-summary__title .wc-block-formatted-money-amount {
  font-size: var(--wp--preset--font-size--medium, 20px);
  font-weight: 500;
  line-height: 1.4;
}

/* Terms line as its own section under the order note.

   WooCommerce renders checkout-terms-block directly after the order-note block,
   which is where it stays - the submit button is the only thing the script
   relocates. The block already carries a --with-separator modifier, but that
   draws a single hairline with no space around it; this gives the text room so
   it reads as a section of its own rather than a caption on the note above. */
body .wc-block-components-form .wc-block-checkout__terms,
body .wc-block-components-main .wc-block-checkout__terms {
  margin: 1.5rem 0 0;
  padding: 1.5rem 0 0;
  border-top: 1px solid var(--color-gray300);
  text-align: left;
}

/* ---------------------------------------------------------------------------
   Mobile: the order summary runs edge to edge as two coloured bands - the
   toggle row in the brand colour, the summary it opens in a tint of it.

   The column itself carries nothing now; the bands are what is seen, so its
   padding and panel go and negative side margins pull it out of the page
   gutter. The desktop panel is in the min-width: 992px block further up and is
   untouched.
   --------------------------------------------------------------------------- */
@media screen and (max-width: 991.98px) {

  body.woocommerce-checkout .wc-block-components-sidebar-layout .wc-block-components-sidebar {
    /* The column is a flex item, so negative margins shift it without widening
       it - its width comes from flex-basis. The width is stated outright and the
       basis released, then the left margin pulls it back over the gutter. */
    width: 100vw;
    max-width: none;
    flex-basis: auto;
    margin-left: calc(50% - 50vw);
    margin-right: calc(50% - 50vw);
    padding: 0;
    background-color: transparent;
    border-radius: 0;
  }

  /* The toggle row, open or closed. The divider the desktop heading carries
     would only cut across the fill, so it goes, and the padding it had on one
     side becomes padding on all four. */
  body .wc-block-components-sidebar .wc-block-components-checkout-order-summary__title {
    margin: 0;
    padding: 1rem;
    border: 0;
    background-color: var(--wine-button-color);
    color: #fff;
  }

  /* The text, the amount and the chevron are all given their colour by
     WooCommerce, so none of them inherits - each is named. The chevron is an
     SVG filled with currentColor. */
  body .wc-block-components-sidebar .wc-block-components-checkout-order-summary__title .wc-block-components-checkout-order-summary__title-text,
  body .wc-block-components-sidebar .wc-block-components-checkout-order-summary__title .wc-block-formatted-money-amount,
  body .wc-block-components-sidebar .wc-block-components-checkout-order-summary__title .wc-block-components-checkout-order-summary__title-icon {
    color: #fff;
    fill: currentColor;
  }

  body .wc-block-components-sidebar .wc-block-components-checkout-order-summary__content {
    padding: 1rem;
    background-color: #f3eeee;
  }
}

/* ------------------------------------------------------------------------- *
 * Maintenance page (Template Name: Manutenção)
 *
 * The template switches off search, account and cart before the header is
 * built, so what is left to deal with here is the part of the header that is
 * always rendered: the top bar, the menus and the mobile burger.
 *
 * Hiding those leaves two empty flex columns. They are Bootstrap-style .col,
 * so they still claim an equal share of the row and push the logo off centre.
 * Rather than single out the brand's column - the classes around it differ by
 * header type - every column is told to size to its own contents, which makes
 * the emptied ones zero-width, and the row is centred. The logo ends up in the
 * middle whichever header type is in use.
 *
 * The footer is deliberately untouched - the contacts and the legal links in
 * it are exactly what someone needs while the shop is down.
 * ------------------------------------------------------------------------- */
body.stw-maintenance .site-header .header-topbar,
body.stw-maintenance .site-header .klb-menu-nav,
body.stw-maintenance .site-header .header-action.toggle-button,
body.stw-maintenance .klb-mobile-bottom {
  display: none;
}

body.stw-maintenance .site-header .header-inner {
  justify-content: center;
}

body.stw-maintenance .site-header .header-inner > .col {
  flex: 0 0 auto;
  width: auto;
  max-width: none;
}

/* The header is one short row now, so the usual sticky-header allowance leaves
   a gap the page does not need. */
body.stw-maintenance .empty-klb {
  display: none;
}

/* The horizontal lockup is about 5:1, where the round icon it replaces is 1:1,
   so it is sized by height and left to find its own width. The max-width keeps
   it inside a narrow phone: at 390px a 40px-tall lockup wants 203px, which
   fits, and the guard means a longer lockup could never push the header wider
   than the screen.

   The long selectors are not decoration. The Customizer prints its logo widths
   as inline CSS in the head -
   `.site-header .header-main .site-brand img{width:90px}` and a 54px twin for
   the mobile header - at three classes to this file's two, so a shorter
   selector here loses and the lockup gets squeezed into the round icon's width
   and letterboxed. Those widths are a global setting, right for every other
   page, so they are overridden here rather than changed. */
body.stw-maintenance .site-header .header-main .site-brand img,
body.stw-maintenance .site-header .header-mobile .site-brand img {
  width: auto;
  height: 56px;
  max-width: min(320px, 72vw);
  object-fit: contain;
}

@media (max-width: 991.98px) {
  body.stw-maintenance .site-header .header-main .site-brand img,
  body.stw-maintenance .site-header .header-mobile .site-brand img {
    height: 40px;
  }
}

/* The theme gives #page a min-height of 100vh and lets .site-primary grow, so
   the footer is pushed to the bottom of the screen (base.css:5894). On a page
   this short that leaves the message stranded at the top above a large empty
   band, so the growing element is made a flex container and the message is
   centred in whatever space is left between the header and the footer. */
body.stw-maintenance .page-content .site-primary {
  display: flex;
  align-items: center;
}

body.stw-maintenance #content.site-content {
  width: 100%;
}

/* .klb-page.section carries its own min-height of 100vh, which filled the
   space the centring above is meant to distribute. Released here so the block
   is only as tall as the message, and .site-primary can place it. */
body.stw-maintenance .stw-maintenance-page {
  min-height: 0;
  padding: 48px 0;
  text-align: center;
}

body.stw-maintenance .stw-maintenance-title {
  font-size: var(--stw-h1-size);
  line-height: var(--stw-h1-lh);
  letter-spacing: var(--stw-h1-ls);
  margin: 0 0 20px;
}

body.stw-maintenance .stw-maintenance-body {
  font-size: 17px;
  line-height: 1.65;
}

body.stw-maintenance .stw-maintenance-body p {
  margin: 0 0 14px;
}

body.stw-maintenance .stw-maintenance-body p:last-child {
  margin-bottom: 0;
}

body.stw-maintenance .stw-maintenance-lead {
  font-size: 19px;
}

/* The contact block is the one actionable thing on the page, so it is set off
   from the apology above it. */
body.stw-maintenance .stw-maintenance-contact {
  margin-top: 32px;
  padding-top: 28px;
  border-top: 1px solid #e3e4e6;
}

body.stw-maintenance .stw-maintenance-contact a {
  font-weight: 600;
}

body.stw-maintenance .stw-call-cost {
  display: inline-block;
  font-size: 13px;
  color: #6b6b6b;
}

@media (max-width: 991.98px) {
  body.stw-maintenance .stw-maintenance-page {
    padding: 40px 0;
  }

  body.stw-maintenance .stw-maintenance-title {
    font-size: var(--stw-h1-size-sm);
    line-height: var(--stw-h1-lh-sm);
    letter-spacing: var(--stw-h1-ls-sm);
  }

  body.stw-maintenance .stw-maintenance-body {
    font-size: 16px;
  }

  body.stw-maintenance .stw-maintenance-lead {
    font-size: 17px;
  }
}
