/*
 * SPDX-License-Identifier: GPL-2.0-or-later
 *
 * Cinatra Woodmart child theme — design rules.
 *
 * Applies the Cinatra design system (design-system.html) on top of WoodMart
 * for the WooCommerce + Dokan marketplace. Enqueued AFTER woodmart-style (see
 * functions.php), so plain-specificity overrides win. The critical --wd-*
 * custom-property remap lives in functions.php's late wp_head block; this
 * sheet carries the component-level styling + editorial touches.
 *
 * Aesthetic target: editorial / newspaper. Warm paper canvas, deep navy ink,
 * gold brand accents, indigo primary actions, hairline rules, italic display
 * headings (Archivo), restrained shadows, generous whitespace. Adapted to an
 * online-shop layout for free + commercial Cinatra extensions.
 */

:root {
	--cin-radius: 10px;
	--cin-radius-sm: 7px;
	--cin-shadow-card: 0 1px 0 rgba(21, 33, 58, 0.04), 0 1px 2px rgba(21, 33, 58, 0.04);
	--cin-shadow-lift: 0 2px 8px rgba(21, 33, 58, 0.08);
	--cin-font-sans: "Archivo", ui-sans-serif, system-ui, sans-serif;
	--cin-font-body: "Inter", ui-sans-serif, system-ui, sans-serif;
	--cin-font-mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", Menlo, monospace;

	/* F33 — full colour palette mirrored here so this sheet is self-contained
	   (a fallback contract). The wp_head priority-99999 :root block in
	   functions.php overrides the load-bearing ones at runtime. */
	--cin-paper: #f1f1ed;
	--cin-surface: #f7f7f3;
	--cin-surface-strong: #ffffff;
	--cin-surface-muted: #e8e8e3;
	--cin-sidebar: #eceeea;
	--cin-toolbar: #dcddd5;
	--cin-ink: #15213a;
	--cin-blue: #364e81;
	--cin-muted: #5a6477;
	--cin-line: rgba(21, 33, 58, 0.14);
	--cin-line-strong: #15213a;
	--cin-gold: #c79545;
	--cin-burgundy: #7a2e3a;
	--cin-red: #a6384f;
	--cin-green: #3f6e6b;
	--cin-rust: #b0613a;
	--cin-olive: #6c6a3a;
	--cin-clay: #a86b72;
	--cin-plum: #574a68;
	--cin-stripe-light: #e3e8ee;
	--cin-stripe-mid: #b8c4d4;
	--cin-topbar-h: 34px; /* Web Shell spec: fixed 34px; composable by other chrome */
}

/* ── Sticky footer (R17) ──────────────────────────────────────────────────
   Make the page a min-height flex column so the footer sits at the viewport
   bottom on short pages (no white gap below it). The only in-flow body children
   are `.cin-topbar` + `.wd-page-wrapper` (all WoodMart overlays are fixed /
   absolute, so they don't participate in flex layout). `dvh` avoids the mobile
   URL-bar jump; the admin-bar offsets cancel WP's logged-in `html` shift. */
html { min-height: 100%; }
body {
	display: flex;
	flex-direction: column;
	min-height: 100vh;
	min-height: 100dvh;
}
body.admin-bar { min-height: calc(100dvh - 32px); }
@media screen and (max-width: 782px) {
	body.admin-bar { min-height: calc(100dvh - 46px); }
}
.wd-page-wrapper.website-wrapper {
	flex: 1 0 auto;
	display: flex;
	flex-direction: column;
}
.wd-page-content.main-page-wrapper { flex: 1 0 auto; }

/* ── Canvas + base typography ─────────────────────────────────────────── */
body,
.woocommerce,
.wd-page-wrapper,
.site-content {
	background-color: var(--cin-paper);
	color: var(--cin-ink);
	font-family: var(--cin-font-body);
}

h1, h2, h3, h4, h5, h6,
.entry-title,
.product_title,
.woocommerce-loop-product__title,
.wd-entities-title,
.section-title,
.dokan-dashboard h1,
.dokan-store-info h2 {
	font-family: var(--cin-font-sans);
	color: var(--cin-ink);
	letter-spacing: -0.012em;
}

/* Editorial display headings — italic 800, like the Cinatra masthead. */
h1, .entry-title, .product_title, .page-title {
	font-weight: 800;
	font-style: italic;
	letter-spacing: -0.018em;
}

code, kbd, pre, samp, .sku, .price del, .post-meta {
	font-family: var(--cin-font-mono);
}
/* Inline code sits on --surface-muted (§II/§VIII: an allowed surface token,
   no introduced off-whites). Block <pre> is excluded — it keeps its own
   ground (the README dark code block sets background: var(--cin-ink)). */
code, kbd, samp {
	background: var(--cin-surface-muted);
}

a { color: var(--cin-blue); }
a:hover { color: var(--cin-ink); }

/* ── Header / masthead ───────────────────────────────────────────────── */
.whb-header,
.whb-general-header,
.site-header {
	background-color: var(--cin-paper);
	border-bottom: 1px solid var(--cin-line);
}
/* R2 (F18): the visible header rows (.whb-general-header / .whb-header-bottom)
   carry .whb-color-dark, which WoodMart's header-base.min.css paints pure white
   via `.whb-color-dark:not(.whb-with-bg){background:#fff}` (specificity 0-2-0).
   The 0-1-0 paper rule above loses that cascade, so beat it with a matching
   compound selector + !important. The grey inline hairline comes from
   `.whb-border-fullwidth` (rgba(129,129,129,0.2)) — recolour to navy --cin-line. */
.whb-general-header.whb-color-dark,
.whb-header-bottom.whb-color-dark {
	background-color: var(--cin-paper) !important;
}
.whb-general-header.whb-border-fullwidth,
.whb-header-bottom.whb-border-fullwidth {
	border-bottom-color: var(--cin-line) !important;
}
.whb-header a:not(.btn):not(.button),
.wd-nav > li > a {
	color: var(--cin-ink);
}
/* Active main-nav item — marks the current extension-kind archive (WordPress
   adds current-menu-item to the matching custom-link item). Blue text + a 2px
   underline drawn with inset box-shadow (no layout shift), matching the
   detail-view tab active treatment. */
.whb-header .wd-nav-main > li.current-menu-item > a,
.whb-header .wd-nav-main > li.current-menu-ancestor > a,
.whb-header .wd-nav-main > li.current_page_item > a {
	color: var(--cin-ink);
	/* M3 (F28): no weight reduction — active must not render LIGHTER than
	   inactive siblings (WoodMart default 700). Inherit the sibling weight. */
}
/* L4 (F28): anchor the 2px indigo underline to the inner label span so it sits
   ~2px under the text, not floating ~12px below it at the bottom of the tall
   flex <a>. */
.whb-header .wd-nav-main > li.current-menu-item > a .nav-link-text,
.whb-header .wd-nav-main > li.current-menu-ancestor > a .nav-link-text,
.whb-header .wd-nav-main > li.current_page_item > a .nav-link-text {
	color: var(--cin-ink);
	box-shadow: inset 0 -2px 0 0 var(--cin-blue);
}
/* WoodMart's factory top-bar is replaced by the Cinatra announcement strip
   (cinatra_woodmart_topbar(), hooked to woodmart_after_body_open). Hide
   WoodMart's empty band entirely so there's no blank ink strip + no demo
   placeholder ("ADD ANYTHING HERE…"). */
.whb-top-bar,
.whb-row.whb-top-bar {
	display: none;
}

/* ── Cinatra announcement strip (ink masthead rule) ───────────────────── */
.cin-topbar {
	/* Web Shell spec VI: sticky at the very top, above the property's own
	   header (WoodMart's .whb-main-header is z-index 390) and its mobile
	   switcher dropdown must layer above it too. */
	position: sticky;
	top: 0;
	z-index: 400;
	background-color: var(--cin-ink);
	color: var(--cin-paper);
}
/* When WoodMart's header goes sticky it pins to top:0 — offset it below the
   shell so the two stack instead of overlapping. */
.whb-header.whb-sticked {
	top: var(--cin-topbar-h);
}
.cin-topbar-inner {
	/* Full-width ink masthead, matching docs.cinatra.ai (the shared Cinatra
	   top-bar): the dark bar AND its content span edge-to-edge with 24px
	   gutters, not capped to the page container. The page content below stays
	   centered — full-width chrome over centered content is the canonical
	   Cinatra masthead treatment. */
	max-width: none;
	margin: 0 auto;
	height: var(--cin-topbar-h);
	padding: 0 24px;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 14px;
}
/* Breadcrumb trail (left) — the in-page WoodMart breadcrumb is hidden globally
   (see below); the trail lives only here. Own classes so that hide can't catch
   it. */
.cin-topbar-crumbs {
	display: flex;
	align-items: center;
	gap: 7px;
	min-width: 0;
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
	font-family: var(--cin-font-sans);
	font-size: 11.5px;
}
.cin-topbar-crumbs .cin-crumb {
	color: rgba(241, 241, 237, 0.6);
	text-decoration: none;
}
.cin-topbar-crumbs a.cin-crumb:hover { color: #ffffff; }
.cin-topbar-crumbs .cin-crumb-current {
	color: rgba(241, 241, 237, 0.92);
	font-weight: 600;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
}
.cin-topbar-crumbs .cin-crumb-home {
	display: inline-flex;
	align-items: center;
	gap: 5px;
}
.cin-topbar-crumbs .cin-crumb-sep {
	color: rgba(241, 241, 237, 0.3);
	display: inline-flex;
	align-items: center;
}
/* Documentation link (right). */
.cin-topbar-doc {
	flex-shrink: 0;
	display: inline-flex;
	align-items: center;
	padding: 6px 2px;
	font-family: var(--cin-font-sans);
	font-size: 11.5px;
	font-weight: 600;
	color: rgba(241, 241, 237, 0.6);
	text-decoration: none;
	white-space: nowrap;
}
/* Web Shell spec: hover brightens to white on the ink ground — mustard is brand-only. */
a.cin-topbar-doc:hover { color: #ffffff; }
/* Property switcher + GitHub (right) — Web Shell spec III/IV. */
.cin-topbar-links {
	flex-shrink: 0;
	display: flex;
	align-items: center;
	gap: 14px;
}
.cin-switch-row {
	display: flex;
	align-items: center;
	gap: 14px;
}
.cin-topbar-div {
	width: 1px;
	height: 13px;
	background: rgba(241, 241, 237, 0.2);
	flex-shrink: 0;
}
.cin-topbar-div--strong {
	height: 15px;
	background: rgba(241, 241, 237, 0.18);
}
.cin-gh {
	display: flex;
	align-items: center;
	gap: 7px;
	font-family: var(--cin-font-sans);
	font-size: 11px;
	font-weight: 600;
	color: rgba(241, 241, 237, 0.6);
	text-decoration: none;
	white-space: nowrap;
}
.cin-gh:hover,
.cin-gh:hover .cin-gh-count {
	color: #ffffff;
}
.cin-gh-count {
	display: flex;
	align-items: center;
	gap: 3px;
	color: rgba(241, 241, 237, 0.45);
	font-weight: 500;
}
/* Focus on the navy ground: cream ring (Web Shell spec VI). */
.cin-topbar a:focus-visible,
.cin-switch-menu summary:focus-visible {
	outline: 2px solid rgba(241, 241, 237, 0.92);
	outline-offset: 2px;
}
/* Switcher collapse (<480px) and breadcrumb truncation (<720px). */
.cin-switch-menu {
	display: none;
	position: relative;
}
.cin-switch-menu summary {
	list-style: none;
	cursor: pointer;
	display: inline-flex;
	align-items: center;
	gap: 5px;
}
.cin-switch-menu summary::-webkit-details-marker { display: none; }
.cin-switch-menu-list {
	position: absolute;
	right: 0;
	top: calc(100% + 6px);
	display: flex;
	flex-direction: column;
	gap: 2px;
	padding: 8px 14px;
	background: var(--cin-ink);
	border: 1px solid rgba(241, 241, 237, 0.18);
	border-radius: 8px;
	z-index: 2;
}
@media (max-width: 720px) {
	.cin-topbar-crumbs .cin-crumb:not(.cin-crumb-current),
	.cin-topbar-crumbs .cin-crumb-sep {
		display: none;
	}
}
@media (max-width: 480px) {
	.cin-switch-row { display: none; }
	.cin-switch-menu { display: block; }
	.cin-gh-label { display: none; }
	.cin-topbar-links { gap: 10px; }
}
/* Active property — white at weight 600, not a link (Web Shell spec III);
   the location cue is brightness, never the brand mustard. */
.cin-topbar-doc--active {
	color: #ffffff;
}

/* In-page breadcrumb removed globally (R20) — it now lives only in the top bar
   (.cin-topbar-crumbs, a distinct class, is unaffected). */
.wd-breadcrumbs,
.woocommerce-breadcrumb {
	display: none;
}

/* Page-title band (e.g. shop/archive "Blog" header). WoodMart defaults to a
   near-black band; the Cinatra editorial look is ink title on paper, not
   white-on-dark. Reset the band to paper + ink italic title. */
.page-title,
.wd-page-title,
.title-size-default.page-title {
	background-color: var(--cin-paper) !important;
	border-bottom: 0;
	padding-top: 26px;
	padding-bottom: 14px;
}
/* Match the whitespace below the header band to the whitespace above the title:
   WoodMart's content wrapper adds ~40px on top, which dwarfs the 26px above the
   title. Tighten it only where the wrapper follows the page-title band. */
.page-title + .wd-content-layout,
.page-title + .content-layout-wrapper {
	padding-top: 12px;
}

/* STANDING RULE — remove the GREY thin dividing lines from page content, but
   KEEP the navy etched design rules.
   REMOVE: the soft grey hairlines (var(--cin-line) ≈ rgba(21,33,58,.14), or
   WoodMart's rgba(0,0,0,~.1)) that separate regions — e.g. the lower rule under
   the product-detail description, the my-account nav row dividers + section-title
   underline, the checkout terms-and-conditions rule, the README <hr>. Plus the
   one navy band ABOVE the product tablist (the explicitly-removed "upper section
   rule").
   KEEP: the navy etched paired-line design motif (var(--cin-line-strong)) — the
   product-tablist flanks, the .cin-sect-head section-head rule, and the WoodMart
   section-title divider — together with all component boundaries (card / input /
   button box borders, notice boxes, table structure, the active-tab indigo
   underline) and header / footer / top-bar chrome.
   Do NOT remove the navy etched design rules; do NOT reintroduce grey content
   dividers. */
.product_meta { border-top: 0 !important; }
.product-tabs-wrapper { border-top: 0 !important; border-bottom: 0 !important; }
/* Checkout: strip WooCommerce's default rule above the terms-and-conditions
   block — a content divider hairline. */
.woocommerce-terms-and-conditions-wrapper { border-top: 0; }
.single-product .summary > hr,
.woocommerce-tabs > hr,
.wd-single-tabs > hr { display: none; }
.whb-general-header,
.whb-header-bottom,
.whb-sticky-row { box-shadow: none; }
.site-footer,
.wd-footer-h,
.footer-container { border-top: 0; }
.page-title .entry-title,
.wd-page-title .entry-title,
.page-title .liner-title,
.page-title h1 {
	/* F26: pin the archive/account page-title band heading to §IX h1
	   (Archivo italic 800 / 44px / 1.05 / -0.018em / ink). The band itself
	   stays paper + centered (set above); this fixes the oversized
	   "Extensions" / "My account" / "Agents" titles. */
	font-family: var(--cin-font-sans);
	font-style: italic;
	font-weight: 800;
	font-size: 44px;
	line-height: 1.05;
	letter-spacing: -0.018em;
	color: var(--cin-ink);
	text-wrap: balance;
}

/* ── Cinatra wordmark (header-elements/logo.php override) ─────────────── */
.cinatra-brand {
	display: inline-flex;
	/* Canonical lockup: the fedora and the wordmark are CENTRE-aligned, never
	   baseline. A baseline-set fedora sinks below the wordmark because the hat is
	   bottom-weighted (wide brim), so it reads oversized and detached. Fedora→
	   wordmark gap = 0.4C (≈8px at the 28px / 20px-cap wordmark), matching the
	   wordmark→sub-brand gap so the lockup reads as one even rhythm. */
	align-items: center;
	gap: 8px;
	text-decoration: none;
}
.cinatra-brand .cinatra-mark {
	display: inline-flex;
	align-items: center;
}
.cinatra-brand .cinatra-wordgroup {
	display: inline-flex;
	align-items: center;
	/* M2 (F21): anchor the em-gap to the word size (no font-size = em resolves
	   against inherited 14px → 4px). At 28px, 0.29em ≈ 8px, matching the
	   fedora→wordmark gap above. */
	font-size: 28px;
	gap: 0.29em;
}
.cinatra-brand .cinatra-word {
	font-family: var(--cin-font-sans);
	font-style: italic;
	font-weight: 800;
	font-size: 28px;
	line-height: 1;
	letter-spacing: -0.022em;
	color: var(--cin-gold);
}
.cinatra-brand:hover .cinatra-word { color: var(--cin-gold); }
/* "Marketplace" suffix — same Archivo italic-800 attrs, but ink not gold (R4),
   and stays ink on hover (the gold-on-hover rule above must not catch it). */
.cinatra-brand .cinatra-word-mp,
.cinatra-brand:hover .cinatra-word-mp {
	color: var(--cin-ink);
	text-shadow: none;
}

/* ── Footer ──────────────────────────────────────────────────────────── */
/* WoodMart's generated option-CSS prints an inline `.wd-footer{background:#fff}`
   rule. Match the compound `.wd-footer.footer-container` (specificity 0-2-0) so
   the Cinatra ink band wins on plain specificity — no !important. The copyright
   strip is a separate `.wd-copyrights` element that must be styled too, else its
   text renders as faint ink on the (previously white) ground. */
.wd-footer.footer-container,
.wd-copyrights {
	background-color: var(--cin-ink);
	color: var(--cin-paper);
}
.wd-footer.footer-container a,
.wd-copyrights,
.wd-copyrights a,
.wd-copyrights p,
.wd-copyrights .copyright-text { color: var(--cin-paper); }
/* F27 / §VIII r3: footer link hover brightens to cream on the ink footer. */
.wd-footer.footer-container a:hover,
.wd-copyrights a:hover { color: var(--cin-paper); }

/* ── Buttons (§VI/§X) ─────────────────────────────────────────────────
   Wave 4 variant system. Base metrics are pinned on the shared button rule
   (inline-flex, gap 7px, 7px 14px padding, 500 13px sans, radius-sm, 1px
   border); variants are then assigned by WooCommerce / WoodMart / Dokan
   class. ONLY the explicit primary set is indigo — generic .button is the
   white "default" variant. Hover never swaps a variant's colour: primary
   deepens to ink (the one sanctioned darken); default/outline get a faint
   surface/tint lift, NOT a full ink fill. */
.btn:not(.wd-skip-navigation):not(.wd-skip-content):not(.wd-action-btn):not(.wd-role-btn),
button:not(.wd-skip-navigation):not(.wd-skip-content):not(.wd-action-btn):not(.wd-role-btn),
input[type="button"],
input[type="submit"],
.button,
a.button,
.woocommerce a.button,
.woocommerce button.button,
.woocommerce #respond input#submit,
.single_add_to_cart_button,
.dokan-btn,
.dokan-btn-theme,
.dokan-btn-primary {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 7px;
	padding: 7px 14px;
	border: 1px solid var(--cin-line-strong);
	border-radius: var(--cin-radius-sm);
	font-family: var(--cin-font-sans);
	font-weight: 500;
	font-size: 13px;
	letter-spacing: 0.01em;
	/* Spec button metrics (#199 item 2): height derives from padding +
	   line-height alone. WoodMart's min-height:42px floor and 1.2
	   line-height inflated every .button/.btn/<button> above the drawings
	   ("Download ZIP", classless, was the only correct one). The spec's
	   `font:` shorthand implies line-height: normal. */
	min-height: 0;
	line-height: normal;
	/* Buttons are normal-case (design spec §V). Override WoodMart's default
	   uppercase so labels like "Submit" never shout. */
	text-transform: none;
	transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}

/* DEFAULT (white surface + ink + line-strong border) — the generic, NON-.alt
   WooCommerce button (Apply coupon, Update cart, etc.) and bare <button>. The
   primary set below re-paints itself; the destructive/outline rules win by
   later source order + their own selectors. */
.btn:not(.wd-skip-navigation):not(.wd-skip-content):not(.wd-action-btn):not(.wd-role-btn),
button:not(.wd-skip-navigation):not(.wd-skip-content):not(.wd-action-btn):not(.wd-role-btn),
input[type="button"],
input[type="submit"],
.button,
a.button,
.woocommerce a.button,
.woocommerce button.button {
	background-color: var(--cin-surface-strong);
	color: var(--cin-ink);
	border-color: var(--cin-line-strong);
}
/* Default hover — a faint surface deepen (6% ink tint), NOT a full ink fill. */
.btn:not(.wd-skip-navigation):not(.wd-skip-content):not(.wd-action-btn):not(.wd-role-btn):hover,
button:not(.wd-skip-navigation):not(.wd-skip-content):not(.wd-action-btn):not(.wd-role-btn):hover,
input[type="button"]:hover,
input[type="submit"]:hover,
.button:hover,
a.button:hover,
.woocommerce a.button:hover,
.woocommerce button.button:hover {
	background-color: var(--cin-surface);
	color: var(--cin-ink);
	border-color: var(--cin-line-strong);
	box-shadow: inset 0 0 0 99px rgba(21, 33, 58, 0.06);
}

/* PRIMARY (indigo) — the explicit buy / submit / dokan-theme set. Selectors are
   pinned to ≥ (0,2,1) so they beat the generic default `.woocommerce button.button`
   (0,2,1) by class-count + source order — WooCommerce account submits are
   `<button class="button …">`, so a bare `.woocommerce-form-login__submit` would
   otherwise lose to the default rule. */
.button.alt,
.woocommerce a.button.alt,
.woocommerce button.button.alt,
.woocommerce button.single_add_to_cart_button,
.woocommerce .single_add_to_cart_button,
.woocommerce a.checkout-button,
.woocommerce #place_order,
.woocommerce a.button.add_to_cart_button,
.woocommerce .products a.add_to_cart_button,
.dokan-btn-theme,
.dokan-btn-primary,
.cin-btn-primary,
.woocommerce button.woocommerce-form-login__submit,
.woocommerce input.woocommerce-form-login__submit,
.woocommerce button.woocommerce-form-register__submit,
.woocommerce input.woocommerce-form-register__submit,
/* WoodMart overrides the login/register submit template and drops the
   WooCommerce-core __submit class, keeping only name="login"/"register" — match
   those too so account submits stay primary. */
.woocommerce form.login button[name="login"],
.woocommerce form.woocommerce-form-login button[name="login"],
.woocommerce form.register button[name="register"],
.woocommerce form.woocommerce-form-register button[name="register"],
.woocommerce button.woocommerce-Button[name^="save_"],
.woocommerce input.woocommerce-Button[name^="save_"],
/* The review-form submit is the form's primary action — indigo filled, like the
   account submits, not the white default it used to inherit from input[submit]. */
.woocommerce #respond input#submit {
	background-color: var(--cin-blue);
	color: #ffffff;
	border-color: var(--cin-blue);
}
/* WoodMart sets uppercase on the checkout place-order button via a high-
   specificity ID selector the base `text-transform:none` can't reach. Normal-
   case it too — buttons are normal-case (design spec §V). */
.woocommerce #place_order { text-transform: none; }
/* Primary hover — the one sanctioned darken: indigo → ink. */
.button.alt:hover,
.woocommerce a.button.alt:hover,
.woocommerce button.button.alt:hover,
.woocommerce button.single_add_to_cart_button:hover,
.woocommerce .single_add_to_cart_button:hover,
.woocommerce a.checkout-button:hover,
.woocommerce #place_order:hover,
.woocommerce a.button.add_to_cart_button:hover,
.woocommerce .products a.add_to_cart_button:hover,
.dokan-btn-theme:hover,
.dokan-btn-primary:hover,
.cin-btn-primary:hover,
.woocommerce button.woocommerce-form-login__submit:hover,
.woocommerce input.woocommerce-form-login__submit:hover,
.woocommerce button.woocommerce-form-register__submit:hover,
.woocommerce input.woocommerce-form-register__submit:hover,
.woocommerce form.login button[name="login"]:hover,
.woocommerce form.woocommerce-form-login button[name="login"]:hover,
.woocommerce form.register button[name="register"]:hover,
.woocommerce form.woocommerce-form-register button[name="register"]:hover,
.woocommerce button.woocommerce-Button[name^="save_"]:hover,
.woocommerce input.woocommerce-Button[name^="save_"]:hover,
.woocommerce #respond input#submit:hover {
	background-color: var(--cin-ink);
	color: #ffffff;
	border-color: var(--cin-ink);
	box-shadow: none;
}

