/* ---------- Button color override ----------
   WooCommerce's own bundled stylesheet defines a default button fill (a
   pale gray/lavender secondary look, plus purple #720eec for .alt) and
   applies it with a more specific selector (element + class, under its
   own .woocommerce ancestor) than our generic .button rule in base.css,
   so it wins the cascade despite loading first. Restate the exact
   selectors WooCommerce uses, scoped under .woocommerce for matching
   specificity, so every WooCommerce button — Place order, Add to cart,
   Proceed to checkout, Return to shop, Apply coupon, Update cart, Log in,
   Save changes, Save address — follows the same primary ink treatment as
   the rest of the site instead of WooCommerce's unstyled defaults. */
.woocommerce #place_order,
.woocommerce a.button,
.woocommerce a.button.alt,
.woocommerce button.button,
.woocommerce button.button.alt,
.woocommerce input.button,
.woocommerce input.button.alt,
.woocommerce-page a.button,
.woocommerce-page a.button.alt,
.woocommerce-page button.button,
.woocommerce-page button.button.alt,
.woocommerce-page input.button,
.woocommerce-page input.button.alt {
	background: var(--wp--preset--color--ink);
	border-color: var(--wp--preset--color--ink);
	color: var(--wp--preset--color--paper);
	text-decoration: none;
}
.woocommerce #place_order:hover,
.woocommerce a.button:hover,
.woocommerce a.button.alt:hover,
.woocommerce button.button:hover,
.woocommerce button.button.alt:hover,
.woocommerce input.button:hover,
.woocommerce input.button.alt:hover,
.woocommerce-page a.button:hover,
.woocommerce-page a.button.alt:hover,
.woocommerce-page button.button:hover,
.woocommerce-page button.button.alt:hover,
.woocommerce-page input.button:hover,
.woocommerce-page input.button.alt:hover {
	background: #2c2825;
	border-color: #2c2825;
	color: var(--wp--preset--color--paper);
	text-decoration: none;
}
/* A button WooCommerce has disabled itself (Update Cart before any
   quantity change, Apply coupon before input) needs to read as inactive,
   not as another primary action. */
.woocommerce button.button:disabled,
.woocommerce button.button.disabled,
.woocommerce input.button:disabled,
.woocommerce-page button.button:disabled,
.woocommerce-page input.button:disabled {
	background: var(--wp--preset--color--neutral-100);
	border-color: var(--wp--preset--color--neutral);
	color: var(--wp--preset--color--neutral);
	cursor: not-allowed;
}

/* ---------- Shop archive ---------- */
.ip-shop-toolbar {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: var(--wp--preset--spacing--3);
	margin-bottom: var(--wp--preset--spacing--6);
	padding-bottom: var(--wp--preset--spacing--4);
	border-bottom: 1px solid var(--ip-border-color);
}
.ip-shop-toolbar .woocommerce-result-count { margin: 0; color: var(--wp--preset--color--bronze); font-size: var(--wp--preset--font-size--small); }
.ip-shop-toolbar .woocommerce-ordering { margin: 0; }
.ip-shop-toolbar select { width: auto; min-height: 40px; padding: 8px 32px 8px 12px; }

