/* =========================================================================
   Islamspullen redesign layer — 2026-09-23
   Child-theme CSS only. Extends the existing Ecomall/WooCommerce markup;
   does not replace it. Organized by section, uses design tokens below.
   ========================================================================= */

/* -------------------------------------------------------------------------
   1. DESIGN TOKENS
   ------------------------------------------------------------------------- */
:root {
	/* Brand (kept from existing theme option, refined usage) */
	--isp-brand: #0068c8;
	--isp-brand-dark: #00539e;
	--isp-brand-tint: #eaf3fc;

	/* Neutrals */
	--isp-ink: #1a2027;
	--isp-ink-soft: #565f6b;
	--isp-line: #e4e7eb;
	--isp-line-soft: #eef0f2;
	--isp-surface: #ffffff;
	--isp-surface-muted: #f7f8fa;

	/* Semantic */
	--isp-sale: #c8393f;
	--isp-sale-tint: #fdecec;
	--isp-new: #12805c;
	--isp-new-tint: #e7f5ef;
	--isp-star: #f2a91b;

	/* Typography (reuses already-loaded Mulish, no new font request) */
	--isp-font: 'Mulish', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
	--isp-h1: clamp(1.5rem, 1.2rem + 1vw, 2rem);
	--isp-h2: clamp(1.25rem, 1.1rem + 0.6vw, 1.5rem);
	--isp-h3: 1.0625rem;
	--isp-body: 0.9375rem;
	--isp-small: 0.8125rem;

	/* Spacing scale */
	--isp-space-1: 4px;
	--isp-space-2: 8px;
	--isp-space-3: 12px;
	--isp-space-4: 16px;
	--isp-space-5: 24px;
	--isp-space-6: 32px;
	--isp-space-7: 48px;

	/* Layout */
	--isp-container: 1320px;
	--isp-radius-sm: 6px;
	--isp-radius-md: 10px;
	--isp-radius-lg: 14px;
	--isp-border: 1px solid var(--isp-line);
	--isp-shadow-card: 0 1px 2px rgba(20, 24, 30, 0.04), 0 2px 8px rgba(20, 24, 30, 0.05);
	--isp-shadow-card-hover: 0 4px 10px rgba(20, 24, 30, 0.07), 0 8px 20px rgba(20, 24, 30, 0.08);

	/* Controls */
	--isp-control-h: 44px;
	--isp-control-h-sm: 36px;
	--isp-transition: 160ms ease;
}

/* -------------------------------------------------------------------------
   2. BASE / TYPOGRAPHY
   ------------------------------------------------------------------------- */
/* The side-cart plugin's drawer (.xoo-wsc-container) parks itself off-screen
   via position:fixed + a negative "right" offset when closed - by design,
   not a bug in that panel itself. But browsers still count a fixed box that
   extends past the viewport edge toward the document's scrollable area, so
   on narrow viewports the whole page gains phantom horizontal scroll room
   (confirmed via live DOM measurement: ~39px of real scrollWidth overflow at
   320px, entirely from this drawer - the product grid itself stays in
   bounds). This is the standard fix for that category of bug and has no
   effect on any content we actually want visible. */
html, body {
	overflow-x: hidden;
}

body.woocommerce-page,
body.single-product,
body.archive.woocommerce {
	color: var(--isp-ink);
}

#main-content .page-title,
.woocommerce-page h1.entry-title,
h1.product_title.entry-title {
	font-family: var(--isp-font);
	font-weight: 700;
	font-size: var(--isp-h1);
	color: var(--isp-ink);
	letter-spacing: -0.01em;
}

/* -------------------------------------------------------------------------
   3. HEADER
   ------------------------------------------------------------------------- */
#masthead {
	background: var(--isp-surface);
	border-bottom: var(--isp-border);
}

#masthead .elementor-48417 .e-con-inner {
	max-width: var(--isp-container);
	margin-inline: auto;
	align-items: center;
	gap: var(--isp-space-5);
	padding-block: var(--isp-space-4);
}

/* Logo column: keep compact, vertically centered */
#masthead .elementor-widget-image img {
	max-height: 46px;
	width: auto;
	height: auto;
}

/* Search column: make it the visual anchor of the header */
#masthead .is-search-form {
	position: relative;
	width: 100%;
	max-width: 560px;
	margin-inline: auto;
}
#masthead .is-search-input {
	width: 100%;
	height: var(--isp-control-h);
	padding: 0 52px 0 var(--isp-space-4);
	border: 1.5px solid var(--isp-line);
	border-radius: var(--isp-radius-md);
	background: var(--isp-surface-muted);
	font-family: var(--isp-font);
	font-size: var(--isp-body);
	color: var(--isp-ink);
	transition: border-color var(--isp-transition), background var(--isp-transition), box-shadow var(--isp-transition);
}
#masthead .is-search-input::placeholder {
	color: var(--isp-ink-soft);
}
#masthead .is-search-input:focus {
	outline: none;
	border-color: var(--isp-brand);
	background: var(--isp-surface);
	box-shadow: 0 0 0 3px var(--isp-brand-tint);
}
#masthead .is-search-submit {
	position: absolute;
	top: 0;
	right: 0;
	height: var(--isp-control-h);
	width: 52px;
	display: flex;
	align-items: center;
	justify-content: center;
	background: transparent;
	border: 0;
	cursor: pointer;
	color: var(--isp-ink-soft);
	transition: color var(--isp-transition);
}
#masthead .is-search-submit:hover {
	color: var(--isp-brand);
}
#masthead .is-search-icon svg {
	width: 19px;
	height: 19px;
}

/* Right column: klantenservice / account / cart icon-boxes */
#masthead .elementor-widget-icon-box .elementor-icon-box-wrapper,
#masthead .elementor-widget-woocommerce-menu-cart .elementor-menu-cart__toggle_button {
	display: flex;
	align-items: center;
	gap: var(--isp-space-2);
}
#masthead .elementor-icon-box-icon a.elementor-icon {
	width: 22px;
	height: 22px;
	color: var(--isp-ink-soft);
	transition: color var(--isp-transition);
}
#masthead .elementor-icon-box-icon a.elementor-icon:hover,
#masthead .elementor-icon-box-icon a.elementor-icon:focus-visible {
	color: var(--isp-brand);
}
#masthead .elementor-icon-box-icon svg {
	width: 100%;
	height: 100%;
}
#masthead .elementor-icon-box-title,
#masthead .elementor-icon-box-title a {
	font-family: var(--isp-font);
	font-size: var(--isp-small);
	font-weight: 600;
	color: var(--isp-ink);
	line-height: 1.2;
	margin: 0;
	white-space: nowrap;
}
#masthead .elementor-icon-box-description {
	font-size: 12px;
	color: var(--isp-ink-soft);
}

/* Cart widget (Elementor Menu Cart) */
#masthead .elementor-menu-cart__toggle_button {
	color: var(--isp-ink-soft);
	transition: color var(--isp-transition);
}
#masthead .elementor-menu-cart__toggle_button:hover {
	color: var(--isp-brand);
}
#masthead .elementor-button-icon[data-counter]::after,
#masthead span.hfe-cart-count,
#masthead .elementor-button-icon-qty {
	background: var(--isp-brand);
	color: #fff;
	font-weight: 700;
	border-radius: 999px;
	min-width: 18px;
	height: 18px;
	line-height: 18px;
	font-size: 11px;
	text-align: center;
}

/* Main navigation row */
#masthead nav.hfe-nav-menu,
#masthead .hfe-nav-menu-wrapper {
	border-top: var(--isp-border);
}
#masthead .hfe-menu-item {
	font-family: var(--isp-font);
	font-size: var(--isp-body);
	font-weight: 600;
	color: var(--isp-ink);
	padding-block: var(--isp-space-3);
	transition: color var(--isp-transition);
}
#masthead .hfe-menu-item:hover {
	color: var(--isp-brand);
}
/* Active category state - scoped to #masthead's own .hfe-nav-menu only, so
   the footer menu (#colophon .elementor-48702, different hfe-menu-item
   instance) and any account/cart controls (not part of this menu's <li>
   structure at all) are never touched. inset box-shadow instead of a real
   border/underline so nothing changes box size or shifts layout; hover
   alone (above) only changes text color, so an active item still reads as
   visibly different from a merely-hovered inactive one. */
#masthead .menu-item.current-menu-item > a.hfe-menu-item,
#masthead .menu-item.current-menu-ancestor > a.hfe-menu-item {
	color: var(--isp-brand);
	box-shadow: inset 0 -2px 0 0 var(--isp-brand);
}

/* Sticky header, only if theme/Elementor already applies a sticky class */
#masthead.elementor-sticky--effects,
.elementor-sticky--active #masthead {
	box-shadow: 0 2px 10px rgba(20, 24, 30, 0.06);
}

/* -------------------------------------------------------------------------
   4. SHOP / CATEGORY PAGE LAYOUT
   ------------------------------------------------------------------------- */