/* OUTLINE (surface ground, ink text, line-strong border). Pinned to ≥ (0,2,1)
   to beat the generic default rule for the .button-carrying anchors. */
.button.wc-backward,
.woocommerce a.button.wc-backward,
.cancel.wc-backward,
.woocommerce-cart .cancel,
.cart .button.cancel,
.woocommerce a.added_to_cart,
.added_to_cart,
.cin-btn-secondary {
	background-color: var(--cin-surface);
	color: var(--cin-ink);
	border-color: var(--cin-line-strong);
}
/* Outline hover — a light surface-strong lift + 6% ink tint, NOT an ink fill. */
.button.wc-backward:hover,
.woocommerce a.button.wc-backward:hover,
.cancel.wc-backward:hover,
.woocommerce-cart .cancel:hover,
.cart .button.cancel:hover,
.woocommerce a.added_to_cart:hover,
.added_to_cart:hover,
.cin-btn-secondary:hover {
	background-color: var(--cin-surface-strong);
	color: var(--cin-ink);
	border-color: var(--cin-line-strong);
	box-shadow: inset 0 0 0 99px rgba(21, 33, 58, 0.06);
}

/* SECONDARY (true §X `.btn.secondary`: surface-muted ground, transparent border,
   ink text). L6: `.cin-btn-secondary` is the OUTLINE triple above (kept as-is for
   back-compat); this `.cin-btn-soft` is the genuine secondary the variant system
   was missing — a quiet muted-fill action that isn't an outline. */
.cin-btn-soft {
	background-color: var(--cin-surface-muted);
	color: var(--cin-ink);
	border-color: transparent;
}
.cin-btn-soft:hover {
	background-color: var(--cin-surface-muted);
	color: var(--cin-ink);
	border-color: transparent;
	box-shadow: inset 0 0 0 99px rgba(21, 33, 58, 0.06);
}

/* DESTRUCTIVE (red-on-tint, NOT solid red).
   L14: narrowed to GENUINELY-destructive affordances. `.cancel.wc-backward`,
   `.woocommerce-cart .cancel` and `.cart .button.cancel` are backward-navigation
   / coupon-return links, not destructive — they now fall through to the OUTLINE
   variant (the .wc-backward arm above already covers them). */
.dokan-btn-danger,
a.dokan-delete,
.dokan-product-delete,
.dokan-listing-filter-and-button .dokan-btn-danger {
	background-color: rgba(166, 56, 79, 0.10);
	color: var(--cin-red);
	border: 1px solid rgba(166, 56, 79, 0.24);
	border-radius: var(--cin-radius-sm);
}
.dokan-btn-danger:hover,
a.dokan-delete:hover,
.dokan-product-delete:hover {
	background-color: rgba(166, 56, 79, 0.16);
	color: var(--cin-red) !important;
	border-color: rgba(166, 56, 79, 0.40);
	/* L15: don't let the default-button 6% navy hover wash apply on destructive. */
	box-shadow: none;
}
/* L12: the cart/order `a.remove` is an icon-link (a bare ✕ glyph), not a button —
   render it as a plain red ✕, not a red-bordered tinted disc. */
.woocommerce a.remove {
	background: none;
	border: 0;
	color: var(--cin-red);
}
.woocommerce a.remove:hover {
	background: none;
	color: var(--cin-red) !important;
	box-shadow: none;
}

/* DEFAULT — Dokan generic buttons (FILTER, RESET, etc.). White surface,
   line-strong border, ink text. Primary (.dokan-btn-theme/-primary) and
   danger (.dokan-btn-danger) opt out. */
.dokan-btn:not(.dokan-btn-theme):not(.dokan-btn-primary):not(.dokan-btn-danger) {
	background-color: var(--cin-surface-strong);
	border-color: var(--cin-line-strong);
	color: var(--cin-ink);
}
.dokan-btn:not(.dokan-btn-theme):not(.dokan-btn-primary):not(.dokan-btn-danger):hover {
	background-color: var(--cin-surface);
	border-color: var(--cin-line-strong);
	color: var(--cin-ink);
	box-shadow: inset 0 0 0 99px rgba(21, 33, 58, 0.06);
}

/* lg treatment — the prominent buy CTAs stay larger (Codex). Documented size
   override: the single-product Add-to-cart and the storefront .cin-btn-primary
   keep their bigger footprint (padding 11px 20px / 14px) while still primary
   indigo. Everything else conforms to the 7×14 base above. */
.single_add_to_cart_button {
	padding: 11px 20px;
	font-size: 14px;
}
/* Dashboard inputs / selects / search → Cinatra field (white, line-strong
   border, radius-sm, focus indigo). */
.dokan-dashboard input[type="text"],
.dokan-dashboard input[type="search"],
.dokan-dashboard input[type="email"],
.dokan-dashboard input[type="tel"],
.dokan-dashboard input[type="url"],
.dokan-dashboard input[type="number"],
.dokan-dashboard input[type="password"],
.dokan-dashboard textarea,
.dokan-dashboard select,
.dokan-dashboard .dokan-form-control,
.dokan-dashboard .select2-container .select2-selection {
	background-color: var(--cin-surface-strong);
	border: 1px solid var(--cin-line-strong);
	border-radius: var(--cin-radius-sm);
	color: var(--cin-ink);
	font-family: var(--cin-font-sans);
	box-shadow: none;
}
.dokan-dashboard input:focus,
.dokan-dashboard textarea:focus,
.dokan-dashboard select:focus,
.dokan-dashboard .dokan-form-control:focus {
	outline: none;
	border-color: var(--cin-blue);
	box-shadow: 0 0 0 2px rgba(54, 78, 129, 0.16);
}

/* ── Catalog grid cell ────────────────────────────────────────────────── */
/* The shop/category loop renders the shared extension card (content-product.php
   override) inside a transparent grid cell — the inner `.cin-ext-card` is the
   sole chrome owner (see "Extension card" below). No hover lift/quick-view. */
.cin-ext-cell.wd-product,
.cin-ext-cell.product-grid-item {
	background-color: transparent;
	border: 0;
	border-radius: 0;
	box-shadow: none;
	padding: 0;
	display: flex; /* let the inner card fill the cell so a row is equal-height */
}
.cin-ext-cell > .cin-ext-card { width: 100%; }
/* WoodMart sets the product grid to align-items:flex-start, leaving cards in a
   row at their own content height (uneven button baselines). Stretch them so
   each row is equal-height (§III: cards lock to a shared height). */
.products.wd-products.wd-grid-g { align-items: stretch; }
.woocommerce-loop-product__title,
.wd-entities-title {
	font-weight: 700;
	font-size: 15px;
}
.price,
.woocommerce-Price-amount {
	font-family: var(--cin-font-mono);
	color: var(--cin-ink);
	font-weight: 600;
}
/* "Free" extensions get the green accent; commercial keep ink price. */
.price ins, .price .amount { color: var(--cin-ink); }

/* ── Listing toolbar + page-header nav + pagination ───────────────────── */
/* The sorting / result-count row, restyled as a cohesive toolbar surface. */
/* §X Toolbar — a grounded bar (toolbar tint, 8px radius, NO border) that
   REPLACES the section rule on listing views. Result-count anchors the left;
   the ordering control sits on the right. Embedded controls are borderless
   (their own border/fill dropped) and tint-only on hover/selected. */
.shop-loop-head {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 12px 20px;
	margin-bottom: 24px;
	min-height: 50px;
	padding: 0 8px;
	background-color: var(--cin-toolbar);
	border-radius: 8px;
}
.shop-loop-head > .wd-shop-tools {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 10px 16px;
	margin: 0;
}
/* Surface the result count (WoodMart hides it by default) and give it the
   mono treatment the toolbar spec calls for — anchors the toolbar's left side. */
.shop-loop-head .woocommerce-result-count {
	display: block;
	margin: 0;
	font-family: var(--cin-font-mono);
	font-size: 11px;
	letter-spacing: 0.06em;
	color: var(--cin-muted);
}
/* The breadcrumb in the left group is redundant with the page title on archive
   views — drop it so the bar reads cleanly "result-count … ordering". */
.shop-loop-head .wd-breadcrumbs {
	display: none;
}
/* Hide the controls that don't earn a place in the clean bar: the
   show-sidebar toggle, the per-page (Show: 9/12/18/24) switcher, and the
   grid-column view switcher. Styling all three as borderless toolbar
   controls cleanly is impractical (WoodMart paints them with its own part
   sheets and they add visual noise); the bar keeps only result-count +
   ordering per the §X "result-count … ordering" target. */
.shop-loop-head .wd-show-sidebar-btn,
.shop-loop-head .wd-products-per-page,
.shop-loop-head .wd-products-shop-view {
	display: none;
}
/* Ordering — a borderless toolbar control: transparent, no border/fill,
   500 12.5px sans muted, 34px tall, 7px radius, custom navy chevron via
   appearance:none. Hover/focus = a background tint only (no border, no
   weight/colour shift). */
.shop-loop-head .woocommerce-ordering select,
.shop-loop-head .orderby {
	height: 34px;
	/* M6: reset the broad field min-height:38px floor so the toolbar orderby
	   renders at its intended 34px. */
	min-height: 34px;
	padding: 0 30px 0 10px;
	-webkit-appearance: none;
	-moz-appearance: none;
	appearance: none;
	background-color: transparent;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2315213a' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: right 9px center;
	background-size: 13px 13px;
	border: 0;
	border-radius: var(--cin-radius-sm);
	color: var(--cin-muted);
	/* WoodMart's wd-style-underline order-by hides the native select text via
	   -webkit-text-fill-color:transparent (it expects a JS-painted label that
	   isn't present here). Restore the fill so the native label is legible. */
	-webkit-text-fill-color: var(--cin-muted);
	/* appearance:none collapses this select's intrinsic width to its padding;
	   give it room so the selected label ("Sort by price: low to high") shows. */
	width: auto;
	min-width: 188px;
	max-width: 100%;
	font-family: var(--cin-font-sans);
	font-weight: 500;
	font-size: 12.5px;
}
.shop-loop-head .woocommerce-ordering select:hover,
.shop-loop-head .orderby:hover,
.shop-loop-head .woocommerce-ordering select:focus,
.shop-loop-head .orderby:focus {
	outline: none;
	background-color: rgba(54, 78, 129, 0.10);
}
/* 24px×1px hairline separator before the ordering group (the boundary between
   the bar's left/right logical groups). */
.shop-loop-head .woocommerce-ordering {
	display: flex;
	align-items: center;
}
.shop-loop-head .woocommerce-ordering::before {
	content: "";
	width: 1px;
	height: 24px;
	margin-right: 12px;
	background-color: rgba(21, 33, 58, 0.22);
	flex-shrink: 0;
}

/* Page-header category nav (kept only on shop + product-category): drop the
   per-item "N products" count subtext (R14); the nav itself is untouched. */
.wd-nav-product-cat .nav-link-count {
	display: none;
}

/* Pagination — Cinatra-conformant page-number chips. */
.woocommerce-pagination ul.page-numbers {
	display: inline-flex;
	flex-wrap: wrap;
	gap: 6px;
	border: 0;
}
.woocommerce-pagination ul.page-numbers li {
	border: 0;
	margin: 0;
}
/* Scope chip styling to the page links INSIDE each <li>, not the parent
   <ul class="page-numbers"> (which shares the class). */
.woocommerce-pagination ul.page-numbers li > .page-numbers {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 38px;
	height: 38px;
	padding: 0 10px;
	border: 1px solid var(--cin-line);
	border-radius: var(--cin-radius-sm);
	background-color: var(--cin-surface-strong);
	color: var(--cin-ink);
	font-family: var(--cin-font-mono);
	font-size: 13px;
	text-decoration: none;
}
/* C1 (re-audit #4): active page = INK fill per §X (indigo is reserved for action). */
.woocommerce-pagination ul.page-numbers li > .page-numbers.current {
	background-color: var(--cin-line-strong);
	border-color: var(--cin-line-strong);
	color: var(--cin-paper);
}
/* C2: inactive-page hover = a light tint, distinct from the ink-filled current. */
.woocommerce-pagination ul.page-numbers li > a.page-numbers:hover {
	background-color: rgba(54, 78, 129, 0.10);
	border-color: var(--cin-line-strong);
	color: var(--cin-ink);
}
/* prev/next render WoodMart's icon-font glyph (::before) AND a literal ←/→ from
   the WooCommerce template. Hide the literal text so exactly one consistent arrow
   (the theme's icon-font, matching the carousel nav) shows per direction. */
.woocommerce-pagination ul.page-numbers li > a.prev.page-numbers,
.woocommerce-pagination ul.page-numbers li > a.next.page-numbers {
	font-size: 0;
}
.woocommerce-pagination ul.page-numbers li > a.prev.page-numbers::before,
.woocommerce-pagination ul.page-numbers li > a.next.page-numbers::before {
	font-size: 15px;
	line-height: 1;
}

/* ── Single product / extension detail ───────────────────────────────── */
.single-product .product_title { margin-bottom: 0.4em; }
/* Stock state colours (non-single contexts). The single-product .stock is
   promoted to the §VI pill primitive below (W4 §2): in-stock = approved/green,
   out-of-stock = idle/muted. */
.stock.in-stock { color: var(--cin-green); }
.stock.out-of-stock { color: var(--cin-muted); }

/* The navy band above the tablist (the "upper section rule") was removed on
   request — see the standing rule near the top of this file. The tablist flanks
   stay; keep only the vertical breathing space the band used to occupy. */
.single-product div.product .woocommerce-tabs {
	margin-top: 28px;
}

/* Product tabs — CENTERED, flanked left + right by the design-spec etched
   paired rule (1px navy --cin-line-strong lines). The redundant navy band ABOVE
   the tablist (the "upper section rule") was removed on request; the flanks stay
   and the active tab's indigo 2px underline marks selection. Sentence case,
   slate inactive, indigo active (design spec §X). */
.woocommerce-tabs .wd-nav-tabs-wrapper {
	display: flex;
	align-items: flex-end;
	gap: 18px;
	margin: 0 0 26px;
	border: 0;
}
/* The design-spec etched paired rule (5px tall, two 1px navy --cin-line-strong
   lines) FILLS THE ROW TO THE RIGHT of the left-aligned tablist (design spec
   §IV). This is the navy etched design motif, not a grey divider — it stays. */
.woocommerce-tabs .wd-nav-tabs-wrapper::after {
	content: "";
	flex: 1 1 0;
	height: 5px;
	margin-bottom: 11px;
	background: transparent;
	border-top: 1px solid var(--cin-line-strong);
	border-bottom: 1px solid var(--cin-line-strong);
}
.woocommerce-tabs ul.wd-nav-tabs {
	display: inline-flex;
	flex: 0 0 auto;
	flex-wrap: wrap;
	justify-content: flex-start;
	gap: 0;
	margin: 0;
	padding: 0;
	border: 0;
}
.woocommerce-tabs ul.wd-nav-tabs li {
	margin: 0;
	padding: 0;
	background: none;
	border: 0;
}
/* Kill WoodMart's "underline-reverse" TOP marker on the active/hover tab — the
   list carries `wd-style-underline-reverse`, which paints a 3px indigo bar at
   top:0 via the inner `.nav-link-text` / `.wd-tabs-title` span's ::after (NOT
   the <li> or <a> pseudos). The design spec has no top line; the only selection
   cue is the indigo bottom underline below. !important beats WoodMart's own
   keyframed pseudo. */
.woocommerce-tabs ul.wd-nav-tabs li::before,
.woocommerce-tabs ul.wd-nav-tabs li::after,
.woocommerce-tabs ul.wd-nav-tabs li .wd-nav-link::before,
.woocommerce-tabs ul.wd-nav-tabs li .wd-nav-link::after,
.woocommerce-tabs ul.wd-nav-tabs li .wd-nav-link .nav-link-text::before,
.woocommerce-tabs ul.wd-nav-tabs li .wd-nav-link .nav-link-text::after,
.woocommerce-tabs ul.wd-nav-tabs li .wd-nav-link .wd-tabs-title::before,
.woocommerce-tabs ul.wd-nav-tabs li .wd-nav-link .wd-tabs-title::after { display: none !important; }
.woocommerce-tabs ul.wd-nav-tabs li .wd-nav-link {
	display: inline-block;
	padding: 9px 14px 11px;
	font-family: var(--cin-font-sans);
	font-size: 13px;
	font-weight: 500;
	color: var(--cin-muted);
	border-top: 0;
	border-bottom: 2px solid transparent;
	text-decoration: none;
}
/* Spec tabs are sentence case — undo WoodMart's uppercase treatment. */
.woocommerce-tabs ul.wd-nav-tabs li .wd-nav-link,
.woocommerce-tabs ul.wd-nav-tabs li .nav-link-text {
	text-transform: none;
	letter-spacing: normal;
}
.woocommerce-tabs ul.wd-nav-tabs li .wd-nav-link:hover {
	color: var(--cin-ink);
}
.woocommerce-tabs ul.wd-nav-tabs li.active .wd-nav-link {
	color: var(--cin-blue);
	font-weight: 600;
	border-bottom-color: var(--cin-blue);
}