ul.products {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: var(--wp--preset--spacing--5);
	list-style: none;
	margin: 0;
	padding: 0;
}
@media (max-width: 1023px) { ul.products { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 599px) { ul.products { grid-template-columns: 1fr; } }
/* WooCommerce's main stylesheet still gives ul.products a `::before {
   content:" "; display:table }` clearfix pair (leftover from its
   float-based layout, which we replaced above). Once the parent is
   display:grid, that generated content becomes a real (if invisible)
   grid item and silently occupies the first cell, pushing every real
   product into the next slot. Remove it outright — clearfix has no
   purpose in a grid layout. */
.woocommerce ul.products::before, .woocommerce ul.products::after,
.woocommerce-page ul.products::before, .woocommerce-page ul.products::after {
	content: none;
	display: none;
}

/* Our content-product.php override renders .ip-product-card directly.
   min-width: 0 overrides the grid item default of min-width: auto, which
   otherwise keeps each card as wide as its longest unbreakable content
   (e.g. a long product name) and causes text to overflow/get clipped in
   narrower related-products sections that share this same grid class. */
ul.products li.product { list-style: none; min-width: 0; }

/* WooCommerce's own woocommerce-smallscreen.css (loaded via a
   `media="(max-width: 768px)"` link, so only WordPress dashboard-invisible
   until a phone/tablet viewport hits it) sets `width: 48%; float: left`
   on product-grid items with a selector specific enough to beat our plain
   `ul.products li.product` rule above, producing half-width, left-aligned
   cards instead of our single-column grid. Restate its exact selectors to
   cancel the float grid out; the item then falls back to filling its CSS
   Grid column normally. */
.woocommerce ul.products[class*="columns-"] li.product,
.woocommerce-page ul.products[class*="columns-"] li.product {
	width: auto;
	float: none;
	clear: none;
	margin: 0;
}
.woocommerce ul.products[class*="columns-"] li.product:nth-child(2n),
.woocommerce-page ul.products[class*="columns-"] li.product:nth-child(2n) {
	float: none;
}

/* ---------- Single product ---------- */
/* No template override needed: WooCommerce's own div.product wrapper
   (containing .images and .summary as direct children) becomes the grid. */
.single-product .ip-main--shop {
	padding-block: clamp(32px, 5vw, 72px) clamp(56px, 8vw, 104px);
}

.single-product .woocommerce-breadcrumb {
	position: relative;
	margin: 0 0 clamp(28px, 4vw, 48px);
	padding: 0 0 var(--wp--preset--spacing--3) 18px;
	border-bottom: 1px solid var(--ip-border-color);
	font-size: var(--wp--preset--font-size--small);
	color: var(--wp--preset--color--bronze);
}
.single-product .woocommerce-breadcrumb::before {
	content: "";
	position: absolute;
	left: 0;
	top: 0.35em;
	bottom: calc(var(--wp--preset--spacing--3) + 0.35em);
	width: 2px;
	background: linear-gradient(180deg, var(--wp--preset--color--crimson), var(--wp--preset--color--amber));
}
.single-product .woocommerce-breadcrumb a {
	color: var(--wp--preset--color--bronze);
	text-decoration: underline;
	text-decoration-color: transparent;
	text-underline-offset: 0.18em;
}
.single-product .woocommerce-breadcrumb a:hover {
	color: var(--wp--preset--color--crimson);
	text-decoration-color: currentColor;
}

.woocommerce div.product {
	display: grid;
	grid-template-columns: minmax(0, 1.04fr) minmax(0, 0.96fr);
	gap: clamp(36px, 6vw, 88px);
	align-items: start;
}
@media (max-width: 1023px) {
	.woocommerce div.product {
		grid-template-columns: 1fr;
		gap: clamp(28px, 6vw, 48px);
	}
}
/* Anything WooCommerce (rather than our own hooks) appends directly
   inside div.product — currently just "Related products" — also needs to
   span both columns of the product-page grid, or it gets squeezed into
   a single half-width column and its own 3-up card grid renders cramped. */
.woocommerce div.product > .ip-product-section,
.woocommerce div.product > .related.products {
	grid-column: 1 / -1;
}

/* The product photograph is deliberately static. Matching WooCommerce's
   exact gallery selector overrides its position:relative rule as well as
   the theme's former desktop sticky treatment. */
.woocommerce div.product div.images.woocommerce-product-gallery {
	position: static;
	top: auto;
	float: none;
	width: auto;
	margin: 0;
	padding: clamp(16px, 2.4vw, 30px);
	background: var(--wp--preset--color--neutral-100);
	border: 1px solid rgba(117, 96, 74, 0.2);
	border-radius: clamp(18px, 2vw, 28px);
	box-shadow: 0 28px 64px -42px rgba(28, 21, 16, 0.48), 0 8px 24px rgba(28, 21, 16, 0.07);
	transform: none;
}
.woocommerce div.product div.images .woocommerce-product-gallery__wrapper,
.woocommerce div.product div.images .woocommerce-product-gallery__image,
.woocommerce div.product div.images .woocommerce-product-gallery__image a {
	position: static;
	margin: 0;
	transform: none;
}
.woocommerce div.product div.images img {
	width: 100%;
	height: auto;
	object-fit: contain;
	object-position: center;
	border-radius: clamp(12px, 1.4vw, 18px);
	background: #faf9f7;
	border: 0;
	box-shadow: none;
	transform: none;
}
.woocommerce div.product div.images .flex-control-thumbs {
	display: grid;
	grid-template-columns: repeat(4, minmax(0, 1fr));
	gap: var(--wp--preset--spacing--2);
	margin-top: var(--wp--preset--spacing--3);
}
.woocommerce div.product div.images .flex-control-thumbs li {
	float: none;
	width: auto;
}
.woocommerce div.product div.summary {
	float: none;
	width: auto;
	margin: 0;
	padding: clamp(4px, 1vw, 12px) 0;
}
.ip-product-kicker {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	margin: 0 0 var(--wp--preset--spacing--3);
	font-size: var(--wp--preset--font-size--micro);
	font-weight: 650;
	letter-spacing: 0.13em;
	text-transform: uppercase;
	color: var(--wp--preset--color--crimson);
}
.ip-product-kicker::before {
	content: "";
	width: 28px;
	height: 1px;
	background: linear-gradient(90deg, var(--wp--preset--color--crimson), var(--wp--preset--color--amber));
}

.woocommerce div.product .product_title {
	font-size: clamp(2.35rem, 1.65rem + 2.5vw, 4rem);
	line-height: 1;
	letter-spacing: -0.025em;
	margin-bottom: var(--wp--preset--spacing--2);
}
.ip-product-subtitle {
	font-size: var(--wp--preset--font-size--body-lg);
	color: var(--wp--preset--color--bronze);
	margin: 0 0 var(--wp--preset--spacing--5);
	max-width: 42ch;
}
.woocommerce div.product .woocommerce-product-details__short-description {
	max-width: 58ch;
	color: #4f4842;
}
.ip-product-use-notice {
	position: relative;
	margin: var(--wp--preset--spacing--5) 0 0;
	padding: var(--wp--preset--spacing--4) var(--wp--preset--spacing--4) var(--wp--preset--spacing--4) calc(var(--wp--preset--spacing--4) + 8px);
	background: #f5f0e9;
	border: 1px solid rgba(156, 124, 85, 0.3);
	border-radius: var(--ip-radius-md);
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	color: #4a3d32;
}
.ip-product-use-notice::before {
	content: "";
	position: absolute;
	left: 0;
	top: 12px;
	bottom: 12px;
	width: 3px;
	border-radius: 3px;
	background: var(--wp--preset--color--crimson);
}
.woocommerce div.product p.price {
	font-size: var(--wp--preset--font-size--h-3);
	font-family: var(--wp--preset--font-family--sans);
	color: var(--wp--preset--color--ink);
	margin: var(--wp--preset--spacing--3) 0;
}
.woocommerce div.product form.cart {
	display: flex;
	align-items: center;
	gap: var(--wp--preset--spacing--3);
	margin: var(--wp--preset--spacing--5) 0;
}
.woocommerce div.product form.cart .single_add_to_cart_button { flex-grow: 1; max-width: 320px; }
.woocommerce div.product form.cart .quantity input {
	width: 80px;
	text-align: center;
}
.woocommerce div.product .stock {
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.04em;
}
.woocommerce div.product .stock.out-of-stock { color: var(--wp--preset--color--error); }
.woocommerce div.product .stock.in-stock { color: var(--wp--preset--color--success); }

.ip-product-section {
	position: relative;
	padding-block: clamp(36px, 5vw, 64px);
	border-top: 1px solid var(--ip-border-color);
}
.ip-product-section h2 {
	font-size: clamp(1.65rem, 1.3rem + 1vw, 2.25rem);
	margin-bottom: var(--wp--preset--spacing--4);
}
.ip-product-section .ip-container--prose { max-width: var(--ip-container-prose); }

/* The shipping note is currently a single factual sentence (no carrier
   names, zones, or promises supplied yet) — giving it the same heading
   scale and padding as the multi-paragraph Research Details section left
   a section-sized block of near-empty space. Present it as a compact,
   lighter-weight note instead of shrinking or hiding the content. */
.ip-shipping-note {
	padding-block: clamp(20px, 3vw, 32px);
}
.ip-shipping-note h2 {
	font-size: var(--wp--preset--font-size--h-4);
	font-family: var(--wp--preset--font-family--sans);
	margin-bottom: var(--wp--preset--spacing--2);
}
.ip-shipping-note p { color: var(--wp--preset--color--bronze); margin: 0; }

.ip-overview-label,
.ip-eyebrow {
	font-size: var(--wp--preset--font-size--micro);
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.06em;
	color: var(--wp--preset--color--crimson);
	margin-bottom: var(--wp--preset--spacing--1);
}

.ip-spec-list {
	display: grid;
	grid-template-columns: max-content 1fr;
	gap: var(--wp--preset--spacing--2) var(--wp--preset--spacing--5);
	margin: 0;
}
.ip-spec-list dt { color: var(--wp--preset--color--bronze); font-weight: 600; }
.ip-spec-list dd { margin: 0; }

.ip-disclaimer,
.ip-coa-section {
	margin-block: var(--wp--preset--spacing--3);
	padding-inline: clamp(22px, 4vw, 48px);
	border: 1px solid var(--ip-border-color);
	border-radius: var(--ip-radius-md);
	background: var(--wp--preset--color--white);
	box-shadow: var(--ip-shadow-soft);
}
.ip-disclaimer {
	border-left: 3px solid var(--wp--preset--color--crimson);
}
.ip-disclaimer p, .ip-shipping-note p {
	font-size: var(--wp--preset--font-size--small);
	color: var(--wp--preset--color--bronze);
}

.ip-product-support {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--wp--preset--spacing--5);
	margin-top: var(--wp--preset--spacing--5);
	padding: clamp(24px, 4vw, 42px);
	border: 1px solid rgba(192, 138, 62, 0.28);
	border-radius: var(--ip-radius-md);
	background: #1c1815;
	color: rgba(252, 251, 250, 0.76);
}
.ip-product-support h2 {
	color: var(--wp--preset--color--paper);
	margin-bottom: var(--wp--preset--spacing--2);
}
.ip-product-support .ip-eyebrow { color: var(--wp--preset--color--amber); }
.ip-product-support p { margin: 0; max-width: 56ch; }
.ip-product-support .ip-btn {
	flex: 0 0 auto;
	background: var(--wp--preset--color--paper);
	border-color: var(--wp--preset--color--paper);
	color: var(--wp--preset--color--ink);
}
.ip-product-support .ip-btn:hover {
	background: var(--wp--preset--color--cream);
	border-color: var(--wp--preset--color--cream);
	color: var(--wp--preset--color--ink);
}

