/*
 * Phänomen Woo UI — cart page + mini-cart line items
 *
 * Palette variables only, no hex literals anywhere.
 * No font-family is ever set: the site keeps a single Google Fonts request
 * (Inter) and every rule below inherits from it.
 *
 * Everything is scoped to .pwu-* markup or to cart / mini-cart containers, so
 * nothing here can reach unrelated surfaces.
 */

:root {
	--pwu-ink: var(--bde-palette-color-1-1941ae39-5fd1-488e-917f-5d78aaaed343);
	--pwu-ink-soft: var(--bde-palette-color-1-a0e2ca77-2d49-4263-a9d3-44ff3540307f);
	--pwu-ink-faint: var(--bde-palette-color-1-958f4842-ed4f-48d9-908f-bfea722eb4e3);
	--pwu-canvas: var(--bde-palette-color-1-381c0d3c-7dbc-412b-b42f-0e47e0edf035);
	--pwu-surface: var(--bde-palette-color-1-ee680f71-e28d-4961-a89a-3fa5c9511c7a);
	--pwu-line: var(--bde-palette-color-1-6ff98eb0-e04c-47a7-8d7e-46a642ad5286);
	--pwu-on-dark: var(--bde-palette-color-1-c365544d-749a-494c-8a06-9f7575656729);
	--pwu-sale: var(--bde-palette-color-1-42310981-8410-413b-b4a8-00d29809ce05);

	/* Rail the account forms sit on — matches the login/register column. */
	--pwu-account-form-width: 400px;

	--pwu-thumb-w: 96px;
	--pwu-thumb-h: 120px;
	--pwu-step-btn: 32px;
	--pwu-step-num: 44px;
}

.pwu-u-hidden {
	display: none !important;
}

/* -------------------------------------------------------------------------
 * 1 + 2. Brand / name / variant — shared by both surfaces
 * ---------------------------------------------------------------------- */

.pwu-brand {
	display: block;
	margin-bottom: 4px;
	color: var(--pwu-ink-faint);
	font-size: 12px;
	font-weight: 500;
	line-height: 1.4;
	letter-spacing: 0.14em;
	text-transform: uppercase;
}

.pwu-name {
	display: block;
	color: var(--pwu-ink);
	font-size: 15px;
	font-weight: 600;
	line-height: 1.4;
}

.pwu-name a {
	color: inherit;
	font-weight: inherit;
	text-decoration: none;
}

.pwu-name a:hover {
	color: var(--pwu-ink);
	text-decoration: underline;
	text-underline-offset: 2px;
}

.pwu-variant {
	display: block;
	margin-top: 4px;
	color: var(--pwu-ink-soft);
	font-size: 13px;
	font-weight: 400;
	line-height: 1.5;
}

/* -------------------------------------------------------------------------
 * 3. Cart page line item
 * ---------------------------------------------------------------------- */

.pwu-cart {
	width: 100%;
	margin: 0;
	border: 0;
	border-collapse: collapse;
	background-color: transparent;
}

.pwu-cart td {
	padding: 0;
	border: 0;
	background-color: transparent;
	vertical-align: top;
}

.pwu-cart tr.cart_item > td {
	padding-top: 20px;
	padding-bottom: 20px;
}

/* Hairline between items only — never above the first or below the last. */
.pwu-cart tr.cart_item + tr.cart_item > td {
	border-top: 1px solid var(--pwu-line);
}

/*
 * Thumbnail: fixed portrait 4:5.
 *
 * Breakdance sets 64x64 / object-fit:contain via
 *   .breakdance-woocommerce .woocommerce-cart-form__contents td.product-thumbnail img   (0,3,2)
 * and forces the wrapping <a> to display:flex via
 *   .breakdance-woocommerce .woocommerce-cart-form__contents tbody tr td.product-thumbnail a   (0,3,4)
 * Our stylesheet loads BEFORE breakdance-woocommerce.css, so equal specificity
 * loses the tie. These selectors deliberately carry one extra class to win
 * outright without needing !important or relying on load order.
 */
.pwu-cart td.pwu-cart-item__media {
	width: var(--pwu-thumb-w);
	padding-right: 20px;
}

.woocommerce-cart-form__contents.pwu-cart tbody tr td.product-thumbnail.pwu-cart-item__media a {
	display: block;
	width: var(--pwu-thumb-w);
	height: var(--pwu-thumb-h);
}

.woocommerce-cart-form__contents.pwu-cart td.product-thumbnail.pwu-cart-item__media img {
	display: block;
	width: var(--pwu-thumb-w);
	height: var(--pwu-thumb-h);
	max-width: none;
	object-fit: cover;
}

/* Info column fills the remaining width */
.pwu-cart td.pwu-cart-item__body {
	width: auto;
	padding-left: 0;
}

.pwu-cart .pwu-cart-item__top {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 16px;
}

.pwu-cart .pwu-cart-item__text {
	flex: 1 1 auto;
	min-width: 0;
}

/* Line price — right aligned, same size/weight as the name */
.pwu-cart .pwu-cart-item__price {
	flex: 0 0 auto;
	color: var(--pwu-ink);
	font-size: 15px;
	font-weight: 600;
	line-height: 1.4;
	text-align: right;
	white-space: nowrap;
}

.pwu-cart .pwu-cart-item__price .amount,
.pwu-cart .pwu-cart-item__price bdi {
	color: inherit;
	font-size: inherit;
	font-weight: inherit;
}

/* Bottom row: stepper then the Entfernen text link */
.pwu-cart .pwu-cart-item__actions {
	display: flex;
	align-items: center;
	gap: 20px;
	margin-top: 12px;
}

.pwu-cart .pwu-cart-item__actions .product-quantity {
	margin: 0;
	padding: 0;
}

.pwu-cart .product-remove {
	margin: 0;
	padding: 0;
}

/*
 * Breakdance styles this link at
 *   .breakdance-woocommerce .woocommerce-cart-form__contents .product-remove a   (0,3,1)
 * with text-decoration:none, font-size:var(--bde-woo-typography__size-medium)
 * (20px) and opacity:.5 — which made it read as disabled placeholder text.
 * Our old selector was also (0,3,1) and lost on load order. One extra class
 * takes it to (0,4,1) and wins outright.
 */
.woocommerce-cart-form__contents.pwu-cart .product-remove a.remove {
	display: inline;
	width: auto;
	height: auto;
	padding: 0;
	border: 0;
	border-radius: 0;
	background-color: transparent;
	color: var(--pwu-ink-soft);
	font-size: 13px;
	font-weight: 400;
	line-height: 1.4;
	text-align: left;
	text-decoration: underline;
	text-decoration-line: underline;
	text-underline-offset: 2px;
	opacity: 1;
}

/* Light background → hover darkens to Ink (never Accent). */
.woocommerce-cart-form__contents.pwu-cart .product-remove a.remove:hover,
.woocommerce-cart-form__contents.pwu-cart .product-remove a.remove:focus {
	background-color: transparent;
	color: var(--pwu-ink);
	text-decoration: underline;
	text-decoration-line: underline;
	opacity: 1;
}

.pwu-cart .pwu-cart-actions {
	padding-top: 20px;
}

/*
 * Breakdance's responsive cart rules rebuild .woocommerce-cart-form__contents
 * as a 3-column grid below 768px, which assumes Woo's six <td>s. Our row has
 * two, so neutralise that block for this table only. The extra .pwu-cart in the
 * selector keeps specificity above Breakdance's.
 */
@media (max-width: 767px) {
	.breakdance-woocommerce .woocommerce-cart-form__contents.pwu-cart tbody {
		display: table-row-group;
		gap: 0;
		padding: 0;
	}

	.breakdance-woocommerce .woocommerce-cart-form__contents.pwu-cart tr.woocommerce-cart-form__cart-item {
		display: table-row;
		column-gap: 0;
		grid-template-columns: none;
	}

	.breakdance-woocommerce .woocommerce-cart-form__contents.pwu-cart tr.cart_item > td {
		padding-top: 16px;
		padding-bottom: 16px;
	}

	.breakdance-woocommerce .woocommerce-cart-form__contents.pwu-cart td.pwu-cart-item__media {
		width: var(--pwu-thumb-w);
		grid-area: auto;
	}

	.breakdance-woocommerce .woocommerce-cart-form__contents.pwu-cart td.pwu-cart-item__media a {
		display: block;
		width: var(--pwu-thumb-w);
	}

	.breakdance-woocommerce .woocommerce-cart-form__contents.pwu-cart td.pwu-cart-item__media img {
		width: var(--pwu-thumb-w);
		height: var(--pwu-thumb-h);
	}
}