/* ── Cart + checkout (happy path) ────────────────────────────────────── */
/* These are presentation panels (the cart list, the Cart-totals panel, the
   checkout Order-summary), so they sit on --cin-surface (cream), NOT pure white
   (§VIII r8: white = interactive only). Hairline --cin-line border + --cin-radius
   read as panels. Zebra (below) tints alternate cart_item rows. */
.woocommerce-cart table.cart,
.woocommerce-checkout .woocommerce-checkout-review-order-table,
.cart_totals table {
	background-color: var(--cin-surface);
	border: 1px solid var(--cin-line);
	border-radius: var(--cin-radius);
}
/* M5 (F10): the payment box + order-review wrappers are presentation panels —
   ground them on --cin-surface with a hairline + radius (the inner radios /
   inputs keep their white interactive surface). */
.woocommerce-checkout #payment,
.woocommerce-checkout-payment,
#order_review {
	background-color: var(--cin-surface);
	border: 1px solid var(--cin-line);
	border-radius: var(--cin-radius);
}
.woocommerce-cart table.cart th {
	font-family: var(--cin-font-sans);
	color: var(--cin-ink);
}
/* R1 (F1): cart-totals row labels (Subtotal / Shipping / Total) are body prose,
   not column headers — render Inter, not Archivo. */
.cart_totals th {
	font-family: var(--cin-font-body);
	color: var(--cin-ink);
}
/* Seersucker zebra (§IV, F12 / D7) — cool-blue tint on alternate multi-row cart
   + order-summary rows. Targets td/th so it overrides the panel surface; scoped
   to .cart_item rows so the totals/actions rows are never striped. */
.woocommerce-cart table.cart tbody tr.cart_item:nth-child(even) td,
.woocommerce-checkout-review-order-table tbody tr.cart_item:nth-child(even) td {
	background-color: var(--cin-stripe-light);
}
/* ── Alerts — WooCommerce notices (§X, F16) ───────────────────────────────
   The §X alert: a tinted ground + a FULL 1px tinted border + 8px radius + a
   leading status icon (a mask-image ::before, status-coloured) + ink/muted
   text. Replaces the old top-accent-bar treatment. Variants: info = indigo,
   message/success = sea-green, error = red, .cin-alert--warning = mustard. */
.woocommerce-info,
.woocommerce-message,
.woocommerce-error,
.woocommerce-noreviews,
.cart-empty,
.cin-alert,
.cin-alert--info,
.cin-alert--success,
.cin-alert--warning,
.cin-alert--error {
	position: relative;
	display: block;
	/* `!important` only on the padding: WoodMart's notice rule sets
	   `padding-inline:65px 30px !important` (icon on the RIGHT, big left gap),
	   which otherwise wins and floats the §X leading icon ~35px from the text.
	   Pin the §X 40px-left / 14px gutter so the icon and text stay paired. */
	padding: 12px 14px 12px 40px !important;
	border-radius: 8px;
	border: 1px solid;
	/* R1 (F1): notice/alert body prose is Inter, not Archivo. */
	font-family: var(--cin-font-body);
	font-size: 13px;
	line-height: 1.55;
	list-style: none;
}
/* Multi-line Woo errors are a <ul> of <li>; keep them stacked, not flexed. */
.woocommerce-error { margin: 0; }
.woocommerce-error li { list-style: none; margin: 0 0 2px; }
.woocommerce-error li:last-child { margin-bottom: 0; }
/* Leading status icon — a 16px mask-image square, status-coloured (currentColor
   set per-variant). Neutralises WoodMart/Woo's own ::before glyph + left pad. */
.woocommerce-info::before,
.woocommerce-message::before,
.woocommerce-error::before,
.woocommerce-noreviews::before,
.cart-empty::before,
.cin-alert::before,
.cin-alert--info::before,
.cin-alert--success::before,
.cin-alert--warning::before,
.cin-alert--error::before {
	content: "";
	width: 16px;
	height: 16px;
	background-color: currentColor;
	font-size: 0;
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-position: center;
	mask-position: center;
	-webkit-mask-size: contain;
	mask-size: contain;
	position: absolute;
	left: 14px;
	top: 13px;
}
/* INFO — indigo "i-in-circle". */
.woocommerce-info,
.woocommerce-noreviews,
.cart-empty {
	background-color: rgba(54, 78, 129, 0.08);
	border-color: rgba(54, 78, 129, 0.30);
	color: var(--cin-ink);
}
.woocommerce-info::before,
.woocommerce-noreviews::before,
.cart-empty::before {
	color: var(--cin-blue);
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 16v-4'/%3E%3Cpath d='M12 8h.01'/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 16v-4'/%3E%3Cpath d='M12 8h.01'/%3E%3C/svg%3E");
}
/* SUCCESS — sea-green "check". */
.woocommerce-message {
	background-color: rgba(63, 110, 107, 0.10);
	border-color: rgba(63, 110, 107, 0.32);
	color: var(--cin-ink);
}
.woocommerce-message::before {
	color: var(--cin-green);
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E");
}
/* ERROR / destructive — red "x-in-circle". */
.woocommerce-error {
	background-color: rgba(166, 56, 79, 0.08);
	border-color: rgba(166, 56, 79, 0.30);
	color: var(--cin-ink);
}
.woocommerce-error::before {
	color: var(--cin-red);
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='m15 9-6 6'/%3E%3Cpath d='m9 9 6 6'/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='m15 9-6 6'/%3E%3Cpath d='m9 9 6 6'/%3E%3C/svg%3E");
}
/* WARNING — mustard "triangle-alert" (#7a5a1f text). Future-use helper class. */
.cin-alert--warning {
	background-color: rgba(199, 149, 69, 0.16);
	border-color: rgba(199, 149, 69, 0.42);
	color: #7a5a1f;
}
.cin-alert--warning::before {
	color: #7a5a1f;
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z'/%3E%3Cpath d='M12 9v4'/%3E%3Cpath d='M12 17h.01'/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z'/%3E%3Cpath d='M12 9v4'/%3E%3Cpath d='M12 17h.01'/%3E%3C/svg%3E");
}
/* The notice's inline action button (e.g. "View cart" beside the message) stays
   on its own baseline; the flex row keeps it aligned with the text. */
