/* Product detail proposal. Reuses the approved visual direction of the homepage. */
[hidden]{display:none!important}
.breadcrumbs{display:flex;gap:12px;align-items:center;flex-wrap:wrap;padding-block:24px;font-size:13px;color:var(--muted)}
.breadcrumbs a{min-height:32px;display:flex;align-items:center}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs [aria-current]{color:var(--blue)}
.pdp-grid{display:grid;grid-template-columns:minmax(0,1.08fr) minmax(0,.92fr);grid-template-areas:'gallery heading' 'gallery summary';column-gap:64px;align-items:start;padding-bottom:48px}
.pdp-heading{grid-area:heading;padding-bottom:18px}.pdp-heading h1{font-size:56px;margin:0 0 10px;letter-spacing:-.045em}.pdp-heading h1>span{display:block;font:600 12px/1.5 var(--font);text-transform:uppercase;letter-spacing:.13em;margin-bottom:12px}.pdp-subtitle{font-size:19px;color:var(--muted)}
.rating-link{display:inline-flex;align-items:center;gap:10px;font-size:14px;color:var(--blue);min-height:44px;margin-top:7px}.rating-link>span:last-of-type{text-decoration:underline;text-underline-offset:4px}.rating-link>svg{width:17px;height:17px}.stars{display:inline-flex;align-items:center;gap:3px;color:var(--cb-star);vertical-align:middle}.stars svg{width:16px;height:16px;stroke-width:1.3}.stars .filled{fill:currentColor}.stars .empty{fill:none}.rating-link .stars svg:last-child,.rating-summary>.stars svg:last-child{clip-path:inset(0 20% 0 0)}
.pdp-gallery{grid-area:gallery;min-width:0}.gallery-stage{position:relative;aspect-ratio:1.05;background:var(--cream);border:1px solid var(--line);border-radius:3px;overflow:hidden}.gallery-badge{position:absolute;z-index:1;left:24px;top:22px;padding:7px 12px;border:1px solid var(--line);background:var(--white);color:var(--blue);font-size:13px;font-weight:600}.gallery-open{display:block;padding:25px 20px;width:100%;height:100%;background:none;border:0;cursor:zoom-in}.gallery-open img{width:100%;height:100%;object-fit:contain;mix-blend-mode: normal;transform:scale(1.18)}.gallery-open img.capsule-only{transform:scale(1.65)}.zoom-affordance{position:absolute;bottom:18px;right:18px;width:44px;height:44px;display:grid;place-items:center;border:1px solid var(--line);border-radius:50%;background:#fff;color:var(--blue)}.gallery-caption{position:absolute;left:24px;bottom:26px;font-size:13px;color:var(--muted);pointer-events:none}.gallery-bottom{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-top:16px}.gallery-thumbs{display:flex;gap:10px}.gallery-thumb{width:70px;height:70px;border:1px solid var(--line);border-radius:3px;background:#fff;padding:5px}.gallery-thumb img{width:100%;height:100%;object-fit:contain}.gallery-thumb.active{border:2px solid var(--blue);padding:4px}@media(hover:hover){.gallery-thumb:hover{border-color:var(--blue)}}.gallery-counter{font-size:13px;font-variant-numeric:tabular-nums;color:var(--blue);letter-spacing:.05em}.gallery-counter span{color:var(--muted);margin-left:5px}.gallery-trust{display:flex;align-items:center;justify-content:center;gap:10px;margin-top:25px;color:var(--blue);font-size:14px}.gallery-trust svg{width:21px;height:21px}
.pdp-summary{grid-area:summary;min-width:0}.pdp-intro{font-size:17px;line-height:1.55;color:var(--muted);max-width:480px;margin-bottom:20px}.compatibility-note{display:flex;align-items:flex-start;gap:12px;background:var(--cream);border-left:3px solid var(--blue);padding:14px 16px;margin-bottom:24px;color:var(--blue)}.compatibility-note>svg{width:21px;height:21px;margin-top:2px}.compatibility-note strong{display:block;font-size:16px;font-weight:600}.compatibility-note span{display:block;font-size:13px;color:var(--muted);margin-top:3px}.compatibility-note a{text-decoration:underline;text-underline-offset:3px}.pdp-price{display:flex;align-items:baseline;gap:18px;flex-wrap:wrap;color:var(--blue)}.pdp-price>strong{font-size:36px;font-weight:600;letter-spacing:-.03em;line-height:1.2;font-variant-numeric:tabular-nums}.pdp-price>span{font-size:15px}.pdp-pack{font-size:13px;color:var(--muted);margin:8px 0 18px}.pdp-pack a{text-decoration:underline;text-underline-offset:3px}.availability{display:flex;align-items:center;gap:7px;font-size:14px;color:var(--blue);margin-bottom:22px}.availability svg{width:17px;height:17px}.availability>span{color:var(--muted);padding:0 2px}.purchase-form>label{display:block;font-size:14px;font-weight:600;color:var(--blue);margin-bottom:8px}.purchase-row{display:flex;gap:12px}.quantity-control{display:flex;border:1px solid var(--line);border-radius:3px;align-items:center;min-height:54px;flex-shrink:0;overflow:hidden}.quantity-control button{width:42px;height:54px;border:0;background:var(--cream);color:var(--blue);display:grid;place-items:center}.quantity-control button:disabled{color:var(--muted);opacity:.45;cursor:default}@media(hover:hover){.quantity-control button:not(:disabled):hover{background:var(--line)}}.quantity-control svg{width:18px;height:18px}.quantity-control input{appearance:textfield;-moz-appearance:textfield;border:0;border-inline:1px solid var(--line);background:#fff;width:42px;text-align:center;color:var(--blue);padding:12px 0;font-size:18px;font-weight:600;font-variant-numeric:tabular-nums}.quantity-control input::-webkit-inner-spin-button,.quantity-control input::-webkit-outer-spin-button{appearance:none;margin:0}.main-add{flex:1;gap:18px;font-size:17px;white-space:nowrap}.quantity-summary{display:flex;justify-content:space-between;gap:16px;font-size:13px;color:var(--muted);margin-top:10px;min-height:20px}.quantity-summary strong{font-weight:600;color:var(--blue)}.delivery-note{display:flex;align-items:center;gap:14px;border-top:1px solid var(--line);padding-top:22px;margin-top:22px;color:var(--blue)}.delivery-note svg{width:27px;height:27px}.delivery-note strong{display:block;font-size:15px;font-weight:600}.delivery-note p>span{display:block;font-size:13px;color:var(--muted);margin-top:3px}.help-link{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:44px;margin-top:12px;color:var(--muted);font-size:14px}.help-link:hover{color:var(--blue);text-decoration:underline}.help-link svg{width:18px;height:18px}
.pdp-section-nav{display:flex;gap:38px;border-top:1px solid var(--line)}.pdp-section-nav a{display:flex;gap:9px;align-items:center;min-height:67px;font-size:16px;color:var(--blue);font-weight:600;border-bottom:2px solid transparent}.pdp-section-nav a[aria-current]{border-color:var(--blue)}@media(hover:hover){.pdp-section-nav a:hover{border-color:var(--blue)}}.pdp-section-nav a>span{border-radius:50%;background:var(--cream);font-size:12px;width:22px;height:22px;display:grid;place-items:center}
.pdp-details{background:var(--cream);padding-block:64px}.details-grid{display:grid;grid-template-columns:1fr 1fr;gap:100px}.coffee-story h2{font-size:44px;margin-bottom:24px}.coffee-story>p:not(.eyebrow){max-width:490px;font-size:17px;line-height:1.7;color:var(--muted)}.taste-tags{display:flex;flex-wrap:wrap;gap:8px;margin-top:24px}.taste-tags span{padding:6px 12px;border:1px solid var(--line);border-radius:3px;color:var(--blue);font-size:13px}.story-facts{display:flex;gap:42px;margin-top:38px;padding-top:26px;border-top:1px solid var(--line);max-width:440px}.story-facts>div{display:flex;flex-direction:column;gap:2px}.story-facts strong{font:500 32px var(--display);letter-spacing:-.035em;color:var(--blue)}.story-facts>div>span{font-size:14px;color:var(--muted)}.coffee-story>.story-small{font-size:13px!important;margin-top:18px}.information-accordions details{border-bottom:1px solid var(--line);scroll-margin-top:24px}.information-accordions details:first-child{border-top:1px solid var(--line)}.information-accordions summary{display:flex;align-items:center;justify-content:space-between;gap:18px;min-height:66px;color:var(--blue);font-weight:600;font-size:18px;cursor:pointer;list-style:none}.information-accordions summary::-webkit-details-marker{display:none}.information-accordions summary svg{width:19px;height:19px;transition:transform .18s}.information-accordions details[open] summary svg{transform:rotate(45deg)}.information-accordions dl{margin:0 0 24px}.information-accordions dl>div{display:grid;grid-template-columns:1fr 1.2fr;gap:16px;padding:8px 0;font-size:15px}.information-accordions dt{color:var(--muted)}.information-accordions dd{margin:0;color:var(--ink)}.accordion-copy{padding-bottom:24px}.accordion-copy p{font-size:16px;color:var(--muted);margin-bottom:14px}.accordion-copy a{display:inline-flex;gap:12px;align-items:center;color:var(--blue);min-height:44px;font-weight:600;font-size:15px}
.reviews-layout{display:grid;grid-template-columns:1fr 1.5fr;gap:100px}.rating-number{font-size:70px;color:var(--blue);line-height:1;letter-spacing:-.05em;font-weight:500;margin:6px 0 12px}.rating-number>span{font-size:20px;color:var(--muted);letter-spacing:0}.rating-summary>.stars svg{width:22px;height:22px}.rating-summary>p{color:var(--muted);font-size:15px;margin-top:10px}.rating-distribution{margin-top:26px;max-width:330px}.rating-distribution>div{display:flex;align-items:center;gap:16px;font-size:13px;color:var(--muted);margin-top:9px}.rating-distribution>div>span:first-child{min-width:48px}.rating-distribution>div>span:last-child{width:12px;text-align:right}.rating-track{height:5px;background:var(--line);flex:1;border-radius:4px;overflow:hidden}.rating-track>span{display:block;background:var(--blue);height:100%}.review-row{display:flex;justify-content:space-between;gap:18px;border-top:1px solid var(--line);padding:24px 0}.review-row h3{font-family:var(--font);font-size:17px;font-weight:600;color:var(--blue);margin-bottom:7px}.verified{display:flex;align-items:center;gap:5px;color:var(--muted);font-size:12px}.verified svg{width:14px;height:14px}.review-right{text-align:right;flex-shrink:0}.review-right time{display:block;font-size:12px;color:var(--muted);margin-top:8px}.review-toggle{display:flex;align-items:center;justify-content:space-between;width:100%;min-height:54px;background:none;border:0;border-block:1px solid var(--line);color:var(--blue);font-size:15px;font-weight:600;text-align:left}.review-toggle svg{width:19px;height:19px}.related-section{background:var(--cream)}.related-section .product-grid{grid-template-columns:repeat(3,1fr);gap:28px}.related-section .product-image img{height:230px}.related-section .product-format{min-height:24px}.related-section .product-art img[src$="/356.jpg"],.related-section .product-art img[src$="/354.jpg"]{--image-scale:1.4}.related-section .price-row{display:flex;gap:16px}.pdp-contact{display:flex;align-items:center;justify-content:space-between;gap:24px;border-bottom:1px solid var(--line);padding-block:36px}.pdp-contact>div{display:flex;align-items:center;gap:20px}.pdp-contact>div>svg{width:30px;height:30px;color:var(--blue)}.pdp-contact strong{display:block;font-size:18px;font-weight:600;color:var(--blue)}.pdp-contact p>span{display:block;font-size:14px;color:var(--muted);margin-top:4px}
#gallery-dialog{width:min(900px,calc(100% - 32px));max-width:900px;padding:20px}#gallery-dialog .dialog-header{margin:0}#gallery-dialog h2{font-size:22px}#zoom-image{width:100%;height:min(65dvh,700px);object-fit:contain}.zoom-nav{display:flex;align-items:center;justify-content:center;gap:28px;color:var(--blue);font-size:14px}.reverse-arrow{transform:rotate(180deg)}.sticky-purchase{display:none}.preview-label{font-size:9px}
@media(max-width:1150px){.pdp-grid{column-gap:36px}.pdp-heading h1{font-size:46px}.pdp-subtitle{font-size:17px}.gallery-thumb{width:60px;height:60px}.gallery-trust{font-size:12px}.gallery-stage{aspect-ratio:.95}.pdp-intro{font-size:16px}.main-add{font-size:15px;gap:12px;padding-inline:15px}.quantity-control button,.quantity-control input{width:40px}.details-grid,.reviews-layout{gap:60px}.compatibility-note{padding-inline:12px}.compatibility-note strong{font-size:15px}.availability{font-size:13px;gap:5px}.related-section .product-grid{gap:22px}}
@media(max-width:850px) and (min-width:701px){.pdp-grid{column-gap:24px;grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.pdp-heading h1{font-size:39px}.pdp-subtitle{font-size:15px}.gallery-stage{aspect-ratio:.82}.gallery-thumb{width:51px;height:51px}.gallery-thumbs{gap:8px}.gallery-badge{left:14px;top:14px;font-size:12px}.gallery-caption{left:14px;bottom:18px;font-size:11px;max-width:150px}.zoom-affordance{right:10px;bottom:10px}.gallery-trust{align-items:flex-start;justify-content:flex-start}.pdp-price{gap:8px}.pdp-price>strong{font-size:32px}.pdp-price>span{font-size:13px}.purchase-row{gap:8px}.quantity-control button{width:36px}.quantity-control input{width:32px}.main-add{font-size:14px;gap:8px;padding-inline:12px}.main-add svg{display:none}.compatibility-note{gap:8px}.compatibility-note>svg{width:17px;height:17px}.availability{flex-wrap:wrap}.details-grid{gap:36px}.coffee-story h2{font-size:36px}.information-accordions summary{font-size:16px}.reviews-layout{gap:50px}.related-section .product-grid{gap:16px}.related-section .product-image img{height:180px}.related-section .product-info h3{font-size:24px}.related-section .product-format{min-height:44px}.related-section .price-row{display:block}}
@media(max-width:700px){.pdp-grid{grid-template-columns:1fr;grid-template-areas:'heading' 'gallery' 'summary';padding-bottom:28px}.breadcrumbs{padding-block:10px;font-size:12px;gap:7px}.breadcrumbs>span[aria-current]{display:none}.breadcrumbs>span:nth-last-child(2){display:none}.pdp-heading{padding-bottom:14px}.pdp-heading h1{font-size:40px;margin-bottom:8px}.pdp-heading h1>span{font-size:11px;margin-bottom:6px}.pdp-subtitle{font-size:16px}.rating-link{margin-top:4px;min-height:36px;font-size:13px;gap:8px}.rating-link .stars svg{width:14px;height:14px}.gallery-stage{height:270px;aspect-ratio:auto}.gallery-open{padding:12px 20px}.gallery-open img{transform:scale(1.26)}.gallery-open img.capsule-only{transform:scale(1.5)}.gallery-badge{left:14px;top:14px;font-size:11px;padding:5px 9px}.gallery-caption{left:14px;bottom:17px;font-size:11px}.zoom-affordance{width:40px;height:40px;bottom:9px;right:10px}.gallery-bottom{margin-top:10px;gap:12px;min-width:0}.gallery-thumb{width:54px;height:54px;flex:0 0 54px}.gallery-thumbs{gap:9px;min-width:0;flex:1;overflow-x:auto;padding:3px}.gallery-trust{display:none}.pdp-summary{margin-top:24px;display:flex;flex-direction:column}.pdp-price{order:0;gap:16px}.pdp-price>strong{font-size:34px}.pdp-price>span{font-size:14px}.pdp-pack{order:1;margin:7px 0 16px;font-size:12px}.compatibility-note{order:2;padding:12px;margin-bottom:14px}.compatibility-note strong{font-size:14px}.compatibility-note span{font-size:12px}.compatibility-note>svg{width:18px;height:18px}.pdp-intro{order:3;font-size:16px;margin-bottom:16px}.availability{order:4;font-size:13px;margin-bottom:16px}.purchase-form{order:5}.purchase-form>label{font-size:13px}.purchase-row{gap:10px}.quantity-control button{width:40px;height:52px}.quantity-control input{width:36px}.quantity-control{min-height:52px}.main-add{font-size:15px;gap:10px;min-height:54px;padding-inline:13px}.main-add svg{width:20px;height:20px}.quantity-summary{font-size:12px}.delivery-note{order:6;padding-top:18px;margin-top:18px}.delivery-note strong{font-size:14px}.delivery-note p>span{font-size:12px}.help-link{order:7;font-size:13px}.pdp-section-nav{gap:24px;justify-content:space-between}.pdp-section-nav a{font-size:13px;min-height:58px;gap:5px}.pdp-section-nav a>span{width:18px;height:18px;font-size:10px}.pdp-details{padding-block:40px}.details-grid{grid-template-columns:1fr;gap:36px}.coffee-story h2{font-size:38px}.coffee-story>p:not(.eyebrow){font-size:16px}.taste-tags{margin-top:20px}.story-facts{gap:40px;margin-top:26px;padding-top:22px}.story-facts strong{font-size:29px}.story-facts>div>span{font-size:13px}.information-accordions summary{min-height:62px;font-size:16px}.information-accordions dl>div{font-size:14px;grid-template-columns:1fr 1.3fr}.reviews-layout{grid-template-columns:1fr;gap:32px}.reviews-section .section-heading .text-link{margin-top:12px}.rating-summary{display:grid;grid-template-columns:1fr 1.1fr;gap:0 24px}.rating-number{grid-column:1;grid-row:1;font-size:64px;margin-top:5px}.rating-summary>.stars{grid-column:1;grid-row:2;align-self:start}.rating-summary>p{grid-column:1;grid-row:3;font-size:13px;margin-top:8px}.rating-distribution{grid-column:2;grid-row:1 / 4;margin-top:0;align-self:center;width:100%}.rating-distribution>div{gap:8px;font-size:11px}.rating-distribution>div>span:first-child{min-width:40px}.review-row{padding-block:20px}.review-row h3{font-size:16px}.review-toggle{font-size:14px}.related-section .product-grid{grid-template-columns:repeat(2,1fr);gap:28px 14px}.related-section .product-image img{height:150px}.related-section .product-info h3{font-size:22px}.related-section .product-format{min-height:36px}.related-section .price-row{display:block}.related-section .section-heading>.text-link{margin-top:14px}.pdp-contact{align-items:flex-start;flex-direction:column;gap:12px;padding-block:28px}.pdp-contact>div{gap:14px}.pdp-contact strong{font-size:17px}.pdp-contact p>span{font-size:13px}.pdp-contact>.text-link{font-size:15px}.sticky-purchase:not([hidden]){position:fixed;left:0;right:0;bottom:0;z-index:30;display:flex;justify-content:space-between;align-items:center;gap:16px;background:var(--white);border-top:1px solid var(--line);padding:12px 20px max(12px,env(safe-area-inset-bottom));box-shadow:0 -3px 18px #002a520a}.sticky-purchase strong{display:block;color:var(--blue);font-size:20px;line-height:1.2;white-space:nowrap}.sticky-purchase>div>span{display:block;color:var(--muted);font-size:11px;margin-top:4px}.sticky-purchase .button{font-size:14px;padding-inline:15px;gap:12px;min-height:48px}.sticky-purchase svg{width:18px;height:18px}body.has-sticky .preview-label{bottom:91px}body.has-sticky .toast{bottom:95px}footer .footer-bottom{padding-bottom:105px}.preview-label{max-width:160px;font-size:8px}.gallery-counter{font-size:12px;flex:0 0 auto;white-space:nowrap}}
/*
 * Audit prodotti 2026-09-19, P09 (Toraldo/2761 — unico overflow orizzontale
 * dei 72 rendering, 390px arrivava a 477px: 7 miniature contro le gallerie
 * più corte degli altri prodotti). Correzione provata dal designer nel
 * browser (toraldo-fix-test.json) e integrata qui dentro il breakpoint
 * :max-width:700px esistente sopra (.gallery-bottom/.gallery-thumb/
 * .gallery-thumbs/.gallery-counter): min-width:0 sui contenitori flex per
 * lasciare che .gallery-thumbs si restringa invece di spingere la pagina in
 * largo, poi overflow-x:auto sulla sola striscia miniature — pagina e
 * contatore restano fissi, si scorrono solo le miniature. padding:3px
 * (non solo verticale) sulla striscia lascia spazio all'outline di
 * :focus-visible (base.css, outline-offset:5px) perché lo scorrimento non
 * lo tagli quando una miniatura a bordo riceve il focus da tastiera.
 * scrollIntoView() della miniatura attiva è in js/product.js.
 */
@media(max-width:370px){.pdp-heading h1{font-size:36px}.gallery-stage{height:245px}.main-add svg{display:none}.pdp-section-nav{gap:14px}.pdp-section-nav a{font-size:12px}.quantity-control button{width:38px}.quantity-control input{width:32px}.sticky-purchase{padding-inline:16px!important}.sticky-purchase .button{font-size:13px;padding-inline:12px;gap:8px}}

/*
 * Audit design 2026-09-19, followup (R03 — Frog tagliata): vedi
 * cb_single_gallery() in inc/single-product.php per la classe
 * ".pdp-gallery--machine" (categoria WooCommerce "maschinen"). Specificità
 * (0,2,1) più alta di ".gallery-open img"/".gallery-open img.capsule-only"
 * (0,1,1) e del loro override mobile alla riga sopra: batte entrambi senza
 * bisogno di ripetere la regola dentro il media query max-width:700px. */
.pdp-gallery--machine .gallery-open img {
	transform: none;
}

/* ============================================================
 * Innesto WooCommerce (Design 4) — separato dalla copia sopra,
 * invariata riga per riga da "DESIGN BY CODEX/product-page/v1/product.css".
 * Qui SOLO gli adattamenti resi necessari da markup nativo WooCommerce che
 * il prototipo statico non aveva (nessuna riscrittura delle regole sopra).
 * ============================================================ */

/* Campo quantità: WooCommerce avvolge pulsanti +/- (inc/quantity-buttons.php)
   e input.qty in un <div class="quantity"> nativo, annidato dentro il
   .quantity-control del prototipo. display:contents toglie quel div dalla
   resa (nessun box proprio): le regole ".quantity-control button/input" già
   copiate sopra continuano a bastare da sole, perché sono selettori
   discendenti (non diretti) e raggiungono comunque i pulsanti/l'input veri. */
.quantity-control .quantity {
	display: contents;
}

/* Fedeltà 4 (§3.4): il campo nativo WooCommerce (input.qty) e i pulsanti
   nativi (button.minus/.plus, inc/quantity-buttons.php) portano il loro
   proprio padding (GeneratePress/WooCommerce, specificità più alta di
   ".quantity-control input/button" sopra) — 12px su tutti i lati invece di
   "12px 0" e 10px 20px invece di "1px 6px": risultato, il controllo intero
   era 151x62 invece di 128x58 (e per riflesso, .main-add veniva stirato
   alla stessa altezza da ".purchase-row{display:flex}", che senza
   align-items esplicito equivale a "stretch"). Selettori rinforzati con la
   classe reale, larghezza/altezza restano quelle già fissate sopra. */
.quantity-control .quantity input.qty {
	width: 42px;
	padding: 12px 0;
}
.quantity-control .quantity button.minus,
.quantity-control .quantity button.plus {
	padding: 1px 6px;
}

/* Prezzo: $product->get_price_html() stampa <span class="woocommerce-Price-amount">
   (mai un <strong>), quindi ".pdp-price>strong" del prototipo (sopra) non lo
   raggiunge. Stessi valori, stesso selettore per ciascun punto di rottura già
   presente sopra — non una regola nuova, solo il bersaglio giusto.
   Fedeltà 4 (§2.2/§3.4): il selettore era ".pdp-price .woocommerce-Price-amount"
   (discendente generico), quindi colpiva ANCHE lo span dell'unità
   (".pdp-price>span", "CHF 0.25 pro Kapsel") che ha il suo <span
   class="woocommerce-Price-amount"> interno — il prezzo unitario appariva
   grande quanto il prezzo pieno. Scoping a ">strong" per il prezzo
   principale, regola separata sotto per l'unità. */
.pdp-price > strong .woocommerce-Price-amount {
	font-size: 36px;
	font-weight: 600;
	letter-spacing: -.03em;
	line-height: 1.2;
	font-variant-numeric: tabular-nums;
}

.pdp-price > span .woocommerce-Price-amount {
	font-size: 15px;
	font-weight: 400;
	letter-spacing: normal;
	line-height: inherit;
}

@media (max-width: 1150px) {
	.pdp-price > strong .woocommerce-Price-amount {
		font-size: 32px;
	}
}

@media (max-width: 850px) and (min-width: 701px) {
	.pdp-price > strong .woocommerce-Price-amount {
		font-size: 32px;
	}
}

@media (max-width: 700px) {
	.pdp-price > strong .woocommerce-Price-amount {
		font-size: 34px;
	}
}

/* Stelle: il prototipo fissa un clip-path al 20% sull'ultima stella
   (".rating-link .stars svg:last-child"/".rating-summary>.stars svg:last-child"),
   tarato solo sul voto 4.8/5 del prodotto 303. cb_stars_svg() (Design 4,
   inc/single-product.php) calcola il riempimento vero per ogni prodotto e lo
   scrive come style="clip-path:…" sulla stella giusta (non sempre l'ultima:
   un voto 3.5 ha la stella "a metà" in quarta posizione, non in quinta) —
   la regola fissa del prototipo va quindi annullata qui, altrimenti un
   punteggio pieno (5.0, prodotto 304) o senza frazione mostrerebbe comunque
   l'ultima stella tagliata all'80%. */
.rating-link .stars svg:last-child,
.rating-summary > .stars svg:last-child {
	clip-path: none;
}

/* Testo della recensione (comment_content reale) e avviso "nessuna
   recensione ancora": non nel prototipo, che mostra solo nome/stelle/data
   perché le 5 recensioni del prodotto 303 hanno il testo vuoto — vedi
   inc/single-product.php, cb_single_reviews(). */
.review-row {
	flex-wrap: wrap;
}

.review-row > div:first-child {
	min-width: 0;
}

.review-text {
	flex-basis: 100%;
	margin: 8px 0 0;
	font-size: 15px;
	line-height: 1.6;
	color: var(--ink);
}

.cb-no-reviews {
	color: var(--muted);
	font-size: 16px;
	padding-block: 24px;
	border-top: 1px solid var(--line);
}

/* Modulo nativo per scrivere una recensione (comment_form(), sempre
   presente per restare funzionante — il prototipo linka al modulo del sito
   esistente, qui siamo il sito vero, vedi cb_single_review_form()). Nessuno
   stile dedicato nel prototipo: solo lo spazio minimo per restare leggibile
   e coerente con i token del sito, non un componente ridisegnato.
   Fedeltà 3: è ora un <details> chiuso di default (aperto solo dal link
   "Bewertung schreiben", js/product.js) invece di un modulo sempre visibile
   — <summary> senza contenuto proprio (".sr-only", solo per l'apertura via
   link), quindi via il triangolo nativo del browser come già per gli altri
   accordion del sito (es. .category-faq in listing.css). */
.cb-review-form {
	margin-top: 32px;
	padding-top: 32px;
	border-top: 1px solid var(--line);
}

.cb-review-form > summary {
	list-style: none;
}

.cb-review-form > summary::-webkit-details-marker {
	display: none;
}

.cb-review-form #respond {
	max-width: 480px;
}

.cb-review-form p {
	margin: 0 0 14px;
}

.cb-review-form label {
	display: block;
	font-size: 14px;
	font-weight: 600;
	color: var(--blue);
	margin-bottom: 6px;
}

.cb-review-form input:not([type="submit"]),
.cb-review-form select,
.cb-review-form textarea {
	width: 100%;
	border: 1px solid var(--line);
	border-radius: 3px;
	padding: 10px 12px;
	font: inherit;
	color: var(--ink);
	background: #fff;
}

/* Casella «Nome ed e-mail in questo browser salvare» (comment-form-cookies-
   consent, WordPress). La regola qui sopra la trattava come un campo di testo:
   width:100%, bordo, padding — dentro la riga flex di WooCommerce diventava
   una colonna larga meta' modulo, e su Safari iPhone spingeva l'etichetta
   fuori dallo schermo con scorrimento laterale (segnalato da Stefan il
   22.09.2026). Casella e testo su una riga, testo che va a capo, peso normale. */
.cb-review-form input[type="checkbox"] {
	width: auto;
	flex: 0 0 auto;
	margin: 3px 0 0;
	padding: 0;
	border: 0;
	border-radius: 0;
	background: none;
}

.cb-review-form .comment-form-cookies-consent {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	flex-wrap: nowrap;
	min-width: 0;
}

.cb-review-form .comment-form-cookies-consent label {
	flex: 1 1 0;
	min-width: 0;
	margin: 0;
	font-weight: 400;
	line-height: 1.45;
	overflow-wrap: anywhere;
}

/* Il selettore ripete quello nativo di WooCommerce (".woocommerce #respond
   input#submit", due id: 2,1,1): con la sola classe il bottone restava grigio
   chiaro con testo grigio, il colore di serie del plugin — trovato il
   22.09.2026 verificando il modulo su telefono. */
.woocommerce #respond input#submit,
.cb-review-form .form-submit input {
	display: inline-flex;
	align-items: center;
	min-height: 48px;
	padding: 12px 22px;
	background: var(--blue);
	color: #fff;
	border: 1px solid var(--blue);
	border-radius: 3px;
	font-weight: 600;
	cursor: pointer;
}

/* Selettore varianti (regola 3 del brief: prodotto con varianti — impianto
   grafico del design, selettore NATIVO WooCommerce vestito con lo stile del
   design). Il prototipo (tarato sul prodotto semplice 303) non prevede
   questo blocco: nessuna regola da "spostare", solo da aggiungere, con gli
   stessi token (var(--blue)/var(--line)/var(--cream)) del resto del file.
   Audit design 2026-09-19, followup (R04 — reticolo GeneratePress visibile):
   il vecchio "border-collapse:collapse" senza azzerare i bordi lasciava
   vincere "table,td,th{border:1px solid rgba(0,0,0,.1)}" del tema padre
   (assets/css/main.min.css) — qui la tabella diventa un blocco a righe
   (una per attributo) invece del reticolo nativo, stessa etichetta+select
   ma integrata col resto del gruppo acquisto (.purchase-form>label è lo
   stesso trattamento già usato sopra per "Anzahl"). La select nativa
   (wc_dropdown_variation_attribute_options(), name="attribute_pa_farbe")
   e reset_variations restano quelli di WooCommerce, solo vestiti. */
.cb-variations,
.cb-variations th,
.cb-variations td {
	border: 0;
}

.cb-variations {
	display: block;
	width: auto;
	margin: 0 0 20px;
}

.cb-variations tbody,
.cb-variations tr {
	display: block;
}

.cb-variations tr + tr {
	margin-top: 16px;
}

.cb-variations th,
.cb-variations td {
	display: block;
	padding: 0;
	text-align: left;
	vertical-align: middle;
}

.cb-variations th.label {
	width: auto;
	padding-bottom: 8px;
	font-size: 14px;
	font-weight: 600;
	color: var(--blue);
}

.cb-variations select {
	width: 100%;
	max-width: 320px;
	min-height: 48px;
	padding: 10px 14px;
	border: 1px solid var(--line);
	border-radius: 3px;
	background: var(--cream);
	color: var(--ink);
	font: inherit;
}

.cb-variations .reset_variations {
	display: inline-block;
	margin-top: 8px;
	font-size: 13px;
	color: var(--muted);
	text-decoration: underline;
	text-underline-offset: 3px;
}

/*
 * Audit design 2026-09-19, followup (R04 — pulsante disattivato senza
 * spiegazione): prima di scegliere una variante ".main-add" ha già le
 * classi native WooCommerce "disabled wc-variation-selection-needed"
 * (impostate da wc-add-to-cart-variation.js al caricamento e rimosse al
 * primo found_variation) — usate qui via :has() invece di duplicare quella
 * logica in JS, per mostrare/nascondere la spiegazione senza toccare il
 * ciclo nativo delle varianti.
 */
.variation-hint {
	display: none;
	margin: 0 0 14px;
	font-size: 14px;
	color: var(--muted);
}

#cb-purchase-form:has(.main-add.wc-variation-selection-needed) .variation-hint {
	display: block;
}

/*
 * Campioni colore (rifinitura 19.09.2026, riferimento "DESIGN BY CODEX/
 * product-page/v1/catalog.html?id=334&design=variants"): sostituiscono
 * visivamente il <select> nativo (riga tabella nascosta con "hidden" in
 * variable.php, non rimossa — vedi cb_single_color_swatches(), inc/single-
 * product.php). Stessi token del resto della pagina, nessuna libreria di
 * swatch: cerchio colore reale (--swatch, uno per termine) + nome sempre
 * visibile accanto (non solo un'etichetta accessibile), radio nativi per
 * tastiera/lettore di schermo — solo il cerchio è decorativo (input
 * ridotto a 1x1px, tecnica standard, non display:none: resta annunciabile
 * e navigabile con le frecce come un gruppo radio nativo).
 */
.cb-color-swatches {
	border: 0;
	border-top: 1px solid var(--line);
	margin: 20px 0 0;
	padding: 18px 0 0;
	min-width: 0;
}
.cb-color-swatches > legend {
	position: absolute;
	width: 1px;
	height: 1px;
	overflow: hidden;
	clip-path: inset(50%);
}
.swatch-heading {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	min-height: 30px;
	margin-bottom: 13px;
}
.swatch-heading p {
	font-size: 15px;
	color: var(--blue);
}
.swatch-heading strong {
	font-weight: 600;
}
.swatch-selected {
	margin-left: 6px;
	color: var(--muted);
}
.swatch-reset {
	border: 0;
	background: none;
	padding: 0;
	min-height: 44px;
	font-size: 12px;
	color: var(--muted);
	text-decoration: underline;
	text-underline-offset: 3px;
}
.swatch-reset:disabled {
	visibility: hidden;
}
.swatch-grid {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(52px, 1fr));
	gap: 6px;
}
.swatch {
	position: relative;
	min-height: 66px;
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	cursor: pointer;
	color: var(--muted);
	font-size: 12px;
	line-height: 1.2;
	padding: 4px 0;
	border-radius: 3px;
}
.swatch input {
	position: absolute;
	opacity: 0;
	width: 1px;
	height: 1px;
}
.swatch-chip {
	position: relative;
	display: grid;
	place-items: center;
	width: 34px;
	height: 34px;
	background: var(--swatch);
	border: 1px solid #00000015;
	border-radius: 50%;
}
.swatch-chip::after {
	content: '';
	position: absolute;
	inset: -5px;
	border: 1px solid transparent;
	border-radius: 50%;
	transition: border-color .16s;
}@media(hover:hover){.swatch:hover .swatch-chip::after{
	border-color: var(--line);
}}
.swatch input:checked + .swatch-chip::after {
	border: 2px solid var(--blue);
}
.swatch input:checked ~ .swatch-name {
	color: var(--blue);
	font-weight: 600;
}
.swatch-chip svg {
	opacity: 0;
	width: 17px;
	height: 17px;
	stroke-width: 2.2;
	color: var(--check, #fff);
}
.swatch input:checked + .swatch-chip svg {
	opacity: 1;
}
.swatch:has(input:focus-visible) {
	outline: 2px solid var(--blue);
	outline-offset: 4px;
}

@media (max-width: 1150px) {
	.swatch-grid {
		grid-template-columns: repeat(5, minmax(0, 1fr));
		gap: 10px 8px;
	}
}

.woocommerce-variation-price .woocommerce-Price-amount {
	font-size: 22px;
	font-weight: 600;
	color: var(--blue);
}

.woocommerce-variation-availability {
	font-size: 14px;
	color: var(--muted);
	margin-top: 4px;
}

/* Pulsante disabilitato: nessuna variante scelta ancora (prodotto 326) o
   barra fissa mostrata prima che il primo found_variation arrivi
   (js/product.js). Stesso aspetto già usato dal prototipo per i pulsanti
   +/- a fine corsa (".quantity-control button:disabled"), qui sul pulsante
   principale/fisso. */
.main-add:disabled,
.sticky-add:disabled {
	opacity: .5;
	cursor: not-allowed;
}

/* La bolla WhatsApp (inc/whatsapp.php, .cb-whatsapp — non del prototipo)
   resta fissa in basso a sinistra e altrimenti finirebbe addosso alla barra
   fissa d'acquisto su telefono. js/product.js aggiunge già "has-sticky" sul
   <body> con lo stesso meccanismo del prototipo (che lo usa per
   .preview-label/.toast/footer, regole sopra, invariate) — qui solo la
   regola in più per il nostro elemento. */
@media (max-width: 700px) {
	body.has-sticky .cb-whatsapp {
		bottom: 90px;
	}
}

/* Fedeltà 3 — correlati: pulsante "In den Warenkorb" pieno blu invece del
   contorno del componente scheda condiviso (.product-card/.add-button,
   stesso markup della home, cb_single_related()). Stessa causa già isolata
   e corretta per il negozio (css/listing.css, ".woocommerce a.add_to_cart_
   button.listing-add"): la scheda prodotto ha la classe body "woocommerce"
   (la home no), quindi ".woocommerce a.add_to_cart_button" di css/main.css
   (pieno) la scavalca — qui la stessa tecnica, scavalcata di nuovo con la
   classe reale del pulsante (".add-button") per tornare al contorno. */
.woocommerce a.add_to_cart_button.add-button {
	background: transparent;
	color: var(--blue);
	border-color: var(--blue);
}
/*
 * Stato "aggiunto al carrello": deve avere la STESSA specificita' della regola
 * WooCommerce qui sopra, altrimenti non si vede.
 * Trovato il 20.09.2026 proteggendo gli stati hover: il blu del pulsante dopo
 * l'aggiunta non veniva da ".added" (0,2,0), che perdeva contro
 * ".woocommerce a.add_to_cart_button.<classe>" (0,3,1) — veniva dall'hover.
 * Su desktop spariva appena si spostava il mouse (misurato: sfondo bianco con
 * la classe "added" addosso); su telefono restava solo perche' iOS lascia
 * l'hover attaccato dopo il tocco. Cioe' la conferma visiva dell'aggiunta era
 * un effetto collaterale, non una regola.
 */
.woocommerce a.add_to_cart_button.add-button.added {
	background: var(--blue);
	color: var(--white);
}

@media(hover:hover){.woocommerce a.add_to_cart_button.add-button:hover{
	background: var(--blue);
	color: var(--white);
}}

/* Fedeltà 3 — correlati, prezzo unitario su telefono ("ca. CHF 0.28 pro
   Stück" spezzato una parola per riga): stessa collisione già isolata per
   .price-row nella home (css/home-extra.css, non caricato su questa
   pagina — dipende da "cb-home", solo is_front_page()) — base.css
   (invariato) mette ".price-row span{display:block}" sotto i 600px, pensato
   per il solo <span> del prezzo unitario del prototipo statico; wc_price()
   avvolge SEMPRE il simbolo valuta in un <span> reale, che quella regola
   spezza a sua volta riga per riga. Stesso rimedio: solo gli span veri di
   WooCommerce dentro il price-row tornano in linea. */
.related-section .price-row .woocommerce-Price-amount,
.related-section .price-row .woocommerce-Price-currencySymbol {
	display: inline;
}

/*
 * Audit design 2026-09-19, followup (R05 — prezzo correlati resta a 12px):
 * base.css ".price-row span{font-size:12px;color:var(--muted)}" era tarato
 * sul prototipo statico, dove il prezzo unitario è l'UNICO span dentro
 * .price-row. wc_price() però avvolge SEMPRE il prezzo principale (quello
 * dentro <strong>) in altri span reali (.woocommerce-Price-amount/
 * -currencySymbol) — anche questi vengono presi da ".price-row span" e
 * restano piccoli e grigi anche se lo <strong> intorno è 23px blu (un
 * valore esplicito sui figli vince sull'eredità dallo strong). Corretto qui
 * invece che allargando/rimuovendo la regola base, che resta giusta per il
 * prezzo unitario (unico span reale rimasto fuori da uno strong).
 */
.related-section .price-row strong .woocommerce-Price-amount,
.related-section .price-row strong .woocommerce-Price-currencySymbol {
	font-size: inherit;
	color: inherit;
}

/* Fedeltà 4 (§3.4): CTA principale "In den Warenkorb" — stessa causa già
   isolata per gli altri bottoni del sito (§2.1): ".woocommerce button.button"
   (main.css) vince su ".button" del prototipo (specificità più alta), qui
   imponeva bordo 2px/700/padding nativo WooCommerce (.618em 1em) invece dei
   valori del design (1px/600/15px 23px, già tutti presenti in ".button" di
   base.css ma scavalcati). Selettore rinforzato con più classi per battere
   ".woocommerce button.button" a prescindere dall'ordine di caricamento.
   Audit design 2026-09-19, followup (R04 — testo/icona non centrati): il
   "display:inline-block" nativo WooCommerce (che qui vinceva comunque,
   nessuna regola sopra lo toccava) viene "blockificato" a "block" perché
   ".main-add" è anche un flex item di ".purchase-row" — perde così il
   proprio contesto flex interno e ".main-add{gap:18px}" (sopra) non ha
   più due elementi inline da distanziare/centrare. "display:flex" esplicito
   qui ripristina il contesto, per prodotti semplici e a varianti insieme
   (stesso pulsante, stesso selettore, stessa .purchase-row in entrambi i
   template — non solo la Frog). */
.woocommerce .purchase-form .button.main-add {
	display: flex;
	align-items: center;
	justify-content: center;
	border: 1px solid var(--blue);
	font-weight: 600;
	line-height: 1.5;
	padding: 15px 23px;
}

/* Fedeltà 4 (§3.4, correlati): stessa causa isolata per la homepage (§3.1.a,
   css/home-extra.css) — ".product-art img[src$=\"/358.jpg\"]" ecc. (base.css)
   punta ai nomi file del PROTOTIPO statico, che non esistono mai negli URL
   reali di WooCommerce: la scala ottica restava sempre 1, l'immagine si
   vedeva "contenuta" nel riquadro (366x230) invece di riempirlo e sborare
   (512x322 nel prototipo). Stesso meccanismo data-attribute già in uso per
   .product-art[data-cb-product] in home-extra.css (solo home, foglio non
   caricato qui) — qui la versione per la scheda prodotto, sui 3 prodotti
   correlati reali di questo prodotto (358 Rossa, 356 Oro, 354 Nera), stessa
   scala 1.4 già usata per 358 in home-extra.css e per 356/354 nel selettore
   morto rimosso sotto. */
.related-section .product-art[data-cb-product] img {
	--image-scale: 1;
	--image-offset-y: 0%;
	transform: translateY(var(--image-offset-y)) scale(var(--image-scale));
}
.related-section .product-art[data-cb-product="358"] img,
.related-section .product-art[data-cb-product="356"] img,
.related-section .product-art[data-cb-product="354"] img,
.related-section .product-art[data-cb-product="322"] img {
	--image-scale: 1.4;
}

/* 20.09.2026 — il fondo crema sta DIETRO la foto, non fuso con essa.
   Finche' molte foto prodotto avevano lo sfondo bianco cotto nel file, il
   "multiply" serviva a farlo sparire nel crema. Ora tutte le foto prodotto sono
   scontornate (WebP con trasparenza, foto-prodotti/04-consigliate) e quel
   trucco non serve piu': anzi moltiplicava anche i colori del prodotto, e i
   bianchi — tazze e confezioni — viravano al beige.
   Il crema resta dove stava, sul contenitore; l'immagine ci si appoggia sopra
   senza fusione. Restano in multiply solo le foto editoriali (chi siamo,
   aziende, 404, ricerca vuota), che non sono passate dallo scontorno. */

/* ---------- Descrizione lunga: layout del 20.09.2026 ----------
 * "DESIGN BY CODEX/product-page/v1/" (DESCRIZIONE-PER-CLAUDE.md +
 * product-description.css). Il prototipo usa classi proprie
 * (.product-description-intro/-highlights/-taste/-order); le 36 descrizioni
 * reali sono h2/p/h3/ul semplici salvate nel database. Verificato su tutte e
 * 36: stesso scheletro "h2 p h3 ul h3 ..." senza eccezioni, quindi lo stile si
 * aggancia alla struttura invece di riscrivere i testi. Corrispondenze:
 *   il nostro h2  = l'h3 del prototipo (titolo Fraunces)
 *   il nostro h3  = l'h4 del prototipo (sottotitolo blu)
 * Il riquadro bianco arriva da cb_descrizione_evidenze() (inc/single-product.php),
 * che avvolge la prima coppia h3+ul al momento di stampare.
 * Prima: il titolo usciva alla misura globale di base.css, clamp(32px,3.1vw,46px),
 * e i sottotitoli alla misura di default del browser, in colore testo.
 * Selettori a due classi per battere ".accordion-copy p/h3", stessa specificita'
 * altrimenti. */
.accordion-copy.product-description {
	padding: 8px 0 28px;
	font-size: 16px;
	line-height: 1.7;
}

.accordion-copy.product-description h2 {
	margin: 0 0 16px;
	color: var(--blue);
	font: 400 25px/1.3 var(--display);
	letter-spacing: -.025em;
	text-wrap: pretty;
}

.accordion-copy.product-description h3 {
	margin: 26px 0 12px;
	color: var(--blue);
	font: 600 16px/1.45 var(--font);
	letter-spacing: 0;
}

.accordion-copy.product-description p {
	margin: 0;
	font-size: 16px;
	line-height: 1.7;
}

.accordion-copy.product-description p + p {
	margin-top: 14px;
}

.accordion-copy.product-description .product-description-highlights {
	margin-top: 26px;
	padding: 20px 22px;
	border: 1px solid var(--line);
	border-radius: 3px;
	background: #fff;
}

.accordion-copy.product-description .product-description-highlights h3 {
	margin: 0 0 12px;
}

.accordion-copy.product-description ul {
	list-style: none;
	padding: 0;
	margin: 0;
}

.accordion-copy.product-description li {
	position: relative;
	margin: 0;
	padding: 0 0 0 23px;
	font-size: 15px;
	line-height: 1.6;
}

.accordion-copy.product-description li + li {
	margin-top: 9px;
}

.accordion-copy.product-description li::before {
	content: '';
	position: absolute;
	left: 2px;
	top: .55em;
	width: 9px;
	height: 5px;
	border-left: 1.5px solid var(--blue);
	border-bottom: 1.5px solid var(--blue);
	transform: rotate(-45deg);
}

/* Separatore prima del blocco d'acquisto, come nel prototipo.
   Figlio DIRETTO: dentro il riquadro bianco l'h3 e' l'unico del suo genitore,
   quindi ":last-of-type" prendeva anche quello e disegnava una riga di troppo
   sopra "Das Wichtigste auf einen Blick". */
.accordion-copy.product-description > h3:last-of-type {
	border-top: 1px solid var(--line);
	padding-top: 22px;
}

.accordion-copy.product-description .cb-tm-note {
	margin-top: 24px;
	font-size: 13px;
	line-height: 1.6;
}

@media(max-width:700px) {
	.accordion-copy.product-description { padding: 6px 0 24px; }
	.accordion-copy.product-description h2 { font-size: 22px; line-height: 1.35; }
	.accordion-copy.product-description h3 { margin-top: 24px; }
	.accordion-copy.product-description .product-description-highlights { padding: 18px 16px; }
	.accordion-copy.product-description .product-description-highlights h3 { margin-bottom: 10px; }
}

/* Pulsante «Farbe wählen» disattivato (collaudo C139): testo bianco anche da
   spento — con l'opacita' e il testo scuro ereditato il contrasto era ~1.8:1. */
.woocommerce form.variations_form button.main-add.disabled,
.woocommerce form.variations_form button.main-add:disabled { color: #fff; opacity: .55; cursor: not-allowed; }
