/* ==========================================================================
   Bloomazz — Product Detail Page
   ========================================================================== */

/* Breadcrumb sat with zero space above it, flush against the site
   header — single-product.css only ever loads on is_product() (see
   inc/single-product.php), so this is scoped to the PDP without a body
   class needed. Selector has to be `.woocommerce .woocommerce-breadcrumb`,
   not just `.woocommerce-breadcrumb` — WooCommerce's own woocommerce.css
   sets `.woocommerce .woocommerce-breadcrumb { padding: 0 }`, and <body>
   itself carries a plain "woocommerce" class on every WC page, so that
   rule's specificity (two classes) beat a bare one-class selector here
   regardless of which stylesheet loaded last. */
.woocommerce .woocommerce-breadcrumb {
	padding: 1.5rem 20px 0;
	font-size: 0.82rem;
	color: #8a8694;
}
.woocommerce-breadcrumb a {
	color: #8a8694;
	transition: color 0.15s ease;
}
.woocommerce-breadcrumb a:hover {
	color: var(--bz-lavender-deep);
}

/* ==========================================================================
   Gallery + summary layout
   ========================================================================== */
.bz-product-hero {
	display: grid;
	grid-template-columns: 1.05fr 0.95fr;
	gap: clamp(2rem, 4vw, 4rem);
	max-width: var(--bz-container);
	margin: 0 auto;
	padding: 2.5rem 20px 0;
	align-items: flex-start;
}

.bz-product .onsale {
	background: var(--bz-blush) !important;
	color: var(--bz-ink) !important;
	font-family: var(--bz-font-body);
	font-size: 0.72rem !important;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	min-height: 48px;
	min-width: 48px;
}

.bz-product-gallery-wrap {
	position: relative;
	min-width: 0;
	margin-bottom: 0;
}

.bz-product-style-tag {
	position: absolute;
	top: 16px;
	left: 16px;
}

/* WooCommerce's classic (non-grid) CSS floats these at 48% width by
   default — this theme's layout is grid-based, so both need to fill
   their actual grid column instead. */
.woocommerce-product-gallery,
.bz-product .summary.entry-summary {
	width: 100% !important;
	float: none !important;
}

.woocommerce-product-gallery {
	position: relative;
}
.woocommerce-product-gallery__wrapper {
	margin: 0;
	min-width: 0;
	border: 1px solid var(--bz-border);
}
.woocommerce-product-gallery__wrapper .woocommerce-product-gallery__image {
	aspect-ratio: 4 / 5;
	overflow: hidden;
}
.woocommerce-product-gallery__wrapper .woocommerce-product-gallery__image img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	/* zoom.js is active on this image (wc-product-gallery-zoom support) —
	   make that obvious with the native zoom cursor. */
	cursor: zoom-in !important;
}

/* Thumbnails: a small, compact strip. Below the image by default (also
   the mobile layout); moved beside it on desktop below. */
.flex-control-thumbs {
	display: flex;
	flex-wrap: wrap;
	gap: 0.5rem;
	margin: 0.75rem 0 0;
	padding: 0;
	list-style: none;
}
.flex-control-thumbs li,
.woocommerce div.product div.images .flex-control-thumbs li {
	width: 96px !important;
}
.flex-control-thumbs img {
	display: block;
	width: 100%;
	aspect-ratio: 4 / 5;
	object-fit: cover;
	cursor: pointer;
	border: 2px solid var(--bz-border);
	opacity: 0.9;
	transition: opacity 0.2s ease, border-color 0.2s ease;
}
.flex-control-thumbs img.flex-active,
.flex-control-thumbs img:hover {
	opacity: 1;
	border-color: var(--bz-lavender);
}

/* Thumbnail scroll cue (up/down buttons + fade) — desktop-only, since
   the thumbnail column it overlays doesn't exist below 781px (that's
   the mobile dots above instead). Every other rule for this lives
   inside the @media (min-width: 781px) block further down, so without
   this base display:none it rendered as a plain, fully visible,
   unstyled pair of buttons on mobile — nothing there was hiding it,
   the "hidden until desktop" behaviour only existed once that media
   query's own display:block took over. */
.bz-gallery-thumb-nav {
	display: none;
}

/* Mobile-only slide dots — hidden until the ≤780px breakpoint below
   swaps them in for the thumbnail strip. */
.bz-gallery-dots {
	display: none;
	align-items: center;
	gap: 6px;
	position: absolute;
	left: 50%;
	bottom: 14px;
	z-index: 2;
	padding: 7px 10px;
	border-radius: 999px;
	background: rgba(33, 31, 46, 0.32);
	backdrop-filter: blur(6px);
	-webkit-backdrop-filter: blur(6px);
	transform: translateX(-50%);
}
.bz-gallery-dot {
	width: 6px;
	height: 6px;
	padding: 0;
	border-radius: 999px;
	background: rgba(255, 255, 255, 0.55);
	transition: width 0.25s ease, background-color 0.25s ease;
}
.bz-gallery-dot.is-active {
	width: 18px;
	background: var(--bz-white);
}
@media (prefers-reduced-motion: reduce) {
	.bz-gallery-dot {
		transition: none;
	}
}