/* -------------------------------------------------------------------------
 * 4. Shared quantity stepper
 *
 * This restyles Breakdance's own stepper (.bde-quantity-button--dec / --inc),
 * which it already renders in both surfaces via its global/quantity-input.php
 * override. Breakdance absolutely positions the buttons on top of the input;
 * we lay them out as a single bordered group instead. The mask-image icons are
 * left untouched so the – / + glyphs keep working.
 * ---------------------------------------------------------------------- */

.pwu-cart .product-quantity .quantity,
.woocommerce-mini-cart .bde-mini-cart-quantity .quantity {
	position: relative;
	display: inline-flex;
	align-items: stretch;
	align-self: auto;
	width: auto;
	max-width: none;
	border: 1px solid var(--pwu-line);
	background-color: var(--pwu-surface);
}

.pwu-cart .product-quantity .bde-quantity-button,
.woocommerce-mini-cart .bde-mini-cart-quantity .bde-quantity-button {
	position: static;
	top: auto;
	right: auto;
	bottom: auto;
	left: auto;
	flex: 0 0 auto;
	width: var(--pwu-step-btn);
	height: var(--pwu-step-btn);
	padding: 0;
	transform: none;
	border: 0;
	border-radius: 0;
	background-color: transparent;
	color: var(--pwu-ink-soft);
	cursor: pointer;
}

.pwu-cart .product-quantity .bde-quantity-button:hover,
.woocommerce-mini-cart .bde-mini-cart-quantity .bde-quantity-button:hover {
	background-color: transparent;
	color: var(--pwu-ink);
}

.pwu-cart .product-quantity .bde-quantity-button[disabled],
.woocommerce-mini-cart .bde-mini-cart-quantity .bde-quantity-button[disabled] {
	color: var(--pwu-ink-faint);
	cursor: default;
	opacity: 0.4;
}

.pwu-cart .product-quantity .bde-quantity-button[disabled]:hover,
.woocommerce-mini-cart .bde-mini-cart-quantity .bde-quantity-button[disabled]:hover {
	color: var(--pwu-ink-faint);
}

/* Numeral cell is deliberately wider than the buttons. */
.pwu-cart .product-quantity input.qty,
.woocommerce-mini-cart .bde-mini-cart-quantity input.qty {
	flex: 0 0 auto;
	width: var(--pwu-step-num);
	min-width: 0;
	height: var(--pwu-step-btn);
	padding: 0;
	border: 0;
	border-right: 1px solid var(--pwu-line);
	border-left: 1px solid var(--pwu-line);
	border-radius: 0;
	background-color: transparent;
	box-shadow: none;
	color: var(--pwu-ink);
	font-size: 14px;
	font-weight: 400;
	line-height: 1;
	text-align: center;
	-moz-appearance: textfield;
	appearance: textfield;
}

.pwu-cart .product-quantity input.qty:focus,
.woocommerce-mini-cart .bde-mini-cart-quantity input.qty:focus {
	outline: none;
	box-shadow: none;
	color: var(--pwu-ink);
}

.pwu-cart .product-quantity input.qty::-webkit-outer-spin-button,
.pwu-cart .product-quantity input.qty::-webkit-inner-spin-button,
.woocommerce-mini-cart .bde-mini-cart-quantity input.qty::-webkit-outer-spin-button,
.woocommerce-mini-cart .bde-mini-cart-quantity input.qty::-webkit-inner-spin-button {
	-webkit-appearance: none;
	margin: 0;
}

/* -------------------------------------------------------------------------
 * Cart summary card rows
 *
 * The shipping block is collapsed to a single row server-side (see main.php).
 * These rules only keep the row aligned with its neighbours and stop the tax
 * suffix orphaning a word on the Total row.
 * ---------------------------------------------------------------------- */

.cart_totals .pwu-shipping-row th,
.cart_totals .pwu-shipping-row td {
	vertical-align: baseline;
}

.cart_totals .pwu-shipping-row td {
	text-align: right;
}

/*
 * "Total  CHF 845 (inkl. CHF 60 MWST)" was wrapping mid-parenthetical and
 * orphaning "(inkl.". Give the tax suffix its own line, then keep it on that
 * one line: at 12px the string is roughly 115px wide, well inside the ~230px
 * of usable width in the 280px summary card, so nowrap cannot overflow.
 */
.cart_totals .order-total .includes_tax,
.cart_totals .order-total small,
.cart_totals .tax-total small {
	display: block;
	margin-top: 2px;
	font-size: 12px;
	line-height: 1.4;
	white-space: nowrap;
}

.cart_totals .order-total .includes_tax .amount,
.cart_totals .order-total small .amount {
	font-size: inherit;
	white-space: nowrap;
}

.cart_totals .order-total td {
	white-space: normal;
}

/* -------------------------------------------------------------------------
 * Mini-cart specifics
 * ---------------------------------------------------------------------- */

/* The item title is an <a>; our stacked spans need it to be a block. */
.woocommerce-mini-cart-item .bde-mini-cart-item-title {
	display: block;
}

.woocommerce-mini-cart-item .pwu-name {
	font-size: 14px;
}

/* 5. Shipping note between the subtotal row and ZUR KASSE. */
.pwu-mini-cart-shipping-note {
	margin: 0 0 12px;
	color: var(--pwu-ink-soft);
	font-size: 13px;
	font-weight: 400;
	line-height: 1.5;
}

/* -------------------------------------------------------------------------
 * 7. My Account navigation — new-tab affordance
 *
 * Scoped to .woocommerce-MyAccount-navigation and to the .pwu-external-icon
 * that only the wishlist item carries, so no other menu item, and no other Woo
 * surface, is touched. Nothing here sets a colour on the <a> itself — the item
 * keeps whatever active / hover styling the theme already gives it.
 * ---------------------------------------------------------------------- */

/* Announcement text for assistive tech only; never affects layout. */
.pwu-sr-only {
	position: absolute !important;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip: rect(0, 0, 0, 0);
	clip-path: inset(50%);
	white-space: nowrap;
	border: 0;
}

.woocommerce-MyAccount-navigation a .pwu-external-icon {
	/*
	 * 0.95em — close to the label's full size rather than its cap height, so it
	 * reads as an icon instead of a stray mark. In em, so it tracks whatever
	 * font size the theme gives the menu.
	 */
	width: 0.95em;
	height: 0.95em;

	/* Tightened from 0.4em as the icon grew — a larger glyph needs less gap to
	   stay visually attached to the word without crowding it. */
	margin-inline-start: 0.3em;
	flex: 0 0 auto;

	/*
	 * Dropped below the baseline so the glyph optically centres on the label.
	 * At -0.12em it spans -0.12em..0.83em, which stays inside the font's own
	 * ascent (~0.97em) and descent (~-0.24em) — so it cannot grow the line box,
	 * and the menu item's height is unchanged from the previous smaller size.
	 */
	vertical-align: -0.12em;

	color: var(--pwu-ink-faint);
	transition: color 0.15s ease;
}

/* Quiet by default, but follows the link on hover / focus / current page. */
.woocommerce-MyAccount-navigation a:hover .pwu-external-icon,
.woocommerce-MyAccount-navigation a:focus .pwu-external-icon,
.woocommerce-MyAccount-navigation a:active .pwu-external-icon,
.woocommerce-MyAccount-navigation .is-active a .pwu-external-icon,
.woocommerce-MyAccount-navigation a[aria-current="page"] .pwu-external-icon {
	color: inherit;
}

/* -------------------------------------------------------------------------
 * 8. Account forms — [phaenomen_register_form] / [phaenomen_login_form]
 *
 * Layout only. Colours, borders, focus rings and notice styling all come from
 * Breakdance's existing .breakdance-woocommerce rules, which both shortcode
 * wrappers opt into — so there is not a single colour declared below.
 *
 * Everything is scoped under .pwu-register / .pwu-login, classes that exist
 * only inside these shortcodes, so none of it can reach the cart, mini-cart,
 * checkout or account-navigation surfaces.
 * ---------------------------------------------------------------------- */