/* Standalone .cin-alert variants (info default + success/error; warning above). */
.cin-alert--info { background-color: rgba(54,78,129,0.08); border-color: rgba(54,78,129,0.30); color: var(--cin-ink); }
.cin-alert--info::before { color: var(--cin-blue); -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 16v-4'/%3E%3Cpath d='M12 8h.01'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 16v-4'/%3E%3Cpath d='M12 8h.01'/%3E%3C/svg%3E"); }
.cin-alert--success { background-color: rgba(63,110,107,0.10); border-color: rgba(63,110,107,0.32); color: var(--cin-ink); }
.cin-alert--success::before { color: var(--cin-green); -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E"); }
.cin-alert--error { background-color: rgba(166,56,79,0.08); border-color: rgba(166,56,79,0.30); color: var(--cin-ink); }
.cin-alert--error::before { color: var(--cin-red); -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='m15 9-6 6'/%3E%3Cpath d='m9 9 6 6'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='m15 9-6 6'/%3E%3Cpath d='m9 9 6 6'/%3E%3C/svg%3E"); }
/* The notice's inline action button (e.g. "View cart") floats right regardless
   of DOM order (Woo sometimes prints it before the text). */
.woocommerce-message .button,
.woocommerce-info .button {
	float: right;
	margin: -2px 0 0 12px;
}

/* ── Forms / inputs / selects / labels (§X, F17) ──────────────────────────
   Spec field: white surface, the STRONG navy hairline (not the soft --cin-line),
   7px radius, 13px sans ink, indigo focus ring. */
input[type="text"], input[type="email"], input[type="password"],
input[type="search"], input[type="number"], input[type="tel"],
input[type="url"], input[type="date"],
textarea, select,
.woocommerce form .form-row input.input-text,
.dokan-form-control {
	background-color: var(--cin-surface-strong);
	border: 1px solid var(--cin-line-strong);
	border-radius: var(--cin-radius-sm);
	color: var(--cin-ink);
	font-family: var(--cin-font-sans);
	font-size: 13px;
	padding: 0 12px;
	min-height: 38px;
}
textarea,
.woocommerce form .form-row textarea {
	padding: 9px 12px;
	line-height: 1.5;
}
input:focus, textarea:focus, select:focus,
.woocommerce form .form-row input.input-text:focus,
.dokan-form-control:focus {
	border-color: var(--cin-blue);
	outline: none;
	box-shadow: 0 0 0 2px rgba(54, 78, 129, 0.18);
}
/* Selects — appearance:none + a navy chevron data-URI (right 12px center),
   reusing the toolbar ordering chevron pattern (W2) for consistency. */
select,
.woocommerce form .form-row select,
.dokan-form-control[multiple="multiple"] {
	-webkit-appearance: none;
	-moz-appearance: none;
	appearance: none;
	padding-right: 32px;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2315213a' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: right 12px center;
	background-size: 13px 13px;
}
/* Checkout Country / State are Select2-enhanced: the native <select> is
   visually hidden (select2-hidden-accessible) so the W4 `select` rule above can't
   reach the VISIBLE control. Bring the Select2 widget into the same field
   treatment — white, line-strong 1px border, radius-sm — and give it the navy
   chevron (Select2 renders its own .select2-selection__arrow, so swap that glyph
   for the W4 data-URI). Scoped to checkout so the storefront search Select2 etc.
   are untouched. */
.woocommerce-checkout .select2-container .select2-selection--single {
	background-color: var(--cin-surface-strong);
	border: 1px solid var(--cin-line-strong);
	border-radius: var(--cin-radius-sm);
	min-height: 38px;
	height: 38px;
}
.woocommerce-checkout .select2-container .select2-selection--single .select2-selection__rendered {
	color: var(--cin-ink);
	font-family: var(--cin-font-sans);
	font-size: 13px;
	line-height: 36px;
	padding-left: 12px;
	padding-right: 32px;
}
/* Replace Select2's default arrow glyph with the W4 navy chevron data-URI. */
.woocommerce-checkout .select2-container .select2-selection--single .select2-selection__arrow {
	height: 36px;
	right: 12px;
}
.woocommerce-checkout .select2-container .select2-selection--single .select2-selection__arrow b {
	border: 0;
	margin: 0;
	width: 13px;
	height: 13px;
	transform: translate(-50%, -50%);
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2315213a' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: center;
	background-size: 13px 13px;
}
.woocommerce-checkout .select2-container--focus .select2-selection--single,
.woocommerce-checkout .select2-container--open .select2-selection--single {
	border-color: var(--cin-blue);
	box-shadow: 0 0 0 2px rgba(54, 78, 129, 0.18);
}

/* WooCommerce form labels — 12px/600 ink, above the field, 6px gap. */
.woocommerce form .form-row label,
.woocommerce-form-row label,
.woocommerce form .form-row > label:first-child {
	display: block;
	margin-bottom: 6px;
	font-family: var(--cin-font-sans);
	font-size: 12px;
	font-weight: 600;
	color: var(--cin-ink);
}
/* Helper / description text — 11px muted below the field. */
.woocommerce form .form-row .description,
.woocommerce-input-wrapper .description,
.dokan-form-group .help-block {
	font-family: var(--cin-font-sans);
	font-size: 11px;
	color: var(--cin-muted);
	margin-top: 4px;
}
/* Error / invalid helper swaps to brand red. */
.woocommerce form .form-row.woocommerce-invalid label,
.woocommerce form .form-row .woocommerce-error,
.woocommerce-form-row.woocommerce-invalid label,
input[aria-invalid="true"] + .description {
	color: var(--cin-red);
}
.woocommerce form .form-row.woocommerce-invalid input.input-text,
input[aria-invalid="true"] {
	border-color: var(--cin-red);
}
/* Checkboxes / radios — indigo accent. */
input[type="checkbox"],
input[type="radio"] {
	accent-color: var(--cin-blue);
}

/* ── Global keyboard focus ring (design-system.html — indigo focus). ─────
   Every interactive element shows the spec's indigo ring on keyboard focus.
   The mouse-focus box-shadow rule above still complements this on pointer
   focus. */
a:focus-visible,
button:focus-visible,
[tabindex]:focus-visible,
.button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
.cin-crumb:focus-visible,
.wd-nav > li > a:focus-visible {
	outline: 2px solid var(--cin-blue);
	outline-offset: 2px;
	border-radius: 2px;
}

/* ── Account shell ───────────────────────────────────────────────────── */
.woocommerce-MyAccount-navigation ul {
	margin: 0;
	padding: 0;
	list-style: none;
}
.woocommerce-MyAccount-navigation ul li {
	/* Grey row-divider hairline removed (the navy etched design rules stay; the
	   grey ones go). The active row's indigo soft-tint + hover tint distinguish
	   the rows. */
	border-bottom: 0;
}
/* Strip WoodMart's default underline beneath the account section title (the
   "Dashboard" / "Orders" heading) — a content divider hairline. !important beats
   WoodMart's later-loading default heading rule. */
.woocommerce-account .woocommerce-MyAccount-content h3,
.woocommerce-MyAccount-content > h3,
h3.woocommerce-MyAccount-title,
.woocommerce-account .entry-title {
	border-bottom: 0 !important;
}
/* §X Sidebar: 13px sans ink links, generous hit area, hairline rows.
   L9 (F11): WoodMart's `.wd-builder-off … li > a{padding:5px 15px; min-height:42px;
   font-weight:600}` (0-2-3) out-specifies a plain `… li a` (0-1-3), so the theme
   metrics were dead and inactive rows rendered 600. Scope under
   `.woocommerce-account.wd-builder-off` (0-3-3) so the 13px / 10px-12px / weight-500
   rest state wins; the active row bumps to 600 below. */
.woocommerce-account.wd-builder-off .woocommerce-MyAccount-navigation ul li a {
	display: flex;
	align-items: center;
	padding: 10px 12px;
	min-height: 44px;
	font-family: var(--cin-font-sans);
	font-size: 13px;
	font-weight: 500;
	color: var(--cin-ink);
	transition: background-color 0.15s ease, color 0.15s ease;
}
.woocommerce-account.wd-builder-off .woocommerce-MyAccount-navigation ul li a:hover {
	background-color: rgba(54, 78, 129, 0.04);
	color: var(--cin-ink);
}
/* ACTIVE item — indigo soft-tint background (~6%) + ink text, NOT flat blue.
   M8 (F11): tint the <a> ONLY — stacking the 6% on both <li> and <a> composites
   to ~11.6% effective alpha (visibly darker than the spec's single 6% tint). */
.woocommerce-account .woocommerce-MyAccount-navigation ul li.is-active a {
	background-color: rgba(54, 78, 129, 0.06);
	color: var(--cin-ink);
	font-weight: 600;
}

/* ── Header account flyout (Login/Register + logged-in menu) ──────────────
   The hover dropdown ships with WoodMart's `color-scheme-dark`; re-skin it to a
   Cinatra card. Scoped under `.wd-header-my-account` so it can't touch the
   My-Account page or other dropdowns. Remapping the local --wd-* vars re-skins
   WoodMart's own dropdown rules without !important. */
.wd-header-my-account .wd-dropdown-register,
.wd-header-my-account .wd-dropdown-account,
.wd-header-my-account .wd-dropdown-my-account {
	background-color: var(--cin-surface-strong);
	border: 1px solid var(--cin-line);
	border-radius: var(--cin-radius);
	box-shadow: var(--cin-shadow-lift);
	color: var(--cin-ink);
	--wd-text-color: #15213a;
	--wd-title-color: #15213a;
	--wd-link-color: #364e81;
	--wd-link-color-hover: #15213a;
}
/* The inner panel is accidentally painted paper by the global `.woocommerce`
   canvas rule — clear it so the card surface shows through. */
.wd-header-my-account .login-dropdown-inner.woocommerce {
	background-color: transparent;
}
/* Heading + secondary links (color-scheme-dark needs these beaten explicitly). */
.wd-header-my-account .wd-heading .title {
	color: var(--cin-ink);
	font-weight: 700;
}
/* Blue secondary links. The `.whb-header` prefix is needed to beat the header
   link rule `.whb-header a:not(.btn):not(.button){color:ink}` (0-3-1). */
.whb-header .wd-header-my-account .wd-heading .create-account-link,
.whb-header .wd-header-my-account .login-form-footer .lost_password,
.whb-header .wd-header-my-account .login-form-footer .lost_password a {
	color: var(--cin-blue);
}
.whb-header .wd-header-my-account .wd-heading .create-account-link:hover,
.whb-header .wd-header-my-account .login-form-footer .lost_password:hover,
.whb-header .wd-header-my-account .login-form-footer .lost_password a:hover {
	color: var(--cin-ink);
}
.wd-header-my-account .woocommerce-form-login label,
.wd-header-my-account .woocommerce-form__label {
	color: var(--cin-ink);
}
/* Logged-in account menu list (ul.wd-sub-menu) — ink links, hairline rows. */
.wd-header-my-account .wd-dropdown-my-account ul.wd-sub-menu li,
.wd-header-my-account .wd-dropdown-account ul.wd-sub-menu li {
	border-bottom: 1px solid var(--cin-line);
}
.wd-header-my-account .wd-dropdown-my-account ul.wd-sub-menu li:last-child,
.wd-header-my-account .wd-dropdown-account ul.wd-sub-menu li:last-child {
	border-bottom: 0;
}
.wd-header-my-account .wd-dropdown-my-account ul.wd-sub-menu a,
.wd-header-my-account .wd-dropdown-account ul.wd-sub-menu a {
	color: var(--cin-ink);
}
.wd-header-my-account .wd-dropdown-my-account ul.wd-sub-menu a:hover,
.wd-header-my-account .wd-dropdown-account ul.wd-sub-menu a:hover {
	color: var(--cin-blue);
}

/* ── Dokan vendor dashboard shell ────────────────────────────────────── */
.dokan-dashboard .dokan-dashboard-wrap {
	background-color: var(--cin-paper);
}
/* The vendor nav lives on .dokan-dash-sidebar (a div) — Dokan ships it in its
   brand purple. Re-skin to the Cinatra sidebar component (design spec §X):
   a LIGHT cool-grey rail (--sidebar), ink items, the active item an indigo
   6%-alpha tint with indigo 600 text (NOT a solid bar / protruding notch). */
.dokan-dashboard .dokan-dash-sidebar {
	background-color: var(--cin-sidebar);
	border: 0;
	border-radius: var(--cin-radius);
	overflow: hidden;
	padding: 8px;
}
.dokan-dashboard .dokan-dash-sidebar ul.dokan-dashboard-menu { background: transparent; margin: 0; }
.dokan-dashboard .dokan-dash-sidebar ul.dokan-dashboard-menu li {
	background: transparent;
	border: 0;
	border-radius: 7px;
	overflow: hidden;
}
.dokan-dashboard .dokan-dash-sidebar ul.dokan-dashboard-menu li a {
	color: var(--cin-ink);
	font-family: var(--cin-font-sans);
}
.dokan-dashboard .dokan-dash-sidebar ul.dokan-dashboard-menu li:hover {
	background-color: rgba(54, 78, 129, 0.06);
}
.dokan-dashboard .dokan-dash-sidebar ul.dokan-dashboard-menu li.active,
.dokan-dashboard .dokan-dash-sidebar ul.dokan-dashboard-menu li.active:hover {
	background-color: rgba(54, 78, 129, 0.08);
}
.dokan-dashboard .dokan-dash-sidebar ul.dokan-dashboard-menu li.active > a { color: var(--cin-blue); font-weight: 600; }
/* No protruding notch — the spec marks the active item with a tint, not an arrow. */
.dokan-dashboard .dokan-dash-sidebar ul.dokan-dashboard-menu li.active::after { display: none; }
/* Footer icon row (visit store / profile / logout) → ink on the light rail. */
.dokan-dashboard .dokan-dash-sidebar .dokan-dash-nav-icons a,
.dokan-dashboard .dokan-dash-sidebar ul.dokan-dashboard-menu li a:hover { color: var(--cin-ink); }
.dokan-dashboard .dokan-dash-sidebar ul.dokan-dashboard-menu li.active > a:hover { color: var(--cin-blue); }
/* Submenu (Settings → Store/Payment) — same light treatment; Dokan ships the
   submenu items in dark purple, so re-skin the items, not just the panel. */
.dokan-dashboard .dokan-dash-sidebar ul.dokan-dashboard-menu li ul.navigation-submenu {
	background-color: rgba(21, 33, 58, 0.03);
}
.dokan-dashboard .dokan-dash-sidebar ul.navigation-submenu li.submenu-item {
	background-color: transparent !important;
	border: 0;
	border-radius: 6px;
}
.dokan-dashboard .dokan-dash-sidebar ul.navigation-submenu li.submenu-item a { color: var(--cin-ink) !important; }
.dokan-dashboard .dokan-dash-sidebar ul.navigation-submenu li.submenu-item:hover {
	background-color: rgba(54, 78, 129, 0.06) !important;
}
.dokan-dashboard .dokan-dash-sidebar ul.navigation-submenu li.submenu-item.current,
.dokan-dashboard .dokan-dash-sidebar ul.navigation-submenu li.submenu-item.current:hover {
	background-color: rgba(54, 78, 129, 0.08) !important;
}
.dokan-dashboard .dokan-dash-sidebar ul.navigation-submenu li.submenu-item.current > a {
	color: var(--cin-blue) !important;
	font-weight: 600;
}
/* Drop Dokan's white left-bar marker on the active submenu item (spec uses a tint). */
.dokan-dashboard .dokan-dash-sidebar ul.navigation-submenu li.submenu-item.current::before,
.dokan-dashboard .dokan-dash-sidebar ul.navigation-submenu li.submenu-item::before { display: none; }
.dokan-dashboard .dokan-dashboard-content {
	background-color: transparent;
	border: 0;
	border-radius: 0;
	box-shadow: none;
	padding-left: 0;
	padding-right: 0;
}
/* Dokan table → §X table treatment (F9). The earlier-wave rule painted the
   thead on --cin-surface-muted with a 13px sans/ink head; that fights the
   storefront §X table primitive (uppercase mono 10px/700/0.18em muted + a navy
   --cin-line-strong underline). Re-align it here so the vendor dashboard tables
   match the my-account / cart tables. */
.dokan-dashboard table.dokan-table thead th {
	background-color: transparent;
	color: var(--cin-muted);
	font-family: var(--cin-font-mono);
	font-size: 10px;
	font-weight: 700;
	letter-spacing: 0.18em;
	text-transform: uppercase;
	text-align: left;
	border-bottom: 1px solid var(--cin-line-strong);
	padding: 8px 14px;
}
/* Body cells = ink + soft hairline row dividers; seersucker zebra on even rows. */
.dokan-dashboard table.dokan-table tbody td {
	/* R1 (F1): Dokan body cells are Inter (body prose). */
	font-family: var(--cin-font-body);
	color: var(--cin-ink);
	border-bottom: 1px solid var(--cin-line);
	padding: 8px 14px;
}
.dokan-dashboard table.dokan-table tbody tr:nth-child(even) td {
	background-color: var(--cin-stripe-light);
}
/* Dokan's React analytics dashboard (WooCommerce-Admin) hardcodes its brand
   purple (#7047eb). Remap the visible usages — utility classes + the active
   report-summary stat — to Cinatra indigo. !important is needed to beat the
   plugin's compiled, high-specificity CSS. */
.dokan-dashboard .text-dokan-primary { color: var(--cin-blue) !important; }
.dokan-dashboard .bg-dokan-primary { background-color: var(--cin-blue) !important; }
.dokan-dashboard .border-dokan-primary { border-color: var(--cin-blue) !important; }
.dokan-dashboard a.woocommerce-summary__item,
.dokan-dashboard .woocommerce-summary__item-data { color: var(--cin-ink) !important; }
.dokan-dashboard a.woocommerce-summary__item.is-selected,
.dokan-dashboard a.woocommerce-summary__item:hover {
	border-color: var(--cin-blue) !important;
}
.dokan-dashboard a.woocommerce-summary__item.is-selected .woocommerce-summary__item-data,
.dokan-dashboard a.woocommerce-summary__item.is-selected .woocommerce-summary__item-label,
.dokan-dashboard a.woocommerce-summary__item:hover .woocommerce-summary__item-data {
	color: var(--cin-blue) !important;
}

/* ── Editorial accents ───────────────────────────────────────────────── */
/* WoodMart section-title double-line divider — the design-spec etched paired
   rule (5px tall, two 1px navy --cin-line-strong lines). Navy design motif, not
   a grey divider — it stays. */
.wd-section-title:after {
	border: 0;
	height: 5px;
	border-top: 1px solid var(--cin-line-strong);
	border-bottom: 1px solid var(--cin-line-strong);
}
/* Kicker labels (category eyebrows). */
.product-category .wd-entities-title,
.wd-products-element .title-design-section {
	font-size: 10.5px;
	font-weight: 700;
	letter-spacing: 0.22em;
	text-transform: uppercase;
	color: var(--cin-muted);
}

/* ═══════════════════════════════════════════════════════════════════════
   STOREFRONT — front-page.php
   The designed marketplace home: hero masthead, extension-type bench, and a
   featured-extensions grid. Editorial / newspaper per design-system.html.
   ═══════════════════════════════════════════════════════════════════════ */

/* The template renders inside WoodMart's `<main class="container wd-grid-g">`;
   there is no sidebar, so span the full grid and own the vertical rhythm. */
.cin-storefront {
	grid-column: 1 / -1;
	width: 100%;
	padding: 0 0 64px;
}
/* Front page: drop WoodMart's content-wrapper top padding so the hero sits
   directly under the header (no gap). */
body.home .content-layout-wrapper { padding-top: 0; }


/* ── Hero masthead ───────────────────────────────────────────────────── */
.cin-hero {
	padding: 28px 0 8px;
}
/* Two-column hero: copy left, dancing robot right. Collapses below 1024px so
   the robot never narrows the search field (see Responsive). */
.cin-hero-grid {
	display: grid;
	grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
	gap: 32px;
	/* Centre the text against the tall robot so the empty space is split evenly
	   above and below it (was top-pinned, which read as little-top/big-bottom). */
	align-items: center;
}
/* Top-align the copy column (the robot column stays vertically centred). */
.cin-hero-copy { min-width: 0; align-self: start; }
.cin-hero-robot-col {
	display: flex;
	/* Anchor the (taller) robot iframe to the TOP of a shorter window and clip
	   the overflow: the brick-stack animation needs headroom ABOVE the robot,
	   while the dead space BELOW the shadow is just empty canvas — cropping it
	   removes the excess height under the hero without reframing the scene. */
	align-items: flex-start;
	justify-content: center;
	overflow: hidden;
	aspect-ratio: 16 / 9;
}
/* 3D stacking-robot motif (Three.js scene embedded via iframe). Decorative:
   pointer-events off so page scroll/clicks pass through; sized to the column. */
.cin-hero-robot-frame {
	width: 100%;
	/* No fixed pixel height — the 3D scene re-fits to the frame on resize, so a
	   responsive aspect-ratio keeps the robot sized to the column at any width
	   (and avoids a tall hard-coded band beside the top-aligned copy). */
	aspect-ratio: 3 / 2;
	height: auto;
	border: 0;
	background: transparent;
	pointer-events: none;
	display: block;
}
/* Hero eyebrow kicker — small mono uppercase label with a soft pulsing dot.
   Teases the (currently hidden) "add your extensions" vendor flow; it is a
   label, NOT a button (no hover/click affordance). Mirrors the .cin-source
   label treatment so it sits in the editorial type system. */
.cin-hero-eyebrow {
	display: inline-flex;
	align-items: center;
	gap: 9px;
	margin: 0 0 18px;
	font-family: var(--cin-font-mono);
	font-size: 11px;
	font-weight: 600;
	letter-spacing: 0.2em;
	text-transform: uppercase;
	color: var(--cin-blue);
}
.cin-hero-eyebrow-dot {
	width: 7px;
	height: 7px;
	border-radius: 50%;
	/* F27 / §VIII r3: "Coming soon" is a teaser, not the brand or a
	   "needs you" status — the pulse dot matches its blue eyebrow label,
	   not the brand mustard. */
	background: var(--cin-blue);
	box-shadow: 0 0 0 0 rgba(54, 78, 129, 0.55);
	animation: cin-hero-eyebrow-pulse 2.4s ease-out infinite;
}
@keyframes cin-hero-eyebrow-pulse {
	0%   { box-shadow: 0 0 0 0 rgba(54, 78, 129, 0.55); }
	70%  { box-shadow: 0 0 0 7px rgba(54, 78, 129, 0); }
	100% { box-shadow: 0 0 0 0 rgba(54, 78, 129, 0); }
}
@media (prefers-reduced-motion: reduce) {
	.cin-hero-eyebrow-dot { animation: none; }
}

.cin-hero-title {
	font-family: var(--cin-font-sans);
	font-style: italic;
	font-weight: 800;
	/* L1: bring within the §IX.4 headline ceiling (44px / lh 1.05 / -0.018em);
	   was 52px / 1.04 / -0.02em (8px above ceiling, lh below the 1.05 floor). */
	font-size: 44px;
	line-height: 1.05;
	letter-spacing: -0.018em;
	color: var(--cin-ink);
	margin: 0 0 16px;
	text-wrap: balance;
}
.cin-hero-lede {
	font-family: var(--cin-font-body);
	font-size: 15px;
	line-height: 1.55;
	color: var(--cin-muted);
	max-width: 60ch;
	margin: 0 0 26px;
	text-wrap: pretty;
}
.cin-hero-search {
	display: flex;
	align-items: center;
	gap: 10px;
	flex-wrap: wrap;
	max-width: 620px;
}
/* The icon is positioned against the input wrapper (not the whole form), so it
   stays anchored to the field when the buttons wrap onto a second row. */
.cin-search-field {
	position: relative;
	flex: 1 1 280px;
	min-width: 0;
	display: flex;
}
.cin-search-field .cin-search-icon {
	position: absolute;
	left: 14px;
	top: 50%;
	transform: translateY(-50%);
	width: 17px;
	height: 17px;
	color: var(--cin-muted);
	pointer-events: none;
}
.cin-search-field input[type="search"] {
	width: 100%;
	min-width: 0;
	height: 46px;
	padding: 0 14px 0 40px;
	background-color: var(--cin-surface-strong);
	border: 1px solid var(--cin-line-strong);
	border-radius: var(--cin-radius-sm);
	font-family: var(--cin-font-sans);
	font-size: 14px;
	color: var(--cin-ink);
}
.cin-search-field input[type="search"]:focus {
	outline: none;
	border-color: var(--cin-blue);
	box-shadow: 0 0 0 2px rgba(54, 78, 129, 0.18);
}

/* Storefront primary button (indigo). */
.cin-btn-primary {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	height: 46px;
	padding: 0 22px;
	border-radius: var(--cin-radius-sm);
	font-family: var(--cin-font-sans);
	font-weight: 500;
	font-size: 14px;
	letter-spacing: 0.01em;
	text-decoration: none;
	cursor: pointer;
	background-color: var(--cin-blue);
	border: 1px solid var(--cin-blue);
	color: #ffffff;
	transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
.cin-btn-primary:hover {
	background-color: var(--cin-ink);
	border-color: var(--cin-ink);
	color: #ffffff;
}

/* ── Section header (h2 + rule + source) ─────────────────────────────── */
.cin-section { margin-top: 8px; }
/* Extra breathing room above each subsequent section (e.g. Newest extensions). */
.cin-section + .cin-section { margin-top: 52px; }
/* "See all extensions" — centered button below the Newest grid. */
.cin-seeall { margin-top: 32px; text-align: center; }
.cin-sect-head {
	display: grid;
	grid-template-columns: auto 1fr auto;
	gap: 18px;
	align-items: baseline;
	margin-bottom: 22px;
}
.cin-sect-head h2 {
	margin: 0;
	font-family: var(--cin-font-sans);
	font-style: italic;
	font-weight: 800;
	font-size: 24px;
	letter-spacing: -0.018em;
	color: var(--cin-ink);
	text-wrap: balance;
}
.cin-sect-head .cin-sect-rule {
	/* The section-head rule — a single navy --cin-line-strong line between the
	   heading and its source label. This is a navy design rule, not a grey
	   divider, so it stays. */
	height: 1px;
	background: var(--cin-line-strong);
	align-self: center;
}
.cin-sect-head .cin-source {
	font-family: var(--cin-font-mono);
	font-size: 10.5px;
	letter-spacing: 0.18em;
	text-transform: uppercase;
	color: var(--cin-muted);
	white-space: nowrap;
}
.cin-sect-head a.cin-source-link { text-decoration: none; }
.cin-sect-head a.cin-source-link:hover { color: var(--cin-ink); }

/* "Related extensions" (the WoodMart related-products carousel head) carries a
   section-head rule too — a single navy --cin-line-strong line trailing the
   heading, matching the storefront section heads. The heading is already a flex
   .wd-el-title with one inner span; a flex-growing 1px line after it fills to the
   right edge. The carousel's nav/pagination is a separate sibling, so the line
   never collides with it. */
.related-products .wd-el-title.slider-title {
	align-items: center;
	gap: 18px;
}
.related-products .wd-el-title.slider-title::after {
	content: "";
	flex: 1 1 0;
	height: 1px;
	background: var(--cin-line-strong);
}

/* ── Extension-type bench (§V) ───────────────────────────────────────── */
.cin-type-bench {
	display: grid;
	grid-template-columns: repeat(5, 1fr);
	gap: 14px;
}
/* Bordered icon tiles — deliberately NOT cards: paper surface, hairline border,
   a coloured (kind-accent) icon. Distinct from the colour-headed extension cards. */
.cin-type-tile {
	background-color: var(--cin-surface);
	border: 1px solid var(--cin-line);
	border-radius: var(--cin-radius);
	padding: 16px;
	min-height: 120px;
	display: flex;
	flex-direction: column;
	gap: 8px;
	color: var(--cin-ink);
	text-decoration: none;
}
.cin-type-tile:hover { border-color: var(--cin-line-strong); }
.cin-type-emblem {
	width: 38px;
	height: 38px;
	border-radius: 9px;
	background: color-mix(in srgb, var(--tile-accent) 14%, transparent);
	color: var(--tile-accent);
	display: grid;
	place-items: center;
	margin-bottom: 4px;
	flex-shrink: 0;
}
.cin-type-emblem svg { width: 20px; height: 20px; }
.cin-type-label {
	font-family: var(--cin-font-sans);
	font-style: italic;
	font-weight: 800;
	font-size: 19px;
	line-height: 1.1;
	letter-spacing: -0.012em;
	color: var(--cin-ink);
}
.cin-type-tag {
	font-family: var(--cin-font-mono);
	font-size: 10px;
	letter-spacing: 0.06em;
	color: var(--cin-muted);
}

/* ── Featured-extensions grid ─────────────────────────────────────────── */
.cin-ext-grid {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	/* §III: cards lock to a shared height across the grid, not just per row. */
	grid-auto-rows: 1fr;
	gap: 18px;
}

/* ── Extension card (§III listing card — home Newest + shop/category loop) ──
   Coloured head on the listing's random categorical ground (46×46 white logo
   tile + wrapping italic title) over a white body: description (3 lines
   reserved) + "Type by Vendor" publisher line, centred price / Install now /
   More details cluster, and a stats | freshness meta row. No rules in the
   body; the card is the sole chrome owner; NO hover lift/scale. The card sets
   `--kind` on the root so the head ground, publisher emblem and logo tile all
   read the same categorical colour. */
.cin-ext-card {
	display: flex;
	flex-direction: column;
	height: 100%;
	background-color: var(--cin-surface-strong);
	border: 1px solid var(--cin-line);
	border-radius: var(--cin-radius);
	overflow: hidden;
	box-shadow: var(--cin-shadow-card);
	/* Left-align card text — WoodMart centres product cells on /shop/. */
	text-align: left;
}
/* §III card head — a flex ROW on the categorical ground: logo tile + title. */
.cin-ext-card-head {
	position: relative;
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 14px;
	min-height: 88px;
	background-color: var(--kind, var(--cin-clay));
	color: var(--cin-surface-strong);
}
/* Text column beside the tile: the italic title stacked over the white
   publisher byline (0.7.0 relocated the byline out of the white body into
   the coloured head, under the name — spec §III). */
.cin-ext-card-head-text {
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 5px;
}
/* Lock the title colour on hover/focus — the global a:hover would flip it to
   navy, killing contrast on the coloured ground. */
.cin-ext-card-name:hover,
.cin-ext-card-name:focus { color: var(--cin-surface-strong); }
/* The title is a STRETCHED link: its ::after covers the whole coloured head so
   the head reads as one click target, WITHOUT nesting the vendor <a> inside a
   head <a> (invalid HTML). The vendor link rides above the pseudo via z-index
   (see .cin-ext-publisher--oncolor below). */
.cin-ext-card-name::after {
	content: "";
	position: absolute;
	inset: 0;
}
/* The card link IS a coloured ground + the card clips overflow, so the global
   outline ring is invisible. Use an INSET ring on the stretched pseudo; cream
   reads on every categorical accent (indigo would vanish on burgundy/rust). */
.cin-ext-card-name:focus-visible { outline: none; }
.cin-ext-card-name:focus-visible::after {
	box-shadow: inset 0 0 0 3px var(--cin-paper), inset 0 0 0 5px var(--cin-blue);
}
/* White rounded-square logo tile: the extension's own app-style logo (hosted
   raster icon → allowlisted vendor SVG → kind emblem) in the categorical
   colour. */
.cin-ext-logo {
	display: grid;
	place-items: center;
	width: 46px;
	height: 46px;
	flex: none;
	border-radius: 11px;
	overflow: hidden;
	background: var(--cin-surface-strong);
	color: var(--kind, var(--cin-clay));
	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.22);
}
.cin-ext-logo svg { width: 24px; height: 24px; }
/* Non-square vendor marks (e.g. Gmail, 256:193) must keep their aspect —
   vendor SVGs carry `.cin-ext-vendor-logo` and size to their intrinsic ratio,
   capped to fit the tile. */
.cin-ext-logo svg.cin-ext-vendor-logo {
	width: auto;
	height: auto;
	max-width: 26px;
	max-height: 24px;
}
/* Uploaded raster icon fills the tile. */
.cin-ext-logo .cin-ext-logo-img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	border-radius: inherit;
	display: block;
}
/* Title beside the tile: italic 800, white on the coloured ground, clamped to
   TWO lines (0.7.0 — was 3). It is the card's stretched link (::after above),
   so it must carry no underline. */
.cin-ext-card-name {
	font-family: var(--cin-font-sans);
	font-style: italic;
	font-weight: 800;
	font-size: 18px;
	line-height: 1.12;
	letter-spacing: -0.012em;
	color: var(--cin-surface-strong);
	text-decoration: none;
	min-width: 0;
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
}

/* DETAIL-PANEL-ONLY from here: the single-extension detail view
   (single-product/product-image.php) still composes the older shared classes
   (.cin-ext-head / .cin-ext-head-row / .cin-ext-kind-icon / .cin-ext-badge /
   .cin-ext-name). The §III card no longer uses them — do not restyle these for
   the card. */
.cin-ext-head {
	display: flex;
	flex-direction: column;
	gap: 14px;
	padding: 16px;
	min-height: 116px;
	background-color: var(--kind, var(--cin-clay));
	color: var(--cin-paper);
	text-decoration: none;
}
/* Lock the head text colour on hover — the global a:hover would otherwise flip
   the coloured-area text to navy, killing contrast on the kind ground. */
.cin-ext-head:hover,
.cin-ext-head:focus { color: var(--cin-paper); }
/* A1 (re-audit #4): the card link IS a coloured ground + the card clips overflow,
   so the global outline ring is invisible. Use an INSET ring; cream reads on every
   categorical accent (indigo would vanish on burgundy/rust). */
.cin-ext-head:focus-visible {
	outline: none;
	box-shadow: inset 0 0 0 3px var(--cin-paper), inset 0 0 0 5px var(--cin-blue);
}
.cin-ext-head-row {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 10px;
}
.cin-ext-kind-icon {
	display: grid;
	place-items: center;
	width: 42px;
	height: 42px;
	flex-shrink: 0;
	border-radius: 50%;
	background: var(--cin-surface-strong);
	color: var(--kind, var(--cin-clay));
	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.22);
}
.cin-ext-kind-icon svg { width: 22px; height: 22px; }
/* L7 (§V): non-square vendor marks (e.g. Gmail, 256:193) must keep their aspect —
   the square 22×22 rule above squeezes them ~25% vertically. Vendor SVGs carry
   `.cin-ext-vendor-logo` and size to their intrinsic ratio, capped to fit the
   emblem pill (≈24×18 for Gmail; the 24×24 square marks render 22×22). */
.cin-ext-kind-icon svg.cin-ext-vendor-logo {
	width: auto;
	height: auto;
	max-width: 24px;
	max-height: 22px;
}
/* Micro metadata (mono, sentence-case). Base styling targets a LIGHT background
   (the detail-view summary column): muted ink, left-aligned. Kept subordinate by
   SIZE, not by a low-contrast tint. The relative phrase is localized, so it is
   NOT CSS-uppercased and carries no tracking. */
.cin-ext-meta {
	margin: 0;
	font-family: var(--cin-font-mono);
	font-size: 10.5px;
	font-weight: 500;
	line-height: 1.25;
	letter-spacing: 0;
	text-transform: none;
	color: var(--cin-muted);
	white-space: nowrap;
}
/* Ownership label (#133) — who stands behind the extension. A quiet, icon-led
   pill on the white card body and the white detail panel area. Three tiers:
   first-party (indigo, the trust signal), verified partner (green), community
   (neutral line). Sits between the rating/freshness stack and the description on
   the card, and under the name on the detail panel. */
.cin-ext-owner {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	align-self: flex-start;
	padding: 3px 10px;
	border-radius: 9999px;
	border: 1px solid var(--cin-line);
	background: var(--cin-surface);
	color: var(--cin-muted);
	font-family: var(--cin-font-mono);
	font-size: 9.5px;
	font-weight: 700;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	white-space: nowrap;
}
.cin-ext-owner::before {
	content: "";
	width: 10px;
	height: 10px;
	flex-shrink: 0;
	background-color: currentColor;
	-webkit-mask: var(--cin-owner-icon) center / contain no-repeat;
	        mask: var(--cin-owner-icon) center / contain no-repeat;
}
/* Built by Cinatra — indigo trust signal, shield-check emblem. */
.cin-ext-owner--cinatra {
	border-color: rgba(54, 78, 129, 0.35);
	background: rgba(54, 78, 129, 0.08);
	color: var(--cin-blue);
	--cin-owner-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.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z'/%3E%3Cpath d='m9 12 2 2 4-4'/%3E%3C/svg%3E");
}
/* Verified partner — green, check-badge emblem. */
.cin-ext-owner--verified_partner {
	border-color: rgba(63, 110, 107, 0.4);
	background: rgba(63, 110, 107, 0.08);
	color: var(--cin-green);
	--cin-owner-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.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z'/%3E%3Cpath d='m9 12 2 2 4-4'/%3E%3C/svg%3E");
}
/* Community — neutral, people emblem. */
.cin-ext-owner--community {
	--cin-owner-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.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M18 21a8 8 0 0 0-16 0'/%3E%3Ccircle cx='10' cy='8' r='5'/%3E%3Cpath d='M22 20c0-3.37-2-6.5-4-8a5 5 0 0 0-.45-8.3'/%3E%3C/svg%3E");
}
/* ── Install CTA (issue #336 → §IV flyout #167) ───────────────────────────
   The single-extension detail CTA: the cost line + the indigo "Install now"
   opening the anchored Instance/CLI flyout (shared panel, #165). The
   .cin-install-fallback box below is the <noscript> path. Uses the design
   tokens + the shared primary-button class (.cin-btn-primary). */
.cin-ext-install {
	margin: 18px 0 0;
	/* Anchor for the absolutely-positioned .cin-ext-detail-flyout. */
	position: relative;
}
.cin-install-fallback {
	margin: 16px 0 0;
	padding: 14px 16px;
	background: var(--cin-surface);
	border: 1px solid var(--cin-line);
	border-radius: var(--cin-radius);
	max-width: min(420px, 100%);
}
.cin-install-fallback-lead {
	margin: 0 0 8px;
	font-family: var(--cin-font-body);
	font-size: 12.5px;
	color: var(--cin-muted);
}
.cin-install-cli {
	display: flex;
	align-items: stretch;
	gap: 8px;
}
.cin-install-cli-cmd {
	flex: 1 1 auto;
	min-width: 0;
	display: block;
	padding: 8px 10px;
	background: var(--cin-surface-strong);
	border: 1px solid var(--cin-line);
	border-radius: var(--cin-radius-sm);
	font-family: var(--cin-font-mono);
	font-size: 12px;
	color: var(--cin-ink);
	overflow-x: auto;
	white-space: nowrap;
}
.cin-install-copy {
	flex: 0 0 auto;
	font-size: 12px;
}
.cin-install-copy.is-copied {
	color: var(--cin-green);
	border-color: var(--cin-green);
}
.cin-install-howto {
	margin: 10px 0 0;
	font-family: var(--cin-font-body);
	font-size: 12px;
	color: var(--cin-muted);
}
.cin-install-howto-link {
	color: var(--cin-blue);
	text-decoration: none;
}
.cin-install-howto-link:hover {
	color: var(--cin-ink);
	text-decoration: underline;
}

/* Shared instance-URL field + error line (used by the Instance pane of the
   card panel and the detail flyout — #165/#167). */
.cin-install-url {
	width: 100%;
	padding: 9px 11px;
	border: 1px solid var(--cin-line-strong);
	border-radius: var(--cin-radius-sm);
	font-family: var(--cin-font-mono);
	font-size: 13px;
	color: var(--cin-ink);
	background: var(--cin-surface-strong);
}
.cin-install-url[aria-invalid="true"] {
	border-color: var(--cin-red);
}
.cin-install-error {
	margin: 8px 0 0;
	font-family: var(--cin-font-body);
	font-size: 12px;
	color: var(--cin-red);
}
.cin-install-error[hidden] {
	display: none;
}

/* Detail-page Install-now flyout (#167): anchored to the header CTA button,
   carrying the shared Instance/CLI panel (design spec §IV). */
.cin-ext-detail-flyout {
	position: absolute;
	right: 0;
	top: calc(100% + 12px);
	z-index: 350;
	width: 320px;
	background: var(--cin-surface-strong);
	border: 1px solid var(--cin-line);
	border-radius: 10px;
	box-shadow: 0 10px 30px rgba(21, 33, 58, 0.16);
	padding: 12px 14px 14px;
	text-align: left;
}
.cin-ext-detail-flyout[hidden] {
	display: none;
}
/* Caret pointing up at the button. */
.cin-ext-detail-flyout::before {
	content: "";
	position: absolute;
	top: -7px;
	right: 26px;
	width: 12px;
	height: 12px;
	background: var(--cin-surface-strong);
	border-left: 1px solid var(--cin-line);
	border-top: 1px solid var(--cin-line);
	transform: rotate(45deg);
}
/* Panes get breathing room inside the flyout card. */
.cin-ext-detail-flyout .cin-ext-install-pane {
	min-height: 96px;
	justify-content: center;
}

.cin-ext-badge {
	display: inline-flex;
	align-items: center;
	/* L11 (§V): align to the indicator-pill metrics (gap 6px / padding 3px 10px). */
	gap: 6px;
	padding: 3px 10px;
	border-radius: 9999px;
	background: rgba(255, 255, 255, 0.92);
	/* L8 (§V): every §V indicator pill carries this drop shadow so it sits ON the
	   coloured ground (matches the sibling emblem pill), not flush against it. */
	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.18);
	color: var(--cin-ink);
	font-family: var(--cin-font-mono);
	font-size: 9.5px;
	font-weight: 700;
	/* F26: raise from 0.08em toward the spec label tier. At 9.5px in a fixed
	   pill (can carry a price string) the spec's small-label 0.16em is the
	   defensible value vs the 0.18em used by larger labels. */
	letter-spacing: 0.16em;
	text-transform: uppercase;
	white-space: nowrap;
}
.cin-ext-badge .woocommerce-Price-amount { color: inherit; font-family: inherit; }
/* §X Badge — icon-led pill (never just text). A 10px leading icon masked to
   currentColor so it inherits the badge ink. Per-variant icon via --cin-badge-icon. */