/* Desktop: thumbnails move to a small column on the left of the image. */
@media (min-width: 781px) {
	.woocommerce-product-gallery {
		display: flex;
		flex-direction: row-reverse;
		align-items: flex-start;
		gap: 0.75rem;
	}
	.woocommerce-product-gallery__wrapper {
		flex: 1;
	}
	/* WooCommerce's own default CSS sets its own, far more specific
	   `.woocommerce div.product div.images .flex-control-thumbs { overflow:
	   hidden }` (woocommerce.css) — beats a plain `.flex-control-thumbs`
	   selector regardless of load order, so overflow-y: auto below was
	   silently never taking effect. With 7-9 gallery images that meant
	   everything past the ~5 that fit in 640px was simply clipped, with
	   no scrollbar and no way to reach the rest. Matching the same
	   selector prefix here (same fix already applied to the li rule
	   just below) is what actually wins the cascade. */
	.flex-control-thumbs,
	.woocommerce div.product div.images .flex-control-thumbs {
		flex: 0 0 96px;
		flex-direction: column;
		flex-wrap: nowrap;
		margin: 0;
		max-height: 640px;
		overflow-y: auto;
		/* The scrollbar this now needs is its own bit of clutter next to a
		   96px-wide thumbnail strip — .bz-gallery-thumb-nav below gives
		   the same "there's more" cue without it. */
		scrollbar-width: none; /* Firefox */
	}
	.flex-control-thumbs::-webkit-scrollbar,
	.woocommerce div.product div.images .flex-control-thumbs::-webkit-scrollbar {
		display: none; /* Chrome, Safari, Opera */
	}
	.flex-control-thumbs li,
	.woocommerce div.product div.images .flex-control-thumbs li {
		width: 100% !important;
	}
	/* The swing tag anchors to the whole gallery wrap; shift it clear of
	   the new thumbnail column so it still sits on the photo's corner. */
	.bz-product-style-tag {
		left: calc(96px + 0.75rem + 16px);
	}

	/* Thumbnail scroll cue — sits directly over the thumbnail column
	   (same 96px width/position, top-aligned with .bz-product-gallery-wrap,
	   the nearest position:relative ancestor). A fade at whichever edge
	   still has more photos past it, .can-scroll-up/down toggled by
	   assets/js/product.js from the thumbnail strip's own scroll
	   position; a plain overflow gallery has neither class, so both
	   stay invisible and out of the way. */
	.bz-gallery-thumb-nav {
		display: block;
		position: absolute;
		top: 0;
		left: 0;
		width: 96px;
		height: 640px;
		pointer-events: none;
		z-index: 3;
	}
	.bz-gallery-thumb-nav::before,
	.bz-gallery-thumb-nav::after {
		content: "";
		position: absolute;
		left: 0;
		right: 0;
		height: 40px;
		opacity: 0;
		transition: opacity 0.2s ease;
	}
	.bz-gallery-thumb-nav::before {
		top: 0;
		background: linear-gradient(to bottom, var(--bz-white), transparent);
	}
	.bz-gallery-thumb-nav::after {
		bottom: 0;
		background: linear-gradient(to top, var(--bz-white), transparent);
	}
	.bz-gallery-thumb-nav.can-scroll-up::before,
	.bz-gallery-thumb-nav.can-scroll-down::after {
		opacity: 1;
	}
	.bz-gallery-thumb-nav-btn {
		position: absolute;
		left: 50%;
		transform: translateX(-50%);
		display: flex;
		align-items: center;
		justify-content: center;
		width: 26px;
		height: 26px;
		border-radius: 50%;
		background: var(--bz-white);
		color: var(--bz-ink);
		box-shadow: 0 2px 10px rgba(33, 31, 46, 0.18);
		opacity: 0;
		visibility: hidden;
		pointer-events: none;
		transition: opacity 0.2s ease, background-color 0.15s ease, color 0.15s ease;
	}
	.bz-gallery-thumb-nav-btn--up {
		top: 6px;
	}
	.bz-gallery-thumb-nav-btn--down {
		bottom: 6px;
	}
	.bz-gallery-thumb-nav.can-scroll-up .bz-gallery-thumb-nav-btn--up,
	.bz-gallery-thumb-nav.can-scroll-down .bz-gallery-thumb-nav-btn--down {
		opacity: 1;
		visibility: visible;
		pointer-events: auto;
	}
	.bz-gallery-thumb-nav-btn:hover {
		background: var(--bz-lavender);
		color: var(--bz-white);
	}
}

@media (prefers-reduced-motion: reduce) {
	.bz-gallery-thumb-nav::before,
	.bz-gallery-thumb-nav::after,
	.bz-gallery-thumb-nav-btn {
		transition: none;
	}
}

/* ==========================================================================
   Summary column
   ========================================================================== */
.bz-product .summary {
	min-width: 0;
	padding-top: 0.5rem;
	/* WooCommerce's own .summary{margin-bottom:2em} default was adding
	   space below this column on top of the hero's own bottom padding —
	   between the two, the gap before the trust strip/tabs below was huge. */
	margin-bottom: 0;
}
.bz-product .summary > .woocommerce-product-details__short-description,
.bz-product .summary > p {
	color: #504c5e;
	line-height: 1.7;
}
.product_title.entry-title {
	font-family: var(--bz-font-display);
	font-size: clamp(1.9rem, 3vw, 2.5rem);
	font-weight: 500;
	margin: 0 0 0.6rem;
	line-height: 1.15;
}

.bz-pdp-urgency {
	display: flex;
	align-items: center;
	gap: 0.4em;
	color: var(--bz-blush);
	background: color-mix(in srgb, var(--bz-blush) 12%, transparent);
	font-size: 0.8rem;
	font-weight: 700;
	padding: 0.4em 0.8em;
	border-radius: 999px;
	width: fit-content;
	margin: 0 0 0.75rem;
}

.bz-pdp-meta-row {
	display: flex;
	flex-wrap: wrap;
	gap: 0.4rem 1.5rem;
	font-size: 0.82rem;
	color: #6f6b7a;
	margin-bottom: 0.85rem;
}
.bz-pdp-meta-row strong {
	color: var(--bz-ink);
	font-weight: 700;
}
/* WooCommerce's own per-variation stock line ("10 in stock") — not shown;
   out-of-stock sizes are already communicated by the disabled swatch below. */
.woocommerce-variation-availability {
	display: none;
}

.bz-pdp-rating,
.woocommerce div.product .woocommerce-product-rating.bz-pdp-rating {
	display: flex;
	align-items: center;
	gap: 0.6rem;
	margin-bottom: 0.35rem !important;
}
.bz-pdp-rating-link {
	font-size: 0.82rem;
	font-weight: 600;
	color: var(--bz-lavender-deep);
	border-bottom: 1px solid transparent;
}
.bz-pdp-rating-link:hover {
	border-color: currentColor;
}
.bz-pdp-rating-link--empty {
	color: #8a8694;
}

