/**
 * Nasionka Cart 2.0 — scoped drawer styles.
 *
 * EVERYTHING is scoped to #cart-popup.nasionka-cart-2 (the scope class is
 * added by JS on init). Without the class:
 *   - Cart 2.0 modules stay hidden,
 *   - the native Flatsome cart renders untouched.
 * => JS failure or plugin off = Cart 1.0. Progressive enhancement.
 *
 * Design tokens (overridable from admin via inline :root):
 *   --nc2-primary   #8AC429  official brand primary (CTA)
 *   --nc2-dark      #2E5E1F
 *   --nc2-surface   #FBFAF6
 *   --nc2-radius    14px
 *   --nc2-drawer-max 640px
 */

:root {
	--nc2-primary: #8AC429;
	--nc2-dark: #2E5E1F;
	--nc2-surface: #FBFAF6;
	--nc2-ink: #333333;
	--nc2-muted: #7a7a72;
	--nc2-line: #ecebe4;
	--nc2-radius: 14px;
	--nc2-drawer-max: 640px;
}

/* Modules are inert until the scope class exists. */
#cart-popup .nc2-module { display: none; }

/* ===================================================================== */
/* Drawer width — same cart, more room on bigger screens                 */
/* ===================================================================== */

@media (max-width: 849px) {
	.mfp-content.off-canvas-cart.nc2-drawer,
	.nc2-drawer .off-canvas-cart { width: 100vw !important; max-width: 100vw !important; }
}
@media (min-width: 850px) and (max-width: 1199px) {
	.mfp-content.off-canvas-cart.nc2-drawer,
	.nc2-drawer .off-canvas-cart { width: clamp(500px, 46vw, 600px) !important; max-width: 600px !important; }
}
@media (min-width: 1200px) {
	.mfp-content.off-canvas-cart.nc2-drawer,
	.nc2-drawer .off-canvas-cart { width: clamp(560px, 34vw, var(--nc2-drawer-max)) !important; max-width: var(--nc2-drawer-max) !important; }
}

/* ===================================================================== */
/* Opaque drawer background (Patch 1.31)                                 */
/*                                                                         */
/* On some mobile browsers the page behind the drawer was visible through */
/* it, especially below the progress section. None of our ancestors ever  */
/* declared an explicit opaque background, so painting stopped wherever   */
/* Flatsome's own background rule happened not to reach. Fixed by setting */
/* white explicitly at every layer of the drawer chain — belt-and-braces, */
/* CSS only, strictly scoped to the active Cart 2.0 classes so Cart 1.0   */
/* and the rest of the site are completely unaffected.                   */
/* ===================================================================== */
.mfp-content.off-canvas-cart.nc2-drawer {
	background: #fff;
}
#cart-popup.nasionka-cart-2,
#cart-popup.nasionka-cart-2 .cart-popup-inner,
#cart-popup.nasionka-cart-2 .widget_shopping_cart,
#cart-popup.nasionka-cart-2 .widget_shopping_cart_content {
	background: #fff;
}

/* ===================================================================== */
/* Fixed overlay layer (Patch 1.32 §1, §7, §8)                           */
/*                                                                         */
/* PATCH 1.32 §1 ROOT CAUSE: in 1.31 this bar was position:fixed INSIDE   */
/* #cart-popup. Flatsome animates the drawer with a CSS transform, and a  */
/* transformed ancestor becomes the containing block for fixed children — */
/* so the bar was fixed to the scrolling cart content and parked wherever */
/* it first appeared (around the 5th product) instead of tracking the     */
/* viewport.                                                              */
/*                                                                         */
/* Now cart.js moves the bar into THIS layer, which lives on <body> —     */
/* outside every transformed ancestor — and keeps its left/width aligned  */
/* to the open drawer's real bounding box. The layer also hosts the       */
/* scroll hint and back-to-top so all three share one positioning path.   */
/* ===================================================================== */
.nc2-fixed-layer {
	position: fixed;
	bottom: 0;
	/* PATCH 1.33: width comes from CSS, mirroring .nc2-drawer's breakpoints,
	   so the layer is correctly sized even when init() runs while the drawer
	   is still animating open and measures 0 wide. JS only refines this when
	   measurement returns something sane — it is no longer a prerequisite. */
	right: 0;
	width: 100vw;
	z-index: 100001;      /* above the drawer, below the undo toast (100002) */
	display: none;         /* off unless the drawer is genuinely open */
	pointer-events: none;  /* only the children opt back in */
	font-family: "Raleway", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
}
.nc2-fixed-layer.nc2-layer-on { display: block; }
@media (min-width: 850px) and (max-width: 1199px) {
	.nc2-fixed-layer { width: clamp(500px, 46vw, 600px); }
}
@media (min-width: 1200px) {
	.nc2-fixed-layer { width: clamp(560px, 34vw, var(--nc2-drawer-max)); }
}

/* ---- sticky checkout bar ---- */
.nc2-fixed-layer .nc2-sticky-slot {
	transform: translateY(102%);
	transition: transform 0.18s ease;
	will-change: transform;
}
.nc2-fixed-layer.nc2-show-cta .nc2-sticky-slot {
	transform: none;
	pointer-events: auto;
}
.nc2-fixed-layer .nc2-sticky-cta {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 14px;
	padding: 10px 16px calc(10px + env(safe-area-inset-bottom, 0));
	background: #fff;
	border-top: 1px solid var(--nc2-line);
	box-shadow: 0 -8px 20px rgba(0, 0, 0, 0.08);
}
.nc2-fixed-layer .nc2-sticky-cta__total {
	display: flex;
	flex-direction: column;
	line-height: 1.2;
	min-width: 0;
}
.nc2-fixed-layer .nc2-sticky-cta__total-label {
	font-size: 11px;
	color: var(--nc2-muted);
}
/* 1.34 §2 + 1.35 §1 + 1.351 §8 — readable, but the CTA stays dominant.
   17px -> 15px -> 14.25px. Weight deliberately left at 600 (§8: stop fighting
   font-weight); ONLY the sticky bar's amount is affected — the final order
   summary total is untouched. */
.nc2-fixed-layer .nc2-sticky-cta__total-amount {
	font-size: 14.25px;
	font-weight: 600;
	color: var(--nc2-ink);
	white-space: nowrap;
}

/* §2 — arrow alignment. ONE flex row, align-items:center, no absolute
   positioning and no translateY correction: the arrow simply sits at the end
   of the row and is vertically centred by the flex container itself. The
   label takes the free space so the arrow stays hard right. */
/* §1 — the sticky bar is a persistent SHORTCUT, so it must read as secondary
   to the filled-green final CTA. Outline treatment: white fill, brand-green
   border, green label AND green arrow. The final CTA is untouched. */
.nc2-fixed-layer .nc2-sticky-cta__btn,
.nc2-fixed-layer .nc2-sticky-cta__btn.nc2-btn--primary {
	background: #fff;
	color: var(--nc2-dark);
	border: 2px solid var(--nc2-primary);
	box-shadow: none;
}
.nc2-fixed-layer .nc2-sticky-cta__btn .nc2-checkout__label,
.nc2-fixed-layer .nc2-sticky-cta__btn .nc2-checkout__arrow {
	color: var(--nc2-dark);
}
@media (hover: hover) {
	.nc2-fixed-layer .nc2-sticky-cta__btn:hover {
		background: var(--nc2-surface);
		border-color: var(--nc2-dark);
		filter: none;
	}
}