.page-container {
	max-width: var(--isp-container);
	margin-inline: auto;
	padding-inline: var(--isp-space-4);
}
/* Top breathing room between the nav and the archive content. Checked for
   negative margins/zero padding on this wrapper and any ancestor, and for a
   sticky-header offset requirement - none apply: #masthead is only ever
   position:sticky while the .elementor-sticky--active scroll state is
   active (not on initial load), and nothing here overlaps it. Applied once
   on the shared flex wrapper (not separately on the sidebar heading and
   the toolbar) so both columns start at the same height automatically. */
body.archive.tax-product_cat .page-container.has-1-sidebar {
	padding-top: 28px;
}

/* Shop/category two-column layout (sidebar + products).
   Root cause of the sidebar spanning full page width: the parent theme's
   ENTIRE flex two-column system - .page-container's own display:flex,
   --ts-sidebar-width/--ts-sidebar-gap, and the has-1-sidebar #main-content
   width calc() - is scoped to the selector "#main > .page-container"
   (wp-content/themes/ecomall/css/reset.css). This site's header/footer is
   built with Elementor (body classes ehf-header/ehf-footer), which replaces
   the theme's own header.php - and header.php is the ONLY place that prints
   <div id="main" class="wrapper">. With Elementor's header in use, that
   #main wrapper is never output, so none of the parent theme's column CSS
   (nor the --ts-sidebar-width/-gap custom properties it sets) ever applies
   on WooCommerce archive pages - #left-sidebar and #main-content just stack
   as plain full-width blocks. This is a pre-existing gap between the theme
   and this site's Elementor header, not something introduced by the redesign
   work; it only became visible once the sidebar actually had content to show.
   Fix: rebuild the same two-column behavior directly, scoped to the real
   DOM (body.archive.woocommerce - shared by the Shop page and every category
   archive, same scope already used for the title-hero fix), not dependent
   on the missing #main ancestor or the undefined --ts-sidebar-* variables. */
@media (min-width: 901px) {
	body.archive.woocommerce .page-container.has-1-sidebar {
		display: flex;
		align-items: flex-start;
		gap: var(--isp-space-6);
	}
	body.archive.woocommerce .page-container.has-1-sidebar > #left-sidebar.ts-sidebar {
		flex: 0 0 280px;
		width: 280px;
	}
	body.archive.woocommerce .page-container.has-1-sidebar > #main-content {
		flex: 1 1 0%;
		min-width: 0;
	}
}

/* Shop/category archive title ("breadcrumb-v3" hero block).
   Root cause of the large blank area + invisible title: this theme's
   breadcrumb-v3 layout is a hero-banner design meant to show a full-width
   background PHOTO behind the title (ts_enable_breadcrumb_background_image
   theme option is off here, no photo ever configured) - so .breadcrumb-title
   keeps its 230px min-height + 35px padding reserved for that photo even
   though nothing fills it, and .page-title keeps --ts-breadcrumb-v3-color
   (#fff), meant to read over a dark photo overlay, which is invisible
   against the plain white block that's left. Scoped to
   body.archive.woocommerce (shared by the Shop page and every category
   archive) so single-product/page templates that might use this same v3
   layout elsewhere are untouched. */
body.archive.woocommerce .breadcrumb-title-wrapper.breadcrumb-v3 .breadcrumb-title {
	min-height: auto;
	padding: var(--isp-space-4) 0;
}
body.archive.woocommerce .breadcrumb-title-wrapper.breadcrumb-v3 .page-title {
	color: var(--isp-ink);
}
/* Category archives only (body.tax-product_cat - the Shop page itself does
   NOT get this class, so its own title is unaffected): the sidebar's own
   "BOEKEN"/"DAMES"/etc. heading (the search widget's title, which happens
   to echo the category name) plus the active nav tab already make clear
   which category this is, so the large standalone H1 above the toolbar is
   redundant. display:none removes its box entirely, so the toolbar/sidebar
   move up into the freed space with no extra margin cleanup needed. */
body.archive.tax-product_cat .breadcrumb-title-wrapper.breadcrumb-v3 {
	display: none;
}

/* Kill the large empty gap above the grid */
.before-loop-wrapper {
	margin-bottom: var(--isp-space-4);
}
#main-content .page-title,
.woocommerce-products-header {
	margin-bottom: var(--isp-space-3);
}

/* Toolbar: result count + sorting on one clean row */
.woocommerce-result-count,
.woocommerce-ordering {
	font-family: var(--isp-font);
	margin: 0;
}
.before-loop-wrapper {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: var(--isp-space-3);
	padding: var(--isp-space-3) var(--isp-space-4);
	background: var(--isp-surface-muted);
	border: var(--isp-border);
	border-radius: var(--isp-radius-md);
}
.woocommerce-result-count {
	color: var(--isp-ink-soft);
	font-size: var(--isp-small);
}
.woocommerce-ordering select {
	height: var(--isp-control-h-sm);
	border-radius: var(--isp-radius-sm);
	border: 1.5px solid var(--isp-line);
	font-family: var(--isp-font);
	font-size: var(--isp-small);
	padding: 0 var(--isp-space-3);
	background-color: var(--isp-surface);
}

/* Toolbar right-hand controls: this theme replaces the native <select> for
   sorting and per-page with its own custom dropdown UI
   (ul.orderby / ul.perpage with a "-current" trigger span and a nested
   ul.dropdown popup) - styling the real interactive markup rather than
   the hidden fallback <select>, so we don't touch its existing JS. */
.before-loop-wrapper {
	position: relative;
}
.before-loop-wrapper form.product-per-page-form,
.before-loop-wrapper form.woocommerce-ordering {
	display: flex;
	align-items: center;
	gap: var(--isp-space-2);
}
.before-loop-wrapper .orderby-label,
.before-loop-wrapper form.product-per-page-form > span:first-child {
	font-size: var(--isp-small);
	color: var(--isp-ink-soft);
	white-space: nowrap;
}
.before-loop-wrapper ul.orderby,
.before-loop-wrapper ul.perpage {
	list-style: none;
	margin: 0;
	padding: 0;
	position: relative;
}
.before-loop-wrapper .orderby-current,
.before-loop-wrapper .perpage-current {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	height: var(--isp-control-h-sm);
	padding: 0 var(--isp-space-3);
	border: 1.5px solid var(--isp-line);
	border-radius: var(--isp-radius-sm);
	background: var(--isp-surface);
	font-family: var(--isp-font);
	font-size: var(--isp-small);
	font-weight: 600;
	color: var(--isp-ink);
	cursor: pointer;
}
.before-loop-wrapper .orderby-current::after,
.before-loop-wrapper .perpage-current::after {
	content: "";
	width: 8px;
	height: 8px;
	border-right: 1.5px solid var(--isp-ink-soft);
	border-bottom: 1.5px solid var(--isp-ink-soft);
	transform: rotate(45deg);
	margin-top: -3px;
}
.before-loop-wrapper ul.dropdown {
	list-style: none;
	position: absolute;
	right: 0;
	top: calc(100% + 4px);
	min-width: 160px;
	margin: 0;
	padding: var(--isp-space-2);
	background: var(--isp-surface);
	border: var(--isp-border);
	border-radius: var(--isp-radius-md);
	box-shadow: var(--isp-shadow-card-hover);
	z-index: 20;
}
.before-loop-wrapper ul.dropdown a {
	display: block;
	padding: 7px var(--isp-space-2);
	border-radius: var(--isp-radius-sm);
	font-size: var(--isp-small);
	color: var(--isp-ink);
}
.before-loop-wrapper ul.dropdown a:hover,
.before-loop-wrapper ul.dropdown a.current {
	background: var(--isp-brand-tint);
	color: var(--isp-brand-dark);
}

/* Product grid.
   IMPORTANT: this theme's loop wrapper is a <div class="products"> (not a
   <ul>), nested one level INSIDE <div class="woocommerce main-products">.
   The grid must be applied to that inner .products div only - applying it
   to the outer wrapper as well turns the outer wrapper into a 4-column grid
   whose single child (.products, holding every card) then collapses into
   ONE of those 4 columns, squeezing the whole listing to ~25% width. That
   exact bug happened here before; fixed by scoping to the real container. */
.woocommerce.main-products {
	display: block;
	width: 100%;
}
.woocommerce.main-products .products {
	display: grid !important;
	grid-template-columns: repeat(var(--ts-columns, 4), minmax(0, 1fr));
	gap: var(--isp-space-5) var(--isp-space-4);
}
.woocommerce.main-products .products > section.product {
	width: auto !important;
	margin: 0 !important;
	float: none !important;
}

/* -------------------------------------------------------------------------
   5. FILTER SIDEBAR
   Column width (280px) is set in section 4 above, directly on #left-sidebar,
   since the theme's own --ts-sidebar-width mechanism never applies on this
   site (see section 4's note on the missing #main wrapper).
   ------------------------------------------------------------------------- */
/* One cohesive white sidebar panel with section dividers, not a stack of
   separately-boxed cards - matches the clean reference layout better than
   a bordered box per widget. */
