@layer tokens, components, hero, about, gallery, join-cta, map, partners, timeline, footer, popup, stats-banner, lightbox, motion, responsive-scale, figma-px-system, content-visibility, track-a-polish;

@layer tokens {
/* Книгозбір 2.0 / 3.0 — Публічна тема (Figma Pixel-Perfect Design System) */

:root {
	--kb-bg-canvas: #ebf2df;        /* М'який салатово-м'ятний фон сайту */
	--kb-lime-btn: #c8ea7b;         /* Салатова фірмова кнопка */
	--kb-lime-btn-hover: #bde06c;
	--kb-orange-btn: #ff8c3a;       /* Figma 4256:473 progress CTA fill */
	--kb-orange-hover: #f06925;
	--kb-telegram-btn: #54c5f8;     /* Блакитна кнопка Telegram */
	--kb-card-cyan: #e2f4fe;        /* Блакитна картка 01 */
	--kb-card-peach: #ffe7d8;       /* Персикова картка 02 */
	--kb-progress-yellow: #f5b800;  /* Жовта шкала прогресу */

	--kb-ink: #0f140c;
	--kb-ink-soft: #424b3a;
	--kb-paper: #ffffff;
	--kb-border: #d2ded0;

	/* Figma SoT: canvas 1920, card 1680 (gutters 120 = 6.25vw). Below 1920 — scale via --kb-px. */
	--kb-figma-canvas: 1920;
	--kb-figma-card: 1680;
	/* Header chrome rail: logo x=252.5 … CTA right 252.5 → width 1415 (NOT the 1680 card). */
	--kb-figma-header-inset: 252.5;
	--kb-figma-header-rail: 1415;
	/* 0.8.70 — Material/web.dev edge ≥16dp + notch insets. Never drop below 16. */
	--kb-edge: max(16px, env(safe-area-inset-left, 0px), env(safe-area-inset-right, 0px));
	--kb-gutter: clamp(var(--kb-edge), 6.25vw, 120px);
	--kb-container: min(1680px, calc(100vw - 2 * var(--kb-gutter)));
	--kb-card-pad: 16px; /* phone card inner pad floor */
	--kb-touch: 48px;    /* Material 48; WCAG Enhanced ≥44 */
	/* 1 Figma-px at current card width (1px @ ≥1920; shrinks with viewport). */
	--kb-px: calc(var(--kb-container) / 1680);
	/* 1 Figma-px on the 1920 artboard (header insets / full-bleed frames). */
	--kb-art-px: calc(100vw / 1920);
	/* Figma 4256:* text nodes = Montserrat (Regular/Medium/SemiBold/Bold) — not Manrope */
	--kb-font: 'Montserrat', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
	--kb-shadow-card: 0 12px 32px rgba(15, 20, 12, 0.05);
	--kb-shadow-hard: 4px 4px 0 #1b2a1a;
	--kb-shadow-hard-sm: 3px 3px 0 #1b2a1a;
	--kb-shadow-hard-lg: 6px 6px 0 #1b2a1a;
	--kb-gallery-gap: clamp(12px, calc(18 * var(--kb-px)), 28px);
	--kb-cursor-url: url("../cursors/book-default.png") 2 2;

	/* Radii / spaces scale with card (floor keeps mobile usable). */
	--kb-radius-card: clamp(24px, calc(48 * var(--kb-px)), 48px);
	--kb-radius-m: clamp(14px, calc(24 * var(--kb-px)), 24px);
	--kb-radius-pill: 999px;
	--kb-space-1: max(4px, calc(4 * var(--kb-px)));
	--kb-space-2: max(6px, calc(8 * var(--kb-px)));
	--kb-space-3: max(12px, calc(16 * var(--kb-px)));
	--kb-space-4: max(16px, calc(24 * var(--kb-px)));
	--kb-space-5: max(24px, calc(40 * var(--kb-px)));
	--kb-space-6: max(36px, calc(64 * var(--kb-px)));

	/*
	 * Figma type SoT from 2.0.fig nodes 4256:* (openfig). Scale with --kb-px.
	 * H1 80 Bold · lead 30 Medium · note 22 Regular · nav/CTA 22 · letterSpacing 0.
	 */
	--kb-type-display: max(32px, calc(80 * var(--kb-px)));   /* 4256:577 */
	--kb-type-section: max(28px, calc(56 * var(--kb-px)));
	--kb-type-section-lg: max(30px, calc(64 * var(--kb-px)));
	--kb-type-stat: max(28px, calc(48 * var(--kb-px)));
	--kb-type-stat-sm: max(16px, calc(22 * var(--kb-px)));
	--kb-type-method: max(28px, calc(50 * var(--kb-px))); /* figma 4256:647/658 title */
	--kb-type-method-num: max(40px, calc(70 * var(--kb-px))); /* figma 4256:646/657 */
	--kb-type-progress: max(36px, calc(125 * var(--kb-px)));
	--kb-type-progress-lbl: max(22px, calc(40 * var(--kb-px))); /* figma 4256:483 */
	--kb-type-lead: max(18px, calc(30 * var(--kb-px)));      /* 4256:578 Medium 30 */
	--kb-type-note: max(16px, calc(22 * var(--kb-px)));      /* 4256:579 Regular 22 */
	--kb-type-body: max(16px, calc(18 * var(--kb-px)));
	--kb-type-btn: max(16px, calc(22 * var(--kb-px)));       /* 4256:583/536 SemiBold 22 */
	--kb-type-nav: max(14px, calc(22 * var(--kb-px)));       /* 4256:532 Medium 22 */
	--kb-type-eyebrow: max(12px, calc(12 * var(--kb-px)));
	--kb-text-col: min(1251px, 100%); /* Frame 1484580166 — display titles */
	--kb-measure: min(65ch, 100%); /* continuous reading measure (web.dev) */
	/* Hero content rhythm in Frame 1484580166: partners→title→lead→note ≈ 43px; note→CTA ≈ 100 */
	--kb-hero-stack-gap: max(20px, calc(43 * var(--kb-px) * var(--kb-hero-vh-scale, 1)));
	--kb-hero-cta-gap: max(48px, calc(100 * var(--kb-px) * var(--kb-hero-vh-scale, 1)));
}

* {
	box-sizing: border-box;
}

html {
	-webkit-text-size-adjust: 100%;
	scroll-behavior: smooth;
	overflow-x: clip;
}

body {
	margin: 0;
	font-family: var(--kb-font);
	color: var(--kb-ink);
	background: var(--kb-bg-canvas);
	line-height: 1.5;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	-webkit-tap-highlight-color: transparent;
	text-rendering: optimizeLegibility;
	overflow-x: clip;
	width: 100%;
}
/* Safari/iOS: 100vh включає bottom-tabbar; 100dvh — поточний visible viewport */
@supports (height: 100dvh) {
	:root { --kb-vh: 1dvh; }
}
@supports not (height: 100dvh) {
	:root { --kb-vh: 1vh; }
}

/* Owner-reported 2026-10-08: header logo's hanger lines (SVG currentColor)
   rendered blue, and separately some CTA buttons sat at the UA link-blue
   too. Root cause: body{color} is inherited, but the UA stylesheet's own
   a:link{color:-webkit-link} rule beats plain inheritance on anchors - it
   is not overridden just because an ancestor sets color, only by an
   explicit author rule on the anchor itself. Nothing in this stylesheet
   ever set a baseline color on <a>; every component either styles its own
   anchors explicitly or (like the logo's currentColor paths) silently fell
   through to browser-default blue. */
a {
	color: inherit;
}

img {
	max-width: 100%;
	height: auto;
	display: block;
}

.kb-skip-link {
	position: absolute;
	left: -9999px;
	top: 0;
	background: var(--kb-ink);
	color: #fff;
	padding: var(--kb-space-2) var(--kb-space-3);
	z-index: 1000;
}
.kb-skip-link:focus {
	left: var(--kb-space-2);
	top: var(--kb-space-2);
}

.kb-container {
	width: var(--kb-container);
	max-width: 100%;
	margin-inline: auto;
	/* Outer mint gutters live in --kb-gutter; no double inset on the 1680 card. */
	padding-inline: 0;
	box-sizing: border-box;
}
@media (max-width: 599px) {
	:root {
		/* 0.8.70 — Material ≥16dp edge (was 12px antipattern). One inset only. */
		--kb-gutter: var(--kb-edge);
		--kb-card-pad: 16px;
	}
	.kb-container {
		/* Keep var(--kb-container) = 100vw - 2*gutter; never force 100% (kills mint margins) */
		padding-inline: 0;
		width: var(--kb-container);
		max-width: 100%;
	}
}

/* .kb-section padding-block: every section template also carries its own specific
   class (e.g. kb-map/kb-partners/kb-join-cta/...), and @layer track-a-polish's
   consolidated list (~3918, declared LAST) always wins for those — the bare
   .kb-section rule in @layer figma-px-system is dead for all of them. Real SoT
   is track-a-polish; only add a new section to figma-px-system's rule if it
   deliberately omits itself from the track-a-polish list. */

.kb-section__heading {
	font-size: var(--kb-type-section);
	line-height: 1.1;
	margin: 0 0 var(--kb-space-4);
	text-align: center;
	font-weight: 800;
	letter-spacing: -0.02em;
	text-transform: uppercase;
}

} /* /@layer tokens */

@layer components {
/* Brand Badge */
.kb-brand-badge {
	display: inline-flex;
	align-items: center;
	gap: 8px;
}
.kb-brand-text {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: 1.1rem;
	letter-spacing: -0.02em;
	color: var(--kb-ink);
}
.kb-brand-tag {
	background: #f5cb25;
	color: #0f140c;
	font-size: 0.75rem;
	font-weight: 800;
	padding: 2px 6px;
	border-radius: 4px;
}
/* Pill Badges — white on mint canvas (Figma tags, not lime fill) */
.kb-pill-badge {
	display: inline-block;
	width: max-content;
	max-width: 100%;
	font-size: 0.75rem;
	font-weight: 800;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: var(--kb-ink);
	background: #ffffff;
	border-radius: var(--kb-radius-pill);
	padding: 6px 16px;
	margin-bottom: var(--kb-space-2);
	box-shadow: 0 2px 8px rgba(0,0,0,0.05);
}
.kb-pill-badge--white {
	background: #ffffff;
	color: #355f1c;
	border: 1.5px solid rgba(53, 95, 28, 0.28);
	box-shadow: 0 2px 8px rgba(0,0,0,0.05);
}
.kb-partners .kb-pill-badge {
	/* Owner PP 0.8.27: floor 16px so artboard gutters do not shrink tag below mockup */
	font-size: max(16px, calc(16 * var(--kb-px)));
	padding: max(10px, calc(12 * var(--kb-px))) max(22px, calc(28 * var(--kb-px)));
	letter-spacing: 0.08em;
	/* Figma 4256:352→361: badge bottom y≈183 → title y=227 → gap 44 */
	margin-bottom: max(28px, calc(44 * var(--kb-px)));
}
.kb-pill-badge--outline {
	border: 1.5px solid var(--kb-ink);
	padding: 8px 24px;
	font-weight: 700;
}
/* Buttons — soft; hard comic shadow only where Figma CTA needs it */
.kb-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 8px;
	padding: 14px 28px;
	border-radius: var(--kb-radius-pill);
	font-weight: 700;
	font-size: var(--kb-type-btn);
	border: 2px solid transparent;
	cursor: pointer;
	text-decoration: none;
	box-shadow: none;
	transition: transform 0.15s ease, background-color 0.15s ease, color 0.15s ease, box-shadow 0.15s ease;
}
.kb-btn:hover {
	transform: translateY(-2px);
}
.kb-btn:active {
	transform: translateY(0);
}
.kb-btn:focus-visible {
	outline: 2px solid var(--kb-ink);
	outline-offset: 3px;
}
.kb-btn-arrow {
	display: inline-block;
	flex-shrink: 0;
	width: 18px;
	height: 18px;
	transition: transform 0.15s ease;
}
.kb-btn:hover .kb-btn-arrow {
	transform: translateX(3px);
}
.kb-btn--lime,
.kb-btn--lime-pill {
	background: var(--kb-hero-cta1-bg, var(--kb-lime-btn));
	color: var(--kb-hero-cta1-fg, var(--kb-ink));
}
.kb-btn--lime:hover,
.kb-btn--lime-pill:hover {
	background: var(--kb-lime-btn-hover);
}