.nc2-fixed-layer .nc2-sticky-cta__btn {
	display: inline-flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	width: auto;
	min-height: 46px;
	padding: 0 18px;
	flex: 0 1 auto;
	line-height: 1;
	text-decoration: none;
}
.nc2-fixed-layer .nc2-sticky-cta__btn .nc2-checkout__label {
	position: static;
	line-height: 1;
}
/* Override the main CTA's absolutely-positioned arrow inside this button. */
.nc2-fixed-layer .nc2-sticky-cta__btn .nc2-checkout__arrow {
	position: static;
	transform: none;
	top: auto;
	right: auto;
	display: inline-flex;
	align-items: center;
	font-size: 17px;
	line-height: 1;
}

/* ---- scroll navigation (1.35 §7/§8) --------------------------------
   Both controls are small, quiet, circular chevrons sharing one visual
   language and one stacking position, so they can never overlap each other
   or the sticky bar.

   PATCH 1.35 ROOT CAUSE (↓ never visible): the previous rule
   `.nc2-show-cta .nc2-scroll-hint { opacity: 0 }` force-hid the hint whenever
   the sticky CTA was showing. On a genuinely long cart the final CTA is
   off-screen the moment the drawer opens, so the sticky bar is showing
   immediately — meaning the hint was suppressed at exactly the moment it was
   supposed to appear. It could never be seen on the only carts it exists for.
   The two are now mutually exclusive in JS (§9) and stacked, not suppressed. */
.nc2-fixed-layer .nc2-nav-btn {
	position: absolute;
	right: 14px;
	bottom: 14px;
	width: 36px;
	height: 36px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	padding: 0;
	margin: 0;
	border: 1px solid var(--nc2-line);
	/* PATCH 1.4 §1 — these two controls are the ONLY <button> elements Cart 2.0
	   renders (both CTAs are <a> links), so they are the only things Flatsome's
	   global customizer button-radius rule — which ships with !important — can
	   reach. That override is what made them read as rounded squares despite
	   the 50% here. Matching !important restores the circle; box-sizing and the
	   fixed width/height keep it a true circle regardless of theme padding. */
	border-radius: 50% !important;
	box-sizing: border-box;
	flex: 0 0 auto;
	min-width: 0;
	line-height: 1;
	background: rgba(255, 255, 255, 0.96);
	color: var(--nc2-dark);
	box-shadow: 0 2px 10px rgba(0, 0, 0, 0.10);
	cursor: pointer;
	opacity: 0;
	visibility: hidden;
	transition: opacity 0.18s ease, visibility 0.18s, bottom 0.18s ease;
}
.nc2-fixed-layer.nc2-show-hint .nc2-scroll-down,
.nc2-fixed-layer.nc2-show-top .nc2-to-top {
	opacity: 1;
	visibility: visible;
	pointer-events: auto;
}
/* Accidental-click protection after ↑ (1.4 §2, shortened to 200ms in 1.4.1):
   the bar still appears normally, it simply cannot be activated in that window. */
.nc2-fixed-layer.nc2-cta-guard .nc2-sticky-slot { pointer-events: none; }

/* PATCH 1.4.1 §2 — DESKTOP ONLY: lift ↑ 24px so that after clicking it the
   cursor sits ABOVE the sticky checkout CTA that appears, rather than directly
   over it. Applies to ↑ alone (↓ keeps its approved position; the two are
   never visible at the same time). Right alignment, circular holder, size,
   border and behaviour are all unchanged. Mobile ↑ is untouched. */
@media (min-width: 850px) {
	/* 1.4.2 §5: a further +8px on top of 1.4.1's +24px (base 14 -> 38 -> 46,
	   and 78 -> 102 -> 110), applied to BOTH vertical states so the margin
	   holds whether or not the sticky bar is showing. */
	.nc2-fixed-layer .nc2-to-top { bottom: 46px; }                 /* 14 + 24 + 8 */
	.nc2-fixed-layer.nc2-show-cta .nc2-to-top {
		bottom: calc(110px + env(safe-area-inset-bottom, 0));      /* 78 + 24 + 8 */
	}
}

/* Lift clear of the checkout bar whenever that bar is showing — they share
   the same corner, so the offset applies to both. */
.nc2-fixed-layer.nc2-show-cta .nc2-nav-btn {
	bottom: calc(78px + env(safe-area-inset-bottom, 0));
}
.nc2-fixed-layer .nc2-nav-btn:focus-visible {
	outline: 2px solid var(--nc2-primary);
	outline-offset: 2px;
}
@media (hover: hover) {
	.nc2-fixed-layer .nc2-nav-btn:hover { border-color: var(--nc2-primary); }
}

/* Bottom clearance lives with the canonical .nc2-bottom rule further down. */

/* PATCH 1.4.3 §2 — neutral loading state, used ONLY while a genuinely stale
   fragment is being refreshed. Hides Flatsome's native chrome (so it can't
   read as "Cart 1.0") and shows a quiet placeholder instead. Bounded by a
   2.5s timeout in cart.js — if Cart 2.0 truly cannot initialise, this class is
   removed and the real Cart 1.0 fail-safe shows through unchanged. */
#cart-popup.nc2-booting .ux-mini-cart-footer,
#cart-popup.nc2-booting .woocommerce-mini-cart__total,
#cart-popup.nc2-booting .woocommerce-mini-cart__buttons,
#cart-popup.nc2-booting .woocommerce-mini-cart__empty-message {
	visibility: hidden;
}
#cart-popup.nc2-booting .cart-popup-inner::after {
	content: '';
	display: block;
	width: 26px;
	height: 26px;
	margin: 28px auto;
	border: 2px solid var(--nc2-line, #e7e5df);
	border-top-color: var(--nc2-primary, #8AC429);
	border-radius: 50%;
	animation: nc2-spin 0.7s linear infinite;
}
@keyframes nc2-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) {
	#cart-popup.nc2-booting .cart-popup-inner::after { animation: none; }
}

/* ===================================================================== */
/* Scoped root                                                            */
/* ===================================================================== */

#cart-popup.nasionka-cart-2 {
	font-family: "Raleway", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
	color: var(--nc2-ink);
}

#cart-popup.nasionka-cart-2 .nc2-module { display: block; }

/* ONE natural scroll surface.
   PATCH 1.1: HTML.txt confirms Magnific Popup scrolls .mfp-wrap
   (style="overflow: hidden auto"), NOT #cart-popup. So Cart 2.0 must not
   create a second scrolling box anywhere — no nested overflow, no fixed
   heights on the product list. The drawer scrolls as one surface. */
#cart-popup.nasionka-cart-2 .cart-popup-inner {
	display: flex;
	flex-direction: column;
	min-height: 100%;
	overflow: visible !important;
}
#cart-popup.nasionka-cart-2 .widget_shopping_cart,
#cart-popup.nasionka-cart-2 .widget_shopping_cart_content {
	display: flex;
	flex-direction: column;
	flex: 1 1 auto;
	min-height: 0;
	overflow: visible !important;
	max-height: none !important;
}

/* PATCH 1.1 — mobile: reclaim above-the-fold space taken by the redundant
   "KOSZYK" heading + divider. Hubert becomes the first meaningful content.
   The Flatsome close control (.mfp-close) is untouched and stays visible. */
@media (max-width: 849px) {
	#cart-popup.nasionka-cart-2 .cart-popup-title { display: none !important; }
	#cart-popup.nasionka-cart-2 .cart-popup-inner { padding-top: 8px; }
}
/* Tablet/desktop keep the compact heading — there is room for the context. */
/* Desktop keeps the KOSZYK title, but restrained: the decorative divider is
   removed because it ate space without adding hierarchy (v1.3 §25). */
@media (min-width: 850px) {
	#cart-popup.nasionka-cart-2 .cart-popup-title { margin-bottom: 2px; padding-bottom: 0; }
	#cart-popup.nasionka-cart-2 .cart-popup-title .is-divider { display: none; }
	#cart-popup.nasionka-cart-2 .cart-popup-title span { font-size: 15px; letter-spacing: 0.06em; }
}

