/*
Theme Name: NovoFy
Description: NovoFy v2 child theme of Twenty Twenty-Five. Tokens, type, and spacing from the design explorer export (RP-adapted Fernando set).
Template: twentytwentyfive
Version: 1.37.0
Requires at least: 6.7
Requires PHP: 7.4
Text Domain: novofy
License: GNU General Public License v2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
*/

/* ------------------------------------------------------------------
   Parent theme aliases. Twenty Twenty-Five templates and patterns
   reference its own preset slugs; these map them to NovoFy values.
   ------------------------------------------------------------------ */
:root {
	--wp--preset--color--base: var(--wp--preset--color--ground);
	--wp--preset--color--contrast: var(--wp--preset--color--ink);
	--wp--preset--color--accent-1: var(--wp--preset--color--accent-primary);
	--wp--preset--color--accent-2: var(--wp--preset--color--accent-secondary);
	--wp--preset--color--accent-3: var(--wp--preset--color--surface-inverted);
	--wp--preset--color--accent-4: var(--wp--preset--color--ink-muted);
	--wp--preset--color--accent-5: var(--wp--preset--color--surface-2);
	--wp--preset--color--accent-6: var(--wp--preset--color--border);
	--wp--preset--font-family--manrope: var(--wp--preset--font-family--dm-sans);
	--wp--preset--font-family--fira-code: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
	--wp--preset--font-size--small: var(--wp--preset--font-size--body-s);
	--wp--preset--font-size--medium: var(--wp--preset--font-size--body-m);
	--wp--preset--font-size--large: var(--wp--preset--font-size--body-l);
	--wp--preset--font-size--x-large: var(--wp--preset--font-size--m);
	--wp--preset--font-size--xx-large: var(--wp--preset--font-size--l);
	--wp--preset--spacing--10: 12px;
	--wp--preset--spacing--20: var(--wp--preset--spacing--stack);
	--wp--preset--spacing--30: 32px;
	--wp--preset--spacing--40: var(--wp--preset--spacing--heading);
	--wp--preset--spacing--50: var(--wp--preset--spacing--grid);
	--wp--preset--spacing--60: var(--wp--preset--spacing--section);
	--wp--preset--spacing--70: 120px;
	--wp--preset--spacing--80: 160px;
}

/* ------------------------------------------------------------------
   Text rendering (matches the design explorer)
   ------------------------------------------------------------------ */