.bz-product p.price {
	font-family: var(--bz-font-body);
	font-size: 1.6rem;
	font-weight: 700;
	color: var(--bz-ink);
	margin: 0 0 1.1rem;
}
.bz-product p.price del {
	color: #a39fae;
	font-weight: 500;
	font-size: 0.75em;
	margin-right: 0.5em;
}
.bz-product p.price ins {
	text-decoration: none;
	color: var(--bz-blush);
}

.woocommerce-product-details__short-description {
	max-width: 48ch;
	margin-bottom: 1.25rem;
}
.woocommerce-product-details__short-description p:last-child {
	margin-bottom: 0;
}

/* Feature chips */
.bz-feature-chips {
	display: flex;
	flex-wrap: wrap;
	gap: 0.6rem;
	list-style: none;
	margin: 0 0 1.5rem;
	padding: 0;
}
.bz-feature-chips li {
	background: var(--bz-linen);
	color: var(--bz-ink);
	font-size: 0.78rem;
	padding: 0.5em 0.9em;
	border-radius: 999px;
}
.bz-feature-chips li strong {
	font-weight: 700;
}

/* Size chart trigger */
.bz-size-chart-trigger {
	display: inline-flex;
	align-items: center;
	gap: 0.4em;
	background: none;
	border: 0;
	border-bottom: 1px solid var(--bz-ink);
	color: var(--bz-ink);
	font-family: var(--bz-font-body);
	font-size: 0.8rem;
	font-weight: 700;
	letter-spacing: 0.03em;
	padding: 0 0 2px;
	margin: 0;
	flex-shrink: 0;
	cursor: pointer;
}
.bz-size-chart-trigger:hover {
	color: var(--bz-lavender-deep);
	border-color: var(--bz-lavender-deep);
}

/* Add to cart form — stacked, left-aligned: "Size: M" label on its own
   line, swatches directly below (not WooCommerce's default two-column
   label/value table layout). */
.bz-product .variations,
.bz-product .variations tbody,
.bz-product .variations tr {
	display: block;
	width: 100%;
}
.bz-product .variations {
	margin-bottom: 1.25rem;
}
.bz-product .variations td.value {
	display: block;
	width: 100%;
	text-align: left;
	padding: 0;
	vertical-align: top;
}
.bz-product .variations th.label {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 1rem;
	width: 100%;
	text-align: left;
	padding: 0;
	vertical-align: top;
	margin-bottom: 0.6rem;
}
.bz-product .variations th.label label {
	font-size: 0.82rem;
	font-weight: 700;
	text-transform: none;
	letter-spacing: normal;
	color: var(--bz-ink);
}
.bz-size-selected-value {
	font-weight: 400;
}
.bz-product .variations select {
	width: 100%;
	max-width: 280px;
	padding: 0.7em 1em;
	border: 1px solid var(--bz-border);
	border-radius: var(--bz-radius);
	font-family: var(--bz-font-body);
	background: var(--bz-white);
}
.woocommerce-variation-price .price {
	font-size: 1.3rem !important;
}

/* Size swatch buttons — progressively enhance the variation <select>
   (kept in the DOM, just hidden) with real clickable boxes. */
.bz-size-swatches {
	display: flex;
	flex-wrap: wrap;
	gap: 0.6rem;
}
.bz-size-swatch {
	min-width: 44px;
	height: 44px;
	padding: 0 0.6em;
	background: var(--bz-white);
	border: 1.5px solid var(--bz-border);
	border-radius: var(--bz-radius);
	font-family: var(--bz-font-body);
	font-size: 0.82rem;
	font-weight: 600;
	color: var(--bz-ink);
	cursor: pointer;
	transition: border-color 0.15s ease, background-color 0.15s ease, color 0.15s ease;
}
.bz-size-swatch:hover {
	border-color: var(--bz-lavender);
}
.bz-size-swatch.is-selected {
	background: var(--bz-ink);
	border-color: var(--bz-ink);
	color: var(--bz-white);
}
/* Out of stock — visibly unselectable, no size/count text needed to
   explain why (the strikethrough + disabled cursor do that). */
.bz-size-swatch.is-outofstock {
	background: var(--bz-linen);
	border-color: var(--bz-border);
	color: #b4b0bd;
	text-decoration: line-through;
	cursor: not-allowed;
}
.bz-size-swatch.is-outofstock:hover {
	border-color: var(--bz-border);
}
.reset_variations {
	font-size: 0.78rem;
	margin-left: 0.75rem;
	color: var(--bz-lavender-deep);
}

.bz-product form.cart {
	display: flex;
	align-items: center;
	gap: 1rem;
	flex-wrap: wrap;
	margin-bottom: 1.5rem;
}
/* Quantity is hidden, not removed — the field still posts its default
   value of 1, so every add-to-cart is quietly "always add one". */
.bz-product .quantity {
	/* WooCommerce's variation-form JS sets an inline style="display:block"
	   on this element once a valid variation is selected, which otherwise
	   overrides a plain stylesheet rule. */
	display: none !important;
}
/* For variable products, the actual flex child of form.cart is this wrap
   (the buttons are nested inside it), not the buttons themselves — without
   a flex-basis here it only hugs its content's natural width (shrinking to
   fit when the row is tight, but never growing past it), leaving the CTAs
   short of the full row on wider screens despite their own width: 100%. */
.bz-product .single_variation_wrap {
	flex-basis: 100%;
	flex-grow: 1;
}

/* WooCommerce's own button.button rule (matched because this element
   carries WC's own "button alt" classes, unlike Buy It Now which doesn't)
   out-specifies a plain class rule for padding/font-size — !important
   needed here to keep both CTAs genuinely the same size. */