/* Hide native footer + native empty message — Cart 2.0 owns those.
   (Only inside the scoped root: no class => untouched Cart 1.0.) */
/* Native Flatsome/WooCommerce cart chrome, hidden ONLY inside the active
   Cart 2.0 scope. v1.3 §18 adds the empty-state variants that caused the
   duplicated "empty cart" message and second "back to shop" button. */
#cart-popup.nasionka-cart-2 .ux-mini-cart-footer,
#cart-popup.nasionka-cart-2 .woocommerce-mini-cart__total,
#cart-popup.nasionka-cart-2 .woocommerce-mini-cart__buttons,
#cart-popup.nasionka-cart-2 .woocommerce-mini-cart__empty-message,
#cart-popup.nasionka-cart-2 .cart-popup-inner > .widget_shopping_cart > .woocommerce-mini-cart__empty-message,
#cart-popup.nasionka-cart-2 .widget_shopping_cart_content > p.woocommerce-mini-cart__empty-message,
#cart-popup.nasionka-cart-2 .widget_shopping_cart_content > .wc-empty-cart-message,
#cart-popup.nasionka-cart-2 .widget_shopping_cart_content > .return-to-shop,
#cart-popup.nasionka-cart-2 .widget_shopping_cart_content > .cart-empty {
	display: none !important;
}

/* Sections order: top (Hubert/progress) -> products -> bottom (rest). */
#cart-popup.nasionka-cart-2 .nc2-top { order: 1; }
#cart-popup.nasionka-cart-2 .woocommerce-mini-cart { order: 2; }
/* padding-bottom (1.32 §1): clearance so the sticky bar can never hide the
   last row / social proof — content always scrolls clear above it. */
#cart-popup.nasionka-cart-2 .nc2-bottom { order: 3; margin-top: auto; padding-bottom: 84px; }

/* ===================================================================== */
/* Buttons                                                                */
/* ===================================================================== */

#cart-popup.nasionka-cart-2 .nc2-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 8px;
	min-height: 44px;
	padding: 10px 20px;
	border: 0;
	border-radius: calc(var(--nc2-radius) - 4px);
	font-family: inherit;
	font-weight: 700;
	font-size: 15px;
	letter-spacing: 0.02em;
	line-height: 1.2;
	cursor: pointer;
	text-decoration: none;
	transition: filter 0.15s ease, transform 0.1s ease;
}
#cart-popup.nasionka-cart-2 .nc2-btn:hover { filter: brightness(0.96); }
#cart-popup.nasionka-cart-2 .nc2-btn:active { transform: translateY(1px); }
#cart-popup.nasionka-cart-2 .nc2-btn:focus-visible {
	outline: 3px solid var(--nc2-dark);
	outline-offset: 2px;
}

#cart-popup.nasionka-cart-2 .nc2-btn--primary {
	width: 100%;
	background: var(--nc2-primary); /* Official #8AC429 — never sampled from mockup. */
	color: #fff;
	font-size: 16px;
	min-height: 52px;
	border-radius: calc(var(--nc2-radius) - 2px);
}
#cart-popup.nasionka-cart-2 .nc2-btn--primary.is-disabled {
	background: #c9c9c2;
	cursor: not-allowed;
	filter: none;
}

/* v1.3 §13 — the WORD is centred in the button; the arrow is a separate
   element pinned to the right, so it cannot push "ZAMAWIAM" off-centre.
   (An inline "ZAMAWIAM →" string centres the whole string, which optically
   shifts the word left by half the arrow width.) */
#cart-popup.nasionka-cart-2 .nc2-checkout {
	position: relative;
	display: flex;
	align-items: center;
	justify-content: center;
}
#cart-popup.nasionka-cart-2 .nc2-checkout__label {
	display: block;
	text-align: center;
}
/* PATCH 1.34 §3 — mobile arrow STILL off-axis after the 1.33 flex change.
   Remaining causes addressed here, mobile-only so desktop is untouched:
   the button/label inherit a Flatsome mobile `line-height` that makes the
   label's line box taller than the glyph's, and the theme can attach its own
   ::after to .button — a second, differently-positioned arrow. Both are
   neutralised and the glyph is centred by flex alone. */
@media (max-width: 849px) {
	#cart-popup.nasionka-cart-2 .nc2-checkout {
		line-height: 1;
	}
	#cart-popup.nasionka-cart-2 .nc2-checkout .nc2-checkout__label {
		line-height: 1;
		display: block;
	}
	#cart-popup.nasionka-cart-2 .nc2-checkout::after,
	#cart-popup.nasionka-cart-2 .nc2-checkout::before {
		content: none !important;
	}
	#cart-popup.nasionka-cart-2 .nc2-checkout__arrow {
		line-height: 1;
		font-size: 17px;
	}
}

/* PATCH 1.33 §4 — mobile arrow was visibly off-axis while desktop was fine.
   Cause: `top: 50%` + `translateY(-50%)` centres the arrow's LINE BOX, whose
   height depends on inherited line-height — and Flatsome's mobile button
   styles give the CTA a different line-height than desktop, so the glyph
   drifted off the text's optical axis. Replaced with a full-height flex box:
   the arrow is centred by the flex container itself, independent of any
   inherited line-height, at every breakpoint. Desktop result is unchanged. */
#cart-popup.nasionka-cart-2 .nc2-checkout__arrow {
	position: absolute;
	right: 18px;
	top: 0;
	bottom: 0;
	display: flex;
	align-items: center;
	font-size: 17px;
	line-height: 1;
	transition: transform 0.18s ease;
}
@media (hover: hover) {
	#cart-popup.nasionka-cart-2 .nc2-checkout:hover .nc2-checkout__arrow {
		transform: translateX(3px);
	}
}
#cart-popup.nasionka-cart-2 .nc2-btn--secondary {
	background: var(--nc2-dark);
	color: #fff;
}

/* v1.3 §10/§28 — SECONDARY action. Solid brand green is reserved for the ONE
   primary action (ZAMAWIAM); upsell adds and the coupon are calm outlines so
   the customer never faces four equally loud green buttons. */
#cart-popup.nasionka-cart-2 .nc2-btn--ghost {
	background: #fff;
	color: var(--nc2-dark);
	border: 1.5px solid var(--nc2-primary);
	min-height: 38px;
	padding: 8px 14px;
	font-size: 13px;
	font-weight: 700;
	white-space: nowrap;
	border-radius: 999px;
}
@media (hover: hover) {
	#cart-popup.nasionka-cart-2 .nc2-btn--ghost:hover {
		background: var(--nc2-primary);
		color: #fff;
		filter: none;
	}
}
#cart-popup.nasionka-cart-2 .nc2-btn--ghost:disabled { opacity: 0.55; cursor: default; }

/* ===================================================================== */
/* Empty state — the simplest state in the whole cart                    */
/* ===================================================================== */

/* v1.3 — the start experience. Optically centred: the block sits a little
   ABOVE the mathematical middle (justify-content: center + padding-bottom
   larger than padding-top) so the CTA never feels buried at the bottom. */