.woocommerce-product-rating,
.woocommerce-tabs ul.tabs { }

/* Related products reuse the same grid as ul.products. */
.related.products {
	padding-top: clamp(52px, 8vw, 92px);
}
.related.products > h2 {
	position: relative;
	font-size: var(--wp--preset--font-size--h-2);
	margin-bottom: var(--wp--preset--spacing--6);
	padding-top: var(--wp--preset--spacing--3);
}
.related.products > h2::before {
	content: "";
	position: absolute;
	left: 0;
	top: 0;
	width: 58px;
	height: 2px;
	background: linear-gradient(90deg, var(--wp--preset--color--crimson), var(--wp--preset--color--amber));
}
.related.products .ip-product-card-media {
	background: var(--wp--preset--color--neutral-100);
}

@media (max-width: 767px) {
	.single-product .ip-main--shop { padding-block: 24px 64px; }
	.single-product .woocommerce-breadcrumb { margin-bottom: 28px; }
	.woocommerce div.product div.images.woocommerce-product-gallery { padding: 12px; }
	.woocommerce div.product .product_title { font-size: clamp(2.25rem, 12vw, 3.2rem); }
	.ip-product-support { align-items: stretch; flex-direction: column; }
	.ip-product-support .ip-btn { width: 100%; }
	.ip-spec-list { grid-template-columns: 1fr; gap: 2px; }
	.ip-spec-list dd + dt { margin-top: var(--wp--preset--spacing--3); }
}