/*
 * Breakdance styles .woocommerce-form-login / .woocommerce-form-register as a
 * standalone card:
 *
 *   background-color: var(--bde-woo-wrappers__background-color);   (white)
 *   border: … solid var(--bde-woo-wrappers__border-color);         (grey-300)
 *   border-radius / box-shadow / padding: 24px
 *   max-width: var(--bde-woo-forms__wrappers-small);               (360px)
 *
 * That is right for Woo's own drop-in forms, but these shortcodes are placed
 * inside a designed, already-centred column — so the card renders as a bordered
 * white box 40px narrower than the heading above it, with 310px inputs.
 *
 * Reset the box and let the form fill its column. The layout declarations from
 * that same Breakdance rule (display:flex / gap) are deliberately left alone.
 *
 * (0,3,0) — beats .breakdance-woocommerce .woocommerce-form-register at (0,2,0),
 * which matters because our stylesheet loads first.
 */
.pwu-register .pwu-register__form.woocommerce-form-register,
.pwu-login .pwu-login__form.woocommerce-form-login {
	max-width: none;
	margin: 0;
	padding: 0;
	border: 0;
	border-radius: 0;
	background: none;
	box-shadow: none;
}

/*
 * The lost-password / reset-password form is rendered by WooCommerce itself
 * (through Breakdance's Woopageaccount element), so it is not inside one of our
 * wrappers. Breakdance gives it the same card plus max-width: 480px.
 *
 * The card is removed, but the form is then constrained to the same rail as the
 * login and register columns instead of filling the 1192px section — a lone
 * full-bleed email input reads as unintentional.
 *
 * Double-scoped and safe: the body carries .woocommerce-lost-password only on
 * the lost-password and reset screens, and .lost_reset_password exists nowhere
 * else. The logged-in account area — order tables, address grid — is untouched
 * and keeps its full width.
 *
 * The instruction paragraph is inside the form, so it inherits the rail. The
 * empty notices wrapper is pinned to the same width so a validation message
 * lines up with the field rather than spanning the section.
 *
 * (0,5,1) — beats Breakdance's (0,4,1).
 */
.woocommerce-page.woocommerce-lost-password .breakdance-woocommerce form.woocommerce-ResetPassword.lost_reset_password {
	max-width: var(--pwu-account-form-width);
	margin: 0 auto;
	padding: 0;
	border: 0;
	border-radius: 0;
	background: none;
	box-shadow: none;
}

.woocommerce-page.woocommerce-lost-password .bde-woopageaccount .woocommerce-notices-wrapper {
	max-width: var(--pwu-account-form-width);
	margin: 0 auto;
}

.pwu-register__field,
.pwu-login__field {
	margin: 0 0 16px;
}

/* Labels above inputs; every field full width, no side-by-side pairs. */
.pwu-register__field > label,
.pwu-login__field > label {
	display: block;
	margin-bottom: 6px;
}

/*
 * Three classes to beat Breakdance's own (0,2,0) input rules — our stylesheet
 * loads first, so equal specificity would lose.
 */
.pwu-register .pwu-register__field > .pwu-register__input,
.pwu-login .pwu-login__field > .pwu-login__input {
	display: block;
	width: 100%;
}

/*
 * "Passwort vergessen?" sits between the password field and the submit button,
 * left aligned on its own line — WooCommerce's stock template puts it after the
 * button instead. Ordering is done in the markup; this only handles spacing.
 */
.pwu-login__lost {
	margin: 0 0 20px;
	text-align: left;
}

.pwu-register__consent {
	margin: 0 0 20px;
}

.pwu-register .pwu-register__consent > label {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	cursor: pointer;
}

.pwu-register .pwu-register__consent input[type="checkbox"] {
	flex: 0 0 auto;
	/* Nudged onto the first line's optical centre rather than its box top. */
	margin: 0.15em 0 0;
}

.pwu-register__submit,
.pwu-login__submit {
	margin: 0;
}

/*
 * Both submit buttons, styled by one rule so the two account forms cannot
 * drift apart.
 *
 * Breakdance declares primary-button padding in three places, and the login
 * button is caught by the most specific of them:
 *
 *   (0,2,1)  .breakdance-woocommerce button[name=register|login]
 *              padding: var(--bde-button-padding-base)          -> 14px 24px
 *   (0,2,1)  generated global-settings.css, same specificity
 *              padding-*: 16px / 32px  (the real design values)
 *   (0,4,1)  "Buttons Big Size":
 *            .woocommerce-page.woocommerce-account .breakdance-woocommerce button[name=login]
 *              padding: var(--bde-button-padding-base)          -> 14px 24px
 *
 * The first two tie on specificity, so load order decides and the shorthand
 * wins over the four longhands. The third only matches inside the
 * .woocommerce-account body-class context — which is why the register button on
 * /registrieren/ was already correct while the login button on /mein-konto/
 * rendered h42.
 *
 * Hence (0,5,1) here: five classes/attributes plus the button element, enough
 * to beat "Buttons Big Size" without resorting to !important. Colours are still
 * deliberately NOT restated — they resolve through --bde-button-primary-*
 * inherited from the .breakdance-woocommerce scope, so both buttons keep
 * tracking the palette, including hover.
 */
.pwu-register.breakdance-woocommerce .pwu-register__form button.pwu-register__button[name="register"],
.pwu-login.breakdance-woocommerce .pwu-login__form button.pwu-login__button[name="login"] {
	width: 100%;
	padding: 16px 32px;
	border-radius: 0;
	font-size: 12px;
	letter-spacing: 0.1em;
	text-transform: uppercase;
}

.pwu-register__note,
.pwu-login__note {
	margin: 0;
}

/* -------------------------------------------------------------------------
 * 10. My Account → Übersicht (dashboard)
 *
 * Markup comes from templates/woocommerce/myaccount/dashboard.php via
 * includes/account-dashboard.php. Everything below is scoped under .pwu-dash,
 * which exists on no other surface — that template is loaded only for the
 * endpoint-less account root, so none of this can reach /orders/,
 * /edit-address/, /edit-account/ or /lost-password/.
 *
 * Palette tokens only, and no font-family — the wireframe's Roboto Mono and its
 * greys are Relume artefacts, not the design.
 *
 * Sizes are taken 1:1 from the 900px Figma frame, the same convention the cart
 * work already uses (see --pwu-thumb-w / --pwu-thumb-h above, which are that
 * frame's 96x120 thumbnail).
 *
 * SPECIFICITY — READ BEFORE ADDING A RULE HERE
 * --------------------------------------------
 * This stylesheet is enqueued as 'phaenomen-woo-ui' on wp_enqueue_scripts, which
 * puts it in the <head> BEFORE every Breakdance stylesheet:
 *
 *   phaenomen-woo-ui/assets/woo-ui.css        <- us
 *   …/breakdance-woocommerce/css/breakdance-woocommerce.css
 *   …/uploads/breakdance/css/global-settings.css
 *
 * So on a specificity tie Breakdance wins on source order, silently. And its
 * base rules in global-settings.css are all (0,1,1) — one class plus one
 * element — which beats a plain (0,1,0) BEM class:
 *
 *   .bde-h2, .breakdance h2 { font-size:40px; line-height:1.05;
 *                             letter-spacing:-0.02em }      (32px/26px at MQs)
 *   .breakdance a           { color; text-decoration-line:underline;
 *                             text-decoration-thickness:1px;
 *                             text-underline-offset:3px }
 *   .breakdance img         { max-width:100%; height:auto }
 *
 * Every rule below that touches a heading, a link, a list or an <img> is
 * therefore scoped through the .pwu-dash ancestor, making it (0,2,0)/(0,2,1) and
 * putting it above those unambiguously — no !important anywhere. Rules that only
 * ever match a <div>/<span>/<section> are scoped too, purely for consistency.
 *
 * Properties Breakdance sets that we do NOT want must be restated explicitly,
 * not just left out — e.g. the headings need `letter-spacing: normal`, because
 * inheriting -0.02em is what the .bde-h2 rule would otherwise still hand them.
 *
 * AND THE SAME AGAIN FOR EVERY INTERACTIVE STATE. A pseudo-class counts as a
 * class, so Breakdance's
 *
 *   .breakdance a:hover { color; text-decoration-line:underline;
 *                         text-decoration-thickness:1px;
 *                         text-decoration-style:solid;
 *                         text-decoration-color }        (0,2,1)
 *
 * outranks a rest-state fix at (0,2,0) the moment the pointer lands. Fixing the
 * rest state alone does not fix the element — it just moves the bug into :hover.
 * Any rule here that overrides a Breakdance property on an <a> therefore needs a
 * matching :hover / :focus rule at (0,3,0).
 *
 * TIES ARE LOSSES. We always load first, so a rule only wins with STRICTLY
 * greater specificity. Matching Breakdance's number is not enough.
 *
 * AND THE THREAT IS NOT ONLY IN THE GLOBAL SHEETS. Breakdance also emits a
 * per-page stylesheet, and /mein-konto/ is page 220, whose Woopageaccount
 * element styles every link inside the account content:
 *
 *   post-220.css
 *   .breakdance .bde-woopageaccount-220-5 .woocommerce-MyAccount-content
 *       a:not(.button):hover
 *     { text-decoration-line:underline; text-underline-offset:2px }   (0,5,1)
 *
 * That is the strongest thing pointed at this markup — far above the (0,2,1) of
 * `.breakdance a:hover` — and it is :hover-only, which is exactly why the rest
 * states were correct while both anchors underlined on hover. It matches
 * `a:not(.button)`, so every classed anchor we emit is in scope. The two state
 * rules below therefore run at (0,6,1), through
 * `.breakdance` (body class) > `.woocommerce-MyAccount-content` (WooCommerce
 * wrapper) > `.pwu-dash`, with the anchor class doubled to clear the tie.
 *
 * Audited across every Breakdance stylesheet — global-settings.css,
 * breakdance-woocommerce.css, all element dependencies and all post-*.css — for
 * :hover / :focus / :focus-visible / :active rules whose subject can be one of
 * our anchors. The post-220 rule above and `.breakdance a:hover` are the only
 * two; there are no :focus, :focus-visible, :active or :visited rules anywhere,
 * and `…MyAccount-content a:not([class]):hover` skips us because our anchors are
 * classed. Headings, paragraphs, lists and images have no state rules at all, so
 * their rest-state (0,2,0) fixes need no state twin. (:focus-visible is included
 * in the resets anyway, so keyboard users match the pointer.)
 *
 * Two near-misses that are safe today but worth knowing about:
 *   - .breakdance-woocommerce .woocommerce-MyAccount-content p:not([class])
 *     and the matching a:not([class]) rule skip us because every element we
 *     emit carries a class. Keep it that way.
 *   - .breakdance-woocommerce .woocommerce-notices-wrapper + h2 { display:none }
 *     would hide "Letzte Bestellung" if it were ever the notice wrapper's
 *     adjacent sibling. The .pwu-dash wrapper is what sits there instead, so
 *     do not flatten it away.
 * ---------------------------------------------------------------------- */