#cart-popup.nasionka-cart-2 .nc2-empty {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	text-align: center;
	min-height: min(62vh, 460px);
	padding: 24px 22px 64px;
}
#cart-popup.nasionka-cart-2 .nc2-empty__art {
	width: clamp(140px, 42vw, 180px);   /* mobile 140–180px (§20) */
	margin: 0 auto 18px;
	line-height: 0;
}
#cart-popup.nasionka-cart-2 .nc2-empty__art img {
	width: 100%;
	height: auto;
	max-height: 220px;
	object-fit: contain;
	display: block;
}
#cart-popup.nasionka-cart-2 .nc2-empty__title {
	font-size: 21px;
	font-weight: 700;
	color: var(--nc2-dark);
	line-height: 1.25;
	margin: 0 0 10px;
	text-wrap: balance;
}
#cart-popup.nasionka-cart-2 .nc2-empty__subtitle {
	font-size: 14.5px;
	color: var(--nc2-muted);
	line-height: 1.45;
	max-width: 30ch;
	margin: 0 0 24px;
}
#cart-popup.nasionka-cart-2 .nc2-empty__cta {
	width: auto;
	min-width: 220px;
	max-width: 100%;
	padding-left: 28px;
	padding-right: 28px;
}
@media (min-width: 850px) {
	#cart-popup.nasionka-cart-2 .nc2-empty__art { width: clamp(180px, 26vw, 220px); }
	#cart-popup.nasionka-cart-2 .nc2-empty__title { font-size: 23px; }
}
/* Patch 1.31 §15 — mobile-only refinement. Desktop empty state (above) is
   deliberately left untouched. */
@media (max-width: 849px) {
	#cart-popup.nasionka-cart-2 .nc2-empty__art {
		width: clamp(122px, 37vw, 158px); /* ~12% smaller than the 140–180px base */
		margin: 0 auto 8px;                /* was 18px — ~10px tighter before the heading */
	}
}

/* v1.3 §18 — native empty markup suppressed ONLY inside the active Cart 2.0
   scope (JS adds this class to non-Cart-2.0 siblings while the start state is
   showing). Never a global rule: Cart 1.0 must stay intact if we're off. */
#cart-popup.nasionka-cart-2 .nc2-native-hidden { display: none !important; }

/* ===================================================================== */
/* Hubert — appears ONCE; host, not salesperson                          */
/* ===================================================================== */

#cart-popup.nasionka-cart-2 .nc2-hubert {
	display: flex;
	align-items: flex-start;
	gap: 12px;
	padding: 16px 16px 6px;
}
#cart-popup.nasionka-cart-2 .nc2-hubert__avatar img {
	width: 64px;
	height: 64px;
	border-radius: 50%;
	object-fit: cover;
	background: var(--nc2-surface);
	display: block;
}
#cart-popup.nasionka-cart-2 .nc2-hubert__bubble {
	position: relative;
	flex: 1;
	background: var(--nc2-surface);
	border: 1px solid var(--nc2-line);
	border-radius: var(--nc2-radius);
	border-top-left-radius: 4px;
	padding: 12px 14px;
	font-size: 15px;
	line-height: 1.45;
	color: var(--nc2-ink);
}
#cart-popup.nasionka-cart-2 .nc2-hubert__bubble::before {
	content: "";
	position: absolute;
	left: -7px;
	top: 16px;
	width: 12px;
	height: 12px;
	background: var(--nc2-surface);
	border-left: 1px solid var(--nc2-line);
	border-bottom: 1px solid var(--nc2-line);
	transform: rotate(45deg);
}

/* ===================================================================== */
/* Progress — one bar, three milestones, ONE active target               */
/* ===================================================================== */

#cart-popup.nasionka-cart-2 .nc2-progress { padding: 14px 24px 6px; }

#cart-popup.nasionka-cart-2 .nc2-progress__track {
	position: relative;
	height: 6px;
	border-radius: 999px;
	background: var(--nc2-line);
}
#cart-popup.nasionka-cart-2 .nc2-progress__fill {
	height: 100%;
	border-radius: 999px;
	background: linear-gradient(90deg, var(--nc2-dark), var(--nc2-primary));
	transition: width 0.45s cubic-bezier(0.25, 0.8, 0.35, 1);
	min-width: 6px; /* seed-like start cap — real math, "you've started" feel */
}
#cart-popup.nasionka-cart-2 .nc2-progress__dot {
	position: absolute;
	top: 50%;
	transform: translate(-50%, -50%);
	width: 18px;
	height: 18px;
	border-radius: 50%;
	background: #fff;
	border: 2px solid var(--nc2-line);
	display: inline-flex;
	align-items: center;
	justify-content: center;
	color: #fff;
	transition: background 0.3s ease, border-color 0.3s ease;
}
#cart-popup.nasionka-cart-2 .nc2-progress__dot svg { width: 11px; height: 11px; }
#cart-popup.nasionka-cart-2 .nc2-progress__dot.is-reached {
	background: var(--nc2-primary);
	border-color: var(--nc2-primary);
}
#cart-popup.nasionka-cart-2 .nc2-progress__dot.is-active { border-color: var(--nc2-primary); }
#cart-popup.nasionka-cart-2 .nc2-progress__dot.is-quiet { width: 12px; height: 12px; opacity: 0.65; }

#cart-popup.nasionka-cart-2 .nc2-progress__labels {
	position: relative;
	min-height: 48px; /* fits amount + a two-line wrapped Polish label */
	margin-top: 8px;
}
/* PATCH 1.1 — each label lives in its own exclusive band (width + left come
   from PHP, computed from the real thresholds), so £25 and £35 can never
   collide at any viewport width. Labels wrap instead of shrinking. */
#cart-popup.nasionka-cart-2 .nc2-progress__label {
	position: absolute;
	top: 0;
	box-sizing: border-box;
	font-size: 11.5px;
	color: var(--nc2-muted);
	line-height: 1.25;
	white-space: normal;
	overflow-wrap: break-word;
	hyphens: auto;
	padding: 0 2px;
}
#cart-popup.nasionka-cart-2 .nc2-progress__label.nc2-align-start { text-align: left; padding-left: 0; }
#cart-popup.nasionka-cart-2 .nc2-progress__label.nc2-align-center { text-align: center; }
#cart-popup.nasionka-cart-2 .nc2-progress__label.nc2-align-end { text-align: right; padding-right: 0; }

#cart-popup.nasionka-cart-2 .nc2-progress__label b {
	display: block;
	font-size: 12.5px;
	font-weight: 700;
	color: var(--nc2-ink);
	white-space: nowrap; /* the amount itself never breaks */
}
#cart-popup.nasionka-cart-2 .nc2-progress__label i { font-style: normal; display: block; }
#cart-popup.nasionka-cart-2 .nc2-progress__label.is-active b { color: var(--nc2-dark); }
#cart-popup.nasionka-cart-2 .nc2-progress__label.is-active { color: var(--nc2-dark); font-weight: 600; }
#cart-popup.nasionka-cart-2 .nc2-progress__label.is-reached b { color: var(--nc2-dark); }
#cart-popup.nasionka-cart-2 .nc2-progress__label.is-quiet { opacity: 0.45; }
#cart-popup.nasionka-cart-2 .nc2-progress__label.is-quiet i { display: none; }

/* Roomier screens can afford slightly larger milestone text. */
@media (min-width: 480px) {
	#cart-popup.nasionka-cart-2 .nc2-progress__label { font-size: 12px; }
	#cart-popup.nasionka-cart-2 .nc2-progress__label b { font-size: 13px; }
}

/* PATCH 1.1 — complete state: the bar reads as FINISHED, not unfinished. */
#cart-popup.nasionka-cart-2 .nc2-progress.is-complete .nc2-progress__fill {
	background: var(--nc2-primary);
}
#cart-popup.nasionka-cart-2 .nc2-progress.is-complete .nc2-progress__track {
	background: var(--nc2-primary); /* no empty tail left after £35 */
}
#cart-popup.nasionka-cart-2 .nc2-progress.is-complete .nc2-progress__dot.is-reached {
	border-color: var(--nc2-primary);
}
/* v1.3 §1/§2 — COMPLETION, not an unfinished bar. The progress track is
   replaced outright (no empty tail to "keep filling"), and there is exactly
   ONE checkmark: on the headline. */