/* ---------- Cart ---------- */
/* No cart.php override needed: the cart page's own .ip-page-content wrapper
   (from page.php) becomes the two-column grid around WooCommerce's own
   .woocommerce-cart-form and .cart-collaterals output. */
body.woocommerce-cart .ip-page-content {
	display: grid;
	grid-template-columns: 1.6fr 1fr;
	gap: var(--wp--preset--spacing--7);
	align-items: start;
}
@media (max-width: 1023px) {
	body.woocommerce-cart .ip-page-content { grid-template-columns: 1fr; }
}

table.shop_table.cart, table.shop_table.woocommerce-cart-form__contents {
	all: unset;
	display: block;
}
.woocommerce-cart-form__contents thead { display: none; }
.woocommerce-cart-form__contents tbody { display: flex; flex-direction: column; gap: var(--wp--preset--spacing--4); }
.woocommerce-cart-form__contents tr.woocommerce-cart-form__cart-item {
	display: grid;
	grid-template-columns: 88px 1fr auto auto;
	grid-template-areas: "thumb name qty subtotal" "thumb remove remove remove";
	gap: 4px var(--wp--preset--spacing--4);
	align-items: center;
	border: 1px solid var(--ip-border-color);
	border-radius: var(--ip-radius-md);
	padding: var(--wp--preset--spacing--4);
}
/* WooCommerce's own stylesheet (.woocommerce table.shop_table td) puts a
   border-top + padding on every <td> with higher specificity than a
   plain class selector — reset it at matching specificity now that each
   cell is an independent grid item, not a table cell, or stray border
   fragments show above the thumbnail/name/quantity. */
