/*
Theme Name: 9Hz
Theme URI: https://9hz.hr
Author: 9Hz
Author URI: https://9hz.hr
Description: Block theme for 9Hz — architecture & interior design studio (Zagreb + Adriatic coast). Pages are assembled drag-and-drop from locked patterns; the visual style lives in code (theme.json + block styles).
Requires at least: 6.9
Tested up to: 7.0
Requires PHP: 8.2
Version: 0.7.86
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: 9hz
Tags: block-theme, full-site-editing, portfolio, custom-colors, custom-menu, block-patterns, translation-ready
*/

/*
 * Global-only CSS: a11y helpers + a few homepage layout pieces that aren't tied to a single
 * block (hero wordmark/collage overlap, giant footer logo). Design tokens live in theme.json.
 */

/* Text renders at the size we set it, on phones too.
   iOS Safari inflates text inside a block that is much wider than the viewport ("text autosizing"),
   and the marquee is exactly that shape: a nowrap track at `width: max-content`, several screens
   wide. On a real iPhone its 14px read as large as the 24px statement beside it (client report
   2026-09-08), while every desktop browser and emulator measured the authored 14px — the boost only
   happens on the device, which is why it never showed up in QA. Opting out pins every size on the
   site to what theme.json and the blocks set, i.e. to what the Figma frames are drawn at.
   Also switches off Android Chrome's font boosting, same mechanism. */
html {
	-webkit-text-size-adjust: 100%;
	text-size-adjust: 100%;
	/* Overscroll ("rubber band") colour. When a phone lets you drag past the end of the page, the
	   strip it exposes is painted with the CANVAS background, and the canvas takes its colour from
	   <html> — or, when <html> has none, from <body>, which theme.json paints white. That is why
	   dragging past the blush footer used to flash white. Setting it here makes the footer look like
	   it simply continues off the screen. Note this is one colour for BOTH ends of the document: the
	   canvas background covers the whole canvas, so the strip above the header is blush too. There
	   is no CSS way to give the two ends different colours — a fixed-attachment gradient would, but
	   iOS Safari treats background-attachment:fixed as scroll. Inside the page nothing changes:
	   <body> still paints its own white over the full document height. */
	background-color: var(--wp--preset--color--blush);
}

/* Visually-hidden (screen-reader) text */
.screen-reader-text {
	border: 0;
	clip: rect(1px, 1px, 1px, 1px);
	clip-path: inset(50%);
	height: 1px;
	width: 1px;
	margin: -1px;
	padding: 0;
	overflow: hidden;
	position: absolute !important;
	word-wrap: normal !important;
}

/* Hero — the whole hero zone (heading + scattered images) is one block (ninehz/hero-scatter);
   its own CSS (16:9 zone, wordmark layer, positioned images) handles the layout, so the editor and
   the front render the exact same arrangement. The section just provides the side gutter. */
.ninehz-hero {
	position: relative;
}

/* First fold = one viewport. The hero fills 100svh minus the sticky header and the marquee,
   so the blush marquee lands exactly at the bottom of the first screen (no scroll). Desktop
   only — mobile keeps its portrait hero (handled in the mobile pass).
   --ninehz-header-h/--ninehz-marquee-h are exact BY CONSTRUCTION, not rounded guesses: each is
   the same sum of terms that actually sizes the real element (padding + text line-height +
   border), so it can never quietly drift out of sync the way the old hand-picked round numbers
   (60px/58px) did — that rounding alone left the marquee ~1.4–1.9px short of the viewport bottom.
   If .ninehz-header's or .ninehz-marquee's own padding/line-height/border ever changes, update
   the matching term here too. The marquee's track must stay a block-level flex container
   (display:flex, not inline-flex) — otherwise the parent line-box strut inflates the band beyond
   the text line and the token drifts. */
:root {
	--ninehz-header-h: calc(2 * 1.25rem + 16px * 1.1 + 1px); /* .ninehz-header: 2×1.25rem padding + 16px/1.1 nav line + 1px border-bottom */
	--ninehz-marquee-h: calc(2 * 20px + 14px * 1.1);         /* .ninehz-marquee: 2×20px padding + 14px/1.1 text line (see src/blocks/marquee/style.scss) */
	--ninehz-adminbar-h: 0px;  /* 0 for real visitors; set to the WP admin-bar height when logged in */
}
/* Logged-in users get the 32px WP admin bar (desktop) which shifts content down; subtract it so the
   marquee stays flush at the viewport bottom in the editor/preview too. Real visitors keep 0. */
body.admin-bar {
	--ninehz-adminbar-h: 32px;
}
/* First-fold height, shared by both hero blocks: 100svh minus header + marquee so the blush marquee
   lands flush at the bottom of the first screen. Held in a custom property so the two media queries
   below reuse the same calc (no duplication). */
.ninehz-hero {
	--ninehz-firstfold-h: calc(100svh - var(--ninehz-header-h) - var(--ninehz-marquee-h) - var(--ninehz-adminbar-h));
}
/* Desktop hero sizing (container cap + width-drives-height via the authored ratio) lives in each
   block's own CSS now: ninehz/hero-scatter uses 1440/908, ninehz/space-collage uses 1440/1024. That
   applies to the Studio hero AND the mid-page homepage collage (not inside .ninehz-hero). Only the
   mobile first-fold override below is hero-specific. */
/* Mobile: same first-fold contract for the collage — subtract the header + marquee so the blush
   marquee lands flush at the bottom of the first screen (Studio opens with the collage). Reuses the
   --ninehz-firstfold-h calc; only the header/marquee heights differ from desktop (mobile header is
   taller — measured identical to the homepage's mobile header; the marquee is shorter and, like
   desktop, exact by construction: 2×10px padding + 14px/1.1 text line = 35.4px. The old 36px was a
   measurement inflated by the parent line-box strut, before the track became block-level flex). */
@media (max-width: 600px) {
	.ninehz-hero {
		--ninehz-header-h: 69px;
		--ninehz-marquee-h: calc(2 * 10px + 14px * 1.1);
	}
	.ninehz-hero .ninehz-collage__stage {
		height: calc(100vh - var(--ninehz-header-h) - var(--ninehz-marquee-h) - var(--ninehz-adminbar-h));  /* fallback */
		height: var(--ninehz-firstfold-h);
	}
}

/* First-fold flush (all widths). front-page.html zeroes post-content blockGap so the homepage hero
   sits flush under the header and the marquee lands exactly at the fold bottom. page.html (Studio et al.)
   keeps the default constrained block-gap (16px), which — via margin-collapse through the hero — offset
   the hero AND added a gap above the marquee, pushing it below the fold. Zero just those two, scoped to
   the .ninehz-hero first fold, so it behaves identically without changing spacing anywhere else. */
.ninehz-hero .ninehz-hero-scatter,
.ninehz-hero .wp-block-ninehz-space-collage,
.ninehz-hero + .ninehz-marquee {
	margin-block-start: 0;
}

/* Remove the root block-gap above <main> (hero flush under the header) and above the <footer> — the
   `:where(.wp-site-blocks) > *` gap otherwise leaves a stray ~16px band between the last section and
   the footer. The footer supplies its own top spacing. */
.wp-site-blocks > main,
.wp-site-blocks > footer {
	margin-block-start: 0;
}

/* Type scale — match Figma. Figma sets the 32px "Headline 2" heads as Bold (700) and the 126px
   display heads as Semibold (600). theme.json keeps all headings at 600 (right for the display
   heads); bump the x-large (32px) heads back to 700 so the press title, moodboard caption and
   footer CTA match. The display heads also carry a tighter -0.04em track in Figma. */
.wp-block-heading.has-x-large-font-size {
	font-weight: 700;
}
/* Display heads (ultra, 126px) = Figma Semibold 600 / -0.04em on desktop. !important because some
   page-title blocks bake an inline font-weight:700 / -0.02em into their markup — this forces every
   display heading across the site (page titles included) onto the design regardless. */
.wp-block-heading.has-ultra-font-size {
	font-weight: 600 !important;
	letter-spacing: -0.04em !important;
}
/* Mobile display heads are Figma "Headline 1" = Bold 700 / -0.02em (desktop is Semibold 600 /
   -0.04em). The ultra preset already shrinks to ~48px here, so only weight + track change.
   !important + later source order so it wins over the desktop rule above at ≤600px. */
@media (max-width: 600px) {
	.wp-block-heading.has-ultra-font-size {
		font-weight: 700 !important;
		letter-spacing: -0.02em !important;
	}
	/* Kako razmišljamo text block on mobile: "Body 3" 14px (the lead preset carries its own !important,
	   so override in kind). Weight/line-height come from the desktop rule below. */
	.ninehz-kako p.has-lead-font-size {
		font-size: 0.875rem !important;
	}
}

/* Kako razmišljamo text block (Studio, HR 13 / EN 645): client feedback 2026-09 — "Body 1 Bold" was too
   heavy; now Semibold 600 / 120% line-height at the `lead` preset (20px on desktop). The paragraphs
   carry NO inline font-weight any more (removed from the page content), so this rule is the single
   source — no !important needed. Tracking is -2%, like every other Suisse style in the kit
   (Figma 3145:20514: 20px Semibold / 120% / -0.4px). */
.ninehz-kako p.has-lead-font-size {
	font-weight: 600;
	line-height: 1.2;
	letter-spacing: -0.02em;
}

/* Branded link hover — every link dims to the light-grey `faint` on hover/focus (the header-nav
   treatment), site-wide. !important so it overrides the per-block accent-blue hovers (media list,
   related projects, etc.). Two exemptions, both at zero extra specificity via :not(): the Projekti
   filter links (`.ninehz-pgrid__filter`) — their hover IS the dark grey (client feedback 2026-09) —
   and the footer (`.ninehz-footer *`) — it sets its own hovers further down, because `faint` is
   invisible on the blush background: the CTA e-mail keeps the brand blue and the menu columns take
   the darker `muted` grey (client feedback 2026-09). */
