/* ==========================================================================
   DOT Made — woocommerce.css
   Product card (shared by shop loop + Elementor rails), shop grid, and the
   merchandising blocks rendered by the DOT Made Elements plugin.
   ========================================================================== */

/* ---- Shop / archive grid ------------------------------------------------- */
.dm-shop { padding: 24px 24px 0; display: block; } /* bottom space: .dm-footer margin (footer.css) */
/* AJAX filter/sort in-flight state (theme.js) — a body-level class since the
   mobile filter/sort sheets live outside .dm-shop (printed in wp_footer) but
   their bodies also swap on every filter/sort change. Deliberately excludes
   .dm-shop__aside/.dm-department — the category widget has its own sliding-
   panel transition (see .dm-department__viewport below) and dimming the
   whole sidebar around it on every fetch is exactly the "reload" look that
   was cut. Only the "Filters" section and mobile sheets' non-category
   content dim, via their own selectors, not a blanket .dm-shop__aside rule.
   The skeleton grid itself is the loading signal, so it stays at full
   strength; only its siblings in .dm-shop__main dim. */
.dm-ajax-loading .dm-shop__main > :not(.dm-skeleton-grid),
.dm-ajax-loading .dm-shop__aside-section--filters,
.dm-ajax-loading .dm-mobile-filters-rest,
.dm-ajax-loading #dm-sort-sheet .dm-sheet__body { opacity: 0.5; pointer-events: none; transition: opacity 0.15s ease; }
.woocommerce ul.products,
ul.products {
	list-style: none; margin: 0; padding: 0;
	display: grid; gap: var(--dm-gap);
	grid-template-columns: repeat(4, 1fr);
}
ul.products::before, ul.products::after { content: none !important; }
.dm-cell { list-style: none; margin: 0 !important; width: auto !important; float: none !important; }

.woocommerce-products-header__title,
.dm-shop h1 { font-family: var(--dm-display); font-weight: 700; }

.woocommerce-breadcrumb { font-size: 12.5px; color: var(--dm-muted); margin: 0 0 10px; }
.woocommerce-breadcrumb a { color: var(--dm-muted); }
.woocommerce-breadcrumb a:hover { color: var(--dm-green-dark); }

/* Shop/category/tag title + breadcrumb (inc/archive.php's
   dotmade_render_shop_header_top() — not WooCommerce's own breadcrumb,
   which single-product still uses via .woocommerce-breadcrumb above).
   Only a sub-category (one with a parent) gets the .dm-breadcrumb row; the
   plain Shop page gets neither, and a top-level category gets just the H1. */
.dm-shop__header-top .woocommerce-products-header__title { margin: 0 0 6px; }
.dm-breadcrumb { font-size: 12.5px; color: var(--dm-muted); margin: 0 0 8px; }
.dm-breadcrumb a { color: var(--dm-muted); }
.dm-breadcrumb a:hover { color: var(--dm-green-dark); }
.dm-breadcrumb__sep { margin: 0 5px; color: var(--dm-line-strong); }
.dm-breadcrumb__current { color: var(--dm-ink); font-weight: 600; }

/* Product count + sort row under the title (see inc/archive.php — the two
   are rendered together on purpose so they can share this flex row, which
   isn't possible with WooCommerce's default result-count/ordering hooks
   since they aren't DOM siblings). */
.dm-shop__meta {
	display: flex; align-items: center; justify-content: space-between;
	gap: 16px; margin: 6px 0 18px; padding-bottom: 14px;
	border-bottom: 1px solid var(--dm-line);
}
.dm-shop__count { color: var(--dm-muted); font-size: 13.5px; margin: 0; }
.dm-shop__sort { display: flex; align-items: center; gap: 8px; flex: 0 0 auto; }
.dm-shop__sort-label { font-size: 13.5px; color: var(--dm-body); white-space: nowrap; }
.dm-shop__sort select,
.woocommerce-ordering select {
	appearance: none; -webkit-appearance: none;
	background: #fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%238a9099' stroke-width='1.5' fill='none'/%3E%3C/svg%3E") right 12px center no-repeat;
	border: 1px solid var(--dm-line-strong); border-radius: 8px;
	padding: 9px 34px 9px 13px; font: 600 13.5px var(--dm-font); color: var(--dm-ink);
	cursor: pointer;
}
.dm-shop__sort select:hover,
.woocommerce-ordering select:hover { border-color: var(--dm-green); }

/* Desktop filter sidebar on shop/category/tag archives (hidden below 768px —
   the mobile filter sheet covers that instead, see the media query below). */
.dm-shop.dm-shop--with-sidebar {
	display: grid;
	grid-template-columns: 240px 1fr;
	align-items: start;
	gap: 28px;
}
.dm-shop.dm-shop--with-sidebar .dm-shop__main { min-width: 0; }
.dm-shop__aside { order: -1; }
.dm-shop__aside-head { display: flex; align-items: center; justify-content: space-between; margin: 0 0 16px; }
.dm-shop__aside-title { font: 700 16px var(--dm-display); margin: 0 0 16px; color: var(--dm-ink); }
.dm-shop__aside-head .dm-shop__aside-title { margin: 0; }
.dm-shop__aside-clear { font: 600 12.5px var(--dm-font); color: var(--dm-green-dark); }
.dm-shop__aside-clear:hover { text-decoration: underline; }
/* The sidebar stays in view while the grid scrolls or grows ("Load more").
   Only where it sits beside the grid (>1024px; it stacks above it below
   that). If it's taller than the screen it scrolls on its own. Needs
   html/body `overflow-x: clip`, not `hidden` (theme.css), or sticky is dead. */
@media (min-width: 1025px) {
	.dm-shop__aside {
		position: sticky; top: 16px;
		max-height: calc(100vh - 32px); overflow-y: auto; overscroll-behavior: contain;
		padding-right: 6px; scrollbar-width: thin; scrollbar-color: var(--dm-line-strong) transparent;
	}
	.admin-bar .dm-shop__aside { top: 48px; max-height: calc(100vh - 64px); }
}

/* Desktop sidebar filters: each section is divided from the next, and its
   option list scrolls on its own once it passes ~8½ rows (the half row hints
   there's more). Scroll shadows are pure CSS: the --dm-bg "covers" scroll
   with the content (local) and hide the shadows (scroll) at either end. The
   mobile filter sheet is untouched; the sheet itself scrolls. */
.dm-shop__aside .dm-filter-widget {
	margin-bottom: 14px; padding-bottom: 14px;
	border-bottom: 1px solid var(--dm-line);
}
.dm-shop__aside .dm-filter-widget:last-child { margin-bottom: 0; padding-bottom: 0; border-bottom: 0; }
.dm-shop__aside .dm-filter-widget ul {
	max-height: 280px; overflow-y: auto; overscroll-behavior: contain;
	padding-right: 6px; scrollbar-width: thin; scrollbar-color: var(--dm-line-strong) transparent;
	background:
		linear-gradient(var(--dm-bg) 30%, rgba(246, 247, 249, 0)) 0 0 / 100% 28px no-repeat local,
		linear-gradient(rgba(246, 247, 249, 0), var(--dm-bg) 70%) 0 100% / 100% 28px no-repeat local,
		radial-gradient(farthest-side at 50% 0, rgba(40, 50, 60, 0.14), rgba(40, 50, 60, 0)) 0 0 / 100% 10px no-repeat scroll,
		radial-gradient(farthest-side at 50% 100%, rgba(40, 50, 60, 0.14), rgba(40, 50, 60, 0)) 0 100% / 100% 10px no-repeat scroll;
}

/* "Refine by Category" as its own peer section, above "Filters" (desktop
   only — see .dm-department below for the shared drill-down markup, also
   used, unwrapped in its own section, inside the mobile filter sheet). */