.cin-ext-badge::before {
	content: "";
	width: 10px;
	height: 10px;
	flex-shrink: 0;
	background-color: currentColor;
	-webkit-mask: var(--cin-badge-icon) center / contain no-repeat;
	        mask: var(--cin-badge-icon) center / contain no-repeat;
}
.cin-ext-badge--oss   { --cin-badge-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.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='16 18 22 12 16 6'/%3E%3Cpolyline points='8 6 2 12 8 18'/%3E%3C/svg%3E"); }
.cin-ext-badge--free  { --cin-badge-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.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z'/%3E%3Ccircle cx='7.5' cy='7.5' r='1.5'/%3E%3C/svg%3E"); }
.cin-ext-badge--price { --cin-badge-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.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='12' y1='2' x2='12' y2='22'/%3E%3Cpath d='M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6'/%3E%3C/svg%3E"); }
.cin-ext-name {
	font-family: var(--cin-font-sans);
	font-style: italic;
	font-weight: 800;
	font-size: 20px;
	line-height: 1.1;
	letter-spacing: -0.012em;
	margin-top: auto;
	text-wrap: balance;
}
/* §III white card body — lede (description + publisher), centred CTA cluster,
   meta row. No horizontal rules anywhere in the body. */
.cin-ext-body {
	display: flex;
	flex-direction: column;
	flex: 1 1 auto;
	padding: 12px 14px 14px;
}
/* The lede reserves three description lines (0.7.0: the publisher byline moved
   up into the coloured head, so the white body reserves the description block
   ALONE — 3 × 14px × 1.45 ≈ 62px, matching the spec's 62px box — was 86px with
   the byline). A short blurb still holds the rows below in place across the
   grid. */
.cin-ext-lede {
	min-height: 62px;
}
.cin-ext-desc {
	margin: 0;
	font-family: var(--cin-font-body);
	font-size: 14px;
	line-height: 1.45;
	color: var(--cin-muted);
	display: -webkit-box;
	-webkit-line-clamp: 3;
	-webkit-box-orient: vertical;
	overflow: hidden;
}
/* "Type by Vendor" publisher line — reads like a phrase: the type's emblem in
   the categorical colour, the type in ink, lowercase "by", the linked vendor
   in indigo, and the indigo verified check for vetted tiers. One line,
   ellipsized. */
.cin-ext-publisher {
	display: flex;
	align-items: center;
	gap: 5px;
	font-family: var(--cin-font-body);
	font-size: 11px;
	color: var(--cin-muted);
	min-width: 0;
	overflow: hidden;
	white-space: nowrap;
}
.cin-ext-publisher-emblem {
	width: 13px;
	height: 13px;
	flex-shrink: 0;
	color: var(--kind, var(--cin-clay));
}
.cin-ext-publisher-text {
	overflow: hidden;
	text-overflow: ellipsis;
}
.cin-ext-publisher-type { color: var(--cin-ink); }
/* Linked vendor — storefronts public: indigo, semibold, hover-underline. The
   renderer emits the <a> only while the storefront switch is on. */
a.cin-ext-publisher-vendor {
	color: var(--cin-blue);
	text-decoration: none;
	font-weight: 600;
}
a.cin-ext-publisher-vendor:hover {
	color: var(--cin-ink);
	text-decoration: underline;
}
/* Unlinked vendor — storefronts hidden (marketplace#211): the name is kept for
   attribution but must NOT read link-like. No indigo, no emphasis, no hover, no
   pointer — it inherits the muted publisher-line colour at normal weight, so
   "by <Vendor>" is plain de-emphasised text. The renderer emits this <span>
   (never the <a> above) precisely when the storefront switch is off. */
span.cin-ext-publisher-vendor {
	color: inherit;
	font-weight: 400;
	text-decoration: none;
	cursor: text;
}
.cin-ext-publisher-check {
	width: 12px;
	height: 12px;
	flex-shrink: 0;
	color: var(--cin-blue);
}
/* 0.7.0: the §III byline sits on the coloured card head —
   recolour the WHOLE line white (emblem, type, "by", vendor, verified check)
   so it reads on the categorical ground, and lift the vendor link above the
   title's stretched ::after so it stays independently clickable. This modifier
   is emitted only by the CARD publisher helper; the §IV detail header uses its
   own line. */
.cin-ext-publisher--oncolor {
	line-height: 1.2;
}
.cin-ext-publisher--oncolor,
.cin-ext-publisher--oncolor .cin-ext-publisher-emblem,
.cin-ext-publisher--oncolor .cin-ext-publisher-type,
.cin-ext-publisher--oncolor a.cin-ext-publisher-vendor,
.cin-ext-publisher--oncolor span.cin-ext-publisher-vendor,
.cin-ext-publisher--oncolor .cin-ext-publisher-check {
	color: var(--cin-surface-strong);
}
.cin-ext-publisher--oncolor a.cin-ext-publisher-vendor {
	position: relative;
	z-index: 1;
}
.cin-ext-publisher--oncolor a.cin-ext-publisher-vendor:hover {
	color: var(--cin-surface-strong);
	text-decoration: underline;
}
/* Centred cluster: price on its own line, primary "Install now", then the
   "More details" link beneath. */
.cin-ext-cta {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 9px;
	margin-top: 11px;
}
.cin-ext-price {
	font-family: var(--cin-font-sans);
	font-weight: 700;
	font-size: 16px;
	color: var(--cin-ink);
	text-align: center;
}
.cin-ext-price .woocommerce-Price-amount {
	font-family: inherit;
	font-weight: inherit;
	color: inherit;
}
.cin-ext-install-now {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	/* #199 item 2: the storefront-primary height:46px does not apply here —
	   the card CTA is the spec's .btn.primary (7px 14px pad, 13px, 1px
	   border → 30px). Same specificity as .cin-btn-primary; later wins. */
	height: auto;
	min-width: 172px;
	margin: 0;
	border-radius: var(--cin-radius-sm);
	font-family: var(--cin-font-sans);
	font-weight: 600;
	font-size: 13px;
	text-align: center;
}
/* Primary indigo paint pinned to ≥ (0,2,1): the generic `.woocommerce a.button`
   default (white surface) otherwise outweighs the shared .cin-btn-primary
   class on anchor CTAs inside Woo-classed wrappers. */
a.button.cin-ext-install-now,
.woocommerce a.button.cin-ext-install-now {
	background-color: var(--cin-blue);
	border-color: var(--cin-blue);
	color: #ffffff;
}
a.button.cin-ext-install-now:hover,
.woocommerce a.button.cin-ext-install-now:hover {
	background-color: var(--cin-ink);
	border-color: var(--cin-ink);
	color: #ffffff;
}
/* Design-system link style: underlined indigo. */
.cin-ext-details-link {
	font-family: var(--cin-font-body);
	font-weight: 600;
	font-size: 12.5px;
	color: var(--cin-blue);
	text-decoration: underline;
	text-underline-offset: 2px;
}
.cin-ext-details-link:hover { color: var(--cin-ink); }
/* Two-column meta row closing the card: rating + installs left, freshness
   (and, once a real source exists, the compatibility ceiling) right. */
.cin-ext-meta-row {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	/* The right column ("Compatible up to: …" over "Updated …", #193) can
	   outgrow a tight card — let it wrap UNDER the stats instead of clipping
	   at the card edge (both lines stay whole, right-aligned). */
	flex-wrap: wrap;
	gap: 5px 14px;
	margin-top: 14px;
}
.cin-ext-stats {
	display: grid;
	gap: 5px;
}
.cin-ext-updates {
	display: flex;
	flex-direction: column;
	align-items: flex-end;
	gap: 5px;
	flex: none;
	/* Keep the column pinned right when it wraps onto its own row. */
	margin-left: auto;
	max-width: 100%;
}
.cin-ext-rating {
	display: flex;
	align-items: center;
	gap: 6px;
	white-space: nowrap;
}
.cin-ext-rating .star-rating {
	margin: 0;
	font-size: 12px;
	line-height: 1;
	/* §III: review stars are the familiar review-star amber. */
	color: #f5a623;
}
.cin-ext-rating .star-rating::before { color: #d0cbbd; opacity: 1; }
.cin-ext-rating .star-rating span::before { color: #f5a623; }
.cin-ext-rating-avg {
	font-family: var(--cin-font-mono);
	font-size: 10px;
	font-weight: 700;
	color: var(--cin-ink);
}
.cin-ext-rating-count {
	font-family: var(--cin-font-mono);
	font-size: 10px;
	color: var(--cin-muted);
}
/* §III item 18 zero-state (#193): no votes → dimmed hollow stars + a muted
   "No reviews yet" in place of the "0.0 (0)" star+average cluster. The
   populated row (amber fill, mono average, vote count) returns with the
   first real vote. */
.cin-ext-rating--empty .star-rating { opacity: 0.55; }
.cin-ext-rating--empty .star-rating span::before { color: #d0cbbd; }
.cin-ext-rating-none {
	font-family: var(--cin-font-mono);
	font-size: 10px;
	color: var(--cin-muted);
}
/* §III item 18 right column (#193): "Compatible up to: …" reads in ink over
   the muted "Updated …" line (spec: ink value row above the muted date). */
.cin-ext-meta--compat { color: var(--cin-ink); }

/* ── §III in-card install flow (Install now → Instance/CLI tabs) ─────────
   The panel swaps in for `.cin-ext-body-main` inside the same `.cin-ext-body`
   (script-toggled via the `hidden` attribute), so the card keeps its shared
   grid height. Server-rendered hidden; progressively enhanced. */
.cin-ext-body-main {
	display: flex;
	flex-direction: column;
	flex: 1 1 auto;
}
.cin-ext-install-panel {
	display: flex;
	flex-direction: column;
	flex: 1 1 auto;
	padding-top: 2px;
}
/* Both faces are flex containers, so the `hidden` attribute needs an explicit
   display override (display:flex would otherwise beat the UA's [hidden]). */
.cin-ext-body-main[hidden],
.cin-ext-install-panel[hidden],
.cin-ext-install-pane[hidden] {
	display: none !important;
}
.cin-ext-install-tabs {
	display: flex;
	align-items: flex-end;
	gap: 16px;
	border-bottom: 1px solid var(--cin-line);
	margin: 0 0 6px;
	flex: none;
}
/* Tab + close are <button>s, and the global button default (its four :not()
   class arguments give it (0,4,1) specificity) would paint them as bordered
   white pills. The repeated class pins each rule to the same (0,4,1) so this
   LATER block wins — quiet text tabs, ink label + indigo underline when
   selected. */
button.cin-ext-install-tab.cin-ext-install-tab.cin-ext-install-tab.cin-ext-install-tab {
	appearance: none;
	background: transparent;
	border: 0;
	border-bottom: 2px solid transparent;
	border-radius: 0;
	margin: 0 0 -1px;
	padding: 0 0 8px;
	font-family: var(--cin-font-sans);
	font-size: 12px;
	font-weight: 600;
	line-height: 18px; /* #199 item 2: the spec panel-tab drawing (28px total) */
	color: var(--cin-muted);
	cursor: pointer;
	box-shadow: none;
	transition: color 0.15s ease, border-color 0.15s ease;
}
button.cin-ext-install-tab.cin-ext-install-tab.cin-ext-install-tab.cin-ext-install-tab:hover {
	background: transparent;
	color: var(--cin-ink);
	border-color: transparent;
	border-bottom-color: var(--cin-line-strong);
	box-shadow: none;
}
button.cin-ext-install-tab.cin-ext-install-tab.cin-ext-install-tab.cin-ext-install-tab[aria-selected="true"] {
	color: var(--cin-ink);
	border-bottom-color: var(--cin-blue);
}
button.cin-ext-install-close.cin-ext-install-close.cin-ext-install-close.cin-ext-install-close {
	appearance: none;
	background: transparent;
	border: 0;
	border-radius: 6px;
	box-shadow: none;
	margin: 0 0 4px auto;
	padding: 0;
	width: 22px;
	height: 22px;
	display: grid;
	place-items: center;
	color: var(--cin-muted);
	cursor: pointer;
}
button.cin-ext-install-close.cin-ext-install-close.cin-ext-install-close.cin-ext-install-close:hover {
	background: var(--cin-surface-muted);
	border-color: transparent;
	color: var(--cin-ink);
	box-shadow: none;
}
.cin-ext-install-close svg {
	width: 13px;
	height: 13px;
}
/* Panes: content vertically centred within the panel's flexible middle. */
.cin-ext-install-pane {
	display: flex;
	flex-direction: column;
	justify-content: center;
	flex: 1 1 auto;
}
.cin-ext-install-label {
	display: block;
	margin: 0 0 5px;
	font-family: var(--cin-font-mono);
	font-size: 9px;
	font-weight: 700;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: var(--cin-muted);
}
/* The URL field/error reuse the detail dialog's classes; only spacing is
   panel-specific. */
.cin-ext-install-pane .cin-install-url {
	margin: 0 0 11px;
	font-size: 11.5px;
	padding: 8px 10px;
}
.cin-ext-install-pane .cin-install-error {
	margin: -5px 0 9px;
}
/* "Open install page" — primary indigo. Pinned like the tabs: the generic
   button default is (0,4,1), so tie it and win by source order. */
button.cin-install-go.cin-install-go.cin-install-go.cin-btn-primary {
	background-color: var(--cin-blue);
	border: 0;
	color: #ffffff;
	width: 100%;
	/* #199 item 2, spec §III/§IV panel drawing: 9px padding, borderless,
	   600 13px → 32px — the same height as the "Download ZIP" reference. */
	height: auto;
	padding: 9px;
	font-weight: 600;
}
button.cin-install-go.cin-install-go.cin-install-go.cin-btn-primary:hover {
	background-color: var(--cin-ink);
	border-color: var(--cin-ink);
	color: #ffffff;
}
/* Download pane (#189, spec §III/§IV): the ZIP-file mark + "Download ZIP"
   link, centred within the pane — a primary indigo pill per the spec mock. */
.cin-ext-install-pane--download {
	align-items: center;
}
a.cin-ext-install-download.cin-ext-install-download {
	display: inline-flex;
	align-items: center;
	gap: 7px;
	padding: 9px 16px;
	/* #199 item 2: the drawing's `font:` shorthand implies line-height normal
	   (33px total); the inherited 1.6 body line-height was the one drift on
	   this otherwise-reference button. */
	line-height: normal;
	background: var(--cin-blue);
	color: #ffffff;
	border-radius: var(--cin-radius-sm);
	font-family: var(--cin-font-sans);
	font-size: 13px;
	font-weight: 600;
	text-decoration: none;
	cursor: pointer;
}
a.cin-ext-install-download.cin-ext-install-download:hover {
	background: var(--cin-ink);
	color: #ffffff;
}
.cin-ext-install-download svg {
	width: 15px;
	height: 15px;
	flex: none;
}
.cin-ext-install-cli {
	display: flex;
	align-items: center;
	gap: 8px;
	background: var(--cin-surface-muted);
	border-radius: var(--cin-radius-sm);
	padding: 8px 10px;
}
.cin-ext-install-cli-cmd {
	flex: 1 1 auto;
	min-width: 0;
	font-family: var(--cin-font-mono);
	font-size: 11px;
	color: var(--cin-ink);
	background: transparent;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
/* The in-card Copy is a quiet inline control on the muted CLI row, not the
   detail fallback's bordered button — same pinning story as the tabs. */
.cin-ext-install-cli button.cin-install-copy.cin-install-copy.cin-install-copy {
	appearance: none;
	background: transparent;
	border: 0;
	border-radius: var(--cin-radius-sm);
	box-shadow: none;
	margin: 0;
	padding: 2px 6px;
	flex: none;
	font-family: var(--cin-font-sans);
	font-size: 11px;
	font-weight: 600;
	color: var(--cin-blue);
	cursor: pointer;
}
.cin-ext-install-cli button.cin-install-copy.cin-install-copy.cin-install-copy:hover {
	background: var(--cin-surface-strong);
	border-color: transparent;
	color: var(--cin-ink);
	box-shadow: none;
}
.cin-ext-install-cli button.cin-install-copy.cin-install-copy.cin-install-copy.is-copied {
	color: var(--cin-green);
}
/* Docs link fixed at the panel foot, present on every tab. */
.cin-ext-install-howto {
	flex: none;
	text-align: center;
	padding-top: 12px;
	font-family: var(--cin-font-body);
	font-size: 11px;
	font-weight: 600;
	color: var(--cin-blue);
	text-decoration: underline;
	text-underline-offset: 2px;
}
.cin-ext-install-howto:hover { color: var(--cin-ink); }

/* ── Empty state (no products yet) ───────────────────────────────────── */
.cin-empty {
	background-color: var(--cin-surface);
	border: 1px solid var(--cin-line);
	border-radius: var(--cin-radius);
	padding: 44px 32px;
	text-align: center;
}
.cin-empty-icon {
	display: inline-grid;
	place-items: center;
	width: 56px;
	height: 56px;
	margin: 0 auto 16px;
	border: 1px dashed var(--cin-line-strong);
	border-radius: 50%;
	color: var(--cin-muted);
}
.cin-empty-icon svg { width: 26px; height: 26px; }
.cin-empty-title {
	font-family: var(--cin-font-sans);
	font-style: italic;
	font-weight: 800;
	font-size: 22px;
	color: var(--cin-ink);
	margin: 0 0 8px;
	text-wrap: balance;
}
.cin-empty-lede {
	font-family: var(--cin-font-body);
	font-size: 14px;
	color: var(--cin-muted);
	max-width: 52ch;
	margin: 0 auto 20px;
	line-height: 1.55;
	text-wrap: pretty;
}

/* ── Single-extension detail view (design spec §IV) ───────────────────────
   One full-width header row: LEFT cluster (.product-images → the
   product-image.php override) = app-logo tile + name (<h1>) + "{Type} by
   {Vendor}" publisher line; RIGHT cluster (.summary) = cost stacked above the
   indigo "Install now". No coloured banner, no commerce badge, no ownership
   pill. The README + specs render in the Details tab below. */

/* Collapse WoodMart's two-column image/summary grid into the §IV header row:
   the left cluster grows, the right cluster hugs its content. */
.single-product .product-image-summary-inner {
	display: flex;
	align-items: flex-start;
	gap: 24px;
}
.single-product .product-image-summary-inner > .product-images {
	flex: 1 1 auto;
	min-width: 0;
	width: auto;
	max-width: none;
}
.single-product .product-image-summary-inner > .summary {
	/* A DEFINITE basis (not auto) — the CTA block's percentage max-widths
	   otherwise cycle against the column's intrinsic size and collapse it to
	   min-content. 420px fits the CLI fallback box; it may shrink, never grow. */
	flex: 0 1 420px;
	width: auto;
	max-width: 40%;
}

/* Left cluster: 72px white rounded-square app-logo tile + title + publisher. */
/* 0.7.0: the name + byline are vertically CENTRED against the
   72px app-logo tile (was top-aligned). The price + "Install now" cluster stays
   pinned to the top-right — it lives in the WooCommerce summary column, which
   top-aligns independently of this header row. */
.cin-ext-detail-head {
	display: flex;
	align-items: center;
	gap: 18px;
}
.cin-ext-detail-id {
	flex: 1 1 auto;
	min-width: 0;
}
.cin-ext-detail-name {
	font-family: var(--cin-font-sans);
	font-style: italic;
	font-weight: 800;
	font-size: 24px;
	line-height: 1.05;
	letter-spacing: -0.018em;
	margin: 0;
	color: var(--cin-ink);
}

/* App-logo tile — the same logo chain as the card tile (.cin-ext-logo), on
   the §IV detail chrome: a white rounded square tinted the listing's
   categorical colour (inline `color:` from the helper). Two sizes: the 72px
   detail-header tile and the 46px pagination-preview tile. */
.cin-ext-applogo {
	flex: none;
	display: grid;
	place-items: center;
	overflow: hidden;
	background: var(--cin-surface-strong);
	border: 1px solid var(--cin-line);
}
.cin-ext-applogo--detail {
	width: 72px;
	height: 72px;
	border-radius: 16px;
	box-shadow: 0 2px 6px rgba(21, 33, 58, 0.10);
}
.cin-ext-applogo--detail svg {
	width: 38px;
	height: 38px;
}
.cin-ext-applogo--nav {
	width: 46px;
	height: 46px;
	border-radius: 11px;
	box-shadow: 0 1px 3px rgba(21, 33, 58, 0.10);
}
.cin-ext-applogo--nav svg {
	width: 24px;
	height: 24px;
}
/* Uploaded raster icon fills the tile (mirrors .cin-ext-logo .cin-ext-logo-img). */
.cin-ext-applogo .cin-ext-logo-img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	border-radius: inherit;
	display: block;
}
/* Keep non-square vendor marks proportional inside the tile. */
.cin-ext-applogo svg.cin-ext-vendor-logo {
	width: auto;
	height: auto;
	max-width: 56%;
	max-height: 50%;
}

/* Detail-header publisher line: the card's publisher primitives at §IV header
   scale — 13px body, a 14px emblem tinted by the helper's inline colour (the
   card's var(--kind) does not exist here), no verified check. */
.cin-ext-publisher--detail {
	font-size: 13px;
	margin-top: 8px;
}
.cin-ext-publisher--detail .cin-ext-publisher-emblem-wrap {
	flex: none;
	display: grid;
	place-items: center;
}
.cin-ext-publisher--detail .cin-ext-publisher-emblem {
	width: 14px;
	height: 14px;
	color: inherit;
}

/* Right cluster: the cost stacks above the indigo "Install now" (both
   right-aligned; the flyout arrives with the install-CTA rework). */
.single-product .summary .summary-inner {
	display: flex;
	flex-direction: column;
	align-items: flex-end;
}
.cin-ext-install {
	display: flex;
	flex-direction: column;
	align-items: flex-end;
	gap: 8px;
	/* As a flex child the block sizes to content — cap it so the CLI fallback
	   box can never push past the column/viewport (its command scrolls). */
	max-width: 100%;
}
/* The §III price line at §IV header scale: right-aligned, 15px. */
.cin-ext-install .cin-ext-price {
	font-size: 15px;
	text-align: right;
}
/* "Install now" is the indigo PRIMARY (design spec §IV). The generic button
   default above carries (0,4,1) specificity via its :not() chain, which beats
   bare .cin-btn-primary — pin this instance at (0,4,1)+source-order (and
   (0,5,1) for hover) so the primary treatment actually lands. Spec metrics:
   13px / 9px 18px, hugging its label (not a full-width bar). */
.single-product .cin-ext-install button.cin-install-open.cin-btn-primary {
	width: auto;
	max-width: none;
	height: auto;
	padding: 9px 18px;
	font-size: 13px;
	background-color: var(--cin-blue);
	border-color: var(--cin-blue);
	color: #ffffff;
}
.single-product .cin-ext-install button.cin-install-open.cin-btn-primary:hover {
	background-color: var(--cin-ink);
	border-color: var(--cin-ink);
	color: #ffffff;
	box-shadow: none;
}

/* Details tab (README left + specs column right). */
/* Inside the two-column Details grid the README hugs the LEFT column (the
   standalone auto-centring is for legacy full-width contexts). */
.cin-ext-details .cin-ext-readme {
	margin-left: 0;
	margin-right: 0;
}
.cin-ext-details {
	display: grid;
	grid-template-columns: minmax(0, 1fr) 260px;
	gap: 32px;
	align-items: start;
}
.cin-ext-details--no-specs { grid-template-columns: minmax(0, 1fr); }
.cin-ext-details--no-readme { grid-template-columns: minmax(0, 360px); }
.cin-ext-specs {
	background: var(--cin-surface);
	border: 1px solid var(--cin-line);
	border-radius: 8px;
	padding: 4px 14px;
}
.cin-ext-spec {
	padding: 11px 0;
	border-bottom: 1px solid var(--cin-line);
}
.cin-ext-spec:last-child { border-bottom: 0; }
.cin-ext-spec-label {
	font-family: var(--cin-font-sans);
	font-size: 13px;
	font-weight: 700;
	color: var(--cin-ink);
}
.cin-ext-spec-value {
	font-family: var(--cin-font-mono);
	font-size: 11px;
	color: var(--cin-muted);
	margin-top: 3px;
}
/* The freshness <time> inside the specs column inherits the value tier (its
   card-tier .cin-ext-meta sizing must not shrink it further). */
.cin-ext-spec-value .cin-ext-meta {
	font-size: inherit;
	color: inherit;
	white-space: normal;
}

/* §IV item 7 Dependencies block (#192): closes the sidebar under the spec
   rows — "Dependencies" title, then one row per declared dependency (kind
   emblem in the dep listing's own categorical colour, indigo name link, mono
   range). The divider above it is the LAST spec row's own border-bottom (the
   row keeps it whenever this block follows, since .cin-ext-spec:last-child
   then no longer matches) — exactly one hairline, per the spec drawing. */
.cin-ext-deps {
	padding: 14px 0 9px;
	margin-top: 4px;
}
.cin-ext-deps-label {
	font-family: var(--cin-font-sans);
	font-size: 13px;
	font-weight: 700;
	color: var(--cin-ink);
}
.cin-ext-deps-list {
	display: grid;
	gap: 9px;
	margin-top: 9px;
}
.cin-ext-dep {
	display: flex;
	align-items: flex-start;
	gap: 8px;
	text-decoration: none;
}
.cin-ext-dep-emblem { flex: none; margin-top: 2px; }
.cin-ext-dep-emblem svg { width: 14px; height: 14px; display: block; }
.cin-ext-dep-id { min-width: 0; }
.cin-ext-dep-name {
	display: block;
	font-family: var(--cin-font-sans);
	font-size: 12.5px;
	color: var(--cin-blue);
	line-height: 1.35;
}
a.cin-ext-dep:hover .cin-ext-dep-name {
	color: var(--cin-ink);
	text-decoration: underline;
}
.cin-ext-dep--unlinked .cin-ext-dep-name { color: var(--cin-ink); }
.cin-ext-dep-range {
	display: block;
	font-family: var(--cin-font-mono);
	font-size: 10px;
	color: var(--cin-muted);
	margin-top: 1px;
}

/* §IV items 5+10 Changelog tab (#192): one block per version — mono version
   chip, relative date, green "Latest" badge on the newest — over its note
   list; entries split by hairlines, the last one bare. */
.cin-ext-changelog-entry {
	padding: 16px 0;
	border-bottom: 1px solid var(--cin-line);
}
.cin-ext-changelog-entry:last-child { border-bottom: 0; }
.cin-ext-changelog-head {
	display: flex;
	align-items: center;
	gap: 10px;
	margin-bottom: 9px;
}
.cin-ext-changelog-version {
	font-family: var(--cin-font-mono);
	font-size: 13px;
	font-weight: 700;
	color: var(--cin-ink);
	background: var(--cin-surface-muted);
	border-radius: 6px;
	padding: 2px 9px;
}
.cin-ext-changelog-date {
	font-family: var(--cin-font-mono);
	font-size: 10.5px;
	color: var(--cin-muted);
}
.cin-ext-changelog-latest {
	font-family: var(--cin-font-mono);
	font-size: 9px;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	font-weight: 700;
	color: var(--cin-green);
	border: 1px solid var(--cin-green);
	border-radius: 5px;
	padding: 1px 6px;
}
.cin-ext-changelog-notes {
	margin: 0;
	padding-left: 18px;
	list-style: disc;
}
.cin-ext-changelog-notes li {
	font-family: var(--cin-font-body);
	font-size: 13px;
	line-height: 1.55;
	color: var(--cin-muted);
	margin: 0 0 4px;
}
/* Spec empty state: centred muted file mark over "No changelog available". */
.cin-ext-changelog--empty {
	padding: 48px 20px;
	text-align: center;
	display: flex;
	flex-direction: column;
	align-items: center;
}
.cin-ext-changelog--empty svg {
	width: 30px;
	height: 30px;
	color: var(--cin-muted);
	opacity: 0.6;
}
.cin-ext-changelog-empty-title {
	font-family: var(--cin-font-sans);
	font-weight: 700;
	font-size: 15px;
	color: var(--cin-ink);
	margin-top: 12px;
}

/* Tab-panel foot: centred share row + centred pagination, closing every tab
   panel above a hairline. */
.cin-ext-tabfoot {
	margin-top: 26px;
	padding-top: 22px;
	border-top: 1px solid var(--cin-line);
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 16px;
}
.cin-share {
	display: flex;
	align-items: center;
	gap: 10px;
}
.cin-share-label {
	font-family: var(--cin-font-body);
	font-size: 12.5px;
	font-weight: 600;
	color: var(--cin-muted);
}
.cin-share-ic {
	display: grid;
	place-items: center;
	color: var(--cin-muted);
	text-decoration: none;
}
.cin-share-ic svg {
	width: 19px;
	height: 19px;
}
.cin-share-ic:hover { color: var(--cin-blue); }

/* Pagination: prev / back-to-catalog (indigo grid) / next. Hover/focus opens
   the preview flyout of the neighbouring extension (app-logo tile + name). */
.cin-nav {
	display: flex;
	align-items: center;
	gap: 10px;
}
.cin-nav-hover {
	position: relative;
	display: inline-flex;
}
.cin-nav-btn {
	width: 30px;
	height: 30px;
	display: grid;
	place-items: center;
	color: var(--cin-muted);
	background: transparent;
	border: 0;
}
.cin-nav-btn svg {
	width: 20px;
	height: 20px;
}
.cin-nav-btn:hover { color: var(--cin-ink); }
.cin-nav-grid { color: var(--cin-blue); }
.cin-nav-grid svg {
	width: 17px;
	height: 17px;
}
.cin-nav-dd {
	display: none;
	position: absolute;
	top: calc(100% + 12px);
	left: 50%;
	transform: translateX(-50%);
	width: 250px;
	background: var(--cin-surface-strong);
	border: 1px solid var(--cin-line);
	border-radius: 10px;
	box-shadow: 0 10px 30px rgba(21, 33, 58, 0.16);
	padding: 12px;
	z-index: 6;
	text-align: left;
	align-items: center;
	gap: 12px;
}
.cin-nav-dd::before {
	content: "";
	position: absolute;
	top: -7px;
	left: 50%;
	margin-left: -6px;
	width: 12px;
	height: 12px;
	background: var(--cin-surface-strong);
	border-left: 1px solid var(--cin-line);
	border-top: 1px solid var(--cin-line);
	transform: rotate(45deg);
}
.cin-nav-hover:hover .cin-nav-dd,
.cin-nav-hover:focus-within .cin-nav-dd {
	display: flex;
}
.cin-nav-dd-name {
	font-family: var(--cin-font-sans);
	font-style: italic;
	font-weight: 800;
	font-size: 16px;
	color: var(--cin-ink);
	line-height: 1.16;
	display: -webkit-box;
	-webkit-line-clamp: 3;
	-webkit-box-orient: vertical;
	overflow: hidden;
	min-width: 0;
}

/* Reviews tab (§IV): keep the WooCommerce/WoodMart two-column DOM — the
   reviews list (#comments) LEFT, the "Add a review" form RIGHT — restyled in
   the design language. */
.single-product .woocommerce-Tabs-panel--reviews .woocommerce-Reviews {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 44px;
	align-items: start;
}
.single-product .woocommerce-Reviews #comments,
.single-product .woocommerce-Reviews #review_form_wrapper {
	width: auto;
	min-width: 0;
	float: none;
}
/* Spec order: reviews list LEFT, "Add a review" form RIGHT. WoodMart flips the
   form first (order:1 on #comments) — pin the spec order explicitly. */
.single-product .woocommerce-Reviews #comments { order: 0; }
.single-product .woocommerce-Reviews #review_form_wrapper { order: 1; }
.single-product .woocommerce-Reviews .woocommerce-Reviews-title {
	font-family: var(--cin-font-sans);
	font-weight: 700;
	font-size: 17px;
	color: var(--cin-ink);
	margin: 0 0 16px;
}
.single-product .woocommerce-Reviews .woocommerce-Reviews-title span { font-style: italic; }
.single-product .woocommerce-Reviews ol.commentlist {
	list-style: none;
	margin: 0;
	padding: 0;
}
.single-product .woocommerce-Reviews ol.commentlist > li {
	padding: 18px 0;
	border-bottom: 1px solid var(--cin-line);
	margin: 0;
}
.single-product .woocommerce-Reviews ol.commentlist > li:last-child { border-bottom: 0; }
.single-product .woocommerce-Reviews .comment_container {
	display: flex;
	gap: 16px;
}
.single-product .woocommerce-Reviews .comment_container img.avatar {
	flex: none;
	width: 44px;
	height: 44px;
	border-radius: 50%;
	border: 0;
	padding: 0;
	position: static;
	background: var(--cin-surface-muted);
}
.single-product .woocommerce-Reviews .comment-text {
	flex: 1 1 auto;
	min-width: 0;
	margin: 0;
	padding: 0;
	border: 0;
}
.single-product .woocommerce-Reviews .comment-text .meta {
	margin: 0 0 6px;
	font-family: var(--cin-font-body);
	font-size: 12.5px;
	color: var(--cin-muted);
}
.single-product .woocommerce-Reviews .comment-text .meta .woocommerce-review__author {
	color: var(--cin-ink);
	font-weight: 700;
}
.single-product .woocommerce-Reviews .comment-text .meta .woocommerce-review__verified {
	color: var(--cin-green);
	font-style: normal;
	font-weight: 600;
}
.single-product .woocommerce-Reviews .comment-text .description p {
	font-family: var(--cin-font-body);
	font-size: 13.5px;
	line-height: 1.55;
	color: var(--cin-muted);
	margin: 0;
}
/* Stars in the reviews tab are amber per the spec §IV mock (filled #f5a623,
   empty #d0cbbd) — scoped to the reviews surface. */
.single-product .woocommerce-Reviews .star-rating,
.single-product .woocommerce-Reviews .star-rating span::before,
.single-product .woocommerce-Reviews p.stars a {
	color: #f5a623;
}
.single-product .woocommerce-Reviews .star-rating::before {
	color: #d0cbbd;
	opacity: 1;
}
.single-product .woocommerce-Reviews .comment-form-rating .stars a { color: #f5a623; }
.single-product .woocommerce-Reviews #review_form .comment-reply-title {
	display: block;
	font-family: var(--cin-font-sans);
	font-weight: 700;
	font-size: 16px;
	color: var(--cin-ink);
	margin-bottom: 8px;
}

/* More Extensions tab: "More from {vendor}" heading + the shared card grid. */
.cin-ext-moreext-heading {
	font-family: var(--cin-font-sans);
	font-weight: 700;
	font-size: 15px;
	color: var(--cin-ink);
	margin: 0 0 14px;
}

/* README (Description tab) — editorial typography, scoped. */
.cin-ext-readme {
	font-family: var(--cin-font-body);
	font-size: 14px;
	line-height: 1.6;
	color: var(--cin-ink);
	text-wrap: pretty;
	/* Cap the reading measure so prose doesn't stretch the full content width,
	   and centre the block (the text inside stays left-aligned). */
	max-width: 65ch;
	margin-left: auto;
	margin-right: auto;
}
.cin-ext-readme > :first-child { margin-top: 0; }
.cin-ext-readme h1,
.cin-ext-readme h2,
.cin-ext-readme h3,
.cin-ext-readme h4 {
	font-family: var(--cin-font-sans);
	font-style: italic;
	font-weight: 800;
	color: var(--cin-ink);
	line-height: 1.15;
	margin: 1.5em 0 0.5em;
}
.cin-ext-readme h1 { font-size: 26px; }
.cin-ext-readme h2 { font-size: 21px; }
.cin-ext-readme h3 { font-size: 17px; }
.cin-ext-readme h4 { font-size: 15px; }
.cin-ext-readme p,
.cin-ext-readme ul,
.cin-ext-readme ol { margin: 0 0 1em; }
.cin-ext-readme ul,
.cin-ext-readme ol { padding-left: 1.4em; }
.cin-ext-readme li { margin: 0.25em 0; }
.cin-ext-readme a { color: var(--cin-blue); text-decoration: underline; }
.cin-ext-readme code {
	font-family: var(--cin-font-mono);
	font-size: 0.88em;
	background: var(--cin-surface-muted);
	border: 1px solid var(--cin-line);
	border-radius: 4px;
	padding: 0.1em 0.4em;
}
.cin-ext-readme pre {
	background: var(--cin-ink);
	color: var(--cin-paper);
	border-radius: var(--cin-radius-sm);
	padding: 16px;
	overflow: auto;
	margin: 0 0 1em;
}
.cin-ext-readme pre code { background: transparent; border: 0; color: inherit; padding: 0; }
.cin-ext-readme blockquote {
	margin: 0 0 1em;
	padding: 4px 0 4px 16px;
	border-left: 3px solid var(--cin-line-strong);
	color: var(--cin-muted);
}
.cin-ext-readme img { max-width: 100%; height: auto; }
/* Author-markdown <hr> was a grey hairline — render it as vertical whitespace
   only, no visible rule (grey content dividers go). */
.cin-ext-readme hr { border: 0; height: 0; margin: 1.5em 0; }
.cin-ext-readme table { border-collapse: collapse; width: 100%; margin: 0 0 1em; }
.cin-ext-readme th,
.cin-ext-readme td { border: 1px solid var(--cin-line); padding: 6px 10px; text-align: left; }

/* Cart/mini-cart/checkout thumbnail → coloured kind block (no product photo).
   Sized to fill WoodMart's thumbnail slot; the emblem reads against the ground. */
.cin-ext-mini-thumb {
	display: grid;
	place-items: center;
	width: 100%;
	height: 100%;
	min-width: 48px;
	min-height: 48px;
	aspect-ratio: 1 / 1;
	border-radius: var(--cin-radius-sm);
	background-color: var(--kind, var(--cin-clay));
	color: var(--cin-paper);
}
.cin-ext-mini-thumb svg { width: 46%; height: 46%; }
/* L7 (§V): keep non-square vendor marks proportional in the cart mini-thumb too —
   constrain by max dims instead of the square 46%/46%. */
.cin-ext-mini-thumb svg.cin-ext-vendor-logo {
	width: auto;
	height: auto;
	max-width: 56%;
	max-height: 46%;
}
/* Checkout order-summary: the emblem is injected inline into the (wide)
   product-name cell, where `width:100%` + `aspect-ratio:1/1` would balloon it to
   the full cell width. Pin a fixed 28px chip and float it left of the name. */
.woocommerce-checkout-review-order-table td.product-name .cin-ext-mini-thumb {
	float: left;
	width: 28px;
	height: 28px;
	min-width: 28px;
	min-height: 28px;
	margin: 0 10px 0 0;
}

/* ── Secondary button (outline) ──────────────────────────────────────── */
.cin-btn-secondary {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	padding: 11px 22px;
	background-color: var(--cin-surface);
	border: 1px solid var(--cin-line-strong);
	color: var(--cin-ink);
	border-radius: var(--cin-radius-sm);
	font-family: var(--cin-font-sans);
	font-weight: 500;
	font-size: 14px;
	text-decoration: none;
	transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
/* Outline hover — surface-strong lift + 6% ink tint, NOT an ink fill. */
.cin-btn-secondary:hover { background-color: var(--cin-surface-strong); border-color: var(--cin-line-strong); color: var(--cin-ink); box-shadow: inset 0 0 0 99px rgba(21, 33, 58, 0.06); }

/* ── Header inline search (the only search affordance) ───────────────────
   Appended as the last main-nav item; the WoodMart full-screen header search,
   the hero search, and the mobile-drawer search are removed/hidden. */
.whb-header .wd-header-search,
.wd-search-full-screen,
.mobile-nav .wd-search-form { display: none !important; }
.cin-nav-search { display: flex; align-items: center; }
/* Desktop: pin the search to the far right of the nav row (its right side is
   empty — the cart cluster sits on the row above). */
.whb-header-bottom .container { position: relative; }
.whb-header-bottom .cin-nav-search {
	position: absolute;
	right: 0;
	top: 50%;
	transform: translateY(-50%);
	margin: 0;
}
.cin-nav-search-form { position: relative; display: flex; align-items: center; }
.cin-nav-search-form .cin-nav-search-icon {
	position: absolute;
	left: 11px;
	width: 15px;
	height: 15px;
	color: var(--cin-muted);
	pointer-events: none;
}
.cin-nav-search-form input[type="search"] {
	height: 34px;
	/* M6: reset the broad field min-height:38px floor so nav search renders at 34px. */
	min-height: 34px;
	width: 190px;
	max-width: 32vw;
	margin: 0;
	padding: 0 12px 0 32px;
	background-color: var(--cin-surface-strong);
	border: 1px solid var(--cin-line-strong);
	border-radius: var(--cin-radius-sm);
	font-family: var(--cin-font-sans);
	font-size: 13px;
	color: var(--cin-ink);
	line-height: 1;
}
.cin-nav-search-form input[type="search"]:focus {
	outline: none;
	border-color: var(--cin-blue);
	box-shadow: 0 0 0 2px rgba(54, 78, 129, 0.16);
}

/* ── Quantity stepper — clean Cinatra controls ────────────────────────────
   L10: applies to the single-product stepper AND the cart line-item stepper
   (.woocommerce-cart table.cart .quantity) so the cart +/- /qty match. */
.single-product .quantity,
.woocommerce-cart table.cart .quantity {
	display: inline-flex;
	align-items: stretch;
	border: 1px solid var(--cin-line-strong);
	border-radius: var(--cin-radius-sm);
	overflow: hidden;
	background: var(--cin-surface-strong);
}
.single-product .quantity input.minus,
.single-product .quantity input.plus,
.woocommerce-cart table.cart .quantity input.minus,
.woocommerce-cart table.cart .quantity input.plus {
	width: 38px;
	min-height: 42px;
	padding: 0;
	margin: 0;
	border: 0;
	background: var(--cin-surface);
	color: var(--cin-ink);
	font-family: var(--cin-font-sans);
	font-size: 18px;
	font-weight: 600;
	line-height: 1;
	cursor: pointer;
	box-shadow: none;
	border-radius: 0;
	transition: background-color 0.15s ease, color 0.15s ease;
}
.single-product .quantity input.minus:hover,
.single-product .quantity input.plus:hover,
.woocommerce-cart table.cart .quantity input.minus:hover,
.woocommerce-cart table.cart .quantity input.plus:hover { background: var(--cin-ink); color: var(--cin-paper); }
.single-product .quantity input.minus,
.woocommerce-cart table.cart .quantity input.minus { border-right: 1px solid var(--cin-line); }
.single-product .quantity input.plus,
.woocommerce-cart table.cart .quantity input.plus { border-left: 1px solid var(--cin-line); }
.single-product .quantity input.qty,
.woocommerce-cart table.cart .quantity input.qty {
	width: 48px;
	min-height: 42px;
	margin: 0;
	border: 0;
	background: var(--cin-surface-strong);
	color: var(--cin-ink);
	font-family: var(--cin-font-mono);
	font-size: 14px;
	text-align: center;
}

/* ── Responsive ──────────────────────────────────────────────────────── */
@media (max-width: 1024px) {
	.cin-ext-grid { grid-template-columns: repeat(3, 1fr); }
	.cin-type-bench { grid-template-columns: repeat(3, 1fr); }
	/* Collapse the hero so the robot stacks BELOW the copy — the search field
	   keeps full width and is never squeezed by the robot column. */
	.cin-hero-grid { grid-template-columns: 1fr; gap: 8px; }
	.cin-hero-robot-col { order: 2; margin-top: 8px; }
}
@media (max-width: 768px) {
	/* Detail header stacks: left cluster over the right cost/CTA cluster.
	   (Reset the 420px flex-basis — in a column it would become a HEIGHT.) */
	.single-product .product-image-summary-inner { flex-direction: column; align-items: stretch; }
	.single-product .product-image-summary-inner > .summary { max-width: none; flex: 0 1 auto; width: 100%; }
	.single-product .summary .summary-inner,
	.cin-ext-install { align-items: flex-start; }
	/* Definite width — content-sized + percentage max-width otherwise cycles
	   to a min-content collapse (the cost line wraps word-per-line). */
	.cin-ext-install { width: 100%; }
	.cin-ext-install .cin-ext-price { text-align: left; }
	/* The flyout anchors right:0 of a content-sized, left-aligned column here —
	   flip it to the left edge and cap it to the viewport. */
	.cin-ext-detail-flyout {
		left: 0;
		right: auto;
		width: min(320px, calc(100vw - 32px));
	}
	.cin-ext-detail-flyout::before {
		right: auto;
		left: 26px;
	}
	.cin-ext-details { grid-template-columns: minmax(0, 1fr); }
	.single-product .woocommerce-Tabs-panel--reviews .woocommerce-Reviews { grid-template-columns: 1fr; }
	.cin-hero-title { font-size: 38px; }
	/* F26: page-title band steps down with the hero (44px -> 36px). */
	.page-title .entry-title,
	.wd-page-title .entry-title,
	.page-title .liner-title,
	.page-title h1 { font-size: 36px; }
	/* Wordmark shrinks so "Cinatra Marketplace" fits beside the burger menu. */
	.cinatra-brand .cinatra-word { font-size: 22px; }
	.cinatra-brand .cinatra-mark svg { width: 31px; height: 16px; }
	/* Keep the two gaps equal at the 22px word size (0.29em ≈ 6.4px). */
	.cinatra-brand .cinatra-wordgroup { font-size: 22px; }
	.cinatra-brand { gap: 6px; }
	.cin-ext-grid { grid-template-columns: repeat(2, 1fr); }
	.cin-type-bench { grid-template-columns: repeat(2, 1fr); }
	.cin-sect-head { grid-template-columns: 1fr; gap: 8px; }
	.cin-sect-head .cin-sect-rule { display: none; }
	.cin-nav-search-form input[type="search"] { width: 100%; max-width: none; }
}
@media (max-width: 480px) {
	.cin-hero-title { font-size: 32px; }
	.page-title .entry-title,
	.wd-page-title .entry-title,
	.page-title .liner-title,
	.page-title h1 { font-size: 32px; }
	.cinatra-brand .cinatra-word { font-size: 18px; }
	.cinatra-brand .cinatra-mark svg { width: 25px; height: 13px; }
	/* Keep the two gaps equal at the 18px word size (0.29em ≈ 5.2px). */
	.cinatra-brand .cinatra-wordgroup { font-size: 18px; }
	.cinatra-brand { gap: 5px; }
	/* Single column on phones — 2-up at this width crams the kind-header titles
	   to three lines and crowds the badge against the card edge. Covers both the
	   home "Newest" grid (.cin-ext-grid) and the WooCommerce shop/archive grid
	   (WoodMart .wd-grid-g, driven by the --wd-col column count). */
	.cin-ext-grid { grid-template-columns: 1fr; }
	.products.wd-products.wd-grid-g { --wd-col: 1; grid-template-columns: 1fr; }
	.cin-type-bench { grid-template-columns: 1fr; }
	.cin-ext-detail-name { font-size: 22px; }
}

/* Mobile menu: the WoodMart mobile-nav element has an unconfigured "Categories"
   tab whose panel prints an ADMIN setup hint to visitors ("Set your categories
   menu in Header builder…"). Hide that tab + the placeholder text; the "Menu"
   tab already lists the extension kinds. */
/* ══════════════════════════════════════════════════════════════════════════
   Wave 4 — global component primitives (consumed by later waves)
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Status pill (§VI, F7 / D6) ───────────────────────────────────────────
   Icon-led pill: inline-flex, gap 6px, 3px 10px, 9999px radius, 600 12px sans,
   1px border. A leading dot (::before) carries the state colour; an inline
   <svg>/icon is also allowed. Five state modifiers with the EXACT spec triples. */
.cin-pill {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 3px 10px;
	border-radius: 9999px;
	border: 1px solid;
	font-family: var(--cin-font-sans);
	font-size: 12px;
	font-weight: 600;
	line-height: 1.4;
	white-space: nowrap;
}
/* Leading status dot (when no inline icon is provided). */
.cin-pill::before {
	content: "";
	flex: 0 0 auto;
	width: 11px;
	height: 11px;
	background-color: currentColor;
	-webkit-mask: var(--cin-pill-icon) center / contain no-repeat;
	        mask: var(--cin-pill-icon) center / contain no-repeat;
}
/* An inline <svg> icon replaces the masked ::before (never a bare dot — §X). */
.cin-pill:has(> svg)::before { content: none; }
.cin-pill > svg { width: 11px; height: 11px; flex: 0 0 auto; }
.cin-pill--running  { --cin-pill-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='black'%3E%3Cpolygon points='6 3 20 12 6 21 6 3'/%3E%3C/svg%3E"); }
.cin-pill--approved { --cin-pill-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E"); }
.cin-pill--hold     { --cin-pill-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='black'%3E%3Crect x='6' y='4' width='4' height='16' rx='1'/%3E%3Crect x='14' y='4' width='4' height='16' rx='1'/%3E%3C/svg%3E"); }
.cin-pill--idle     { --cin-pill-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.5'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3C/svg%3E"); }
.cin-pill--failed   { --cin-pill-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round'%3E%3Cpath d='M18 6 6 18'/%3E%3Cpath d='m6 6 12 12'/%3E%3C/svg%3E"); }
.cin-pill--running {
	background: rgba(54, 78, 129, 0.10);
	color: var(--cin-blue);
	border-color: rgba(54, 78, 129, 0.30);
}
.cin-pill--approved {
	background: rgba(63, 110, 107, 0.12);
	color: var(--cin-green);
	border-color: rgba(63, 110, 107, 0.32);
}
.cin-pill--hold {
	background: rgba(199, 149, 69, 0.16);
	color: #7a5a1f;
	border-color: rgba(199, 149, 69, 0.42);
}
.cin-pill--idle {
	background: transparent;
	color: var(--cin-muted);
	border-color: var(--cin-line-strong);
}
.cin-pill--failed {
	background: var(--cin-red);
	color: #ffffff;
	border-color: var(--cin-red);
}

/* WooCommerce stock state → pill treatment (W4 mapping; order-status pills land
   in W6, which reuses .cin-pill). In-stock = approved pill; out-of-stock =
   idle/hold pill. The native .stock <p> is restyled in place to the pill. */
.single-product p.stock,
.single-product .stock {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 3px 10px;
	border-radius: 9999px;
	border: 1px solid;
	font-family: var(--cin-font-sans);
	font-size: 12px;
	font-weight: 600;
	line-height: 1.4;
}
.single-product p.stock::before,
.single-product .stock::before {
	content: "";
	flex: 0 0 auto;
	width: 11px;
	height: 11px;
	background-color: currentColor;
	-webkit-mask: var(--cin-pill-icon) center / contain no-repeat;
	        mask: var(--cin-pill-icon) center / contain no-repeat;
}
.single-product .stock.in-stock {
	--cin-pill-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E");
	background: rgba(63, 110, 107, 0.12);
	color: var(--cin-green);
	border-color: rgba(63, 110, 107, 0.32);
}
.single-product .stock.out-of-stock {
	--cin-pill-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round'%3E%3Cpath d='M18 6 6 18'/%3E%3Cpath d='m6 6 12 12'/%3E%3C/svg%3E");
	background: transparent;
	color: var(--cin-muted);
	border-color: var(--cin-line-strong);
}

/* ── Table base (§X, F9) ───────────────────────────────────────────────────
   Storefront table primitive: header cells = uppercase mono 10px/700,
   letter-spacing 0.18em, muted, with a navy (--cin-line-strong) bottom
   underline. Body cells = ink, 13–14px, left-aligned, row divider --cin-line.
   IDs/timestamps = mono 11px slate; numerics right-aligned. (Zebra + per-surface
   application come in W5/W6.) */
table.shop_table thead th,
table.cart thead th,
.woocommerce table.shop_table thead th,
.woocommerce-cart table.cart thead th,
.woocommerce table.cart thead th,
.dokan-table thead th,
.woocommerce-orders-table thead th,
.cin-table thead th {
	font-family: var(--cin-font-mono);
	font-size: 10px;
	font-weight: 700;
	letter-spacing: 0.18em;
	text-transform: uppercase;
	color: var(--cin-muted);
	text-align: left;
	border-bottom: 1px solid var(--cin-line-strong);
	padding: 8px 14px;
}
table.shop_table tbody td,
table.cart tbody td,
.woocommerce table.shop_table tbody td,
.dokan-table tbody td,
.woocommerce-orders-table tbody td,
.cin-table tbody td {
	/* R1 (F1): table BODY cells are Inter (body prose); only thead + mono cells
	   (order-number/date / .cin-mono) stay Archivo/mono. */
	font-family: var(--cin-font-body);
	font-size: 13.5px;
	color: var(--cin-ink);
	text-align: left;
	border-bottom: 1px solid var(--cin-line);
	padding: 8px 14px;
}
/* IDs / timestamps / order numbers — mono 11px slate. */
.woocommerce-orders-table td.woocommerce-orders-table__cell-order-number,
.woocommerce-orders-table td.woocommerce-orders-table__cell-order-date,
.dokan-table td .order-number,
.cin-table td.cin-mono {
	font-family: var(--cin-font-mono);
	font-size: 11px;
	color: var(--cin-muted);
}
/* Numeric / total columns — right-aligned. */
table.shop_table td.amount,
table.shop_table th.amount,
table.cart td.product-subtotal,
table.cart td.product-price,
/* M4 (F9): match the numeric column HEADERS to their right-aligned values. */
.woocommerce table.cart th.product-price,
.woocommerce table.cart th.product-subtotal,
.woocommerce table.shop_table th.product-total,
.woocommerce table.shop_table td.product-total,
.woocommerce table.shop_table td.product-subtotal,
.woocommerce table.cart td.product-price,
.woocommerce table.cart td.product-subtotal,
/* M7: right-align only the amount cells of cart-totals (Subtotal / Total),
   leaving the Shipping cell (method list / calculator) left-aligned. */
.cart_totals .cart-subtotal td,
.cart_totals .order-total td,
.cin-table td.cin-num {
	text-align: right;
}

/* ── Account tables / surfaces / zebra (§X, §IV / F11 + F12, Wave 6) ───────
   The my-account Orders / Downloads / Addresses tables inherit the §X table
   base above (mono uppercase navy-underline head, ink body, --cin-line row
   dividers). Here we (1) pull the Downloads table into that base, (2) add the
   seersucker zebra (§IV — --cin-stripe-light on even rows) scoped to the
   account tables, and (3) right-align the order TOTAL column (§X numerics
   never centre / right-align amounts). The tables stay on the page paper as a
   clean panel; the header underline + dividers are the on-spec markers. */
.woocommerce-table--order-downloads thead th,
.woocommerce-MyAccount-content table.shop_table thead th {
	font-family: var(--cin-font-mono);
	font-size: 10px;
	font-weight: 700;
	letter-spacing: 0.18em;
	text-transform: uppercase;
	color: var(--cin-muted);
	text-align: left;
	border-bottom: 1px solid var(--cin-line-strong);
	padding: 8px 14px;
}
.woocommerce-table--order-downloads tbody td,
.woocommerce-MyAccount-content table.shop_table tbody td {
	/* R1 (F1): account table BODY cells are Inter (body prose). */
	font-family: var(--cin-font-body);
	font-size: 13.5px;
	color: var(--cin-ink);
	border-bottom: 1px solid var(--cin-line);
	padding: 8px 14px;
}
/* R1 follow-up (Codex re-audit): account order-number/date cells stay MONO (§X
   IDs/timestamps) — higher specificity + later source than the body Inter rule above. */
.woocommerce-MyAccount-content table.shop_table tbody td.woocommerce-orders-table__cell-order-number,
.woocommerce-MyAccount-content table.shop_table tbody td.woocommerce-orders-table__cell-order-date {
	font-family: var(--cin-font-mono);
	font-size: 11px;
	color: var(--cin-muted);
}
/* Seersucker zebra — even rows on --cin-stripe-light (account tables only). */
.woocommerce-orders-table tbody tr:nth-child(even) td,
.woocommerce-table--order-downloads tbody tr:nth-child(even) td,
.woocommerce-MyAccount-content table.shop_table tbody tr:nth-child(even) td {
	background-color: var(--cin-stripe-light);
}
/* Right-align the order-total column (§X numerics). */
.woocommerce-orders-table td.woocommerce-orders-table__cell-order-total,
.woocommerce-orders-table th.woocommerce-orders-table__cell-order-total {
	text-align: right;
}
/* L17: on mobile WoodMart hides <thead> and surfaces the column name via a
   `td:before` data-label. Style those surrogates like the desktop §X mono head
   (uppercase mono navy-muted) so the header treatment is consistent at all
   widths. (The label only renders at WoodMart's mobile breakpoint.) */
@media (max-width: 768px) {
	.woocommerce-orders-table td:before,
	.woocommerce-table--order-downloads td:before {
		font-family: var(--cin-font-mono);
		font-size: 10px;
		font-weight: 700;
		letter-spacing: 0.18em;
		text-transform: uppercase;
		color: var(--cin-muted);
	}
}

/* View-order status is pilled via the woocommerce_order_details_status filter
   (functions.php) — a .cin-pill span, styled by the §VI pill rules above. */

/* ── Accordion — mobile product tabs (§ / F32) ────────────────────────────
   On mobile/tablet WoodMart collapses .woocommerce-tabs into an accordion
   (.wd-accordion-item / .wd-accordion-title / .wd-accordion-opener). 13px/600
   ink title, a rotating chevron (200ms) on the opener, 12.5px muted body. The
   grey row-divider hairline is removed; the rotating chevron + spacing
   distinguish the rows. Scoped under .woocommerce-tabs. */
.woocommerce-tabs .wd-accordion-item {
	border-bottom: 0;
}
.woocommerce-tabs .wd-accordion-title {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 10px;
	padding: 13px 2px;
	cursor: pointer;
}
.woocommerce-tabs .wd-accordion-title .wd-accordion-title-text,
.woocommerce-tabs .wd-accordion-title-text span {
	font-family: var(--cin-font-sans);
	font-size: 13px;
	font-weight: 600;
	color: var(--cin-ink);
	text-transform: none;
	letter-spacing: normal;
}
/* Rotating chevron opener — replace WoodMart's glyph with a navy chevron that
   rotates 180° when the row is active (200ms). */
.woocommerce-tabs .wd-accordion-opener {
	flex: 0 0 auto;
	width: 14px;
	height: 14px;
	background-color: var(--cin-ink);
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-position: center;
	mask-position: center;
	-webkit-mask-size: contain;
	mask-size: contain;
	transition: transform 0.2s ease;
}
.woocommerce-tabs .wd-accordion-title.wd-active .wd-accordion-opener {
	transform: rotate(180deg);
}
.woocommerce-tabs .wd-accordion-item .woocommerce-Tabs-panel,
.woocommerce-tabs .wd-accordion-item .wc-tab-inner {
	font-family: var(--cin-font-body);
	font-size: 12.5px;
	color: var(--cin-muted);
	line-height: 1.6;
	padding-bottom: 6px;
	text-wrap: pretty;
}

/* ── Tooltip (§ / F35, optional) ──────────────────────────────────────────
   A CSS tooltip for elements carrying data-tip: navy ground, cream text, 12px,
   6px radius, small arrow. Native title="" is left untouched (an accepted
   deviation). Opt-in via [data-tip] only, so it can't fight WoodMart tooltips. */
[data-tip] {
	position: relative;
}
[data-tip]::after,
[data-tip]::before {
	opacity: 0;
	pointer-events: none;
	transition: opacity 0.12s ease;
	position: absolute;
	left: 50%;
	bottom: 100%;
	z-index: 50;
}
[data-tip]::after {
	content: attr(data-tip);
	transform: translate(-50%, -8px);
	padding: 5px 9px;
	border-radius: 6px;
	background: var(--cin-ink);
	color: var(--cin-paper);
	font-family: var(--cin-font-sans);
	font-size: 12px;
	font-weight: 500;
	line-height: 1.3;
	white-space: nowrap;
}
[data-tip]::before {
	content: "";
	transform: translate(-50%, -3px);
	border: 4px solid transparent;
	border-top-color: var(--cin-ink);
}
[data-tip]:hover::after,
[data-tip]:hover::before,
[data-tip]:focus-visible::after,
[data-tip]:focus-visible::before {
	opacity: 1;
}

.mobile-nav .mobile-categories-title,
.mobile-nav .create-nav-msg {
	display: none !important;
}

/* ──────────────────────────────────────────────────────────────────────────
   Pre-launch "catalog preview" — hide the header account/commerce tools.
   TEMPORARY + reversible: scoped to body.catalog-mode-on, which WoodMart adds
   only while the `catalog_mode` option is on (set in functions.php). Flip that
   option off (or delete this block) to restore the tools. Nothing is deleted —
   the elements stay in the DOM/header layout, just hidden.

   Hidden: My Account / Login-Register (.wd-header-my-account), Wishlist
   (.wd-header-wishlist), and every Cart opener (.wd-header-cart +
   .cart-widget-opener — some cart openers are not wrapped in .wd-header-cart).
   KEPT: the custom nav search (.cin-nav-search) and the mobile menu opener.
   ────────────────────────────────────────────────────────────────────────── */
body.catalog-mode-on .wd-header-my-account,
body.catalog-mode-on .wd-header-wishlist,
body.catalog-mode-on .wd-header-cart,
body.catalog-mode-on .cart-widget-opener,
/* Single-extension detail "Add to wishlist" button — hidden with the same flag
   (may be resurrected later alongside the rest of the account/commerce tools). */
body.catalog-mode-on .wd-wishlist-btn,
/* Mobile sticky bottom toolbar — the desktop header tools are hidden above, but
   WoodMart's mobile toolbar is a SEPARATE element that still surfaced Shop /
   Wishlist / Cart / My account on phones. Hide the whole bar (mobile-only; the
   mobile menu opener lives in the header, not here). */
body.catalog-mode-on .wd-toolbar {
	display: none !important;
}

/* B2 (re-audit #4): the nav search is a 44px touch target inside the mobile burger
   drawer (the desktop 34px toolbar field is unchanged). */
@media (max-width: 768px) {
	.cin-nav-search-form input[type="search"] { min-height: 44px; height: 44px; }
}

/* ── GA4 analytics consent banner (ops#317) ──────────────────────────────────
   Analytics-only consent banner injected by assets/js/cinatra-ga4-consent.js.
   Basic Consent Mode v2: gtag.js loads only after Accept. Cinatra design tokens
   (indigo CTA, ink text, hairline border, elevated white surface). */
#cin-consent {
	position: fixed;
	left: 1rem;
	right: 1rem;
	bottom: 1rem;
	z-index: 9999;
	max-width: 34rem;
	margin-inline: auto;
	display: flex;
	flex-wrap: wrap;
	gap: 0.75rem 1rem;
	align-items: center;
	justify-content: space-between;
	padding: 0.85rem 1rem;
	border: 1px solid var(--cin-line, rgba(21, 33, 58, 0.14));
	border-radius: 0.5rem;
	background: var(--cin-surface-strong, #ffffff);
	color: var(--cin-ink, #15213a);
	box-shadow: 0 6px 24px rgba(21, 33, 58, 0.18);
	font-size: 0.85rem;
	line-height: 1.45;
}
#cin-consent-msg {
	margin: 0;
	flex: 1 1 16rem;
}
#cin-consent .cin-consent-actions {
	display: flex;
	gap: 0.5rem;
	flex: 0 0 auto;
}
#cin-consent .cin-consent-btn {
	cursor: pointer;
	border-radius: 0.375rem;
	padding: 0.4rem 0.9rem;
	font: inherit;
	font-weight: 600;
	border: 1px solid transparent;
}
#cin-consent .cin-consent-decline {
	background: transparent;
	border-color: var(--cin-line, rgba(21, 33, 58, 0.14));
	color: inherit;
}
#cin-consent .cin-consent-accept {
	background: var(--cin-blue, #364e81);
	color: #ffffff;
}
#cin-consent .cin-consent-accept:hover {
	background: var(--cin-ink, #15213a);
}

/* ══════════════════════════════════════════════════════════════════════════
   §I/§II catalog chrome (#191) — /extensions/ + kind archives only
   (body.cin-catalog; the blessed marketing home keeps its own chrome)
   ══════════════════════════════════════════════════════════════════════════ */

/* ── §I catalog header: the sort-only toolbar (#199) ────────────────────
   One slim row — the mono sort control right-aligned on a full-width 1px
   hairline; the §II rail and grid start together beneath it. The search
   field and the type tabs were REMOVED by owner ruling (marketplace#199,
   2026-07-05; design spec 0.4.0 §I). */
.cin-cat-header {
	display: flex;
	align-items: center;
	justify-content: flex-end;
	border-bottom: 1px solid var(--cin-line);
	margin: 0 0 14px;
}
.cin-cat-sort {
	display: flex;
	align-items: center;
	gap: 7px;
	font-family: var(--cin-font-mono);
	font-size: 10.5px;
	color: var(--cin-muted);
	padding-bottom: 8px;
}
.cin-cat-sort label {
	margin: 0;
	font-weight: 400;
	cursor: pointer;
}
.cin-cat-sort-value {
	display: flex;
	align-items: center;
	gap: 4px;
	color: var(--cin-ink);
}
.cin-cat-sort select {
	appearance: none;
	-webkit-appearance: none;
	border: 0;
	height: auto;
	min-height: 0;
	background: transparent;
	font-family: var(--cin-font-mono);
	font-size: 10.5px;
	color: var(--cin-ink);
	padding: 0;
	cursor: pointer;
	box-shadow: none;
}
.cin-cat-sort svg {
	width: 11px;
	height: 11px;
	color: var(--cin-ink);
	flex: none;
	pointer-events: none;
}

/* ── §II layout: 220px rail beside the grid ─────────────────────────────── */
.cin-cat-body {
	display: grid;
	grid-template-columns: 220px minmax(0, 1fr);
	column-gap: 28px;
	align-items: start;
}
.cin-cat-rail-toggle,
.cin-cat-rail-open {
	display: none;
}
.cin-cat-facet-label {
	font-family: var(--cin-font-mono);
	font-size: 9px;
	letter-spacing: 0.16em;
	text-transform: uppercase;
	color: var(--cin-muted);
	font-weight: 700;
}
.cin-cat-facet-group {
	display: grid;
	gap: 8px;
}
.cin-cat-facet-group .cin-cat-facet-label {
	margin-bottom: 1px;
}
.cin-cat-facet {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	margin: 0;
	font-family: var(--cin-font-body);
	font-size: 13px;
	color: var(--cin-ink);
	cursor: pointer;
	font-weight: 400;
}
.cin-cat-facet-main {
	display: flex;
	align-items: center;
	gap: 8px;
}
.cin-cat-facet input[type="checkbox"],
.cin-cat-facet input[type="radio"] {
	accent-color: var(--cin-blue);
	width: 14px;
	height: 14px;
	margin: 0;
	flex: none;
}
.cin-cat-facet-count {
	font-family: var(--cin-font-mono);
	font-size: 10px;
	color: var(--cin-muted);
}
.cin-cat-facet-stars {
	display: flex;
	align-items: center;
	gap: 5px;
}
/* The facet star is the marketplace's filled amber review-star gold. */
.cin-cat-star {
	width: 13px;
	height: 13px;
	color: #f5a623;
	flex: none;
}
/* The design-spec etched paired rule between facet groups (two 1px navy
   lines) — the same motif the detail tabs carry. */
.cin-cat-facet-rule {
	border: 0;
	height: 5px;
	border-top: 1px solid var(--cin-line-strong);
	border-bottom: 1px solid var(--cin-line-strong);
	margin: 14px 0;
	background: transparent;
}
.cin-cat-apply {
	margin-top: 12px;
	font-family: var(--cin-font-sans);
	font-size: 12px;
	padding: 6px 12px;
	border: 1px solid var(--cin-line-strong);
	border-radius: 7px;
	background: var(--cin-surface-strong);
	color: var(--cin-ink);
	cursor: pointer;
}

/* ── §II item 9 empty state ─────────────────────────────────────────────── */
.cin-cat-empty {
	display: grid;
	justify-items: center;
	gap: 14px;
	padding: 56px 20px 64px;
	text-align: center;
}
.cin-cat-empty-line {
	margin: 0;
	font-family: var(--cin-font-body);
	font-size: 14px;
	color: var(--cin-muted);
}
.cin-cat-empty-chips {
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	gap: 8px;
}
.cin-cat-chip {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 10px;
	border: 1px solid var(--cin-line);
	border-radius: 999px;
	background: var(--cin-surface-strong);
	font-family: var(--cin-font-body);
	font-size: 12px;
	color: var(--cin-ink);
	text-decoration: none;
}
.cin-cat-chip:hover {
	border-color: var(--cin-line-strong);
	color: var(--cin-ink);
}
.cin-cat-chip svg {
	width: 10px;
	height: 10px;
	color: var(--cin-muted);
	flex: none;
}
.cin-cat-empty-reset {
	display: inline-flex;
	align-items: center;
	padding: 8px 18px;
	border-radius: 9px;
	background: var(--cin-blue);
	color: #ffffff;
	font-family: var(--cin-font-sans);
	font-size: 13px;
	font-weight: 600;
	text-decoration: none;
}
.cin-cat-empty-reset:hover {
	background: var(--cin-ink);
	color: #ffffff;
}

/* ── §II centered content block that HUGS the cards (marketplace#202, spec
   0.6.0) — supersedes both the #199 full-width-stretch reading AND the
   first #202 fixed-2250px-cap attempt. Owner CHANGES_REQUESTED on #202
   (2026-07-05): "The content area that includes the filter rail plus the
   cards should always be centered. If it does not fill the whole width,
   there should be the same amount of space left and right of it. That means
   that this area must not automatically stretch over the whole width to
   avoid that there is space on the right and the sorting feature sits alone
   at the very right." A single fixed cap only fixes viewports ABOVE the cap;
   between the natural fill point and the cap, auto-fill still left-packs the
   cards and orphans the right-aligned sort control. So the block HUGS the
   actual column count N — as many fixed 380px cards as fit — and centers via
   margin: auto, giving EQUAL left/right space at EVERY width where the cards
   don't fill the viewport, at every N.

   Mechanics (scoped to body.cin-catalog, >720 only; the sub-720 sheet keeps
   its own full-width block, unchanged):
   - The container hugs the block: max-width = 220px rail + 28px column-gap +
     (N × 380px + (N − 1) × 18px card-gaps) + the container's own 15px/side
     border-box gutter = 260 + 398·N. N1 658 · N2 1056 · N3 1454 · N4 1852 ·
     N5 2250 (cap, spec §II). margin-left/right: auto centers it. The
     `min(<hug>px, 100%)` ceiling means the container can NEVER exceed the
     viewport, so there is no horizontal overflow regardless of scrollbar
     width (belt-and-suspenders with the band headroom below).
   - The grid is a FIXED repeat(N, 380px) inside the hugged block — NOT
     auto-fill into a wide container — so there is never leftover width on the
     right. (The hug width is exactly N tracks, so the toolbar row that spans
     the block ends flush with the grid's right edge.)
   - Each band starts at the viewport where that N fully fits with headroom
     for a classic scrollbar: block width + 20px (covers every real classic
     scrollbar; overlay scrollbars are 0px). Media-query `width` is measured
     on the viewport, which may or may not include the classic scrollbar
     depending on the engine — the 20px headroom keeps the fixed grid fitting
     the content box (clientWidth) in either case: 721 / 1076 / 1474 / 1872 /
     2270. Below a band the previous (smaller) N holds, so the block always
     hugs and the margins stay equal and non-negative — never overflows.
   Cards stay EXACTLY 380px, 18px gap, 220px rail; the sub-720 filter sheet
   is unchanged. */
body.cin-catalog main.wd-content-layout.container {
	max-width: none;
	margin-left: auto;
	margin-right: auto;
}
/* Sub-380 phones keep the auto-fill fallback (the single card may narrow to
   the container); the >720 bands below pin fixed repeat(N, 380px). */
body.cin-catalog .products.wd-products.wd-grid-g {
	grid-template-columns: repeat(auto-fill, minmax(min(380px, 100%), 380px));
	gap: 18px;
	justify-content: start;
}
/* N = 1 (721px+ : rail + one 380px card, hugged + centered). */
@media (min-width: 721px) {
	body.cin-catalog main.wd-content-layout.container {
		max-width: min(658px, 100%);
	}
	body.cin-catalog .products.wd-products.wd-grid-g {
		grid-template-columns: repeat(1, 380px);
	}
}
/* N = 2 (1076px+). */
@media (min-width: 1076px) {
	body.cin-catalog main.wd-content-layout.container {
		max-width: min(1056px, 100%);
	}
	body.cin-catalog .products.wd-products.wd-grid-g {
		grid-template-columns: repeat(2, 380px);
	}
}
/* N = 3 (1474px+). */
@media (min-width: 1474px) {
	body.cin-catalog main.wd-content-layout.container {
		max-width: min(1454px, 100%);
	}
	body.cin-catalog .products.wd-products.wd-grid-g {
		grid-template-columns: repeat(3, 380px);
	}
}
/* N = 4 (1872px+). */
@media (min-width: 1872px) {
	body.cin-catalog main.wd-content-layout.container {
		max-width: min(1852px, 100%);
	}
	body.cin-catalog .products.wd-products.wd-grid-g {
		grid-template-columns: repeat(4, 380px);
	}
}
/* N = 5 (2270px+ : the sensible-desktop cap; wider viewports keep 5 columns
   and simply grow the equal side margins). */
@media (min-width: 2270px) {
	body.cin-catalog main.wd-content-layout.container {
		max-width: min(2250px, 100%);
	}
	body.cin-catalog .products.wd-products.wd-grid-g {
		grid-template-columns: repeat(5, 380px);
	}
}
@media (max-width: 720px) {
	/* The rail collapses into a filter sheet behind the Filters toggle
	   (§II item 8, unchanged by #199 — the grid itself keeps its fixed
	   380px auto-fill tracks at every viewport). */
	.cin-cat-body {
		display: block;
	}
	.cin-cat-rail-open {
		display: inline-flex;
		align-items: center;
		gap: 7px;
		margin: 0 0 16px;
		padding: 7px 14px;
		border: 1px solid var(--cin-line-strong);
		border-radius: 9px;
		background: var(--cin-surface-strong);
		font-family: var(--cin-font-sans);
		font-size: 13px;
		color: var(--cin-ink);
		cursor: pointer;
	}
	.cin-cat-rail-open svg {
		width: 14px;
		height: 14px;
	}
	.cin-cat-rail-form {
		display: none;
	}
	.cin-cat-rail-toggle:checked ~ .cin-cat-rail-form {
		display: block;
		position: fixed;
		left: 0;
		right: 0;
		bottom: 0;
		z-index: 400;
		max-height: 70vh;
		overflow: auto;
		padding: 22px 20px calc(22px + env(safe-area-inset-bottom, 0px));
		background: var(--cin-surface-strong);
		border-top: 1px solid var(--cin-line-strong);
		border-radius: 12px 12px 0 0;
		box-shadow: 0 -6px 24px rgba(21, 33, 58, 0.18);
	}
	/* The in-flow toggle stays visible above the grid while the sheet is up —
	   it reads as pressed and clicking it again closes the sheet. */
	.cin-cat-rail-toggle:checked ~ .cin-cat-rail-open {
		background: var(--cin-ink);
		border-color: var(--cin-ink);
		color: #ffffff;
	}
}