.bz-product .single_add_to_cart_button {
	display: flex;
	align-items: center;
	justify-content: center;
	flex-basis: 100%;
	width: 100%;
	padding: 1.1em 2.4em !important;
	background: var(--bz-ink) !important;
	color: var(--bz-white) !important;
	font-family: var(--bz-font-body);
	font-size: 0.88rem !important;
	font-weight: 700;
	line-height: normal !important;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	/* Transparent 1px border (rather than 0) so the box height matches
	   Buy It Now's real 1px border exactly, since both use border-box. */
	border: 1px solid transparent !important;
	border-radius: var(--bz-radius);
	cursor: pointer;
	transition: background-color 0.2s ease;
}
.bz-product .single_add_to_cart_button:hover {
	background: var(--bz-lavender-deep) !important;
}
.bz-product .single_add_to_cart_button.disabled,
.bz-product .single_add_to_cart_button.disabled:hover {
	background: #cfcbd9 !important;
	color: var(--bz-ink) !important;
	cursor: not-allowed;
}

/* Buy It Now — same full width and size as Add to Cart, right below it. */
.bz-buy-now-button {
	flex-basis: 100%;
	width: 100%;
	padding: 1.1em 2.4em;
	font-size: 0.88rem;
	margin-top: 0.75rem;
}

/* Wishlist + share — a quieter utility row underneath both CTAs. */
.bz-pdp-utility-row {
	flex-basis: 100%;
	width: 100%;
	display: flex;
	align-items: center;
	justify-content: space-between;
	margin-top: 1rem;
}
.bz-pdp-wishlist {
	display: inline-flex;
	align-items: center;
	gap: 0.5em;
	background: none;
	border: 0;
	color: var(--bz-ink);
	font-family: var(--bz-font-body);
	font-size: 0.82rem;
	font-weight: 600;
	cursor: pointer;
	padding: 0;
}
.bz-pdp-wishlist svg {
	transition: fill 0.15s ease, stroke 0.15s ease;
}
.bz-pdp-wishlist.is-active svg {
	fill: var(--bz-blush);
	stroke: var(--bz-blush);
}
.bz-product form.cart .bz-pdp-share.bz-icon-btn {
	border: 1px solid var(--bz-border);
	width: 34px;
	height: 34px;
}

/* Trust strip — full-bleed band under the hero. Same escape-the-shared-
   .container trick used for .bz-reviews: this section's own width:100vw
   centering lets its background reach the viewport edges, while
   .bz-pdp-trust-inner keeps the actual content at the normal page width. */
.bz-pdp-trust {
	background: var(--bz-linen);
	padding: 2.5rem 0;
	margin-bottom: 3rem;
	width: 100vw;
	position: relative;
	left: 50%;
	right: 50%;
	margin-left: -50vw;
	margin-right: -50vw;
}
.bz-pdp-trust-inner {
	max-width: var(--bz-container);
	margin: 0 auto;
	padding: 0 20px;
	display: flex;
	flex-wrap: wrap;
	justify-content: space-between;
	gap: 1.5rem 2rem;
}
.bz-pdp-trust-item {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 0.75rem;
	flex: 1 1 200px;
	font-family: var(--bz-font-body);
	font-size: 0.95rem;
	font-weight: 700;
	color: var(--bz-ink);
	text-align: center;
}
.bz-pdp-trust-item svg {
	color: var(--bz-lavender-deep);
	flex-shrink: 0;
}
@media (max-width: 560px) {
	.bz-pdp-trust-item {
		flex: 1 1 100%;
		justify-content: flex-start;
		text-align: left;
	}
}

/* ==========================================================================
   Sticky buy bar — fixed to the viewport (assets/js/product.js drives
   visibility via two IntersectionObservers: shown once the hero's own
   Add to Cart scrolls out of view, hidden again once the footer scrolls
   into view, so it never sits on top of the footer).
   ========================================================================== */
.bz-sticky-bar {
	position: fixed;
	left: 0;
	right: 0;
	bottom: 0;
	z-index: 60;
	background: var(--bz-white);
	border-top: 1px solid var(--bz-border);
	box-shadow: 0 -12px 26px rgba(33, 31, 46, 0.09);
	opacity: 0;
	visibility: hidden;
	transform: translateY(10px);
	transition: opacity 0.25s ease, transform 0.25s ease, visibility 0s linear 0.25s;
	pointer-events: none;
}
.bz-sticky-bar.is-visible {
	opacity: 1;
	visibility: visible;
	transform: translateY(0);
	transition: opacity 0.25s ease, transform 0.25s ease, visibility 0s linear 0s;
	pointer-events: auto;
}
.bz-sticky-bar-inner {
	max-width: var(--bz-container);
	margin: 0 auto;
	padding: 0.85rem 20px;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 1.25rem;
}
.bz-sticky-bar-identity {
	display: flex;
	align-items: center;
	gap: 0.85rem;
	min-width: 0;
}
.bz-sticky-bar-thumb {
	width: 42px;
	height: 52px;
	object-fit: cover;
	border-radius: var(--bz-radius);
	border: 1px solid var(--bz-border);
	flex-shrink: 0;
}
.bz-sticky-bar-info {
	display: flex;
	flex-direction: column;
	gap: 0.2rem;
	min-width: 0;
}
.bz-sticky-bar-size {
	font-family: var(--bz-font-body);
	font-size: 0.7rem;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.05em;
	color: #8a8694;
}
.bz-sticky-bar-size-value {
	color: var(--bz-ink);
}
.bz-sticky-bar-price {
	font-family: var(--bz-font-display);
	font-size: 1.25rem;
	font-weight: 500;
	color: var(--bz-ink);
	line-height: 1.1;
}
.bz-sticky-bar-price del {
	font-family: var(--bz-font-body);
	font-size: 0.72rem;
	font-weight: 500;
	color: #b6b2bf;
	margin-right: 0.4em;
	text-decoration: line-through;
}
.bz-sticky-bar-price ins {
	text-decoration: none;
}
.bz-sticky-bar-actions {
	display: flex;
	gap: 0.6rem;
	flex-shrink: 0;
}
.bz-sticky-bar-actions .bz-btn {
	white-space: nowrap;
	padding: 0.85em 1.5em;
	font-size: 0.76rem;
}
.bz-sticky-bar-add-to-cart.is-disabled {
	background: #cfcbd9 !important;
	color: var(--bz-ink) !important;
	cursor: not-allowed;
}