.dm-shop__aside-section--department {
	padding-bottom: 20px;
	margin-bottom: 20px;
	border-bottom: 1px solid var(--dm-line);
}

/* "Refine by Category" drill-down tree — shared by the desktop sidebar and
   the mobile filter sheet (inc/archive.php's dotmade_render_department_filter()).
   Plain navigational links, not checkboxes (unlike .dm-filter-check) — every
   click is a real category page, so it's styled to read as a menu. */
.dm-dept-tree__back {
	display: flex; align-items: center; gap: 4px;
	padding: 0 0 10px; margin-bottom: 8px; border-bottom: 1px solid var(--dm-line);
	font: 600 13px var(--dm-font); color: var(--dm-body);
}
.dm-dept-tree__back:hover { color: var(--dm-green-dark); }
.dm-dept-tree__current {
	padding: 9px 10px; margin: 0 0 8px;
	background: var(--dm-green-tint); color: var(--dm-green-dark);
	font: 700 13.5px var(--dm-font); border-radius: 6px;
}
.dm-dept-tree { list-style: none; margin: 0; padding: 0; }
.dm-dept-tree--nested { padding-left: 12px; border-left: 2px solid var(--dm-line); margin-left: 2px; }
.dm-dept-tree__item a {
	display: flex; align-items: center; justify-content: space-between; gap: 10px;
	padding: 7px 0; color: var(--dm-body); font-size: 13.5px;
}
.dm-dept-tree__item a:hover { color: var(--dm-green-dark); }
.dm-dept-tree__count { color: var(--dm-muted); font-size: 12px; flex: 0 0 auto; }
.dm-dept-tree__item--more { display: none; }
.dm-dept-tree.is-expanded .dm-dept-tree__item--more { display: list-item; }
.dm-dept-tree__toggle {
	background: none; border: 0; padding: 6px 0 0; cursor: pointer;
	color: var(--dm-green-dark); font: 700 12.5px var(--dm-font);
}
.dm-dept-tree__toggle:hover { text-decoration: underline; }

/* Sliding-panel transition for Refine-by-Category navigation (theme.js's
   slideDepartment()/setDepartmentInstant()) — drilling into a child pans the
   new panel in from the right while the old one exits left; going back via
   "‹ All Categories"/parent does the reverse. Deliberately not part of the
   generic AJAX fragment swap so clicking a category never looks like the
   widget just "reloaded". The viewport's height animates alongside the pan
   so a shorter/longer child list doesn't just snap to size. */
.dm-department__viewport {
	position: relative;
	overflow: hidden;
	transition: height 220ms var(--dm-ease-in-out);
}
.dm-department__panel--sliding {
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	transition: transform 220ms var(--dm-ease-in-out);
}
.dm-department__panel--from-right { transform: translateX(100%); }
.dm-department__panel--from-left { transform: translateX(-100%); }
.dm-department__panel--to-left { transform: translateX(-100%); }
.dm-department__panel--to-right { transform: translateX(100%); }
.dm-department__panel--center { transform: translateX(0); }
@media (prefers-reduced-motion: reduce) {
	.dm-department__viewport,
	.dm-department__panel--sliding { transition: none; }
}

/* ---- Form controls (site-wide) -----------------------------------------------
   One look for every form field: checkout, basket coupon, login/register,
   account details and addresses, and Contact Form 7. WooCommerce draws its
   fields from the --wc-form-* variables (set here) and styles them as
   `.woocommerce form .form-row .input-text` (0,3,1), so the rules below use
   that same chain; a shorter selector (as customer.css once had) loses and
   leaves core's dark 4px-radius boxes. Selects get the theme chevron; the
   searchable country/province dropdowns (selectWoo/select2) match, and
   their open list is styled globally because select2 appends it to <body>. */