/* Patch 1.31 §11 — further reduced visual load: no bordered/tinted card,
   just a calm confirmation line. The checkmark + headline still deliver the
   payoff; nothing here motivates further spending (no new milestone). */
#cart-popup.nasionka-cart-2 .nc2-complete {
	text-align: center;
	padding: 10px 14px 4px;
	animation: nc2-fade-in 0.3s ease;
}
#cart-popup.nasionka-cart-2 .nc2-complete__headline {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 6px;
	margin: 0;
	font-size: 14px;
	font-weight: 600;
	color: var(--nc2-dark);
}
#cart-popup.nasionka-cart-2 .nc2-complete__benefits {
	margin: 4px 0 0;
	font-size: 12.5px;
	color: var(--nc2-muted);
	line-height: 1.4;
}

#cart-popup.nasionka-cart-2 .nc2-progress__gap {
	margin: 4px 0 0;
	text-align: center;
	font-size: 14px;
	color: var(--nc2-dark);
	background: var(--nc2-surface);
	border-radius: calc(var(--nc2-radius) - 6px);
	padding: 8px 10px;
}

/* ===================================================================== */
/* Product list — compact rows, fixed thumbs, no nested scroll           */
/* ===================================================================== */

/* =====================================================================
   PATCH 1.1 — product rows rebuilt against the REAL Flatsome DOM:

   <li class="woocommerce-mini-cart-item">
     <a class="remove remove_from_cart_button">×</a>
     <a href="…"><img …>Product name text node</a>
     <div class="ux-mini-cart-qty">
        <div class="quantity">[-][input.qty][+]</div>
        <span class="product-subtotal">£2.00</span>
     </div>
   </li>

   The product name is a BARE TEXT NODE inside the same anchor as the
   thumbnail — that is why the old flex row clipped it. Now the anchor is
   itself a flex container (thumb + wrapping text) and the qty/price row
   sits on its own line underneath. Nothing is ever truncated.
   ===================================================================== */

#cart-popup.nasionka-cart-2 .woocommerce-mini-cart {
	padding: 6px 16px;
	margin: 0;
	list-style: none;
	/* No max-height, no overflow: the drawer is the ONLY scroll surface. */
	max-height: none !important;
	overflow: visible !important;
}
#cart-popup.nasionka-cart-2 .woocommerce-mini-cart-item {
	display: grid;
	grid-template-columns: minmax(0, 1fr) 40px;
	gap: 8px;
	padding: 12px 0;
	margin: 0;
	border-bottom: 1px solid var(--nc2-line);
	position: relative;
	transition: opacity 0.2s ease;
	align-items: start;
}
/* Removal in flight: the row dims. Quantity sync does NOT dim the row —
   only the qty control shows a subtle syncing state (PATCH 1.1). */
#cart-popup.nasionka-cart-2 .woocommerce-mini-cart-item.nc2-pending { opacity: 0.5; pointer-events: none; }

/* Row 1 — thumbnail + FULL product name (wraps to as many lines as needed). */
#cart-popup.nasionka-cart-2 .woocommerce-mini-cart-item > a:not(.remove_from_cart_button) {
	grid-column: 1;
	grid-row: 1;
	display: flex;
	align-items: flex-start;
	gap: 12px;
	min-width: 0;
	font-size: 14px;
	font-weight: 600;
	line-height: 1.35;
	color: var(--nc2-ink);
	text-decoration: none;
	/* Explicitly defeat any inherited truncation from the theme. */
	overflow: visible;
	text-overflow: clip;
	white-space: normal;
	overflow-wrap: anywhere;
	word-break: normal;
	padding: 0;
	text-indent: 0;
}

/* Fixed thumbnail box — image proportions never change row height. */
#cart-popup.nasionka-cart-2 .woocommerce-mini-cart-item img {
	flex: 0 0 auto;
	width: 52px !important;
	height: 64px !important;
	object-fit: contain;
	object-position: center;
	background: #fff;
	border: 1px solid var(--nc2-line);
	border-radius: 8px;
	margin: 0 !important;
	padding: 0;
	float: none !important;
	position: static !important;
}

/* Row 2 — quantity + line price, aligned under the product name. */
#cart-popup.nasionka-cart-2 .ux-mini-cart-qty {
	grid-column: 1 / -1;
	grid-row: 2;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	flex-wrap: wrap;
	margin: 8px 0 0;
	padding-left: 64px; /* aligns with the product name column (52px thumb + 12px gap) */
}

#cart-popup.nasionka-cart-2 .ux-mini-cart-qty .quantity,
#cart-popup.nasionka-cart-2 .woocommerce-mini-cart-item .quantity {
	display: inline-flex;
	align-items: center;
	border: 1px solid var(--nc2-line);
	border-radius: 999px;
	overflow: hidden;
	margin: 0;
	width: auto;
	max-width: none;
}
#cart-popup.nasionka-cart-2 .ux-quantity__button--minus,
#cart-popup.nasionka-cart-2 .ux-quantity__button--plus {
	min-width: 44px;   /* §16 — comfortable target, still a compact row */
	min-height: 44px;
	background: #fff;
	border: 0;
	border-radius: 0;
	font-size: 17px;
	font-weight: 700;
	color: var(--nc2-dark);
	cursor: pointer;
	padding: 0;
	/* Instant tap feedback — no 300ms delay, no double-fire highlight. */
	touch-action: manipulation;
	-webkit-tap-highlight-color: transparent;
}
#cart-popup.nasionka-cart-2 .ux-quantity__button--minus:active,
#cart-popup.nasionka-cart-2 .ux-quantity__button--plus:active { background: var(--nc2-surface); }
/* §4 — subtle contextual explanation next to the control that was pressed.
   Deliberately neutral: no red, no box, no scarcity language. */
/* PATCH 1.33 §3 — the note is now rendered only while the line is genuinely
   at its cap, so it is simply visible: no opacity/max-height gate to get
   stuck at 0 (the collapsed default was the other reason nothing showed). */
#cart-popup.nasionka-cart-2 .nc2-qty-note {
	flex: 1 1 100%;
	width: 100%;
	margin: 6px 0 0;
	padding-left: 2px;
	font-size: 11.5px;
	line-height: 1.3;
	color: var(--nc2-muted);
}

/* Patch 1.31 §12 — at the known max purchasable quantity: dimmed, inert,
   not-allowed cursor. Frontend already skips the request (cart.js), this is
   the matching visual state so the control doesn't invite a dead tap. */
/* At the cap: visibly inert. NOT the `disabled` attribute — a disabled
   <input type="button"> fires no click event, which is exactly why the
   explanation could never appear (see cart.js). aria-disabled carries the
   semantics; cart.js refuses the mutation. */
#cart-popup.nasionka-cart-2 .ux-quantity__button--plus[aria-disabled="true"],
#cart-popup.nasionka-cart-2 .ux-quantity__button--plus.is-max {
	opacity: 0.4;
	cursor: not-allowed;
}
#cart-popup.nasionka-cart-2 .qty {
	width: 38px;
	min-height: 40px;
	border: 0;
	background: transparent;
	text-align: center;
	font-weight: 700;
	font-size: 14px;
	padding: 0;
	box-shadow: none;
}
/* The qty number updates instantly; the control shows a quiet syncing hint. */
#cart-popup.nasionka-cart-2 .nc2-syncing .quantity { border-color: var(--nc2-primary); }
#cart-popup.nasionka-cart-2 .nc2-syncing .qty { color: var(--nc2-dark); }