body {
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

/* Line heights by role (Aesthetic Build Spec v5 type scale) */
.has-body-l-font-size { line-height: 1.42; }
.has-body-s-font-size { line-height: 1.5; }
h3.has-s-font-size,
h4.has-s-font-size { line-height: 1.3; letter-spacing: 0; }

/* ------------------------------------------------------------------
   Rhythm
   ------------------------------------------------------------------ */
h1.wp-block-heading + *,
h2.wp-block-heading + *,
h3.wp-block-heading + * {
	margin-block-start: var(--wp--preset--spacing--heading);
}

p.is-style-eyebrow + * {
	margin-block-start: var(--wp--preset--spacing--eyebrow);
}

/* ------------------------------------------------------------------
   Buttons and focus
   ------------------------------------------------------------------ */
.wp-block-button__link,
.wp-element-button {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-height: var(--wp--custom--button--height);
}

:focus-visible {
	outline: 2px solid var(--band-focus, var(--wp--preset--color--focus));
	outline-offset: 3px;
}

/* ------------------------------------------------------------------
   Paragraph styles
   ------------------------------------------------------------------ */
.is-style-muted {
	color: var(--band-muted, var(--wp--preset--color--ink-muted));
}

p.is-style-eyebrow {
	font-family: var(--wp--preset--font-family--dm-sans);
	font-size: var(--wp--preset--font-size--eyebrow);
	font-weight: 500;
	letter-spacing: 0.12em;
	text-transform: uppercase;
	line-height: 1.2;
	color: var(--band-muted, var(--wp--preset--color--ink-muted));
}

p.is-style-emphasis {
	font-family: var(--wp--preset--font-family--newsreader);
	font-size: var(--wp--preset--font-size--l);
	line-height: 1.03;
	letter-spacing: -0.015em;
	margin-block: 44px;
}

p.is-style-data {
	font-family: var(--wp--preset--font-family--newsreader);
	font-size: var(--wp--preset--font-size--data);
	line-height: 1;
	letter-spacing: -0.02em;
}

/* ------------------------------------------------------------------
   Bands (Group block styles)
   Each band sets its own background and the text, link, button,
   and focus colors that pass WCAG AA on that background.
   ------------------------------------------------------------------ */
.wp-block-group[class*="is-style-band-"] {
	--band-ink: var(--wp--preset--color--ink);
	--band-muted: var(--wp--preset--color--ink-muted);
	--band-link: var(--wp--preset--color--link);
	--band-link-hover: var(--wp--preset--color--accent-primary-hover);
	--band-focus: var(--wp--preset--color--focus);
	--band-btn-bg: var(--wp--preset--color--surf-accent);
	--band-btn-ink: var(--wp--preset--color--ink-inverted);
	--band-btn-hover: var(--wp--preset--color--surf-accent-hover);
	--band-btn2-bg: var(--wp--preset--color--surf-wash);
	--band-btn2-ink: var(--wp--preset--color--ink);
	--band-btn2-border: transparent;
	--band-btn2-hover: var(--wp--preset--color--lilac-hover);
	position: relative;
	isolation: isolate;
	background: var(--band-bg);
	color: var(--band-ink);
	padding-block: var(--wp--preset--spacing--section);
	padding-inline: var(--wp--preset--spacing--side);
}

/* All light bands are white. Paper, Wash, and Tint are kept as aliases of
   White so pages built before 1.7.0 turn white without re-inserting patterns. */
.wp-block-group.is-style-band-white,
.wp-block-group.is-style-band-paper,
.wp-block-group.is-style-band-wash,
.wp-block-group.is-style-band-tint { --band-bg: var(--wp--preset--color--surf-white); }

/* Wash and tint: darker muted text and links (approved contrast fix) */
.wp-block-group.is-style-band-wash,
.wp-block-group.is-style-band-tint {
	--band-muted: var(--wp--custom--contrast--muted-on-light);
	--band-link: var(--wp--custom--contrast--link-on-light);
}

.wp-block-group.is-style-band-wash .has-ink-muted-color,
.wp-block-group.is-style-band-tint .has-ink-muted-color {
	color: var(--wp--custom--contrast--muted-on-light) !important;
}

.wp-block-group.is-style-band-wash .has-link-color,
.wp-block-group.is-style-band-tint .has-link-color {
	color: var(--wp--custom--contrast--link-on-light) !important;
}

.wp-block-group.is-style-band-wash .has-accent-primary-color,
.wp-block-group.is-style-band-tint .has-accent-primary-color {
	color: var(--wp--preset--color--accent-primary-hover) !important;
}

/* Dark bands */
.wp-block-group.is-style-band-inverted,
.wp-block-group.is-style-band-accent,
.wp-block-group.is-style-band-gradient,
.wp-block-group.is-style-band-hero,
.wp-block-group.is-style-band-motion,
.wp-block-group:is(.novofy-box--accent, .is-style-box-green, .is-style-box-motion) {
	--band-ink: var(--wp--preset--color--ink-inverted);
	--band-btn-bg: var(--wp--preset--color--ground);
	--band-btn-ink: var(--wp--preset--color--ink);
	--band-btn-hover: var(--wp--preset--color--surface-2);
	--band-btn2-bg: transparent;
	--band-btn2-ink: var(--wp--preset--color--ink-inverted);
	--band-btn2-border: rgba(252, 252, 253, 0.5);
	--band-btn2-hover: rgba(252, 252, 253, 0.12);
}

.wp-block-group.is-style-band-inverted {
	--band-bg: var(--wp--preset--color--surface-inverted);
	--band-muted: var(--wp--custom--contrast--muted-on-inverted);
	--band-link: var(--wp--preset--color--accent-secondary);
	--band-link-hover: var(--wp--preset--color--ink-inverted);
	--band-focus: var(--wp--preset--color--accent-secondary);
}

/* Accent and gradient: no muted tone passes, so muted text uses full ink-inverted */
.wp-block-group.is-style-band-accent,
.wp-block-group.is-style-band-gradient,
.wp-block-group.is-style-band-hero,
.wp-block-group.is-style-band-motion,
.wp-block-group:is(.novofy-box--accent, .is-style-box-green, .is-style-box-motion) {
	--band-muted: var(--wp--preset--color--ink-inverted);
	--band-link: var(--wp--preset--color--ink-inverted);
	--band-link-hover: var(--wp--preset--color--ink-inverted);
	--band-focus: var(--wp--preset--color--ink-inverted);
}

.wp-block-group.is-style-band-accent { --band-bg: var(--wp--preset--color--surf-accent); }
.wp-block-group.is-style-band-gradient { --band-bg: var(--wp--preset--gradient--brand); }

/* ------------------------------------------------------------------
   Hero band: brand gradient with slow drift, constellation canvas
   behind the content (assets/js/constellation.js). One per site.
   ------------------------------------------------------------------ */
.wp-block-group.is-style-band-hero {
	--band-bg: var(--wp--preset--gradient--brand);
	background-size: 200% 200%;
	animation: novofy-gradient-drift 40s ease-in-out infinite alternate;
}

@keyframes novofy-gradient-drift {
	from { background-position: 0% 50%; }
	to { background-position: 100% 50%; }
}

.wp-block-group.is-style-band-hero > .novofy-constellation {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	z-index: -1;
	pointer-events: none;
}

@media (prefers-reduced-motion: reduce) {
	.wp-block-group.is-style-band-hero { animation: none; }
}

.wp-block-group[class*="is-style-band-"] a:where(:not(.wp-element-button)) {
	color: var(--band-link);
}

.wp-block-group[class*="is-style-band-"] a:where(:not(.wp-element-button)):hover {
	color: var(--band-link-hover);
}

.wp-block-group[class*="is-style-band-"] .wp-element-button,
.wp-block-group[class*="is-style-band-"] .wp-block-button__link {
	background: var(--band-btn-bg);
	color: var(--band-btn-ink);
}

.wp-block-group[class*="is-style-band-"] .wp-element-button:hover,
.wp-block-group[class*="is-style-band-"] .wp-block-button__link:hover {
	background: var(--band-btn-hover);
}

/* Consecutive bands sit flush with a hard edge (fades removed in 1.7.0). */
.wp-block-group[class*="is-style-band-"] + .wp-block-group[class*="is-style-band-"] {
	margin-block-start: 0;
}

/* ------------------------------------------------------------------
   Page frame: header, main, footer sit flush
   ------------------------------------------------------------------ */
.wp-site-blocks > main,
.wp-site-blocks > footer,
.novofy-main > .wp-block-post-content {
	margin-block-start: 0;
}

.novofy-main .wp-block-post-content > *:first-child {
	margin-block-start: 0;
}

/* ------------------------------------------------------------------
   Header (1.13.0): a bar fixed to the bottom of the screen. Brand on the
   left, page links centered, Contact on the right. Clear over the hero,
   translucent navy elsewhere. It slides away while scrolling down and a
   small Contact button takes its place in the bottom-right corner
   (assets/js/site.js); scrolling up brings the bar back.
   ------------------------------------------------------------------ */
.wp-site-blocks > header {
	position: fixed;
	inset: auto 0 0 0;
	z-index: 50;
	color: var(--wp--preset--color--ink-inverted);
	background: rgba(10, 54, 84, 0.9);
	-webkit-backdrop-filter: blur(14px) saturate(140%);
	backdrop-filter: blur(14px) saturate(140%);
	border-top: 1px solid rgba(252, 252, 253, 0.16);
	transition: transform 0.35s ease, background-color 0.2s, border-color 0.2s;
}

.novofy-has-hero .wp-site-blocks > header:not(.is-scrolled) {
	background: transparent;
	border-top-color: transparent;
	-webkit-backdrop-filter: none;
	backdrop-filter: none;
}

.wp-site-blocks > header.is-hidden {
	transform: translateY(calc(100% + 2px));
}

/* The mobile menu overlay needs the screen, not the bar, as its frame */
.wp-site-blocks > header:has(.is-menu-open) {
	transform: none;
	-webkit-backdrop-filter: none;
	backdrop-filter: none;
}

.novofy-header {
	display: grid;
	grid-template-columns: 1fr auto 1fr;
	align-items: center;
	gap: 40px;
	min-height: var(--wp--custom--header--height);
	padding-inline: var(--wp--preset--spacing--side);
}

.novofy-header > * { margin: 0 !important; }
.novofy-header__brand { justify-self: start; }
.novofy-header__nav { justify-self: center; }
.novofy-header__cta { justify-self: end; }

.novofy-header a:where(:not(.wp-element-button)) {
	color: inherit;
	text-decoration: none;
}

.novofy-header .wp-block-navigation {
	gap: 28px;
}

.novofy-header .wp-block-navigation a:hover {
	text-decoration: underline;
	text-underline-offset: 4px;
}

.novofy-header__cta .wp-block-button__link,
.novofy-mini-contact {
	min-height: 44px;
	padding-inline: 20px;
	font-size: var(--wp--preset--font-size--nav);
	background: var(--wp--preset--color--ground);
	color: var(--wp--preset--color--ink);
}

.novofy-header .wp-block-navigation__responsive-container.is-menu-open {
	background: var(--wp--preset--color--ground);
	color: var(--wp--preset--color--ink);
	padding: var(--wp--preset--spacing--side);
}

.novofy-mini-contact {
	position: fixed;
	right: 20px;
	bottom: 20px;
	z-index: 49;
	display: inline-flex;
	align-items: center;
	border-radius: 999px;
	text-decoration: none;
	font-family: var(--wp--preset--font-family--dm-sans);
	font-weight: 500;
	box-shadow: 0 6px 24px rgba(10, 54, 84, 0.28);
	opacity: 0;
	transform: translateY(12px);
	pointer-events: none;
	transition: opacity 0.25s, transform 0.25s;
}

.novofy-mini-contact.is-shown {
	opacity: 1;
	transform: none;
	pointer-events: auto;
}

.novofy-mini-contact:hover { background: var(--wp--preset--color--surface-2); }

@media (max-width: 781px) {
	.novofy-header { grid-template-columns: auto 1fr auto; gap: 16px; }
	.novofy-header__nav { justify-self: end; }
}

@media (prefers-reduced-motion: reduce) {
	.wp-site-blocks > header,
	.novofy-mini-contact { transition: none; }
}

/* The hero no longer sits under a top header */
.novofy-has-hero .novofy-main .wp-block-post-content > .novofy-hero:first-child {
	padding-top: var(--wp--preset--spacing--section);
}

/* ------------------------------------------------------------------
   Panels (home). Each band fills the viewport; the proof band is shorter.
   ------------------------------------------------------------------ */
.wp-block-group.novofy-panel > * {
	width: 100%;
}

/* Only the hero fills the screen; every other section uses the
   standard section padding (140px top and bottom). */
.wp-block-group.novofy-hero {
	min-height: 100svh;
	display: flex;
	flex-direction: column;
	justify-content: center;
}

.novofy-panel h1 { max-width: min(22ch, 100%); }
.novofy-panel h2 { max-width: min(18ch, 100%); line-height: 1.03; letter-spacing: -0.015em; }
.novofy-panel p:not(.is-style-emphasis):not(.is-style-data) { max-width: 66ch; }

.novofy-subhero {
	margin-block-start: 32px;
	max-width: 60ch;
}

.novofy-btn-row {
	margin-block-start: 48px;
	gap: 16px;
}

/* ------------------------------------------------------------------
   Buttons: outline variant
   ------------------------------------------------------------------ */
.wp-block-button.is-style-outline > .wp-block-button__link {
	background: var(--band-btn2-bg, var(--wp--preset--color--surf-wash));
	color: var(--band-btn2-ink, var(--wp--preset--color--ink));
	border: 1px solid var(--band-btn2-border, transparent);
	padding-block: 0;
}

.wp-block-button.is-style-outline > .wp-block-button__link:hover {
	background: var(--band-btn2-hover, var(--wp--preset--color--lilac-hover));
}

/* ------------------------------------------------------------------
   Components
   ------------------------------------------------------------------ */
.wp-block-columns.novofy-split,
.wp-block-columns.novofy-cards {
	gap: var(--wp--preset--spacing--grid);
}

.wp-block-columns.novofy-cards {
	margin-block-start: var(--wp--preset--spacing--heading);
}

.novofy-cite {
	margin-block-start: 32px;
}

.novofy-cite a {
	text-underline-offset: 3px;
}

/* Loop chips */
.novofy-loop {
	gap: 12px;
	align-items: center;
	margin-block: 32px;
}

.novofy-loop > p {
	margin: 0;
	font-size: var(--wp--preset--font-size--body-s);
	color: var(--band-muted, var(--wp--preset--color--ink-muted));
}

.novofy-loop__step {
	padding: 6px 14px;
	border: 1px solid var(--wp--preset--color--border);
}

.novofy-loop__arrow {
	opacity: 0.55;
}

/* Proof bar */
.wp-block-columns.novofy-proof {
	gap: 0;
}

.novofy-proof > .wp-block-column {
	padding-inline: 32px;
}

.novofy-proof > .wp-block-column:first-child {
	padding-inline-start: 0;
}

.novofy-proof > .wp-block-column + .wp-block-column {
	border-inline-start: 1px solid rgba(252, 252, 253, 0.3);
}

.novofy-proof__label {
	margin-block-start: 14px;
	max-width: 26ch;
}

/* Cards: top rule, whole card clickable */
.novofy-card {
	position: relative;
	border-top: 2px solid currentColor;
	padding-top: 28px;
	transition: transform 0.15s;
}

.novofy-card:has(a):hover {
	transform: translateY(-2px);
}

.novofy-card > * + * {
	margin-block-start: 12px;
}

.novofy-card__go {
	margin-block-start: 24px !important;
}

.novofy-card__go a {
	text-decoration: none;
	color: var(--wp--preset--color--accent-primary);
}

.is-style-band-wash .novofy-card__go a,
.is-style-band-tint .novofy-card__go a {
	color: var(--wp--preset--color--accent-primary-hover);
}

.novofy-card__go a::after,
.novofy-news .wp-block-post-title a::after {
	content: "";
	position: absolute;
	inset: 0;
}

.novofy-card .wp-block-post-title a {
	color: inherit;
	text-decoration: none;
}

/* Placeholder */
.novofy-ph {
	display: flex;
	align-items: center;
	justify-content: center;
	text-align: center;
	padding: 24px;
	border: 1px dashed var(--wp--preset--color--border);
	color: var(--band-muted, var(--wp--preset--color--ink-muted));
	background: repeating-linear-gradient(135deg, rgba(0, 0, 0, 0.035), rgba(0, 0, 0, 0.035) 10px, transparent 10px, transparent 20px);
}

.novofy-ph--portrait {
	aspect-ratio: 1 / 1;
	width: 100%;
	max-width: 300px;
	margin-block-end: 28px;
}

/* News grid */
.novofy-news {
	margin-block-start: var(--wp--preset--spacing--heading);
}

.novofy-news .wp-block-post-template {
	gap: var(--wp--preset--spacing--grid);
}

/* ------------------------------------------------------------------
   Media: image rotator and platform video
   ------------------------------------------------------------------ */
.novofy-rotator,
.novofy-video {
	position: relative;
}

.novofy-rotator.is-ready {
	display: grid;
}

.novofy-rotator.is-ready > .novofy-rotator__item {
	grid-area: 1 / 1;
	margin: 0;
	opacity: 0;
	transition: opacity 0.25s ease;
}

.novofy-rotator.is-ready > .novofy-rotator__item.is-active {
	opacity: 1;
}

.novofy-rotator__item img,
.novofy-video video {
	display: block;
	width: 100%;
	height: auto;
}

.novofy-video {
	margin: 0;
}

.novofy-media-toggle {
	position: absolute;
	right: 8px;
	bottom: 8px;
	z-index: 2;
	min-height: 32px;
	padding: 0 12px;
	border: 1px solid var(--wp--preset--color--border);
	background: rgba(252, 252, 253, 0.85);
	color: var(--wp--preset--color--ink);
	font-family: var(--wp--preset--font-family--dm-sans);
	font-size: 13px;
	cursor: pointer;
}

.novofy-media-toggle:hover {
	background: var(--wp--preset--color--ground);
}

/* ------------------------------------------------------------------
   Footer (gradient band from the export)
   ------------------------------------------------------------------ */
.wp-block-group.novofy-footer {
	padding-block: 96px 56px;
	background-size: 200% 200%;
	animation: novofy-gradient-drift 40s ease-in-out infinite alternate;
}

.wp-block-group.novofy-footer > .novofy-constellation {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	z-index: -1;
	pointer-events: none;
}

@media (prefers-reduced-motion: reduce) {
	.wp-block-group.novofy-footer { animation: none; }
}

.novofy-footer__row {
	gap: 40px;
	width: 100%;
}

.novofy-footer__row + .novofy-footer__row {
	margin-block-start: 64px;
	padding-block-start: 24px;
	border-top: 1px solid rgba(252, 252, 253, 0.2);
}

.novofy-footer .wp-block-site-title a {
	color: inherit;
	text-decoration: none;
}

.novofy-footer__meta {
	margin-block-start: 10px;
	font-size: var(--wp--preset--font-size--body-s);
	opacity: 0.82;
}

.novofy-footer__meta a {
	text-decoration: none;
}

.novofy-footer__meta a:hover {
	text-decoration: underline;
}

/* ------------------------------------------------------------------
   Small screens
   ------------------------------------------------------------------ */
@media (max-width: 781px) {
	.wp-block-columns.novofy-proof {
		gap: 32px;
	}

	.novofy-proof > .wp-block-column {
		padding-inline: 0;
	}

	.novofy-proof > .wp-block-column + .wp-block-column {
		border-inline-start: 0;
		border-top: 1px solid rgba(252, 252, 253, 0.3);
		padding-top: 32px;
	}

	.novofy-news .wp-block-post-template {
		grid-template-columns: 1fr;
	}
}

@media (prefers-reduced-motion: reduce) {
	.novofy-rotator.is-ready > .novofy-rotator__item,
	.novofy-card {
		transition: none;
	}
}

/* Keep the footer at the bottom on short pages */
.wp-site-blocks {
	min-height: 100svh;
	display: flex;
	flex-direction: column;
}

.wp-site-blocks > main {
	flex: 1 0 auto;
}

/* ------------------------------------------------------------------
   Interior pages (1.3.0)
   ------------------------------------------------------------------ */
.novofy-page-hero {
	padding: calc(var(--wp--preset--spacing--section) * 1.25) var(--wp--preset--spacing--side) var(--wp--preset--spacing--section);
}

.novofy-page-hero h1 { max-width: min(22ch, 100%); }
.novofy-page-hero .novofy-subhero { max-width: 60ch; }

.novofy-hero-proof { margin-block-start: 24px; }

.wp-block-group.novofy-section h2 { max-width: min(22ch, 100%); }
.wp-block-group.novofy-section p:not(.is-style-data) { max-width: 66ch; }

.wp-block-columns.novofy-cards--3 .wp-block-column { flex-basis: 0; }

/* Proof band on interior pages sits shorter */
.wp-block-group.novofy-proofband {
	padding-block: var(--wp--preset--spacing--section);
}

.novofy-proof__note { margin-block-start: 32px; }

.novofy-stat { margin-block-start: 32px; }

/* FAQ accordion */
.novofy-faq { margin-block-start: var(--wp--preset--spacing--heading); }

.novofy-faq .wp-block-details {
	border-top: 1px solid var(--wp--preset--color--border);
	padding-block: 20px;
	margin: 0;
}

.novofy-faq .wp-block-details:last-child {
	border-bottom: 1px solid var(--wp--preset--color--border);
}

.novofy-faq summary {
	cursor: pointer;
	font-family: var(--wp--preset--font-family--newsreader);
	font-size: var(--wp--preset--font-size--s);
	line-height: 1.3;
}

.novofy-faq .wp-block-details > p { margin-block-start: 12px; }
.novofy-faq__link a { text-underline-offset: 3px; }

/* Placeholders */
.novofy-todo { font-style: italic; }

.novofy-form-slot {
	min-height: 320px;
	margin-block-start: var(--wp--preset--spacing--heading);
}

/* Publications */
.novofy-pub {
	border-top: 1px solid var(--wp--preset--color--border);
	padding-block: 20px;
}

.novofy-pub:first-of-type { margin-block-start: var(--wp--preset--spacing--heading); }
.novofy-pub > * + * { margin-block-start: 6px; }
.novofy-doi a { text-underline-offset: 3px; }

/* Author strip */
.wp-block-group.novofy-author-strip {
	padding-block: var(--wp--preset--spacing--section);
}

/* News article */
.novofy-article__head > * + * { margin-block-start: 16px; }
.novofy-article__head h1 { max-width: min(26ch, 100%); }

.novofy-article__body {
	padding-inline: var(--wp--preset--spacing--side);
	max-width: calc(760px + 2 * var(--wp--preset--spacing--side));
}

.novofy-article__foot {
	padding: 0 var(--wp--preset--spacing--side) var(--wp--preset--spacing--section);
}

.novofy-pagination { margin-block-start: var(--wp--preset--spacing--heading); }

/* Buttons without a link yet (for example, Book a call before the Calendly URL) */
.wp-block-button__link:not([href]) { cursor: default; }

/* ------------------------------------------------------------------
   Intake toggle and HubSpot form (1.4.0)
   ------------------------------------------------------------------ */
.novofy-intake {
	margin-block-start: var(--wp--preset--spacing--heading);
	max-width: 880px;
}

.novofy-intake__toggle {
	display: inline-flex;
	border: 1px solid var(--band-ink, var(--wp--preset--color--ink));
	margin-block-end: 32px;
}

.novofy-intake__toggle button {
	min-height: 44px;
	padding: 0 24px;
	border: 0;
	background: transparent;
	color: var(--band-ink, var(--wp--preset--color--ink));
	font-family: var(--wp--preset--font-family--dm-sans);
	font-size: var(--wp--preset--font-size--nav);
	cursor: pointer;
}

.novofy-intake__toggle button[aria-selected="true"] {
	background: var(--band-ink, var(--wp--preset--color--ink));
	color: var(--band-bg, var(--wp--preset--color--ground));
}

.novofy-intake__panel {
	background: var(--wp--preset--color--ground);
	padding: 8px;
}

/* Portraits */
.wp-block-image.novofy-portrait {
	max-width: 300px;
	margin-block-end: 28px;
}

.wp-block-image.novofy-portrait img {
	aspect-ratio: 1 / 1;
	object-fit: cover;
	width: 100%;
	height: auto;
}

/* ------------------------------------------------------------------
   Bounded boxes (1.6.0)
   A section's content sits in a rounded box on a white band.
   Box styles (Group block > Styles): Box: White, Box: Green, Box: Motion.
   The older novofy-box and novofy-box--accent classes still work.
   ------------------------------------------------------------------ */
.wp-block-group:is(.novofy-box, [class*="is-style-box-"]) {
	position: relative;
	box-sizing: border-box;
	width: 100%;
	max-width: var(--wp--style--global--wide-size, 1280px);
	margin-inline: auto;
	padding: clamp(24px, 4vw, 56px);
	border-radius: 16px;
	background: var(--wp--preset--color--surf-white);
	box-shadow: 0 1px 2px rgba(10, 54, 84, 0.06), 0 16px 48px -16px rgba(10, 54, 84, 0.18);
}

.wp-block-group:is(.novofy-box--accent, .is-style-box-green, .is-style-box-motion) {
	--band-bg: var(--wp--preset--color--surf-accent);
	background: var(--wp--preset--color--surf-accent);
	color: var(--band-ink);
	box-shadow: none;
}

.wp-block-group:is(.novofy-box, [class*="is-style-box-"]) > :first-child { margin-block-start: 0; }
.wp-block-group:is(.novofy-box, [class*="is-style-box-"]) > :last-child { margin-block-end: 0; }

/* Box with a media panel: text column on the left, lilac media panel on
   the right. The panel stretches to the box's full inner height, so its
   top, right, and bottom insets all equal the box padding. These rules
   also cover the pre-1.7.0 markup, where the video sits directly in the
   column. */
.wp-block-group:is(.novofy-box, [class*="is-style-box-"], .novofy-stage) .wp-block-columns:has(.novofy-video) {
	align-items: stretch;
	margin-block: 0;
}

.wp-block-group:is(.novofy-box, [class*="is-style-box-"], .novofy-stage) .wp-block-columns:has(.novofy-video) > .wp-block-column:not(:has(.novofy-video)) {
	align-self: center !important;
}

.wp-block-group:is(.novofy-box, [class*="is-style-box-"], .novofy-stage) .wp-block-columns:has(.novofy-video) > .wp-block-column:not(:has(.novofy-video)) > :first-child {
	margin-block-start: 0;
}

/* Both columns share the row equally and may shrink; without this the
   video's intrinsic width squeezes the text column. */
.wp-block-group:is(.novofy-box, [class*="is-style-box-"], .novofy-stage) .wp-block-columns:has(.novofy-video) > .wp-block-column {
	flex: 1 1 0 !important;
	min-width: 0;
}

.wp-block-group:is(.novofy-box, [class*="is-style-box-"], .novofy-stage) .wp-block-column:has(.novofy-video) {
	align-self: stretch !important;
	display: flex;
	flex-direction: column;
}

.wp-block-group:is(.novofy-box, [class*="is-style-box-"], .novofy-stage) .wp-block-column:has(> .novofy-video),
.wp-block-group:is(.novofy-box, [class*="is-style-box-"], .novofy-stage) .novofy-media-panel {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	margin: 0;
	border-radius: 16px;
	overflow: hidden;
	position: relative;
	background: #FAF9F5; /* cream; the video background is keyed to match */
}

.wp-block-group:is(.novofy-box, [class*="is-style-box-"], .novofy-stage) .novofy-media-panel {
	flex: 1 1 auto;
	width: 100%;
	min-width: 0;
}

.wp-block-group:is(.novofy-box, [class*="is-style-box-"], .novofy-stage) .novofy-video {
	width: 100%;
	max-width: 100%;
	min-width: 0;
	margin: 0;
}

.wp-block-group:is(.novofy-box, [class*="is-style-box-"], .novofy-stage) .novofy-video video {
	width: 100%;
	max-width: 100%;
}

.wp-block-group:is(.novofy-box, [class*="is-style-box-"], .novofy-stage) .novofy-video video {
	aspect-ratio: 1 / 1;
	object-fit: contain;
}

/* Second line of a two-line section heading, styled to match the H2 */
.wp-block-group.novofy-panel p.novofy-h2-line,
p.novofy-h2-line {
	font-family: var(--wp--preset--font-family--newsreader);
	font-size: var(--wp--preset--font-size--l);
	font-weight: 400;
	line-height: 1.03;
	letter-spacing: -0.015em;
	max-width: min(18ch, 100%);
}

h2.wp-block-heading + p.novofy-h2-line { margin-block-start: 0.4em; }
p.novofy-h2-line + * { margin-block-start: var(--wp--preset--spacing--heading); }

/* ------------------------------------------------------------------
   Proof bar (1.8.0)
   Labels use the body size. Numbers stay on one line and scale down
   to fit narrow columns.
   ------------------------------------------------------------------ */
.novofy-proof__label,
.novofy-proof__label.has-body-s-font-size {
	font-size: var(--wp--preset--font-size--body-m) !important;
	line-height: 1.37;
}

.novofy-proof > .wp-block-column {
	container-type: inline-size;
}

.novofy-proof p.is-style-data {
	white-space: nowrap;
	font-size: min(var(--wp--preset--font-size--data), 22cqi);
}

.novofy-proof-wrap > p.is-style-eyebrow + .wp-block-columns,
p.is-style-eyebrow + .wp-block-columns.novofy-proof {
	margin-block-start: var(--wp--preset--spacing--eyebrow);
}

/* ------------------------------------------------------------------
   Motion (1.9.0): the hero's drifting brand gradient and constellation,
   reusable on any Group through the Styles panel.
   Band: Motion  - full-width section with standard section padding.
   Box: Motion   - rounded box with standard box padding.
   ------------------------------------------------------------------ */
.wp-block-group.is-style-band-motion {
	--band-bg: var(--wp--preset--gradient--brand);
}

.wp-block-group.is-style-band-motion,
.wp-block-group.is-style-box-motion {
	background: var(--wp--preset--gradient--brand);
	background-size: 200% 200%;
	animation: novofy-gradient-drift 40s ease-in-out infinite alternate;
	isolation: isolate;
	overflow: hidden;
}

.wp-block-group.is-style-band-motion > .novofy-constellation,
.wp-block-group.is-style-box-motion > .novofy-constellation {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	z-index: -1;
	pointer-events: none;
}

@media (prefers-reduced-motion: reduce) {
	.wp-block-group.is-style-band-motion,
	.wp-block-group.is-style-box-motion { animation: none; }
}

/* ------------------------------------------------------------------
   Scroll stage (1.10.0), Home: a Group with the class "novofy-stage"
   holding the hero and the opportunity section. Get in touch and the footer
   are also stages and share one scene (1.11.0). One motion layer (gradient
   plus constellation) is fixed to the screen behind both, and the stage
   clips it to its own area, so the section after the stage slides up
   over a background that stays still. The constellation slows as the
   hero scrolls away (assets/js/constellation.js).
   ------------------------------------------------------------------ */
.wp-block-group.novofy-stage {
	position: relative;
	isolation: isolate;
	clip-path: inset(0);
	background: var(--wp--preset--gradient--brand);
	color: var(--wp--preset--color--ink-inverted);
}

.novofy-stage__bg {
	position: fixed;
	inset: 0;
	z-index: -1;
	pointer-events: none;
	background: var(--wp--preset--gradient--brand);
	background-size: 200% 200%;
	animation: novofy-gradient-drift 40s ease-in-out infinite alternate;
}

.novofy-stage__bg > .novofy-constellation {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
}

.wp-block-group.novofy-stage > .wp-block-group[class*="is-style-band-"] {
	background: transparent;
	animation: none;
}

.wp-block-group.novofy-stage > .novofy-stage__bg + *,
.wp-block-group.novofy-stage > .wp-block-group[class*="is-style-band-"] + .wp-block-group[class*="is-style-band-"] {
	margin-block-start: 0;
}



@media (prefers-reduced-motion: reduce) {
	.novofy-stage__bg { animation: none; }
}

/* ------------------------------------------------------------------
   1.11.0
   ------------------------------------------------------------------ */

/* Pause button sits in the panel's bottom-right corner */
.novofy-media-panel > .novofy-media-toggle,
.wp-block-column:has(> .novofy-video) > .novofy-media-toggle {
	right: 16px;
	bottom: 16px;
	border-radius: 8px;
}

/* News list, after generatebiomedicines.com: date, bold category,
   serif title, and a read-more link, in three open columns. */
.novofy-news .wp-block-post-template {
	gap: var(--wp--preset--spacing--grid);
}

.novofy-news__item {
	display: flex;
	flex-direction: column;
	height: 100%;
}

.novofy-news__item > * {
	margin: 0;
}

.novofy-news__item .wp-block-post-date {
	font-size: 13px;
	color: var(--band-muted, var(--wp--preset--color--ink-muted));
}

.novofy-news__item .novofy-news__cat {
	margin-top: 4px;
	font-size: 13px;
	font-weight: 600;
}

.novofy-news__item .novofy-news__cat a {
	color: inherit;
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 3px;
}

.novofy-news__item .wp-block-post-title {
	margin-top: 16px;
	font-family: var(--wp--preset--font-family--newsreader);
	font-size: var(--wp--preset--font-size--s);
	font-weight: 400;
	line-height: 1.25;
}

.novofy-news__item .wp-block-post-title a {
	color: inherit;
	text-decoration: none;
}

.novofy-news .novofy-news__item .wp-block-post-title a::after {
	content: none;
}

.novofy-news__item .wp-block-read-more {
	margin-top: auto;
	padding-top: 20px;
	font-size: 14px;
	color: inherit;
	text-decoration: none;
}

.novofy-news__item .wp-block-read-more:hover {
	text-decoration: underline;
	text-underline-offset: 3px;
}

/* ------------------------------------------------------------------
   Protein slots (1.12.0, 1.13.0): empty Groups where the constellation
   forms a rotating NovoBinder (assets/js/constellation.js). The shape
   class picks the binder: novofy-protein--03, --07, --08 or --09, or --gpcr for the binder docked on a membrane receptor (1.21.0).
   Position: right (default), --left or --center. Size: --s for small.
   ------------------------------------------------------------------ */
.novofy-opportunity p {
	text-align: left;
}

.novofy-protein-slot {
	width: 100%;
	max-width: 560px;
	aspect-ratio: 1 / 1;
	margin-inline: auto 0;
	pointer-events: none;
}

.novofy-protein-slot--left { margin-inline: 0 auto; }
.novofy-protein-slot--center { margin-inline: auto; max-width: 420px; }
.novofy-protein-slot--s { max-width: 300px; }

.wp-block-group.novofy-panel > .novofy-protein-slot { width: 100%; }
.wp-block-group.novofy-panel > .novofy-protein-slot--center { margin-block: 24px; }

/* Platform: the one white band; the video sits straight on it */
.novofy-platform .novofy-video { margin: 0; }
.novofy-platform .novofy-video video { width: 100%; height: auto; display: block; }

@media (max-width: 781px) {
	.wp-block-columns > .wp-block-column:has(.novofy-protein-slot) {
		order: -1;
	}

	.novofy-protein-slot,
	.novofy-protein-slot--s {
		max-width: 280px;
		margin-inline: auto;
	}
}

/* ------------------------------------------------------------------
   Button styles (1.13.0). Pick one in the Button block's Styles panel.
   Colors come from the site palette plus the binder gold. Pattern
   "NovoFy button styles" shows them all on dark and white bands.
   ------------------------------------------------------------------ */
:root :is(.wp-block-button[class*="is-style-btn-"]) > .wp-block-button__link {
	background: var(--b-bg);
	color: var(--b-ink);
	border: 1px solid var(--b-border, transparent);
	border-radius: var(--b-radius, 0);
	padding-block: 0;
	transition: background-color 0.15s, color 0.15s, border-color 0.15s, filter 0.15s;
}

:root :is(.wp-block-button[class*="is-style-btn-"]) > .wp-block-button__link:hover {
	background: var(--b-hover, var(--b-bg));
	color: var(--b-hover-ink, var(--b-ink));
}

.wp-block-button.is-style-btn-white { --b-bg: var(--wp--preset--color--ground); --b-ink: var(--wp--preset--color--ink); --b-border: transparent; --b-hover: var(--wp--preset--color--surface-2); --b-hover-ink: var(--wp--preset--color--ink); --b-radius: 0; }
.wp-block-button.is-style-btn-ink { --b-bg: var(--wp--preset--color--ink); --b-ink: var(--wp--preset--color--ink-inverted); --b-border: transparent; --b-hover: #2E373D; --b-hover-ink: var(--wp--preset--color--ink-inverted); --b-radius: 0; }
.wp-block-button.is-style-btn-ocean { --b-bg: var(--wp--preset--color--accent-primary); --b-ink: var(--wp--preset--color--ink-inverted); --b-border: transparent; --b-hover: var(--wp--preset--color--accent-primary-hover); --b-hover-ink: var(--wp--preset--color--ink-inverted); --b-radius: 0; }
.wp-block-button.is-style-btn-aqua { --b-bg: var(--wp--preset--color--accent-secondary); --b-ink: var(--wp--preset--color--ink); --b-border: transparent; --b-hover: #5FE6E7; --b-hover-ink: var(--wp--preset--color--ink); --b-radius: 0; }
.wp-block-button.is-style-btn-teal { --b-bg: var(--wp--preset--color--surf-accent); --b-ink: var(--wp--preset--color--ink-inverted); --b-border: transparent; --b-hover: var(--wp--preset--color--surf-accent-hover); --b-hover-ink: var(--wp--preset--color--ink-inverted); --b-radius: 0; }
.wp-block-button.is-style-btn-navy { --b-bg: var(--wp--preset--color--grad-1); --b-ink: var(--wp--preset--color--ink-inverted); --b-border: transparent; --b-hover: #0E4870; --b-hover-ink: var(--wp--preset--color--ink-inverted); --b-radius: 0; }
.wp-block-button.is-style-btn-indigo { --b-bg: var(--wp--preset--color--grad-3); --b-ink: var(--wp--preset--color--ink-inverted); --b-border: transparent; --b-hover: #1B2F86; --b-hover-ink: var(--wp--preset--color--ink-inverted); --b-radius: 0; }
.wp-block-button.is-style-btn-gold { --b-bg: var(--wp--preset--color--binder-gold); --b-ink: var(--wp--preset--color--ink); --b-border: transparent; --b-hover: #F4BF5C; --b-hover-ink: var(--wp--preset--color--ink); --b-radius: 0; }
.wp-block-button.is-style-btn-lilac { --b-bg: var(--wp--preset--color--surf-wash); --b-ink: var(--wp--preset--color--ink); --b-border: transparent; --b-hover: var(--wp--preset--color--lilac-hover); --b-hover-ink: var(--wp--preset--color--ink); --b-radius: 0; }
.wp-block-button.is-style-btn-mint { --b-bg: var(--wp--preset--color--surf-tint); --b-ink: var(--wp--preset--color--ink); --b-border: transparent; --b-hover: #A2D4D4; --b-hover-ink: var(--wp--preset--color--ink); --b-radius: 0; }
.wp-block-button.is-style-btn-gradient { --b-bg: var(--wp--preset--gradient--brand); --b-ink: var(--wp--preset--color--ink-inverted); --b-border: transparent; --b-hover: var(--wp--preset--gradient--brand); --b-hover-ink: var(--wp--preset--color--ink-inverted); --b-radius: 0; }
.wp-block-button.is-style-btn-outline-white { --b-bg: transparent; --b-ink: var(--wp--preset--color--ink-inverted); --b-border: rgba(252,252,253,0.7); --b-hover: rgba(252,252,253,0.12); --b-hover-ink: var(--wp--preset--color--ink-inverted); --b-radius: 0; }
.wp-block-button.is-style-btn-outline-ink { --b-bg: transparent; --b-ink: var(--wp--preset--color--ink); --b-border: var(--wp--preset--color--ink); --b-hover: rgba(26,32,36,0.06); --b-hover-ink: var(--wp--preset--color--ink); --b-radius: 0; }
.wp-block-button.is-style-btn-outline-ocean { --b-bg: transparent; --b-ink: var(--wp--preset--color--accent-primary); --b-border: var(--wp--preset--color--accent-primary); --b-hover: var(--wp--preset--color--accent-primary); --b-hover-ink: var(--wp--preset--color--ink-inverted); --b-radius: 0; }
.wp-block-button.is-style-btn-outline-aqua { --b-bg: transparent; --b-ink: var(--wp--preset--color--accent-secondary); --b-border: var(--wp--preset--color--accent-secondary); --b-hover: rgba(39,218,220,0.14); --b-hover-ink: var(--wp--preset--color--accent-secondary); --b-radius: 0; }
.wp-block-button.is-style-btn-outline-gold { --b-bg: transparent; --b-ink: var(--wp--preset--color--binder-gold); --b-border: var(--wp--preset--color--binder-gold); --b-hover: rgba(238,168,38,0.14); --b-hover-ink: var(--wp--preset--color--binder-gold); --b-radius: 0; }
.wp-block-button.is-style-btn-glass { --b-bg: rgba(252,252,253,0.14); --b-ink: var(--wp--preset--color--ink-inverted); --b-border: rgba(252,252,253,0.35); --b-hover: rgba(252,252,253,0.24); --b-hover-ink: var(--wp--preset--color--ink-inverted); --b-radius: 0; }
.wp-block-button.is-style-btn-pill-white { --b-bg: var(--wp--preset--color--ground); --b-ink: var(--wp--preset--color--ink); --b-border: transparent; --b-hover: var(--wp--preset--color--surface-2); --b-hover-ink: var(--wp--preset--color--ink); --b-radius: 999px; }
.wp-block-button.is-style-btn-pill-gold { --b-bg: var(--wp--preset--color--binder-gold); --b-ink: var(--wp--preset--color--ink); --b-border: transparent; --b-hover: #F4BF5C; --b-hover-ink: var(--wp--preset--color--ink); --b-radius: 999px; }
.wp-block-button.is-style-btn-pill-aqua { --b-bg: var(--wp--preset--color--accent-secondary); --b-ink: var(--wp--preset--color--ink); --b-border: transparent; --b-hover: #5FE6E7; --b-hover-ink: var(--wp--preset--color--ink); --b-radius: 999px; }
.wp-block-button.is-style-btn-pill-outline-white { --b-bg: transparent; --b-ink: var(--wp--preset--color--ink-inverted); --b-border: rgba(252,252,253,0.7); --b-hover: rgba(252,252,253,0.12); --b-hover-ink: var(--wp--preset--color--ink-inverted); --b-radius: 999px; }
.wp-block-button.is-style-btn-rounded-ocean { --b-bg: var(--wp--preset--color--accent-primary); --b-ink: var(--wp--preset--color--ink-inverted); --b-border: transparent; --b-hover: var(--wp--preset--color--accent-primary-hover); --b-hover-ink: var(--wp--preset--color--ink-inverted); --b-radius: 10px; }
.wp-block-button.is-style-btn-rounded-navy { --b-bg: var(--wp--preset--color--grad-1); --b-ink: var(--wp--preset--color--ink-inverted); --b-border: transparent; --b-hover: #0E4870; --b-hover-ink: var(--wp--preset--color--ink-inverted); --b-radius: 10px; }
.wp-block-button.is-style-btn-gradient > .wp-block-button__link:hover { filter: brightness(1.15); }
.wp-block-button.is-style-btn-glass > .wp-block-button__link {
	-webkit-backdrop-filter: blur(10px);
	backdrop-filter: blur(10px);
}

/* Text styles: no box, inherit the band's text color */
:root .wp-block-button:is(.is-style-btn-arrow, .is-style-btn-underline) > .wp-block-button__link {
	background: none;
	color: inherit;
	border: 0;
	padding-inline: 0;
	min-height: 0;
}

:root .wp-block-button.is-style-btn-arrow > .wp-block-button__link::after {
	content: "\2192";
	margin-inline-start: 0.5em;
	transition: transform 0.15s;
}

:root .wp-block-button.is-style-btn-arrow > .wp-block-button__link:hover::after { transform: translateX(4px); }

:root .wp-block-button.is-style-btn-underline > .wp-block-button__link {
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 6px;
}

:root .wp-block-button:is(.is-style-btn-arrow, .is-style-btn-underline) > .wp-block-button__link:hover {
	background: none;
	color: inherit;
	text-decoration-thickness: 2px;
}
.novofy-btn-showcase { flex-wrap: wrap; row-gap: 16px; }

/* ------------------------------------------------------------------
   1.14.0
   ------------------------------------------------------------------ */

/* Header: older saved headers wrap the links and Contact in one group;
   let both sit in the grid so the links center and Contact goes right. */
.novofy-header__right { display: contents; }
.novofy-header .wp-block-navigation { justify-self: center; grid-column: 2; }
.novofy-header__cta { justify-self: end; grid-column: 3; }

/* Hero: once the binder has formed, the text narrows to the left and the
   binder docks on the right whenever the hero is back in view. */
.novofy-hero { position: relative; }

.wp-block-group.novofy-panel > .novofy-protein-slot--dock,
.novofy-protein-slot--dock {
	position: absolute;
	top: 50%;
	right: var(--wp--preset--spacing--side);
	width: min(38vw, 520px);
	max-width: none;
	transform: translateY(-50%);
	margin: 0 !important;
}

.novofy-hero > h1,
.novofy-hero > .novofy-subhero {
	transition: max-width 0.9s ease;
}

.novofy-stage.has-protein > .novofy-hero > h1 { max-width: min(55%, 22ch) !important; }
.novofy-stage.has-protein > .novofy-hero > .novofy-subhero { max-width: 50% !important; }

@media (max-width: 781px) {
	.wp-block-group.novofy-panel > .novofy-protein-slot--dock,
	.novofy-protein-slot--dock {
		position: static;
		transform: none;
		width: 260px;
		margin: 32px auto 0 !important;
	}

	.novofy-stage.has-protein > .novofy-hero > h1,
	.novofy-stage.has-protein > .novofy-hero > .novofy-subhero { max-width: 100% !important; }
}

@media (prefers-reduced-motion: reduce) {
	.novofy-hero > h1,
	.novofy-hero > .novofy-subhero { transition: none; }
}

/* No gaps between top-level sections (the white line above contact) */
.novofy-main .wp-block-post-content > .novofy-stage,
.novofy-main .wp-block-post-content > .novofy-stage + * {
	margin-block-start: 0;
}

/* Platform video sits straight on white; multiply drops any off-white */
.novofy-platform .novofy-video,
.novofy-platform .novofy-video video {
	background: transparent;
	mix-blend-mode: multiply;
}

/* Team: people scroll sideways; the third card shows in part */
.wp-block-columns.novofy-people {
	display: flex;
	flex-wrap: nowrap !important;
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	scrollbar-width: thin;
	scrollbar-color: rgba(252, 252, 253, 0.5) transparent;
	padding-block-end: 20px;
	-webkit-overflow-scrolling: touch;
}

.wp-block-columns.novofy-people > .wp-block-column {
	flex: 0 0 calc((100% - 2 * var(--wp--preset--spacing--grid)) / 2.35) !important;
	scroll-snap-align: start;
}

.novofy-portrait--placeholder {
	max-width: 300px;
	aspect-ratio: 1 / 1;
	margin-block-end: 28px;
	background: rgba(252, 252, 253, 0.12);
	border: 1px dashed rgba(252, 252, 253, 0.4);
}

@media (max-width: 781px) {
	.wp-block-columns.novofy-people > .wp-block-column {
		flex-basis: 78% !important;
	}
}

/* Contact: text left (heading top, line bottom), binder center, buttons
   stacked right */
.novofy-contact__row { align-items: stretch !important; }

.novofy-contact__row > .wp-block-column:first-child {
	display: flex;
	flex-direction: column;
	gap: 16px;
}

.novofy-contact__row > .wp-block-column:first-child > * { margin: 0; }

.novofy-contact__row > .wp-block-column { align-self: center; }

.novofy-btn-stack {
	flex-direction: column;
	align-items: stretch;
	gap: 16px;
}

.novofy-btn-stack .wp-block-button,
.novofy-btn-stack .wp-block-button__link { width: 100%; }

.novofy-contact .novofy-protein-slot--center { max-width: 380px; }


/* ------------------------------------------------------------------
   1.15.0
   ------------------------------------------------------------------ */

/* Docked hero: the headline also scales down so it holds to about
   three lines in the left half */
.novofy-hero > h1 { transition: max-width 0.9s ease, font-size 0.9s ease; }

@media (min-width: 782px) {
	.novofy-stage.has-protein > .novofy-hero > h1 {
		max-width: 50% !important;
		font-size: min(var(--wp--preset--font-size--xl), 4.6vw) !important;
		line-height: 1.05;
	}
}

/* Footer: one line, clear of the bottom navigation bar */
.wp-block-group.novofy-footer {
	padding-block: 48px calc(var(--wp--custom--header--height) + 40px);
	padding-inline: var(--wp--preset--spacing--side);
}

.wp-block-group.novofy-footer > .novofy-footer__meta { margin: 0; }

/* ------------------------------------------------------------------
   1.16.0 Therapeutics page. Everything below is scoped to the parent of .novofy-tx-hero
   (the post content on the site, the editor canvas in the editor), or to
   a legacy .novofy-tx wrapper Group,
   so Home and the other pages are unchanged.
   White page, navy text, a gray constellation on a fixed canvas behind
   (assets/js/therapeutics.js), one gradient band with centered text, and
   a thin navy line between consecutive white sections.
   ------------------------------------------------------------------ */
body:has(.novofy-tx-hero) { background: var(--wp--preset--color--surf-white); }
body:has(.novofy-tx-hero) .wp-site-blocks > footer { position: relative; z-index: 2; }

:is(.novofy-tx, :has(> .novofy-tx-hero)) {
	--tx-navy: var(--wp--preset--color--grad-1);
	--tx-muted: rgba(10, 54, 84, 0.72);
	--tx-rule: var(--wp--preset--color--grad-1);
	--tx-gutter: clamp(20px, 7vw, 100px);
	position: relative;
	color: var(--tx-navy);
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) > .novofy-tx__bg {
	position: fixed;
	inset: 0;
	z-index: 0;
	pointer-events: none;
	margin: 0;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) > .novofy-tx__bg > canvas { display: block; width: 100%; height: 100%; }

:is(.novofy-tx, :has(> .novofy-tx-hero)) > .wp-block-group {
	position: relative;
	z-index: 1;
	margin-block-start: 0;
}

/* White sections: clear, so the constellation shows through */
:is(.novofy-tx, :has(> .novofy-tx-hero)) .wp-block-group.novofy-tx-white {
	--band-bg: transparent;
	--band-ink: var(--tx-navy);
	--band-muted: var(--tx-muted);
	--band-btn-bg: var(--tx-navy);
	--band-btn-ink: var(--wp--preset--color--ink-inverted);
	--band-btn-hover: #0E4870;
	--band-btn2-bg: transparent;
	--band-btn2-ink: var(--tx-navy);
	--band-btn2-border: var(--tx-navy);
	--band-btn2-hover: rgba(10, 54, 84, 0.06);
	padding-inline: var(--tx-gutter);
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) :is(h1, h2, h3) { color: var(--tx-navy); }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-white .is-style-muted { color: var(--tx-muted); }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-white p.is-style-eyebrow { color: var(--tx-muted); }

/* Thin navy line between consecutive white sections */
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-white + .novofy-tx-white::before {
	content: "";
	position: absolute;
	top: 0;
	left: var(--tx-gutter);
	right: var(--tx-gutter);
	height: 1px;
	background: var(--tx-rule);
}

/* Hero: fills the screen, white, navy text, no buttons */
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-hero {
	min-height: 100svh;
	display: flex;
	flex-direction: column;
	justify-content: center;
	padding: var(--wp--preset--spacing--section) var(--tx-gutter);
	box-sizing: border-box;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-hero h1 { max-width: min(16ch, 100%); }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-hero .novofy-subhero { max-width: 52ch; color: var(--tx-navy); }

/* Where we fit: the only gradient band; everything centered */
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-center {
	text-align: center;
	padding-inline: var(--tx-gutter);
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-center h2 { color: var(--wp--preset--color--ink-inverted); }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-center > * { margin-inline: auto !important; }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-center p { max-width: 62ch; }

/* Rows: binder slot on the left, text on the right. All slots share one
   x position, so the binder travels down a single vertical line. */
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-row {
	display: grid;
	grid-template-columns: 200px minmax(0, 1fr);
	column-gap: clamp(40px, 6vw, 96px);
	align-items: start;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-row > * { margin-block-start: 0; }

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-slot {
	width: 200px;
	aspect-ratio: 1 / 1;
	margin: 0;
	pointer-events: none;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-body > :first-child { margin-block-start: 0; }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-body p { max-width: 66ch; }

/* Collaboration options */
:is(.novofy-tx, :has(> .novofy-tx-hero)) .wp-block-columns.novofy-tx-options {
	gap: var(--wp--preset--spacing--grid);
	margin-block-start: var(--wp--preset--spacing--heading);
	max-width: 66ch;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-options > .wp-block-column {
	border-top: 1px solid var(--tx-rule);
	padding-top: 20px;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-options > .wp-block-column > * { margin-block: 0; }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-options > .wp-block-column > * + * { margin-block-start: 10px; }

/* QC checklist */
:is(.novofy-tx, :has(> .novofy-tx-hero)) ul.novofy-tx-checklist {
	list-style: none;
	padding: 0;
	margin-block: 28px 32px;
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: 14px 32px;
	max-width: 66ch;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) ul.novofy-tx-checklist li {
	position: relative;
	padding-inline-start: 20px;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) ul.novofy-tx-checklist li::before {
	content: "";
	position: absolute;
	left: 0;
	top: 0.6em;
	width: 7px;
	height: 7px;
	border-radius: 50%;
	background: #BE7E10;
}

/* Timeline phases */
:is(.novofy-tx, :has(> .novofy-tx-hero)) ol.novofy-tx-phases {
	list-style: none;
	counter-reset: tx-phase;
	padding: 0;
	margin-block: var(--wp--preset--spacing--heading) 0;
	display: grid;
	grid-template-columns: repeat(5, minmax(0, 1fr));
	gap: 20px;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) ol.novofy-tx-phases li {
	counter-increment: tx-phase;
	border-top: 1px solid var(--tx-rule);
	padding-top: 14px;
	font-size: var(--wp--preset--font-size--body-s);
	line-height: 1.4;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) ol.novofy-tx-phases li::before {
	content: counter(tx-phase, decimal-leading-zero);
	display: block;
	margin-bottom: 6px;
	color: var(--tx-muted);
	font-size: var(--wp--preset--font-size--eyebrow);
	letter-spacing: 0.08em;
}

/* Role cards: text only, sideways scroll, the last visible one shows in part */
:is(.novofy-tx, :has(> .novofy-tx-hero)) .wp-block-columns.novofy-tx-icp {
	display: flex;
	flex-wrap: nowrap !important;
	gap: 32px;
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	scrollbar-width: thin;
	scrollbar-color: rgba(10, 54, 84, 0.4) transparent;
	margin-block-start: var(--wp--preset--spacing--heading);
	padding-block-end: 16px;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-icp > .wp-block-column {
	flex: 0 0 clamp(240px, 36%, 320px) !important;
	scroll-snap-align: start;
	border-top: 1px solid var(--tx-rule);
	padding-top: 18px;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-icp ul {
	padding-inline-start: 18px;
	margin-block: 12px 0;
	font-size: var(--wp--preset--font-size--body-s);
	line-height: 1.5;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-icp li + li { margin-block-start: 8px; }

/* Meet the team: heading block on the left, smaller cards scrolling on the right */
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-team {
	display: grid;
	grid-template-columns: minmax(260px, 0.8fr) minmax(0, 2fr);
	column-gap: clamp(40px, 6vw, 96px);
	align-items: start;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-team > * { margin-block-start: 0; }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-team__head > :first-child { margin-block-start: 0; }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-team__head h2 { line-height: 1.03; letter-spacing: -0.015em; }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-team__head .novofy-btn-stack { margin-block-start: 32px; max-width: 280px; }

:is(.novofy-tx, :has(> .novofy-tx-hero)) .wp-block-columns.novofy-tx-people {
	margin-block-start: 0;
	gap: 28px;
	scrollbar-color: rgba(10, 54, 84, 0.4) transparent;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) .wp-block-columns.novofy-tx-people > .wp-block-column {
	flex: 0 0 clamp(180px, 17vw, 230px) !important;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-people .wp-block-image.novofy-portrait,
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-people .novofy-portrait--placeholder {
	max-width: 100%;
	margin-block-end: 20px;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-people .novofy-portrait--placeholder {
	background: rgba(10, 54, 84, 0.04);
	border: 1px dashed rgba(10, 54, 84, 0.35);
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-people .novofy-card { border-top-width: 1px; padding-top: 16px; }

@media (max-width: 781px) {
	:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-row,
	:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-team { grid-template-columns: minmax(0, 1fr); }

	:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-slot {
		width: 150px;
		margin: 0 auto 32px;
	}

	:is(.novofy-tx, :has(> .novofy-tx-hero)) ul.novofy-tx-checklist { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	:is(.novofy-tx, :has(> .novofy-tx-hero)) ol.novofy-tx-phases { grid-template-columns: minmax(0, 1fr); gap: 12px; }
	:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-icp > .wp-block-column { flex-basis: 78% !important; }
	:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-team__head { margin-block-end: 40px; }
	:is(.novofy-tx, :has(> .novofy-tx-hero)) .wp-block-columns.novofy-tx-people > .wp-block-column { flex-basis: 62% !important; }
}

/* ------------------------------------------------------------------
   1.17.0 Therapeutics page (still scoped to :is(.novofy-tx, :has(> .novofy-tx-hero)))
   ------------------------------------------------------------------ */

/* Hero: the binder spins on the right from the first paint */
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-hero { position: relative; }

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-slot--hero {
	position: absolute;
	top: 50%;
	right: var(--tx-gutter);
	width: min(34vw, 440px);
	transform: translateY(-50%);
	margin: 0 !important;
}

@media (min-width: 782px) {
	:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-hero h1 { max-width: min(14ch, 52%); }
	:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-hero .novofy-subhero { max-width: min(52ch, 50%); }
}

/* Where we fit: the constellation runs through in white */
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-center > .novofy-tx__band {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	z-index: -1;
	margin: 0 !important;
	pointer-events: none;
}

/* Footer on this page: white like the sections above it, with the same
   navy line, and the gray constellation carries on behind it */
body:has(.novofy-tx-hero) .wp-block-group.novofy-footer.novofy-stage {
	--band-bg: transparent;
	--band-ink: var(--wp--preset--color--grad-1);
	background: transparent;
	animation: none;
	color: var(--wp--preset--color--grad-1);
	padding-inline: clamp(20px, 7vw, 100px);
}

body:has(.novofy-tx-hero) .wp-block-group.novofy-footer > .novofy-stage__bg,
body:has(.novofy-tx-hero) .wp-block-group.novofy-footer > .novofy-constellation { display: none; }

body:has(.novofy-tx-hero) .wp-block-group.novofy-footer :is(p, a) { color: var(--wp--preset--color--grad-1); }

body:has(.novofy-tx-hero) .wp-block-group.novofy-footer::before {
	content: "";
	position: absolute;
	top: 0;
	left: clamp(20px, 7vw, 100px);
	right: clamp(20px, 7vw, 100px);
	height: 1px;
	background: var(--wp--preset--color--grad-1);
}

/* Role cards: three styles, picked in the Columns block's Styles panel.
   Roles: Lines  - text with a top rule, scrolls sideways.
   Roles: Cards  - large rounded cards, arrows.
   Roles: Tabs   - large rounded cards, role tabs and arrows. */
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-icp__nav { display: none; }

:is(.novofy-tx, :has(> .novofy-tx-hero)) :is(.is-style-roles-cards, .is-style-roles-tabs).novofy-tx-scroller > .wp-block-column {
	flex: 0 0 min(78%, 560px) !important;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: 16px;
	padding: clamp(28px, 4vw, 48px);
	background: linear-gradient(160deg, rgba(255, 255, 255, 0.96), rgba(219, 223, 240, 0.35));
	box-sizing: border-box;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) :is(.is-style-roles-cards, .is-style-roles-tabs).novofy-tx-scroller > .wp-block-column h3 {
	font-size: var(--wp--preset--font-size--m) !important;
	line-height: 1.1;
	margin: 0;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) :is(.is-style-roles-cards, .is-style-roles-tabs).novofy-tx-scroller ul {
	font-size: var(--wp--preset--font-size--body-m);
	margin-block-start: 20px;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) :is(.is-style-roles-cards, .is-style-roles-tabs).novofy-tx-scroller {
	gap: 20px;
	scrollbar-width: none;
	margin-block-start: 20px;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) :is(.is-style-roles-cards, .is-style-roles-tabs).novofy-tx-scroller::-webkit-scrollbar { display: none; }

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-icp__nav:has(+ :is(.is-style-roles-cards, .is-style-roles-tabs)) {
	display: flex;
	align-items: center;
	gap: 12px;
	margin-block-start: var(--wp--preset--spacing--heading);
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-icp__tabs {
	display: flex;
	gap: 10px;
	flex: 1 1 auto;
	overflow-x: auto;
	scrollbar-width: none;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-icp__nav:has(+ .is-style-roles-cards) .novofy-tx-icp__tabs { visibility: hidden; }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-icp__nav:has(+ .is-style-roles-cards) .novofy-tx-icp__arrow--prev { order: 2; }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-icp__nav:has(+ .is-style-roles-cards) .novofy-tx-icp__arrow--next { order: 3; }

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-icp__tab {
	flex: 0 0 auto;
	font: inherit;
	font-size: var(--wp--preset--font-size--body-s);
	color: var(--tx-muted);
	background: transparent;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: 4px;
	padding: 10px 16px;
	cursor: pointer;
	transition: border-color 0.15s, color 0.15s;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-icp__tab:hover { color: var(--tx-navy); }

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-icp__tab.is-active {
	color: var(--tx-navy);
	border-color: var(--tx-navy);
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-icp__arrow {
	flex: 0 0 auto;
	width: 32px;
	height: 32px;
	border-radius: 50%;
	border: 1px solid var(--tx-navy);
	background: transparent;
	color: var(--tx-navy);
	cursor: pointer;
	display: grid;
	place-items: center;
	padding: 0;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-icp__arrow::before {
	content: "";
	width: 8px;
	height: 8px;
	border-top: 1.5px solid currentColor;
	border-right: 1.5px solid currentColor;
	transform: translateX(-1px) rotate(45deg);
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-icp__arrow--prev::before { transform: translateX(1px) rotate(-135deg); }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-icp__arrow--next { background: var(--tx-navy); color: var(--wp--preset--color--ink-inverted); }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-icp__arrow:disabled { opacity: 0.3; cursor: default; }

@media (max-width: 781px) {
	:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-slot--hero {
		position: relative;
		top: auto;
		right: auto;
		transform: none;
		width: 220px;
		order: 3;
		margin: 40px auto 0 !important;
	}

	:is(.novofy-tx, :has(> .novofy-tx-hero)) :is(.is-style-roles-cards, .is-style-roles-tabs).novofy-tx-scroller > .wp-block-column { flex-basis: 86% !important; }
}

@media (prefers-reduced-motion: reduce) {
	:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-icp__tab { transition: none; }
}

/* ------------------------------------------------------------------
   1.18.0 Therapeutics page (still scoped to :is(.novofy-tx, :has(> .novofy-tx-hero)))
   ------------------------------------------------------------------ */

/* Even spacing: the same space above and below every divider line,
   measured to the nearest text or binder */
:is(.novofy-tx, :has(> .novofy-tx-hero)) .wp-block-group.novofy-tx-white,
:is(.novofy-tx, :has(> .novofy-tx-hero)) .wp-block-group.novofy-tx-center {
	padding-block: clamp(96px, 11vw, 168px);
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-body > :last-child,
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-team__head > :last-child,
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-team__cards > :last-child,
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-center > :last-child { margin-block-end: 0; }

body:has(.novofy-tx-hero) .wp-block-group.novofy-footer.novofy-stage { padding-block: clamp(48px, 5vw, 72px); }

/* What you get: QC items as gold-outlined pills (labels, not buttons) */
:is(.novofy-tx, :has(> .novofy-tx-hero)) ul.novofy-tx-checklist {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) ul.novofy-tx-checklist li {
	padding: 9px 20px;
	border: 1px solid #BE7E10;
	border-radius: 999px;
	font-size: var(--wp--preset--font-size--body-s);
	line-height: 1.3;
	color: var(--tx-navy);
	background: rgba(255, 255, 255, 0.85);
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) ul.novofy-tx-checklist li::before { content: none; }

/* Meet the team: one card per person, same look as the role cards */
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-team__cards { min-width: 0; margin-block-start: 0; }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-team__cards > .novofy-tx-icp__nav { margin-block-start: 0 !important; }

:is(.novofy-tx, :has(> .novofy-tx-hero)) :is(.is-style-roles-cards, .is-style-roles-tabs).novofy-tx-people > .wp-block-column {
	flex: 0 0 clamp(240px, 42%, 320px) !important;
	padding: 20px;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) :is(.is-style-roles-cards, .is-style-roles-tabs).novofy-tx-people .novofy-portrait {
	width: 100%;
	max-width: 100%;
	margin-block-end: 18px;
	border-radius: 10px;
	overflow: hidden;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) :is(.is-style-roles-cards, .is-style-roles-tabs).novofy-tx-people .novofy-card {
	border-top: 0;
	padding-top: 0;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) :is(.is-style-roles-cards, .is-style-roles-tabs).novofy-tx-people .novofy-card h3 {
	font-size: var(--wp--preset--font-size--s) !important;
}

@media (max-width: 781px) {
	:is(.novofy-tx, :has(> .novofy-tx-hero)) :is(.is-style-roles-cards, .is-style-roles-tabs).novofy-tx-people > .wp-block-column { flex-basis: 78% !important; }
}

/* ------------------------------------------------------------------
   1.19.0 Reagents copy and card outlines
   ------------------------------------------------------------------ */

/* Reagents: receive cards and role cards as navy-outlined boxes */
.wp-block-columns.novofy-cards--outline > .novofy-card {
	border: 1px solid var(--wp--preset--color--grad-1);
	border-radius: 16px;
	padding: clamp(24px, 3vw, 36px);
	background: transparent;
	box-sizing: border-box;
}

.wp-block-columns.novofy-cards--outline > .novofy-card ul {
	margin-block-start: 16px;
	padding-inline-start: 1.1em;
}

.wp-block-columns.novofy-cards--outline > .novofy-card li + li { margin-block-start: 8px; }

/* Reagents: Track record heading sits above the proof columns */
.wp-block-group.novofy-proofband > h2 + .wp-block-columns.novofy-proof {
	margin-block-start: var(--wp--preset--spacing--heading);
}

/* Therapeutics: role cards (timeline) and team cards drop the gradient
   and take the navy outline */
:is(.novofy-tx, :has(> .novofy-tx-hero)) :is(.is-style-roles-cards, .is-style-roles-tabs).novofy-tx-scroller > .wp-block-column {
	background: transparent;
	border-color: var(--tx-navy);
}

/* ------------------------------------------------------------------
   1.21.0
   ------------------------------------------------------------------ */

/* Portrait placeholders on white bands (Team page) */
.is-style-band-white .novofy-portrait--placeholder {
	background: var(--wp--preset--color--surface-2);
	border-color: var(--wp--preset--color--border);
}

/* Therapeutics, Modalities: movie strip (1.22.0). Six rotating format
   movies in one row under the text, spanning both columns. The movies
   are rendered on near-white, so multiply blends them into the page. */
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-movies {
	grid-column: 1 / -1;
	position: relative;
	display: flex;
	align-items: flex-end;
	justify-content: space-between;
	gap: clamp(8px, 1.5vw, 24px);
	margin-block-start: clamp(40px, 5vw, 72px);
	padding-block-end: 8px;
}

.novofy-tx-movies .wp-block-video.novofy-movie {
	flex: 1 1 0;
	min-width: 0;
	margin: 0;
}

.novofy-tx-movies .wp-block-video.novofy-movie--s { flex-grow: 0.7; }

.novofy-tx-movies .novofy-movie video {
	display: block;
	width: 100%;
	height: auto;
	aspect-ratio: 1 / 1;
	mix-blend-mode: multiply;
	filter: brightness(1.03); /* clears compression noise in the white */
	background: transparent;
}

.novofy-tx-movies .novofy-media-toggle {
	position: absolute;
	right: 0;
	bottom: -28px;
}

@media (max-width: 781px) {
	:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-movies {
		overflow-x: auto;
		scroll-snap-type: x mandatory;
		justify-content: flex-start;
		padding-block-end: 44px;
	}

	.novofy-tx-movies .wp-block-video.novofy-movie { flex: 0 0 42%; scroll-snap-align: start; }
	.novofy-tx-movies .wp-block-video.novofy-movie--s { flex-basis: 32%; }
	.novofy-tx-movies .novofy-media-toggle { left: 0; right: auto; bottom: 0; }
}

/* Therapeutics (1.22.0): sections without a binder slot (Modalities,
   the closing contact block) keep their text in the same column as the
   sections that have one. */
@media (min-width: 782px) {
	:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-row > .novofy-tx-body:first-child { grid-column: 2; }
}

/* Movie captions */
.novofy-tx-movies .novofy-movie figcaption {
	margin: 10px 0 0;
	text-align: center;
	font-size: var(--wp--preset--font-size--body-s);
	line-height: 1.3;
	color: var(--tx-muted, var(--wp--preset--color--ink-muted));
}

/* 1.23.1: a full-width row (Modalities): text starts at the page gutter */
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-row.novofy-tx-wide > .novofy-tx-body { grid-column: 1 / -1 !important; }

/* Team (1.25.0): one row per person. Binder slot on the left (it forms
   once and stays), then the card: photo and bio side by side. */
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-people-section > .novofy-tx-row + .novofy-tx-row {
	margin-block-start: clamp(56px, 7vw, 104px);
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-person-row { align-items: start; }

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-person {
	display: grid;
	grid-template-columns: minmax(160px, 240px) minmax(0, 1fr);
	column-gap: clamp(28px, 4vw, 56px);
	align-items: start;
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-person > * { margin-block-start: 0; }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-person .novofy-portrait { margin: 0; max-width: 240px; }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-person__text > :first-child { margin-block-start: 0; }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-person__text p { max-width: 66ch; }

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-person .novofy-portrait--placeholder {
	width: 100%;
	background: rgba(10, 54, 84, 0.04);
	border: 1px dashed rgba(10, 54, 84, 0.35);
}

:is(.novofy-tx, :has(> .novofy-tx-hero)) p.is-style-eyebrow.novofy-soon {
	display: inline-block;
	padding: 4px 12px;
	border: 1px solid var(--wp--preset--color--binder-gold);
	border-radius: 999px;
	color: var(--tx-navy);
	margin-block-end: 12px;
}

@media (max-width: 781px) {
	:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-person { grid-template-columns: minmax(0, 1fr); row-gap: 24px; }
	:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-person .novofy-portrait { max-width: 220px; }
}

/* ------------------------------------------------------------------
   News landing (1.26.0): patterns/news.php, also templates/home.html.
   Hero with a small gold binder; the latest post in the gradient band;
   Press, Insights, Events sections with a small pinned binder beside
   each heading; lists as rows, Insights as cards.
   ------------------------------------------------------------------ */
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-slot--hero.novofy-tx-slot--hero-s { width: min(24vw, 280px); }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-slot.novofy-tx-slot--s { width: 120px; justify-self: center; }

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-news-head { align-items: center; }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-news-head .novofy-tx-body p { margin-block-end: 0; }

:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-news-section > .wp-block-query {
	margin-block-start: clamp(32px, 4vw, 56px);
	padding-inline-start: calc(200px + clamp(40px, 6vw, 96px));
}

/* Rows (Press, Events) */
.novofy-news-list .wp-block-post-template { list-style: none; margin: 0; padding: 0; }
.novofy-news-list .wp-block-post { margin: 0; }
.novofy-news-row {
	display: grid;
	grid-template-columns: 150px minmax(0, 1fr) auto;
	column-gap: clamp(20px, 3vw, 40px);
	align-items: baseline;
	padding-block: 26px;
	border-top: 1px solid var(--tx-rule, rgba(10, 54, 84, 0.18));
}
.novofy-news-list .wp-block-post:last-child .novofy-news-row { border-bottom: 1px solid var(--tx-rule, rgba(10, 54, 84, 0.18)); }
.novofy-news-row > *, .novofy-news-row__text > * { margin-block: 0; }
.novofy-news-row__text > * + * { margin-block-start: 8px; }
.novofy-news-row__date { color: var(--tx-muted, var(--wp--preset--color--ink-muted)); }
.novofy-news-row .wp-block-post-title a,
.novofy-news-card .wp-block-post-title a { color: var(--tx-navy, var(--wp--preset--color--ink)); text-decoration: none; }
.novofy-news-row .wp-block-post-title a:hover,
.novofy-news-card .wp-block-post-title a:hover { text-decoration: underline; text-decoration-color: var(--wp--preset--color--binder-gold); text-underline-offset: 4px; }
.novofy-news-row .wp-block-post-excerpt,
.novofy-news-card .wp-block-post-excerpt { color: var(--tx-muted, var(--wp--preset--color--ink-muted)); }
.novofy-news-row .wp-block-post-excerpt__more-text,
.novofy-news-card .wp-block-post-excerpt__more-text { display: none; }
a.novofy-news-row__more,
.novofy-news-row__more {
	white-space: nowrap;
	color: var(--tx-navy, var(--wp--preset--color--ink));
	text-decoration: underline;
	text-decoration-color: var(--wp--preset--color--binder-gold);
	text-underline-offset: 5px;
	font-size: var(--wp--preset--font-size--body-s);
}

/* Cards (Insights) */
.novofy-news-grid .wp-block-post-template { gap: clamp(16px, 2vw, 28px); }
.novofy-news-card {
	height: 100%;
	box-sizing: border-box;
	padding: 24px;
	border: 1px solid rgba(10, 54, 84, 0.22);
	border-radius: 14px;
	display: flex;
	flex-direction: column;
	gap: 10px;
}
.novofy-news-card > * { margin: 0; }
.novofy-news-card .novofy-news-row__more { margin-block-start: auto; }
.novofy-news-card__image img { border-radius: 8px; }

/* Latest (gradient band) */
.novofy-news-latest { max-width: 860px; margin-inline: auto; text-align: center; }
.novofy-news-latest > * { margin-inline: auto; }
.novofy-news-latest .wp-block-post-title a { color: var(--wp--preset--color--ink-inverted); text-decoration: none; }
.novofy-news-latest .wp-block-post-excerpt { color: var(--wp--custom--contrast--muted-on-inverted, #C8D5DD); max-width: 62ch; }
.novofy-news-latest .wp-block-post-excerpt__more-text { display: none; }
.novofy-news-latest__cat, .novofy-news-latest__cat a {
	color: var(--wp--preset--color--binder-gold);
	text-transform: uppercase;
	letter-spacing: 0.12em;
	font-size: var(--wp--preset--font-size--eyebrow);
	text-decoration: none;
}
.novofy-news-latest__date { color: var(--wp--custom--contrast--muted-on-inverted, #C8D5DD); }
a.novofy-news-latest__more {
	display: inline-block;
	margin-block-start: 12px;
	color: var(--wp--preset--color--ink-inverted);
	text-decoration: underline;
	text-decoration-color: var(--wp--preset--color--binder-gold);
	text-underline-offset: 6px;
}

.novofy-news-pager { margin-block-start: 28px; gap: 24px; }
.novofy-news-pager a { color: var(--tx-navy, var(--wp--preset--color--ink)); }

@media (max-width: 781px) {
	:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-news-section > .wp-block-query { padding-inline-start: 0; }
	:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-slot.novofy-tx-slot--s { width: 110px; margin: 0 auto 24px; }
	.novofy-news-row { grid-template-columns: minmax(0, 1fr); row-gap: 8px; }
	.novofy-news-grid .wp-block-post-template { grid-template-columns: minmax(0, 1fr) !important; }
}
:is(.novofy-tx, :has(> .novofy-tx-hero)) a.novofy-news-row__more,
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-news-pager a { color: var(--tx-navy); }

/* ------------------------------------------------------------------
   Posts (1.28.0): templates/single.html. Gradient hero with the white
   constellation, no gold binder; plain white article (no gray
   constellation); a gold binder that forms at the start of the article
   and changes shape at each H2 (slots added by therapeutics.js).
   ------------------------------------------------------------------ */
.novofy-tx--post .novofy-post-hero {
	min-height: min(70svh, 640px);
	display: flex;
	flex-direction: column;
	justify-content: center;
	padding-block: calc(var(--wp--custom--header--height) + 72px) 96px;
}
.novofy-tx--post .novofy-post-hero > * { max-width: 900px; }
.novofy-tx--post .novofy-post-hero__cat,
.novofy-tx--post .novofy-post-hero__cat a {
	color: var(--wp--preset--color--binder-gold);
	text-transform: uppercase;
	letter-spacing: 0.12em;
	font-size: var(--wp--preset--font-size--eyebrow);
	text-decoration: none;
}
.novofy-tx--post .novofy-post-hero__title {
	color: var(--wp--preset--color--ink-inverted);
	font-size: clamp(40px, 5.2vw, 72px);
	line-height: 1.05;
	max-width: 20ch !important;
}
.novofy-tx--post .novofy-post-hero__dek { color: var(--wp--custom--contrast--muted-on-inverted, #C8D5DD); max-width: 62ch !important; }
.novofy-tx--post .novofy-post-hero__dek .wp-block-post-excerpt__more-text { display: none; }
.novofy-tx--post .novofy-post-hero__date { color: var(--wp--custom--contrast--muted-on-inverted, #C8D5DD); }

/* Article column: leaves a gutter on the left for the binder */
.novofy-tx--post .novofy-post__content {
	position: relative;
	max-width: 720px;
	margin-inline-start: calc(200px + clamp(40px, 6vw, 96px));
	color: var(--tx-navy);
	font-size: var(--wp--preset--font-size--body-m);
	line-height: 1.6;
}
.novofy-tx--post .novofy-post__content > * + * { margin-block-start: 1.1em; }
.novofy-tx--post .novofy-post__content > h2 { margin-block-start: 2.4em; font-size: var(--wp--preset--font-size--m); }
.novofy-tx--post .novofy-post__content a { color: var(--tx-navy); text-decoration-color: var(--wp--preset--color--binder-gold); text-underline-offset: 4px; }

.novofy-tx--post .novofy-post-slot {
	position: absolute;
	left: calc(-200px - clamp(40px, 6vw, 96px));
	width: 170px !important;
	margin: 0 !important;
}
.novofy-tx--post .novofy-post__content > .novofy-post-slot + * { margin-block-start: 0; }
.novofy-tx--post .novofy-post__content > .novofy-post-slot + h2 { margin-block-start: 2.4em; }

/* Building blocks used by the post patterns */
.novofy-post-dateline { color: var(--tx-muted); font-size: var(--wp--preset--font-size--body-s); letter-spacing: 0.04em; text-transform: uppercase; }
.novofy-post-lead { font-size: var(--wp--preset--font-size--body-l); line-height: 1.45; }
.novofy-tx--post .wp-block-quote.novofy-post-quote {
	margin-inline: 0;
	padding: 4px 0 4px 28px;
	border-left: 3px solid var(--wp--preset--color--binder-gold);
}
.novofy-tx--post .wp-block-quote.novofy-post-quote p {
	font-family: var(--wp--preset--font-family--newsreader);
	font-size: var(--wp--preset--font-size--s);
	line-height: 1.45;
}
.novofy-tx--post .wp-block-quote.novofy-post-quote cite { display: block; margin-top: 12px; font-style: normal; font-size: var(--wp--preset--font-size--body-s); color: var(--tx-muted); }

.novofy-post-facts {
	padding: 24px 28px;
	border: 1px solid rgba(10, 54, 84, 0.22);
	border-radius: 14px;
	display: grid;
	grid-template-columns: max-content minmax(0, 1fr);
	column-gap: 28px;
	row-gap: 10px;
}
.novofy-post-facts > p { margin: 0 !important; }
.novofy-post-facts { align-items: baseline; }
.novofy-post-facts > p.is-style-eyebrow { color: var(--tx-muted); }
.novofy-post-facts > p { line-height: 1.4; }
.novofy-post-about { padding-top: 8px; font-size: var(--wp--preset--font-size--body-s); color: var(--tx-muted); }

.novofy-tx--post .novofy-post-foot { padding-block: 0 var(--wp--preset--spacing--section); }
.novofy-tx--post .novofy-post-foot .novofy-btn-row { margin-inline-start: calc(200px + clamp(40px, 6vw, 96px)); }

@media (max-width: 781px) {
	.novofy-tx--post .novofy-post__content,
	.novofy-tx--post .novofy-post-foot .novofy-btn-row { margin-inline-start: 0; }
	.novofy-tx--post .novofy-post-slot { display: none; }
	.novofy-post-facts { grid-template-columns: minmax(0, 1fr); row-gap: 4px; }
	.novofy-post-facts > p:not(.is-style-eyebrow) { margin-block-end: 10px !important; }
}

/* ------------------------------------------------------------------
   1.29.0
   ------------------------------------------------------------------ */

/* People cards: name links to the person on the Team page; the LinkedIn
   icon sits right after it. The icon link is a paragraph with the class
   novofy-li-link holding a plain link, so it stays editable. */
.novofy-person-name {
	display: flex;
	align-items: center;
	gap: 10px;
	flex-wrap: wrap;
}
.novofy-person-name > * { margin: 0 !important; }
.novofy-person-name h3 a { color: inherit; text-decoration: none; }
.novofy-person-name h3 a:hover { text-decoration: underline; text-decoration-color: var(--wp--preset--color--binder-gold); text-underline-offset: 4px; }
.novofy-person-name + * { margin-block-start: 8px; }
p.novofy-li-link { line-height: 0; }
p.novofy-li-link a {
	display: inline-block;
	width: 20px;
	height: 20px;
	font-size: 0;
	color: transparent;
	background-color: currentColor;
	background-color: var(--band-ink, var(--tx-navy, var(--wp--preset--color--ink)));
	-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.45 20.45h-3.56v-5.57c0-1.33-.02-3.04-1.85-3.04-1.85 0-2.14 1.45-2.14 2.94v5.67H9.35V9h3.41v1.56h.05c.48-.9 1.64-1.85 3.37-1.85 3.6 0 4.27 2.37 4.27 5.46v6.28zM5.34 7.43a2.06 2.06 0 1 1 0-4.13 2.06 2.06 0 0 1 0 4.13zM7.12 20.45H3.56V9h3.56v11.45zM22.22 0H1.77C.79 0 0 .77 0 1.73v20.54C0 23.23.79 24 1.77 24h20.45c.98 0 1.78-.77 1.78-1.73V1.73C24 .77 23.2 0 22.22 0z'/%3E%3C/svg%3E") center / contain no-repeat;
	mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.45 20.45h-3.56v-5.57c0-1.33-.02-3.04-1.85-3.04-1.85 0-2.14 1.45-2.14 2.94v5.67H9.35V9h3.41v1.56h.05c.48-.9 1.64-1.85 3.37-1.85 3.6 0 4.27 2.37 4.27 5.46v6.28zM5.34 7.43a2.06 2.06 0 1 1 0-4.13 2.06 2.06 0 0 1 0 4.13zM7.12 20.45H3.56V9h3.56v11.45zM22.22 0H1.77C.79 0 0 .77 0 1.73v20.54C0 23.23.79 24 1.77 24h20.45c.98 0 1.78-.77 1.78-1.73V1.73C24 .77 23.2 0 22.22 0z'/%3E%3C/svg%3E") center / contain no-repeat;
	opacity: 0.85;
}
p.novofy-li-link a:hover { opacity: 1; background-color: var(--wp--preset--color--binder-gold); }
.novofy-tx-person-row[id] { scroll-margin-top: calc(var(--wp--custom--header--height) + 32px); }
/* Posts: no full-width rule above the buttons under the article */
.novofy-tx--post .novofy-post-foot::before { display: none !important; }

/* 1.30.0: LinkedIn icon centered on the name's text, in serif or sans */
.novofy-person-name { align-items: center; }
.novofy-person-name h3 { line-height: 1.15 !important; }
p.novofy-li-link { display: flex; align-items: center; height: 1em; font-size: inherit; }
p.novofy-li-link a { width: 18px; height: 18px; position: relative; top: -1px; }

/* 1.31.0: WordPress puts a sticky post first in any post list. The News
   highlight shows only the first item and the Home news row only the first
   three, so a sticky post leads and nothing doubles up. */
.novofy-news-latest-query .wp-block-post-template > .wp-block-post:nth-child(n+2) { display: none !important; }
.wp-block-query.novofy-news .wp-block-post-template > .wp-block-post:nth-child(n+4) { display: none !important; }

/* Home team row: cards sized to the portrait, closer together */
.wp-block-columns.novofy-people { gap: clamp(24px, 3vw, 40px) !important; }
.wp-block-columns.novofy-people > .wp-block-column { flex: 0 0 min(300px, 70vw) !important; }
@media (max-width: 781px) {
	.wp-block-columns.novofy-people > .wp-block-column { flex-basis: 72% !important; }
}
.wp-block-columns.novofy-people > .wp-block-column { flex-basis: min(260px, 70vw) !important; }
.wp-block-columns.novofy-people .wp-block-image.novofy-portrait,
.wp-block-columns.novofy-people .novofy-portrait--placeholder { max-width: 100%; width: 100%; margin-inline: 0; }
.wp-block-columns.novofy-people .wp-block-image.novofy-portrait img { width: 100%; }

/* ------------------------------------------------------------------
   1.32.0: type audit. Small text up a step, serif headlines at small
   sizes get weight 500, and text on the gradient is white (the light
   gray and gold fell below WCAG AA contrast on the teal middle of the
   gradient). Gold stays as an accent rule, not as text color.
   ------------------------------------------------------------------ */

/* Eyebrows and small labels: 13px -> 14px */
p.is-style-eyebrow { font-size: 14px; font-weight: 600; }
.novofy-media-toggle { font-size: 14px; }

/* Home news row (the screenshot): forced three columns, bigger, bolder */
@media (min-width: 782px) {
	.wp-block-query.novofy-news .wp-block-post-template {
		display: grid !important;
		grid-template-columns: repeat(3, minmax(0, 1fr)) !important;
	}
}
.novofy-news__item .wp-block-post-date { font-size: 15px; color: var(--wp--preset--color--ink-inverted); opacity: 0.92; }
.novofy-news__item .novofy-news__cat { font-size: 14px; font-weight: 600; letter-spacing: 0.04em; }
.novofy-news__item .wp-block-post-title {
	font-size: clamp(22px, 1.9vw, 26px);
	font-weight: 500;
	line-height: 1.22;
}
.novofy-news__item .wp-block-read-more { font-size: 16px; font-weight: 500; }

/* News landing: list and card titles */
.novofy-news-row .wp-block-post-title,
.novofy-news-card .wp-block-post-title { font-size: 22px; font-weight: 500; line-height: 1.25; }
.novofy-news-row__date { font-size: 15px; }

/* Highlight band and post hero: white text on the gradient */
.novofy-news-latest .wp-block-post-excerpt,
.novofy-news-latest__date,
.novofy-tx--post .novofy-post-hero__dek,
.novofy-tx--post .novofy-post-hero__date { color: var(--wp--preset--color--ink-inverted); }
.novofy-news-latest__date,
.novofy-tx--post .novofy-post-hero__date { opacity: 0.9; font-size: 15px; }
.novofy-news-latest__cat, .novofy-news-latest__cat a,
.novofy-tx--post .novofy-post-hero__cat, .novofy-tx--post .novofy-post-hero__cat a {
	color: var(--wp--preset--color--ink-inverted) !important;
	font-size: 14px !important;
	font-weight: 600;
}
.novofy-news-latest__cat a,
.novofy-tx--post .novofy-post-hero__cat a {
	padding-bottom: 4px;
	border-bottom: 2px solid var(--wp--preset--color--binder-gold);
}
.novofy-news-latest .wp-block-post-title { font-weight: 500; }

/* Reagents FAQ questions and post quotes: serif at 500 */
.novofy-faq summary { font-size: 21px; font-weight: 500; }
.novofy-tx--post .wp-block-quote.novofy-post-quote p { font-size: 22px; font-weight: 500; }

/* Proof numbers keep stat scale on phones */
.novofy-proof p.is-style-data { font-size: clamp(40px, 9vw, var(--wp--preset--font-size--data)); }

/* Muted text on white: the darker muted tone (7:1 or better) */
:is(.novofy-tx, :has(> .novofy-tx-hero)) { --tx-muted: rgba(10, 54, 84, 0.8); }

/* 1.33.0: modality movies larger and closer together. Each movie is
   scaled up inside its tile (the renders carry white margin), the gaps
   close, and captions sit clear of the scaled movie. */
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-movies { gap: 0; justify-content: center; }
.novofy-tx-movies .wp-block-video.novofy-movie--s { flex-grow: 0.8; }
.novofy-tx-movies .novofy-movie video { transform: scale(1.22); transform-origin: center bottom; }
.novofy-tx-movies .novofy-movie figcaption { position: relative; margin-top: 14px; padding-inline: 4px; }
@media (max-width: 781px) {
	.novofy-tx-movies .novofy-movie video { transform: scale(1.12); }
	.novofy-tx-movies .wp-block-video.novofy-movie { flex-basis: 46%; }
}
.novofy-tx-movies .novofy-movie figcaption { min-height: 2.7em; }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-movies { margin-block-start: clamp(64px, 7vw, 104px); }
@media (max-width: 781px) {
	:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-movies { justify-content: flex-start; gap: 8px; }
}

/* ------------------------------------------------------------------
   1.34.0: phone fixes (mobile audit)
   ------------------------------------------------------------------ */
@media (max-width: 781px) {
	/* 1. Home sections carry 100px side padding from the editor; on phones
	   they use the standard side margin instead */
	.novofy-main .wp-block-group[style*="padding-left:100px"],
	.novofy-main .wp-block-group[style*="padding-left: 100px"] { padding-left: var(--wp--preset--spacing--side) !important; }
	.novofy-main .wp-block-group[style*="padding-right:100px"],
	.novofy-main .wp-block-group[style*="padding-right: 100px"] { padding-right: var(--wp--preset--spacing--side) !important; }

	/* 3. Section padding 140px -> 72px on phones */
	:root, body { --wp--preset--spacing--section: 72px !important; }

	/* Smooth motion on phones: no blur behind the bottom bar (it re-blurred
	   the moving canvas every frame) and no gradient drift (it repainted
	   the whole screen every frame). Both are near invisible at this size. */
	.wp-site-blocks > header {
		-webkit-backdrop-filter: none !important;
		backdrop-filter: none !important;
		background: rgba(10, 54, 84, 0.92);
	}
	.wp-block-group.is-style-band-hero,
	.wp-block-group.is-style-band-motion,
	.wp-block-group.is-style-box-motion,
	.novofy-stage__bg { animation: none !important; background-size: 100% 100% !important; }
}

/* 2. Role tabs scroll inside their own strip instead of widening the page */
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-icp__nav { max-width: 100%; min-width: 0; }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-icp__tabs { min-width: 0; }

/* 8. Touch targets */
p.novofy-li-link a { overflow: visible; }
p.novofy-li-link a::after { content: ""; position: absolute; inset: -9px; }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-icp__arrow { width: 44px; height: 44px; }
:is(.novofy-tx, :has(> .novofy-tx-hero)) .novofy-tx-icp__tab { min-height: 44px; }
.novofy-media-toggle { min-height: 44px; min-width: 64px; }
.novofy-faq summary { padding-block: 10px; }

/* 1.34.0: proof stats always stack on phones (matches core stacking) */
@media (max-width: 781px) {
	.wp-block-columns.novofy-proof { flex-wrap: wrap !important; }
	.wp-block-columns.novofy-proof > .wp-block-column { flex-basis: 100% !important; min-width: 0; }
}

/* 1.34.0: scroll-locked stage canvas (see constellation.js). It sits in the
   stage above the fixed gradient layer and is moved by script. */
.wp-block-group.novofy-stage { overflow: clip; }
.wp-block-group.novofy-stage > .novofy-stage__bg { z-index: -2; }
.wp-block-group.novofy-stage > canvas.novofy-stage__cv {
	position: absolute;
	inset: 0 0 auto 0;
	width: 100%;
	z-index: -1;
	pointer-events: none;
	will-change: transform;
	max-width: none !important;
	margin: 0 !important;
}
:is(.novofy-tx, :has(> .novofy-tx-hero)) > .novofy-tx__bg {
	position: absolute;
	inset: 0 0 auto 0;
	will-change: transform;
}

/* ------------------------------------------------------------------
   1.35.0: logo in the site title
   The Site Title block renders the NovoFy logo (mark plus wordmark) in
   place of its text (functions.php, novofy_site_title_logo). One inline
   SVG serves every background: the wordmark takes the text color, and
   the mark's colors come from the custom properties below.
   - Light backgrounds: full-color mark (Gradient 2 to Accent primary),
     Ink wordmark, Binder gold node.
   - Header, footer and dark bands: one-color mark in Ink inverted,
     white wordmark, Binder gold node. The header sits on the teal middle
     of the brand gradient over the hero, where the blue mark would
     disappear (1.0:1); white holds 4.5:1 there.
   The header bar behind scrolled content is now 90% navy (was 62%) so
   the logo and links read the same over light and dark sections.
   ------------------------------------------------------------------ */
.nf-logo {
	--nf-logo-a: var(--wp--preset--color--grad-2);
	--nf-logo-b: var(--wp--preset--color--accent-primary);
	--nf-logo-binder: var(--wp--preset--color--binder-gold);
	display: block;
	height: 36px;
	width: auto;
	overflow: visible;
}

.wp-site-blocks > header .nf-logo,
.novofy-footer .nf-logo,
.wp-block-group:is(.is-style-band-inverted, .is-style-band-accent, .is-style-band-gradient, .is-style-band-hero, .is-style-band-motion, .novofy-box--accent, .is-style-box-green, .is-style-box-motion) .nf-logo {
	--nf-logo-a: var(--wp--preset--color--ink-inverted);
	--nf-logo-b: var(--wp--preset--color--ink-inverted);
}

.wp-block-site-title:has(.nf-logo) {
	line-height: 0;
}

.wp-block-site-title:has(.nf-logo) a {
	display: inline-block;
	color: inherit;
	text-decoration: none;
}

.wp-block-site-title:has(.nf-logo) a:focus-visible {
	outline: 2px solid currentColor;
	outline-offset: 6px;
}

@media (max-width: 781px) {
	.nf-logo { height: 30px; }
}

/* ------------------------------------------------------------------
   1.35.0: no footer
   The footer is gone (functions.php, novofy_remove_footer). Its bottom
   padding used to keep the last section clear of the fixed bottom bar;
   main now carries that room instead.
   ------------------------------------------------------------------ */
.wp-site-blocks > main {
	padding-block-end: var(--wp--custom--header--height);
}

/* ------------------------------------------------------------------
   1.36.0: Home fixes
   1. The script inserts the fixed gradient layer as a stage's second
      child, so the block gap gave it a 24px top margin and the stage's
      own gradient showed as a band at the top of the screen.
   2. With the footer gone, the page ended before the contact binder
      slot could reach the middle of the screen, so the binder stopped
      partway between the news slot and its own slot. Fixed in
      constellation.js (1.37.0): the binder settles in the last slot as
      the page reaches its end. The contact block keeps its own height,
      set by its padding in the editor.
   ------------------------------------------------------------------ */
.wp-block-group.novofy-stage > .novofy-stage__bg,
.wp-block-group.novofy-stage > canvas.novofy-stage__cv {
	margin: 0 !important;
}