#left-sidebar,
#right-sidebar {
	background: var(--isp-surface);
}
#left-sidebar .widget,
#right-sidebar .widget {
	padding: 0 0 var(--isp-space-5);
	margin-bottom: var(--isp-space-5);
	border-bottom: var(--isp-border);
}
#left-sidebar .widget:last-child,
#right-sidebar .widget:last-child {
	border-bottom: 0;
	margin-bottom: 0;
}
#left-sidebar .widget-title,
#right-sidebar .widget-title {
	display: flex;
	align-items: center;
	justify-content: space-between;
	font-family: var(--isp-font);
	font-size: var(--isp-small);
	font-weight: 700;
	letter-spacing: 0.03em;
	text-transform: uppercase;
	color: var(--isp-ink);
	margin: 0 0 var(--isp-space-4);
	cursor: pointer;
	user-select: none;
}
#left-sidebar .widget-title::after,
#right-sidebar .widget-title::after {
	content: "";
	width: 9px;
	height: 9px;
	border-right: 2px solid var(--isp-ink-soft);
	border-bottom: 2px solid var(--isp-ink-soft);
	transform: rotate(45deg);
	transition: transform var(--isp-transition);
	flex-shrink: 0;
}
#left-sidebar .widget.isp-collapsed .widget-title::after,
#right-sidebar .widget.isp-collapsed .widget-title::after {
	transform: rotate(-45deg);
}
#left-sidebar .widget.isp-collapsed > *:not(.widget-title),
#right-sidebar .widget.isp-collapsed > *:not(.widget-title) {
	display: none;
}

/* Layered nav (attribute) checkboxes */
.woocommerce ul.wc-layered-nav-list,
.widget ul.wc-layered-nav-list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: var(--isp-space-3);
	max-height: 280px;
	overflow-y: auto;
}
.wc-layered-nav-list li a {
	display: flex;
	align-items: center;
	gap: 10px;
	font-size: var(--isp-body);
	line-height: 1.3;
	color: var(--isp-ink);
	padding: 2px 0;
}
.wc-layered-nav-list li a::before {
	content: "";
	width: 18px;
	height: 18px;
	flex-shrink: 0;
	border: 1.5px solid var(--isp-line);
	border-radius: 4px;
	background: var(--isp-surface);
	transition: border-color var(--isp-transition), background var(--isp-transition);
}
.wc-layered-nav-list li a:hover::before {
	border-color: var(--isp-brand);
}
.wc-layered-nav-list li.chosen a::before {
	background: var(--isp-brand) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='white'%3E%3Cpath d='M6.5 11.5 3 8l1-1 2.5 2.5L12 4l1 1z'/%3E%3C/svg%3E") center/11px no-repeat;
	border-color: var(--isp-brand);
}

/* Kleur (color attribute) filter: circular swatches instead of checkbox
   rows, wrapped in a grid. Swatch color comes from a small JS lookup
   (real Dutch color-term names -> CSS colors, see redesign.js) applied as
   an inline background-color on each link via a data attribute - if JS
   doesn't run, this widget still falls back to the normal checkbox list
   above, nothing is lost. */
.wc-layered-nav-list.isp-color-swatches {
	flex-direction: row;
	flex-wrap: wrap;
	gap: 10px;
	max-height: none;
	overflow: visible;
}
.wc-layered-nav-list.isp-color-swatches li {
	position: relative;
}
.wc-layered-nav-list.isp-color-swatches li a {
	display: block;
	width: 30px;
	height: 30px;
	padding: 0;
	border-radius: 50%;
	border: 1.5px solid var(--isp-line);
	box-shadow: inset 0 0 0 2px var(--isp-surface);
	background-color: var(--isp-swatch-color, var(--isp-surface-muted));
}
.wc-layered-nav-list.isp-color-swatches li a::before {
	content: none;
}
.wc-layered-nav-list.isp-color-swatches li.chosen a {
	border-color: var(--isp-brand);
	box-shadow: inset 0 0 0 2px var(--isp-surface), 0 0 0 2px var(--isp-brand);
}
.wc-layered-nav-list.isp-color-swatches li .count {
	display: none;
}
.wc-layered-nav-list .count {
	margin-left: auto;
	color: var(--isp-ink-soft);
	font-size: 12px;
}

/* Long term lists (e.g. Merk with hundreds of terms): show first 8, toggle
   the rest via JS-added .isp-term-hidden / .isp-terms-expanded. Falls back
   to showing everything if JS doesn't run (no isp-term-hidden gets added). */
.wc-layered-nav-list li.isp-term-hidden {
	display: none;
}
.wc-layered-nav-list.isp-terms-expanded li.isp-term-hidden {
	display: flex;
}
.isp-term-toggle {
	display: block;
	margin-top: var(--isp-space-2);
	padding: 0;
	background: none;
	border: 0;
	color: var(--isp-brand);
	font-family: var(--isp-font);
	font-size: 12px;
	font-weight: 700;
	cursor: pointer;
}
.isp-term-toggle:hover {
	color: var(--isp-brand-dark);
	text-decoration: underline;
}

/* Active filter count on the mobile Filter button */
.isp-filter-count {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 18px;
	height: 18px;
	padding: 0 5px;
	margin-left: 6px;
	border-radius: 999px;
	background: var(--isp-brand);
	color: #fff;
	font-size: 11px;
	font-weight: 700;
}

/* Price filter slider */
.widget_price_filter .price_slider {
	margin-bottom: var(--isp-space-4);
}
.widget_price_filter .ui-slider {
	height: 4px;
	background: var(--isp-line);
	border: 0;
	border-radius: 3px;
}
.widget_price_filter .ui-slider .ui-slider-range {
	background: var(--isp-brand);
	border-radius: 3px;
}
.widget_price_filter .ui-slider .ui-slider-handle {
	width: 16px;
	height: 16px;
	top: -6px;
	background: var(--isp-surface);
	border: 2px solid var(--isp-brand);
	border-radius: 50%;
	box-shadow: 0 1px 2px rgba(0,0,0,0.15);
}
.widget_price_filter .price_slider_amount {
	display: flex;
	align-items: center;
	justify-content: space-between;
	font-size: var(--isp-small);
}
.widget_price_filter .price_slider_amount .button {
	height: var(--isp-control-h-sm);
	padding: 0 var(--isp-space-3);
	background: var(--isp-brand);
	color: #fff;
	border-radius: var(--isp-radius-sm);
	font-weight: 600;
}

/* Active filters */
.ts-active-filters .wc-layered-nav-list,
.woocommerce .widget_layered_nav_filters ul {
	list-style: none;
	display: flex;
	flex-wrap: wrap;
	gap: var(--isp-space-2);
	margin: 0 0 var(--isp-space-4);
	padding: 0;
}
.woocommerce .widget_layered_nav_filters ul li a {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	background: var(--isp-brand-tint);
	color: var(--isp-brand-dark);
	border-radius: 999px;
	padding: 5px 10px 5px 12px;
	font-size: 12px;
	font-weight: 600;
}

/* Rating filter */
.widget_rating_filter ul {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: var(--isp-space-2);
}
.widget_rating_filter .star-rating {
	color: var(--isp-star);
}

/* Mobile filter trigger button (theme already outputs .filter-widget-area-button) */
.filter-widget-area-button {
	display: none;
}
.filter-widget-area-button a {
	display: inline-flex;
	align-items: center;
	gap: var(--isp-space-2);
	height: var(--isp-control-h);
	padding: 0 var(--isp-space-4);
	background: var(--isp-surface);
	border: 1.5px solid var(--isp-line);
	border-radius: var(--isp-radius-md);
	font-family: var(--isp-font);
	font-weight: 700;
	font-size: var(--isp-small);
	color: var(--isp-ink);
}
.filter-widget-area-button a::before {
	content: "";
	width: 16px;
	height: 16px;
	background: var(--isp-ink);
	-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M3 5h18M6 12h12M10 19h4'/%3E%3C/svg%3E") center/contain no-repeat;
	mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M3 5h18M6 12h12M10 19h4'/%3E%3C/svg%3E") center/contain no-repeat;
}

/* -------------------------------------------------------------------------
   6. PRODUCT CARDS
   Confirmed real DOM (this theme's actual attached hooks, verified against
   live output - NOT WooCommerce's stock defaults):

   section.product > .product-wrapper >
     .thumbnail-wrapper >
       a > figure > img (+ img.product-image-back for hover swap)
       .product-label.on-thumbnail > span.onsale / span.featured  (theme's
         own sale + "featured-as-new" badges)
       .product-group-button (quickshop + add-to-cart, HOVER overlay - hidden
         below, redundant with the persistent button in .meta-wrapper)
     .meta-wrapper >
       .product-categories (theme's own multi-category text - hidden below,
         replaced by our single-category .isp-card-cat, output one hook
         priority earlier so it renders in the same spot)
       h3.heading-title.product-name  (THE title - not .woocommerce-loop-
         product__title, this theme does not use that WC default class)
       .star-rating
       .price
       .product-group-button-meta (persistent add-to-cart - kept, styled)
   ------------------------------------------------------------------------- */