.woocommerce table.shop_table.woocommerce-cart-form__contents td {
	border: none;
	padding: 0;
}
@media (max-width: 599px) {
	.woocommerce-cart-form__contents tr.woocommerce-cart-form__cart-item {
		grid-template-columns: 72px 1fr;
		grid-template-areas: "thumb name" "qty subtotal" "remove remove";
	}
}
.woocommerce-cart-form__cart-item .product-thumbnail { grid-area: thumb; }
.woocommerce-cart-form__cart-item .product-thumbnail img {
	border-radius: var(--ip-radius-sm);
	background: var(--wp--preset--color--neutral-100);
	aspect-ratio: 1/1;
	object-fit: contain;
}
.woocommerce-cart-form__cart-item .product-name { grid-area: name; font-weight: 600; }
.woocommerce-cart-form__cart-item .product-price { display: none; }
.woocommerce-cart-form__cart-item .product-quantity { grid-area: qty; }
.woocommerce-cart-form__cart-item .product-subtotal { grid-area: subtotal; font-weight: 600; text-align: right; }
.woocommerce-cart-form__cart-item .product-remove { grid-area: remove; justify-self: start; }
.woocommerce-cart-form__cart-item .product-remove a {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	margin-left: -12px;
	border-radius: var(--ip-radius-sm);
	color: var(--wp--preset--color--error);
	font-size: 1.15rem;
	font-weight: 600;
	line-height: 1;
	text-decoration: none;
}
.woocommerce-cart-form__cart-item .product-remove a:hover,
.woocommerce-cart-form__cart-item .product-remove a:focus-visible {
	background: rgba(162, 59, 46, 0.08);
	text-decoration: none;
}

.cart-collaterals, .cart_totals {
	background: var(--wp--preset--color--neutral-100);
	border-radius: var(--ip-radius-md);
	padding: var(--wp--preset--spacing--5);
	position: sticky;
	top: calc(var(--ip-header-height) + 24px);
}
@media (max-width: 1023px) { .cart_totals { position: static; } }
.cart_totals table { width: 100%; border-collapse: collapse; }
.cart_totals tr th, .cart_totals tr td { padding: 10px 0; border-bottom: 1px solid var(--ip-border-color); text-align: left; }
.cart_totals tr:last-child th, .cart_totals tr:last-child td { border-bottom: none; }
.wc-proceed-to-checkout .checkout-button {
	width: 100%;
	text-align: center;
	margin-top: var(--wp--preset--spacing--4);
}

.woocommerce-shipping-totals .woocommerce-shipping-methods { list-style: none; margin: 0; padding: 0; }

/* Empty cart */
.cart-empty { font-size: var(--wp--preset--font-size--body-lg); }
.return-to-shop { margin-top: var(--wp--preset--spacing--4); }

/* Coupon + update-cart actions row */
.woocommerce-cart-form__contents tr.actions td {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--wp--preset--spacing--3);
	padding-top: var(--wp--preset--spacing--3);
}
.woocommerce-cart-form__contents .coupon {
	display: flex;
	gap: var(--wp--preset--spacing--2);
	flex-wrap: wrap;
}
.woocommerce-cart-form__contents .coupon #coupon_code {
	width: auto;
	min-width: 160px;
}

/* ---------- Checkout ---------- */
/* No form-checkout.php override needed: a pair of stable WooCommerce hooks
   wraps the order heading + review in .ip-checkout-review so the right side
   behaves as one compact card. */
form.checkout.woocommerce-checkout {
	display: grid;
	grid-template-columns: 1.4fr 1fr;
	gap: var(--wp--preset--spacing--7);
	align-items: start;
}
#customer_details.col2-set { grid-column: 1; }
.ip-checkout-review {
	grid-column: 2;
	background: var(--wp--preset--color--neutral-100);
	border-radius: var(--ip-radius-md);
	position: sticky;
	top: calc(var(--ip-header-height) + 24px);
}
@media (max-width: 1023px) {
	form.checkout.woocommerce-checkout { grid-template-columns: 1fr; }
	#customer_details.col2-set, .ip-checkout-review { grid-column: 1; }
	.ip-checkout-review { position: static; }
}