@media (max-width: 640px) {
	.bz-sticky-bar-thumb {
		display: none;
	}
	.bz-sticky-bar-inner {
		padding: 0.7rem 16px;
		gap: 0.75rem;
	}
	.bz-sticky-bar-price {
		font-size: 1.05rem;
	}
	.bz-sticky-bar-actions {
		gap: 0.5rem;
	}
	.bz-sticky-bar-actions .bz-btn {
		padding: 0.8em 1.1em;
		font-size: 0.68rem;
	}
}

@media (prefers-reduced-motion: reduce) {
	.bz-sticky-bar {
		transition: opacity 0.01ms linear;
	}
}

.product_meta {
	margin-top: 1.5rem;
	font-size: 0.78rem;
	color: #8a8694;
}
.product_meta > span {
	display: block;
	margin-bottom: 0.3rem;
}
.product_meta a {
	color: var(--bz-lavender-deep);
}

/* ==========================================================================
   Tabs
   ========================================================================== */
.woocommerce-tabs {
	max-width: var(--bz-container);
	margin: 0 auto;
	padding: 0 20px 4rem;
}
.woocommerce-tabs ul.tabs {
	display: flex;
	gap: 2rem;
	list-style: none;
	margin: 0 0 2.5rem;
	padding: 0;
	border-bottom: 1px solid var(--bz-border);
}
.woocommerce-tabs ul.tabs li {
	margin: 0;
}
.woocommerce-tabs ul.tabs li a {
	display: inline-block;
	padding: 0 0 1rem;
	font-size: 0.82rem;
	font-weight: 700;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: #8a8694;
	border-bottom: 2px solid transparent;
	margin-bottom: -1px;
	transition: color 0.2s ease, border-color 0.2s ease;
}
.woocommerce-tabs ul.tabs li a:hover {
	color: var(--bz-ink);
}
.woocommerce-tabs ul.tabs li.active a {
	color: var(--bz-ink);
	border-color: var(--bz-lavender);
}
.woocommerce-tabs .panel {
	line-height: 1.8;
	color: #423f4d;
}
.woocommerce-tabs .panel h2 {
	font-family: var(--bz-font-display);
	font-size: 1.5rem;
	font-weight: 500;
	margin-bottom: 1rem;
}
.woocommerce-tabs .panel ul,
.woocommerce-tabs .panel ol {
	margin: 0 0 1rem;
	padding-left: 1.25rem;
}
.woocommerce-tabs .panel li {
	margin-bottom: 0.4rem;
}
.woocommerce-tabs table.shop_attributes {
	width: 100%;
	border-collapse: collapse;
}
.woocommerce-tabs table.shop_attributes th,
.woocommerce-tabs table.shop_attributes td {
	padding: 0.7em 0;
	border-bottom: 1px solid var(--bz-border);
	text-align: left;
	font-size: 0.9rem;
}
.woocommerce-tabs table.shop_attributes th {
	width: 35%;
	font-weight: 700;
	color: var(--bz-ink);
}

/* ==========================================================================
   Upsells / cross-sells (reuse .bz-shelf / .bz-product-grid from main.css)
   ========================================================================== */
.up-sells.upsells,
.bz-cross-sells {
	padding: 4rem 0;
}
.up-sells.upsells .bz-shelf-head,
.up-sells.upsells h2 {
	max-width: var(--bz-container);
	margin: 0 auto 2.5rem;
	padding: 0 20px;
	font-family: var(--bz-font-display);
	font-size: clamp(1.7rem, 2.4vw, 2.3rem);
	font-weight: 500;
}
.up-sells.upsells ul.products,
.bz-cross-sells .bz-product-grid {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	gap: 1.75rem 1.5rem;
	max-width: var(--bz-container);
	margin: 0 auto;
	padding: 0 20px;
	list-style: none;
}
/* WooCommerce's own ul.products::before/::after are a float-era clearfix
   (content:" "; display:table;) — harmless on a float layout, but once
   the list is switched to display:grid above, those pseudo-elements
   still generate real boxes and get counted as grid items. The ::before
   was silently claiming column 1, pushing every real product one column
   to the right instead of starting flush left. */
.up-sells.upsells ul.products::before,
.up-sells.upsells ul.products::after {
	content: none;
}

/* ==========================================================================
   Reviews: histogram + carousel
   ========================================================================== */
/* Full-bleed background — this section's own inner .container keeps the
   content at the normal page width, but the shared WooCommerce content
   wrapper (inc/woocommerce.php) puts a max-width .container around this
   whole section too, so without breaking out here the linen background
   stopped at that width instead of reaching the viewport edges. */
.bz-reviews {
	background: var(--bz-linen);
	padding: 4.5rem 0 5rem;
	width: 100vw;
	position: relative;
	left: 50%;
	right: 50%;
	margin-left: -50vw;
	margin-right: -50vw;
}
.bz-reviews-layout {
	display: grid;
	/* minmax(0, ...), not bare fr units — otherwise each track refuses to
	   shrink below its content's intrinsic width, so the carousel column
	   (full of fixed-width cards) blew out past the grid's own container
	   instead of clipping to it, which left nothing to scroll and made
	   the prev/next arrows do nothing. */
	grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.6fr);
	gap: 3rem;
	align-items: start;
}
.bz-reviews-summary {
	background: var(--bz-white);
	padding: 2rem;
	position: sticky;
	top: 90px;
}
.bz-reviews-average {
	font-family: var(--bz-font-display);
	font-size: 3.5rem;
	font-weight: 500;
	line-height: 1;
	margin: 0 0 0.5rem;
}
.bz-reviews-count {
	color: #8a8694;
	font-size: 0.85rem;
	margin: 0.4rem 0 1.5rem;
}
.bz-reviews-empty {
	color: #504c5e;
	line-height: 1.7;
	margin-bottom: 1.5rem;
}
.bz-rating-breakdown {
	margin-bottom: 1.75rem;
}
.bz-rating-bar-row {
	display: flex;
	align-items: center;
	gap: 0.6rem;
	font-size: 0.78rem;
	margin-bottom: 0.5rem;
	color: var(--bz-ink);
}
.bz-rating-bar-label {
	width: 28px;
	flex-shrink: 0;
}
.bz-rating-bar-track {
	flex: 1;
	height: 6px;
	background: var(--bz-border);
	border-radius: 3px;
	overflow: hidden;
}
.bz-rating-bar-fill {
	display: block;
	height: 100%;
	background: var(--bz-lavender);
}
.bz-rating-bar-count {
	width: 24px;
	text-align: right;
	flex-shrink: 0;
	color: #8a8694;
}