.woocommerce.main-products section.product {
	background: var(--isp-surface);
	border: var(--isp-border);
	border-radius: var(--isp-radius-md);
	overflow: hidden;
	transition: box-shadow var(--isp-transition), transform var(--isp-transition), border-color var(--isp-transition);
}
.woocommerce.main-products section.product:hover {
	box-shadow: var(--isp-shadow-card-hover);
	border-color: var(--isp-line);
	transform: translateY(-2px);
}
.woocommerce.main-products .product-wrapper {
	display: flex;
	flex-direction: column;
	height: 100%;
}

/* Image box: consistent square container regardless of source proportions */
.woocommerce.main-products .thumbnail-wrapper {
	position: relative;
}
.woocommerce.main-products .thumbnail-wrapper > a {
	position: relative;
	display: block;
	aspect-ratio: 1 / 1;
	background: var(--isp-surface-muted);
	overflow: hidden;
}
.woocommerce.main-products .thumbnail-wrapper figure {
	position: relative;
	width: 100%;
	height: 100%;
	margin: 0;
}
.woocommerce.main-products .thumbnail-wrapper figure img {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: contain;
	object-position: center;
	padding: var(--isp-space-4);
	transition: transform 220ms ease, opacity 220ms ease;
}
.woocommerce.main-products .thumbnail-wrapper figure img.product-image-back {
	opacity: 0;
}
.woocommerce.main-products section.product:hover .thumbnail-wrapper figure img:not(.product-image-back) {
	transform: scale(1.03);
}
.woocommerce.main-products section.product:hover .thumbnail-wrapper figure img.product-image-back {
	opacity: 1;
	transform: scale(1.03);
}

/* Badge container (theme-native: sale % + featured-as-"Nieuw") */
.woocommerce.main-products .product-label.on-thumbnail {
	position: absolute;
	top: var(--isp-space-2);
	left: var(--isp-space-2);
	right: var(--isp-space-2);
	z-index: 2;
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 4px;
	pointer-events: none;
}
.woocommerce.main-products .product-label.on-thumbnail span.onsale,
.woocommerce.main-products .product-label.on-thumbnail span.featured,
.woocommerce.main-products .product-label.on-thumbnail span.new {
	display: inline-flex;
	padding: 5px 8px;
	border-radius: var(--isp-radius-sm);
	font-family: var(--isp-font);
	font-size: 11px;
	font-weight: 700;
	line-height: 1;
}
.woocommerce.main-products .product-label.on-thumbnail span.onsale {
	background: var(--isp-sale);
	color: #fff;
}
.woocommerce.main-products .product-label.on-thumbnail span.featured,
.woocommerce.main-products .product-label.on-thumbnail span.new {
	background: var(--isp-new-tint);
	color: var(--isp-new);
}

/* Hover quick-action overlay on the image: hidden - redundant with the
   persistent add-to-cart button below, and hover-only is not mobile-usable
   anyway. This directly reduces card clutter. */
.woocommerce.main-products .thumbnail-wrapper .product-group-button {
	display: none;
}

/* Meta area */
.woocommerce.main-products .meta-wrapper {
	display: flex;
	flex-direction: column;
	flex: 1;
	padding: var(--isp-space-3) var(--isp-space-4) var(--isp-space-4);
}
.woocommerce.main-products .meta-wrapper .product-categories {
	display: none; /* replaced by the single-category .isp-card-cat below */
}
.woocommerce.main-products .isp-card-cat {
	order: -2;
	font-size: 11px;
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--isp-ink-soft);
	margin-bottom: 4px;
}
.woocommerce.main-products h3.heading-title.product-name {
	order: -1;
	font-family: var(--isp-font);
	font-size: var(--isp-body);
	font-weight: 600;
	line-height: 1.35;
	margin: 0 0 4px;
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
	min-height: calc(1.35em * 2);
}
.woocommerce.main-products h3.heading-title.product-name a {
	color: var(--isp-ink);
}
.woocommerce.main-products .star-rating {
	font-size: 13px;
	color: var(--isp-star);
	margin: 0 0 4px;
}
.woocommerce.main-products .price {
	margin: auto 0 0;
	padding-top: var(--isp-space-2);
	font-family: var(--isp-font);
	display: block;
}
.woocommerce.main-products .price .amount {
	font-size: 1.05rem;
	font-weight: 800;
	color: var(--isp-ink);
}
.woocommerce.main-products .price del .amount {
	font-size: 0.85rem;
	font-weight: 500;
	color: var(--isp-ink-soft);
	opacity: 1;
}
.woocommerce.main-products .price ins {
	text-decoration: none;
}
.woocommerce.main-products .price del {
	margin-right: 6px;
}

.woocommerce.main-products .stock {
	font-size: 12px;
	font-weight: 600;
	margin: 4px 0 0;
}
.woocommerce.main-products .stock.out-of-stock {
	color: var(--isp-sale);
}
.woocommerce.main-products .stock.in-stock {
	display: none; /* only surface low-stock / out-of-stock, per "stock info only where useful" */
}

.woocommerce.main-products .product-group-button-meta {
	margin-top: var(--isp-space-3);
}
.woocommerce.main-products .product-group-button-meta a.add_to_cart_button,
.woocommerce.main-products .product-group-button-meta a.button.product_type_simple,
.woocommerce.main-products .product-group-button-meta a.added_to_cart {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	height: var(--isp-control-h-sm);
	text-align: center;
	border-radius: var(--isp-radius-sm);
	background: var(--isp-brand);
	color: #fff !important;
	font-family: var(--isp-font);
	font-size: var(--isp-small);
	font-weight: 700;
	border: 0;
	transition: background var(--isp-transition);
}
.woocommerce.main-products .product-group-button-meta a.add_to_cart_button:hover {
	background: var(--isp-brand-dark);
}
/* This button's ONLY text content is the .ts-tooltip span (normally a
   hover-reveal tooltip on an icon-only button in the theme's own design) -
   force it to render as the permanent, always-visible button label instead. */
.woocommerce.main-products .product-group-button-meta .ts-tooltip {
	position: static !important;
	display: inline !important;
	opacity: 1 !important;
	visibility: visible !important;
	transform: none !important;
	background: none !important;
	color: inherit !important;
	padding: 0 !important;
	white-space: normal;
}

/* -------------------------------------------------------------------------
   7. SINGLE PRODUCT PAGE
   ------------------------------------------------------------------------- */
.single-product #main-content {
	padding-block: var(--isp-space-5);
}
/* Slightly more generous horizontal container padding on the product page
   specifically (24px vs the site-wide 16px), scoped to single-product only
   so shop/category pages are unaffected. */
.single-product .page-container {
	padding-inline: var(--isp-space-5);
}
/* This theme reserves a left-sidebar slot on single-product pages
   (theme option ts_prod_layout=1-1-0) pointing at "Product Detail Zijbalk"
   (product-detail-sidebar), which is confirmed EMPTY (no widgets) on this
   site - yet the theme still renders the empty <div id="left-sidebar"> and
   still narrows #main-content to make room for it (its width is reserved
   via the has-1-sidebar class regardless of whether it has content). That
   phantom empty column was a real, silent contributor to the page feeling
   unbalanced / having "random whitespace". Hiding it and reclaiming the
   width. If real widgets are ever added to that sidebar in the future,
   this rule should be revisited.
   NOTE: this does not affect the CATEGORY page sidebar (product-category-
   sidebar), which does have real filter widgets and stays untouched. */
.single-product #left-sidebar {
	display: none;
}
.single-product .page-container.has-1-sidebar #main-content {
	width: 100%;
}

/* CORRECTED STRUCTURE (verified with a real HTML parser against the live
   DOM, not assumed from the static template file - a previous pass here
   got this wrong):

   div.product                          <- normal block, NOT a grid
     .product-images-summary            <- THE two-column grid container
       div.images (.woocommerce-product-gallery)
       div.summary.entry-summary
     .woocommerce-tabs                  <- sibling of .product-images-summary,
                                            naturally full-width below it
     section.related.products           <- sibling, naturally full-width below

   .summary is nested INSIDE .product-images-summary, not a direct child of
   div.product - so div.product must stay in normal flow (display:block) and
   the grid belongs on .product-images-summary itself. The previous
   ".single-product div.product { display:grid }" plus
   ".single-product div.product > .summary ~ *" rules were both wrong for
   this reason and have been removed entirely (not left in place). */
.single-product div.product {
	display: block;
}