/* v1.3 §15 — comfortable 44px (48px on touch) hit area WITHOUT growing the
   row: the visible circle stays ~40px and the extra target is negative margin
   plus a pseudo-element, so delete never becomes visually dominant. */
#cart-popup.nasionka-cart-2 .remove_from_cart_button {
	grid-column: 2;
	grid-row: 1;
	position: relative;
	width: 38px;   /* §5: 38–40px circle — lower visual dominance */
	height: 38px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	border-radius: 50%;
	color: var(--nc2-muted) !important;
	/* §5: the × is a text glyph, whose drawn height is roughly half its
	   font-size — 30px renders an ~15–16px symbol as specified. Flex centring
	   below (not line-height maths) keeps it perfectly centred at any size. */
	font-size: 30px;
	line-height: 1;
	font-weight: 300;   /* thinner stroke: clearer without shouting */
	text-decoration: none;
	flex: 0 0 auto;
	touch-action: manipulation;
}
#cart-popup.nasionka-cart-2 .remove_from_cart_button::after {
	content: '';
	position: absolute;
	top: 50%;
	left: 50%;
	width: 44px;
	height: 44px;
	transform: translate(-50%, -50%);
}
#cart-popup.nasionka-cart-2 .remove_from_cart_button:hover { background: var(--nc2-line); }
@media (pointer: coarse) {
	#cart-popup.nasionka-cart-2 .remove_from_cart_button::after { width: 48px; height: 48px; }
}

#cart-popup.nasionka-cart-2 .product-subtotal,
#cart-popup.nasionka-cart-2 .woocommerce-mini-cart-item .amount {
	font-weight: 700;
	font-size: 14px;
	color: var(--nc2-ink);
	margin-left: auto;
}

/* HTML.txt shows a <label class="screen-reader-text"> inside .quantity — it
   must not take layout space in our flex control. */
#cart-popup.nasionka-cart-2 .woocommerce-mini-cart-item .screen-reader-text {
	position: absolute !important;
	width: 1px;
	height: 1px;
	overflow: hidden;
	clip: rect(0 0 0 0);
	white-space: nowrap;
	margin: -1px;
	padding: 0;
	border: 0;
}

/* Fallback: if the Flatsome quantity switcher is ever turned off, the price
   sits directly in the <li>. Keep it on its own row, still never clipping. */
#cart-popup.nasionka-cart-2 .woocommerce-mini-cart-item > .product-subtotal {
	grid-column: 1 / -1;
	grid-row: 2;
	margin: 6px 0 0;
	padding-left: 64px;
	text-align: left;
}

/* Very narrow phones: qty row aligns to the left edge instead of under the name. */
@media (max-width: 359px) {
	#cart-popup.nasionka-cart-2 .ux-mini-cart-qty { padding-left: 0; }
}

/* PATCH 1.1: the collapse/expand control was removed. All cart products are
   always visible; the drawer is one natural vertical scrolling surface. */

/* ===================================================================== */
/* Gift row — reward state, clearly not a purchasable product            */
/* ===================================================================== */

/* v1.3 §6 — the ACHIEVED reward. Visually a sibling of the product rows
   (same thumb size, same rhythm) so it reads as "this is in your order", but
   with a restrained dashed green edge marking it as special. Never a banner. */
#cart-popup.nasionka-cart-2 .nc2-gift {
	display: flex;
	align-items: center;
	gap: 12px;
	margin: 10px 16px 0;
	padding: 10px 12px;
	background: linear-gradient(0deg, rgba(138, 196, 41, 0.06), rgba(138, 196, 41, 0.06)), #fff;
	border: 1px dashed rgba(138, 196, 41, 0.85);
	border-radius: calc(var(--nc2-radius) - 2px);
	animation: nc2-fade-in 0.35s ease;
}
#cart-popup.nasionka-cart-2 .nc2-gift__thumb {
	width: 52px;
	height: 64px;
	display: flex;
	align-items: center;
	justify-content: center;
	color: var(--nc2-muted);
	flex-shrink: 0;
}
#cart-popup.nasionka-cart-2 .nc2-gift__thumb img {
	width: 52px;
	height: 64px;
	object-fit: contain;
	display: block;
	margin: 0;
}
#cart-popup.nasionka-cart-2 .nc2-gift__meta { flex: 1; min-width: 0; }
#cart-popup.nasionka-cart-2 .nc2-gift__title {
	display: block;
	font-size: 14px;
	font-weight: 700;
	color: var(--nc2-ink);
}
#cart-popup.nasionka-cart-2 .nc2-gift__subtitle {
	display: block;
	font-size: 12.5px;
	color: var(--nc2-dark);
}
#cart-popup.nasionka-cart-2 .nc2-gift__badge {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	background: var(--nc2-primary);
	color: #fff;
	font-size: 12px;
	font-weight: 800;
	letter-spacing: 0.04em;
	border-radius: 999px;
	padding: 5px 10px;
}
#cart-popup.nasionka-cart-2 .nc2-gift__badge svg { width: 11px; height: 11px; }

/* Locked/lost state: quiet, never punishing, never red. */
#cart-popup.nasionka-cart-2 .nc2-gift--locked {
	border-style: solid;
	border-color: var(--nc2-line);
	background: #fff;
	opacity: 0.85;
}
#cart-popup.nasionka-cart-2 .nc2-gift--locked.nc2-collapsing {
	transition: opacity 0.4s ease, max-height 0.4s ease, margin 0.4s ease, padding 0.4s ease;
	opacity: 0;
	max-height: 0;
	margin-top: 0;
	padding-top: 0;
	padding-bottom: 0;
	overflow: hidden;
}

/* =====================================================================
   Upsell 1.3 — low, premium, horizontally scrollable rail.

   The whole module is about the height of ONE old stacked row. Extra
   recommendations cost horizontal space, never vertical, so a pool of 3, 8
   or 15 products makes no difference to the cart's height. Native scroll +
   scroll-snap only — no Swiper, no Slick, no dependencies.
   ===================================================================== */

#cart-popup.nasionka-cart-2 .nc2-upsell {
	margin: 28px 0 0; /* Patch 1.31 §9: reads as a separate, optional chunk — not another cart line. */
	padding: 10px 0 12px;
	/* §11 — a very subtle differentiated surface, not a white void and not a
	   marketplace card. Full-bleed so the rail can run to the drawer edge. */
	background: linear-gradient(0deg, rgba(138, 196, 41, 0.045), rgba(138, 196, 41, 0.045)), #fff;
	border-top: 1px solid var(--nc2-line);
	border-bottom: 1px solid var(--nc2-line);
}
#cart-popup.nasionka-cart-2 .nc2-upsell__head {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 10px;
	padding: 0 16px 8px;
}
#cart-popup.nasionka-cart-2 .nc2-upsell__heading {
	margin: 0;
	font-size: 13.5px;   /* §3: +1px (~8%). Family, position, spacing unchanged. */
	font-weight: 700;
	letter-spacing: 0.02em;
	color: var(--nc2-muted);
}

/* Arrows: desktop affordance only. Touch users swipe. */
#cart-popup.nasionka-cart-2 .nc2-upsell__nav { display: none; gap: 4px; }
#cart-popup.nasionka-cart-2 .nc2-rail-btn {
	width: 26px;
	height: 26px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	border: 1px solid var(--nc2-line);
	background: #fff;
	color: var(--nc2-dark);
	border-radius: 50%;
	font-size: 15px;
	line-height: 1;
	cursor: pointer;
	padding: 0;
}
#cart-popup.nasionka-cart-2 .nc2-rail-btn:hover { border-color: var(--nc2-primary); }
@media (hover: hover) and (min-width: 850px) {
	#cart-popup.nasionka-cart-2 .nc2-upsell__nav { display: flex; }
}