#customer_details .col-1, #customer_details .col-2 { width: 100%; float: none; }

form.checkout_coupon { display: none; } /* no promotions/coupons UI on a restrained checkout */

.woocommerce-checkout .form-row { margin-bottom: var(--wp--preset--spacing--3); }

#order_review, #order_review_heading {
	background: transparent;
	border-radius: 0;
	padding: var(--wp--preset--spacing--5);
}
#order_review_heading { padding-bottom: 0; }
#order_review { padding-top: var(--wp--preset--spacing--3); }
table.shop_table.woocommerce-checkout-review-order-table {
	background: none;
	border: none;
	width: 100%;
}

.ip-acknowledgment {
	border: 1px solid var(--ip-border-color);
	border-radius: var(--ip-radius-md);
	padding: var(--wp--preset--spacing--4);
	margin: var(--wp--preset--spacing--5) 0;
	background: var(--wp--preset--color--white);
}
.ip-acknowledgment.ip-invalid { border-color: var(--wp--preset--color--error); }
.ip-acknowledgment label {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	font-weight: 400;
	font-size: var(--wp--preset--font-size--small);
	color: var(--wp--preset--color--bronze);
}
.ip-acknowledgment input[type="checkbox"] { width: 20px; height: 20px; flex-shrink: 0; margin-top: 2px; }

/* ---------- My Account ----------
   WooCommerce always wraps the shortcode output as two siblings —
   nav.woocommerce-MyAccount-navigation and div.woocommerce-MyAccount-content
   — inside one .woocommerce div, so a sidebar-plus-content grid needs no
   template override. */
.woocommerce-account .ip-page-content .woocommerce {
	display: grid;
	grid-template-columns: 248px 1fr;
	gap: var(--wp--preset--spacing--6);
	align-items: start;
}
/* WooCommerce's own stylesheet gives the generic .woocommerce wrapper a
   `::before { content:" "; display:table }` clearfix pair (leftover from
   float-based layout — the same pattern already handled for ul.products
   above). Once the wrapper is display:grid, that generated content becomes
   a real (if invisible) grid item occupying the first cell, which pushes
   the nav into column 2 and the content into row 2 instead of beside it. */
.woocommerce-account .ip-page-content .woocommerce::before,
.woocommerce-account .ip-page-content .woocommerce::after {
	content: none;
	display: none;
}
@media (max-width: 767px) {
	.woocommerce-account .ip-page-content .woocommerce { grid-template-columns: 1fr; }
}
.woocommerce-account .woocommerce-MyAccount-navigation {
	border: 1px solid var(--ip-border-color);
	border-radius: var(--ip-radius-md);
	background: var(--wp--preset--color--white);
	overflow: hidden;
	position: sticky;
	top: calc(var(--ip-header-height) + 24px);
}
@media (max-width: 767px) { .woocommerce-account .woocommerce-MyAccount-navigation { position: static; } }
.woocommerce-account .woocommerce-MyAccount-navigation ul { list-style: none; margin: 0; padding: 0; }
.woocommerce-account .woocommerce-MyAccount-navigation li { border-bottom: 1px solid var(--ip-border-color); }
.woocommerce-account .woocommerce-MyAccount-navigation li:last-child { border-bottom: none; }
.woocommerce-account .woocommerce-MyAccount-navigation li a {
	display: block;
	padding: 14px 18px;
	font-weight: 600;
	font-size: var(--wp--preset--font-size--small);
	color: var(--wp--preset--color--ink);
	text-decoration: none !important;
	transition: background var(--ip-transition-fast), color var(--ip-transition-fast);
}
.woocommerce-account .woocommerce-MyAccount-navigation li a:hover { background: var(--wp--preset--color--neutral-100); }
.woocommerce-account .woocommerce-MyAccount-navigation li.is-active a {
	background: var(--wp--preset--color--ink);
	color: var(--wp--preset--color--paper);
}
.woocommerce-account .woocommerce-MyAccount-navigation li.woocommerce-MyAccount-navigation-link--customer-logout a {
	color: var(--wp--preset--color--error);
}
.woocommerce-account .woocommerce-MyAccount-navigation li.woocommerce-MyAccount-navigation-link--customer-logout a:hover {
	background: rgba(162, 59, 46, 0.08);
}
.woocommerce-MyAccount-content > p:first-child { font-size: var(--wp--preset--font-size--body-lg); }
.woocommerce-account-fields .form-row { margin-bottom: var(--wp--preset--spacing--3); }
.woocommerce-MyAccount-content .addresses .title { display: flex; align-items: center; justify-content: space-between; gap: var(--wp--preset--spacing--3); }
.woocommerce-MyAccount-content address {
	font-style: normal;
	padding: var(--wp--preset--spacing--4);
	border: 1px solid var(--ip-border-color);
	border-radius: var(--ip-radius-md);
	background: var(--wp--preset--color--white);
	line-height: 1.7;
}
table.shop_table { border-collapse: collapse; width: 100%; }
table.shop_table th, table.shop_table td { padding: 12px; border-bottom: 1px solid var(--ip-border-color); text-align: left; }
table.shop_table thead th { font-size: var(--wp--preset--font-size--small); text-transform: uppercase; letter-spacing: 0.04em; color: var(--wp--preset--color--bronze); }
table.shop_table tr:last-child td { border-bottom: none; }
.order-again .button { margin: 0; }

