/* ===========================================================================
 * PDP redesign — desktop
 *
 * Design: Figma `PDP` 33110:107212 (inside `Product page` 33110:105527), 1512
 * wide. Loaded on is_product() only, by inc/pdp-redesign.php, after
 * blutcher-webfonts.css.
 *
 * SCOPE: the audit's "reuse" and "restyle / rewire" items. Parts the design adds
 * from nothing — vet endorsement line, benefit bullets, the five new sections,
 * wishlist — are not here, nor is anything blocked on a licence or client
 * content.
 *
 * ── Two environment facts that shape every rule below ──────────────────────
 *
 * 1. NOTHING is scoped on a body class, and that is not an oversight. The theme
 *    never calls body_class(): header.php is a bare `<body>`, and the classes
 *    present at runtime (`pt-12 md:pt-20 bg-gray-900`) are Tailwind utilities
 *    added by the bundled JS. So `single-product`, `woocommerce`, `postid-*` and
 *    every other WordPress body class is absent site-wide. Page scoping is the
 *    conditional enqueue plus ancestors that only exist on a PDP
 *    (.chuni-beef-banner, .summary); tokens sit on :root for the same reason.
 *
 *    (The checkout stylesheet CAN use body.woocommerce-checkout — Fluid Checkout
 *    renders its own page template, which does call body_class().)
 *
 * 2. The theme loads DUPLICATE copies of its CSS from the footer, through the
 *    calculator.php include. An enqueued stylesheet is therefore document-order
 *    EARLIER than those copies and loses every specificity tie. Where a theme
 *    rule competes for a property, `!important` on that property is the fix, not
 *    a longer selector. Every flag below names what it is beating.
 * ========================================================================= */

/* ---------------------------------------------------------------------------
 * Tokens, named after the Figma variables
 * ------------------------------------------------------------------------- */
:root {
	/* Color/Color 1-8 + 11 */
	--pdp-c1: #a4866c;
	--pdp-c2: #8a6e57;
	--pdp-c3: #c9a98a;   /* Gold Light/100 — buttons, headings, active states */
	--pdp-c4: #f5f2ee;   /* body text */
	--pdp-c5: #d1d0cf;   /* secondary text */
	--pdp-c6: #49423f;   /* dividers, inactive borders */
	--pdp-c7: #1f1f1f;   /* page */
	--pdp-c8: #322b27;   /* raised panels */
	--pdp-c11: #ffffff;

	/* The DISABLED tone from `Button` 33034:255272 row 4 — both of that row's
	 * disabled cells use it, as a fill on the filled variant and as border +
	 * label on the outline one. Sampled from the set's export rather than read
	 * from the node (the connector was unauthenticated), and trustworthy because
	 * the same sampling returns row 1's `#c9a98a`/`#49423f` exactly as item 337
	 * read them from the node itself. 7.3:1 on the card ground. */
	--pdp-c12: #c4b9b0;

	/*
	 * The postcode checker's error state (QA 2026-09-10). Not in the Figma token
	 * set - the frames draw no error state for this field - so both values are read
	 * off Mitz's mock: a pale pink ground with a saturated red message. One token
	 * each, used by the PDP panel and the category gate alike.
	 */
	--pdp-error-bg: #fbeceb;
	--pdp-error-fg: #e3261c;

	/* Divider grey, sampled off the export at the PRODUCT DETAILS rule. Warmer
	 * and lighter than c6, which is what the dividers had been using. */
	--pdp-rule: #5f5347;

	/*
	 * The "why feed raw" band's own ground. Sampled down the export's left gutter:
	 * the page runs #1f1f1f until y=2662 — exactly where Figma's `Section` node for
	 * this block starts — and #292929 from there to the end of the photo band.
	 *
	 * A NEUTRAL grey, not a warm one: r=g=b. Every other raised surface on this page
	 * is warm (c8 #322b27), so reaching for c8 here would have been wrong in a way
	 * that is hard to see and easy to assume.
	 */
	--pdp-band: #292929;

	/* Success tokens, for the Best Value pill and the stock dot */
	--pdp-ok-50: #f0fdf4;
	--pdp-ok-200: #bbf7d0;
	--pdp-ok-400: #4ade80;
	--pdp-ok-900: #14532d;
	--pdp-ok-950: #052e16;

	/*
	 * Fonts.
	 *
	 * ⚠ InterLocal, not Inter. The inherited twentytwentyfour theme.json
	 *   registers a broken `Inter` face on every page (404, FontFace.status =
	 *   error) whose 300-900 weight range swallows ours. See
	 *   assets/css/blutcher-webfonts.css.
	 *
	 * ⚠ NorthwestTextured is a SEPARATE FAMILY from NorthwestRegular, not a style
	 *   of it. No font-weight or font-style reaches it — the design's H2/Textured
	 *   title has to name the family.
	 */
	--pdp-font-body: "InterLocal", "Inter", "HelveticaNeue", Helvetica, Arial, sans-serif;
	--pdp-font-heading: "NorthwestRegular", Georgia, serif;
	--pdp-font-textured: "NorthwestTextured", "NorthwestRegular", Georgia, serif;

	/*
	 * The design's `Fonts/Decoration`, permitted by RULE 6 from 2026-08-28. Declared
	 * in blutcher-webfonts.css — see the note there on why it is not called
	 * "Special Elite". `Specialelite` next in the stack is the campaign pages' own
	 * declaration of the same file, used when that stylesheet is present.
	 */
	--pdp-font-decoration: "SpecialEliteLocal", "Specialelite", "Courier New", Courier, monospace;

	/* Type scale (Size/*, Line Height/*) */
	--pdp-h2: 48px;
	--pdp-h2-lh: 48px;
	--pdp-h6: 20px;
	--pdp-h6-lh: 24px;
	--pdp-para: 18px;
	--pdp-para-big: 20px;   /* Size/Paragraph big */
	--pdp-body: 16px;
	--pdp-links: 14px;
	--pdp-lh-6: 24px;
	--pdp-lh-links: 26px;

	/* Layout: Display/Screen Width 1512 − 2 × Layout/Horizontal-Padding 64 = 1384 */
	--pdp-gutter: 64px;
	--pdp-content: 1384px;
	--pdp-col: 668px;
	--pdp-col-gap: 48px;
}

/* ---------------------------------------------------------------------------
 * RESTYLE — page geometry
 *
 * Was a full-bleed hero of 907 + 605 over body copy in a separate 1140 Bootstrap
 * container: two widths on one page. Now one grid — 1384 centred in a 64px
 * gutter, two 668 columns, 48 gap.
 *
 * Bootstrap stays where it is. It is CDN 4.3.1 and unpicking it means touching
 * ~4,400 template lines; this overrides the containers it produces.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner {
	padding-left: var(--pdp-gutter);
	padding-right: var(--pdp-gutter);
	background-color: var(--pdp-c7);
}

.chuni-beef-banner .chunny-butlee-under {
	display: grid;
	/*
	 * ⚠ FLUID TRACKS, NOT `var(--pdp-col) var(--pdp-col)` — QA 2026-09-11 (ClickUp
	 *   86eyvw3ec). Two fixed 668 columns and a 48 gap are 1384 whatever the
	 *   window is; at 1400 the grid box was 1272 wide and the right column ran to
	 *   x1448, 48px past the viewport — "$22.7" and "$21.0" were the per-kg
	 *   prices with their last digit off-screen. `max-width: var(--pdp-content)`
	 *   below already caps the grid at the design's 1384, so at 1512 and above
	 *   each track is still exactly 668; below that they share what the gutters
	 *   leave. `minmax(0, …)` so a wide child cannot push a track past its share.
	 */
	grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
	gap: var(--pdp-col-gap);
	align-items: start;
	box-sizing: border-box;
	width: 100%;
	max-width: var(--pdp-content);
	margin: 0 auto;
}

/* The columns were sized by width declarations on the old flex children. */
.chuni-beef-banner .chunii-left-image,
.chuni-beef-banner .chunii-right-image {
	width: auto;
	max-width: none;
	min-width: 0;
	padding: 0;
	float: none;
}

/*
 * The gallery column is pinned while the panel scrolls — QA 2026-09-11 (ClickUp
 * 86eyvw3mh). The grid is `align-items: start`, so the 668-tall gallery sat at
 * the top of a 2800px row and the left half of the page was empty from the first
 * scroll. `sticky` inside the grid item's own track releases at the row's end on
 * its own; no ancestor between here and <body> clips overflow (measured). Top
 * clears the fixed header — alert bar 52 + `#myHeader` 82 = 133 — with 16 to
 * spare. Desktop only: below 1000 the grid is one column and the gallery leads.
 *
 * ⚠ THE BODY MUST NOT BE A SCROLL CONTAINER, or `sticky` sticks to nothing. The
 *   theme's `html, body { overflow-x: hidden }` (assets/css/style.css:82) puts
 *   the clip on BOTH elements. On `html` it propagates to the viewport, which is
 *   what clips horizontal overflow. On `body` it cannot propagate — `html` has
 *   already taken a non-visible overflow — so it applies to the body itself,
 *   which makes the body the gallery's nearest scrolling ancestor. The body's
 *   content fits the body, so it never scrolls, and the gallery, measured,
 *   scrolled off with the page with `position: sticky` computed all the while.
 *   `visible` on the body hands the clip back to the viewport alone; the page
 *   still cannot scroll sideways because `html` still says so. Scoped to the PDP
 *   body and to the widths that stick.
 *
 * ⚠ NOT `body.single-product`. This theme's <body> never calls body_class() —
 *   it carries `pt-12 md:pt-20 bg-gray-900` and nothing else — so the
 *   WooCommerce class is not there to match; it lands on the page's own
 *   `section.chuni-beef-banner.single-product` instead. The first cut of this
 *   rule was written against the body class, matched nothing, and the gallery
 *   went on scrolling away with `position: sticky` computed. `html body` beats
 *   the theme's `html, body` on specificity; `:has()` keeps it to the PDP,
 *   because this stylesheet also loads on the category page for the cards.
 */
@media (min-width: 1000px) {
	html body:has(.chuni-beef-banner.single-product) {
		overflow-x: visible;
	}

	.chuni-beef-banner .chunii-left-image {
		position: sticky;
		top: 149px;
	}
}

/*
 * Inside the right column the theme nests .working-dog-butler > .container >
 * .row > .col-md-12 — three Bootstrap wrappers, each with its own padding and
 * max-width, before any panel content. Flattened to the column width.
 */
.chunii-right-image .working-dog-butler,
.chunii-right-image .working-dog-butler .container,
.chunii-right-image .working-dog-butler .row,
.chunii-right-image .working-dog-butler [class*="col-"] {
	width: 100%;
	max-width: 100%;
	margin: 0;
	padding: 0;
	flex: none;
}

/* ---------------------------------------------------------------------------
 * RESTYLE — breadcrumb
 *
 * Was in the DOM and `display: none`. Now above the gallery at the gutter, with
 * the design's fourth level ("Shop") added in PHP.
 *
 * Four `nav.woocommerce-breadcrumb { display: none }` rules exist across the
 * theme's stylesheets, all unflagged, so specificity alone wins here.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner > nav.woocommerce-breadcrumb {
	display: block;
	box-sizing: border-box;
	width: 100%;
	max-width: var(--pdp-content);
	margin: 0 auto;
	padding: 24px 0;
	color: var(--pdp-c5);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-links);
	font-weight: 400;
	line-height: 20px;
}

.chuni-beef-banner > nav.woocommerce-breadcrumb a {
	color: var(--pdp-c5);
	text-decoration: none;
}

.chuni-beef-banner > nav.woocommerce-breadcrumb a:hover,
.chuni-beef-banner > nav.woocommerce-breadcrumb a:focus-visible {
	color: var(--pdp-c3);
	text-decoration: underline;
}

/* ---------------------------------------------------------------------------
 * REWIRE — gallery
 *
 * The theme hid WooCommerce's gallery outright:
 *   .woocommerce-product-gallery--with-images { display: none }
 * and showed ACF decorative images in its place. The templates now render the
 * real gallery in the left column; this makes it visible and squares it.
 * ------------------------------------------------------------------------- */
.chunii-left-image .woocommerce-product-gallery,
.chunii-left-image .woocommerce-product-gallery--with-images,
.chunii-left-image .woocommerce-product-gallery.woocommerce-product-gallery--with-images {
	/*
	 * !important for DOCUMENT ORDER, not specificity. The hiding rule is
	 *   .woocommerce-product-gallery.woocommerce-product-gallery--with-images.woocommerce-product-gallery--columns-4
	 * at (0,3,0) — a tie with the longest selector here — and it appears in THREE
	 * stylesheets that all load after this file. Confirmed with
	 * CSS.getMatchedStylesForNode.
	 */
	display: block !important;
	/* The column's width, now that the column is fluid (86eyvw3ec). */
	width: 100%;
	max-width: 100%;
	margin: 0;
	float: none;

	/*
	 * !important, and the reason is worth spelling out — it cost a released
	 * regression.
	 *
	 * WooCommerce ships `.woocommerce div.product div.images.woocommerce-product-gallery
	 * { opacity: 0 }` and clears it from its own gallery script once flexslider has
	 * initialised. On this site that script never gets that far, because the theme
	 * hid the gallery outright and WooCommerce's single-product gallery JS has
	 * nothing to initialise. So the base rule stands and the container stays fully
	 * transparent.
	 *
	 * `display` above already carried `!important` for the same document-order
	 * reason; `opacity` did not, and the gallery therefore occupied the correct
	 * 668×668 with the correct image loaded inside it and painted NOTHING. Every
	 * check of it measured geometry — rect, position, dot indicator — and geometry
	 * was right the whole time. Measure paint, not just layout.
	 */
	opacity: 1 !important;
}

.chunii-left-image .woocommerce-product-gallery__wrapper {
	margin: 0;
	width: 100%;
}

.chunii-left-image .woocommerce-product-gallery__image,
.chunii-left-image .woocommerce-product-gallery__image a {
	display: block;
	width: 100%;
}

/*
 * Square crop. object-fit rather than a fixed height, so the image is cropped
 * instead of distorted — the design's gallery is 1:1 and the source media is
 * 16:9, so something has to give either way. aspect-ratio keeps this correct if
 * the column ever narrows.
 */
.chunii-left-image .woocommerce-product-gallery__image img,
.chunii-left-image .woocommerce-product-gallery img.wp-post-image {
	display: block;
	width: 100%;
	aspect-ratio: 1 / 1;
	height: auto;
	object-fit: cover;
	border-radius: 0;
}

/*
 * WooCommerce's zoom appends a second, full-size `img.zoomImg` inside the
 * slide and positions it by hand (inline width/height/left/top). The square-
 * crop rule above must not touch it: a 1:1 crop of the magnified image would
 * cut it, and object-fit would re-fit what zoom has already sized.
 */
.chunii-left-image .woocommerce-product-gallery__image img.zoomImg {
	aspect-ratio: auto;
	object-fit: fill;
	max-width: none;
	/*
	 * The product PNGs are transparent box renders. Without a ground the
	 * original image shows through the zoomed copy's empty area — measured on
	 * the Carnivore Box as a second, smaller box above the magnified one.
	 * WooCommerce's own stylesheet gives .zoomImg a white ground for the same
	 * reason; ours is the page's.
	 */
	background-color: var(--pdp-c7);
}

/*
 * One slide at a time.
 *
 * flexslider never initialises on this theme — the container shipped
 * display:none, so by the time it is unhidden the slider has already skipped a
 * zero-size element. Left alone, every image stacks: raw meals rendered 2004px
 * tall (668 × 3).
 *
 * Two rules: the no-JS floor, then the state pdp-gallery.js drives. The active
 * rule names the container so it out-specifies the first for slides 2+.
 */
.chunii-left-image .woocommerce-product-gallery__image:not(:first-child) {
	display: none;
}

.chunii-left-image .woocommerce-product-gallery .woocommerce-product-gallery__image.bc-pdp-gallery--active {
	display: block;
}

.chunii-left-image .woocommerce-product-gallery:has(.bc-pdp-gallery--active) .woocommerce-product-gallery__image:not(.bc-pdp-gallery--active) {
	display: none;
}

/* Page indicator, built by the script — nothing renders for a single image. */
.chunii-left-image .woocommerce-product-gallery .bc-pdp-gallery__dots {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 12px;
	margin-top: 12px;
}

.chunii-left-image .woocommerce-product-gallery .bc-pdp-gallery__dot {
	/*
	 * The design's dot is 8px. An 8px button fails the 44px touch minimum, so the
	 * hit area is 44 and the mark is drawn at 8 by ::before.
	 */
	display: inline-flex;
	align-items: center;
	justify-content: center;
	padding: 0;
	border: 0;
	background: transparent;
	cursor: pointer;
}

.chunii-left-image .woocommerce-product-gallery .bc-pdp-gallery__dot::before {
	content: "";
	display: block;
	width: 8px;
	height: 8px;
	border-radius: 9999px;
	background-color: var(--pdp-c6);
	transition: background-color 120ms ease, transform 120ms ease;
}

.chunii-left-image .woocommerce-product-gallery .bc-pdp-gallery__dot.bc-pdp-gallery--active::before {
	background-color: var(--pdp-c3);
	transform: scale(1.25);
}

.chunii-left-image .woocommerce-product-gallery .bc-pdp-gallery__dot:focus-visible {
	outline: 2px solid var(--pdp-c3);
	outline-offset: -6px;
}

/*
 * Zoom button, built by pdp-gallery.js inside the slide on screen.
 *
 * The design (tablet and mobile PDP frames; the desktop frame draws none, and
 * Mitz asked for it on every width, 2026-09-12) is a bare white magnifier —
 * no disc — about 13px, some 20px in from the image's top and right edges.
 * Mitz's own artwork, 13×13, drawn 1:1. A 13px control fails the 44px touch
 * minimum, so the box is 44 and the glyph is centred: box at 5/5 puts the
 * glyph's centre 27px in, its edges at 20.5.
 *
 * The slide is the containing block: jquery.zoom sets it position: relative
 * and appends the zoomed copy as an absolute sibling, so the button keeps
 * z-index 2 to stay on top of it.
 */
.chunii-left-image .woocommerce-product-gallery__image {
	position: relative;
}

.chunii-left-image .woocommerce-product-gallery .bc-pdp-gallery__zoom {
	position: absolute;
	top: 5px;
	right: 5px;
	z-index: 2;
	display: block;
	width: 44px;
	height: 44px;
	margin: 0;
	padding: 0;
	border: 0;
	border-radius: 9999px;
	background: transparent url("../pdp/zoom-icon.png") center / 13px 13px no-repeat;
	cursor: pointer;
	filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.4));
}

/* Pressed: a faint 28px disc behind the glyph says the zoom is on; the 44px hit area stays. */
.chunii-left-image .woocommerce-product-gallery .bc-pdp-gallery__zoom::before {
	content: "";
	position: absolute;
	top: 8px;
	left: 8px;
	z-index: -1;
	width: 28px;
	height: 28px;
	border-radius: 9999px;
	background-color: transparent;
	transition: background-color 120ms ease;
}

.chunii-left-image .woocommerce-product-gallery .bc-pdp-gallery__zoom[aria-pressed="true"]::before {
	background-color: rgba(31, 31, 31, 0.55);
}

/* style.css kills button:focus outlines site-wide with !important (audit A1). */
.chunii-left-image .woocommerce-product-gallery .bc-pdp-gallery__zoom:focus-visible {
	outline: 2px solid var(--pdp-c3) !important;
	outline-offset: 2px;
}

.chunii-left-image .woocommerce-product-gallery.bc-pdp-gallery--zooming .woocommerce-product-gallery__image {
	cursor: zoom-in;
}

/* ---------------------------------------------------------------------------
 * RETIRE — things the design has no equivalent for
 * ------------------------------------------------------------------------- */

/* The decorative ACF media the gallery replaces. Hidden, not deleted. */
.bc-pdp-legacy-media {
	display: none;
}

/*
 * The floating Food calculator button — pinned over the page on raw meals and
 * gifts only. The design puts this entry point in the panel, which now carries
 * it on all four categories.
 */
.chuni-beef-banner .float-box {
	display: none;
}

/*
 * The Yotpo widget that escapes into the hero.
 *
 * Every product renders a `.yotpo-reviews-main-widget` as a DIRECT CHILD of
 * section.chuni-beef-banner. On three categories it measures 0×0 and nobody
 * noticed; on combo it fills out at 1384×1477, inflating that hero to 3106px and
 * rendering the product's reviews TWICE — once in the hero, once in the
 * below-hero card.
 *
 * Direct-child selector on purpose: it hits only the escaped instance, leaving
 * the star rating inside form.cart and the real widget in the card alone.
 */
.chuni-beef-banner > .yotpo-widget-instance {
	display: none;
}

/* ---------------------------------------------------------------------------
 * REWIRE — product title
 *
 * The page had NO usable h1: `h1.product_title` was `display: none !important`
 * and the visible title was a `p.babtitle` at NorthwestRegular 30px. So the
 * product name — the one thing that should be the page heading — was a
 * paragraph, and assistive tech got an empty outline.
 *
 * !important is required on display: the rule hiding it has one, and the theme
 * flips the same element between none and inline-block in four further rules.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary h1.product_title,
.chuni-beef-banner .working-dog-butler .summary.entry-summary h1.product_title.entry-title {
	display: block !important;
	margin: 0 0 12px;
	padding: 0;
	color: var(--pdp-c3);
	font-family: var(--pdp-font-textured);
	font-size: var(--pdp-h2);
	font-weight: 400;
	line-height: var(--pdp-h2-lh);
	letter-spacing: 0;
	text-transform: none;
}

/*
 * The paragraph that stood in for the title. Hidden rather than removed from the
 * template: it is printed by the subscription-options template, and hiding it
 * here leaves that file to the purchase-options work.
 */
.chuni-beef-banner .summary p.babtitle {
	display: none;
}

/* ---------------------------------------------------------------------------
 * Body type
 *
 * `body` computes to `font-family: Inter, sans-serif` — the broken family — so
 * every piece of panel copy was rendering in the platform sans regardless of the
 * design. Pointing the panel at InterLocal is what makes any typography
 * comparison below this point meaningful.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner,
.chuni-beef-banner p,
.chuni-beef-banner span,
.chuni-beef-banner label,
.chuni-beef-banner li,
.chuni-beef-banner a,
.chuni-beef-banner button,
.chuni-beef-banner input {
	font-family: var(--pdp-font-body);
}

/*
 * Northwest for group headings, per the design.
 *
 * These were set in Cardo, which 404s — one of the inherited twentytwentyfour
 * families — so they rendered in a serif fallback that appears nowhere in the
 * design.
 */
.chuni-beef-banner h2,
.chuni-beef-banner h3,
.chuni-beef-banner h4,
.chuni-beef-banner h5,
.chuni-beef-banner h6,
.chuni-beef-banner .acc-head p {
	font-family: var(--pdp-font-heading);
	font-size: var(--pdp-h6);
	font-weight: 400;
	line-height: var(--pdp-h6-lh);
	color: var(--pdp-c3);
	text-transform: uppercase;
}

/* ---------------------------------------------------------------------------
 * RESTYLE — "In stock"
 *
 * The line already existed in the panel and was display:none, so the data was
 * present and unseen. !important because the rule hiding it arrives from the
 * duplicate footer stylesheets this file cannot outrank on order.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary p.stock.bc-pdp-stock {
	display: flex !important;
	align-items: center;
	gap: 8px;
	margin: 0 0 12px;
	padding: 0;
	color: #4ADE80;
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-links);
	font-weight: 600;
	line-height: 20px;
	text-transform: none;
}

/* ---------------------------------------------------------------------------
 * REUSE — Food Calculator entry point
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-calc {
	margin: 16px 0 0;
	color: var(--pdp-c5);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-links);
	line-height: var(--pdp-lh-links);
}

.chuni-beef-banner .summary .bc-pdp-calc__link {
	/*
	 * A button, not a link: it opens the calculator modal rather than navigating,
	 * so an <a href="#"> would misdescribe it to a screen reader. Styled as a link
	 * because that is what the design draws.
	 */
	display: inline;
	margin: 0;
	padding: 0;
	border: 0;
	background: none;
	color: var(--pdp-c3);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-links);
	font-weight: 600;
	line-height: var(--pdp-lh-links);
	text-align: left;
	text-decoration: underline;
	text-transform: none;
	cursor: pointer;
}

.chuni-beef-banner .summary .bc-pdp-calc__link:hover,
.chuni-beef-banner .summary .bc-pdp-calc__link:focus-visible {
	color: var(--pdp-c4);
}

/* ---------------------------------------------------------------------------
 * RESTYLE — action row: stepper + primary button
 *
 * The design draws one 668×70 row: stepper 119, primary button 461, wishlist 72.
 * Wishlist needs a new plugin and is out of scope, so this is two columns and the
 * button takes that space. When wishlist lands, the template becomes
 * `119px 1fr 72px` and nothing else moves.
 *
 * WHY A GRID: form.cart has ~16 children, mostly display:none scripts and
 * styles, and the stepper and button are NOT adjacent — a Yotpo rating widget
 * sits between them. So the form becomes a grid where every child spans full
 * width and only those two are placed in columns.
 *
 * ⚠ The theme already assigns flex `order` to these children — quantity 1,
 *   wcsatt-options-wrapper 2, button 3 — which is why an earlier attempt put the
 *   two in the right columns but different ROWS: the full-width options block sat
 *   between them. Grid honours `order`, so the whole sequence is stated below.
 * ------------------------------------------------------------------------- */
/*
 * ⚠ THE THIRD COLUMN IS THE WISHLIST BOX, and this rule has said so since the
 *   grid was written — "`119px 1fr 72px` and nothing else moves". It carried two
 *   columns because the control was parked (item 17, Mitz 2026-08-28). Unparked
 *   2026-09-09; the 72px column is all that was missing, and the CTA drops from
 *   541 to the design's 461 on its own: 668 - 119 - 8 - 72 - 8 = 461.
 */
.chuni-beef-banner .summary form.cart {
	display: grid;
	grid-template-columns: 119px 1fr 72px;
	column-gap: 8px;
	row-gap: 16px;
	align-items: center;
	width: 100%;
}

.chuni-beef-banner .summary form.cart > * {
	grid-column: 1 / -1;
	min-width: 0;
}

.chuni-beef-banner .summary form.cart > .yotpo-widget-instance { order: -2; }
.chuni-beef-banner .summary form.cart > .single-pro-acc { order: -1; }
.chuni-beef-banner .summary form.cart > .wcsatt-options-wrapper { order: 1; }

.chuni-beef-banner .summary form.cart > .quantity {
	order: 4;   /* was 2; the postcode gate now takes 2 and 3 */
	grid-column: 1;
}

.chuni-beef-banner .summary form.cart > button.single_add_to_cart_button {
	order: 5;
	grid-column: 2;
}

.chuni-beef-banner .summary form.cart > .bc-pdp-trust { order: 6; }

/* Stepper shell */
.chuni-beef-banner .summary form.cart .quantity {
	display: flex !important;
	align-items: center;
	box-sizing: border-box;
	width: 119px;
	height: 70px;
	padding: 0;
	border: 1px solid var(--pdp-c6);
	border-radius: 9999px;
	background-color: transparent;
	overflow: hidden;
}

/*
 * ⚠ The three controls are wrapped in `span.quantity-box`, and THAT is what
 *   carries display:none — not the inputs. Styling `.quantity input` directly
 *   gave them a computed width of 34px and visibility:visible while
 *   getBoundingClientRect stayed 0×0, because computed styles resolve normally
 *   inside a display:none subtree. The stepper rendered as an empty pill. A zero
 *   rect inside a non-zero parent is the tell.
 */
.chuni-beef-banner .summary form.cart .quantity .quantity-box {
	display: flex !important;
	align-items: center;
	justify-content: space-between;
	box-sizing: border-box;
	width: 100%;
	min-height: 68px;
}

.chuni-beef-banner .summary form.cart .quantity input.qty_button {
	flex: 0 0 34px;
	width: 34px;
	/*
	 * Explicit height. `height: 100%` resolved to 20px — a percentage height
	 * against a flex container is not the definite parent height it looks like —
	 * and align-self: stretch then only reached 40px, because stretch applies only
	 * when the cross size is auto and the theme gives these inputs a definite
	 * height. 68 = the 70px pill less its borders, which also clears the 44px
	 * touch minimum.
	 */
	height: 68px !important;
	padding: 0;
	border: 0;
	background: transparent;
	color: var(--pdp-c3);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-para);
	line-height: 1;
	cursor: pointer;
}

/*
 * Hover — Mitz, 2026-09-12: "update hover background color to #fff of wishlist
 * + and - button and the number qty". Then: "when hovered only the background
 * color updated, the color stays the same" — so the ground goes white and the
 * glyph and number keep their resting tan. All three cells of the pill, so the
 * pointer lights whichever part it is over. ⚠ Tan on white measures ~2.2:1;
 * applied as instructed, the same ruling as the Check button's white hover.
 */
.chuni-beef-banner .summary form.cart .quantity input.qty_button:hover,
.chuni-beef-banner .summary form.cart .quantity input.qty:hover {
	background-color: var(--pdp-c11);
}

.chuni-beef-banner .summary form.cart .quantity input.qty {
	display: block !important;
	flex: 1 1 auto;
	width: auto !important;
	min-width: 0;
	height: 68px !important;
	padding: 0;
	border: 0;
	background: transparent;
	box-shadow: none;
	color: var(--pdp-c3);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-body);
	font-weight: 500;
	text-align: center;
	-moz-appearance: textfield;
}

/*
 * Primary button.
 *
 * The design's pairing is #1f1f1f on #c9a98a. Adopting it is an accessibility
 * fix, not a preference: the build's white on #a4866c measures 3.38:1 and fails
 * WCAG AA, while the design's measures 7.6:1.
 *
 * The competing rule is `.working-dog-butler form.cart button.single_add_to_cart_button`
 * at (0,3,2) — it outranked a shorter selector, which is why an earlier attempt
 * saw min-height apply (the theme sets none) while width, background, colour,
 * radius and font-size all lost. Hence the matching selector AND !important on
 * exactly those properties, and nothing else.
 */
.chuni-beef-banner .working-dog-butler form.cart button.single_add_to_cart_button,
.chuni-beef-banner .working-dog-butler form.cart .single_add_to_cart_button.button {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	box-sizing: border-box;
	width: 100% !important;
	max-width: none !important;
	min-height: 70px;
	padding: 12px 24px;
	background-color: var(--pdp-c3) !important;
	border: 1px solid var(--pdp-c3);
	/*
	 * ⚠ SQUARE. This was 9999px, and it is the rule that kept winning: at (0,5,1)
	 *   it outranks anything written against `.summary`, so a later override with
	 *   !important still lost. The radius has to be corrected HERE.
	 *
	 *   The design system does define `Atom Component/Buttons/Radius: 9999`, which
	 *   is where the pill almost certainly came from — but that token is what the
	 *   FREQUENCY PILLS use. Rendering `Frame 1261154912` shows all three controls
	 *   in this row with square corners, and the export settles it: the tan block is
	 *   a clean 461px run on every row from y=916 to y=984, which a pill cannot do.
	 */
	border-radius: 0 !important;
	color: var(--pdp-c7) !important;
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-para) !important;
	font-weight: 600;
	line-height: 1;
	text-align: center;
	text-transform: none;
	cursor: pointer;
}

/*
 * ⚠ WAS c2 WITH WHITE TEXT, which measures 4.37:1 — under AA for 18px semibold.
 *   18px at weight 600 is NOT "large text" by WCAG (that needs 18.66px bold), so
 *   4.5 is the threshold it has to clear, and it did not.
 *
 *   c1 keeping the resting dark text measures 5.24:1 and reads as the same button
 *   pressed rather than a different colour. See the hover system note below.
 *
 * ⚠ SUPERSEDED 2026-09-12 — Mitz: "the Add to cart button hover background color
 *   and text color is not correct." Two hover intents had been written for this
 *   one button: this rule (c1, dark label, (0,5,2)) and the general tan-control
 *   block further down (`.on-pincode-required:hover` — c6 with white, (0,4,0),
 *   the same hover the sticky bar and the "Check & Add to Cart" trigger wear).
 *   This one won on specificity for background and colour while the general
 *   block's flagged border-color won for the border — so the button hovered to
 *   a c1 fill inside a c6 outline with a dark label, a state no rule describes.
 *   Measured: bg rgb(164,134,108), border rgb(73,66,63), color rgb(31,31,31).
 *   Aligned to the general block: c6 fill, c6 line, white label (8.6:1).
 */
.chuni-beef-banner .working-dog-butler form.cart button.single_add_to_cart_button:hover,
.chuni-beef-banner .working-dog-butler form.cart button.single_add_to_cart_button:focus-visible {
	background-color: var(--pdp-c6) !important;
	border-color: var(--pdp-c6) !important;
	color: var(--pdp-c11) !important;
}

/* ---------------------------------------------------------------------------
 * REUSE — trust rows and payment marks
 *
 * Two of the design's three rows. The third — "FREE on eligible orders over
 * $150" — is not printed: no free-shipping method on this store has an
 * order-value threshold, they all require a coupon, so the claim would be false.
 * See the note in inc/pdp-redesign.php.
 * ------------------------------------------------------------------------- */
/*
 * ⚠ NO RULE HERE. The design draws the shipping row and the delivery-problem row
 *   as two filled boxes with a plain gap between them — no hairline. This had a
 *   `border-top`, which put a full-width line between them.
 */
.chuni-beef-banner .summary .bc-pdp-trust {
	margin: 0;
}

.chuni-beef-banner .summary .bc-pdp-trust__row {
	margin: 0 0 8px;
	color: var(--pdp-c5);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-links);
	font-weight: 400;
	line-height: var(--pdp-lh-links);
}

.chuni-beef-banner .summary .bc-pdp-trust__row a {
	color: inherit;
	text-decoration: underline;
}

.chuni-beef-banner .summary .bc-pdp-trust__marks {
	display: inline-flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 4px;
	margin-top: 4px;
}

.chuni-beef-banner .summary .bc-pdp-trust__marks img {
	display: block;
	width: 35px;
	height: 24px;
	max-width: none;
	margin: 0;
}

/* ---------------------------------------------------------------------------
 * REWIRE — purchase options
 *
 * Markup comes from woocommerce/single-product/product-subscription-options.php,
 * rebuilt so the convert_to_sub radios ARE the control. Read the note at the top
 * of that file for why there used to be two groups and what happened to the
 * other one.
 *
 * Selected state is pure CSS: :has() on the container for the rows, an
 * adjacent-sibling match for each pill. No JavaScript, so nothing to re-run on an
 * AJAX price refresh.
 *
 * ⚠ :has() needs Chrome 105+, Safari 15.4+, Firefox 121+. Where it is missing the
 *   rows show no selected outline and the pills stay visible — degraded, still
 *   fully usable, nothing hidden or unreachable.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-options {
	display: block !important;   /* the template wrapper ships an inline display:none */
	width: 100%;
	margin: 0;
}

/*
 * ⚠ THE NOTE THAT STOOD HERE WAS WRONG, and Mitz's 2026-09-02 change corrects it.
 *
 *   It claimed "PURCHASE OPTION" is "a small tan uppercase label, the same Gold
 *   Light/100 as the section headings". Re-read off `PDP-with-sticky.png` at 2×:
 *   the label is WHITE, in the condensed textured face — the tan treatment belongs
 *   to "PRODUCT DETAILS" and the section headings, not to this one.
 *
 *   So c4 and `--pdp-font-textured` are the design, and the tan this had was the
 *   assumption the old note accused its predecessor of.
 */
.chuni-beef-banner .summary .bc-pdp-options__legend {
	margin: 0 0 12px;
	color: var(--pdp-c4);
	font-family: var(--pdp-font-textured);
	font-size: var(--pdp-links);
	font-weight: 400;
	letter-spacing: 0.6px;
	line-height: 26px;
	text-transform: uppercase;
}

.chuni-beef-banner .summary .bc-pdp-options__rows {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 0;
	list-style: none;
}

.chuni-beef-banner .summary .bc-pdp-option {
	/*
	 * !important on display. The rows live inside ul.wcsatt-options-product —
	 * kept so existing selectors still find the radios — and the theme hides any
	 * li in that list which is not .one-time-option or .subscription-option. The
	 * Subscribe row carries neither, so it rendered at 0x0 with a perfectly
	 * healthy computed display:flex on its label.
	 */
	display: block !important;
	margin: 0;
	padding: 0;
	list-style: none;
}

/*
 * Inputs stay in the DOM and focusable. NOT display:none — that would take them
 * out of the tab order and off the accessibility tree, which for the only price
 * control on the page is not acceptable. Clipped instead.
 */
.chuni-beef-banner .summary .bc-pdp-option__radio {
	position: absolute;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	overflow: hidden;
	clip: rect(0 0 0 0);
	clip-path: inset(50%);
	white-space: nowrap;
	border: 0;
}

/*
 * ⚠ `position: relative` IS LOAD-BEARING and was missing, despite a comment further
 *   down this file asserting it was here.
 *
 *   The radio ring is an absolutely positioned ::before at `top: 50%`, so it
 *   resolves against the nearest POSITIONED ancestor. Without this, only the
 *   One Time row looked right — and only by accident, because the plugin's own
 *   `.one-time-option` class happens to be positioned, so that ring resolved
 *   against its 70px row and landed at 35.
 *
 *   The Subscribe row carries no plugin class, so its ring resolved against
 *   `.bc-pdp-options` instead — 249 tall — putting it at top: 124px. On screen
 *   that is a stray ring sitting at the BOTTOM of the One Time box, with the
 *   Subscribe row showing no radio at all. Two symptoms, one cause, and neither
 *   looked like a positioning bug.
 */
.chuni-beef-banner .summary .bc-pdp-option__label {
	position: relative;
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 16px;
	box-sizing: border-box;
	width: 100%;
	margin: 0;
	padding: 16px 20px;
	/*
	 * ⚠ c8 AND SQUARE, both sampled from the export rather than chosen.
	 *   Scanning across seven x positions on each border line:
	 *
	 *       y=452/453  One Time box, top      #322B27
	 *       y=524      One Time box, bottom   #322B27
	 *       y=534/535  Subscribe box, top     #322B27
	 *       y=598      divider to the pills   #49423F
	 *       y=706      frequency box, bottom  #322B27
	 *       x=778/779  left edge, all three   #322B27
	 *
	 *   And the corners are sharp: the frequency box's bottom-left in the export is
	 *   a 90° angle, as are the postcode input, the Check button, the quantity
	 *   stepper and the wishlist button beside it. The 8px this carried was ours.
	 */
	border: 1px solid var(--pdp-c8);
	border-radius: 0;
	background-color: transparent;
	color: var(--pdp-c4);
	cursor: pointer;
}

/* Focus has to be visible on the label, since the input itself is clipped. */
.chuni-beef-banner .summary .bc-pdp-option__radio:focus-visible + .bc-pdp-option__label {
	outline: 2px solid var(--pdp-c3);
	outline-offset: 2px;
}

.chuni-beef-banner .summary .bc-pdp-option__head {
	display: flex;
	flex-direction: column;
	gap: 4px;
	min-width: 0;
}

.chuni-beef-banner .summary .bc-pdp-option__title {
	display: flex;
	align-items: center;
	gap: 8px;
	color: var(--pdp-c4);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-body);
	font-weight: 600;
	line-height: var(--pdp-lh-6);
}

.chuni-beef-banner .summary .bc-pdp-option__badge {
	display: inline-block;
	padding: 2px 8px;
	border-radius: 9999px;
	background-color: var(--pdp-ok-200);
	color: var(--pdp-ok-950);   /* 12.6:1 on that fill */
	font-size: 12px;
	font-weight: 600;
	line-height: 18px;
	text-transform: none;
	white-space: nowrap;
}

.chuni-beef-banner .summary .bc-pdp-option__note {
	color: var(--pdp-c5);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-links);
	font-weight: 400;
	line-height: 20px;
}

.chuni-beef-banner .summary .bc-pdp-option__figures {
	display: flex;
	flex-direction: column;
	align-items: flex-end;
	gap: 2px;
	flex-shrink: 0;
	text-align: right;
}

/*
 * ⚠ `--pdp-body`, not `--pdp-para` — 16px, not 18. The design's price nodes are
 *   `Size/Body` on a 24px line (One Time `;33265:105272`, Subscribe
 *   `;33265:105305`), both Inter Semi Bold. The 18 made the price the largest
 *   thing in the row where the design has it one step BELOW the 16px label's
 *   26px line. Found while auditing the panel and left alone as out of scope;
 *   Mitz, 2026-09-09: "For price always follow the design."
 */
.chuni-beef-banner .summary .bc-pdp-option__price {
	color: var(--pdp-c4);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-body);
	font-weight: 600;
	line-height: 24px;
	white-space: nowrap;
}

/*
 * The per-kg line. Read off the design's own text nodes 2026-09-09 —
 * `Subscribe` 33265:105331, price column `Frame 1261154963`:
 *
 *     One Time   ;33265:105273   12px / 14px / Inter Medium / right / #49423f
 *     Subscribe  ;33265:105306   12px / 14px / Inter Medium / right / #a4866c
 *
 * ⚠ THE DESIGN USES TWO DIFFERENT COLOURS, and this had been built as one.
 *   The Subscribe row's per-kg is the brand tan — the design accents the
 *   better-value row and recesses the other. Item 20 recorded only the One
 *   Time colour, so the tan was never noticed.
 *
 * ⚠ `font-weight: 500`, not 400. The design is Inter **Medium** on both rows;
 *   this was Regular.
 *
 * ⚠ THE TWO COLOURS ARE THE TWO STATES, NOT THE TWO ROWS — Mitz, 2026-09-09:
 *   "when Purchase Option not selected One Time Purchase or Subscribe & Save
 *   and its Price the color should be #F5F2EE and kg color is #49423F, when
 *   selected their color turns #C9A98A."
 *
 *   That is why the frame reads the way it does: it mocks Subscribe SELECTED
 *   (item 340), so `#49423f` was the UNSELECTED per-kg and the tan was the
 *   SELECTED one. An earlier pass on 2026-09-09 read them as a per-row
 *   distinction and set the Subscribe row's unit tan unconditionally. Same two
 *   values, wrong axis — it would have shown a tan per-kg on a row nobody had
 *   chosen. The state rules live further down this file.
 *
 * ⚠ `#49423f` UNSELECTED IS ~1.5:1 ON THIS ROW, and it is applied on
 *   instruction after being raised. It is the M8 defect (item 20) and I raised
 *   it again; this is the reply, and it is a defensible one — the unselected
 *   per-kg is deliberately recessive and the figure a shopper is acting on is
 *   on the row they have chosen, in tan. Recorded so nobody "fixes" it back.
 */
.chuni-beef-banner .summary .bc-pdp-option__unit {
	color: var(--pdp-c6);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-links);
	font-weight: 500;
	line-height: 20px;
	white-space: nowrap;
}

/* Selected: the one-time row when value 0 is checked. */
/*
 * ⚠ NO FILL. Sampling the export inside both boxes gives #1f1f1f either way. The
 *   c8 fill that used to be here lifted the row to a visibly warmer brown, which
 *   is part of what read as the panel's background being wrong. That still holds.
 *
 * ⚠ BUT THE REST OF THAT NOTE WAS WRONG: it said "the selected row is signalled by
 *   its BORDER going tan". It is not. In the export the SELECTED Subscribe box and
 *   the unselected One Time box carry the identical #322B27 border — checked at
 *   seven x positions on each. Selection is signalled by the radio filling and the
 *   label and price going tan, and by nothing else.
 *
 *   So the rule that lived here, turning the chosen row's border tan, is gone.
 */

/*
 * Selected: the Subscribe row whenever ANY scheme is checked. That is the whole
 * reason the row is a label rather than a control — it represents the group, not
 * one value.
 *
 * ⚠ Its border does NOT change with selection — see the note above. The `:has()`
 *   test still drives the row's tan label and price, and the frequency box below
 *   it; only the border-colour change has gone.
 */

/* Frequency pills — hidden until a subscription is chosen, as the design shows. */
.chuni-beef-banner .summary .bc-pdp-freq {
	display: none;
	margin: 0 0 24px;
}

.chuni-beef-banner .summary .bc-pdp-options:has(.bc-pdp-freq__pill .bc-pdp-option__radio:checked) .bc-pdp-freq {
	display: block;
}

.chuni-beef-banner .summary .bc-pdp-freq__legend {
	margin: 0 0 12px;
	color: var(--pdp-c4);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-body);
	font-weight: 600;
	line-height: var(--pdp-lh-6);
}

.chuni-beef-banner .summary .bc-pdp-freq__pills {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	margin: 0 0 12px;
	padding: 0;
	list-style: none;
}

.chuni-beef-banner .summary .bc-pdp-freq__pill {
	display: block !important;   /* same theme rule as the rows above */
	margin: 0;
	padding: 0;
	list-style: none;
}

.chuni-beef-banner .summary .bc-pdp-freq__pill-label {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	/*
	 * 30, measured: the export's freq area runs y=598 to y=706 and budgets 108 for
	 * a legend (24), one row of pills and the reassurance line (20). The 44 here was
	 * a touch target picked before that area had been measured, and it made the
	 * pills read as chunky buttons rather than the design's quiet chips.
	 *
	 * Widths follow: "Every 2 weeks" is 124 in the export, which is what 15px Inter
	 * plus this padding produces.
	 */
	min-height: 30px;
	margin: 0;
	padding: 4px 14px;
	/* (!) --pdp-rule, sampled: an unselected pill's border in the export is #5F5347
	 * at y=664, checked on two pills - one step lighter than the c6 this carried.
	 * The pill keeps its 9999px radius: that IS the design, and the square corners
	 * elsewhere in this block do not apply here. */
	border: 1px solid var(--pdp-rule);
	border-radius: 9999px;
	color: var(--pdp-c4);
	font-family: var(--pdp-font-body);
	font-size: 15px;
	font-weight: 500;
	line-height: 20px;
	white-space: nowrap;
	cursor: pointer;
}

.chuni-beef-banner .summary .bc-pdp-freq__pill .bc-pdp-option__radio:checked + .bc-pdp-freq__pill-label {
	border-color: var(--pdp-c3);
	background-color: var(--pdp-c3);
	color: var(--pdp-c7);
	font-weight: 600;
}

.chuni-beef-banner .summary .bc-pdp-freq__pill .bc-pdp-option__radio:focus-visible + .bc-pdp-freq__pill-label {
	outline: 2px solid var(--pdp-c3);
	outline-offset: 2px;
}

.chuni-beef-banner .summary .bc-pdp-freq__note {
	position: relative;
	margin: 0;
	padding-left: 20px;
	color: var(--pdp-c5);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-links);
	font-weight: 400;
	line-height: 20px;
}

/*
 * Mitz's artwork, 2026-09-09 — a 12×12 clock to the left of the reassurance
 * line. Same construction as the benefit ticks above: an absolute `::before`
 * rather than a flex child, so a wrap keeps the icon on the FIRST line beside
 * the opening words instead of floating it against the centre of a two-line
 * block. `padding-left: 20px` is the file's 12 plus the 8px gap the other two
 * icon rows use, and `top: 4px` centres 12 on this 20px line.
 */
.chuni-beef-banner .summary .bc-pdp-freq__note::before {
	content: "";
	position: absolute;
	top: 4px;
	left: 0;
	width: 12px;
	height: 12px;
	background-image: url("../pdp/clock-icon.png");
	background-repeat: no-repeat;
	background-position: center;
	background-size: 12px 12px;
}

/* ---------------------------------------------------------------------------
 * REWIRE — PRODUCT DETAILS accordion in the panel
 *
 * The design puts this group inside the 668 panel: a Northwest 20px heading in
 * the gold, then rows separated by 1px dividers, each a full-width button with
 * its label at 16px Inter Semi Bold and a chevron on the right.
 *
 * The build had the same content as 1100px Bootstrap cards below the hero; those
 * are retired per product by the inline rule PHP emits, since the fields are
 * populated unevenly.
 *
 * ⚠ Panels start OPEN and are closed by the script adding
 *   .bc-pdp-details--ready. That ordering is the point: if pdp-accordion.js never
 *   loads, every row stays readable instead of being sealed behind a dead
 *   control.
 * ------------------------------------------------------------------------- */
/*
 * ⚠ THE RULE IS UNDER THE HEADING, NOT ABOVE IT. The design draws
 *   "PRODUCT DETAILS" and then a hairline directly beneath it, above the first
 *   accordion row. This carried a `border-top`, which drew the line above the
 *   heading instead and left nothing under it. Moved to `__heading` — see the end
 *   of this file.
 */
.chuni-beef-banner .summary .bc-pdp-details {
	margin: 24px 0 0;
}

.chuni-beef-banner .summary .bc-pdp-details__heading {
	margin: 0 0 8px;
	color: var(--pdp-c3);
	font-family: var(--pdp-font-heading);
	font-size: var(--pdp-h6);
	font-weight: 400;
	line-height: var(--pdp-h6-lh);
	text-transform: uppercase;
}

.chuni-beef-banner .summary .bc-pdp-details__list {
	margin: 0;
	padding: 0;
	list-style: none;
}

.chuni-beef-banner .summary .bc-pdp-details__row {
	margin: 0;
	padding: 0;
	list-style: none;
	border-bottom: 1px solid var(--pdp-c6);
}

.chuni-beef-banner .summary .bc-pdp-details__row-heading {
	/*
	 * A heading wrapping the button, so the rows appear in the document outline.
	 * Every visual property is reset here and set on the button instead — the
	 * theme styles h4 globally.
	 */
	margin: 0;
	padding: 0;
	font: inherit;
	color: inherit;
	text-transform: none;
}

.chuni-beef-banner .summary .bc-pdp-details__toggle {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	box-sizing: border-box;
	width: 100%;
	margin: 0;
	padding: 16px 6px;   /* the design's 6px-padded chevron button */
	border: 0;
	border-radius: 0;
	background: transparent;
	color: var(--pdp-c4);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-body);
	font-weight: 600;
	line-height: var(--pdp-lh-6);
	text-align: left;
	text-transform: none;
	cursor: pointer;
}

.chuni-beef-banner .summary .bc-pdp-details__toggle:hover {
	color: var(--pdp-c3);
}

.chuni-beef-banner .summary .bc-pdp-details__toggle:focus-visible {
	outline: 2px solid var(--pdp-c3);
	outline-offset: -2px;
}

/* Chevron from a border, so there is no icon font or SVG to load. */
/*
 * The design draws each row's toggle as a 28px TAN DISC with a white chevron
 * inside it, flush to the panel's right edge — not the bare 10px caret this was.
 * Measured off the export: disc 28, fill #a4866c (c1), chevron white, right edge
 * at x=1448, which is the panel's own right edge.
 *
 * The caret moves to ::after so the disc itself does not rotate — rotating a
 * circle is invisible, and it kept the open/closed transform on the wrong box.
 *
 * ⚠ The design's disc carries the brand's grain texture. That is an image asset,
 *   not a CSS effect; at 28px the grain is barely legible, so this is a flat tan
 *   fill. Recorded as a fidelity nit rather than approximated with feTurbulence.
 */
.chuni-beef-banner .summary .bc-pdp-details__chevron {
	position: relative;
	flex-shrink: 0;
	box-sizing: border-box;
	width: 28px;
	height: 28px;
	border: 0;
	border-radius: 50%;
	background-color: var(--pdp-c1);
	transform: none;
}

.chuni-beef-banner .summary .bc-pdp-details__chevron::after {
	content: "";
	position: absolute;
	top: 9px;
	left: 50%;
	width: 8px;
	height: 8px;
	border: solid var(--pdp-c11);
	border-width: 0 2px 2px 0;
	transform: translateX(-50%) rotate(45deg);
	transition: transform 150ms ease, top 150ms ease;
}

/* Open: the caret points up, and drops 3px so it stays optically centred. */
.chuni-beef-banner .summary .bc-pdp-details__row.bc-pdp-details--open .bc-pdp-details__chevron {
	transform: none;
}

.chuni-beef-banner .summary .bc-pdp-details__row.bc-pdp-details--open .bc-pdp-details__chevron::after {
	top: 12px;
	transform: translateX(-50%) rotate(-135deg);
}

.chuni-beef-banner .summary .bc-pdp-details__panel {
	padding: 0 6px 16px;
	color: var(--pdp-c4);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-links);
	font-weight: 400;
	line-height: var(--pdp-lh-links);
}

/* Closed only once the script says things can close. */
.chuni-beef-banner .summary .bc-pdp-details--ready .bc-pdp-details__row:not(.bc-pdp-details--open) .bc-pdp-details__panel {
	display: none;
}

.chuni-beef-banner .summary .bc-pdp-details__panel p:last-child {
	margin-bottom: 0;
}

/* The design's QUANTITIES / THIS BOX INCLUDES pair, Northwest 14px in the gold. */
.chuni-beef-banner .summary .bc-pdp-details__pair {
	margin-top: 16px;
}

.chuni-beef-banner .summary .bc-pdp-details__pair-label,
.chuni-beef-banner .summary .bc-pdp-details__sub {
	margin: 0 0 4px;
	color: var(--pdp-c3);
	font-family: var(--pdp-font-heading);
	font-size: var(--pdp-links);
	font-weight: 400;
	line-height: 20px;
	text-transform: uppercase;
}

/* ── The ingredient breakdown, folded in from the retired light bands ────────
 *
 * Mitz, 2026-09-09: the four `#f5f5f5` sections below the panel move into this
 * dropdown, "make sure the image was added/transfer as well". The artwork in
 * question is this block's — three or four ingredient icons with a percentage
 * and a label, from the `Ingredient` repeater on raw meals and gifts. It is the
 * only imagery in any of the four bands.
 *
 * The design has NO node for this, so the geometry is chosen rather than
 * measured, and chosen to be quiet: it is supporting detail inside a collapsed
 * row, not a feature. A row per ingredient, icon left, keeps every label
 * readable at 668 — the band drew them as a horizontal strip of five cards that
 * would give each label about 150px here.
 *
 * ⚠ `background: var(--pdp-c11)` on the icon is deliberate and not a mistake.
 *   These PNGs were drawn for the light band: they are dark line art on
 *   transparency, and on the panel's `#1f1f1f` they are all but invisible. The
 *   white disc is what makes the client's existing artwork usable on a dark
 *   panel without re-cutting it. Verified against `TBD_Turkey.png`,
 *   `Beef-icon.png` and `TBD_Vegetables.png`.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-details__ingredients {
	display: flex;
	flex-direction: column;
	gap: 12px;
	margin: 12px 0 0 !important;
	padding: 0 !important;
	list-style: none !important;
}

.chuni-beef-banner .summary .bc-pdp-details__ingredient {
	display: grid;
	grid-template-columns: 64px auto 1fr;
	align-items: center;
	gap: 0 12px;
	margin: 0 !important;
	padding: 0 !important;
	list-style: none !important;
}

.chuni-beef-banner .summary .bc-pdp-details__ingredient-icon {
	grid-column: 1;
	width: 64px;
	height: 64px;
	padding: 4px;
	border-radius: 9999px;
	background-color: var(--pdp-c11);
	object-fit: contain;
}

/* No icon: the text takes the whole width rather than leaving a 64px hole —
 * common, since the repeater is filled without images on several products. */
.chuni-beef-banner .summary .bc-pdp-details__ingredient:not(:has(.bc-pdp-details__ingredient-icon)) {
	grid-template-columns: auto 1fr;
}

.chuni-beef-banner .summary .bc-pdp-details__ingredient-pct {
	color: var(--pdp-c3);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-body);
	font-weight: 600;
	line-height: 24px;
	white-space: nowrap;
}

.chuni-beef-banner .summary .bc-pdp-details__ingredient-label {
	color: var(--pdp-c4);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-links);
	font-weight: 400;
	line-height: 20px;
}

/* ---------------------------------------------------------------------------
 * REUSE + RESTYLE — "You may also like"
 *
 * The design's section is a heading, four 334-wide cards and a page indicator.
 *
 * An earlier pass restyled the old carousel's heading and dots and left a note
 * saying the in-card subscription UI was "a separate, larger job". It turned out
 * not to be a job at all: the card the category page renders is entirely
 * hook-driven, so woocommerce/pdp/product-cards.php gets it — purchase options,
 * prices, Yotpo stars and a working postcode-gated cart form — by rendering a
 * standard WooCommerce loop. The old carousel's hand-written card had none of
 * that.
 *
 * What is left for CSS is therefore mostly SUBTRACTION. A loop card here renders
 * the SINGLE-product add-to-cart template, so it arrives carrying panel-scale
 * furniture the design's card does not have:
 *
 *   .choose-fequancy      a SECOND, non-functional subscribe control, printed by
 *                         inc/subscribe-and-save.php alongside the real one
 *   .bc-pdp-freq          the frequency pills; the design's card has no picker
 *   .bc-pdp-options__legend  "Purchase Option"; a panel label, not a card one
 *   .quantity             a stepper; the design's card has no quantity control
 *   .price                WooCommerce's loop price. Handled separately further
 *                         down, because it is redundant only where the two
 *                         priced rows exist to replace it — gifts have no
 *                         subscription schemes and would be left with no price
 *   .stock                "25 in stock"; inventory detail the design keeps off
 *                         cards, as it does off the panel
 *
 * None of it is unhooked in PHP, deliberately: every one of those is shared with
 * the category page, which still needs them.
 *
 * ⚠ Desktop only. The breakout and the four-up grid are inside
 *   `min-width: 1000px`, which is also where footer.php:238 switches owl to four
 *   items. Tablet and mobile are not built yet and must not be half-changed.
 * ------------------------------------------------------------------------- */

/*
 * The templates put this section inside a Bootstrap `.container`, which caps at
 * 1140 — the reason the old cards measured 263 wide against the design's 334.
 * Negative inline margins widen the section to the page grid. `100%` here is the
 * container's content box, so no viewport-unit arithmetic is involved and the
 * scrollbar cannot cause overflow; the `100vw` term only clamps narrow windows.
 */
@media (min-width: 1000px) {
	.bc-pdp-cards-section {
		margin-inline: calc((100% - min(var(--pdp-content), calc(100vw - 128px))) / 2);
	}
}

/* `h2` beats the theme's `.relatd-last-prod` on specificity, which matters:
 * this stylesheet is document-order EARLIER than the footer's duplicate copies
 * of style.css and loses every tie. See note 2 in inc/pdp-redesign.php. */
/*
 * MEASURED AGAINST THE DESIGN 2026-08-27.
 *
 * The Figma section heading is a text box 1384×**48** — the same height as
 * "WHY CHOOSE THE BUTCHER'S DOG?" and "RECENTLY VIEWED ITEMS" elsewhere on the
 * page, and the same as the panel's product title. An earlier pass set this to
 * 20px because the design names the layer "Heading 6"; the box height says
 * otherwise, and a 20px H6 would occupy 24, not 48.
 *
 * ⚠ FAMILY UNCONFIRMED. NorthwestRegular is used here, not Textured. The panel's
 *   product title was confirmed as H2/Textured; whether section headings share
 *   that treatment is not readable from the metadata, and Textured is a separate
 *   family rather than a style, so it cannot be inferred. Flagged rather than
 *   guessed — one line changes it if the design says Textured.
 *
 * Letter-spacing dropped: at 48px the design's box is 1384 wide with no tracking
 * implied, and 1.4px was carried over from the theme's 12px `.relatd-last-prod`.
 */
h2.bc-pdp-cards__heading {
	max-width: none;
	margin: 0 0 12px;
	padding: 0;
	color: var(--pdp-c3);
	font-family: var(--pdp-font-heading);
	font-size: var(--pdp-h2);
	font-weight: 400;
	letter-spacing: normal;
	line-height: var(--pdp-h2-lh);
	text-transform: uppercase;
}

/*
 * The design's supporting line, which the first pass omitted outright even
 * though its own comment listed it. 1384×24 at 12px below the heading, then 64px
 * before the cards.
 */
.bc-pdp-cards__sub {
	margin: 0 0 64px;
	padding: 0;
	color: var(--pdp-c5);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-body);
	font-weight: 400;
	line-height: var(--pdp-lh-6);
}

/* `.featured-meals` carries `padding: 0 15px` from style.css. */
.bc-pdp-cards-section .bc-pdp-cards {
	padding: 0;
}

/* ── The slide and the list wrapper ──────────────────────────────────────── */

/*
 * One `<ul class="products">` per slide — see the note in
 * woocommerce/pdp/product-cards.php for why the `<li>` cannot be a direct child
 * of the owl track. The wrapper exists only to make the markup legal, so it is
 * stripped of every list and grid style the theme and WooCommerce give it.
 */
.bc-pdp-cards ul.products {
	display: block !important;
	margin: 0 !important;
	padding: 0 !important;
	list-style: none !important;
}

.bc-pdp-cards ul.products::before,
.bc-pdp-cards ul.products::after {
	display: none !important;
}

.bc-pdp-cards ul.products li.product {
	display: flex !important;
	flex-direction: column;
	box-sizing: border-box;
	width: 100% !important;
	margin: 0 !important;
	padding: 0 0 12px !important;
	float: none !important;
	clear: none !important;
	overflow: hidden;
	/*
	 * ⚠ SQUARE, AND NO BORDER — read off the design at 10× rather than judged from
	 *   a downscaled export. The card's top-left corner is a sharp 90°, and the
	 *   photograph meets the page ground directly with no lighter 1px line before
	 *   it. An 8px radius would have shown as a 64px curve at that zoom, and a c6
	 *   border as a visible strip; neither is there.
	 *
	 *   The card is defined by its FILL (c8 against the page's c7), not by an
	 *   outline. Mitz, 2026-09-01, asked for the card borders to be fixed.
	 */
	border: 0;
	border-radius: 0;
	background-color: var(--pdp-c8);
	text-align: left;
}

.bc-pdp-cards ul.products li.product::before,
.bc-pdp-cards ul.products li.product::after {
	display: none !important;
}

/*
 * DOM order inside the card is set by the loop hooks, and it very nearly matches
 * the design already: the `<a>` (image, title, WooCommerce rating and price)
 * then the blurb, the Yotpo stars, and the cart form. Only the fallback blurb —
 * which is emitted at priority 6, after the stars — is out of place, so `order`
 * pulls it up beside the blurb it stands in for. Both never render together.
 */
.bc-pdp-cards li.product > a {
	order: 1;
	display: block;
	text-decoration: none;
}

/*
 * RATING BEFORE BLURB — the design's order, which the first pass had backwards.
 * In the component the title sits at y=0, the rating row at y=24 and the blurb at
 * y=52. The DOM delivers blurb first (priority 5) and Yotpo second, so `order`
 * swaps them.
 */
.bc-pdp-cards li.product .for_yotpo_in_sub {
	order: 2;
}

.bc-pdp-cards li.product .sub_and_save_frame,
.bc-pdp-cards li.product .bc-pdp-card__blurb {
	order: 3;
}

.bc-pdp-cards li.product form.cart {
	order: 4;
	margin-top: auto;   /* buttons align across cards of unequal text length */
}

/* ── Card image ──────────────────────────────────────────────────────────── */

/*
 * 1:1 at the card's own width. The category card's image is already square, so
 * no re-crop is needed here — unlike the PDP hero, which still needs 1:1 media.
 */
.bc-pdp-cards li.product > a img,
.bc-pdp-cards li.product > a .attachment-woocommerce_thumbnail {
	display: block;
	width: 100% !important;
	height: auto !important;
	/*
	 * ⚠ 12, AND IT HAS TO BE SET HERE. An earlier pass set `margin: 0 0 12px`
	 *   on `.product-thum` and the measured gap stayed 16 — this rule's
	 *   `!important` margin is on the IMG, and since `.product-thum` has no
	 *   padding or border the img's bottom margin collapses through it and the
	 *   larger of the two wins. The design opens the text block at 340 under a
	 *   328 image, so 12 is the number and both declarations now say it.
	 */
	margin: 0 0 12px !important;
	aspect-ratio: 1 / 1;
	object-fit: cover;
	border-radius: 0;
}

/* ── Card title ──────────────────────────────────────────────────────────── */
.bc-pdp-cards li.product .woocommerce-loop-product__title {
	margin: 0 0 4px !important;
	padding: 0 12px !important;
	color: var(--pdp-c4);
	font-family: var(--pdp-font-heading);
	font-size: var(--pdp-h6);
	font-weight: 400;
	line-height: var(--pdp-h6-lh);
	text-transform: none;
}

/* ── Card blurb ──────────────────────────────────────────────────────────── */

/*
 * Two sources, never both: `.sub_and_save_frame > p` is the ACF `excerpt_text`
 * printed by inc/subscribe-and-save.php, and `.bc-pdp-card__blurb` is the
 * fallback added in inc/pdp-redesign.php for the cards that method returns early
 * on. The frame itself is a plain box, so only its paragraph needs styling.
 */
.bc-pdp-cards li.product .sub_and_save_frame {
	margin: 0;
	padding: 0;
	background: none;
	border: 0;
}

/* Design blurb box is 310×32 — two lines at a 16px line-height, not 20. */

.bc-pdp-cards li.product .sub_and_save_frame p{

}
.bc-pdp-cards li.product .bc-pdp-card__blurb {
	margin: 0 0 12px !important;
	padding: 0 12px;
	/* Card component 33365:102332: the blurb is white, not Color 5. */
	color: var(--pdp-c11);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-links);
	font-weight: 400;
	line-height: 16px;
}

/* ── Card rating ─────────────────────────────────────────────────────────── */

/*
 * Yotpo's star row is kept and WooCommerce's own loop rating is dropped: the
 * design's card shows one rating, and Yotpo holds the live review data this site
 * actually collects. At card scale Yotpo's layout behaves — it is only in the
 * panel, at 1020px native width, that it becomes the H7 problem.
 */
/*
 * The design's rating row is 310×16 — stars 53×16 plus "30 verified reviews".
 * Yotpo renders its own row and its own copy ("27 Reviews"), so only the box is
 * matched here. Making it read like the design needs the H7 reviews decision.
 */
.bc-pdp-cards li.product .for_yotpo_in_sub {
	min-height: 16px;
	margin: 0 0 12px;
	padding: 0 12px;
}

/*
 * ⚠ YOTPO'S OWN 5px, AND IT IS AN INLINE STYLE — hence `!important`.
 *
 *   Yotpo's script writes `style="display: flex; justify-content: left;
 *   flex-direction: row; margin-bottom: 5px"` onto the widget after load, so
 *   the rating band measured 35 where its widget is 30, inside a row that
 *   already carries `margin: 0 0 12px`. Nothing in the cascade can reach an
 *   inline declaration except `!important`; a first attempt without it changed
 *   nothing, and a cascade probe found NO stylesheet rule setting the margin at
 *   all, which is what identified it as inline.
 *
 * ⚠ THE REMAINING 14px IS YOTPO'S WIDGET, NOT OUR PADDING, and it is left
 *   alone deliberately — see the note on `.for_yotpo_in_sub` above. Yotpo
 *   renders its own stars and its own "27 Reviews" copy at 30px tall; forcing
 *   the box to the design's 16 would clip them. Matching the design here needs
 *   the reviews decision, not a smaller box.
 */
.bc-pdp-cards li.product .for_yotpo_in_sub .yotpo-reviews-star-ratings-widget {
	margin-bottom: 0 !important;
}

.bc-pdp-cards li.product .woocommerce-product-rating,
.bc-pdp-cards li.product > a .star-rating {
	display: none !important;
}

/* ── Subtractions ────────────────────────────────────────────────────────── */

/*
 * `.choose-fequancy` is the second subscribe control. It is not a duplicate of
 * the real one in any useful sense — its radios have no `convert_to_sub` name
 * and submit nothing; the plugin's rows are what the cart reads. Hiding the
 * fake one and keeping the real one is what "drop .choose-fequancy" from the
 * audit means in practice.
 */
.bc-pdp-cards li.product .choose-fequancy,
.bc-pdp-cards li.product .bc-pdp-options__legend,
.bc-pdp-cards li.product .stock,
.bc-pdp-cards li.product .quantity,
.bc-pdp-cards li.product .quantity-box,
.bc-pdp-cards li.product .bc-pdp-option__unit,
.bc-pdp-cards li.product .bc-pdp-option__badge,
.bc-pdp-cards li.product .bc-pdp-option__note:not(.bc-pdp-option__note--save) {
	display: none !important;
}

/* ── Card frequency pills ─────────────────────────────────────────────────
 * QA 2026-09-15 (86eywk4cq): the card design (the mobile PRODUCT CARD with
 * Subscribe selected) carries the same "How often would you like delivery?"
 * pills the panel has. They were rendered by product-subscription-options.php
 * all along and hidden with the subtractions above on the earlier reading that
 * the card had no picker. Shown now, only while the card's Subscribe row is
 * selected — the same :has() the panel uses — and at card scale: 28px pills,
 * 14px labels, two to a row in a 328 card.
 * ---------------------------------------------------------------------- */
.bc-pdp-cards li.product .bc-pdp-freq {
	display: none;
	margin: 12px 12px 12px;   /* 12 above: the legend sat flush on the Subscribe row's border (Mitz, 2026-09-15 screenshot) */
	text-align: left;
}

.bc-pdp-cards li.product .bc-pdp-options:has(.bc-pdp-freq__pill .bc-pdp-option__radio:checked) .bc-pdp-freq {
	display: block;
}

.bc-pdp-cards li.product .bc-pdp-freq__legend {
	margin: 0 0 8px !important;
	padding: 0;
	color: var(--pdp-c5);
	font-family: var(--pdp-font-body);
	font-size: 14px;
	font-weight: 500;
	line-height: 20px;
}

.bc-pdp-cards li.product .bc-pdp-freq__pills {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	margin: 0 0 8px !important;
	padding: 0;
	list-style: none;
}

/*
 * ⚠ THREE THEME RULES REACH IN HERE, and this is what Mitz's 2026-09-15 screenshot
 *   showed: circles drawn over the pill text, rows 48px apart, the first pill
 *   indented.
 *   - style.css:12929 `.csarprlo ul.products li { padding-bottom: 20px !important }`
 *     — every <li> inside a card, these pills included; hence 48px rows.
 *     Important against important, so the padding here is flagged too.
 *   - style.css:585–640 `[type="radio"]:checked + label` / `:not(:checked) + label`
 *     with `::before`/`::after` — the theme's hand-drawn radio: a 28px padding on
 *     the label and two circles. The panel kills the pseudo-elements at 4919;
 *     the card now does the same and resets the label's box.
 */
.bc-pdp-cards li.product .bc-pdp-freq__pill {
	display: block !important;
	margin: 0 !important;
	padding: 0 !important;
	list-style: none;
}

.bc-pdp-cards li.product .bc-pdp-freq__pill-label::before,
.bc-pdp-cards li.product .bc-pdp-freq__pill-label::after,
.bc-pdp-cards li.product .bc-pdp-freq__pill label::before,
.bc-pdp-cards li.product .bc-pdp-freq__pill label::after {
	content: none !important;
	display: none !important;
}

/*
 * And the theme's clearfix on lists — `ul::before, ul::after { content: " ";
 * display: table }` — inside a flex container becomes two zero-width flex
 * items, and the first still takes the 8px gap: measured, the first pill sat
 * at x=96 with the list at 88 while the second row started at 88.
 */
.bc-pdp-cards li.product .bc-pdp-freq__pills::before,
.bc-pdp-cards li.product .bc-pdp-freq__pills::after {
	content: none !important;
	display: none !important;
}

.bc-pdp-cards li.product .bc-pdp-freq__pill-label {
	position: static !important;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-height: 28px;
	margin: 0 !important;
	padding: 3px 12px !important;
	border: 1px solid var(--pdp-c3);
	border-radius: 9999px;
	background: none;
	color: var(--pdp-c4);
	font-family: var(--pdp-font-body);
	font-size: 14px;
	font-weight: 500;
	line-height: 20px;
	white-space: nowrap;
	cursor: pointer;
}

.bc-pdp-cards li.product .bc-pdp-freq__pill .bc-pdp-option__radio:checked + .bc-pdp-freq__pill-label {
	border-color: var(--pdp-c3);
	background-color: var(--pdp-c3);
	color: var(--pdp-c7);
	font-weight: 600;
}

.bc-pdp-cards li.product .bc-pdp-freq__pill .bc-pdp-option__radio:focus-visible + .bc-pdp-freq__pill-label {
	outline: 2px solid var(--pdp-c3);
	outline-offset: 2px;
}

.bc-pdp-cards li.product .bc-pdp-freq__note {
	position: relative;
	margin: 0 !important;
	padding: 0 0 0 18px;
	color: var(--pdp-c5);
	font-family: var(--pdp-font-body);
	font-size: 12px;
	font-weight: 400;
	line-height: 16px;
}

.bc-pdp-cards li.product .bc-pdp-freq__note::before {
	content: "";
	position: absolute;
	top: 2px;
	left: 0;
	width: 12px;
	height: 12px;
	background-image: url("../pdp/clock-icon.png");
	background-repeat: no-repeat;
	background-position: center;
	background-size: 12px 12px;
}

/* ── Card purchase options ───────────────────────────────────────────────── */

/*
 * The same `convert_to_sub_<id>` group the panel drives, at card scale. The
 * panel's rules are all scoped to `.chuni-beef-banner .summary`, so nothing
 * leaks in either direction and the two can be sized independently.
 */
.bc-pdp-cards li.product .bc-pdp-options {
	margin: 0 0 12px;
	padding: 0 12px;
}

/*
 * ⚠ THE SAME 12px AGAIN, THIS TIME WITH WEIGHT. The rule above already sets
 *   `padding: 0 12px` on this element and MATCHES it — confirmed from the page,
 *   by walking `pdp-redesign.css` and asking the element itself — yet the
 *   computed padding was `0px` on all four sides, and the purchase rows ran
 *   flush to the card's edges while the Add Item button below them sat
 *   correctly inset. The design puts both at x=12, 304 wide, inside a 328 card
 *   (`Frame 1261154945`).
 *
 * ⚠ THE OVERRIDING DECLARATION WAS NOT LOCATABLE FROM SCRIPT. Four of this
 *   page's 123 stylesheets are cross-origin, so `cssRules` throws on them and a
 *   cascade walk cannot see inside. Rather than guess at a source, this raises
 *   the weight and the result was measured: rows 328 -> 304 at x=76.
 *
 *   Longhands, not the shorthand, so the `margin`/`padding-bottom` the rule
 *   above establishes are left alone.
 */
.bc-pdp-cards li.product form.cart > .bc-pdp-options {
	padding-right: 12px !important;
	padding-left: 12px !important;
}

.bc-pdp-cards li.product .bc-pdp-options__rows {
	display: flex;
	flex-direction: column;
	gap: 8px;
	margin: 0 !important;
	padding: 0 !important;
	list-style: none !important;
}

/*
 * ⚠ A CLEARFIX BECAME TWO FLEX ITEMS AND COST THE CARD 16px.
 *
 *   The theme puts `content: " "; display: table` on this list's `::before` and
 *   `::after` — a float clearfix, harmless in the block layout it was written
 *   for. Once the list is `display: flex`, both pseudo-elements become flex
 *   ITEMS: zero-height, but each separated from its neighbour by the 8px `gap`.
 *
 *       before(0) + 8 + one-time(42) + 8 + subscribe(54) + 8 + after(0) = 120
 *
 *   against the design's 106. Measured, not deduced: the list computed
 *   `padding: 0px`, `border: 0px`, `min-height: 0px` and `gap: 8px` with two
 *   children of 42 and 54, which cannot add up to 120 — and the first row began
 *   8px BELOW the list's own top edge, which no padding explained.
 *
 * ⚠ The panel's own list (`.chuni-beef-banner .summary .bc-pdp-options__rows`)
 *   is a separate rule and is NOT touched here. It very likely has the same 16px
 *   in it, but the PDP is deferred (Mitz, 2026-09-05) and unverified changes to
 *   it do not belong in a category-page pass.
 */
.bc-pdp-cards li.product .bc-pdp-options__rows::before,
.bc-pdp-cards li.product .bc-pdp-options__rows::after {
	display: none;
}

.bc-pdp-cards li.product .bc-pdp-option {
	display: block !important;   /* the theme hides any li in this list that is
	                              * neither .one-time-option nor
	                              * .subscription-option */
	margin: 0 !important;
	padding: 0 !important;
}

/* Clipped, not hidden: a `display: none` radio is unreachable by keyboard. */
.bc-pdp-cards li.product .bc-pdp-option__radio {
	position: absolute;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	overflow: hidden;
	clip: rect(0 0 0 0);
	clip-path: inset(50%);
	white-space: nowrap;
	border: 0;
}

.bc-pdp-cards li.product .bc-pdp-option__label {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	box-sizing: border-box;
	width: 100%;
	margin: 0;
	padding: 9px 12px;
	border: 1px solid var(--pdp-c6);
	/* ⚠ Square. At 8× the design's One Time Purchase and Subscribe boxes have sharp
	 * corners; the border stays, the rounding goes. The PANEL's own option rows keep
	 * their 8px — a different node, and not what Mitz asked about. */
	border-radius: 0;
	background-color: transparent;
	color: var(--pdp-c5);
	cursor: pointer;
}

.bc-pdp-cards li.product .bc-pdp-option__radio:focus-visible + .bc-pdp-option__label {
	outline: 2px solid var(--pdp-c3);
	outline-offset: 2px;
}

.bc-pdp-cards li.product .bc-pdp-option__head,
.bc-pdp-cards li.product .bc-pdp-option__figures {
	display: flex;
	flex-direction: column;
	gap: 2px;
}

.bc-pdp-cards li.product .bc-pdp-option__figures {
	flex-shrink: 0;
	text-align: right;
}

/*
 * ⚠ 12/14, NOT 14/18. Node 33177:114137 is Inter Medium **12px on a 14px
 *   line**; `--pdp-links` is 14 and the line was 18, so the row's label ran a
 *   size large everywhere it appears on a card.
 */
.bc-pdp-cards li.product .bc-pdp-option__title {
	color: inherit;
	font-family: var(--pdp-font-body);
	font-size: 12px;
	font-weight: 500;
	line-height: 14px;
}

/*
 * ⚠ AND THE SUBSCRIBE ROW'S LABEL IS THE SAME SIZE ON A DIFFERENT LINE —
 *   node 33177:112709 is 12px on **20**, where One Time Purchase is 12 on 14.
 *   Two line-heights for one size is easy to read as a mistake in the design and
 *   is not: the Subscribe label has the "Save …" badge stacked under it inside
 *   the same 20px rhythm, and One Time Purchase has nothing under it.
 */
.bc-pdp-cards li.product .bc-pdp-option:not(.one-time-option) .bc-pdp-option__title {
	line-height: 20px;
}

/*
 * ⚠ `--pdp-links` (14), NOT `--pdp-body` (16). Both prices in the card
 *   component — nodes 33130:114941 and 33130:114928 — are `Links/Bold`:
 *   Inter Semi Bold at Size/Links on a 26px line. The 16 made the price the
 *   largest thing in the row, where the design has it level with the label.
 */
.bc-pdp-cards li.product .bc-pdp-option__price {
	color: inherit;
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-links);
	font-weight: 600;
	line-height: 18px;
	white-space: nowrap;
}

/* The design's "Save $11.92 per delivery". Same arithmetic as the panel — it is
 * computed in product-subscription-options.php, so the card inherits it. */
.bc-pdp-cards li.product .bc-pdp-option__note--save {
	color: var(--pdp-ok-400);
	font-family: var(--pdp-font-body);
	font-size: 12px;
	font-weight: 500;
	line-height: 16px;
}

/* Selected state, driven by the radio rather than a class — no JS involved. */
.bc-pdp-cards li.product .bc-pdp-option__radio:checked + .bc-pdp-option__label {
	border-color: var(--pdp-c3);
	color: var(--pdp-c3);
}

/* ── Card button ─────────────────────────────────────────────────────────── */

/*
 * The postcode gate ships two buttons and shows one — `.show-pincode-pop-up`
 * until a valid postcode is cookied, `.on-pincode-required` after. Both are
 * styled, and neither is unhidden from here: the inline `display` that
 * subscription.php writes is the gate's state, and overriding it would show two
 * buttons at once.
 */
.bc-pdp-cards li.product form.cart .btn_prod {
	margin: 0;
	padding: 0 12px;
}

.bc-pdp-cards li.product form.cart .btn_prod button,
.bc-pdp-cards li.product form.cart .btn_prod .button {
	display: flex;
	align-items: center;
	justify-content: center;
	box-sizing: border-box;
	width: 100% !important;
	max-width: none !important;
	/*
	 * ⚠ THIS is the card button's real rule, at (0,4,3). Two later attempts wrote
	 *   against `.bc-pdp-cards li.product .show-pincode-pop-up` — (0,3,1) — and lost
	 *   even carrying !important, which showed up as font-weight applying while the
	 *   radius, fill and size did not. Corrected here.
	 *
	 * Design node 33130:100090: WHITE, #322b27 text, square, 24/12 padding, Inter
	 * Semi Bold at Size/Paragraph 18.
	 *
	 * White is deliberate and is NOT the panel's tan. The card body sits on c8 and
	 * the panel on c7; the design gives each surface its own primary, and this is
	 * the one bright element the card uses to draw the eye. As cream (c4) it read as
	 * just another muted surface.
	 */
	min-height: 46px;
	margin: 0 !important;
	padding: 12px 24px !important;
	background-color: var(--pdp-c11) !important;
	border: 0;
	border-radius: 0 !important;
	color: var(--pdp-c8) !important;
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-para) !important;
	font-weight: 600;
	line-height: 1;
	text-align: center;
	text-transform: none;
	cursor: pointer;
}


/* Out-of-stock badge, kept from the old carousel — it is real information the
 * design has no card state for. */
.bc-pdp-cards li.product .out_stock_box {
	margin: 0 12px 8px;
	color: var(--pdp-c5);
	font-family: var(--pdp-font-body);
	font-size: 12px;
	line-height: 16px;
	text-transform: uppercase;
}

/* ── Furniture that only appears once these templates render in a card ──── */

/*
 * The first card measured 1579px tall against the design's 630. Four things
 * account for almost all of it, and none were visible in the audit's survey of
 * the category page — they appear only because a loop card here renders the
 * SINGLE-product templates.
 *
 *   .hover-image_prod           a second full-size product image for a hover
 *                               swap (functions.php:748). In normal flow it put
 *                               337px under the thumbnail and made the <a> 805
 *                               tall. The design has no hover swap.
 *   p.babtitle                  the product title AGAIN, printed by the theme's
 *                               woocommerce/global/quantity-input.php:92 at
 *                               30px — 113px, and twice per card, because that
 *                               template renders twice.
 *   .yotpo-widget-instance      a second Yotpo bottom line beside the one in
 *                               `.for_yotpo_in_sub`. There is no class to tell
 *                               them apart, so the strays are addressed by
 *                               position and the kept one through its wrapper.
 *   .wc-delivery-time-response  the postcode gate's "Good news! We deliver to
 *                               your area" panel, 90px. That belongs to the
 *                               purchase panel, where the design does show it,
 *                               not to a card.
 */
.bc-pdp-cards li.product .hover-image_prod,
.bc-pdp-cards li.product p.babtitle,
.bc-pdp-cards li.product .wc-delivery-time-response,
.bc-pdp-cards li.product .bc-pdp-card__body > .yotpo-widget-instance,
.bc-pdp-cards li.product form.cart > .yotpo-widget-instance {
	display: none !important;
}

/*
 * Anything else the templates emit and this file has not placed sorts to the
 * bottom rather than above the image. Without this, `p.babtitle` and the stray
 * Yotpo row rendered ABOVE the product photo: they default to `order: 0` and
 * every element this file positions starts at 1.
 */
.bc-pdp-cards li.product > * {
	order: 9;
}

/* The image rule has to name `.product-thum`, or it also sizes the hover image
 * and the Yotpo star sprites. */
.bc-pdp-cards li.product > a .product-thum {
	/*
	 * ⚠ 12, NOT 16. The design's card puts the image band at 0..328 and opens
	 *   the text block at 340 — a 12px gap, the same 12 the block uses on its
	 *   other three sides. The 16 here was the only unsourced number in the
	 *   card and it made every card 4px tall over.
	 */
	margin: 0 0 12px;
}

/* ── The card button has to be forced visible ────────────────────────────── */

/*
 * A design decision, not a workaround. style.css:18085 hides `.btn_prod`
 * outright, and the only thing that reveals it is `.show_btn_prod`, added by
 * blaze_radio_selected() in global.js when one of the FAKE `.radio-customc`
 * radios inside `.choose-fequancy` is checked. Those are hidden here in favour
 * of the real purchase options, so on a card the button could never appear at
 * all. The design draws it always visible.
 *
 * The two buttons INSIDE keep their inline `display`, which is the postcode
 * gate's state — `.show-pincode-pop-up` until a valid postcode is cookied,
 * `.on-pincode-required` after. Nothing here uses `!important` on them, so the
 * inline value still wins and only ever one shows.
 */
.bc-pdp-cards li.product form.cart .btn_prod {
	display: block !important;
}

/* ── Measured corrections, round two ────────────────────────────────────── */

/*
 * The card title rendered at 94px tall. `font-size` and `line-height` were being
 * set here without `!important`, and the theme wins that tie — this stylesheet is
 * document-order earlier than the footer's duplicate copies of style.css (note 2
 * in inc/pdp-redesign.php). Clamped to two lines as well, so one long product
 * name cannot make its card taller than the rest of the row.
 */
.bc-pdp-cards li.product .bc-pdp-card__title-link h2.woocommerce-loop-product__title {
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 2;
	/*
	 * The design's title box is 310×20 — ONE line at a 20px line-height. Two
	 * lines are allowed here on purpose: the design mocks up "Carnivore Box –
	 * 7.5KG", and real names like "Poultry Box with Chicken Treats -5.25KG" lose
	 * meaning when truncated to one. Costs 20px against the design's 630.
	 */
	max-height: 40px;
	overflow: hidden;
	/*
	 * ⚠ 18, not the h6 20. The card's own node (29323:46979) sets Size/Paragraph 18
	 *   on a 20px line; 20 is the PANEL heading's size and was inferred from it.
	 *
	 *   Corrected HERE because this rule carries !important — a later attempt wrote
	 *   `.bc-pdp-cards li.product h2.woocommerce-loop-product__title` without it and
	 *   lost, which is the same specificity trap as the card button.
	 */
	font-size: var(--pdp-para) !important;
	line-height: 20px !important;
	letter-spacing: normal;
	/*
	 * ⚠ LEFT, AND IT NEEDS THE FLAG. The design left-aligns every line in the
	 *   card — the note further down this file already restored that for the
	 *   blurb and the rating row, but the title was missed and stayed centred
	 *   while the two lines under it read left, which looked like a mistake
	 *   rather than a style. `text-align` computed to `center` with our own
	 *   (0,3,1) rule in place, so this matches the two declarations above it and
	 *   carries `!important` too.
	 */
	text-align: left !important;
}

/*
 * An empty blurb still occupied 10px. `excerpt_text` is populated on combo boxes
 * and empty on most raw meals and treats, so `.sub_and_save_frame` renders as an
 * empty paragraph on those. inc/pdp-redesign.php now supplies the fallback in
 * that case; this collapses the empty frame it renders beside.
 */
.bc-pdp-cards li.product .sub_and_save_frame p:empty {
	display: none;
}

/*
 * PayPal's pay-later messaging, 16px inside gift cards. It belongs on the
 * purchase panel, not on a card in a carousel.
 */
.bc-pdp-cards li.product .ppcp-messages {
	display: none !important;
}

/* ── Cards without purchase options keep their price ─────────────────────── */

/*
 * WooCommerce's loop `.price` is redundant beside the two priced rows, but only
 * where those rows exist. Gifts have no subscription schemes at all — no rows —
 * so hiding `.price` unconditionally left a gift card with NO price on it. The
 * `:has()` test makes the subtraction conditional on there being something to
 * replace it with.
 */
/* ── …and GIFTS never show option rows, whatever their DOM says ─────────────
 *
 * `The Butchers Dog Insulated Cooler Bag` rendered title → Add item and NO
 * figure anywhere — reported twice by Mitz, and the second time is what got the
 * cause instead of a workaround.
 *
 * ⚠ `theme/Blutcher/style.css:1765` — a PRE-REDESIGN RULE, and the whole answer:
 *
 *       .product_cat-gifts .wcsatt-options-wrapper { display: none !important; }
 *
 *   Gifts are deliberately excluded from the subscribe UI across this theme —
 *   `inc/subscribe-and-save.php` returns early for that category too. The cooler
 *   bag is the ONLY gifts product with subscription schemes, so it is the only
 *   one where the exclusion collides with the rule below: its option rows are in
 *   the DOM, so `:has(.bc-pdp-option)` hid the loop price, while that legacy
 *   `!important` hid the rows the price was being hidden in favour of. Two rules
 *   that each look right alone, and a card with no price at all.
 *
 *   So the condition here mirrors the rule that causes it — the same class, not
 *   a guess at its effect. A gifts card keeps its loop price even when option
 *   rows exist, because on a gifts card those rows can never be visible.
 *
 * ⚠ AN EARLIER FIX FOR THIS SHIPPED AND WAS REVERTED. It keyed on the inline
 *   `style="display: none"` the plugin's script writes on the wrapper, on the
 *   assumption that only the hidden one carried it. Every wrapper carries it —
 *   `assets/css/style.css:7304`'s `.wcsatt-options-wrapper { display: block
 *   !important }` is what overrides it for the ones that show — so the condition
 *   matched all eight gift cards and un-hid the loop price on three apothecary
 *   cards that were already correct, printing the figure twice. **Fixing by
 *   condition rather than by cause produced a worse bug than the one it fixed.**
 *
 * ⚠ Safe against multi-category products by inspection: all 8 gifts products are
 *   gifts-only, and in any case the legacy rule keys on the same class on the
 *   same element — so wherever it hides the rows, this shows the price.
 * ------------------------------------------------------------------------- */
.bc-pdp-cards li.product:not(.product_cat-gifts):has(.bc-pdp-option) .price {
	display: none !important;
}

.bc-pdp-cards li.product:not(:has(.bc-pdp-option)) .price,
.bc-pdp-cards li.product.product_cat-gifts .price {
	display: block;
	margin: 0 0 12px !important;
	padding: 0 12px;
	text-align: left;   /* QA 86eywk5m6: the sold-out card centred it under the theme's `li.product { text-align: center }` */
	color: var(--pdp-c4);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-body) !important;
	font-weight: 600;
	line-height: 20px;
}

/* The price sits inside the `<a>`, so it inherits the title's colour otherwise. */
.bc-pdp-cards li.product:not(:has(.bc-pdp-option)) .price .amount,
.bc-pdp-cards li.product:not(:has(.bc-pdp-option)) .price bdi,
.bc-pdp-cards li.product.product_cat-gifts .price .amount,
.bc-pdp-cards li.product.product_cat-gifts .price bdi {
	color: inherit;
}

/* ── …and it has to sit ABOVE the button, not under it ───────────────────────
 *
 * Reported by Mitz 2026-09-09 from the apothecary and gifts category grids:
 * every card WITHOUT purchase options read title &rarr; Add item &rarr; price.
 *
 * ⚠ THE RULE ABOVE ONLY EVER MADE THE PRICE VISIBLE. It never placed it, so the
 *   `.bc-pdp-card__body > *` catch-all further down this file gave it
 *   `order: 9` — below `form.cart` at 4. Measured on `/gifts/`: the title at
 *   y=1049, the Add item button at y=1105, the price at **y=1151**. On a card
 *   that HAS options the same figure sits at y=1102, above a button at y=1201,
 *   because it is inside an option row rather than loose in the body. So the two
 *   kinds of card disagreed about where the price goes, and only the option-less
 *   one was wrong.
 *
 * `order: 3` is the blurb's slot — the design's sequence is title, blurb, price,
 * button, and nothing else claims 3 on these cards (the category grid renders no
 * blurb; that partial is PDP-only).
 *
 * ⚠ `:not(.test)` is load-bearing. `woocommerce/global/quantity-input.php:44`
 *   emits `<span class="price test">` on every shop and category card with its
 *   price echo COMMENTED OUT — an empty span whose only effect is 8px of
 *   `margin-top`. Moving that up with the real price would put a stray 8px gap
 *   above the button. It is left where it is rather than deleted: that template
 *   is a WooCommerce global used site-wide, and the span is inert.
 * ------------------------------------------------------------------------- */
.bc-pdp-cards li.product:not(:has(.bc-pdp-option)) .bc-pdp-card__body > .price:not(.test),
.bc-pdp-cards li.product.product_cat-gifts .bc-pdp-card__body > .price:not(.test) {
	order: 3;
}

/* ── Equal heights across a row ──────────────────────────────────────────── */

/*
 * Gift cards measured 528 and 709 in the same carousel, because products with
 * subscription rows are taller than those without. Owl lays its stage out with
 * floats and sizes items inline; making the stage a flex row leaves those inline
 * widths untouched and stretches every item in the row to the tallest. Combined
 * with `margin-top: auto` on the form, the buttons then align across the row.
 */
.bc-pdp-cards .owl-carousel .owl-stage {
	display: flex;
	align-items: stretch;
}

.bc-pdp-cards .owl-carousel .owl-item {
	display: flex;
	float: none !important;
}

/*
 * Every link in the chain needs `flex: 1`, not just `display: flex`. The stage
 * stretches the item, but the item's height only reaches the card if each wrapper
 * between them grows into it: owl-item > slide > ul.products > li.product. An
 * earlier version set display and width here and left the growth out, and the
 * cards stayed exactly as ragged as before — 627, 697 and 717 in one carousel.
 */
.bc-pdp-cards .owl-carousel .owl-item > .bc-pdp-cards__slide,
.bc-pdp-cards .owl-carousel .owl-item > .bc-pdp-cards__slide > ul.products {
	display: flex !important;
	flex: 1 1 auto;
	flex-direction: column;
	width: 100%;
}

.bc-pdp-cards .owl-carousel .owl-item ul.products > li.product {
	flex: 1 1 auto;
}

/*
 * Two lines of blurb, so content length cannot drive the row's height without
 * limit. The PHP already trims to 22 words; this bounds how those words wrap.
 */
.bc-pdp-cards li.product .sub_and_save_frame p,
.bc-pdp-cards li.product .bc-pdp-card__blurb {
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 2;
	max-height: 32px;   /* the design's box, exactly */
	overflow: hidden;
}

/* ── Page indicator ──────────────────────────────────────────────────────── */

/* The design shows a dot indicator and no arrows. Owl's init asks for both
 * (footer.php:238); the dots are keyboard-reachable buttons, so dropping the
 * arrows costs no way of paging the carousel. */
.bc-pdp-cards .owl-carousel .owl-nav {
	display: none !important;
}

.bc-pdp-cards .owl-carousel .owl-dots {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 8px;
	margin-top: 16px;
}

.bc-pdp-cards .owl-carousel .owl-dot {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 44px;   /* touch target; the mark itself is the design's 8px */
	height: 44px;
	padding: 0;
	border: 0;
	background: transparent;
}

.bc-pdp-cards .owl-carousel .owl-dot span {
	display: block;
	width: 8px !important;   /* owl sets its own dimensions on the span */
	height: 8px !important;
	margin: 0 !important;
	border-radius: 9999px;
	background-color: var(--pdp-c6) !important;
	transition: background-color 120ms ease, transform 120ms ease;
}

.bc-pdp-cards .owl-carousel .owl-dot.active span {
	background-color: var(--pdp-c3) !important;
	transform: scale(1.25);
}

/* ---------------------------------------------------------------------------
 * REWIRE — the Reviews row's mount
 *
 * assets/js/pdp-accordion.js moves Yotpo's existing reviews widget in here. The
 * widget is 1020px native against a 668 column, so the mount scrolls
 * horizontally rather than letting it push the page sideways — the page body
 * must never scroll sideways because of one panel.
 *
 * ⚠ This is the H7 compromise made visible, not a fix. The reviews are now WHERE
 *   the design puts them, but they do not LOOK like the design: Yotpo renders its
 *   own layout in Open Sans, a fifth typeface, and its internal widths are not
 *   ours to set from out here. Closing that gap needs the reviews-platform
 *   decision — Yotpo's API with our own rendering, its custom templates if the
 *   plan allows, or native WooCommerce reviews.
 *
 * Anything that hides the moved widget rather than letting it scroll would be
 * worse: the reviews would be present in the DOM and invisible.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-details__mount {
	width: 100%;
	overflow-x: auto;
	overflow-y: hidden;
	-webkit-overflow-scrolling: touch;
}

/*
 * Let the widget shrink where it can. Yotpo sets pixel widths on some of its own
 * containers; max-width lets the fluid ones reflow to 668 and leaves the fixed
 * ones to the scroller above.
 */
/*
 * ⚠ A LIGHT SURFACE UNDER THE REVIEWS WIDGET. QA 2026-09-15 (86eywk7h8): the
 *   widget ships its own palette inline — `--text-color: #6B6D76`, headings
 *   #2c2c2c, "Sort by" #373330 — chosen for a white page, and the row sits on
 *   the panel's #1f1f1f. Measured: every line of it was dark-on-dark and the
 *   review cards' 5% tan tint vanished. Recolouring Yotpo's text would mean
 *   `!important` over dozens of inline declarations and would break again with
 *   its next release; a white panel under the widget makes its own palette
 *   correct instead. White (Color 11) rather than the page ink, so the tan
 *   primary and gold stars keep their contrast.
 *
 * ⚠ SUPERSEDED THE SAME DAY (register 567). Mitz: "make the bg not white and the
 *   font color follow". Once the layout pass below had already taken over the
 *   widget's type, taking over its colours too was the smaller step: the row
 *   sits on the panel's ink like every other accordion row, each card on the
 *   raised Color 8, text in Colors 4/5, dividers Color 6, tan and gold as they
 *   were. The dropdown's floating menu keeps Yotpo's white — it opens over the
 *   page, not on it.
 */
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] {
	box-sizing: border-box;
	padding: 0;
	border-radius: 0;
	background-color: transparent;
}

/*
 * ── The widget laid out for a 656px row ──────────────────────────────────
 * Mitz, 2026-09-15, from a staging screenshot: "can't we edit the reviews
 * content? like how its arrange/setup?" The words are the customers' and live
 * in Yotpo; the arrangement is ours to restyle because the widget is in-page
 * HTML, not an iframe. Read off the rendered DOM before writing a line:
 *
 *   .yotpo-layout-header-wrapper     730×88, holding one 0×0 "new review"
 *                                    wrapper — an empty block on this store
 *   .yotpo-reviews-cart-list         a UL whose parent DIV is `height: 0`
 *   li.yotpo-review-card             `width: calc(33.333% - 12px); position:
 *                                    absolute; left; top` — Yotpo's JS lays the
 *                                    cards out as a three-column masonry with
 *                                    INLINE styles, so 133px-wide, 842px-tall
 *                                    cards in the 435px the list is given
 *   p.yotpo-review-title             30px, weight 300
 *   .yotpo-text-container            16px, weight 300, Yotpo's grey
 *   .yotpo-gutter                    an 18px column spacer
 *
 * ⚠ `!important` THROUGHOUT, ON PURPOSE. Every geometry value here is set by
 *   Yotpo's script as an inline style on the element, and only an important
 *   author declaration outranks an inline one. The header is hidden rather
 *   than fixed because it has nothing in it; if the client enables the summary
 *   or the write-review button in Yotpo, drop that one rule.
 *
 * ⚠ FRAGILE BY NATURE. These are Yotpo's class names; a widget release can
 *   rename them and the row falls back to Yotpo's own layout — never broken,
 *   just theirs again. Check this row after any Yotpo update.
 * ---------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-layout-header-wrapper {
	display: none !important;
}

/* The wrapper the script lifts in still wears style.css:4381's 40px side padding — 80px of the 624 gone. */
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .arrive-ferozen-text {
	padding: 0 !important;
	margin: 0 !important;
}

/*
 * Above the Sort row Yotpo also prints `.yotpo-head` — 100px tall with a 32px
 * margin and nothing in it on this store (its summary and write-review controls
 * are off) — followed by a 5px `.yotpo-review-border-smooth` divider. Measured:
 * 137px of white between the row's top and "Sort by". Both go; the divider
 * INSIDE each card carries `top-margin` and is left alone.
 */
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-head,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-review-border-smooth:not(.top-margin) {
	display: none !important;
}

.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-sorting-filter-container {
	margin: 0 0 12px !important;
}

.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-widget-instance,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-reviews-main-widget,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-main-widget-layout,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-base-layout,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-reviews-cart-list {
	width: 100% !important;
	max-width: none !important;
	margin-left: 0 !important;
	margin-right: 0 !important;
	padding-left: 0 !important;
	padding-right: 0 !important;
}

/* The masonry container: static flow, one column, its own height. */
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] div:has(> .yotpo-reviews-cart-list) {
	position: static !important;
	height: auto !important;
}

.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-reviews-cart-list {
	display: flex !important;
	flex-direction: column !important;
	gap: 12px !important;
	height: auto !important;
	margin: 0 !important;
	padding: 0 !important;
	list-style: none !important;
}

.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-review-card {
	position: static !important;
	width: 100% !important;
	left: auto !important;
	top: auto !important;
	transform: none !important;
	margin: 0 !important;
	padding: 0 !important;
}

.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-gutter {
	display: none !important;
}

.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .card-container {
	box-sizing: border-box !important;
	width: 100% !important;
	padding: 16px !important;
	background: var(--pdp-c8) !important;   /* the raised panel ground, as the checkout's boxes use (567) */
	border: 0 !important;
	border-radius: 0 !important;
}

.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .content-container {
	width: 100% !important;
	max-width: none !important;
}

/* Type at the panel's scale, in the panel's face. */
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-review-title,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-review-title strong {
	margin: 8px 0 !important;
	color: var(--pdp-c4) !important;
	font-family: var(--pdp-font-body) !important;
	font-size: 18px !important;
	font-weight: 600 !important;
	line-height: 24px !important;
}

.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-review-content,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-text-container,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-text-container * {
	color: var(--pdp-c5) !important;
	font-family: var(--pdp-font-body) !important;
	font-size: 15px !important;
	font-weight: 400 !important;
	line-height: 22px !important;
}

.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-reviewer,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-reviewer *,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-sorting-filter-container,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-sorting-filter-container * {
	color: var(--pdp-c5) !important;
	font-family: var(--pdp-font-body) !important;
	font-size: 14px !important;
	line-height: 20px !important;
}

/* Tan stays tan: the reviewer's name and the "Read more" link are Yotpo's primary colour, which is already Color 1. */
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-reviewer-name,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-read-more-text,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] [class*="read-more"] {
	color: var(--pdp-c3) !important;
}

.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-reviewer-name {
	font-weight: 600 !important;
}

/* The verified tick, the sort chevron, the in-card divider. */
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-reviewer-badge-container svg,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-reviewer-badge-container svg *,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-sorting-filter-container svg,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-sorting-filter-container svg * {
	fill: var(--pdp-c5) !important;
	color: var(--pdp-c5) !important;
}

/* The divider is a 10×5 SVG background image of light strokes, not a border — the colour has to replace the image, not sit under it. */
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .card-container .yotpo-review-border-smooth {
	height: 1px !important;
	background-image: none !important;
	background-color: var(--pdp-c6) !important;
	border-color: var(--pdp-c6) !important;
}

/* ── The Sort by dropdown, and the store owner's replies ────────────────────
 * ⚠ Mitz, QA 2026-09-16, screenshot of the open "Sort by" menu: "make it
 *   readable."
 *
 * ⚠ THE SORT DROPDOWN KEPT YOTPO'S WHITE PANEL WHILE ITS LABELS TOOK OUR INK.
 *   The `.yotpo-sorting-filter-container *` rule above is what turned the
 *   control's text to Color 5 when the row moved onto the panel's ground (567).
 *   It reaches the OPTIONS too — and the options sit in
 *   `.yotpo-dropdown-content-wrapper`, which Yotpo still paints white. Measured
 *   on staging with the menu open: "Lowest rating", "Verified purchase", "Most
 *   recent" and "With media" at **1.54:1**, and the selected row, which Yotpo
 *   fills with its primary #A4866C, at **2.2:1**.
 *
 *   So the panel takes the ground the rest of the row already uses, and the
 *   SELECTED row keeps Yotpo's gold fill but flips to dark ink, which is the
 *   only readable way round on that colour.
 *
 * ⚠ AND THE STORE OWNER'S REPLIES, found on the way and the same defect class:
 *   `.yotpo-comment-title` / `.yotpo-comment-content` are Yotpo's own grey
 *   #676A6C, untouched by the rules above because they are outside
 *   `.yotpo-text-container` — **2.55:1** on the card. They take Color 5 like
 *   every other piece of secondary review copy.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-dropdown-content-wrapper {
	background-color: var(--pdp-c8) !important;
	border: 1px solid var(--pdp-c6) !important;
	box-shadow: none !important;
}

.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-dropdown-option {
	background-color: transparent !important;
}

/*
 * ⚠ AND THE SELECTED ROW HAS TO PUT ITS FILL BACK. The blanket `transparent`
 *   above is what makes an unselected row sit on the panel — but it also took
 *   away the gold Yotpo fills the selected row with, which left dark ink on the
 *   dark panel at 1.19:1. Measured, and worse than what QA reported. So the
 *   fill is restored explicitly from our own token, which is the same #a4866c.
 */
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-dropdown-option--selected {
	background-color: var(--pdp-c1) !important;
}

.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-dropdown-option:hover,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-dropdown-option--focus:not(.yotpo-dropdown-option--selected) {
	background-color: var(--pdp-c6) !important;
}

.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-dropdown-option:hover .yotpo-dropdown-option-label,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-dropdown-option--focus:not(.yotpo-dropdown-option--selected) .yotpo-dropdown-option-label {
	color: var(--pdp-c4) !important;
}

/* The selected row keeps Yotpo's gold fill; only the ink flips, because light
 * ink on that gold measured 2.2:1 and dark ink on it measures over 7. */
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-dropdown-option--selected .yotpo-dropdown-option-label,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-dropdown-option--selected .yotpo-dropdown-option-label * {
	color: var(--pdp-c7) !important;
}

.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-dropdown-option--selected svg,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-dropdown-option--selected svg * {
	fill: var(--pdp-c7) !important;
	color: var(--pdp-c7) !important;
}

.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-comment-title,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-comment-content,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-comment-content * {
	color: var(--pdp-c5) !important;
}

.chuni-beef-banner .summary .bc-pdp-details__mount .yotpo-widget-instance,
.chuni-beef-banner .summary .bc-pdp-details__mount .yotpo-reviews-main-widget,
.chuni-beef-banner .summary .bc-pdp-details__mount .yotpo-widget-clear {
	max-width: 100%;
}

/* The panel is dark; Yotpo assumes a light ground for its own frame. */
.chuni-beef-banner .summary .bc-pdp-details__mount .yotpo-widget-clear {
	background-color: transparent;
}

/*
 * Blocks retired by script rather than by the PHP-emitted rule.
 *
 * The PHP rule covers cases PHP can decide (a row rendered, so its below-hero
 * twin is redundant). This class covers the one case only the DOM knows: the
 * reviews card is retired ONLY if the widget was successfully moved out of it.
 * If the move fails, the card keeps its class-free state and its reviews.
 */
.bc-pdp-legacy-duplicate {
	display: none !important;
}

/* ---------------------------------------------------------------------------
 * Card button width — measured correction
 *
 * The design's in-card button is 310 wide in a 334 card: 12px each side, the same
 * inset as everything else in the card. It measured 282, because `form.cart`
 * carries horizontal padding of its own from the theme's stylesheets on top of
 * the 12px this file applies to `.btn_prod`. Zeroing the form's padding lets the
 * one intended inset be the only one.
 *
 * Scoped to cards. The panel's form is untouched — its button is 461 wide there,
 * beside the quantity stepper and the wishlist control.
 * ------------------------------------------------------------------------- */
.bc-pdp-cards li.product form.cart {
	padding: 0 !important;
	margin: 0 !important;
}

/* ---------------------------------------------------------------------------
 * Card section — corrections from the rendered design
 *
 * Read off a full render of `PDP` 33110:107212 after a full-page screenshot of
 * the build showed the section sitting on white. Everything here was previously
 * inferred from the purchase panel rather than read from the design.
 * ------------------------------------------------------------------------- */

/*
 * THE SECTION GROUND. The design's PDP is dark end to end — hero, "why feed
 * raw", "why choose", "you may also like" and "recently viewed" are all dark.
 * The theme's host section is `#ffffff`, which left the tan heading at about
 * 2:1 against it and the grey supporting line at about 1.4:1 — present, and
 * effectively unreadable.
 *
 * Selected with `:has()` rather than by class because the four category
 * templates each wrap this section in a differently-named one
 * (`.cariour-box-banner`, `.beef-fechurd-banner`, `.kangaru-tail-banner`, …).
 * Targeting the section that CONTAINS the cards covers all of them and cannot
 * catch a section on a page that has none.
 */
section:has(.bc-pdp-cards-section) {
	background-color: var(--pdp-c7) !important;
}

/*
 * The design's card title is UPPERCASE and tan — the same Gold Light/100 as the
 * section heading, not the near-white body colour the panel uses for its option
 * titles. Inferring it from the panel was the mistake.
 */
.bc-pdp-cards li.product .bc-pdp-card__title-link h2.woocommerce-loop-product__title {
	color: var(--pdp-c3);
	text-transform: uppercase;
}

/*
 * The savings line is a BADGE in the card — light green ground, dark green text —
 * where the panel renders it as green text on the panel ground. Two different
 * treatments in the design, and the card inherited the panel's.
 */
.bc-pdp-cards li.product .bc-pdp-option__note--save {
	/*
	 * `align-self`, not `display: inline-block`. The parent is a column flex
	 * container, which BLOCKIFIES its children — inline-block computed as block
	 * and the badge stretched the full width of the row instead of hugging its
	 * text. flex-start is what shrinks a flex item to its content.
	 */
	align-self: flex-start;
	padding: 1px 6px;
	border-radius: 4px;
	background-color: var(--pdp-ok-200);
	color: var(--pdp-ok-950);
	font-size: 11px;
	line-height: 16px;
}

/*
 * The card button is LIGHT in the design; the tan pill belongs to the panel's
 * "Check & Add to Cart". Keeping them the same colour made the card button
 * compete with the panel's primary action.
 *
 * Overrides the earlier card-button rule, which set the tan ground with
 * `!important` for the document-order reason, so these need it too.
 */
/*
 * The block that sat here repeated the resting selector verbatim and re-set the
 * fill to c4 — an unconditional override of the rule above it, and what actually
 * painted this button cream instead of white. Removed; the hover below is the only
 * one now.
 */

/*
 * ⚠ ONE hover rule. Three had accumulated across rounds, disagreeing — c2 with
 *   white text, c4 with c8, and c11 with c7 — and the last of them won, which set
 *   hover to WHITE. That is now the resting fill, so hovering did nothing at all
 *   except shift the label from c8 to c7.
 *
 *   White dims to cream on hover: the only direction available from white, and it
 *   keeps the label's contrast well clear of AA either way.
 */
/*
 * ⚠ Mitz, 2026-09-01: hover is #8A6E57 on #F5F2EE — c2 and c4, both already
 *   tokens, so they are written as tokens rather than as the hex he quoted.
 *
 *   This REPLACES the "white dims to cream" decision recorded above. That note
 *   stands as history: three disagreeing hover rules had accumulated, one of them
 *   c2 with white text, and cream won on the reasoning that white can only dim.
 *   Mitz has now specified the fill directly, which settles it — and c2 gives the
 *   hover a direction of its own rather than a shade of the resting state.
 */
.bc-pdp-cards li.product form.cart .btn_prod button:hover,
.bc-pdp-cards li.product form.cart .btn_prod .button:hover,
.bc-pdp-cards li.product form.cart .btn_prod button:focus-visible,
.bc-pdp-cards li.product form.cart .btn_prod .button:focus-visible {
	background-color: var(--pdp-c2) !important;
	color: var(--pdp-c4) !important;
}

/*
 * ⚠ `section.wuntety-using-banner` USED TO BE HIDDEN HERE, and the rule is gone
 *   because the section is gone — removed from single-product-combo.php on
 *   2026-09-01, where the reasoning is recorded. Hiding it left the markup on
 *   every combo page and let its `wc_yotpo_show_widget()` call keep running.
 *
 *   Do not re-add a hiding rule if the section reappears: take the section out.
 */

/* ---------------------------------------------------------------------------
 * Kill the theme's custom radio circle on our option labels
 *
 * `style.css` carries, three times over (the footer's duplicate copies):
 *
 *   [type="radio"]:checked + label::before  20×20, 2px #ddd ring
 *   [type="radio"]::checked + label::after  20×20, SOLID BLACK, border-radius 100%
 *
 * Both are `position: absolute; left: 0; top: 0`, and they match ANY label that
 * immediately follows a checked radio — which is exactly the markup here:
 * `<input class="bc-pdp-option__radio"><label class="bc-pdp-option__label">`.
 * Our label is `position: relative`, so they anchored to its top-left corner and
 * painted a black disc straddling the row's left border.
 *
 * It appeared only on the SELECTED row, which is what made it look intentional —
 * it tracked the choice. The design draws no radio mark at all in either the
 * panel or the card; the row itself carries the selected state through its border
 * and ground.
 *
 * This was live in the purchase panel from the moment those rows were built and
 * went unnoticed through every check, for the same reason the transparent gallery
 * did: a pseudo-element is paint, and nothing here was measuring paint.
 *
 * `label`, not `.bc-pdp-option__label`, so the frequency pills are covered too —
 * their labels sit after the same radios. `!important` is belt-and-braces: our
 * selectors already outrank the theme's on specificity, but this stylesheet loses
 * every tie on document order and a stray black disc is not worth the risk.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-option__radio:checked + label::before,
.chuni-beef-banner .summary .bc-pdp-option__radio:checked + label::after,
.bc-pdp-cards li.product .bc-pdp-option__radio:checked + label::before,
.bc-pdp-cards li.product .bc-pdp-option__radio:checked + label::after {
	content: none !important;
}

/* ---------------------------------------------------------------------------
 * ⚠ …AND THE SAME GAP ON THE UNCHECKED SIDE. Third time this stylesheet has been
 *   caught by it — once on the frequency pills, once on the cards, now here.
 *
 *   The theme pairs every one of those rules with `:not(:checked)`:
 *
 *       [type="radio"]:not(:checked) + label:after   20×20 #000, radius 100%,
 *                                                    opacity 0, scale(0), and
 *                                                    `transition: all .2s ease`
 *
 *   Killing only the `:checked` half left that live, so DESELECTING a row handed
 *   its `::after` straight from our rule to the theme's — and the theme's
 *   transition animated the handover. Measured on the One Time row at the moment
 *   Subscribe is chosen:
 *
 *       ours,    while selected    8×8   #C9A98A  left 20px, top 34px
 *       theme's, once deselected  20×20  #000000  left 0,    top 0
 *
 *   So for 200ms an 8px tan dot grew into a 20px black disc, slid up into the
 *   row's top-left corner and faded — and the reverse coming back. That is what
 *   "the radio circle switch looks weird" was: not our indicator misdrawn, but
 *   the theme's animating in behind it.
 *
 * ⚠ `::after` ONLY, and on `.bc-pdp-option__label`, not a bare `label`:
 *
 *   - The unchecked `::before` IS our ring — the 16px #a4866c circle every row
 *     carries in BOTH states — so an `!important` kill wide enough to catch the
 *     theme's unchecked `::before` would take the unselected row's radio outline
 *     with it.
 *   - The pills need no help: they are killed in both states, both pseudos,
 *     further down this file.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-option__radio:not(:checked) + .bc-pdp-option__label::after {
	content: none !important;
	display: none !important;
	transition: none !important;
}
/* ---------------------------------------------------------------------------
 * RESTYLE — the postcode gate in the panel
 *
 * Design `Input state`, panel y=689.6, 668×114: a prompt line, an
 * `Input with Button` 668×48, then a delivery-areas line.
 *
 * ⚠ NOTHING IS RE-RENDERED HERE. The plugin already emits its widget inside the
 *   panel's `form.cart`; the theme just hides it, with
 *   `.sigle-ps .product .wc-delivery-time-response { display: none }` in
 *   style.css (three times over, via the footer's duplicate copies), because it
 *   moved the UI into a `.single-pro-acc` accordion above the title instead.
 *
 *   Unhiding the existing widget is what keeps the page to ONE
 *   `input#pincode_field_id`. Rendering the shortcode a second time produced a
 *   duplicate id on a field the plugin resolves through getElementById.
 *
 * ⚠ Selectors stay on the plugin's OUTERMOST container plus generic descendants,
 *   so a plugin update that rewrites its internals cannot silently unstyle this.
 * ------------------------------------------------------------------------- */

/* Beat `.sigle-ps .product .wc-delivery-time-response` (0,3,0) — this file is
 * document-order earlier than the footer copies, so it needs both the longer
 * selector and the flag. */
.chuni-beef-banner .summary form.cart > .wc-delivery-time-response {
	display: block !important;
	box-sizing: border-box;
	width: 100%;
	margin: 0;
	font-size: var(--pdp-body) !important;
}

/*
 * The design's order inside the panel form: options, prompt, gate, quantity,
 * button, trust. The form is a grid, and grid honours `order`, so the sequence
 * is stated rather than left to DOM order.
 */
.chuni-beef-banner .summary form.cart > .bc-pdp-gate__prompt { order: 2; }
.chuni-beef-banner .summary form.cart > .wc-delivery-time-response { order: 3; }

.chuni-beef-banner .summary .bc-pdp-gate__prompt {
	margin: 8px 0 0 !important;
	color: var(--pdp-c3);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-links);
	font-weight: 600;
	letter-spacing: 0.6px;
	line-height: 20px;
	text-transform: uppercase;
}

/* The field/button pair as one 48px control. */
.chuni-beef-banner .summary form.cart .wc-delivery-time-response .input-block {
	display: flex;
	align-items: center;
	width: 100%;
}

.chuni-beef-banner .summary form.cart .wc-delivery-time-response p.form-row {
	margin: 0 !important;
	padding: 0 !important;
}

.chuni-beef-banner .summary form.cart input#pincode_field_id {
	box-sizing: border-box;
	flex: 1 1 auto;
	width: 100% !important;
	height: 48px !important;
	min-height: 48px;
	margin: 0 !important;
	/*
	 * Design `Input with Button` I33110:107212;33052:256808 — the RENDERED instance,
	 * not the component default, which is a white field with a #cacaca border and a
	 * tan-filled button. The instance overrides all of it.
	 *
	 * Square corners: the joined 8px pill this had was invented. The design draws a
	 * plain rectangle 552 wide, and the button beside it is a SEPARATE 104-wide box
	 * with 12px between them — not a segmented control.
	 */
	padding: 0 12px !important;
	border: 1px solid var(--pdp-c6) !important;
	border-radius: 0 !important;
	background-color: transparent !important;
	/*
	 * ⚠ `background-image: none` REMOVES THE PLUGIN'S PIN ICON — Mitz,
	 *   2026-09-08. The plugin sets it on the input itself:
	 *
	 *     #pincode_field_id.input-text {
	 *       background-image: url(…/phoeniixx_pin_location_ico….png);
	 *       background-position: 5px center;
	 *
	 *   The design draws a plain field with no marker, and this rule already
	 *   set `background-color` without touching the image, so the icon survived
	 *   on the PDP while the category page had been clear of it since
	 *   2026-09-07 — `category-redesign.css` kills it in the equivalent rule.
	 *   Same fix, same reason, now in both places.
	 *
	 *   `!important` to match the rest of this block: the plugin's own rule
	 *   carries `!important` on its neighbours, and the theme's
	 *   `6px 10px 6px 30px` padding existed only to clear this icon — which is
	 *   why the symmetric 12px above is safe once the image is gone.
	 */
	background-image: none !important;
	color: var(--pdp-c5) !important;
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-links) !important;
	line-height: 26px !important;
}

.chuni-beef-banner .summary form.cart input#pincode_field_id::placeholder {
	color: var(--pdp-c5);
	opacity: 1;
}

.chuni-beef-banner .summary form.cart input#pincode_field_id:focus-visible {
	outline: 2px solid var(--pdp-c3);
	outline-offset: -2px;
}

/* The plugin's check control is an <a>, not a button. */
.chuni-beef-banner .summary form.cart .wc-delivery-time-response a.button {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	box-sizing: border-box;
	flex: 0 0 auto;
	height: 48px !important;
	min-height: 48px;
	margin: 0 !important;
	padding: 0 22px !important;
	border: 1px solid var(--pdp-c3) !important;
	border-radius: 0 8px 8px 0 !important;
	background-color: var(--pdp-c3) !important;
	color: var(--pdp-c7) !important;
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-body) !important;
	font-weight: 600;
	line-height: 1;
	text-decoration: none;
	white-space: nowrap;
}

/*
 * This control became OUTLINED in round five, but its hover was left as the old
 * filled c2 with white text — so hovering changed two things at once and landed on
 * a colour the button never wears at rest. It now fills with its own border colour,
 * which is the outlined pattern in the hover system below.
 */
.chuni-beef-banner .summary form.cart .wc-delivery-time-response a.button:hover,
.chuni-beef-banner .summary form.cart .wc-delivery-time-response a.button:focus-visible {
	background-color: var(--pdp-c3) !important;
	border-color: var(--pdp-c3) !important;
	color: var(--pdp-c7) !important;
}

/* Zone copy and the conditions link. */
.chuni-beef-banner .summary form.cart .wc-delivery-time-response p:not(.form-row) {
	margin: 10px 0 0 !important;
	color: var(--pdp-c5);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-links);
	line-height: 20px;
}

.chuni-beef-banner .summary form.cart .wc-delivery-time-response a:not(.button) {
	color: var(--pdp-c3);
	text-decoration: underline;
	text-underline-offset: 2px;
}

/* The confirmed state the plugin swaps in once a postcode validates. */
.chuni-beef-banner .summary form.cart .wc-delivery-time-response #avlpin {
	color: var(--pdp-c4);
}

/* ---------------------------------------------------------------------------
 * REUSE — the vet endorsement block
 *
 * Design: panel y=1913.6, 668×620.7. Title 668×24; the quote inset to x=40 with
 * a 46×40 mark top-left and another bottom-right; then the attribution.
 *
 * ⚠ The design's 668×368.7 photo below the attribution is NOT here — no such
 *   asset exists (see the PHP note). Nothing is faked in its place; the block
 *   simply ends after the attribution.
 * ------------------------------------------------------------------------- */
/*
 * ⚠ NO `border-top`. The last accordion row already carries a `border-bottom`, so
 *   a border here drew a SECOND hairline a few pixels below the first — two lines
 *   stacked between the Reviews row and this section's title. The design has one.
 */
.chuni-beef-banner .summary .bc-pdp-endorsement {
	box-sizing: border-box;
	width: 100%;
	padding: 24px 0 0;
}

.chuni-beef-banner .summary .bc-pdp-endorsement__title {
	margin: 0 !important;
	color: var(--pdp-c3);
	font-family: var(--pdp-font-heading);
	font-size: var(--pdp-h6);
	font-weight: 400;
	letter-spacing: 0.6px;
	line-height: var(--pdp-h6-lh);
	text-transform: uppercase;
}

.chuni-beef-banner .summary .bc-pdp-endorsement__figure {
	margin: 0;
	padding: 0;
}

/*
 * The marks sit at the quote's outer corners — top-left and bottom-right — which
 * is what the design's x=0/y=58 and x=651/y=178 describe. Relative positioning on
 * the blockquote plus 40px of inset gives that without absolute magic numbers.
 */
.chuni-beef-banner .summary .bc-pdp-endorsement__quote {
	position: relative;
	/* Was two `margin` declarations in this block, `0` then `36px 0`; the second
	 * won, so this is the same result stated once. */
	margin: 36px 0;
	padding: 0 40px;
	quotes: none;
}

.chuni-beef-banner .summary .bc-pdp-endorsement__mark {
	position: absolute;
	width: 46px;
	height: 40px;
	opacity: 0.55;
}

.chuni-beef-banner .summary .bc-pdp-endorsement__mark--open {
	top: 0;
	left: 0;
}

.chuni-beef-banner .summary .bc-pdp-endorsement__mark--close {
	right: 0;
	bottom: 0;
}

.chuni-beef-banner .summary .bc-pdp-endorsement__pull {
	margin: 0 0 12px !important;
	color: var(--pdp-c4);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-para);
	font-weight: 600;
	line-height: 26px;
}

.chuni-beef-banner .summary .bc-pdp-endorsement__body {
	margin: 0 !important;
	color: var(--pdp-c5);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-body);
	font-weight: 400;
	line-height: 24px;
}

.chuni-beef-banner .summary .bc-pdp-endorsement__attribution {
	display: flex;
	flex-direction: column;
	gap: 2px;
}

.chuni-beef-banner .summary .bc-pdp-endorsement__name {
	color: var(--pdp-c3);
	font-family: var(--pdp-font-body);
	font-size: 18px;
	font-weight: 600;
	line-height: 22px;
}

.chuni-beef-banner .summary .bc-pdp-endorsement__role {
	color: var(--pdp-c3);
	font-family: var(--pdp-font-body);
	font-size: 14px;
	font-weight: 400;
	line-height: 26px;
	font-style: italic;
}

/* ---------------------------------------------------------------------------
 * REWIRE — the desktop sticky add-to-cart bar
 *
 * Design `STICKY BUTON/DESKTOP` 33145:131121, 1512×86: thumbnail 83×50 and title
 * at the 64px gutter, a 225×54 button ending at 1448 — the same gutter on the
 * right.
 *
 * ⚠ HIDDEN BY DEFAULT, and only assets/js/pdp-sticky.js reveals it. If that file
 *   fails to load the page has no sticky bar, rather than a bar parked over the
 *   content with a dead button. Note this is the OPPOSITE default to the panel
 *   accordion, where the no-JS state has to be readable.
 *
 * ⚠ Desktop only. `min-width: 1000px` matches the rest of this file; the design
 *   has separate mobile treatments that are not built.
 * ------------------------------------------------------------------------- */
.bc-pdp-sticky {
	display: none;
}

/* ⚠ `all`, NOT `min-width: 1000px`, since 2026-09-02: the design has tablet and
 * mobile sticky bars too, and every rule in this block is `.bc-pdp-sticky*` —
 * checked selector by selector before widening it — so nothing else can be
 * caught by the change. The declarations are identical at 1000px and up, so
 * desktop renders exactly as before; the narrow widths simply gain them, and
 * the overrides they need are at the end of this file. */
@media all {
	.bc-pdp-sticky {
		position: fixed;
		right: 0;
		bottom: 0;
		left: 0;
		z-index: 900;   /* above the page, below the postcode modal */
		display: block;
		box-sizing: border-box;
		height: 86px;
		border-top: 1px solid var(--pdp-c6);
		background-color: var(--pdp-c8);
		transform: translateY(100%);
		visibility: hidden;
		pointer-events: none;
		transition: transform 180ms ease, visibility 180ms ease;
	}

	.bc-pdp-sticky.bc-pdp-sticky--visible {
		transform: translateY(0);
		visibility: visible;
		pointer-events: auto;
	}

	.bc-pdp-sticky__inner {
		display: flex;
		align-items: center;
		justify-content: space-between;
		gap: 24px;
		box-sizing: border-box;
		width: 100%;
		/*
		 * ⚠ CONTENT PLUS GUTTERS, NOT CONTENT — QA 2026-09-12, found while chasing
		 *   Mitz's "the button overlaps the padding" at 1163. `STICKY BUTON/DESKTOP`
		 *   33145:131121 is the full 1512 frame with `padding: 16px 64px`, so its
		 *   button ends on the page grid's right edge at x1448. This box is
		 *   border-box with the 64px padding INSIDE it, so `max-width: 1384` gave
		 *   the content 1256 and parked the button 64px short of the grid from
		 *   1512 up (measured: gap 128 at 1512, 332 at 1920 against the page's 64).
		 *   Under 1512 the cap never engaged and the bar already lined up.
		 */
		max-width: calc(var(--pdp-content) + 2 * var(--pdp-gutter));
		height: 100%;
		margin: 0 auto;
		padding: 0 var(--pdp-gutter);
	}

	.bc-pdp-sticky__product {
		display: flex;
		align-items: center;
		gap: 16px;
		min-width: 0;   /* lets the title ellipsis instead of pushing the button */
	}

	/*
	 * Design `88616-11 1` inside `PRODUCT CARD` 33145:131162: a **50-wide** box,
	 * `self-stretch`, `object-cover`, and no radius. This was 83 wide with a 4px
	 * radius — the 83 came from the image's own aspect rather than the design's box.
	 */
	.bc-pdp-sticky__thumb {
		flex: none;
		width: 50px !important;
		height: 50px !important;
		border-radius: 0;
		object-fit: cover;
	}

	/*
	 * ⚠ c1, NOT c4. Node 33145:131165 sets `Color/Color 1` (#a4866c) — a step
	 *   darker than the tan used for panel headings, and darker again than the near
	 *   white this had. On the c8 bar it reads as a label rather than a heading,
	 *   which is what lets the button hold the eye.
	 */
	.bc-pdp-sticky__title {
		overflow: hidden;
		color: var(--pdp-c1);
		font-family: var(--pdp-font-heading);
		font-size: var(--pdp-h6);
		font-weight: 400;
		line-height: 22px;
		text-overflow: ellipsis;
		text-transform: uppercase;
		white-space: nowrap;
	}

	.bc-pdp-sticky__cta {
		display: inline-flex;
		align-items: center;
		justify-content: center;
		box-sizing: border-box;
		flex: none;
		/*
		 * ⚠ SQUARE, and 18px. Node 33145:132963 is `px-24 py-16` with the label in
		 *   `Paragraph/Bold` — Inter Semi Bold 18 — on a c3 ground with no radius.
		 *   This was a 9999px pill at 16px, the last pill left on the page after the
		 *   action row was corrected. Flagged by Mitz from the design screenshot.
		 *
		 *   `width: auto` with real padding rather than a fixed 225: the label is the
		 *   same string as the panel's primary, and the design sizes this button to it.
		 *
		 * The 54px height is unchanged and is not the checkout button spec — py-16 on
		 * an 18px line simply lands there.
		 */
		width: auto;
		min-height: 54px;
		padding: 16px 24px;
		border: 1px solid var(--pdp-c3);
		border-radius: 0;
		background-color: var(--pdp-c3);
		color: var(--pdp-c7);
		font-family: var(--pdp-font-body);
		font-size: var(--pdp-para);
		font-weight: 600;
		line-height: 1;
		text-align: center;
		text-transform: none;
		cursor: pointer;
	}

	/* Hover rule 1: filled buttons darken one step and keep the dark label. */
	/*
	 * ⚠ COLOR 6 AND A WHITE LABEL THAT ACTUALLY APPLIES. Component set
	 *   `Button` 33034:255272 row 1 — `Type=Default` hovers to `#49423f` with
	 *   white. This was `--pdp-c1` `#a4866c`, a "darken one step" that the
	 *   design does not draw.
	 *
	 *   ⚠ And the white was already declared here and was NOT winning:
	 *   measured hover `rgb(164,134,108)` with `rgb(31,31,31)` text, so the
	 *   fill applied and the colour did not. The sticky bar's resting rule
	 *   sets its label colour at a higher specificity, so this needs the same
	 *   reach — hence `!important` on the colour only, rather than raising the
	 *   whole block and disturbing the resting state.
	 */
	.bc-pdp-sticky__cta:hover,
	.bc-pdp-sticky__cta:focus-visible {
		background-color: var(--pdp-c6);
		border-color: var(--pdp-c6);
		color: var(--pdp-c11) !important;
	}
}

@media (prefers-reduced-motion: reduce) {
	.bc-pdp-sticky {
		transition: none;
	}
}

/* ===========================================================================
 * BOX-MODEL RECONCILIATION — desktop
 *
 * Everything above got each block's content and styling right and left its
 * height alone. This pass closes that: 18 parts had never been measured against
 * the design's frame, and together they are why the panel and the cards run
 * taller than the design.
 *
 * Every number below is from the design's own nodes — the panel's `Subscribe`
 * instance 33265:105331 and the card component 33130:121315 — not inferred.
 * ========================================================================= */

/* ── Title: 74 → 48 ──────────────────────────────────────────────────────────
 * The theme draws a 3px gold rule ABOVE and BELOW the title, as two 13px-tall
 * pseudo-elements 120px wide:
 *
 *   .working-dog-butler .summary.entry-summary h1.product_title.entry-title::before
 *   …::after
 *
 * 48 + 13 + 13 = the 74 that was measured. The design has neither: the title is
 * a 668×48 text node at y=34 with the rating row at y=90, which leaves 8px — not
 * 26. Both are removed.
 *
 * Specificity: the theme's selector is five classes plus an element, so this
 * needs six to win outright rather than relying on document order.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .working-dog-butler .summary.entry-summary h1.product_title.entry-title::before,
.chuni-beef-banner .working-dog-butler .summary.entry-summary h1.product_title.entry-title::after {
	content: none !important;
	display: none !important;
}

/* ── Breadcrumb: 68 → 64 ─────────────────────────────────────────────────────
 * Design: the trail is a 20px text node at y=20, and the content grid starts at
 * y=64. So 20 above, 20 of text, 24 below. It was 24/24.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner > nav.woocommerce-breadcrumb {
	padding: 20px 0 24px;
}

/* ── Purchase options: row heights ───────────────────────────────────────────
 * From `Subscribe` 33265:105331, which finally gave the per-row numbers the
 * block total alone could not:
 *
 *   "Purchase Option"   668×26   at y=0
 *   One Time row        668×70   at y=38   content 608×38 inset 16
 *   Subscribe row       668×58   at y=120  content 574×42 inset 8
 *   Frequency panel     668×107.6 at y=182
 *
 * The rows were both 82. Two things drove that, and both are content metrics
 * rather than padding:
 *
 *   · the per-kg line was set at a 20px line box; the design draws it at 14,
 *     which takes the price column from 44 to the design's 38
 *   · "No commitment" was stacked BELOW "One Time Purchase"; the design sets it
 *     beside it, on the same line (x=141 against the title's x=0)
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-options__legend {
	line-height: 26px;
}

/* Design row inset: 16 on the one-time row, 8 on the subscribe row. Different
 * on purpose — the subscribe row carries two lines of content and the one-time
 * row one, and the design keeps both rows' TOTAL heights to 70 and 58. */
.chuni-beef-banner .summary .bc-pdp-option--onetime .bc-pdp-option__label {
	padding: 16px 20px 16px 44px;
}

.chuni-beef-banner .summary .bc-pdp-option--sub .bc-pdp-option__label {
	padding: 8px 20px 8px 44px;
}

/* "No commitment" beside the title, not under it. */
.chuni-beef-banner .summary .bc-pdp-option--onetime .bc-pdp-option__head {
	flex-direction: row;
	align-items: baseline;
	gap: 12px;
}

/* The price column: 24 for the amount, 14 for the per-kg line — 38 total, which
 * is what sets the one-time row's height. */
.chuni-beef-banner .summary .bc-pdp-option__unit {
	font-size: 12px;
	line-height: 14px;
}

/* ── The two purchase-option STATES ─────────────────────────────────────────
 * Mitz, 2026-09-09: unselected is `#F5F2EE` for the label and the price with
 * `#49423F` for the per-kg; selected turns all three `#C9A98A`.
 *
 * Unselected is the base: `__title` and `__price` are already Color 4 in their
 * own rules above, and `__unit` is now Color 6. So only the SELECTED state
 * needs saying, and it needs saying twice because the two rows signal
 * selection differently:
 *
 *   One Time   a real radio      →  `:checked + .bc-pdp-option__label`
 *   Subscribe  no input of its own →  `:has(pill :checked)` on the block
 *
 * ⚠ THE SUBSCRIBE ROW HAS NO RADIO — item 71. Its selection is a frequency
 *   pill being chosen, which is why the second selector reaches in from
 *   `.bc-pdp-options` rather than sitting beside an input. Keyed on the same
 *   `:has()` that already drives its border and the frequency panel, so the
 *   three cannot disagree.
 *
 * ⚠ AND THIS RETIRES AN UNCONDITIONAL TAN. `--sub .bc-pdp-option__title` was
 *   Color 3 whatever the state, so "Subscribe & Save" read as chosen the
 *   moment the page loaded — the row that is NOT selected by default. It is
 *   removed below; the tan now arrives with selection.
 *
 * ⚠ THE SELECTED STATE IS TWO TANS, NOT ONE — resolved 2026-09-09. The first
 *   pass set all three to `#C9A98A` as instructed, and I flagged that the
 *   design distinguishes the label from the figures beside it:
 *
 *       label     `;33265:105304`   #c9a98a   Color 3
 *       price     `;33265:105305`   #a4866c   Color 1
 *       per-kg    `;33265:105306`   #a4866c   Color 1
 *
 *   Mitz: "For price always follow the design." So the label keeps Color 3 and
 *   both figures take Color 1 — one step deeper, which is what stops the price
 *   column competing with the label it belongs to. `__price` and `__unit` move
 *   to the rule below; only the titles stay here.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-option__radio:checked + .bc-pdp-option__label .bc-pdp-option__title,
.chuni-beef-banner .summary .bc-pdp-options:has(.bc-pdp-freq__pill .bc-pdp-option__radio:checked) .bc-pdp-option--sub .bc-pdp-option__title {
	color: var(--pdp-c3);
}

/* ── AND THE PANEL PRICE WAS WHITE ALL ALONG ────────────────────────────────
 *
 * ⚠ `style.css:13768` carries `.wcsatt-options-wrapper * { color: #fff }`, and
 *   `wc_price()` nests the digits two levels down:
 *
 *     span.bc-pdp-option__price  <- what we style
 *       span.woocommerce-Price-amount   <- what the `*` paints
 *         bdi
 *           span.woocommerce-Price-currencySymbol
 *
 *   Specificity is only ever compared between rules matching THE SAME element,
 *   and nothing of ours matched the inner spans — so `#fff` won there
 *   uncontested no matter how high our selector scored. Measured white in every
 *   state. It went unnoticed because the unselected colour is `#f5f2ee`, which
 *   is white to the eye; the tan is what made it visible.
 *
 *   `color: inherit` rather than a literal, so both states keep flowing from
 *   `__price` and this never has to be kept in step with the rules above.
 *
 * ⚠ The card build fixed exactly this at `.bc-pdp-cards` (see the block near
 *   the end of this file) and the panel was missed — the same oversight in the
 *   same component twice. If a price ever reads white again, this is why.
 *
 * ⚠ AND A PROBE LESSON: three verification runs called these colours "ok"
 *   because they read `getComputedStyle` on `.bc-pdp-option__price` — the
 *   element we style, not the element that paints the glyphs. Read the deepest
 *   text-bearing node, or read the pixels.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-option__price .woocommerce-Price-amount,
.chuni-beef-banner .summary .bc-pdp-option__price bdi,
.chuni-beef-banner .summary .bc-pdp-option__price .woocommerce-Price-currencySymbol {
	color: inherit;
	font-size: inherit;
	font-weight: inherit;
}

/* The figures: Color 1, the deeper tan. 4.87:1 on the panel's #1f1f1f ground at
 * 16px Semi Bold — measured — so the price clears AA on the row a shopper is
 * acting on. */
.chuni-beef-banner .summary .bc-pdp-option__radio:checked + .bc-pdp-option__label .bc-pdp-option__price,
.chuni-beef-banner .summary .bc-pdp-option__radio:checked + .bc-pdp-option__label .bc-pdp-option__unit,
.chuni-beef-banner .summary .bc-pdp-options:has(.bc-pdp-freq__pill .bc-pdp-option__radio:checked) .bc-pdp-option--sub .bc-pdp-option__unit {
	color: var(--pdp-c1);
}

.chuni-beef-banner .summary .bc-pdp-option__price {
	line-height: 24px;
}

/* The savings line is a 16px box in the design, which with the 26px title row
 * makes the subscribe row's 42 of content. */
.chuni-beef-banner .summary .bc-pdp-option__note--save {
	line-height: 16px;
}

.chuni-beef-banner .summary .bc-pdp-option__title {
	line-height: 26px;
}

/* ── The radio mark the design DOES draw in the panel ────────────────────────
 * A correction. The card component has `_Radio button` hidden, so the card rows
 * legitimately show no mark — and that was generalised to the panel, where the
 * design has it VISIBLE at 16×16: x=16 on both rows, vertically centred.
 *
 * Killing the theme's black `label::after` disc earlier removed the wrong thing
 * and left nothing in its place. This draws the design's control instead, from
 * the label, so the input stays clipped and keyboard focus keeps landing where
 * the existing focus style expects it.
 *
 * `content` needs `!important` because the rule being overridden — the theme's
 * `[type="radio"]:checked + label::before/::after` — is neutralised with
 * `content: none !important` further up this file.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-option__label::before {
	content: "" !important;
	position: absolute;
	top: 50%;
	left: 16px;
	box-sizing: border-box;
	width: 16px;
	height: 16px;
	margin: 0;
	transform: translateY(-50%);
	/* Tan, not grey: sampled at #a4866c on the export, 16px across, both states. */
	border: 1px solid var(--pdp-c1);
	border-radius: 50%;
	background: transparent;
}

.chuni-beef-banner .summary .bc-pdp-option__radio:checked + .bc-pdp-option__label::before {
	border-color: var(--pdp-c3);
}

.chuni-beef-banner .summary .bc-pdp-option__radio:checked + .bc-pdp-option__label::after {
	content: "" !important;
	position: absolute;
	top: 50%;
	left: 20px;
	box-sizing: border-box;
	width: 8px;
	height: 8px;
	margin: 0;
	transform: translateY(-50%);
	border: 0;
	border-radius: 50%;
	background-color: var(--pdp-c3);
}

/* ── Card One Time row: 38 → 42 ──────────────────────────────────────────────
 * Card component 33130:121315: the row is 42, its price a 26px box at an 8px
 * inset. The build had a 9px inset and a 18px price box.
 * ------------------------------------------------------------------------- */
.bc-pdp-cards li.product .bc-pdp-option__label {
	padding: 8px 12px;
}

.bc-pdp-cards li.product .bc-pdp-option__price {
	line-height: 26px;
}

/* ── Two follow-ups from measuring the pass above ────────────────────────────
 *
 * 1. THE RING WAS NOT RENDERING, and the reason is a specificity arithmetic
 *    slip worth recording. The rule that kills the theme's black disc is
 *
 *      .chuni-beef-banner .summary .bc-pdp-option__radio:checked + label::before
 *
 *    which is (0,4,2) — three classes plus `:checked`, then `label` and the
 *    pseudo-element. The ring was written as
 *
 *      .chuni-beef-banner .summary .bc-pdp-option__label::before        (0,3,1)
 *
 *    so on the CHECKED row — the only row that matters, since that is where the
 *    theme's disc lived — the kill rule won and the ring vanished. The dot
 *    survived only because it happened to be written with the radio in the
 *    selector, at (0,5,1). Both `!important` cancel out; specificity decided it.
 *
 *    Stating the checked case explicitly at (0,5,1) settles it.
 *
 * 2. Rows still measured 74 and 64 against 70 and 58, because the height is the
 *    sum of several content metrics (title box, note box, price box, per-kg box,
 *    column gaps) and chasing each one is fragile. The design STATES the row
 *    heights, so they are stated here too and the content is centred inside
 *    them. `min-height`, not `height`: a longer product's figures should push
 *    the row rather than overflow it.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-option__radio:checked + .bc-pdp-option__label::before {
	content: "" !important;
	border-color: var(--pdp-c3);
}

.chuni-beef-banner .summary .bc-pdp-option--onetime .bc-pdp-option__label {
	align-items: center;
	min-height: 70px;
	padding: 8px 20px 8px 44px;
}

.chuni-beef-banner .summary .bc-pdp-option--sub .bc-pdp-option__label {
	align-items: center;
	min-height: 58px;
	padding: 8px 20px 8px 44px;
}

/*
 * ⚠ 8 ON ALL FOUR SIDES, WHICH IS WHAT THE COMPONENT SAYS. Node 33130:114934
 *   is `p-[8px]`, and this had drifted to `6px 12px` across three successive
 *   passes at this same selector (12 → 8px 12px → 6px 12px), each one fixing a
 *   height and none of them looking at the horizontal value again.
 *
 *   The 42 is unchanged and now falls out of the design's own arithmetic rather
 *   than being asserted: the label is 12/14 and the price 14/26, so the tallest
 *   child is 26, and 26 + 8 + 8 = 42.
 */
.bc-pdp-cards li.product .bc-pdp-option__label {
	align-items: center;
	min-height: 42px;
	padding: 8px;
}

/* ── Subscribe row: the last 6px ─────────────────────────────────────────────
 * The row held at 64 against the design's 58 on every product that HAS a
 * savings line — gifts, which has none, already sat at 58. So the excess was
 * inside the head: the design stacks a 26px title row over a 16px savings line
 * with no gap between them (y=0 and y=26), and the "Best Value" badge is an 18px
 * box sitting INSIDE that 26px row rather than setting its own height.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-option--sub .bc-pdp-option__head {
	gap: 0;
}

.chuni-beef-banner .summary .bc-pdp-option__badge {
	padding-top: 0;
	padding-bottom: 0;
	font-size: 11px;
	line-height: 18px;
}

/* ── The design's four panel dividers ────────────────────────────────────────
 * `devider` nodes at panel y=138, 328, 665.6 and 827.6, each with 24px of
 * clearance either side. None had been authored — the panel ran as one
 * undivided column.
 *
 * They are drawn as borders on the block that FOLLOWS each rule rather than as
 * empty elements, so a block that is not built (the benefit bullets) cannot
 * leave a stray rule behind.
 *
 * ⚠ Two of these sit on grid children of `form.cart`, whose `row-gap` is 16.
 *   `margin-top: 8px` brings the space above the rule to the design's 24 without
 *   fighting the gap; `.bc-pdp-calc` is outside the form and in normal flow, so
 *   it takes the full 24 as margin.
 * ------------------------------------------------------------------------- */

/* y=138 — after the title / rating block. */
/*
 * ⚠ THE RULE MOVED OFF THIS ELEMENT. The comment above reads "y=138 — after the
 *   title / rating block", and that was the right intent on the wrong node:
 *   `.bc-pdp-calc` comes AFTER `ul.bc-pdp-benefits` in the summary, so a border on
 *   its top drew BELOW the bullets. `PDP-with-sticky.png` puts the rule between
 *   the rating block and the bullets, with no rule between the bullets and the
 *   calculator line. It is now on the bullets list — see the end of this file.
 */
.chuni-beef-banner .summary .bc-pdp-calc {
	margin-top: 12px !important;
}

/* y=328 — before the purchase options. */
.chuni-beef-banner .summary form.cart > .wcsatt-options-wrapper {
	margin-top: 24px;
	padding-top: 24px;
	border-top: 1px solid var(--pdp-rule);
}

/* y=665.6 — before the postcode gate. */
.chuni-beef-banner .summary form.cart > .bc-pdp-gate__prompt {
	margin-top: 0px !important;
	padding-top: 24px;
	border-top: 1px solid var(--pdp-c8);
}

/* y=827.6 — after the gate, before the quantity row. Drawn on the widget's
 * underside because the quantity sits in column 1 of the grid, so a border on it
 * would stop short of the panel's width. */
/*
 * ⚠ THE RULE MOVED OFF THIS ELEMENT TOO. The response widget is grid order 3 and
 *   the "View delivery areas & schedule" link is order 4, so a border on the
 *   widget's underside drew ABOVE the link. The design puts it BELOW: link, then
 *   rule, then the quantity row.
 *
 *   The original reasoning for putting it here still holds and is why it did not
 *   simply move to `.quantity` — that sits in column 1 of the grid, so a border on
 *   it stops short of the panel width. The areas link is `grid-column: 1 / -1`,
 *   measured, so it spans the full 668. See the end of this file.
 */


/* ── The card gutter: 10 → 16, and the 4px it was costing each card ──────────
 * Design: cards at x=0/350/700/1050 in the 1384 grid — 334 wide, 16 gutter.
 * assets/js/pdp-cards.js re-initialises the carousel with `margin: 16`; this is
 * the other half of the fix.
 *
 * Owl applies its margin to EVERY slide, including the last, so the track has to
 * be wider than the grid for four 334s to fit inside 1384 — the design has no
 * trailing gutter, only the three between the cards. The trailing margin then
 * falls outside the page grid, where `.owl-stage-outer`'s overflow clips it.
 *
 * ⚠ The overshoot is +4, not +16, and it was measured rather than derived. Owl
 *   does NOT simply subtract the margin from `width / items`: at a 1400 track it
 *   produced 337-wide items, not 334, so the cards overran the grid by 12. +4
 *   lands them on 334 with the row spanning 0…1384. Re-measure if Owl is ever
 *   upgraded — this depends on its internal arithmetic, not on a spec.
 * ------------------------------------------------------------------------- */
@media (min-width: 1000px) {
	.bc-pdp-cards-section .bc-pdp-cards {
		width: calc(100% + 4px);
	}
}

/* ── The design's meta row: rating + stock on one line ───────────────────────
 * Design `Container` panel y=90, 668×24 — stars at x=0, review link at x=86,
 * "In stock" at x=257. assets/js/pdp-meta.js gathers the two existing nodes into
 * the mount; this lays them out.
 *
 * The mount is INVISIBLE until the script marks it ready, so a failed script
 * leaves the rating and stock where the templates put them rather than opening a
 * gap in the panel.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-meta {
	display: none;
}

.chuni-beef-banner .summary .bc-pdp-meta.bc-pdp-meta--ready {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px;
	min-height: 24px;
}

/* Both children arrive with their own block-level margins from elsewhere. */
.chuni-beef-banner .summary .bc-pdp-meta > * {
	margin: 0 !important;
}

/*
 * Yotpo's bottomline sizes itself; left-aligned and allowed its own height
 * rather than forced to the design's 24, since its internals are not ours to
 * set — the same H7 constraint as the reviews accordion row.
 */
.chuni-beef-banner .summary .bc-pdp-meta .yotpo.bottomLine {
	display: flex;
	align-items: center;
	text-align: left;
}

/* The stock pill loses its full-width block behaviour on this row. */
.chuni-beef-banner .summary .bc-pdp-meta .bc-pdp-stock {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	width: auto;
	white-space: nowrap;
}

/*
 * The divider that was on `.bc-pdp-calc` now needs its spacing measured from the
 * meta row rather than from the stock line it used to follow.
 */
.chuni-beef-banner .summary .bc-pdp-meta.bc-pdp-meta--ready + .bc-pdp-calc {
	margin-top: 24px !important;
}

/*
 * Gifts renders a SECOND add-to-cart form, so `wc_get_stock_html()` fires twice
 * and leaves a duplicate stock line after the first is moved into the meta row.
 *
 * Handled in assets/js/pdp-meta.js, not here. A sibling selector was tried first
 * and did not match: the duplicate is nested INSIDE that second form rather than
 * being a sibling of the mount. The script already knows which node it moved, so
 * it is the right place to hide the rest — and it only does so once the move has
 * actually succeeded, which no CSS rule can know.
 */

/* ── Two contrast defects found by sweeping computed colour against ground ────
 *
 * 1. YOTPO'S REVIEW COUNT WAS INVISIBLE ON EVERY CARD. Its card variant renders
 *    the count in `rgb(44, 44, 44)`, which against the card's `#322b27` ground is
 *    a contrast ratio of **1.00** — present, laid out, and unreadable. The panel's
 *    variant renders white and was fine, which is why nothing caught this until
 *    colour was measured against the computed ground rather than eyeballed.
 *
 * 2. "CHECK POSTCODE" WAS BLACK ON BLACK. `a#checkpin` carries an ID-level rule
 *    with `!important`, so the earlier class-based selector set the text colour
 *    and lost the background — leaving `rgb(31, 31, 31)` on `rgb(0, 0, 0)`, a
 *    ratio of 1.16. Both `!important`, so specificity decided it: an ID beats any
 *    number of classes. Naming the id is the only way to win.
 * ------------------------------------------------------------------------- */
.bc-pdp-cards li.product [class*="bottom-line-text"],
.bc-pdp-cards li.product .yotpo-sr-bottom-line-text,
.bc-pdp-cards li.product .yotpo-sr-bottom-line-summary {
	color: var(--pdp-c5) !important;
}

/*
 * ⚠ THREE IDs, and they are all load-bearing. The rule being beaten is
 *
 *     div#my_custom_checkout_field2 p#pincode_field_idp a#checkpin
 *       { background: #000 !important }
 *
 *   in style.css — specificity (3,0,1). A first attempt used
 *   `.chuni-beef-banner .summary a#checkpin`, which is (1,2,1): one ID plus two
 *   classes loses to three IDs no matter how many classes are added, and both
 *   carry `!important`, so there is no tie for document order to settle. The only
 *   way to win is to name the same ancestor ids.
 *
 *   The result was black text on a black ground — ratio 1.16 — because the colour
 *   half of the earlier rule DID apply while the background half did not.
 */
/*
 * ⚠ OUTLINED, NOT FILLED. Sampling the export at the control's edge gives a tan
 *   border (#c9a98a) around a #1f1f1f interior, and the Figma instance confirms it:
 *   transparent ground, tan border, tan label. This was drawn tan-FILLED with dark
 *   text, which made it compete with the add-to-cart button directly below it —
 *   two solid tan blocks, one of which is not the primary action.
 *
 *   The component DEFAULT in Figma is indeed a filled tan button reading "Primary
 *   Button", which is probably where the fill came from. The instance overrides it.
 */
.chuni-beef-banner .summary div#my_custom_checkout_field2 p#pincode_field_idp a#checkpin {
	background: var(--pdp-c8) !important;
	border: 1px solid var(--pdp-c3) !important;
	color: var(--pdp-c3) !important;
}

/*
 * Hover fills it — and fills it WHITE, with the label left alone.
 *
 * ⚠ Mitz, 2026-09-09: "for Postcode Check button when its hovered dont change
 *   the text color and button background is #fff." This used to invert the
 *   button: tan fill, dark label. It now keeps the resting `--pdp-c3` label and
 *   only the ground moves, so the only thing that changes on hover is the fill.
 *
 * ⚠ APPLIED AS ASKED AND FLAGGED: `#c9a98a` on `#ffffff` measures **2.20:1**,
 *   against the 4.5 an 18px 600 label needs (it is under the 18.66px bold
 *   threshold for large text, so the higher bar applies). The label is legible
 *   at rest — tan on the dark panel is 6.31:1 — and only the hovered state is
 *   short, which is a pointer-only state on a control the customer has already
 *   found. Same handling as U2 and U8: the instruction is followed, the number
 *   is recorded. `--pdp-c11` is this file's own token for `#ffffff`.
 *
 * ⚠ `border-color` is restated rather than dropped: the resting rule sets the
 *   whole `border` shorthand with `!important`, and leaving the hover without a
 *   colour would keep the tan edge on a white ground — the button would read as
 *   a tan outline round white rather than a filled button.
 */
.chuni-beef-banner .summary div#my_custom_checkout_field2 p#pincode_field_idp a#checkpin:hover,
.chuni-beef-banner .summary div#my_custom_checkout_field2 p#pincode_field_idp a#checkpin:focus-visible {
	background: var(--pdp-c11) !important;
	border-color: var(--pdp-c11) !important;
	color: var(--pdp-c3) !important;
}

/* ── The out-of-stock card variant ───────────────────────────────────────────
 * Found by the contrast sweep on gifts, which is the only category here with
 * sold-out products. The theme renders a COMPLETELY DIFFERENT card for them —
 * `.oostemplate` with `.btn-ofs` instead of the standard `li.product` structure
 * — and none of the card styling above reaches it. Every text node in it measured
 * **1.36** against the dark card ground: title, both prices, and the badge.
 *
 * This restores legibility. It does NOT make the variant match the design: it has
 * no purchase options and no add-to-cart, which is correct for a sold-out product
 * but means those cards read differently from the four the design draws. Flagged
 * rather than reshaped, because what a sold-out card should look like is not in
 * the design.
 * ------------------------------------------------------------------------- */
.bc-pdp-cards li.product .oostemplate,
.bc-pdp-cards li.product .oostemplate a,
.bc-pdp-cards li.product .oostemplate p,
.bc-pdp-cards li.product .oostemplate span,
.bc-pdp-cards li.product .oostemplate .woocommerce-Price-amount,
.bc-pdp-cards li.product .oostemplate bdi {
	color: var(--pdp-c4) !important;
}

/* The struck-through original price stays secondary rather than matching the
 * current one — it is the less important of the two figures. */
.bc-pdp-cards li.product .oostemplate del,
.bc-pdp-cards li.product .oostemplate del .woocommerce-Price-amount,
.bc-pdp-cards li.product .oostemplate del bdi {
	color: var(--pdp-c5) !important;
}

/* ── "Out of stock" takes the design's DISABLED button ───────────────────────
 *
 * Mitz, 2026-09-09: "The Out of Stock Button should be 4th row button design",
 * pointing at `Button` 33034:255272 — the same component set as item 337.
 *
 * ⚠ THE VALUES ARE SAMPLED FROM THE SET'S RENDER, NOT READ FROM THE NODE. The
 *   Figma connector is unauthenticated this session, so the export captured on
 *   2026-09-08 was sampled instead. That is trustworthy here because row 1
 *   CALIBRATES it: sampling returns `#c9a98a` and `#49423f` for its two cells,
 *   which is exactly what item 337 read from the node itself. Same method as
 *   `--pdp-rule`, and recorded so it can be re-read when the connector is back.
 *
 *   Row 4, left to right:
 *
 *     cell 1   fill #f9f6f3, border + label #8a6e57   ghost HOVER (pairs with
 *                                                     row 3 cell 3's tan ghost)
 *     cell 2   fill #c4b9b0, label ~#999999           disabled, FILLED
 *     cell 3   transparent, border + label #c4b9b0    disabled, OUTLINE
 *
 * ⚠ CELL 3 IS THE ONE, and the choice is reasoned rather than assumed. "Out of
 *   stock" is a disabled control, which rules out cell 1 — that is a ghost
 *   button's hover, an active state. Between the two disabled cells, cell 3 is
 *   the outline variant, which is the same KIND of control as what was already
 *   built here, so only the colours change. And cell 2 would be a defect on this
 *   card: a light `#c4b9b0` block on the dark ground, carrying a `#999999` label
 *   at about **2.2:1** — the design draws it for a light page, and it does not
 *   survive being moved onto `#322b27`. Cell 3's `#c4b9b0` on that ground
 *   measures **7.3:1**.
 *
 * ⚠ SQUARE CORNERS, and the 9999px pill this carried was ours. Measured off the
 *   render: the left edge of row 1 cell 1 is dead straight from its very first
 *   scan line, so the radius is 0 — consistent with the sharp corners the
 *   purchase panel's own boxes were already sampled at.
 *
 * Padding and type follow the set: 12/24 and Inter Semi Bold 18, per item 337.
 * ------------------------------------------------------------------------- */
/*
 * ⚠ THE SAME WIDTH AS ADD ITEM — Mitz, 2026-09-09: "for Out of stock button make
 *   the width the same on Add Item button." It was `inline-flex`, so it hugged
 *   its label at **156** against Add item's **304**, and two cards in the same
 *   row read as different components.
 *
 * ⚠ `width: 100%` ALONE OVERSHOOTS, which is the part worth recording. That gave
 *   328 — the full card body — because Add item's 304 is not its own width at
 *   all: it is `width: 100%` inside `.btn_prod`, which carries
 *   `padding: 0 12px` (see `form.cart .btn_prod` above). This button has no such
 *   wrapper, so the card's 12px gutter has to be stated here instead. Measured
 *   both before and after rather than assumed: 328 → 304, left edge +12 from the
 *   body on both buttons.
 *
 *   That 12px is the card's inner rhythm, shared by the title, the blurb, the
 *   loop price and the option rows.
 */
.bc-pdp-cards li.product .btn-ofs {
	display: flex;
	width: calc(100% - 24px);
	margin: 0 12px;
	align-items: center;
	justify-content: center;
	box-sizing: border-box;
	min-height: 46px;
	padding: 12px 24px;
	border: 1px solid var(--pdp-c12);
	border-radius: 0;
	background-color: transparent;
	color: var(--pdp-c12) !important;
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-para);
	font-weight: 600;
	line-height: 22px;
	text-transform: none;
	/* Disabled means disabled: it is not a control, so it must not offer a
	 * pointer. The element is a bare <button> with no handler, so this is the
	 * only thing telling a visitor that. */
	cursor: default;
}

/*
 * `.oosreview` wraps another Yotpo bottom line (woocommerce/single-product/stock.php:29).
 * Its text content is the widget's own inline script, which is why the sweep
 * flagged it — nothing visible, but its colour is set for when Yotpo fills it.
 */
.bc-pdp-cards li.product .oosreview,
.bc-pdp-cards li.product .oosreview * {
	color: var(--pdp-c5) !important;
}

/*
 * Prices on the out-of-stock card sit OUTSIDE `.oostemplate`, so the block above
 * did not reach them — they measured 1.36 against the card ground. Colour is
 * asserted on every price in a card rather than on that one variant's structure,
 * which is the thing that keeps changing.
 *
 * `!important` because the earlier `:not(:has(.bc-pdp-option)) .price` rule was
 * written without it and lost to a longer theme selector.
 */
.bc-pdp-cards li.product .woocommerce-Price-amount,
.bc-pdp-cards li.product .woocommerce-Price-amount bdi,
.bc-pdp-cards li.product ins,
.bc-pdp-cards li.product ins .woocommerce-Price-amount {
	color: var(--pdp-c4) !important;
}

.bc-pdp-cards li.product del,
.bc-pdp-cards li.product del .woocommerce-Price-amount,
.bc-pdp-cards li.product del bdi {
	color: var(--pdp-c5) !important;
}

/* ── Section headings: NorthwestTextured (Mitz, 2026-08-28) ──────────────────
 * The panel's product title was already confirmed as H2/Textured; whether the
 * SECTION headings shared that treatment was not readable from the design data,
 * so they were left on NorthwestRegular and flagged. Ruling: use Textured.
 *
 * Applied to the three section headings only:
 *   PRODUCT DETAILS · YOU MAY ALSO LIKE · FORMULATED BY NUTRITIONISTS…
 *
 * ⚠ Deliberately NOT applied to product names — the card titles and the sticky
 *   bar's title. Those are content, not section furniture, and Textured is a
 *   distressed display face that costs legibility at 20px on a long product
 *   name. Say the word if you want those too.
 *
 * ⚠ NorthwestTextured is a SEPARATE FAMILY, not a style of NorthwestRegular —
 *   see the note on the tokens. Naming a weight or style would not reach it.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-details__heading,
h2.bc-pdp-cards__heading,
.chuni-beef-banner .summary .bc-pdp-endorsement__title {
	font-family: var(--pdp-font-textured);
}

/* The sticky bar's cloned rating — display only, so it must not look clickable. */
/* ⚠ `all`, NOT `min-width: 1000px`, since 2026-09-02: the design has tablet and
 * mobile sticky bars too, and every rule in this block is `.bc-pdp-sticky*` —
 * checked selector by selector before widening it — so nothing else can be
 * caught by the change. The declarations are identical at 1000px and up, so
 * desktop renders exactly as before; the narrow widths simply gain them, and
 * the overrides they need are at the end of this file. */
@media all {
	.bc-pdp-sticky__rating {
		display: inline-flex;
		align-items: center;
		flex: none;
		pointer-events: none;
	}

	.bc-pdp-sticky__rating:empty {
		display: none;
	}

	.bc-pdp-sticky__rating [class*="bottom-line-text"],
	.bc-pdp-sticky__rating button {
		color: var(--pdp-c5) !important;
		cursor: default !important;
	}
}

/* ── The gate's "Check & Add to Cart" trigger ────────────────────────────────
 * Stands in for the real submit until a postcode validates, so it has to look
 * exactly like the button it replaces — otherwise the panel visibly changes
 * shape when the gate clears.
 *
 * Matches the primary button's geometry: full width of its grid cell, 70 tall,
 * the same pill and the same tan. `order: 5` puts it where the real submit sits.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary form.cart > .bc-pdp-gate-cta,
.chuni-beef-banner .working-dog-butler form.cart > .bc-pdp-gate-cta {
	order: 5;

	/*
	 * Column 2, beside the quantity stepper — the same cell the real submit
	 * takes. Without this it inherited the form's `grid-column: 1 / -1` and
	 * rendered 668 wide against the submit's 541, so the button visibly jumped
	 * 127px when the gate cleared. The design shows the gated CTA on the same row
	 * as the quantity, not spanning it.
	 */
	grid-column: 2;

	display: inline-flex;
	align-items: center;
	justify-content: center;
	box-sizing: border-box;
	width: 100% !important;
	max-width: none !important;
	min-height: 70px;
	margin: 0 !important;
	padding: 12px 24px !important;
	background-color: var(--pdp-c3) !important;
	border: 1px solid var(--pdp-c3) !important;
	border-radius: 9999px !important;
	color: var(--pdp-c7) !important;
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-para) !important;
	font-weight: 600;
	line-height: 1;
	text-align: center;
	text-transform: none;
	cursor: pointer;
}

/*
 * ⚠ COLOR 6 ON HOVER, NOT COLOR 2. Component set `Button` 33034:255272,
 *   row 1: `Type=Default` goes `#c9a98a`/`#1f1f1f` → **`#49423f`/white**.
 *   This was `--pdp-c2` `#8a6e57`, which is a real design colour but the wrong
 *   one — it is the RESTING fill of `Type=With Subheadline` in row 3, not a
 *   hover state at all. Measured before: `rgb(138,110,87)` with white.
 */
.chuni-beef-banner .summary form.cart > .bc-pdp-gate-cta:hover,
.chuni-beef-banner .summary form.cart > .bc-pdp-gate-cta:focus-visible {
	background-color: var(--pdp-c6) !important;
	border-color: var(--pdp-c6) !important;
	color: var(--pdp-c11) !important;
}

/* ===========================================================================
 * BUILD — panel additions the design adds from nothing
 * ========================================================================= */

/* ── Vet endorsement line (design y=0, 668×26) ─────────────────────────────── */
.chuni-beef-banner .summary .bc-pdp-endorse {
	display: flex;
	align-items: center;
	gap: 8px;
	margin: 0 0 8px !important;
	color: var(--pdp-c5);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-links);
	font-weight: 400;
	line-height: 26px;
}

/* ── The row is a button now, and must not look like one ────────────────────
 * ⚠ Mitz, QA 2026-09-25: the row jumps to the endorsement, so it is a
 *   `<button>`. Everything here exists to give that button back the exact box
 *   the `<p>` had — measured before the change: flex, centre-aligned, 8px gap,
 *   Color 5, Inter 14/400 on a 26px line, no padding, no border.
 *
 * ⚠ THE THEME'S OWN BUTTON RULES ARE THE REASON THIS IS LONG. `style.css` styles
 *   the bare `button` element and its `:hover` — that hover has reached four
 *   controls in this build already (LOAD MORE, both toolbar controls, the
 *   delivery-areas trigger), each time turning them `#826852`. A hover rule has
 *   to be answered by a hover rule, so one is written here rather than waiting
 *   for the fifth.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-endorse__jump {
	display: flex;
	align-items: center;
	gap: 8px;
	width: auto;
	height: auto;
	min-height: 0;
	margin: 0;
	padding: 0;
	border: 0;
	border-radius: 0;
	background: none;
	box-shadow: none;
	color: inherit;
	font: inherit;
	line-height: inherit;
	letter-spacing: inherit;
	text-align: left;
	text-transform: none;
	cursor: pointer;
	-webkit-appearance: none;
	appearance: none;
}

.chuni-beef-banner .summary .bc-pdp-endorse__jump:hover,
.chuni-beef-banner .summary .bc-pdp-endorse__jump:focus,
.chuni-beef-banner .summary .bc-pdp-endorse__jump:focus-visible {
	background: none;
	border: 0;
	box-shadow: none;
	color: inherit;
}

/* The only thing that changes on hover is the affordance: the sentence
 * underlines in the tan the rest of the page uses for links. */
.chuni-beef-banner .summary .bc-pdp-endorse__jump:hover .bc-pdp-endorse__text,
.chuni-beef-banner .summary .bc-pdp-endorse__jump:focus-visible .bc-pdp-endorse__text {
	text-decoration: underline;
	text-decoration-color: var(--pdp-c3);
	text-underline-offset: 3px;
}

.chuni-beef-banner .summary .bc-pdp-endorse__jump:focus-visible {
	outline: 2px solid var(--pdp-c3);
	outline-offset: 3px;
}

.chuni-beef-banner .summary .bc-pdp-endorse strong {
	color: var(--pdp-c4);
	font-weight: 600;
}

/*
 * The design's check-badge icon, drawn rather than shipped as a file. A 16×16
 * asset would be one more request and one more thing to lose in a deploy, and a
 * two-rule tick reads identically at this size.
 */
/*
 * Mitz supplied the artwork 2026-08-28. It replaces a CSS approximation — a tan
 * disc with a border-drawn tick — which was standing in for the design's
 * `heroicons-solid/check-badge`. The file is 16×16, exactly the node's size, so
 * the box and the 8px gap that put the text at x=24 are unchanged.
 *
 * The ::after that drew the tick is gone with it; leaving it would paint a second
 * mark on top of the image.
 */
.chuni-beef-banner .summary .bc-pdp-endorse__badge {
	flex: none;
	width: 16px;
	height: 16px;
	background-image: url("../pdp/check-badge.png");
	background-repeat: no-repeat;
	background-position: center;
	background-size: 16px 16px;
}

/* ── Benefit bullets (design y=162, four 26px rows) ────────────────────────── */
.chuni-beef-banner .summary .bc-pdp-benefits {
	padding: 0 !important;
	list-style: none !important;
}

.chuni-beef-banner .summary .bc-pdp-benefits__item {
	position: relative;
	margin: 0 !important;
	padding: 0 0 0 20px;
	color: var(--pdp-c4);
	/*
	 * Special Elite — `Frame 1261154921`, rendered. Flagged by Mitz 2026-08-28.
	 * Measured off the export at 14px: the longest bullet runs 280px of glyphs for
	 * 35 characters, and the 26px line is unchanged so the block stays at the
	 * design's 104.
	 */
	font-family: var(--pdp-font-decoration);
	font-size: var(--pdp-links);
	font-weight: 400;
	line-height: 26px;
	list-style: none !important;
}

.bc-pdp-calc__label{
	font-family: var(--pdp-font-decoration) !important;
}

/*
 * Mitz's artwork, 2026-08-28, replacing a border-drawn tick that stood in for the
 * design's `heroicons-micro/check`. 12×12 — the node's size — and `top: 7px`
 * centres it on the 26px row, which is also the y the design gives it.
 *
 * No `transform` and no borders now: both belonged to the drawn tick and would
 * rotate and outline the image instead.
 */
.chuni-beef-banner .summary .bc-pdp-benefits__item::before {
	content: "";
	position: absolute;
	top: 7px;
	left: 0;
	width: 12px;
	height: 12px;
	background-image: url("../pdp/check-benefit.png");
	background-repeat: no-repeat;
	background-position: center;
	background-size: 12px 12px;
}

/* ── Shipping trust row (design y=945.6, 668×40) ───────────────────────────── */
.chuni-beef-banner .summary .bc-pdp-shipping {
	display: flex;
	align-items: center;
	gap: 12px;
	box-sizing: border-box;
	padding: 8px 12px;
	/*
	 * ⚠ NO BORDER AND NO RADIUS. Mitz, 2026-09-09: "for those 2 remove border
	 *   radius, border and hover color border change." Both bars had
	 *   `1px solid var(--pdp-c6)` on a `6px` radius; the `--pdp-c8` fill is what
	 *   delineates them now, which is enough at 668 wide. The matching change is
	 *   on the refund row and on the shared hover rule further down this file.
	 */
	border: 0;
	border-radius: 0;
	background-color: var(--pdp-c8);
	color: var(--pdp-c5);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-links);
	line-height: 20px;
	margin-top: 12px;
}

.chuni-beef-banner .summary .bc-pdp-shipping strong {
	color: var(--pdp-c3);
	font-weight: 600;
}

/* A delivery-truck suggestion rather than a literal one: two stacked bars read
 * as a vehicle at 24px without shipping an icon file. */
/*
 * Mitz's artwork, 2026-08-28 — the Australia outline with a tick. It replaces a
 * CSS stand-in (a rounded square with three bars) that was never what the design
 * shows: `Frame 1261154917` places a 24×24 image here, and a generic box was the
 * placeholder for it.
 *
 * 24×24 keeps the row's geometry: 12px padding + 24 icon + 12 gap puts the text at
 * x=48, which is the design's.
 */
.chuni-beef-banner .summary .bc-pdp-shipping__icon {
	flex: none;
	width: 24px;
	height: 24px;
	background-image: url("../pdp/australia-wide.png");
	background-repeat: no-repeat;
	background-position: center;
	background-size: 24px 24px;
}

/* The shipping row belongs above the refund row, which the trust block owns. */
.chuni-beef-banner .summary form.cart > .bc-pdp-shipping {
	order: 6;
}

.chuni-beef-banner .summary form.cart > .bc-pdp-trust {
	order: 7;
}

/* ── "Recently viewed items" (design y=5947, 1512×902) ───────────────────────
 * Same card component as "You may also like", on the design's slightly lighter
 * ground so the two sections read as distinct bands rather than one long list.
 *
 * The heading block is taller here — 1384×112 against the other's 148 including
 * a supporting line — because the design gives this section a heading and no
 * subline.
 * ------------------------------------------------------------------------- */
/*
 * ⚠ THE BAND CANNOT COME FROM THE ANCESTOR SECTION. The first attempt put it on
 *   `section:has(.bc-pdp-cards-section--recent)` with a second rule returning the
 *   page ground to any section holding BOTH card blocks — on the assumption the
 *   two sat in different theme sections. They do not: both land inside the same
 *   one, so the second rule cancelled the first and the band never appeared.
 *
 *   So the band is painted by the wrapper itself, full-bleed via a pseudo-element
 *   while the content stays on the 1384 grid. `z-index` is stated on both sides
 *   because a bare `z-index: -1` would paint BEHIND the section's own background
 *   and vanish.
 */
.bc-pdp-cards-section {
	position: relative;
	padding: 64px 0px;
}

.bc-pdp-cards-section--recent::before {
	content: "";
	position: absolute;
	z-index: 0;
	top: 0;
	bottom: 0;
	left: 50%;
	width: 100vw;
	transform: translateX(-50%);
	background-color: var(--pdp-c8);
}

.bc-pdp-cards-section--recent > * {
	position: relative;
	z-index: 1;
}

/* No supporting line in this section, so the heading owns the space below it. */
.bc-pdp-cards-section--recent h2.bc-pdp-cards__heading {
	margin-bottom: 64px;
}

/*
 * ⚠ REMOVED 2026-09-01 — this forced the recently-viewed cards to c7 so they would
 *   "separate" from the lighter band. The design merges them on purpose.
 *
 *   Sampled from `PDP-with-sticky.png` rather than judged by eye:
 *
 *       You may also like    gutter #1F1F1F   card body #322B27
 *       Recently viewed      gutter #322B27   card body #322B27
 *
 *   So under Recently viewed the card IS the same brown as its band, and what
 *   separates a card is the product photograph and the white Add Item button —
 *   not a change of ground. Mitz asked for #322B27 in both sections (2026-09-01),
 *   which is what the base card rule already gives once this override goes.
 *
 * ⚠ Do not reinstate a contrasting ground here without re-sampling the design: the
 *   note this replaces was a reasonable inference and still wrong.
 */

/* ===========================================================================
 * BUILD — the two editorial sections
 *
 * `I33110:107212;33082:101692` (y=2662.3, 1512×1406.7) and
 * `I33110:107212;33109:101179` (y=4069.1, 1512×876).
 *
 * ⚠ Both break OUT of the Bootstrap `.container` the templates place them in,
 *   using the same negative-inline-margin trick as the card sections: `100%` is
 *   the container's content box, so no viewport arithmetic is involved and a
 *   scrollbar cannot cause overflow. The photo band goes further and spans the
 *   full viewport, which the design draws edge to edge.
 * ========================================================================= */

/* ── Why feed raw dog food? ────────────────────────────────────────────────── */
/*
 * ⚠ ONE SELECTOR, NOT TWO. This rule used to read
 *
 *     .chuni-beef-banner ~ * .bc-pdp-why,
 *     .bc-pdp-why { margin: 0; … }
 *
 *   and that first selector — (0,2,0) — beat the full-bleed rule below, which is
 *   only (0,1,0). So `margin: 0` won and the section never broke out: it sat at
 *   its container's left edge while still being `width: 100vw`, pushing 201px
 *   past the viewport at 1512 and 405px at 1920. The right-hand claim was clipped
 *   off-screen entirely, and the intro block sat visibly off-centre.
 *
 *   It went unnoticed because every check measured HEIGHTS and contrast; none
 *   measured the section's `x`. `.bc-pdp-reasons` was written without the extra
 *   selector and has been correct all along, which is what made the two sections
 *   disagree.
 */
.bc-pdp-why {
	box-sizing: border-box;
	margin: 0;
	padding: 0;
	/* Not c7 — this band is lighter than the page. See --pdp-band. */
	background-color: var(--pdp-band);
}

@media (min-width: 1000px) {
	.bc-pdp-why {
		/* Full-bleed: the design's section spans 1512, not the 1140 container. */
		width: 100vw;
		max-width: 100vw;
		margin-left: calc((100% - 100vw) / 2);
	}
}

/*
 * Design: an intro block 600 wide, centred in the 1512 section (x=456), with the
 * heading over two lines and two 48px paragraphs.
 */
/*
 * Design `Container` 33082:101694 — 600 wide at x=456, its title a 600×96 text
 * node at x=0. The 24px of side padding here squeezed that title to 552, so the
 * intro measured 600 while its contents sat in 552.
 */
.bc-pdp-why__intro {
	box-sizing: border-box;
	max-width: 600px;
	margin: 0 auto;
	padding: 64px 0px;
	text-align: center;
}

.bc-pdp-why__title {
	margin: 0 0 24px !important;
	color: var(--pdp-c3);
	font-family: var(--pdp-font-textured);
	font-size: var(--pdp-h2);
	font-weight: 400;
	line-height: 48px;
	text-transform: uppercase;
	text-wrap: balance;
}

.bc-pdp-why__lede {
	margin: 0 0 8px !important;
	color: var(--pdp-c4);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-body);
	font-weight: 400;
	line-height: 24px;
}

/*
 * The design's scroll affordance: a 47px circle with a chevron. Drawn, because
 * the design's own asset lives on an oxdigital.com.au URL this project should
 * not depend on.
 */
/*
 * ⚠ These two colours were the wrong way round. Sampling the export at the
 *   circle's centre gives #a4866c — a SOLID TAN disc with a near-black chevron
 *   and no border. This had a dark #322b27 fill, a c6 border and a tan chevron,
 *   which reads as an outlined ghost button rather than the design's solid mark.
 */
.bc-pdp-why__scroll {
	position: relative;
	display: block;
	width: 47px;
	height: 47px;
	margin: 24px auto 0;
	border: 0;
	border-radius: 50%;
	background-color: var(--pdp-c1);
	text-decoration: none;
}

.bc-pdp-why__scroll::after {
	content: "";
	position: absolute;
	top: 17px;
	left: 50%;
	width: 12px;
	height: 12px;
	border: solid var(--pdp-c7);
	border-width: 0 3px 3px 0;
	transform: translateX(-50%) rotate(45deg);
}

/*
 * Hover used to lighten a border. There is no border any more (see the note on
 * the base rule), so it lifts the disc's own tan instead — otherwise the control
 * had no hover state at all.
 */
.bc-pdp-why__scroll:hover,
.bc-pdp-why__scroll:focus-visible {
	background-color: var(--pdp-c3);
}

/* ── The photo band with its two claims ────────────────────────────────────── */
.bc-pdp-why__band {
	position: relative;
}

.bc-pdp-why__photo {
	display: block;
	width: 100%;
	height: auto;
	max-height: 1008px;
	object-fit: cover;
}

/*
 * The two claims sit over the photo, at the design's x=136 and x=1092 inside a
 * 1512 frame — expressed as percentages so they hold their relationship to the
 * image at any width rather than drifting apart.
 */
.bc-pdp-why__claim {
	position: absolute;
	box-sizing: border-box;
	width: 270px;
	margin: 0 !important;
	padding: 16px 0;
	border-top: 3px solid var(--pdp-c11);
	border-bottom: 3px solid var(--pdp-c11);
	color: var(--pdp-c11);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-body);
	font-weight: 400;
	line-height: 24px;
	/* The claim text node is 241×108 for two lines — a 54px line. */
}

.bc-pdp-why__claim--left {
	top: 42%;
	left: 9%;
	font-family: var(--pdp-font-textured);
	font-size: 40px;
	line-height: 44px;
	text-transform: uppercase;
}

.bc-pdp-why__claim--right {
	top: 42%;
	right: 9%;
}

/* Below the design's breakpoint the overlay would sit on the dog's face, so the
 * claims stack under the photo instead of over it. */
@media (max-width: 999px) {
	.bc-pdp-why__claim {
		position: static;
		width: auto;
		margin: 0 24px 16px !important;
	}
}

/* ── Why choose The Butcher's Dog? ─────────────────────────────────────────── */
.bc-pdp-reasons {
	box-sizing: border-box;
	padding: 64px 0;
	background-color: var(--pdp-c7);
}

@media (min-width: 1000px) {
	.bc-pdp-reasons {
		width: 100vw;
		max-width: 100vw;
		margin-left: calc((100% - 100vw) / 2);
	}
}

/*
 * ⚠ The max-width has to include the gutter, because `box-sizing: border-box`
 *   makes the padding eat into it. `max-width: 1384` with `padding: 0 64px` gave
 *   a 1256 content box, so this section's heading and sub-line sat 64px inside
 *   the 1384 grid every other section uses — measured at x=128 against the
 *   design's x=64.
 *
 *   `.bc-pdp-cards-section` gets 1384 right and is why the two disagreed on
 *   screen.
 */
.bc-pdp-reasons__inner {
	box-sizing: border-box;
	width: 100%;
	max-width: calc(var(--pdp-content) + 2 * var(--pdp-gutter));
	margin: 0 auto;
	padding: 0 var(--pdp-gutter);
	text-align: center;
}

.bc-pdp-reasons__title {
	margin: 0 0 12px !important;
	color: var(--pdp-c3);
	font-family: var(--pdp-font-textured);
	font-size: var(--pdp-h2);
	font-weight: 400;
	line-height: 48px;
	text-transform: uppercase;
}

.bc-pdp-reasons__sub {
	margin: 0 0 64px !important;
	color: var(--pdp-c5);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-body);
	line-height: var(--pdp-lh-6);
}

/*
 * Design: two 300-wide columns either side of a 600 bowl, inside 1384. The bowl
 * is a grid child rather than a background because it sits BETWEEN the columns —
 * a background could not be ordered between them.
 */
/*
 * The design's own arithmetic inside 1384: 80 + 300 + 12 + 600 + 12 + 300 + 80.
 * So the tracks are FIXED rather than 300/1fr/300 — a fractional middle track
 * gave the bowl 576 instead of 600 and left the section 24px short, because the
 * container's 64px gutter and a 40px gap do not add up to the design's 80 and 12.
 *
 * ⚠ FIXED AT 1384, FLUID BELOW IT — QA 2026-09-12 (Mitz, 1163: "the Check & Add
 *   to Cart button overlaps the padding"). Three fixed tracks are 1224 whatever
 *   the container is; centred in a 1035px container at 1163 the right column ran
 *   to x1194, 31px past the viewport, and the page's scrollWidth went with it
 *   (measured 1194 / 1163, and 1162 / 1100). `html { overflow-x: hidden }` hides
 *   the scrollbar but the page can still be nudged sideways — trackpad,
 *   DevTools — and then everything in flow shifts left while the FIXED sticky bar
 *   stays put: its button appeared 32px into the section's padding, which is the
 *   31px this grid was overhanging. The bar was never wrong; the page was wider
 *   than the window. `max-width: 1224px` keeps the design's exact tracks from a
 *   1384 container up (1fr = 300 there); below, the outer columns share what is
 *   left and the bowl gives way last. No horizontal overflow at any width.
 */
.bc-pdp-reasons__grid {
	display: grid;
	grid-template-columns: minmax(0, 1fr) minmax(0, 600px) minmax(0, 1fr);
	gap: 12px;
	align-items: center;
	justify-content: center;
	width: 100%;
	max-width: 1224px;
	margin: 0 auto;
}

.bc-pdp-reasons__col {
	display: flex;
	flex-direction: column;
	gap: 24px;
	margin: 0 !important;
	padding: 0 !important;
	list-style: none !important;
}

.bc-pdp-reasons__item {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 24px;
	margin: 0 !important;
	list-style: none !important;
}

.bc-pdp-reasons__icon {
	display: block;
	width: 100px;
	height: 100px;
	object-fit: contain;
}

/*
 * Design `Frame 1261154928` names its style: Body/Medium — Inter at Size/Body 16,
 * weight 500, on a 24px line. This was 14/400, which read a step quieter than the
 * design intends for the only copy in that section.
 */
.bc-pdp-reasons__text {
	display: block;
	color: var(--pdp-c4);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-body);
	font-weight: 500;
	line-height: var(--pdp-lh-6);
}

.bc-pdp-reasons__bowl {
	display: block;
	width: 100%;
	max-width: 600px;
	height: auto;
	margin: 0 auto;
}

/* One column and the bowl first, below the design's breakpoint. */
@media (max-width: 999px) {
	.bc-pdp-reasons__grid {
		grid-template-columns: 1fr;
	}

	.bc-pdp-reasons__bowl {
		order: -1;
		max-width: 320px;
	}
}

/*
 * Explicit grid placement for the reasons row.
 *
 * The bowl is the LAST child in the DOM — it has to be, because it sits inside
 * the grid rather than between two separate wrappers — so auto-placement put the
 * RIGHT column into the middle 576px track and pushed the bowl into the 300px
 * track meant for a column. The bowl rendered 300 wide against the design's 600
 * and the section came out 232px short.
 *
 * Naming the tracks fixes it without reordering the markup, which keeps the two
 * columns adjacent in the reading order — a screen reader should hear the four
 * reasons in sequence, not have a decorative image announced between the second
 * and third.
 */
@media (min-width: 1000px) {
	.bc-pdp-reasons__col--left {
		grid-column: 1;
	}

	.bc-pdp-reasons__bowl {
		grid-column: 2;
		grid-row: 1;
	}

	.bc-pdp-reasons__col--right {
		grid-column: 3;
		grid-row: 1;
	}
}

/* ── The design's "View delivery areas & schedule" line ────────────────────
 * A link rather than a toggle: the plugin's widget carries no zone copy to
 * disclose — see the note in inc/pdp-redesign.php — and the information lives on
 * the delivery page.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary form.cart > .bc-pdp-gate__areas {
	order: 4;
	margin: 4px 0 0 !important;
}

.chuni-beef-banner .summary .bc-pdp-gate__areas a {
	color: var(--pdp-c3);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-links);
	font-weight: 500;
	line-height: 24px;
	text-decoration: underline;
	text-underline-offset: 2px;
}

.chuni-beef-banner .summary .bc-pdp-gate__areas a:hover,
.chuni-beef-banner .summary .bc-pdp-gate__areas a:focus-visible {
	color: var(--pdp-c4);
}

/*
 * The plugin labels its own field "SEE IF WE DELIVER TO YOUR DOOR", which says
 * the same thing as the design's prompt directly above it. Two prompts for one
 * field is worse than either alone, and the design has one — so the plugin's is
 * hidden rather than our own, because ours carries the design's wording.
 */
.chuni-beef-banner .summary form.cart .wc-delivery-time-response p#pincode_field_idp > label {
	position: absolute !important;
	width: 1px !important;
	height: 1px !important;
	margin: -1px;
	overflow: hidden;
	clip: rect(0 0 0 0);
	clip-path: inset(50%);
	white-space: nowrap;
}

/* ── Card sections: centred, per the design ──────────────────────────────────
 * "YOU MAY ALSO LIKE", its supporting line, and "RECENTLY VIEWED ITEMS" are all
 * centred in the design — each is a full-width 1384 text node with the copy in
 * the middle. They were built left-aligned because the metadata gives a node's
 * box and not its alignment, and I did not check the render for it.
 *
 * The CARDS stay left-aligned: only the section furniture centres.
 * ------------------------------------------------------------------------- */
h2.bc-pdp-cards__heading,
.bc-pdp-cards__sub {
	text-align: center;
}

/* ── Payment marks: centred in the panel ─────────────────────────────────────
 * The design places the six marks at x=219 inside the 668 panel — (668 − 230) / 2,
 * i.e. centred. They were left-aligned.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-trust__marks {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
}


/* ── Trust rows: the refund line is a bar, like the shipping line ────────────
 * Design `Frame 1261154921` 668×36 at y=997.6, with its text inset 12px — the
 * same treatment as the shipping row above it, not the plain paragraph it was
 * built as. The third row (SSL + payment marks) IS plain and centred in the
 * design, which is why only the first two get a container.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-trust__row:first-of-type {
	box-sizing: border-box;
	margin: 0 0 12px !important;
	padding: 8px 12px;
	/* No border, no radius — see the shipping row above for why. */
	border: 0;
	border-radius: 0;
	background-color: var(--pdp-c8);
	color: var(--pdp-c5);
	font-size: var(--pdp-links);
	line-height: 20px;
}

.chuni-beef-banner .summary .bc-pdp-trust__row:first-of-type a {
	color: var(--pdp-c3);
	text-decoration: underline;
	text-underline-offset: 2px;
}

/* ── The gate's CONFIRMED state ──────────────────────────────────────────────
 * Once a postcode validates, the plugin swaps its field for a confirmation line
 * and a "Change postcode" control. The design never draws this state, so it went
 * unstyled — and the plugin's default is a full-width black bar, which read as
 * the loudest thing in the panel while saying the least.
 *
 * Restyled as a quiet secondary action: outlined, auto width, sitting under the
 * confirmation. The confirmation itself takes the success green already used for
 * the stock dot and the savings badge, so "we deliver to you" reads as good news
 * rather than as another notice.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .wc-delivery-time-response #avlpin {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px;
	color: var(--pdp-c4);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-body);
	line-height: 24px;
}

.chuni-beef-banner .summary .wc-delivery-time-response #avlpin p {
	margin: 0 !important;
}

/* Named through the ids the plugin styles with — a class-based selector lost to
 * a white `color` rule, the third time that has happened with this plugin. */
.chuni-beef-banner .summary .wc-delivery-time-response span#avlpin .pincode_static_text {
	color: var(--pdp-ok-400) !important;
	font-weight: 600;
}

/* Named with its id: this plugin styles through ID selectors, so a class-based
 * override loses however long it is — the same lesson as #checkpin. */
.chuni-beef-banner .summary .wc-delivery-time-response a#change_pin {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	box-sizing: border-box;
	width: auto !important;
	min-height: 36px !important;
	margin: 0 !important;
	padding: 6px 16px !important;
	border: 1px solid var(--pdp-c6) !important;
	border-radius: 9999px !important;
	background: transparent !important;
	color: var(--pdp-c5) !important;
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-links) !important;
	font-weight: 500;
	line-height: 1;
	text-decoration: none;
	text-transform: none;
}

.chuni-beef-banner .summary .wc-delivery-time-response a#change_pin:hover,
.chuni-beef-banner .summary .wc-delivery-time-response a#change_pin:focus-visible {
	border-color: var(--pdp-c3) !important;
	color: var(--pdp-c4) !important;
}

/* The plugin ships a pencil icon inside that control; the label alone is clearer
 * at this size and the icon is a remote PNG. */
.chuni-beef-banner .summary .wc-delivery-time-response a#change_pin img {
	display: none !important;
}

/* ===========================================================================
 * Per-section corrections from Mitz's 1920 screenshot, round two
 * ========================================================================= */

/* ── 1. The panel column had its own lighter fill ───────────────────────────
 * `.chunii-right-image.sigle-ps` carries `background: #2b2b2b` from the theme —
 * lighter than the page's #1f1f1f — which drew a visible box around the whole
 * purchase panel. The design has no panel fill: the panel sits directly on the
 * page ground, and only the option rows, bars and accordion are raised.
 *
 * This is also what the contrast sweep had been reporting as the "ground" behind
 * the panel's Yotpo row, which is why #2b2b2b kept appearing in those results.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .chunii-right-image,
.chuni-beef-banner .chunii-right-image.sigle-ps {
	background-color: transparent !important;
}

/* ── 2. Sticky bar: title ABOVE the rating ──────────────────────────────────
 * Design `PRODUCT CARD` 33145:131161: the thumbnail at x=0, then a text block at
 * x=99.33 with the title at y=0 and the rating at y=26 — stacked. They were
 * inline, which made the bar read as one long run of text.
 *
 * Done as a grid so the markup does not need a wrapper: the thumbnail spans both
 * rows, the title takes row 1 and the rating row 2.
 * ------------------------------------------------------------------------- */
/* ⚠ `all`, NOT `min-width: 1000px`, since 2026-09-02: the design has tablet and
 * mobile sticky bars too, and every rule in this block is `.bc-pdp-sticky*` —
 * checked selector by selector before widening it — so nothing else can be
 * caught by the change. The declarations are identical at 1000px and up, so
 * desktop renders exactly as before; the narrow widths simply gain them, and
 * the overrides they need are at the end of this file. */
@media all {
	.bc-pdp-sticky__product {
		display: grid;
		grid-template-columns: auto minmax(0, 1fr);
		grid-template-rows: auto auto;
		column-gap: 16px;
		row-gap: 4px;
		align-items: center;
	}

	.bc-pdp-sticky__thumb {
		grid-column: 1;
		grid-row: 1 / 3;
	}

	.bc-pdp-sticky__title {
		grid-column: 2;
		grid-row: 1;
		align-self: end;
	}

	.bc-pdp-sticky__rating {
		grid-column: 2;
		grid-row: 2;
		align-self: start;
	}
}

/* ── 3. The confirmed state read bottom-up ──────────────────────────────────
 * "Change postcode" was rendering ABOVE "Good news! We deliver to your area",
 * so the action appeared before the thing it acts on. A column puts them in DOM
 * order — confirmation, then the action — and keeps the button hugging its label
 * rather than stretching.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .wc-delivery-time-response span#avlpin {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 8px;
}

/*
 * The plugin's location-pin image was rendering as a stray 18×23 mark on its own
 * line. The design has no pin, and the confirmation reads perfectly without one.
 */
.chuni-beef-banner .summary .wc-delivery-time-response .phoe-green-location-icon {
	display: none !important;
}

/* ===========================================================================
 * Round three — measured off the 1512 export, per-section sweep
 * ========================================================================= */

/* ── The SSL box ─────────────────────────────────────────────────────────────
 * Design: a 668×65 bordered rectangle, square corners, with the caption centred
 * ON the top border and the six payment marks centred inside. This was a plain
 * line of text with the marks loose underneath — no box at all.
 *
 * The legend effect is the caption pulled up onto the border line with a slab of
 * the page ground behind it. That works here because the panel is transparent, so
 * the ground behind the caption really is --pdp-c7 and nothing else.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-trust__secure {
	position: relative;
	display: block;
	box-sizing: border-box;
	width: 100%;
	min-height: 65px;
	margin: 28px 0 0;
	padding: 20px 12px 16px;
	border: 1px solid var(--pdp-c6);
	text-align: center;
}

.chuni-beef-banner .summary .bc-pdp-trust__secure-label {
	position: absolute;
	top: 0;
	left: 50%;
	padding: 0 10px;
	background-color: var(--pdp-c7);
	color: var(--pdp-c3);
	/*
	 * ⚠ INTER, NOT NORTHWEST. Round three set this to the heading face on the
	 *   strength of a 2× crop that looked slab-like. Enlarging it to 4× settles it:
	 *   the letterforms are geometric sans, and — decisively — **Northwest is an
	 *   all-caps display face**, while this caption has clear lowercase. It cannot
	 *   be Northwest at all. Measured 200px for 28 characters, which is Inter Semi
	 *   Bold at 14.
	 */
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-links);
	font-weight: 600;
	line-height: 20px;
	white-space: nowrap;
	transform: translate(-50%, -50%);
}

/* ── Accordion rows: the design's 18px label, flush to the panel edges ───────
 * The label was 16px and both edges carried 6px of padding, which set the label
 * in from the panel's left edge and the disc in from its right. In the design
 * both sit exactly ON those edges — label at x=780, disc's right at x=1448.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-details__toggle {
	padding: 16px 0;
	font-size: 18px;
	line-height: 26px;
}

/* ── Rule colour ─────────────────────────────────────────────────────────────
 * Sampling the export's dividers gives #5f5347 — lighter and warmer than the c6
 * (#49423f) these were drawn in.
 *
 * ⚠ THE ROW DIVIDERS AND THE PRODUCT DETAILS RULE NOW USE c3 (#c9a98a), WHICH IS
 *   BRIGHTER THAN THE DESIGN DRAWS THEM. Mitz's choice, 2026-09-02; recorded here
 *   rather than quietly reverted. Re-sampled from `PDP-with-sticky.png` to be sure
 *   before saying so:
 *
 *       y=1318  rule under PRODUCT DETAILS   #5F5347
 *       y=1954  divider under a row          #5F5347
 *       y=1290  "PRODUCT DETAILS" glyphs     #C9A98A   ← the tan is the TEXT
 *
 *   So the export puts `--pdp-rule` on both lines and c3 on the heading's letters.
 *   If these read too loud on screen, `--pdp-rule` is the measured value.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-details__row {
	border-bottom-color: var(--pdp-c3);
}

/* ── The calculator row sat 4px off its own baseline ─────────────────────────
 * The label is inline text and the trigger is an inline-block button, so the
 * button's box sat on the baseline and carried the line box 4px taller than the
 * text beside it — the two read as very slightly misaligned. Measured: label top
 * 481, button top 477.
 *
 * A baseline-aligned flex row puts both on one baseline and brings the row to the
 * design's 26px. `flex-wrap` keeps the narrow-viewport behaviour it had.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-calc {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: 0 6px;
}

/* ── The gate prompt's line box ──────────────────────────────────────────────
 * The design's prompt is a 26px row; this was set on the 20px links leading, so
 * it came up 6px short against everything around it.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-gate__prompt {
	line-height: 26px;
}

/* ── The vet block's media ───────────────────────────────────────────────────
 * Design: full panel width, 365 tall — near enough 16:9 that the ratio is what
 * the aspect box should hold rather than a fixed height, so it stays right when
 * the panel narrows.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-endorsement__media {
	position: relative;
	width: 100%;
	margin: 16px 0 0;
	overflow: hidden;
	background-color: var(--pdp-c8);
	/*
	 * 16:9, not the design's 668/365 (1.83). The video itself is 16:9 (Vimeo
	 * reports 426×240), and a player in a box wider than its video pillarboxes:
	 * Mitz, 2026-09-12, "it should full width no space on left and right" — the
	 * space was the player's own bars inside a box that was 3% too wide. The
	 * box is 11px taller than the frame draws it, and the video fills it.
	 */
	aspect-ratio: 16 / 9;
}

/*
 * ⚠ `!important`, answering the theme's. footer.php:387 adds `.youtube-iframe`
 *   to every Vimeo iframe on the site, and style.css then sizes that class in
 *   PIXELS with `!important` below 750 (532×411), 540 (432×311) and 420
 *   (332×211) — for a lightbox elsewhere. Measured here: 532×411 inside a
 *   696-wide box at 744, 432×311 inside a 388 box at 428, clipped by the box's
 *   overflow. The category page met the same rule (category-redesign.css, the
 *   split endorsement) and answered it the same way. (0,3,1) against (0,1,0).
 */
.chuni-beef-banner .summary iframe.bc-pdp-endorsement__video {
	position: absolute;
	inset: 0;
	width: 100% !important;
	height: 100% !important;
	border: 0;
}

/* ===========================================================================
 * Round four — the purchase options, read off the export at 3x
 * ========================================================================= */

/* ── The stray rings on the frequency pills ──────────────────────────────────
 * ⚠ A RING WAS PAINTED ON EVERY UNSELECTED PILL. The theme's
 *   `[type="radio"] + label::before` matches the pill labels too — they sit
 *   after the same radios — and drew a 20px #ddd circle overlapping each pill's
 *   left edge. Pale discs sitting on top of the chips.
 *
 *   It hid behind the fix that was already here: that one kills ::before and
 *   ::after only on `:checked + label`, so the SELECTED pill was clean and every
 *   unselected one was not. Selecting a pill made its own ring vanish, which is
 *   exactly the behaviour that makes a bug look like a feature.
 *
 *   The design draws no mark inside a pill in any state — the pill's own outline
 *   and fill carry the choice.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-freq__pill-label::before,
.chuni-beef-banner .summary .bc-pdp-freq__pill-label::after,
.chuni-beef-banner .summary .bc-pdp-freq__pill label::before,
.chuni-beef-banner .summary .bc-pdp-freq__pill label::after {
	content: none !important;
	display: none !important;
}

/* ── Subscribe row: tan title, green saving ──────────────────────────────────
 * Design: "Subscribe & Save" is tan and "You save $11.92 every delivery" is the
 * success green — the same green as the stock dot. Both were rendering in the
 * panel's default greys (c4 and c5), so the row read as ordinary copy and the
 * saving did not stand out at all.
 *
 * The card build already had this right — it uses ok-400 for the saving. Only
 * the panel was missed.
 * ------------------------------------------------------------------------- */
/*
 * ⚠ THE SUBSCRIBE TITLE'S TAN MOVED TO THE SELECTED STATE, 2026-09-09. This
 *   rule set it unconditionally, so "Subscribe & Save" read as the chosen
 *   option on arrival — when the chosen option is One Time. Per Mitz's state
 *   spec the label is `#F5F2EE` until the row is selected. The tan is now
 *   applied by the state block earlier in this file, alongside the price and
 *   the per-kg, so all three turn together.
 *
 *   The saving line keeps its green in both states — it is not one of the
 *   three the spec covers.
 */
.chuni-beef-banner .summary .bc-pdp-option--sub .bc-pdp-option__note--save {
	color: #98C98A;
}

/* The selected row's figures go tan with it — Color 1, the design's price tan.
 * Paired with the state block earlier in this file; both were c3 until the
 * two-tone question was settled on 2026-09-09. */
.chuni-beef-banner .summary .bc-pdp-options:has(.bc-pdp-freq__pill .bc-pdp-option__radio:checked) .bc-pdp-option--sub .bc-pdp-option__price {
	color: var(--pdp-c1);
}

/* ── One box, not two ────────────────────────────────────────────────────────
 * The design encloses the Subscribe row AND the frequency panel in a SINGLE
 * bordered box: outer border at y=534 and y=706, with a 1px divider at y=598
 * separating the row from the pills. The build had the row bordered and the pills
 * loose underneath it, so the two read as unrelated blocks and the frequency
 * picker looked like it belonged to the page rather than to the subscription.
 *
 * ⚠ These cannot be nested in markup: the plugin renders the pills as a SIBLING
 *   of the options <ul>, not inside the Subscribe <li>. So the box is drawn in
 *   two halves that meet — the row gives up its bottom radius and the pill panel
 *   supplies the sides and the base. `margin-top: -1px` laps the two so the
 *   divider is one line rather than two stacked.
 *
 *   Both halves are keyed on the same `:has()` as the selected state, so when no
 *   subscription is chosen the row is a closed box again and nothing is left
 *   hanging open.
 * ------------------------------------------------------------------------- */
/* ⚠ c6, sampled: the divider at y=598 is #49423F, one step lighter than the
 * #322B27 outer border so the seam reads as an internal division rather than as
 * two separate boxes. The radius zeroing that was here is redundant now the boxes
 * are square throughout. */
.chuni-beef-banner .summary .bc-pdp-options:has(.bc-pdp-freq__pill .bc-pdp-option__radio:checked) .bc-pdp-option--sub .bc-pdp-option__label {
	border-bottom-color: var(--pdp-c6);
}

.chuni-beef-banner .summary .bc-pdp-options:has(.bc-pdp-freq__pill .bc-pdp-option__radio:checked) .bc-pdp-freq {
	box-sizing: border-box;
	margin: -1px 0 0px;
	padding: 16px 20px 12px;
	/* c8, matching the row above it — sampled #322B27 at y=706 and on both
	 * verticals at y=660. */
	border: 1px solid var(--pdp-c8);
	border-top: 0;
}

/* The pills sit at the box's inset now, so the list loses its own indent. */
.chuni-beef-banner .summary .bc-pdp-freq__pills {
	padding-left: 0;
}

/* ===========================================================================
 * Round five — typography, buttons, backgrounds and spacing, off the Figma
 * nodes and the 1512 export together
 * ========================================================================= */

/* ── The gate row: two boxes, 12 apart ──────────────────────────────────────
 * Design `Input with Button`: `flex gap-[12px] h-[48px]`, the input `flex-1` and
 * the button `shrink-0` with 24px of horizontal padding. The build had them
 * joined into one segmented pill, each 172 wide, starting 162px inside the panel.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary form.cart .wc-delivery-time-response .input-block {
	gap: 12px;
	height: 48px;
}

/* ── Why the field was 172 wide and floating in the middle of the panel ──────
 * Measured, after a first attempt that guessed at the wrong element:
 *
 *   div#my_custom_checkout_field2.pin_div   flex, justify-content: CENTER, 668
 *     p#pincode_field_idp                   content-sized to 344, then centred
 *       span.input-block                    flex, 344
 *         span.loader_div                   block — the input's real parent
 *           span.phoen_pincode_span_min
 *             input#pincode_field_id
 *         a#checkpin
 *
 * Two separate causes. The wrapper centres its children, so the row sat at
 * 780 + (668 − 344) / 2 = 942 — which is exactly where it was measured. And
 * nothing in that chain was set to fill, so each box shrank to its content.
 *
 * ⚠ The first fix here targeted `.input-block > p.form-row` as the input's flex
 *   parent. There is no such child: the `p` is the input-block's PARENT, and the
 *   flex child is `span.loader_div`. The rule matched nothing and the row did not
 *   move, which is the whole reason the chain above got measured rather than
 *   assumed.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary form.cart .wc-delivery-time-response #my_custom_checkout_field2 {
	justify-content: flex-start;
}

.chuni-beef-banner .summary form.cart .wc-delivery-time-response p#pincode_field_idp {
	flex: 1 1 100%;
	width: 100% !important;
	max-width: none !important;
}

.chuni-beef-banner .summary form.cart .wc-delivery-time-response span.input-block {
	width: 100% !important;
}

/* The field's real flex parent: this is what has to grow. `min-width: 0` because
 * an input's default intrinsic width would otherwise stop it shrinking on narrow
 * viewports and push the row past the panel. */
.chuni-beef-banner .summary form.cart .wc-delivery-time-response span.loader_div {
	flex: 1 1 auto;
	min-width: 0;
}

.chuni-beef-banner .summary form.cart .wc-delivery-time-response span.phoen_pincode_span_min {
	display: block;
	width: 100%;
}

/*
 * 24px of padding on a 18px semibold label is what produces the design's 104.
 * `width: auto` matters: an earlier rule stretched this to match the input.
 */
.chuni-beef-banner .summary div#my_custom_checkout_field2 p#pincode_field_idp a#checkpin {
	box-sizing: border-box;
	width: auto !important;
	min-width: 0 !important;
	height: 48px !important;
	padding: 12px 24px !important;
	border-radius: 0 !important;
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-para) !important;
	font-weight: 600 !important;
	line-height: 24px !important;
	white-space: nowrap;
}

/* ── The gate legend is Northwest in cream, not Inter in tan ─────────────────
 * Sampling the export's brightest pixel on that row gives #f5f2ee, and rendering
 * the node shows Northwest's condensed slab letterforms. It had been built as
 * 14px Inter 600 in the tan — which is the PURCHASE OPTION legend's treatment,
 * borrowed on the assumption the two matched. They do not: the tan label belongs
 * to a heading, this one to an instruction the customer has to act on.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-gate__prompt {
	color: var(--pdp-c4);
	font-family: var(--pdp-font-heading);
	font-size: var(--pdp-body);
	font-weight: 400;
	letter-spacing: 0;
}

/* ── The action row: square corners, tan outlines ────────────────────────────
 * Design `Frame 1261154912` 668×70: `flex gap-[8px]` holding a 119 stepper, the
 * 461 primary button and a 72 wishlist box. Rendering it shows all three with
 * SQUARE corners, and sampling their edges gives a tan (#c9a98a) 1px border on
 * the two outlined boxes.
 *
 * ⚠ Both boxes here carried `border-radius: 9999px`. The design system does define
 *   `Atom Component/Buttons/Radius: 9999`, which is almost certainly where that
 *   came from — but that token is what the FREQUENCY PILLS use. The add-to-cart
 *   row is drawn square, and the export settles it: the tan block is a clean
 *   461px-wide run on every row from y=916 to y=984, which a pill cannot produce.
 *
 * The wishlist box is still out of scope, so the button takes its width.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .quantity {
	border-radius: 0 !important;
	border-color: var(--pdp-c3) !important;
	background-color: transparent !important;
	color: var(--pdp-c3);
}

.chuni-beef-banner .summary .quantity input.qty {
	background-color: transparent;
	color: var(--pdp-c3);
}

/* The steppers are dimmer than the number they flank — sampled #63574a. */
.chuni-beef-banner .summary .quantity .minus,
.chuni-beef-banner .summary .quantity .plus,
.chuni-beef-banner .summary .quantity button {
	background-color: transparent;
	color: #63574a;
}

.chuni-beef-banner .summary form.cart button[type="submit"],
.chuni-beef-banner .summary form.cart .single_add_to_cart_button,
.chuni-beef-banner .summary form.cart .show-pincode-pop-up,
.chuni-beef-banner .summary form.cart .on-pincode-required {
	border-radius: 0 !important;
}

/* ── The card's Add Item button ───────────────────────────────────────────────
 * Design `PRODUCT CARD` I33110:107212;33130:121315, node 33130:100090: a WHITE
 * button with #322b27 text, square, 24px/12px padding, Inter Semi Bold 18px, full
 * width of the card's 12px-padded body.
 *
 * The build had it cream (c4) with c7 text at 9999px, 16px regular — so the one
 * white element the card design uses to draw the eye was reading as another muted
 * surface, and the pill shape disagreed with the panel's square primary.
 *
 * ⚠ White here is deliberate and NOT the tan used in the panel. The card sits on
 *   c8 and the panel on c7; the design gives each its own primary treatment, so
 *   copying the panel's tan across would flatten that distinction.
 * ------------------------------------------------------------------------- */
.bc-pdp-cards li.product .show-pincode-pop-up,
.bc-pdp-cards li.product .on-pincode-required,
.bc-pdp-cards li.product .single_add_to_cart_button,
.bc-pdp-cards li.product button[type="submit"].button {
	box-sizing: border-box;
	width: 100%;
	padding: 12px 24px !important;
	border: 0 !important;
	border-radius: 0 !important;
	background-color: var(--pdp-c11) !important;
	color: var(--pdp-c8) !important;
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-para) !important;
	font-weight: 600 !important;
	line-height: normal;
	text-align: center;
	text-transform: none !important;
}

.bc-pdp-cards li.product .show-pincode-pop-up:hover,
.bc-pdp-cards li.product .on-pincode-required:hover,
.bc-pdp-cards li.product .single_add_to_cart_button:hover,
.bc-pdp-cards li.product button[type="submit"].button:hover {
	background-color: var(--pdp-c4) !important;
}

/* ── While a card's add is in flight ────────────────────────────────────────
 * `bc-minicart-ios-fix.js` marks the clicked card button `bc-adding` from the
 * click until the cart repaint opens the drawer. QA 2026-09-15 read a slow add
 * (staging, after Load more) as "wont add to cart" because nothing on the card
 * acknowledged the click; this is the acknowledgement. Same stylesheet on the
 * category page and the PDP, so both card lists get it.
 * ------------------------------------------------------------------------- */
.bc-pdp-cards li.product .single_add_to_cart_button.bc-adding {
	opacity: 0.6;
	cursor: progress;
}

/* ── Card title: 18, not 20 ──────────────────────────────────────────────────
 * Design node 29323:46979 — Northwest Regular at Size/Paragraph 18 on a 20px
 * line. It was set at the H6 20px, which is the PANEL heading's size.
 * ------------------------------------------------------------------------- */
.bc-pdp-cards li.product h2.woocommerce-loop-product__title,
.bc-pdp-cards li.product .woocommerce-loop-product__title {
	font-size: var(--pdp-para);
	line-height: 20px;
}

/* ===========================================================================
 * Round six — Mitz's four rulings, 2026-08-28
 * ========================================================================= */

/* ── Special Elite, where the design uses Fonts/Decoration ───────────────────
 * RULE 6 now permits three families (Mitz, 2026-08-28). Applied only where the
 * design actually calls for it, confirmed node by node — not to every serif-ish
 * block on the page:
 *
 *   .bc-pdp-why__lede        Frame 1261154960 — rendered, Special Elite
 *   .bc-pdp-why__claim       the right-hand claim in the photo band
 *   .bc-pdp-endorsement__pull  the vet PULL-QUOTE only
 *   card blurb               node 33123:103346 — 12px, white, 16px leading
 *
 * ⚠ NOT the vet sub-copy. `Frame 1261154926` renders the quote in Special Elite
 *   and "As a vet I know that vegetables…" directly beneath it in Links/Regular
 *   — Inter 14. Two faces, one block, and the design is deliberate about it.
 *
 * ⚠ NOT the left claim either: "REAL DOGS REAL FOOD" is Northwest Textured.
 * ------------------------------------------------------------------------- */
.bc-pdp-why__lede {
	font-family: var(--pdp-font-decoration);
	font-size: var(--pdp-para);
	line-height: 24px;
}

.bc-pdp-why__claim--right {
	font-family: var(--pdp-font-decoration);
	font-size: var(--pdp-para);
	line-height: 24px;
}

.chuni-beef-banner .summary .bc-pdp-endorsement__pull {
	font-family: var(--pdp-font-decoration);
	font-size: var(--pdp-para);
	line-height: 20px;
}

.bc-pdp-cards li.product .sub_and_save_frame p,
.bc-pdp-cards li.product .bc-pdp-card__blurb {
	font-family: var(--pdp-font-decoration);
	font-size: 12px;
	line-height: 16px;
}

/* ── The Subscribe row never showed it was selected ──────────────────────────
 * Reported by Mitz: choosing Subscribe & Save leaves the radio empty.
 *
 * The cause is structural. The One Time row is `input + label`, so the dot rule
 * `:checked + .bc-pdp-option__label::after` matches it. The Subscribe row has NO
 * input of its own — it represents the whole scheme group, and the radio that
 * actually gets checked is one of the frequency pills inside the panel below. So
 * that selector can never match, and the row was relying on its border alone.
 *
 * Keyed on the same `:has()` the border and the frequency panel already use, so
 * all three states are driven by one condition and cannot disagree.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-options:has(.bc-pdp-freq__pill .bc-pdp-option__radio:checked) .bc-pdp-option--sub .bc-pdp-option__label::before {
	border-color: var(--pdp-c3);
}

.chuni-beef-banner .summary .bc-pdp-options:has(.bc-pdp-freq__pill .bc-pdp-option__radio:checked) .bc-pdp-option--sub .bc-pdp-option__label::after {
	content: "" !important;
	position: absolute;
	top: 50%;
	left: 20px;
	box-sizing: border-box;
	width: 8px;
	height: 8px;
	margin: 0;
	border: 0;
	border-radius: 50%;
	background-color: var(--pdp-c3);
	transform: translateY(-50%);
}

/* ── The one-box grouping, actually closed this time ─────────────────────────
 * The previous attempt lapped the frequency panel onto the row above with
 * `margin-top: -1px`, which is right — but `.bc-pdp-options__rows` carries
 * `margin-bottom: 24px`, so the measured gap was 23px, not 0. The panel and the
 * row read as two separate boxes with a hole between them.
 *
 * The list's bottom margin is what has to go, and only while the panel is open —
 * when it is closed that 24px is the space before the next block.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-options:has(.bc-pdp-freq__pill .bc-pdp-option__radio:checked) .bc-pdp-options__rows {
	margin-bottom: 0;
}

/* ── The card's saving is a pill, not loose green text ───────────────────────
 * Design node 33177:112710: a Success/900 (#14532d) pill with Success/50
 * (#f0fdf4) text at 10px semibold on a 20px line, fully rounded, 8px of
 * horizontal padding, hugging its own text.
 *
 * `align-self: flex-start` is what makes it hug: the parent is a column flex
 * container, which blockifies its children, so `display: inline-block` would
 * stretch the pill across the card.
 * ------------------------------------------------------------------------- */
.bc-pdp-cards li.product .bc-pdp-option__note--save {
	align-self: flex-start;
	box-sizing: border-box;
	padding: 2px 8px;
	border-radius: 9999px;
	background-color: var(--pdp-ok-900);
	color: var(--pdp-ok-50);
	font-family: var(--pdp-font-body);
	font-size: 10px;
	font-weight: 600;
	line-height: 14px;
}

/* ── Carousel page indicators ────────────────────────────────────────────────
 * Design `DOT - PAGE INDICATOR` I33110:107212;33205:101731: the ACTIVE indicator
 * is a 32×8 tan pill and the rest are 8×8 dots, 12px apart. 32+12+8+12+8+12+8 is
 * the 92 the node measures.
 *
 * Owl already emits `.owl-dots`; it was rendering as 44×44 transparent hit areas,
 * so the row existed and painted nothing. This styles what is there rather than
 * adding markup — the dot COUNT follows the real number of pages, which is why
 * the design's four are not hardcoded.
 * ------------------------------------------------------------------------- */
.bc-pdp-cards .owl-dots {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 12px;
	width: 100%;
	margin-top: 24px;
}

.bc-pdp-cards .owl-dots .owl-dot {
	box-sizing: border-box;
	width: 8px;
	height: 8px;
	padding: 0;
	border: 0;
	border-radius: 9999px;
	background-color: var(--pdp-c6);
	transition: width 150ms ease, background-color 150ms ease;
}

.bc-pdp-cards .owl-dots .owl-dot.active {
	width: 32px;
	background-color: var(--pdp-c3);
}

/* Owl nests a <span> inside each dot and styles THAT; it would otherwise paint a
 * second mark inside ours. */
.bc-pdp-cards .owl-dots .owl-dot span {
	display: none !important;
}

/* ===========================================================================
 * Round seven — the Special Elite blocks round six missed
 *
 * Mitz: "the How much does your dog need? beside Food Calculate the font should
 * be Special Elite and the ul li above it as well".
 *
 * ⚠ THE PATTERN, which is what round six actually missed: in this design EVERY
 *   supporting sub-line under an `H2/Textured` heading is Special Elite. Round six
 *   applied the face to the four blocks it had already opened in Figma and never
 *   re-audited the rest of the page against the new family, so it caught the
 *   why-raw intro (a sub-line) but not the two section sub-lines built the same
 *   way, nor the panel's own supporting copy.
 *
 *   Confirmed node by node rather than by extending the guess:
 *     Frame 1261154921       bullets + calc label   → Special Elite
 *     Container 33109:101181 why-choose sub-line    → Special Elite
 *     Container 33130:107571 cards sub-line         → Special Elite
 *     Frame 1261154918       the three trust rows   → Inter (unchanged)
 *     Frame 1261154928       the four reason items  → Body/Medium, Inter
 *     Frame 1261154915       vet line, title, rating → Links/Regular, Inter
 * ------------------------------------------------------------------------- */

/*
 * The calculator's LABEL only. `.bc-pdp-calc__link` declares its own family, so
 * it keeps Inter — the design has "Food Calculator" in `Links/Bold`, measured at
 * 105px for 15 characters, which is Inter Semi Bold 14 and not this face.
 */
.chuni-beef-banner .summary .bc-pdp-calc {
	font-family: var(--pdp-font-decoration);
}

/* ── Section sub-lines: 20 on a 24px line ────────────────────────────────────
 * `Size/Paragraph big`, a token that was in the design system all along and had
 * never been brought across.
 *
 * ⚠ Caught by comparing INK width rather than trusting the first guess. At 18px
 *   these measured 791 and 535 against the export's 878 and 592 — a ratio of
 *   20/18 on both, which is what identified the size. An earlier estimate of
 *   "~10.6px per character" put it at 18 and was simply wrong; character-width
 *   arithmetic on a proportional face is not a measurement.
 * ------------------------------------------------------------------------- */
.bc-pdp-reasons__sub,
.bc-pdp-cards__sub {
	font-family: var(--pdp-font-decoration);
	font-size: var(--pdp-para-big);
	line-height: 24px;
}

/* ===========================================================================
 * Round nine — full-page audit against the Figma nodes
 * ========================================================================= */

/* ── The product title is LEFT-aligned ──────────────────────────────────────
 * Settled by scanning the export rather than by eye, because a title that nearly
 * fills the panel looks the same either way: the title's ink starts at x=782 with
 * the panel edge at 780, and centred it would have started at 849. The vet line
 * above it starts at 781.
 *
 * ⚠ The `center` came from the THEME, not from this file —
 *   `.working-dog-butler .summary.entry-summary h1.product_title.entry-title` in
 *   style.css, at (0,5,1). This selector matches it and adds a class, so it wins
 *   without needing !important.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .working-dog-butler .summary.entry-summary h1.product_title.entry-title,
.chuni-beef-banner .summary h1.product_title {
	text-align: left;
}

/* ── The photo-band claims: 54px line ───────────────────────────────────────
 * Design `Border` 270×178.5 holding a 241×108 text node — two lines on a 54px
 * line, not the 44 this was set to. The 14.5px inset on the text node is why the
 * claim gets side padding rather than filling its 270.
 * ------------------------------------------------------------------------- */
.bc-pdp-why__claim--left,
.bc-pdp-why__claim--right {
	line-height: 54px;
}

/*
 * The right-hand claim is body copy, not a display line — it keeps the 24px
 * leading Special Elite is set on. Only the textured left claim takes 54.
 */
.bc-pdp-why__claim--right {
	line-height: 24px;
}

/* ── The Australian Made mark in the accordion ───────────────────────────────
 * Design: the Descriptions panel closes with the Australian Made and Owned mark
 * between the weight line and QUANTITIES. See inc/pdp-redesign.php for why it is
 * rendered from a local path rather than the live-domain hotlink the old template
 * used.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-details__mark {
	display: block;
	width: 72px;
	height: auto;
	margin: 16px 0;
}

/* ===========================================================================
 * Round nine — ONE hover system for the whole page
 *
 * The design is a static mockup and draws no hover states, so these are chosen
 * rather than measured. They follow four rules so that every interactive element
 * behaves predictably instead of each one being decided separately:
 *
 *   1. FILLED buttons darken one step and KEEP their dark label — c3 → c1, which
 *      measures 5.24:1. It reads as the same button pressed, not a new colour.
 *   2. OUTLINED controls fill with the colour they were outlined in, and take the
 *      dark label. Nothing gains a colour it does not already wear at rest.
 *   3. TEXT LINKS go tan → cream (c3 → c4). This was already true of the
 *      calculator and delivery-areas links; it is now true of all of them.
 *   4. ROWS AND CHIPS move their BORDER to tan and leave the fill alone. They are
 *      large targets, and a fill change on a 668-wide row reads as a state change
 *      rather than a hover.
 *
 * ⚠ THE REAL BUG THIS FIXES: bootstrap.min.css ships
 *   `a:hover { color: #0056b3; text-decoration: underline }`, and it was reaching
 *   every PDP link that had no more specific hover of its own. The refund link and
 *   the entire card anchor were hovering to LINK BLUE on a dark ground — measured
 *   going from rgb(17,17,17) to rgb(0,86,179). Found by enumerating authored
 *   :hover rules per element, not by hovering: simulating the hover reported "no
 *   change" for several elements whose rules demonstrably exist, so the negative
 *   was not evidence.
 * ========================================================================= */

/* ── 3. Text links: tan → cream, and never Bootstrap blue ───────────────────
 * Scoped to the PDP's own regions rather than `a:hover` globally, so nothing in
 * the header, footer or any other template changes.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary a:hover,
.chuni-beef-banner .summary a:focus-visible,
.bc-pdp-why a:hover,
.bc-pdp-why a:focus-visible,
.bc-pdp-reasons a:hover,
.bc-pdp-reasons a:focus-visible,
.bc-pdp-cards a:hover,
.bc-pdp-cards a:focus-visible {
	color: var(--pdp-c4);
	text-decoration-line: none;
}

/* The trust rows' links keep their underline — it is what marks them as links in
 * a bar of plain copy — and only the colour moves. */
.chuni-beef-banner .summary .bc-pdp-trust__row a:hover,
.chuni-beef-banner .summary .bc-pdp-trust__row a:focus-visible,
.chuni-beef-banner .summary .bc-pdp-shipping a:hover,
.chuni-beef-banner .summary .bc-pdp-shipping a:focus-visible {
	color: var(--pdp-c4);
	text-decoration-line: underline;
}

/*
 * ⚠ NO HOVER COLOUR ON THE CARD TITLE. Mitz, 2026-09-07: "remove the hover
 *   product title color change." Measured with a real pointer before removing
 *   it: hovering the title took it `#c9a98a` → `#f5f2ee`.
 *
 *   The comment that used to sit here — "the card anchor wraps the image AND the
 *   title, so its colour lands on the title" — was also **stale**:
 *   `content-product.php` now closes the product link after the image and gives
 *   the title its own anchor, so this rule had stopped describing the markup it
 *   was written for. The design draws one colour for the title and no hover
 *   state.
 *
 * ⚠ `:focus-visible` IS KEPT DELIBERATELY, and it is not an oversight. It fires
 *   for keyboard navigation only and never for the pointer, so it cannot bring
 *   back what Mitz asked to remove — while dropping it too would leave a
 *   focusable link with no visible focus state at all, since the title's anchor
 *   carries no other indicator.
 */
.bc-pdp-cards li.product .bc-pdp-card__title-link:focus-visible .woocommerce-loop-product__title {
	color: var(--pdp-c4);
}

/* ── 1. Filled buttons ──────────────────────────────────────────────────────
 * The panel's primary is handled at its own rule above (it carries !important).
 * These are the rest of the tan-filled controls, including the sticky bar's — the
 * sticky button had only the THEME's `button:hover`, which took it to #826852 and
 * left the dark label on it.
 *
 * ⚠ COLOR 6 AND A WHITE LABEL, per the design's own button set. Component set
 *   `Button` 33034:255272, row 1: `Type=Default` is `#c9a98a` with `#1f1f1f`
 *   text at rest and **`#49423f` with white** on hover. This block had
 *   `--pdp-c1` `#a4866c` with a dark label — a "darken one step" that the
 *   design does not draw anywhere.
 *
 * ⚠ THIS BLOCK IS WHY THE PER-BUTTON RULES DID NOT TAKE. It carries
 *   `!important` on all three properties, so editing `.bc-pdp-sticky__cta:hover`
 *   on its own changed nothing — measured `rgb(164,134,108)` with the fix
 *   already live in the deployed sheet. The panel's gate CTA moved only because
 *   its own rule is both `!important` AND more specific than the
 *   `.show-pincode-pop-up:hover` selector here. **The general block is the one
 *   that has to change.**
 *
 *   Found by grepping for `.bc-pdp-sticky` + `hover` after a CSSOM sweep for
 *   matching rules returned nothing — the second time that sweep has come back
 *   empty on a rule that plainly exists (Known Limitations 319).
 * ------------------------------------------------------------------------- */
.bc-pdp-sticky button:hover,
.bc-pdp-sticky button:focus-visible,
.bc-pdp-sticky .button:hover,
.bc-pdp-sticky .button:focus-visible,
.chuni-beef-banner .summary .show-pincode-pop-up:hover,
.chuni-beef-banner .summary .show-pincode-pop-up:focus-visible,
.chuni-beef-banner .summary .on-pincode-required:hover,
.chuni-beef-banner .summary .on-pincode-required:focus-visible {
	background-color: var(--pdp-c6) !important;
	border-color: var(--pdp-c6) !important;
	color: var(--pdp-c11) !important;
}

/* ── 4. Chips ───────────────────────────────────────────────────────────────
 * The frequency pills are fully clickable and gave no hover feedback at all.
 * Border only — see rule 4.
 *
 * ⚠ THE PURCHASE-OPTION ROWS ARE NO LONGER IN THIS RULE. Mitz took them out on
 *   2026-09-02, and that is right: the rule tinted a hovered row's border to c3,
 *   which is a state the design does not have. The export's selected and
 *   unselected boxes carry the identical #322b27 border, so a tan outline
 *   appearing under the cursor was inventing a third one.
 *
 *   The justification that stood here died with the same measurement. It read:
 *   "on a selected row the border is ALREADY c3, so the rule is a visual no-op
 *   there". It never was — the selected row's border is c8 — so on every row,
 *   in every state, this was a change rather than a no-op.
 *
 * ⚠ DELIBERATELY UNCONDITIONAL for the pill, though, after a first attempt keyed
 *   it on `.bc-pdp-option__radio:not(:checked) + …:hover`. On the selected pill
 *   the c3 border does sit under a c3 fill, so there the no-op argument holds.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-freq__pill-label:hover {
	border-color: var(--pdp-c3);
}

/* ── Motion ─────────────────────────────────────────────────────────────────
 * A 120ms colour transition on everything above, so the four patterns feel like
 * one system. Honours prefers-reduced-motion — the colour still changes, it just
 * arrives instantly.
 * ------------------------------------------------------------------------- */
@media (prefers-reduced-motion: no-preference) {
	.chuni-beef-banner .summary a,
	.chuni-beef-banner .summary button,
	.chuni-beef-banner .summary .button,
	.chuni-beef-banner .summary .bc-pdp-option__label,
	.chuni-beef-banner .summary .bc-pdp-freq__pill-label,
	.bc-pdp-cards a,
	.bc-pdp-cards button,
	.bc-pdp-cards .button,
	.bc-pdp-why a {
		transition: background-color 120ms ease, border-color 120ms ease, color 120ms ease;
	}
}

/*
 * ⚠ REMOVED 2026-09-01 — `.bc-pdp-details__links`, a related-links line inside an
 *   accordion panel. It was written for the "New To Raw Feedings?" row, which is
 *   gone on the designer's decision. Nothing in PHP emitted the class any more
 *   even before that: the row had been empty since 2026-08-31, so these rules had
 *   already stopped matching anything. Verified with a grep before deleting.
 */

/* ===========================================================================
 * Round eleven — the sticky bar, against node 33145:131121
 * ========================================================================= */

/* ⚠ `all`, NOT `min-width: 1000px`, since 2026-09-02: the design has tablet and
 * mobile sticky bars too, and every rule in this block is `.bc-pdp-sticky*` —
 * checked selector by selector before widening it — so nothing else can be
 * caught by the change. The declarations are identical at 1000px and up, so
 * desktop renders exactly as before; the narrow widths simply gain them, and
 * the overrides they need are at the end of this file. */
@media all {
	/*
	 * The bar carries a drop shadow in the design —
	 * `drop-shadow(0px 2px 5px rgba(0,0,0,0.12))` — which is what separates it from
	 * the page ground when it sits over the dark sections. It had none.
	 *
	 * The base colour is set here too: the bar inherited the theme's #111, so any
	 * text inside it that is not explicitly coloured (Yotpo's cloned markup, for
	 * one) rendered near-black on c8.
	 */
	.bc-pdp-sticky {
		box-shadow: 0 -2px 5px rgba(0, 0, 0, 0.12);
		color: var(--pdp-c5);
	}

	/* Design: `py-16` on the bar. The inner had horizontal padding only. */
	.bc-pdp-sticky__inner {
		padding: 16px var(--pdp-gutter);
	}

	/* ── The rating line ────────────────────────────────────────────────────────
	 * Design node 33145:134140: stars in Inter 14 at `Warning/500` (#f97316) with
	 * 1px of tracking on a 24px line, then the count in Inter SEMI BOLD 14 at c5 on
	 * a 16px line.
	 *
	 * ⚠ The count's TEXT is Yotpo's and stays that way — the design's "4.8 · 30
	 *   verified reviews" is mock data, and there is no rating data server-side to
	 *   build it from (see the note in inc/pdp-redesign.php). Only the TYPE is set
	 *   here. Styling a third-party widget's markup is why these selectors reach
	 *   for `[class*=]`.
	 * ------------------------------------------------------------------------- */
	.bc-pdp-sticky__rating {
		color: var(--pdp-c5);
		font-family: var(--pdp-font-body);
		font-size: var(--pdp-links);
		font-weight: 600;
		line-height: 16px;
	}

	.bc-pdp-sticky__rating [class*="star"] {
		color: #f97316;
		font-size: var(--pdp-links);
		letter-spacing: 1px;
		line-height: 24px;
	}

	.bc-pdp-sticky__rating [class*="bottom-line-text"],
	.bc-pdp-sticky__rating button,
	.bc-pdp-sticky__rating span {
		color: var(--pdp-c5);
		font-family: var(--pdp-font-body);
		font-size: var(--pdp-links);
		font-weight: 600;
		line-height: 16px;
	}
}

/* ── The accordion row that is still awaiting copy ───────────────────────────
 * "New To Raw Feedings?" holds the design's four-row structure while its copy is
 * commissioned. PHP marks it `aria-disabled`, and pdp-accordion.js returns early
 * on that, so the row cannot open onto an empty panel.
 *
 * Kept legible rather than greyed to the point of looking broken: the label dims
 * one step and the disc loses its fill, which reads as "not yet" rather than
 * "disabled forever". The moment a body exists, PHP stops emitting the attribute
 * and every rule here stops matching.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-details__row--pending .bc-pdp-details__toggle {
	cursor: default;
}

.chuni-beef-banner .summary .bc-pdp-details__row--pending .bc-pdp-details__toggle-text {
	color: var(--pdp-c5);
}

.chuni-beef-banner .summary .bc-pdp-details__row--pending .bc-pdp-details__chevron {
	background-color: transparent;
	border: 1px solid var(--pdp-c6);
}

.chuni-beef-banner .summary .bc-pdp-details__row--pending .bc-pdp-details__chevron::after {
	border-color: var(--pdp-c6);
}

/* ===========================================================================
 * Round twelve — the two trust rows became buttons
 *
 * Both now open the "PDP-View Delivery Areas & Schedule" popup (spucpt 78583) via
 * the Popups plugin's `.spu-open-78583` hook, so each bar is an interactive
 * control rather than a paragraph. That brings the UA's button styling with it,
 * which has to be undone before the bar looks like a bar again.
 * ========================================================================= */

.chuni-beef-banner .summary button.bc-pdp-shipping,
.chuni-beef-banner .summary button.bc-pdp-trust__row {
	/*
	 * A <button> centres its text, shrinks to content and picks up the UA font.
	 * The bar treatment in this file assumed a <p>, so all three are reset here and
	 * the existing rules keep working untouched.
	 */
	display: flex;
	align-items: center;
	width: 100%;
	font: inherit;
	text-align: left;
	cursor: pointer;
	/* The plugin adds `cursor: pointer` itself, but only to elements present when
	 * it initialises — this does not depend on that timing. */
}

/* The refund row has no icon, so it needs no gap; the shipping row's 12px gap is
 * already set on `.bc-pdp-shipping`. */
.chuni-beef-banner .summary button.bc-pdp-trust__row {
	gap: 0;
}

/*
 * ⚠ HOVER RULE 4 IS RETIRED FOR THESE TWO BARS. Mitz, 2026-09-09: "remove
 *   border radius, border and hover color border change." It used to read
 *   "rows move their BORDER, not their fill" — with the border itself gone
 *   there is nothing left for it to move, so the declaration is removed rather
 *   than left to look meaningful. **Both bars now have no hover state at all**,
 *   which is the instruction: the pointer still changes to a hand, because each
 *   bar opens the delivery-areas popup.
 *
 * ⚠ THE KEYBOARD STATE IS KEPT, deliberately, and it is NOT the border coming
 *   back. `:focus-visible` only ever matches a keyboard focus, never a pointer,
 *   so this is invisible to the behaviour that was asked about — and without it
 *   a keyboard user has two interactive controls they cannot see they are on.
 *   An `outline` rather than a border, so it cannot reintroduce the box that was
 *   just removed: an outline is drawn outside the border box and takes no layout
 *   space, so neither bar moves or resizes when it is focused.
 *
 * ⚠ AND IT NEEDS `!important`, for the third time today. Verified by keyboard:
 *   `matches(':focus-visible')` came back TRUE while the computed outline stayed
 *   `0px auto`, which is the signature of a lost cascade rather than a selector
 *   that missed. The winner is `style.css:4877` —
 *   `button:focus { outline: 0px dotted !important; outline: 0px auto
 *   -webkit-focus-ring-color !important }` — at (0,1,1). `:focus-visible` is a
 *   subset of `:focus`, so it matches these buttons too, and `!important` beats
 *   a non-important declaration whatever its specificity.
 *
 *   ⚠ That rule is site-wide and unscoped: **no button anywhere on this site
 *     shows a keyboard focus ring.** Only the two bars are put right here,
 *     because they are what this change touched — the general case is recorded
 *     rather than fixed by a stylesheet that only loads on product pages.
 */
.chuni-beef-banner .summary button.bc-pdp-shipping:focus-visible,
.chuni-beef-banner .summary button.bc-pdp-trust__row:focus-visible {
	outline: 2px solid var(--pdp-c3) !important;
	outline-offset: 2px !important;
}

/* "Refund & Returns" is bold text now rather than a link, so it takes the tan the
 * link used to carry — it is still the phrase the row is about. */
.chuni-beef-banner .summary button.bc-pdp-trust__row strong {
	color: var(--pdp-c3);
	font-weight: 600;
}

div.spu-box.bc-learn-popup {
    margin: 0px !important;
    z-index: 99999999 !important;
}

/* ── "View delivery areas & schedule" — a trigger that still reads as a link ──
 * Mitz 2026-08-31: no longer navigates, opens the delivery-areas popup, and keeps
 * its underline.
 *
 * The existing rule styles `.bc-pdp-gate__areas a`, which no longer matches now
 * that the anchor is a button — so the type is restated here rather than left to
 * inherit the UA's button styling. Same values as the link had: tan, 14px, 500,
 * underlined with a 2px offset.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-gate__areas-trigger {
	margin: 0;
	padding: 0;
	border: 0;
	background: none;
	color: var(--pdp-c3);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-links);
	font-weight: 500;
	line-height: var(--pdp-lh-links);
	text-align: left;
	text-decoration: underline;
	text-transform: none;
	text-underline-offset: 2px;
	cursor: pointer;
}

/* Hover rule 3: text links go tan → cream. The underline stays, because it is
 * what marks this as clickable at all. */
.chuni-beef-banner .summary .bc-pdp-gate__areas-trigger:hover,
.chuni-beef-banner .summary .bc-pdp-gate__areas-trigger:focus-visible {
	color: var(--pdp-c4);
	text-decoration: underline;
}

/* ===========================================================================
 * The delivery popup's body — woocommerce/pdp/pdp-learn-popup.php
 *
 * Three tabs over one panel, driven entirely by `:checked ~` sibling selectors.
 * There is no JavaScript here on purpose: the popup plugin injects and reveals
 * this markup dynamically, and a handler bound on DOMContentLoaded can miss it.
 *
 * ⚠ Scoped to `.bc-pdp-learn`, NOT to `.summary` like the rest of this file — the
 *   popup is appended to the body, outside the product panel entirely.
 * ========================================================================= */

.bc-pdp-learn {
	box-sizing: border-box;
	/*
	 * An explicit ground rather than inheriting the popup box's. The screenshot
	 * shows this content on the page's dark ground, and if the box were ever light
	 * every colour below would be unreadable — this makes the block correct on its
	 * own terms.
	 */
	background-color: var(--pdp-c7);
	color: var(--pdp-c4);
	font-family: var(--pdp-font-body);
}

/* The radios drive everything and are never seen. Not `display: none`, which would
 * take them out of the focus order and make the tabs keyboard-inoperable. */
.bc-pdp-learn__radio {
	position: absolute;
	width: 1px;
	height: 1px;
	overflow: hidden;
	clip: rect(0 0 0 0);
	white-space: nowrap;
}

/* ── The tab row ─────────────────────────────────────────────────────────────
 * Design: labels side by side over a 1px rule, the active one tan above a thicker
 * tan bar. The rule is on the ROW and the bar on the label, so the two cannot
 * drift apart.
 * ------------------------------------------------------------------------- */
.bc-pdp-learn__tabs {
	display: flex;
	gap: 48px;
	border-bottom: 1px solid var(--pdp-c4);
}

.bc-pdp-learn__tab {
	position: relative;
	margin: 0 0 -1px;   /* laps the row's rule so the active bar covers it */
	padding: 0 0 12px;
	color: var(--pdp-c4);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-body);
	font-weight: 600;
	line-height: 24px;
	cursor: pointer;
	transition: color 120ms ease;
}

.bc-pdp-learn__tab::after {
	content: "";
	position: absolute;
	right: 0;
	bottom: 0;
	left: 0;
	height: 3px;
	background-color: transparent;
}

.bc-pdp-learn__tab:hover {
	color: var(--pdp-c3);
}

/* ── Active tab and matching panel ───────────────────────────────────────────
 * One pair of rules per tab. `~` reaches forward from the radio to the tab row and
 * the panels, which is why every radio is emitted before both in the markup.
 * ------------------------------------------------------------------------- */
.bc-pdp-learn__radio--delivery:checked ~ .bc-pdp-learn__tabs .bc-pdp-learn__tab--delivery,
.bc-pdp-learn__radio--returns:checked ~ .bc-pdp-learn__tabs .bc-pdp-learn__tab--returns,
.bc-pdp-learn__radio--tcs:checked ~ .bc-pdp-learn__tabs .bc-pdp-learn__tab--tcs {
	color: var(--pdp-c3);
}

.bc-pdp-learn__radio--delivery:checked ~ .bc-pdp-learn__tabs .bc-pdp-learn__tab--delivery::after,
.bc-pdp-learn__radio--returns:checked ~ .bc-pdp-learn__tabs .bc-pdp-learn__tab--returns::after,
.bc-pdp-learn__radio--tcs:checked ~ .bc-pdp-learn__tabs .bc-pdp-learn__tab--tcs::after {
	background-color: var(--pdp-c3);
}

/* Focus has to be visible on the LABEL, because the input it belongs to is
 * clipped — without this the tabs are keyboard-operable but silent. */
.bc-pdp-learn__radio:focus-visible ~ .bc-pdp-learn__tabs .bc-pdp-learn__tab {
	outline: 2px solid var(--pdp-c3);
	outline-offset: 4px;
}

.bc-pdp-learn__panel {
	display: none;
	padding: 32px 0 0;
}

.bc-pdp-learn__radio--delivery:checked ~ .bc-pdp-learn__panels .bc-pdp-learn__panel--delivery,
.bc-pdp-learn__radio--returns:checked ~ .bc-pdp-learn__panels .bc-pdp-learn__panel--returns,
.bc-pdp-learn__radio--tcs:checked ~ .bc-pdp-learn__panels .bc-pdp-learn__panel--tcs {
	display: block;
}

/* ── Panel content ───────────────────────────────────────────────────────────
 * Heading in Northwest uppercase, body in Inter, the email underlined — the same
 * treatment links get everywhere else on this page.
 * ------------------------------------------------------------------------- */
.bc-pdp-learn__heading {
	margin: 0 0 8px;
	color: var(--pdp-c4);
	font-family: var(--pdp-font-heading);
	font-size: 24px;
	font-weight: 400;
	line-height: 32px;
	text-transform: uppercase;
}

.bc-pdp-learn__body {
	margin: 0;
	color: var(--pdp-c4);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-body);
	font-weight: 400;
	line-height: 26px;
}

.bc-pdp-learn__body a {
	color: var(--pdp-c4);
	text-decoration: underline;
	text-underline-offset: 2px;
}

.bc-pdp-learn__body a:hover,
.bc-pdp-learn__body a:focus-visible {
	color: var(--pdp-c3);
}

/* The `--pending` rules that lived here are gone: all three tabs now render a
 * real page's content. See the popup partial. */

/* ===========================================================================
 * The popup's tabs render whole PAGES — neutralise their page-level markup
 *
 * Each tab now shows an existing page's content, moved verbatim into
 * template-parts/legal/. That markup was written for a full-width page, so it
 * arrives carrying Bootstrap's `.container` (a fixed max-width plus 15px gutters),
 * `.row` (negative margins), `.col-*` (padding and floats) and section wrappers
 * with page-scale vertical spacing.
 *
 * ⚠ The partials are NOT edited to suit the popup — the pages are their primary
 *   consumer and must keep rendering as they do. Everything below undoes that
 *   page framing for the popup only, scoped under `.bc-pdp-learn`.
 * ========================================================================= */

/*
 * Bootstrap's grid, flattened. `max-width: none` because `.container` otherwise
 * pins itself to a breakpoint width and leaves the popup's own padding doubled;
 * the negative `.row` margins have to go with it or the content overhangs.
 *
 * ⚠ `display: block` AND `min-width: 0` ARE LOAD-BEARING — WITHOUT THEM THIS RULE
 *   MAKES THE OVERFLOW IT EXISTS TO PREVENT.
 *
 *   `.row` is `display: flex`, so the columns are flex items, and a flex item's
 *   automatic minimum size (`min-width: auto`) is its MAX-CONTENT width — the
 *   longest line it could draw without wrapping. Bootstrap's own
 *   `max-width: 100%` normally caps that. Removing the cap on the line above,
 *   and nothing else, let every column expand to its longest unwrapped line:
 *   the 550px panel measured `scrollWidth: 1524px`, text ran off the right edge
 *   and the panel grew a horizontal scrollbar.
 *
 *   Blocks, not flex items, is the honest fix — this is a one-column page being
 *   read as prose, so there is no row to lay out. `min-width: 0` stays as belt
 *   and braces for any nested grid that keeps its own `display`.
 */
.bc-pdp-learn .container,
.bc-pdp-learn .container-fluid,
.bc-pdp-learn .row,
.bc-pdp-learn [class^="col-"],
.bc-pdp-learn [class*=" col-"] {
	display: block;
	width: auto;
	max-width: 100%;
	min-width: 0;
	margin-right: 0;
	margin-left: 0;
	padding-right: 0;
	padding-left: 0;
	float: none;
	flex: none;
}

/*
 * ⚠ Belt and braces: the panel must never scroll sideways. If a page ever nests
 *   something genuinely wider than the panel — a fixed-width table, a long URL —
 *   it clips rather than pushing the whole tab out of the popup, which is how the
 *   grid bug above presented.
 */
.bc-pdp-learn {
	max-width: 100%;
	min-width: 0;
	overflow-wrap: break-word;
}

/*
 * The pages set page-scale side padding on their body paragraphs (30px on
 * `.term-con-p1`). Against a 550px popup that is a visible indent under every
 * heading; the design draws body copy flush with the heading above it.
 */
.bc-pdp-learn .term-con-p1,
.bc-pdp-learn .term-con,
.bc-pdp-learn .text {
	padding-right: 0;
	padding-left: 0;
}

/*
 * The pages' own section wrappers carry full-page vertical rhythm — 80px+ in
 * places — which inside a popup reads as broken spacing rather than generosity.
 */
.bc-pdp-learn .faq_sec,
.bc-pdp-learn .term-between,
.bc-pdp-learn .subscribe-sec,
.bc-pdp-learn .same-class {
	margin: 0;
	padding: 0;
	background: none;
}

/*
 * ⚠ AND THE BAND IS A PSEUDO-ELEMENT, WHICH `background: none` ABOVE NEVER
 *   TOUCHED — Mitz, QA 2026-09-16: "remove background".
 *
 *   `style.css:470` gives `.subscribe-sec:before` a full-bleed tan band:
 *   `content: ""`, `background-color: #A4866C`, `width: 9999px`, `left: -50%`,
 *   `height: 100%`, `z-index: -1`. On its own page that is how the section
 *   reaches the viewport edges. Inside the popup it is a tan slab behind the
 *   closing paragraph of Returns and T&Cs — measured 9999×210 — and its width
 *   is also what put a horizontal scrollbar under the popup.
 *
 *   The rule above clears the element's own background, so the band survived it.
 *   `content: none` removes the box entirely rather than repainting it, which
 *   also takes the 9999px with it. Applied to all four wrappers for the same
 *   reason they share the rule above: any of these pages can gain one.
 */
.bc-pdp-learn .faq_sec::before,
.bc-pdp-learn .term-between::before,
.bc-pdp-learn .subscribe-sec::before,
.bc-pdp-learn .same-class::before {
	content: none;
}

/*
 * ⚠ Each page opens with its own <h1> — "Privacy Policy", "Terms", and so on. The
 *   TAB already names the section, so the h1 repeats it two lines apart, and an h1
 *   inside a dialog is the wrong outline level besides. Hidden rather than removed
 *   from the partial, since the page needs it.
 */
.bc-pdp-learn h1 {
	display: none;
}

/* ── Type, on the popup's dark ground ────────────────────────────────────────
 * These pages were built for a light ground, so every colour has to be restated —
 * otherwise the copy inherits near-black and disappears. Sizes follow the PDP's
 * scale rather than the pages' own, so the popup reads as part of this design.
 * ------------------------------------------------------------------------- */
.bc-pdp-learn h2,
.bc-pdp-learn h3,
.bc-pdp-learn h4,
.bc-pdp-learn .heading,
.bc-pdp-learn .heading-2 {
	margin: 0 0 8px;
	color: var(--pdp-c4);
	font-family: var(--pdp-font-heading);
	font-size: 24px;
	font-weight: 400;
	line-height: 32px;
	text-transform: uppercase;
}

.bc-pdp-learn p,
.bc-pdp-learn li,
.bc-pdp-learn .term-con-p1,
.bc-pdp-learn .subs-heading {
	color: var(--pdp-c4);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-body);
	font-weight: 400;
	line-height: 26px;
	/* Explicit, so bullets track the same as the paragraphs beside them: the pages
	 * gave `.term-con-p1` 0.2px and their <style> block gave `li` the same, and
	 * dropping that block left the two disagreeing. */
	letter-spacing: 0.2px;
}

/*
 * `.term-con-p` WAS the pages' sub-heading class, styled here as a standalone
 * heading. Those <p>s are now consumed into <summary> elements by the popup
 * partial, so this rule matches nothing in a section body — kept only for the
 * fallback path where a page has no `term-con-p` at all and prints whole.
 */
.bc-pdp-learn .term-con-p {
	margin: 24px 0 4px;
	color: var(--pdp-c3);
	font-family: var(--pdp-font-heading);
	font-size: var(--pdp-h6);
	line-height: var(--pdp-h6-lh);
	text-transform: uppercase;
}

.bc-pdp-learn .term-p {
	color: var(--pdp-c5);
	font-size: var(--pdp-links);
	text-transform: uppercase;
}

.bc-pdp-learn a {
	color: var(--pdp-c4);
	text-decoration: underline;
	text-underline-offset: 2px;
}

.bc-pdp-learn a:hover,
.bc-pdp-learn a:focus-visible {
	color: var(--pdp-c3);
}

/*
 * ⚠ REMOVED 2026-09-01. This rule hid the delivery page's two "Why Raw" /
 *   "Get in touch" button IMAGES — and only the images. Their `.we-section`
 *   wrapper and its `<h5>` labels went on rendering, so the popup showed a tan
 *   block reading "Why Raw" and "Get in touch" at the foot of the FAQ row.
 *
 *   The wrapper is now dropped by the DOM walk in the popup partial, which takes
 *   the images with it, so hiding them here would be dead CSS.
 */

/*
 * ⚠ These pages are long — /terms/ alone is several hundred lines. The panel
 *   scrolls rather than growing the popup past the viewport, and gets a little
 *   right padding so the scrollbar does not sit on the text.
 */
.bc-pdp-learn__panel {
	padding-right: 12px;
	overflow-y: auto;
	overscroll-behavior: contain;
}

/* ── The popup fills the viewport height ─────────────────────────────────────
 * Mitz, 2026-09-01: "investigate why the canvas/pop-up not full height?"
 *
 * ⚠ THE CAP WAS MINE, AND THE ARITHMETIC IS EXACT. The rule above used to read
 *   `max-height: min(60vh, 520px)`. At a 900px viewport that resolves to 520, and
 *   520 + 36 (the tab row) + 50 (the plugin box's 25px padding, top and bottom)
 *   = 606 — precisely the height the box measured. Nothing in the popups plugin
 *   was limiting it; the panel simply refused to grow and the box shrank to fit.
 *
 * ⚠ Targeted by `.spu-box.bc-learn-popup`, the id the plugin puts on this popup's box, NOT by
 *   `.spu-box` — which every other popup on the site shares — and not by
 *   `:has(.bc-pdp-learn)`, which would work here but is a heavier selector for
 *   something an id already identifies exactly. The design draws this popup as a
 *   full-height right-hand drawer; other popups keep their own geometry.
 *
 * The chain is flex the whole way down so the PANEL is what scrolls and the tab
 * row stays put. `min-height: 0` at every level is load-bearing: a flex child's
 * automatic minimum size is its content, so without it the panel refuses to
 * shrink and pushes the box taller than the viewport — the same mechanism that
 * caused the 1524px sideways overflow earlier in this file.
 * ------------------------------------------------------------------------- */
/*
 * ⚠ `!important` HERE IS BEATING AN INLINE STYLE, NOT LOSING A SPECIFICITY ARGUMENT.
 *
 *   The popups plugin's JS writes this onto the box when it opens:
 *
 *       style="position: absolute; top: 1px; bottom: auto;"
 *
 *   — `absolute`, with `top` set to the scroll offset at the moment of opening. So
 *   the box is pinned to a DOCUMENT position and scrolls away with the page. Measured
 *   with the popup open: `docTop` stayed at 1px while the box's viewport top went from
 *   0 to −1399 as the page scrolled (Mitz, 2026-09-01: "the canvas/popup can be
 *   scroll … Only the content should be scrollable and canvas stay in place").
 *
 *   An inline declaration beats any normal rule in a stylesheet, which is why the
 *   plain `top: 0` written here first never applied — the box was `absolute` the whole
 *   time and only looked correct because the page happened to be at scroll 0. An
 *   IMPORTANT author declaration does outrank a normal inline one, so these three win
 *   no matter what the plugin recomputes on scroll or resize.
 *
 *   Scoped to this popup's id, so every other popup keeps the plugin's behaviour.
 */
.spu-box.bc-learn-popup {
	position: fixed !important;
	top: 0 !important;
	bottom: auto !important;
	height: 100vh;
	max-height: 100vh;
	padding: 0;         /* see the note below — our root owns the inset */
	overflow: hidden;   /* the panel scrolls, never the box */
}

/*
 * ⚠ ABSOLUTE, NOT A FLEX CHAIN — BECAUSE THE CHAIN HAS NODES WE DO NOT CONTROL.
 *
 *   A first attempt made `.spu-content`, `.bc-pdp-learn` and `.__panels` flex
 *   children with `min-height: 0`. It did not work, and printing the nodes between
 *   the box and our root showed why: the popup's own `post_content` is
 *   `<div><div>[pdp_learn_popup]</div></div>`, so there are TWO plain wrapper divs
 *   in between at `display: block; flex: 0 1 auto`. They grew to content height and
 *   the constraint stopped there — the panel measured 999px inside a 900px box and
 *   the BOX scrolled instead of the panel.
 *
 *   Positioning our root absolutely skips every wrapper, however many the popup's
 *   content happens to have.
 *
 * ⚠ AND OUR ROOT OWNS THE INSET, because the plugin's box padding no longer
 *   applies to it. I first wrote this expecting `inset: 0` to sit inside that
 *   25px padding — it does not. An absolutely positioned box resolves its offsets
 *   against the containing block's padding box, and `top: 0` lands on that box's
 *   OUTER edge, i.e. against the border, with the padding INSIDE the area it can
 *   fill. Measured: the tab row jumped to viewport y=0 and the copy went flush to
 *   the popup's edges.
 *
 *   So the plugin's padding is zeroed and the same spacing is declared here, in
 *   one place that actually governs it. A consequence worth knowing: changing
 *   "padding" in this popup's settings now has no effect on its layout.
 *
 *   ⚠ Do not "simplify" this back to a flex chain. Whoever edits the popup body in
 *     WP admin decides how many divs sit in the middle, and the block editor adds
 *     them freely.
 */
.spu-box.bc-learn-popup .bc-pdp-learn {
	position: absolute;
	inset: 0;
	display: flex;
	flex-direction: column;
	padding: 25px;
}

.spu-box.bc-learn-popup .bc-pdp-learn__panels {
	display: flex;
	flex: 1;
	flex-direction: column;
	min-height: 0;
}

/*
 * The panels are display:none until their radio is checked, so `flex: 1` cannot
 * come from a shared rule — it has to land on the CHECKED one, which is already
 * switched to `display: block` by the selectors above.
 */
.bc-pdp-learn__radio--delivery:checked ~ .bc-pdp-learn__panels .bc-pdp-learn__panel--delivery,
.bc-pdp-learn__radio--returns:checked ~ .bc-pdp-learn__panels .bc-pdp-learn__panel--returns,
.bc-pdp-learn__radio--tcs:checked ~ .bc-pdp-learn__panels .bc-pdp-learn__panel--tcs {
	flex: 1;
	min-height: 0;
}

/* ===========================================================================
 * The popup's collapsible sections — Shipping.png, 2026-08-31
 *
 * Each tab is an intro block followed by one collapsible row per section. The
 * split comes from the pages' own `term-con-p` headings; see the popup partial.
 *
 * ⚠ <details>/<summary>, not a CSS or JS accordion. The plugin injects and reveals
 *   this markup dynamically, so a script binding on DOMContentLoaded can miss it;
 *   `<details>` toggles natively, is keyboard-operable and announced correctly, and
 *   needs no unique ids. Only the marker is restyled.
 * ========================================================================= */

/* The intro sits above the rows and is not collapsible — heading plus a paragraph,
 * exactly as the design draws it. */
.bc-pdp-learn__intro {
	margin: 0 0 32px;
}

.bc-pdp-learn__section {
	border-bottom: 1px solid var(--pdp-c6);
}

/* ── The row heading ────────────────────────────────────────────────────────
 * Design: tan, Northwest, uppercase, with a thin +/− at the right. Deliberately
 * NOT the tan disc the PDP's own PRODUCT DETAILS accordion uses — this popup draws
 * a bare glyph, and copying the disc across would be inventing consistency the
 * design does not ask for.
 * ------------------------------------------------------------------------- */
.bc-pdp-learn__summary {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	padding: 16px 0;
	color: var(--pdp-c3);
	font-family: var(--pdp-font-heading);
	font-size: var(--pdp-h6);
	font-weight: 400;
	line-height: var(--pdp-h6-lh);
	text-transform: uppercase;
	list-style: none;   /* Firefox's default triangle */
	cursor: pointer;
}

/* Safari and older Chrome draw their own marker through a pseudo-element that
 * `list-style: none` does not reach. */
.bc-pdp-learn__summary::-webkit-details-marker {
	display: none;
}

/*
 * The +/− is built from two bars: `::after` is the horizontal one and is always
 * present, `::before` the vertical one, hidden when the row is open. Drawn rather
 * than typed so the two states are the same width and cannot shift the heading.
 */
.bc-pdp-learn__summary::after {
	content: "";
	flex: none;
	width: 14px;
	height: 2px;
	background-color: var(--pdp-c3);
}

.bc-pdp-learn__summary::before {
	content: "";
	position: absolute;
	right: 6px;
	width: 2px;
	height: 14px;
	background-color: var(--pdp-c3);
}

.bc-pdp-learn__section {
	position: relative;   /* anchors the vertical bar above */
}

/* Open: the vertical bar goes, leaving a minus. */
.bc-pdp-learn__section[open] > .bc-pdp-learn__summary::before {
	display: none;
}

.bc-pdp-learn__summary:hover {
	color: var(--pdp-c4);
}

.bc-pdp-learn__summary:hover::after,
.bc-pdp-learn__summary:hover::before {
	background-color: var(--pdp-c4);
}

.bc-pdp-learn__summary:focus-visible {
	outline: 2px solid var(--pdp-c3);
	outline-offset: 2px;
}

/* ── The revealed body ─────────────────────────────────────────────────────── */
.bc-pdp-learn__section-body {
	padding: 8px 0 24px;
}

/*
 * The pages nest their own lists inside these sections. Bootstrap and the theme
 * both strip list styling globally, so the bullets the design shows have to be put
 * back — and the indent with them, since a bullet outside the box would clip.
 */
.bc-pdp-learn__section-body ul,
.bc-pdp-learn__intro ul {
	margin: 16px 0;
	padding-left: 20px;
	list-style: disc outside;
}

.bc-pdp-learn__section-body li,
.bc-pdp-learn__intro li {
	margin: 0 0 4px;
	list-style: disc outside;
}

/*
 * The pages' own bottom-margin on paragraphs is page-scale. Inside a section it
 * reads as a gap between unrelated blocks.
 */
.bc-pdp-learn__section-body p {
	margin: 0 0 12px;
}

.bc-pdp-learn__section-body p:last-child {
	margin-bottom: 0;
}

/* ── The intro block's own heading ───────────────────────────────────────────
 * Design: the intro heading is CREAM and larger than the rows beneath it — it
 * titles the tab, where the tan headings label collapsible sections. Both are
 * `p.term-con-p` in the source, so the intro's copy is targeted by position.
 * ------------------------------------------------------------------------- */
.bc-pdp-learn__intro .term-con-p {
	margin: 0 0 8px;
	color: var(--pdp-c4);
	font-family: var(--pdp-font-heading);
	font-size: 24px;
	line-height: 32px;
	text-transform: uppercase;
}

/*
 * ⚠ Hidden on the DELIVERY panel only, because the design specifies that tab's
 *   intro exactly — heading plus one paragraph — and shows neither the page's
 *   "LAST UPDATED" stamp nor its "Our delivery costs vary…" standfirst.
 *
 *   Not hidden globally: the design says nothing about Returns or T&Cs, and on
 *   those tabs `h2.heading-2` carries a genuinely useful opening paragraph. Hiding
 *   it everywhere would delete content the design never asked to remove.
 */
.bc-pdp-learn__panel--delivery .bc-pdp-learn__intro .date-to,
.bc-pdp-learn__panel--delivery .bc-pdp-learn__intro .faq_sec {
	display: none;
}

/*
 * ⚠ `.faq_sec` — THE WRAPPER — AND NOT `h2.heading-2` INSIDE IT.
 *
 *   The page writes its standfirst as `<h2 class="heading-2"><p>…</p></h2>`, which
 *   is invalid: `<p>` is not phrasing content. libxml's HTML parser recovers by
 *   HOISTING the `<p>` OUT of the `h2`, so once the popup round-trips the page
 *   through DOMDocument the text is a SIBLING of the heading, not a descendant.
 *   The old rule hid an `h2` that had been left empty while the copy it was meant
 *   to hide went on rendering — with the selector looking perfectly correct.
 *
 *   `.faq_sec` holds exactly the `h1` and that standfirst, both of which the design
 *   omits from this tab, so hiding the wrapper is both simpler and immune to how
 *   the parser rearranges what is inside it.
 *
 *   Delivery only: the design specifies that tab's intro exactly and says nothing
 *   about Returns or T&Cs, where the same standfirst is genuinely useful. (Their
 *   `h1` is still hidden globally.)
 */

/* ── Everything in the popup reads left ─────────────────────────────────────
 * Mitz, 2026-09-01. The pages centre a few of their own blocks — the intro
 * heading (`.term-con-p.big-txt`) and four `.term-con-p1` paragraphs, plus the
 * support-email link inheriting from one of them. Centred copy is page-scale
 * furniture; in a 550px panel of running prose it reads as broken.
 *
 * ⚠ Scoped one level deeper than the page's own rules ON PURPOSE. `.term-con-p1`
 *   is (0,1,0); `.bc-pdp-learn .term-con-p1` is (0,2,0) and wins without needing
 *   `!important`. Reaching for `!important` here would also override the flex
 *   alignment on `__summary`, which is doing real work.
 *
 * The whole subtree is covered rather than the three known offenders, so a page
 * edit that centres something new cannot quietly reintroduce this.
 * ------------------------------------------------------------------------- */
.bc-pdp-learn,
.bc-pdp-learn p,
.bc-pdp-learn li,
.bc-pdp-learn a,
.bc-pdp-learn h1,
.bc-pdp-learn h2,
.bc-pdp-learn h3,
.bc-pdp-learn h4,
.bc-pdp-learn h5,
.bc-pdp-learn h6,
.bc-pdp-learn div,
.bc-pdp-learn span,
.bc-pdp-learn .term-con,
.bc-pdp-learn .term-con-p,
.bc-pdp-learn .term-con-p1,
.bc-pdp-learn .term-p,
.bc-pdp-learn .text,
.bc-pdp-learn .date-to,
.bc-pdp-learn .heading,
.bc-pdp-learn .heading-2,
.bc-pdp-learn .hea_faq,
.bc-pdp-learn .card-header,
.bc-pdp-learn .card-body,
.bc-pdp-learn .btn-link {
	text-align: left;
}

/* ── Two indents that beat my earlier rules, both diagnosed in the cascade ───
 * Shipping.png draws the intro paragraph FLUSH LEFT with its heading, and the
 * bullets as DISCS at a modest indent. The popup rendered the paragraph 30px in
 * and the bullets as dashes 60px in. Neither override was mine, and neither was
 * findable by reading this stylesheet — both came out of walking
 * `document.styleSheets` and keeping the rules the element actually matches.
 * ------------------------------------------------------------------------- */

/*
 * ⚠ THE 30px INDENT IS THE POPUPS PLUGIN'S OWN CSS:
 *     popups/…/style.css  →  `.spu-content p:last-child { padding: 0 30px }`
 *
 *   Specificity (0,2,1), which beats `.bc-pdp-learn .term-con-p1` (0,2,0). It hit
 *   ONE paragraph — the intro's — purely because that paragraph happens to be its
 *   parent's `:last-child`, which is why the identical class inside a section body
 *   was already flush and the two disagreed with no rule of mine to explain it.
 *
 *   Answered with THREE classes (0,3,1) rather than a tie. Our own class chain
 *   would tie at (0,2,1) and win only on load order — the theme's CSS happens to
 *   enqueue after the plugin's today, and a rule whose correctness rests on that
 *   is a rule that breaks when a plugin changes its enqueue priority.
 */
.bc-pdp-learn__panels .bc-pdp-learn__panel .bc-pdp-learn__intro p,
.bc-pdp-learn__panels .bc-pdp-learn__panel .bc-pdp-learn__intro li,
.bc-pdp-learn__panels .bc-pdp-learn__panel .bc-pdp-learn__section-body p,
.bc-pdp-learn__panels .bc-pdp-learn__panel .bc-pdp-learn__section-body li {
	padding-right: 0;
	padding-left: 0;
}

/*
 * ⚠ THE BULLETS WERE DASHES, FROM AN `!important` IN THE THEME:
 *     style.css  →  `.delivery-shipping li { list-style-type: "-" !important }`
 *
 *   `!important` beats specificity outright, so the `list-style: disc` I added
 *   last round never applied and my note claiming "bullets restored to discs" was
 *   simply wrong. `!important` here is answering an `!important` — the only case
 *   where reaching for it is not just losing a specificity argument — and it is
 *   scoped to this popup so the delivery PAGE keeps the dashes it was given.
 *
 * ⚠ The 40px indent is separate, from an inline `<style>`:
 *     `.termslist li { margin-left: 40px }`
 *
 *   That is (0,1,1) — the SAME specificity as `.bc-pdp-learn__section-body li`,
 *   and it appears later in the cascade, so it won a tie. Two classes settles it.
 */
.bc-pdp-learn .bc-pdp-learn__intro li,
.bc-pdp-learn .bc-pdp-learn__section-body li {
	margin-left: 0;
	list-style-type: disc !important;
}

/* ── The FAQ's sub-rows ──────────────────────────────────────────────────────
 * Mitz, 2026-09-01: "make the sub dropdown the same to the outside dropdown".
 *
 * ⚠ There is deliberately almost nothing here. The popup partial rewrites the
 *   page's Bootstrap collapse cards into the SAME `<details>` markup with the
 *   SAME classes as the outer rows, so they inherit every rule above — colour,
 *   face, size, the two-bar +/− marker, the hairline. "The same" by construction,
 *   not a second set of declarations kept in sync by hand.
 *
 * The one exception: the last sub-row's hairline is dropped so the PARENT row's
 * hairline closes the group, rather than two rules sitting 24px apart.
 *
 * ⚠ `:last-of-type`, NOT `:last-child`. The sub-rows are not the last children of
 *   the body — the delivery page ends with a hidden `.we-section` (two nav buttons)
 *   which the walk emits after them, so `:last-child` silently matched nothing.
 *   Read off the rendered child list rather than assumed: the body's children are
 *   [details, details, div.we-section].
 * ------------------------------------------------------------------------- */
.bc-pdp-learn__section-body .bc-pdp-learn__section:last-of-type {
	border-bottom: 0;
}

/* ── The Returns and T&Cs tabs opened 132px down ─────────────────────────────
 * Mitz, 2026-09-01: "for Returns and T&Cs tab, the content started with huge
 * space remove it".
 *
 * ⚠ THE SPACE IS A TOP MARGIN ON AN ID, DECLARED `!important`, WHICH IS WHY THE
 *   WRAPPER RULE ABOVE MISSED IT:
 *
 *       style.css  →  #all-page-header-space { margin-top: 132px !important }
 *
 *   `.bc-pdp-learn .faq_sec` sets `margin: 0` at (0,2,0) and never had a chance —
 *   against `!important`, specificity is not the contest. The name says what it is:
 *   the offset that clears the site's fixed header on a real page. Inside a popup it
 *   is 132px of nothing.
 *
 *   So `!important` here answers an `!important`, and the selector carries the ID so
 *   it also outranks the theme's (1,1,0) against (1,0,0) at equal weight. A first
 *   attempt without `!important` changed nothing, and the computed value stayed 132px.
 *
 *   Measured, not assumed: `margin: 132px 0px 0px` computed, with the intro starting
 *   at 164px from the panel top on Returns and T&Cs against 32px on Delivery (which
 *   never showed it, because that tab hides `.faq_sec` outright).
 *
 * ⚠ Delivery is unaffected either way, so this is NOT a substitute for that rule.
 *
 * A note on how this was nearly missed: the cascade probe listed every rule matching
 * this element that set `margin`, and found none — because the offending rule sets
 * `margin-top`, and the shorthand is not what it declared. When a probe filters by
 * property name, longhands and shorthands are different names.
 * ------------------------------------------------------------------------- */
.bc-pdp-learn #all-page-header-space {
	margin-top: 0 !important;
}

/*
 * ⚠ The bare Yotpo mount in single-product-combo.php, hidden until the accordion
 *   script lifts `.arrive-ferozen-text` out of it and into the Reviews row.
 *
 *   Only the SOURCE wrapper is hidden. Once the widget has been moved it lives
 *   inside `.bc-pdp-details`, so this rule no longer reaches it — what stays behind
 *   is an empty div. Do not scope this any wider.
 */
.bc-pdp-reviews-source {
	display: none;
}

/* ── Where the panel's hairlines actually belong ─────────────────────────────
 * Mitz marked five of them on a full-page screenshot, 2026-09-01. Checked one by
 * one against `PDP-with-sticky.png`, cropped at each point rather than eyeballed.
 *
 * The design's rules, top to bottom:
 *
 *   rating block → RULE → bullets → calculator line → RULE → PURCHASE OPTION
 *   … options → RULE → gate prompt → input → areas link → RULE → quantity row
 *   … shipping row → (no rule) → delivery-problem row → SSL box
 *   … PRODUCT DETAILS → RULE → accordion rows (each with its own bottom rule)
 *   … last row's rule → FORMULATED BY NUTRITIONISTS
 *
 * ⚠ Three of the five were attached to the element AFTER the gap rather than the
 *   one before it, which put each line one slot too low. The two that were right —
 *   before PURCHASE OPTION and before the gate prompt — are untouched.
 * ------------------------------------------------------------------------- */

/*
 * A — above the bullets. `!important` because `.bc-pdp-benefits` already carries
 * `padding: 0 !important` at the same specificity a few hundred lines up.
 *
 * ⚠ c8 (#322b27), not c6, and that is MEASURED: the export's rule above PURCHASE
 *   OPTION samples #322B27 at y=391. Mitz moved the three panel rules — this one,
 *   the gate prompt's and the areas link's — from c6 to c8 on 2026-09-02, and the
 *   design agrees with all three.
 */
.chuni-beef-banner .summary .bc-pdp-benefits {
	margin-top: 24px !important;
	padding-top: 24px !important;
	border-top: 1px solid var(--pdp-c8);
}

/*
 * B — below the areas link, which is `grid-column: 1 / -1` and so spans the full
 * 668 panel. `!important` for the same reason: its own rule sets
 * `margin: 4px 0 0 !important`.
 */
.chuni-beef-banner .summary form.cart > .bc-pdp-gate__areas {
	padding-bottom: 24px !important;
	border-bottom: 1px solid var(--pdp-c8);
	margin-bottom: 12px !important;
}

/* D — under the PRODUCT DETAILS heading. */
.chuni-beef-banner .summary .bc-pdp-details__heading {
	padding-bottom: 12px;
	border-bottom: 1px solid var(--pdp-c3);
}

/*
 * ⚠ "See Refund & Returns" rendered as "SeeRefund & Returns".
 *
 *   The row is `display: flex` and the `<strong>` is blockified into a flex item,
 *   so the trailing space in the text node before it is trimmed — the space is in
 *   the HTML and in `textContent`, and only the flex layout removes it. A gap puts
 *   Fixed by not flexing a row that has nothing to lay out: the rule that sets
 *   `display: flex` covers the shipping row AND this one, and its own comment says
 *   this row has no icon and therefore `gap: 0` - the admission that it never
 *   needed flex. Text in normal flow keeps its own spaces.
 *
 * (!) `button.` is load-bearing: the existing rule is (0,3,1); a first attempt at
 *   (0,3,0) lost silently, computed column-gap stayed 0px and the space stayed gone.
 */
.chuni-beef-banner .summary button.bc-pdp-trust__row {
	display: block;
}

/* ── Card order: rating above the description ────────────────────────────────
 * `PDP-with-sticky.png` stacks a card as: image → title → stars and review count
 * → description → the two option rows → Add Item.
 *
 * ⚠ The MARKUP order is image/title → description → rating → form. The description
 *   sits in `.sub_and_save_frame` and the rating in `.for_yotpo_in_sub`, and the
 *   template emits them that way round.
 *
 * ⚠ Done with `order`, not by moving the markup. `.for_yotpo_in_sub` is where Yotpo
 *   builds its widget client-side, and this project has twice paid for moving nodes
 *   Yotpo owns — the escaped widget and the duplicated instance id. Reordering flex
 *   children touches neither the node nor its position in the DOM.
 *
 * The card is already `display: flex; flex-direction: column`, so this is only the
 * four `order` values. Applies to BOTH carousels: "You may also like" and
 * "Recently viewed items" share `.bc-pdp-cards`, verified on the rendered page.
 * ------------------------------------------------------------------------- */
.bc-pdp-cards li.product > a.woocommerce-LoopProduct-link {
	order: 1;
}

/*
 * ⚠ THE ORDERING MOVED INSIDE THE BODY, because the children moved.
 *   `content-product.php` now closes the product link after the image and wraps
 *   everything else in `.bc-pdp-card__body`, so the rating, the blurb and the
 *   form are no longer children of the card and `li.product > X` stopped
 *   reaching them. The card has exactly two children now; the body is the flex
 *   column that reorders its own.
 *
 * ⚠ `flex: 1 1 auto` on the body is load-bearing. `form.cart` keeps
 *   `margin-top: auto` so the Add Item buttons line up across cards whose text
 *   runs to different lengths, and `auto` only has room to work if the body
 *   fills the leftover height of the card rather than hugging its content.
 */
.bc-pdp-cards li.product > .bc-pdp-card__body {
	order: 2;
	display: flex;
	flex: 1 1 auto;
	flex-direction: column;
}

/*
 * ⚠ THE BODY IS NAMED SO THIS BEATS THE CATCH-ALL. Written as
 *   `.bc-pdp-cards li.product .bc-pdp-card__title-link` the selector was
 *   (0,3,1) — exactly the same weight as the `.bc-pdp-card__body > *`
 *   `order: 9` rule below, which comes LATER in the file and so won the tie.
 *   The title then rendered UNDER the Add Item button: measured, the title
 *   link computed `order: 9` and sat at y=600 in a 656-tall card.
 */
.bc-pdp-cards li.product .bc-pdp-card__body > .bc-pdp-card__title-link {
	order: 1;
	display: block;
	text-decoration: none;
}

.bc-pdp-cards li.product .bc-pdp-card__body > .for_yotpo_in_sub {
	order: 2;
}

.bc-pdp-cards li.product .bc-pdp-card__body > .sub_and_save_frame,
.bc-pdp-cards li.product .bc-pdp-card__body > .bc-pdp-card__blurb {
	order: 3;
}

.bc-pdp-cards li.product .bc-pdp-card__body > form.cart {
	order: 4;
}

/*
 * Same tail-sorting as the card itself does: anything the templates emit that
 * this file has not placed goes below, not above the title.
 */
.bc-pdp-cards li.product .bc-pdp-card__body > * {
	order: 9;
}

section#all-page-header-space {
    padding-bottom: 64px;
}

/* ===========================================================================
 * Card option rows: the radio disc, the Subscribe selected state, alignment
 *
 * Mitz, 2026-09-01, from a screenshot: the radio circle is showing, selecting
 * Subscribe & Save leaves the border and text unchanged, and the reviews and
 * description should read left as the design has them.
 * ========================================================================= */

/*
 * ⚠ THE THEME'S RADIO DISC, KILLED ON CARDS TOO.
 *
 *   `style.css` draws its own control on any label after a radio — a 20×20 ring at
 *   `::before` and a solid disc at `::after`, `border-radius: 100%`. An earlier round
 *   killed it for the PANEL and stopped there, so the cards kept it: measured 20×20
 *   with a 2px #ddd ring, and `content` flipping from `none` to `""` the moment the
 *   row went unchecked — which is the circle in Mitz's screenshot, overlapping
 *   "One Time Purchase".
 *
 *   The design draws no radio indicator on a card at all: the bordered box IS the
 *   affordance. Both pseudo-elements go, checked and unchecked.
 */
.bc-pdp-cards li.product .bc-pdp-option__radio + .bc-pdp-option__label::before,
.bc-pdp-cards li.product .bc-pdp-option__radio + .bc-pdp-option__label::after,
.bc-pdp-cards li.product .bc-pdp-option__radio:checked + .bc-pdp-option__label::before,
.bc-pdp-cards li.product .bc-pdp-option__radio:checked + .bc-pdp-option__label::after {
	display: none;
	content: none;
}

/*
 * ⚠ SUBSCRIBE HAS NO RADIO OF ITS OWN, so `:checked + label` can never reach it.
 *
 *   Measured: the sub row's `<li>` contains no input at all. Its label's `for`
 *   points at a scheme radio that renders inside the frequency pills, so clicking
 *   it does change the group — the One Time row correctly goes dim — but nothing
 *   marks Subscribe as chosen.
 *
 *   Solved the way the PANEL already solves it: `:has()` on the options container,
 *   testing whether any pill's radio is checked. The pills are hidden on a card, but
 *   the radios are still in the DOM, so the test works there too.
 *
 * ⚠ `:has()` needs Chrome 105+, Safari 15.4+, Firefox 121+ — the same support note
 *   the panel's selected state already carries. Without it the row simply stays in
 *   its resting state rather than breaking.
 */
.bc-pdp-cards li.product .bc-pdp-options:has(.bc-pdp-freq__pill .bc-pdp-option__radio:checked) .bc-pdp-option--sub .bc-pdp-option__label {
	border-color: var(--pdp-c3);
	color: var(--pdp-c3);
}

/*
 * The text of whichever row is selected, all the way down.
 *
 * ⚠ Setting `color` on the label alone does NOT reach it. `style.css` carries
 *   `.wcsatt-options-wrapper * { color: #fff }` three times over, and that `*` hits
 *   the intermediate `__head` and `__figures` spans, which no rule of ours names —
 *   so `color: inherit` on the title inherits WHITE from them, faithfully. Every
 *   node has to be named. `!important` because the amount already carries
 *   `color: var(--pdp-c4) !important` from this file.
 *
 * ⚠ `__note` is absent on purpose: the "Save …" pill sits on a green ground and its
 *   text stays light, including when Subscribe is the selected row.
 */
.bc-pdp-cards li.product .bc-pdp-option__radio:checked + .bc-pdp-option__label .bc-pdp-option__head,
.bc-pdp-cards li.product .bc-pdp-option__radio:checked + .bc-pdp-option__label .bc-pdp-option__title,
.bc-pdp-cards li.product .bc-pdp-option__radio:checked + .bc-pdp-option__label .bc-pdp-option__figures,
.bc-pdp-cards li.product .bc-pdp-option__radio:checked + .bc-pdp-option__label .bc-pdp-option__price,
.bc-pdp-cards li.product .bc-pdp-option__radio:checked + .bc-pdp-option__label .woocommerce-Price-amount,
.bc-pdp-cards li.product .bc-pdp-option__radio:checked + .bc-pdp-option__label .woocommerce-Price-currencySymbol,
.bc-pdp-cards li.product .bc-pdp-options:has(.bc-pdp-freq__pill .bc-pdp-option__radio:checked) .bc-pdp-option--sub .bc-pdp-option__label .bc-pdp-option__head,
.bc-pdp-cards li.product .bc-pdp-options:has(.bc-pdp-freq__pill .bc-pdp-option__radio:checked) .bc-pdp-option--sub .bc-pdp-option__label .bc-pdp-option__title,
.bc-pdp-cards li.product .bc-pdp-options:has(.bc-pdp-freq__pill .bc-pdp-option__radio:checked) .bc-pdp-option--sub .bc-pdp-option__label .bc-pdp-option__figures,
.bc-pdp-cards li.product .bc-pdp-options:has(.bc-pdp-freq__pill .bc-pdp-option__radio:checked) .bc-pdp-option--sub .bc-pdp-option__label .bc-pdp-option__price,
.bc-pdp-cards li.product .bc-pdp-options:has(.bc-pdp-freq__pill .bc-pdp-option__radio:checked) .bc-pdp-option--sub .bc-pdp-option__label .woocommerce-Price-amount,
.bc-pdp-cards li.product .bc-pdp-options:has(.bc-pdp-freq__pill .bc-pdp-option__radio:checked) .bc-pdp-option--sub .bc-pdp-option__label .woocommerce-Price-currencySymbol {
	color: var(--pdp-c3) !important;
}

/* ── And the UNSELECTED row's text was white, for the same reason ───────────
 *
 * ⚠ THE RULE ABOVE ONLY EVER FIXED THE SELECTED ROW. `style.css` carries
 *   `.wcsatt-options-wrapper * { color: #fff }` three times over, and that `*`
 *   hits the intermediate `__head` and `__figures` spans — so
 *   `color: inherit` on the title and the price inherits WHITE from them,
 *   faithfully, on whichever row is NOT selected. Measured on a card with One
 *   Time selected: the Subscribe row's label read `#d1d0cf` while its title and
 *   price both rendered `#ffffff`.
 *
 *   The design gives that row two different colours — node 33177:112709 is
 *   `Color/Color 4` (#f5f2ee) for "Subscribe" and node 33130:114928 is
 *   `Color/Color 5` (#d1d0cf) for its price — so a single colour on the label
 *   could not have produced it even without the theme's `*`.
 *
 * ⚠ EVERY INTERMEDIATE NODE HAS TO BE NAMED, which is the same lesson the
 *   selected-state rule above records. And no `!important` here on purpose: it
 *   would beat that rule and the selected row would stop turning tan.
 */
.bc-pdp-cards li.product .bc-pdp-option__label .bc-pdp-option__head,
.bc-pdp-cards li.product .bc-pdp-option__label .bc-pdp-option__title {
	color: var(--pdp-c4);
}

.bc-pdp-cards li.product .bc-pdp-option__label .bc-pdp-option__figures,
.bc-pdp-cards li.product .bc-pdp-option__label .bc-pdp-option__price {
	color: var(--pdp-c5);
}

/*
 * ⚠ The description read CENTRED while the title and rating read left — measured
 *   `text-align: center`, with `padding: 0 15px` coming from the theme.
 *
 *   Both are consequences of the same thing: the rule that used to style
 *   `.sub_and_save_frame p` was emptied on the server, so the paragraph fell back to
 *   the theme's own centring and padding. The design left-aligns the whole card.
 *
 *   Restored here rather than by re-filling that rule, so the edit made on the
 *   server is left as it was found.
 */
.bc-pdp-cards li.product .sub_and_save_frame p,
.bc-pdp-cards li.product .for_yotpo_in_sub,
.bc-pdp-cards li.product .bc-pdp-card__blurb {
	padding-right: 12px;
	padding-left: 12px;
	text-align: left;
}

/*
 * ⚠ AND THIS RULE WAS UNDOING THE ONE ABOVE IT. Card component 33365:102332
 *   sets the blurb in `Fonts/Decoration` at **12px/16, weight 400, white** —
 *   which a rule ~1500 lines earlier gets right for BOTH blurb sources. This
 *   one, being later, put `--pdp-links` (14) and `--pdp-c5` back on the ACF
 *   copy, which is the one that actually renders. Measured before the fix:
 *   Special Elite **14px, weight 500, #d1d0cf** against the design's 12/400/white.
 *
 * ⚠ WEIGHT 400 IS NOT COSMETIC HERE. Special Elite ships one weight, so the
 *   500 the theme puts on this paragraph cannot be satisfied by the face and the
 *   browser synthesises it — a smeared fake bold on the only Special Elite text
 *   in the card. The design's style is `Special_Elite:Regular`.
 *
 *   The 24px bottom margin stays: it is the design's gap between the card's text
 *   group and its options group (`gap-[24px]` on node 29323:47297), and it lives
 *   here because `form.cart` carries `margin-top: auto` and cannot own it.
 */
.bc-pdp-cards li.product .sub_and_save_frame p {
	margin: 0 0 24px;
	color: var(--pdp-c11);
	font-size: 12px;
	font-weight: 400;
	line-height: 16px;
}

/* ── The confirmed postcode state: one line, left ────────────────────────────
 * Mitz, 2026-09-01, with a screenshot: the confirmation and the "Change postcode"
 * control should sit on ONE line, reading left, as the reference draws them.
 *
 * ⚠ This SUPERSEDES the column decision recorded above ("the confirmed state read
 *   bottom-up"). That fix was right about the ORDER — the action must not precede
 *   the thing it acts on — and the DOM order is confirmation then control, so a row
 *   keeps that order running left to right. Nothing is lost by turning it.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .wc-delivery-time-response span#avlpin {
	flex-direction: row;
	flex-wrap: wrap;   /* a narrow panel may still need to break */
	align-items: center;
	justify-content: flex-start;
	gap: 12px;
}

/*
 * ⚠ The confirmation was CENTRED, and it took two things to stop it: the paragraph
 *   was full-width (668), so it filled the row and pushed the control to a second
 *   line, and `style.css` carries `#avlpin p { text-align: center !important }`.
 *
 *   `span#avlpin p#avat` is two ids, which is what that rule needs answering with —
 *   the `#checkpin` lesson again.
 */
.chuni-beef-banner .summary .wc-delivery-time-response span#avlpin p#avat {
	width: auto !important;
	margin: 0 !important;
	text-align: left !important;
}

/*
 * ⚠ THE PILL OUTLINE ABOVE WAS NEVER RENDERING, and specificity is why.
 *
 *     style.css  →  span#avlpin a#change_pin { border-style: none !important }
 *
 *   That is (2,0,1). The earlier rule here is
 *   `.chuni-beef-banner .summary .wc-delivery-time-response a#change_pin`, (1,3,0) —
 *   and against an id, classes do not accumulate their way to a win, `!important` on
 *   both sides or not. Measured: `border: 0px none` while the stylesheet said 1px
 *   solid. Naming BOTH ids is the only way, exactly as recorded for `#checkpin`.
 */
.chuni-beef-banner .summary span#avlpin a#change_pin {
	display: inline-flex !important;
	align-items: center;
	width: auto !important;
	min-height: 32px !important;
	padding: 4px 14px !important;
	border: 1px solid var(--pdp-c6) !important;
	border-radius: 0px !important;
	background: transparent !important;
	color: var(--pdp-c5) !important;
	white-space: nowrap;
}

.chuni-beef-banner .summary span#avlpin a#change_pin:hover,
.chuni-beef-banner .summary span#avlpin a#change_pin:focus-visible {
	border-color: var(--pdp-c3) !important;
	color: var(--pdp-c3) !important;
}

/*
 * The plugin's pencil, restored — the reference image shows it.
 *
 * ⚠ The note above this file's earlier rule called it "a remote PNG" and hid it on
 *   that basis. It is not remote: it is served from this site's own
 *   `plugins/woocommerce-pincode-check-pro-unl-num/assets/`, so there is no external
 *   dependency and none of the hardcoded-live-domain risk that note was guarding
 *   against. Checked before revealing it.
 */
.chuni-beef-banner .summary span#avlpin a#change_pin img {
	display: inline-block !important;
	flex: none;
	width: auto;
	height: 15px;
}

/* ── The pencil needs nothing further, and here is why ───────────────────────
 * ⚠ CORRECTING TWO OF MY OWN MEASUREMENTS from the round before.
 *
 *   The icon carries `padding: 0 10px 0 0` with `box-sizing: border-box`, and that
 *   single fact explains both things I got wrong:
 *
 *   1. "`width: auto` renders 25×15 from a 16×16 source, so it is squashed." It is
 *      NOT squashed. 25 is the border-box: 15px of content plus 10px of right
 *      padding. The glyph is 15×15 and undistorted, exactly as `auto` should give.
 *
 *      ⚠ And the "fix" was worse than the imagined fault. `width: 15px` under
 *        `border-box` makes 15px the TOTAL, leaving 5px of content — the icon would
 *        have rendered a third of its size. Mitz reverted it to `auto`, correctly.
 *
 *   2. "Nothing separates the icon from the label — measured 0px." That 0 was the
 *      distance from the img's BOX edge, which includes the 10px of transparent
 *      padding, to the start of the text. The visible gap was 10px all along, and
 *      the `column-gap: 6px` I added on top of it made 16.
 *
 *   So no rule is needed here at all: `height: 15px; width: auto` from the block
 *   above sizes it, and the icon's own right padding spaces it.
 *
 * ⚠ The lesson, since it has now cost two wrong changes: a `getBoundingClientRect()`
 *   edge is the BORDER-BOX edge. Measuring a gap between two boxes says nothing
 *   about the gap between what is drawn inside them, and under `border-box` a stated
 *   width includes padding that may be doing work you cannot see.
 * ------------------------------------------------------------------------- */

/* =========================================================================
 * TABLET AND MOBILE
 *
 * Design: `PRODUCT PAGE - tablet` 33198:107710 and `PRODUCT PAGE - mobile`
 * 33198:100540, exported by Mitz 2026-09-02. Until this section the PDP had one
 * hand-rolled breakpoint at 1000px and no narrow design to build against — the
 * sticky bar's own comment said so in as many words.
 *
 * ⚠ THE FRAMES ARE DEVICE MOCKS, and reading their pixel widths as viewport
 *   widths is wrong by 8px. Both carry a 4px bezel, and the giveaway is the
 *   sticky bar: it is `position: fixed` and spans the viewport by definition, yet
 *   it runs x 4..747 on the 752-wide tablet export and x 4..431 on the 436-wide
 *   mobile one. So the viewports are 744 and 428 — iPad Mini portrait and iPhone
 *   Pro Max. Every measurement below is taken off the export and reduced by 4.
 *
 *       tablet   viewport 744   gutter 24   container 696
 *       mobile   viewport 428   gutter 20   container 388
 *
 *   Cross-checked against the cards, which are unambiguous: 28..249 / 265..486 /
 *   502..723 on tablet (222 wide, 15 gap → container 696) and 24..209 / 226..411
 *   on mobile (186 wide, 16 gap → container 388).
 *
 * ⚠ THE BREAKPOINTS ARE 600 AND 1000, and that is not a guess: `pdp-cards.js`
 *   already tiers the Owl carousel at 0 / 600 / 1000 with 2 / 3 / 4 items, which
 *   is exactly what the three frames draw. The design's own widths sit either
 *   side of 600, so the split holds and the CSS and the carousel agree.
 *
 * WHAT THE NARROW FRAMES CHANGE, beyond stacking to one column:
 *
 *   1. The panel's quantity + Add to Cart + wishlist row is GONE. Checked at 2×
 *      in both exports: the postcode input is followed by the areas link, a rule
 *      and then the shipping row, with no room for a 70px control row. The
 *      sticky bar carries the only add-to-cart, which is why `pdp-sticky.js` now
 *      pins the bar on at these widths instead of revealing it on scroll.
 *   2. The "REAL DOGS REAL FOOD" photo band is GONE. The lighter why-band runs
 *      3256..3557 on tablet and 3078..3435 on mobile and "WHY CHOOSE" starts
 *      immediately after — where desktop has 692px of full-bleed photograph.
 *   3. The reason items turn from icon-above-centred-text into icon-LEFT with a
 *      260px text column, left aligned, stacked. ⚠ That 260 is the SAME in both
 *      frames — 100..360 on tablet, 95..355 on mobile — so it is a fixed text
 *      measure, not a fraction of the container. On tablet it therefore leaves
 *      the right half of the section empty, and that is what the design draws.
 *   4. Type steps down. Cap height of the tan ink in the product title and the
 *      section headings: 34 / 25 / 21 px across desktop / tablet / mobile,
 *      against a known 48px desktop size — so 48 → 36 → 30. All four of those
 *      headings read `var(--pdp-h2)`, so the token carries it.
 *
 * ⚠ WHAT IS NOT COPIED FROM THE FRAMES, deliberately:
 *
 *   - The gallery. Both frames draw a carousel: one slide at 600 (tablet) or 360
 *     (mobile) with the next peeking past the gutter and dots beneath. The mock
 *     product has four images; ours has ONE, and flexslider never initialises
 *     (`jQuery.fn.flexslider` is undefined). Sizing the single image to 600 of a
 *     696 container would leave 96px of empty ground beside it for a peek that
 *     can never come, so it takes the full container instead.
 * ===================================================================== */

/* ── Below the desktop breakpoint: tablet ───────────────────────────────── */
@media (max-width: 999px) {
	:root {
		/* 744 − 2 × 24 = 696, the container the cards measure. */
		--pdp-gutter: 24px;

		/* 48 → 36. Four headings read this: the product title, the cards
		 * heading, "WHY FEED RAW DOG FOOD?" and "WHY CHOOSE THE BUTCHER'S DOG?".
		 * The line-height goes to 40, measured off the tablet frame's two-line
		 * why-title (pitch 40 against desktop's 48). */
		--pdp-h2: 36px;
		--pdp-h2-lh: 40px;
	}

	/*
	 * ONE COLUMN. `.chunny-butlee-under` is the desktop grid and its columns were
	 * two FIXED 668px tracks, so the children could not shrink: at 428 the panel
	 * still laid out at x=780 — entirely off-screen — and only `overflow-x: hidden`
	 * on html and body kept it from showing as a sideways scroll. The whole
	 * purchase panel was unreachable on a phone.
	 */
	.chuni-beef-banner .chunny-butlee-under {
		grid-template-columns: minmax(0, 1fr);
		gap: 32px;
	}

	/* Was pinned to `var(--pdp-col)`, the desktop column width. */
	.chunii-left-image .woocommerce-product-gallery.woocommerce-product-gallery--with-images {
		width: 100%;
	}

	/*
	 * THE PANEL ADD-TO-CART ROW STAYS — note 1 above is superseded.
	 *
	 * ⚠ Mitz, QA 2026-09-15: "the quantity and Add to cart button on pdp
	 *   disappear on below 999, fix it."
	 *
	 *   Until this pass the three controls were parked at `left: -9999px` here,
	 *   because both narrow frames delete the panel's row and hand the purchase to
	 *   the sticky bar. QA read that as the controls vanishing, and it is the
	 *   reader's call: the stepper and the button stay in the panel at every
	 *   width, in the same `119px 1fr 72px` row the desktop draws, and the sticky
	 *   bar keeps running underneath as the design's second way in.
	 *
	 *   Nothing here for `pdp-sticky.js` to lose: it picks the first candidate
	 *   with a height, and an in-flow control has one. The only rule that ever
	 *   parked them is the one this comment replaces, so there is nothing to
	 *   restore — the desktop grid rules simply keep applying below 1000px.
	 */

	/*
	 * The three sections below the panel escape Bootstrap.
	 *
	 * ⚠ They were 510px wide at a 744 viewport — not 696 — because they sit inside
	 *   a Bootstrap 4.3.1 `.container`, which at 744 is still on the `sm` tier and
	 *   caps at 540 less 30 of padding. Desktop escapes with `width: 100vw` and a
	 *   negative margin; here the container is simply neutralised, which avoids
	 *   viewport-unit arithmetic and the scrollbar question with it.
	 */
	section.cariour-box-banner > .container {
		width: 100%;
		max-width: none;
		padding: 0;
	}

	.bc-pdp-why__intro,
	.bc-pdp-cards-section {
		padding-inline: var(--pdp-gutter);
	}

	/* Note 2: the band is not in either narrow frame.
	 * ⚠ This retires the `max-width: 999px` rule further up that restacked the two
	 *   claims under the photo — a guess made before there was a narrow design to
	 *   check. It is left in place because it is harmless and correct for what it
	 *   describes, but nothing reaches it now. */
	.bc-pdp-why__band {
		display: none;
	}

	/* Note 3: icon left, 260px text, stacked. */
	.bc-pdp-reasons__inner {
		text-align: left;
	}

	.bc-pdp-reasons__title,
	.bc-pdp-reasons__sub {
		text-align: center;
	}

	.bc-pdp-reasons__item {
		flex-direction: row;
		align-items: center;
		gap: 12px;
	}

	.bc-pdp-reasons__icon {
		width: 60px;
		height: 60px;
	}

	.bc-pdp-reasons__text {
		max-width: 260px;
	}

	/* ── ⚠ AND THE READING ORDER CHANGES, which is easy to miss ───────────────
	 *
	 *   Desktop is two columns flanking the bowl, so the DOM is
	 *   left(premium, raw food) then right(no corners, only the best) — down one
	 *   column, then down the other. Stacked into one column that reads
	 *
	 *       premium · raw food · no corners · only the best
	 *
	 *   but BOTH narrow frames draw the columns interleaved:
	 *
	 *       premium · no corners · raw food · only the best
	 *
	 *   i.e. left1, right1, left2, right2 — the order you get reading ACROSS the
	 *   desktop pair rather than down it. Items 2 and 3 are swapped, and nothing
	 *   about the geometry gives it away; only the copy does.
	 *
	 * ⚠ `display: contents` on the two `ul`s, so the four `li`s become grid items
	 *   and `order` can interleave them. Items cannot be reordered ACROSS two
	 *   parents any other way, short of changing the markup — and the markup is
	 *   two columns because that is what desktop needs.
	 *
	 *   The cost, stated because it is a real one: `display: contents` removes the
	 *   `ul`'s box and with it the list role, so a screen reader hears four
	 *   paragraphs rather than a four-item list at these widths. The alternative
	 *   was leaving the copy in an order the design does not use.
	 * --------------------------------------------------------------------- */
	.bc-pdp-reasons__col {
		display: contents;
	}

	.bc-pdp-reasons__col--left .bc-pdp-reasons__item:nth-child(1) { order: 1; }
	.bc-pdp-reasons__col--right .bc-pdp-reasons__item:nth-child(1) { order: 2; }
	.bc-pdp-reasons__col--left .bc-pdp-reasons__item:nth-child(2) { order: 3; }
	.bc-pdp-reasons__col--right .bc-pdp-reasons__item:nth-child(2) { order: 4; }

	/* The bowl stays above them — it already carries `order: -1` from the older
	 * narrow block, restated here so the four orders above read as one set. */
	.bc-pdp-reasons__bowl {
		order: -1;
	}

	/* `display: contents` took the columns' own 24px gap with it. */
	.bc-pdp-reasons__grid {
		row-gap: 24px;
	}

	/* 539 wide on the tablet frame, centred on the container. ⚠ Overrides the
	 * 320px cap in the older `max-width: 999px` block above — that value was
	 * guessed for phones and is right there, so it is restated at 600 below. */
	.bc-pdp-reasons__bowl {
		max-width: 540px;
	}

	/*
	 * ⚠ THE THEME'S OWN 15px SIDE PADDING COMES BACK AT THESE WIDTHS, and it cost
	 *   the cards 12px each. `.cariour-box-banner .featured-meals` is `40px 15px 0`
	 *   inside a `max-width: 767px` block in style.css — and BOTH design frames are
	 *   under 767 (744 and 428), so the tablet gets the theme's phone rule too.
	 *
	 *   Desktop never saw it: the plain `.bc-pdp-cards-section .bc-pdp-cards
	 *   { padding: 0 }` further up is unconditional and the theme's rules are all
	 *   inside max-width queries. But that selector is (0,2,0) — a TIE with
	 *   `.cariour-box-banner .featured-meals` — and this stylesheet is document-order
	 *   earlier than the footer's duplicate copies of style.css, so it loses every
	 *   tie. Hence the extra `section.cariour-box-banner` here rather than an
	 *   `!important`: it wins on specificity, which is this file's usual preference.
	 *
	 *   Measured before: track 666 of a 696 container, cards 210 against the
	 *   design's 222. Vertical padding goes to 0 too, matching desktop, where the
	 *   section's spacing is set by its own margins.
	 *
	 * ⚠ `!important`, AND SPECIFICITY AS WELL, because the winning declaration is
	 *   `style.css:1979` — `.featured-meals { padding: 40px 15px !important }` in its
	 *   own `max-width: 767px` block, three copies over via the footer duplicates.
	 *   An `!important` beats any specificity, so the (0,3,1) selector alone was not
	 *   enough and this measured 15px with the rule matching. Keeping BOTH means the
	 *   important-vs-important contest is then settled on specificity, where (0,3,1)
	 *   beats the theme's (0,1,0).
	 *
	 *   Worth knowing for the rest of this section: at 744 the theme's PHONE rules
	 *   are live, because 744 < 767. The tablet frame is below the theme's own
	 *   tablet boundary.
	 */
	section.cariour-box-banner .bc-pdp-cards-section .bc-pdp-cards {
		padding: 0 !important;
	}

	/* ── ⚠ THE THEME SHOVES OUR PURCHASE LABELS DOWN 308px ────────────────────
	 *
	 *   `.wcsatt-options-wrapper ul.wcsatt-options-product li label { top: 308px }`
	 *   in a `max-width: 767px` block — a hard-coded nudge for the theme's own
	 *   mobile treatment, where `global.js` moved the options into that fixed bar
	 *   and this pushed them clear of it. Our labels are `position: relative` for
	 *   the radio ring and dot, so a `top` on them is live.
	 *
	 *   ⚠ It applies at BOTH design widths, because 744 and 428 are both under 767.
	 *
	 *   What it looked like: each option row's `li` kept its box — measured
	 *   123..193 in the viewport — while the label inside it painted at 455, over
	 *   the postcode gate and the pills below. The panel read as a stack of
	 *   overlapping text with a 300px hole above it.
	 *
	 *   ⚠ AND THE DOM MEASURED CLEAN THROUGHOUT. `getBoundingClientRect()` on the
	 *     rows, the freq box, the prompt, the input and the trust box returned a
	 *     tidy sequence in every state I tried, because the displaced element was
	 *     the label INSIDE the row rather than the row. What found it was
	 *     `elementFromPoint(200, 455)` returning `.bc-pdp-option__label` — a label
	 *     hit-testable 260px outside its own parent's box.
	 *
	 *   The pills need it too, and the card copies are included so a card whose
	 *   options are ever shown cannot inherit the same 308.
	 * --------------------------------------------------------------------- */
	/*
	 * ⚠ AND THE CARD HALF OF THIS RESET LOST, silently, for a day. The two panel
	 *   selectors are (0,3,0) and beat the theme's (0,2,2); the card ones were
	 *   `.bc-pdp-cards .bc-pdp-option__label` — (0,2,0), which LOSES to it, because
	 *   two classes plus two elements outranks two classes and nothing else.
	 *
	 *   Measured on a card at 425: the row at y=5101 with its label at y=5409.
	 *   The One Time box drew as an empty 62px gap and its label — border, title
	 *   and price — painted 308px further down the page, over whatever was there.
	 *   `li.product` is added to carry them past the theme.
	 */
	.chuni-beef-banner .summary .bc-pdp-option__label,
	.chuni-beef-banner .summary .bc-pdp-freq__pill-label,
	.bc-pdp-cards li.product .bc-pdp-option__label,
	.bc-pdp-cards li.product .bc-pdp-freq__pill-label {
		top: 0;
		bottom: auto;
	}

	/* ── ⚠ "Check Check" — the button's label rendered TWICE ──────────────────
	 *
	 *   style.css:14808 hides the anchor's own text at every width and injects the
	 *   label as a pseudo-element instead:
	 *
	 *       a#checkpin        { font-size: 0 }
	 *       a#checkpin:before { content: 'Check'; font-size: 12px }
	 *
	 *   then reverses it above 768 — font-size back to 12, `content: none`.
	 *
	 *   Our own rule restored a real font-size on the anchor so the label could be
	 *   styled as the design draws it, and above 768 that is the whole story: the
	 *   pseudo is off, one label renders. BELOW 768 the pseudo is still on, so the
	 *   button drew "Check" twice — 18px tan over 12px tan — and measured 143 wide
	 *   against the design's 98.
	 *
	 * ⚠ NAMES BOTH IDS, per the lesson already recorded twice in this file for
	 *   `#checkpin`: the plugin and theme reach this element through 3-id selectors,
	 *   and classes never accumulate past an id.
	 * --------------------------------------------------------------------- */
	.chuni-beef-banner .summary div#my_custom_checkout_field2 p#pincode_field_idp a#checkpin::before {
		content: none;
	}

	/* ── The card's purchase rows stack ───────────────────────────────────────
	 *
	 *   Desktop puts the label and the price side by side in a 334-wide card. Both
	 *   narrow frames stack them — "Subscribe", then the saving pill, then
	 *   "$147.08", each on its own line and all left-aligned — and the One Time row
	 *   the same way.
	 *
	 * ⚠ THIS IS ALSO WHAT MAKES THE SAVING PILL SAFE TO KEEP ON ONE LINE, and the
	 *   order of those two facts cost a round. The pill is
	 *   `border-radius: 9999px`, so when "Save $13.12 per delivery" wrapped to
	 *   three lines in a card it drew a green CIRCLE — measured 68×60 at 425
	 *   against 132×20 at 1512, same rule and same text with a different width to
	 *   lay out in.
	 *
	 *   Adding `white-space: nowrap` alone fixed the circle and broke something
	 *   else: the pill went to its natural 132 beside a 59-wide price inside 161px
	 *   of card, and the price left the card — measured at x=185 in a box ending at
	 *   193. Stacking gives the pill the whole card width, so one line fits and the
	 *   price sits under it where the design puts it anyway.
	 *
	 *   The radius goes to 10px too. That changes nothing at these widths — a 20px
	 *   pill is fully round at 10 — but if a viewport narrower than either frame
	 *   ever forces a wrap, it degrades to a rounded box instead of a circle.
	 * --------------------------------------------------------------------- */
	/*
	 * ⚠ THE SUBSCRIBE ROW ONLY, at these widths. An earlier pass stacked BOTH card
	 *   rows from 999 down, which is right for the mobile frame and wrong for the
	 *   tablet one. Read off `PRODUCT PAGE - tablet` at 2× (export x20-260,
	 *   y5140-5300): the tablet card keeps "One Time Purchase" and "$159.00" on ONE
	 *   line, label left and price right, and stacks only the Subscribe row —
	 *   because that row has the saving pill between its label and its price.
	 *   The mobile frame stacks both; that half is at 600 below.
	 */
	.bc-pdp-cards li.product .bc-pdp-option--sub .bc-pdp-option__label {
		flex-direction: column;
		align-items: flex-start;
		gap: 4px;
	}

	.bc-pdp-cards li.product .bc-pdp-option--sub .bc-pdp-option__figures {
		align-items: flex-start;
		text-align: left;
	}

	.bc-pdp-cards li.product .bc-pdp-option__note--save {
		width: fit-content;
		max-width: 100%;
		border-radius: 10px;
		white-space: normal;
	}

	/* The bar spans the viewport at these widths rather than centring on a
	 * 1384 content box. */
	.bc-pdp-sticky__inner {
		max-width: none;
		padding: 0 var(--pdp-gutter);
	}
}

/* ── Narrow desktop: the card's Subscribe row stacks here too ──────────────
 *
 * ⚠ QA 2026-09-11 (ClickUp 86eyvvp4e): at 1050 the four-column grid gives each
 *   card ~212px, and the desktop row — label and pill left, price right — has
 *   the pill sharing its line with a 60px price inside that. "You save $13.12
 *   every delivery" broke onto two lines; at 422 the same pill sat on one,
 *   because the tablet tier above stacks the row and hands the pill the whole
 *   card. The wider layout had LESS room than the narrower one.
 *
 *   The design draws the one-line row on a 334-wide card (1512) and the stacked
 *   row on the tablet frame; nothing is drawn between. Measured, the row needs
 *   ~260px — 150 pill + 16 padding + 8 gap + 60 price + 24 card padding — and a
 *   four-column card is 300 at 1400, 212 at 1050, so the stack applies below
 *   1400, the same boundary the category gate already borrows the tablet layout
 *   at. Identical declarations to the tablet tier; only the range is new.
 * ------------------------------------------------------------------------- */
@media (min-width: 1000px) and (max-width: 1399px) {
	.bc-pdp-cards li.product .bc-pdp-option--sub .bc-pdp-option__label {
		flex-direction: column;
		align-items: flex-start;
		gap: 4px;
	}

	.bc-pdp-cards li.product .bc-pdp-option--sub .bc-pdp-option__figures {
		align-items: flex-start;
		text-align: left;
	}

	.bc-pdp-cards li.product .bc-pdp-option__note--save {
		width: fit-content;
		max-width: 100%;
		border-radius: 10px;
		white-space: nowrap;
	}
}

/* ── Mobile ─────────────────────────────────────────────────────────────── */
@media (max-width: 600px) {
	:root {
		/* 428 − 2 × 20 = 388, the container the cards measure. */
		--pdp-gutter: 20px;

		/* 36 → 30, from the 21px cap height. */
		--pdp-h2: 30px;
		--pdp-h2-lh: 34px;
	}

	.chuni-beef-banner .chunny-butlee-under {
		gap: 24px;
	}

	/* 317 wide on the mobile frame. */
	.bc-pdp-reasons__bowl {
		max-width: 320px;
	}

	/* The One Time row stacks too — read off `PRODUCT PAGE - mobile` at 2×
	 * (export x18-228, y4855-5025): "One Time Purchase" on one line and "$159.00"
	 * under it, inside the same bordered box. The tablet frame keeps that row on a
	 * single line, so this is a mobile-only change. */
	.bc-pdp-cards li.product .one-time-option .bc-pdp-option__label {
		flex-direction: column;
		align-items: flex-start;
		gap: 4px;
	}

	.bc-pdp-cards li.product .one-time-option .bc-pdp-option__figures {
		align-items: flex-start;
		text-align: left;
	}

	/* The blurb gets a third line. Desktop clamps to two so one long product name
	 * cannot make a card taller than its row, and the tablet frame fits the same
	 * copy in two at 222 wide — but at 186 the mobile frame draws three, and
	 * clamping to two truncated it mid-word. */
	.bc-pdp-cards li.product .sub_and_save_frame p,
	.bc-pdp-cards li.product .bc-pdp-card__blurb {
		-webkit-line-clamp: 3;
	}

	/*
	 * ⚠ NO RATING IN THE MOBILE BAR. The tablet frame keeps it — stars plus
	 *   "4.8 · 30 verified reviews" under the title — and the mobile frame drops
	 *   it, giving the title the two lines instead. So this is a mobile-only
	 *   removal, not a narrow-width one.
	 */
	.bc-pdp-sticky__rating {
		display: none;
	}

	/*
	 * The title takes two lines rather than ellipsing: the mobile frame draws
	 * "CARNIVORE BOX – 7.5KG" wrapped over two 22px lines beside a 46px thumb.
	 */
	.bc-pdp-sticky__title {
		display: -webkit-box;
		overflow: hidden;
		-webkit-box-orient: vertical;
		-webkit-line-clamp: 2;
		white-space: normal;
	}

	.bc-pdp-sticky__thumb {
		width: 46px !important;
		height: 46px !important;
	}

	/* 190 wide on the frame (x 222..411), against 225 on tablet and desktop.
	 * The label is the same string, so the padding does the shrinking. */
	.bc-pdp-sticky__cta {
		padding: 16px 14px;
	}

	.bc-pdp-sticky__inner {
		gap: 12px;
	}

	/* ── The theme's own mobile add-to-cart bar ───────────────────────────────
	 * ⚠ THE THEME ALREADY HAS ONE, and it is not a stylesheet — `global.js:494`
	 *   runs at `$(window).width() <= 500` and WRAPS every
	 *   `.single_add_to_cart_button` on the page in `<div class="custom-addtocart-div">`,
	 *   then appends that wrapper to the button's own `form.cart`. The wrapper is
	 *   `position: fixed; bottom: 0; width: 100%; z-index: 9999` in style.css:18756.
	 *
	 *   Two consequences, both measured at 428 before this rule existed:
	 *
	 *   ⓐ TWELVE of them stacked at the viewport bottom — one for the panel and one
	 *     for every product card — at z-index 9999, i.e. on top of our bar's 900.
	 *     A tan button reading "Check & Add to Cart" ran off the right edge, and
	 *     five more behind it read "Add Item".
	 *   ⓑ Because the button is now nested one level deeper, the
	 *     `form.cart > button.single_add_to_cart_button` parking rule above stopped
	 *     matching it. The child combinator was correct until the theme moved it.
	 *
	 *   So the PANEL's wrapper is parked with its button inside it — the button
	 *   keeps its height, which is what `pdp-sticky.js` measures — and the CARDS'
	 *   wrappers are turned back into plain inline boxes, because both narrow frames
	 *   draw "Add Item" inside the card where the desktop design puts it.
	 *
	 * ⚠ Scoped to the PDP. `global.js` is theme-wide and this says nothing about
	 *   what the bar should do on any other template.
	 * --------------------------------------------------------------------- */
	.chuni-beef-banner .summary form.cart .custom-addtocart-div,
	.bc-pdp-cards .custom-addtocart-div {
		position: static;
		z-index: auto;
		display: block;
		width: auto;
		padding: 0;
		background-color: transparent;
	}
}

/* ===========================================================================
 * WISHLIST — the panel's icon button and the card's heart
 *
 * Unparked 2026-09-09 at Mitz's instruction ("work on wishlist task"), after
 * being deferred on 2026-09-07 with "will do wishlist when I tell you".
 *
 * ⚠ THE PLUGIN ALREADY RENDERS BOTH CONTROLS — this is styling and placement,
 *   not a build. `woocommerce-wishlists` 2.3.23 hooks `bind_wishlist_button` to
 *   `woocommerce_single_product_summary`, which then binds its output to
 *   `woocommerce_after_add_to_cart_button`. On a PDP that hook fires once for
 *   the panel AND once per card, so a product page arrives with 6 controls, each
 *   carrying its own `data-productid` — verified. What it does NOT do is fire on
 *   an archive, because `woocommerce_single_product_summary` never runs there;
 *   inc/category-redesign.php binds it for that case.
 *
 * ⚠ THE PLUGIN IS ON REDESIGN ONLY. Verified over SSH against both other
 *   environments: `wp-content/plugins/woocommerce-wishlists` is ABSENT from live
 *   and from staging. So every rule below depends on a plugin the production
 *   site does not have, and shipping this design needs that plugin installed and
 *   licensed there first. Recorded in the register, not assumed away.
 *
 * MEASURED OFF THE DESIGN EXPORTS, not inferred:
 *
 *   panel   `Frame 1261154912`, the 668x70 action row — three boxes at
 *           `gap: 8px`. Sampling the export's own pixels: stepper x24-143
 *           (120), CTA x151-612 (462, solid `#c9a98a`), wishlist x620-692
 *           (72x69), 1px `#c9a98a` border, fill = the panel ground, and a
 *           16x15 heart OUTLINE in `#c9a98a` centred at x648-663 y203-217.
 *
 *   card    `33395:112728` — a white disc, `rounded-[99px]`, `p-[6px]` around a
 *           12px heart, so 24x24, inset 10 from the image's top and right.
 *           Confirmed on the tablet and mobile exports at 3x: the disc reads
 *           72x69 device px (24 CSS) and the heart inside it is `#c9a98a`.
 *
 * Both hearts are Color 3, so both use the same SVG at two sizes.
 * ------------------------------------------------------------------------- */

/*
 * heroicons-outline/heart, the same family as the accordion chevron and the
 * benefit tick. Inlined as a data URI rather than shipped as a file, so the
 * stroke colour is stated here instead of hidden inside an asset.
 */
:root {
	--pdp-heart: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.6' stroke='%23c9a98a'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12Z'/%3E%3C/svg%3E");
	--pdp-heart-dark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.6' stroke='%231f1f1f'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12Z'/%3E%3C/svg%3E");
	--pdp-heart-white: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.6' stroke='%23ffffff'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12Z'/%3E%3C/svg%3E");
	--pdp-heart-filled: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23c9a98a'%3E%3Cpath d='M11.645 20.91l-.007-.003-.022-.012a15.25 15.25 0 01-.383-.218 25.18 25.18 0 01-4.244-3.17C4.688 15.36 2.25 12.174 2.25 8.25 2.25 5.322 4.714 3 7.688 3A5.5 5.5 0 0112 5.052 5.5 5.5 0 0116.313 3c2.973 0 5.437 2.322 5.437 5.25 0 3.925-2.438 7.111-4.739 9.256a25.18 25.18 0 01-4.244 3.17 15.25 15.25 0 01-.383.219l-.022.012-.007.004a.75.75 0 01-.704 0z'/%3E%3C/svg%3E");
	--pdp-heart-filled-white: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23ffffff'%3E%3Cpath d='M11.645 20.91l-.007-.003-.022-.012a15.25 15.25 0 01-.383-.218 25.18 25.18 0 01-4.244-3.17C4.688 15.36 2.25 12.174 2.25 8.25 2.25 5.322 4.714 3 7.688 3A5.5 5.5 0 0112 5.052 5.5 5.5 0 0116.313 3c2.973 0 5.437 2.322 5.437 5.25 0 3.925-2.438 7.111-4.739 9.256a25.18 25.18 0 01-4.244 3.17 15.25 15.25 0 01-.383.219l-.022.012-.007.004a.75.75 0 01-.704 0z'/%3E%3C/svg%3E");
}

/* ── The panel's 72x70 icon button ───────────────────────────────────────── */

/*
 * The plugin wraps its anchor in `div.woocommerce.wl-button-wrap`, a direct
 * child of `form.cart`. Untouched it inherited the form's `grid-column: 1 / -1`
 * at order 0, so it rendered 668 wide ABOVE the purchase options — which is the
 * "ADD TO WISHLIST" pill that has been sitting at the top of the panel all
 * along, measured at 184x38 in the plugin's own grey. `order: 5` and
 * `grid-column: 3` put it in the design's third cell, on the stepper's row.
 */
/*
 * ⚠ `#wl-wrapper` IS IN THE SELECTOR ON PURPOSE, and without it half of this
 *   rule loses. The plugin ships
 *
 *     #wl-wrapper.wl-button-wrap { position: relative; clear: both;
 *                                  width: 100%; padding: 10px 0 }
 *
 *   which is **(1,1,0)** — an ID beats any number of classes, so a selector
 *   written as `.chuni-beef-banner .summary form.cart > .wl-button-wrap`
 *   (0,4,1) wins on `background-color` and `border` (which that rule does not
 *   set) and silently loses `width`, `padding` and `position`.
 *
 *   In the panel that was invisible: the wrapper is a grid item in a 72px
 *   track, so the plugin's `width: 100%` measured 72 and looked correct. Its
 *   `padding: 10px 0` did land though — the anchor came back 70×48 inside a
 *   70-tall box. On a CARD, where there is no track to constrain it, the same
 *   rule made the "24px disc" 334px wide and `position: relative`, so it sat in
 *   the card's flow instead of over its image.
 *
 *   Matching the ID rather than reaching for `!important`: it beats the one rule
 *   in the way and nothing else. Same approach as the price slider, which moved
 *   under `#bc-cat-filter-drawer` to clear WooCommerce's own (0,4,0) rules.
 *
 * ⚠ The id is duplicated once per control on a PDP — the plugin hardcodes
 *   `id="wl-wrapper"` in its template, so a page with 6 controls has 6 of them.
 *   That is the plugin's invalid markup, not ours; CSS matches every element
 *   carrying the id, so the selector still applies to all of them.
 */
.chuni-beef-banner .summary form.cart > #wl-wrapper.wl-button-wrap,
.chuni-beef-banner .summary form.cart > .wl-button-wrap {
	order: 5;
	grid-column: 3;
	/*
	 * ⚠ FLEX ON THE WRAPPER, not just sizing on the anchor. The anchor carries
	 *   the theme's `.button` class and computes `display: inline-block` however
	 *   plainly this file says `block` — so inside a block wrapper it sits on a
	 *   text baseline, and the wrapper's inherited `line-height: 26px` pushed it
	 *   18px DOWN. On the card that put the heart below its own disc.
	 *   A flex container has no line box, and it blockifies its children, so the
	 *   anchor centres regardless of who wins the `display` fight.
	 */
	display: flex;
	align-items: center;
	justify-content: center;
	box-sizing: border-box;
	width: 72px;
	height: 70px;
	margin: 0;
	padding: 0;
	clear: none;
	border: 1px solid var(--pdp-c3);
	background-color: transparent;
}

.chuni-beef-banner .summary form.cart > .wl-button-wrap .wl-add-to {
	display: flex;
	align-items: center;
	justify-content: center;
	box-sizing: border-box;
	width: 100%;
	height: 100%;
	margin: 0 !important;
	padding: 0 !important;
	border: 0 !important;
	border-radius: 0 !important;
	background-color: transparent !important;
	background-image: var(--pdp-heart);
	background-repeat: no-repeat;
	background-position: center;
	background-size: 16px 16px;
	/*
	 * ⚠ `font-size: 0` rather than `display: none` on the label, deliberately.
	 *   The plugin's text IS this control's accessible name — there is no
	 *   `aria-label` to fall back on — so hiding it with `display` or
	 *   `visibility` would leave a button screen readers announce as nothing.
	 *   At 0 it collapses visually and stays in the accessibility tree.
	 */
	font-size: 0;
	line-height: 0;
	text-decoration: none;
	cursor: pointer;
	transition: background-color 120ms ease;
}

/* Hover — was the panel's outlined-control tan with the dark heart; Mitz,
 * 2026-09-12: white, like the stepper's cells beside it, and "only the
 * background color updated" — the heart keeps its resting tan. (The dark
 * copy, --pdp-heart-dark, is now declared and unused; kept for the day a dark
 * heart is wanted again.) */
.chuni-beef-banner .summary form.cart > .wl-button-wrap .wl-add-to:hover,
.chuni-beef-banner .summary form.cart > .wl-button-wrap .wl-add-to:focus-visible {
	background-color: var(--pdp-c11) !important;
}

.chuni-beef-banner .summary form.cart > .wl-button-wrap .wl-add-to:focus-visible {
	outline: 2px solid var(--pdp-c3);
	outline-offset: 2px;
}

/*
 * Already-in-list state: the plugin adds `.wl-button-already-in` to the wrapper
 * and prints "This item is already in one of your wishlists" with a link per
 * list. That cannot render in a 72px box, so the copy is suppressed and the
 * heart FILLS instead — the conventional way a wishlist control says "saved",
 * and the only signal there is room for.
 */
.chuni-beef-banner .summary form.cart > .wl-button-wrap.wl-button-already-in .wl-already-in {
	display: none;
}

.chuni-beef-banner .summary form.cart > .wl-button-wrap.wl-button-already-in .wl-add-to {
	background-image: var(--pdp-heart-filled);
}

/* The plugin's three hidden inputs and its inline script are grid children too,
 * and an empty grid item still claims a row. */
.chuni-beef-banner .summary form.cart > input[type="hidden"],
.chuni-beef-banner .summary form.cart > script {
	display: none;
}

/* ── The card's 24px heart ───────────────────────────────────────────────── */

/*
 * Absolutely positioned over the card image rather than placed in the body's
 * flow, because that is where the design puts it and because the control's DOM
 * position belongs to the plugin — inside `form.cart`, near the card's bottom.
 * `li.product` is the positioning context.
 */
.bc-pdp-cards li.product {
	/*
	 * ⚠ ISOLATED SO THE CARD CANNOT PAINT OVER THE HEADER — 2026-09-16.
	 *
	 *   Mitz, QA: "the wishlist heart on category page overlaps to header."
	 *
	 * ⚠ THE HEART WAS NEVER THE PROBLEM, THE STACK WAS. Measured on staging,
	 *   /raw-meals/ scrolled 1200px with the Shop menu open: the header is
	 *   `section#myHeader` at `position: fixed; z-index: 2`, and its dropdown's
	 *   `z-index: 1000` is spent INSIDE that context, so the whole header stacks
	 *   at 2. The heart wrapper is `position: absolute; z-index: 3` and this
	 *   card, being `position: relative` with no z-index, opened no stacking
	 *   context — so the heart competed against the root at 3, beat the header's
	 *   2, and painted over the nav and the open Shop panel. Four of them did.
	 *
	 *   `isolation: isolate` makes the card its own stacking context, so the
	 *   heart's 3 is spent inside the card — still above the image and its hover
	 *   overlay, which is all it was ever for — and the card as a whole stacks
	 *   below the fixed header. Nothing in the card needs to escape it.
	 *
	 *   Raising the header's z-index instead would have been the other way, and
	 *   worse: it is theme-wide and sits under the mini-cart drawer, the postcode
	 *   modal and the filter backdrop by design.
	 */
	isolation: isolate;
	position: relative;
}

/*
 * ⚠ AND `form.cart` HAS TO STOP BEING THE CONTAINING BLOCK, or `top: 10px`
 *   measures from the form instead of the card. `style.css:7483` carries
 *   `.shipping-taxable form.cart { position: relative }`, and the form sits
 *   near the BOTTOM of a card — so the heart landed 436px down, level with the
 *   purchase options, while `right: 10px` looked correct because the form is
 *   full width. Right position, wrong origin, and only one axis showed it.
 *
 * ⚠ Safe for everything else absolutely positioned in there, checked rather
 *   than assumed: the only such descendants are the seven
 *   `.bc-pdp-option__radio` inputs and the quantity's `.screen-reader-text`,
 *   all of which are the 1×1 clipped visually-hidden pattern with **no `top` or
 *   `left`**. An absolutely positioned box with auto offsets stays at its static
 *   position, so changing which ancestor is its containing block cannot move it.
 *
 * Card scope only — the panel's own form keeps its `relative`.
 */
.bc-pdp-cards li.product form.cart {
	position: static;
}

/* `#wl-wrapper` for the same reason as the panel above — the plugin's (1,1,0)
 * rule owns `position`, `width` and `padding` otherwise, and on a card there is
 * no grid track to hide that. */
.bc-pdp-cards li.product #wl-wrapper.wl-button-wrap,
.bc-pdp-cards li.product .wl-button-wrap {
	position: absolute;
	top: 10px;
	right: 10px;
	z-index: 3;   /* above the image and its hover overlay */
	/* Flex for the same reason as the panel above — see that note. */
	display: flex;
	align-items: center;
	justify-content: center;
	box-sizing: border-box;
	width: 24px;
	height: 24px;
	margin: 0;
	padding: 0;
	clear: none;
	border: 0;
	border-radius: 9999px;
	background-color: var(--pdp-c11);
}

.bc-pdp-cards li.product .wl-button-wrap .wl-add-to {
	display: block;
	box-sizing: border-box;
	width: 100%;
	height: 100%;
	margin: 0 !important;
	padding: 0 !important;
	border: 0 !important;
	border-radius: 9999px !important;
	background-color: transparent !important;
	background-image: var(--pdp-heart);
	background-repeat: no-repeat;
	background-position: center;
	background-size: 12px 12px;   /* the design's `p-[6px]` around a 12px heart */
	font-size: 0;
	line-height: 0;
	text-decoration: none;
	cursor: pointer;
	transition: background-size 120ms ease;
}

/*
 * Hover: the disc fills tan and the heart turns white — Mitz, 2026-09-09, "when
 * its hovered the circle becomes #C9A98A and line heart became #fff".
 *
 * ⚠ THE FILL GOES ON THE WRAPPER, not the anchor. The white disc is the
 *   wrapper's `background-color`; the anchor above it is transparent and carries
 *   only the heart, so painting the anchor tan would leave a tan square-ish
 *   patch inside a white circle. `:has(:hover)` lets the wrapper react to its
 *   own child — no JS, and the anchor stays the thing being hovered.
 *
 *   This replaces an earlier note claiming "a 24px disc has no room to change
 *   fill on hover". It has: the disc is the only surface, and swapping it is a
 *   clearer affordance than the 2px growth that was there before.
 */
/*
 * ⚠ `#wl-wrapper` AGAIN — third time. Written without it this rule is (0,5,1),
 *   and the base wrapper rule above carries the plugin's id at **(1,3,1)**, so
 *   the ID won and the disc stayed white. The heart went white on schedule, so
 *   the result was a white heart on a white disc: invisible, and it looked like
 *   the icon swap had misfired rather than the fill.
 *
 *   Whenever a rule in this block does not take, check whether the selector it
 *   is competing with includes that id.
 */
.bc-pdp-cards li.product #wl-wrapper.wl-button-wrap:has(.wl-add-to:hover),
.bc-pdp-cards li.product #wl-wrapper.wl-button-wrap:has(.wl-add-to:focus-visible),
.bc-pdp-cards li.product .wl-button-wrap:has(.wl-add-to:hover),
.bc-pdp-cards li.product .wl-button-wrap:has(.wl-add-to:focus-visible) {
	background-color: var(--pdp-c3);
}

.bc-pdp-cards li.product .wl-button-wrap .wl-add-to:hover,
.bc-pdp-cards li.product .wl-button-wrap .wl-add-to:focus-visible {
	background-image: var(--pdp-heart-white);
}

/*
 * ⚠ FALLBACK FOR NO `:has()`. Where it is unsupported the disc stays white and
 *   a white heart on it would be invisible, so the icon swap is tied to the same
 *   support test rather than left to apply on its own.
 */
@supports not selector(:has(*)) {
	.bc-pdp-cards li.product .wl-button-wrap .wl-add-to:hover,
	.bc-pdp-cards li.product .wl-button-wrap .wl-add-to:focus-visible {
		background-image: var(--pdp-heart);
		background-size: 14px 14px;
	}
}

.bc-pdp-cards li.product .wl-button-wrap .wl-add-to:focus-visible {
	outline: 2px solid var(--pdp-c3);
	outline-offset: 2px;
}

.bc-pdp-cards li.product .wl-button-wrap.wl-button-already-in .wl-already-in {
	display: none;
}

.bc-pdp-cards li.product .wl-button-wrap.wl-button-already-in .wl-add-to {
	background-image: var(--pdp-heart-filled);
}

/*
 * ⚠ AND THE SAVED HEART HAS TO GO WHITE TOO, or hovering it makes it vanish:
 *   the filled heart is Color 3 and the hover fills the disc with Color 3, so
 *   tan-on-tan. Filled white keeps "saved" readable on the hovered disc, where
 *   an outline would read as "not saved".
 */
.bc-pdp-cards li.product .wl-button-wrap.wl-button-already-in .wl-add-to:hover,
.bc-pdp-cards li.product .wl-button-wrap.wl-button-already-in .wl-add-to:focus-visible {
	background-image: var(--pdp-heart-filled-white);
}

/* The plugin's hidden inputs would otherwise be flex items in the card body. */
.bc-pdp-cards li.product form.cart > input[name="wlid"],
.bc-pdp-cards li.product form.cart > input[name="add-to-wishlist-type"],
.bc-pdp-cards li.product form.cart > input[name="wl_from_single_product"] {
	display: none;
}

/* ===========================================================================
 * The in-panel promo banner — audit row S1, register 141ⓑ
 *
 * Built 2026-09-09. The design draws this offer TWICE — as the site-wide bar
 * AND inside the purchase panel — which is a deliberate duplicate, not a move.
 *
 * ⚠ ITS COPY IS THE HEADER'S, ON INSTRUCTION. Mitz: "for the text and link it
 *   should be the same whats on the top header … so when top header is updated
 *   the section on product page is updated as well." The design's own string is
 *   "$25 off your first Combo Box — Subscribe & save now"; both renders now read
 *   `bc_promo_bar()` instead, so the header's wording ships in both places. The
 *   GEOMETRY below is the design's; only the words are not.
 *
 * MEASURED OFF `design-panel-bot.png`, by sampling rather than eyeballing:
 *
 *   box    668×37, x24-691 y478-514, fill `#322b27`, SQUARE, no border —
 *          `#1f1f1f` sits either side of it, so the box IS the fill
 *   emoji  x=48, i.e. 24 in from the box's left edge
 *   lead   `#f5f2ee`, from x=67
 *   link   `#8a6e57` — **Color 2, not the Color 3 the panel's other links use.**
 *          207 pixels of it in that row, so it is the dominant tan rather than
 *          an anti-aliasing artefact. Recorded because it looks like a mistake.
 *   close  a pale glyph at the right, the pale run ending x=656 — 35 in from the
 *          box's right edge
 *
 * `order: 8` puts it after the trust block (7) and before the accordion, which
 * is the design's sequence: shipping row, refund row, SSL marks, this, details.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary form.cart > .bc-pdp-promo {
	order: 8;
	display: flex;
	align-items: center;
	gap: 12px;
	box-sizing: border-box;
	width: 100%;
	min-height: 37px;
	margin: 0;
	padding: 8px 12px;
	border: 0;
	border-radius: 0;
	background-color: var(--pdp-c8);
}

.chuni-beef-banner .summary .bc-pdp-promo__emoji {
	flex: none;
	font-size: 14px;
	line-height: 20px;
}

.chuni-beef-banner .summary .bc-pdp-promo__copy {
	flex: 1 1 auto;
	min-width: 0;
	margin: 0 !important;
	color: var(--pdp-c4);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-links);
	font-weight: 400;
	line-height: 20px;
}

/*
 * ⚠ Color 2, from the export — one step deeper than every other link in this
 *   panel, which is why it is worth naming rather than "correcting".
 *
 * ⚠ AND IT FAILS WCAG AA: measured, `#8a6e57` on the `#322b27` fill is
 *   **2.95:1**, against the 4.5 a 14px link needs. Applied as the design draws
 *   it and flagged, the same way item 20's per-kg and item 333's Food
 *   Calculator hover were. For whoever rules on it, the alternatives on this
 *   fill are `#a4866c` at **4.11:1** (still short, and what the header's own
 *   link uses) and `#c9a98a` at **6.31:1** (Color 3, which passes and is what
 *   every other link in this panel already is). One token away either way.
 *
 *   Underlined, which is how the design draws it — and the reason the failure
 *   is legibility rather than discoverability: the link is still identifiable
 *   without relying on its colour.
 */
.chuni-beef-banner .summary .bc-pdp-promo__link {
	color: var(--pdp-c2);
	font-weight: 600;
	text-decoration: underline;
	text-underline-offset: 2px;
	white-space: nowrap;
}

.chuni-beef-banner .summary .bc-pdp-promo__link:hover,
.chuni-beef-banner .summary .bc-pdp-promo__link:focus-visible {
	color: var(--pdp-c3);
}

.chuni-beef-banner .summary .bc-pdp-promo__link:focus-visible {
	outline: 2px solid var(--pdp-c3);
	outline-offset: 2px;
}

/* The design's arrow, drawn rather than shipped — the header uses a Font Awesome
 * glyph, which this panel does not load. Two borders at 45° is the same mark the
 * breadcrumb chevron uses. */
.chuni-beef-banner .summary .bc-pdp-promo__arrow {
	display: inline-block;
	width: 6px;
	height: 6px;
	margin-left: 4px;
	border: solid currentColor;
	border-width: 1.5px 1.5px 0 0;
	transform: translateY(-1px) rotate(45deg);
}

.chuni-beef-banner .summary .bc-pdp-promo__close {
	flex: none;
	box-sizing: border-box;
	width: 20px;
	height: 20px;
	padding: 0;
	border: 0;
	border-radius: 0;
	background: none;
	color: var(--pdp-c5);
	font-family: var(--pdp-font-body);
	font-size: 18px;
	line-height: 1;
	cursor: pointer;
}

.chuni-beef-banner .summary .bc-pdp-promo__close:hover,
.chuni-beef-banner .summary .bc-pdp-promo__close:focus-visible {
	color: var(--pdp-c4);
}

.chuni-beef-banner .summary .bc-pdp-promo__close:focus-visible {
	outline: 2px solid var(--pdp-c3);
	outline-offset: 2px;
}

/* Dismissal sets `hidden`; the form is a grid, and a hidden grid item would
 * otherwise still claim its row. */
.chuni-beef-banner .summary form.cart > .bc-pdp-promo[hidden] {
	display: none;
}

/* ===========================================================================
 * THE SOLD-OUT PANEL — closing I10
 *
 * Mitz, 2026-09-09, from a screenshot of `portable-water-bottle-pink`: "when
 * product is out of stock the styling is not great, fix it."
 *
 * What that panel was rendering, measured in the DOM. `.summary` is a flex
 * column and every one of these is a DIRECT child of it, all at `order: 0`, so
 * they simply fall in source order:
 *
 *     h1.product_title            y229   the real title, 48px, left
 *     div.bc-pdp-meta             y337   the real rating
 *     form.cart                   y372   qty + wishlist, no CTA (correct)
 *     p.oostemplate               y452   THE TITLE AGAIN — 668 wide, CENTRED,
 *                                        30px, `#a4866c`, 153px tall
 *     div.yotpo-widget-instance   y645   THE RATING AGAIN, 35px
 *     p.oosprice                  y680   the price, on an element coloured
 *                                        `#111111` — 1.16:1 on this ground
 *     button.btn-ofs              y776   `#cc0000` with white, 137×46 — a red
 *                                        found NOWHERE in the design
 *
 * ⚠ THE DUPLICATES ARE `stock.php`'s, AND THEY ARE CORRECT BEHAVIOUR — item 356
 *   keeps them on the main product deliberately, because that 2022 block was
 *   written for a layout where the title and price were not rendered otherwise.
 *   In the redesign panel they are, so the duplicates are suppressed here rather
 *   than removed from the template: the template still serves the shop loop.
 *
 * ⚠ THE PRICE IS KEPT, NOT HIDDEN. `p.oosprice` is the ONLY price this panel
 *   shows — the real `.summary > .price` carries `order: 1`, which in a flex
 *   column puts it after every order-0 sibling, so it lands at **y2049**, below
 *   the endorsement section. Hiding `oosprice` as "a duplicate" would have left
 *   a sold-out product with no price at all in its panel. Measured before
 *   deciding, which is the only reason it was not.
 * ------------------------------------------------------------------------- */

/* The title, a second time. */
.chuni-beef-banner .summary > .oostemplate {
	display: none;
}

/*
 * The rating, a second time — scoped with `:has(.btn-ofs)` so this only ever
 * touches a sold-out panel. Yotpo emits two instances on EVERY product page
 * (the second normally escapes into the hero at 0×0 and is invisible); on a
 * sold-out one it renders 35px tall in the panel. The real rating lives inside
 * `.bc-pdp-meta`, so the `>` keeps it safe.
 */
.chuni-beef-banner .summary:has(.btn-ofs) > .yotpo-widget-instance {
	display: none;
}

/* The price, made legible and given the panel's own alignment. */
/*
 * ⚠ `width: 100%` rather than `text-align: left`. `.summary` is a flex column
 *   that centres its items, so the paragraph shrank to its content and the flex
 *   parent then centred it — measured 109 wide at x=1060 in a panel starting at
 *   x=780. `text-align` cannot fix that: the box itself was in the wrong place,
 *   not the text inside it.
 */
.chuni-beef-banner .summary > .oosprice {
	width: 100%;
	margin: 0 0 16px !important;
	padding: 0;
	color: var(--pdp-c4);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-para);
	font-weight: 600;
	line-height: 26px;
	text-align: left;
}

/*
 * ⚠ AND ITS INNER SPANS TOO — the lesson from item 347. `wc_price()` nests the
 *   digits two levels down and `style.css` paints `.woocommerce-Price-amount`
 *   directly, so setting a colour on the paragraph alone leaves the number
 *   whatever the theme said. `del` stays secondary, as it does everywhere else.
 */
.chuni-beef-banner .summary > .oosprice .woocommerce-Price-amount,
.chuni-beef-banner .summary > .oosprice bdi,
.chuni-beef-banner .summary > .oosprice ins,
.chuni-beef-banner .summary > .oosprice .woocommerce-Price-currencySymbol {
	color: var(--pdp-c4) !important;
	font-size: inherit;
	text-decoration: none;
}

.chuni-beef-banner .summary > .oosprice del,
.chuni-beef-banner .summary > .oosprice del .woocommerce-Price-amount,
.chuni-beef-banner .summary > .oosprice del bdi,
.chuni-beef-banner .summary > .oosprice del .woocommerce-Price-currencySymbol {
	color: var(--pdp-c5) !important;
}

/*
 * "Out of stock" takes the design's DISABLED button — the same `Button`
 * 33034:255272 row 4 cell 3 the card got on 2026-09-09, so the two surfaces
 * finally agree. That treatment was previously scoped to
 * `.bc-pdp-cards li.product`, which is exactly why it reached the card and
 * stopped at the panel.
 *
 * Full width of the panel rather than the CTA's 461: `.btn-ofs` is a child of
 * `.summary`, NOT of `form.cart`, so it cannot be placed in the action row's
 * grid. Stretching it is the honest option — the design draws no sold-out
 * state, and a 137px button floating mid-panel was the actual complaint.
 */
/*
 * ⚠ FIVE CLASSES AND `!important`, because `custom_style.css:539` is
 *
 *     .chunii-right-image .outofstock .summary .btn-ofs {
 *         margin: 30% 0 20px; background-color: #cc0000 !important }
 *
 *   at (0,4,1) WITH `!important` — so a (0,3,1) rule lost the fill even though
 *   it won everything else, and the button came back `#cc0000` with a `#c4b9b0`
 *   label. Measured after the first deploy, which is the only reason it was
 *   caught. `!important` alone would not have done it either: between two
 *   important declarations, specificity still decides, so this selector has to
 *   outweigh theirs — (0,5,0) against (0,4,1).
 *
 *   That rule is also where the enormous gap above the button came from:
 *   `margin: 30%` of the panel width is ~200px.
 */
.chuni-beef-banner .outofstock .summary.entry-summary > .btn-ofs,
.chuni-beef-banner .summary > .btn-ofs {
	display: flex;
	align-items: center;
	justify-content: center;
	box-sizing: border-box;
	width: 100%;
	min-height: 46px;
	margin: 0 0 8px !important;
	padding: 12px 24px;
	border: 1px solid var(--pdp-c12);
	border-radius: 0;
	background-color: transparent !important;
	color: var(--pdp-c12) !important;
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-para);
	font-weight: 600;
	line-height: 22px;
	text-transform: none;
	/* Disabled means disabled — it is a bare <button> with no handler. */
	cursor: default;
}

/* ── The promo banner's gap ─────────────────────────────────────────────────
 * Mitz, 2026-09-09: "update margin to margin-top 12px". The banner sat hard
 * against the payment marks above it; the form's own `row-gap` was doing the
 * spacing and the design has more air there.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary form.cart > .bc-pdp-promo {
	margin-top: 12px;
}

/* ── The white spot ─────────────────────────────────────────────────────────
 *
 * Mitz, 2026-09-09: "Found white spot fix it check on image" — a small white
 * rectangle low on the left of the apothecary and gifts PDPs.
 *
 * ⚠ IT IS A HIDDEN ELEMENT THAT LEAKS, and the leak is in its own hiding. The
 *   category templates carry, in an inline `<style>`:
 *
 *       .datpri span { background-color: #ffffff; color: #ffffff }
 *       .datpri      { background-color: #ffffff; color: #ffffff; height: 0px }
 *
 *   `height: 0` with no `overflow`, so the `<span>` inside simply overflows the
 *   collapsed box and paints its own white background. White-on-white hides the
 *   TEXT and leaves the FILL — which is the spot. Measured at 67×20 on
 *   `leaky-gut-protocol` and 64×20 on `100-gift-voucher`, both at x=64.
 *
 * ⚠ `#dataprice` IS LIVE DATA, so it is hidden rather than removed.
 *   `footer.php:724` reads its `data-max` and `data-price` attributes for the
 *   quantity stepper's price maths, and further down jQuery WRITES into
 *   `#dataprice .woocommerce-Price-amount`. Attribute reads and `.html()` writes
 *   both work on a `display: none` element, so this is safe — deleting the div
 *   would not have been.
 *
 * `!important` because the offending declarations are in an inline `<style>`
 * later in the document than this file, at the same specificity.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .datpri,
body.single-product .datpri {
	display: none !important;
}

/*
 * ⚠ AND THE SOLD-OUT PANEL PRINTED ITS PRICE TWICE — once in the right place
 *   and once at the very bottom, below the vet endorsement.
 *
 *   `.summary > p.price` carries `order: 1`, and `.summary` is a flex column, so
 *   order 1 sorts it after every order-0 sibling — including the PRODUCT DETAILS
 *   accordion and the endorsement section. Measured at y=1748 with the panel's
 *   own price at y≈330.
 *
 *   On an in-stock product it is empty (measured 0×0), which is why this has
 *   never shown before: the price lives in the option rows there. Only a
 *   sold-out product fills it, and `p.oosprice` — restyled above — is already
 *   the price this panel shows. Scoped with `:has(.btn-ofs)` so an in-stock
 *   panel is untouched.
 */
.chuni-beef-banner .summary:has(.btn-ofs) > p.price {
	display: none;
}

/* ===========================================================================
 * GIFT PRODUCTS — an empty quantity box, and a price the panel never styled
 *
 * Mitz, 2026-09-09, from a screenshot of `100-gift-voucher`: "check images for
 * gifts products, it should be the same on other products the styling and
 * setup. just hide the quantity buttons."
 *
 * Two things, both measured against the carnivore box as the control:
 *
 *              option rows   .quantity-box     simple--price
 *   normal     2             117×68, - 1 +     display: none
 *   gift       0             ABSENT            VISIBLE, 668 wide, white 16.8px
 *
 * ⚠ THE EMPTY TAN BOX IS `.quantity` WITH NOTHING IN IT. `quantity-input.php`
 *   takes its `$max_value && $min_value === $max_value` branch for these
 *   products and emits `<div class="quantity hidden">` holding only a hidden
 *   input — no stepper, no buttons. The redesign then styles `.quantity` into
 *   the design's 119×70 tan box regardless, so the box drew and its contents
 *   did not. Counted in the served HTML: the gift page has FOUR
 *   `<div class="quantity hidden">` and the carnivore page has none.
 *
 *   So `.hidden` is WooCommerce's own "there is no quantity to choose" signal,
 *   which makes it the right thing to key on rather than a category test.
 *
 * ⚠ THE HIDDEN INPUT STILL SUBMITS. `display: none` on the wrapper does not
 *   remove `<input type="hidden" name="quantity" value="1">` from the form, so
 *   add-to-cart is unaffected. Checked before choosing `display` over anything
 *   that would have moved it out of the form.
 * ------------------------------------------------------------------------- */
/*
 * ⚠ `!important`, and it is OUR OWN rule being beaten, not the theme's. Line
 *   570 of this file is
 *
 *     .chuni-beef-banner .summary form.cart .quantity { display: flex !important }
 *
 *   at (0,4,1) — and an `!important` declaration beats a non-important one
 *   whatever the specificity, so `display: none` at (0,5,1) simply lost. With
 *   both marked important, specificity decides again and this selector wins.
 *   Measured after the first deploy: the price had restyled and the box was
 *   still there, which is what pointed at a display fight rather than a
 *   selector miss.
 */
.chuni-beef-banner .summary form.cart > .quantity.hidden {
	display: none !important;
}

/*
 * ⚠ AND THE CTA HAS TO TAKE THE FREED COLUMN, or the grid keeps its 119px
 *   track and the button starts 127px in from the panel's left edge with
 *   nothing beside it. Spanning columns 1-2 gives 119 + 8 + 461 = 588, which
 *   with the 8px gap and the 72px wishlist is the panel's 668 exactly.
 *
 *   Both the gate's stand-in AND the real submit, so the row does not change
 *   shape when a postcode validates — the same reasoning as the gate CTA's own
 *   `grid-column: 2`.
 */
.chuni-beef-banner .summary form.cart:has(> .quantity.hidden) > .bc-pdp-gate-cta,
.chuni-beef-banner .summary form.cart:has(> .quantity.hidden) > button.single_add_to_cart_button,
.chuni-beef-banner .summary form.cart:has(> .quantity.hidden) > .show-pincode-pop-up {
	grid-column: 1 / 3;
}

/*
 * The price, styled like the panel instead of like the theme.
 *
 * `p.simple--price` is what the theme falls back to when a product has no
 * subscription schemes, and on a gift it is the only price the panel shows —
 * `.summary > p.price` is empty here, and there are no option rows to carry it.
 * It was rendering at the theme's inherited 16.8px in plain white, which is
 * neither a design size nor a design colour.
 *
 * Matched to the option row's price — `Size/Paragraph` 18px on a 26px line,
 * Inter Semi Bold, Color 4 — so a gift's price reads at the same weight as
 * every other product's, which is what "the same as other products" means when
 * the thing it would match does not exist on the page.
 */
.chuni-beef-banner .summary form.cart > .simple--price {
	margin: 0 0 4px !important;
	padding: 0;
	color: var(--pdp-c4);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-para);
	font-weight: 600;
	line-height: 26px;
}

/* Same nesting problem as item 347 — `wc_price()` puts the digits two levels
 * down, and `style.css` paints `.woocommerce-Price-amount` directly. */
.chuni-beef-banner .summary form.cart > .simple--price .woocommerce-Price-amount,
.chuni-beef-banner .summary form.cart > .simple--price bdi,
.chuni-beef-banner .summary form.cart > .simple--price .woocommerce-Price-currencySymbol {
	color: inherit;
	font-size: inherit;
	font-weight: inherit;
}

/* ===========================================================================
 * THE OUT-OF-STOCK BUTTON TAKES THE CTA'S CELL
 *
 * Mitz, 2026-09-09: "it should be the same placement of 'Check & Add to Cart'"
 * and, alongside it, "also hide the quantity as well be uniform for gifts
 * products".
 *
 * The two go together. With the stepper hidden on every gift, a sold-out gift's
 * action row becomes `[ Out of stock ] [ ♡ ]` — the same shape an in-stock
 * gift's `[ Check & Add To Cart ] [ ♡ ]` has, which is what makes the two
 * states read as one component.
 *
 * `.bc-pdp-oos-cta` is emitted by `woocommerce/global/quantity-input.php`
 * because that is the only template that runs INSIDE the wishlist plugin's
 * form — see the note there. It is therefore a grid child and can be placed.
 * ------------------------------------------------------------------------- */

/*
 * ⚠ HIDE THE QUANTITY ON ALL GIFTS, not just the ones WooCommerce marks
 *   `.hidden`. The earlier rule keyed on `.quantity.hidden`, which covers gift
 *   vouchers and the cooler bag — products with no quantity choice — but NOT
 *   `portable-water-bottle-pink`, which is a gift with a real `- 1 +` stepper.
 *   Mitz asked for gifts to be uniform, so the category is the condition here
 *   rather than the markup. `product_cat-gifts` sits on the `div.product`
 *   wrapper, verified in the served HTML.
 *
 *   `!important` for the same reason as the `.hidden` rule: line 570 of this
 *   file sets `display: flex !important` on `.quantity` in this scope.
 */
.chuni-beef-banner .product_cat-gifts .summary form.cart > .quantity {
	display: none !important;
}

/*
 * Column 1-2 whenever the stepper is gone — the same span the CTA takes on a
 * gift, giving 119 + 8 + 461 = 588 with the wishlist's 72 completing the 668.
 * Two conditions, because the stepper disappears two different ways: by
 * category (a gift) or by WooCommerce's own `.hidden` (no quantity to choose).
 */
.chuni-beef-banner .product_cat-gifts .summary form.cart > .bc-pdp-oos-cta,
.chuni-beef-banner .summary form.cart:has(> .quantity.hidden) > .bc-pdp-oos-cta {
	grid-column: 1 / 3;
}

/*
 * And where the stepper DOES show — a sold-out product outside gifts — the
 * button takes column 2 only, exactly where the CTA sits on those pages.
 */
.chuni-beef-banner .summary form.cart > .bc-pdp-oos-cta {
	order: 5;
	grid-column: 2;
	display: flex;
	align-items: center;
	justify-content: center;
	box-sizing: border-box;
	width: 100%;
	min-height: 70px;   /* the action row's height, not the 46 of a loose button */
	margin: 0 !important;
	padding: 12px 24px;
	border: 1px solid var(--pdp-c12);
	border-radius: 0;
	background-color: transparent !important;
	color: var(--pdp-c12) !important;
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-para);
	font-weight: 600;
	line-height: 22px;
	text-transform: none;
	/*
	 * `disabled` is on the element, so the cursor and the browser's own
	 * dimming both apply — but the design's disabled treatment is already the
	 * muted outline, so opacity is pinned to stop it being dimmed twice.
	 */
	opacity: 1;
	cursor: default;
}

/*
 * ⚠ The summary-level `.btn-ofs` is the FALLBACK now, not the normal path, and
 *   it must not double up. `quantity-input.php` sets a flag that stops
 *   `stock.php` printing one — but if both ever rendered, this keeps the loose
 *   one out of the way rather than stacking two buttons.
 */
.chuni-beef-banner .summary form.cart > .bc-pdp-oos-cta ~ .btn-ofs,
.chuni-beef-banner .summary:has(form.cart > .bc-pdp-oos-cta) > .btn-ofs {
	display: none;
}

/* ===========================================================================
 * U1 and U3 — the two box-model residuals, and the narrow-width band padding
 * 2026-09-09. Every figure below is read off the saved exports by pixel scan
 * (`PDP-without-sticky.png` at 1512, `PRODUCT PAGE - tablet.png` at 744,
 * `PRODUCT PAGE - mobile.png` at 428), not off Figma metadata — the MCP has
 * been unauthenticated all session.
 * ========================================================================= */

/* ── U1a: the Descriptions body separates its paragraphs by a blank line ─────
 * The accordion measured 646 against the design's 736. 60 of that gap is the
 * "New To Raw Feedings?" row, REMOVED on the designer's instruction (item 143 —
 * do not restore it from the mockup), which leaves 676 as the real target.
 *
 * Scanned line by line, the whole remaining difference is paragraph spacing in
 * the open Descriptions row. Text-line advances in the export are 52, 52, 26
 * against our 26, 26, 26 — so the design puts ONE 26px line between the lead
 * and the body, and between the body's first paragraph and the size line, and
 * nothing between the size line and the disc count. Everything below that —
 * the mark, both label/value pairs, their internal 15px — already measures
 * within 4px.
 *
 * ⚠ `:not(:last-of-type)` because the size line ("7.5KG") is a bare text node
 *   BETWEEN the two paragraphs, not a third one: the last `<p>` is the disc
 *   count, which the design does NOT space away from the mark below it.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .bc-pdp-details__lead {
	margin-bottom: 26px;
}

.chuni-beef-banner .bc-pdp-details__body > p:not(:last-of-type) {
	margin-bottom: 26px;
}

/* ── U1b: the card's rating row is drawn half the size we render it ──────────
 * The card measured 670 against the design's 630. Attributed:
 *
 *   +20  the title's two-line reservation — DELIBERATE and documented further
 *        up this file ("Costs 20px against the design's 630"), so it stays.
 *   +14  this rule: the rating row.
 *   + 5  the card's Subscribe row, 60 against the export's 55 — left alone,
 *        recorded with the other sub-3px residuals rather than chased.
 *
 * Yotpo renders five 15px SVGs and a 16px/28px count, giving a 30px row; the
 * export draws 8px stars and ~12px text on a 16px line. Only the CARD is
 * scoped — the purchase panel's own rating row is drawn at full size and is
 * measured correct.
 *
 * ⚠ `!important` throughout: these are the plugin's own inline-ish widget
 *   styles under `.yotpo-star-ratings-widget-override-css`, and the SVGs carry
 *   width/height attributes as well as CSS.
 * ------------------------------------------------------------------------- */
.bc-pdp-cards li.product .for_yotpo_in_sub,
.bc-pdp-cards li.product .for_yotpo_in_sub .yotpo-widget-instance,
.bc-pdp-cards li.product .for_yotpo_in_sub .yotpo-reviews-star-ratings-widget,
.bc-pdp-cards li.product .for_yotpo_in_sub .yotpo-bottom-line-scroll-panel,
.bc-pdp-cards li.product .for_yotpo_in_sub .yotpo-sr-bottom-line-summary,
.bc-pdp-cards li.product .for_yotpo_in_sub .yotpo-sr-bottom-line-right-panel {
	min-height: 0 !important;
	height: 16px !important;
}

.bc-pdp-cards li.product .for_yotpo_in_sub svg {
	width: 8px !important;
	height: 8px !important;
}

.bc-pdp-cards li.product .for_yotpo_in_sub .yotpo-sr-bottom-line-text {
	font-size: 12px !important;
	line-height: 16px !important;
}

/* ── U3: the bands below the panel are padded 64px at every width ────────────
 * Measured on the exports by left-edge colour run, which gives each band's
 * exact top and bottom because every one of them is a different dark:
 *
 *              design            build (before)
 *   why band   302 / 359         375 / 399     (tablet / mobile)
 *   reasons + "you may also like"
 *              1906 / 1753       2103 / 1956
 *
 * Broken down by ink position, the whole difference is vertical padding, and
 * it is the SAME 64px at desktop — where the design draws 741 against our 718,
 * so desktop is correct and must not move. The export's own values:
 *
 *   why band     top 19 / 17   bottom 23 / 20   (tablet / mobile)
 *   sections     top 30 / 27   bottom 24 / 20
 *   between two adjacent sections   62 / 55
 *
 * So 20 for the why band's intro and 28 for the two sections, which puts every
 * edge within 5px at tablet and 10px at mobile against 36-45 before. One value
 * per band rather than per breakpoint: the two widths differ by 2-3px, which is
 * inside the sampling error of reading an export.
 *
 * ⚠ The band totals will still not match exactly, and that is content, not
 *   padding: the design's "WHY FEED RAW DOG FOOD?" wraps to two lines in both
 *   narrow frames where ours fits on one (+26 in the design's favour), and the
 *   card carries the residuals recorded under U1b above.
 * ------------------------------------------------------------------------- */
@media (max-width: 999px) {
	.bc-pdp-why__intro {
		padding-block: 20px;
	}

	.bc-pdp-reasons,
	.bc-pdp-cards-section {
		padding-block: 28px;
	}
}

/*
 * ⚠ The star wrapper is an UNCLASSED span and the first pass missed it: the
 *   five 8px stars sat at y10 in a span still 28 tall, so they read as dropped
 *   below the count text beside them. Yotpo gives it no class of its own, so it
 *   is addressed as the summary button's own child.
 */
.bc-pdp-cards li.product .for_yotpo_in_sub .yotpo-sr-bottom-line-summary > span,
.bc-pdp-cards li.product .for_yotpo_in_sub .yotpo-sr-bottom-line-summary > span > span,
.bc-pdp-cards li.product .for_yotpo_in_sub .yotpo-sr-bottom-line-summary,
.bc-pdp-cards li.product .for_yotpo_in_sub .yotpo-bottom-line-scroll-panel {
	height: 16px !important;
	align-items: center !important;
}

/* ===========================================================================
 * THE SOLD-OUT PANEL, SECOND PASS — the price above the button, and the
 * informational rows back
 *
 * Mitz, 2026-09-09: "for gifts product page out of stock still the price is not
 * in correct placement and there are sections that are missing."
 *
 * ⚠ WHY THE PRICE WAS UNDER THE BUTTON, and why no `order` on it alone could
 *   have fixed it. `p.oosprice` is a direct child of `.summary` — a flex column
 *   — and so is `form.cart`, which holds the button. EVERY visible child of
 *   that panel computes `order: 0`, so they fall in source order, and
 *   `stock.php` emits the price AFTER the form. Setting `order: -1` on the
 *   price alone would have lifted it above the title and the rating too, since
 *   those are order 0 as well.
 *
 *   So the sold-out panel's whole sequence is stated here, explicitly, rather
 *   than one member of it. Scoped to `.outofstock`, so an in-stock panel — where
 *   these blocks live INSIDE `form.cart` and are placed by the rules further up
 *   this file — is untouched.
 *
 * The sequence matches an in-stock panel's, minus what cannot apply: price
 * above the action row, informational rows below it, then the accordion and the
 * endorsement. Those informational rows are rendered from
 * woocommerce/global/quantity-input.php so that they land inside `form.cart`
 * and keep the placements they already have; read the note at the foot of
 * inc/pdp-redesign.php for why a hook could not do it, and for why the purchase
 * options, the postcode gate and the sticky bar are deliberately left out.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .outofstock .summary > p.bc-pdp-endorse { order: -6; }
.chuni-beef-banner .outofstock .summary > h1.product_title { order: -5; }
.chuni-beef-banner .outofstock .summary > .bc-pdp-meta { order: -4; }
.chuni-beef-banner .outofstock .summary > p.oosprice { order: -2; }
.chuni-beef-banner .outofstock .summary > form.cart { order: -1; }
.chuni-beef-banner .outofstock .summary > section.bc-pdp-details { order: 1; }
.chuni-beef-banner .outofstock .summary > section.bc-pdp-endorsement { order: 2; }

/*
 * The shipping bar, the refund row and the promo banner come back as children
 * of `form.cart` — see woocommerce/global/quantity-input.php — so the
 * `form.cart > …` order rules further up this file place them already, at 6,
 * 7 and 8. Only the calculator needs a placement: on an in-stock page it is a
 * PANEL child rendered before the form, and here it is inside it. Order 0 puts
 * it first in the form, which keeps it above the action row exactly as it sits
 * above the purchase options when there is something to buy.
 */
.chuni-beef-banner .outofstock .summary form.cart > p.bc-pdp-calc {
	order: 0;
	grid-column: 1 / -1;
}

/*
 * ⚠ AND THE PANEL'S OWN FLEX SETTINGS, restated — this is why the endorsement
 *   line and the rating row sat CENTRED and half-width on a sold-out page while
 *   an in-stock one has them full width and left.
 *
 *   Measured, both at 1512: `.summary` computes `display: block` on an in-stock
 *   panel and `display: flex` on a sold-out one. `custom_style.css:500` sets
 *   `.outofstock.shipping-taxable .summary.entry-summary { display: flex;
 *   flex-direction: column; align-items: center }` — a 2022 rule for a panel
 *   that held nothing but a title, a note and a red button. Under
 *   `align-items: center` every child WITHOUT a width shrinks to its content
 *   and centres, which is exactly the two blocks that do not set one: the
 *   endorsement line measured 304 wide against 668, the rating row 170.
 *
 *   `stretch` rather than removing the flex: the sold-out sequence above is
 *   expressed in `order`, which only applies to a flex container. So the panel
 *   stays flex and its children stop shrinking.
 *
 *   `flex-direction` is restated with it because the same stylesheet flips it to
 *   `row` at `min-width: 768px` (line 518) — a landscape arrangement for that
 *   old three-element panel. Something already beats it, but the panel now has
 *   eleven children and none of this should depend on which of the three
 *   near-identical copies of `custom_style.css` a page happens to enqueue.
 *
 *   ⚠ AND IT NEEDS `!important`, which the first attempt at this rule did not
 *     carry — it changed nothing, and the panel measured exactly as before.
 *     The declaration that actually wins is not the (0,4,0) one at
 *     `custom_style.css:500` but **line 538 of the same file**:
 *     `.chunii-right-image .outofstock .summary { flex-direction: column
 *     !important; align-items: center !important }`. That is only (0,3,0), so
 *     specificity was never the question — `!important` beats a non-important
 *     declaration whatever its specificity, and between two `!important`
 *     declarations specificity decides again. Hence (0,5,0) AND the flag.
 *     Item 378 hit line 539 of this same block, one line down.
 *
 *     It also explains why the panel stacks at all: line 518 flips the
 *     direction to `row` above 768px and line 538 overrules it with a flag.
 */
.chuni-beef-banner .outofstock.shipping-taxable .summary.entry-summary {
	flex-direction: column !important;
	align-items: stretch !important;
}

/* ── button:focus, as asked ─────────────────────────────────────────────────
 * Mitz, 2026-09-09, supplied verbatim and added verbatim.
 *
 * ⚠ THIS RULE CHANGES NOTHING, and that is worth stating so nobody later
 *   "fixes" the duplicate or wonders why it had no effect. `style.css:4876`
 *   already carries the identical declaration site-wide:
 *
 *       button:focus {
 *           outline: 0px dotted !important;
 *           outline: 0px auto -webkit-focus-ring-color !important;
 *       }
 *
 *   Same selector, same specificity (0,1,1), same `!important`. Mitz was told
 *   as much and chose to add it anyway, so it is here as a statement of intent
 *   rather than as a change. Kept in this stylesheet rather than merged into
 *   the theme's copy, so the instruction stays legible next to the audit notes
 *   about it.
 *
 * ⚠ WHAT IT DOES *NOT* SUPPRESS, measured with a real keyboard focus rather
 *   than reasoned about:
 *     - the wishlist hearts are `<a>`, not `<button>`, so this selector never
 *       reaches them   — outline 2px tan, working;
 *     - the shipping bar and refund row answer it with `!important` at higher
 *       specificity — outline 2px tan, working.
 *
 * ⚠ AND WHAT IT ALREADY SUPPRESSED BEFORE TODAY — a correction to what I told
 *   Mitz when this was asked for. I said the redesign's own focus outlines
 *   survive. Two of them do not, and never did: the accordion toggle and the
 *   promo banner's dismiss are both `<button>`, both match `:focus-visible`,
 *   and both compute `outline: 0px` — their rules in this file carry no
 *   `!important`, so the theme's flagged copy has been beating them all along.
 *   That widens audit row **A1**: the site-wide rule is not only hiding the
 *   browser's default ring, it is silently defeating this redesign's own
 *   keyboard affordances on every `<button>` that did not flag them.
 *
 *   Left as it is, deliberately: the instruction was to add this and change
 *   nothing else. Making those two visible is one `!important` each, and it is
 *   Mitz's call, not a defect to fix quietly under a rule they just asked for.
 * ------------------------------------------------------------------------- */
button:focus {
	outline: 0 !important;
}

/* ── The postcode checker's error message ─────────────────────────────────
 * QA 2026-09-10 (Mitz): "Fix error message UI" - a pale pink box, red
 * message, full width of the field row, below it. Both pages.
 *
 * ⚠ THE PLUGIN PAINTS ITS OWN: an inline <style> block in
 *   woocommerce-pincode-check.php sets .error_pin to a red ground, white 12px
 *   text, 6px padding, a 5px radius, a shake animation and an ::after arrow
 *   pointing up at the field. Every one of those is answered here at (1,2,0)
 *   against its (0,1,0); the arrow goes because the mock has none.
 *
 * ⚠ THE MESSAGE'S CASE IS DATA, NOT CSS. The stored string in the plugin's
 *   pincode_setting_pro table was ALL CAPS; the mock is sentence case. That is
 *   a settings change, recorded as config-manifest 3.6 - text-transform cannot
 *   un-capitalise a source string without also lowering "Apothecary".
 * ------------------------------------------------------------------------- */
/*
 * ⚠ TWO IDs AND A FLAG, BECAUSE THE THEME GOT THERE FIRST. Measured after the first
 *   push: padding and shape landed, ground/colour/size did not. `style.css` carries
 *   `.error_pin { background-color: rgba(175,0,0,0) !important }` — a flag beats
 *   any unflagged rule — and `div#my_custom_checkout_field2 div#error_pin { color:
 *   #fff; font-size: 12px }` at (2,0,2), which outranks a one-id selector however
 *   many classes it carries. So: the theme’s own two-id shape inside our scope,
 *   (2,2,2), and the flag on the ground only.
 */
.chuni-beef-banner .summary div#my_custom_checkout_field2 div#error_pin,
.chuni-beef-banner .summary div#my_custom_checkout_field2 div#error_pin_b {
	box-sizing: border-box;
	/*
	 * ⚠ THE PLUGIN FLOATS IT. `#my_custom_checkout_field2 .error_pin { float: right;
	 *   margin-top: 12px }` in its stylesheet, plus `position: relative` inline — and
	 *   on the PDP both error elements carry .error_pin, so the styled box floated
	 *   up alongside the field row and painted OVER the input (Mitz's screenshot,
	 *   200 path). In flow, cleared, it sits below the row as the mock draws it.
	 */
	float: none;
	clear: both;
	position: static;
	/*
	 * ⚠ AND AN ORDER, BECAUSE THE WIDGET IS A FLEX ROW. `style.css` makes
	 *   `#my_custom_checkout_field2` flex-wrap and orders its children — the field
	 *   row 1, #error_pin 2 — but never #error_pin_b, which therefore sorted to
	 *   order 0 and rendered ABOVE the field once its float was gone (measured: box
	 *   bottom = field top on both pages). 2 puts it where #error_pin already sits.
	 */
	order: 2;
	width: 100%;
	margin: 12px 0 0;
	padding: 6px 10px;
	border-radius: 0;
	background-color: var(--pdp-error-bg) !important;
	color: var(--pdp-error-fg);
	font-family: var(--pdp-font-body);
	font-size: 12px;
	font-weight: 600;
	line-height: 16px;
	text-transform: none;
}

.chuni-beef-banner .summary div#my_custom_checkout_field2 div#error_pin::after,
.chuni-beef-banner .summary div#my_custom_checkout_field2 div#error_pin_b::after {
	content: none;
}

.chuni-beef-banner .summary div#my_custom_checkout_field2 div#error_pin p,
.chuni-beef-banner .summary div#my_custom_checkout_field2 div#error_pin_b p {
	margin: 0;
}

/* ==========================================================================
 * "View delivery areas & schedule" — it SLIDES IN FROM THE RIGHT
 *
 * Mitz, 2026-09-07: "for Pop-up when 'View delivery areas & schedule' is
 * clicked the way the popup show make it the same way how FILTER and SORT
 * popup show" … "it should display on right side" … "dont update anything just
 * update how it show what I mean show like slide right, dont update its width
 * height etc."
 *
 * ⚠ SO THIS CHANGES THE ARRIVAL AND NOTHING ELSE. A first pass also gave the
 *   popup the drawers' width (445), their padding, their backdrop and a restyled
 *   close button — i.e. it rebuilt the panel when what was asked for was the
 *   movement. Reverted: the popup keeps its own 600px, its own ground, its own
 *   0.5 backdrop, its own close control and its own top-right placement, all
 *   from `spu_options`. Only how it gets on screen is ours.
 *
 * ⚠ THIS IS THE SPU PLUGIN'S POPUP. The trigger carries `spu-open-78583` and
 *   post 78583 ("PDP-View Delivery Areas & Schedule") renders
 *   `.spu-box.bc-learn-popup` into the footer, OUTSIDE `#topback`. The same popup
 *   serves three controls on the PDP, so the scope below is `:has()` — `.bc-cat`
 *   cannot reach a body child, and a bare `.spu-box.bc-learn-popup` rule would change a page
 *   this pass has not measured. `:has()` is already relied on in this build (the
 *   card's Subscribe selected state): Chrome 105+, Safari 15.4+, Firefox 121+.
 *   Without it the popup simply keeps the plugin's own arrival.
*
 * ⚠ AND THE PDP NOW ARRIVES THE SAME WAY — Mitz, QA 2026-09-16: "in PDP when I
 *   clicked View delivery areas & schedule the popup show not thesame on
 *   category page, the way it slide show something."
 *
 *   The 2026-09-07 pass scoped this to the category page alone because the PDP
 *   had not been measured. It had not aged well: measured on staging, the
 *   category popup opened with `animation: bc-cat-spu-in` and
 *   `overflow-y: auto`, the PDP's with `animation: none` and
 *   `overflow: hidden` — so the PDP not only skipped the slide, its content
 *   could not be scrolled, which is the worse half of the same bug.
 *
 *   `.bc-pdp-sticky` is the PDP's own marker and is absent from category pages,
 *   so the two scopes are disjoint and together cover exactly the two pages
 *   this has been measured on. Nothing else gains the animation.
 *
 * ⚠ THE RULE LIVES HERE, NOT IN category-redesign.css, because that file only
 *   loads on category pages while this one loads on both.
 * ========================================================================== */

body:has(#topback.bc-cat) div.spu-box.bc-learn-popup,
body:has(.bc-pdp-sticky) div.spu-box.bc-learn-popup {
	/*
	 * ⚠ A KEYFRAME, NOT A TRANSITION, AND THE REASON IS THE PLUGIN'S OWN JS.
	 *   `spu_options` sets no `animation`, so `public.js:563` falls through to
	 *   `$box.slideDown('slow')` — which is the downward growth being replaced.
	 *   A transition cannot answer it either way: the box goes `display: none` →
	 *   `block`, and transitions do not run from `display: none`. A CSS animation
	 *   DOES restart on that flip.
	 *
	 *   0.28s ease is the drawers' own timing, so the two read as one gesture.
	 */
	animation: bc-cat-spu-in 0.28s ease both;

	/*
	 * ⚠ THE ONLY THREE DECLARATIONS THAT ARE NOT THE ANIMATION, AND THEY EXIST
	 *   SOLELY TO SUPPRESS THE ARRIVAL BEING REPLACED — not to resize anything.
	 *   `slideDown` animates an inline `height` from 0 with `overflow: hidden`
	 *   for the duration, so without these the box would grow downward WHILE it
	 *   slid in, showing both movements at once.
	 *
	 *   The popup already settles at the viewport's height on its own (measured
	 *   600×1000 before any of this), so the box ends up exactly the size it
	 *   always was — these only stop the journey to it being visible. Width,
	 *   padding, colours and placement are untouched.
	 */
	height: 100% !important;
	max-height: 100% !important;
	overflow-y: auto !important;
}

@keyframes bc-cat-spu-in {
	from {
		transform: translateX(100%);
	}

	to {
		transform: translateX(0);
	}
}


/* ── "Load more reviews" (register 589) ─────────────────────────────────────
 * Mitz, QA 2026-09-28: "under reviews fix the button text color" + "and padding
 * as well".
 *
 * Measured on live first, via a rendered probe - the widget is client-side, so
 * the button is not in the served HTML and its class cannot be grepped:
 *
 *   color   #6B6D76  Yotpo's default grey
 *   padding 5px 0 0  top only
 *   border  #A4866C  already brand-coloured
 *
 * The border was already ours while the label was not, because nothing in this
 * repo targets the button at all - that border comes from Yotpo's own brand
 * config, which happens to equal --pdp-c1.
 *
 * ⚠ The :hover is not optional. style.css styles the bare `button` and its
 *   :hover, and that rule has already reached this control - see the
 *   endorse-jump note, which lists LOAD MORE among four it turned #826852.
 * ------------------------------------------------------------------------- */
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-reviews-pagination-item {
	box-sizing: border-box;
	/*
	 * ⚠ width/height auto + nowrap are what make the padding safe. Yotpo gives
	 *   this button a FIXED 158x30 box; adding 24px of horizontal padding to that
	 *   left ~110px of content width, so "Load more reviews" wrapped and the
	 *   second line escaped the border. Sizing the box to its text is the fix -
	 *   shrinking the padding back would only have hidden it until the label or
	 *   font changed.
	 */
	width: auto;
	height: auto;
	min-width: 0;
	max-width: 100%;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	white-space: nowrap;
	padding: 10px 24px;
	border-radius: 0;
	color: var(--pdp-c3);
	font-family: var(--pdp-font-body);
	font-size: var(--pdp-links);
	font-weight: 500;
	line-height: 20px;
	text-transform: none;
	transition: color .2s ease, border-color .2s ease;
}

.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-reviews-pagination-item:hover,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-reviews-pagination-item:focus,
.chuni-beef-banner .summary .bc-pdp-details__mount[data-bc-mount="reviews"] .yotpo-reviews-pagination-item:focus-visible {
	color: var(--pdp-c4);
	border-color: var(--pdp-c3);
	background: transparent;
}