#cart-popup.nasionka-cart-2 .nc2-upsell__rail {
	display: flex;
	gap: 10px;
	overflow-x: auto;
	overflow-y: hidden;
	scroll-snap-type: x mandatory;
	-webkit-overflow-scrolling: touch;
	overscroll-behavior-x: contain; /* never chains to the page => no h-overflow */
	padding: 0 16px 2px;
	scrollbar-width: none;
}
#cart-popup.nasionka-cart-2 .nc2-upsell__rail::-webkit-scrollbar { display: none; }

/* Card width is deliberately <100% so the NEXT card always peeks — that peek
   is the swipe affordance, which is why there is no "swipe" instruction. */
#cart-popup.nasionka-cart-2 .nc2-upsell__card {
	flex: 0 0 auto;
	width: calc(100% - 42px);
	max-width: 340px;
	scroll-snap-align: start;
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 8px 10px;
	background: #fff;
	border: 1px solid var(--nc2-line);
	border-radius: calc(var(--nc2-radius) - 4px);
}
#cart-popup.nasionka-cart-2 .nc2-upsell__thumb {
	flex: 0 0 auto;
	line-height: 0;
}
#cart-popup.nasionka-cart-2 .nc2-upsell__thumb img {
	width: 48px !important;
	height: 48px !important;
	object-fit: contain;
	background: #fff;
	border-radius: 6px;
	display: block;
	margin: 0;
}
#cart-popup.nasionka-cart-2 .nc2-upsell__meta { flex: 1 1 auto; min-width: 0; }
#cart-popup.nasionka-cart-2 .nc2-upsell__name {
	display: -webkit-box;
	-webkit-line-clamp: 2;      /* upsell titles only — cart product names are NEVER clamped */
	-webkit-box-orient: vertical;
	overflow: hidden;
	font-size: 13px;
	font-weight: 600;
	line-height: 1.25;
	color: var(--nc2-ink);
	overflow-wrap: anywhere;
}
#cart-popup.nasionka-cart-2 .nc2-upsell__price {
	display: block;
	font-size: 13px;
	font-weight: 700;
	color: var(--nc2-ink);
	margin-top: 2px;
}
#cart-popup.nasionka-cart-2 .nc2-upsell__price del { color: var(--nc2-muted); font-weight: 400; }
#cart-popup.nasionka-cart-2 .nc2-upsell__price ins { text-decoration: none; }
#cart-popup.nasionka-cart-2 .nc2-upsell-add { flex: 0 0 auto; }

/* Wider drawers can comfortably show two cards; we never force three. */
@media (min-width: 560px) {
	#cart-popup.nasionka-cart-2 .nc2-upsell__card { width: calc(50% - 26px); }
}
/* §6 — desktop/tablet ONLY: give the product name ~+28px of horizontal room
   (≈4–6 more characters) by widening the card slightly and tightening its own
   internal padding/gap. Image size, price placement and + DODAJ size are all
   unchanged, the card stays compact, and the next-card peek is preserved.
   Mobile (<850px) is deliberately untouched — that layout is already good. */
@media (min-width: 850px) {
	/* §7 — DESKTOP ONLY: show ~3 recommendations at once instead of ~2.
	   Three horizontal (image | text | button) cards cannot fit a ~608px
	   drawer without crushing the product name to a few characters, so on
	   desktop the card stacks vertically instead: image, name (still up to
	   2 lines), price, then a full-width + DODAJ. Image size, name line
	   allowance, price and button remain fully usable — the card simply uses
	   the drawer's width rather than its length. Slightly under a third each
	   so a sliver of the next card still peeks when more are configured.
	   MOBILE IS UNTOUCHED — this block is inside min-width: 850px. */
	#cart-popup.nasionka-cart-2 .nc2-upsell__card {
		width: calc(32.5% - 7px);
		flex-direction: column;
		align-items: stretch;
		gap: 6px;
		padding: 10px 10px 9px;
	}
	#cart-popup.nasionka-cart-2 .nc2-upsell__thumb {
		align-self: center;
	}
	#cart-popup.nasionka-cart-2 .nc2-upsell__meta {
		width: 100%;
	}
	#cart-popup.nasionka-cart-2 .nc2-upsell__name {
		font-size: 12.5px;
		min-height: 2.5em; /* keeps 1-line and 2-line cards the same height */
	}
	#cart-popup.nasionka-cart-2 .nc2-upsell-add {
		width: 100%;
		justify-content: center;
		padding: 8px 6px;
		font-size: 12px;
	}
}

/* =====================================================================
   Coupon — progressive disclosure, visually secondary (§12)
   ===================================================================== */

#cart-popup.nasionka-cart-2 .nc2-coupon {
	padding: 6px 16px 2px;
}
#cart-popup.nasionka-cart-2 .nc2-coupon__toggle {
	background: none;
	border: 0;
	padding: 6px 0;
	min-height: 36px;
	font-family: inherit;
	font-size: 13px;
	font-weight: 600;
	color: var(--nc2-dark);
	text-decoration: underline;
	text-underline-offset: 3px;
	cursor: pointer;
}
#cart-popup.nasionka-cart-2 .nc2-coupon__form {
	display: flex;
	gap: 8px;
	margin-top: 6px;
}
#cart-popup.nasionka-cart-2 .nc2-coupon__form[hidden] { display: none; }
#cart-popup.nasionka-cart-2 .nc2-coupon__input {
	flex: 1 1 auto;
	min-width: 0;
	min-height: 40px;
	padding: 8px 12px;
	border: 1px solid var(--nc2-line);
	border-radius: 999px;
	font-family: inherit;
	font-size: 14px;
	text-transform: uppercase;
	background: #fff;
	box-shadow: none;
}
#cart-popup.nasionka-cart-2 .nc2-coupon__input:focus {
	border-color: var(--nc2-primary);
	outline: none;
}
#cart-popup.nasionka-cart-2 .nc2-coupon__msg {
	margin: 6px 0 0;
	font-size: 12.5px;
	color: var(--nc2-muted);
	min-height: 0;
}
#cart-popup.nasionka-cart-2 .nc2-coupon__msg:empty { margin: 0; }
#cart-popup.nasionka-cart-2 .nc2-coupon__msg.is-error { color: #a4402c; }
#cart-popup.nasionka-cart-2 .nc2-coupon__msg.is-success { color: var(--nc2-dark); font-weight: 600; }
#cart-popup.nasionka-cart-2 .nc2-coupon__applied {
	list-style: none;
	margin: 0 0 6px;
	padding: 0;
}
#cart-popup.nasionka-cart-2 .nc2-coupon__applied li {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 10px;
	padding: 6px 0;
	font-size: 13px;
}
#cart-popup.nasionka-cart-2 .nc2-coupon__code { font-weight: 700; color: var(--nc2-dark); }
#cart-popup.nasionka-cart-2 .nc2-coupon-remove {
	background: none;
	border: 0;
	padding: 6px 8px;
	min-height: 36px;
	font-family: inherit;
	font-size: 12.5px;
	color: var(--nc2-muted);
	text-decoration: underline;
	cursor: pointer;
}

/* =====================================================================
   PATCH 1.1 — responsive tightening. MOBILE IS THE PRIORITY, but this is
   ONE cart with one hierarchy: the same modules in the same order at every
   width, only the spacing and type scale change.
   ===================================================================== */