/* ---------- Star rating: hidden via PHP filter when count is 0, this just
   restyles it when real reviews exist ---------- */
.star-rating { color: var(--wp--preset--color--crimson); }

/* ---------- Accessible quantity stepper (progressive enhancement) ---------- */
.ip-qty-stepper {
	display: inline-flex;
	align-items: center;
	border: 1px solid var(--ip-border-color);
	border-radius: var(--ip-radius-sm);
}
.ip-qty-stepper .qty {
	width: 48px;
	min-height: 42px;
	border: none;
	text-align: center;
	padding: 0;
}
.ip-qty-stepper .ip-icon-button { width: 40px; height: 42px; font-size: 1.1rem; }

/* ---------- WooCommerce notices ----------
   WooCommerce's own bundled stylesheet colors .woocommerce-message /
   .woocommerce-info / .woocommerce-error / .woocommerce-noreviews with an
   unrelated blue/green/red set (and its own icon font). These appear on
   the empty cart, "Have a coupon?", "no available payment methods", the
   checkout validation summary, and every My Account empty state (orders,
   downloads), so restating them once here covers all of those consistently
   in the site's own palette. */
.woocommerce-message,
.woocommerce-error,
.woocommerce-info,
.woocommerce-noreviews {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--wp--preset--spacing--3);
	margin: 0 0 var(--wp--preset--spacing--5);
	padding: var(--wp--preset--spacing--4) var(--wp--preset--spacing--5);
	border: 1px solid var(--ip-border-color);
	border-left-width: 4px;
	border-radius: var(--ip-radius-sm);
	background: var(--wp--preset--color--neutral-100);
	color: var(--wp--preset--color--ink);
	font-size: var(--wp--preset--font-size--body);
	list-style: none;
}
/* WooCommerce's own default stylesheet absolutely-positions this icon
   (built for a fixed-width text-indent layout it no longer has here),
   which made it overlap and hide the first few characters of the notice
   text. Put it back in normal flow as a small leading icon. */
.woocommerce-message::before,
.woocommerce-error::before,
.woocommerce-info::before,
.woocommerce-noreviews::before {
	position: static;
	flex-shrink: 0;
	font-size: 1.3rem;
}
.woocommerce-message { border-left-color: var(--wp--preset--color--success); }
.woocommerce-message::before { color: var(--wp--preset--color--success); }
.woocommerce-info { border-left-color: var(--wp--preset--color--amber-deep); }
.woocommerce-info::before { color: var(--wp--preset--color--amber-deep); }
.woocommerce-error { border-left-color: var(--wp--preset--color--error); }
.woocommerce-error::before { color: var(--wp--preset--color--error); }
.woocommerce-noreviews { border-left-color: var(--wp--preset--color--neutral); }
.woocommerce-error { display: block; }
.woocommerce-error li { padding: 3px 0; }
.woocommerce-error li a { color: inherit; text-decoration: underline; text-underline-offset: 0.15em; }
.woocommerce-message .button, .woocommerce-info .button { margin-left: auto; flex-shrink: 0; }

/* WooCommerce's own live-validation state marks a field "currently valid"
   (including optional fields with a pre-selected default, like the
   Country/State dropdowns) with a bright green border by default — noisy
   affirmation rather than useful feedback. Only invalid fields should
   carry a color cue. */