.bz-review-carousel {
	position: relative;
}
.bz-review-carousel .commentlist {
	display: flex;
	gap: 1.5rem;
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	list-style: none;
	margin: 0;
	padding: 0 0 0.5rem;
	scrollbar-width: none;
}
.bz-review-carousel .commentlist::-webkit-scrollbar {
	display: none;
}
.bz-review-carousel .commentlist > li {
	flex: 0 0 auto;
	width: min(340px, 80vw);
	scroll-snap-align: start;
}
.bz-review-card-inner {
	position: relative;
	background: var(--bz-white);
	padding: 2.2rem 1.75rem 1.75rem;
	height: 100%;
}
.bz-review-card-inner .bz-testimonial-quote-mark {
	position: absolute;
	top: 0.4rem;
	left: 1.2rem;
	font-family: var(--bz-font-display);
	font-size: 3rem;
	color: var(--bz-lavender);
	opacity: 0.35;
	line-height: 1;
}
.bz-review-card-inner .bz-rating {
	margin-top: 0.5rem;
}
.bz-review-card-inner blockquote {
	margin: 0.9rem 0 1.4rem;
	font-size: 0.92rem;
	line-height: 1.7;
	color: var(--bz-ink);
}
.bz-review-images {
	display: flex;
	flex-wrap: wrap;
	gap: 0.5rem;
	list-style: none;
	margin: 0 0 1.2rem;
	padding: 0;
}
.bz-review-images li {
	width: 56px;
	height: 56px;
}
.bz-review-images a {
	display: block;
	width: 100%;
	height: 100%;
	border-radius: var(--bz-radius);
	overflow: hidden;
	border: 1px solid var(--bz-border);
	cursor: zoom-in;
}
.bz-review-images img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
	transition: transform 0.2s ease;
}
.bz-review-images a:hover img {
	transform: scale(1.08);
}

/* Review photo lightbox — a dark, focused stage for customer photos
   (this is a fashion storefront: the photos are the review). Reuses the
   generic .bz-modal/.bz-modal-panel open/close mechanics from main.css,
   overriding just the backdrop/panel/close-button look for a photo
   viewer instead of a white form card. */
.bz-lightbox-modal .bz-modal-backdrop {
	background: rgba(15, 14, 20, 0.92);
}
.bz-lightbox-panel {
	display: flex;
	flex-direction: column;
	align-items: center;
	background: none;
	box-shadow: none;
	width: auto;
	max-width: 92vw;
	padding: 0;
}
.bz-lightbox-image {
	display: block;
	max-width: 92vw;
	max-height: 78vh;
	width: auto;
	height: auto;
	border-radius: var(--bz-radius);
	box-shadow: 0 30px 80px rgba(0, 0, 0, 0.45);
	transition: opacity 0.2s ease;
}
.bz-lightbox-image.is-loading {
	opacity: 0.35;
}
.bz-lightbox-caption {
	margin: 1rem 0 0;
	font-family: var(--bz-font-body);
	font-size: 0.82rem;
	font-weight: 600;
	color: var(--bz-white);
}
.bz-lightbox-caption:empty {
	display: none;
}
.bz-lightbox-counter {
	margin: 0.35rem 0 0;
	font-size: 0.75rem;
	letter-spacing: 0.04em;
	color: rgba(255, 255, 255, 0.7);
}
.bz-lightbox-close {
	position: fixed;
	top: 1.5rem;
	right: 1.5rem;
	background: rgba(255, 255, 255, 0.12);
	color: var(--bz-white);
	z-index: 2;
}
.bz-lightbox-close:hover {
	background: rgba(255, 255, 255, 0.22);
}
.bz-lightbox-nav {
	position: fixed;
	top: 50%;
	transform: translateY(-50%);
	display: flex;
	align-items: center;
	justify-content: center;
	width: 48px;
	height: 48px;
	padding: 0;
	border-radius: 50%;
	background: rgba(255, 255, 255, 0.12);
	color: var(--bz-white);
	transition: background-color 0.2s ease;
}
.bz-lightbox-nav:hover {
	background: rgba(255, 255, 255, 0.24);
}
.bz-lightbox-prev {
	left: 1.5rem;
}
.bz-lightbox-next {
	right: 1.5rem;
}
@media (max-width: 640px) {
	.bz-lightbox-nav {
		width: 40px;
		height: 40px;
	}
	.bz-lightbox-prev {
		left: 0.6rem;
	}
	.bz-lightbox-next {
		right: 0.6rem;
	}
	.bz-lightbox-close {
		top: 0.75rem;
		right: 0.75rem;
	}
}
@media (prefers-reduced-motion: reduce) {
	.bz-lightbox-image {
		transition: none;
	}
}