.single-product .product-images-summary {
	display: grid;
	grid-template-columns: minmax(0, 1.2fr) minmax(380px, 0.9fr);
	gap: var(--isp-space-7);
	align-items: start;
	width: 100%;
}
/* WooCommerce core (wp-content/plugins/woocommerce/assets/css/
   woocommerce-layout.css) applies these via a plain descendant selector,
   which still matches regardless of the .product-images-summary wrapper:
     .woocommerce div.product div.images{float:left;width:48%}
     .woocommerce div.product div.summary{float:right;width:48%;clear:none}
   Specificity of that selector: 3 classes + 2 elements = (0,3,2).
   Our previous reset (".single-product .product-images-summary > div.images")
   was only 3 classes + 1 element = (0,3,1) - LOWER, so it lost every time
   regardless of source order, and the grid track was available but the
   child only ever filled 48% of it. CSS Grid nullifies float on its own
   grid items automatically, but does not touch an explicit width - that
   still needs an explicit, sufficiently specific reset.
   New selector: 5 classes + 3 elements = (0,5,3) - wins outright. Scoped
   to single-product pages only; does not touch the shop/category grid.
   NOTE: padding-left is intentionally NOT reset on div.images here - the
   parent theme also sets a legitimate
   ".product.gallery-layout-vertical.has-gallery div.images{padding-left:58px}"
   at desktop widths, needed to make room for the vertical thumbnail strip.
   Our selector's specificity (0,5,3) would beat that one too (0,5,2) and
   wrongly strip it if we included padding here - so only float/width/
   margin are reset on div.images, while div.summary (which has no such
   legitimate padding need) gets padding reset as well. */
body.single-product.woocommerce div.product .product-images-summary > div.images {
	float: none;
	width: 100%;
	max-width: none;
	clear: none;
	margin-left: 0;
	margin-right: 0;
}
body.single-product.woocommerce div.product .product-images-summary > div.summary {
	float: none;
	width: 100%;
	max-width: none;
	clear: none;
	margin-left: 0;
	margin-right: 0;
	padding-left: 0;
	padding-right: 0;
}

.single-product div.product div.images {
	position: sticky;
	top: var(--isp-space-4);
}
/* NOT display:flex - WooCommerce's FlexSlider positions/switches slides via
   float:left + a JS-computed margin-left shift on this exact wrapper. CSS
   flexbox ignores float on its children entirely, which left the "active"
   slide floated out past the clipped viewport with no shift applied -
   main gallery image rendering fully blank on every product page. Centering
   is already handled at the image level below (object-fit:contain +
   margin-inline:auto), so no flex centering is needed here anyway. */
.single-product div.product div.images .woocommerce-product-gallery__wrapper {
	border-radius: var(--isp-radius-lg);
	overflow: hidden;
	border: var(--isp-border);
}
/* Constrain the main image itself so a tall portrait (book covers etc.)
   never dictates the whole row's height - that was the actual cause of the
   huge empty gap under the purchase panel before .woocommerce-tabs starts,
   since the grid row height is driven by its tallest column. object-fit:
   contain + max-height (not a fixed square) keeps the full image visible,
   uncropped, at a sane size instead of forcing every product to one shape. */
.single-product div.product div.images .woocommerce-product-gallery__image img {
	max-height: 560px;
	width: auto;
	height: auto;
	max-width: 100%;
	object-fit: contain;
	margin-inline: auto;
}
.single-product div.product .flex-control-thumbs {
	margin-top: var(--isp-space-3);
	gap: var(--isp-space-2);
}
.single-product div.product .flex-control-thumbs li img {
	border-radius: var(--isp-radius-sm);
	border: 1.5px solid var(--isp-line);
	transition: border-color var(--isp-transition);
}
.single-product div.product .flex-control-thumbs li img.flex-active,
.single-product div.product .flex-control-thumbs li img:hover {
	border-color: var(--isp-brand);
}

/* Purchase panel: deliberate padding (this is OUR spacing choice now, not
   fighting a legacy rule - WC core's own div.summary rule has no padding
   at all, confirmed by direct source inspection). display:block, not flex
   - vertical rhythm below is built from explicit per-element margins so
   different logical groups get different gap sizes, instead of one
   uniform flex `gap` applying the same small space everywhere. */
.single-product div.product div.summary {
	display: block;
	max-width: none;
	float: none;
	width: auto;
	padding: var(--isp-space-4) var(--isp-space-4) var(--isp-space-5);
}
/* Confirmed real DOM inside div.summary (this theme, not WC stock markup):
   .cats-link > .cat-links (category line, no real breadcrumb here)
   h1.product_title.entry-title
   .ts-product-ratings-stock > ( .star-rating (if reviews exist),
                                  .availability.stock.in-stock/out-of-stock )
   p.price
   .woocommerce-product-details__short-description
   .ts-summary-custom-content (trust content, styled further below)
   form.cart */
.single-product .cats-link {
	order: -3;
	display: block;
	margin-bottom: 6px;
	font-size: var(--isp-small);
	color: var(--isp-ink-soft);
}
.single-product .cats-link a {
	color: var(--isp-ink-soft);
}
.single-product .cats-link a:hover {
	color: var(--isp-brand);
}
.single-product div.product div.summary > .cats-link + .product_title,
.single-product div.product div.summary > .product_title + .ts-product-ratings-stock {
	margin-top: 0;
}
.single-product h1.product_title {
	order: -2;
	margin: 0 0 14px;
	font-size: clamp(1.75rem, 1.3rem + 1.8vw, 2.25rem);
	line-height: 1.2;
	font-weight: 700;
}
.single-product .ts-product-ratings-stock {
	order: -1;
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: var(--isp-space-3);
	margin-bottom: 22px;
}
.single-product .ts-product-ratings-stock .star-rating {
	color: var(--isp-star);
}
/* Price as the visual anchor: generous margin instead of border lines -
   whitespace creates the separation, not a boxed/ruled-off area. */
.single-product p.price {
	display: flex;
	align-items: baseline;
	flex-wrap: wrap;
	gap: 10px;
	font-family: var(--isp-font);
	margin: 0 0 24px;
	line-height: 1;
}
.single-product p.price .amount {
	font-size: 2.25rem;
	font-weight: 800;
	color: var(--isp-ink);
	letter-spacing: -0.01em;
}
.single-product p.price del {
	margin: 0;
}
.single-product p.price del .amount {
	font-size: 1.1rem;
	font-weight: 500;
	color: var(--isp-ink-soft);
}
.single-product p.price ins {
	text-decoration: none;
}
.single-product .availability.stock {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	width: fit-content;
	padding: 4px 10px;
	border-radius: 999px;
	font-size: 12px;
	font-weight: 700;
}
.single-product .availability.stock.in-stock {
	background: var(--isp-new-tint);
	color: var(--isp-new);
}
.single-product .availability.stock.out-of-stock {
	background: var(--isp-sale-tint);
	color: var(--isp-sale);
}
.single-product .woocommerce-product-details__short-description {
	margin-bottom: 20px;
	color: var(--isp-ink-soft);
	font-size: var(--isp-body);
	line-height: 1.6;
}
.single-product .woocommerce-product-details__short-description p {
	margin: 0;
}

/* Trust / benefits row: restyles the existing real policy list (.ts-summary-custom-content) */
.single-product .ts-summary-custom-content {
	background: var(--isp-surface-muted);
	border: var(--isp-border);
	border-radius: var(--isp-radius-md);
	padding: var(--isp-space-4);
	margin-bottom: 24px;
}
.single-product .ts-summary-custom-content ul {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: var(--isp-space-2);
}
.single-product .ts-summary-custom-content li {
	display: flex;
	align-items: flex-start;
	gap: var(--isp-space-2);
	font-size: var(--isp-small);
	color: var(--isp-ink);
}
.single-product .ts-summary-custom-content li::before {
	content: "";
	flex-shrink: 0;
	width: 16px;
	height: 16px;
	margin-top: 2px;
	background: var(--isp-brand);
	-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 11.5 3 8l1-1 2.5 2.5L12 4l1 1z'/%3E%3C/svg%3E") center/contain no-repeat;
	mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 11.5 3 8l1-1 2.5 2.5L12 4l1 1z'/%3E%3C/svg%3E") center/contain no-repeat;
}

/* Quantity + add to cart: the primary conversion action. Space above comes
   from the trust box's own margin-bottom (24px) directly above it, so no
   extra padding-top is added here (that would double the gap). */
.single-product form.cart {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--isp-space-3);
}
.single-product form.cart .quantity .number-button {
	display: flex;
	align-items: center;
	height: var(--isp-control-h);
	border: 1.5px solid var(--isp-line);
	border-radius: var(--isp-radius-md);
	overflow: hidden;
}
.single-product form.cart .quantity input.qty {
	width: 48px;
	height: 100%;
	border: 0;
	text-align: center;
	font-weight: 700;
	font-family: var(--isp-font);
}
.single-product form.cart .quantity input[type="button"] {
	width: 36px;
	height: 100%;
	border: 0;
	background: var(--isp-surface-muted);
	color: var(--isp-ink);
	font-size: 16px;
	cursor: pointer;
}
.single-product form.cart button[type="submit"],
.single-product form.cart .single_add_to_cart_button {
	flex: 1;
	min-width: 200px;
	height: 52px;
	border: 0;
	border-radius: var(--isp-radius-md);
	background: var(--isp-brand);
	color: #fff;
	font-family: var(--isp-font);
	font-size: 1rem;
	font-weight: 800;
	letter-spacing: 0.01em;
	transition: background var(--isp-transition), transform var(--isp-transition);
}
.single-product form.cart button[type="submit"]:hover {
	background: var(--isp-brand-dark);
}