.kb-btn--orange-pill,
a.kb-btn--orange-pill,
a.kb-btn--orange-pill:link,
a.kb-btn--orange-pill:visited {
	background: var(--kb-join-donate-btn-bg, var(--kb-orange-btn));
	/* Figma 4256:473/475: white label on #ff8c3a + thin black border.
	   Owner 2026-10-08 restores white. :link/:visited needed so UA blue
	   cannot win on <a class="kb-btn…"> at narrow viewports. */
	color: var(--kb-join-donate-btn-fg, #ffffff);
	border: 2px solid var(--kb-ink);
}
.kb-btn--orange-pill:hover,
a.kb-btn--orange-pill:hover {
	background: var(--kb-orange-hover);
	color: #ffffff;
}

.kb-btn--telegram-pill {
	background: var(--kb-join-book-btn-bg, var(--kb-telegram-btn));
	/* WCAG AA fix (2026-10-06): white text on this blue was 1.96:1. Ink gives 9.52:1. */
	color: var(--kb-join-book-btn-fg, var(--kb-ink));
}
.kb-btn--telegram-pill:hover {
	background: #3bbbf5;
}

.kb-btn--outline-dark {
	background: var(--kb-hero-cta2-bg, #ffffff);
	border: 2px solid var(--kb-hero-cta2-bd, var(--kb-ink));
	color: var(--kb-hero-cta2-fg, var(--kb-ink));
}
.kb-btn--outline-dark:hover {
	background: #f4f6f0;
}

/* Header — Figma frame 4256:503 = 1920×128
 * Logo x=252.5 / CTA right=252.5 → rail 1415 (narrower than content card 1680 @ x=120).
 * Do NOT put header on .kb-container — that falsely aligns logo with hero/about left. */
.kb-site-header {
	position: sticky;
	top: 0;
	background: rgba(235, 242, 223, 0.92);
	backdrop-filter: blur(12px);
	-webkit-backdrop-filter: blur(12px);
	z-index: 40;
	/* Owner PP 0.8.25: compact sticky header (was 128/38.44 — felt oversized) */
	min-height: max(72px, calc(96 * var(--kb-art-px)));
	padding-block: max(10px, calc(18 * var(--kb-art-px)));
	/* 0.8.70 — notch / Dynamic Island */
	padding-top: max(10px, calc(18 * var(--kb-art-px)), env(safe-area-inset-top, 0px));
	box-sizing: border-box;
}
/* Shared chrome rail — header 4256:503 + footer 4256:368 (owner: footer width = header).
 * 1415 @ inset 252.5 — NOT .kb-container 1680 @ 120. */
.kb-site-header__rail,
.kb-site-footer__rail {
	width: min(100%, calc(var(--kb-figma-header-rail) * var(--kb-art-px)));
	max-width: 100%;
	margin-inline: auto;
	box-sizing: border-box;
	padding-inline: max(var(--kb-edge), calc(16 * var(--kb-art-px)));
}
@media (min-width: 900px) {
	.kb-site-header__rail,
	.kb-site-footer__rail {
		/* Desktop: pure 1415 rail; side mint = (100vw − 1415·art-px) / 2 = 252.5·art-px */
		padding-inline: 0;
	}
}
.kb-site-header__inner {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: clamp(12px, 2vw, 40px);
	position: relative;
	z-index: 52;
	width: 100%;
}
.kb-site-header__logo {
	text-decoration: none;
	flex-shrink: 0;
	display: inline-flex;
	align-items: center;
}
/* Figma 4256:504 btn group = 145×51.12 — scale on artboard, not card */
.kb-site-header__logo-svg {
	width: max(120px, calc(145 * var(--kb-art-px)));
	height: auto;
	display: block;
}
.kb-site-header__drawer-top {
	display: none;
}
.kb-site-header__drawer-partners {
	display: none;
}
.kb-site-header__drawer-brand {
	display: none;
}
.kb-site-header__nav ul {
	display: flex;
	align-items: center;
	/* 4256:532→533→534 inter-item gap ≈ 50px */
	gap: max(28px, calc(50 * var(--kb-px)));
	list-style: none;
	margin: 0;
	padding: 0;
}
.kb-site-header__nav a {
	color: var(--kb-ink);
	text-decoration: none;
	/* 4256:532 Montserrat Medium 22 / tracking 0 */
	font-weight: 500;
	font-size: var(--kb-type-nav);
	letter-spacing: 0;
	line-height: 1;
	position: relative;
	transition: color 0.15s ease;
}
.kb-site-header__nav a.is-active::after,
.kb-site-header__nav a:hover::after {
	content: "";
	position: absolute;
	left: 0;
	right: 0;
	bottom: -4px;
	height: 2px;
	background: var(--kb-ink);
	border-radius: 2px;
}
.kb-site-header__nav a:focus-visible {
	outline: 2px solid var(--kb-ink);
	outline-offset: 4px;
	border-radius: 4px;
}

.kb-site-header__actions {
	display: flex;
	align-items: center;
	gap: var(--kb-space-2);
	flex-shrink: 0;
}
.kb-site-header__cta {
	/* Figma 4256:535 = 412×65; owner PP 0.8.25 compact → minH 52 */
	padding: max(10px, calc(14 * var(--kb-px))) max(20px, calc(28 * var(--kb-px)));
	font-size: var(--kb-type-btn);
	font-weight: 600;
	letter-spacing: 0;
	line-height: 24px;
	min-height: max(44px, calc(52 * var(--kb-px)));
	max-width: min(412px, 36vw);
	flex-shrink: 1;
}
/* When header CTA journey == hero primary (#join), slight demote */
.kb-site-header__cta--dup-hero {
	font-size: var(--kb-type-btn);
	min-height: max(44px, calc(52 * var(--kb-px)));
	padding-inline: max(18px, calc(24 * var(--kb-px)));
}
.kb-site-header__cta-label {
	display: inline;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.kb-site-header__cta-short {
	display: none;
}
/*
 * Drawer CTA is mobile-only. Later @layers (hero/motion/…) restyle .kb-btn and
 * would resurrect display:inline-flex — keep !important SoT here + mobile MQ.
 */
.kb-site-header__drawer-cta,
.kb-site-header__drawer-join {
	display: none !important;
}
.kb-site-header__toggle {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	position: relative;
	z-index: 60;
	width: var(--kb-touch);
	height: var(--kb-touch);
	min-width: var(--kb-touch);
	min-height: var(--kb-touch);
	padding: 0;
	border: 0;
	border-radius: 10px;
	background: rgba(255, 255, 255, 0.55);
	color: var(--kb-ink);
	cursor: pointer;
	pointer-events: auto;
	-webkit-tap-highlight-color: transparent;
	transition: background 0.15s ease, transform 0.15s ease;
}
.kb-site-header__toggle:hover {
	background: #ffffff;
}
.kb-site-header__toggle:focus-visible {
	outline: 2px solid var(--kb-ink);
	outline-offset: 2px;
}
.kb-site-header__toggle-bars {
	display: grid;
	place-items: center;
}
.kb-site-header__toggle-bars svg {
	grid-area: 1 / 1;
	transition: opacity 0.18s ease, transform 0.18s ease;
}
.kb-site-header__icon-close {
	opacity: 0;
	transform: rotate(-90deg) scale(0.85);
}
.kb-site-header.is-menu-open .kb-site-header__icon-open {
	opacity: 0;
	transform: rotate(90deg) scale(0.85);
}
.kb-site-header.is-menu-open .kb-site-header__icon-close {
	opacity: 1;
	transform: rotate(0) scale(1);
}
.kb-site-header__backdrop {
	display: none;
}

@media (max-width: 899px) {
	/* Overlay lives on <body> (escaped from sticky header) — open via .is-open / html.kb-nav-open */
	.kb-site-header__backdrop {
		display: block;
		position: fixed;
		inset: 0;
		z-index: 50;
		margin: 0;
		padding: 0;
		border: 0;
		background: rgba(8, 12, 6, 0.58);
		backdrop-filter: blur(12px) saturate(1.08);
		-webkit-backdrop-filter: blur(12px) saturate(1.08);
		opacity: 0;
		visibility: hidden;
		pointer-events: none;
		cursor: pointer;
		transition: opacity 0.28s ease, visibility 0s linear 0.28s;
		-webkit-tap-highlight-color: transparent;
	}
	.kb-site-header__backdrop.is-open,
	html.kb-nav-open .kb-site-header__backdrop {
		opacity: 1;
		visibility: visible;
		pointer-events: auto;
		transition: opacity 0.28s ease, visibility 0s;
	}
	.kb-site-header.is-menu-open {
		z-index: 51;
	}
	.kb-site-header__nav {
		display: flex;
		flex-direction: column;
		position: fixed;
		top: 0;
		right: 0;
		bottom: 0;
		width: min(320px, 86vw);
		height: 100%;
		height: 100dvh;
		max-height: 100dvh;
		z-index: 52;
		margin: 0;
		padding: max(16px, env(safe-area-inset-top, 0px)) 20px max(28px, env(safe-area-inset-bottom, 0px));
		background: #ebf2df;
		border-left: 1px solid rgba(15, 20, 12, 0.08);
		box-shadow: -20px 0 56px rgba(15, 20, 12, 0.28);
		transform: translate3d(105%, 0, 0);
		visibility: hidden;
		pointer-events: none;
		transition: transform 0.32s cubic-bezier(0.22, 1, 0.36, 1), visibility 0s linear 0.32s;
		overflow-x: hidden;
		overflow-y: auto;
		-webkit-overflow-scrolling: touch;
		overscroll-behavior: contain;
	}
	body.admin-bar .kb-site-header__nav {
		top: 32px;
		height: calc(100% - 32px);
		height: calc(100dvh - 32px);
		max-height: calc(100dvh - 32px);
	}
	@media (max-width: 782px) {
		body.admin-bar .kb-site-header__nav {
			top: 46px;
			height: calc(100% - 46px);
			height: calc(100dvh - 46px);
			max-height: calc(100dvh - 46px);
		}
	}
	.kb-site-header__nav.is-open,
	html.kb-nav-open .kb-site-header__nav {
		transform: translate3d(0, 0, 0);
		visibility: visible;
		pointer-events: auto;
		transition: transform 0.32s cubic-bezier(0.22, 1, 0.36, 1), visibility 0s;
	}
	.kb-site-header__drawer-top {
		display: flex;
		align-items: center;
		justify-content: space-between;
		gap: 12px;
		margin-bottom: 18px;
		padding-bottom: 14px;
		border-bottom: 1px solid rgba(15, 20, 12, 0.1);
		flex-shrink: 0;
	}
	.kb-site-header__drawer-brand {
		display: inline-flex;
		align-items: center;
		min-width: 0;
		text-decoration: none;
		color: inherit;
	}
	.kb-site-header__drawer-brand .kb-site-header__logo-svg {
		width: min(148px, 52vw);
		height: auto;
		display: block;
	}
	.kb-site-header__drawer-partners {
		display: flex;
		flex-wrap: wrap;
		align-items: center;
		justify-content: center;
		gap: 14px 18px;
		margin-top: 8px;
		padding-top: 16px;
		border-top: 1px solid rgba(15, 20, 12, 0.1);
		flex-shrink: 0;
	}
	.kb-drawer-partner {
		display: inline-flex;
		align-items: center;
		justify-content: center;
	}
	.kb-drawer-partner .kb-partners__logo-link {
		display: inline-flex;
		align-items: center;
		min-height: var(--kb-touch);
		padding: 8px 6px;
	}
	.kb-drawer-partner-logo {
		/* var(--kb-logo-h) = owner override (Studio logos repeater "Висота
		   лого"); falls back to this brand's tuned size when unset. */
		max-height: var(--kb-logo-h, 28px);
		width: auto;
		object-fit: contain;
		display: block;
	}
	.kb-drawer-partner-logo.kb-partner-img--knockout {
		mix-blend-mode: multiply;
		max-height: var(--kb-logo-h, 46px);
	}
	.kb-site-header__drawer-close {
		display: inline-flex;
		align-items: center;
		justify-content: center;
		width: var(--kb-touch);
		height: var(--kb-touch);
		min-width: var(--kb-touch);
		min-height: var(--kb-touch);
		padding: 0;
		border: 0;
		border-radius: 12px;
		background: rgba(255, 255, 255, 0.7);
		color: var(--kb-ink);
		cursor: pointer;
	}
	.kb-site-header__drawer-close:focus-visible {
		outline: 2px solid var(--kb-ink);
		outline-offset: 2px;
	}
	.kb-site-header__nav ul {
		flex-direction: column;
		align-items: stretch;
		gap: 4px;
		width: 100%;
	}
	.kb-site-header__nav a {
		display: block;
		padding: 14px 12px;
		font-size: 1.05rem;
		border-radius: 12px;
		transition: background 0.15s ease;
	}
	.kb-site-header__nav a:hover,
	.kb-site-header__nav a:focus-visible {
		background: rgba(255, 255, 255, 0.72);
	}
	.kb-site-header__nav a.is-active::after,
	.kb-site-header__nav a:hover::after {
		display: none;
	}
	.kb-site-header__nav a.is-active {
		background: #ffffff;
		box-shadow: 0 1px 0 rgba(15, 20, 12, 0.06);
	}
	/* Freeze page scroll without jumping: fixed body + restored scrollY on close */
	html.kb-nav-open {
		overflow: hidden;
		overscroll-behavior: none;
	}
	body.kb-nav-lock {
		position: fixed;
		left: 0;
		right: 0;
		width: 100%;
		overflow: hidden;
		overscroll-behavior: none;
		padding-right: var(--kb-scrollbar-gutter, 0px);
		touch-action: none;
	}
}
@media (min-width: 900px) {
	.kb-site-header__toggle,
	.kb-site-header__drawer-top,
	.kb-site-header__backdrop {
		display: none !important;
	}
}

} /* /@layer components */

@layer hero {
/* ======================================================================
   Hero — Figma 2.0 SoT (card 1680×770) + viewport-fit fold (embed)
   Single CSS SoT (no SCSS). Proportional --kb-px + --kb-hero-vh-scale.
   Stage: white card (::before) → books (z3) → copy/CTA (z4).
   First fold viewport-fit: mint/stage/card embed header-bottom → viewport bottom
   (100dvh/svh − header − admin-bar). Pad tokens MUST be 0px (not unitless 0)
   or fold calc() invalidates and card collapses to content height.
   Edit only this @layer hero block — no EOF overrides.
   ====================================================================== */
.kb-hero {
	/* Match sticky header used height (compact 0.8.25 band ~96 art-px). */
	--kb-hero-header-h: max(72px, calc(96 * var(--kb-art-px)));
	--kb-hero-pad-y: 0px;
	--kb-hero-fold-offset: calc(var(--kb-hero-header-h) + (2 * var(--kb-hero-pad-y)));
	--kb-hero-avail: calc(100svh - var(--kb-hero-fold-offset));
	--kb-hero-figma-h: calc(770 * var(--kb-px));
	/* Embed by height: fill remaining fold (not capped at Figma 770). */
	--kb-hero-card-h: var(--kb-hero-avail);
	--kb-hero-vh-scale: min(1, calc(var(--kb-hero-avail) / var(--kb-hero-figma-h)));
	box-sizing: border-box;
	min-height: var(--kb-hero-avail);
	padding-block: var(--kb-hero-pad-y);
	overflow: visible;
}
@supports (height: 100dvh) {
	.kb-hero {
		--kb-hero-avail: calc(100dvh - var(--kb-hero-fold-offset));
	}
}
body.admin-bar .kb-hero {
	--kb-hero-fold-offset: calc(var(--kb-hero-header-h) + (2 * var(--kb-hero-pad-y)) + 32px);
}
@media (max-width: 782px) {
	body.admin-bar .kb-hero {
		--kb-hero-fold-offset: calc(var(--kb-hero-header-h) + (2 * var(--kb-hero-pad-y)) + 46px);
	}
}

.kb-hero .kb-container {
	overflow: visible;
	padding-inline: 0;
	min-height: inherit;
	display: flex;
	flex-direction: column;
}
.kb-hero-stage {
	position: relative;
	isolation: isolate;
	overflow: visible;
	padding-bottom: 0;
	width: 100%;
	flex: 1 1 auto;
	min-height: var(--kb-hero-avail);
	display: flex;
	flex-direction: column;
	/*
	 * Text corridor (card 1680): H1 line 1 «КНИГИ, ЯКІ ЗНАХОДЯТЬ» @80 needs ~1000px+
	 * so title stays 2 rows (not 3). Wider than book gutters is OK — books sit z:3
	 * behind copy and still spill past the white card onto mint.
	 */
	--kb-hero-text-max: min(100%, max(560px, calc(1180 * var(--kb-px))));
	/* 4256:578 box 1160; 4256:579 box 895 — do not invent narrower corridors */
	--kb-hero-subtitle-max: min(100%, max(560px, calc(1160 * var(--kb-px))));
	--kb-hero-note-max: min(100%, max(480px, calc(895 * var(--kb-px))));
}

.kb-hero-card {
	position: relative;
	isolation: isolate;
	z-index: 1;
	display: flex;
	flex-direction: column;
	justify-content: center;
	align-items: stretch;
	box-sizing: border-box;
	background: transparent;
	border-radius: var(--kb-radius-card);
	overflow: visible;
	text-align: center;
	flex: 1 1 auto;
	height: var(--kb-hero-card-h);
	min-height: var(--kb-hero-avail);
	max-height: var(--kb-hero-avail);
	padding:
		clamp(20px, calc(56 * var(--kb-px) * var(--kb-hero-vh-scale)), 56px)
		clamp(20px, calc(120 * var(--kb-px)), 120px)
		clamp(28px, calc(72 * var(--kb-px) * var(--kb-hero-vh-scale)), 72px);
}

.kb-hero-card::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 0;
	background: var(--kb-hero-card-bg, #ffffff);
	border-radius: inherit;
	pointer-events: none;
	box-shadow: var(--kb-shadow-card);
}

.kb-hero-card > * {
	position: relative;
	z-index: 4;
}
.kb-hero-card > .kb-hero-graphics {
	z-index: 3;
}

/* figma 4256:571 Frame 1484580125 = 360×60; logos 134×32 / 52×60 / 130×35; gap ≈22 */
.kb-hero-partners {
	display: flex;
	align-items: center;
	justify-content: center;
	flex-wrap: nowrap;
	gap: max(16px, calc(22 * var(--kb-px)));
	/* Floored like the logos themselves (24/58/26px tall -> ~280px of content
	   + gaps). Without a floor this shrank below that at ~641-1350px viewports
	   (no other breakpoint covers that range), squashing the flex row and
	   distorting the tallest (ranok) logo down to a few px wide. */
	width: min(100%, max(290px, calc(360 * var(--kb-px))));
	height: max(58px, calc(60 * var(--kb-px)));
	max-height: max(58px, calc(60 * var(--kb-px)));
	margin: 0 auto var(--kb-hero-stack-gap);
	flex: 0 0 auto;
	z-index: 5;
}
.kb-hero-partner-logo {
	width: auto;
	/* No brand slug match (4th+ owner-added logo) -> safe default height so it
	   doesn't render at its raw natural pixel size; var(--kb-logo-h) from the
	   Studio logos repeater overrides this per-logo. */
	height: var(--kb-logo-h, 32px);
	object-fit: contain;
}
/* Figma 4256:571 — ZONE 32 / RANOK 60 / KL 35 inside 360×60 row (align center).
   var(--kb-logo-h) = owner override from Studio; falls back to these. */
.kb-hero-partner-logo--zone3000 { max-height: var(--kb-logo-h, max(24px, calc(32 * var(--kb-px)))); height: var(--kb-logo-h, max(24px, calc(32 * var(--kb-px)))); }
.kb-hero-partner-logo--ranok    { max-height: var(--kb-logo-h, max(52px, calc(60 * var(--kb-px)))); height: var(--kb-logo-h, max(52px, calc(60 * var(--kb-px)))); }
.kb-hero-partner-logo--knyholand{ max-height: var(--kb-logo-h, max(26px, calc(35 * var(--kb-px)))); height: var(--kb-logo-h, max(26px, calc(35 * var(--kb-px)))); }
/* .kb-hero-partner-logo.kb-partner-img--knockout SoT lives in @layer partners
   below (search "Hero ranok SoT" there), NOT here — @layer order is
   ...hero, about, ..., partners, ... so a same-selector rule in @layer
   partners silently wins over one here regardless of specificity. A
   duplicate used to live at this spot with a stale value; removed so there
   is exactly one place to edit this selector's height. */

.kb-hero-content {
	position: relative;
	z-index: 5;
	flex: 0 1 auto;
	max-width: var(--kb-hero-text-max, var(--kb-text-col));
	width: 100%;
	margin-inline: auto;
}

.kb-hero__title {
	/* 4256:577 Montserrat Bold 80 / LH 100% / tracking 0 */
	font-size: max(28px, calc(80 * var(--kb-px) * var(--kb-hero-vh-scale)));
	line-height: 1;
	font-weight: 700;
	letter-spacing: 0;
	margin: 0 0 var(--kb-hero-stack-gap);
	text-transform: uppercase;
	text-wrap: wrap;
}
.kb-hero__title-line {
	display: block;
}
.kb-hero__highlight {
	position: relative;
	display: inline-block;
}
.kb-hero__highlight-text {
	position: relative;
	z-index: 1;
}
/* Figma 4256:569 Line3 — layout 428×20, brush Vérité #F8CA0E (SVG SoT, not AI path) */
.kb-brush-stroke {
	position: absolute;
	left: -6%;
	right: -6%;
	bottom: max(-10px, calc(-14 * var(--kb-px) * var(--kb-hero-vh-scale)));
	width: auto;
	height: max(14px, calc(22 * var(--kb-px) * var(--kb-hero-vh-scale)));
	max-width: none;
	pointer-events: none;
	z-index: 0;
	overflow: visible;
	display: block;
	object-fit: fill;
}

.kb-hero__subtitle {
	/* 4256:578 Montserrat Medium 30 / LH 100% / box 1160×74 */
	font-size: max(16px, calc(30 * var(--kb-px) * var(--kb-hero-vh-scale)));
	font-weight: 500;
	color: var(--kb-ink);
	max-width: var(--kb-hero-subtitle-max, min(1160px, 100%));
	margin: 0 auto var(--kb-hero-stack-gap);
	line-height: 1;
}

.kb-hero__note {
	/* 4256:579 Montserrat Regular 22 / box 895×54; note→CTA y 513→613 = 100
	   0.8.70 — cap continuous prose at --kb-measure (~65ch), keep Figma ceil. */
	font-size: max(14px, calc(22 * var(--kb-px) * var(--kb-hero-vh-scale)));
	font-weight: 400;
	color: var(--kb-ink-soft);
	max-width: var(--kb-hero-note-max, min(895px, var(--kb-measure)));
	margin: 0 auto var(--kb-hero-cta-gap);
	line-height: 1.35;
}

.kb-hero__cta-group {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	/* 4256:580 group 673×84; buttons 312×84; gap 361-312=49 */
	gap: max(16px, calc(49 * var(--kb-px)));
}
.kb-hero__cta-group .kb-btn {
	padding: max(12px, calc(20 * var(--kb-px) * var(--kb-hero-vh-scale))) max(22px, calc(36 * var(--kb-px)));
	font-size: max(15px, calc(22 * var(--kb-px) * var(--kb-hero-vh-scale)));
	min-height: max(52px, calc(84 * var(--kb-px) * var(--kb-hero-vh-scale)));
	min-width: min(100%, calc(312 * var(--kb-px)));
	font-weight: 600;
	letter-spacing: 0;
	line-height: 1;
}
/* Figma hero CTAs: thin black border on both pills. Header lime CTA stays borderless. */
.kb-hero__cta-group .kb-btn--lime-pill,
.kb-hero__cta-group .kb-btn--outline-dark {
	border: 2px solid var(--kb-ink);
}
.kb-site-header__cta.kb-btn--lime-pill,
.kb-site-header__cta.kb-btn--lime {
	border-color: transparent;
}
.kb-hero__cta-group .kb-btn-icon {
	flex-shrink: 0;
	display: block;
	width: 1.15em;
	height: 1.15em;
}

.kb-hero-graphics {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	margin: 0;
	padding: 0;
	display: block;
	overflow: visible;
	pointer-events: none;
	z-index: 3;
}

.kb-hero-graphic {
	position: absolute;
	will-change: transform;
	flex: none;
	max-width: none;
	margin: 0;
	box-sizing: border-box;
}

/* Figma % slots - card 1680x770 cheat-sheet.
 * Left book 4256:568 fig -2.3%; owner -5% (0.8.21) +37.8px => -7.25% of card 1680 (0.8.22).
 */
.kb-hero-graphic--left {
	left: -7.25%;
	bottom: 1.95%;
	top: auto;
	right: auto;
	width: 31.8%;
	height: 56.4%;
	z-index: 3;
	transform: rotate(-2deg);
	transform-origin: 40% 60%;
}
.kb-hero-graphic--right-back {
	right: 3.6%;
	top: 38.8%;
	bottom: auto;
	left: auto;
	width: 16.3%;
	height: 39.2%;
	z-index: 1;
	transform: rotate(-8deg);
	transform-origin: 50% 70%;
}
.kb-hero-graphic--right-front {
	right: -7.1%;
	top: 10.3%;
	bottom: auto;
	left: auto;
	width: 20.2%;
	height: 63.4%;
	z-index: 2;
	transform: rotate(4deg);
	transform-origin: 60% 60%;
}

.kb-hero-graphic--left .kb-hero__floating-img,
.kb-hero-graphic--right-back .kb-hero__floating-img,
.kb-hero-graphic--right-front .kb-hero__floating-img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: contain;
	transform: translateZ(0);
	-webkit-backface-visibility: hidden;
	backface-visibility: hidden;
	image-rendering: -webkit-optimize-contrast;
	filter: drop-shadow(0 22px 40px rgba(15, 20, 12, 0.18));
}
/* Anchor art in slot so Figma spill (mint outside white card) reads correctly. */
.kb-hero-graphic--left .kb-hero__floating-img {
	object-position: left bottom;
}
.kb-hero-graphic--right-back .kb-hero__floating-img {
	object-position: right bottom;
}
.kb-hero-graphic--right-front .kb-hero__floating-img {
	object-position: right center;
}

.kb-hero__floating-img {
	width: 100%;
	height: auto;
	display: block;
}

body.admin-bar .kb-site-header {
	top: 32px;
}
@media (max-width: 782px) {
	body.admin-bar .kb-site-header {
		top: 46px;
	}
}

@media (max-height: 820px) and (min-width: 768px) {
	.kb-hero {
		--kb-hero-vh-scale: min(0.88, calc(var(--kb-hero-avail) / (770 * var(--kb-px))));
	}
	.kb-hero-partners {
		margin-bottom: 8px;
		gap: 16px;
	}
	.kb-hero__note {
		margin-bottom: 14px;
	}
}

@media (min-width: 768px) and (max-width: 1199px) {
	.kb-hero-stage {
		--kb-hero-text-max: min(100%, max(480px, calc(720 * var(--kb-px))));
		--kb-hero-subtitle-max: min(100%, max(420px, calc(620 * var(--kb-px))));
		--kb-hero-note-max: min(100%, max(360px, calc(520 * var(--kb-px))));
	}
	.kb-hero-card {
		padding-inline: max(20px, calc(48 * var(--kb-px)));
	}
	/* Tablet: soften bleed only; desktop ≥1200 keeps BACKLOG % slots exact. */
	.kb-hero-graphic--right-front { right: -2%; }
	.kb-hero-graphic--left { left: -1%; }
}

@media (min-width: 1200px) {
	/* Desktop SoT: H1 corridor 1180; lead 1160; note 895 (Figma text boxes). */
	.kb-hero-stage {
		--kb-hero-text-max: min(100%, max(560px, calc(1180 * var(--kb-px))));
		--kb-hero-subtitle-max: min(100%, max(560px, calc(1160 * var(--kb-px))));
		--kb-hero-note-max: min(100%, max(480px, calc(895 * var(--kb-px))));
	}
}

@media (max-width: 767px) {
	/* 0.8.75 — phone compact: fit real devices; prose uses full card width;
	   titles may wrap short; body/note must not clamp or 2-word-narrow. */
	:root {
		--kb-hero-stack-gap: 12px;
		--kb-hero-cta-gap: 16px;
		--kb-type-method: max(22px, calc(36 * var(--kb-px)));
		--kb-type-method-num: max(32px, calc(52 * var(--kb-px)));
		--kb-type-section: max(24px, calc(44 * var(--kb-px)));
		--kb-type-display: max(26px, calc(56 * var(--kb-px)));
	}
	.kb-hero {
		/* Mobile: natural document flow; fold-embed is desktop/tablet. */
		--kb-hero-vh-scale: 1;
		min-height: 0;
	}
	.kb-hero .kb-container {
		min-height: 0;
		display: block;
	}
	.kb-hero-stage {
		padding-bottom: 0;
		min-height: 0;
		display: block;
		flex: none;
		/* Full card width for lead/note — kill desktop max(560px,…) floors
		   that with small --kb-px still force a skinny reading column. */
		--kb-hero-text-max: 100%;
		--kb-hero-subtitle-max: 100%;
		--kb-hero-note-max: 100%;
	}
	.kb-hero-card {
		height: auto;
		min-height: 0;
		max-height: none;
		flex: none;
		justify-content: flex-start;
		/* 20 > --kb-card-pad 16: title/lead need air inside ink-free white card */
		padding: 20px max(18px, var(--kb-card-pad));
		overflow: visible;
	}
	/* Owner 2026-10-08: hide the 3 floating decorative book covers on mobile
	   (they crowded the CTA area and read as clutter at phone widths). Desktop
	   keeps them (see base .kb-hero-graphics rule, overflow:visible there). */
	.kb-hero-graphics {
		display: none;
	}

	.kb-hero__title {
		font-size: clamp(1.45rem, 7vw, 1.85rem);
		line-height: 1.05;
		margin-bottom: 12px;
	}
	.kb-section-root .kb-hero__title {
		font-size: clamp(1.45rem, 7vw, 1.85rem);
	}
	.kb-hero__subtitle,
	.kb-hero__note {
		max-width: 100%;
		width: 100%;
		text-wrap: pretty;
	}
	.kb-hero__subtitle {
		font-size: max(16px, 1rem);
		line-height: 1.45;
		margin-bottom: 10px;
	}
	.kb-section-root .kb-hero__subtitle {
		font-size: max(16px, 1rem);
	}
	.kb-hero__cta-group {
		flex-direction: column;
		align-items: stretch;
		width: 100%;
		max-width: none;
		margin-inline: 0;
		gap: 12px;
		margin-bottom: 4px;
	}

	.kb-hero__cta-group .kb-btn {
		width: 100%;
		justify-content: center;
		/* Room for label + icons inside ink border (owner: cramped pads) */
		padding: 16px 22px;
		min-height: var(--kb-touch);
		font-size: max(15px, 0.95rem);
		gap: 10px;
		box-sizing: border-box;
	}

	/* 0.8.75 — never truncate hero note on phone (was line-clamp:3 → "…") */
	.kb-hero__note {
		display: block;
		-webkit-line-clamp: unset;
		-webkit-box-orient: unset;
		overflow: visible;
		font-size: max(15px, 0.9375rem);
		line-height: 1.45;
		margin-bottom: 14px;
	}
	.kb-section-root .kb-hero__note {
		font-size: max(15px, 0.9375rem);
	}

	/* Independent corner slots; no flex/relative book strip. */
	.kb-hero-graphic--left {
		width: min(118px, 32vw);
		height: min(128px, 34vw);
		left: 6px;
		bottom: 8px;
		top: auto;
		right: auto;
		transform: rotate(-2deg);
	}

	.kb-hero-graphic--right-back {
		width: min(72px, 20vw);
		height: min(88px, 24vw);
		right: min(78px, 22vw);
		left: auto;
		top: auto;
		bottom: 14px;
		transform: rotate(-8deg);
	}

	.kb-hero-graphic--right-front {
		width: min(96px, 26vw);
		height: min(120px, 32vw);
		right: 6px;
		left: auto;
		top: auto;
		bottom: 8px;
		transform: rotate(4deg);
	}

	.kb-hero-graphic--left .kb-hero__floating-img,
	.kb-hero-graphic--right-back .kb-hero__floating-img,
	.kb-hero-graphic--right-front .kb-hero__floating-img {
		height: 100%;
		width: 100%;
		object-fit: contain;
	}

}


@media (max-width: 899px) {
	/* Mobile chrome: logo + burger only. CTA lives in the drawer. */
	.kb-site-header__inner {
		gap: 10px;
		justify-content: space-between;
	}
	.kb-site-header__logo-svg {
		max-width: 128px;
		width: min(128px, 36vw);
		height: auto;
	}
	.kb-site-header__actions .kb-site-header__cta {
		display: none !important;
	}
	/* Owner 2026-10-09: always-present join button — same bottom-of-drawer
	   placement as the configurable CTA below it (margin-top:auto pushes the
	   first one down; the one after it then just follows in normal flow). */
	.kb-site-header__drawer-join {
		display: inline-flex !important;
		align-items: center;
		justify-content: center;
		gap: 8px;
		margin-top: auto;
		margin-bottom: 8px;
		width: 100%;
		padding: 14px 18px;
		font-size: 1rem;
		font-weight: 700;
		border-radius: 14px;
		text-decoration: none;
	}
	.kb-site-header__drawer-cta {
		display: inline-flex !important;
		align-items: center;
		justify-content: center;
		gap: 8px;
		margin-bottom: 8px;
		width: 100%;
		padding: 14px 18px;
		font-size: 1rem;
		font-weight: 700;
		border-radius: 14px;
		text-decoration: none;
	}
	.kb-site-header__nav {
		justify-content: flex-start;
		gap: 8px;
	}
	.kb-site-header__nav ul {
		flex: 1 1 auto;
	}
}

@media (max-width: 640px) {
	.kb-hero-card {
		/* Books are display:none on mobile (≤767) — do NOT reserve corner
		   pad (was max(88px,23vw) → huge dead white under CTAs, owner red-X).
		   0.8.75 — keep ≤767 air (20/18), not crush back to bare 16. */
		padding: 20px max(18px, var(--kb-card-pad));
		border-radius: var(--kb-radius-m);
	}

	.kb-hero-partners {
		/* Base rule's width/height/max-height are calc(N * var(--kb-px)) - sized for
		   the desktop Figma scale. At <=640px --kb-px shrinks well under 1, collapsing
		   width to ~75px (too narrow for 3 logos side by side, forcing a 3-row wrap)
		   and height to ~12px (logo <img>s then overflow:visible into the title). */
		width: 100%;
		max-width: 100%;
		flex-wrap: nowrap;
		gap: 8px 12px;
		margin-bottom: 10px;
		height: auto;
		max-height: none;
	}

	/* min() so a larger owner override (var(--kb-logo-h)) still gets capped to
	   this mobile ceiling instead of blowing up the row; a smaller override
	   still shrinks it below the cap. */
	.kb-hero-partner-logo {
		max-height: min(var(--kb-logo-h, 20px), 20px);
	}
	.kb-hero-partner-logo--zone3000 {
		max-height: min(var(--kb-logo-h, 18px), 18px);
	}
	/* .kb-hero-partner-logo--ranok has no mobile rule here: the element also
	   carries .kb-partner-img--knockout, a same-specificity 2-class selector
	   declared later in @layer partners ("Hero ranok SoT" there) that always
	   wins regardless of this @media matching. Real mobile cap lives there. */
	.kb-hero-partner-logo--knyholand {
		max-height: min(var(--kb-logo-h, 20px), 20px);
	}

	.kb-hero__title {
		word-break: break-word;
		overflow-wrap: break-word;
		margin-bottom: 10px;
	}

	.kb-hero__subtitle {
		margin-bottom: 8px;
		line-height: 1.4;
	}

	.kb-hero__note {
		margin-bottom: 12px;
		line-height: 1.4;
	}

	.kb-hero-graphic--left {
		width: min(104px, 30vw);
		height: min(114px, 32vw);
		left: 4px;
		bottom: 6px;
	}

	.kb-hero-graphic--right-back {
		width: min(64px, 18vw);
		height: min(78px, 22vw);
		right: min(68px, 20vw);
		bottom: 12px;
	}

	.kb-hero-graphic--right-front {
		width: min(88px, 25vw);
		height: min(108px, 30vw);
		right: 4px;
		bottom: 6px;
	}

	.kb-site-header__logo-svg {
		max-width: 110px;
		width: min(110px, 34vw);
	}
}

@media (max-width: 420px) {
	.kb-hero-card {
		padding-bottom: 16px;
	}

	.kb-hero-graphic--left {
		width: min(92px, 28vw);
		height: min(102px, 30vw);
	}

	.kb-hero-graphic--right-back {
		width: min(56px, 16vw);
		height: min(70px, 20vw);
		right: min(60px, 18vw);
	}

	.kb-hero-graphic--right-front {
		width: min(80px, 24vw);
		height: min(98px, 28vw);
	}
}

} /* /@layer hero */

@layer about {
/* ======================================================================
   About blocks — Figma 2.0 single source of truth
   --first:   tag+title LEFT | body RIGHT; shared title/body top edge
   --mid:     copy LEFT | shelf card RIGHT; curve arrow on media
   --reverse: shelf+stats LEFT | copy RIGHT
   Do not append later versioned about overrides — edit this block.
   ====================================================================== */
/* Tighter gallery→about rhythm (annotated spacing); keep bottom air for next row */
.kb-about {
	padding-top: max(20px, calc(28 * var(--kb-px)));
	padding-bottom: max(32px, calc(48 * var(--kb-px)));
}
/* Stage: centers the article stack inside the 1680 .kb-container band. */
.kb-about__stage {
	width: 100%;
	margin-inline: auto;
	box-sizing: border-box;
}
.kb-about__empty {
	margin: 0;
	padding: 24px 20px;
	text-align: center;
	font-weight: 600;
	color: var(--kb-ink-soft);
	background: rgba(255, 255, 255, 0.55);
	border: 1.5px dashed var(--kb-border);
	border-radius: var(--kb-radius-m);
}

/* Article = semantic row shell; grid lives on .kb-about__row-inner (width SoT). */
.kb-about__row {
	position: relative;
	display: block;
	width: 100%;
	padding: 0;
	margin: 0 0 max(56px, calc(96 * var(--kb-px)));
	background: transparent;
	overflow: visible;
	opacity: 0;
	transform: translateY(20px);
	transition: opacity 0.55s ease, transform 0.55s cubic-bezier(.2,.7,.2,1);
}
.kb-about__row.is-visible {
	opacity: 1;
	transform: translateY(0);
}
.kb-about__row:last-of-type {
	margin-bottom: 0;
}
.kb-about__row-inner {
	display: grid;
	grid-template-columns: 1fr;
	gap: max(20px, calc(24 * var(--kb-px)));
	width: 100%;
	box-sizing: border-box;
}

@media (min-width: 840px) {
	/*
	 * Shared 1680 card grid on .kb-about__row-inner:
	 * Col A ≈ 36% (title / copy), gutter 48 Figma-px, Col B fills rest.
	 * Mid/reverse media column sized to the shelf card — no dead half-column.
	 */
	.kb-about__row-inner {
		align-items: start;
		column-gap: max(36px, calc(48 * var(--kb-px)));
		row-gap: max(8px, calc(10 * var(--kb-px)));
	}
	.kb-about__row--first > .kb-about__row-inner {
		/* eyebrow track + title/body track; loop doodle stays in head col under title */
		/* Owner PP 0.8.24: cluster ~1360 (wider than 1180) centered in 1680 stage */
		max-width: min(1360px, calc(1360 * var(--kb-px)));
		width: 100%;
		margin-inline: auto;
		grid-template-columns: minmax(280px, 0.72fr) minmax(0, 1.28fr);
		grid-template-rows: auto auto;
		align-items: start;
		column-gap: max(36px, calc(48 * var(--kb-px)));
	}
	/* figma 4256:598 Rectangle 383 = 708×447 (re-measured 2026-10-05, docs/figma-mcp-log.md). */
	.kb-about__row--mid > .kb-about__row-inner,
	.kb-about__row--reverse > .kb-about__row-inner {
		/* Owner PP 0.8.25/0.8.29: 1360 cluster; eyebrow track above media|copy */
		max-width: min(1360px, calc(1360 * var(--kb-px)));
		width: 100%;
		margin-inline: auto;
		align-items: start;
		row-gap: max(14px, calc(18 * var(--kb-px)));
	}
	.kb-about__row--mid > .kb-about__row-inner {
		grid-template-columns: minmax(0, 1fr) calc(708 * var(--kb-px));
		grid-template-rows: auto auto;
	}
	/*
	 * Row 3 (4256:610): shelf+stats LEFT | copy RIGHT.
	 * media col = card 708, mid gutter 64 (annotated).
	 * Tag raised on RIGHT column only (not over image); title top = image top.
	 */
	.kb-about__row--reverse > .kb-about__row-inner {
		grid-template-columns: calc(708 * var(--kb-px)) minmax(0, 1fr);
		grid-template-rows: auto auto;
		column-gap: max(48px, calc(64 * var(--kb-px)));
	}
	/* mid: eyebrow ABOVE left text col */
	.kb-about__row--mid > .kb-about__row-inner > .kb-eyebrow {
		grid-column: 1 / -1;
		grid-row: 1;
		justify-self: start;
		width: auto;
		max-width: max-content;
		margin: 0;
	}
	/* reverse: eyebrow ABOVE but only over RIGHT text column (raise vs image) */
	.kb-about__row--reverse > .kb-about__row-inner > .kb-eyebrow {
		grid-column: 2;
		grid-row: 1;
		justify-self: start;
		align-self: start;
		width: auto;
		max-width: max-content;
		margin: 0;
	}
	.kb-about__row--mid > .kb-about__row-inner > .kb-about__col--copy {
		grid-column: 1;
		grid-row: 2;
	}
	.kb-about__row--mid > .kb-about__row-inner > .kb-about__col--media {
		grid-column: 2;
		grid-row: 2;
	}
	.kb-about__row--reverse > .kb-about__row-inner > .kb-about__col--media {
		grid-column: 1;
		grid-row: 2;
	}
	.kb-about__row--reverse > .kb-about__row-inner > .kb-about__col--copy {
		grid-column: 2;
		grid-row: 2;
	}

	/*
	 * First row: subgrid — body shares the title track (same top edge as H2).
	 */
	.kb-about__row--first > .kb-about__row-inner > .kb-about__col--head,
	.kb-about__row--first > .kb-about__row-inner > .kb-about__col--body {
		display: grid;
		grid-template-rows: subgrid;
		grid-row: 1 / -1;
		align-content: start;
		gap: 0;
	}
	.kb-about__row--first > .kb-about__row-inner > .kb-about__col--head {
		grid-column: 1;
		/* Reserve Figma loop-arrow shelf under title without breaking title↔body subgrid */
		padding-bottom: max(110px, calc(140 * var(--kb-px)));
	}
	.kb-about__row--first > .kb-about__row-inner > .kb-about__col--body {
		grid-column: 2;
	}
	.kb-about__row--first .kb-about__col--body .kb-about__body {
		grid-row: 2;
		align-self: start;
		padding-top: 0;
		max-width: 100%;
	}
	.kb-about__row--first .kb-eyebrow {
		justify-self: start;
		width: auto;
		max-width: max-content; /* pill — never stretch to column width */
	}
	.kb-about__row--first .kb-about__title {
		justify-self: start;
		width: auto;
		max-width: 16ch;
	}
	/*
	 * Loop doodle (стрілка 1 #FF8126) under title — absolute in head pad shelf.
	 * Keeps title↔body ΔY=0 via subgrid; annotated empty space under H2 was a miss.
	 */
	.kb-about__row--first .kb-about__arrow--loop,
	.kb-about__row--first .kb-doodle-arrow.kb-about__arrow--loop {
		position: absolute;
		grid-row: unset;
		/* head-right shelf — deeper into the two-col gutter (owner annotation 0.8.21) */
		inset: auto max(4px, calc(8 * var(--kb-px))) max(8px, calc(16 * var(--kb-px))) auto;
		margin: 0;
		width: min(180px, calc(200 * var(--kb-px)));
		height: auto;
		opacity: 1;
		visibility: visible;
		transform: none;
		z-index: 2;
		justify-self: unset;
		pointer-events: none;
	}
}

.kb-about__col--head,
.kb-about__col--copy {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: max(8px, calc(10 * var(--kb-px)));
	position: relative;
	min-width: 0;
}
.kb-about__col--media {
	display: flex;
	flex-direction: column;
	align-items: stretch;
	gap: max(16px, calc(20 * var(--kb-px)));
	position: relative;
	min-width: 0;
	width: 100%;
}
.kb-about__col--body {
	display: flex;
	flex-direction: column;
	gap: 0;
	min-width: 0;
}

.kb-about__title {
	font-size: var(--kb-type-section);
	font-weight: 800;
	line-height: 1.05;
	letter-spacing: -0.028em;
	margin: 0;
	color: var(--kb-ink);
	text-transform: uppercase;
	max-width: 16ch;
}
.kb-about__row--reverse .kb-about__title {
	/* Owner PP 0.8.25: slightly tighter than prior 64 */
	max-width: min(14ch, 100%);
	font-size: max(28px, calc(52 * var(--kb-px)));
	line-height: 1.05;
	letter-spacing: -0.028em;
}
.kb-eyebrow {
	display: inline-flex;
	align-items: center;
	width: max-content;
	max-width: 100%;
	box-sizing: border-box;
	padding: max(6px, calc(8 * var(--kb-px))) max(14px, calc(18 * var(--kb-px)));
	border-radius: var(--kb-radius-pill);
	background: #ffffff;
	color: #355f1c;
	font-weight: 700;
	font-size: var(--kb-type-eyebrow);
	letter-spacing: 0.1em;
	text-transform: uppercase;
	margin: 0;
	box-shadow: 0 1px 4px rgba(15, 20, 12, 0.04);
}

/* owner PP 0.8.24 about type: larger tags + titles + body; keep global eyebrow token */
.kb-about .kb-eyebrow {
	font-size: max(13px, calc(16 * var(--kb-px)));
	padding: max(10px, calc(12 * var(--kb-px))) max(22px, calc(28 * var(--kb-px)));
	letter-spacing: 0.08em;
}
.kb-about__row--first .kb-about__title,
.kb-about__row--mid .kb-about__title {
	font-size: max(30px, calc(64 * var(--kb-px)));
	line-height: 1.02;
	letter-spacing: -0.03em;
}
.kb-about__col--head,
.kb-about__col--copy {
	gap: max(12px, calc(16 * var(--kb-px)));
}

/* display/height SoT: see line ~3385 (display: inline-block) — do not re-declare here */
.kb-about__arrow {
	overflow: visible;
	pointer-events: none;
}
/* Row 1 mobile / fallback: loop doodle under title */
.kb-about__arrow--loop,
.kb-doodle-arrow--1.kb-about__arrow--loop {
	width: min(200px, calc(212 * var(--kb-px)));
	margin: max(4px, calc(6 * var(--kb-px))) 0 0 max(4px, calc(8 * var(--kb-px)));
}
.kb-about__arrow--media,
.kb-doodle-arrow--2.kb-about__arrow--media {
	position: absolute;
	right: max(-12px, calc(-16 * var(--kb-px)));
	bottom: max(-36px, calc(-44 * var(--kb-px)));
	z-index: 2;
	width: min(200px, calc(220 * var(--kb-px)));
	pointer-events: none;
	overflow: visible;
}
/* Reserve overhang so the larger tip is not clipped by the next section */
.kb-about__row--mid .kb-about__col--media {
	padding-bottom: max(28px, calc(36 * var(--kb-px)));
	overflow: visible;
}
.kb-doodle-arrow--3 {
	width: min(132px, 32vw);
}

.kb-about__body {
	font-size: max(17px, calc(22 * var(--kb-px)));
	font-weight: 400;
	line-height: 1.5;
	color: var(--kb-ink);
	max-width: min(48rem, 100%);
}
/* About copy stays ink (Figma) — beat section-root washed text color */
.kb-section-root .kb-about .kb-about__body,
.kb-about .kb-about__body {
	color: var(--kb-ink);
	font-size: max(17px, calc(22 * var(--kb-px)));
	line-height: 1.5;
}
.kb-about__body p { margin: 0 0 0.9em; }
.kb-about__body p:last-child { margin-bottom: 0; }
.kb-about__body strong,
.kb-about__body b {
	font-weight: 800;
	color: var(--kb-ink);
}
.kb-about__col--copy .kb-about__body {
	margin-top: max(4px, calc(6 * var(--kb-px)));
	max-width: min(38rem, 100%);
}

/* Reverse copy: denser Figma rhythm (eyebrow → title → body). */
.kb-about__row--reverse .kb-about__col--copy {
	gap: max(10px, calc(12 * var(--kb-px)));
	width: 100%;
	max-width: min(720px, 100%);
}
.kb-about__row--reverse .kb-about__body {
	margin-top: 0;
	max-width: none;
	width: 100%;
	font-size: max(17px, calc(22 * var(--kb-px)));
	line-height: 1.5;
}
.kb-about__row--reverse .kb-about__body p {
	margin: 0 0 0.95em;
}
.kb-about__row--reverse .kb-about__body p:last-child {
	margin-bottom: 0;
}

.kb-about-stats {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: max(10px, calc(12 * var(--kb-px))) max(20px, calc(28 * var(--kb-px)));
	margin: 0;
	width: 100%;
	max-width: min(560px, 100%);
	justify-content: stretch;
	align-items: start;
}
/* Reverse: stats narrower than 708 card, centered under shelf (owner PP 0.8.25). */
.kb-about__row--reverse .kb-about-stats {
	max-width: min(520px, calc(520 * var(--kb-px)));
	width: 100%;
	margin-inline: auto;
	column-gap: max(28px, calc(36 * var(--kb-px)));
	row-gap: max(6px, calc(8 * var(--kb-px)));
}
.kb-about__row--reverse .kb-about__col--media {
	gap: max(16px, calc(20 * var(--kb-px)));
	align-items: stretch;
}
.kb-stat-box {
	display: flex;
	flex-direction: column;
	gap: max(4px, calc(6 * var(--kb-px)));
	min-width: 0;
}
.kb-stat-val {
	font-size: var(--kb-type-stat);
	font-weight: 800;
	line-height: 1;
	color: var(--kb-ink);
	letter-spacing: -0.02em;
	display: inline-flex;
	align-items: baseline;
	gap: max(6px, calc(8 * var(--kb-px)));
	flex-wrap: wrap;
}
.kb-about__row--reverse .kb-stat-val {
	font-size: max(28px, calc(48 * var(--kb-px)));
}
.kb-stat-val .kb-stat-num {
	font-variant-numeric: tabular-nums;
}
.kb-stat-val small {
	font-size: var(--kb-type-stat-sm);
	font-weight: 800;
	color: var(--kb-ink);
}
.kb-about__row--reverse .kb-stat-val small {
	font-size: max(16px, calc(20 * var(--kb-px)));
}
.kb-stat-lbl {
	font-size: var(--kb-type-body);
	font-weight: 600;
	color: var(--kb-ink-soft);
	line-height: 1.35;
	max-width: 16rem;
}
.kb-about__row--reverse .kb-stat-lbl {
	font-size: max(15px, calc(16 * var(--kb-px)));
	font-weight: 500;
	max-width: 18rem;
}

.kb-about__media {
	width: 100%;
	display: flex;
	justify-content: stretch;
	align-items: center;
}
.kb-about__media--card {
	background: #fff;
	border-radius: var(--kb-radius-card);
	/* Flat Figma shelf card — no pad/shadow junk (mobile + desktop) */
	padding: 0;
	box-shadow: none;
	width: 100%;
	max-width: none; /* fill media column — no floating 520 stub + dead gutter */
	box-sizing: border-box;
	overflow: hidden;
}
.kb-about__media--float {
	background: transparent;
	padding: 0;
	box-shadow: none;
	border-radius: 0;
}
.kb-about__img {
	width: 100%;
	height: auto;
	max-height: min(400px, calc(440 * var(--kb-px)));
	object-fit: contain;
	border-radius: max(10px, calc(12 * var(--kb-px)));
	display: block;
}
@media (min-width: 840px) {
	.kb-about__row--mid .kb-about__col--media,
	.kb-about__row--reverse .kb-about__col--media {
		align-items: stretch;
		justify-self: stretch;
	}
	/* Mid/reverse: eyebrow+title share top with media card */
	.kb-about__row--mid > .kb-about__row-inner,
	.kb-about__row--reverse > .kb-about__row-inner {
		align-items: start;
	}
	/*
	 * figma 4256:598 Rectangle 383 = 708×447 (re-measured 2026-10-05).
	 * Flat mockup: fill card exactly — no inner pad, no card drop-shadow,
	 * no double radius on img (card clips). Asset is shadow-scrubbed.
	 */
	.kb-about__row--mid .kb-about__media--card,
	.kb-about__row--reverse .kb-about__media--card {
		width: 100%;
		height: calc(447 * var(--kb-px));
		aspect-ratio: 708 / 447;
		padding: 0;
		box-shadow: none;
		border-radius: calc(48 * var(--kb-px));
		overflow: hidden;
		background: #fff;
	}
	.kb-about__row--mid .kb-about__img,
	.kb-about__row--reverse .kb-about__img {
		width: 100%;
		height: 100%;
		max-height: none;
		object-fit: contain;
		object-position: center;
		border-radius: 0;
		display: block;
		background: #fff;
	}
}

@media (max-width: 839px) {
	.kb-about__row--reverse .kb-about__title {
		max-width: 16ch;
		font-size: max(28px, calc(40 * var(--kb-px)));
	}
	.kb-about__row--reverse .kb-about-stats {
		max-width: none;
	}
	.kb-about__row--reverse .kb-about__col--copy {
		max-width: none;
	}
}

@media (prefers-reduced-motion: reduce) {
	.kb-about__row {
		opacity: 1;
		transform: none;
		transition: none;
	}
}

} /* /@layer about */

@layer gallery {
/* ======================================================================
   Gallery Section — фото завжди видно, 3D cursor-tilt + spotlight glow;
   click → lightbox з slideshow / клавішами / touch.
   ====================================================================== */
.kb-gallery {
	padding-block: clamp(36px, 4.5vw, 64px);
}
.kb-gallery-header {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: var(--kb-space-2);
	margin-bottom: var(--kb-space-3);
	position: relative;
}
.kb-gallery__title {
	margin: 0 !important;
	max-width: 20ch;
}
.kb-sparkle {
	flex-shrink: 0;
	opacity: 0.95;
}
.kb-sparkle--left,
.kb-sparkle--right { transform: rotate(calc((var(--mx, 50) - 50) * 0.4deg)); }
@keyframes kb-sparkle-pulse {
	0%, 100% { transform: rotate(0deg) scale(1); opacity: 0.95; }
	50%      { transform: rotate(14deg) scale(1.12); opacity: 0.6; }
}

.kb-gallery__grid {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	/* Comparison Figma: tight gutters ~16–20px (was 24–28) */
	gap: var(--kb-gallery-gap);
}
.kb-gallery__item { margin: 0; }

.kb-gallery__card {
	margin: 0;
	display: flex;
	flex-direction: column;
	gap: 0;
	cursor: zoom-in;
	outline: none;
	perspective: 1200px;
}

/* Figma 4256:539 — photo cell 548×418 on 1680 row (gap 18 = 1.0714cqw) */
@media (min-width: 840px) {
	.kb-gallery .kb-container {
		container-type: inline-size;
	}
	.kb-gallery__grid {
		column-gap: 1.0714cqw;
		row-gap: 1.0714cqw;
	}
}

.kb-gallery__frame {
	--tilt-x: 0deg;
	--tilt-y: 0deg;
	--mx: 50%;
	--my: 50%;
	position: relative;
	aspect-ratio: 548 / 418; /* Figma cell SoT — not 4/3 */
	border-radius: 24px;
	overflow: hidden;
	clip-path: inset(0 round 24px);
	background: #eaf0dd;
	isolation: isolate;
	perspective: 1200px;
	transform: rotateX(var(--tilt-x)) rotateY(var(--tilt-y));
	transition: transform 0.6s cubic-bezier(.2,.7,.2,1), box-shadow 0.4s ease;
	box-shadow: var(--kb-shadow-card);
	will-change: transform;
}
.kb-gallery__card {
	overflow: hidden;
	padding: 0;
	border-radius: 24px;
	position: relative;
}
.kb-gallery__frame.is-tilted {
	transition: transform 0.08s linear, box-shadow 0.3s ease;
	box-shadow: 0 16px 36px rgba(15, 20, 12, 0.16);
}
.kb-gallery__card:focus-visible .kb-gallery__frame {
	outline: 2px solid var(--kb-ink);
	outline-offset: 3px;
}
.kb-gallery__frame::after {
	content: '';
	position: absolute;
	inset: 0;
	background: radial-gradient(
		circle at var(--mx) var(--my),
		rgba(255, 255, 255, 0.28) 0%,
		rgba(255, 255, 255, 0.10) 25%,
		transparent 55%
	);
	opacity: 0;
	transition: opacity 0.3s ease;
	pointer-events: none;
	z-index: 4;
	mix-blend-mode: overlay;
}
.kb-gallery__card:hover .kb-gallery__frame::after,
.kb-gallery__card:focus-visible .kb-gallery__frame::after {
	opacity: 1;
}
.kb-gallery__img {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	opacity: 1;
	transform: scale(1);
	transition: transform 0.7s cubic-bezier(.2,.7,.2,1), filter 0.4s ease;
	z-index: 1;
	backface-visibility: hidden;
}
.kb-gallery__card[data-kb-depth="soft"] .kb-gallery__img { --photo-shift: 3%; }
.kb-gallery__card[data-kb-depth="mid"] .kb-gallery__img { --photo-shift: 6%; }
.kb-gallery__card[data-kb-depth="deep"] .kb-gallery__img { --photo-shift: 9%; }
.kb-gallery__frame.is-tilted .kb-gallery__img {
	transform: translate(calc((var(--mx, 50%) - 50%) * var(--photo-shift, 4%)), calc((var(--my, 50%) - 50%) * var(--photo-shift, 4%))) scale(1.04);
}
.kb-gallery__num {
	position: absolute;
	top: 14px;
	left: 16px;
	display: inline-flex;
	align-items: center;
	padding: 6px 12px;
	font-size: 0.85rem;
	font-weight: 800;
	letter-spacing: 0.08em;
	color: var(--kb-ink);
	background: #ffffff;
	border-radius: 999px;
	z-index: 5;
	box-shadow: 0 4px 12px rgba(15, 20, 12, 0.14);
}

.kb-gallery__peek {
	position: absolute;
	right: 14px;
	bottom: 14px;
	padding: 9px 16px;
	font-size: 0.82rem;
	font-weight: 800;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	color: var(--kb-ink);
	background: var(--kb-lime-btn);
	border: 0;
	border-radius: 999px;
	opacity: 0;
	transform: translate3d(0, 12px, 0);
	transition: opacity 0.3s ease, transform 0.4s ease;
	z-index: 6;
	pointer-events: none;
	box-shadow: 0 4px 12px rgba(15, 20, 12, 0.12);
}
.kb-gallery__card:hover .kb-gallery__peek,
.kb-gallery__card:focus-visible .kb-gallery__peek,
.kb-gallery__card.is-active .kb-gallery__peek {
	opacity: 1;
	transform: none;
}
/* Figma 2.0: no number / view-pill chrome (must win over rules above) */
.kb-gallery__num,
.kb-gallery__peek {
	display: none;
}
/* Gallery stickers removed — soft Figma evolution */

/* Icon placeholder no longer used (photo always visible) */
.kb-gallery__icon { display: none; }

.kb-gallery__caption {
	/* Figma 3×2: captions не показані — ховаємо, alt лишається на img */
	display: none;
	padding: 0 8px;
	font-size: 0.95rem;
	font-weight: 600;
	color: var(--kb-ink-soft);
	text-align: center;
	line-height: 1.4;
	background: transparent;
	transition: color 0.3s ease;
}
.kb-gallery__card:hover .kb-gallery__caption,
.kb-gallery__card:focus-visible .kb-gallery__caption,
.kb-gallery__card.is-active .kb-gallery__caption {
	color: var(--kb-ink);
}

/* Touch-пристрої без hover — auto-cycle через JS (додає .is-active почергово). */
@media (hover: none) {
	.kb-gallery__frame { transition: none; }
}
@media (prefers-reduced-motion: reduce) {
	.kb-gallery__frame,
	.kb-gallery__img,
	.kb-gallery__placeholder,
	.kb-sparkle--left,
	.kb-sparkle--right {
		transition: none !important;
		animation: none !important;
	}
}

} /* /@layer gallery */

@layer join-cta {
/* Join CTA Section */
/* 0.8.74 — room for absolute badge + ink border above panel (0.8.67 max 56px
   clipped top stroke — owner: ? ? on badge top edge). */
.kb-join-cta {
	padding-block: clamp(36px, 4.5vw, 64px);
	padding-top: clamp(72px, 9vw, 96px);
	overflow: visible;
}
.kb-join-cta-panel {
	position: relative;
	background: var(--kb-join-card-bg, #ffffff);
	/* Same hard ink stroke as .kb-join-cta-badge (ОБЕРИ СВОЮ КНИГУ…) */
	border: 1.5px solid #0f140c;
	border-radius: var(--kb-radius-card);
	box-shadow: var(--kb-shadow-card);
	/* figma 4256:628/632 — title top ≈60px below white card top (y 181−121) */
	padding: max(48px, calc(56 * var(--kb-px))) 20px 28px;
	overflow: visible;
	box-sizing: border-box;
}
@media (min-width: 900px) {
	.kb-join-cta-panel {
		padding: max(60px, calc(80 * var(--kb-px))) 40px 40px;
	}
}
/* Owner 2026-10-08 (4th correction, FINAL - owner confirmed via live DevTools
   inspector): flush, zero gap, borders touching. Do not reintroduce a
   margin-bottom here again - this was the one thing asked for from the
   start and got flipped back and forth; bottom:100% alone (no margin) is
   the correct, final value. */
.kb-join-cta-badge {
	position: absolute;
	left: 50%;
	top: auto;
	bottom: 100%;
	right: auto;
	transform: translateX(-50%);
	margin-bottom: 0;
	z-index: 2;
	white-space: nowrap;
	font-size: max(14px, calc(30 * var(--kb-px)));
	font-weight: 800;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	color: #638c20; /* Figma 4256:631 */
	background: #ffffff;
	border: 1.5px solid #0f140c;
	border-radius: var(--kb-radius-pill);
	padding: max(10px, calc(12 * var(--kb-px))) max(28px, calc(40 * var(--kb-px)));
	box-shadow: 0 2px 8px rgba(0,0,0,0.06);
	line-height: 1.2;
	text-align: center;
	margin-top: 0;
	margin-inline: 0;
}
/* Owner 2026-10-08 (3rd correction): absolute-positioning the arrow by a
   ch-based guess overlapped the title text outright (confirmed by owner
   screenshot) - the guessed offset didn't match the actual rendered line
   width. Replaced with a standard, robust technique instead of guessing
   coordinates: flex row [ghost-spacer][title][arrow] where the spacer is
   the SAME width as the arrow. Equal-width elements on both sides of the
   title make the flex row center as a whole while the title itself lands
   visually centered on the card - the arrow can never overlap it (normal
   flow, not absolute) and never pulls the title off-center (its width is
   balanced by the spacer). */
.kb-join-cta-header {
	display: flex;
	align-items: flex-start;
	justify-content: center;
	gap: max(8px, calc(12 * var(--kb-px)));
	/* 0.8.67 — equal but tight air (0.8.66 was too tall — owner red-X gap) */
	margin-top: max(12px, calc(16 * var(--kb-px)));
	margin-bottom: max(12px, calc(16 * var(--kb-px)));
	position: relative;
	text-align: center;
}
.kb-join-cta-header::before {
	content: '';
	display: block;
	width: max(64px, calc(103 * var(--kb-px))); /* matches .kb-join-cta__arrow width */
	flex-shrink: 0;
}
.kb-join-cta__title {
	/* !important reason: beat .kb-section__heading margin from tokens */
	margin: 0 !important;
	max-width: 22ch;
	text-align: center;
}
.kb-join-cta__arrow,
.kb-join-cta__arrow.kb-figma-arrow {
	width: max(64px, calc(103 * var(--kb-px))); /* figma 4256:633 */
	height: auto;
	flex-shrink: 0;
	margin-top: max(4px, calc(8 * var(--kb-px)));
	/* 0.8.67 — REVERT join arrow to Figma only (0.8.66 wrongly flipped it). */
	transform: rotate(-128.81deg);
	transform-origin: center center;
}
.kb-doodle-arrow {
	flex-shrink: 0;
	display: inline-block;
	width: min(150px, 32vw);
	height: auto;
	overflow: visible;
	object-fit: contain;
	transform-origin: 18% 82%;
	transition: transform 0.12s linear;
	transform: rotate(calc((var(--mx, 50%) - 50%) * 0.22deg));
}
/* 0.8.73 — «Як усе починалося» media arrow ONLY (desktop SoT). After generic
   .kb-doodle-arrow (join-cta beats @layer about). Asset as in mockup:
   no scaleX, no rotate — kill mouse-follow transform from .kb-doodle-arrow.
   Map/join keep their own selectors. Mobile keeps its own block below. */
.kb-doodle-arrow.kb-about__arrow--media,
.kb-doodle-arrow--2.kb-about__arrow--media {
	width: min(200px, calc(220 * var(--kb-px)));
	transform: none;
	transform-origin: 50% 50%;
}
.kb-join-cta__grid {
	display: grid;
	gap: var(--kb-space-3);
	grid-template-columns: 1fr;
}
/* 0.8.66 — mobile SoT is <900; 2-col only from 900 up (was 840 → dual cols on “mob”) */
@media (min-width: 900px) {
	.kb-join-cta__grid {
		grid-template-columns: repeat(2, minmax(0, 1fr));
		gap: 22px;
	}
}
.kb-method-card {
	border-radius: calc(var(--kb-radius-card) - 8px);
	padding: 36px 28px;
	display: flex;
	flex-direction: column;
	gap: var(--kb-space-3);
	min-height: 100%;
	box-shadow: var(--kb-shadow-card);
	transition: transform 0.2s ease, box-shadow 0.2s ease;
	position: relative;
	min-width: 0;
	box-sizing: border-box;
	overflow: hidden;
}
.kb-method-card:hover {
	transform: translateY(-2px);
	box-shadow: 0 12px 28px rgba(15, 20, 12, 0.1);
}
/* method-card sticker removed */
@media (min-width: 900px) {
	.kb-method-card {
		padding: 44px 40px;
	}
}
.kb-method-card--cyan {
	background: var(--kb-card-cyan);
}
.kb-method-card--peach {
	background: var(--kb-card-peach);
}
.kb-method-card__title {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: 0.1em 0.35em;
	font-size: var(--kb-type-method);
	font-weight: 800;
	margin: 0;
	letter-spacing: -0.01em;
	color: var(--kb-ink);
	line-height: 1;
}
.kb-method-card__num {
	font-size: var(--kb-type-method-num);
	font-weight: 800;
	line-height: 1;
	margin: 0;
}
.kb-method-card__label {
	font-size: var(--kb-type-method);
	font-weight: 800;
	line-height: 1.1;
}
/* Owner 2026-10-08: body copy/button/bot-box/note were flush with the card's
   own left edge, same as the oversized "01."/"02." numeral above them - the
   owner wants them hanging-indented under the LABEL text instead (the
   numeral stands alone on its own column). Estimated from the numeral's own
   font-size formula for proportional consistency across breakpoints (not a
   measured Figma value - owner said close is fine, not pixel-perfect). The
   QR box is excluded on purpose: it's already centered in the full card
   width (0.8.54 fix) and indenting it would push it off-center. */
.kb-method-card__text,
.kb-method-card > .kb-btn,
.kb-bot-mock-card,
.kb-method-card__note {
	margin-left: max(70px, calc(123 * var(--kb-px)));
}
.kb-method-card__text {
	font-size: var(--kb-type-body);
	color: var(--kb-ink-soft);
	margin-top: 0;
	margin-bottom: 0;
	line-height: 1.65;
}
.kb-method-card .kb-btn {
	align-self: flex-start;
	min-height: 48px;
	max-width: 100%;
	box-sizing: border-box;
}
/* 0.8.66 — <900 is mobile: drop hanging indent (was only ≤639) so full-width
   Telegram/donate buttons cannot overflow the card. Desktop hangs under the
   label; below 900 there doesn't have room to spare for that indent. */
@media (max-width: 899px) {
	.kb-method-card .kb-btn {
		width: 100%;
		max-width: 100%;
		justify-content: center;
		align-self: stretch;
		padding-inline: 14px;
		gap: 6px;
		box-sizing: border-box;
	}
	.kb-method-card__text,
	.kb-method-card > .kb-btn,
	.kb-bot-mock-card,
	.kb-method-card__note {
		margin-left: 0;
	}
}
/* font-size/color/margin SoT: see line ~3420 — do not re-declare here */
.kb-method-card__note {
	font-weight: 600;
	line-height: 1.4;
	/* 0.8.65 — pin footnotes to a shared baseline so 01/02 fill reads equal */
	margin-top: auto;
}

/* 0.8.65 — equal fill: mock blocks grow; slack lives INSIDE the white boxes
   (QR vertically centered), not as a empty slab above QR alone. Footnotes
   pinned via note margin-top:auto. QR stays width:fit-content (0.8.54). */
.kb-bot-mock-card,
.kb-qr-mock-card {
	background: #ffffff;
	border-radius: 16px;
	padding: 18px 18px 16px;
	box-shadow: 0 4px 16px rgba(0,0,0,0.04);
	flex: 1 1 auto;
	display: flex;
	flex-direction: column;
	min-height: 0;
}
.kb-bot-mock-card {
	border: 1.5px solid rgba(84, 197, 248, 0.55);
	justify-content: flex-start;
}
.kb-qr-mock-card {
	align-self: center;
	width: fit-content;
	justify-content: center;
	align-items: center;
}
.kb-bot-mock-header {
	font-size: 0.9rem;
	color: var(--kb-ink);
	margin-bottom: 6px;
}
.kb-bot-mock-body {
	font-size: 0.88rem;
	color: var(--kb-ink);
	line-height: 1.55;
}
.kb-bot-mock-body p {
	margin: 0 0 8px;
}
.kb-qr-wrapper {
	display: flex;
	justify-content: center;
}
.kb-qr-wrapper img,
.kb-qr-img {
	width: max(148px, calc(246 * var(--kb-px))); /* figma 4256:659 */
	height: auto;
	aspect-ratio: 1 / 1;
	object-fit: contain;
	display: block;
	margin-inline: auto;
}

/*
 * Progress — single SoT (Figma 4256:442)
 * Desktop: 1680×761, radius 80 (=4.762%), fill #c5e68e, absolute % slots.
 * Mobile base FIRST; desktop @900+ AFTER so width:73.452% is not overridden
 * by mobile width:100% (cascade bug: absolute + left% + width 100% escaped card).
 */
.kb-progress-card {
	position: relative;
	background: var(--kb-progress-card-bg, #c5e68e);
	border-radius: var(--kb-radius-m);
	padding: 40px 28px 36px;
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	gap: 20px;
	box-shadow: none;
}
.kb-progress-badge { align-self: center; }
/* Figma btn group 4256:446 / 4256:406 — exact SVG 353×147 (baked 3.0, no HTML pill) */
.kb-brand-badge--progress,
.kb-brand-badge--lime {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	background: transparent;
	padding: 0;
	width: max(200px, calc(353 * var(--kb-px)));
	max-width: 100%;
	height: auto;
	min-height: 0;
}
.kb-brand-badge__mark {
	display: block;
	width: 100%;
	height: auto;
	aspect-ratio: 353 / 147;
	object-fit: contain;
}
.kb-progress-main-stat {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	text-align: center;
}
.kb-progress-number {
	font-size: var(--kb-type-progress);
	font-weight: 900;
	line-height: 1.05;
	letter-spacing: -0.03em;
	text-transform: uppercase;
	color: var(--kb-ink);
}
.kb-progress-label {
	font-size: var(--kb-type-progress-lbl);
	font-weight: 700;
	color: var(--kb-ink);
}
.kb-progress-bar-wrap {
	width: 100%;
	max-width: 100%;
	margin: 4px 0 0;
	box-sizing: border-box;
}
.kb-progress__bar {
	height: 28px;
	width: 100%;
	max-width: 100%;
	box-sizing: border-box;
	background: #ffffff;
	border-radius: 999px;
	overflow: hidden;
	padding: 4px;
}
.kb-progress__bar-fill {
	position: relative;
	height: 100%;
	border-radius: 999px;
	background: var(--kb-progress-yellow);
	overflow: hidden;
	flex: none;
	transition: none;
}
.kb-progress__bar-fill::after {
	content: '';
	position: absolute;
	inset: 0;
	background: linear-gradient(100deg, transparent 46%, rgba(255, 255, 255, 0.28) 50%, transparent 54%);
	transform: translateX(-30%);
	animation: kb-progress-sheen 3.4s ease-in-out infinite;
	pointer-events: none;
}
@keyframes kb-progress-sheen {
	0%, 100% { transform: translateX(-30%); opacity: 0.45; }
	50% { transform: translateX(30%); opacity: 0.85; }
}
.kb-progress-range-labels {
	display: flex;
	justify-content: space-between;
	margin-top: 8px;
	font-size: 0.95rem;
	font-weight: 700;
	color: var(--kb-ink);
	text-align: left;
}
.kb-progress-actions {
	margin-top: max(8px, calc(12 * var(--kb-px)));
	align-self: flex-end;
}
/* Figma 4256:473 — pill + black border + white type; Studio may set --kb-progress-cta-* */
.kb-progress-cta,
a.kb-progress-cta,
a.kb-progress-cta:link,
a.kb-progress-cta:visited {
	border: 2px solid var(--kb-ink);
	box-shadow: none;
	background: var(--kb-progress-cta-bg, var(--kb-orange-btn));
	color: var(--kb-progress-cta-fg, #ffffff);
}
.kb-progress-cta:hover,
a.kb-progress-cta:hover {
	transform: translateY(-1px);
	box-shadow: none;
	background: var(--kb-progress-cta-bg, var(--kb-orange-hover));
	color: var(--kb-progress-cta-fg, #ffffff);
}
.kb-progress-cta:active {
	transform: translateY(1px);
	box-shadow: none;
}
.kb-btn-arrow-char { font-size: 1.1em; line-height: 1; }
.kb-progress-update-note {
	font-size: 0.8rem;
	color: var(--kb-ink);
	margin: 4px 0 0;
	align-self: center;
	text-align: center;
	opacity: 0.85;
	/* One line — do NOT put white-space on .kb-progress-cta (keeps button label intact). */
	white-space: nowrap;
}
.kb-progress-cta {
	white-space: nowrap;
}
@media (prefers-reduced-motion: reduce) {
	.kb-progress__bar-fill::after { animation: none; }
}
@media (max-width: 639px) {
	/* .kb-progress-actions base rule is align-self: flex-end (desktop CTA sits
	   right of the progress bar). On mobile the card is a centered column, so
	   a right-pushed, shrink-wrapped actions box put the button off-center and
	   narrower than it looked like it should be. Owner: center + full-width it
	   like every other mobile CTA in this theme (hero/join-cta/about). */
	.kb-progress-actions { align-self: center; width: 100%; justify-content: center; }
	.kb-progress-actions .kb-btn { width: 100%; justify-content: center; }
}
@media (min-width: 900px) {
	.kb-progress-card {
		container-type: inline-size;
		display: block;
		aspect-ratio: 1680 / 761;
		padding: 0;
		background: #c5e68e;
		border-radius: 4.762%; /* Figma radius 80 / 1680 */
		box-shadow: 3px 3px 19.3px 4px rgba(116, 133, 87, 0.24);
		text-align: center;
	}
	.kb-progress-badge {
		position: absolute;
		left: 39.524%;
		top: 5.519%;
		width: 21.012%;
		height: 19.243%;
		display: flex;
		align-items: center;
		justify-content: center;
		align-self: auto;
	}
	.kb-progress-main-stat {
		position: absolute;
		left: 31.607%;
		top: 26.675%;
		width: 36.845%;
		height: 28.909%;
		display: flex;
		flex-direction: column;
		align-items: center;
		justify-content: flex-start;
		gap: 0;
		text-align: center;
	}
	/* font-size SoT: @layer responsive-scale (--kb-type-progress × Studio scale). */
	.kb-section-root .kb-progress-card .kb-progress-number,
	.kb-progress-number {
		line-height: 1;
		text-transform: none;
		text-align: center;
		width: 100%;
	}
	.kb-progress-label {
		font-size: 2.14cqw;
		line-height: 1;
		text-align: center;
		width: 100%;
	}
	.kb-progress-bar-wrap {
		position: absolute;
		left: 13.274%;
		top: 61.104%;
		width: 73.452%;
		max-width: 73.452%;
		margin: 0;
		box-sizing: border-box;
	}
	.kb-progress-range-labels {
		font-size: 1.19cqw;
		font-weight: 500;
	}
	.kb-progress__bar {
		height: 2.143cqw;
		width: 100%;
		max-width: 100%;
	}
	.kb-progress-actions {
		position: absolute;
		left: 37.083%;
		top: 75.296%;
		width: 25.833%;
		height: 11.038%;
		margin: 0;
		align-self: auto;
		display: flex;
	}
	.kb-progress-actions .kb-btn {
		width: 100%;
		height: 100%;
		justify-content: center;
	}
	.kb-progress-update-note {
		position: absolute;
		left: 50%;
		top: 91.327%;
		/* Wider than Figma 18.214% so UA cannot wrap the weekly note into 2 lines */
		width: max(280px, 28%);
		max-width: 90%;
		margin: 0;
		transform: translateX(-50%);
		text-align: center;
		align-self: auto;
		white-space: nowrap;
	}
}
} /* /@layer join-cta */

@layer map {
/* Map Section */
.kb-map.kb-section {
	padding-block: clamp(36px, 4.5vw, 64px);
}

.kb-map-grid {
	display: grid;
	gap: var(--kb-space-4);
	align-items: start; /* figma: title top = map card top */
}
@media (min-width: 900px) {
	.kb-map-grid {
		/* figma 4256:660 — text ~725 | card 736; stack below 900 (owner mob SoT) */
		grid-template-columns: minmax(0, 1fr) max(280px, calc(736 * var(--kb-px)));
		gap: max(32px, calc(40 * var(--kb-px)));
		justify-content: space-between;
	}
}
.kb-map__title {
	text-align: left !important;
	margin-top: 10px !important;
	margin-bottom: 14px !important;
}
.kb-map__lead {
	font-size: var(--kb-type-lead);
	font-weight: 700;
	margin: 0 0 10px;
	color: var(--kb-ink);
}
.kb-map__text {
	font-size: var(--kb-type-body);
	color: var(--kb-ink-soft);
	line-height: 1.65;
	margin: 0;
	max-width: var(--kb-measure);
}
.kb-map-card-wrapper {
	position: relative;
}
.kb-map-content {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 0;
}
.kb-map-content .kb-pill-badge {
	margin-bottom: max(12px, calc(16 * var(--kb-px)));
}
.kb-map-arrow,
.kb-map-arrow.kb-figma-arrow {
	position: absolute;
	left: max(-100px, calc(-111 * var(--kb-px)));
	top: max(36%, calc(140 * var(--kb-px)));
	z-index: 2;
	pointer-events: none;
	width: max(120px, calc(222 * var(--kb-px))); /* figma 4256:682 */
	height: auto;
	overflow: visible;
}
/* 0.8.69 — stacked map (<900) layout in @layer map (position/width). Transform +
   right-align SoT lives UNLAYERED below (EOF) — unlayered `.kb-map-arrow
   { display:inline-block }` was beating @layer map and killing margin:auto. */
.kb-map-white-card {
	background: var(--kb-map-card-bg, #ffffff);
	border-radius: var(--kb-radius-card);
	/* Same hard ink stroke as join badge / join panel (owner 0.8.68) */
	border: 1.5px solid #0f140c;
	/* figma 4256:665 Rectangle 392 = 736×418 */
	width: 100%;
	max-width: max(280px, calc(736 * var(--kb-px)));
	padding: max(4px, calc(4 * var(--kb-px)));
	box-shadow: var(--kb-shadow-card);
	box-sizing: border-box;
}
@media (min-width: 840px) {
	.kb-map-white-card {
		padding: max(4px, calc(4 * var(--kb-px))) max(16px, calc(149 * var(--kb-px)));
		min-height: max(280px, calc(418 * var(--kb-px)));
		display: flex;
		align-items: center;
		justify-content: center;
	}
}
.kb-map-stage {
	position: relative;
	/* figma 4256:666 image 70 = 438×409 — pins baked into PNG */
	width: 100%;
	max-width: max(240px, calc(438 * var(--kb-px)));
	margin-inline: auto;
	isolation: isolate;
}
.kb-map__img {
	display: block;
	width: 100%;
	max-width: max(240px, calc(438 * var(--kb-px)));
	height: auto;
	aspect-ratio: 438 / 409;
	border-radius: 20px;
	object-fit: contain;
}
/* .kb-map__dots removed 2026-10-05 — zero references, map.php places dot
   buttons directly in .kb-map-stage, each already individually absolute. */
.kb-map__dot {
	position: absolute;
	left: var(--x, 50%);
	top: var(--y, 50%);
	transform: translate(-50%, -50%);
	width: 44px;
	height: 44px;
	min-width: 44px;
	min-height: 44px;
	padding: 0;
	border: 0;
	background: transparent;
	cursor: pointer;
	z-index: 3;
}
.kb-map__dot:focus-visible {
	outline: 2px solid var(--kb-ink);
	outline-offset: 2px;
	border-radius: 50%;
}
.kb-map__dot-core {
	display: block;
	width: 12px;
	height: 12px;
	margin: 16px auto;
	border-radius: 50%;
	background: var(--kb-orange-btn);
	box-shadow: 0 0 0 2px #fff, 0 2px 6px rgba(15, 20, 12, 0.2);
}
.kb-map__dot--primary .kb-map__dot-core {
	width: 16px;
	height: 16px;
	margin: 14px auto;
	background: var(--kb-orange-btn);
}
.kb-map__dot--accent .kb-map__dot-core {
	background: #f5b800;
}
.kb-map__dot-label {
	/* map-kharkiv.png already bakes in every city name next to its marker —
	   a second HTML label here would double the text. Kept in the DOM (not
	   removed from the template) only so a future custom map image without
	   baked-in labels can re-enable it with one rule change; the accessible
	   name still reaches screen readers via the button's own aria-label. */
	display: none;
}
.kb-map__dot--label-right .kb-map__dot-label {
	left: calc(50% + 14px);
	transform: translateY(-50%);
}
.kb-map__dot--label-left .kb-map__dot-label {
	right: calc(50% + 14px);
	left: auto;
	transform: translateY(-50%);
	text-align: right;
}
@media (max-width: 639px) {
	.kb-map__dot-label { font-size: 0.55rem; }
}
.kb-map__dot-pulse {
	position: absolute;
	inset: 0;
	border-radius: 50%;
	background: rgba(255, 122, 54, 0.35);
	transform: scale(0.6);
	opacity: 0;
	pointer-events: none;
}
.kb-map__dot:hover .kb-map__dot-pulse,
.kb-map__dot:focus-visible .kb-map__dot-pulse {
	opacity: 1;
	transform: scale(1.6);
	transition: transform 0.45s ease, opacity 0.45s ease;
}
.kb-map__tooltip {
	position: absolute;
	left: 0;
	top: 0;
	z-index: 5;
	min-width: 140px;
	max-width: 220px;
	padding: 10px 12px;
	border-radius: 12px;
	background: #fff;
	box-shadow: 0 8px 24px rgba(15, 20, 12, 0.14);
	border: 1px solid rgba(15, 20, 12, 0.08);
	pointer-events: none;
	opacity: 0;
	visibility: hidden;
	transform: translate(-50%, calc(-100% - 12px));
	transition: opacity 0.15s ease, visibility 0.15s ease;
}
.kb-map__tooltip.is-open {
	opacity: 1;
	visibility: visible;
}
.kb-map__tooltip-label {
	display: block;
	font-weight: 800;
	font-size: 0.9rem;
	color: var(--kb-ink);
}
.kb-map__tooltip-note {
	display: block;
	margin-top: 2px;
	font-size: 0.8rem;
	line-height: 1.4;
	color: var(--kb-ink-soft);
}
.kb-map__tooltip-note:empty {
	display: none;
}

} /* /@layer map */

@layer partners {
/* Partners Section — title + logos flanked by tilted paperclip cards */
.kb-partners-stage {
	position: relative;
	overflow: visible;
	padding-bottom: 12px;
	min-height: max(460px, calc(580 * var(--kb-px)));
}
.kb-partners-header {
	position: relative;
	z-index: 2;
	text-align: center;
	margin-bottom: var(--kb-space-3);
	max-width: min(980px, 100%);
	margin-inline: auto;
}
.kb-partners__title {
	max-width: 18em;
	margin-inline: auto !important;
}
.kb-partners__lead {
	/* Figma 4256:360: 909×87 @ y=440; title ends ≈397 → gap ≈43 */
	max-width: min(909px, 48ch);
	margin: max(28px, calc(43 * var(--kb-px))) auto 0;
	text-align: center;
	font-size: max(16px, calc(24 * var(--kb-px)));
	line-height: 1.5;
	color: var(--kb-ink-soft);
}
.kb-partners__logos {
	/* Figma Group 59490 ≈391×105; logos ZONE 135×32 / RANOK 52×60 / KN 135×32; gap ≈35 */
	position: relative;
	z-index: 2;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	gap: max(20px, calc(35 * var(--kb-px))) max(28px, calc(35 * var(--kb-px)));
	/* lead ends ≈527 → logos ≈577 → gap ≈50 */
	margin: max(32px, calc(50 * var(--kb-px))) auto 0;
	max-width: min(980px, 100%);
	min-height: max(60px, calc(105 * var(--kb-px)));
}
.kb-partners__logo-link {
	display: inline-flex;
	align-items: center;
	min-height: 44px;
	padding: 4px 6px;
	border-radius: 8px;
	text-decoration: none;
}
.kb-partners__logo-link:focus-visible {
	outline: 2px solid var(--kb-ink);
	outline-offset: 3px;
}
.kb-partner-img {
	/* No brand slug match (4th+ owner-added logo) -> safe default; var(--kb-logo-h)
	   from the Studio logos repeater overrides this per-logo. */
	max-height: var(--kb-logo-h, max(32px, calc(60 * var(--kb-px))));
	width: auto;
	object-fit: contain;
	filter: none;
}
.kb-partners__logos .kb-partner-img--zone3000,
.kb-partners__logos .kb-partner-logo--zone3000 {
	max-height: var(--kb-logo-h, max(28px, calc(32 * var(--kb-px))));
	height: var(--kb-logo-h, max(28px, calc(32 * var(--kb-px))));
}
.kb-partners__logos .kb-partner-img--ranok,
.kb-partners__logos .kb-partner-logo--ranok,
.kb-partners__logos .kb-partner-img--knockout {
	max-height: var(--kb-logo-h, max(52px, calc(60 * var(--kb-px))));
	height: var(--kb-logo-h, max(52px, calc(60 * var(--kb-px))));
}
.kb-partners__logos .kb-partner-img--knyholand,
.kb-partners__logos .kb-partner-logo--knyholand {
	max-height: var(--kb-logo-h, max(26px, calc(35 * var(--kb-px))));
	height: var(--kb-logo-h, max(26px, calc(35 * var(--kb-px))));
}

.kb-partners__card {
	position: relative;
	margin: 0;
	background: #fff;
	border-radius: max(16px, calc(22 * var(--kb-px)));
	padding: max(6px, calc(8 * var(--kb-px)));
	/*
	 * Figma 4256:365 / 4256:362 — landscape newspaper screens (not 4/5 portrait).
	 * Width set per-side; default falls back to left SoT 485.
	 */
	width: calc(485 * var(--kb-art-px));
	max-width: min(32vw, 520px);
	box-shadow: 0 14px 36px rgba(15, 20, 12, 0.12);
	transform: rotate(var(--kb-tilt, 31.54deg));
	transform-origin: center center;
	transition: transform 0.25s ease, box-shadow 0.25s ease;
}
.kb-partners__card:hover {
	transform: rotate(var(--kb-tilt, 31.54deg)) translateY(-4px) scale(1.02);
	box-shadow: 0 22px 44px rgba(15, 20, 12, 0.16);
	z-index: 2;
}
.kb-partners__card-img {
	width: 100%;
	height: auto;
	aspect-ratio: 485 / 356; /* Figma Group 59518 */
	object-fit: cover;
	object-position: top center;
	border-radius: max(10px, calc(12 * var(--kb-px)));
	display: block;
}
.kb-partners__card--right .kb-partners__card-img {
	aspect-ratio: 524 / 353; /* Figma Group 59516 */
}
/* Knockout sizing is for partners/stats strips — NOT hero (hero SoT below).
   This partners/stats value is itself shadowed by @layer motion's copy of
   the same selector further down (search "Partners section logos only") -
   @layer order puts motion after partners, so that one actually wins; this
   rule only still matters for anything that selector doesn't also match
   there. Kept in sync rather than deleted to avoid a third silent split. */
/* Partners strip: Figma logos ≤60px tall — do not reuse stats 98px knockout. */
.kb-partners .kb-partner-img--knockout {
	mix-blend-mode: multiply;
	height: var(--kb-logo-h, max(52px, calc(60 * var(--kb-px))));
	max-height: var(--kb-logo-h, max(52px, calc(60 * var(--kb-px))));
}
.kb-lime-card .kb-partner-img--knockout,
.kb-lime-partner-logo.kb-partner-img--knockout {
	mix-blend-mode: multiply;
	/* Harmonize with Figma partners Ranok 60 (was 98 — overpowered lime strip). */
	height: var(--kb-logo-h, max(52px, calc(60 * var(--kb-px))));
	max-height: var(--kb-logo-h, max(52px, calc(60 * var(--kb-px))));
}
/* Hero ranok SoT — Figma 52×60; @layer partners wins over @layer hero. */
.kb-hero-partners .kb-partner-img--knockout,
.kb-hero-partner-logo.kb-partner-img--knockout {
	mix-blend-mode: multiply;
	height: var(--kb-logo-h, max(52px, calc(60 * var(--kb-px))));
	max-height: var(--kb-logo-h, max(52px, calc(60 * var(--kb-px))));
	width: auto;
}
/* Owner 2026-10-08 (found while wiring --kb-logo-h): the ≤640px
   .kb-hero-partner-logo--ranok rule in @layer hero was DEAD — this
   2-class selector (same specificity, @layer partners declared later)
   always won, even on mobile, so ranok never actually shrank below 52px
   at phone widths. min() here is the real mobile cap/override path. */
@media (max-width: 640px) {
	.kb-hero-partners .kb-partner-img--knockout,
	.kb-hero-partner-logo.kb-partner-img--knockout {
		height: min(var(--kb-logo-h, 36px), 36px);
		max-height: min(var(--kb-logo-h, 36px), 36px);
	}
}
.kb-paperclip {
	position: absolute;
	top: -16px;
	right: 14px;
	left: auto;
	z-index: 4;
	line-height: 0;
	pointer-events: none;
}
.kb-paperclip--a {
	transform: rotate(-14deg);
}
.kb-partners__card--right .kb-paperclip--a {
	transform: rotate(12deg);
}
.kb-partners__card--left .kb-paperclip--a {
	transform: rotate(-18deg);
}
/* Figma mockup: second clip on left card bottom-left */
.kb-paperclip--b {
	top: auto;
	bottom: -10px;
	right: auto;
	left: 18px;
	transform: rotate(28deg);
}
.kb-paperclip-svg {
	display: block;
	filter: drop-shadow(0 2px 2px rgba(15, 20, 12, 0.15));
}

/* Desktop: Speka / Infocity on canvas edges (Figma 4256:365 / 4256:362) */
.kb-partners,
.kb-partners .kb-container,
.kb-partners-stage {
	overflow: visible;
}
.kb-partners__media--flank {
	position: absolute;
	left: 50%;
	/* 0.8.70 — 100dvw respects mobile UI chrome better than 100vw */
	width: 100dvw;
	margin-left: -50dvw;
	top: 0;
	bottom: 0;
	z-index: 0;
	pointer-events: none;
	min-height: 0;
	padding: 0;
}
.kb-partners__media--flank .kb-partners__card {
	position: absolute;
	pointer-events: auto;
}
.kb-partners__media--flank .kb-partners__card--left {
	/* Figma 4256:365: x≈−36, y≈188 in partners frame; tilt +31.54° (outward CW) */
	left: calc(max(0px, (100vw - 1920px) / 2) - (36 * var(--kb-art-px)));
	top: calc(188 * var(--kb-art-px));
	width: calc(485 * var(--kb-art-px));
	max-width: min(30vw, 500px);
	z-index: 1;
}
.kb-partners__media--flank .kb-partners__card--right {
	/* Figma 4256:362: x≈1529 → ~67px from canvas right; y≈137; tilt −19.48° (outward CCW) */
	right: calc(max(0px, (100vw - 1920px) / 2) + (67 * var(--kb-art-px)));
	top: calc(137 * var(--kb-art-px));
	width: calc(524 * var(--kb-art-px));
	max-width: min(32vw, 540px);
	z-index: 1;
}

@media (max-width: 899px) {
	.kb-partners__media--flank {
		position: relative;
		inset: auto;
		left: auto;
		width: 100%;
		margin-left: 0;
		display: flex;
		flex-direction: row;
		align-items: flex-end;
		justify-content: center;
		gap: clamp(12px, 4vw, 28px);
		pointer-events: auto;
		margin-bottom: var(--kb-space-3);
		padding: 20px var(--kb-card-pad) 0;
		overflow: hidden;
	}
	.kb-partners__media--flank .kb-partners__card {
		position: relative;
		top: auto !important;
		left: auto !important;
		right: auto !important;
		width: min(200px, 42vw);
		max-width: none;
	}
	.kb-partners__media--flank .kb-partners__card--left {
		margin-top: 12px;
	}
	.kb-partners__media--flank .kb-partners__card--right {
		margin-top: 0;
	}
	.kb-paperclip--b {
		display: none; /* keep one clip on narrow */
	}
}

@media (max-width: 639px) {
	/* Avoid overflow: hide flank press on small phones; center copy stays SoT */
	.kb-partners__media--flank {
		display: none;
	}
	.kb-partners-stage {
		min-height: 0;
	}
}

} /* /@layer partners */

@layer timeline {
/* Timeline Section "А ЩО ДАЛІ?" */
.kb-timeline-frame {
	position: relative;
	margin-top: max(28px, calc(36 * var(--kb-px)));
	max-width: min(1360px, 100%);
	margin-inline: auto;
}
/* Owner 2026-10-09 (corrected): badge lives INSIDE the card as a normal
   flow item, not absolutely positioned/overlapping it - that was
   join-cta's own treatment (different Figma node), wrongly copied here.
   The card's own `gap` below gives it the same spacing as every other
   gap in this flex column. */
.kb-timeline-badge-wrap {
	display: flex;
	justify-content: center;
}
.kb-timeline-card {
	background: #ffffff;
	border-radius: var(--kb-radius-card);
	/* Figma 4256:485 card 1689×553; title→chips / chips→note gaps = 66 each
	   (badge→title now also 66, via this flex column's own `gap`, since the
	   badge is in-flow here instead of overlapping from outside). */
	padding: max(36px, calc(48 * var(--kb-px))) 22px max(20px, calc(0 * var(--kb-px)));
	text-align: center;
	box-shadow: var(--kb-shadow-card);
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: max(24px, calc(66 * var(--kb-px)));
}
@media (min-width: 840px) {
	.kb-timeline-card {
		padding: max(36px, calc(48 * var(--kb-px))) 48px max(24px, calc(0 * var(--kb-px)));
	}
}
.kb-pill-badge--sage {
	background: #e8f0d8;
	color: #355f1c;
	border: 1.5px solid rgba(53, 95, 28, 0.18);
	box-shadow: none;
	font-size: max(16px, calc(16 * var(--kb-px)));
	padding: max(10px, calc(12 * var(--kb-px))) max(22px, calc(28 * var(--kb-px)));
	letter-spacing: 0.08em;
	font-weight: 800;
}
/* font-size/line-height/font-weight/letter-spacing/text-transform SoT: shared
   section-title block (.kb-map__title etc.), see line ~3880 — do not re-declare here */
.kb-timeline__title {
	max-width: 18em;
	margin: 0 auto;
	color: var(--kb-ink);
	background: none;
	-webkit-text-fill-color: var(--kb-ink);
	background-clip: border-box;
	/* Figma 4256:488 lineHeight 100% — was compressed on mobile */
	line-height: 1 !important;
	text-align: center;
}
.kb-timeline-pills {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	gap: max(8px, calc(10 * var(--kb-px)));
	margin: 0;
}
/* font-size/padding SoT: Figma-px scaling block, see line ~3920 — do not re-declare here */
.kb-chapter-pill {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	border-radius: var(--kb-radius-pill);
	font-weight: 700;
}
.kb-chapter-pill--lime {
	background: #c6e39e;
	color: var(--kb-ink);
	box-shadow: none;
}
.kb-chapter-pill--cyan {
	background: #c6ebf9;
	color: var(--kb-ink);
	border: 1px solid rgba(84, 197, 248, 0.35);
}
.kb-chapter-pill--dashed {
	background: #ffffff;
	border: 1.5px dashed var(--kb-ink);
	color: var(--kb-ink);
}
.kb-chapter-pill--ellipsis {
	min-width: 2.8rem;
	letter-spacing: 0.08em;
	padding-inline: 12px;
	font-weight: 800;
}
/* font-size SoT: see line ~3915 (var(--kb-type-body)) — do not re-declare here */
.kb-timeline__note {
	font-weight: 600;
	color: var(--kb-ink-soft);
	margin: 0;
}

} /* /@layer timeline */

@layer footer {
/* Figma SinglePage Footer */
/* padding-top/padding-bottom SoT: Figma-px scaling block, see line ~3925 — do not re-declare here */
/* 2026-10-05: legacy .kb-site-footer (dark theme) class removed from
   site-footer.php — this is now the only footer skin, !important no longer
   needed (was beating a same-specificity legacy rule that no longer applies). */
.kb-site-footer--figma {
	background: var(--kb-bg-canvas);
	color: var(--kb-ink);
	border-top: none;
	margin-top: var(--kb-space-5);
	/* 0.8.70 — home indicator */
	padding-bottom: env(safe-area-inset-bottom, 0px);
}
.kb-site-footer--figma .kb-site-footer__inner {
	display: flex;
	flex-wrap: nowrap;
	align-items: center;
	justify-content: space-between;
	gap: 16px 28px;
	width: 100%;
	padding-bottom: var(--kb-space-4);
	box-sizing: border-box;
}
.kb-footer-logo {
	display: inline-flex;
	align-items: center;
	text-decoration: none;
	flex-shrink: 0;
}
.kb-footer-logo svg,
.kb-footer-logo img {
	display: block;
	height: 28px;
	width: auto;
}
.kb-footer-nav {
	flex: 1 1 auto;
	display: flex;
	justify-content: center;
}
.kb-footer-nav ul {
	display: flex;
	align-items: center;
	justify-content: center;
	flex-wrap: wrap;
	gap: 12px 32px;
	list-style: none;
	margin: 0;
	padding: 0;
}
.kb-footer-nav a {
	color: var(--kb-ink);
	text-decoration: none;
	font-weight: 700;
	font-size: 0.92rem;
	transition: opacity 0.15s ease;
	display: inline-flex;
	align-items: center;
	min-height: var(--kb-touch);
	padding: 8px 4px;
}
.kb-footer-nav a:hover {
	color: var(--kb-ink);
	opacity: 0.7;
}
.kb-footer-nav a:focus-visible {
	outline: 2px solid var(--kb-ink);
	outline-offset: 3px;
	border-radius: 4px;
}
.kb-footer-cta-wrap {
	flex-shrink: 0;
}
.kb-footer-cta {
	white-space: nowrap;
}
/* Copyright: full-bleed center under the rail row (PC + mobile). */
.kb-site-footer--figma .kb-site-footer__bottom {
	display: block;
	width: 100%;
	text-align: center;
	border-top: none;
	font-size: 0.78rem;
	font-weight: 700;
	letter-spacing: 0.04em;
	color: var(--kb-ink);
	margin-top: 0;
	padding-top: 0;
	padding-bottom: 8px;
}
.kb-site-footer--figma .kb-footer-copy {
	margin: 0 auto;
	text-align: center;
	width: 100%;
}
@media (max-width: 720px) {
	.kb-site-footer--figma .kb-site-footer__inner {
		flex-direction: column;
		flex-wrap: wrap;
		align-items: center;
		text-align: center;
	}
	.kb-footer-nav {
		width: 100%;
	}
}

/* Legacy dark .kb-site-footer / grid .kb-site-footer__inner removed 2026-10-05
   — site-footer.php now renders only .kb-site-footer--figma (light theme),
   the legacy class was never present on the element to begin with after the
   template change above; these rules were already 100% shadowed before that.
   .kb-footer-brand/-tagline/-partners-mini/-partners-title/-badges, .kb-badge,
   .kb-footer-links/-col, .kb-back-to-top removed 2026-10-05 — zero references in
   any template (confirmed via grep), leftover from an earlier richer footer
   design that site-footer.php no longer renders. */
.kb-site-footer__bottom {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: var(--kb-space-3);
	padding-block: var(--kb-space-4);
	margin-top: var(--kb-space-5);
	border-top: 1px solid rgba(255, 255, 255, 0.08);
	font-size: 0.85rem;
	color: #7b8a70;
}
} /* /@layer footer */

@layer popup {
/* Popup */
.kb-popup-root {
	position: fixed;
	inset: 0;
	z-index: 100;
	display: none;
}
.kb-popup-root.is-open {
	display: block;
}
.kb-popup-overlay {
	position: absolute;
	inset: 0;
	background: rgba(15, 20, 12, 0.6);
	backdrop-filter: blur(4px);
}
.kb-popup {
	position: relative;
	max-width: 520px;
	margin: 8vh auto;
	background: #fff;
	border-radius: var(--kb-radius-m);
	padding: var(--kb-space-4);
	max-height: 84vh;
	overflow-y: auto;
	box-shadow: 0 20px 40px rgba(0,0,0,0.15);
}
.kb-popup__close {
	position: absolute;
	top: var(--kb-space-2);
	right: var(--kb-space-2);
	border: none;
	background: var(--kb-bg-canvas);
	width: var(--kb-touch);
	height: var(--kb-touch);
	min-width: var(--kb-touch);
	min-height: var(--kb-touch);
	border-radius: 50%;
	font-size: 1.1rem;
	cursor: pointer;
}
.kb-popup-panel__lead {
	margin: 0 0 1.1rem;
	font-size: var(--kb-type-body);
	line-height: 1.5;
	color: var(--kb-ink-soft);
}
.kb-popup-form {
	display: grid;
	grid-template-columns: 1fr;
	gap: 12px;
}
.kb-popup-form__row {
	display: grid;
	grid-template-columns: 1fr;
	gap: 12px;
}
@media (min-width: 520px) {
	/* Equal columns; inputs share one baseline (labels stay short). */
	.kb-popup-form__row--2 {
		grid-template-columns: repeat(2, minmax(0, 1fr));
		align-items: end;
		column-gap: 12px;
		row-gap: 0;
	}
}
.kb-popup-form__field {
	display: flex;
	flex-direction: column;
	justify-content: flex-end;
	gap: 6px;
	font-size: 0.88rem;
	font-weight: 600;
	color: var(--kb-ink);
	min-width: 0;
}
.kb-popup-form__label {
	display: block;
	line-height: 1.25;
	min-height: 1.25em;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.kb-popup-form__field--full {
	grid-column: 1 / -1;
}
.kb-popup-form__field input,
.kb-popup-form__field textarea {
	width: 100%;
	box-sizing: border-box;
	min-height: 44px;
	font: inherit;
	font-weight: 500;
	padding: 10px 12px;
	border: 1.5px solid #d2ded0;
	border-radius: 10px;
	background: #fff;
	color: var(--kb-ink);
}
.kb-popup-form__field input:focus,
.kb-popup-form__field textarea:focus {
	outline: 2px solid var(--kb-ink);
	outline-offset: 1px;
}
.kb-popup-form__hp {
	position: absolute !important;
	left: -9999px !important;
	width: 1px !important;
	height: 1px !important;
	opacity: 0 !important;
	pointer-events: none !important;
}
.kb-popup-form__privacy {
	margin: 0;
	font-size: 0.78rem;
	line-height: 1.4;
	color: var(--kb-ink-soft);
}
.kb-popup-form__status {
	min-height: 1.25em;
	margin: 0;
	font-size: 0.9rem;
	font-weight: 600;
}
.kb-popup-form__status[data-state="success"] { color: #2f6b1f; }
.kb-popup-form__status[data-state="error"] { color: #a32020; }
.kb-popup-form .kb-btn {
	align-self: stretch;
	min-height: 48px;
}

@media (prefers-reduced-motion: reduce) {
	.kb-btn,
	.kb-progress__bar-fill {
		transition: none;
	}
}

} /* /@layer popup */

@layer stats-banner {
/* Giant Lime Banner Card (Stats Banner) — Figma 4256:404 = 1680×874 */
.kb-stats-banner-section {
	/* Tighten external rhythm (owner mid-width top-gap red-X); card carries height */
	padding-block: max(20px, calc(28 * var(--kb-px)));
}
.kb-giant-lime-card {
	background: var(--kb-stats-card-bg, var(--kb-lime-btn));
	border-radius: var(--kb-radius-card);
	padding: max(40px, calc(56 * var(--kb-px))) 24px max(36px, calc(48 * var(--kb-px)));
	text-align: center;
	box-shadow: var(--kb-shadow-card);
	position: relative;
	overflow: hidden;
	min-height: max(420px, calc(874 * var(--kb-px)));
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	box-sizing: border-box;
}
@media (min-width: 900px) {
	.kb-giant-lime-card {
		padding: max(48px, calc(64 * var(--kb-px))) max(48px, calc(72 * var(--kb-px))) max(40px, calc(56 * var(--kb-px)));
	}
}

.kb-lime-card__logo {
	margin-bottom: var(--kb-space-4);
	display: flex;
	justify-content: center;
	align-items: center;
}

.kb-lime-card__title {
	font-size: var(--kb-type-section-lg);
	line-height: 1.05;
	font-weight: 900;
	letter-spacing: -0.02em;
	color: var(--kb-stats-num-color, var(--kb-ink));
	margin: 0 0 var(--kb-space-3);
	text-transform: uppercase;
}

.kb-lime-card__subtitle {
	font-size: var(--kb-type-lead);
	font-weight: 800;
	color: var(--kb-ink);
	margin: 0 auto var(--kb-space-4);
	max-width: min(980px, 100%);
	line-height: 1.3;
}

.kb-lime-card__body {
	font-size: var(--kb-type-body);
	line-height: 1.6;
	color: var(--kb-ink-soft);
	max-width: min(720px, var(--kb-measure));
	margin: 0 auto var(--kb-space-5);
}

.kb-lime-card__body p {
	margin: 0 0 12px;
}

.kb-lime-card__partners {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: var(--kb-space-5);
	margin-top: var(--kb-space-4);
}

/* Stats/lime partner strip — wide lockups ~40, tall Ranok knockout 60 (Figma
   partners rhythm; lime card can read a touch larger than hero 32). Knockout
   height SoT also in @layer partners/motion — do NOT re-cap in track-a-polish. */
.kb-lime-partner-logo {
	max-height: var(--kb-logo-h, max(32px, calc(40 * var(--kb-px))));
	height: var(--kb-logo-h, max(32px, calc(40 * var(--kb-px))));
	width: auto;
	object-fit: contain;
}
.kb-lime-partner-logo.kb-partner-img--knockout {
	mix-blend-mode: multiply;
	height: var(--kb-logo-h, max(52px, calc(60 * var(--kb-px))));
	max-height: var(--kb-logo-h, max(52px, calc(60 * var(--kb-px))));
}

@media (max-width: 640px) {
	.kb-lime-card__partners {
		flex-wrap: wrap;
		gap: 12px;
	}
}

} /* /@layer stats-banner */

@layer lightbox {
/* ======================================================================
   Gallery Lightbox — full-screen slideshow with kb/touch/autoplay
   ====================================================================== */
body.kb-lightbox-lock { overflow: hidden; }

.kb-lightbox {
	position: fixed;
	inset: 0;
	display: none;
	z-index: 9999;
	opacity: 0;
	transition: opacity 0.25s ease;
	/* iOS Safari: використовуємо dvh щоб не крити bottom-tabbar */
	height: 100vh;
	height: 100dvh;
	padding: env(safe-area-inset-top, 0px) env(safe-area-inset-right, 0px) env(safe-area-inset-bottom, 0px) env(safe-area-inset-left, 0px);
	box-sizing: border-box;
}
.kb-lightbox.is-open {
	display: block;
	opacity: 1;
}

.kb-lightbox__backdrop {
	position: absolute;
	inset: 0;
	background: rgba(10, 14, 8, 0.85);
	backdrop-filter: blur(6px);
	-webkit-backdrop-filter: blur(6px);
	cursor: zoom-out;
}

.kb-lightbox__shell {
	position: relative;
	width: 100%;
	height: 100%;
	display: flex;
	flex-direction: column;
	justify-content: center;
	align-items: center;
	padding: clamp(16px, 4vw, 48px);
}

.kb-lightbox__stage {
	position: relative;
	margin: 0;
	max-width: min(90vw, 1400px);
	max-height: calc(100vh - 160px);
	max-height: calc(100dvh - 160px);
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 16px;
	animation: kb-lb-stage-in 0.35s cubic-bezier(.2,.7,.2,1);
}

@keyframes kb-lb-stage-in {
	from { opacity: 0; transform: scale(0.96); }
	to   { opacity: 1; transform: scale(1); }
}

/* Photo — без рамки; hit-zones ліво/право для prev/next */
.kb-lightbox__media {
	position: relative;
	display: inline-block;
	max-width: 100%;
	line-height: 0;
	border-radius: 0;
	overflow: visible;
	box-shadow: none;
	border: 0;
	background: transparent;
}
.kb-lightbox__media::after {
	display: none;
}

.kb-lightbox__zone {
	position: absolute;
	top: 0;
	bottom: 0;
	width: 50%;
	border: 0;
	padding: 0;
	margin: 0;
	background: transparent;
	cursor: pointer;
	z-index: 2;
	appearance: none;
	-webkit-appearance: none;
}
.kb-lightbox__zone--prev {
	left: 0;
	cursor: w-resize;
}
.kb-lightbox__zone--next {
	right: 0;
	cursor: e-resize;
}

.kb-lightbox__img {
	display: block;
	max-width: 100%;
	max-height: calc(100vh - 220px);
	max-height: calc(100dvh - 220px);
	object-fit: contain;
	border-radius: 0;
	border: 0;
	box-shadow: none;
	user-select: none;
	-webkit-user-drag: none;
	touch-action: pan-y pinch-zoom;
	pointer-events: none;
}

/* Legacy bottom progress — приховано; прогрес лише на білій рамці play */
.kb-lightbox__progress {
	display: none !important;
}
.kb-lightbox__progress-fill {
	display: none !important;
}

.kb-lightbox__caption {
	color: #f4f6ec;
	font-size: 1rem;
	font-weight: 600;
	line-height: 1.4;
	text-align: center;
	max-width: 760px;
	padding: 0 16px;
	text-shadow: 0 2px 6px rgba(0,0,0,0.4);
}

.kb-lightbox__btn {
	position: absolute;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 52px;
	height: 52px;
	border: 0;
	border-radius: 50%;
	background: rgba(255, 255, 255, 0.14);
	color: #fff;
	font-size: 32px;
	line-height: 1;
	cursor: pointer;
	transition: background 0.2s ease, transform 0.2s ease;
	backdrop-filter: blur(10px);
	-webkit-backdrop-filter: blur(10px);
	z-index: 5;
}
.kb-lightbox__btn:hover,
.kb-lightbox__btn:focus-visible {
	background: rgba(255, 255, 255, 0.26);
	transform: scale(1.08);
	outline: 2px solid var(--kb-lime-btn);
	outline-offset: 3px;
}
.kb-lightbox__btn--close {
	top: 20px;
	right: 20px;
	font-size: 28px;
}
.kb-lightbox__btn--prev {
	left: clamp(12px, 3vw, 48px);
	top: 50%;
	transform: translateY(-50%);
}
.kb-lightbox__btn--prev:hover,
.kb-lightbox__btn--prev:focus-visible {
	transform: translateY(-50%) scale(1.08);
}
.kb-lightbox__btn--next {
	right: clamp(12px, 3vw, 48px);
	top: 50%;
	transform: translateY(-50%);
}
.kb-lightbox__btn--next:hover,
.kb-lightbox__btn--next:focus-visible {
	transform: translateY(-50%) scale(1.08);
}

.kb-lightbox__bar {
	position: absolute;
	left: 50%;
	bottom: clamp(16px, 3vh, 36px);
	transform: translateX(-50%);
	display: flex;
	align-items: center;
	gap: 18px;
	padding: 10px 18px;
	background: rgba(255, 255, 255, 0.14);
	border-radius: 999px;
	backdrop-filter: blur(10px);
	-webkit-backdrop-filter: blur(10px);
	z-index: 5;
}
.kb-lightbox__counter {
	color: #fff;
	font-weight: 700;
	font-size: 0.95rem;
	font-variant-numeric: tabular-nums;
	min-width: 60px;
	text-align: center;
}
/* Play/pause: біла рамка; зелений прогрес fill під час play; пауза — лише біла */
.kb-lightbox__play {
	position: relative;
	border: 0;
	background: var(--kb-lime-btn);
	color: var(--kb-ink);
	width: 48px;
	height: 48px;
	min-width: 48px;
	min-height: 48px;
	border-radius: 50%;
	font-size: 14px;
	cursor: pointer;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	box-shadow: none;
	transition: background 0.2s ease, transform 0.2s ease;
	overflow: visible;
	z-index: 6;
}
.kb-lightbox__play-icon {
	position: relative;
	z-index: 1;
	line-height: 1;
}
.kb-lightbox__play-ring {
	position: absolute;
	inset: -5px;
	width: calc(100% + 10px);
	height: calc(100% + 10px);
	pointer-events: none;
	transform: rotate(-90deg);
}
.kb-lightbox__play-ring-track {
	fill: none;
	stroke: #ffffff;
	stroke-width: 3;
}
.kb-lightbox__play-ring-fill {
	fill: none;
	stroke: #7cb342;
	stroke-width: 3.5;
	stroke-linecap: round;
	stroke-dasharray: 113.1;
	stroke-dashoffset: 113.1;
	opacity: 0;
}
.kb-lightbox__play.is-playing .kb-lightbox__play-ring-fill {
	opacity: 1;
	animation: kb-lb-ring-fill var(--kb-lb-autoplay-ms, 4000ms) linear forwards;
}
.kb-lightbox__play.is-paused .kb-lightbox__play-ring-fill,
.kb-lightbox__play:not(.is-playing) .kb-lightbox__play-ring-fill {
	opacity: 0;
	animation: none;
	stroke-dashoffset: 113.1;
}
@keyframes kb-lb-ring-fill {
	from { stroke-dashoffset: 113.1; }
	to   { stroke-dashoffset: 0; }
}
.kb-lightbox__play:hover,
.kb-lightbox__play:focus-visible {
	background: var(--kb-lime-btn-hover);
	transform: scale(1.06);
	outline: 2px solid #fff;
	outline-offset: 4px;
}

@media (max-width: 640px) {
	.kb-lightbox__btn {
		width: var(--kb-touch);
		height: var(--kb-touch);
		min-width: var(--kb-touch);
		min-height: var(--kb-touch);
		font-size: 24px;
	}
	.kb-lightbox__btn--close { top: 12px; right: 12px; }
}

@media (prefers-reduced-motion: reduce) {
	.kb-lightbox,
	.kb-lightbox__stage,
	.kb-lightbox__btn {
		transition: none;
		animation: none;
	}
	.kb-lightbox__play-ring-fill {
		display: none !important;
		animation: none !important;
	}
}

} /* /@layer lightbox */

@layer motion {
/* ======================================================================
   0.3.5 — Wow layer + anim gates (Shell toggles / prefers-reduced-motion)
   ====================================================================== */

/* Title gradient / pattern hover — лише body.kb-anim-titles */
body.kb-anim-titles .kb-title-wow {
	color: var(--kb-ink);
	-webkit-text-fill-color: currentColor;
	background-image: none;
	transition: color 0.2s ease;
}
body[data-kb-title-fx="spray"] .kb-title-wow,
body[data-kb-title-fx="spray-lens"] .kb-title-wow {
	background-position: 0% 50%;
	transition: none;
}
body[data-kb-title-fx="spray"] .kb-title-wow[data-kb-state="hot"],
body[data-kb-title-fx="spray-lens"] .kb-title-wow[data-kb-state="hot"] {
	background-position: var(--mx, 50%) 50%;
}
body.kb-anim-titles .kb-title-wow[data-kb-split="1"] {
	background: none;
	color: var(--kb-ink);
	-webkit-text-fill-color: currentColor;
	transform: none;
}
.kb-word {
	display: inline-block;
	white-space: nowrap;
}
body.kb-anim-titles .kb-letter {
	display: inline-block;
	background-image:
		linear-gradient(90deg, transparent 0%, transparent 22%, var(--kb-orange-btn) 44%, #f5b800 50%, var(--kb-orange-btn) 56%, transparent 78%, transparent 100%),
		linear-gradient(var(--kb-ink), var(--kb-ink));
	background-size: 112px 100%, 100% 100%;
	background-repeat: no-repeat;
	background-position: var(--band, -400px) 50%, 0 0;
	-webkit-background-clip: text;
	background-clip: text;
	color: transparent;
	-webkit-text-fill-color: transparent;
	transform: translate(var(--lx, 0px), var(--ly, 0px)) rotate(var(--lr, 0deg));
	transition: transform 0.16s cubic-bezier(.2, .8, .2, 1);
}
body[data-kb-title-fx="lens"] .kb-letter {
	background-image: none;
	color: var(--kb-ink);
	-webkit-text-fill-color: currentColor;
	transform: translate(var(--lx, 0px), var(--ly, 0px)) rotate(var(--lr, 0deg)) scale(calc(1 + var(--ink, 0) * 0.18));
}
body[data-kb-title-fx="spray-lens"] .kb-letter {
	transform: translate(var(--lx, 0px), var(--ly, 0px)) rotate(var(--lr, 0deg)) scale(calc(1 + var(--ink, 0) * 0.1));
}
.kb-tag {
	cursor: default;
}
.kb-tag.is-live {
	animation: kb-tag-idle 7s ease-in-out infinite;
	animation-delay: calc(var(--tag-i, 0) * 0.35s);
}
@keyframes kb-tag-idle {
	0%, 100% { transform: translateY(0); }
	50% { transform: translateY(-3px); }
}
.kb-tag[data-kb-state="hot"] {
	transform: rotate(calc((var(--mx, 50%) - 50%) * 0.08deg));
}
.kb-micro { display: inline-block; transform-origin: center; animation: kb-micro-idle 2.8s ease-in-out infinite; }
@keyframes kb-micro-idle {
	0%, 100% { transform: scale(1); }
	50% { transform: scale(1.04); }
}
.kb-micro[data-kb-micro="kazka"] { animation: kb-micro-kazka 0.9s ease-in-out infinite; }
@keyframes kb-micro-kazka {
	0%, 100% { transform: scale(1); filter: drop-shadow(0 0 0 transparent); }
	50% { transform: scale(1.08); filter: drop-shadow(0 0 6px rgba(255, 200, 40, 0.55)); }
}
.kb-micro[data-kb-micro="disney"] { animation: kb-micro-disney 0.7s ease-in-out infinite; }
@keyframes kb-micro-disney {
	0%, 100% { transform: scaleX(1) scaleY(1); }
	40% { transform: scaleX(1.1) scaleY(0.92); }
	70% { transform: scaleX(0.94) scaleY(1.08); }
}
.kb-micro[data-kb-micro="comic"] { animation: none; transform: rotate(-3deg); filter: drop-shadow(1px 1px 0 rgba(15, 20, 12, 0.35)); }
.kb-micro[data-kb-micro="cover"] { animation: none; transform: rotateY(calc((var(--mx, 50%) - 50%) * 0.35deg)) translateY(-2px); }
.kb-micro[data-kb-micro="pop"] { animation: none; transform: translateY(-3px) rotate(calc((var(--mx, 50%) - 50%) * 0.12deg)); }
.kb-partners__logo[data-kb-state="hot"],
.kb-hero-partner[data-kb-state="hot"] {
	transform: rotate(calc((var(--mx, 50%) - 50%) * 0.06deg)) translateY(-2px);
}
/* Brush is Figma raster/SVG asset — no opacity pulse (reads as AI shimmer). */
.kb-chapter-pill--cyan.is-live { box-shadow: 0 0 0 0 rgba(84, 197, 248, 0.45); animation: kb-pill-pulse 2.8s ease-out infinite; }
@keyframes kb-pill-pulse {
	70% { box-shadow: 0 0 0 10px transparent; }
}
/* Partners strip SoT (Figma Group 59490 ≈105 tall) — do not silently override
   @layer partners with stats-banner 98px. Stats knockout stays below. */
.kb-partners .kb-partner-img.kb-partner-img--knockout {
	mix-blend-mode: multiply;
	height: var(--kb-logo-h, max(52px, calc(60 * var(--kb-px))));
	max-height: var(--kb-logo-h, max(52px, calc(60 * var(--kb-px))));
	width: auto;
}
.kb-lime-partner-logo.kb-partner-img--knockout {
	mix-blend-mode: multiply;
	height: var(--kb-logo-h, max(52px, calc(60 * var(--kb-px))));
	max-height: var(--kb-logo-h, max(52px, calc(60 * var(--kb-px))));
	width: auto;
}
/* Safari / без clip: text — звичайний ink (не прозорий «невидимий» текст) */
@supports not ((-webkit-background-clip: text) or (background-clip: text)) {
	body.kb-anim-titles .kb-title-wow,
	body.kb-anim-titles .kb-title-wow:hover,
	body.kb-anim-titles .kb-title-wow:focus-visible {
		background-image: none;
		color: var(--kb-ink);
		-webkit-text-fill-color: currentColor;
	}
}
body.kb-anim-titles-off .kb-title-wow,
body:not(.kb-anim-titles) .kb-title-wow {
	background-image: none !important;
	background: none;
	-webkit-background-clip: border-box;
	background-clip: border-box;
	color: var(--kb-ink);
	-webkit-text-fill-color: currentColor;
}

/* SVG arrows — STATIC only (no draw/wiggle). Color set in SVG markup #FF8126. */
.kb-doodle-arrow,
.kb-map-arrow,
.kb-about__arrow {
	display: inline-block;
	max-width: 100%;
	height: auto;
}

/* Gallery sequential entrance */
body.kb-anim-gallery-entrance .kb-gallery__item {
	opacity: 0;
	transform: translateY(28px) scale(0.97);
	transition: opacity 0.55s cubic-bezier(.2,.7,.2,1), transform 0.55s cubic-bezier(.2,.7,.2,1);
}
body.kb-anim-gallery-entrance .kb-gallery__item.is-in {
	opacity: 1;
	transform: none;
}
body.kb-anim-gallery-entrance-off .kb-gallery__item {
	opacity: 1;
	transform: none;
}

/* Button micro-motion */
body.kb-anim-buttons .kb-btn {
	transition: transform 0.15s ease, background-color 0.15s ease, color 0.15s ease, box-shadow 0.15s ease;
}
body.kb-anim-buttons .kb-btn[data-kb-state="hot"] {
	transform: translate(calc((var(--mx, 50%) - 50%) * 0.08px), calc((var(--my, 50%) - 50%) * 0.08px));
}
body.kb-anim-buttons-off .kb-btn:hover {
	transform: none;
}

/* 0.8.68 — hard ink stroke SoT (matches badge #0f140c). The prior
   rgba(…,0.12) override made the join border invisible — owner rage. */
.kb-join-cta-panel,
.kb-map-white-card {
	border: 1.5px solid #0f140c;
}
/* 0.8.71 — UNLAYERED map mob arrow SoT. Owner: left:-50% (90px clipped after
   0.8.70 gutters). Must stay unlayered vs display:inline-block. Join untouched. */
@media (max-width: 899px) {
	.kb-map-arrow,
	.kb-map-arrow.kb-figma-arrow {
		position: relative;
		left: -50%;
		top: -21px;
		display: block;
		width: min(120px, 34vw);
		transform: scaleX(-1) rotate(131deg);
		transform-origin: center center;
		margin: 4px 4px 12px auto;
	}
}
.kb-method-card__note {
	font-size: 0.8rem;
	color: var(--kb-ink-soft);
	/* 0.8.65 SoT — pin footnotes (do NOT use margin shorthand; it killed margin-top:auto) */
	margin-top: auto;
	margin-bottom: 0;
}

/* Progress CTA — Figma hard shadow only on orange CTA */


/* Hard-off: prefers-reduced-motion overrides ALL wow */
@media (prefers-reduced-motion: reduce) {
	body.kb-anim-titles .kb-title-wow,
	body.kb-anim-titles .kb-title-wow:hover {
		background-image: none !important;
		background: none !important;
		-webkit-background-clip: border-box !important;
		background-clip: border-box !important;
		color: var(--kb-ink) !important;
		-webkit-text-fill-color: currentColor !important;
		transition: none !important;
	}
	body.kb-anim-arrows .kb-arrow-anim,
	body.kb-anim-arrows .kb-doodle-arrow,
	body.kb-anim-arrows .kb-about__arrow,
	body.kb-anim-arrows .kb-map-arrow,
	body.kb-anim-arrows .kb-arrow-path,
	body.kb-anim-arrows .kb-about__arrow-path {
		animation: none !important;
		transition: none !important;
		transform: none !important;
		stroke-dashoffset: 0 !important;
	}
	/* Keep 0.8.69 map layout transform (not motion). Owner tip-into-map SoT. */
	@media (max-width: 899px) {
		body.kb-anim-arrows .kb-map-arrow,
		body.kb-anim-arrows .kb-map-arrow.kb-figma-arrow {
			transform: scaleX(-1) rotate(131deg) !important;
		}
	}
	body.kb-anim-arrows .kb-join-cta__arrow,
	body.kb-anim-arrows .kb-join-cta__arrow.kb-figma-arrow {
		transform: rotate(-128.81deg) !important;
	}
	body.kb-anim-arrows .kb-doodle-arrow.kb-about__arrow--media,
	body.kb-anim-arrows .kb-doodle-arrow--2.kb-about__arrow--media {
		transform: none !important;
	}
	@media (max-width: 899px) {
		body.kb-anim-arrows .kb-doodle-arrow.kb-about__arrow--media,
		body.kb-anim-arrows .kb-doodle-arrow--2.kb-about__arrow--media {
			transform: rotate(-28deg) !important;
		}
	}
	body.kb-anim-gallery-entrance .kb-gallery__item {
		opacity: 1 !important;
		transform: none !important;
		transition: none !important;
	}
	body.kb-anim-gallery-parallax .kb-gallery__card:hover .kb-gallery__num,
	body.kb-anim-gallery-parallax .kb-gallery__card:hover .kb-gallery__peek {
		transform: none !important;
	}
	body.kb-anim-buttons .kb-btn:hover,
	body.kb-anim-buttons .kb-btn:hover svg:last-child {
		transform: none !important;
	}
	.kb-gallery__frame {
		transform: none !important;
	}
}

/* ======================================================================
   0.5.0 — 8-bit book cursors (pointer:fine only) + gallery admin override
   ====================================================================== */
@media (hover: hover) and (pointer: fine) {
	.kb-btn,
	.kb-site-header__cta,
	.kb-footer-cta {
		cursor: url("../cursors/book-pointer.png") 2 2, pointer;
	}
	.kb-gallery__card,
	.kb-lightbox__media,
	.kb-lightbox__img {
		cursor: var(--kb-gallery-hover-cursor, url("../cursors/book-zoom.png") 6 6, zoom-in);
	}
	.kb-section-root[data-kb-cursor="off"] .kb-gallery__card {
		cursor: auto;
	}
	.kb-lightbox__btn--prev {
		cursor: url("../cursors/book-arrow-w.png") 6 6, w-resize;
	}
	.kb-lightbox__btn--next {
		cursor: url("../cursors/book-arrow-e.png") 6 6, e-resize;
	}
	.kb-lightbox__btn--close,
	.kb-lightbox__backdrop {
		cursor: url("../cursors/book-resize-minus.png") 6 6, zoom-out;
	}
	.kb-lightbox__play {
		cursor: url("../cursors/book-play.png") 4 4, pointer;
	}
	.kb-map__dot {
		cursor: url("../cursors/book-grab.png") 6 6, pointer;
	}
	a[target="_blank"].kb-btn,
	.kb-method-card a[target="_blank"] {
		cursor: url("../cursors/book-external.png") 4 4, pointer;
	}
}

/* arrow wiggle removed */

} /* /@layer motion */

@layer responsive-scale {
/* ======================================================================
   0.6.1 — per-section style (plain typography) + card depth + gallery cols
   ====================================================================== */
.kb-section-root {
	--kb-sec-title-scale: 1;
	--kb-sec-text-scale: 1;
	--kb-sec-title-weight: 700; /* Figma Montserrat Bold */
	--kb-sec-tracking: 0;
}
.kb-section-root .kb-section__heading,
.kb-section-root .kb-hero__title,
.kb-section-root .kb-about__title,
.kb-section-root .kb-gallery__title,
.kb-section-root .kb-join-cta__title,
.kb-section-root .kb-map__title,
.kb-section-root .kb-partners__title,
.kb-section-root .kb-timeline__title,
.kb-section-root .kb-lime-card__title,
.kb-section-root .kb-progress-number {
	color: var(--kb-sec-title-color, var(--kb-ink));
	font-weight: var(--kb-sec-title-weight);
	letter-spacing: var(--kb-sec-tracking);
}
/* Studio scale multiplies Figma SoT tokens — never re-clamp below design sizes. */
.kb-section-root .kb-section__heading,
.kb-section-root .kb-gallery__title,
.kb-section-root .kb-join-cta__title,
.kb-section-root .kb-map__title,
.kb-section-root .kb-partners__title,
.kb-section-root .kb-timeline__title {
	font-size: calc(var(--kb-type-section) * var(--kb-sec-title-scale));
}
.kb-section-root .kb-hero__title {
	/* 4256:577 Bold 80 / LH 100% / tracking 0 — vh-scale only */
	font-size: calc(var(--kb-type-display) * var(--kb-sec-title-scale) * var(--kb-hero-vh-scale, 1));
	font-weight: 700;
	letter-spacing: var(--kb-sec-tracking-hero, 0);
}
.kb-section-root .kb-about__title {
	font-size: calc(var(--kb-type-section) * var(--kb-sec-title-scale));
}
.kb-section-root .kb-about__row--first .kb-about__title,
.kb-section-root .kb-about__row--mid .kb-about__title {
	font-size: calc(max(30px, calc(64 * var(--kb-px))) * var(--kb-sec-title-scale));
}
/* About reverse H2 — owner PP 0.8.25: 52 Figma-px (was 64). */
.kb-section-root .kb-about__row--reverse .kb-about__title {
	font-size: calc(max(28px, calc(52 * var(--kb-px))) * var(--kb-sec-title-scale));
}
.kb-section-root .kb-lime-card__title {
	font-size: calc(var(--kb-type-section-lg) * var(--kb-sec-title-scale));
}
.kb-section-root .kb-timeline__title {
	font-size: calc(var(--kb-type-section) * var(--kb-sec-title-scale));
}
.kb-section-root .kb-progress-number {
	font-size: calc(var(--kb-type-progress) * var(--kb-sec-title-scale));
}
.kb-section-root .kb-method-card__title {
	font-size: calc(var(--kb-type-method) * var(--kb-sec-title-scale));
}
.kb-section-root .kb-hero__subtitle {
	/* 4256:578 Medium 30 ink — not washed soft */
	color: var(--kb-sec-text-color, var(--kb-ink));
	font-size: calc(var(--kb-type-lead) * var(--kb-sec-text-scale));
	font-weight: 500;
}
.kb-section-root .kb-lime-card__subtitle,
.kb-section-root .kb-map__lead {
	color: var(--kb-sec-text-color, var(--kb-ink-soft));
	font-size: calc(var(--kb-type-lead) * var(--kb-sec-text-scale));
}
.kb-section-root .kb-hero__note {
	/* 4256:579 Regular 22 — not body 18 */
	color: var(--kb-sec-text-color, var(--kb-ink-soft));
	font-size: calc(var(--kb-type-note) * var(--kb-sec-text-scale));
	font-weight: 400;
}
.kb-section-root .kb-map__text,
.kb-section-root .kb-partners__lead,
.kb-section-root .kb-timeline__note,
.kb-section-root .kb-lime-card__body,
.kb-section-root .kb-method-card__text,
.kb-section-root .kb-progress-label,
.kb-section-root .kb-progress-update-note,
.kb-section-root .kb-gallery__caption {
	color: var(--kb-sec-text-color, var(--kb-ink-soft));
	font-size: calc(var(--kb-type-body) * var(--kb-sec-text-scale));
}
/* about body color/size: SoT in About blocks section (ink, not washed) */
.kb-section-root .kb-progress-label {
	font-size: calc(var(--kb-type-progress-lbl) * var(--kb-sec-text-scale));
}

/* Card depth via CSS shadow — no 3D photo assets */
.kb-section-root[data-kb-card-depth="soft"] .kb-hero-card,
.kb-section-root[data-kb-card-depth="soft"] .kb-giant-lime-card,
.kb-section-root[data-kb-card-depth="soft"] .kb-join-cta-panel,
.kb-section-root[data-kb-card-depth="soft"] .kb-progress-card,
.kb-section-root[data-kb-card-depth="soft"] .kb-map-white-card,
.kb-section-root[data-kb-card-depth="soft"] .kb-timeline-card,
.kb-section-root[data-kb-card-depth="soft"] .kb-method-card,
.kb-section-root[data-kb-card-depth="soft"] .kb-gallery__card {
	box-shadow: var(--kb-shadow-card);
}
.kb-section-root[data-kb-card-depth="lift"] .kb-hero-card,
.kb-section-root[data-kb-card-depth="lift"] .kb-giant-lime-card,
.kb-section-root[data-kb-card-depth="lift"] .kb-join-cta-panel,
.kb-section-root[data-kb-card-depth="lift"] .kb-progress-card,
.kb-section-root[data-kb-card-depth="lift"] .kb-map-white-card,
.kb-section-root[data-kb-card-depth="lift"] .kb-timeline-card,
.kb-section-root[data-kb-card-depth="lift"] .kb-method-card,
.kb-section-root[data-kb-card-depth="lift"] .kb-gallery__card {
	box-shadow: 0 18px 48px rgba(15, 20, 12, 0.12), 0 4px 12px rgba(15, 20, 12, 0.06);
	transform: translateZ(0);
}
.kb-section-root[data-kb-card-depth="none"] .kb-hero-card,
.kb-section-root[data-kb-card-depth="none"] .kb-giant-lime-card,
.kb-section-root[data-kb-card-depth="none"] .kb-join-cta-panel,
.kb-section-root[data-kb-card-depth="none"] .kb-progress-card,
.kb-section-root[data-kb-card-depth="none"] .kb-map-white-card,
.kb-section-root[data-kb-card-depth="none"] .kb-timeline-card,
.kb-section-root[data-kb-card-depth="none"] .kb-method-card,
.kb-section-root[data-kb-card-depth="none"] .kb-gallery__card {
	box-shadow: none;
}

.kb-gallery__grid--cols-2 {
	grid-template-columns: repeat(2, minmax(0, 1fr));
}
.kb-gallery__card[data-kb-depth="none"] .kb-gallery__img {
	--photo-shift: 0%;
}

body[data-kb-title-fx="none"] .kb-title-wow {
	background: none !important;
	-webkit-background-clip: border-box !important;
	background-clip: border-box !important;
	color: var(--kb-ink) !important;
	-webkit-text-fill-color: currentColor !important;
}

@media (max-width: 839px) {
	.kb-gallery {
		padding-block: clamp(28px, 6vw, 48px);
		overflow: visible;
	}
	/* Mobile SoT: always 2 columns (do not collapse to 1fr under 539) */
	.kb-gallery__grid,
	.kb-gallery__grid--cols-2,
	.kb-gallery__grid--cols-3 {
		grid-template-columns: repeat(2, minmax(0, 1fr));
		gap: clamp(10px, 2.8vw, 16px);
	}
	.kb-gallery__frame {
		border-radius: 16px;
		clip-path: inset(0 round 16px);
	}
	.kb-gallery__card {
		border-radius: 16px;
		min-height: 0;
	}
	.kb-gallery__card:focus-visible .kb-gallery__frame {
		outline-offset: 2px;
	}
	/* Tags/pills: shrink-to-content — never stretch full column on stacked grids */
	.kb-eyebrow,
	.kb-about .kb-eyebrow,
	.kb-about__eyebrow,
	.kb-pill-badge,
	.kb-map-content .kb-pill-badge,
	.kb-partners .kb-pill-badge,
	.kb-timeline .kb-pill-badge {
		display: inline-flex;
		width: max-content;
		max-width: min(100%, 34ch);
		justify-self: start;
		align-self: flex-start;
		box-sizing: border-box;
	}
	.kb-about__row-inner > .kb-eyebrow,
	.kb-about__row-inner > .kb-about__eyebrow {
		grid-column: 1 / -1;
		justify-self: start;
		width: max-content;
		max-width: min(100%, 34ch);
	}
	.kb-about__body,
	.kb-section-root .kb-about .kb-about__body {
		font-size: max(16px, calc(17 * var(--kb-px)));
		line-height: 1.55;
	}
	.kb-about__title {
		font-size: clamp(1.35rem, 6.2vw, 1.75rem);
		line-height: 1.08;
	}
	.kb-about__row--mid .kb-about__media--card,
	.kb-about__row--reverse .kb-about__media--card {
		height: auto;
		aspect-ratio: 708 / 447;
		padding: 0;
		box-shadow: none;
		border-radius: max(20px, calc(28 * var(--kb-px)));
	}
	.kb-about__row--mid .kb-about__img,
	.kb-about__row--reverse .kb-about__img {
		width: 100%;
		height: 100%;
		max-height: none;
		object-fit: contain;
		border-radius: 0;
	}
	/* 0.8.70 — Material touch 48 (was 44) */
	.kb-map__dot {
		width: var(--kb-touch);
		height: var(--kb-touch);
		min-width: var(--kb-touch);
		min-height: var(--kb-touch);
	}
	.kb-map__dot-core {
		margin: 16px auto;
	}
	.kb-map__dot--primary .kb-map__dot-core {
		margin: 14px auto;
	}
	.kb-map-white-card {
		max-width: 100%;
		min-height: 0;
		padding: 12px;
		box-shadow: none;
	}
	.kb-map-stage,
	.kb-map__img {
		max-width: min(100%, 438px);
		width: 100%;
		height: auto;
	}
	.kb-hero__subtitle,
	.kb-hero__note,
	.kb-map__lead,
	.kb-map__text,
	.kb-method-card__text,
	.kb-partners__lead {
		font-size: max(16px, 1rem);
		line-height: 1.5;
	}
	.kb-method-card__num {
		font-size: max(32px, calc(48 * var(--kb-px)));
	}
	.kb-method-card__label {
		font-size: clamp(1.15rem, 5vw, 1.35rem);
		line-height: 1.2;
	}
	.kb-method-card {
		overflow: visible;
		padding: var(--kb-card-pad);
	}
	.kb-method-card__title {
		line-height: 1.15;
		overflow: visible;
	}
	.kb-join-cta-badge {
		max-width: min(100%, calc(100vw - 2 * var(--kb-edge) - 24px));
		width: max-content;
		white-space: normal;
		text-align: center;
		padding: 12px 18px;
		font-size: max(13px, calc(16 * var(--kb-px)));
		line-height: 1.25;
		box-sizing: border-box;
	}
	.kb-join-cta__title {
		max-width: min(100%, 28ch);
	}
	.kb-gallery-header {
		gap: 6px;
		padding-inline: 12px;
		margin-bottom: clamp(16px, 4vw, 28px);
		overflow: visible;
	}
	.kb-gallery__title {
		max-width: min(16ch, 70vw);
		font-size: clamp(1.15rem, 5.2vw, 1.55rem);
		line-height: 1.15;
		text-align: center;
	}
	.kb-sparkle {
		width: min(28px, 7.5vw);
		height: auto;
		flex-shrink: 0;
	}
	.kb-join-cta__grid {
		grid-template-columns: 1fr;
		gap: 20px;
	}
	.kb-join-cta .kb-btn,
	.kb-join-cta-panel .kb-btn {
		width: 100%;
		justify-content: center;
	}
	.kb-map-grid {
		grid-template-columns: 1fr;
		gap: 20px;
	}
	.kb-map__text {
		max-width: none;
	}
	.kb-map__dot-label {
		font-size: max(12px, 0.75rem);
	}
	.kb-about__col--head,
	.kb-about__col--copy,
	.kb-about__col--body {
		align-items: flex-start;
	}
	/* Owner request 2026-10-07: center "Про проєкт / Що таке Книгозбір?" (tag +
	   title + arrow, row--first) and "Книгозбір 1.0 / Як усе починалося" (tag +
	   title, row--mid) once columns stack to one-per-row on mobile — desktop's
	   asymmetric left-aligned layout only reads right side-by-side with media. */
	.kb-about__row--first .kb-about__col--head {
		align-items: center;
		text-align: center;
	}
	.kb-about__row--mid > .kb-about__row-inner > .kb-eyebrow,
	.kb-about__row--mid > .kb-about__row-inner > .kb-about__eyebrow {
		justify-self: center;
	}
	.kb-about__row--mid .kb-about__col--copy .kb-about__title {
		text-align: center;
		margin-inline: auto;
	}
	/* Inter-row rhythm only — last row must not stack 8vw + section pads
	   into a dead mint gap before the lime stats card (owner @390). */
	.kb-about__row:not(:last-of-type) {
		margin-bottom: clamp(28px, 8vw, 48px);
		gap: 16px;
	}
	.kb-about__row:last-of-type {
		margin-bottom: 0;
		gap: 16px;
	}
	/* about→stats: leave room for enlarged mid-row media arrow tip (0.8.65) */
	.kb-about.kb-section {
		padding-top: 16px;
		padding-bottom: max(28px, 8vw);
		overflow: visible;
	}
	.kb-stats-banner-section.kb-section {
		padding-top: 12px;
		padding-bottom: 16px;
	}
	.kb-about__arrow--loop,
	.kb-doodle-arrow--1.kb-about__arrow--loop {
		width: min(100px, 32vw);
		margin-top: 4px;
	}
	.kb-about__arrow--media,
	.kb-doodle-arrow--2.kb-about__arrow--media {
		/* 0.8.72 — keep large (owner: enlarge / do not shrink); no scaleX */
		width: min(180px, 48vw);
		bottom: max(-28px, -7vw);
		right: max(-10px, -2.5vw);
		transform: rotate(-28deg);
		transform-origin: 70% 40%;
	}
	.kb-about__row--mid .kb-about__col--media {
		padding-bottom: max(36px, 10vw);
	}
	.kb-about__row--mid {
		overflow: visible;
		padding-bottom: max(8px, 2vw);
	}
	.kb-about__media {
		width: 100%;
		max-width: none;
	}
	.kb-method-card {
		padding: 24px var(--kb-card-pad);
	}
	.kb-join-cta-panel {
		padding: max(40px, 10vw) var(--kb-card-pad) 20px;
		overflow: visible;
	}
	.kb-join-cta-badge {
		left: 50%;
		right: auto;
		transform: translateX(-50%); /* match base rule: flush, no (-50%) Y overlap */
		max-width: calc(100% - 24px);
		width: max-content;
		box-sizing: border-box;
	}
	/* Mobile: flex+wrap so the arrow can drop to its own line if needed. The
	   base rule's ghost-spacer (::before) is for exact desktop balancing
	   only - at mobile the title already nearly fills the row, so the extra
	   spacer would just force an early wrap. Hidden here. */
	.kb-join-cta-header {
		display: flex;
		flex-wrap: wrap;
		justify-content: center;
		align-items: center;
		text-align: center;
		gap: 8px;
		/* 0.8.67 — equal tight air (was 5vw / too tall) */
		margin-top: max(10px, 2.5vw);
		margin-bottom: max(10px, 2.5vw);
	}
	.kb-join-cta-header::before {
		display: none;
	}
	/* Owner 2026-10-09: dead code - .kb-section-root .kb-join-cta__title (2
	   classes, unconditional) beat this bare 1-class selector on specificity
	   alone regardless of media query, so mobile never actually shrank below
	   the desktop Studio-scale size. Matching the ancestor prefix fixes it
	   (see the identical note on .kb-timeline__title above). */
	.kb-section-root .kb-join-cta__title {
		font-size: clamp(1.15rem, 4.8vw, 1.45rem);
		max-width: min(100%, 28ch);
		text-align: center;
		margin-inline: auto !important;
		line-height: 1.15;
	}
	/* Owner 2026-10-09: "стрілку... на моб можна зменшити в двічі" - halved. */
	.kb-join-cta__arrow,
	.kb-doodle-arrow.kb-join-cta__arrow {
		width: min(44px, 13vw);
	}
	.kb-progress-card {
		padding: 28px 16px 24px;
		gap: 12px;
		border-radius: var(--kb-radius-m);
		width: 100%;
		box-sizing: border-box;
	}
	/* Owner 2026-10-09: "лого зверху... можна трішки менше" - the 200px desktop
	   floor read too large on a narrow card; no mobile override existed. */
	.kb-brand-badge--progress,
	.kb-brand-badge--lime {
		width: max(150px, calc(260 * var(--kb-px)));
	}
	/* TODO: was font-size: clamp(2.4rem,12vw,3.6rem) ≈45px@375 — dead (beaten by
	   .kb-section-root .kb-progress-number's higher specificity at ~3601, which
	   floors at --kb-type-progress's 36px). Removed as unreachable dead code, not
	   because 36px is confirmed correct for mobile — if the Figma mobile number
	   is meant to be larger than the 36px floor, raise --kb-type-progress's floor
	   (line ~58) instead of re-adding a losing override here. */
	.kb-progress-actions {
		align-self: center;
		width: 100%;
		justify-content: center;
	}
	.kb-progress-actions .kb-btn {
		width: 100%;
		justify-content: center;
	}
	.kb-progress-bar-wrap {
		width: 100%;
	}
	.kb-partners-header {
		text-align: center;
		align-items: center;
	}
	.kb-partners__title {
		font-size: clamp(1.2rem, 5.2vw, 1.6rem);
		text-align: center;
	}
	.kb-partners__lead {
		text-align: center;
		max-width: 36ch;
		margin-inline: auto;
	}
	.kb-partners__logos {
		justify-content: center;
		flex-wrap: wrap;
		gap: 12px 20px;
	}
	.kb-timeline-card {
		padding: max(28px, 7vw) var(--kb-card-pad) max(20px, 5vw);
		gap: max(16px, 4vw);
		overflow: visible;
	}
	/* Owner 2026-10-09: this clamp() was dead code - .kb-section-root
	   .kb-timeline__title (2 classes, unconditional) beats a bare 1-class
	   selector on specificity alone within the same @layer, regardless of
	   media query, so mobile always rendered the Studio-scale desktop size
	   (floor 28px) instead of shrinking. Matching the ancestor prefix here
	   gives this rule equal specificity, so source order (this is later)
	   correctly wins inside the media query. */
	.kb-section-root .kb-timeline__title {
		font-size: clamp(1.1rem, 4.6vw, 1.4rem);
		line-height: 1.12 !important;
		text-align: center;
		max-width: 100%;
		overflow: visible;
		padding-inline: 4px;
	}
	.kb-timeline__title {
		max-width: 100%;
	}
	.kb-site-footer--figma .kb-site-footer__inner {
		flex-direction: column;
		align-items: center;
		text-align: center;
		gap: 20px;
	}
	.kb-footer-nav {
		flex: 0 1 auto;
		width: 100%;
	}
	.kb-footer-nav ul {
		gap: 10px 18px;
		justify-content: center;
	}
	/* Owner 2026-10-09: "кнопку покращити центрування відступи надписи" - the
	   CTA had no mobile treatment at all, sized to its own text (off-center-
	   looking in a centered column) with the same padding as desktop. */
	.kb-footer-cta-wrap {
		width: 100%;
	}
	/* Owner 2026-10-09: white-space:normal let a long Studio-configurable
	   label wrap to 2 lines (looked broken). Keep it one line and shrink the
	   font to fit instead - the label is admin text of unknown length, so a
	   fluid clamp() is safer than a fixed size guess. */
	.kb-footer-cta {
		width: 100%;
		max-width: 100%;
		justify-content: center;
		white-space: nowrap;
		/* Horizontal pad so long UA label clears pill ends (owner: «До…ру») */
		padding: 14px max(20px, 5.5vw);
		font-size: clamp(0.72rem, 3.1vw, 0.95rem);
		box-sizing: border-box;
		min-height: var(--kb-touch);
	}
	.kb-site-footer--figma .kb-footer-copy {
		font-size: clamp(0.65rem, 2.8vw, 0.78rem);
		line-height: 1.35;
		padding-inline: var(--kb-edge);
		box-sizing: border-box;
	}
}

@media (max-width: 767px) {
	/* Phone prose: full width of card; 2-word columns only for display titles */
	.kb-partners__lead,
	.kb-map__lead,
	.kb-map__text,
	.kb-method-card__text,
	.kb-timeline__note,
	.kb-about__body {
		max-width: 100%;
		text-wrap: pretty;
	}
	.kb-partners__lead {
		max-width: min(100%, 42ch);
	}
	.kb-join-cta-panel {
		padding: max(48px, 12vw) var(--kb-card-pad) var(--kb-card-pad);
	}
	.kb-method-card .kb-btn {
		padding: 14px 18px;
		min-height: var(--kb-touch);
		font-size: max(14px, 0.875rem);
	}
}
@media (max-width: 539px) {
	/* Gallery stays 2-col (owner mobile BP 0.8.31) — do not collapse to 1fr */
	.kb-gallery__grid,
	.kb-gallery__grid--cols-2,
	.kb-gallery__grid--cols-3 {
		grid-template-columns: repeat(2, minmax(0, 1fr));
		gap: 10px;
	}
	.kb-timeline-pills {
		flex-wrap: wrap;
		justify-content: center;
		gap: 8px;
	}
	.kb-about-stats {
		gap: 12px 16px;
	}
}

/* ======================================================================
   0.8.76 — narrow phone ≤511 (360 / 390 / 412 / 427 / 440 CSS-px class)
   Portrait devices: width << height (~844–956). Content was oversized vs
   card frames. Scale type + pads + rhythm down; keep --kb-edge ≥16,
   touch ≥44, map/join arrow SoTs untouched. ≥512 keeps 0.8.75 rules.
   ====================================================================== */
@media (max-width: 511px) {
	:root {
		--kb-hero-stack-gap: 8px;
		--kb-hero-cta-gap: 12px;
		--kb-card-pad: 14px;
		--kb-type-display: max(22px, calc(48 * var(--kb-px)));
		--kb-type-section: max(20px, calc(36 * var(--kb-px)));
		--kb-type-section-lg: max(22px, calc(40 * var(--kb-px)));
		--kb-type-method: max(18px, calc(30 * var(--kb-px)));
		--kb-type-method-num: max(28px, calc(44 * var(--kb-px)));
		--kb-type-lead: max(15px, calc(22 * var(--kb-px)));
		--kb-type-note: max(14px, calc(18 * var(--kb-px)));
		--kb-type-body: max(14px, calc(16 * var(--kb-px)));
		--kb-type-btn: max(14px, calc(18 * var(--kb-px)));
		--kb-type-progress: max(28px, calc(72 * var(--kb-px)));
		--kb-type-progress-lbl: max(16px, calc(28 * var(--kb-px)));
		--kb-type-stat: max(22px, calc(36 * var(--kb-px)));
	}

	/* —— Hero —— */
	.kb-hero-card {
		padding: 14px 14px 16px;
	}
	.kb-hero-partners {
		gap: 6px 8px;
		margin-bottom: 8px;
	}
	.kb-hero-partner-logo,
	.kb-hero-partner-logo--knyholand {
		max-height: min(var(--kb-logo-h, 16px), 16px);
	}
	.kb-hero-partner-logo--zone3000 {
		max-height: min(var(--kb-logo-h, 14px), 14px);
	}
	.kb-hero__title,
	.kb-section-root .kb-hero__title {
		font-size: clamp(1.2rem, 5.8vw, 1.5rem);
		line-height: 1.06;
		margin-bottom: 8px;
		letter-spacing: -0.02em;
	}
	.kb-hero__subtitle,
	.kb-section-root .kb-hero__subtitle {
		font-size: max(14px, 0.875rem);
		line-height: 1.4;
		margin-bottom: 8px;
	}
	.kb-hero__note,
	.kb-section-root .kb-hero__note {
		font-size: max(13px, 0.8125rem);
		line-height: 1.4;
		margin-bottom: 12px;
	}
	.kb-hero__cta-group {
		gap: 8px;
	}
	.kb-hero__cta-group .kb-btn {
		padding: 12px 14px;
		min-height: max(44px, var(--kb-touch));
		font-size: max(13px, 0.8125rem);
		gap: 8px;
	}
	.kb-brush-stroke {
		height: max(10px, calc(16 * var(--kb-px)));
		bottom: max(-6px, calc(-8 * var(--kb-px)));
	}

	/* —— Section titles (Studio-prefixed so they actually win) —— */
	.kb-section-root .kb-section__heading,
	.kb-section-root .kb-gallery__title,
	.kb-section-root .kb-map__title,
	.kb-section-root .kb-partners__title,
	.kb-section-root .kb-lime-card__title {
		font-size: clamp(1.05rem, 4.4vw, 1.3rem);
		line-height: 1.12;
	}
	.kb-section-root .kb-join-cta__title {
		font-size: clamp(1.05rem, 4.2vw, 1.25rem);
		max-width: min(100%, 26ch);
		line-height: 1.12;
	}
	.kb-section-root .kb-timeline__title {
		font-size: clamp(1rem, 4vw, 1.2rem);
		line-height: 1.14 !important;
	}
	.kb-section-root .kb-about__title,
	.kb-section-root .kb-about__row--first .kb-about__title,
	.kb-section-root .kb-about__row--mid .kb-about__title,
	.kb-section-root .kb-about__row--reverse .kb-about__title {
		font-size: clamp(1.15rem, 5vw, 1.4rem);
		line-height: 1.1;
	}
	.kb-gallery__title {
		max-width: min(18ch, 78vw);
		font-size: clamp(1.05rem, 4.4vw, 1.3rem);
	}

	/* —— About / body —— */
	.kb-about .kb-eyebrow {
		font-size: max(11px, 0.7rem);
		padding: 8px 14px;
	}
	.kb-section-root .kb-about .kb-about__body,
	.kb-about .kb-about__body {
		font-size: max(14px, 0.875rem);
		line-height: 1.5;
	}
	.kb-about__arrow--media,
	.kb-doodle-arrow--2.kb-about__arrow--media {
		width: min(140px, 42vw);
		bottom: max(-22px, -6vw);
		right: max(-8px, -2vw);
	}

	/* —— Join / methods —— */
	.kb-join-cta-badge {
		padding: 10px 14px;
		font-size: max(12px, 0.75rem);
		line-height: 1.2;
		max-width: min(100%, calc(100vw - 2 * var(--kb-edge) - 16px));
	}
	.kb-join-cta-panel {
		padding: max(40px, 11vw) 14px 16px;
	}
	.kb-join-cta-header {
		margin-top: 8px;
		margin-bottom: 8px;
		gap: 6px;
	}
	.kb-join-cta__arrow,
	.kb-doodle-arrow.kb-join-cta__arrow {
		width: min(36px, 11vw);
	}
	.kb-method-card {
		padding: 16px 14px;
		gap: 10px;
	}
	.kb-method-card__num {
		font-size: max(26px, calc(40 * var(--kb-px)));
	}
	.kb-method-card__label {
		font-size: clamp(1.05rem, 4.5vw, 1.2rem);
		line-height: 1.15;
	}
	.kb-method-card__text,
	.kb-section-root .kb-method-card__text {
		font-size: max(13px, 0.8125rem);
		line-height: 1.45;
	}
	.kb-method-card .kb-btn {
		padding: 12px 14px;
		min-height: max(44px, var(--kb-touch));
		font-size: max(13px, 0.8125rem);
	}
	.kb-bot-mock-card,
	.kb-qr-mock-card {
		padding: 12px;
	}

	/* —— Map / partners / timeline / progress —— */
	.kb-map__lead,
	.kb-map__text,
	.kb-partners__lead,
	.kb-timeline__note {
		font-size: max(13px, 0.8125rem);
		line-height: 1.45;
	}
	.kb-partners__lead {
		max-width: min(100%, 38ch);
	}
	.kb-timeline-card {
		padding: 20px 14px 16px;
		gap: 14px;
	}
	.kb-progress-card {
		padding: 20px 14px 18px;
		gap: 10px;
	}
	.kb-brand-badge--progress,
	.kb-brand-badge--lime {
		width: max(120px, calc(200 * var(--kb-px)));
	}
	.kb-section-root .kb-progress-number {
		font-size: clamp(1.6rem, 9vw, 2.2rem);
	}
	.kb-progress-actions .kb-btn {
		padding: 12px 14px;
		min-height: max(44px, var(--kb-touch));
		font-size: max(13px, 0.8125rem);
	}

	/* —— Footer —— */
	.kb-footer-cta {
		padding: 12px max(16px, 4.5vw);
		font-size: clamp(0.68rem, 2.9vw, 0.85rem);
		min-height: max(44px, var(--kb-touch));
	}
	.kb-site-footer--figma .kb-footer-copy {
		font-size: clamp(0.6rem, 2.6vw, 0.72rem);
		padding-inline: var(--kb-edge);
	}

	/* —— Vertical section air (short viewports ~900 CSS-px tall) —— */
	.kb-gallery {
		padding-block: clamp(20px, 5vw, 36px);
	}
	.kb-about.kb-section {
		padding-top: 12px;
		padding-bottom: max(20px, 6vw);
	}
	.kb-about__row:not(:last-of-type) {
		margin-bottom: clamp(20px, 6vw, 36px);
		gap: 12px;
	}
}

} /* /@layer responsive-scale */

@layer figma-px-system {
/* ======================================================================
   0.6.9 — Figma 1680 SoT + proportional fluid (--kb-px)
   0.6.11 — exact Figma type tokens (--kb-type-*); no clamp shrink below SoT
   Desktop ≥1920: exact 1680 card. Narrower viewports: same ratios via --kb-px.
   Mobile: existing stack breakpoints; floors on spaces/radii keep tap targets.
   NOTE: gallery cell ratio + progress absolute layout live in their component SoT
   blocks above — do NOT re-declare those selectors here (css-single-source-of-truth).
   ====================================================================== */
/* Hero padding owned by @layer hero (--kb-hero-pad-y); do not re-declare here. */
.kb-section:not(.kb-hero) {
	padding-block: max(28px, calc(48 * var(--kb-px)));
}
/* Hero CTA / partners sizing SoT is @layer hero (4256:580 / 4256:571) — do not re-declare here. */
/* White section cards that mirror Figma rounded frames (progress excluded — radius 80 SoT) */
.kb-gallery__rail,
.kb-about__card,
.kb-map-stage,
.kb-partners,
.kb-next-steps,
.kb-join-cta {
	border-radius: var(--kb-radius-card);
}
@media (max-width: 839px) {
	/* Mobile: don't force huge Figma radii — keep mid radius */
	.kb-gallery__rail,
	.kb-about__card,
	.kb-map-stage,
	.kb-partners,
	.kb-next-steps,
	.kb-join-cta,
	.kb-hero-card {
		border-radius: var(--kb-radius-m);
	}
}

} /* /@layer figma-px-system */

@layer content-visibility {
/* ======================================================================
   0.6.19 — below-fold content-visibility (after hero)
   ====================================================================== */
.kb-section-root[data-kb-section]:not([data-kb-section="hero"]) {
	content-visibility: auto;
	contain-intrinsic-size: 1px 720px;
}

} /* /@layer content-visibility */

@layer track-a-polish {
/* ======================================================================
   0.7.0 Track A — lower-section Figma rhythm + cross-browser polish
   SoT: card 1680, section pad ~64 Figma-px; about keeps denser internal rows.
   ====================================================================== */
.kb-map.kb-section,
.kb-partners,
.kb-timeline,
.kb-gallery,
.kb-progress {
	padding-block: clamp(36px, 4.5vw, 64px);
}
/* join-cta top pad SoT in @layer join-cta — keep badge clearance here too */
.kb-join-cta {
	padding-bottom: clamp(36px, 4.5vw, 64px);
	padding-top: clamp(72px, 9vw, 96px);
	overflow: visible;
}
@media (max-width: 767px) {
	/* Multi-line badge taller on phone — need more clearance above panel */
	.kb-join-cta {
		padding-top: clamp(100px, 30vw, 148px);
		padding-bottom: clamp(28px, 6vw, 48px);
	}
}
@media (max-width: 511px) {
	/* Narrow phone: badge type smaller → less top room than ≤767 */
	.kb-join-cta {
		padding-top: clamp(88px, 26vw, 120px);
		padding-bottom: clamp(24px, 5vw, 40px);
	}
}
/* stats-banner external pad SoT: @layer stats-banner (tighter mid-width rhythm) */
/* about padding SoT: About blocks section (single source) */
/* font-size/font-weight/letter-spacing SoT: @layer responsive-scale (~3565-3586,
   --kb-sec-title-scale/weight/tracking, Studio-admin-driven) — do not re-declare
   those 3 properties here, this @layer is declared LAST and would silently win
   over the admin controls regardless of selector specificity. line-height/
   text-transform have no Studio equivalent yet, stay here. */
.kb-map__title,
.kb-partners__title,
.kb-join-cta__title {
	line-height: 1.1;
	text-transform: uppercase;
}
/* Figma 4256:488 lineHeight 100% — keep SoT in @layer timeline; do not force 1.1 here */
.kb-timeline__title {
	line-height: 1;
	text-transform: uppercase;
}
@media (min-width: 900px) {
	/* join-cta-panel padding SoT: @layer join-cta (Figma title @60px — do not shrink here) */
	.kb-join-cta__grid {
		gap: max(18px, calc(24 * var(--kb-px)));
	}
	.kb-method-card {
		padding: max(36px, calc(44 * var(--kb-px))) max(28px, calc(40 * var(--kb-px)));
	}
	/* giant-lime / timeline card padding SoT: their component layers */
	.kb-partners__logos {
		gap: max(16px, calc(20 * var(--kb-px))) max(28px, calc(40 * var(--kb-px)));
	}
	/* Partner / lime logo heights SoT: @layer partners + stats-banner + motion.
	   Do NOT re-declare .kb-partner-img / .kb-lime-partner-logo max-height here —
	   this layer is last and would silently crush Figma 32/60/35 (CDP @1920:
	   partners ranok 48, stats all 36). */
}
.kb-timeline__note {
	font-size: var(--kb-type-body);
	max-width: 42ch;
	margin-inline: auto;
	text-align: center;
}
.kb-chapter-pill {
	font-size: max(13px, calc(15 * var(--kb-px)));
	padding: max(8px, calc(10 * var(--kb-px))) max(14px, calc(18 * var(--kb-px)));
}
/* Figma footer frames 4256:368+349 combined h≈221 */
.kb-site-footer--figma {
	padding-top: max(32px, calc(48 * var(--kb-px))) !important;
	padding-bottom: max(28px, calc(40 * var(--kb-px))) !important;
	min-height: max(160px, calc(221 * var(--kb-px)));
	box-sizing: border-box;
}
.kb-footer-copy {
	margin: 0;
	font-size: max(12px, calc(14 * var(--kb-px)));
	font-weight: 700;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	color: var(--kb-ink);
	text-align: center;
}
.kb-popup-overlay {
	-webkit-backdrop-filter: blur(4px);
	backdrop-filter: blur(4px);
}
.kb-site-header,
.kb-gallery__num {
	-webkit-backdrop-filter: blur(8px);
}
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
	.kb-site-header,
	.kb-popup-overlay,
	.kb-gallery__num {
		backdrop-filter: none;
		-webkit-backdrop-filter: none;
	}
	.kb-site-header {
		background: rgba(235, 242, 223, 0.97);
	}
	.kb-popup-overlay {
		background: rgba(15, 20, 12, 0.72);
	}
	.kb-gallery__num {
		background: rgba(235, 242, 223, 0.92);
	}
}
@media (hover: none) {
	body.kb-anim-gallery-parallax .kb-gallery__card:hover .kb-gallery__img,
	body.kb-anim-gallery-parallax .kb-gallery__card:hover .kb-gallery__num,
	body.kb-anim-gallery-parallax .kb-gallery__card:hover .kb-gallery__peek {
		transform: none;
	}
}



} /* /@layer track-a-polish */