a {
	transition: color 0.18s ease;
}
:where(.wp-site-blocks) a:where(:not(.ninehz-pgrid__filter, .ninehz-footer *)):hover,
:where(.wp-site-blocks) a:where(:not(.ninehz-pgrid__filter, .ninehz-footer *)):focus-visible {
	color: var(--wp--preset--color--faint) !important;
}

/* Mobile side gutter = 16px (every Figma mobile frame). The theme's root padding clamps to 20px at
   phone widths; override the global-padding custom properties at ≤600px so full-width sections sit
   16px from the edges. theme.json holds the desktop scale (single value, no breakpoints), so the
   responsive step lives here. */
@media (max-width: 600px) {
	body {
		--wp--style--root--padding-left: 16px;
		--wp--style--root--padding-right: 16px;
	}
}

/* Header — sticky, with a smooth shrink + translucent blur once the page scrolls.
   Sticky goes on the template-part WRAPPER: its parent (.wp-site-blocks) is full-height, so the
   header has room to travel. (The inner .ninehz-header's own wrapper is only header-height, so
   position:sticky there has nowhere to stick.) */
header.wp-block-template-part {
	position: sticky;
	top: 0;
	z-index: 100;
}
.ninehz-header {
	position: relative;
	padding-top: 1.25rem;
	padding-bottom: 1.25rem;
	border-bottom: 1px solid var(--wp--preset--color--line);
	background-color: var(--wp--preset--color--base);
	transition: padding 0.28s ease, background-color 0.28s ease, box-shadow 0.28s ease, border-color 0.28s ease;
}
/* Frost/blur lives on a pseudo-element BEHIND the header content (z-index:-1), NOT on the header
   itself. Reason: backdrop-filter (like transform/filter) turns an element into the containing block
   for position:fixed descendants — which would trap the mobile nav overlay inside the header (it
   rendered as a clipped sliver). Keeping the effect on ::before leaves the header a normal ancestor,
   so the overlay covers the full viewport. */
.ninehz-header::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: -1;
	opacity: 0;
	background-color: rgba(255, 255, 255, 0.82);
	-webkit-backdrop-filter: saturate(180%) blur(14px);
	backdrop-filter: saturate(180%) blur(14px);
	box-shadow: 0 10px 30px rgba(64, 64, 64, 0.07);
	transition: opacity 0.28s ease;
}
.ninehz-header .ninehz-wordmark {
	margin: 0;
	display: flex;
	align-items: center;
}
.ninehz-header .ninehz-wordmark a {
	display: flex;
	line-height: 0;
}
.ninehz-header .ninehz-wordmark img {
	display: block;
	height: auto;
}
/* Inline nav row typography (>=600px is where WP shows the horizontal nav; the <600px overlay
   keeps its own big-type styling below). Cjenik right-link matches the nav links. */
@media (min-width: 600px) {
	.ninehz-header .wp-block-navigation .wp-block-navigation-item__content,
	.ninehz-header .ninehz-header__cjenik {
		font-family: var(--wp--preset--font-family--suisse);
		font-size: 16px; /* Figma "Body 2 Semibold" — 16 (node 3074:1839) */
		font-weight: 600;
		letter-spacing: -0.02em;
		line-height: 1.1;
	}
	/* Nav links dim to Light Grey on hover (Figma korekcija — Luciana). */
	.ninehz-header .wp-block-navigation .wp-block-navigation-item__content {
		transition: color 0.18s ease;
	}
	.ninehz-header .wp-block-navigation .wp-block-navigation-item__content:hover,
	.ninehz-header .wp-block-navigation .wp-block-navigation-item__content:focus {
		color: var(--wp--preset--color--faint);
	}
}
/* Desktop: 3-zone header — wordmark left, 4 links truly centered, "Cjenik" alone at far right.
   The nav block still contains all 5 links so the mobile overlay stays complete; on desktop the
   5th item (Cjenik) is hidden and the standalone right-side link takes over. */
@media (min-width: 782px) {
	.ninehz-header .ninehz-header__row {
		display: grid;
		grid-template-columns: 1fr auto 1fr;
		align-items: center;
	}
	.ninehz-header .ninehz-header__row > .ninehz-wordmark {
		justify-self: start;
	}
	.ninehz-header .ninehz-header__row > .wp-block-navigation {
		justify-self: center;
	}
	.ninehz-header .ninehz-header__row > .ninehz-header__right {
		justify-self: end;
	}
	.ninehz-header .ninehz-header__cjenik {
		margin: 0;
	}
}
/* Standalone desktop "Cjenik" is its own one-item nav block (a real menu item, localized by the same
   native nav mechanism as every other link) — strip the list chrome so it reads as one inline link. */
.ninehz-header .ninehz-header__cjenik.wp-block-navigation .wp-block-navigation__container {
	margin: 0;
	padding: 0;
	gap: 0;
}
.ninehz-header .ninehz-header__cjenik.wp-block-navigation .wp-block-navigation-item__content {
	padding: 0;
}
/* Right-side cluster: language switcher + Cjenik on one baseline.
   Figma 1422:5113 — "HR ENG" (HR = ink #404040 active, ENG = faint #D5D5D5) then
   Cjenik in ink, with a wide gap between the switcher and Cjenik. */
.ninehz-header__right {
	align-items: center;
	gap: 4rem; /* ENG → Cjenik ≈ 64px @ 1440 */
}
.ninehz-header .wp-block-polylang-language-switcher {
	display: flex;
	align-items: center;
	gap: 1.25rem; /* HR → ENG ≈ 21px */
	margin: 0;
	padding: 0;
	list-style: none;
}
.ninehz-header .wp-block-polylang-language-switcher li {
	margin: 0;
}
.ninehz-header .wp-block-polylang-language-switcher a {
	font-family: var(--wp--preset--font-family--suisse);
	font-size: 16px; /* match header nav (Body 2 Semibold 16) */
	font-weight: 600;
	letter-spacing: -0.02em;
	line-height: 1.1;
	text-decoration: none;
	color: var(--wp--preset--color--faint); /* inactive language = light grey */
	transition: color 0.18s ease;
}
.ninehz-header .wp-block-polylang-language-switcher .current-lang a,
.ninehz-header .wp-block-polylang-language-switcher a:hover {
	color: var(--wp--preset--color--contrast); /* active / hover = ink */
}

.ninehz-header.is-scrolled {
	padding-top: 0.85rem;
	padding-bottom: 0.85rem;
	/* let the frosted ::before show through the header's own (preset !important) background */
	background-color: transparent !important;
	border-bottom-color: transparent;
}
.ninehz-header.is-scrolled::before {
	opacity: 1;
}

/* Mobile overlay menu — 1:1 with Figma (node 3058:1853): a full-screen dark #404040 panel with the
   wordmark top-left, a white rounded close button top-right, and white 32px-Bold items stacked tight
   (no dividers, no accent). Scoped to our header so it can't leak to other navigation blocks. */
.ninehz-header .wp-block-navigation__responsive-container.is-menu-open {
	padding: 0;
	background-color: var(--wp--preset--color--contrast);
}
.ninehz-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content {
	position: relative;
	align-items: flex-start;
	justify-content: flex-start;
	width: 100%;
	margin-block: 0;
	padding: 262px 16px 0; /* Figma: items start 262px down; the wordmark/close sit in this top band */
}
/* Open menu: the REAL header wordmark (already an <a href> to the language home) rises above the
   overlay and turns white. So the logo stays in place (it's the header element — auto-handles the WP
   admin bar), is clickable to the homepage, and appears to "morph" as the menu opens. */
.ninehz-header:has(.wp-block-navigation__responsive-container.is-menu-open) .ninehz-wordmark {
	position: relative;
	z-index: 2147483647; /* above WP's overlay */
}
.ninehz-header:has(.wp-block-navigation__responsive-container.is-menu-open) .ninehz-wordmark img {
	filter: brightness(0) invert(1); /* dark wordmark SVG → white on the dark overlay */
}
/* The overlay list is a row-wrap flex line-box rather than a plain column: every real menu item is
   forced onto a full-width row of its own, which leaves the two language items (the only auto-width
   children) sharing the last row — Figma 3145:11594 sets "HR ENG" on one line. */
.ninehz-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container {
	display: flex;
	flex-flow: row wrap;
	row-gap: 0;
	/* Figma writes "HR ENG" as a single text run, so the gap between them IS one space character:
	   Suisse Int'l Bold space = 0.22em = 5.28px at 24px, less the -0.48px tracking that follows it. */
	column-gap: 4.8px;
}
.ninehz-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container > .wp-block-navigation-item:not(.wp-block-polylang-navigation-language-switcher) {
	flex: 0 0 100%;
}
.ninehz-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item {
	border: 0;
}
/* Cjenik shows only inside the open overlay (hidden in the inline desktop nav, where the CTA lives).
   Full selectors so these beat WP's own item display rules. */
.ninehz-header .wp-block-navigation-item.ninehz-nav-cjenik {
	display: none;
}
.ninehz-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item.ninehz-nav-cjenik {
	display: flex;
}
.ninehz-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content {
	display: block;
	width: 100%;
	padding: 0;
	font-family: var(--wp--preset--font-family--suisse);
	font-size: 2rem; /* Figma: 32 */
	font-weight: 700;
	line-height: 1.1;
	letter-spacing: -0.02em;
	color: var(--wp--preset--color--base);
	transition: color 0.18s ease;
}
.ninehz-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content:hover {
	color: var(--wp--preset--color--faint);
}
/* Keep the auto-focused / keyboard-focused item white (the ring shows focus) — beats the site-wide
   a:focus-visible faint rule, so opening the menu doesn't grey out the first item. */
.ninehz-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content:focus,
.ninehz-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content:focus-visible {
	color: var(--wp--preset--color--base) !important;
	outline: none;
}
.ninehz-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content:focus-visible {
	outline: 2px solid var(--wp--preset--color--base);
	outline-offset: 4px;
}
/* Active state — the current page is dimmed to `faint`. Comes last + !important so it wins even when
   it's also the auto-focused item. Excludes the language items: there the CURRENT language is the one
   that stays white and the other one is grey (Figma 3145:11594) — the exact opposite — so the rule is
   scoped off them rather than answered with another !important further down. */