.pwu-dash {
	display: flex;
	flex-direction: column;

	/* Figma "Main Content" column gap. */
	gap: 32px;
}

.pwu-dash .pwu-dash__section {
	display: flex;
	flex-direction: column;
	gap: 16px;
}

/* a) Greeting -------------------------------------------------------- */

.pwu-dash .pwu-dash__greeting {
	display: flex;
	flex-direction: column;
	gap: 8px;
}

.pwu-dash .pwu-dash__welcome {
	margin: 0;
	color: var(--pwu-ink);
	font-size: 16px;
	font-weight: 700;
	line-height: 1.4;
}

.pwu-dash .pwu-dash__lede,
.pwu-dash .pwu-dash__empty {
	margin: 0;
	color: var(--pwu-ink-faint);
	font-size: 12px;
	font-weight: 400;
	line-height: 1.5;
}

/* Section headings ---------------------------------------------------- */

/*
 * Section headings carry their own hairline underneath, as a border on the
 * heading itself. This is now the ONLY hairline in the component.
 *
 * The wireframe also drew a free-floating full-width rule above each heading.
 * Rendered, that stacked four hairlines into 305px — each heading bracketed
 * between two lines 64px apart — which read as banding and made the headings
 * look boxed rather than labelling the content beneath them. The <hr>s are gone;
 * the attached underline says the same thing more precisely, because it is tied
 * to its heading, and the 32px .pwu-dash gap carries the section separation on
 * its own. Two lines instead of four.
 *
 * BOTH headings get it. The wireframe underlines "Letzte Bestellung" only, which
 * at its 40px display size read as part of that heading's weight; at the
 * corrected 14px the labels are identical in size and an underline on one but
 * not the other reads as an oversight. Symmetry wins — if it is ever dropped,
 * drop it from BOTH, never re-split them.
 *
 * These are <h2>s, so this rule is competing with
 *   .bde-h2, .breakdance h2 { font-size:40px; line-height:1.05;
 *                             letter-spacing:-0.02em }
 * at (0,1,1) — plus its 32px and 26px media-query variants. Scoping through
 * .pwu-dash makes this (0,2,0), which wins at every breakpoint, because a media
 * query adds no specificity. letter-spacing has to be reset by hand: leaving it
 * unset would inherit Breakdance's display-heading -0.02em onto a 14px label.
 *
 * The intended hierarchy is greeting (16px) ABOVE section heading (14px) — if a
 * heading ever renders larger than the greeting again, this rule has been
 * out-specified.
 */
.pwu-dash .pwu-dash__heading {
	margin: 0;
	padding-bottom: 12px;
	border-bottom: 1px solid var(--pwu-line);
	color: var(--pwu-ink);
	font-size: 14px;
	font-weight: 700;
	line-height: 1.4;
	letter-spacing: normal;
}

/* Links --------------------------------------------------------------- */

/*
 * Competing with .breakdance a (0,1,1), which sets colour, an underline, a 1px
 * decoration thickness and text-underline-offset:3px. We want the underline —
 * these are the wireframe's underlined text links — but we want our own offset
 * and our own hover colour, so the whole declaration block has to outrank it.
 */
.pwu-dash .pwu-dash__link {
	color: var(--pwu-ink);
	font-size: 13px;
	font-weight: 500;
	line-height: 1.5;
	text-decoration: underline;
	text-underline-offset: 0.2em;
}

/*
 * (0,6,1) — see the header note. Has to clear post-220.css's (0,5,1)
 * `…MyAccount-content a:not(.button):hover`, which would otherwise force
 * text-underline-offset:2px here, and .breakdance a:hover (0,2,1), which would
 * hand the underline its own text-decoration-color (Accent #666666) while the
 * text took ours (Ink Soft #595959) — label and underline in two colours.
 * Restating the `underline` shorthand resets thickness/style/color to
 * auto/solid/currentcolor, which is what keeps them in step.
 */
.breakdance .woocommerce-MyAccount-content .pwu-dash a.pwu-dash__link.pwu-dash__link:hover,
.breakdance .woocommerce-MyAccount-content .pwu-dash a.pwu-dash__link.pwu-dash__link:focus,
.breakdance .woocommerce-MyAccount-content .pwu-dash a.pwu-dash__link.pwu-dash__link:focus-visible {
	color: var(--pwu-ink-soft);
	text-decoration: underline;
	text-underline-offset: 0.2em;
}

.pwu-dash .pwu-dash__more {
	margin: 0;
}

/* Arrow must never wrap away from the label it belongs to. */
.pwu-dash .pwu-dash__arrow {
	white-space: nowrap;
}

/*
 * Same treatment the sidebar item gets (section 7), applied to the one
 * dashboard link that also leaves the account area.
 */
.pwu-dash .pwu-dash__link .pwu-external-icon {
	width: 0.95em;
	height: 0.95em;
	margin-inline-start: 0.3em;
	flex: 0 0 auto;
	vertical-align: -0.12em;
	color: var(--pwu-ink-faint);
	transition: color 0.15s ease;
}

.pwu-dash .pwu-dash__link:hover .pwu-external-icon,
.pwu-dash .pwu-dash__link:focus .pwu-external-icon {
	color: inherit;
}

/* b) Letzte Bestellung ------------------------------------------------ */

.pwu-dash .pwu-dash-order {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-start;
	justify-content: space-between;
	gap: 8px 24px;
	padding: 4px 0;
}

.pwu-dash .pwu-dash-order__main {
	display: flex;
	flex-direction: column;
	gap: 4px;
	min-width: 0;
}

.pwu-dash .pwu-dash-order__number {
	margin: 0;
	color: var(--pwu-ink);
	font-size: 14px;
	font-weight: 700;
	line-height: 1.4;
}

.pwu-dash .pwu-dash-order__meta {
	margin: 0;
	color: var(--pwu-ink-faint);
	font-size: 12px;
	font-weight: 400;
	line-height: 1.5;
}