@media (max-width: 480px) {
	#cart-popup.nasionka-cart-2 .nc2-hubert { padding: 12px 14px 4px; gap: 10px; }
	#cart-popup.nasionka-cart-2 .nc2-hubert__avatar img { width: 56px; height: 56px; }
	#cart-popup.nasionka-cart-2 .nc2-hubert__bubble { font-size: 14px; padding: 10px 12px; }
	#cart-popup.nasionka-cart-2 .nc2-progress { padding: 12px 16px 4px; }
	#cart-popup.nasionka-cart-2 .woocommerce-mini-cart { padding: 4px 14px; }
	#cart-popup.nasionka-cart-2 .nc2-gift { margin-left: 14px; margin-right: 14px; }
	#cart-popup.nasionka-cart-2 .nc2-upsell__head,
	#cart-popup.nasionka-cart-2 .nc2-upsell__rail,
	#cart-popup.nasionka-cart-2 .nc2-coupon { padding-left: 14px; padding-right: 14px; }
	#cart-popup.nasionka-cart-2 .nc2-summary,
	#cart-popup.nasionka-cart-2 .nc2-cta-wrap { padding-left: 14px; padding-right: 14px; }
	#cart-popup.nasionka-cart-2 .nc2-social { font-size: 12.5px; padding-bottom: 12px; }
}

/* The sticky footer must never cover a product row: it sits AFTER the list in
   flow, so content always scrolls clear above it. On short viewports it stops
   sticking entirely so the cart stays one plain scrolling column. */
@media (max-height: 700px), (max-width: 380px) {
	#cart-popup.nasionka-cart-2 .nc2-bottom { position: static; box-shadow: none; }
}

/* §29 — nothing may push the drawer horizontally. The upsell rail is the ONLY
   intentional horizontal scroller and it contains its own overscroll. */
#cart-popup.nasionka-cart-2 { overflow-x: hidden; }
#cart-popup.nasionka-cart-2 .nc2-module,
#cart-popup.nasionka-cart-2 .nc2-hubert,
#cart-popup.nasionka-cart-2 .nc2-summary,
#cart-popup.nasionka-cart-2 .nc2-cta-wrap { max-width: 100%; }

/* Browser zoom / very narrow laptops behave like the mobile layout — this is a
   width query, so it follows zoom automatically. No separate cart, no clipping. */

#cart-popup.nasionka-cart-2 .nc2-summary { padding: 22px 16px 0; } /* Patch 1.31 §9: ~20-24px breathing room after upsell. */
#cart-popup.nasionka-cart-2 .nc2-summary__row {
	display: flex;
	justify-content: space-between;
	align-items: baseline;
	font-size: 14px;
	color: var(--nc2-muted);
	padding: 3px 0;
}
#cart-popup.nasionka-cart-2 .nc2-summary__row--total {
	border-top: 1px solid var(--nc2-line);
	margin-top: 6px;
	padding-top: 9px;
	color: var(--nc2-ink);
	font-weight: 700;
	font-size: 15px;
}
/* §2 — ~13% smaller (20px -> 17.5px). Weight, colour and its dominance over
   "Produkty"/"Dostawa" are deliberately unchanged. */
#cart-popup.nasionka-cart-2 .nc2-summary__total { font-size: 17.5px; color: var(--nc2-dark); }
#cart-popup.nasionka-cart-2 .nc2-summary__free { color: var(--nc2-dark); font-weight: 800; }
#cart-popup.nasionka-cart-2 .nc2-summary__tbd { font-size: 12.5px; }

#cart-popup.nasionka-cart-2 .nc2-cta-wrap { padding: 10px 16px 6px; }
#cart-popup.nasionka-cart-2 .nc2-cta-helper {
	margin: 8px 0 0;
	font-size: 13px;
	text-align: center;
	color: var(--nc2-muted);
}

/* ===================================================================== */
/* Trust + social proof — compact, subordinate to CTA                    */
/* ===================================================================== */

/* PATCH 1.1 — compact reassurance: [lock] Bezpieczne płatności: [card] Karta
   [paypal] PayPal. Small, muted, wraps cleanly, never competes with the CTA. */
#cart-popup.nasionka-cart-2 .nc2-trust {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	gap: 6px 8px;
	padding: 6px 16px 2px;
	font-size: 11.5px;
	color: var(--nc2-muted);
	line-height: 1;
}
#cart-popup.nasionka-cart-2 .nc2-trust__lead,
#cart-popup.nasionka-cart-2 .nc2-trust__methods {
	display: inline-flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 6px;
}
#cart-popup.nasionka-cart-2 .nc2-trust__chip {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	font-style: normal;
	background: var(--nc2-surface);
	border: 1px solid var(--nc2-line);
	border-radius: 999px;
	padding: 4px 9px;
	white-space: nowrap;
}
#cart-popup.nasionka-cart-2 .nc2-icon {
	width: 14px;
	height: 14px;
	flex: 0 0 auto;
	display: block;
}
#cart-popup.nasionka-cart-2 .nc2-icon--paypal { color: #253b80; }

/* §22 — WHO delivers and WHERE. Tertiary: quieter than payments. */
#cart-popup.nasionka-cart-2 .nc2-delivery {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 6px;
	margin: 2px 0 0;
	padding: 2px 16px;
	font-size: 11.5px;
	color: var(--nc2-muted);
	text-align: center;
	line-height: 1.35;
}

/* §21 — payment chips must NEVER be dropped on mobile: they wrap instead. */
#cart-popup.nasionka-cart-2 .nc2-trust__methods { flex-wrap: wrap; justify-content: center; }
#cart-popup.nasionka-cart-2 .nc2-icon--lock { opacity: 0.8; }

#cart-popup.nasionka-cart-2 .nc2-social {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 7px;
	margin: 0;
	padding: 8px 16px 14px;
	font-size: 13px;
	color: var(--nc2-dark);
}

/* ===================================================================== */
/* Undo toast                                                            */
/* ===================================================================== */

.nc2-toast {
	position: fixed;
	left: 50%;
	bottom: calc(20px + env(safe-area-inset-bottom, 0));
	transform: translateX(-50%);
	z-index: 100002; /* above mfp overlay */
	display: flex;
	align-items: center;
	gap: 14px;
	max-width: min(92vw, 420px);
	background: #333;
	color: #fff;
	font-family: "Raleway", sans-serif;
	font-size: 14px;
	line-height: 1.35;
	padding: 12px 16px;
	border-radius: 12px;
	box-shadow: 0 8px 24px rgba(0, 0, 0, 0.25);
	animation: nc2-fade-in 0.25s ease;
}
.nc2-toast--error { background: #5c4a3a; }
.nc2-toast__undo {
	background: none;
	border: 0;
	color: #b9e178;
	font-family: inherit;
	font-size: 14px;
	font-weight: 700;
	cursor: pointer;
	min-height: 44px;
	padding: 0 6px;
	white-space: nowrap;
}
.nc2-toast__undo:hover { text-decoration: underline; }

/* ===================================================================== */
/* Motion + accessibility                                                */
/* ===================================================================== */

@keyframes nc2-fade-in {
	from { opacity: 0; transform: translateY(6px); }
	to { opacity: 1; transform: none; }
}
.nc2-toast { animation-name: nc2-toast-in; }
@keyframes nc2-toast-in {
	from { opacity: 0; transform: translate(-50%, 8px); }
	to { opacity: 1; transform: translate(-50%, 0); }
}

@media (prefers-reduced-motion: reduce) {
	#cart-popup.nasionka-cart-2 *,
	.nc2-toast,
	.nc2-fixed-layer,
	.nc2-fixed-layer * {
		animation: none !important;
		transition: none !important;
	}
}

/* Visually hidden live region for AJAX announcements. */
.nc2-visually-hidden {
	position: absolute !important;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	overflow: hidden;
	clip: rect(0 0 0 0);
	white-space: nowrap;
	border: 0;
}