/* -------------------------------------------------------------------------
   8. TABS / RELATED PRODUCTS
   ------------------------------------------------------------------------- */
.woocommerce-tabs {
	max-width: 960px;
	margin-inline: auto;
}
.woocommerce-tabs ul.tabs {
	list-style: none;
	display: flex;
	gap: var(--isp-space-5);
	border-bottom: var(--isp-border);
	margin: var(--isp-space-7) 0 0;
	padding: 0;
}
.woocommerce-tabs ul.tabs li a {
	display: block;
	padding: var(--isp-space-3) 0;
	font-family: var(--isp-font);
	font-weight: 700;
	color: var(--isp-ink-soft);
	border-bottom: 2px solid transparent;
}
.woocommerce-tabs ul.tabs li.active a {
	color: var(--isp-brand);
	border-bottom-color: var(--isp-brand);
}

/* Editorial description styling: readable line-height, clear heading
   hierarchy, real paragraph spacing - the description is real product
   content, not something we invent or restructure, just style well. */
.woocommerce-tabs .panel {
	padding-top: var(--isp-space-5);
	line-height: 1.7;
	color: var(--isp-ink-soft);
	font-size: var(--isp-body);
}
.woocommerce-tabs .panel > *:first-child {
	margin-top: 0;
}
.woocommerce-tabs .panel p {
	margin: 0 0 var(--isp-space-4);
}
.woocommerce-tabs .panel h2 {
	font-family: var(--isp-font);
	font-size: var(--isp-h2);
	font-weight: 700;
	color: var(--isp-ink);
	margin: var(--isp-space-6) 0 var(--isp-space-3);
}
.woocommerce-tabs .panel h3 {
	font-family: var(--isp-font);
	font-size: var(--isp-h3);
	font-weight: 700;
	color: var(--isp-ink);
	margin: var(--isp-space-5) 0 var(--isp-space-2);
}
.woocommerce-tabs .panel ul,
.woocommerce-tabs .panel ol {
	margin: 0 0 var(--isp-space-4);
	padding-left: 1.25em;
}
.woocommerce-tabs .panel li {
	margin-bottom: 6px;
}

/* "Extra informatie" attribute table - clean spec block, only shows
   attributes that already exist on the product (WooCommerce's own logic) */
.woocommerce-tabs table.woocommerce-product-attributes {
	width: 100%;
	border-collapse: collapse;
	margin-top: var(--isp-space-2);
}
.woocommerce-tabs table.woocommerce-product-attributes th,
.woocommerce-tabs table.woocommerce-product-attributes td {
	padding: var(--isp-space-3) var(--isp-space-3);
	border-bottom: var(--isp-border);
	text-align: left;
	font-size: var(--isp-small);
}
.woocommerce-tabs table.woocommerce-product-attributes th {
	width: 35%;
	font-weight: 700;
	color: var(--isp-ink);
	background: var(--isp-surface-muted);
}
.woocommerce-tabs table.woocommerce-product-attributes td {
	color: var(--isp-ink-soft);
}

/* Reviews: visually separated from the description above it */
.woocommerce-tabs #reviews {
	padding-top: var(--isp-space-5);
	border-top: var(--isp-border);
	margin-top: var(--isp-space-5);
}
.woocommerce-tabs #reviews .woocommerce-Reviews-title {
	font-family: var(--isp-font);
	font-size: var(--isp-h2);
	font-weight: 700;
	color: var(--isp-ink);
}

.single-product .summary .related.products {
	margin-top: 32px;
	padding-top: 28px;
	border-top: var(--isp-border);
}
.single-product .summary .related.products > h2 {
	font-size: 1.2rem;
	margin-bottom: 18px;
}
.single-product .summary .related.products .products {
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 16px;
}

.related.products,
.upsells.products {
	margin-top: var(--isp-space-7);
	padding-top: var(--isp-space-6);
	border-top: var(--isp-border);
}
.related.products > h2,
.upsells.products > h2 {
	font-family: var(--isp-font);
	font-size: var(--isp-h2);
	font-weight: 700;
	margin-bottom: var(--isp-space-4);
}
.related.products .products,
.upsells.products .products {
	display: grid;
	grid-template-columns: repeat(4, minmax(0, 1fr));
	gap: var(--isp-space-4);
}

/* -------------------------------------------------------------------------
   9. RESPONSIVE
   ------------------------------------------------------------------------- */
@media (max-width: 1024px) {
	.woocommerce.main-products .products {
		grid-template-columns: repeat(3, minmax(0, 1fr)) !important;
	}
	.related.products .products,
	.upsells.products .products {
		grid-template-columns: repeat(3, minmax(0, 1fr));
	}
	.single-product .product-images-summary {
		gap: var(--isp-space-5);
	}
}

@media (max-width: 900px) {
	#left-sidebar.ts-sidebar {
		position: fixed;
		top: 0;
		left: 0;
		bottom: 0;
		width: min(340px, 86vw);
		flex: none;
		z-index: 10000;
		background: var(--isp-surface);
		padding: var(--isp-space-4);
		overflow-y: auto;
		transform: translateX(-100%);
		transition: transform 220ms ease;
		box-shadow: var(--isp-shadow-card-hover);
	}
	.show-filter-sidebar #left-sidebar.ts-sidebar,
	.filter-sidebar-open #left-sidebar.ts-sidebar {
		transform: translateX(0);
	}
	.filter-widget-area-button {
		display: block;
		margin-bottom: var(--isp-space-4);
	}
	.page-container.overlay-active::after,
	body.filter-sidebar-open::after {
		content: "";
		position: fixed;
		inset: 0;
		background: rgba(20, 24, 30, 0.45);
		z-index: 9999;
	}

	.single-product .product-images-summary {
		/* minmax(0,1fr), not plain 1fr - a bare 1fr track still sizes to its
		   content's min-content, and FlexSlider's JS-computed desktop slide
		   width (set before/independent of this breakpoint) is more than
		   wide enough to inflate the track and push the gallery image
		   outside the visible column on mobile. Same fix as the shop grid. */
		grid-template-columns: minmax(0, 1fr);
	}
	.single-product div.product div.images {
		position: static;
	}
	.single-product div.product div.images .woocommerce-product-gallery__image img {
		max-height: 70vh;
	}
	.single-product div.product div.summary {
		padding: var(--isp-space-4) var(--isp-space-3) var(--isp-space-5);
	}

	/* Tabs -> always-visible stacked sections on mobile (each panel already
	   has its own <h2> from this theme, so nothing needs to be invented).
	   Simpler and more discoverable than a custom accordion widget, and
	   needs no extra JS - WooCommerce's own tab-switching JS still runs
	   harmlessly in the background, it just no longer controls visibility
	   here since we force every panel to stay visible with !important. */
	.woocommerce-tabs ul.tabs {
		display: none;
	}
	.woocommerce-tabs .panel {
		display: block !important;
		padding-top: var(--isp-space-6);
		border-top: var(--isp-border);
	}
	.woocommerce-tabs .panel:first-of-type {
		border-top: 0;
	}
}

@media (max-width: 768px) {
	.woocommerce.main-products .products {
		grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
		gap: var(--isp-space-3) var(--isp-space-2);
	}
	.related.products .products,
	.upsells.products .products {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
	.page-container {
		padding-inline: var(--isp-space-3);
	}
	body.archive.tax-product_cat .page-container.has-1-sidebar {
		padding-top: 18px;
	}
	#masthead .is-search-form {
		max-width: none;
	}
}

@media (max-width: 480px) {
	.woocommerce.main-products .products {
		grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
		gap: var(--isp-space-2);
	}
	.woocommerce.main-products .woocommerce-loop-product__title {
		font-size: var(--isp-small);
	}
	.woocommerce.main-products .price .amount {
		font-size: 0.95rem;
	}
	.single-product form.cart {
		flex-direction: column;
		align-items: stretch;
	}
	.single-product form.cart button[type="submit"],
	.single-product form.cart .single_add_to_cart_button {
		width: 100%;
	}
}

/* =========================================================================
   ISLAMSPULLEN HEADER/FOOTER RESTORE — 2026-09-24
   Restores the approved Elementor HF 48417 / 48702 presentation only.
   ========================================================================= */