.ninehz-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item:not(.wp-block-polylang-navigation-language-switcher) .wp-block-navigation-item__content[aria-current="page"] {
	color: var(--wp--preset--color--faint) !important;
}

/* Language switcher inside the overlay (Figma 3145:11592 / 3145:11594): "HR ENG" 115px below the last
   menu item, 24px Bold, the current language white and the other one #838383. It is Polylang's
   navigation-flavoured switcher, so each language is a real <li class="wp-block-navigation-item"> inside
   the overlay dialog — same focus trap and tab order as the menu links, with per-page hreflang/lang and
   aria-current. Hidden in the inline desktop nav, where .ninehz-header__right carries the desktop
   switcher; that markup is untouched. */
.ninehz-header .wp-block-navigation-item.wp-block-polylang-navigation-language-switcher {
	display: none;
}
.ninehz-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item.wp-block-polylang-navigation-language-switcher {
	display: flex;
	flex: 0 0 auto;
	margin-top: 115px; /* Figma 3145:11592 — 115px from the bottom of "Cjenik" to the top of "HR ENG" */
}
.ninehz-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item.wp-block-polylang-navigation-language-switcher .wp-block-navigation-item__content {
	width: auto; /* the menu links are full-bleed rows; a language link is only as wide as its label */
	font-size: 1.5rem; /* Figma: 24 */
	letter-spacing: -0.02em; /* Figma: -0.48px at 24 */
	color: #838383; /* the non-current language — a one-off overlay grey, not in the theme.json palette */
}
.ninehz-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item.wp-block-polylang-navigation-language-switcher.current-lang .wp-block-navigation-item__content {
	color: var(--wp--preset--color--base);
}
/* Hamburger (closed) stays dark ink. Figma 3058:2693: a TWO-line icon, 20px wide in a 6px-tall
   group (~1.5px lines, ~3px gap) — replaces WP's default 3-line SVG. */
.ninehz-header .wp-block-navigation__responsive-container-open {
	color: var(--wp--preset--color--contrast);
	position: relative;
	width: 52px; /* same 52×24 box as the close button (Figma), so the two overlap when toggling */
	height: 24px;
	padding: 0;
}
.ninehz-header .wp-block-navigation__responsive-container-open svg {
	display: none;
}
.ninehz-header .wp-block-navigation__responsive-container-open::before,
.ninehz-header .wp-block-navigation__responsive-container-open::after {
	content: "";
	position: absolute;
	left: 16px; /* 20px lines centred in the 52px box */
	width: 20px;
	height: 1.5px;
	background: currentColor;
}
.ninehz-header .wp-block-navigation__responsive-container-open::before {
	top: 9px; /* icon 6px tall, centred in 24 → 9..15 */
}
.ninehz-header .wp-block-navigation__responsive-container-open::after {
	top: 13.5px; /* 9 + 1.5 line + 3 gap */
}
/* Close button = white 52×24 pill with a dark X (Figma 3058:1843: white bg, radius 16, #404040 X
   12×12). The 16px radius is an explicit design decision, not house-style rounding. Positioned to
   OVERLAP the closed hamburger (same 52×24 box) so the hamburger morphs into the X on open. */
.ninehz-header .wp-block-navigation__responsive-container-close {
	top: 20px; /* exact closed-hamburger top */
	right: 16px;
	width: 52px;
	height: 24px;
	padding: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	background: var(--wp--preset--color--base);
	border-radius: 16px;
	color: var(--wp--preset--color--contrast);
}
.ninehz-header .wp-block-navigation__responsive-container-close svg {
	width: 12px;
	height: 12px;
	fill: var(--wp--preset--color--contrast);
}
/* Logged-in: the WP admin bar (46px on mobile) pushes the header down, but the fixed overlay close
   button doesn't follow — shift it so it keeps overlapping the (admin-bar-aware) header wordmark. */
body.admin-bar .ninehz-header .wp-block-navigation__responsive-container-close {
	top: calc(20px + 46px);
}
/* ------------------------------------------------------------------
   Section headings sit ~100px above their content (Figma: every big
   section title has a 100px gap to what follows). Applies to core/heading
   section titles (Naš tim, Kako razmišljamo, Rješenje …); the custom blocks
   (Izazovi/Moodboard/Faze/Tlocrt) carry the same value in their own CSS.
   Excludes page/post hero titles (.ninehz-page-title) and the Studio hero
   heading, which pair tightly with the collage / fact-sheet that follows.
   ------------------------------------------------------------------ */
.wp-block-heading.has-ultra-font-size:not(.ninehz-page-title) {
	margin-bottom: clamp(2.5rem, 7vw, 6.25rem);
}
/* "Mreža suradnika" (Studio) — client feedback 2026-09-08: a flat 80px from the heading to the intro
   sentence at every breakpoint (the clamp above lands on 100 desktop / 40 mobile), mirrored by the
   80px the intro keeps below itself (src/blocks/collaborators/style.scss). Same (0,3,0) specificity
   as the rule above, later in the file, so it wins without !important; the section's blockGap
   (48/32px) collapses into it. The section carries `ninehz-sec-collab` in the page content. */
.ninehz-sec-collab > .wp-block-heading.has-ultra-font-size {
	margin-bottom: 80px;
}
/* Laptop heights ("fit the fold" — pairs with the same media queries in
   src/blocks/featured-projects/style.scss): the Istaknuti projekti heading→carousel
   gap tightens to 48 / 40px so heading + grid fit below the sticky header on 13"
   laptops. The block drops its own margin-block-start there, but THIS heading margin
   collapses with it and the larger one wins — so it must drop to the same value.
   Same specificity (0,3,0) as the rule above; later in the same sheet wins. */
@media (min-width: 782px) and (max-height: 900px) {
	.ninehz-sec-projects > .wp-block-heading.has-ultra-font-size {
		margin-bottom: 48px;
	}
}
@media (min-width: 782px) and (max-height: 760px) {
	.ninehz-sec-projects > .wp-block-heading.has-ultra-font-size {
		margin-bottom: 40px;
	}
}
/* Respect the WP admin bar so the sticky header doesn't slide under it.
   ≤600px WP makes #wpadminbar position:absolute (it scrolls away with the page),
   so there the sticky header goes back to top:0 — otherwise a bar-sized gap is
   left above the header once you scroll. */
.admin-bar header.wp-block-template-part {
	top: 32px;
}
@media screen and (min-width: 601px) and (max-width: 782px) {
	.admin-bar header.wp-block-template-part {
		top: 46px;
	}
}
@media screen and (max-width: 600px) {
	.admin-bar header.wp-block-template-part {
		top: 0;
	}
}
@media (prefers-reduced-motion: reduce) {
	.ninehz-header,
	.ninehz-header .ninehz-wordmark img {
		transition: none;
	}
}

/* ------------------------------------------------------------------
   Responsive visibility utilities (used by parts/patterns and DB content)
   ------------------------------------------------------------------ */
@media (max-width: 781px) {
	.ninehz-hide-mobile {
		display: none !important;
	}
	/* Mobile header matches Figma: wordmark + hamburger only. Both the desktop language
	   switcher and Cjenik live in .ninehz-header__right, which is hidden here — the overlay
	   menu carries its own copy of each (Cjenik + the polylang navigation switcher). */
	.ninehz-header__row > .ninehz-header__right {
		display: none;
	}
	/* Studio moodboard: the two bottom-aligned image column-sets collapse into a
	   compact 3-up grid instead of 12 full-width stacked images — matches the dense
	   Figma studio-mobile moodboard. Scoped by content class (not page id), desktop
	   (>781px) untouched. */
	.ninehz-moodboard.wp-block-columns {
		display: grid;
		grid-template-columns: repeat(3, 1fr);
		gap: 10px;
		align-items: start;
	}
	.ninehz-moodboard.wp-block-columns > .wp-block-column {
		flex-basis: auto;
		width: auto;
		min-width: 0;
		margin: 0;
	}
	.ninehz-moodboard.wp-block-columns .wp-block-image,
	.ninehz-moodboard.wp-block-columns .wp-block-image img {
		width: 100%;
		height: auto;
		margin: 0;
	}
}
@media (min-width: 782px) {
	.ninehz-hide-desktop {
		display: none !important;
	}
}

/* ------------------------------------------------------------------
   Studio statement (blush section — classes live on the DB blocks)
   ------------------------------------------------------------------ */
.ninehz-statement__quote {
	font-size: 2rem;
	font-weight: 700; /* Figma "Headline 2" — Suisse Bold */
	line-height: 1.1;
	letter-spacing: -0.02em; /* Figma -2% */
}
.ninehz-statement__sig {
	margin: 0;
}
.ninehz-statement__sig img {
	width: 302px;
	height: auto;
	/* The signature SVG is preserveAspectRatio="none" with width/height 100%; without an explicit
	   ratio Chrome ignores the viewBox for height:auto and stretches it tall (Firefox honours it).
	   Pin the box ratio so it renders 302×60.56 in every browser. */
	aspect-ratio: 302 / 60.561;
}
/* Figma: quote (left) + signature (right) share one baseline — their bottoms align (items-end). */
@media (min-width: 782px) {
	.ninehz-statement .ninehz-statement__row {
		align-items: flex-end;
	}
}
@media (max-width: 781px) {
	.ninehz-statement {
		box-sizing: border-box; /* min-height must include the padding, or the section overshoots ~500px */
		min-height: 500px;
		display: grid;
		place-content: center;
		text-align: center;
	}
	/* The row itself is a WP flex layout (nowrap, space-between) via a generated
	   .wp-container-core-group-is-layout-* class — a single-class selector. Beat it with a
	   3-class selector so the mobile stack actually wins instead of the quote/signature staying
	   side by side. */
	.ninehz-statement .ninehz-statement__row.wp-block-group {
		display: grid;
		justify-items: center;
		row-gap: 60px;
	}
	.ninehz-statement__quote {
		font-size: 1.5rem;
		justify-self: stretch;
		width: 100%;
	}
	.ninehz-statement__sig {
		margin-inline: auto;
		justify-self: center;
	}
	.ninehz-statement__sig img {
		width: 284px;
	}
}