.pwu-dash .pwu-dash-order__actions {
	margin: 4px 0 0;
}

.pwu-dash .pwu-dash-order__actions .pwu-dash__link {
	font-size: 12px;
}

/* Total sits hard right and never wraps mid-amount. */
.pwu-dash .pwu-dash-order__total {
	margin: 0;
	margin-inline-start: auto;
	color: var(--pwu-ink);
	font-size: 14px;
	font-weight: 700;
	line-height: 1.4;
	white-space: nowrap;
}

/* c) Ihre Lieblinge --------------------------------------------------- */

/*
 * The tiles fill the content column. The wireframe's 96px tile was measured
 * against a 524px column that does not exist here — the live account column is
 * ~854px at 1440, so a 432px cap left the row huddled in the left third. The cap
 * is gone; four tiles now span the column and the thumbnail simply grows, since
 * the 4/5 ratio is a ratio and not a fixed box.
 *
 * ONE INTRINSIC EXPRESSION, NO BREAKPOINTS. The account column is not the
 * viewport — it sits beside a 25% nav until 767px and goes full width below
 * that, and it will change again if the nav is ever restructured. So the track
 * size is derived from the container, not from assumed viewport sizes:
 *
 *   minmax( min(100%, max(FLOOR, (100% - 3 * GAP) / 4)), 1fr )
 *
 *   - Wide column: (100% - 3*GAP)/4 is the larger term, so the minimum IS the
 *     exact quarter-column width. Four tracks fit and fill it; a fifth can never
 *     fit, because 5 * (100%-48px)/4 + 4*GAP always exceeds 100%. That is what
 *     caps the row at four without a max-width or a media query.
 *   - Narrow column: FLOOR takes over and the row wraps on its own — 4 -> 3 -> 2
 *     -> 1 as the column shrinks past each threshold.
 *   - min(100%, ...) is the standard guard so a container narrower than FLOOR
 *     cannot overflow.
 *
 * FLOOR is 140px, chosen so the phone case lands on 2-up with room to spare:
 * two tracks need 2*140 + 16 = 296px and the column is ~343px at a 375px
 * viewport. Thresholds, in column width: 4-up >= 608px, 3-up 452-607px,
 * 2-up 296-451px, 1-up below that.
 *
 * auto-fill, NOT auto-fit — this is the whole reason 1, 2 and 3 items still look
 * right. auto-fit COLLAPSES the empty tracks, so two items in an 854px column
 * would stretch to 419px each and dwarf everything around them. auto-fill KEEPS
 * the empty tracks, so every item renders at the same ~201px it would have had
 * in a full row of four, and a short list simply leaves the remaining slots
 * blank.
 */
.pwu-dash .pwu-dash-favs {
	--pwu-fav-gap: 16px;

	/* Smallest a tile may shrink to before the row wraps. */
	--pwu-fav-floor: 140px;

	display: grid;
	grid-template-columns: repeat(
		auto-fill,
		minmax(
			min(
				100%,
				max(var(--pwu-fav-floor), (100% - var(--pwu-fav-gap) * 3) / 4)
			),
			1fr
		)
	);
	gap: var(--pwu-fav-gap);
	margin: 0;
	padding: 0;
	list-style: none;
}

.pwu-dash .pwu-dash-favs__item {
	margin: 0;
	list-style: none;
}

/* Beats .breakdance a's underline (0,1,1) — tiles are not text links. */
.pwu-dash .pwu-dash-fav {
	display: flex;
	flex-direction: column;
	gap: 6px;
	text-decoration: none;
}

/*
 * The state half of the rule above, at (0,6,1) — see the header note. It has to
 * clear post-220.css's (0,5,1) `…MyAccount-content a:not(.button):hover`, which
 * is what was underlining these tiles on hover.
 *
 * This is load-bearing, not belt-and-braces: text-decoration paints THROUGH
 * descendants, and a descendant cannot switch off a decoration its ancestor
 * draws. So an underline on this <a> underlines the brand line and the product
 * name together, and the `:hover .pwu-dash-fav__name` rule below is powerless
 * against it — the brand line computed `none` and still rendered underlined.
 * Resetting it here, on the anchor, is the only place the fix works, and it is
 * what makes the name-only underline possible at all.
 */
.breakdance .woocommerce-MyAccount-content .pwu-dash a.pwu-dash-fav.pwu-dash-fav:hover,
.breakdance .woocommerce-MyAccount-content .pwu-dash a.pwu-dash-fav.pwu-dash-fav:focus,
.breakdance .woocommerce-MyAccount-content .pwu-dash a.pwu-dash-fav.pwu-dash-fav:focus-visible {
	text-decoration: none;
}

.pwu-dash .pwu-dash-fav__thumb {
	display: block;
	overflow: hidden;
	background-color: var(--pwu-canvas);

	/*
	 * The wireframe's 96x120 box as a ratio, so the tile scales with its grid
	 * column — which is now the whole point, since the column is fluid and the
	 * rendered thumbnail is ~201px wide at 1440, not 96px. The box follows the
	 * track; only the proportion is fixed.
	 *
	 * Written as unitless numbers ON PURPOSE: aspect-ratio takes
	 * <number> / <number>, so the obvious-looking
	 *     aspect-ratio: var(--pwu-thumb-w) / var(--pwu-thumb-h)
	 * expands to `96px / 120px`, which is invalid and gets dropped at parse time
	 * — silently, with no fallback. That is what previously left these tiles
	 * square: with no ratio the span collapsed onto the image's own height, and
	 * the images here are 300x300 woocommerce_thumbnail crops.
	 *
	 * 4 / 5 === 96 / 120. Keep the two in sync if --pwu-thumb-* ever change.
	 */
	aspect-ratio: 4 / 5;
}

/*
 * .breakdance img { max-width:100%; height:auto } is (0,1,1) and loads after us,
 * so an unscoped `.pwu-dash-fav__thumb img` (also (0,1,1)) LOST the height and
 * the image sized itself intrinsically. (0,2,1) here settles it, and height:100%
 * + object-fit:cover is what actually performs the portrait crop.
 */
.pwu-dash .pwu-dash-fav__thumb img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

/*
 * Wireframe has 10px / 11px, sized against its 96px tile. The tile is now ~201px
 * at 1440 — more than double — so the caption was reading as undersized beneath
 * it. Stepped up to 12px / 13px.
 *
 * 12px is not arbitrary: it is exactly the floor this project keeps for
 * uppercase, letter-spaced text, and it puts the brand line on the same size as
 * .pwu-brand in the cart, so the two surfaces agree. It is also still legible at
 * the other end of the range — at the 140px floor the longest brand on the site
 * ("FRIENDLY HUNTING") measures ~115px and fits on one line.
 */
.pwu-dash .pwu-dash-fav__brand {
	color: var(--pwu-ink);
	font-size: 12px;
	font-weight: 700;
	line-height: 1.4;
	letter-spacing: 0.12em;
	text-transform: uppercase;
}

/*
 * Product names in this catalogue are not the wireframe's tidy "Waxed Jacket" —
 * several are full sentences imported from the supplier feed. Clamped to two
 * lines so one long name cannot push its tile taller than the other three.
 */
.pwu-dash .pwu-dash-fav__name {
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 2;
	line-clamp: 2;
	overflow: hidden;
	color: var(--pwu-ink-soft);
	font-size: 13px;
	font-weight: 400;
	line-height: 1.4;
}

/*
 * The underline is now a real hover affordance rather than a no-op: the tile
 * itself is text-decoration:none at rest, so this is the only underline in the
 * component and the state change is visible.
 */
.pwu-dash .pwu-dash-fav:hover .pwu-dash-fav__name,
.pwu-dash .pwu-dash-fav:focus .pwu-dash-fav__name {
	text-decoration: underline;
	text-underline-offset: 0.2em;
}