.woocommerce-validated input,
.woocommerce-validated select,
.woocommerce-validated .select2-selection {
	border-color: var(--ip-border-color) !important;
}
.woocommerce-invalid input,
.woocommerce-invalid select,
.woocommerce-invalid .select2-selection {
	border-color: var(--wp--preset--color--error) !important;
}

/* ---------- Password visibility toggle ----------
   WooCommerce's login/account-details password fields get a JS-inserted
   "Show password" button with no icon content of its own — left to the
   generic button rule it rendered as a blank filled square. Give it a
   small eye glyph and icon-button proportions instead. */
.woocommerce-form-row.password-input,
.woocommerce-form-login .password-input,
p.form-row .password-input {
	position: relative;
}
button.show-password-input {
	position: absolute;
	right: 2px;
	top: 2px;
	width: 40px;
	height: 40px;
	min-height: 0;
	padding: 0;
	background-color: transparent;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%235A4A3E' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7Z'/%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: center;
	background-size: 20px 20px;
	border: none;
}
button.show-password-input:hover { background-color: var(--wp--preset--color--neutral-100); }
button.show-password-input.display-password {
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23922E28' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7Z'/%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3Cpath d='M4 4l16 16'/%3E%3C/svg%3E");
}
.password-input input.input-text { padding-right: 44px; }

/* ---------- Empty cart ----------
   A deliberate, centered state instead of the two-column items+totals
   layout, which has nothing to put in the (now-empty) second column. */
body.woocommerce-cart .ip-page-content:has(.cart-empty) {
	grid-template-columns: 1fr;
	justify-items: center;
	text-align: center;
	padding-block: clamp(24px, 5vw, 56px);
}
.cart-empty.woocommerce-info {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: var(--wp--preset--spacing--2);
	max-width: 440px;
	padding: clamp(40px, 6vw, 56px) clamp(28px, 5vw, 44px);
	font-size: var(--wp--preset--font-size--body-lg);
	background: var(--wp--preset--color--white);
	border: 1px solid var(--ip-border-color);
	border-radius: var(--ip-radius-md);
}
.cart-empty.woocommerce-info::before {
	content: "";
	position: static;
	display: block;
	width: 64px;
	height: 64px;
	margin-bottom: var(--wp--preset--spacing--1);
	border-radius: 50%;
	background-color: var(--wp--preset--color--neutral-100);
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%235A4A3E' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 3h2l2.4 12.2a2 2 0 0 0 2 1.8h7.6a2 2 0 0 0 2-1.6L21 8H6'/%3E%3Ccircle cx='9.5' cy='20' r='1.25'/%3E%3Ccircle cx='17.5' cy='20' r='1.25'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: center;
	background-size: 28px 28px;
}
body.woocommerce-cart .return-to-shop { margin: 0; }
body.woocommerce-cart .return-to-shop .button { min-width: 200px; }

/* ---------- Coupon + update-cart row ---------- */
.woocommerce-cart-form__contents .coupon label { display: none; }
.woocommerce-cart-form__contents tr.actions td { border-top: 1px solid var(--ip-border-color); margin-top: var(--wp--preset--spacing--2); }

/* ---------- Unavailable pricing state ----------
   A product with no approved price is correctly left non-purchasable —
   WooCommerce's own add-to-cart form silently omits itself — but that
   leaves a shopper looking at a gap with no explanation. Fill it with an
   honest, calm state instead. Never invent a price to avoid this. */
.ip-price-unavailable {
	margin: var(--wp--preset--spacing--4) 0;
	padding: var(--wp--preset--spacing--4) var(--wp--preset--spacing--5);
	border: 1px solid var(--ip-border-color);
	border-left: 3px solid var(--wp--preset--color--amber-deep);
	border-radius: var(--ip-radius-md);
	background: var(--wp--preset--color--neutral-100);
}
.ip-price-unavailable-label {
	margin: 0 0 var(--wp--preset--spacing--1);
	font-size: var(--wp--preset--font-size--small);
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.05em;
	color: var(--wp--preset--color--amber-deep);
}
.ip-price-unavailable p:not(.ip-price-unavailable-label) { color: var(--wp--preset--color--bronze); margin-bottom: var(--wp--preset--spacing--3); }
.ip-price-unavailable .ip-btn { margin: 0; }

.ip-price-pending {
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	color: var(--wp--preset--color--amber-deep);
	margin-top: auto;
	padding-top: var(--wp--preset--spacing--2);
}