/* Studio manifest ("Sve što radiš…") — client feedback F12: Medium (500), size unchanged at the
   `large` step. The page content used to carry an inline font-weight:600 on this heading; that has
   been removed, so the weight lives here and there is nothing left to override. Scoped to
   `.entry-content >` so it out-specifies the heading element style from theme.json. */
.entry-content > .ninehz-studio-statement h2 {
	font-weight: 500;
}

/* ============================================================================
   SECTION RHYTHM (client feedback F02) — one gap between sections, site-wide.
   The value is declared once in theme.json (`custom.sectionSpace`) and only the
   mobile step lives here, because theme.json cannot carry a media query.

   Every generic section pads itself by one gap on both sides; two neighbours
   that sit on the SAME background share a single gap instead of stacking two,
   which is the doubling the client flagged (a section closing with 120 and the
   next opening with another 120). Where the background actually changes, both
   bands keep their own padding on purpose — a colour band needs its own
   breathing room, so that seam is deliberately larger.

   Page content no longer carries inline section padding (stripped from the page
   content in the same change), so these rules are the only source and need no
   !important. Custom ninehz/* blocks (hero, marquee, collage, moodboard, the
   case-study sections) keep their own Figma-measured spacing and are
   deliberately NOT matched here — the selector only takes .wp-block-group.
   ============================================================================ */
@media (max-width: 781px) {
	:root {
		--wp--custom--section-space: 80px;
	}
}

.entry-content > .wp-block-group {
	padding-block: var(--wp--custom--section-space);
}

/* The preceding sibling is only a condition, so it goes in :where() and adds no specificity: this
   rule stays at (0,2,0), exactly one step above the base rule it follows. Any section-specific
   exception later in the file therefore still wins on its own, with no !important anywhere. */
:where(.entry-content > .has-base-background-color) + .wp-block-group.has-base-background-color,
:where(.entry-content > .has-blush-background-color) + .wp-block-group.has-blush-background-color,
:where(.entry-content > .has-surface-background-color) + .wp-block-group.has-surface-background-color,
:where(.entry-content > .has-contrast-background-color) + .wp-block-group.has-contrast-background-color,
:where(.entry-content > .wp-block-group:not(.has-background)) + .wp-block-group:not(.has-background) {
	padding-block-start: 0;
}

/* The hero sizes itself to the fold and the marquee carries its own 20px band — neither takes
   part in the section rhythm. */
.entry-content > .ninehz-hero {
	padding-block: 0;
}

/* Studio moodboard closes the page with a long tail (Figma 3145:15364, pb 250) instead of the
   standard gap; the top gap is the normal rhythm. */
.entry-content > .ninehz-moodboard-section {
	padding-block-end: 250px;
}
@media (max-width: 600px) {
	.entry-content > .ninehz-moodboard-section {
		padding-block: 120px;
	}
}

/* "Fit the fold" for Kako radimo (client feedback 2026-09, Figma 3116:7506): the active step — title,
   numbers, text, testimonial and the square photo — must fit one 13" screen. Real 13" Safari/Firefox
   windows are ~800px (1440×900 Mac) to ~856px (1470×956 Air) tall inside, so the main tier is ≤1000px
   (taller than the featured-projects 900 tier: this composition is taller), with a light ≤1100px tier
   for 15–16" laptops and a ≤760px tier for scaled 1280×800 screens. Title→numbers gap = the
   group's 100px blockGap (page content) collapsed with the ultra heading's margin; the layout rule
   `.wp-container-… > *` sets the block's margin-block-start, so BOTH are lowered — (0,2,0)/(0,3,0)
   beat it. These are scoped as `.entry-content > .ninehz-sec-process` to out-specify the generic
   section-rhythm rule.
   The block's inner gaps + photo size drop in src/blocks/process-steps/style.scss (same queries). */