.bz-review-meta {
	display: flex;
	flex-direction: column;
	font-size: 0.8rem;
	margin: 0;
}
.bz-review-meta span {
	color: #8a8694;
	margin-top: 0.15rem;
}
.bz-review-carousel-nav {
	display: flex;
	gap: 0.6rem;
	margin-top: 1.25rem;
}
.bz-review-carousel-prev,
.bz-review-carousel-next {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 42px;
	height: 42px;
	padding: 0;
	line-height: 1;
	border-radius: 50%;
	border: 1px solid var(--bz-border);
	background: var(--bz-white);
	color: var(--bz-ink);
	font-size: 1.1rem;
	cursor: pointer;
	transition: background-color 0.2s ease, color 0.2s ease;
}
.bz-review-carousel-prev:hover,
.bz-review-carousel-next:hover {
	background: var(--bz-ink);
	color: var(--bz-white);
}

.bz-reviews-show-all {
	display: flex;
	justify-content: center;
	margin-top: 2rem;
}

/* ==========================================================================
   "Show All Reviews" modal — near-fullscreen on desktop, fully
   fullscreen on mobile (see the breakpoint below), so a long "Load
   More"-paginated list has real room instead of the generic 560px
   form-sized .bz-modal-panel. Reuses .bz-review-card-inner/.bz-review-
   images/etc as-is (unscoped in this file), since the cards themselves
   are cloned straight out of .bz-review-carousel or rendered by the same
   PHP callback — only the surrounding list layout changes, from a
   horizontal carousel to a grid.
   ========================================================================== */
.bz-reviews-modal-panel {
	width: 92vw;
	max-width: 1100px;
	height: 88vh;
	max-height: 88vh;
	padding: 2.5rem clamp(1.5rem, 4vw, 3rem);
	display: flex;
	flex-direction: column;
}
.bz-reviews-modal-title {
	flex-shrink: 0;
	font-size: 1.6rem;
	margin: 0 0 1.5rem;
}
.bz-reviews-modal-list {
	flex: 1;
	overflow-y: auto;
	list-style: none;
	margin: 0 0 1.75rem;
	padding: 0.25rem 0.25rem 0;
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
	gap: 1.5rem;
	align-content: start;
}
.bz-reviews-modal-list > li {
	width: auto;
}
.bz-reviews-modal-list .bz-review-card-inner {
	background: var(--bz-linen);
}
.bz-reviews-modal-footer {
	flex-shrink: 0;
	display: flex;
	justify-content: center;
	padding-top: 0.5rem;
	border-top: 1px solid var(--bz-border);
}

@media (max-width: 780px) {
	/* The generic .bz-modal shell (main.css) has its own 2rem/1rem
	   padding for centering a normal, smaller panel — needs to be
	   zeroed out here too, otherwise "full screen on mobile" would
	   still show a border of backdrop around the panel. */
	.bz-reviews-modal {
		padding: 0;
	}
	.bz-reviews-modal-panel {
		width: 100vw;
		max-width: 100vw;
		height: 100vh;
		max-height: 100vh;
		border-radius: 0;
		padding: 1.5rem;
	}
	.bz-reviews-modal-list {
		grid-template-columns: 1fr;
	}
}

/* ==========================================================================
   Modal contents (size chart / write a review) — the generic .bz-modal
   open/close shell itself lives in main.css, shared site-wide.
   ========================================================================== */
.bz-modal-panel h3 {
	font-family: var(--bz-font-display);
	font-size: 1.6rem;
	font-weight: 500;
	margin: 0.3rem 0 1.5rem;
}

.bz-size-chart-table {
	width: 100%;
	border-collapse: collapse;
}
.bz-size-chart-table th,
.bz-size-chart-table td {
	padding: 0.7em 0.6em;
	border-bottom: 1px solid var(--bz-border);
	text-align: center;
	font-size: 0.88rem;
}
.bz-size-chart-table th {
	font-weight: 700;
	color: var(--bz-ink);
	background: var(--bz-linen);
}
.bz-size-chart-table td:first-child,
.bz-size-chart-table th:first-child {
	text-align: left;
	font-weight: 700;
}
.bz-size-chart-notes {
	margin-top: 1.25rem;
	font-size: 0.8rem;
	color: #8a8694;
}

/* Review form inside modal */
#bz-review-form-modal .comment-form-rating select,
#bz-review-form-modal input[type="text"],
#bz-review-form-modal input[type="email"],
#bz-review-form-modal textarea {
	width: 100%;
	padding: 0.7em 1em;
	border: 1px solid var(--bz-border);
	border-radius: var(--bz-radius);
	font-family: var(--bz-font-body);
	margin-top: 0.4rem;
}
#bz-review-form-modal label {
	font-size: 0.82rem;
	font-weight: 700;
}
#bz-review-form-modal p {
	margin-bottom: 1.1rem;
}
#bz-review-form-modal .required {
	color: var(--bz-blush);
}
/* Review photos — one square "slot" per photo (see bz-review-photo-*
   in assets/js/product.js), not a bare file input: an empty dashed slot
   to add the next photo, filled slots show a thumbnail with their own
   remove badge. The dashed lavender border on the empty slot and its
   slight rotate-on-hover echo the "Style No." swing tag elsewhere on
   the PDP — the same boutique tag/label language, not a generic dropzone. */