/* -------------------------------------------------------------------------
 * 11. Checkout — coupon affordance
 *
 * Two upstream problems, both purely presentational:
 *
 *   a) breakdance-woocommerce.css sets
 *      `.breakdance-woocommerce .woocommerce-info a { text-transform: capitalize }`
 *      at (0,2,1). The German source string is already correct sentence case —
 *      the broken title-casing („Klicken Sie Hier, Um Ihren Code Einzugeben")
 *      is that rule landing on a full German sentence. Undone here for the
 *      coupon toggle only; every other info-notice link keeps its treatment.
 *
 *   b) The same stylesheet puts .woocommerce-form-coupon in its "Wrappers"
 *      group — white fill, 1px border, 24px padding — so an optional one-field
 *      affordance renders as a full card. It also sets flex-grow: 1 on
 *      p.form-row-first, implying the form was meant to be a flex row, but
 *      nothing ever declares the flex. And because woocommerce.css is not
 *      enqueued on this site, Woo's own .form-row-first/last floats never load
 *      either — so the two rows simply stack at full width.
 *
 * Every selector below carries one class more than the rule it overrides: this
 * stylesheet loads before both breakdance-woocommerce.css and the generated
 * global-settings.css, so a tie is a loss. No !important anywhere.
 * ---------------------------------------------------------------------- */

/*
 * The toggle is an optional affordance, not an alert. Strip the notice
 * furniture — band, box, state rule, icon — and leave a quiet link. Scoped to
 * .pwu-coupon-toggle, which only our forked template emits, so the site-wide
 * notice system is untouched everywhere else.
 *
 * width: auto because Breakdance sets width: 100% on the info family; with
 * border-box that would make any horizontal margin inert.
 *
 * (0,3,0) — beats both Breakdance's and the global custom CSS's (0,2,0).
 */
.breakdance-woocommerce .pwu-coupon-toggle .woocommerce-info,
.breakdance-woocommerce .pwu-login-toggle .woocommerce-info {
	width: auto;
	margin: 0 0 16px;
	padding: 0;
	border: 0;
	border-radius: 0;
	background: none;
	box-shadow: none;
	color: var(--pwu-ink-soft);
	font-size: 14px;
	font-weight: 400;
}

/* (0,3,1) — beats the icon rule at (0,2,1). */
.breakdance-woocommerce .pwu-coupon-toggle .woocommerce-info::before,
.breakdance-woocommerce .pwu-login-toggle .woocommerce-info::before {
	content: none;
}

/* (0,3,1) — the capitalize fix. */
.breakdance-woocommerce .pwu-coupon-toggle .woocommerce-info a,
.breakdance-woocommerce .pwu-login-toggle .woocommerce-info a {
	text-transform: none;
	color: var(--pwu-ink-soft);
	text-decoration: underline;
	text-underline-offset: 0.2em;
}

/* (0,4,1) — :hover counts in the class column. Darkens to Ink, never Accent. */
.breakdance-woocommerce .pwu-coupon-toggle .woocommerce-info a:hover,
.breakdance-woocommerce .pwu-coupon-toggle .woocommerce-info a:focus,
.breakdance-woocommerce .pwu-login-toggle .woocommerce-info a:hover,
.breakdance-woocommerce .pwu-login-toggle .woocommerce-info a:focus {
	color: var(--pwu-ink);
}

/*
 * The form itself: no card. It is left as a plain block so the inline display
 * that checkout.js toggles is never contested — the row layout lives on an
 * inner wrapper instead (see templates/woocommerce/checkout/form-coupon.php).
 *
 * (0,3,0) — beats the "Wrappers" card rule at (0,2,0).
 */
.breakdance-woocommerce .pwu-coupon.woocommerce-form-coupon {
	max-width: 420px;
	margin: 0 0 24px;
	padding: 0;
	border: 0;
	border-radius: 0;
	background: none;
	box-shadow: none;
}

/* Input and button on one row; align-items: stretch equalises their heights. */
.pwu-coupon__row {
	display: flex;
	align-items: stretch;
	gap: 8px;
}

.pwu-coupon__row .form-row {
	margin: 0;
	padding: 0;
}

/* min-width: 0 so the field may shrink below its intrinsic width inside flex. */
.pwu-coupon__field {
	flex: 1 1 auto;
	min-width: 0;
}

.pwu-coupon__action {
	flex: 0 0 auto;
}

/*
 * The input needs no metrics of its own: .input-text is already in Breakdance's
 * input selector list, so it inherits exactly the same fill, border, radius,
 * type size and 12px/16px padding as every other field on the site.
 */
.pwu-coupon__field .input-text {
	width: 100%;
}

/*
 * The apply button is already secondary/outline — button[name="apply_coupon"]
 * is in Breakdance's secondary list. Only the horizontal padding is trimmed
 * from 32px so the pair fits one row; size, tracking, uppercasing and every
 * colour (including hover) still come from the design tokens.
 *
 * (0,3,1) — beats the generated button rule at (0,2,1).
 */
.breakdance-woocommerce .pwu-coupon__action button[name="apply_coupon"] {
	width: 100%;
	padding-right: 20px;
	padding-left: 20px;
}

/*
 * Invalid-coupon state.
 *
 * WooCommerce 10.9 no longer raises a .woocommerce-error for a bad checkout
 * coupon. checkout.js calls show_coupon_error( response, $coupon_field.parent() )
 * and appends an inline <span class="coupon-error-notice" role="alert"> INSIDE
 * the field's <p>, flagging the input with .has-error / aria-invalid. So the
 * site's global .woocommerce-error rule never matches it, and the message
 * rendered as unstyled 16px body text.
 *
 * It also broke the layout. Breakdance gives BOTH controls their height from
 * their stretched parent:
 *
 *   .breakdance-woocommerce .woocommerce-form-coupon .input-text            { height: 100% }
 *   .breakdance-woocommerce .woocommerce-form-coupon p.form-row button[name=apply_coupon]
 *                                                                          { height: 100% }
 *
 * which is exactly what makes them agree at 46px under align-items: stretch —
 * but it also means the error growing the field <p> drags the row, and both
 * controls inflated to 150.6px and overran the "Rechnungsdaten" heading.
 *
 * Rather than give up the stretch that keeps them matched, the row opts out of
 * it only while an error is present. :has() carries the specificity of its
 * argument, so this is (0,2,0) and beats the base rule in this same file.
 *
 * KNOWN DEPENDENCY: this fix requires :has() — Chrome 105+, Safari 15.4+,
 * Firefox 121+. On anything older the rule is dropped and the invalid-coupon
 * state regresses to the old behaviour (the row inflating with the message).
 * Accepted deliberately rather than carrying a JS fallback; revisit only if
 * analytics ever show meaningful pre-2024 browser traffic.
 */
.pwu-coupon__row:has(.coupon-error-notice) {
	align-items: flex-start;
}

/*
 * With the row no longer stretching, each <p> is content-height, so the
 * inherited height: 100% resolves against an auto-height parent. Pinned to auto
 * explicitly so the controls keep their natural size rather than depending on
 * that resolution.
 *
 * Both selectors are (0,5,1). The button's rule is the demanding one —
 * `.breakdance-woocommerce .woocommerce-form-coupon p.form-row button[name=apply_coupon]`
 * is (0,4,2), so a (0,4,1) selector would LOSE on the element column; the extra
 * .pwu-coupon class is what carries it.
 */
.breakdance-woocommerce .pwu-coupon .pwu-coupon__row:has(.coupon-error-notice) .input-text,
.breakdance-woocommerce .pwu-coupon .pwu-coupon__row:has(.coupon-error-notice) button[name="apply_coupon"] {
	height: auto;
}

/*
 * The message itself, in the site's error idiom: Sale text on Canvas with the
 * 4px Sale left rule the global notice system uses for errors. No icon — this
 * is a field-level message, not a page notice. All palette tokens.
 *
 * (0,3,0) — nothing else targets this class, but scoped anyway.
 */
.breakdance-woocommerce .pwu-coupon__field .coupon-error-notice {
	display: block;
	width: 100%;
	margin: 8px 0 0;
	padding: 12px 16px;
	border-left: 4px solid var(--pwu-sale);
	background: var(--pwu-canvas);
	color: var(--pwu-sale);
	font-size: 15px;
	line-height: 1.5;
}

/* checkout.js flags the field itself — echo the error colour on its border.
   (0,4,0) — beats Breakdance's input :focus rule at (0,3,0). */
.breakdance-woocommerce .pwu-coupon__field .input-text.has-error {
	border-color: var(--pwu-sale);
}

/* Below 480px the pair no longer fits side by side — stack it. */
@media (max-width: 479px) {
	/*
	 * width: 100% belongs on the ROW, not just its children. The row is itself
	 * a flex item of form.checkout_coupon (Breakdance makes that form a flex
	 * container), so at flex: 0 1 auto it shrink-wraps to the input's intrinsic
	 * width and left the controls 150px narrower than the billing fields at
	 * 479px. Sizing the children alone cannot fix that — they were already
	 * filling a row that was too narrow.
	 */
	.pwu-coupon__row {
		flex-direction: column;
		width: 100%;
	}

	.pwu-coupon__field,
	.pwu-coupon__action {
		flex: 0 0 auto;
		width: 100%;
	}
}