@media (min-width: 782px) and (max-height: 1100px) {
	/* 15–16" laptops (~1010px inside): full 235 photo would still be cut from the section start. */
	.entry-content > .ninehz-sec-process {
		padding-block: 100px 0;
	}
	/* Ending flush with its content is what makes the composition fit the fold, so the section that
	   follows brings the whole gap instead of collapsing against a bottom padding that isn't there.
	   One rule covers all three height tiers — they are nested inside this one. */
	.entry-content > .ninehz-sec-process + .wp-block-group {
		padding-block-start: var(--wp--custom--section-space);
	}
	.ninehz-sec-process > .wp-block-heading.has-ultra-font-size {
		margin-bottom: 40px;
	}
	.ninehz-sec-process > .ninehz-process {
		margin-block-start: 40px;
	}
}
@media (min-width: 782px) and (max-height: 1000px) {
	.entry-content > .ninehz-sec-process {
		padding-block: 60px 0; /* section start → title */
	}
	.ninehz-sec-process > .wp-block-heading.has-ultra-font-size {
		margin-bottom: 32px;
	}
	.ninehz-sec-process > .ninehz-process {
		margin-block-start: 32px;
	}
}
@media (min-width: 782px) and (max-height: 760px) {
	.entry-content > .ninehz-sec-process {
		padding-block: 40px 0;
	}
	.ninehz-sec-process > .wp-block-heading.has-ultra-font-size {
		margin-bottom: 24px;
	}
	.ninehz-sec-process > .ninehz-process {
		margin-block-start: 24px;
	}
}
/* Giant faint section titles ("Istaknuti projekti", "Kako radimo") */
h2.ninehz-sec-title {
	font-size: var(--wp--preset--font-size--ultra, clamp(3rem, 0.6rem + 9vw, 7.9rem));
	font-weight: 600;
	line-height: 1.1;
	letter-spacing: -0.04em;
	color: var(--wp--preset--color--faint, #D5D5D5);
}
@media (max-width: 781px) {
	h2.ninehz-sec-title {
		font-weight: 700;
		letter-spacing: -0.02em;
	}
}
/* Twin section titles: the sections that word their title differently on mobile carry both, one hidden
   per breakpoint ("Istaknuti projekti" / "Projekti" on the homepage). The hidden one is still a
   sibling, so the visible one picks up the section's 100px block gap on top of the section's own 80px
   padding — 180px of white above the word (client report 2026-09-08). On mobile the visible title IS
   the first thing in the section, so it takes no gap and the section rhythm alone spaces it.
   (0,3,1) — beats WP's generated container gap rule, no !important. Deliberately narrow: elsewhere a
   `ninehz-hide-mobile` element is followed by a mobile twin that DOES want its own top margin (the
   Studio image breaks authored at 100px). */
@media (max-width: 781px) {
	.ninehz-hide-mobile + h2.ninehz-sec-title.ninehz-hide-desktop {
		margin-block-start: 0;
	}
}
/* Section titles reach the Figma 126px (7.9rem) by ~1130px, so they match the design on typical
   laptop windows. The default `ultra` curve only hit full size at ≥1298px, so a narrower window
   showed a smaller title (the Figma overlay looked ~11% bigger). Steeper vw term; still scales
   down below ~1130px without overflowing the content. Desktop only — mobile keeps its own pass. */
@media (min-width: 782px) {
	h2.ninehz-sec-title {
		/* !important to beat WP's `.has-ultra-font-size` utility class (also !important). */
		font-size: clamp(3rem, 0.6rem + 10.4vw, 7.9rem) !important;
	}
}
/* Small section label above a component (Figma 3116:7532 "Vrste projekata" over the project types):
   Body 2 = Suisse Bold 16 / 1.1 / -0.02em, contrast. The 20px gap to the block below is the section
   group's blockGap (page content), not a margin here. */
h2.ninehz-sec-label {
	font-size: 1rem;
	font-weight: 700;
	line-height: 1.1;
	letter-spacing: -0.02em;
	color: var(--wp--preset--color--contrast, #404040);
	margin: 0;
}

/* ------------------------------------------------------------------
   Kontinuitet accordion section (patterns/investor-proof.php)
   ------------------------------------------------------------------ */
.ninehz-continuity__grid {
	display: grid;
	grid-template-columns: minmax(0, 519fr) minmax(0, 628fr);
	gap: 133px;
	align-items: start;
}
.ninehz-continuity h2 {
	font-size: 2rem;
	line-height: 1.1;
	max-width: 519px;
}
.ninehz-continuity .wp-block-details {
	border-top: 1px solid var(--wp--preset--color--line, #DCDCDC);
}
.ninehz-continuity .wp-block-details:last-child {
	border-bottom: 1px solid var(--wp--preset--color--line, #DCDCDC);
}
.ninehz-continuity summary {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 1rem;
	padding-block: 15px;
	font-family: var(--wp--preset--font-family--suisse);
	font-size: 1rem;
	font-weight: 600;
	line-height: 1.1;
	letter-spacing: -0.02em;
	color: var(--wp--preset--color--contrast, #404040);
	cursor: pointer;
	list-style: none;
}
.ninehz-continuity summary::-webkit-details-marker {
	display: none;
}
.ninehz-continuity summary::after {
	content: "+";
	font-weight: 600;
}
.ninehz-continuity .wp-block-details[open] > summary::after {
	content: "−";
}
.ninehz-continuity .wp-block-details p {
	margin: 0;
	padding-bottom: 15px;
	font-size: 1rem;
	color: var(--wp--preset--color--contrast, #404040);
}
@media (max-width: 781px) {
	.ninehz-continuity__grid {
		grid-template-columns: 1fr;
		gap: 50px;
	}
	.ninehz-continuity h2 {
		font-size: 1.5rem;
	}
}

/* ------------------------------------------------------------------
   Footer — one full screen: blush CTA (dropped below the sticky header),
   link columns, and the giant 9Hz logotype pinned to the bottom.
   ------------------------------------------------------------------ */
.ninehz-footer {
	box-sizing: border-box;
	min-height: 100svh;
	display: flex;
	flex-direction: column;
	justify-content: space-between;
	/* CTA clears the sticky header so the nav bar never covers it (Luciana). Figma 3033:5134: CTA
	   at y=145 under a 58px header; fluid so the whole footer still fits one screen on shorter
	   viewports. space-between then pins the logotype to the very bottom. */
	padding-top: clamp(88px, 14.2vh, 145px);
	padding-bottom: clamp(40px, 6vh, 62px);
}
.ninehz-footer-cta {
	margin: 0;
	/* Fill the wide-size (like the logo) instead of shrinking to the text width — alignwide's
	   margin-inline:auto otherwise cancels the flex-stretch and centres it. Inert on mobile
	   (wide-size > phone width, so it's already 100%). */
	width: 100%;
	/* Dedicated size instead of the `x-large` preset class: WP prints font-size presets with their
	   own `!important`, so the flat 24px the mobile design needs could only win by piling on a
	   second one. Same value the preset carried — desktop rendering is unchanged. */
	font-size: clamp(1.5rem, 1.3rem + 1vw, 2rem);
}
/* The mailto sits on its own line, with a blank line above it (both breakpoints). */
.ninehz-footer-cta a {
	display: block;
	margin-top: 1.1em;
}
.ninehz-footer-nav {
	margin: 0;
	width: 100%; /* fill the wide-size like the logo (see .ninehz-footer-cta) */
	font-family: var(--wp--preset--font-family--suisse);
	font-size: 1rem;
	font-weight: 600;
	line-height: 1.1; /* Figma Body 2 Semibold */
	letter-spacing: -0.02em;
}
.ninehz-footer-logo {
	margin: 0; /* space-between pins it to the bottom of the screen */
}
.ninehz-footer-logo img {
	display: block;
	width: 100%;
	height: auto;
}
/* Footer hovers are split in two, because the two halves of the footer want different answers
   (Kenan, F58). The site-wide `faint` grey is invisible on the blush background, so neither half
   uses it. The selectors below address disjoint subtrees — the CTA heading vs. the link columns —
   so neither has to out-specify the other and no !important is involved. */
.ninehz-footer a {
	transition: color 0.18s ease;
}
/* The CTA mailto keeps the brand blue it has always had. */
.ninehz-footer-cta a:hover,
.ninehz-footer-cta a:focus {
	color: var(--wp--preset--color--accent);
}
/* The menu columns (site links, Instagram/TikTok, Kolačići) dim to the `muted` stone grey — light
   enough to read as a hover, dark enough to stay legible on blush. */
.ninehz-footer-nav a:hover,
.ninehz-footer-nav a:focus {
	color: var(--wp--preset--color--muted);
}
/* The nav-link items (footer nav row + "Kolačići") need a bit more specificity to win: WP core's own
   navigation-block stylesheet sets their color via a doubled-class selector
   (`.wp-block-navigation-item__content.wp-block-navigation-item__content { color: inherit; }`), which
   otherwise out-specifies the plain `.ninehz-footer-nav a:hover` rule above. Match that shape here
   instead of reaching for !important. */
.ninehz-footer-nav .wp-block-navigation-item__content:hover,
.ninehz-footer-nav .wp-block-navigation-item__content:focus {
	color: var(--wp--preset--color--muted);
}
/* Mobile footer — Figma "Homepage Footer Mobile" (node 3211:27525, a 402×874 frame).
   The frame is a phone mock: its top 163px is the status bar, the URL bar and the site header, so
   the footer itself owns the remaining 711px — exactly ONE fold. That is the brief: scrolled to the
   bottom, the whole footer is on screen at once and reads like the frame.

   How the fold is guaranteed without freezing the frame's pixel offsets: the footer keeps the base
   rule's `min-height:100svh` (svh = the viewport with the browser chrome EXPANDED, the state the
   mock draws, so the footer fits at every scroll position), reserves the sticky header's height as
   top padding, and lays its four content blocks on a grid whose SPACER rows are `fr`. The blocks
   keep their natural, text-driven heights and whatever height is left over splits between the
   spacers in the frame's own ratio 36 : 91 : 91 : 38 : 23.35. At the mock's viewport that
   reproduces the frame; on a taller phone the gaps grow together instead of the wordmark drifting
   off the bottom, and on a shorter one they shrink instead of pushing the footer past the fold.

   Two structural changes vs. the previous mock (node 3145:12017): the address is now its own
   full-width row UNDER the two link columns instead of a third column, and the wordmark is the
   single-line lockup (assets/brand/logo-9hz-footer-mobile.svg, re-exported from this frame) rather
   than the stacked one. `display:contents` on the nav wrapper lifts its children into the footer
   grid so the gap above the address is an fr spacer like the others — left nested, that one gap
   would have been the only fixed-pixel one in the column.

   The horizontal inset is the site-wide root padding, which already IS the frame's 16px at these
   widths (see the ≤600px block above), so the footer keeps aligning with every section above it. */
@media (max-width: 781px) {
	.ninehz-footer {
		/* Mobile header height, exact BY CONSTRUCTION like the --ninehz-header-h token at the top of
		   this file, but with the mobile row's own terms: at ≤781px .ninehz-header__right is hidden
		   and the nav collapses to the hamburger, so the row is only as tall as the 134px wordmark
		   (assets/brand/wordmark-header.svg is 140.297 × 11.7322). Reserving it as padding keeps the
		   CTA clear of the sticky header, which is pinned to the top of the viewport down here. */
		--ninehz-footer-header-h: calc(2 * 1.25rem + 134px * 11.7322 / 140.297 + 1px);

		display: grid;
		grid-template-columns: max-content minmax(0, 1fr);
		/* 1 gap · 2 CTA · 3 gap · 4 link columns · 5 gap · 6 address · 7 gap · 8 wordmark · 9 gap */
		grid-template-rows: 36fr auto 91fr auto 91fr auto 38fr auto 23.35fr;
		column-gap: 50px; /* Figma: the two link columns sit 50px apart */
		padding-top: var(--ninehz-footer-header-h);
		padding-bottom: 0; /* the trailing 23.35fr spacer is the bottom inset */
	}
	/* Figma: Suisse Intl Bold 24 / line-height 1.1. Tracking −0.48px comes for free from the theme's
	   −0.02em heading letter-spacing at this size, so it is not repeated here. Five lines (three of
	   copy, a blank one, the mailto) make the 130px block the frame draws. */
	.ninehz-footer-cta {
		grid-row: 2;
		grid-column: 1 / -1;
		font-size: 1.5rem;
		font-weight: 700;
	}
	/* Lift the wrapper's children into the footer grid (see the note above). `display` has to beat
	   WP's `body .is-layout-flex{display:flex}` (0,1,1), which the `.ninehz-footer` prefix does
	   without reaching for !important. Typography still inherits through a `display:contents` box,
	   so the whole link block is sized here. */
	.ninehz-footer .ninehz-footer-nav {
		display: contents;
		font-size: 0.875rem;
		line-height: 1.8; /* Figma: 14px / 1.8 → a 25.2px line; five of them are the 125px column */
	}
	.ninehz-footer-nav > .wp-block-navigation { /* Studio … Cjenik */
		grid-row: 4;
		grid-column: 1;
	}
	.ninehz-footer-nav > .wp-block-group { /* Instagram, TikTok, Kolačići */
		grid-row: 4;
		grid-column: 2;
	}
	/* Its own row now, the full 371px wide — so the <br> in the content is the only thing that
	   breaks it, rather than the 106px cap the three-column mock needed. */
	.ninehz-footer-address {
		grid-row: 6;
		grid-column: 1 / -1;
	}
	/* `width:100%` because .wp-block-image is a shrink-to-fit box: without it the figure stops at
	   the SVG's intrinsic 371px and alignwide's auto margins centre it, which only shows once the
	   viewport is wider than that (the 600–781px tablet band). */
	.ninehz-footer-logo {
		grid-row: 8;
		grid-column: 1 / -1;
		width: 100%;
	}
}

/* ------------------------------------------------------------------ */
/* Projekti page — "Inspiracija" section heading.                     */
/* The strip below it is a plain ninehz/moodboard block (same as the  */
/* Studio page and every case study), so only the heading needs CSS.  */
/* ------------------------------------------------------------------ */
.ninehz-inspiration__statement {
	font-size: 1.875rem;
	max-width: 1160px;
}
@media (max-width: 781px) {
	.ninehz-page-title {
		font-size: 4rem;
	}
	.ninehz-inspiration__statement {
		font-size: 1.5rem;
	}
}

/* ============================================================================
   STUDIO PAGE — mobile (≤600px) 1:1 with Figma (node 1422:5724). Desktop is
   unaffected: every rule here is inside the ≤600px query and/or scoped to a
   Studio-only class.
   ============================================================================ */
@media (max-width: 600px) {
	/* Studio statement ("Sve što radiš…") — Figma 1422:5725: soft-lilac, centred Semibold 16px
	   capped to 308px. Only the side padding is section-specific; the block padding is the shared
	   mobile section gap (80px). The old !important existed solely to beat the inline padding the
	   page content used to carry — that inline padding is gone, so the override is gone too. */
	.entry-content > .ninehz-studio-statement {
		padding-inline: 16px;
	}
	.ninehz-studio-statement h2 {
		font-size: 16px !important; /* beats WP's .has-large-font-size !important */
		max-width: 308px;
		margin-inline: auto;
	}

	/* Image breaks (Figma 1422:5862 / 1422:5921) — a tall 370×465 portrait crop on mobile with cover,
	   so the wide studio photo fills the frame instead of showing as a short landscape strip. */
	.ninehz-studio-imgbreak img {
		aspect-ratio: 370 / 465;
		object-fit: cover;
		width: 100%;
		height: auto;
	}

	/* Strani klijenti hero — MOBILE ONLY (Figma mobile 3058:2926): the second sentence dims to
	   faint grey. Desktop stays a single colour (the span just inherits), so this lives only here. */
	.ninehz-sk-hero-title__dim {
		color: var(--wp--preset--color--faint);
	}
}

/* Strani klijenti — "Building or renovating in Croatia simplified" steps (Figma 3033:1296).
   Each row's separator is SPLIT into two segments — one over the 302px label column, one over the
   list column — broken by the 24px column gap (so the line "prekida se na sredini"). The rule +
   padding live on the sub-columns; the last row closes with a bottom rule. Type = Body 3 (14px):
   the label stays Bold (inline), duration + list are Semibold. */
.ninehz-sk-steps .wp-block-column .wp-block-columns {
	column-gap: 24px; /* Figma: the split in the separator = the 24px gap between the two columns */
}
.ninehz-sk-steps .wp-block-column .wp-block-columns > .wp-block-column {
	border-top: 1px solid var(--wp--preset--color--line);
	padding-block: var(--wp--preset--spacing--50);
}
/* 50px between the step label and its duration on every item (Figma). */
.ninehz-sk-steps .wp-block-column .wp-block-columns > .wp-block-column:first-child {
	display: flex;
	flex-direction: column;
	gap: 50px;
}
.ninehz-sk-steps .wp-block-column .wp-block-columns > .wp-block-column:first-child > * {
	margin: 0; /* zero the paragraph margins so the 50px gap is exact, not 50 + margin */
}
.ninehz-sk-steps .wp-block-column .wp-block-columns:last-child > .wp-block-column {
	border-bottom: 1px solid var(--wp--preset--color--line);
}
/* Scoped to the step ROWS (nested columns) so it can't shrink a lead paragraph placed in the left
   column — e.g. the Cjenik intro that reuses this component. */
.ninehz-sk-steps .wp-block-column .wp-block-columns p,
.ninehz-sk-steps .wp-block-column .wp-block-columns li {
	font-size: var(--wp--preset--font-size--x-small);
}
.ninehz-sk-steps .wp-block-column .wp-block-columns li {
	font-weight: 600;
}

/* Croatia-simplified is a split-column table on desktop and an accordion (identical to "How we
   handle the process remotely") on mobile. The mobile faq is hidden on desktop; the desktop step
   rows are hidden on mobile. */
.ninehz-steps-accordion {
	display: none;
}
@media (max-width: 600px) {
	.ninehz-steps-accordion {
		display: block;
	}
	.ninehz-sk-steps .wp-block-column > .wp-block-columns {
		display: none;
	}
}
/* Croatia mobile accordion type + spacing (Figma 3058:3014): question Body 1 (24), duration + list
   Body 3 (14) all dark; 24 (divider→question) / 50 (question→duration, open) / 24 (duration→list) /
   24 (list→divider). Scoped to the accordion, which is only visible on mobile. */
.ninehz-steps-accordion .ninehz-faq__q-btn {
	font-size: 24px;
	padding: 24px 0;
	/* Collapsed items are Light Grey (#D5D5D5); the open one is dark #404040 (Figma 3058:3026 etc.). */
	color: var(--wp--preset--color--faint);
}
.ninehz-steps-accordion .ninehz-faq__q-btn[aria-expanded="true"] {
	padding-top: 24px;
	padding-bottom: 50px;
	color: var(--wp--preset--color--contrast);
}
/* This accordion has no +/− affordance in Figma — the open/closed state is shown by colour alone. */
.ninehz-steps-accordion .ninehz-faq__q-btn::after {
	content: none;
}
/* Duration line = Body 3 Bold (14 / 700); the item list = Body 3 Semibold (14 / 600). */
.ninehz-steps-accordion .ninehz-faq__a-inner p {
	font-size: 14px;
	font-weight: 700;
	line-height: 1.1;
	letter-spacing: -0.02em;
	color: var(--wp--preset--color--contrast);
	margin: 0 0 24px;
}
.ninehz-steps-accordion .ninehz-faq__a-inner li {
	font-size: 14px;
	font-weight: 600;
	line-height: 1.1;
	letter-spacing: -0.02em;
	color: var(--wp--preset--color--contrast);
}
.ninehz-steps-accordion .ninehz-faq__a-inner::after {
	height: 24px;
}

/* Cjenik pricing categories — mobile accordion (Figma 3104-2687). Same desktop split rows as
   .ninehz-sk-steps, but unlike "Building or renovating" the mobile accordion KEEPS the base faq's ±
   toggle (in line with the heading) and its 16px question — only the collapsed=Light Grey /
   open=Concrete Grey colouring is added. Separators stay light (base faq default). */
.ninehz-cjenik-accordion {
	display: none;
}
.ninehz-cjenik-accordion .ninehz-faq__q-btn {
	color: var(--wp--preset--color--faint);
}
.ninehz-cjenik-accordion .ninehz-faq__q-btn[aria-expanded="true"] {
	color: var(--wp--preset--color--contrast);
}
/* On the Cjenik page the two content blocks (categories + form) drop to their MOBILE view already at
   1000px — not the usual 782/600. Scoped to the Cjenik-only classes so strani-klijenti (shares
   .ninehz-sk-steps) and Kontakt (shares the form) keep their normal breakpoints. */
@media (max-width: 1000px) {
	/* Stack the two-column grids (categories intro|content, form heading|form). WP only stacks
	   columns at ≤781, and their flex-basis is an inline style, so force both here. */
	.ninehz-cjenik-cats > .wp-block-columns,
	.wp-block-columns.ninehz-cjenik-formgrid {
		flex-wrap: wrap !important; /* beats WP's own min-782 `flex-wrap:nowrap` (inlined block CSS, same specificity) */
	}
	.ninehz-cjenik-cats > .wp-block-columns > .wp-block-column,
	.ninehz-cjenik-formgrid > .wp-block-column {
		flex-basis: 100% !important; /* overrides the inline flex-basis:34%/66% — same mechanism WP uses on mobile */
	}

	/* Categories → mobile accordion (hide the desktop split rows, show the ± accordion). */
	.ninehz-cjenik-cats .wp-block-column > .wp-block-columns {
		display: none;
	}
	.ninehz-cjenik-accordion {
		display: block;
		margin-top: 0; /* sits after the hidden desktop rows — drop the block-gap so the 50px row-gap is exact */
	}
	/* Figma 3104-2687: 50 intro→accordion, then a 24 rhythm around the open item. */
	.ninehz-cjenik-cats > .wp-block-columns {
		row-gap: 50px;
	}
	.ninehz-cjenik-accordion .ninehz-faq__q-btn,
	.ninehz-cjenik-accordion .ninehz-faq__q-btn[aria-expanded="true"] {
		padding-top: 24px;
		padding-bottom: 24px;
	}
	.ninehz-cjenik-accordion .ninehz-faq__a-inner::after {
		height: 24px;
	}

	/* Form → stacked internal rows (ime|email etc.). */
	.ninehz-cjenik-formgrid .ninehz-form__row {
		grid-template-columns: 1fr;
		gap: 0;
	}

	/* The whole form block goes grey (full-bleed) with square corners — the white pill card dissolves
	   into the section so heading + fields all sit on one grey block (Figma 3104-2720). */
	.ninehz-cjenik-formsec.has-base-background-color {
		background-color: var(--wp--preset--color--surface) !important; /* beats WP's has-*-background-color !important */
	}
	.ninehz-cjenik-formsec .ninehz-form {
		background: transparent;
		border-radius: 0;
		padding: 0;
		max-width: none;
	}
	/* Figma 3104-2722: 80px inside the grey block above the heading and again between the heading
	   block and the first field; 150px below the submit button; 24px between fields (field margin).
	   `.alignfull` bumps specificity past the base .ninehz-cjenik-formsec rule that follows in the file. */
	.ninehz-cjenik-formsec.alignfull {
		padding-top: 80px;
		padding-bottom: 150px;
	}
	.ninehz-cjenik-formgrid {
		row-gap: 80px;
	}
}

/* "Let's start" cards accordion — on MOBILE the type shrinks to Body 2 (Figma 3058:3172): question
   Bold 16, answer Semibold 16, tighter card padding (20/10). Desktop keeps the x-large (~32) question.
   Scoped to the section so it out-specifies the is-style-cards block style without !important. */
@media (max-width: 600px) {
	.ninehz-sk-start .ninehz-faq.is-style-cards .ninehz-faq__q-btn {
		font-size: 16px;
		padding: 10px 20px;
	}
	.ninehz-sk-start .ninehz-faq.is-style-cards .ninehz-faq__q-btn[aria-expanded="true"] {
		padding-top: 10px;
		padding-bottom: 50px;
	}
	.ninehz-sk-start .ninehz-faq.is-style-cards .ninehz-faq__a-inner p {
		font-size: 16px;
		font-weight: 600;
		line-height: 1.1;
		letter-spacing: -0.02em;
	}
	.ninehz-sk-start .ninehz-faq.is-style-cards .ninehz-faq__a-inner::after {
		height: 10px;
	}
}

/* Strani klijenti "Let's start" — the desktop card metrics live in custom properties because the
   photo's height is derived from them (see the F33 rule below), so the two can never drift apart.
   The values are the compact ones the client signed off in the 2026-09 pass: question 24 / 1.1 /
   Medium, 20px above and below it, 10px between cards.
   `--ninehz-sk-cards` is the one content-dependent input. CSS cannot read another element's height,
   so the closed card stack has to be summed, and the number of cards is part of that sum — keep it
   equal to the number of ninehz/faq-item blocks in this section if one is ever added or removed.
   (Too low and the photo overhangs the last card again; too high and it stops short. Never broken,
   just off by one card.) */
.ninehz-sk-start {
	--ninehz-sk-card-q-size: 24px;
	--ninehz-sk-card-q-lh: 1.1;
	--ninehz-sk-card-pad-block: 20px;
	--ninehz-sk-card-gap: 10px;
	--ninehz-sk-cards: 6;
	/* One closed card = one line of question + its padding (the answer is a 0fr grid row, so it
	   measures 0 while closed); the closed stack = the cards plus the gaps between them. */
	--ninehz-sk-card-closed-h: calc(
		var(--ninehz-sk-card-q-size) * var(--ninehz-sk-card-q-lh) + 2 * var(--ninehz-sk-card-pad-block)
	);
	--ninehz-sk-cards-closed-h: calc(
		var(--ninehz-sk-cards) * var(--ninehz-sk-card-closed-h) +
			(var(--ninehz-sk-cards) - 1) * var(--ninehz-sk-card-gap)
	);
}

/* The photo — mobile and the ≤781px stacked range keep the Figma 629:541 landscape crop, cover-fit
   (client/designer feedback 2026-09; was the taller 612:761 before the compact pass). Side by side
   the height is pinned instead — next rule. */
.ninehz-sk-start .wp-block-column > .wp-block-image {
	margin: 0;
}
.ninehz-sk-start .wp-block-column > .wp-block-image img {
	aspect-ratio: 629 / 541;
	width: 100%;
	height: auto;
	object-fit: cover;
}

/* Client feedback F33: with every card closed the photo has to end exactly where the last card ends,
   and it must NOT re-size when a card is opened. Both halves follow from giving the image its own
   definite height equal to the closed card stack — it then owes nothing to the flex row, so the row
   growing around it changes nothing.
   Why not the alternatives: stretching the photo column (align-self / height:100%) ties the photo to
   the row's cross size, and that cross size IS the opened accordion — exactly the growth the client
   is rejecting. Leaving it to the aspect ratio only lands on the right height at a single viewport
   width, because the column width scales with the viewport while the card stack (fixed px type,
   padding and gap) does not. And making the open panel not add height to the row would mean taking it
   out of flow, which drops the answer on top of the card below.
   Scoped to the side-by-side range: below 782px WP stacks the columns and "as tall as the cards" is
   meaningless there. */
@media (min-width: 782px) {
	.ninehz-sk-start .wp-block-column > .wp-block-image img {
		aspect-ratio: auto; /* both axes are definite now, so the ratio no longer sizes the box */
		height: var(--ninehz-sk-cards-closed-h);
	}
}

/* Desktop-only (mobile keeps its own accordion sizing further below): the compact card — tighter gap,
   smaller/lighter question type, less padding (client/designer feedback 2026-09). Out-specifies the
   is-style-cards block style (inc/block-styles.php) without !important via the section-scoped
   selector. The metrics come from the custom properties above so the photo height stays in step. */
@media (min-width: 601px) {
	.ninehz-sk-start .ninehz-faq.is-style-cards {
		gap: var(--ninehz-sk-card-gap);
	}
	.ninehz-sk-start .ninehz-faq.is-style-cards .ninehz-faq__q-btn {
		font-size: var(--ninehz-sk-card-q-size);
		font-weight: 500;
		line-height: var(--ninehz-sk-card-q-lh);
		padding: var(--ninehz-sk-card-pad-block) 20px;
	}
	/* Open card (Figma 3145:11155 "Frame 210", client feedback F32): question → answer 50px, the
	   answer Semibold 14 / 1.1 / -0.02em, and 20px under it (the block style's ::after spacer). The
	   answer paragraph drops the theme's 1em paragraph margin here — it was adding 14px above AND
	   below, which is exactly why the gaps measured 54 and 34 instead of 50 and 20. */
	.ninehz-sk-start .ninehz-faq.is-style-cards .ninehz-faq__q-btn[aria-expanded="true"] {
		padding-top: var(--ninehz-sk-card-pad-block);
		padding-bottom: 50px;
	}
	.ninehz-sk-start .ninehz-faq.is-style-cards .ninehz-faq__a-inner p {
		margin: 0;
		font-weight: 600;
	}
}
/* The cards column still stretches to the row (min-height), so opening an item grows it past the
   photo — expected, and the photo stays where it is because its height is its own. The closed cards
   pack from the top with the fixed 10px gap rather than spreading (space-between) to fill the column:
   the photo is now exactly as tall as they are, so there is no slack left to spread into. */
.ninehz-sk-start .wp-block-columns {
	align-items: stretch;
}
.ninehz-sk-start .wp-block-columns > .wp-block-column:last-child {
	align-self: stretch;
}
.ninehz-sk-start .wp-block-column:last-child .ninehz-faq.is-style-cards {
	min-height: 100%;
	justify-content: flex-start;
}

/* Big faint section titles ("Project types", "Let's start") — Figma: 120 above / 100 below on
   desktop, 120 above / 50 below on mobile. padding-top lives here (not inline) so it differs per
   breakpoint; the ~120 above = this + the previous section's bottom padding. */
.ninehz-sk-titled {
	padding-top: 24px;
}
.ninehz-sk-titled > .wp-block-heading.has-ultra-font-size {
	margin-bottom: 100px;
}
/* F34 — "Project types" on International Clients, mobile (Figma 3145:14261). The mobile design is the
   same list + description + image pattern as "Vrste projekata" on the homepage, so the section carries
   a `ninehz/project-types` block for phones (and the four hover cards stay desktop-only); everything
   in it lands on the design straight from the block's own mobile rules, except the description, which
   Figma sets in Bold here where the homepage frame has it Semibold. Section-scoped (0,2,0) so the
   homepage keeps its own weight, no !important. */
@media (max-width: 781px) {
	.ninehz-sk-titled .ninehz-types__desc {
		font-weight: 700;
	}
}

/* Strani klijenti hero H1 — Figma "Headline 1" (48 / 700 / -0.02em), the same size on desktop and
   mobile (a dedicated size rather than the xx-large preset, which clamps down on phones). At 48px the
   copy wraps to the Figma line breaks naturally. */
.ninehz-sk-hero-title {
	font-size: 48px;
	font-weight: 700;
	letter-spacing: -0.02em;
}
/* Hero links — Body 3 (14) on desktop, Body 2 (16) on mobile. */
.ninehz-sk-hero-links p {
	font-size: var(--wp--preset--font-size--x-small);
}

@media (max-width: 600px) {
	.ninehz-sk-hero-links p {
		font-size: 1rem;
	}
	.ninehz-sk-titled {
		padding-top: 54px;
	}
	.ninehz-sk-titled > .wp-block-heading.has-ultra-font-size {
		margin-bottom: 50px;
	}

	/* Strani klijenti hero (Figma 3058:2930): on mobile the two links drop BELOW the photo and
	   spread left/right. Reorder the constrained section as a flex column. */
	.ninehz-sk-hero {
		display: flex;
		flex-direction: column;
	}
	.ninehz-sk-hero > .ninehz-sk-hero-title {
		order: 1;
		margin: 0;
	}
	.ninehz-sk-hero > .wp-block-image {
		order: 2;
		margin: 50px 0 0; /* 50px between the H1 and the photo (Figma mobile) */
	}
	.ninehz-sk-hero > .ninehz-sk-hero-links {
		order: 3;
		flex-wrap: nowrap; /* one row: Book a call pinned left, Your project brief pinned right */
		justify-content: space-between;
		align-self: stretch; /* full content width so the links reach the 16px gutters (Figma 3058:2934) */
		max-width: none;
		margin-inline: 0 !important; /* WP's alignwide auto-centering is !important — override it */
	}

	/* "Let's start" (Figma 3058:… / Image #83): on mobile the heading sits AFTER the photo, with
	   120 above it and 50 below. display:contents promotes the two columns to section flex items so
	   the heading can be ordered between them; the desktop equal-height fill is switched off. */
	.ninehz-sk-start {
		display: flex;
		flex-direction: column;
	}
	.ninehz-sk-start > .wp-block-columns {
		display: contents;
	}
	.ninehz-sk-start .wp-block-columns > .wp-block-column:first-child {
		order: 1;
		align-self: auto;
	}
	.ninehz-sk-start > .wp-block-heading.has-ultra-font-size {
		order: 2;
		margin-top: 120px;
		margin-bottom: 50px;
		align-self: stretch; /* full width in the flex column, not shrunk-to-content */
		/* WP's alignwide auto-centering is !important, so override in kind to left-align on mobile. */
		margin-inline: 0 !important;
		text-align: left;
	}
	.ninehz-sk-start .wp-block-columns > .wp-block-column:last-child {
		order: 3;
		align-self: auto;
	}
	.ninehz-sk-start .wp-block-column:last-child .ninehz-faq.is-style-cards {
		min-height: 0;
		justify-content: flex-start;
	}
}

/* Case-study "Opis + zahtjevi" section padding is controlled here rather than baked inline on the
   group (an inline style would shadow the mobile override). Desktop keeps the spacing-70 rhythm;
   mobile lands on the Figma 3099-* values: 120px above the paragraph, 100px between the paragraph and
   the "Ključni zahtjevi" list (the columns stack), 120px below the list before "Izazovi". The group
   carries ~83px of upstream section padding above and ~16px of block-gap below on mobile, so its own
   padding is 37 / 104 to total 120. */
.single-projekt .wp-block-post-content > .wp-block-group {
	padding-top: var(--wp--preset--spacing--70);
	padding-bottom: var(--wp--preset--spacing--70);
}
@media (max-width: 600px) {
	.single-projekt .wp-block-post-content > .wp-block-group {
		padding-top: 37px;
		padding-bottom: 104px;
	}
	.single-projekt .wp-block-post-content > .wp-block-group .wp-block-columns {
		row-gap: 100px;
	}

	/* Hero: 50px between the title, the fact sheet and the featured image (Figma 3099 header) — the
	   section block-gap is only ~25px on mobile, so top these up. */
	.single-projekt .ninehz-factsheet,
	.single-projekt .wp-block-post-featured-image {
		margin-top: 50px;
	}

	/* 120px after the last Rješenje image before "Slični projekti" (Figma). ~99px already comes from
	   the two section paddings, so add the remainder. */
	.single-projekt .ninehz-rp {
		margin-top: 21px;
	}
}

/* ===================== Cjenik page (3104-2553) ===================== */
/* Page grid: small title/intro column (left) + wide content column (right). */
.ninehz-cjenik-grid { align-items: flex-start; }

/* The 5 pricing categories reuse the strani-klijenti ".ninehz-sk-steps" component (desktop split
   rows + mobile accordion) — see that section above. Only page-specific bits live below. */

/* Subtitle under a lead paragraph (form intro, Konzultacije) — SAME font + size as the is-style-lead
   heading it follows (Body 1), just lighter/grey, with a blank line between (Figma / client note). */
.ninehz-cjenik-sub {
	margin-top: 1.1em;
	font-family: var(--wp--preset--font-family--suisse);
	font-size: var(--wp--preset--font-size--lead);
	font-weight: 500;
	line-height: 1.15;
	letter-spacing: -0.02em;
	color: var(--wp--preset--color--muted);
}

/* Soft secondary CTA — the 15-min razgovor (must not compete with "Pošalji upit").
   CURRENTLY UNUSED: the "Niste sigurni odakle krenuti?" section that carried these classes was
   removed from Cjenik on the client's instruction (F25). Figma puts the same block on Proces
   (node 3149:24954) instead, which is an open question with the client — kept so it can go back
   in one step. Delete if the client confirms the block is gone for good. */
.ninehz-cta-soft { max-width: 620px; }
.ninehz-cta-soft__q { margin: 0 0 .3em; font-weight: 600; letter-spacing: -0.01em; color: var(--wp--preset--color--contrast); }
.ninehz-cta-soft__t { margin: 0 0 1.25em; font-size: var(--wp--preset--font-size--small); line-height: 1.4; color: var(--wp--preset--color--muted); }

/* Konzultacije price — 20 px Bold per Figma 3145:8005 (the whole Konzultacije block sits on the
   20 px `lead` step, price included). */
.ninehz-konz-price {
	margin-top: 1.25em;
	font-family: var(--wp--preset--font-family--suisse);
	font-weight: 700;
	font-size: var(--wp--preset--font-size--lead);
	letter-spacing: -0.02em;
	color: var(--wp--preset--color--contrast);
}

/* Konzultacije band (Figma 3149:24953) — client feedback F24. Everything inside the block already
   lands on the design and needed no new rule: the heading is 32 px Bold (the `x-large` preset caps
   at 2rem and `.wp-block-heading.has-x-large-font-size` above already bumps that step to 700),
   with -0.02em = -0.64 px and line-height 1.1 from the heading tokens in theme.json; all three
   paragraphs sit on the 20 px `lead` step with the same -0.02em = -0.4 px track. The two-column
   geometry (519 + 133 + 628 = 1280, the full content width) is authored as block attributes on the
   page itself — column width and column gap are exactly what those attributes are for, and keeping
   them there means the Site Editor shows the real split instead of a front-end-only override.

   That leaves the band's own vertical space, which is the one genuine exception. Figma gives it
   128 px above and a 294 px tail, against the site-wide 120 px section rhythm; the tail is large
   because this section closes the page, the same reason the Studio moodboard ends on 250 rather
   than the rhythm. The exception is worth making here: the rhythm rule exists to stop sections
   doubling up on each other, and nothing follows this one except the footer.

   No !important is needed. This selector is (0,2,0) — exactly the specificity of the rhythm rule
   `.entry-content > .wp-block-group` it overrides — and sits later in the file, so source order
   settles it and any later rule can still override this in turn. Scoped to min-width 782 on
   purpose: below that the columns stack and the section takes the 80 px mobile rhythm, so these
   desktop numbers must not reach it. */
@media (min-width: 782px) {
	.entry-content > .ninehz-konz {
		padding-block: 128px 294px;
	}
	/* The same band on Proces (Figma 3149:24954, client feedback F22): "Niste sigurni odakle krenuti?"
	   + the 15-min call CTA. Same design, but it sits between Parametri and the FAQ rather than closing
	   the page, so Figma gives it 128 above AND below — no long tail. */
	.entry-content > .ninehz-konz-proces {
		padding-block: 128px;
	}
}

/* Body line of the Proces band — Figma 3149:24954: 20 Medium / 1.1 / -0.02em (= -0.4px) in Concrete
   Grey with a Bold run ("15-min informativni razgovor"). The `lead` preset gives the size; the track
   and the tight leading are this band's own, so they ride on a class instead of the preset. */
.ninehz-konz-text {
	line-height: 1.1;
	letter-spacing: -0.02em;
}

/* The Proces band sits directly above the dark FAQ, and the 16px of margin every top-level section
   carries (the content blockGap) showed as a white line between the grey and the dark — client report
   2026-09-08, the same defect as on Cjenik. Collapsed for this pair, both breakpoints; the rest of
   the site keeps the 16px (see the note in the Cjenik rule above). (0,3,0), no !important. */
.entry-content > .ninehz-konz-proces + .wp-block-group {
	margin-block-start: 0;
}

/* CTA line of the Proces band ("→ Dogovorite razgovor") — Figma 3149:24954: Suisse Bold 20 / -0.02em
   in Concrete Grey, 60px under the paragraph (the band's row gap). Same type as the Konzultacije
   price above, which is why the two share the declaration; only the distance differs. */
.ninehz-konz-cta {
	margin-top: 60px;
	font-family: var(--wp--preset--font-family--suisse);
	font-weight: 700;
	font-size: var(--wp--preset--font-size--lead);
	letter-spacing: -0.02em;
}
.ninehz-konz-cta a {
	color: var(--wp--preset--color--contrast);
	text-decoration: none;
}

/* Cjenik on mobile, client report 2026-09-08: a white line ran across the seam between the form band
   and Konzultacije. Both bands are grey there, and every top-level section carries 16px of
   margin-block-start (the entry-content blockGap) — between two white sections that strip is
   invisible, between two grey ones it shows as the page background. Collapsed for this pair only;
   the same 16px sits between every other pair on the site and removing it globally would retune the
   whole 80/120 rhythm the client already signed off (F02).
   In the same pass the band was asked to breathe: 80px between the "Konzultacije" heading and the
   copy that follows (it was 16px — the stacked columns fall back to the root blockGap on mobile,
   because the authored 133px gap is a column gap and only applies side by side). The section keeps
   the shared 80px mobile rhythm. (0,2,0)/(0,3,0) — level with or above the rules they override,
   later in the file, no !important. */
@media (max-width: 781px) {
	.entry-content > .ninehz-cjenik-formsec + .ninehz-konz {
		margin-block-start: 0;
	}
	.ninehz-konz > .wp-block-columns {
		row-gap: 80px;
	}
}

/* Form section vertical padding lives here (not inline) so the mobile grey block can retune it.
   Anchor target for "/cjenik/#inquiry-form" (International Clients "Your project brief" links here):
   the sticky header would otherwise cover the section top on fragment navigation. */
.ninehz-cjenik-formsec {
	padding-top: var(--wp--preset--spacing--60);
	padding-bottom: var(--wp--preset--spacing--70);
	scroll-margin-top: calc(var(--ninehz-header-h) + 1rem);
}

/* --- Consent banner (inc/consent.php + assets/js/consent.js) ------------------------------- */
.ninehz-consent {
	position: fixed;
	left: 16px;
	bottom: 16px;
	z-index: 9999;
	width: min(400px, calc(100vw - 32px));
	padding: 24px;
	background: var(--wp--preset--color--base, #fff);
	border: 1px solid var(--wp--preset--color--contrast, #404040);
	color: var(--wp--preset--color--contrast, #404040);
	font-family: var(--wp--preset--font-family--suisse, inherit);
}

.ninehz-consent__title {
	margin: 0 0 8px;
	font-family: var(--wp--preset--font-family--plex-mono, ui-monospace, monospace);
	font-size: 12px;
	font-weight: 500;
	letter-spacing: 0.2em;
	text-transform: uppercase;
}

.ninehz-consent__text {
	margin: 0 0 16px;
	font-size: 14px;
	line-height: 1.45;
}

.ninehz-consent__text a {
	color: inherit;
}

.ninehz-consent__opts {
	display: flex;
	flex-direction: column;
	gap: 10px;
	margin: 0 0 16px;
}

/* display:flex above would defeat the hidden attribute the JS toggles. */
.ninehz-consent__opts[hidden] {
	display: none;
}

.ninehz-consent__opt {
	display: flex;
	gap: 10px;
	align-items: flex-start;
	font-size: 14px;
	line-height: 1.4;
	cursor: pointer;
}

.ninehz-consent__opt input {
	flex: none;
	margin: 2px 0 0;
	accent-color: var(--wp--preset--color--contrast, #404040);
}

.ninehz-consent__note {
	margin: 0;
	font-size: 12px;
	color: var(--wp--preset--color--muted, #6e6e69);
}

.ninehz-consent__actions {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
}

.ninehz-consent__btn {
	min-height: 40px;
	padding: 0 18px;
	border: 1px solid var(--wp--preset--color--contrast, #404040);
	border-radius: 999px;
	background: transparent;
	color: var(--wp--preset--color--contrast, #404040);
	font-family: var(--wp--preset--font-family--suisse, inherit);
	font-size: 14px;
	font-weight: 600;
	letter-spacing: -0.01em;
	cursor: pointer;
	transition: opacity 0.2s ease;
}

.ninehz-consent__btn:hover {
	opacity: 0.8;
}

.ninehz-consent__btn--accept {
	background: var(--wp--preset--color--contrast, #404040);
	color: var(--wp--preset--color--base, #fff);
}

@media (max-width: 560px) {
	.ninehz-consent {
		left: 0;
		right: 0;
		bottom: 0;
		width: auto;
		border-left: 0;
		border-right: 0;
		border-bottom: 0;
	}

	.ninehz-consent__btn {
		flex: 1 1 auto;
	}
}