:root {
	--wc-form-border-color: #d5dae0;
	--wc-form-border-radius: 9px;
	--wc-form-border-width: 1px;
	--wc-form-color-background: #fff;
	--wc-form-color-text: var(--dm-ink);
	--dm-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5l5 5 5-5' stroke='%234a525b' stroke-width='1.6' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}
.woocommerce form .form-row .input-text,
.woocommerce form .form-row select,
.woocommerce form .form-row textarea,
.woocommerce form .input-text,
.woocommerce .select2-container .select2-selection--single,
.dm-co-opt__sub select,
.wpcf7 input[type="text"], .wpcf7 input[type="email"], .wpcf7 input[type="tel"], .wpcf7 input[type="url"], .wpcf7 input[type="number"], .wpcf7 input[type="date"], .wpcf7 select, .wpcf7 textarea {
	box-sizing: border-box; width: 100%; min-height: 46px; margin: 0;
	padding: 11px 14px; border: 1px solid #d5dae0; border-radius: 9px; background-color: #fff;
	font: 400 14px/1.4 var(--dm-font); letter-spacing: normal; color: var(--dm-ink);
	box-shadow: none; transition: border-color 0.15s, box-shadow 0.15s;
}
.woocommerce form .form-row textarea, .woocommerce form textarea.input-text, .wpcf7 textarea { min-height: 110px; line-height: 1.5; resize: vertical; }
.woocommerce form .input-text::placeholder, .woocommerce form textarea::placeholder, .wpcf7 input::placeholder, .wpcf7 textarea::placeholder { color: #9aa1a9; opacity: 1; }
.woocommerce form .form-row .input-text:hover, .woocommerce form .form-row select:hover, .woocommerce form .input-text:hover,
.woocommerce .select2-container .select2-selection--single:hover, .wpcf7 input:hover, .wpcf7 select:hover, .wpcf7 textarea:hover { border-color: #b8bfc7; }
.woocommerce form .form-row .input-text:focus, .woocommerce form .form-row select:focus, .woocommerce form .form-row textarea:focus, .woocommerce form .input-text:focus,
.woocommerce .select2-container--focus .select2-selection--single, .woocommerce .select2-container--open .select2-selection--single,
.dm-co-opt__sub select:focus, .wpcf7 input:focus, .wpcf7 select:focus, .wpcf7 textarea:focus {
	outline: 0; border-color: var(--dm-green); box-shadow: 0 0 0 3px rgba(116, 190, 114, 0.18);
}
.woocommerce form .form-row .input-text[readonly], .woocommerce form .form-row .input-text:disabled, .woocommerce form .form-row select:disabled { background-color: #f4f5f7; color: var(--dm-muted); }
/* Native selects: the theme chevron instead of the browser's arrow. */
.woocommerce form .form-row select, .woocommerce form select, .dm-co-opt__sub select, .wpcf7 select {
	-webkit-appearance: none; appearance: none; padding-right: 40px; cursor: pointer;
	background-image: var(--dm-chevron); background-repeat: no-repeat; background-position: right 14px center; background-size: 12px 8px;
}
/* select2 / selectWoo (country, province) */
.woocommerce .select2-container .select2-selection--single { display: flex; align-items: center; height: auto; }
.woocommerce .select2-container .select2-selection--single .select2-selection__rendered { flex: 1; padding: 0; line-height: 22px; color: var(--dm-ink); }
.woocommerce .select2-container .select2-selection--single .select2-selection__placeholder { color: #9aa1a9; }
.woocommerce .select2-container .select2-selection--single .select2-selection__arrow { top: 0; right: 10px; width: 22px; height: 100%; background: var(--dm-chevron) center / 12px 8px no-repeat; }
.woocommerce .select2-container .select2-selection--single .select2-selection__arrow b { display: none; }
.select2-container .select2-dropdown { overflow: hidden; border: 1px solid #d5dae0; border-radius: 9px; background: #fff; box-shadow: 0 10px 28px rgba(40, 50, 60, 0.14); }
.select2-container--open .select2-dropdown--below { margin-top: 4px; }
.select2-container--open .select2-dropdown--above { margin-top: -4px; }
.select2-search--dropdown { padding: 8px; }
.select2-container .select2-search--dropdown .select2-search__field { min-height: 40px; padding: 8px 12px; border: 1px solid #d5dae0; border-radius: 8px; font: 400 14px var(--dm-font); }
.select2-container .select2-search--dropdown .select2-search__field:focus { outline: 0; border-color: var(--dm-green); }
.select2-results__option { padding: 9px 14px; font: 400 14px var(--dm-font); color: var(--dm-ink); }
.select2-container .select2-results__option--highlighted[aria-selected],
.select2-container .select2-results__option--highlighted[data-selected],
.select2-container .select2-results__option--highlighted { background: var(--dm-green-tint); color: var(--dm-ink); }
.select2-container .select2-results__option[aria-selected="true"],
.select2-container .select2-results__option[data-selected="true"] { background: #f1f3f5; font-weight: 600; }
/* States: error red; no green "valid" border (core adds one to every filled field).
   Core's state rules use `input.input-text` (0,4,2), so ours repeat the element. */
.woocommerce form .form-row.woocommerce-invalid input.input-text,
.woocommerce form .form-row.woocommerce-invalid textarea.input-text,
.woocommerce form .form-row.woocommerce-invalid select,
.woocommerce form .form-row.woocommerce-invalid .select2-container:not(.select2-container--open) .select2-selection,
.wpcf7 .wpcf7-not-valid { border-color: #d6452f; }
.woocommerce form .form-row.woocommerce-invalid label { color: #d6452f; }
.woocommerce form .form-row.woocommerce-validated input.input-text,
.woocommerce form .form-row.woocommerce-validated textarea.input-text,
.woocommerce form .form-row.woocommerce-validated select,
.woocommerce form .form-row.woocommerce-validated .select2-container:not(.select2-container--open) .select2-selection { border-color: #d5dae0; }
.woocommerce form .form-row.woocommerce-validated input.input-text:focus,
.woocommerce form .form-row.woocommerce-invalid input.input-text:focus { border-color: var(--dm-green); }
/* Labels */
.woocommerce form .form-row label, .wpcf7 label { display: block; margin: 0 0 6px; font: 600 13px/1.4 var(--dm-font); color: var(--dm-ink); }
.woocommerce form .form-row label.checkbox, .woocommerce form .form-row label.woocommerce-form__label-for-checkbox { display: flex; align-items: center; gap: 10px; font-weight: 500; color: var(--dm-body); }
.woocommerce form .form-row .required { color: #d6452f; text-decoration: none; border: 0; }
.wpcf7 .wpcf7-not-valid-tip { margin-top: 6px; font-size: 12.5px; color: #c0392b; }
/* Phones: 16px stops iOS zooming into a field on focus. */
@media (max-width: 768px) {
	.woocommerce form .form-row .input-text, .woocommerce form .form-row select, .woocommerce form .form-row textarea, .woocommerce form .input-text,
	.woocommerce .select2-container .select2-selection--single, .select2-container .select2-search--dropdown .select2-search__field,
	.wpcf7 input, .wpcf7 select, .wpcf7 textarea { font-size: 16px; }
}

/* ---- WooCommerce notices (site-wide) ----------------------------------------
   Info / success / error messages WooCommerce prints in pages (wc_print_notice,
   notices/*.php): one card style instead of core's grey box with a purple top
   bar and icon font. The icon is an inline SVG mask in currentColor (no
   WooCommerce icon-font download). Both selector forms are listed so these
   also beat core's `.woocommerce .woocommerce-*` rules on WooCommerce pages.
   The drawer shows add-to-cart errors itself (inc/cart-drawer.php). */
.woocommerce-error, .woocommerce-info, .woocommerce-message,
.woocommerce .woocommerce-error, .woocommerce .woocommerce-info, .woocommerce .woocommerce-message {
	position: relative; display: block; width: auto; margin: 0 0 16px; padding: 12px 16px 12px 46px;
	border: 1px solid #d5e2f0; border-radius: 10px; background: #f2f7fc; color: #22466e;
	font: 400 14px/1.5 var(--dm-font); list-style: none; word-wrap: break-word;
}
.woocommerce-message, .woocommerce .woocommerce-message { border-color: #cfe6cd; background: var(--dm-green-tint); color: #2b6528; }
.woocommerce-error, .woocommerce .woocommerce-error { border-color: #f1c7bd; background: #fdf2ef; color: #8a2f1b; }
.woocommerce-error::before, .woocommerce-info::before, .woocommerce-message::before,
.woocommerce .woocommerce-error::before, .woocommerce .woocommerce-info::before, .woocommerce .woocommerce-message::before {
	content: ""; display: block; position: absolute; top: 13px; left: 16px; width: 19px; height: 19px;
	background: currentColor; font-family: inherit;
	-webkit-mask: var(--dm-notice-icon) center / contain no-repeat; mask: var(--dm-notice-icon) center / contain no-repeat;
}
.woocommerce-info, .woocommerce .woocommerce-info { --dm-notice-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 11v5M12 7.5v.01'/%3E%3C/svg%3E"); }
.woocommerce-message, .woocommerce .woocommerce-message { --dm-notice-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='m8 12.5 2.7 2.7L16 9.8'/%3E%3C/svg%3E"); }
.woocommerce-error, .woocommerce .woocommerce-error { --dm-notice-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 7.5v5.5M12 16.5v.01'/%3E%3C/svg%3E"); }
.woocommerce-error li, .woocommerce .woocommerce-error li { margin: 0; list-style: none; }
.woocommerce-error li + li { margin-top: 4px; }
.woocommerce-error a, .woocommerce-info a, .woocommerce-message a { color: inherit; font-weight: 600; text-decoration: underline; text-underline-offset: 2px; }
/* The "View cart" / "Continue shopping" .button WooCommerce puts in notices. */
.woocommerce-error .button, .woocommerce-info .button, .woocommerce-message .button,
.woocommerce .woocommerce-error a.button, .woocommerce .woocommerce-info a.button, .woocommerce .woocommerce-message a.button {
	float: right; margin: 0 0 0 16px; padding: 0; border: 0; border-radius: 0; background: none; box-shadow: none;
	color: inherit; font: 700 14px/1.5 var(--dm-font); text-decoration: underline; text-underline-offset: 2px;
}
.woocommerce-notices-wrapper:empty { display: none; }

/* "No products found" (woocommerce/loop/no-products-found.php). It keeps
   .woocommerce-info for the shop's AJAX grid swap, so it undoes the notice
   card above at higher specificity. */
.woocommerce-info.dm-empty,
.woocommerce .woocommerce-info.dm-empty {
	display: flex; flex-direction: column; align-items: center; gap: 6px; margin: 4px 0 24px; padding: 40px 24px;
	border: 1px dashed #d5d9de; border-radius: 14px; background: #fff; color: var(--dm-body); text-align: center;
}
.woocommerce-info.dm-empty::before,
.woocommerce .woocommerce-info.dm-empty::before { content: none; display: none; }
.dm-empty__icon { display: grid; place-items: center; width: 56px; height: 56px; margin-bottom: 6px; border-radius: 50%; background: var(--dm-green-tint); color: var(--dm-green-dark); }
.dm-empty .dm-empty__title { margin: 0; font: 700 19px/1.3 var(--dm-display); color: var(--dm-ink); }
.dm-empty__text { max-width: 440px; margin: 0; font-size: 14px; line-height: 1.55; color: var(--dm-body); }
.dm-empty__actions { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; margin-top: 12px; }
.dm-empty .dm-empty__btn { display: inline-flex; align-items: center; min-height: 44px; padding: 0 20px; border: 1.5px solid var(--dm-line-strong); border-radius: 9px; background: #fff; color: var(--dm-ink); font: 700 14px var(--dm-font); text-decoration: none; }
.dm-empty .dm-empty__btn:hover { border-color: var(--dm-green); }
.dm-empty .dm-empty__btn--primary { border-color: var(--dm-orange); background: var(--dm-orange); color: #fff; }
.dm-empty .dm-empty__btn--primary:hover { border-color: var(--dm-orange); color: #fff; filter: brightness(0.95); }

/* ---- Product card -------------------------------------------------------- */
.dm-card {
	background: var(--dm-card);
	border: 1px solid var(--dm-line);
	border-radius: var(--dm-radius);
	padding: 12px;
	display: flex; flex-direction: column; gap: 7px;
	height: 100%;
	transition: box-shadow 0.15s ease, transform 0.15s ease;
}
/* Real hover only: phones apply hover on tap and keep it (the card stayed lifted). */
@media (hover: hover) and (pointer: fine) {
	.dm-card:hover { box-shadow: var(--dm-shadow-hover); transform: translateY(-3px); }
}

.dm-card__media { position: relative; display: block; border-radius: 8px; overflow: hidden; background: var(--dm-bg); aspect-ratio: 1; }
.dm-card__media img { width: 100%; height: 100%; object-fit: cover; }

.dm-card__off {
	position: absolute; top: 8px; left: 8px;
	background: var(--dm-orange); color: #fff;
	font: 700 11px var(--dm-font); padding: 3px 7px; border-radius: 5px;
}
.dm-card__off--single { top: 12px; left: 12px; font-size: 13px; }

/* NEW badge — loop card (top-right, clears the wishlist heart on hover) */
.dm-card__new {
	position: absolute; top: 8px; right: 8px;
	background: #f4c13d; color: #fff;
	font: 700 11px var(--dm-font); padding: 3px 7px; border-radius: 5px;
	pointer-events: none;
}
.dm-card:hover .dm-card__new { opacity: 0; } /* reveal the heart on hover */

.dm-card__wish {
	position: absolute; top: 8px; right: 8px;
	width: 30px; height: 30px; border-radius: 50%;
	background: rgba(255, 255, 255, 0.92); border: 0; cursor: pointer;
	display: grid; place-items: center; color: var(--dm-muted);
	box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08);
}
.dm-card__wish.is-active { color: var(--dm-orange); }
@media (hover: hover) and (pointer: fine) { .dm-card__wish:hover { color: var(--dm-orange); } }
.dm-card__wish { transition: scale 200ms var(--dm-ease-out); }

.dm-card__title {
	font-size: 12.5px; line-height: 1.32; color: var(--dm-ink);
	min-height: 33px;
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.dm-card__title:hover { color: var(--dm-green-dark); }

.dm-card__rating { font-size: 12px; color: var(--dm-muted); display: flex; align-items: center; gap: 4px; }
.dm-card__star { color: var(--dm-star); }
.dm-card__score { color: var(--dm-star); font-weight: 600; }

.dm-card__price { font-family: var(--dm-display); font-weight: 700; font-size: 16px; color: var(--dm-ink); }
.dm-card__price .woocommerce-Price-amount,
.dm-card__price ins { text-decoration: none; }
.dm-card__price del { color: var(--dm-muted); font-weight: 400; font-size: 12px; margin-left: 6px; }
.dm-card__price ins { color: var(--dm-ink); }

/* Add-to-cart button (WooCommerce loop button, restyled) */
.dm-card .button,
.dm-btn--cart {
	margin-top: auto;
	display: inline-flex; align-items: center; justify-content: center;
	background: #fff; color: var(--dm-orange);
	border: 1.5px solid var(--dm-orange); border-radius: 7px;
	font: 700 12.5px var(--dm-font); padding: 8px 10px; cursor: pointer;
	transition: background 0.15s, color 0.15s, scale 160ms var(--dm-ease-out);
}
.dm-card .button:hover,
.dm-btn--cart:hover { background: var(--dm-orange); color: #fff; }
.dm-card .added_to_cart { font-size: 11px; color: var(--dm-green-dark); text-align: center; margin-top: 4px; }

/* Add-to-cart is a POST <form> + <button> (dotmade_add_to_cart_html() in
   inc/template-tags.php), not a crawlable `?add-to-cart=` link. The form is
   the flex item now, so it carries the "push to the bottom" margin. */
.dm-atc { margin: 0; display: flex; flex-direction: column; }
.dm-card .dm-atc { margin-top: auto; }
button.dm-btn--cart,
button.dm-flash__cta { -webkit-appearance: none; appearance: none; width: 100%; line-height: 1.3; }
/* WooCommerce's add-to-cart.js toggles .loading → .added on the button.
   While loading, the label turns transparent (so the button keeps its exact
   size — no layout shift) and a spinner sits where the text was. */
.dm-btn--cart.loading,
.dm-flash__cta.loading,
.dm-cdrawer__add.loading,
.single-product form.cart .single_add_to_cart_button.loading { position: relative; color: transparent !important; pointer-events: none; }
.dm-btn--cart.loading::after,
.dm-flash__cta.loading::after,
.dm-cdrawer__add.loading::after,
.single-product form.cart .single_add_to_cart_button.loading::after {
	content: ""; position: absolute; top: 50%; left: 50%; width: 16px; height: 16px; margin: -8px 0 0 -8px;
	border: 2px solid var(--dm-orange); border-right-color: transparent; border-radius: 50%;
	animation: dm-spin 0.7s linear infinite;
}
.dm-flash__cta.loading::after,
.single-product form.cart .single_add_to_cart_button.loading::after { border-color: #fff; border-right-color: transparent; }
@keyframes dm-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) {
	.dm-btn--cart.loading::after, .dm-flash__cta.loading::after,
	.dm-cdrawer__add.loading::after, .single-product form.cart .single_add_to_cart_button.loading::after { animation-duration: 2s; }
}
.dm-btn--cart.added::after,
.dm-flash__cta.added::after { content: "\2713"; margin-left: 6px; }
/* The drawer replaces WooCommerce's inline "View cart" link. */
.dm-atc .added_to_cart,
.single-product form.cart .added_to_cart { display: none !important; }
.dm-card__wish.is-active svg path { fill: currentColor; }

/* ---- "Added to cart" drawer (inc/cart-drawer.php) -----------------------
   Right-hand drawer on desktop, bottom sheet on mobile — same markup. Not a
   modal page takeover: the page stays visible and a click on it closes. */
/* Above WooCommerce's store notice bar (.woocommerce-store-notice, z-index
   99998), which otherwise covers the drawer's header and close button. */
.dm-cdrawer { position: fixed; inset: 0; z-index: 100000; }
.dm-cdrawer[hidden] { display: none; }
.dm-cdrawer__overlay { position: absolute; inset: 0; background: rgba(20, 24, 28, 0.45); opacity: 0; transition: opacity 200ms var(--dm-ease-out); }
.dm-cdrawer__panel {
	position: absolute; top: 0; right: 0; bottom: 0; width: min(420px, 100%);
	background: #fff; display: flex; flex-direction: column; outline: none;
	box-shadow: -12px 0 40px rgba(20, 24, 28, 0.18);
	transform: translateX(100%); transition: transform 200ms var(--dm-ease-out);
}
.dm-cdrawer.is-open .dm-cdrawer__overlay { opacity: 1; transition-duration: 300ms; }
.dm-cdrawer.is-open .dm-cdrawer__panel { transform: none; transition: transform 300ms var(--dm-ease-drawer); }
.dm-cdrawer__handle { display: none; }
.dm-cdrawer__content { display: flex; flex-direction: column; min-height: 0; flex: 1; }

.dm-cdrawer__head { display: flex; align-items: center; gap: 10px; padding: 18px 20px; border-bottom: 1px solid var(--dm-line); }
.dm-cdrawer__tick { width: 26px; height: 26px; border-radius: 50%; background: var(--dm-green); color: #fff; display: grid; place-items: center; flex: 0 0 auto; }
.dm-cdrawer__title { font: 700 19px var(--dm-display); color: var(--dm-ink); margin: 0; flex: 1; }
.dm-cdrawer__close { width: 40px; height: 40px; border: 0; border-radius: 9px; background: #f3f4f6; color: var(--dm-ink); display: grid; place-items: center; cursor: pointer; }
.dm-cdrawer__close:hover { background: #e9ebee; }

.dm-cdrawer__body { flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior: contain; padding: 18px 20px; display: flex; flex-direction: column; gap: 18px; }

.dm-cdrawer__item { display: flex; gap: 14px; }
.dm-cdrawer__item-media { flex: 0 0 84px; height: 84px; border-radius: 9px; overflow: hidden; background: var(--dm-bg); }
.dm-cdrawer .dm-cdrawer__item-media img { width: 100%; height: 100%; object-fit: cover; }
.dm-cdrawer__item-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.dm-cdrawer__item-name { font: 500 14.5px/1.35 var(--dm-font); color: var(--dm-ink); }
.dm-cdrawer__item-seller { font-size: 12.5px; color: var(--dm-muted); }
.dm-cdrawer__item-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-top: 6px; }
.dm-cdrawer__item-price { text-align: right; line-height: 1.2; }
.dm-cdrawer__item-price strong { display: block; font: 700 17px var(--dm-display); color: var(--dm-ink); }
.dm-cdrawer__item-price del { font-size: 12.5px; color: var(--dm-muted); }

.dm-qty { display: inline-flex; align-items: center; border: 1px solid var(--dm-line-strong); border-radius: 9px; }
.dm-qty__btn { width: 40px; height: 40px; border: 0; background: none; font: 600 18px var(--dm-font); color: var(--dm-ink); cursor: pointer; }
.dm-qty__btn:hover { background: var(--dm-bg); }
.dm-qty__val { min-width: 24px; text-align: center; font: 600 14px var(--dm-font); }
.dm-qty.is-busy { opacity: 0.55; pointer-events: none; }

.dm-cdrawer__freebar { background: #fff8ec; border: 1px solid #f6e3c0; border-radius: 10px; padding: 12px 14px; }
.dm-cdrawer__freebar p { margin: 0 0 9px; font-size: 13.5px; color: var(--dm-ink); }
.dm-cdrawer__freebar strong, .dm-cdrawer__freebar .amount { font-weight: 700; }
.dm-cdrawer__track { height: 6px; border-radius: 3px; background: #e9ecef; overflow: hidden; }
.dm-cdrawer__track span { display: block; height: 100%; background: var(--dm-green); border-radius: 3px; }
.dm-cdrawer__freebar.is-unlocked { background: var(--dm-green-tint); border-color: #cfe8cd; }

.dm-cdrawer__sugg-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin-bottom: 10px; }
.dm-cdrawer__sugg-head h3 { font: 700 15px var(--dm-display); color: var(--dm-ink); margin: 0; }
.dm-cdrawer__sugg-head span { font-size: 12px; color: var(--dm-muted); }
.dm-cdrawer__sugg-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.dm-cdrawer__sugg-item { display: flex; align-items: center; gap: 12px; border: 1px solid var(--dm-line); border-radius: 10px; padding: 10px; }
.dm-cdrawer__sugg-media { flex: 0 0 52px; height: 52px; border-radius: 7px; overflow: hidden; background: var(--dm-bg); }
.dm-cdrawer .dm-cdrawer__sugg-media img { width: 100%; height: 100%; object-fit: cover; }
.dm-cdrawer__sugg-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.dm-cdrawer__sugg-name { font-size: 13.5px; line-height: 1.3; color: var(--dm-ink); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.dm-cdrawer__sugg-price { font: 700 14px var(--dm-font); color: var(--dm-ink); }
.dm-cdrawer__sugg-item .dm-atc { flex: 0 0 auto; }
.dm-cdrawer__add {
	-webkit-appearance: none; appearance: none; min-width: 72px; height: 40px; padding: 0 14px;
	background: #fff; color: var(--dm-orange); border: 1.5px solid var(--dm-orange); border-radius: 8px;
	font: 700 13.5px var(--dm-font); cursor: pointer;
}
.dm-cdrawer__add:hover { background: var(--dm-orange); color: #fff; }

.dm-cdrawer__foot { border-top: 1px solid var(--dm-line); padding: 16px 20px calc(16px + env(safe-area-inset-bottom)); display: flex; flex-direction: column; gap: 10px; }
.dm-cdrawer__subtotal { display: flex; align-items: baseline; justify-content: space-between; }
.dm-cdrawer__subtotal > span { font-size: 13.5px; color: var(--dm-body); } /* `>`: not the price's own .woocommerce-Price-amount span */
.dm-cdrawer__subtotal strong { font: 800 21px var(--dm-display); color: var(--dm-ink); }
.dm-cdrawer__checkout { display: flex; align-items: center; justify-content: center; height: 50px; border-radius: 9px; background: var(--dm-orange); color: #fff; font: 700 16px var(--dm-display); }
.dm-cdrawer__checkout:hover { color: #fff; filter: brightness(0.95); }
.dm-cdrawer__secondary { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.dm-cdrawer__viewcart,
.dm-cdrawer__keep { display: flex; align-items: center; justify-content: center; height: 46px; border-radius: 9px; font: 600 14.5px var(--dm-font); cursor: pointer; }
.dm-cdrawer__viewcart { border: 1.5px solid var(--dm-ink); color: var(--dm-ink); background: #fff; }
.dm-cdrawer__keep { border: 0; background: #f1f2f4; color: var(--dm-ink); }
.dm-cdrawer__viewcart:hover { background: var(--dm-bg); }
.dm-cdrawer__keep:hover { background: #e7e9ec; }

/* Error state: "Couldn't add to cart" (dotmade_render_cart_drawer_error()). */
.dm-cdrawer__tick.is-error { background: #d6452f; }
.dm-cdrawer__alert { padding: 12px 14px; border: 1px solid #f3c9c1; border-radius: 10px; background: #fdf1ee; color: #7d2a1b; font-size: 14px; line-height: 1.5; }
.dm-cdrawer__alert p { margin: 0; }
.dm-cdrawer__alert p + p { margin-top: 8px; }
/* WooCommerce puts a "View cart" .button inside some notices: keep it a link. */
.dm-cdrawer__alert a,
.woocommerce .dm-cdrawer__alert a.button { display: inline; float: none; margin: 0 0 0 4px; padding: 0; border: 0; background: none; color: inherit; font: inherit; font-weight: 600; text-decoration: underline; }
.dm-cdrawer__secondary.is-single { grid-template-columns: 1fr; }
.dm-cdrawer__err-price { font: 700 15px var(--dm-display); color: var(--dm-ink); }
.dm-cdrawer__err-price ins { text-decoration: none; }
.dm-cdrawer__err-price del { margin-right: 6px; font: 400 12.5px var(--dm-font); color: var(--dm-muted); }

@media (prefers-reduced-motion: reduce) {
	.dm-cdrawer__overlay, .dm-cdrawer__panel, .dm-cdrawer__track span { transition: none; }
}

/* Mobile: bottom sheet, actions in the thumb zone, suggestions scroll
   sideways so the sheet never covers the whole screen. */
@media (max-width: 768px) {
	.dm-cdrawer__panel {
		top: auto; left: 0; right: 0; width: 100%; max-height: 88vh;
		border-radius: 18px 18px 0 0; box-shadow: 0 -12px 40px rgba(20, 24, 28, 0.18);
		transform: translateY(100%);
	}
	.dm-cdrawer.is-dragging .dm-cdrawer__panel { transition: none; }
	.dm-cdrawer__handle { display: block; width: 40px; height: 4px; border-radius: 2px; background: #d6dade; margin: 10px auto 0; flex: 0 0 auto; }
	.dm-cdrawer__head { padding: 12px 16px; border-bottom: 0; }
	.dm-cdrawer__close, .dm-qty__btn { width: 44px; height: 44px; } /* 44px touch targets */
	.dm-cdrawer__body { padding: 4px 16px 14px; gap: 14px; }
	.dm-cdrawer__item-media { flex-basis: 64px; height: 64px; }
	/* Bleeds to the sheet edges; the 16px gutter sits on the first/last item
	   (scroll containers drop their own end padding — see CLAUDE.md). */
	.dm-cdrawer__sugg-list { flex-direction: row; overflow-x: auto; scroll-snap-type: x mandatory; scrollbar-width: none; margin: 0 -16px; padding: 0 0 2px; min-width: 0; }
	.dm-cdrawer__sugg-list::-webkit-scrollbar { display: none; }
	.dm-cdrawer__sugg-item { flex: 0 0 140px; flex-direction: column; align-items: stretch; gap: 6px; scroll-snap-align: start; }
	.dm-cdrawer__sugg-item:first-child { margin-left: 16px; }
	.dm-cdrawer__sugg-item:last-child { margin-right: 16px; }
	.dm-cdrawer__sugg-media { flex: 0 0 auto; height: auto; aspect-ratio: 1; }
	.dm-cdrawer__sugg-name { font-size: 12.5px; }
	.dm-cdrawer__sugg-item .dm-atc { margin-top: auto; }
	.dm-cdrawer__add { width: 100%; height: 44px; }
	.dm-cdrawer__foot { padding: 12px 16px calc(12px + env(safe-area-inset-bottom)); }
	.dm-cdrawer__checkout { height: 52px; }
}

/* Skeleton loader — shown by theme.js (showGridSkeleton()) in place of the
   grid while a filter/sort/department fetch is in flight, matching however
   many products are already on screen so swapping in doesn't jump. Mirrors
   .dm-card's own box model (padding/gap/border-radius) so the placeholder
   grid holds the same shape as the real one, not just a generic block. */
.dm-skeleton-grid { pointer-events: none; }
.dm-skeleton-card {
	background: var(--dm-card);
	border: 1px solid var(--dm-line);
	border-radius: var(--dm-radius);
	padding: 12px;
	display: flex; flex-direction: column; gap: 7px;
	height: 100%;
}
.dm-skeleton-card__media,
.dm-skeleton-card__line {
	/* --dm-line/--dm-bg are both near-white and read as invisible against the
	   white .dm-card background — these bars need their own, clearly-grey
	   tones so the shape is visible even without the shimmer motion. */
	background: linear-gradient(90deg, #e2e5e9 25%, #eef0f3 50%, #e2e5e9 75%);
	background-size: 200% 100%;
	animation: dm-skeleton-shimmer 1.4s linear infinite;
	border-radius: 5px;
}
.dm-skeleton-card__media { aspect-ratio: 1; border-radius: 8px; }
.dm-skeleton-card__line { height: 10px; }
.dm-skeleton-card__line--title { height: 11px; width: 90%; }
.dm-skeleton-card__line--title-short { width: 55%; }
.dm-skeleton-card__line--price { height: 16px; width: 40%; margin-top: 3px; }
.dm-skeleton-card__line--btn { height: 31px; border-radius: 7px; margin-top: auto; }
@keyframes dm-skeleton-shimmer {
	0% { background-position: 200% 0; }
	100% { background-position: -200% 0; }
}
@media (prefers-reduced-motion: reduce) {
	.dm-skeleton-card__media,
	.dm-skeleton-card__line { animation: none; background: #e2e5e9; }
}

/* ==========================================================================
   Elementor merchandising blocks (also valid as standalone markup)
   ========================================================================== */

/* ---- Rail ---------------------------------------------------------------- */
.dm-rail { margin: 0 0 8px; }
.dm-rail__head { display: flex; align-items: center; gap: 12px; margin-bottom: 14px; }
.dm-rail__title { font-family: var(--dm-display); font-weight: 700; font-size: 21px; color: var(--dm-ink); margin: 0; }
.dm-rail__note { background: var(--dm-orange-tint); color: var(--dm-orange); font: 700 12.5px var(--dm-font); padding: 4px 10px; border-radius: 20px; }
.dm-rail__countdown { font-variant-numeric: tabular-nums; }
.dm-rail__all { margin-left: auto; color: var(--dm-green-dark); font: 700 13.5px var(--dm-font); }
.dm-rail__all:hover { text-decoration: underline; }

.dm-rail__track { display: grid; gap: var(--dm-gap); }
.dm-rail__track.is-grid { grid-template-columns: repeat(var(--dm-cols, 6), 1fr); }
.dm-rail__track.is-scroll {
	display: flex; overflow-x: auto; scroll-snap-type: x mandatory;
	padding-bottom: 6px; scrollbar-width: none;
}
.dm-rail__track.is-scroll::-webkit-scrollbar { display: none; }
.dm-rail__track.is-scroll > .dm-card { flex: 0 0 var(--dm-card-w, 200px); scroll-snap-align: start; }

/* Optional arrows */
.dm-rail__arrows { display: flex; gap: 8px; margin-left: 8px; }
.dm-rail__arrow {
	width: 32px; height: 32px; border-radius: 50%; border: 1px solid var(--dm-line-strong);
	background: #fff; cursor: pointer; color: var(--dm-body); display: grid; place-items: center;
}
.dm-rail__arrow:hover { border-color: var(--dm-green); color: var(--dm-green-dark); }

/* ---- Category tiles ------------------------------------------------------ */
.dm-tiles { display: grid; gap: var(--dm-gap); grid-template-columns: repeat(var(--dm-cols, 6), 1fr); }
.dm-tile { border: 1px solid var(--dm-line); border-radius: var(--dm-radius); overflow: hidden; background: #fff; transition: box-shadow 0.15s; }
@media (hover: hover) and (pointer: fine) { .dm-tile:hover { box-shadow: var(--dm-shadow); } }
.dm-tile__media { aspect-ratio: 1.1; background: var(--dm-bg); }
.dm-tile__media img { width: 100%; height: 100%; object-fit: cover; }
.dm-tile__body { padding: 10px 12px; }
.dm-tile__name { font: 600 13px var(--dm-font); color: var(--dm-ink); line-height: 1.3; }
.dm-tile__from { font: 700 12px var(--dm-font); color: var(--dm-green-dark); margin-top: 3px; }

/* ---- Hero ----------------------------------------------------------------
   Split panel: copy on the left, photo on the right — text never sits on the
   photo. Photo-first single column on mobile (Elementor's ≤767px tier, so
   tablets keep the split). The photo is the homepage LCP: its box is sized
   by the grid (desktop) / aspect-ratio (mobile) before it loads, so no CLS. */
.dm-hero {
	--dm-hero-bg: #1f3a2a;
	display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
	min-height: 340px; background: var(--dm-hero-bg); color: #fff;
	border-radius: var(--dm-radius-lg); overflow: hidden;
}
.dm-hero.is-text-only { grid-template-columns: minmax(0, 1fr); }
.dm-hero__body {
	padding: 38px 36px;
	display: flex; flex-direction: column; justify-content: center; align-items: flex-start; gap: 12px;
}
.dm-hero__eyebrow {
	background: var(--dm-green); color: #10261a;
	font: 700 12px var(--dm-font); letter-spacing: 0.1em; text-transform: uppercase;
	padding: 5px 11px; border-radius: 999px;
}
.dm-hero__title { font-family: var(--dm-display); font-weight: 800; font-size: 40px; line-height: 1.04; color: #fff; margin: 0; }
.dm-hero__sub { font-size: 15px; color: #cfe3d2; margin: 0; }
.dm-hero__cta { background: var(--dm-orange); color: #fff; font: 700 15px var(--dm-font); padding: 13px 24px; border-radius: 8px; display: inline-block; }
.dm-hero__cta:hover { color: #fff; filter: brightness(0.94); }
.dm-hero__media { position: relative; }
/* Two classes on purpose: Elementor's `.elementor img { height: auto }` (and
   WooCommerce's `.woocommerce img`) have the same specificity as a single
   class + img and load later, which shrank the photo to its natural 5:4
   ratio instead of filling the column. */
.dm-hero .dm-hero__media img { position: absolute; inset: 0; width: 100%; height: 100%; max-width: none; object-fit: cover; }

@media (max-width: 1024px) {
	.dm-hero__body { padding: 30px 28px; }
	.dm-hero__title { font-size: 34px; }
}
@media (max-width: 767px) {
	.dm-hero { grid-template-columns: minmax(0, 1fr); min-height: 0; }
	.dm-hero__media { order: -1; aspect-ratio: 16 / 9; }
	.dm-hero__body { padding: 20px; }
	.dm-hero__title { font-size: 27px; }
}

/* ---- Flash deal ----------------------------------------------------------
   A vertical card (image on top, text stacked below, full-width CTA) so it
   reads correctly at any placement width — including the narrow sidebar
   column it most commonly ships in — without needing container-query
   reflow tricks. */
.dm-flash { display: flex; flex-direction: column; gap: 8px; border: 1px solid var(--dm-line); border-radius: var(--dm-radius-lg); padding: 14px; background: #fff; }
.dm-flash__head { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.dm-flash__label { font: 700 14px var(--dm-display); color: var(--dm-ink); }
.dm-flash__timer { background: var(--dm-orange-tint); color: var(--dm-orange); font: 700 12px var(--dm-font); padding: 3px 8px; border-radius: 5px; font-variant-numeric: tabular-nums; white-space: nowrap; }
/* 4:3 + contain (was 1:1 + cover): keeps the whole packshot in view while
   trimming ~60px, so the card lines up with the Hero beside it. White, to
   blend with packshot backgrounds. Two classes on the img to beat Elementor's
   `.elementor img { height: auto }`. */
.dm-flash__media { position: relative; display: block; border-radius: 8px; overflow: hidden; background: #fff; aspect-ratio: 4 / 3; }
.dm-flash .dm-flash__media img { width: 100%; height: 100%; max-width: none; object-fit: contain; }
.dm-flash__title { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; font: 700 14px/1.32 var(--dm-font); color: var(--dm-ink); }
.dm-flash__title:hover { color: var(--dm-green-dark); }
.dm-flash__price .ins, .dm-flash__price ins { color: var(--dm-orange); font: 700 20px var(--dm-display); text-decoration: none; }
.dm-flash__price del { color: var(--dm-muted); font-size: 13px; margin-left: 6px; }
.dm-flash__meta { font-size: 12.5px; color: var(--dm-muted); }
.dm-flash__cta { display: flex; align-items: center; justify-content: center; margin-top: 4px; background: var(--dm-orange); color: #fff; border: 0; font: 700 14px var(--dm-font); padding: 12px 16px; border-radius: 8px; cursor: pointer; }
.dm-flash__cta:hover { filter: brightness(0.96); }

/* ---- Payment logos inside text and badges -----------------------------------
   dotmade_payment_mark_html() (inc/footer.php): one-colour SVGs from
   assets/img/payments/, coloured by currentColor, sized to the text around
   them. The footer's legal bar uses the same files with its own sizes. */
.dm-paymark { display: inline-flex; align-items: center; height: 1em; line-height: 0; vertical-align: -0.12em; }
.dm-paymark svg { display: block; height: 100%; width: auto; }
.dm-paymark--visa { height: 0.8em; vertical-align: 0; }
.dm-paymark--mastercard { height: 1.35em; vertical-align: -0.32em; }

/* ==========================================================================
   Archive: filter/sort bar, chips, bottom sheets, load more
   ========================================================================== */
.dm-shopbar { display: none; } /* desktop uses the sidebar; bar is mobile-only */
.dm-shopbar__btn {
	flex: 1; display: flex; align-items: center; justify-content: center; gap: 7px;
	background: #fff; border: 0; cursor: pointer;
	font: 600 13.5px var(--dm-font); color: var(--dm-ink); padding: 12px;
}
.dm-shopbar__btn + .dm-shopbar__btn { border-left: 1px solid var(--dm-line); }
.dm-shopbar__count { background: var(--dm-orange); color: #fff; font: 700 10px var(--dm-font); border-radius: 9px; padding: 1px 6px; }

.dm-chips { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 14px; }
.dm-chip { background: var(--dm-green-tint); color: #3c5e3a; border: 1px solid #cfe8cd; font: 600 12px var(--dm-font); padding: 6px 11px; border-radius: 18px; }
.dm-chip:hover { filter: brightness(0.97); }
.dm-chip--clear { background: #fff; color: var(--dm-muted); border-color: var(--dm-line-strong); }

/* Filter widgets in the sidebar (desktop) + mobile sheet */
.dm-filter-widget { margin-bottom: 22px; }
.dm-filter-widget:last-child { margin-bottom: 0; }
.dm-filter-widget__title { font: 700 14px var(--dm-display); margin: 0 0 12px; color: var(--dm-ink); }

/* Collapsible filter sections — native <details>/<summary> (inc/archive.php's
   dotmade_filter_section_start()), so no JS is needed to open/close. Open
   state is server-rendered (first three + any with a ticked option), so
   nothing shifts on load. The chevron points down when closed, up when open. */
summary.dm-filter-widget__title {
	display: flex; align-items: center; justify-content: space-between; gap: 8px;
	margin: 0; cursor: pointer; list-style: none; user-select: none;
}
summary.dm-filter-widget__title::-webkit-details-marker { display: none; }
summary.dm-filter-widget__title::after {
	content: ""; flex: 0 0 auto; width: 7px; height: 7px; margin: 0 4px 3px 0;
	border-right: 2px solid var(--dm-muted); border-bottom: 2px solid var(--dm-muted);
	transform: rotate(45deg); transition: transform 0.15s ease;
}
details.dm-filter-widget[open] > summary.dm-filter-widget__title { margin-bottom: 12px; }
details.dm-filter-widget[open] > summary.dm-filter-widget__title::after { transform: translateY(3px) rotate(225deg); }
summary.dm-filter-widget__title:hover { color: var(--dm-green-dark); }
summary.dm-filter-widget__title:focus-visible { outline: 2px solid var(--dm-green); outline-offset: 3px; border-radius: 3px; }
@media (prefers-reduced-motion: reduce) {
	summary.dm-filter-widget__title::after { transition: none; }
}

/* Type-to-narrow box for long option lists (rendered past 20 options). */
.dm-filter-search {
	width: 100%; margin: 0 0 8px; padding: 8px 10px;
	border: 1px solid var(--dm-line-strong); border-radius: 7px; background: #fff;
	font: 400 13px var(--dm-font); color: var(--dm-ink);
}
.dm-filter-search:focus { outline: none; border-color: var(--dm-green); }
.dm-filter-search__empty { margin: 4px 0 0; font-size: 12.5px; color: var(--dm-muted); }

/* Generic checkbox/radio-look filter row — used by every bespoke filter
   section (On Sale, Department, Price presets, auto-inserted attributes,
   Rating). None of these are real form inputs; they're plain links styled
   to look like checkboxes/radios, consistent with how WooCommerce's own
   layered-nav widgets work (navigate via link, not an actual <form> submit). */
.dm-filter-check { list-style: none; margin: 0; padding: 0; }
.dm-filter-check__item {
	display: flex; align-items: center; gap: 9px;
	padding: 6px 0; color: var(--dm-body); font-size: 14px;
}
.dm-filter-check__box {
	width: 17px; height: 17px; flex: 0 0 auto; border-radius: 5px;
	border: 1.5px solid var(--dm-line-strong); position: relative;
}
.dm-filter-check__box--radio { border-radius: 50%; }
.dm-filter-check__item.is-active .dm-filter-check__box { background: var(--dm-green); border-color: var(--dm-green); }
.dm-filter-check__item.is-active .dm-filter-check__box::after {
	content: ""; position: absolute; left: 5px; top: 1px; width: 4px; height: 8px;
	border: solid #fff; border-width: 0 2px 2px 0; transform: rotate(45deg);
}
/* Radios show a centered dot instead of a checkmark tick. */
.dm-filter-check__item.is-active .dm-filter-check__box--radio::after {
	left: 50%; top: 50%; width: 7px; height: 7px;
	border: none; background: #fff; border-radius: 50%;
	transform: translate(-50%, -50%);
}
.dm-filter-check__item.is-active { color: var(--dm-green-dark); font-weight: 600; }
.dm-filter-check__label { flex: 1 1 auto; }
.dm-filter-check__count { color: var(--dm-muted); font-size: 12.5px; }
.dm-filter-check__stars { color: var(--dm-star); letter-spacing: 1px; }

/* Price filter — min/max fields + presets */
.dm-filter-price { margin-bottom: 12px; }
.dm-filter-price__row { display: flex; gap: 8px; margin-bottom: 8px; }
.dm-filter-price__row input {
	width: 0; flex: 1 1 0;
	padding: 8px 10px; border: 1px solid var(--dm-line-strong); border-radius: 7px;
	font: 400 13px var(--dm-font); color: var(--dm-ink);
}
.dm-filter-price__go {
	width: 100%; background: #fff; border: 1.5px solid var(--dm-green); color: var(--dm-green-dark);
	font: 700 12.5px var(--dm-font); padding: 8px; border-radius: 7px; cursor: pointer;
}
.dm-filter-price__go:hover { background: var(--dm-green-tint); }

/* Bottom sheets */
.dm-sheet { position: fixed; inset: 0; z-index: 200; display: block; }
.dm-sheet[hidden] { display: none; }
.dm-sheet__overlay { position: absolute; inset: 0; background: rgba(20, 24, 28, 0.5); border: 0; cursor: pointer; opacity: 0; transition: opacity 200ms var(--dm-ease-out); }
.dm-sheet.is-open .dm-sheet__overlay { opacity: 1; transition-duration: 300ms; }
/* z-index: the overlay comes after the panel in the markup, so without it
   the overlay painted over the whole panel and every tap inside the sheet
   (filters, sort links, headings) hit the overlay and closed the sheet. */
.dm-sheet__panel {
	z-index: 1;
	position: absolute; left: 0; right: 0; bottom: 0; max-height: 82vh;
	background: #fff; border-radius: 18px 18px 0 0; display: flex; flex-direction: column;
	transform: translateY(100%); transition: transform 200ms var(--dm-ease-out);
}
.dm-sheet.is-open .dm-sheet__panel { transform: translateY(0); transition: transform 300ms var(--dm-ease-drawer); }
.dm-sheet.is-dragging .dm-sheet__panel { transition: none; }
@media (prefers-reduced-motion: reduce) {
	.dm-sheet__panel, .dm-sheet.is-open .dm-sheet__panel { transform: none; opacity: 0; transition: opacity 150ms ease; }
	.dm-sheet.is-open .dm-sheet__panel { opacity: 1; }
}
.dm-sheet__head { display: flex; align-items: center; justify-content: space-between; padding: 16px 18px; border-bottom: 1px solid var(--dm-line); font: 700 16px var(--dm-display); }
.dm-sheet__close { background: none; border: 0; font-size: 26px; line-height: 1; cursor: pointer; color: var(--dm-body); }
.dm-sheet__body { overflow-y: auto; padding: 16px 18px; }
.dm-sheet__foot { padding: 14px 18px calc(14px + env(safe-area-inset-bottom)); border-top: 1px solid var(--dm-line); }
.dm-sheet__apply { width: 100%; background: var(--dm-orange); color: #fff; border: 0; font: 700 15px var(--dm-display); padding: 13px; border-radius: 9px; cursor: pointer; }
.dm-sortlist { list-style: none; margin: 0; padding: 0; }
.dm-sortlist a { display: flex; justify-content: space-between; padding: 13px 2px; color: var(--dm-body); font-size: 14.5px; border-bottom: 1px solid var(--dm-line); }
.dm-sortlist a.is-active { color: var(--dm-green-dark); font-weight: 700; }

/* Load more */
.dm-loadmore { text-align: center; margin: 26px 0 6px; }
.dm-loadmore__btn { background: #fff; border: 1.5px solid var(--dm-green); color: var(--dm-green-dark); font: 700 13.5px var(--dm-font); padding: 12px 28px; border-radius: 9px; cursor: pointer; }
.dm-loadmore__btn:hover { background: var(--dm-green-tint); }
.dm-loadmore__btn[disabled] { opacity: 0.55; cursor: default; }

/* ==========================================================================
   Responsive
   ========================================================================== */
/* The grid overrides repeat the base rule's `.woocommerce ul.products`
   selector: shop/category pages carry the `woocommerce` body class, so a bare
   `ul.products` here lost to the 4-column base rule and phones/tablets got
   4 columns (94px cards). */
@media (max-width: 1024px) {
	.woocommerce ul.products,
	ul.products { grid-template-columns: repeat(3, 1fr); }
	.dm-rail__track.is-grid,
	.dm-tiles { grid-template-columns: repeat(3, 1fr); }
	.dm-shop.dm-shop--with-sidebar { grid-template-columns: 1fr; }
	.dm-shop__aside { margin-bottom: 8px; }
}

@media (max-width: 768px) {
	.dm-shop { padding: 16px 16px 0; }
	.woocommerce ul.products,
	ul.products { grid-template-columns: repeat(2, 1fr); gap: 11px; }
	.dm-rail__title { font-size: 17px; }
	.dm-rail__track.is-grid { grid-template-columns: repeat(2, 1fr); gap: 11px; }
	.dm-rail__track.is-scroll > .dm-card { flex-basis: 150px; }
	.dm-tiles { grid-template-columns: repeat(3, 1fr); gap: 10px; }
	.dm-card__title { font-size: 12px; }

	/* Archive: reveal the sticky filter/sort bar, hide the desktop sidebar */
	.dm-shopbar {
		display: flex; position: sticky; top: 0; z-index: 30;
		border-top: 1px solid var(--dm-line); border-bottom: 1px solid var(--dm-line);
		margin: 0 0 12px;
	}
	.dm-shop .widget-area, .dm-shop aside { display: none; }
	/* Filter headings in the sheet are tap targets now (collapsible). */
	summary.dm-filter-widget__title { min-height: 44px; font-size: 15px; }
	.dm-filter-search { font-size: 16px; } /* 16px stops iOS zooming on focus */
	/* The sticky shopbar's own Sort button/sheet replaces this row on mobile;
	   keep the product count visible, drop the border that separated it from
	   the (now hidden) sort form. */
	.dm-shop__sort { display: none; }
	.dm-shop__meta { border-bottom: 0; margin-bottom: 8px; padding-bottom: 0; }
}