/*
 * Bind the two toggles as a pair.
 *
 * div.woocommerce is a flex column with gap: var(--bde-woo-base-large-gaps)
 * (32px), and our own 16px margin on the notice sat inside the login wrapper —
 * 48px between the two lines of text, loose enough that they read as unrelated.
 *
 * The parent gap is left alone (it also spaces the coupon toggle from the
 * checkout form below, which is correct): the login toggle drops its own margin
 * and pulls 8px back, giving ~24px text to text.
 */
.breakdance-woocommerce .pwu-login-toggle .woocommerce-info {
	margin-bottom: 0;
}

.breakdance-woocommerce .pwu-login-toggle {
	margin-bottom: -8px;
}

/* -------------------------------------------------------------------------
 * 12. Checkout — order review totals
 *
 * The shipping options rendered as UPPERCASE WITH 0.08em TRACKING because the
 * site's global form-label token in the generated global-settings.css is:
 *
 *   .breakdance-form-field__label, …, .breakdance-woocommerce label {
 *     font-size:13px; font-weight:500; letter-spacing:0.08em; text-transform:uppercase }
 *
 * at (0,1,1). That token is correct for the billing field labels — VORNAME,
 * E-MAIL-ADRESSE — so it is deliberately NOT changed. Shipping methods are
 * <label> elements too, which is the only reason they were caught by it, and a
 * sentence-length option in caps is what forced the two-line wrap. Overridden
 * here for the shipping list only.
 *
 * The review table is one of the tables Breakdance excludes from its
 * flex-row/data-title transformation, so it is a real <table> and normal cell
 * alignment applies.
 * ---------------------------------------------------------------------- */

/*
 * Shipping options read as sentence-case prose, not as field labels.
 * (0,3,3) — beats the (0,1,1) global token and Breakdance's own
 * `ul.woocommerce-shipping-methods li label` at (0,2,3).
 */
.breakdance-woocommerce .woocommerce-checkout-review-order-table ul.woocommerce-shipping-methods li label {
	text-transform: none;
	letter-spacing: normal;
	font-size: 15px;
	font-weight: 400;
	line-height: 1.4;
	color: var(--pwu-ink);
	cursor: pointer;

	/*
	 * Progressive enhancement: keeps "Click & Collect – Luzern" from breaking
	 * to a line holding only "Luzern" and leaving the en dash dangling.
	 * Ignored by browsers without it, which simply wrap as before.
	 */
	text-wrap: pretty;
}

/*
 * Radio against the FIRST line of its label rather than the centre of a wrapped
 * block — correct whether the option fits one line or wraps at 375px.
 * Breakdance's own rule is `align-items: center` at (0,2,2); this is (0,3,2).
 */
.breakdance-woocommerce .woocommerce-checkout-review-order-table ul.woocommerce-shipping-methods li {
	align-items: flex-start;
	gap: 10px;
}

/* The radios sit tight to the text otherwise — no gap exists in the markup. */
.breakdance-woocommerce .woocommerce-checkout-review-order-table ul.woocommerce-shipping-methods li input[type="radio"] {
	flex: 0 0 auto;
	margin: 0;
}

/*
 * Row rhythm. Breakdance pads tfoot cells 16px all round, which reads loose
 * against the rest of the column; the vertical rhythm is tightened and the
 * horizontal padding left alone so the labels stay aligned with the product
 * rows above. (0,3,3) — beats `table tfoot th|td` at (0,1,2).
 */
.breakdance-woocommerce .woocommerce-checkout-review-order-table tfoot tr > th,
.breakdance-woocommerce .woocommerce-checkout-review-order-table tfoot tr > td {
	padding-top: 12px;
	padding-bottom: 12px;
	vertical-align: top;
}

/* Label column: quiet and regular. */
.breakdance-woocommerce .woocommerce-checkout-review-order-table tfoot tr > th {
	color: var(--pwu-ink-soft);
	font-weight: 400;
	text-align: left;
	white-space: nowrap;
}

/*
 * Money right-aligned so the amounts form a clean column. The shipping row is
 * excluded — its <td> holds the radio list, which must stay left.
 */
.breakdance-woocommerce .woocommerce-checkout-review-order-table tfoot tr.cart-subtotal > td,
.breakdance-woocommerce .woocommerce-checkout-review-order-table tfoot tr.order-total > td {
	text-align: right;
	color: var(--pwu-ink);
}

/*
 * Hairline above the total — the hierarchy cue the wireframe shows as a divider
 * before "Total". post-219.css clears every tfoot row border at (0,3,2), and
 * this stylesheet loads first, so the extra .woocommerce-checkout class is what
 * carries it: (0,4,3). Applied to the cells rather than the <tr>, which is
 * unreliable under border-collapse.
 */
.breakdance-woocommerce .woocommerce-checkout .woocommerce-checkout-review-order-table tfoot tr.order-total > th,
.breakdance-woocommerce .woocommerce-checkout .woocommerce-checkout-review-order-table tfoot tr.order-total > td {
	border-top: 1px solid var(--pwu-line);
	padding-top: 16px;
}

/*
 * Total row hierarchy.
 *
 * Breakdance's `table tfoot tr:last-child th` hands the label
 * var(--bde-woo-typography__size-medium) (20px), so the label was both the
 * largest AND the lightest type in the block while its amount sat at 18px —
 * the number was out-sized by its own label. Label and amount are matched in
 * weight and the amount is made the larger of the two, with both kept clearly
 * above the 15px body rows.
 *
 * (0,4,3) — beats that rule at (0,2,4) on the class column.
 */
.breakdance-woocommerce .woocommerce-checkout .woocommerce-checkout-review-order-table tfoot tr.order-total > th {
	font-size: 16px;
	font-weight: 500;
	color: var(--pwu-ink);
}

.breakdance-woocommerce .woocommerce-checkout-review-order-table tfoot tr.order-total > td strong {
	font-size: 20px;
	font-weight: 500;
	color: var(--pwu-ink);
}

/*
 * "(inkl. CHF 17 MWST)" was breaking mid-parenthetical and orphaning "MWST)".
 * The equivalent cart-page rule is scoped to .cart_totals, which is why it
 * never reached checkout. Give it its own line, drop the parentheses' job of
 * holding it together, and forbid the break outright.
 */
.breakdance-woocommerce .woocommerce-checkout-review-order-table tfoot tr.order-total .includes_tax,
.breakdance-woocommerce .woocommerce-checkout-review-order-table tfoot tr.order-total > td small {
	display: block;
	margin-top: 4px;
	color: var(--pwu-ink-soft);
	font-size: 12px;
	font-weight: 400;
	line-height: 1.4;
	white-space: nowrap;
}

.breakdance-woocommerce .woocommerce-checkout-review-order-table tfoot tr.order-total .includes_tax .amount {
	font-size: inherit;
	font-weight: inherit;
	color: inherit;
	white-space: nowrap;
}

/*
 * Narrow viewports: give the shipping options the full column.
 *
 * The review table keeps its two-column shape on mobile, so at 375px "Sendung"
 * took the left half and left the options ~99px — every one of them broke into
 * two-word fragments across three lines, which reads as broken rather than
 * tight.
 *
 * Only the shipping row is stacked. Subtotal and total are deliberately left
 * as label/amount pairs: a right-aligned figure beside its label is legible at
 * any width, and stacking them would cost vertical space for nothing.
 *
 * (0,3,3) — the cells; (0,3,2) — the row.
 */