.bz-review-photo-field {
	margin-bottom: 1.1rem;
}
.bz-review-photo-field-label {
	display: block;
	font-size: 0.82rem;
	font-weight: 700;
	color: var(--bz-ink);
	margin-bottom: 0.6rem;
}
.bz-review-photo-field-label small {
	display: inline-block;
	margin-left: 0.5em;
	font-size: 0.78rem;
	font-weight: 500;
	color: #8a8694;
}
.bz-review-photo-slots {
	display: flex;
	flex-wrap: wrap;
	gap: 0.6rem;
}
.bz-photo-slot {
	position: relative;
	width: 72px;
	height: 72px;
	flex-shrink: 0;
	border-radius: var(--bz-radius);
	animation: bz-photo-slot-in 0.2s ease;
}
@keyframes bz-photo-slot-in {
	from {
		opacity: 0;
		transform: scale(0.9);
	}
	to {
		opacity: 1;
		transform: scale(1);
	}
}
.bz-photo-slot--filled {
	border: 1px solid var(--bz-border);
}
.bz-photo-slot--filled img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
	border-radius: var(--bz-radius);
}
.bz-photo-slot-remove {
	position: absolute;
	top: -8px;
	right: -8px;
	width: 22px;
	height: 22px;
	border-radius: 50%;
	background: var(--bz-ink);
	color: var(--bz-white);
	font-size: 1rem;
	line-height: 1;
	display: flex;
	align-items: center;
	justify-content: center;
	box-shadow: 0 2px 6px rgba(33, 31, 46, 0.28);
	transition: background-color 0.15s ease, transform 0.15s ease;
}
.bz-photo-slot-remove:hover {
	background: var(--bz-blush);
	transform: scale(1.08);
}
.bz-photo-slot--add {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 0.2rem;
	border: 1.5px dashed var(--bz-lavender);
	background: var(--bz-linen);
	color: var(--bz-lavender-deep);
	transition: border-color 0.15s ease, background-color 0.15s ease, transform 0.15s ease;
}
.bz-photo-slot--add:hover,
.bz-photo-slot--add:focus-visible {
	border-color: var(--bz-lavender-deep);
	background: var(--bz-white);
	transform: rotate(-3deg);
}
.bz-photo-slot-plus {
	display: block;
}
.bz-photo-slot-add-label {
	font-size: 0.6rem;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.05em;
}
@media (prefers-reduced-motion: reduce) {
	.bz-photo-slot {
		animation: none;
	}
	.bz-photo-slot--add,
	.bz-photo-slot-remove {
		transition: none;
	}
}
/* WooCommerce's own #respond input#submit selector out-specifies a
   plain class rule (two IDs vs. two classes) — !important needed here
   specifically to keep the submit button on-brand. */
#bz-review-form-modal input#submit.bz-btn--primary {
	background: var(--bz-ink) !important;
	color: var(--bz-white) !important;
}
#bz-review-form-modal input#submit.bz-btn--primary:hover {
	background: var(--bz-lavender-deep) !important;
}

/* ==========================================================================
   Responsive
   ========================================================================== */
@media (max-width: 1024px) {
	.up-sells.upsells ul.products,
	.bz-cross-sells .bz-product-grid {
		grid-template-columns: repeat(2, 1fr);
	}
	.bz-reviews-layout {
		grid-template-columns: minmax(0, 1fr);
	}
	.bz-reviews-summary {
		position: static;
	}
}

@media (max-width: 780px) {
	/* Horizontal padding dropped here — .container (the ancestor) already
	   adds a 20px side gutter, so keeping it here too was stacking two
	   gutters and shrinking the Add to Cart / Buy It Now buttons (and
	   everything else in the summary column) well short of the width
	   every other full-width element on the page gets. */
	.bz-product-hero {
		grid-template-columns: 1fr;
		padding: 1.5rem 0 0;
	}
	.product_title.entry-title {
		font-size: 1.6rem;
	}
	/* Without flex-shrink:0, flex's default (flex-shrink:1) let the
	   browser squeeze all 5 tabs to fit the screen instead of actually
	   overflowing — so overflow-x: auto had nothing to scroll, and each
	   shrunk tab's label wrapped across 2-3 lines inside its own now-
	   too-narrow <a>, making the tap target tall, oddly-shaped, and
	   easy to miss (which is what read as "the click function is not
	   working" — a tap that landed on the wrapped second line of the
	   wrong-shaped tab). white-space: nowrap forces each tab to keep
	   its natural width, which is what actually makes the row overflow
	   and the existing overflow-x: auto above scrollable.
	   -webkit-overflow-scrolling isn't needed here — that was only ever
	   for pre-iOS 13 momentum scrolling, long since the default.
	   Selector needs to match WooCommerce core's own
	   ".woocommerce div.product .woocommerce-tabs ul.tabs" (assets/css/
	   woocommerce.css), which sets overflow: hidden at higher specificity
	   (0,4,2 vs this rule's 0,2,1) — the plain ".woocommerce-tabs ul.tabs"
	   selector never actually won the cascade, so overflow-x: auto here
	   was inert and the row couldn't be swiped at all. */
	.woocommerce div.product .woocommerce-tabs ul.tabs {
		gap: 1.25rem;
		flex-wrap: nowrap;
		overflow-x: auto;
		-webkit-overflow-scrolling: touch;
	}
	.woocommerce-tabs ul.tabs li {
		flex-shrink: 0;
	}
	.woocommerce-tabs ul.tabs li a {
		white-space: nowrap;
	}
	.bz-review-carousel .commentlist > li {
		width: min(300px, 78vw);
	}

	/* Mobile gallery: full-bleed slider, no border, no thumbnail strip —
	   flexslider's own swipe + the auto-advance timing (carousel-options
	   filter in inc/single-product.php) do the sliding; these dots are
	   just the indicator + a tap-to-jump shortcut, proxied to the
	   (still-present, just hidden) thumbnails in assets/js/product.js.
	   Same escape-the-shared-.container trick as .bz-reviews/.bz-pdp-trust
	   elsewhere — .bz-product-hero itself has no side padding on mobile,
	   but the ancestor .container still does, so without this the image
	   sat inset by that gutter instead of reaching the screen edges. */
	.bz-product-gallery-wrap {
		width: 100vw;
		margin-left: -50vw;
		margin-right: -50vw;
		left: 50%;
		right: 50%;
	}
	.woocommerce-product-gallery__wrapper {
		border: none;
	}
	.flex-control-thumbs {
		display: none;
	}
	.bz-gallery-dots {
		display: flex;
	}
}

@media (max-width: 560px) {
	.up-sells.upsells ul.products,
	.bz-cross-sells .bz-product-grid {
		grid-template-columns: 1fr 1fr;
	}
}

/* ==========================================================================
   Reduced motion
   ========================================================================== */
@media (prefers-reduced-motion: reduce) {
	.bz-review-carousel .commentlist {
		scroll-behavior: auto;
	}
}