@media (min-width: 993px) {
	#masthead .elementor-48417 > .elementor-element-2349c7d,
	#masthead .elementor-48417 > .elementor-element-14ab2a5 {
		display: flex !important;
	}
	#masthead .elementor-48417 > .elementor-element-4ee871d,
	#masthead .elementor-48417 > .elementor-element-202aac2,
	#masthead .elementor-48417 > .elementor-element-00357cc {
		display: none !important;
	}
	#masthead .elementor-48417 > .elementor-element-2349c7d {
		background:#4e7a76!important;
		margin:0!important;
	}
	#masthead .elementor-48417 > .elementor-element-2349c7d > .e-con-inner {
		display:grid!important;
		grid-template-columns:220px minmax(360px,1fr) auto auto auto;
		align-items:center!important;
		gap:24px!important;
		max-width:1280px!important;
		width:100%!important;
		padding:12px 24px!important;
	}
	#masthead .elementor-48417 > .elementor-element-2349c7d > .e-con-inner > .e-con {
		margin:0!important;
		--margin-top:0px;--margin-right:0px;--margin-bottom:0px;--margin-left:0px;
		padding:0!important;
		--padding-top:0px;--padding-right:0px;--padding-bottom:0px;--padding-left:0px;
		width:auto!important;
		--width:auto;
	}
	#masthead .elementor-48417 .elementor-element-8c47ff3 {
		width:180px!important;max-width:180px!important;
	}
	#masthead .elementor-48417 .elementor-element-8c47ff3 img {
		width:180px!important;max-width:180px!important;max-height:46px!important;object-fit:contain;
	}
	#masthead .elementor-48417 .elementor-element-66ca924 {width:100%!important;}
	#masthead .elementor-48417 .is-search-form {
		width:100%!important;max-width:620px!important;margin:0 auto!important;
	}
	#masthead .elementor-48417 .is-search-input {
		height:46px!important;background:#f7f7f8!important;border:0!important;
		border-radius:8px!important;padding:0 58px 0 16px!important;
	}
	#masthead .elementor-48417 .is-search-submit {
		height:46px!important;width:48px!important;background:#f5a300!important;
		color:#fff!important;border-radius:0 8px 8px 0!important;
	}
	#masthead .elementor-48417 .elementor-widget-icon-box .elementor-icon-box-wrapper {
		display:flex!important;align-items:center!important;gap:8px!important;white-space:nowrap;
	}
	#masthead .elementor-48417 .elementor-icon,
	#masthead .elementor-48417 .elementor-icon svg {
		color:#fff!important;fill:#fff!important;
	}
	#masthead .elementor-48417 .elementor-icon-box-title,
	#masthead .elementor-48417 .elementor-icon-box-title a {
		color:#fff!important;font-size:14px!important;font-weight:700!important;margin:0!important;
	}
	#masthead .elementor-48417 > .elementor-element-14ab2a5 {
		background:#fff!important;margin:0!important;transform:none!important;
	}
	#masthead .elementor-48417 > .elementor-element-14ab2a5 > .e-con-inner {
		max-width:1280px!important;width:100%!important;padding:0 24px!important;margin:0 auto!important;
	}
	#masthead .elementor-48417 .elementor-element-17a3cb2 {width:100%!important;}
	#masthead .elementor-48417 .elementor-element-17a3cb2 > .elementor-widget-container {
		margin:0!important;padding:0!important;
	}
	#masthead .elementor-48417 .elementor-element-17a3cb2 a.hfe-menu-item {
		color:#1a2027!important;font-size:14px!important;font-weight:700!important;
		padding:17px 22px!important;
	}
	#masthead .elementor-48417 .elementor-element-17a3cb2 a.hfe-menu-item:hover {
		color:#4e7a76!important;
	}
	/* The desktop header-restore rule above (added 2026-09-24, pre-dating the
	   active-category feature) hardcodes color:#1a2027!important on EVERY
	   nav link in this specific widget instance - which is the ONE actually
	   visible at >=993px (confirmed live: this theme has several duplicate
	   Elementor nav-menu widget copies for different breakpoints, each
	   .elementor-hidden-* on all but one; #masthead .menu-item.current-
	   menu-item (base active-state rule, ~line 250) has no !important and
	   lower specificity, so it lost silently - underline showed, text color
	   never did). This override matches it exactly: same !important, plus
	   the .current-menu-item/-ancestor class for higher specificity, so it
	   wins regardless of source order. Hover above stays #4e7a76 (teal, this
	   widget's own color, untouched) - visibly different from brand blue,
	   so active vs. hover stay distinguishable. */
	#masthead .elementor-48417 .elementor-element-17a3cb2 .menu-item.current-menu-item a.hfe-menu-item,
	#masthead .elementor-48417 .elementor-element-17a3cb2 .menu-item.current-menu-ancestor a.hfe-menu-item {
		color: var(--isp-brand) !important;
		box-shadow: inset 0 -2px 0 0 var(--isp-brand);
	}
}

/* =========================================================================
   MOBILE HEADER FIX — 2026-10-03
   993px matches the exact cutoff the restore block above already uses
   (elementor-element-4ee871d/202aac2/00357cc are only ever shown below it -
   confirmed via their own native elementor-hidden-desktop/-laptop classes).

   Root cause, confirmed by measuring the live DOM before this fix:
   - Row 1 (element-4ee871d: hamburger/logo/account/cart) measured 167px
     tall with the cart icon at y=168, well below the logo (y=97) and
     account icon (y=92) - it was wrapping onto its own second line. The
     cart toggle button renders a price span ("€0.00") plus icon plus
     badge inside a ~10%-width flex slot (~37px at 375px wide) - nowhere
     near enough room, forcing the wrap. Not a z-index or absolute-
     positioning issue; a plain content-overflow flex-wrap.
   - Row 2 (element-202aac2: search) already sits in normal document flow
     directly under row 1, at y=223 - it was never floating or absolutely
     positioned. The actual bug: when the hamburger opens, HFE's own
     dropdown panel (nav.hfe-dropdown, gets class "menu-is-active") is
     measured opening at y=145 for 312px tall - a range that fully
     contains the search row's y=223-299 - so the two simply stack on
     top of each other with the panel's own background painting over the
     search field. Fixed by hiding the search row for as long as that
     class is present (:has(), not JS - supported in the evergreen
     browsers this site targets), matching the acceptance criteria's
     "absolutely NO search field floating over menu links" exactly,
     rather than fighting z-index/positioning to keep both visible at
     once. */