@media (max-width: 479px) {
	/*
	 * This one declaration is what makes the rest of the block work.
	 *
	 * Setting `display: block` on the row alone is inert: a block-level child of
	 * a `display: table-footer-group` is wrapped by the browser in an ANONYMOUS
	 * table row + cell, and that anonymous cell is still sized by the table's
	 * first column. `width: 100%` on the row and its cells then resolves against
	 * the anonymous cell (~164px), not the review column — so "Sendung" moved
	 * above the options but the options stayed in a ~107px gutter and kept
	 * fragmenting.
	 *
	 * Releasing the tfoot from table layout removes the anonymous wrapper, so
	 * its children become ordinary block boxes and 100% finally means the
	 * column. `width: 100%` on the row/cells and `display: block` on the table
	 * were both tried and neither moves it.
	 *
	 * thead and tbody are released with it — see the next rule for why that is
	 * not optional.
	 */
	.breakdance-woocommerce .woocommerce-checkout-review-order-table tfoot {
		display: block;
	}

	/*
	 * Releasing the tfoot alone overflows the table.
	 *
	 * The tfoot's narrow cells were also what held the table's column widths to
	 * the 320px container. Once it is out of the column-width algorithm, only
	 * thead + tbody drive it, and they resolve to 294 + 156 = 450px inside a
	 * 320px container: the "ZWISCHENSUMME" header truncates to "ZWIS…" and the
	 * line-item price cell is clipped mid-glyph — the customer cannot read what
	 * the item costs. An ancestor carries `overflow: clip`, so
	 * documentElement.scrollWidth still reports 360 and the overflow does NOT
	 * show up in a routine check; body.scrollWidth reports the real 470.
	 *
	 * Releasing thead and tbody too takes the whole table out of table layout,
	 * so no column algorithm runs at all and every part sits at the container's
	 * 320px.
	 *
	 * Rejected, all tested against the live page — do not retry:
	 *   width: 100%          — inert
	 *   max-width: 100%      — inert
	 *   table-layout: fixed  — inert on its own
	 *   table { display: block } — inert
	 *   width: 100% + table-layout: fixed — cures the overflow but puts the
	 *     shipping labels back onto three lines, which is what this block exists
	 *     to fix.
	 */
	.breakdance-woocommerce .woocommerce-checkout-review-order-table thead,
	.breakdance-woocommerce .woocommerce-checkout-review-order-table tbody {
		display: block;
	}

	/*
	 * With the tfoot out of table layout, the subtotal and total rows lose the
	 * shared column geometry that kept their amounts flush — each row became its
	 * own anonymous table with independently computed columns (amounts ending at
	 * x 252 and x 298). Flex restores label-left / value-right and re-aligns the
	 * amounts without re-entering table layout, which would undo the fix above.
	 */
	.breakdance-woocommerce .woocommerce-checkout-review-order-table tfoot tr.cart-subtotal,
	.breakdance-woocommerce .woocommerce-checkout-review-order-table tfoot tr.order-total {
		display: flex;
		justify-content: space-between;
		align-items: baseline;
	}

	/*
	 * The total's hairline is drawn on the row here, not on its cells.
	 *
	 * Above this breakpoint the row is a real table-row, its th and td are
	 * adjacent cells of equal height, and a border-top on each renders as one
	 * continuous line — which is why the rule up in §12 puts it there and why
	 * this override is scoped to the media query rather than replacing it.
	 *
	 * Under flex that stops being true twice over: `align-items: baseline`
	 * drops the 16px label's box ~4px below the 20px amount's, so the two
	 * segments sit at different y (1994.17 vs 1990.17), and
	 * `justify-content: space-between` opens a 26px gap between them that
	 * neither cell paints. The result reads as two stepped dashes, not a rule.
	 *
	 * Moving the border and its padding onto the flex container gives one
	 * segment spanning the full row, independent of how the items inside are
	 * aligned or distributed.
	 */
	.breakdance-woocommerce .woocommerce-checkout .woocommerce-checkout-review-order-table tfoot tr.order-total {
		border-top: 1px solid var(--pwu-line);
		padding-top: 16px;
	}

	.breakdance-woocommerce .woocommerce-checkout .woocommerce-checkout-review-order-table tfoot tr.order-total > th,
	.breakdance-woocommerce .woocommerce-checkout .woocommerce-checkout-review-order-table tfoot tr.order-total > td {
		border-top: 0;
		padding-top: 0;
	}

	.breakdance-woocommerce .woocommerce-checkout-review-order-table tfoot tr.woocommerce-shipping-totals {
		display: block;
	}

	.breakdance-woocommerce .woocommerce-checkout-review-order-table tfoot tr.woocommerce-shipping-totals > th,
	.breakdance-woocommerce .woocommerce-checkout-review-order-table tfoot tr.woocommerce-shipping-totals > td {
		display: block;
		width: 100%;
	}

	.breakdance-woocommerce .woocommerce-checkout-review-order-table tfoot tr.woocommerce-shipping-totals > th {
		padding-bottom: 6px;
	}

	.breakdance-woocommerce .woocommerce-checkout-review-order-table tfoot tr.woocommerce-shipping-totals > td {
		padding-top: 0;
	}
}

/* -------------------------------------------------------------------------
 * 13. Checkout — "Lieferung an eine andere Adresse senden?"
 *
 * WooCommerce already gives us the ideal markup for a switch:
 *
 *   <h3 id="ship-to-different-address">
 *     <label class="… woocommerce-form__label-for-checkbox checkbox">
 *       <input id="ship-to-different-address-checkbox" type="checkbox" name="ship_to_different_address" …>
 *       <span>Lieferung an eine andere Adresse senden?</span>
 *     </label>
 *   </h3>
 *
 * so the switch is drawn ON the real checkbox with appearance: none, rather
 * than hiding it behind a div. checkout.js keeps binding the same element, the
 * space key still toggles it, the focus ring lands on the actual control and
 * the checked state is exposed natively — no ARIA required and no JS added.
 * ---------------------------------------------------------------------- */

/* Sentence case: the global label token is right for field labels, not for this
   sentence. (0,2,2) beats it at (0,1,1). */
.breakdance-woocommerce .woocommerce-shipping-fields h3 label {
	text-transform: none;
	letter-spacing: normal;
	font-size: 15px;
	font-weight: 400;
	line-height: 1.4;
	color: var(--pwu-ink);
	gap: 12px;
}

/*
 * The switch itself. (0,4,1) — beats Breakdance's
 * `.breakdance-woocommerce input[type=checkbox]` at (0,2,1), including the
 * checked-state SVG tick it paints as a background-image.
 */
.breakdance-woocommerce .woocommerce-shipping-fields .woocommerce-form__label-for-checkbox input[type="checkbox"] {
	appearance: none;
	-webkit-appearance: none;
	position: relative;
	flex: 0 0 auto;
	width: 40px;
	height: 24px;
	margin: 0;
	padding: 0;
	border: 1px solid var(--pwu-line);
	border-radius: 999px;
	background-color: var(--pwu-surface);
	background-image: none;
	cursor: pointer;
	transition: background-color 0.18s ease, border-color 0.18s ease;
}

/* Knob. */
.breakdance-woocommerce .woocommerce-shipping-fields .woocommerce-form__label-for-checkbox input[type="checkbox"]::before {
	content: "";
	position: absolute;
	top: 50%;
	left: 3px;
	width: 16px;
	height: 16px;
	border-radius: 50%;
	background-color: var(--pwu-ink-faint);
	transform: translateY(-50%);
	transition: transform 0.18s ease, background-color 0.18s ease;
}

.breakdance-woocommerce .woocommerce-shipping-fields .woocommerce-form__label-for-checkbox input[type="checkbox"]:checked {
	border-color: var(--pwu-ink);
	background-color: var(--pwu-ink);
	background-image: none;
}

.breakdance-woocommerce .woocommerce-shipping-fields .woocommerce-form__label-for-checkbox input[type="checkbox"]:checked::before {
	background-color: var(--pwu-on-dark);
	transform: translateY(-50%) translateX(16px);
}

/* Visible focus ring on the real control. */
.breakdance-woocommerce .woocommerce-shipping-fields .woocommerce-form__label-for-checkbox input[type="checkbox"]:focus-visible {
	outline: 2px solid var(--pwu-ink);
	outline-offset: 2px;
}

/*
 * The revealed fields as a subordinate panel rather than a second equal-weight
 * form. Only box properties are set — checkout.js owns .shipping_address's
 * inline display via slideToggle, so nothing here touches display.
 */
/*
 * Surface, not Canvas. Canvas is the page background — filling the panel with
 * it made the tint a no-op and left the block reading from its border alone.
 * The site's convention is Canvas page / Surface for contained blocks (the same
 * call the account dashboard cards use), and it matches the white billing
 * fields that sit inside this panel.
 */
.breakdance-woocommerce .woocommerce-shipping-fields .shipping_address {
	margin-top: 16px;
	padding: 20px;
	border: 1px solid var(--pwu-line);
	border-radius: 2px;
	background-color: var(--pwu-surface);
}