@media (max-width: 992px) {
	/* Row 1: one real flex row, no wrapping. Overrides Elementor's own
	   percentage-width children (20/50/10/10%), which is what let the
	   cart's min-content width force a second line. */
	#masthead .elementor-48417 > .elementor-element-4ee871d {
		min-height: 0 !important;
	}
	#masthead .elementor-48417 > .elementor-element-4ee871d > .e-con-inner {
		position: relative !important;
		display: flex !important;
		flex-wrap: nowrap !important;
		align-items: center !important;
		/* NOT space-between: with 3 flex items left in normal flow
		   (hamburger, account, cart - the logo is taken out via
		   position:absolute below), space-between pushes the MIDDLE
		   item (account) to the row's horizontal center - directly
		   where the centered logo also sits, which is what caused the
		   account icon and cart badge to land on top of the logo text.
		   flex-start + margin-left:auto on the account icon (below)
		   keeps hamburger pinned left and groups account+cart into one
		   tight right-aligned cluster instead, leaving the true center
		   free for the logo alone. */
		justify-content: flex-start !important;
		gap: var(--isp-space-3) !important;
		padding: var(--isp-space-2) var(--isp-space-3) !important;
		width: 100% !important;
		min-height: 52px !important;
	}
	/* Higher specificity than the blanket ".e-con-inner > .e-con{margin:0
	   !important}" rule above (same ancestor chain, but the final segment
	   matches two classes instead of one) - needed because that earlier
	   !important rule otherwise wins regardless of source order, no
	   matter how the override rule writes the margin. */
	#masthead .elementor-48417 > .elementor-element-4ee871d > .e-con-inner > .elementor-element-203479a.e-con {
		margin: 0 0 0 auto !important;
	}
	#masthead .elementor-48417 > .elementor-element-4ee871d > .e-con-inner > .e-con {
		width: auto !important;
		max-width: none !important;
		margin: 0 !important;
		padding: 0 !important;
		flex: 0 0 auto !important;
	}
	/* Logo: mathematically centered on the header ROW (not the leftover
	   flex gap between hamburger and account/cart, which is off-center
	   since the right side carries two icons against the left's one).
	   position:absolute takes it out of the flex flow entirely, so
	   hamburger/account/cart space themselves independently via the
	   row's own justify-content:space-between above - the logo's
	   centering is never affected by how much icon weight sits on
	   either side. */
	#masthead .elementor-48417 .elementor-element-89e67ab {
		position: absolute !important;
		left: 50% !important;
		top: 50% !important;
		transform: translate(-50%, -50%) !important;
		z-index: 2;
		pointer-events: none;
	}
	#masthead .elementor-48417 .elementor-element-89e67ab a {
		pointer-events: auto;
	}
	#masthead .elementor-48417 .elementor-element-89e67ab img {
		width: 170px !important;
		max-width: none !important;
		height: auto !important;
	}
	@media (max-width: 389px) {
		#masthead .elementor-48417 .elementor-element-89e67ab img {
			width: 158px !important;
		}
	}
	@media (max-width: 349px) {
		#masthead .elementor-48417 .elementor-element-89e67ab img {
			width: 140px !important;
		}
	}
	/* Hamburger, account, cart: fixed-size icon slots, vertically centered */
	#masthead .elementor-48417 .elementor-element-a6811a4,
	#masthead .elementor-48417 .elementor-element-203479a,
	#masthead .elementor-48417 .elementor-element-0b00bac {
		display: flex !important;
		align-items: center !important;
	}
	#masthead .elementor-48417 .elementor-element-41de6d7 {
		margin: 0 !important;
		padding: 0 !important;
	}
	/* Cart: icon + count badge only - the price text ("€0.00") is what
	   was forcing the wrap; dropping it is also simply more compact,
	   matching the target's "[ cart ]" icon-only spec.
	   Also constrains width on every level of the widget's own markup:
	   even with the price text hidden, the cart's rendered box measured
	   130-150px (vs. its ~21px visible icon) - Elementor compiles an
	   explicit width onto one of these nested wrappers regardless of
	   visible content, and that extra invisible width was what still
	   pushed the button's effective position left into the centered
	   logo once it was flush against the row's right edge. */
	#masthead .elementor-48417 .elementor-element-0b00bac,
	#masthead .elementor-48417 .elementor-element-0b00bac .elementor-widget-container,
	#masthead .elementor-48417 .elementor-menu-cart__wrapper,
	#masthead .elementor-48417 .elementor-menu-cart__toggle_wrapper,
	#masthead .elementor-48417 .elementor-menu-cart__toggle {
		width: auto !important;
		min-width: 0 !important;
		max-width: none !important;
	}
	/* The outer wrappers (0b00bac down to toggle_wrapper) were correctly
	   centered within the header row, but the actual button inside them
	   was pinned to their top edge rather than centered within THEIR
	   height - a few px shorter than its container, so it sat visibly
	   higher than the account icon next to it. Centering at every
	   nesting level fixes that. */
	#masthead .elementor-48417 .elementor-element-0b00bac,
	#masthead .elementor-48417 .elementor-element-0b00bac .elementor-widget-container,
	#masthead .elementor-48417 .elementor-menu-cart__wrapper,
	#masthead .elementor-48417 .elementor-menu-cart__toggle_wrapper {
		display: flex !important;
		align-items: center !important;
		height: 100% !important;
	}
	/* The cart widget's own .elementor-widget-container (one level
	   further in than element-0b00bac, its outer container) carries an
	   Elementor-compiled margin of 0px 0px -10px -18px at this exact
	   breakpoint - a negative left margin that pulled it 18px left of
	   its actual flex position, overlapping the account icon right next
	   to it. Not a width issue this time - a leftover native margin
	   this fix never reset. */
	#masthead .elementor-48417 .elementor-element-9876cfb,
	#masthead .elementor-48417 .elementor-element-9876cfb .elementor-widget-container {
		margin: 0 !important;
	}
	#masthead .elementor-48417 .elementor-menu-cart__toggle_button {
		display: flex !important;
		align-items: center !important;
		gap: 2px !important;
		padding: 0 !important;
		width: auto !important;
		min-width: 0 !important;
		max-width: none !important;
	}
	#masthead .elementor-48417 .elementor-menu-cart__toggle_button .elementor-button-text {
		display: none !important;
	}

	/* Row 2: search, normal flow directly below row 1 - already was, this
	   just removes any inherited margin so the two rows sit flush. */
	#masthead .elementor-48417 > .elementor-element-202aac2 {
		margin: 0 !important;
	}
	#masthead .elementor-48417 > .elementor-element-202aac2 .is-search-form {
		margin: 0 !important;
	}

	/* Open-menu state: hide row 2 for as long as the dropdown panel is
	   open, instead of letting the two overlap. */
	#masthead .elementor-48417:has(.elementor-element-41de6d7 nav.menu-is-active) > .elementor-element-202aac2 {
		display: none !important;
	}

	/* Dropdown panel: predictable stacking above the (now-hidden) search
	   row and page content, full width, starting right under row 1. */
	#masthead .elementor-48417 .elementor-element-41de6d7 nav.hfe-dropdown {
		z-index: 10000 !important;
	}

	/* Active category in the mobile menu too (desktop-only version of
	   this rule already exists above, scoped to elementor-element-17a3cb2
	   specifically - this is its element-41de6d7 counterpart). */
	#masthead .elementor-48417 .elementor-element-41de6d7 .menu-item.current-menu-item a.hfe-menu-item,
	#masthead .elementor-48417 .elementor-element-41de6d7 .menu-item.current-menu-ancestor a.hfe-menu-item {
		color: var(--isp-brand) !important;
		box-shadow: inset 0 -2px 0 0 var(--isp-brand);
	}
}

#colophon,
#colophon .elementor-48702 {background:#4f8178!important;color:#fff;}
#colophon .elementor-48702 > .elementor-element-3269250 {
	background:#4f8178!important;margin:0!important;
}
#colophon .elementor-48702 > .elementor-element-3269250 > .e-con-inner {
	display:grid!important;
	grid-template-columns:1fr 1.2fr 1fr 2fr!important;
	gap:42px!important;
	max-width:1280px!important;
	width:100%!important;
	padding:48px 24px!important;
	margin:0 auto!important;
}
#colophon .elementor-48702 > .elementor-element-3269250 > .e-con-inner > .e-con {
	width:100%!important;--width:100%;margin:0!important;
	--margin-top:0px;--margin-right:0px;--margin-bottom:0px;--margin-left:0px;
}
#colophon .elementor-48702 .elementor-heading-title,
#colophon .elementor-48702 p,
#colophon .elementor-48702 a.hfe-menu-item,
#colophon .elementor-48702 a {color:#fff!important;}
#colophon .elementor-48702 .elementor-social-icon {
	background:#fff!important;color:#4f8178!important;
}
#colophon .elementor-48702 .elementor-social-icon svg,
#colophon .elementor-48702 .elementor-social-icon i {fill:#4f8178!important;color:#4f8178!important;}
#colophon .elementor-48702 .elementor-element-68390c93 .elementor-form-fields-wrapper {
	display:flex!important;flex-wrap:nowrap!important;max-width:330px!important;width:100%!important;
	margin:0!important;
}
#colophon .elementor-48702 .elementor-element-68390c93 .elementor-field-type-email {
	flex:1 1 auto!important;width:auto!important;min-width:0!important;padding:0!important;margin:0!important;
}
#colophon .elementor-48702 .elementor-element-68390c93 .elementor-field-type-submit {
	flex:0 0 120px!important;width:120px!important;padding:0!important;margin:0!important;
}
#colophon .elementor-48702 .elementor-element-68390c93 input[type="email"],
#colophon .elementor-48702 .elementor-element-68390c93 button[type="submit"] {
	height:44px!important;
}
#colophon .elementor-48702 > .elementor-element-b186c0b {
	background:#111!important;margin:0!important;
}
#colophon .elementor-48702 > .elementor-element-b186c0b > .e-con-inner {
	display:grid!important;grid-template-columns:1fr auto!important;align-items:center!important;
	max-width:1280px!important;width:100%!important;padding:16px 24px!important;margin:0 auto!important;
}
#colophon .elementor-48702 .elementor-element-4e865e0 img {
	max-height:28px!important;height:auto!important;width:auto!important;max-width:100%!important;
}
@media (max-width: 1024px) {
	#colophon .elementor-48702 > .elementor-element-3269250 > .e-con-inner {
		grid-template-columns:1fr 1fr!important;gap:32px!important;padding:40px 24px!important;
	}
}
@media (max-width: 767px) {
	#colophon .elementor-48702 > .elementor-element-3269250 > .e-con-inner {
		grid-template-columns:1fr!important;gap:26px!important;padding:34px 20px!important;
	}
	#colophon .elementor-48702 > .elementor-element-b186c0b > .e-con-inner {
		grid-template-columns:1fr!important;gap:14px!important;text-align:center!important;
	}
	#colophon .elementor-48702 .elementor-element-68390c93 .elementor-form-fields-wrapper {
		max-width:100%!important;
	}
}

/* Footer bottom-bar alignment polish */
#colophon .elementor-48702 .elementor-element-b186c0b > .e-con-inner > .e-con {
	width:100%!important;--width:100%;margin:0!important;
}
#colophon .elementor-48702 .elementor-element-748f023 > .e-con-inner,
#colophon .elementor-48702 .elementor-element-b081062 > .e-con-inner {
	width:100%!important;max-width:none!important;padding:0!important;margin:0!important;
}
#colophon .elementor-48702 .elementor-element-4eaed14 p {
	margin:0!important;white-space:nowrap;font-size:13px!important;line-height:1.4!important;
}
#colophon .elementor-48702 .elementor-element-4e865e0 {
	text-align:right!important;width:100%!important;
}
#colophon .elementor-48702 .elementor-element-4e865e0 img {
	width:auto!important;max-width:420px!important;max-height:28px!important;
}
